From 9d2cb75ef4e32d422ff1733c0714125803328f83 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Tue, 4 Feb 2025 20:51:04 +0200 Subject: [PATCH 1/8] Fix build command, add needed dev packages for build --- package-lock.json | 104 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 5 ++- 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ed5a16fe..586d6622c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ambire-common", - "version": "2.37.0", + "version": "2.41.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ambire-common", - "version": "2.37.0", + "version": "2.41.0", "dependencies": { "aes-js": "^3.1.2", "dotenv": "^16.3.1", @@ -28,10 +28,12 @@ "@openzeppelin/contracts": "^4.9.6", "@types/aes-js": "^3.1.1", "@types/chai": "^4.3.4", + "@types/chrome": "^0.0.301", "@types/jest": "^26.0.14", "@types/mocha": "^10.0.1", "@types/node": "^18.16.1", "@types/node-fetch": "^2.6.11", + "@types/react": "^19.0.8", "@types/ungap__structured-clone": "^1.2.0", "@types/validator": "^13.7.0", "@typescript-eslint/eslint-plugin": "5.5.0", @@ -3317,6 +3319,17 @@ "@types/chai": "*" } }, + "node_modules/@types/chrome": { + "version": "0.0.301", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.301.tgz", + "integrity": "sha512-BljW7InXXOfDYr4nG79y5lnaklrZ0gmeTwCUkuCXK2+69dHnZIrg13KhXJE/HrcFUmy8NG/EK+RTGScsh/Hbiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, "node_modules/@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", @@ -3326,6 +3339,23 @@ "@types/node": "*" } }, + "node_modules/@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -3344,6 +3374,13 @@ "@types/node": "*" } }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -3547,6 +3584,16 @@ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, + "node_modules/@types/react": { + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", + "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, "node_modules/@types/readable-stream": { "version": "2.3.15", "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", @@ -5565,6 +5612,13 @@ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "peer": true }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -16794,6 +16848,16 @@ "@types/chai": "*" } }, + "@types/chrome": { + "version": "0.0.301", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.301.tgz", + "integrity": "sha512-BljW7InXXOfDYr4nG79y5lnaklrZ0gmeTwCUkuCXK2+69dHnZIrg13KhXJE/HrcFUmy8NG/EK+RTGScsh/Hbiw==", + "dev": true, + "requires": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, "@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", @@ -16803,6 +16867,21 @@ "@types/node": "*" } }, + "@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dev": true, + "requires": { + "@types/filewriter": "*" + } + }, + "@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", + "dev": true + }, "@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -16821,6 +16900,12 @@ "@types/node": "*" } }, + "@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -17005,6 +17090,15 @@ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, + "@types/react": { + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", + "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", + "dev": true, + "requires": { + "csstype": "^3.0.2" + } + }, "@types/readable-stream": { "version": "2.3.15", "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", @@ -18563,6 +18657,12 @@ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "peer": true }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", diff --git a/package.json b/package.json index 33542316f..78ba83460 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "compile:contracts": "ts-node scripts/compileContracts.js", "hardhat": "npx hardhat compile; npx hardhat test", "jest": "jest --forceExit", - "build": "tsc src/libs/deployless/deployless.ts -t es5", + "build": "tsc", + "build:deployless": "tsc src/libs/deployless/deployless.ts -t es5", "prettier": "prettier --write 'contracts/**/*.sol'", "lint:fix": "eslint ./src/** --ext .js,.jsx,.ts,.tsx --fix" }, @@ -47,10 +48,12 @@ "@openzeppelin/contracts": "^4.9.6", "@types/aes-js": "^3.1.1", "@types/chai": "^4.3.4", + "@types/chrome": "^0.0.301", "@types/jest": "^26.0.14", "@types/mocha": "^10.0.1", "@types/node": "^18.16.1", "@types/node-fetch": "^2.6.11", + "@types/react": "^19.0.8", "@types/ungap__structured-clone": "^1.2.0", "@types/validator": "^13.7.0", "@typescript-eslint/eslint-plugin": "5.5.0", From e341eebf1750d769af1a33057214866fec864536 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Tue, 4 Feb 2025 20:52:07 +0200 Subject: [PATCH 2/8] Update tsconfig --- tsconfig.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 8a1823887..4c7b50558 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "noEmitOnError": true, "noEmitHelpers": true, "lib": ["ESNext", "DOM"], - "types": ["node", "jest", "mocha"], + "types": ["node", "jest", "mocha", "chrome"], "target": "ESNext", "moduleResolution": "node", "allowSyntheticDefaultImports": true, @@ -31,7 +31,9 @@ "isolatedModules": true, "strict": true, "strictPropertyInitialization": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "outDir": "dist" }, - "exclude": ["node_modules"] + "include": ["src"], + "exclude": ["node_modules", "audits", "test", "scripts", "src/**/*.test.ts", "src/**/tests"] } From a34b2c12aa7129f2a10eb68c69bca08988629854 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Tue, 4 Feb 2025 20:53:05 +0200 Subject: [PATCH 3/8] Add up-to-date build --- dist/contracts/compiled/AmbireAccount.json | 2 +- .../compiled/AmbireAccountState.json | 2 +- dist/contracts/compiled/AmbireFactory.json | 1 + dist/contracts/compiled/BalanceGetter.json | 2 +- dist/contracts/compiled/DeFiAAVEPosition.json | 1 + .../compiled/DeFiUniswapV3Positions.json | 1 + dist/contracts/compiled/EntryPoint.json | 1 + dist/contracts/compiled/Estimation.json | 2 +- dist/contracts/compiled/NFTGetter.json | 492 +- .../compiled/UniversalSigValidator.json | 1 + .../compiled/WALLETSupplyController.json | 518 + dist/contracts/compiled/WETH.json | 153 + dist/src/classes/EmittableError.d.ts | 12 + dist/src/classes/EmittableError.d.ts.map | 1 + dist/src/classes/EmittableError.js | 18 + dist/src/classes/EmittableError.js.map | 1 + dist/src/classes/ExternalSignerError.d.ts | 4 + dist/src/classes/ExternalSignerError.d.ts.map | 1 + dist/src/classes/ExternalSignerError.js | 8 + dist/src/classes/ExternalSignerError.js.map | 1 + dist/src/classes/SwapAndBridgeError.d.ts | 4 + dist/src/classes/SwapAndBridgeError.d.ts.map | 1 + dist/src/classes/SwapAndBridgeError.js | 8 + dist/src/classes/SwapAndBridgeError.js.map | 1 + .../SwapAndBridgeProviderApiError.d.ts | 4 + .../SwapAndBridgeProviderApiError.d.ts.map | 1 + .../classes/SwapAndBridgeProviderApiError.js | 8 + .../SwapAndBridgeProviderApiError.js.map | 1 + dist/src/classes/session.d.ts | 23 + dist/src/classes/session.d.ts.map | 1 + dist/src/classes/session.js | 40 + dist/src/classes/session.js.map | 1 + dist/src/consts/account.d.ts | 2 + dist/src/consts/account.d.ts.map | 1 + dist/src/consts/account.js | 2 + dist/src/consts/account.js.map | 1 + dist/src/consts/addresses.d.ts | 18 + dist/src/consts/addresses.d.ts.map | 1 + dist/src/consts/addresses.js | 35 + dist/src/consts/addresses.js.map | 1 + dist/src/consts/bundlers.d.ts | 5 + dist/src/consts/bundlers.d.ts.map | 1 + dist/src/consts/bundlers.js | 4 + dist/src/consts/bundlers.js.map | 1 + dist/src/consts/coingecko.d.ts | 20 + dist/src/consts/coingecko.d.ts.map | 1 + dist/src/consts/coingecko.js | 57 +- dist/src/consts/coingecko.js.map | 2 +- dist/src/consts/dappCatalog.json | 470 + dist/src/consts/dappCommunication.d.ts | 3 + dist/src/consts/dappCommunication.d.ts.map | 1 + dist/src/consts/dappCommunication.js | 8 + dist/src/consts/dappCommunication.js.map | 1 + dist/src/consts/deploy.d.ts | 13 + dist/src/consts/deploy.d.ts.map | 1 + dist/src/consts/deploy.js | 23 +- dist/src/consts/deploy.js.map | 2 +- dist/src/consts/deployless.d.ts | 2 + dist/src/consts/deployless.d.ts.map | 1 + dist/src/consts/deployless.js | 3 + dist/src/consts/deployless.js.map | 1 + dist/src/consts/derivation.d.ts | 33 + dist/src/consts/derivation.d.ts.map | 1 + dist/src/consts/derivation.js | 35 + dist/src/consts/derivation.js.map | 1 + dist/src/consts/feeTokens.d.ts | 6 + dist/src/consts/feeTokens.d.ts.map | 1 + dist/src/consts/feeTokens.js | 131 + dist/src/consts/feeTokens.js.map | 1 + dist/src/consts/gasTankFeeTokens.d.ts | 39 + dist/src/consts/gasTankFeeTokens.d.ts.map | 1 + dist/src/consts/gasTankFeeTokens.js | 117 +- dist/src/consts/gasTankFeeTokens.js.map | 2 +- dist/src/consts/humanizer/humanizerInfo.json | 87694 ++++++++++++++++ dist/src/consts/intervals.d.ts | 9 + dist/src/consts/intervals.d.ts.map | 1 + dist/src/consts/intervals.js | 9 + dist/src/consts/intervals.js.map | 1 + dist/src/consts/networks.d.ts | 4 + dist/src/consts/networks.d.ts.map | 1 + dist/src/consts/networks.js | 213 +- dist/src/consts/networks.js.map | 2 +- dist/src/consts/pinnedTokens.d.ts | 3 + dist/src/consts/pinnedTokens.d.ts.map | 1 + dist/src/consts/pinnedTokens.js | 5 +- dist/src/consts/pinnedTokens.js.map | 2 +- .../consts/signAccountOp/errorHandling.d.ts | 10 + .../signAccountOp/errorHandling.d.ts.map | 1 + .../src/consts/signAccountOp/errorHandling.js | 21 + .../consts/signAccountOp/errorHandling.js.map | 1 + dist/src/consts/signAccountOp/gas.d.ts | 5 + dist/src/consts/signAccountOp/gas.d.ts.map | 1 + dist/src/consts/signAccountOp/gas.js | 5 + dist/src/consts/signAccountOp/gas.js.map | 1 + dist/src/consts/signatures.d.ts | 2 + dist/src/consts/signatures.d.ts.map | 1 + dist/src/consts/signatures.js | 2 + dist/src/consts/signatures.js.map | 1 + .../accountAdder/accountAdder.d.ts | 106 + .../accountAdder/accountAdder.d.ts.map | 1 + .../controllers/accountAdder/accountAdder.js | 737 + .../accountAdder/accountAdder.js.map | 1 + dist/src/controllers/accounts/accounts.d.ts | 36 + .../controllers/accounts/accounts.d.ts.map | 1 + dist/src/controllers/accounts/accounts.js | 168 + dist/src/controllers/accounts/accounts.js.map | 1 + dist/src/controllers/actions/actions.d.ts | 63 + dist/src/controllers/actions/actions.d.ts.map | 1 + dist/src/controllers/actions/actions.js | 271 + dist/src/controllers/actions/actions.js.map | 1 + dist/src/controllers/activity/activity.d.ts | 129 + .../controllers/activity/activity.d.ts.map | 1 + dist/src/controllers/activity/activity.js | 446 + dist/src/controllers/activity/activity.js.map | 1 + .../controllers/addressBook/addressBook.d.ts | 39 + .../addressBook/addressBook.d.ts.map | 1 + .../controllers/addressBook/addressBook.js | 135 + .../addressBook/addressBook.js.map | 1 + dist/src/controllers/dapps/dapps.d.ts | 32 + dist/src/controllers/dapps/dapps.d.ts.map | 1 + dist/src/controllers/dapps/dapps.js | 169 + dist/src/controllers/dapps/dapps.js.map | 1 + .../defiPositions/defiPositions.d.ts | 27 + .../defiPositions/defiPositions.d.ts.map | 1 + .../defiPositions/defiPositions.js | 212 + .../defiPositions/defiPositions.js.map | 1 + dist/src/controllers/domains/domains.d.ts | 34 + dist/src/controllers/domains/domains.d.ts.map | 1 + dist/src/controllers/domains/domains.js | 91 + dist/src/controllers/domains/domains.js.map | 1 + .../controllers/emailVault/emailVault.d.ts | 83 + .../emailVault/emailVault.d.ts.map | 1 + dist/src/controllers/emailVault/emailVault.js | 526 + .../controllers/emailVault/emailVault.js.map | 1 + .../eventEmitter/eventEmitter.d.ts | 33 + .../eventEmitter/eventEmitter.d.ts.map | 1 + .../controllers/eventEmitter/eventEmitter.js | 156 + .../eventEmitter/eventEmitter.js.map | 1 + dist/src/controllers/invite/invite.d.ts | 43 + dist/src/controllers/invite/invite.d.ts.map | 1 + dist/src/controllers/invite/invite.js | 86 + dist/src/controllers/invite/invite.js.map | 1 + dist/src/controllers/keystore/keystore.d.ts | 109 + .../controllers/keystore/keystore.d.ts.map | 1 + dist/src/controllers/keystore/keystore.js | 753 + dist/src/controllers/keystore/keystore.js.map | 1 + dist/src/controllers/main/main.d.ts | 181 + dist/src/controllers/main/main.d.ts.map | 1 + dist/src/controllers/main/main.js | 2059 + dist/src/controllers/main/main.js.map | 1 + dist/src/controllers/networks/networks.d.ts | 41 + .../controllers/networks/networks.d.ts.map | 1 + dist/src/controllers/networks/networks.js | 239 + dist/src/controllers/networks/networks.js.map | 1 + dist/src/controllers/portfolio/portfolio.d.ts | 51 + .../controllers/portfolio/portfolio.d.ts.map | 1 + dist/src/controllers/portfolio/portfolio.js | 651 + .../controllers/portfolio/portfolio.js.map | 1 + dist/src/controllers/providers/providers.d.ts | 23 + .../controllers/providers/providers.d.ts.map | 1 + dist/src/controllers/providers/providers.js | 60 + .../controllers/providers/providers.js.map | 1 + .../selectedAccount/selectedAccount.d.ts | 59 + .../selectedAccount/selectedAccount.d.ts.map | 1 + .../selectedAccount/selectedAccount.js | 294 + .../selectedAccount/selectedAccount.js.map | 1 + .../src/controllers/signAccountOp/helper.d.ts | 12 + .../controllers/signAccountOp/helper.d.ts.map | 1 + dist/src/controllers/signAccountOp/helper.js | 44 + .../controllers/signAccountOp/helper.js.map | 1 + .../signAccountOp/signAccountOp.d.ts | 130 + .../signAccountOp/signAccountOp.d.ts.map | 1 + .../signAccountOp/signAccountOp.js | 952 + .../signAccountOp/signAccountOp.js.map | 1 + .../controllers/signMessage/signMessage.d.ts | 39 + .../signMessage/signMessage.d.ts.map | 1 + .../controllers/signMessage/signMessage.js | 193 + .../signMessage/signMessage.js.map | 1 + .../swapAndBridge/socketApiMock.d.ts | 816 + .../swapAndBridge/socketApiMock.d.ts.map | 1 + .../swapAndBridge/socketApiMock.js | 853 + .../swapAndBridge/socketApiMock.js.map | 1 + .../swapAndBridge/swapAndBridge.d.ts | 136 + .../swapAndBridge/swapAndBridge.d.ts.map | 1 + .../swapAndBridge/swapAndBridge.js | 1030 + .../swapAndBridge/swapAndBridge.js.map | 1 + dist/src/controllers/transfer/transfer.d.ts | 64 + .../controllers/transfer/transfer.d.ts.map | 1 + dist/src/controllers/transfer/transfer.js | 316 + dist/src/controllers/transfer/transfer.js.map | 1 + dist/src/interfaces/account.d.ts | 93 + dist/src/interfaces/account.d.ts.map | 1 + dist/src/interfaces/account.js | 17 +- dist/src/interfaces/account.js.map | 2 +- dist/src/interfaces/actions.d.ts | 35 + dist/src/interfaces/actions.d.ts.map | 1 + dist/src/interfaces/actions.js | 2 + dist/src/interfaces/actions.js.map | 1 + dist/src/interfaces/banner.d.ts | 90 + dist/src/interfaces/banner.d.ts.map | 1 + dist/src/interfaces/banner.js | 2 + dist/src/interfaces/banner.js.map | 1 + dist/src/interfaces/dapp.d.ts | 23 + dist/src/interfaces/dapp.d.ts.map | 1 + dist/src/interfaces/dapp.js | 2 + dist/src/interfaces/dapp.js.map | 1 + dist/src/interfaces/domains.d.ts | 14 + dist/src/interfaces/domains.d.ts.map | 1 + dist/src/interfaces/domains.js | 2 + dist/src/interfaces/domains.js.map | 1 + dist/src/interfaces/emailVault.d.ts | 55 + dist/src/interfaces/emailVault.d.ts.map | 1 + dist/src/interfaces/emailVault.js | 11 + dist/src/interfaces/emailVault.js.map | 1 + dist/src/interfaces/fetch.d.ts | 12 + dist/src/interfaces/fetch.d.ts.map | 1 + dist/src/interfaces/fetch.js | 2 + dist/src/interfaces/fetch.js.map | 1 + dist/src/interfaces/hex.d.ts | 2 + dist/src/interfaces/hex.d.ts.map | 1 + dist/src/interfaces/hex.js | 2 + dist/src/interfaces/hex.js.map | 1 + dist/src/interfaces/keyIterator.d.ts | 30 + dist/src/interfaces/keyIterator.d.ts.map | 1 + dist/src/interfaces/keyIterator.js | 2 + dist/src/interfaces/keyIterator.js.map | 1 + dist/src/interfaces/keystore.d.ts | 145 + dist/src/interfaces/keystore.d.ts.map | 1 + dist/src/interfaces/keystore.js | 3 + dist/src/interfaces/keystore.js.map | 1 + dist/src/interfaces/messenger.d.ts | 45 + dist/src/interfaces/messenger.d.ts.map | 1 + dist/src/interfaces/messenger.js | 2 + dist/src/interfaces/messenger.js.map | 1 + dist/src/interfaces/network.d.ts | 112 + dist/src/interfaces/network.d.ts.map | 1 + dist/src/interfaces/network.js | 2 + dist/src/interfaces/network.js.map | 1 + dist/src/interfaces/notification.d.ts | 8 + dist/src/interfaces/notification.d.ts.map | 1 + dist/src/interfaces/notification.js | 2 + dist/src/interfaces/notification.js.map | 1 + dist/src/interfaces/provider.d.ts | 9 + dist/src/interfaces/provider.d.ts.map | 1 + dist/src/interfaces/provider.js | 2 + dist/src/interfaces/provider.js.map | 1 + dist/src/interfaces/selectedAccount.d.ts | 21 + dist/src/interfaces/selectedAccount.d.ts.map | 1 + dist/src/interfaces/selectedAccount.js | 2 + dist/src/interfaces/selectedAccount.js.map | 1 + dist/src/interfaces/signAccountOp.d.ts | 9 + dist/src/interfaces/signAccountOp.d.ts.map | 1 + dist/src/interfaces/signAccountOp.js | 2 + dist/src/interfaces/signAccountOp.js.map | 1 + dist/src/interfaces/storage.d.ts | 6 + dist/src/interfaces/storage.d.ts.map | 1 + dist/src/interfaces/storage.js | 2 + dist/src/interfaces/storage.js.map | 1 + dist/src/interfaces/swapAndBridge.d.ts | 244 + dist/src/interfaces/swapAndBridge.d.ts.map | 1 + dist/src/interfaces/swapAndBridge.js | 2 + dist/src/interfaces/swapAndBridge.js.map | 1 + dist/src/interfaces/transfer.d.ts | 20 + dist/src/interfaces/transfer.d.ts.map | 1 + dist/src/interfaces/transfer.js | 2 + dist/src/interfaces/transfer.js.map | 1 + dist/src/interfaces/userRequest.d.ts | 81 + dist/src/interfaces/userRequest.d.ts.map | 1 + dist/src/interfaces/userRequest.js | 2 + dist/src/interfaces/userRequest.js.map | 1 + dist/src/interfaces/window.d.ts | 24 + dist/src/interfaces/window.d.ts.map | 1 + dist/src/interfaces/window.js | 2 + dist/src/interfaces/window.js.map | 1 + dist/src/libs/account/account.d.ts | 70 + dist/src/libs/account/account.d.ts.map | 1 + dist/src/libs/account/account.js | 236 +- dist/src/libs/account/account.js.map | 2 +- dist/src/libs/accountAdder/accountAdder.d.ts | 11 + .../libs/accountAdder/accountAdder.d.ts.map | 1 + dist/src/libs/accountAdder/accountAdder.js | 38 + .../src/libs/accountAdder/accountAdder.js.map | 1 + dist/src/libs/accountOp/accountOp.d.ts | 98 + dist/src/libs/accountOp/accountOp.d.ts.map | 1 + dist/src/libs/accountOp/accountOp.js | 145 +- dist/src/libs/accountOp/accountOp.js.map | 2 +- .../libs/accountOp/submittedAccountOp.d.ts | 30 + .../accountOp/submittedAccountOp.d.ts.map | 1 + dist/src/libs/accountOp/submittedAccountOp.js | 114 + .../libs/accountOp/submittedAccountOp.js.map | 1 + dist/src/libs/accountOp/types.d.ts | 9 + dist/src/libs/accountOp/types.d.ts.map | 1 + dist/src/libs/accountOp/types.js | 2 + dist/src/libs/accountOp/types.js.map | 1 + dist/src/libs/accountState/accountState.d.ts | 5 + .../libs/accountState/accountState.d.ts.map | 1 + dist/src/libs/accountState/accountState.js | 86 +- .../src/libs/accountState/accountState.js.map | 2 +- dist/src/libs/actions/actions.d.ts | 13 + dist/src/libs/actions/actions.d.ts.map | 1 + dist/src/libs/actions/actions.js | 71 + dist/src/libs/actions/actions.js.map | 1 + dist/src/libs/banners/banners.d.ts | 18 + dist/src/libs/banners/banners.d.ts.map | 1 + dist/src/libs/banners/banners.js | 228 + dist/src/libs/banners/banners.js.map | 1 + dist/src/libs/calls/calls.d.ts | 4 + dist/src/libs/calls/calls.d.ts.map | 1 + dist/src/libs/calls/calls.js | 36 + dist/src/libs/calls/calls.js.map | 1 + .../src/libs/defiPositions/defiAddresses.d.ts | 43 + .../libs/defiPositions/defiAddresses.d.ts.map | 1 + dist/src/libs/defiPositions/defiAddresses.js | 44 + .../libs/defiPositions/defiAddresses.js.map | 1 + dist/src/libs/defiPositions/helpers.d.ts | 5 + dist/src/libs/defiPositions/helpers.d.ts.map | 1 + dist/src/libs/defiPositions/helpers.js | 24 + dist/src/libs/defiPositions/helpers.js.map | 1 + .../libs/defiPositions/providers/aaveV3.d.ts | 5 + .../defiPositions/providers/aaveV3.d.ts.map | 1 + .../libs/defiPositions/providers/aaveV3.js | 147 + .../defiPositions/providers/aaveV3.js.map | 1 + .../helpers/networksWithPositions.d.ts | 6 + .../helpers/networksWithPositions.d.ts.map | 1 + .../helpers/networksWithPositions.js | 23 + .../helpers/networksWithPositions.js.map | 1 + .../providers/helpers/univ3Math.d.ts | 6 + .../providers/helpers/univ3Math.d.ts.map | 1 + .../providers/helpers/univ3Math.js | 32 + .../providers/helpers/univ3Math.js.map | 1 + .../libs/defiPositions/providers/index.d.ts | 4 + .../defiPositions/providers/index.d.ts.map | 1 + .../src/libs/defiPositions/providers/index.js | 4 + .../libs/defiPositions/providers/index.js.map | 1 + .../libs/defiPositions/providers/uniV3.d.ts | 5 + .../defiPositions/providers/uniV3.d.ts.map | 1 + .../src/libs/defiPositions/providers/uniV3.js | 85 + .../libs/defiPositions/providers/uniV3.js.map | 1 + dist/src/libs/defiPositions/types.d.ts | 67 + dist/src/libs/defiPositions/types.d.ts.map | 1 + dist/src/libs/defiPositions/types.js | 12 + dist/src/libs/defiPositions/types.js.map | 1 + dist/src/libs/deployless/compile.d.ts | 11 + dist/src/libs/deployless/compile.d.ts.map | 1 + dist/src/libs/deployless/compile.js | 70 + dist/src/libs/deployless/compile.js.map | 1 + dist/src/libs/deployless/deployless.d.ts | 35 + dist/src/libs/deployless/deployless.d.ts.map | 1 + dist/src/libs/deployless/deployless.js | 126 +- dist/src/libs/deployless/deployless.js.map | 2 +- .../libs/deployless/simulateDeployCall.d.ts | 6 + .../deployless/simulateDeployCall.d.ts.map | 1 + .../src/libs/deployless/simulateDeployCall.js | 49 + .../libs/deployless/simulateDeployCall.js.map | 1 + dist/src/libs/dkim/getPublicKey.d.ts | 10 + dist/src/libs/dkim/getPublicKey.d.ts.map | 1 + dist/src/libs/dkim/getPublicKey.js | 35 + dist/src/libs/dkim/getPublicKey.js.map | 1 + dist/src/libs/dkim/isDKIM.d.ts | 2 + dist/src/libs/dkim/isDKIM.d.ts.map | 1 + dist/src/libs/dkim/isDKIM.js | 4 + dist/src/libs/dkim/isDKIM.js.map | 1 + dist/src/libs/dkim/parse.d.ts | 6 + dist/src/libs/dkim/parse.d.ts.map | 1 + dist/src/libs/dkim/parse.js | 76 + dist/src/libs/dkim/parse.js.map | 1 + dist/src/libs/dkim/parseEmail.d.ts | 2 + dist/src/libs/dkim/parseEmail.d.ts.map | 1 + dist/src/libs/dkim/parseEmail.js | 60 + dist/src/libs/dkim/parseEmail.js.map | 1 + dist/src/libs/dkim/publicKeyToComponents.d.ts | 5 + .../libs/dkim/publicKeyToComponents.d.ts.map | 1 + dist/src/libs/dkim/publicKeyToComponents.js | 10 + .../libs/dkim/publicKeyToComponents.js.map | 1 + dist/src/libs/dkim/recovery.d.ts | 27 + dist/src/libs/dkim/recovery.d.ts.map | 1 + dist/src/libs/dkim/recovery.js | 41 + dist/src/libs/dkim/recovery.js.map | 1 + dist/src/libs/dkim/toSolidity.d.ts | 2 + dist/src/libs/dkim/toSolidity.d.ts.map | 1 + dist/src/libs/dkim/toSolidity.js | 15 + dist/src/libs/dkim/toSolidity.js.map | 1 + dist/src/libs/dns/lookup.d.ts | 17 + dist/src/libs/dns/lookup.d.ts.map | 1 + dist/src/libs/dns/lookup.js | 27 + dist/src/libs/dns/lookup.js.map | 1 + dist/src/libs/emailVault/emailVault.d.ts | 27 + dist/src/libs/emailVault/emailVault.d.ts.map | 1 + dist/src/libs/emailVault/emailVault.js | 54 + dist/src/libs/emailVault/emailVault.js.map | 1 + dist/src/libs/erc7677/erc7677.d.ts | 9 + dist/src/libs/erc7677/erc7677.d.ts.map | 1 + dist/src/libs/erc7677/erc7677.js | 37 + dist/src/libs/erc7677/erc7677.js.map | 1 + dist/src/libs/erc7677/types.d.ts | 37 + dist/src/libs/erc7677/types.d.ts.map | 1 + dist/src/libs/erc7677/types.js | 2 + dist/src/libs/erc7677/types.js.map | 1 + dist/src/libs/errorDecoder/constants.d.ts | 5 + dist/src/libs/errorDecoder/constants.d.ts.map | 1 + dist/src/libs/errorDecoder/constants.js | 6 + dist/src/libs/errorDecoder/constants.js.map | 1 + dist/src/libs/errorDecoder/customErrors.d.ts | 22 + .../libs/errorDecoder/customErrors.d.ts.map | 1 + dist/src/libs/errorDecoder/customErrors.js | 53 + .../src/libs/errorDecoder/customErrors.js.map | 1 + dist/src/libs/errorDecoder/errorDecoder.d.ts | 3 + .../libs/errorDecoder/errorDecoder.d.ts.map | 1 + dist/src/libs/errorDecoder/errorDecoder.js | 75 + .../src/libs/errorDecoder/errorDecoder.js.map | 1 + .../libs/errorDecoder/handlers/biconomy.d.ts | 7 + .../errorDecoder/handlers/biconomy.d.ts.map | 1 + .../libs/errorDecoder/handlers/biconomy.js | 25 + .../errorDecoder/handlers/biconomy.js.map | 1 + .../libs/errorDecoder/handlers/bundler.d.ts | 7 + .../errorDecoder/handlers/bundler.d.ts.map | 1 + .../src/libs/errorDecoder/handlers/bundler.js | 45 + .../libs/errorDecoder/handlers/bundler.js.map | 1 + .../libs/errorDecoder/handlers/custom.d.ts | 8 + .../errorDecoder/handlers/custom.d.ts.map | 1 + dist/src/libs/errorDecoder/handlers/custom.js | 24 + .../libs/errorDecoder/handlers/custom.js.map | 1 + .../src/libs/errorDecoder/handlers/index.d.ts | 10 + .../libs/errorDecoder/handlers/index.d.ts.map | 1 + dist/src/libs/errorDecoder/handlers/index.js | 10 + .../libs/errorDecoder/handlers/index.js.map | 1 + .../handlers/innerCallFailure.d.ts | 8 + .../handlers/innerCallFailure.d.ts.map | 1 + .../errorDecoder/handlers/innerCallFailure.js | 45 + .../handlers/innerCallFailure.js.map | 1 + .../src/libs/errorDecoder/handlers/panic.d.ts | 7 + .../libs/errorDecoder/handlers/panic.d.ts.map | 1 + dist/src/libs/errorDecoder/handlers/panic.js | 34 + .../libs/errorDecoder/handlers/panic.js.map | 1 + .../libs/errorDecoder/handlers/paymaster.d.ts | 7 + .../errorDecoder/handlers/paymaster.d.ts.map | 1 + .../libs/errorDecoder/handlers/paymaster.js | 18 + .../errorDecoder/handlers/paymaster.js.map | 1 + .../libs/errorDecoder/handlers/pimlico.d.ts | 7 + .../errorDecoder/handlers/pimlico.d.ts.map | 1 + .../src/libs/errorDecoder/handlers/pimlico.js | 25 + .../libs/errorDecoder/handlers/pimlico.js.map | 1 + .../libs/errorDecoder/handlers/relayer.d.ts | 7 + .../errorDecoder/handlers/relayer.d.ts.map | 1 + .../src/libs/errorDecoder/handlers/relayer.js | 37 + .../libs/errorDecoder/handlers/relayer.js.map | 1 + .../libs/errorDecoder/handlers/revert.d.ts | 7 + .../errorDecoder/handlers/revert.d.ts.map | 1 + dist/src/libs/errorDecoder/handlers/revert.js | 33 + .../libs/errorDecoder/handlers/revert.js.map | 1 + dist/src/libs/errorDecoder/handlers/rpc.d.ts | 10 + .../libs/errorDecoder/handlers/rpc.d.ts.map | 1 + dist/src/libs/errorDecoder/handlers/rpc.js | 41 + .../src/libs/errorDecoder/handlers/rpc.js.map | 1 + .../errorDecoder/handlers/userRejection.d.ts | 9 + .../handlers/userRejection.d.ts.map | 1 + .../errorDecoder/handlers/userRejection.js | 20 + .../handlers/userRejection.js.map | 1 + dist/src/libs/errorDecoder/helpers.d.ts | 11 + dist/src/libs/errorDecoder/helpers.d.ts.map | 1 + dist/src/libs/errorDecoder/helpers.js | 78 + dist/src/libs/errorDecoder/helpers.js.map | 1 + dist/src/libs/errorDecoder/index.d.ts | 3 + dist/src/libs/errorDecoder/index.d.ts.map | 1 + dist/src/libs/errorDecoder/index.js | 3 + dist/src/libs/errorDecoder/index.js.map | 1 + dist/src/libs/errorDecoder/types.d.ts | 34 + dist/src/libs/errorDecoder/types.d.ts.map | 1 + dist/src/libs/errorDecoder/types.js | 26 + dist/src/libs/errorDecoder/types.js.map | 1 + .../broadcastErrorHumanizer.d.ts | 4 + .../broadcastErrorHumanizer.d.ts.map | 1 + .../errorHumanizer/broadcastErrorHumanizer.js | 33 + .../broadcastErrorHumanizer.js.map | 1 + dist/src/libs/errorHumanizer/errors.d.ts | 7 + dist/src/libs/errorHumanizer/errors.d.ts.map | 1 + dist/src/libs/errorHumanizer/errors.js | 163 + dist/src/libs/errorHumanizer/errors.js.map | 1 + .../estimationErrorHumanizer.d.ts | 4 + .../estimationErrorHumanizer.d.ts.map | 1 + .../estimationErrorHumanizer.js | 28 + .../estimationErrorHumanizer.js.map | 1 + dist/src/libs/errorHumanizer/helpers.d.ts | 6 + dist/src/libs/errorHumanizer/helpers.d.ts.map | 1 + dist/src/libs/errorHumanizer/helpers.js | 49 + dist/src/libs/errorHumanizer/helpers.js.map | 1 + .../errorHumanizer/humanizeCommonCases.d.ts | 3 + .../humanizeCommonCases.d.ts.map | 1 + .../errorHumanizer/humanizeCommonCases.js | 15 + .../errorHumanizer/humanizeCommonCases.js.map | 1 + dist/src/libs/errorHumanizer/index.d.ts | 4 + dist/src/libs/errorHumanizer/index.d.ts.map | 1 + dist/src/libs/errorHumanizer/index.js | 4 + dist/src/libs/errorHumanizer/index.js.map | 1 + dist/src/libs/errorHumanizer/types.d.ts | 6 + dist/src/libs/errorHumanizer/types.d.ts.map | 1 + dist/src/libs/errorHumanizer/types.js | 2 + dist/src/libs/errorHumanizer/types.js.map | 1 + dist/src/libs/estimate/errors.d.ts | 6 + dist/src/libs/estimate/errors.d.ts.map | 1 + dist/src/libs/estimate/errors.js | 15 + dist/src/libs/estimate/errors.js.map | 1 + dist/src/libs/estimate/estimate.d.ts | 14 + dist/src/libs/estimate/estimate.d.ts.map | 1 + dist/src/libs/estimate/estimate.js | 377 +- dist/src/libs/estimate/estimate.js.map | 2 +- dist/src/libs/estimate/estimateBundler.d.ts | 9 + .../libs/estimate/estimateBundler.d.ts.map | 1 + dist/src/libs/estimate/estimateBundler.js | 122 + dist/src/libs/estimate/estimateBundler.js.map | 1 + dist/src/libs/estimate/estimateEOA.d.ts | 8 + dist/src/libs/estimate/estimateEOA.d.ts.map | 1 + dist/src/libs/estimate/estimateEOA.js | 107 + dist/src/libs/estimate/estimateEOA.js.map | 1 + dist/src/libs/estimate/estimateGas.d.ts | 6 + dist/src/libs/estimate/estimateGas.d.ts.map | 1 + dist/src/libs/estimate/estimateGas.js | 59 + dist/src/libs/estimate/estimateGas.js.map | 1 + dist/src/libs/estimate/estimateHelpers.d.ts | 4 + .../libs/estimate/estimateHelpers.d.ts.map | 1 + dist/src/libs/estimate/estimateHelpers.js | 24 + dist/src/libs/estimate/estimateHelpers.js.map | 1 + .../libs/estimate/estimateWithRetries.d.ts | 2 + .../estimate/estimateWithRetries.d.ts.map | 1 + dist/src/libs/estimate/estimateWithRetries.js | 53 + .../libs/estimate/estimateWithRetries.js.map | 1 + dist/src/libs/estimate/interfaces.d.ts | 36 + dist/src/libs/estimate/interfaces.d.ts.map | 1 + dist/src/libs/estimate/interfaces.js | 2 + dist/src/libs/estimate/interfaces.js.map | 1 + dist/src/libs/estimate/refund.d.ts | 5 + dist/src/libs/estimate/refund.d.ts.map | 1 + dist/src/libs/estimate/refund.js | 34 + dist/src/libs/estimate/refund.js.map | 1 + dist/src/libs/gasPrice/gasPrice.d.ts | 21 + dist/src/libs/gasPrice/gasPrice.d.ts.map | 1 + dist/src/libs/gasPrice/gasPrice.js | 214 + dist/src/libs/gasPrice/gasPrice.js.map | 1 + dist/src/libs/humanizer/const/abis/1Inch.d.ts | 2 + .../libs/humanizer/const/abis/1Inch.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/1Inch.js | 54 + .../libs/humanizer/const/abis/1Inch.js.map | 1 + dist/src/libs/humanizer/const/abis/Aave.d.ts | 4 + .../libs/humanizer/const/abis/Aave.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Aave.js | 118 + .../src/libs/humanizer/const/abis/Aave.js.map | 1 + .../src/libs/humanizer/const/abis/Across.d.ts | 2 + .../libs/humanizer/const/abis/Across.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Across.js | 56 + .../libs/humanizer/const/abis/Across.js.map | 1 + .../humanizer/const/abis/AmbireAccount.d.ts | 2 + .../const/abis/AmbireAccount.d.ts.map | 1 + .../humanizer/const/abis/AmbireAccount.js | 13 + .../humanizer/const/abis/AmbireAccount.js.map | 1 + dist/src/libs/humanizer/const/abis/Curve.d.ts | 2 + .../libs/humanizer/const/abis/Curve.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Curve.js | 16 + .../libs/humanizer/const/abis/Curve.js.map | 1 + .../libs/humanizer/const/abis/KyberSwap.d.ts | 2 + .../humanizer/const/abis/KyberSwap.d.ts.map | 1 + .../libs/humanizer/const/abis/KyberSwap.js | 14 + .../humanizer/const/abis/KyberSwap.js.map | 1 + .../libs/humanizer/const/abis/Legends.d.ts | 2 + .../humanizer/const/abis/Legends.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Legends.js | 8 + .../libs/humanizer/const/abis/Legends.js.map | 1 + dist/src/libs/humanizer/const/abis/Lido.d.ts | 3 + .../libs/humanizer/const/abis/Lido.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Lido.js | 30 + .../src/libs/humanizer/const/abis/Lido.js.map | 1 + dist/src/libs/humanizer/const/abis/Sushi.d.ts | 2 + .../libs/humanizer/const/abis/Sushi.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Sushi.js | 13 + .../libs/humanizer/const/abis/Sushi.js.map | 1 + .../src/libs/humanizer/const/abis/Tokens.d.ts | 4 + .../libs/humanizer/const/abis/Tokens.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Tokens.js | 66 + .../libs/humanizer/const/abis/Tokens.js.map | 1 + .../libs/humanizer/const/abis/TraderJoe.d.ts | 2 + .../humanizer/const/abis/TraderJoe.d.ts.map | 1 + .../libs/humanizer/const/abis/TraderJoe.js | 30 + .../humanizer/const/abis/TraderJoe.js.map | 1 + .../libs/humanizer/const/abis/Uniswap.d.ts | 5 + .../humanizer/const/abis/Uniswap.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Uniswap.js | 100 + .../libs/humanizer/const/abis/Uniswap.js.map | 1 + .../src/libs/humanizer/const/abis/Wallet.d.ts | 2 + .../libs/humanizer/const/abis/Wallet.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/Wallet.js | 45 + .../libs/humanizer/const/abis/Wallet.js.map | 1 + dist/src/libs/humanizer/const/abis/index.d.ts | 13 + .../libs/humanizer/const/abis/index.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/index.js | 13 + .../libs/humanizer/const/abis/index.js.map | 1 + .../src/libs/humanizer/const/abis/socket.d.ts | 2 + .../libs/humanizer/const/abis/socket.d.ts.map | 1 + dist/src/libs/humanizer/const/abis/socket.js | 37 + .../libs/humanizer/const/abis/socket.js.map | 1 + .../libs/humanizer/const/abis/stkWallet.d.ts | 2 + .../humanizer/const/abis/stkWallet.d.ts.map | 1 + .../libs/humanizer/const/abis/stkWallet.js | 7 + .../humanizer/const/abis/stkWallet.js.map | 1 + dist/src/libs/humanizer/const/coinType.d.ts | 4 + .../libs/humanizer/const/coinType.d.ts.map | 1 + dist/src/libs/humanizer/const/coinType.js | 1364 + dist/src/libs/humanizer/const/coinType.js.map | 1 + dist/src/libs/humanizer/index.d.ts | 10 + dist/src/libs/humanizer/index.d.ts.map | 1 + dist/src/libs/humanizer/index.js | 109 + dist/src/libs/humanizer/index.js.map | 1 + dist/src/libs/humanizer/interfaces.d.ts | 85 + dist/src/libs/humanizer/interfaces.d.ts.map | 1 + dist/src/libs/humanizer/interfaces.js | 2 + dist/src/libs/humanizer/interfaces.js.map | 1 + .../humanizer/messageModules/ensModule.d.ts | 3 + .../messageModules/ensModule.d.ts.map | 1 + .../humanizer/messageModules/ensModule.js | 20 + .../humanizer/messageModules/ensModule.js.map | 1 + .../messageModules/entryPointModule.d.ts | 3 + .../messageModules/entryPointModule.d.ts.map | 1 + .../messageModules/entryPointModule.js | 16 + .../messageModules/entryPointModule.js.map | 1 + .../humanizer/messageModules/erc20Module.d.ts | 3 + .../messageModules/erc20Module.d.ts.map | 1 + .../humanizer/messageModules/erc20Module.js | 40 + .../messageModules/erc20Module.js.map | 1 + .../messageModules/erc721Module.d.ts | 3 + .../messageModules/erc721Module.d.ts.map | 1 + .../humanizer/messageModules/erc721Module.js | 29 + .../messageModules/erc721Module.js.map | 1 + .../libs/humanizer/messageModules/index.d.ts | 9 + .../humanizer/messageModules/index.d.ts.map | 1 + .../libs/humanizer/messageModules/index.js | 9 + .../humanizer/messageModules/index.js.map | 1 + .../messageModules/legendsModule.d.ts | 3 + .../messageModules/legendsModule.d.ts.map | 1 + .../humanizer/messageModules/legendsModule.js | 25 + .../messageModules/legendsModule.js.map | 1 + .../messageModules/openseaModule.d.ts | 3 + .../messageModules/openseaModule.d.ts.map | 1 + .../humanizer/messageModules/openseaModule.js | 66 + .../messageModules/openseaModule.js.map | 1 + .../messageModules/permit2Module.d.ts | 3 + .../messageModules/permit2Module.d.ts.map | 1 + .../humanizer/messageModules/permit2Module.js | 37 + .../messageModules/permit2Module.js.map | 1 + .../libs/humanizer/modules/1Inch/index.d.ts | 4 + .../humanizer/modules/1Inch/index.d.ts.map | 1 + .../src/libs/humanizer/modules/1Inch/index.js | 67 + .../libs/humanizer/modules/1Inch/index.js.map | 1 + .../modules/Aave/aaveLendingPoolV2.d.ts | 4 + .../modules/Aave/aaveLendingPoolV2.d.ts.map | 1 + .../modules/Aave/aaveLendingPoolV2.js | 49 + .../modules/Aave/aaveLendingPoolV2.js.map | 1 + .../libs/humanizer/modules/Aave/aaveV3.d.ts | 4 + .../humanizer/modules/Aave/aaveV3.d.ts.map | 1 + .../src/libs/humanizer/modules/Aave/aaveV3.js | 172 + .../libs/humanizer/modules/Aave/aaveV3.js.map | 1 + .../modules/Aave/aaveWethGatewayV2.d.ts | 4 + .../modules/Aave/aaveWethGatewayV2.d.ts.map | 1 + .../modules/Aave/aaveWethGatewayV2.js | 48 + .../modules/Aave/aaveWethGatewayV2.js.map | 1 + .../libs/humanizer/modules/Aave/index.d.ts | 3 + .../humanizer/modules/Aave/index.d.ts.map | 1 + dist/src/libs/humanizer/modules/Aave/index.js | 18 + .../libs/humanizer/modules/Aave/index.js.map | 1 + .../libs/humanizer/modules/Across/index.d.ts | 4 + .../humanizer/modules/Across/index.d.ts.map | 1 + .../libs/humanizer/modules/Across/index.js | 49 + .../humanizer/modules/Across/index.js.map | 1 + .../humanizer/modules/Airdrops/index.d.ts | 3 + .../humanizer/modules/Airdrops/index.d.ts.map | 1 + .../libs/humanizer/modules/Airdrops/index.js | 19 + .../humanizer/modules/Airdrops/index.js.map | 1 + .../modules/AsciiModule/asciiModule.d.ts | 3 + .../modules/AsciiModule/asciiModule.d.ts.map | 1 + .../modules/AsciiModule/asciiModule.js | 33 + .../modules/AsciiModule/asciiModule.js.map | 1 + .../humanizer/modules/AsciiModule/index.d.ts | 3 + .../modules/AsciiModule/index.d.ts.map | 1 + .../humanizer/modules/AsciiModule/index.js | 3 + .../modules/AsciiModule/index.js.map | 1 + .../libs/humanizer/modules/Curve/index.d.ts | 4 + .../humanizer/modules/Curve/index.d.ts.map | 1 + .../src/libs/humanizer/modules/Curve/index.js | 33 + .../libs/humanizer/modules/Curve/index.js.map | 1 + .../humanizer/modules/Deployment/index.d.ts | 3 + .../modules/Deployment/index.d.ts.map | 1 + .../humanizer/modules/Deployment/index.js | 13 + .../humanizer/modules/Deployment/index.js.map | 1 + .../src/libs/humanizer/modules/ENS/index.d.ts | 3 + .../libs/humanizer/modules/ENS/index.d.ts.map | 1 + dist/src/libs/humanizer/modules/ENS/index.js | 128 + .../libs/humanizer/modules/ENS/index.js.map | 1 + .../FallbackHumanizer/fallBackHumanizer.d.ts | 3 + .../fallBackHumanizer.d.ts.map | 1 + .../FallbackHumanizer/fallBackHumanizer.js | 64 + .../fallBackHumanizer.js.map | 1 + .../modules/FallbackHumanizer/index.d.ts | 3 + .../modules/FallbackHumanizer/index.d.ts.map | 1 + .../modules/FallbackHumanizer/index.js | 3 + .../modules/FallbackHumanizer/index.js.map | 1 + .../modules/GasTankModule/gasTankModule.d.ts | 3 + .../GasTankModule/gasTankModule.d.ts.map | 1 + .../modules/GasTankModule/gasTankModule.js | 37 + .../GasTankModule/gasTankModule.js.map | 1 + .../modules/GasTankModule/index.d.ts | 3 + .../modules/GasTankModule/index.d.ts.map | 1 + .../humanizer/modules/GasTankModule/index.js | 3 + .../modules/GasTankModule/index.js.map | 1 + .../humanizer/modules/KyberSwap/index.d.ts | 4 + .../modules/KyberSwap/index.d.ts.map | 1 + .../libs/humanizer/modules/KyberSwap/index.js | 34 + .../humanizer/modules/KyberSwap/index.js.map | 1 + .../libs/humanizer/modules/Legends/index.d.ts | 4 + .../humanizer/modules/Legends/index.d.ts.map | 1 + .../libs/humanizer/modules/Legends/index.js | 91 + .../humanizer/modules/Legends/index.js.map | 1 + .../libs/humanizer/modules/Lido/index.d.ts | 3 + .../humanizer/modules/Lido/index.d.ts.map | 1 + dist/src/libs/humanizer/modules/Lido/index.js | 52 + .../libs/humanizer/modules/Lido/index.js.map | 1 + .../libs/humanizer/modules/OpenSea/index.d.ts | 3 + .../humanizer/modules/OpenSea/index.d.ts.map | 1 + .../libs/humanizer/modules/OpenSea/index.js | 177 + .../humanizer/modules/OpenSea/index.js.map | 1 + .../modules/PostProcessing/index.d.ts | 3 + .../modules/PostProcessing/index.d.ts.map | 1 + .../humanizer/modules/PostProcessing/index.js | 3 + .../modules/PostProcessing/index.js.map | 1 + .../PostProcessing/postProcessModule.d.ts | 3 + .../PostProcessing/postProcessModule.d.ts.map | 1 + .../PostProcessing/postProcessModule.js | 17 + .../PostProcessing/postProcessModule.js.map | 1 + .../humanizer/modules/PreProcess/index.d.ts | 3 + .../modules/PreProcess/index.d.ts.map | 1 + .../humanizer/modules/PreProcess/index.js | 3 + .../humanizer/modules/PreProcess/index.js.map | 1 + .../modules/PreProcess/preProcessModule.d.ts | 3 + .../PreProcess/preProcessModule.d.ts.map | 1 + .../modules/PreProcess/preProcessModule.js | 11 + .../PreProcess/preProcessModule.js.map | 1 + .../humanizer/modules/Privileges/index.d.ts | 3 + .../modules/Privileges/index.d.ts.map | 1 + .../humanizer/modules/Privileges/index.js | 3 + .../humanizer/modules/Privileges/index.js.map | 1 + .../modules/Privileges/privileges.d.ts | 3 + .../modules/Privileges/privileges.d.ts.map | 1 + .../modules/Privileges/privileges.js | 34 + .../modules/Privileges/privileges.js.map | 1 + .../modules/SingletonFactory/index.d.ts | 3 + .../modules/SingletonFactory/index.d.ts.map | 1 + .../modules/SingletonFactory/index.js | 3 + .../modules/SingletonFactory/index.js.map | 1 + .../SingletonFactory/singletonFactory.d.ts | 3 + .../singletonFactory.d.ts.map | 1 + .../SingletonFactory/singletonFactory.js | 23 + .../SingletonFactory/singletonFactory.js.map | 1 + .../libs/humanizer/modules/Socket/index.d.ts | 3 + .../humanizer/modules/Socket/index.d.ts.map | 1 + .../libs/humanizer/modules/Socket/index.js | 3 + .../humanizer/modules/Socket/index.js.map | 1 + .../modules/Socket/socketModules.d.ts | 3 + .../modules/Socket/socketModules.d.ts.map | 1 + .../humanizer/modules/Socket/socketModules.js | 572 + .../modules/Socket/socketModules.js.map | 1 + .../humanizer/modules/Sushiswap/index.d.ts | 3 + .../modules/Sushiswap/index.d.ts.map | 1 + .../libs/humanizer/modules/Sushiswap/index.js | 3 + .../humanizer/modules/Sushiswap/index.js.map | 1 + .../modules/Sushiswap/sushiSwapModule.d.ts | 3 + .../Sushiswap/sushiSwapModule.d.ts.map | 1 + .../modules/Sushiswap/sushiSwapModule.js | 35 + .../modules/Sushiswap/sushiSwapModule.js.map | 1 + .../libs/humanizer/modules/Tokens/index.d.ts | 3 + .../humanizer/modules/Tokens/index.d.ts.map | 1 + .../libs/humanizer/modules/Tokens/index.js | 3 + .../humanizer/modules/Tokens/index.js.map | 1 + .../libs/humanizer/modules/Tokens/tokens.d.ts | 4 + .../humanizer/modules/Tokens/tokens.d.ts.map | 1 + .../libs/humanizer/modules/Tokens/tokens.js | 158 + .../humanizer/modules/Tokens/tokens.js.map | 1 + .../humanizer/modules/TraderJoe/index.d.ts | 4 + .../modules/TraderJoe/index.d.ts.map | 1 + .../libs/humanizer/modules/TraderJoe/index.js | 95 + .../humanizer/modules/TraderJoe/index.js.map | 1 + .../humanizer/modules/Uniswap/Commands.d.ts | 170 + .../modules/Uniswap/Commands.d.ts.map | 1 + .../humanizer/modules/Uniswap/Commands.js | 197 + .../humanizer/modules/Uniswap/Commands.js.map | 1 + .../libs/humanizer/modules/Uniswap/index.d.ts | 3 + .../humanizer/modules/Uniswap/index.d.ts.map | 1 + .../libs/humanizer/modules/Uniswap/index.js | 52 + .../humanizer/modules/Uniswap/index.js.map | 1 + .../humanizer/modules/Uniswap/interfaces.d.ts | 6 + .../modules/Uniswap/interfaces.d.ts.map | 1 + .../humanizer/modules/Uniswap/interfaces.js | 2 + .../modules/Uniswap/interfaces.js.map | 1 + .../modules/Uniswap/uniUniversalRouter.d.ts | 3 + .../Uniswap/uniUniversalRouter.d.ts.map | 1 + .../modules/Uniswap/uniUniversalRouter.js | 173 + .../modules/Uniswap/uniUniversalRouter.js.map | 1 + .../libs/humanizer/modules/Uniswap/uniV2.d.ts | 4 + .../humanizer/modules/Uniswap/uniV2.d.ts.map | 1 + .../libs/humanizer/modules/Uniswap/uniV2.js | 134 + .../humanizer/modules/Uniswap/uniV2.js.map | 1 + .../libs/humanizer/modules/Uniswap/uniV3.d.ts | 5 + .../humanizer/modules/Uniswap/uniV3.d.ts.map | 1 + .../libs/humanizer/modules/Uniswap/uniV3.js | 315 + .../humanizer/modules/Uniswap/uniV3.js.map | 1 + .../libs/humanizer/modules/Uniswap/utils.d.ts | 6 + .../humanizer/modules/Uniswap/utils.d.ts.map | 1 + .../libs/humanizer/modules/Uniswap/utils.js | 100 + .../humanizer/modules/Uniswap/utils.js.map | 1 + .../WALLET/WALLETSupplyController.d.ts | 5 + .../WALLET/WALLETSupplyController.d.ts.map | 1 + .../modules/WALLET/WALLETSupplyController.js | 29 + .../WALLET/WALLETSupplyController.js.map | 1 + .../libs/humanizer/modules/WALLET/index.d.ts | 3 + .../humanizer/modules/WALLET/index.d.ts.map | 1 + .../libs/humanizer/modules/WALLET/index.js | 87 + .../humanizer/modules/WALLET/index.js.map | 1 + .../modules/WALLET/stakingPools.d.ts | 5 + .../modules/WALLET/stakingPools.d.ts.map | 1 + .../humanizer/modules/WALLET/stakingPools.js | 61 + .../modules/WALLET/stakingPools.js.map | 1 + .../humanizer/modules/Wrapping/index.d.ts | 3 + .../humanizer/modules/Wrapping/index.d.ts.map | 1 + .../libs/humanizer/modules/Wrapping/index.js | 3 + .../humanizer/modules/Wrapping/index.js.map | 1 + .../humanizer/modules/Wrapping/wrapping.d.ts | 3 + .../modules/Wrapping/wrapping.d.ts.map | 1 + .../humanizer/modules/Wrapping/wrapping.js | 39 + .../modules/Wrapping/wrapping.js.map | 1 + .../index.d.ts | 3 + .../index.d.ts.map | 1 + .../embeddedAmbireOperationHumanizer/index.js | 66 + .../index.js.map | 1 + dist/src/libs/humanizer/testHelpers.d.ts | 4 + dist/src/libs/humanizer/testHelpers.d.ts.map | 1 + dist/src/libs/humanizer/testHelpers.js | 19 + dist/src/libs/humanizer/testHelpers.js.map | 1 + dist/src/libs/humanizer/utils.d.ts | 37 + dist/src/libs/humanizer/utils.d.ts.map | 1 + dist/src/libs/humanizer/utils.js | 120 + dist/src/libs/humanizer/utils.js.map | 1 + dist/src/libs/keyIterator/keyIterator.d.ts | 31 + .../src/libs/keyIterator/keyIterator.d.ts.map | 1 + dist/src/libs/keyIterator/keyIterator.js | 137 + dist/src/libs/keyIterator/keyIterator.js.map | 1 + dist/src/libs/keys/keys.d.ts | 24 + dist/src/libs/keys/keys.d.ts.map | 1 + dist/src/libs/keys/keys.js | 62 + dist/src/libs/keys/keys.js.map | 1 + .../libs/keystoreSigner/keystoreSigner.d.ts | 13 + .../keystoreSigner/keystoreSigner.d.ts.map | 1 + .../src/libs/keystoreSigner/keystoreSigner.js | 49 + .../libs/keystoreSigner/keystoreSigner.js.map | 1 + dist/src/libs/ledger/ledger.d.ts | 8 + dist/src/libs/ledger/ledger.d.ts.map | 1 + dist/src/libs/ledger/ledger.js | 35 + dist/src/libs/ledger/ledger.js.map | 1 + dist/src/libs/magicLink/magicLink.d.ts | 17 + dist/src/libs/magicLink/magicLink.d.ts.map | 1 + dist/src/libs/magicLink/magicLink.js | 13 + dist/src/libs/magicLink/magicLink.js.map | 1 + dist/src/libs/main/main.d.ts | 38 + dist/src/libs/main/main.d.ts.map | 1 + dist/src/libs/main/main.js | 118 + dist/src/libs/main/main.js.map | 1 + dist/src/libs/networks/networks.d.ts | 24 + dist/src/libs/networks/networks.d.ts.map | 1 + dist/src/libs/networks/networks.js | 323 + dist/src/libs/networks/networks.js.map | 1 + .../src/libs/paymaster/abstractPaymaster.d.ts | 21 + .../libs/paymaster/abstractPaymaster.d.ts.map | 1 + dist/src/libs/paymaster/abstractPaymaster.js | 6 + .../libs/paymaster/abstractPaymaster.js.map | 1 + dist/src/libs/paymaster/paymaster.d.ts | 31 + dist/src/libs/paymaster/paymaster.d.ts.map | 1 + dist/src/libs/paymaster/paymaster.js | 220 + dist/src/libs/paymaster/paymaster.js.map | 1 + dist/src/libs/polling/polling.d.ts | 13 + dist/src/libs/polling/polling.d.ts.map | 1 + dist/src/libs/polling/polling.js | 51 + dist/src/libs/polling/polling.js.map | 1 + dist/src/libs/portfolio/batcher.d.ts | 17 + dist/src/libs/portfolio/batcher.d.ts.map | 1 + dist/src/libs/portfolio/batcher.js | 56 +- dist/src/libs/portfolio/batcher.js.map | 2 +- dist/src/libs/portfolio/customToken.d.ts | 17 + dist/src/libs/portfolio/customToken.d.ts.map | 1 + dist/src/libs/portfolio/customToken.js | 3 +- dist/src/libs/portfolio/customToken.js.map | 2 +- dist/src/libs/portfolio/gecko.d.ts | 5 + dist/src/libs/portfolio/gecko.d.ts.map | 1 + dist/src/libs/portfolio/gecko.js | 39 +- dist/src/libs/portfolio/gecko.js.map | 2 +- .../libs/portfolio/getNetworksWithAssets.d.ts | 8 + .../portfolio/getNetworksWithAssets.d.ts.map | 1 + .../libs/portfolio/getNetworksWithAssets.js | 20 + .../portfolio/getNetworksWithAssets.js.map | 1 + .../libs/portfolio/getOnchainBalances.d.ts | 19 + .../portfolio/getOnchainBalances.d.ts.map | 1 + dist/src/libs/portfolio/getOnchainBalances.js | 191 +- .../libs/portfolio/getOnchainBalances.js.map | 2 +- dist/src/libs/portfolio/helpers.d.ts | 42 + dist/src/libs/portfolio/helpers.d.ts.map | 1 + dist/src/libs/portfolio/helpers.js | 253 +- dist/src/libs/portfolio/helpers.js.map | 2 +- dist/src/libs/portfolio/icons.d.ts | 4 + dist/src/libs/portfolio/icons.d.ts.map | 1 + dist/src/libs/portfolio/icons.js | 22 + dist/src/libs/portfolio/icons.js.map | 1 + dist/src/libs/portfolio/index.d.ts | 5 + dist/src/libs/portfolio/index.d.ts.map | 1 + dist/src/libs/portfolio/index.js | 3 + dist/src/libs/portfolio/index.js.map | 1 + dist/src/libs/portfolio/interfaces.d.ts | 213 + dist/src/libs/portfolio/interfaces.d.ts.map | 1 + dist/src/libs/portfolio/interfaces.js | 3 +- dist/src/libs/portfolio/interfaces.js.map | 2 +- .../migrations/tokenPreferences.d.ts | 24 + .../migrations/tokenPreferences.d.ts.map | 1 + .../portfolio/migrations/tokenPreferences.js | 46 + .../migrations/tokenPreferences.js.map | 1 + dist/src/libs/portfolio/pagination.d.ts | 4 + dist/src/libs/portfolio/pagination.d.ts.map | 1 + dist/src/libs/portfolio/pagination.js | 31 +- dist/src/libs/portfolio/pagination.js.map | 2 +- .../libs/portfolio/pendingAmountsHelper.d.ts | 42 + .../portfolio/pendingAmountsHelper.d.ts.map | 1 + .../libs/portfolio/pendingAmountsHelper.js | 97 + .../portfolio/pendingAmountsHelper.js.map | 1 + dist/src/libs/portfolio/portfolio.d.ts | 26 + dist/src/libs/portfolio/portfolio.d.ts.map | 1 + dist/src/libs/portfolio/portfolio.js | 321 +- dist/src/libs/portfolio/portfolio.js.map | 2 +- dist/src/libs/proxyDeploy/bytecode.d.ts | 5 + dist/src/libs/proxyDeploy/bytecode.d.ts.map | 1 + dist/src/libs/proxyDeploy/bytecode.js | 26 +- dist/src/libs/proxyDeploy/bytecode.js.map | 2 +- dist/src/libs/proxyDeploy/deploy.d.ts | 12 + dist/src/libs/proxyDeploy/deploy.d.ts.map | 1 + dist/src/libs/proxyDeploy/deploy.js | 32 +- dist/src/libs/proxyDeploy/deploy.js.map | 2 +- .../libs/proxyDeploy/getAmbireAddressTwo.d.ts | 2 + .../proxyDeploy/getAmbireAddressTwo.d.ts.map | 1 + .../libs/proxyDeploy/getAmbireAddressTwo.js | 10 +- .../proxyDeploy/getAmbireAddressTwo.js.map | 2 +- dist/src/libs/relayerCall/relayerCall.d.ts | 13 + .../src/libs/relayerCall/relayerCall.d.ts.map | 1 + dist/src/libs/relayerCall/relayerCall.js | 53 + dist/src/libs/relayerCall/relayerCall.js.map | 1 + dist/src/libs/richJson/richJson.d.ts | 18 + dist/src/libs/richJson/richJson.d.ts.map | 1 + dist/src/libs/richJson/richJson.js | 50 + dist/src/libs/richJson/richJson.js.map | 1 + dist/src/libs/selectedAccount/errors.d.ts | 37 + dist/src/libs/selectedAccount/errors.d.ts.map | 1 + dist/src/libs/selectedAccount/errors.js | 226 + dist/src/libs/selectedAccount/errors.js.map | 1 + .../libs/selectedAccount/selectedAccount.d.ts | 7 + .../selectedAccount/selectedAccount.d.ts.map | 1 + .../libs/selectedAccount/selectedAccount.js | 192 + .../selectedAccount/selectedAccount.js.map | 1 + dist/src/libs/signMessage/signMessage.d.ts | 82 + .../src/libs/signMessage/signMessage.d.ts.map | 1 + dist/src/libs/signMessage/signMessage.js | 376 + dist/src/libs/signMessage/signMessage.js.map | 1 + dist/src/libs/singleton/singleton.d.ts | 2 + dist/src/libs/singleton/singleton.d.ts.map | 1 + dist/src/libs/singleton/singleton.js | 27 + dist/src/libs/singleton/singleton.js.map | 1 + .../src/libs/swapAndBridge/swapAndBridge.d.ts | 27 + .../libs/swapAndBridge/swapAndBridge.d.ts.map | 1 + dist/src/libs/swapAndBridge/swapAndBridge.js | 295 + .../libs/swapAndBridge/swapAndBridge.js.map | 1 + .../swapAndBridgeErrorHumanizer.d.ts | 5 + .../swapAndBridgeErrorHumanizer.d.ts.map | 1 + .../swapAndBridgeErrorHumanizer.js | 21 + .../swapAndBridgeErrorHumanizer.js.map | 1 + dist/src/libs/tracer/debugTraceCall.d.ts | 9 + dist/src/libs/tracer/debugTraceCall.d.ts.map | 1 + dist/src/libs/tracer/debugTraceCall.js | 150 + dist/src/libs/tracer/debugTraceCall.js.map | 1 + dist/src/libs/transfer/amount.d.ts | 7 + dist/src/libs/transfer/amount.d.ts.map | 1 + dist/src/libs/transfer/amount.js | 12 + dist/src/libs/transfer/amount.js.map | 1 + dist/src/libs/transfer/userRequest.d.ts | 21 + dist/src/libs/transfer/userRequest.d.ts.map | 1 + dist/src/libs/transfer/userRequest.js | 141 + dist/src/libs/transfer/userRequest.js.map | 1 + dist/src/libs/trezor/trezor.d.ts | 13 + dist/src/libs/trezor/trezor.d.ts.map | 1 + dist/src/libs/trezor/trezor.js | 29 + dist/src/libs/trezor/trezor.js.map | 1 + dist/src/libs/userOperation/types.d.ts | 28 + dist/src/libs/userOperation/types.d.ts.map | 1 + dist/src/libs/userOperation/types.js | 2 + dist/src/libs/userOperation/types.js.map | 1 + .../src/libs/userOperation/userOperation.d.ts | 56 + .../libs/userOperation/userOperation.d.ts.map | 1 + dist/src/libs/userOperation/userOperation.js | 225 + .../libs/userOperation/userOperation.js.map | 1 + dist/src/services/address/address.d.ts | 5 + dist/src/services/address/address.d.ts.map | 1 + dist/src/services/address/address.js | 15 + dist/src/services/address/address.js.map | 1 + dist/src/services/address/index.d.ts | 2 + dist/src/services/address/index.d.ts.map | 1 + dist/src/services/address/index.js | 2 + dist/src/services/address/index.js.map | 1 + dist/src/services/assetInfo/assetInfo.d.ts | 15 + .../src/services/assetInfo/assetInfo.d.ts.map | 1 + dist/src/services/assetInfo/assetInfo.js | 51 + dist/src/services/assetInfo/assetInfo.js.map | 1 + dist/src/services/assetInfo/index.d.ts | 2 + dist/src/services/assetInfo/index.d.ts.map | 1 + dist/src/services/assetInfo/index.js | 2 + dist/src/services/assetInfo/index.js.map | 1 + .../services/bundlers/DevBundlerSwitcher.d.ts | 12 + .../bundlers/DevBundlerSwitcher.d.ts.map | 1 + .../services/bundlers/DevBundlerSwitcher.js | 16 + .../bundlers/DevBundlerSwitcher.js.map | 1 + dist/src/services/bundlers/biconomy.d.ts | 11 + dist/src/services/bundlers/biconomy.d.ts.map | 1 + dist/src/services/bundlers/biconomy.js | 73 + dist/src/services/bundlers/biconomy.js.map | 1 + .../bundlers/brokenBiconomyBroadcast.d.ts | 14 + .../bundlers/brokenBiconomyBroadcast.d.ts.map | 1 + .../bundlers/brokenBiconomyBroadcast.js | 16 + .../bundlers/brokenBiconomyBroadcast.js.map | 1 + .../bundlers/brokenPimlicoBroadcast.d.ts | 14 + .../bundlers/brokenPimlicoBroadcast.d.ts.map | 1 + .../bundlers/brokenPimlicoBroadcast.js | 16 + .../bundlers/brokenPimlicoBroadcast.js.map | 1 + dist/src/services/bundlers/bundler.d.ts | 58 + dist/src/services/bundlers/bundler.d.ts.map | 1 + dist/src/services/bundlers/bundler.js | 141 + dist/src/services/bundlers/bundler.js.map | 1 + .../services/bundlers/bundlerSwitcher.d.ts | 17 + .../bundlers/bundlerSwitcher.d.ts.map | 1 + dist/src/services/bundlers/bundlerSwitcher.js | 58 + .../services/bundlers/bundlerSwitcher.js.map | 1 + dist/src/services/bundlers/getBundler.d.ts | 10 + .../src/services/bundlers/getBundler.d.ts.map | 1 + dist/src/services/bundlers/getBundler.js | 22 + dist/src/services/bundlers/getBundler.js.map | 1 + dist/src/services/bundlers/pimlico.d.ts | 11 + dist/src/services/bundlers/pimlico.d.ts.map | 1 + dist/src/services/bundlers/pimlico.js | 23 + dist/src/services/bundlers/pimlico.js.map | 1 + dist/src/services/bundlers/types.d.ts | 16 + dist/src/services/bundlers/types.d.ts.map | 1 + dist/src/services/bundlers/types.js | 2 + dist/src/services/bundlers/types.js.map | 1 + dist/src/services/ensDomains/ensDomains.d.ts | 7 + .../services/ensDomains/ensDomains.d.ts.map | 1 + dist/src/services/ensDomains/ensDomains.js | 70 + .../src/services/ensDomains/ensDomains.js.map | 1 + dist/src/services/ensDomains/index.d.ts | 2 + dist/src/services/ensDomains/index.d.ts.map | 1 + dist/src/services/ensDomains/index.js | 2 + dist/src/services/ensDomains/index.js.map | 1 + dist/src/services/explorers/jiffyscan.d.ts | 3 + .../src/services/explorers/jiffyscan.d.ts.map | 1 + dist/src/services/explorers/jiffyscan.js | 19 + dist/src/services/explorers/jiffyscan.js.map | 1 + .../services/paymaster/FailedPaymasters.d.ts | 17 + .../paymaster/FailedPaymasters.d.ts.map | 1 + .../services/paymaster/FailedPaymasters.js | 40 + .../paymaster/FailedPaymasters.js.map | 1 + .../services/paymaster/PaymasterFactory.d.ts | 13 + .../paymaster/PaymasterFactory.d.ts.map | 1 + .../services/paymaster/PaymasterFactory.js | 32 + .../paymaster/PaymasterFactory.js.map | 1 + dist/src/services/paymaster/index.d.ts | 3 + dist/src/services/paymaster/index.d.ts.map | 1 + dist/src/services/paymaster/index.js | 3 + dist/src/services/paymaster/index.js.map | 1 + .../src/services/provider/getRpcProvider.d.ts | 8 + .../services/provider/getRpcProvider.d.ts.map | 1 + dist/src/services/provider/getRpcProvider.js | 21 + .../services/provider/getRpcProvider.js.map | 1 + dist/src/services/provider/index.d.ts | 2 + dist/src/services/provider/index.d.ts.map | 1 + dist/src/services/provider/index.js | 2 + dist/src/services/provider/index.js.map | 1 + dist/src/services/socket/api.d.ts | 59 + dist/src/services/socket/api.d.ts.map | 1 + dist/src/services/socket/api.js | 298 + dist/src/services/socket/api.js.map | 1 + dist/src/services/socket/constants.d.ts | 30 + dist/src/services/socket/constants.d.ts.map | 1 + dist/src/services/socket/constants.js | 47 + dist/src/services/socket/constants.js.map | 1 + .../services/unstoppableDomains/index.d.ts | 2 + .../unstoppableDomains/index.d.ts.map | 1 + dist/src/services/unstoppableDomains/index.js | 2 + .../services/unstoppableDomains/index.js.map | 1 + .../unstoppableDomains.d.ts | 4 + .../unstoppableDomains.d.ts.map | 1 + .../unstoppableDomains/unstoppableDomains.js | 60 + .../unstoppableDomains.js.map | 1 + dist/src/services/validations/index.d.ts | 2 + dist/src/services/validations/index.d.ts.map | 1 + dist/src/services/validations/index.js | 2 + dist/src/services/validations/index.js.map | 1 + dist/src/services/validations/validate.d.ts | 15 + .../services/validations/validate.d.ts.map | 1 + dist/src/services/validations/validate.js | 156 + dist/src/services/validations/validate.js.map | 1 + dist/src/utils/accounts.d.ts | 4 + dist/src/utils/accounts.d.ts.map | 1 + dist/src/utils/accounts.js | 5 + dist/src/utils/accounts.js.map | 1 + dist/src/utils/addHexPrefix.d.ts | 5 + dist/src/utils/addHexPrefix.d.ts.map | 1 + dist/src/utils/addHexPrefix.js | 11 + dist/src/utils/addHexPrefix.js.map | 1 + dist/src/utils/benzin.d.ts | 9 + dist/src/utils/benzin.d.ts.map | 1 + dist/src/utils/benzin.js | 8 + dist/src/utils/benzin.js.map | 1 + .../utils/formatDecimals/formatDecimals.d.ts | 4 + .../formatDecimals/formatDecimals.d.ts.map | 1 + .../utils/formatDecimals/formatDecimals.js | 99 + .../formatDecimals/formatDecimals.js.map | 1 + dist/src/utils/generateSpoofSig.d.ts | 3 + dist/src/utils/generateSpoofSig.d.ts.map | 1 + dist/src/utils/generateSpoofSig.js | 9 + dist/src/utils/generateSpoofSig.js.map | 1 + dist/src/utils/hdPath.d.ts | 4 + dist/src/utils/hdPath.d.ts.map | 1 + dist/src/utils/hdPath.js | 38 + dist/src/utils/hdPath.js.map | 1 + dist/src/utils/hexStringToUint8Array.d.ts | 3 + dist/src/utils/hexStringToUint8Array.d.ts.map | 1 + dist/src/utils/hexStringToUint8Array.js | 19 + dist/src/utils/hexStringToUint8Array.js.map | 1 + dist/src/utils/isHexPrefixed.d.ts | 5 + dist/src/utils/isHexPrefixed.d.ts.map | 1 + dist/src/utils/isHexPrefixed.js | 10 + dist/src/utils/isHexPrefixed.js.map | 1 + dist/src/utils/isSameAddr.d.ts | 3 + dist/src/utils/isSameAddr.d.ts.map | 1 + dist/src/utils/isSameAddr.js | 6 + dist/src/utils/isSameAddr.js.map | 1 + dist/src/utils/networks.d.ts | 6 + dist/src/utils/networks.d.ts.map | 1 + dist/src/utils/networks.js | 79 + dist/src/utils/networks.js.map | 1 + dist/src/utils/numbers/formatters.d.ts | 10 + dist/src/utils/numbers/formatters.d.ts.map | 1 + dist/src/utils/numbers/formatters.js | 29 + dist/src/utils/numbers/formatters.js.map | 1 + dist/src/utils/shortenAddress.d.ts | 3 + dist/src/utils/shortenAddress.d.ts.map | 1 + dist/src/utils/shortenAddress.js | 5 + dist/src/utils/shortenAddress.js.map | 1 + dist/src/utils/simulationStateOverride.d.ts | 14 + .../utils/simulationStateOverride.d.ts.map | 1 + dist/src/utils/simulationStateOverride.js | 23 + dist/src/utils/simulationStateOverride.js.map | 1 + dist/src/utils/stripHexPrefix.d.ts | 5 + dist/src/utils/stripHexPrefix.d.ts.map | 1 + dist/src/utils/stripHexPrefix.js | 10 + dist/src/utils/stripHexPrefix.js.map | 1 + dist/src/utils/wait.d.ts | 3 + dist/src/utils/wait.d.ts.map | 1 + dist/src/utils/wait.js | 6 + dist/src/utils/wait.js.map | 1 + dist/v1/hooks/useConstants/index.d.ts | 4 + dist/v1/hooks/useConstants/index.d.ts.map | 1 + dist/v1/hooks/useConstants/index.js | 4 + dist/v1/hooks/useConstants/index.js.map | 1 + dist/v1/hooks/useConstants/types.d.ts | 144 + dist/v1/hooks/useConstants/types.d.ts.map | 1 + dist/v1/hooks/useConstants/types.js | 50 + dist/v1/hooks/useConstants/types.js.map | 1 + dist/v1/hooks/useConstants/useConstants.d.ts | 4 + .../hooks/useConstants/useConstants.d.ts.map | 1 + dist/v1/hooks/useConstants/useConstants.js | 55 + .../v1/hooks/useConstants/useConstants.js.map | 1 + dist/v1/services/fetch/fetch.d.ts | 8 + dist/v1/services/fetch/fetch.d.ts.map | 1 + dist/v1/services/fetch/fetch.js | 39 + dist/v1/services/fetch/fetch.js.map | 1 + dist/v1/services/fetch/index.d.ts | 2 + dist/v1/services/fetch/index.d.ts.map | 1 + dist/v1/services/fetch/index.js | 2 + dist/v1/services/fetch/index.js.map | 1 + 1194 files changed, 122441 insertions(+), 699 deletions(-) create mode 100644 dist/contracts/compiled/AmbireFactory.json create mode 100644 dist/contracts/compiled/DeFiAAVEPosition.json create mode 100644 dist/contracts/compiled/DeFiUniswapV3Positions.json create mode 100644 dist/contracts/compiled/EntryPoint.json create mode 100644 dist/contracts/compiled/UniversalSigValidator.json create mode 100644 dist/contracts/compiled/WALLETSupplyController.json create mode 100644 dist/contracts/compiled/WETH.json create mode 100644 dist/src/classes/EmittableError.d.ts create mode 100644 dist/src/classes/EmittableError.d.ts.map create mode 100644 dist/src/classes/EmittableError.js create mode 100644 dist/src/classes/EmittableError.js.map create mode 100644 dist/src/classes/ExternalSignerError.d.ts create mode 100644 dist/src/classes/ExternalSignerError.d.ts.map create mode 100644 dist/src/classes/ExternalSignerError.js create mode 100644 dist/src/classes/ExternalSignerError.js.map create mode 100644 dist/src/classes/SwapAndBridgeError.d.ts create mode 100644 dist/src/classes/SwapAndBridgeError.d.ts.map create mode 100644 dist/src/classes/SwapAndBridgeError.js create mode 100644 dist/src/classes/SwapAndBridgeError.js.map create mode 100644 dist/src/classes/SwapAndBridgeProviderApiError.d.ts create mode 100644 dist/src/classes/SwapAndBridgeProviderApiError.d.ts.map create mode 100644 dist/src/classes/SwapAndBridgeProviderApiError.js create mode 100644 dist/src/classes/SwapAndBridgeProviderApiError.js.map create mode 100644 dist/src/classes/session.d.ts create mode 100644 dist/src/classes/session.d.ts.map create mode 100644 dist/src/classes/session.js create mode 100644 dist/src/classes/session.js.map create mode 100644 dist/src/consts/account.d.ts create mode 100644 dist/src/consts/account.d.ts.map create mode 100644 dist/src/consts/account.js create mode 100644 dist/src/consts/account.js.map create mode 100644 dist/src/consts/addresses.d.ts create mode 100644 dist/src/consts/addresses.d.ts.map create mode 100644 dist/src/consts/addresses.js create mode 100644 dist/src/consts/addresses.js.map create mode 100644 dist/src/consts/bundlers.d.ts create mode 100644 dist/src/consts/bundlers.d.ts.map create mode 100644 dist/src/consts/bundlers.js create mode 100644 dist/src/consts/bundlers.js.map create mode 100644 dist/src/consts/coingecko.d.ts create mode 100644 dist/src/consts/coingecko.d.ts.map create mode 100644 dist/src/consts/dappCatalog.json create mode 100644 dist/src/consts/dappCommunication.d.ts create mode 100644 dist/src/consts/dappCommunication.d.ts.map create mode 100644 dist/src/consts/dappCommunication.js create mode 100644 dist/src/consts/dappCommunication.js.map create mode 100644 dist/src/consts/deploy.d.ts create mode 100644 dist/src/consts/deploy.d.ts.map create mode 100644 dist/src/consts/deployless.d.ts create mode 100644 dist/src/consts/deployless.d.ts.map create mode 100644 dist/src/consts/deployless.js create mode 100644 dist/src/consts/deployless.js.map create mode 100644 dist/src/consts/derivation.d.ts create mode 100644 dist/src/consts/derivation.d.ts.map create mode 100644 dist/src/consts/derivation.js create mode 100644 dist/src/consts/derivation.js.map create mode 100644 dist/src/consts/feeTokens.d.ts create mode 100644 dist/src/consts/feeTokens.d.ts.map create mode 100644 dist/src/consts/feeTokens.js create mode 100644 dist/src/consts/feeTokens.js.map create mode 100644 dist/src/consts/gasTankFeeTokens.d.ts create mode 100644 dist/src/consts/gasTankFeeTokens.d.ts.map create mode 100644 dist/src/consts/humanizer/humanizerInfo.json create mode 100644 dist/src/consts/intervals.d.ts create mode 100644 dist/src/consts/intervals.d.ts.map create mode 100644 dist/src/consts/intervals.js create mode 100644 dist/src/consts/intervals.js.map create mode 100644 dist/src/consts/networks.d.ts create mode 100644 dist/src/consts/networks.d.ts.map create mode 100644 dist/src/consts/pinnedTokens.d.ts create mode 100644 dist/src/consts/pinnedTokens.d.ts.map create mode 100644 dist/src/consts/signAccountOp/errorHandling.d.ts create mode 100644 dist/src/consts/signAccountOp/errorHandling.d.ts.map create mode 100644 dist/src/consts/signAccountOp/errorHandling.js create mode 100644 dist/src/consts/signAccountOp/errorHandling.js.map create mode 100644 dist/src/consts/signAccountOp/gas.d.ts create mode 100644 dist/src/consts/signAccountOp/gas.d.ts.map create mode 100644 dist/src/consts/signAccountOp/gas.js create mode 100644 dist/src/consts/signAccountOp/gas.js.map create mode 100644 dist/src/consts/signatures.d.ts create mode 100644 dist/src/consts/signatures.d.ts.map create mode 100644 dist/src/consts/signatures.js create mode 100644 dist/src/consts/signatures.js.map create mode 100644 dist/src/controllers/accountAdder/accountAdder.d.ts create mode 100644 dist/src/controllers/accountAdder/accountAdder.d.ts.map create mode 100644 dist/src/controllers/accountAdder/accountAdder.js create mode 100644 dist/src/controllers/accountAdder/accountAdder.js.map create mode 100644 dist/src/controllers/accounts/accounts.d.ts create mode 100644 dist/src/controllers/accounts/accounts.d.ts.map create mode 100644 dist/src/controllers/accounts/accounts.js create mode 100644 dist/src/controllers/accounts/accounts.js.map create mode 100644 dist/src/controllers/actions/actions.d.ts create mode 100644 dist/src/controllers/actions/actions.d.ts.map create mode 100644 dist/src/controllers/actions/actions.js create mode 100644 dist/src/controllers/actions/actions.js.map create mode 100644 dist/src/controllers/activity/activity.d.ts create mode 100644 dist/src/controllers/activity/activity.d.ts.map create mode 100644 dist/src/controllers/activity/activity.js create mode 100644 dist/src/controllers/activity/activity.js.map create mode 100644 dist/src/controllers/addressBook/addressBook.d.ts create mode 100644 dist/src/controllers/addressBook/addressBook.d.ts.map create mode 100644 dist/src/controllers/addressBook/addressBook.js create mode 100644 dist/src/controllers/addressBook/addressBook.js.map create mode 100644 dist/src/controllers/dapps/dapps.d.ts create mode 100644 dist/src/controllers/dapps/dapps.d.ts.map create mode 100644 dist/src/controllers/dapps/dapps.js create mode 100644 dist/src/controllers/dapps/dapps.js.map create mode 100644 dist/src/controllers/defiPositions/defiPositions.d.ts create mode 100644 dist/src/controllers/defiPositions/defiPositions.d.ts.map create mode 100644 dist/src/controllers/defiPositions/defiPositions.js create mode 100644 dist/src/controllers/defiPositions/defiPositions.js.map create mode 100644 dist/src/controllers/domains/domains.d.ts create mode 100644 dist/src/controllers/domains/domains.d.ts.map create mode 100644 dist/src/controllers/domains/domains.js create mode 100644 dist/src/controllers/domains/domains.js.map create mode 100644 dist/src/controllers/emailVault/emailVault.d.ts create mode 100644 dist/src/controllers/emailVault/emailVault.d.ts.map create mode 100644 dist/src/controllers/emailVault/emailVault.js create mode 100644 dist/src/controllers/emailVault/emailVault.js.map create mode 100644 dist/src/controllers/eventEmitter/eventEmitter.d.ts create mode 100644 dist/src/controllers/eventEmitter/eventEmitter.d.ts.map create mode 100644 dist/src/controllers/eventEmitter/eventEmitter.js create mode 100644 dist/src/controllers/eventEmitter/eventEmitter.js.map create mode 100644 dist/src/controllers/invite/invite.d.ts create mode 100644 dist/src/controllers/invite/invite.d.ts.map create mode 100644 dist/src/controllers/invite/invite.js create mode 100644 dist/src/controllers/invite/invite.js.map create mode 100644 dist/src/controllers/keystore/keystore.d.ts create mode 100644 dist/src/controllers/keystore/keystore.d.ts.map create mode 100644 dist/src/controllers/keystore/keystore.js create mode 100644 dist/src/controllers/keystore/keystore.js.map create mode 100644 dist/src/controllers/main/main.d.ts create mode 100644 dist/src/controllers/main/main.d.ts.map create mode 100644 dist/src/controllers/main/main.js create mode 100644 dist/src/controllers/main/main.js.map create mode 100644 dist/src/controllers/networks/networks.d.ts create mode 100644 dist/src/controllers/networks/networks.d.ts.map create mode 100644 dist/src/controllers/networks/networks.js create mode 100644 dist/src/controllers/networks/networks.js.map create mode 100644 dist/src/controllers/portfolio/portfolio.d.ts create mode 100644 dist/src/controllers/portfolio/portfolio.d.ts.map create mode 100644 dist/src/controllers/portfolio/portfolio.js create mode 100644 dist/src/controllers/portfolio/portfolio.js.map create mode 100644 dist/src/controllers/providers/providers.d.ts create mode 100644 dist/src/controllers/providers/providers.d.ts.map create mode 100644 dist/src/controllers/providers/providers.js create mode 100644 dist/src/controllers/providers/providers.js.map create mode 100644 dist/src/controllers/selectedAccount/selectedAccount.d.ts create mode 100644 dist/src/controllers/selectedAccount/selectedAccount.d.ts.map create mode 100644 dist/src/controllers/selectedAccount/selectedAccount.js create mode 100644 dist/src/controllers/selectedAccount/selectedAccount.js.map create mode 100644 dist/src/controllers/signAccountOp/helper.d.ts create mode 100644 dist/src/controllers/signAccountOp/helper.d.ts.map create mode 100644 dist/src/controllers/signAccountOp/helper.js create mode 100644 dist/src/controllers/signAccountOp/helper.js.map create mode 100644 dist/src/controllers/signAccountOp/signAccountOp.d.ts create mode 100644 dist/src/controllers/signAccountOp/signAccountOp.d.ts.map create mode 100644 dist/src/controllers/signAccountOp/signAccountOp.js create mode 100644 dist/src/controllers/signAccountOp/signAccountOp.js.map create mode 100644 dist/src/controllers/signMessage/signMessage.d.ts create mode 100644 dist/src/controllers/signMessage/signMessage.d.ts.map create mode 100644 dist/src/controllers/signMessage/signMessage.js create mode 100644 dist/src/controllers/signMessage/signMessage.js.map create mode 100644 dist/src/controllers/swapAndBridge/socketApiMock.d.ts create mode 100644 dist/src/controllers/swapAndBridge/socketApiMock.d.ts.map create mode 100644 dist/src/controllers/swapAndBridge/socketApiMock.js create mode 100644 dist/src/controllers/swapAndBridge/socketApiMock.js.map create mode 100644 dist/src/controllers/swapAndBridge/swapAndBridge.d.ts create mode 100644 dist/src/controllers/swapAndBridge/swapAndBridge.d.ts.map create mode 100644 dist/src/controllers/swapAndBridge/swapAndBridge.js create mode 100644 dist/src/controllers/swapAndBridge/swapAndBridge.js.map create mode 100644 dist/src/controllers/transfer/transfer.d.ts create mode 100644 dist/src/controllers/transfer/transfer.d.ts.map create mode 100644 dist/src/controllers/transfer/transfer.js create mode 100644 dist/src/controllers/transfer/transfer.js.map create mode 100644 dist/src/interfaces/account.d.ts create mode 100644 dist/src/interfaces/account.d.ts.map create mode 100644 dist/src/interfaces/actions.d.ts create mode 100644 dist/src/interfaces/actions.d.ts.map create mode 100644 dist/src/interfaces/actions.js create mode 100644 dist/src/interfaces/actions.js.map create mode 100644 dist/src/interfaces/banner.d.ts create mode 100644 dist/src/interfaces/banner.d.ts.map create mode 100644 dist/src/interfaces/banner.js create mode 100644 dist/src/interfaces/banner.js.map create mode 100644 dist/src/interfaces/dapp.d.ts create mode 100644 dist/src/interfaces/dapp.d.ts.map create mode 100644 dist/src/interfaces/dapp.js create mode 100644 dist/src/interfaces/dapp.js.map create mode 100644 dist/src/interfaces/domains.d.ts create mode 100644 dist/src/interfaces/domains.d.ts.map create mode 100644 dist/src/interfaces/domains.js create mode 100644 dist/src/interfaces/domains.js.map create mode 100644 dist/src/interfaces/emailVault.d.ts create mode 100644 dist/src/interfaces/emailVault.d.ts.map create mode 100644 dist/src/interfaces/emailVault.js create mode 100644 dist/src/interfaces/emailVault.js.map create mode 100644 dist/src/interfaces/fetch.d.ts create mode 100644 dist/src/interfaces/fetch.d.ts.map create mode 100644 dist/src/interfaces/fetch.js create mode 100644 dist/src/interfaces/fetch.js.map create mode 100644 dist/src/interfaces/hex.d.ts create mode 100644 dist/src/interfaces/hex.d.ts.map create mode 100644 dist/src/interfaces/hex.js create mode 100644 dist/src/interfaces/hex.js.map create mode 100644 dist/src/interfaces/keyIterator.d.ts create mode 100644 dist/src/interfaces/keyIterator.d.ts.map create mode 100644 dist/src/interfaces/keyIterator.js create mode 100644 dist/src/interfaces/keyIterator.js.map create mode 100644 dist/src/interfaces/keystore.d.ts create mode 100644 dist/src/interfaces/keystore.d.ts.map create mode 100644 dist/src/interfaces/keystore.js create mode 100644 dist/src/interfaces/keystore.js.map create mode 100644 dist/src/interfaces/messenger.d.ts create mode 100644 dist/src/interfaces/messenger.d.ts.map create mode 100644 dist/src/interfaces/messenger.js create mode 100644 dist/src/interfaces/messenger.js.map create mode 100644 dist/src/interfaces/network.d.ts create mode 100644 dist/src/interfaces/network.d.ts.map create mode 100644 dist/src/interfaces/network.js create mode 100644 dist/src/interfaces/network.js.map create mode 100644 dist/src/interfaces/notification.d.ts create mode 100644 dist/src/interfaces/notification.d.ts.map create mode 100644 dist/src/interfaces/notification.js create mode 100644 dist/src/interfaces/notification.js.map create mode 100644 dist/src/interfaces/provider.d.ts create mode 100644 dist/src/interfaces/provider.d.ts.map create mode 100644 dist/src/interfaces/provider.js create mode 100644 dist/src/interfaces/provider.js.map create mode 100644 dist/src/interfaces/selectedAccount.d.ts create mode 100644 dist/src/interfaces/selectedAccount.d.ts.map create mode 100644 dist/src/interfaces/selectedAccount.js create mode 100644 dist/src/interfaces/selectedAccount.js.map create mode 100644 dist/src/interfaces/signAccountOp.d.ts create mode 100644 dist/src/interfaces/signAccountOp.d.ts.map create mode 100644 dist/src/interfaces/signAccountOp.js create mode 100644 dist/src/interfaces/signAccountOp.js.map create mode 100644 dist/src/interfaces/storage.d.ts create mode 100644 dist/src/interfaces/storage.d.ts.map create mode 100644 dist/src/interfaces/storage.js create mode 100644 dist/src/interfaces/storage.js.map create mode 100644 dist/src/interfaces/swapAndBridge.d.ts create mode 100644 dist/src/interfaces/swapAndBridge.d.ts.map create mode 100644 dist/src/interfaces/swapAndBridge.js create mode 100644 dist/src/interfaces/swapAndBridge.js.map create mode 100644 dist/src/interfaces/transfer.d.ts create mode 100644 dist/src/interfaces/transfer.d.ts.map create mode 100644 dist/src/interfaces/transfer.js create mode 100644 dist/src/interfaces/transfer.js.map create mode 100644 dist/src/interfaces/userRequest.d.ts create mode 100644 dist/src/interfaces/userRequest.d.ts.map create mode 100644 dist/src/interfaces/userRequest.js create mode 100644 dist/src/interfaces/userRequest.js.map create mode 100644 dist/src/interfaces/window.d.ts create mode 100644 dist/src/interfaces/window.d.ts.map create mode 100644 dist/src/interfaces/window.js create mode 100644 dist/src/interfaces/window.js.map create mode 100644 dist/src/libs/account/account.d.ts create mode 100644 dist/src/libs/account/account.d.ts.map create mode 100644 dist/src/libs/accountAdder/accountAdder.d.ts create mode 100644 dist/src/libs/accountAdder/accountAdder.d.ts.map create mode 100644 dist/src/libs/accountAdder/accountAdder.js create mode 100644 dist/src/libs/accountAdder/accountAdder.js.map create mode 100644 dist/src/libs/accountOp/accountOp.d.ts create mode 100644 dist/src/libs/accountOp/accountOp.d.ts.map create mode 100644 dist/src/libs/accountOp/submittedAccountOp.d.ts create mode 100644 dist/src/libs/accountOp/submittedAccountOp.d.ts.map create mode 100644 dist/src/libs/accountOp/submittedAccountOp.js create mode 100644 dist/src/libs/accountOp/submittedAccountOp.js.map create mode 100644 dist/src/libs/accountOp/types.d.ts create mode 100644 dist/src/libs/accountOp/types.d.ts.map create mode 100644 dist/src/libs/accountOp/types.js create mode 100644 dist/src/libs/accountOp/types.js.map create mode 100644 dist/src/libs/accountState/accountState.d.ts create mode 100644 dist/src/libs/accountState/accountState.d.ts.map create mode 100644 dist/src/libs/actions/actions.d.ts create mode 100644 dist/src/libs/actions/actions.d.ts.map create mode 100644 dist/src/libs/actions/actions.js create mode 100644 dist/src/libs/actions/actions.js.map create mode 100644 dist/src/libs/banners/banners.d.ts create mode 100644 dist/src/libs/banners/banners.d.ts.map create mode 100644 dist/src/libs/banners/banners.js create mode 100644 dist/src/libs/banners/banners.js.map create mode 100644 dist/src/libs/calls/calls.d.ts create mode 100644 dist/src/libs/calls/calls.d.ts.map create mode 100644 dist/src/libs/calls/calls.js create mode 100644 dist/src/libs/calls/calls.js.map create mode 100644 dist/src/libs/defiPositions/defiAddresses.d.ts create mode 100644 dist/src/libs/defiPositions/defiAddresses.d.ts.map create mode 100644 dist/src/libs/defiPositions/defiAddresses.js create mode 100644 dist/src/libs/defiPositions/defiAddresses.js.map create mode 100644 dist/src/libs/defiPositions/helpers.d.ts create mode 100644 dist/src/libs/defiPositions/helpers.d.ts.map create mode 100644 dist/src/libs/defiPositions/helpers.js create mode 100644 dist/src/libs/defiPositions/helpers.js.map create mode 100644 dist/src/libs/defiPositions/providers/aaveV3.d.ts create mode 100644 dist/src/libs/defiPositions/providers/aaveV3.d.ts.map create mode 100644 dist/src/libs/defiPositions/providers/aaveV3.js create mode 100644 dist/src/libs/defiPositions/providers/aaveV3.js.map create mode 100644 dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts create mode 100644 dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts.map create mode 100644 dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js create mode 100644 dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map create mode 100644 dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts create mode 100644 dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts.map create mode 100644 dist/src/libs/defiPositions/providers/helpers/univ3Math.js create mode 100644 dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map create mode 100644 dist/src/libs/defiPositions/providers/index.d.ts create mode 100644 dist/src/libs/defiPositions/providers/index.d.ts.map create mode 100644 dist/src/libs/defiPositions/providers/index.js create mode 100644 dist/src/libs/defiPositions/providers/index.js.map create mode 100644 dist/src/libs/defiPositions/providers/uniV3.d.ts create mode 100644 dist/src/libs/defiPositions/providers/uniV3.d.ts.map create mode 100644 dist/src/libs/defiPositions/providers/uniV3.js create mode 100644 dist/src/libs/defiPositions/providers/uniV3.js.map create mode 100644 dist/src/libs/defiPositions/types.d.ts create mode 100644 dist/src/libs/defiPositions/types.d.ts.map create mode 100644 dist/src/libs/defiPositions/types.js create mode 100644 dist/src/libs/defiPositions/types.js.map create mode 100644 dist/src/libs/deployless/compile.d.ts create mode 100644 dist/src/libs/deployless/compile.d.ts.map create mode 100644 dist/src/libs/deployless/compile.js create mode 100644 dist/src/libs/deployless/compile.js.map create mode 100644 dist/src/libs/deployless/deployless.d.ts create mode 100644 dist/src/libs/deployless/deployless.d.ts.map create mode 100644 dist/src/libs/deployless/simulateDeployCall.d.ts create mode 100644 dist/src/libs/deployless/simulateDeployCall.d.ts.map create mode 100644 dist/src/libs/deployless/simulateDeployCall.js create mode 100644 dist/src/libs/deployless/simulateDeployCall.js.map create mode 100644 dist/src/libs/dkim/getPublicKey.d.ts create mode 100644 dist/src/libs/dkim/getPublicKey.d.ts.map create mode 100644 dist/src/libs/dkim/getPublicKey.js create mode 100644 dist/src/libs/dkim/getPublicKey.js.map create mode 100644 dist/src/libs/dkim/isDKIM.d.ts create mode 100644 dist/src/libs/dkim/isDKIM.d.ts.map create mode 100644 dist/src/libs/dkim/isDKIM.js create mode 100644 dist/src/libs/dkim/isDKIM.js.map create mode 100644 dist/src/libs/dkim/parse.d.ts create mode 100644 dist/src/libs/dkim/parse.d.ts.map create mode 100644 dist/src/libs/dkim/parse.js create mode 100644 dist/src/libs/dkim/parse.js.map create mode 100644 dist/src/libs/dkim/parseEmail.d.ts create mode 100644 dist/src/libs/dkim/parseEmail.d.ts.map create mode 100644 dist/src/libs/dkim/parseEmail.js create mode 100644 dist/src/libs/dkim/parseEmail.js.map create mode 100644 dist/src/libs/dkim/publicKeyToComponents.d.ts create mode 100644 dist/src/libs/dkim/publicKeyToComponents.d.ts.map create mode 100644 dist/src/libs/dkim/publicKeyToComponents.js create mode 100644 dist/src/libs/dkim/publicKeyToComponents.js.map create mode 100644 dist/src/libs/dkim/recovery.d.ts create mode 100644 dist/src/libs/dkim/recovery.d.ts.map create mode 100644 dist/src/libs/dkim/recovery.js create mode 100644 dist/src/libs/dkim/recovery.js.map create mode 100644 dist/src/libs/dkim/toSolidity.d.ts create mode 100644 dist/src/libs/dkim/toSolidity.d.ts.map create mode 100644 dist/src/libs/dkim/toSolidity.js create mode 100644 dist/src/libs/dkim/toSolidity.js.map create mode 100644 dist/src/libs/dns/lookup.d.ts create mode 100644 dist/src/libs/dns/lookup.d.ts.map create mode 100644 dist/src/libs/dns/lookup.js create mode 100644 dist/src/libs/dns/lookup.js.map create mode 100644 dist/src/libs/emailVault/emailVault.d.ts create mode 100644 dist/src/libs/emailVault/emailVault.d.ts.map create mode 100644 dist/src/libs/emailVault/emailVault.js create mode 100644 dist/src/libs/emailVault/emailVault.js.map create mode 100644 dist/src/libs/erc7677/erc7677.d.ts create mode 100644 dist/src/libs/erc7677/erc7677.d.ts.map create mode 100644 dist/src/libs/erc7677/erc7677.js create mode 100644 dist/src/libs/erc7677/erc7677.js.map create mode 100644 dist/src/libs/erc7677/types.d.ts create mode 100644 dist/src/libs/erc7677/types.d.ts.map create mode 100644 dist/src/libs/erc7677/types.js create mode 100644 dist/src/libs/erc7677/types.js.map create mode 100644 dist/src/libs/errorDecoder/constants.d.ts create mode 100644 dist/src/libs/errorDecoder/constants.d.ts.map create mode 100644 dist/src/libs/errorDecoder/constants.js create mode 100644 dist/src/libs/errorDecoder/constants.js.map create mode 100644 dist/src/libs/errorDecoder/customErrors.d.ts create mode 100644 dist/src/libs/errorDecoder/customErrors.d.ts.map create mode 100644 dist/src/libs/errorDecoder/customErrors.js create mode 100644 dist/src/libs/errorDecoder/customErrors.js.map create mode 100644 dist/src/libs/errorDecoder/errorDecoder.d.ts create mode 100644 dist/src/libs/errorDecoder/errorDecoder.d.ts.map create mode 100644 dist/src/libs/errorDecoder/errorDecoder.js create mode 100644 dist/src/libs/errorDecoder/errorDecoder.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/biconomy.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/biconomy.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/biconomy.js create mode 100644 dist/src/libs/errorDecoder/handlers/biconomy.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/bundler.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/bundler.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/bundler.js create mode 100644 dist/src/libs/errorDecoder/handlers/bundler.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/custom.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/custom.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/custom.js create mode 100644 dist/src/libs/errorDecoder/handlers/custom.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/index.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/index.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/index.js create mode 100644 dist/src/libs/errorDecoder/handlers/index.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/innerCallFailure.js create mode 100644 dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/panic.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/panic.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/panic.js create mode 100644 dist/src/libs/errorDecoder/handlers/panic.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/paymaster.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/paymaster.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/paymaster.js create mode 100644 dist/src/libs/errorDecoder/handlers/paymaster.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/pimlico.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/pimlico.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/pimlico.js create mode 100644 dist/src/libs/errorDecoder/handlers/pimlico.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/relayer.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/relayer.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/relayer.js create mode 100644 dist/src/libs/errorDecoder/handlers/relayer.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/revert.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/revert.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/revert.js create mode 100644 dist/src/libs/errorDecoder/handlers/revert.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/rpc.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/rpc.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/rpc.js create mode 100644 dist/src/libs/errorDecoder/handlers/rpc.js.map create mode 100644 dist/src/libs/errorDecoder/handlers/userRejection.d.ts create mode 100644 dist/src/libs/errorDecoder/handlers/userRejection.d.ts.map create mode 100644 dist/src/libs/errorDecoder/handlers/userRejection.js create mode 100644 dist/src/libs/errorDecoder/handlers/userRejection.js.map create mode 100644 dist/src/libs/errorDecoder/helpers.d.ts create mode 100644 dist/src/libs/errorDecoder/helpers.d.ts.map create mode 100644 dist/src/libs/errorDecoder/helpers.js create mode 100644 dist/src/libs/errorDecoder/helpers.js.map create mode 100644 dist/src/libs/errorDecoder/index.d.ts create mode 100644 dist/src/libs/errorDecoder/index.d.ts.map create mode 100644 dist/src/libs/errorDecoder/index.js create mode 100644 dist/src/libs/errorDecoder/index.js.map create mode 100644 dist/src/libs/errorDecoder/types.d.ts create mode 100644 dist/src/libs/errorDecoder/types.d.ts.map create mode 100644 dist/src/libs/errorDecoder/types.js create mode 100644 dist/src/libs/errorDecoder/types.js.map create mode 100644 dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts create mode 100644 dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js create mode 100644 dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map create mode 100644 dist/src/libs/errorHumanizer/errors.d.ts create mode 100644 dist/src/libs/errorHumanizer/errors.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/errors.js create mode 100644 dist/src/libs/errorHumanizer/errors.js.map create mode 100644 dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts create mode 100644 dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/estimationErrorHumanizer.js create mode 100644 dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map create mode 100644 dist/src/libs/errorHumanizer/helpers.d.ts create mode 100644 dist/src/libs/errorHumanizer/helpers.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/helpers.js create mode 100644 dist/src/libs/errorHumanizer/helpers.js.map create mode 100644 dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts create mode 100644 dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/humanizeCommonCases.js create mode 100644 dist/src/libs/errorHumanizer/humanizeCommonCases.js.map create mode 100644 dist/src/libs/errorHumanizer/index.d.ts create mode 100644 dist/src/libs/errorHumanizer/index.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/index.js create mode 100644 dist/src/libs/errorHumanizer/index.js.map create mode 100644 dist/src/libs/errorHumanizer/types.d.ts create mode 100644 dist/src/libs/errorHumanizer/types.d.ts.map create mode 100644 dist/src/libs/errorHumanizer/types.js create mode 100644 dist/src/libs/errorHumanizer/types.js.map create mode 100644 dist/src/libs/estimate/errors.d.ts create mode 100644 dist/src/libs/estimate/errors.d.ts.map create mode 100644 dist/src/libs/estimate/errors.js create mode 100644 dist/src/libs/estimate/errors.js.map create mode 100644 dist/src/libs/estimate/estimate.d.ts create mode 100644 dist/src/libs/estimate/estimate.d.ts.map create mode 100644 dist/src/libs/estimate/estimateBundler.d.ts create mode 100644 dist/src/libs/estimate/estimateBundler.d.ts.map create mode 100644 dist/src/libs/estimate/estimateBundler.js create mode 100644 dist/src/libs/estimate/estimateBundler.js.map create mode 100644 dist/src/libs/estimate/estimateEOA.d.ts create mode 100644 dist/src/libs/estimate/estimateEOA.d.ts.map create mode 100644 dist/src/libs/estimate/estimateEOA.js create mode 100644 dist/src/libs/estimate/estimateEOA.js.map create mode 100644 dist/src/libs/estimate/estimateGas.d.ts create mode 100644 dist/src/libs/estimate/estimateGas.d.ts.map create mode 100644 dist/src/libs/estimate/estimateGas.js create mode 100644 dist/src/libs/estimate/estimateGas.js.map create mode 100644 dist/src/libs/estimate/estimateHelpers.d.ts create mode 100644 dist/src/libs/estimate/estimateHelpers.d.ts.map create mode 100644 dist/src/libs/estimate/estimateHelpers.js create mode 100644 dist/src/libs/estimate/estimateHelpers.js.map create mode 100644 dist/src/libs/estimate/estimateWithRetries.d.ts create mode 100644 dist/src/libs/estimate/estimateWithRetries.d.ts.map create mode 100644 dist/src/libs/estimate/estimateWithRetries.js create mode 100644 dist/src/libs/estimate/estimateWithRetries.js.map create mode 100644 dist/src/libs/estimate/interfaces.d.ts create mode 100644 dist/src/libs/estimate/interfaces.d.ts.map create mode 100644 dist/src/libs/estimate/interfaces.js create mode 100644 dist/src/libs/estimate/interfaces.js.map create mode 100644 dist/src/libs/estimate/refund.d.ts create mode 100644 dist/src/libs/estimate/refund.d.ts.map create mode 100644 dist/src/libs/estimate/refund.js create mode 100644 dist/src/libs/estimate/refund.js.map create mode 100644 dist/src/libs/gasPrice/gasPrice.d.ts create mode 100644 dist/src/libs/gasPrice/gasPrice.d.ts.map create mode 100644 dist/src/libs/gasPrice/gasPrice.js create mode 100644 dist/src/libs/gasPrice/gasPrice.js.map create mode 100644 dist/src/libs/humanizer/const/abis/1Inch.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/1Inch.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/1Inch.js create mode 100644 dist/src/libs/humanizer/const/abis/1Inch.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Aave.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Aave.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Aave.js create mode 100644 dist/src/libs/humanizer/const/abis/Aave.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Across.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Across.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Across.js create mode 100644 dist/src/libs/humanizer/const/abis/Across.js.map create mode 100644 dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/AmbireAccount.js create mode 100644 dist/src/libs/humanizer/const/abis/AmbireAccount.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Curve.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Curve.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Curve.js create mode 100644 dist/src/libs/humanizer/const/abis/Curve.js.map create mode 100644 dist/src/libs/humanizer/const/abis/KyberSwap.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/KyberSwap.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/KyberSwap.js create mode 100644 dist/src/libs/humanizer/const/abis/KyberSwap.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Legends.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Legends.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Legends.js create mode 100644 dist/src/libs/humanizer/const/abis/Legends.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Lido.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Lido.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Lido.js create mode 100644 dist/src/libs/humanizer/const/abis/Lido.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Sushi.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Sushi.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Sushi.js create mode 100644 dist/src/libs/humanizer/const/abis/Sushi.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Tokens.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Tokens.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Tokens.js create mode 100644 dist/src/libs/humanizer/const/abis/Tokens.js.map create mode 100644 dist/src/libs/humanizer/const/abis/TraderJoe.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/TraderJoe.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/TraderJoe.js create mode 100644 dist/src/libs/humanizer/const/abis/TraderJoe.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Uniswap.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Uniswap.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Uniswap.js create mode 100644 dist/src/libs/humanizer/const/abis/Uniswap.js.map create mode 100644 dist/src/libs/humanizer/const/abis/Wallet.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/Wallet.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/Wallet.js create mode 100644 dist/src/libs/humanizer/const/abis/Wallet.js.map create mode 100644 dist/src/libs/humanizer/const/abis/index.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/index.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/index.js create mode 100644 dist/src/libs/humanizer/const/abis/index.js.map create mode 100644 dist/src/libs/humanizer/const/abis/socket.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/socket.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/socket.js create mode 100644 dist/src/libs/humanizer/const/abis/socket.js.map create mode 100644 dist/src/libs/humanizer/const/abis/stkWallet.d.ts create mode 100644 dist/src/libs/humanizer/const/abis/stkWallet.d.ts.map create mode 100644 dist/src/libs/humanizer/const/abis/stkWallet.js create mode 100644 dist/src/libs/humanizer/const/abis/stkWallet.js.map create mode 100644 dist/src/libs/humanizer/const/coinType.d.ts create mode 100644 dist/src/libs/humanizer/const/coinType.d.ts.map create mode 100644 dist/src/libs/humanizer/const/coinType.js create mode 100644 dist/src/libs/humanizer/const/coinType.js.map create mode 100644 dist/src/libs/humanizer/index.d.ts create mode 100644 dist/src/libs/humanizer/index.d.ts.map create mode 100644 dist/src/libs/humanizer/index.js create mode 100644 dist/src/libs/humanizer/index.js.map create mode 100644 dist/src/libs/humanizer/interfaces.d.ts create mode 100644 dist/src/libs/humanizer/interfaces.d.ts.map create mode 100644 dist/src/libs/humanizer/interfaces.js create mode 100644 dist/src/libs/humanizer/interfaces.js.map create mode 100644 dist/src/libs/humanizer/messageModules/ensModule.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/ensModule.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/ensModule.js create mode 100644 dist/src/libs/humanizer/messageModules/ensModule.js.map create mode 100644 dist/src/libs/humanizer/messageModules/entryPointModule.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/entryPointModule.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/entryPointModule.js create mode 100644 dist/src/libs/humanizer/messageModules/entryPointModule.js.map create mode 100644 dist/src/libs/humanizer/messageModules/erc20Module.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/erc20Module.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/erc20Module.js create mode 100644 dist/src/libs/humanizer/messageModules/erc20Module.js.map create mode 100644 dist/src/libs/humanizer/messageModules/erc721Module.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/erc721Module.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/erc721Module.js create mode 100644 dist/src/libs/humanizer/messageModules/erc721Module.js.map create mode 100644 dist/src/libs/humanizer/messageModules/index.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/index.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/index.js create mode 100644 dist/src/libs/humanizer/messageModules/index.js.map create mode 100644 dist/src/libs/humanizer/messageModules/legendsModule.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/legendsModule.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/legendsModule.js create mode 100644 dist/src/libs/humanizer/messageModules/legendsModule.js.map create mode 100644 dist/src/libs/humanizer/messageModules/openseaModule.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/openseaModule.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/openseaModule.js create mode 100644 dist/src/libs/humanizer/messageModules/openseaModule.js.map create mode 100644 dist/src/libs/humanizer/messageModules/permit2Module.d.ts create mode 100644 dist/src/libs/humanizer/messageModules/permit2Module.d.ts.map create mode 100644 dist/src/libs/humanizer/messageModules/permit2Module.js create mode 100644 dist/src/libs/humanizer/messageModules/permit2Module.js.map create mode 100644 dist/src/libs/humanizer/modules/1Inch/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/1Inch/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/1Inch/index.js create mode 100644 dist/src/libs/humanizer/modules/1Inch/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveV3.js create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveV3.js.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js create mode 100644 dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map create mode 100644 dist/src/libs/humanizer/modules/Aave/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Aave/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Aave/index.js create mode 100644 dist/src/libs/humanizer/modules/Aave/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Across/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Across/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Across/index.js create mode 100644 dist/src/libs/humanizer/modules/Across/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Airdrops/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Airdrops/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Airdrops/index.js create mode 100644 dist/src/libs/humanizer/modules/Airdrops/index.js.map create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/index.js create mode 100644 dist/src/libs/humanizer/modules/AsciiModule/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Curve/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Curve/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Curve/index.js create mode 100644 dist/src/libs/humanizer/modules/Curve/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Deployment/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Deployment/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Deployment/index.js create mode 100644 dist/src/libs/humanizer/modules/Deployment/index.js.map create mode 100644 dist/src/libs/humanizer/modules/ENS/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/ENS/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/ENS/index.js create mode 100644 dist/src/libs/humanizer/modules/ENS/index.js.map create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/index.js create mode 100644 dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/index.js create mode 100644 dist/src/libs/humanizer/modules/GasTankModule/index.js.map create mode 100644 dist/src/libs/humanizer/modules/KyberSwap/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/KyberSwap/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/KyberSwap/index.js create mode 100644 dist/src/libs/humanizer/modules/KyberSwap/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Legends/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Legends/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Legends/index.js create mode 100644 dist/src/libs/humanizer/modules/Legends/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Lido/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Lido/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Lido/index.js create mode 100644 dist/src/libs/humanizer/modules/Lido/index.js.map create mode 100644 dist/src/libs/humanizer/modules/OpenSea/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/OpenSea/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/OpenSea/index.js create mode 100644 dist/src/libs/humanizer/modules/OpenSea/index.js.map create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/index.js create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/index.js.map create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js create mode 100644 dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map create mode 100644 dist/src/libs/humanizer/modules/PreProcess/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/PreProcess/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/PreProcess/index.js create mode 100644 dist/src/libs/humanizer/modules/PreProcess/index.js.map create mode 100644 dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts create mode 100644 dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js create mode 100644 dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map create mode 100644 dist/src/libs/humanizer/modules/Privileges/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Privileges/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Privileges/index.js create mode 100644 dist/src/libs/humanizer/modules/Privileges/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Privileges/privileges.d.ts create mode 100644 dist/src/libs/humanizer/modules/Privileges/privileges.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Privileges/privileges.js create mode 100644 dist/src/libs/humanizer/modules/Privileges/privileges.js.map create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/index.js create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/index.js.map create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js create mode 100644 dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map create mode 100644 dist/src/libs/humanizer/modules/Socket/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Socket/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Socket/index.js create mode 100644 dist/src/libs/humanizer/modules/Socket/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Socket/socketModules.d.ts create mode 100644 dist/src/libs/humanizer/modules/Socket/socketModules.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Socket/socketModules.js create mode 100644 dist/src/libs/humanizer/modules/Socket/socketModules.js.map create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/index.js create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js create mode 100644 dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map create mode 100644 dist/src/libs/humanizer/modules/Tokens/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Tokens/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Tokens/index.js create mode 100644 dist/src/libs/humanizer/modules/Tokens/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Tokens/tokens.d.ts create mode 100644 dist/src/libs/humanizer/modules/Tokens/tokens.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Tokens/tokens.js create mode 100644 dist/src/libs/humanizer/modules/Tokens/tokens.js.map create mode 100644 dist/src/libs/humanizer/modules/TraderJoe/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/TraderJoe/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/TraderJoe/index.js create mode 100644 dist/src/libs/humanizer/modules/TraderJoe/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/Commands.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/Commands.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/index.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/interfaces.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/interfaces.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV2.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV3.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/utils.d.ts create mode 100644 dist/src/libs/humanizer/modules/Uniswap/utils.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Uniswap/utils.js create mode 100644 dist/src/libs/humanizer/modules/Uniswap/utils.js.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts create mode 100644 dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js create mode 100644 dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/WALLET/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/index.js create mode 100644 dist/src/libs/humanizer/modules/WALLET/index.js.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts create mode 100644 dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/WALLET/stakingPools.js create mode 100644 dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map create mode 100644 dist/src/libs/humanizer/modules/Wrapping/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/Wrapping/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Wrapping/index.js create mode 100644 dist/src/libs/humanizer/modules/Wrapping/index.js.map create mode 100644 dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts create mode 100644 dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/Wrapping/wrapping.js create mode 100644 dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map create mode 100644 dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts create mode 100644 dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts.map create mode 100644 dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js create mode 100644 dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map create mode 100644 dist/src/libs/humanizer/testHelpers.d.ts create mode 100644 dist/src/libs/humanizer/testHelpers.d.ts.map create mode 100644 dist/src/libs/humanizer/testHelpers.js create mode 100644 dist/src/libs/humanizer/testHelpers.js.map create mode 100644 dist/src/libs/humanizer/utils.d.ts create mode 100644 dist/src/libs/humanizer/utils.d.ts.map create mode 100644 dist/src/libs/humanizer/utils.js create mode 100644 dist/src/libs/humanizer/utils.js.map create mode 100644 dist/src/libs/keyIterator/keyIterator.d.ts create mode 100644 dist/src/libs/keyIterator/keyIterator.d.ts.map create mode 100644 dist/src/libs/keyIterator/keyIterator.js create mode 100644 dist/src/libs/keyIterator/keyIterator.js.map create mode 100644 dist/src/libs/keys/keys.d.ts create mode 100644 dist/src/libs/keys/keys.d.ts.map create mode 100644 dist/src/libs/keys/keys.js create mode 100644 dist/src/libs/keys/keys.js.map create mode 100644 dist/src/libs/keystoreSigner/keystoreSigner.d.ts create mode 100644 dist/src/libs/keystoreSigner/keystoreSigner.d.ts.map create mode 100644 dist/src/libs/keystoreSigner/keystoreSigner.js create mode 100644 dist/src/libs/keystoreSigner/keystoreSigner.js.map create mode 100644 dist/src/libs/ledger/ledger.d.ts create mode 100644 dist/src/libs/ledger/ledger.d.ts.map create mode 100644 dist/src/libs/ledger/ledger.js create mode 100644 dist/src/libs/ledger/ledger.js.map create mode 100644 dist/src/libs/magicLink/magicLink.d.ts create mode 100644 dist/src/libs/magicLink/magicLink.d.ts.map create mode 100644 dist/src/libs/magicLink/magicLink.js create mode 100644 dist/src/libs/magicLink/magicLink.js.map create mode 100644 dist/src/libs/main/main.d.ts create mode 100644 dist/src/libs/main/main.d.ts.map create mode 100644 dist/src/libs/main/main.js create mode 100644 dist/src/libs/main/main.js.map create mode 100644 dist/src/libs/networks/networks.d.ts create mode 100644 dist/src/libs/networks/networks.d.ts.map create mode 100644 dist/src/libs/networks/networks.js create mode 100644 dist/src/libs/networks/networks.js.map create mode 100644 dist/src/libs/paymaster/abstractPaymaster.d.ts create mode 100644 dist/src/libs/paymaster/abstractPaymaster.d.ts.map create mode 100644 dist/src/libs/paymaster/abstractPaymaster.js create mode 100644 dist/src/libs/paymaster/abstractPaymaster.js.map create mode 100644 dist/src/libs/paymaster/paymaster.d.ts create mode 100644 dist/src/libs/paymaster/paymaster.d.ts.map create mode 100644 dist/src/libs/paymaster/paymaster.js create mode 100644 dist/src/libs/paymaster/paymaster.js.map create mode 100644 dist/src/libs/polling/polling.d.ts create mode 100644 dist/src/libs/polling/polling.d.ts.map create mode 100644 dist/src/libs/polling/polling.js create mode 100644 dist/src/libs/polling/polling.js.map create mode 100644 dist/src/libs/portfolio/batcher.d.ts create mode 100644 dist/src/libs/portfolio/batcher.d.ts.map create mode 100644 dist/src/libs/portfolio/customToken.d.ts create mode 100644 dist/src/libs/portfolio/customToken.d.ts.map create mode 100644 dist/src/libs/portfolio/gecko.d.ts create mode 100644 dist/src/libs/portfolio/gecko.d.ts.map create mode 100644 dist/src/libs/portfolio/getNetworksWithAssets.d.ts create mode 100644 dist/src/libs/portfolio/getNetworksWithAssets.d.ts.map create mode 100644 dist/src/libs/portfolio/getNetworksWithAssets.js create mode 100644 dist/src/libs/portfolio/getNetworksWithAssets.js.map create mode 100644 dist/src/libs/portfolio/getOnchainBalances.d.ts create mode 100644 dist/src/libs/portfolio/getOnchainBalances.d.ts.map create mode 100644 dist/src/libs/portfolio/helpers.d.ts create mode 100644 dist/src/libs/portfolio/helpers.d.ts.map create mode 100644 dist/src/libs/portfolio/icons.d.ts create mode 100644 dist/src/libs/portfolio/icons.d.ts.map create mode 100644 dist/src/libs/portfolio/icons.js create mode 100644 dist/src/libs/portfolio/icons.js.map create mode 100644 dist/src/libs/portfolio/index.d.ts create mode 100644 dist/src/libs/portfolio/index.d.ts.map create mode 100644 dist/src/libs/portfolio/index.js create mode 100644 dist/src/libs/portfolio/index.js.map create mode 100644 dist/src/libs/portfolio/interfaces.d.ts create mode 100644 dist/src/libs/portfolio/interfaces.d.ts.map create mode 100644 dist/src/libs/portfolio/migrations/tokenPreferences.d.ts create mode 100644 dist/src/libs/portfolio/migrations/tokenPreferences.d.ts.map create mode 100644 dist/src/libs/portfolio/migrations/tokenPreferences.js create mode 100644 dist/src/libs/portfolio/migrations/tokenPreferences.js.map create mode 100644 dist/src/libs/portfolio/pagination.d.ts create mode 100644 dist/src/libs/portfolio/pagination.d.ts.map create mode 100644 dist/src/libs/portfolio/pendingAmountsHelper.d.ts create mode 100644 dist/src/libs/portfolio/pendingAmountsHelper.d.ts.map create mode 100644 dist/src/libs/portfolio/pendingAmountsHelper.js create mode 100644 dist/src/libs/portfolio/pendingAmountsHelper.js.map create mode 100644 dist/src/libs/portfolio/portfolio.d.ts create mode 100644 dist/src/libs/portfolio/portfolio.d.ts.map create mode 100644 dist/src/libs/proxyDeploy/bytecode.d.ts create mode 100644 dist/src/libs/proxyDeploy/bytecode.d.ts.map create mode 100644 dist/src/libs/proxyDeploy/deploy.d.ts create mode 100644 dist/src/libs/proxyDeploy/deploy.d.ts.map create mode 100644 dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts create mode 100644 dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts.map create mode 100644 dist/src/libs/relayerCall/relayerCall.d.ts create mode 100644 dist/src/libs/relayerCall/relayerCall.d.ts.map create mode 100644 dist/src/libs/relayerCall/relayerCall.js create mode 100644 dist/src/libs/relayerCall/relayerCall.js.map create mode 100644 dist/src/libs/richJson/richJson.d.ts create mode 100644 dist/src/libs/richJson/richJson.d.ts.map create mode 100644 dist/src/libs/richJson/richJson.js create mode 100644 dist/src/libs/richJson/richJson.js.map create mode 100644 dist/src/libs/selectedAccount/errors.d.ts create mode 100644 dist/src/libs/selectedAccount/errors.d.ts.map create mode 100644 dist/src/libs/selectedAccount/errors.js create mode 100644 dist/src/libs/selectedAccount/errors.js.map create mode 100644 dist/src/libs/selectedAccount/selectedAccount.d.ts create mode 100644 dist/src/libs/selectedAccount/selectedAccount.d.ts.map create mode 100644 dist/src/libs/selectedAccount/selectedAccount.js create mode 100644 dist/src/libs/selectedAccount/selectedAccount.js.map create mode 100644 dist/src/libs/signMessage/signMessage.d.ts create mode 100644 dist/src/libs/signMessage/signMessage.d.ts.map create mode 100644 dist/src/libs/signMessage/signMessage.js create mode 100644 dist/src/libs/signMessage/signMessage.js.map create mode 100644 dist/src/libs/singleton/singleton.d.ts create mode 100644 dist/src/libs/singleton/singleton.d.ts.map create mode 100644 dist/src/libs/singleton/singleton.js create mode 100644 dist/src/libs/singleton/singleton.js.map create mode 100644 dist/src/libs/swapAndBridge/swapAndBridge.d.ts create mode 100644 dist/src/libs/swapAndBridge/swapAndBridge.d.ts.map create mode 100644 dist/src/libs/swapAndBridge/swapAndBridge.js create mode 100644 dist/src/libs/swapAndBridge/swapAndBridge.js.map create mode 100644 dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts create mode 100644 dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts.map create mode 100644 dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js create mode 100644 dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map create mode 100644 dist/src/libs/tracer/debugTraceCall.d.ts create mode 100644 dist/src/libs/tracer/debugTraceCall.d.ts.map create mode 100644 dist/src/libs/tracer/debugTraceCall.js create mode 100644 dist/src/libs/tracer/debugTraceCall.js.map create mode 100644 dist/src/libs/transfer/amount.d.ts create mode 100644 dist/src/libs/transfer/amount.d.ts.map create mode 100644 dist/src/libs/transfer/amount.js create mode 100644 dist/src/libs/transfer/amount.js.map create mode 100644 dist/src/libs/transfer/userRequest.d.ts create mode 100644 dist/src/libs/transfer/userRequest.d.ts.map create mode 100644 dist/src/libs/transfer/userRequest.js create mode 100644 dist/src/libs/transfer/userRequest.js.map create mode 100644 dist/src/libs/trezor/trezor.d.ts create mode 100644 dist/src/libs/trezor/trezor.d.ts.map create mode 100644 dist/src/libs/trezor/trezor.js create mode 100644 dist/src/libs/trezor/trezor.js.map create mode 100644 dist/src/libs/userOperation/types.d.ts create mode 100644 dist/src/libs/userOperation/types.d.ts.map create mode 100644 dist/src/libs/userOperation/types.js create mode 100644 dist/src/libs/userOperation/types.js.map create mode 100644 dist/src/libs/userOperation/userOperation.d.ts create mode 100644 dist/src/libs/userOperation/userOperation.d.ts.map create mode 100644 dist/src/libs/userOperation/userOperation.js create mode 100644 dist/src/libs/userOperation/userOperation.js.map create mode 100644 dist/src/services/address/address.d.ts create mode 100644 dist/src/services/address/address.d.ts.map create mode 100644 dist/src/services/address/address.js create mode 100644 dist/src/services/address/address.js.map create mode 100644 dist/src/services/address/index.d.ts create mode 100644 dist/src/services/address/index.d.ts.map create mode 100644 dist/src/services/address/index.js create mode 100644 dist/src/services/address/index.js.map create mode 100644 dist/src/services/assetInfo/assetInfo.d.ts create mode 100644 dist/src/services/assetInfo/assetInfo.d.ts.map create mode 100644 dist/src/services/assetInfo/assetInfo.js create mode 100644 dist/src/services/assetInfo/assetInfo.js.map create mode 100644 dist/src/services/assetInfo/index.d.ts create mode 100644 dist/src/services/assetInfo/index.d.ts.map create mode 100644 dist/src/services/assetInfo/index.js create mode 100644 dist/src/services/assetInfo/index.js.map create mode 100644 dist/src/services/bundlers/DevBundlerSwitcher.d.ts create mode 100644 dist/src/services/bundlers/DevBundlerSwitcher.d.ts.map create mode 100644 dist/src/services/bundlers/DevBundlerSwitcher.js create mode 100644 dist/src/services/bundlers/DevBundlerSwitcher.js.map create mode 100644 dist/src/services/bundlers/biconomy.d.ts create mode 100644 dist/src/services/bundlers/biconomy.d.ts.map create mode 100644 dist/src/services/bundlers/biconomy.js create mode 100644 dist/src/services/bundlers/biconomy.js.map create mode 100644 dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts create mode 100644 dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts.map create mode 100644 dist/src/services/bundlers/brokenBiconomyBroadcast.js create mode 100644 dist/src/services/bundlers/brokenBiconomyBroadcast.js.map create mode 100644 dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts create mode 100644 dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts.map create mode 100644 dist/src/services/bundlers/brokenPimlicoBroadcast.js create mode 100644 dist/src/services/bundlers/brokenPimlicoBroadcast.js.map create mode 100644 dist/src/services/bundlers/bundler.d.ts create mode 100644 dist/src/services/bundlers/bundler.d.ts.map create mode 100644 dist/src/services/bundlers/bundler.js create mode 100644 dist/src/services/bundlers/bundler.js.map create mode 100644 dist/src/services/bundlers/bundlerSwitcher.d.ts create mode 100644 dist/src/services/bundlers/bundlerSwitcher.d.ts.map create mode 100644 dist/src/services/bundlers/bundlerSwitcher.js create mode 100644 dist/src/services/bundlers/bundlerSwitcher.js.map create mode 100644 dist/src/services/bundlers/getBundler.d.ts create mode 100644 dist/src/services/bundlers/getBundler.d.ts.map create mode 100644 dist/src/services/bundlers/getBundler.js create mode 100644 dist/src/services/bundlers/getBundler.js.map create mode 100644 dist/src/services/bundlers/pimlico.d.ts create mode 100644 dist/src/services/bundlers/pimlico.d.ts.map create mode 100644 dist/src/services/bundlers/pimlico.js create mode 100644 dist/src/services/bundlers/pimlico.js.map create mode 100644 dist/src/services/bundlers/types.d.ts create mode 100644 dist/src/services/bundlers/types.d.ts.map create mode 100644 dist/src/services/bundlers/types.js create mode 100644 dist/src/services/bundlers/types.js.map create mode 100644 dist/src/services/ensDomains/ensDomains.d.ts create mode 100644 dist/src/services/ensDomains/ensDomains.d.ts.map create mode 100644 dist/src/services/ensDomains/ensDomains.js create mode 100644 dist/src/services/ensDomains/ensDomains.js.map create mode 100644 dist/src/services/ensDomains/index.d.ts create mode 100644 dist/src/services/ensDomains/index.d.ts.map create mode 100644 dist/src/services/ensDomains/index.js create mode 100644 dist/src/services/ensDomains/index.js.map create mode 100644 dist/src/services/explorers/jiffyscan.d.ts create mode 100644 dist/src/services/explorers/jiffyscan.d.ts.map create mode 100644 dist/src/services/explorers/jiffyscan.js create mode 100644 dist/src/services/explorers/jiffyscan.js.map create mode 100644 dist/src/services/paymaster/FailedPaymasters.d.ts create mode 100644 dist/src/services/paymaster/FailedPaymasters.d.ts.map create mode 100644 dist/src/services/paymaster/FailedPaymasters.js create mode 100644 dist/src/services/paymaster/FailedPaymasters.js.map create mode 100644 dist/src/services/paymaster/PaymasterFactory.d.ts create mode 100644 dist/src/services/paymaster/PaymasterFactory.d.ts.map create mode 100644 dist/src/services/paymaster/PaymasterFactory.js create mode 100644 dist/src/services/paymaster/PaymasterFactory.js.map create mode 100644 dist/src/services/paymaster/index.d.ts create mode 100644 dist/src/services/paymaster/index.d.ts.map create mode 100644 dist/src/services/paymaster/index.js create mode 100644 dist/src/services/paymaster/index.js.map create mode 100644 dist/src/services/provider/getRpcProvider.d.ts create mode 100644 dist/src/services/provider/getRpcProvider.d.ts.map create mode 100644 dist/src/services/provider/getRpcProvider.js create mode 100644 dist/src/services/provider/getRpcProvider.js.map create mode 100644 dist/src/services/provider/index.d.ts create mode 100644 dist/src/services/provider/index.d.ts.map create mode 100644 dist/src/services/provider/index.js create mode 100644 dist/src/services/provider/index.js.map create mode 100644 dist/src/services/socket/api.d.ts create mode 100644 dist/src/services/socket/api.d.ts.map create mode 100644 dist/src/services/socket/api.js create mode 100644 dist/src/services/socket/api.js.map create mode 100644 dist/src/services/socket/constants.d.ts create mode 100644 dist/src/services/socket/constants.d.ts.map create mode 100644 dist/src/services/socket/constants.js create mode 100644 dist/src/services/socket/constants.js.map create mode 100644 dist/src/services/unstoppableDomains/index.d.ts create mode 100644 dist/src/services/unstoppableDomains/index.d.ts.map create mode 100644 dist/src/services/unstoppableDomains/index.js create mode 100644 dist/src/services/unstoppableDomains/index.js.map create mode 100644 dist/src/services/unstoppableDomains/unstoppableDomains.d.ts create mode 100644 dist/src/services/unstoppableDomains/unstoppableDomains.d.ts.map create mode 100644 dist/src/services/unstoppableDomains/unstoppableDomains.js create mode 100644 dist/src/services/unstoppableDomains/unstoppableDomains.js.map create mode 100644 dist/src/services/validations/index.d.ts create mode 100644 dist/src/services/validations/index.d.ts.map create mode 100644 dist/src/services/validations/index.js create mode 100644 dist/src/services/validations/index.js.map create mode 100644 dist/src/services/validations/validate.d.ts create mode 100644 dist/src/services/validations/validate.d.ts.map create mode 100644 dist/src/services/validations/validate.js create mode 100644 dist/src/services/validations/validate.js.map create mode 100644 dist/src/utils/accounts.d.ts create mode 100644 dist/src/utils/accounts.d.ts.map create mode 100644 dist/src/utils/accounts.js create mode 100644 dist/src/utils/accounts.js.map create mode 100644 dist/src/utils/addHexPrefix.d.ts create mode 100644 dist/src/utils/addHexPrefix.d.ts.map create mode 100644 dist/src/utils/addHexPrefix.js create mode 100644 dist/src/utils/addHexPrefix.js.map create mode 100644 dist/src/utils/benzin.d.ts create mode 100644 dist/src/utils/benzin.d.ts.map create mode 100644 dist/src/utils/benzin.js create mode 100644 dist/src/utils/benzin.js.map create mode 100644 dist/src/utils/formatDecimals/formatDecimals.d.ts create mode 100644 dist/src/utils/formatDecimals/formatDecimals.d.ts.map create mode 100644 dist/src/utils/formatDecimals/formatDecimals.js create mode 100644 dist/src/utils/formatDecimals/formatDecimals.js.map create mode 100644 dist/src/utils/generateSpoofSig.d.ts create mode 100644 dist/src/utils/generateSpoofSig.d.ts.map create mode 100644 dist/src/utils/generateSpoofSig.js create mode 100644 dist/src/utils/generateSpoofSig.js.map create mode 100644 dist/src/utils/hdPath.d.ts create mode 100644 dist/src/utils/hdPath.d.ts.map create mode 100644 dist/src/utils/hdPath.js create mode 100644 dist/src/utils/hdPath.js.map create mode 100644 dist/src/utils/hexStringToUint8Array.d.ts create mode 100644 dist/src/utils/hexStringToUint8Array.d.ts.map create mode 100644 dist/src/utils/hexStringToUint8Array.js create mode 100644 dist/src/utils/hexStringToUint8Array.js.map create mode 100644 dist/src/utils/isHexPrefixed.d.ts create mode 100644 dist/src/utils/isHexPrefixed.d.ts.map create mode 100644 dist/src/utils/isHexPrefixed.js create mode 100644 dist/src/utils/isHexPrefixed.js.map create mode 100644 dist/src/utils/isSameAddr.d.ts create mode 100644 dist/src/utils/isSameAddr.d.ts.map create mode 100644 dist/src/utils/isSameAddr.js create mode 100644 dist/src/utils/isSameAddr.js.map create mode 100644 dist/src/utils/networks.d.ts create mode 100644 dist/src/utils/networks.d.ts.map create mode 100644 dist/src/utils/networks.js create mode 100644 dist/src/utils/networks.js.map create mode 100644 dist/src/utils/numbers/formatters.d.ts create mode 100644 dist/src/utils/numbers/formatters.d.ts.map create mode 100644 dist/src/utils/numbers/formatters.js create mode 100644 dist/src/utils/numbers/formatters.js.map create mode 100644 dist/src/utils/shortenAddress.d.ts create mode 100644 dist/src/utils/shortenAddress.d.ts.map create mode 100644 dist/src/utils/shortenAddress.js create mode 100644 dist/src/utils/shortenAddress.js.map create mode 100644 dist/src/utils/simulationStateOverride.d.ts create mode 100644 dist/src/utils/simulationStateOverride.d.ts.map create mode 100644 dist/src/utils/simulationStateOverride.js create mode 100644 dist/src/utils/simulationStateOverride.js.map create mode 100644 dist/src/utils/stripHexPrefix.d.ts create mode 100644 dist/src/utils/stripHexPrefix.d.ts.map create mode 100644 dist/src/utils/stripHexPrefix.js create mode 100644 dist/src/utils/stripHexPrefix.js.map create mode 100644 dist/src/utils/wait.d.ts create mode 100644 dist/src/utils/wait.d.ts.map create mode 100644 dist/src/utils/wait.js create mode 100644 dist/src/utils/wait.js.map create mode 100644 dist/v1/hooks/useConstants/index.d.ts create mode 100644 dist/v1/hooks/useConstants/index.d.ts.map create mode 100644 dist/v1/hooks/useConstants/index.js create mode 100644 dist/v1/hooks/useConstants/index.js.map create mode 100644 dist/v1/hooks/useConstants/types.d.ts create mode 100644 dist/v1/hooks/useConstants/types.d.ts.map create mode 100644 dist/v1/hooks/useConstants/types.js create mode 100644 dist/v1/hooks/useConstants/types.js.map create mode 100644 dist/v1/hooks/useConstants/useConstants.d.ts create mode 100644 dist/v1/hooks/useConstants/useConstants.d.ts.map create mode 100644 dist/v1/hooks/useConstants/useConstants.js create mode 100644 dist/v1/hooks/useConstants/useConstants.js.map create mode 100644 dist/v1/services/fetch/fetch.d.ts create mode 100644 dist/v1/services/fetch/fetch.d.ts.map create mode 100644 dist/v1/services/fetch/fetch.js create mode 100644 dist/v1/services/fetch/fetch.js.map create mode 100644 dist/v1/services/fetch/index.d.ts create mode 100644 dist/v1/services/fetch/index.d.ts.map create mode 100644 dist/v1/services/fetch/index.js create mode 100644 dist/v1/services/fetch/index.js.map diff --git a/dist/contracts/compiled/AmbireAccount.json b/dist/contracts/compiled/AmbireAccount.json index ac077a9a1..d02082360 100644 --- a/dist/contracts/compiled/AmbireAccount.json +++ b/dist/contracts/compiled/AmbireAccount.json @@ -1 +1 @@ -{ "abi": [{ "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" }, { "indexed": false, "internalType": "bytes", "name": "returnData", "type": "bytes" }], "name": "LogErr", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "bytes32", "name": "priv", "type": "bytes32" }], "name": "LogPrivilegeChanged", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "txnHash", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "recoveryHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "recoveryKey", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "time", "type": "uint256" }], "name": "LogRecoveryCancelled", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "txnHash", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "recoveryHash", "type": "bytes32" }, { "indexed": false, "internalType": "uint256", "name": "time", "type": "uint256" }], "name": "LogRecoveryFinalized", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "txnHash", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "recoveryHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "recoveryKey", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "time", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "indexed": false, "internalType": "struct AmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }], "name": "LogRecoveryScheduled", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct AmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "execute", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct AmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }], "name": "executeBySelf", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct AmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }], "name": "executeBySender", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct AmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct AmbireAccount.ExecuteArgs[]", "name": "toExec", "type": "tuple[]" }], "name": "executeMultiple", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "bytes32", "name": "hash", "type": "bytes32" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "isValidSignature", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "nonce", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC1155BatchReceived", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC1155Received", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC721Received", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }], "name": "privileges", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "name": "scheduledRecoveries", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "bytes32", "name": "priv", "type": "bytes32" }], "name": "setAddrPrivilege", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }], "name": "supportsInterface", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "name": "tryCatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }], "name": "tryCatchLimit", "outputs": [], "stateMutability": "payable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }], "bin": "0x6080806040523461001657611ff0908161001c8239f35b600080fdfe6080604052600436101561001e575b361561001c5761001c610742565b005b60003560e01c806301ffc9a71461010e5780630d5828d414610109578063150b7a0214610104578063160aa0ef146100ff5780631626ba7e146100fa5780633628d042146100f55780636171d1c9146100f05780636769de82146100eb578063a2ea6766146100e6578063abc5345e146100e1578063affed0e0146100dc578063bc197c81146100d7578063bf1cb383146100d2578063c066a5b1146100cd5763f23a6e610361000e576106cf565b610691565b610624565b61057b565b61055d565b61051a565b610478565b610452565b6103d2565b6102dd565b61028c565b610260565b610206565b61016c565b61012a565b6001600160e01b031981160361012557565b600080fd5b3461012557602036600319011261012557602061015160043561014c81610113565b6113b2565b6040519015158152f35b6001600160a01b0381160361012557565b6040366003190112610125576004356101848161015b565b7f08ac40e0195c5998554e98853c23964a13a24309e127b2d016e8ec4adecf5e8360206001600160a01b03602435936101be303314610785565b1692836000526000825280604060002055604051908152a2005b9181601f840112156101255782359167ffffffffffffffff8311610125576020838186019501011161012557565b346101255760803660031901126101255761022260043561015b565b61022d60243561015b565b60643567ffffffffffffffff81116101255761024d9036906004016101d8565b50506020604051630a85bd0160e11b8152f35b346101255760203660031901126101255760043560005260026020526020604060002054604051908152f35b346101255760403660031901126101255760243567ffffffffffffffff8111610125576102cb6102c260209236906004016101d8565b90600435611345565b6001600160e01b031960405191168152f35b6080366003190112610125576004356102f58161015b565b6024359060443567ffffffffffffffff8111610125576103199036906004016101d8565b9091610326303314610785565b5a92600080604051858482378086810183815203908886606435f161035861034c610861565b955a9060061c106108a7565b1561035f57005b7f80c2637928bd94d0e1a90eaac1efc1553be6391d962fe5c82a01e90122c84ccc936001600160a01b039361039c9260405195869516978561095b565b0390a2005b9181601f840112156101255782359167ffffffffffffffff8311610125576020808501948460051b01011161012557565b60403660031901126101255767ffffffffffffffff600435818111610125576103ff9036906004016103a1565b906024359283116101255761041b61001c9336906004016101d8565b929091610ee9565b6020600319820112610125576004359067ffffffffffffffff82116101255761044e916004016103a1565b9091565b61001c61047361046136610423565b61046c303314610785565b3691610ddd565b6112e7565b61048136610423565b9060005b82810361048e57005b6104998184846112c5565b908135601e1992838136030182121561012557019182359267ffffffffffffffff90818511610125576020809101928560051b36038413610125576104df8589896112c5565b8281013591813603018212156101255701803592831161012557018136038113610125576105159461051093610ee9565b610d38565b610485565b61047361054461052936610423565b92906000933385528460205261046c60408620541515610b11565b3381528060205261055a60408220541515610e9e565b80f35b34610125576000366003190112610125576020600154604051908152f35b346101255760a03660031901126101255761059760043561015b565b6105a260243561015b565b67ffffffffffffffff604435818111610125576105c39036906004016103a1565b5050606435818111610125576105dd9036906004016103a1565b5050608435908111610125576105f79036906004016101d8565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b60603660031901126101255760043561063c8161015b565b6024359060443567ffffffffffffffff8111610125576106609036906004016101d8565b909161066d303314610785565b5a9260008060405185848237808681018381520390888689f161035861034c610861565b34610125576020366003190112610125576001600160a01b036004356106b68161015b565b1660005260006020526020604060002054604051908152f35b346101255760a0366003190112610125576106eb60043561015b565b6106f660243561015b565b60843567ffffffffffffffff8111610125576107169036906004016101d8565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b6000906169698252816020526001600160a01b036040832054169081156107805750818091368280378136915af4903d918282803e1561077e57f35bfd5b915050565b1561078c57565b606460405162461bcd60e51b815260206004820152601660248201527f4f4e4c595f4944454e544954595f43414e5f43414c4c000000000000000000006044820152fd5b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761080257604052565b6107d0565b6060810190811067ffffffffffffffff82111761080257604052565b90601f8019910116810190811067ffffffffffffffff82111761080257604052565b67ffffffffffffffff811161080257601f01601f191660200190565b3d1561088c573d9061087282610845565b916108806040519384610823565b82523d6000602084013e565b606090565b634e487b7160e01b600052601160045260246000fd5b156108ae57565b606460405162461bcd60e51b815260206004820152600c60248201527f54525943415443485f4f4f4700000000000000000000000000000000000000006044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60005b8381106109265750506000910152565b8181015183820152602001610916565b9060209161094f81518092818552858086019101610913565b601f01601f1916010190565b929161098794926109799285526060602086015260608501916108f2565b916040818403910152610936565b90565b9082818152602080910193818360051b82010194846000925b8584106109b4575050505050505090565b90919293949596601f198282030184528735605e19843603018112156101255783016001600160a01b0381356109e98161015b565b168252868101358783015260409081810135601e198236030181121561012557019087823592019267ffffffffffffffff83116101255782360384136101255760019389938493610a42936060809282015201916108f2565b9901940194019295949391906109a3565b90926080926001600160a01b03610987979516835260208301526040820152816060820152019161098a565b600019810191908211610a8e57565b610891565b9070014551231950b75fc4402da1732fc9bebe19918203918211610a8e57565b634e487b7160e01b600052603260045260246000fd5b90821015610ad5570190565b610ab3565b929192610ae682610845565b91610af46040519384610823565b829481845281830111610125578281602093846000960137010152565b15610b1857565b606460405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f50524956494c454745000000000000000000006044820152fd5b67ffffffffffffffff81116108025760051b60200190565b81601f82011215610125578051610b8a81610845565b92610b986040519485610823565b81845260208284010111610125576109879160208085019101610913565b5190610bc18261015b565b565b909160608284031261012557815167ffffffffffffffff908181116101255783019360408582031261012557604051610bfb816107e6565b855183811161012557860182601f8201121561012557805196610c1d88610b5c565b610c2a6040519182610823565b88815260209860051b83018901898201868211610125578a80809601915b838310610c7e575050505083520151868201529484015191821161012557610c77604091610987938601610b74565b9301610bb6565b81908351610c8b8161015b565b8152019101908590610c48565b6020808252825160408383015280516060840181905260808401949183019060005b818110610cd05750505090604091015191015290565b82516001600160a01b031687529584019591840191600101610cba565b15610cf457565b606460405162461bcd60e51b815260206004820152601760248201527f5245434f564552595f4e4f545f415554484f52495a45440000000000000000006044820152fd5b6000198114610a8e5760010190565b8051821015610ad55760209160051b010190565b9060018201809211610a8e57565b91908201809211610a8e57565b610987949260609282526020820152816040820152019161098a565b15610d9957565b606460405162461bcd60e51b815260206004820152601260248201527f5245434f564552595f4e4f545f524541445900000000000000000000000000006044820152fd5b929190610de981610b5c565b91604091610df983519485610823565b839581855260208095019160051b8101938385116101255781925b858410610e245750505050505050565b67ffffffffffffffff9084358281116101255784019160608388031261012557835192610e5084610807565b8035610e5b8161015b565b8452898101358a8501528481013591821161012557019086601f83011215610125578892610e8f8884868096359101610ada565b85820152815201930192610e14565b15610ea557565b606460405162461bcd60e51b815260206004820152601860248201527f50524956494c4547455f4e4f545f444f574e47524144454400000000000000006044820152fd5b9192600190815491604091825191602080840184610f0b898b8a463087610a53565b0394610f1f601f1996878101835282610823565b5190209860ff610f6a610f64610f3e610f3788610a7f565b8886610ac9565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b169360ff851480156112bb575b156112595791610fad610f9e610f9960fe9d9896946110019a98963691610ada565b611511565b50828082518301019101610bc3565b94906110086001600160a01b038097169e8f931492895186810190610fe281610fd68985610c98565b038c8101835282610823565b5190209b8c916001600160a01b03166000526000602052604060002090565b5414610ced565b61101c896000526002602052604060002090565b549687151580611251575b156110bf575050505050505061109961109e95610473956110b799957fdef2c5a081ab1dd3f896874500de5f4045efd102a452bce3af5123459f461f1b610bc19c9a9661107961046c97421015610d92565b6000838152600260205260408120555142815280602081010390a3610d5b565b600155565b6001600160a01b03166000526000602052604060002090565b541515610e9e565b859d9750611113939592949a9c969e5098809b989985600014611245578a51808d019283526363616e636020840152906111059082604085015b03908101835282610823565b51902090829e93929161190f565b6000918291169b5b6111e6575b506111359192939495969798999a9b50610ced565b15611192575050507ff38fc5203ec5ac432b66df0ed37402f7b1afb377ddce98e08c2bf696c7187405925061109961118391600061117d876000526002602052604060002090565b55610d5b565b5142815280602081015b0390a4565b936111c57f58d616db4bbaccaaad10b948d290b9df7973a7b566f83a68e2e0e7f4e5c61ccd9661118d9496015142610d69565b6111d9886000526002602052604060002090565b5551938493429085610d76565b8351805182101561123f5761121c6112106112038f938590610d47565b516001600160a01b031690565b6001600160a01b031690565b146112315761122b8d91610d38565b9061111b565b50999a8b9a50611135611120565b50611120565b5090829e93929161190f565b508215611027565b61047396506110b799955061109e97989450611099925092610bc19a61128761128d9361046c963691610ada565b9061190f565b966112b66112ae896001600160a01b03166000526000602052604060002090565b541515610b11565b610d5b565b5060fe8514610f77565b9190811015610ad55760051b81013590603e1981360301821215610125570190565b8051600091825b8281106112fb5750505050565b6113058183610d47565b5184806001600160a01b03835116602090818501516040809601519283519301915af11561133c575061133790610d38565b6112ee565b513d908186823efd5b60009061128761135f936001600160a01b03953691610ada565b166000526000602052604060002054151560001461138257630b135d3f60e11b90565b6001600160e01b031990565b90816020910312610125575180151581036101255790565b6040513d6000823e3d90fd5b7f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031982168181149081156114df575b81156114b5575b506114ae5761696960009081526020526001600160a01b0361143d611210807f662a30f03e82d96c1f4d254ac3d297ac2d115f4d7e55a040fee317b77fa274e7546001600160a01b031690565b169182156114a6576040519182526001600160e01b031916600482015290602090829060249082905afa9081156114a157600091611479575090565b610987915060203d811161149a575b6114928183610823565b81019061138e565b503d611488565b6113a6565b505050600090565b5050600190565b7f4e2312e000000000000000000000000000000000000000000000000000000000915014386113f0565b630a85bd0160e11b811491506113e9565b805160401015610ad55760600190565b908151811015610ad5570160200190565b90600019916115238382510182611500565b5160f81c928151908101908111610a8e5761153e9082611f2f565b9190565b1561154957565b606460405162461bcd60e51b815260206004820152600960248201527f53565f5349474c454e00000000000000000000000000000000000000000000006044820152fd5b6007111561159757565b634e487b7160e01b600052602160045260246000fd5b156115b457565b606460405162461bcd60e51b815260206004820152600a60248201527f53565f5349474d4f4445000000000000000000000000000000000000000000006044820152fd5b156115ff57565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f53504f4f465f4f524947494e00000000000000000000000000000000006044820152fd5b1561164a57565b606460405162461bcd60e51b815260206004820152600c60248201527f53565f53504f4f465f4c454e00000000000000000000000000000000000000006044820152fd5b1561012557565b9081602091031261012557516109878161015b565b156116b157565b606460405162461bcd60e51b815260206004820152600d60248201527f53565f4c454e5f57414c4c4554000000000000000000000000000000000000006044820152fd5b90816020910312610125575161098781610113565b604090610987939281528160208201520190610936565b1561172857565b606460405162461bcd60e51b815260206004820152601160248201527f53565f57414c4c45545f494e56414c49440000000000000000000000000000006044820152fd5b1561177357565b606460405162461bcd60e51b815260206004820152600b60248201527f53565f5a45524f5f5349470000000000000000000000000000000000000000006044820152fd5b90602090818382031261012557825167ffffffffffffffff93848211610125570181601f820112156101255780516117ee81610b5c565b946117fc6040519687610823565b818652848087019260051b8401019380851161012557858401925b858410611828575050505050505090565b8351838111610125578791611842848480948a0101610b74565b815201930192611817565b9190826080910312610125578151916020810151916060604083015192015160ff811681036101255790565b1561188057565b606460405162461bcd60e51b815260206004820152601160248201527f53565f5343484e4f52525f4641494c45440000000000000000000000000000006044820152fd5b156118cb57565b606460405162461bcd60e51b815260206004820152600660248201527f53565f4c454e00000000000000000000000000000000000000000000000000006044820152fd5b90929160009161192185511515611542565b60ff61195e610f6461193860001989510189611500565b517fff000000000000000000000000000000000000000000000000000000000000001690565b169161196c600684106115ad565b6119758361158d565b61197e8361158d565b82158015611ec8575b15611a7f57509084839495926119a360426020969551146118c4565b6119ac82611f3b565b9160016119c7610f646119386119c185611f8f565b946114f0565b946119d18161158d565b14611a25575b611a029192604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156114a157516109876001600160a01b038216151561176c565b611a0291604051611a7581611a678a82019485603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03601f198101835282610823565b51902091506119d7565b909291611a8b8161158d565b60048103611c2a575050611b29816020611af993611ac888611aba611ab4611b029a9b51610a7f565b82611f2f565b83808251830101910161184d565b969092829a8199899583611af270014551231950b75fc4402da1732fc9bebe198096819409610a93565b9609610a93565b9184141561168e565b88604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156114a15761098794611210948493611bbe611bdb945192611b5e6001600160a01b038516151561176c565b6040519687936020850195869290605594927fff00000000000000000000000000000000000000000000000000000000000000916bffffffffffffffffffffffff199060601b16855260f81b166014840152601583015260358201520190565b0393611bd2601f1995868101835282610823565b51902014611879565b611c1b60405191826110f96020820195866027917f5343484e4f525200000000000000000000000000000000000000000000000000825260078201520190565b5190206001600160a01b031690565b611c368196949661158d565b60058103611cf4575050611c53611c4d8351610a7f565b83611f2f565b611c676020928380825183010191016117b7565b93819482955b81518714611cd957611c8a84611c838985610d47565b518561190f565b611210611cd392611a67611c1b611ccd946040519283918c83019586906028926bffffffffffffffffffffffff19809260601b16835260601b1660148201520190565b96610d38565b95611c6d565b949550505050506109876001600160a01b038216151561176c565b611d0281969394959661158d565b60028103611dc7575050611d6791611d1d60218551116116aa565b60206001600160a01b038119865101611d49611d42611210611210611210858c611f9f565b9188611f2f565b169460405180958192630b135d3f60e11b968784526004840161170a565b0381875afa80156114a157611d8e936001600160e01b03199291611d99575b501614611721565b61098781151561176c565b611dba915060203d8111611dc0575b611db28183610823565b8101906116f5565b38611d86565b503d611da8565b6003919250611dd58161158d565b149081611ec0575b50611e275760405162461bcd60e51b815260206004820152600760248201527f53565f54595045000000000000000000000000000000000000000000000000006044820152606490fd5b600132148015611eb5575b611e3b906115f8565b611e486021835114611643565b611e5182611edb565b60208160405180611e7981906000606060808401938281528260208201528260408201520152565b838052039060015afa156114a15761098791611ea6611b396001600160a01b03611210945116141561168e565b60208082518301019101611695565b5032611b3914611e32565b905038611ddd565b50611ed28361158d565b60018314611987565b602081511115611eeb5760209052565b606460405162461bcd60e51b815260206004820152601860248201527f42797465734c69623a206f6e6c7920736872696e6b696e6700000000000000006044820152fd5b8181511115611eeb5752565b6020815110611f4b576020015190565b606460405162461bcd60e51b815260206004820152601060248201527f42797465734c69623a206c656e677468000000000000000000000000000000006044820152fd5b6040815110611f4b576040015190565b9060208101808211610a8e57825110611f4b5701602001519056fea2646970667358221220fa795aaa49aa14cff19a0ba21f537b3fd957a606a90a385ebdf37f8048323c2e64736f6c63430008130033", "binRuntime": "0x6080604052600436101561001e575b361561001c5761001c610742565b005b60003560e01c806301ffc9a71461010e5780630d5828d414610109578063150b7a0214610104578063160aa0ef146100ff5780631626ba7e146100fa5780633628d042146100f55780636171d1c9146100f05780636769de82146100eb578063a2ea6766146100e6578063abc5345e146100e1578063affed0e0146100dc578063bc197c81146100d7578063bf1cb383146100d2578063c066a5b1146100cd5763f23a6e610361000e576106cf565b610691565b610624565b61057b565b61055d565b61051a565b610478565b610452565b6103d2565b6102dd565b61028c565b610260565b610206565b61016c565b61012a565b6001600160e01b031981160361012557565b600080fd5b3461012557602036600319011261012557602061015160043561014c81610113565b6113b2565b6040519015158152f35b6001600160a01b0381160361012557565b6040366003190112610125576004356101848161015b565b7f08ac40e0195c5998554e98853c23964a13a24309e127b2d016e8ec4adecf5e8360206001600160a01b03602435936101be303314610785565b1692836000526000825280604060002055604051908152a2005b9181601f840112156101255782359167ffffffffffffffff8311610125576020838186019501011161012557565b346101255760803660031901126101255761022260043561015b565b61022d60243561015b565b60643567ffffffffffffffff81116101255761024d9036906004016101d8565b50506020604051630a85bd0160e11b8152f35b346101255760203660031901126101255760043560005260026020526020604060002054604051908152f35b346101255760403660031901126101255760243567ffffffffffffffff8111610125576102cb6102c260209236906004016101d8565b90600435611345565b6001600160e01b031960405191168152f35b6080366003190112610125576004356102f58161015b565b6024359060443567ffffffffffffffff8111610125576103199036906004016101d8565b9091610326303314610785565b5a92600080604051858482378086810183815203908886606435f161035861034c610861565b955a9060061c106108a7565b1561035f57005b7f80c2637928bd94d0e1a90eaac1efc1553be6391d962fe5c82a01e90122c84ccc936001600160a01b039361039c9260405195869516978561095b565b0390a2005b9181601f840112156101255782359167ffffffffffffffff8311610125576020808501948460051b01011161012557565b60403660031901126101255767ffffffffffffffff600435818111610125576103ff9036906004016103a1565b906024359283116101255761041b61001c9336906004016101d8565b929091610ee9565b6020600319820112610125576004359067ffffffffffffffff82116101255761044e916004016103a1565b9091565b61001c61047361046136610423565b61046c303314610785565b3691610ddd565b6112e7565b61048136610423565b9060005b82810361048e57005b6104998184846112c5565b908135601e1992838136030182121561012557019182359267ffffffffffffffff90818511610125576020809101928560051b36038413610125576104df8589896112c5565b8281013591813603018212156101255701803592831161012557018136038113610125576105159461051093610ee9565b610d38565b610485565b61047361054461052936610423565b92906000933385528460205261046c60408620541515610b11565b3381528060205261055a60408220541515610e9e565b80f35b34610125576000366003190112610125576020600154604051908152f35b346101255760a03660031901126101255761059760043561015b565b6105a260243561015b565b67ffffffffffffffff604435818111610125576105c39036906004016103a1565b5050606435818111610125576105dd9036906004016103a1565b5050608435908111610125576105f79036906004016101d8565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b60603660031901126101255760043561063c8161015b565b6024359060443567ffffffffffffffff8111610125576106609036906004016101d8565b909161066d303314610785565b5a9260008060405185848237808681018381520390888689f161035861034c610861565b34610125576020366003190112610125576001600160a01b036004356106b68161015b565b1660005260006020526020604060002054604051908152f35b346101255760a0366003190112610125576106eb60043561015b565b6106f660243561015b565b60843567ffffffffffffffff8111610125576107169036906004016101d8565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b6000906169698252816020526001600160a01b036040832054169081156107805750818091368280378136915af4903d918282803e1561077e57f35bfd5b915050565b1561078c57565b606460405162461bcd60e51b815260206004820152601660248201527f4f4e4c595f4944454e544954595f43414e5f43414c4c000000000000000000006044820152fd5b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761080257604052565b6107d0565b6060810190811067ffffffffffffffff82111761080257604052565b90601f8019910116810190811067ffffffffffffffff82111761080257604052565b67ffffffffffffffff811161080257601f01601f191660200190565b3d1561088c573d9061087282610845565b916108806040519384610823565b82523d6000602084013e565b606090565b634e487b7160e01b600052601160045260246000fd5b156108ae57565b606460405162461bcd60e51b815260206004820152600c60248201527f54525943415443485f4f4f4700000000000000000000000000000000000000006044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60005b8381106109265750506000910152565b8181015183820152602001610916565b9060209161094f81518092818552858086019101610913565b601f01601f1916010190565b929161098794926109799285526060602086015260608501916108f2565b916040818403910152610936565b90565b9082818152602080910193818360051b82010194846000925b8584106109b4575050505050505090565b90919293949596601f198282030184528735605e19843603018112156101255783016001600160a01b0381356109e98161015b565b168252868101358783015260409081810135601e198236030181121561012557019087823592019267ffffffffffffffff83116101255782360384136101255760019389938493610a42936060809282015201916108f2565b9901940194019295949391906109a3565b90926080926001600160a01b03610987979516835260208301526040820152816060820152019161098a565b600019810191908211610a8e57565b610891565b9070014551231950b75fc4402da1732fc9bebe19918203918211610a8e57565b634e487b7160e01b600052603260045260246000fd5b90821015610ad5570190565b610ab3565b929192610ae682610845565b91610af46040519384610823565b829481845281830111610125578281602093846000960137010152565b15610b1857565b606460405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f50524956494c454745000000000000000000006044820152fd5b67ffffffffffffffff81116108025760051b60200190565b81601f82011215610125578051610b8a81610845565b92610b986040519485610823565b81845260208284010111610125576109879160208085019101610913565b5190610bc18261015b565b565b909160608284031261012557815167ffffffffffffffff908181116101255783019360408582031261012557604051610bfb816107e6565b855183811161012557860182601f8201121561012557805196610c1d88610b5c565b610c2a6040519182610823565b88815260209860051b83018901898201868211610125578a80809601915b838310610c7e575050505083520151868201529484015191821161012557610c77604091610987938601610b74565b9301610bb6565b81908351610c8b8161015b565b8152019101908590610c48565b6020808252825160408383015280516060840181905260808401949183019060005b818110610cd05750505090604091015191015290565b82516001600160a01b031687529584019591840191600101610cba565b15610cf457565b606460405162461bcd60e51b815260206004820152601760248201527f5245434f564552595f4e4f545f415554484f52495a45440000000000000000006044820152fd5b6000198114610a8e5760010190565b8051821015610ad55760209160051b010190565b9060018201809211610a8e57565b91908201809211610a8e57565b610987949260609282526020820152816040820152019161098a565b15610d9957565b606460405162461bcd60e51b815260206004820152601260248201527f5245434f564552595f4e4f545f524541445900000000000000000000000000006044820152fd5b929190610de981610b5c565b91604091610df983519485610823565b839581855260208095019160051b8101938385116101255781925b858410610e245750505050505050565b67ffffffffffffffff9084358281116101255784019160608388031261012557835192610e5084610807565b8035610e5b8161015b565b8452898101358a8501528481013591821161012557019086601f83011215610125578892610e8f8884868096359101610ada565b85820152815201930192610e14565b15610ea557565b606460405162461bcd60e51b815260206004820152601860248201527f50524956494c4547455f4e4f545f444f574e47524144454400000000000000006044820152fd5b9192600190815491604091825191602080840184610f0b898b8a463087610a53565b0394610f1f601f1996878101835282610823565b5190209860ff610f6a610f64610f3e610f3788610a7f565b8886610ac9565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b169360ff851480156112bb575b156112595791610fad610f9e610f9960fe9d9896946110019a98963691610ada565b611511565b50828082518301019101610bc3565b94906110086001600160a01b038097169e8f931492895186810190610fe281610fd68985610c98565b038c8101835282610823565b5190209b8c916001600160a01b03166000526000602052604060002090565b5414610ced565b61101c896000526002602052604060002090565b549687151580611251575b156110bf575050505050505061109961109e95610473956110b799957fdef2c5a081ab1dd3f896874500de5f4045efd102a452bce3af5123459f461f1b610bc19c9a9661107961046c97421015610d92565b6000838152600260205260408120555142815280602081010390a3610d5b565b600155565b6001600160a01b03166000526000602052604060002090565b541515610e9e565b859d9750611113939592949a9c969e5098809b989985600014611245578a51808d019283526363616e636020840152906111059082604085015b03908101835282610823565b51902090829e93929161190f565b6000918291169b5b6111e6575b506111359192939495969798999a9b50610ced565b15611192575050507ff38fc5203ec5ac432b66df0ed37402f7b1afb377ddce98e08c2bf696c7187405925061109961118391600061117d876000526002602052604060002090565b55610d5b565b5142815280602081015b0390a4565b936111c57f58d616db4bbaccaaad10b948d290b9df7973a7b566f83a68e2e0e7f4e5c61ccd9661118d9496015142610d69565b6111d9886000526002602052604060002090565b5551938493429085610d76565b8351805182101561123f5761121c6112106112038f938590610d47565b516001600160a01b031690565b6001600160a01b031690565b146112315761122b8d91610d38565b9061111b565b50999a8b9a50611135611120565b50611120565b5090829e93929161190f565b508215611027565b61047396506110b799955061109e97989450611099925092610bc19a61128761128d9361046c963691610ada565b9061190f565b966112b66112ae896001600160a01b03166000526000602052604060002090565b541515610b11565b610d5b565b5060fe8514610f77565b9190811015610ad55760051b81013590603e1981360301821215610125570190565b8051600091825b8281106112fb5750505050565b6113058183610d47565b5184806001600160a01b03835116602090818501516040809601519283519301915af11561133c575061133790610d38565b6112ee565b513d908186823efd5b60009061128761135f936001600160a01b03953691610ada565b166000526000602052604060002054151560001461138257630b135d3f60e11b90565b6001600160e01b031990565b90816020910312610125575180151581036101255790565b6040513d6000823e3d90fd5b7f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031982168181149081156114df575b81156114b5575b506114ae5761696960009081526020526001600160a01b0361143d611210807f662a30f03e82d96c1f4d254ac3d297ac2d115f4d7e55a040fee317b77fa274e7546001600160a01b031690565b169182156114a6576040519182526001600160e01b031916600482015290602090829060249082905afa9081156114a157600091611479575090565b610987915060203d811161149a575b6114928183610823565b81019061138e565b503d611488565b6113a6565b505050600090565b5050600190565b7f4e2312e000000000000000000000000000000000000000000000000000000000915014386113f0565b630a85bd0160e11b811491506113e9565b805160401015610ad55760600190565b908151811015610ad5570160200190565b90600019916115238382510182611500565b5160f81c928151908101908111610a8e5761153e9082611f2f565b9190565b1561154957565b606460405162461bcd60e51b815260206004820152600960248201527f53565f5349474c454e00000000000000000000000000000000000000000000006044820152fd5b6007111561159757565b634e487b7160e01b600052602160045260246000fd5b156115b457565b606460405162461bcd60e51b815260206004820152600a60248201527f53565f5349474d4f4445000000000000000000000000000000000000000000006044820152fd5b156115ff57565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f53504f4f465f4f524947494e00000000000000000000000000000000006044820152fd5b1561164a57565b606460405162461bcd60e51b815260206004820152600c60248201527f53565f53504f4f465f4c454e00000000000000000000000000000000000000006044820152fd5b1561012557565b9081602091031261012557516109878161015b565b156116b157565b606460405162461bcd60e51b815260206004820152600d60248201527f53565f4c454e5f57414c4c4554000000000000000000000000000000000000006044820152fd5b90816020910312610125575161098781610113565b604090610987939281528160208201520190610936565b1561172857565b606460405162461bcd60e51b815260206004820152601160248201527f53565f57414c4c45545f494e56414c49440000000000000000000000000000006044820152fd5b1561177357565b606460405162461bcd60e51b815260206004820152600b60248201527f53565f5a45524f5f5349470000000000000000000000000000000000000000006044820152fd5b90602090818382031261012557825167ffffffffffffffff93848211610125570181601f820112156101255780516117ee81610b5c565b946117fc6040519687610823565b818652848087019260051b8401019380851161012557858401925b858410611828575050505050505090565b8351838111610125578791611842848480948a0101610b74565b815201930192611817565b9190826080910312610125578151916020810151916060604083015192015160ff811681036101255790565b1561188057565b606460405162461bcd60e51b815260206004820152601160248201527f53565f5343484e4f52525f4641494c45440000000000000000000000000000006044820152fd5b156118cb57565b606460405162461bcd60e51b815260206004820152600660248201527f53565f4c454e00000000000000000000000000000000000000000000000000006044820152fd5b90929160009161192185511515611542565b60ff61195e610f6461193860001989510189611500565b517fff000000000000000000000000000000000000000000000000000000000000001690565b169161196c600684106115ad565b6119758361158d565b61197e8361158d565b82158015611ec8575b15611a7f57509084839495926119a360426020969551146118c4565b6119ac82611f3b565b9160016119c7610f646119386119c185611f8f565b946114f0565b946119d18161158d565b14611a25575b611a029192604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156114a157516109876001600160a01b038216151561176c565b611a0291604051611a7581611a678a82019485603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03601f198101835282610823565b51902091506119d7565b909291611a8b8161158d565b60048103611c2a575050611b29816020611af993611ac888611aba611ab4611b029a9b51610a7f565b82611f2f565b83808251830101910161184d565b969092829a8199899583611af270014551231950b75fc4402da1732fc9bebe198096819409610a93565b9609610a93565b9184141561168e565b88604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156114a15761098794611210948493611bbe611bdb945192611b5e6001600160a01b038516151561176c565b6040519687936020850195869290605594927fff00000000000000000000000000000000000000000000000000000000000000916bffffffffffffffffffffffff199060601b16855260f81b166014840152601583015260358201520190565b0393611bd2601f1995868101835282610823565b51902014611879565b611c1b60405191826110f96020820195866027917f5343484e4f525200000000000000000000000000000000000000000000000000825260078201520190565b5190206001600160a01b031690565b611c368196949661158d565b60058103611cf4575050611c53611c4d8351610a7f565b83611f2f565b611c676020928380825183010191016117b7565b93819482955b81518714611cd957611c8a84611c838985610d47565b518561190f565b611210611cd392611a67611c1b611ccd946040519283918c83019586906028926bffffffffffffffffffffffff19809260601b16835260601b1660148201520190565b96610d38565b95611c6d565b949550505050506109876001600160a01b038216151561176c565b611d0281969394959661158d565b60028103611dc7575050611d6791611d1d60218551116116aa565b60206001600160a01b038119865101611d49611d42611210611210611210858c611f9f565b9188611f2f565b169460405180958192630b135d3f60e11b968784526004840161170a565b0381875afa80156114a157611d8e936001600160e01b03199291611d99575b501614611721565b61098781151561176c565b611dba915060203d8111611dc0575b611db28183610823565b8101906116f5565b38611d86565b503d611da8565b6003919250611dd58161158d565b149081611ec0575b50611e275760405162461bcd60e51b815260206004820152600760248201527f53565f54595045000000000000000000000000000000000000000000000000006044820152606490fd5b600132148015611eb5575b611e3b906115f8565b611e486021835114611643565b611e5182611edb565b60208160405180611e7981906000606060808401938281528260208201528260408201520152565b838052039060015afa156114a15761098791611ea6611b396001600160a01b03611210945116141561168e565b60208082518301019101611695565b5032611b3914611e32565b905038611ddd565b50611ed28361158d565b60018314611987565b602081511115611eeb5760209052565b606460405162461bcd60e51b815260206004820152601860248201527f42797465734c69623a206f6e6c7920736872696e6b696e6700000000000000006044820152fd5b8181511115611eeb5752565b6020815110611f4b576020015190565b606460405162461bcd60e51b815260206004820152601060248201527f42797465734c69623a206c656e677468000000000000000000000000000000006044820152fd5b6040815110611f4b576040015190565b9060208101808211610a8e57825110611f4b5701602001519056fea2646970667358221220fa795aaa49aa14cff19a0ba21f537b3fd957a606a90a385ebdf37f8048323c2e64736f6c63430008130033" } +{ "abi": [{ "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" }, { "indexed": false, "internalType": "bytes", "name": "returnData", "type": "bytes" }], "name": "LogErr", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "bytes32", "name": "priv", "type": "bytes32" }], "name": "LogPrivilegeChanged", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "execute", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "calls", "type": "tuple[]" }], "name": "executeBySelf", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction", "name": "call", "type": "tuple" }], "name": "executeBySelfSingle", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "calls", "type": "tuple[]" }], "name": "executeBySender", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct IAmbireAccount.ExecuteArgs[]", "name": "toExec", "type": "tuple[]" }], "name": "executeMultiple", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "bytes32", "name": "hash", "type": "bytes32" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "isValidSignature", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "nonce", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC1155BatchReceived", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC1155Received", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "name": "onERC721Received", "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }], "name": "privileges", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "bytes32", "name": "priv", "type": "bytes32" }], "name": "setAddrPrivilege", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }], "name": "supportsInterface", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "name": "tryCatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }], "name": "tryCatchLimit", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct PackedUserOperation", "name": "op", "type": "tuple" }, { "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "internalType": "uint256", "name": "missingAccountFunds", "type": "uint256" }], "name": "validateUserOp", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "payable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }], "bin": "0x6080806040523461001657612550908161001c8239f35b600080fdfe6080604052600436101561001e575b361561001c5761001c6107bb565b005b60003560e01c806301ffc9a71461011e5780630d5828d414610119578063150b7a02146101145780631626ba7e1461010f57806319822f7c1461010a5780633628d042146101055780636171d1c9146101005780636769de82146100fb578063a2ea6766146100f6578063abc5345e146100f1578063affed0e0146100ec578063bc197c81146100e7578063bf1cb383146100e2578063c066a5b1146100dd578063e6a6332e146100d85763f23a6e610361000e57610748565b6106dc565b61069e565b610631565b610588565b61056a565b610527565b6104a7565b610481565b610401565b61030c565b6102c1565b610270565b610216565b61017c565b61013a565b6001600160e01b031981160361013557565b600080fd5b3461013557602036600319011261013557602061016160043561015c81610123565b61105b565b6040519015158152f35b6001600160a01b0381160361013557565b6040366003190112610135576004356101948161016b565b7f08ac40e0195c5998554e98853c23964a13a24309e127b2d016e8ec4adecf5e8360206001600160a01b03602435936101ce3033146107fe565b1692836000526000825280604060002055604051908152a2005b9181601f840112156101355782359167ffffffffffffffff8311610135576020838186019501011161013557565b346101355760803660031901126101355761023260043561016b565b61023d60243561016b565b60643567ffffffffffffffff81116101355761025d9036906004016101e8565b50506020604051630a85bd0160e11b8152f35b346101355760403660031901126101355760243567ffffffffffffffff8111610135576102af6102a660209236906004016101e8565b90600435610fcb565b6001600160e01b031960405191168152f35b600319606036820112610135576004359067ffffffffffffffff82116101355761012090823603011261013557610304602091604435906024359060040161137d565b604051908152f35b6080366003190112610135576004356103248161016b565b6024359060443567ffffffffffffffff8111610135576103489036906004016101e8565b90916103553033146107fe565b5a92600080604051858482378086810183815203908886606435f161038761037b6108da565b955a9060061c10610920565b1561038e57005b7f80c2637928bd94d0e1a90eaac1efc1553be6391d962fe5c82a01e90122c84ccc936001600160a01b03936103cb926040519586951697856109d4565b0390a2005b9181601f840112156101355782359167ffffffffffffffff8311610135576020808501948460051b01011161013557565b60403660031901126101355767ffffffffffffffff6004358181116101355761042e9036906004016103d0565b906024359283116101355761044a61001c9336906004016101e8565b929091610d4b565b6020600319820112610135576004359067ffffffffffffffff82116101355761047d916004016103d0565b9091565b61001c6104a261049036610452565b61049b3033146107fe565b3691610bf4565b610f51565b6104b036610452565b60005b8181036104bc57005b6104c7818385610ee8565b803590601e198136030182121561013557019081359167ffffffffffffffff8311610135576020809101928060051b36038413610135576105229361044a61051d9361051486898b610ee8565b90810190610f0a565b610ed9565b6104b3565b6104a261055161053636610452565b92906000933385528460205261049b60408620541515610b91565b3381528060205261056760408220541515610d00565b80f35b34610135576000366003190112610135576020600154604051908152f35b346101355760a0366003190112610135576105a460043561016b565b6105af60243561016b565b67ffffffffffffffff604435818111610135576105d09036906004016103d0565b5050606435818111610135576105ea9036906004016103d0565b5050608435908111610135576106049036906004016101e8565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b6060366003190112610135576004356106498161016b565b6024359060443567ffffffffffffffff81116101355761066d9036906004016101e8565b909161067a3033146107fe565b5a9260008060405185848237808681018381520390888689f161038761037b6108da565b34610135576020366003190112610135576001600160a01b036004356106c38161016b565b1660005260006020526020604060002054604051908152f35b6003196020368201126101355760043567ffffffffffffffff8111610135576060816004019282360301126101355761001c9161071a3033146107fe565b602461073f61073883359361072e8561016b565b6044860190610f0a565b3691610b5a565b92013590610faa565b346101355760a03660031901126101355761076460043561016b565b61076f60243561016b565b60843567ffffffffffffffff81116101355761078f9036906004016101e8565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b6000906169698252816020526001600160a01b036040832054169081156107f95750818091368280378136915af4903d918282803e156107f757f35bfd5b915050565b1561080557565b606460405162461bcd60e51b815260206004820152601560248201527f4f4e4c595f4143434f554e545f43414e5f43414c4c00000000000000000000006044820152fd5b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761087b57604052565b610849565b6040810190811067ffffffffffffffff82111761087b57604052565b90601f8019910116810190811067ffffffffffffffff82111761087b57604052565b67ffffffffffffffff811161087b57601f01601f191660200190565b3d15610905573d906108eb826108be565b916108f9604051938461089c565b82523d6000602084013e565b606090565b634e487b7160e01b600052601160045260246000fd5b1561092757565b606460405162461bcd60e51b815260206004820152600c60248201527f54525943415443485f4f4f4700000000000000000000000000000000000000006044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60005b83811061099f5750506000910152565b818101518382015260200161098f565b906020916109c88151809281855285808601910161098c565b601f01601f1916010190565b9291610a0094926109f292855260606020860152606085019161096b565b9160408184039101526109af565b90565b600019810191908211610a1257565b61090a565b9070014551231950b75fc4402da1732fc9bebe19918203918211610a1257565b634e487b7160e01b600052603260045260246000fd5b90821015610a59570190565b610a37565b9060018201809211610a1257565b9491909460808101936001600160a01b0380971682526020928383015260409081830152836060956080878501525260a082019060a08560051b84010197876000945b878610610ac3575050505050505050505090565b90919293949596979899609f198282030186528a35605e1984360301811215610135578301848135610af48161016b565b168252888101358983015285810135601e19823603018112156101355701888101903567ffffffffffffffff811161013557803603821361013557610b468a9283928e86818c6001990152019161096b565b9c0196019601949897969593929190610aaf565b929192610b66826108be565b91610b74604051938461089c565b829481845281830111610135578281602093846000960137010152565b15610b9857565b606460405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f50524956494c454745000000000000000000006044820152fd5b67ffffffffffffffff811161087b5760051b60200190565b929190610c0081610bdc565b91604091610c108351948561089c565b839581855260208095019160051b8101938385116101355781925b858410610c3b5750505050505050565b67ffffffffffffffff9084358281116101355784019160608388031261013557835192610c678461085f565b8035610c728161016b565b8452898101358a8501528481013591821161013557019086601f83011215610135578892610ca68884868096359101610b5a565b85820152815201930192610c2b565b15610cbc57565b606460405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f56414c49444154494f4e5f54494d454c4f434b0000006044820152fd5b15610d0757565b606460405162461bcd60e51b815260206004820152601860248201527f50524956494c4547455f4e4f545f444f574e47524144454400000000000000006044820152fd5b91929092610d94610d8e610d68610d6185610a03565b8585610a4d565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b60ff8060015492610dac610da785610a5e565b600155565b1603610e5c575090610dc891610dc3368686610bf4565b611719565b9093919315610e0b575091610de86104a2610e0193610e09953691610bf4565b6001600160a01b03166000526000602052604060002090565b541515610d00565b565b610e1790421015610cb5565b60405162461bcd60e51b815260206004820152601960248201527f5349474e41545552455f56414c49444154494f4e5f4641494c000000000000006044820152606490fd5b610e0193610eab610e099694610ea5610de8956104a295604051610e9a81610e8c8c8a6020840196463089610a6c565b03601f19810183528261089c565b519020923691610b5a565b90611864565b93610ed4610ecc866001600160a01b03166000526000602052604060002090565b541515610b91565b61049b565b6000198114610a125760010190565b9190811015610a595760051b81013590603e1981360301821215610135570190565b903590601e1981360301821215610135570180359067ffffffffffffffff82116101355760200191813603831361013557565b8051821015610a595760209160051b010190565b80519060005b828110610f6357505050565b80610f71610f8a9284610f3d565b516001600160a01b0381511680610f8f575b5050610ed9565b610f57565b8160406020610fa394015191015191610faa565b3880610f83565b916000928392602083519301915af115610fc057565b3d604051816000823efd5b6001600160a01b0392610fed91610fe760009485933691610b5a565b90611d0e565b9216815280602052604081205491600014611026575060ff60015b16101561101a57630b135d3f60e11b90565b6001600160e01b031990565b60ff90611008565b5190811515820361013557565b9081602091031261013557610a009061102e565b6040513d6000823e3d90fd5b7f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031982168181149081156111c5575b811561119b575b8115611171575b5061116a5761696960009081526020526001600160a01b036110f96110ed807f662a30f03e82d96c1f4d254ac3d297ac2d115f4d7e55a040fee317b77fa274e7546001600160a01b031690565b6001600160a01b031690565b16918215611162576040519182526001600160e01b031916600482015290602090829060249082905afa90811561115d57600091611135575090565b610a00915060203d8111611156575b61114e818361089c565b81019061103b565b503d611144565b61104f565b505050600090565b5050600190565b7f0a41763200000000000000000000000000000000000000000000000000000000915014386110a0565b7f4e2312e00000000000000000000000000000000000000000000000000000000081149150611099565b630a85bd0160e11b81149150611092565b906004116101355790600490565b906014116101355790601490565b6001600160e01b0319903581811693926004811061120f57505050565b60040360031b82901b16169150565b6bffffffffffffffffffffffff19903581811693926014811061124057505050565b60140360031b82901b16169150565b1561125657565b608460405162461bcd60e51b815260206004820152603460248201527f76616c6964617465557365724f703a207061796d61737465722072657175697260448201527f656420696e20657865637574652829206d6f64650000000000000000000000006064820152fd5b9497959290936112e1610a009a98956112ef9460c0895260c089019161096b565b91868303602088015261096b565b9560408401526060830152608082015260a081850391015261096b565b1561131357565b608460405162461bcd60e51b815260206004820152602360248201527f76616c6964617465557365724f703a206e6f742066726f6d20656e747279506f60448201527f696e7400000000000000000000000000000000000000000000000000000000006064820152fd5b9160608301600461138e8286610f0a565b90501015806114ef575b611411575090610ea56107386113e894610de8946113d66171716113cf336001600160a01b03166000526000602052604060002090565b541461130c565b806113f8575b50610100810190610f0a565b54156113f357600090565b600190565b600080808093335af15061140a6108da565b50386113dc565b915050611422610100830183610f0a565b905061116a576114a960209160e0840190603461143f8387610f0a565b90501015806114b6575b6114529061124f565b6114a061147d610e8c61147461146b60408a018a610f0a565b9190958a610f0a565b9390968a610f0a565b918a6040519788968c88019a60c084013594608060a0860135950135938d6112c0565b51902060401b90565b910135036113f357600090565b506114526114e56114d06114ca8589610f0a565b906111e4565b6bffffffffffffffffffffffff19929161121e565b1615159050611449565b507fa2ea6766000000000000000000000000000000000000000000000000000000006001600160e01b031961153661153061152a8589610f0a565b906111d6565b906111f2565b1614611398565b81601f82011215610135578051611553816108be565b92611561604051948561089c565b8184526020828401011161013557610a00916020808501910161098c565b906080828203126101355781516115958161016b565b9260208301516115a48161016b565b9260408101519267ffffffffffffffff9384811161013557816115c891840161153d565b93606083015190811161013557610a00920161153d565b6040906001600160a01b03610a00949316815281602082015201906109af565b1561160657565b606460405162461bcd60e51b815260206004820152601b60248201527f45585445524e414c5f56414c49444154494f4e5f4e4f545f53455400000000006044820152fd5b91908260409103126101355760206116618361102e565b92015190565b9061168c61167d606092838552838501906109af565b602094848203868601526109af565b926040928381860391015284519182855281850182808560051b8801019701946000925b8584106116c257505050505050505090565b90919293949596989785806117056001938d601f1990820301885285878d516001600160a01b0381511684528581015186850152015191818982015201906109af565b9a9b990197969591909101930191906116b0565b6040906117496117396117346117d095600098973691610b5a565b611833565b506020808251830101910161157f565b916001600160a01b0398919880911693169761179b61177b8a6001600160a01b03166000526000602052604060002090565b548751602081019061179281610e8c878b866115df565b519020146115ff565b8551968795869485937ffcfbba4d00000000000000000000000000000000000000000000000000000000855260048501611667565b03925af1801561115d5760009182916117e857509091565b905061047d915060403d811161180b575b611803818361089c565b81019061164a565b503d6117f9565b805160401015610a595760600190565b908151811015610a59570160200190565b90600019916118458382510182611822565b5160f81c928151908101908111610a1257611860908261248f565b9190565b61187091600191611d0e565b6118775790565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f555345445f554e424f554e4400000000000000000000000000000000006044820152fd5b156118c257565b606460405162461bcd60e51b815260206004820152600960248201527f53565f5349474c454e00000000000000000000000000000000000000000000006044820152fd5b6007111561191057565b634e487b7160e01b600052602160045260246000fd5b6040519061193382610880565b600682527f416d6269726500000000000000000000000000000000000000000000000000006020830152565b6040519061196c82610880565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b604051906119a58261085f565b602d82527f62797465733332206861736829000000000000000000000000000000000000006040837f416d626972654f7065726174696f6e2861646472657373206163636f756e742c60208201520152565b156119fe57565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f53504f4f465f4f524947494e00000000000000000000000000000000006044820152fd5b15611a4957565b606460405162461bcd60e51b815260206004820152600c60248201527f53565f53504f4f465f4c454e00000000000000000000000000000000000000006044820152fd5b1561013557565b908160209103126101355751610a008161016b565b15611ab057565b606460405162461bcd60e51b815260206004820152600d60248201527f53565f4c454e5f57414c4c4554000000000000000000000000000000000000006044820152fd5b908160209103126101355751610a0081610123565b604090610a009392815281602082015201906109af565b15611b2757565b606460405162461bcd60e51b815260206004820152601160248201527f53565f57414c4c45545f494e56414c49440000000000000000000000000000006044820152fd5b90602090818382031261013557825167ffffffffffffffff93848211610135570181601f82011215610135578051611ba281610bdc565b94611bb0604051968761089c565b818652848087019260051b8401019380851161013557858401925b858410611bdc575050505050505090565b8351838111610135578791611bf6848480948a010161153d565b815201930192611bcb565b9190826080910312610135578151916020810151916060604083015192015160ff811681036101355790565b15611c3457565b606460405162461bcd60e51b815260206004820152600b60248201527f53565f5a45524f5f5349470000000000000000000000000000000000000000006044820152fd5b15611c7f57565b606460405162461bcd60e51b815260206004820152601160248201527f53565f5343484e4f52525f4641494c45440000000000000000000000000000006044820152fd5b15611cca57565b606460405162461bcd60e51b815260206004820152600660248201527f53565f4c454e00000000000000000000000000000000000000000000000000006044820152fd5b90929192611d1e815115156118bb565b611d59610d8e611d3360001984510184611822565b517fff000000000000000000000000000000000000000000000000000000000000001690565b600660ff821610156123e5575b60ff1693611d7385611906565b600090611d7f86611906565b851595861587816123d0575b88156122aa575b611d9b83611906565b90612297575b15611e435750505080602092611dc66000935160418114908115611e38575b50611cc3565b611e12611dd28361249b565b92611deb610d8e611d33611de5846124ef565b93611812565b93604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561115d576000515b6118606001600160a01b0382161515611c2d565b604291501438611dc0565b611e4c81611906565b60048103611ffe57505050611eab611eeb926020611e8784611e79611e7360009751610a03565b8261248f565b828082518301019101611c01565b978396899398949270014551231950b75fc4402da1732fc9bebe1993849109610a17565b91611ec4611ebb828a8c09610a17565b91841415611a8d565b87604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561115d57611f9e6110ed938392611ff996611f8160005192611f216001600160a01b0385161515611c2d565b6040519687936020850195869290605594927fff00000000000000000000000000000000000000000000000000000000000000916bffffffffffffffffffffffff199060601b16855260f81b166014840152601583015260358201520190565b0393611f95601f199586810183528261089c565b51902014611c78565b611fea6040519182611fde6020820195866027917f5343484e4f525200000000000000000000000000000000000000000000000000825260078201520190565b0390810183528261089c565b5190206001600160a01b031690565b611e24565b61200d81979397959495611906565b600581036120ca5750505061202b6120258351610a03565b8361248f565b61203f602092838082518301019101611b6b565b600080955b825187146120bf57612062600061205b8986610f3d565b5186611d0e565b6120b6575b6110ed6120b092610e8c611fea6120aa946040519283918c83019586906028926bffffffffffffffffffffffff19809260601b16835260601b1660148201520190565b96610ed9565b95612044565b60019250612067565b935094505050611e24565b6120d78197949397611906565b6002810361219557505061213d91506120f36021845111611aa9565b60206001600160a01b03811985510161211f6121186110ed6110ed6110ed858b6124ff565b918761248f565b169360405180948192630b135d3f60e11b9586845260048401611b09565b0381865afa91821561115d57611ff9926001600160e01b031991600091612167575b501614611b20565b612188915060203d811161218e575b612180818361089c565b810190611af4565b3861215f565b503d612176565b60039192506121a381611906565b14908161228f575b501561224a5760013214801561223f575b6121c5906119f7565b6121d26021835114611a42565b6121db8261243b565b6020816040518061220381906000606060808401938281528260208201528260408201520152565b838052039060015afa1561115d57611ff991612230611b396001600160a01b036110ed9451161415611a8d565b60208082518301019101611a94565b5032611b39146121bc565b60405162461bcd60e51b815260206004820152600760248201527f53565f54595045000000000000000000000000000000000000000000000000006044820152606490fd5b9050386121ab565b506122a181611906565b60018114611da1565b956122b3611926565b6123c761232682516020809401206122c961195f565b805190850120604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472818801908152602081019490945290830191909152466060830152306080830152600060a083015291829060c0830190565b039161233a601f199384810183528261089c565b5190209361237461238061234c611998565b8051908701206040805180890192835230602084015290820194909452929182906060850190565b0384810183528261089c565b51902092611fde6040519485928301968790916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b51902095611d92565b97506123db82611906565b6005821497611d8b565b5080516041036123f6576000611d66565b60405162461bcd60e51b815260206004820152600a60248201527f53565f5349474d4f4445000000000000000000000000000000000000000000006044820152606490fd5b60208151111561244b5760209052565b606460405162461bcd60e51b815260206004820152601860248201527f42797465734c69623a206f6e6c7920736872696e6b696e6700000000000000006044820152fd5b818151111561244b5752565b60208151106124ab576020015190565b606460405162461bcd60e51b815260206004820152601060248201527f42797465734c69623a206c656e677468000000000000000000000000000000006044820152fd5b60408151106124ab576040015190565b9060208101808211610a12578251106124ab5701602001519056fea2646970667358221220e24ede8e30bacdcc17c9d39995e34ce84cab6cbbf5ce39a3d58235b93887c95764736f6c63430008130033", "binRuntime": "0x6080604052600436101561001e575b361561001c5761001c6107bb565b005b60003560e01c806301ffc9a71461011e5780630d5828d414610119578063150b7a02146101145780631626ba7e1461010f57806319822f7c1461010a5780633628d042146101055780636171d1c9146101005780636769de82146100fb578063a2ea6766146100f6578063abc5345e146100f1578063affed0e0146100ec578063bc197c81146100e7578063bf1cb383146100e2578063c066a5b1146100dd578063e6a6332e146100d85763f23a6e610361000e57610748565b6106dc565b61069e565b610631565b610588565b61056a565b610527565b6104a7565b610481565b610401565b61030c565b6102c1565b610270565b610216565b61017c565b61013a565b6001600160e01b031981160361013557565b600080fd5b3461013557602036600319011261013557602061016160043561015c81610123565b61105b565b6040519015158152f35b6001600160a01b0381160361013557565b6040366003190112610135576004356101948161016b565b7f08ac40e0195c5998554e98853c23964a13a24309e127b2d016e8ec4adecf5e8360206001600160a01b03602435936101ce3033146107fe565b1692836000526000825280604060002055604051908152a2005b9181601f840112156101355782359167ffffffffffffffff8311610135576020838186019501011161013557565b346101355760803660031901126101355761023260043561016b565b61023d60243561016b565b60643567ffffffffffffffff81116101355761025d9036906004016101e8565b50506020604051630a85bd0160e11b8152f35b346101355760403660031901126101355760243567ffffffffffffffff8111610135576102af6102a660209236906004016101e8565b90600435610fcb565b6001600160e01b031960405191168152f35b600319606036820112610135576004359067ffffffffffffffff82116101355761012090823603011261013557610304602091604435906024359060040161137d565b604051908152f35b6080366003190112610135576004356103248161016b565b6024359060443567ffffffffffffffff8111610135576103489036906004016101e8565b90916103553033146107fe565b5a92600080604051858482378086810183815203908886606435f161038761037b6108da565b955a9060061c10610920565b1561038e57005b7f80c2637928bd94d0e1a90eaac1efc1553be6391d962fe5c82a01e90122c84ccc936001600160a01b03936103cb926040519586951697856109d4565b0390a2005b9181601f840112156101355782359167ffffffffffffffff8311610135576020808501948460051b01011161013557565b60403660031901126101355767ffffffffffffffff6004358181116101355761042e9036906004016103d0565b906024359283116101355761044a61001c9336906004016101e8565b929091610d4b565b6020600319820112610135576004359067ffffffffffffffff82116101355761047d916004016103d0565b9091565b61001c6104a261049036610452565b61049b3033146107fe565b3691610bf4565b610f51565b6104b036610452565b60005b8181036104bc57005b6104c7818385610ee8565b803590601e198136030182121561013557019081359167ffffffffffffffff8311610135576020809101928060051b36038413610135576105229361044a61051d9361051486898b610ee8565b90810190610f0a565b610ed9565b6104b3565b6104a261055161053636610452565b92906000933385528460205261049b60408620541515610b91565b3381528060205261056760408220541515610d00565b80f35b34610135576000366003190112610135576020600154604051908152f35b346101355760a0366003190112610135576105a460043561016b565b6105af60243561016b565b67ffffffffffffffff604435818111610135576105d09036906004016103d0565b5050606435818111610135576105ea9036906004016103d0565b5050608435908111610135576106049036906004016101e8565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b6060366003190112610135576004356106498161016b565b6024359060443567ffffffffffffffff81116101355761066d9036906004016101e8565b909161067a3033146107fe565b5a9260008060405185848237808681018381520390888689f161038761037b6108da565b34610135576020366003190112610135576001600160a01b036004356106c38161016b565b1660005260006020526020604060002054604051908152f35b6003196020368201126101355760043567ffffffffffffffff8111610135576060816004019282360301126101355761001c9161071a3033146107fe565b602461073f61073883359361072e8561016b565b6044860190610f0a565b3691610b5a565b92013590610faa565b346101355760a03660031901126101355761076460043561016b565b61076f60243561016b565b60843567ffffffffffffffff81116101355761078f9036906004016101e8565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b6000906169698252816020526001600160a01b036040832054169081156107f95750818091368280378136915af4903d918282803e156107f757f35bfd5b915050565b1561080557565b606460405162461bcd60e51b815260206004820152601560248201527f4f4e4c595f4143434f554e545f43414e5f43414c4c00000000000000000000006044820152fd5b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761087b57604052565b610849565b6040810190811067ffffffffffffffff82111761087b57604052565b90601f8019910116810190811067ffffffffffffffff82111761087b57604052565b67ffffffffffffffff811161087b57601f01601f191660200190565b3d15610905573d906108eb826108be565b916108f9604051938461089c565b82523d6000602084013e565b606090565b634e487b7160e01b600052601160045260246000fd5b1561092757565b606460405162461bcd60e51b815260206004820152600c60248201527f54525943415443485f4f4f4700000000000000000000000000000000000000006044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60005b83811061099f5750506000910152565b818101518382015260200161098f565b906020916109c88151809281855285808601910161098c565b601f01601f1916010190565b9291610a0094926109f292855260606020860152606085019161096b565b9160408184039101526109af565b90565b600019810191908211610a1257565b61090a565b9070014551231950b75fc4402da1732fc9bebe19918203918211610a1257565b634e487b7160e01b600052603260045260246000fd5b90821015610a59570190565b610a37565b9060018201809211610a1257565b9491909460808101936001600160a01b0380971682526020928383015260409081830152836060956080878501525260a082019060a08560051b84010197876000945b878610610ac3575050505050505050505090565b90919293949596979899609f198282030186528a35605e1984360301811215610135578301848135610af48161016b565b168252888101358983015285810135601e19823603018112156101355701888101903567ffffffffffffffff811161013557803603821361013557610b468a9283928e86818c6001990152019161096b565b9c0196019601949897969593929190610aaf565b929192610b66826108be565b91610b74604051938461089c565b829481845281830111610135578281602093846000960137010152565b15610b9857565b606460405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f50524956494c454745000000000000000000006044820152fd5b67ffffffffffffffff811161087b5760051b60200190565b929190610c0081610bdc565b91604091610c108351948561089c565b839581855260208095019160051b8101938385116101355781925b858410610c3b5750505050505050565b67ffffffffffffffff9084358281116101355784019160608388031261013557835192610c678461085f565b8035610c728161016b565b8452898101358a8501528481013591821161013557019086601f83011215610135578892610ca68884868096359101610b5a565b85820152815201930192610c2b565b15610cbc57565b606460405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f56414c49444154494f4e5f54494d454c4f434b0000006044820152fd5b15610d0757565b606460405162461bcd60e51b815260206004820152601860248201527f50524956494c4547455f4e4f545f444f574e47524144454400000000000000006044820152fd5b91929092610d94610d8e610d68610d6185610a03565b8585610a4d565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b60ff8060015492610dac610da785610a5e565b600155565b1603610e5c575090610dc891610dc3368686610bf4565b611719565b9093919315610e0b575091610de86104a2610e0193610e09953691610bf4565b6001600160a01b03166000526000602052604060002090565b541515610d00565b565b610e1790421015610cb5565b60405162461bcd60e51b815260206004820152601960248201527f5349474e41545552455f56414c49444154494f4e5f4641494c000000000000006044820152606490fd5b610e0193610eab610e099694610ea5610de8956104a295604051610e9a81610e8c8c8a6020840196463089610a6c565b03601f19810183528261089c565b519020923691610b5a565b90611864565b93610ed4610ecc866001600160a01b03166000526000602052604060002090565b541515610b91565b61049b565b6000198114610a125760010190565b9190811015610a595760051b81013590603e1981360301821215610135570190565b903590601e1981360301821215610135570180359067ffffffffffffffff82116101355760200191813603831361013557565b8051821015610a595760209160051b010190565b80519060005b828110610f6357505050565b80610f71610f8a9284610f3d565b516001600160a01b0381511680610f8f575b5050610ed9565b610f57565b8160406020610fa394015191015191610faa565b3880610f83565b916000928392602083519301915af115610fc057565b3d604051816000823efd5b6001600160a01b0392610fed91610fe760009485933691610b5a565b90611d0e565b9216815280602052604081205491600014611026575060ff60015b16101561101a57630b135d3f60e11b90565b6001600160e01b031990565b60ff90611008565b5190811515820361013557565b9081602091031261013557610a009061102e565b6040513d6000823e3d90fd5b7f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031982168181149081156111c5575b811561119b575b8115611171575b5061116a5761696960009081526020526001600160a01b036110f96110ed807f662a30f03e82d96c1f4d254ac3d297ac2d115f4d7e55a040fee317b77fa274e7546001600160a01b031690565b6001600160a01b031690565b16918215611162576040519182526001600160e01b031916600482015290602090829060249082905afa90811561115d57600091611135575090565b610a00915060203d8111611156575b61114e818361089c565b81019061103b565b503d611144565b61104f565b505050600090565b5050600190565b7f0a41763200000000000000000000000000000000000000000000000000000000915014386110a0565b7f4e2312e00000000000000000000000000000000000000000000000000000000081149150611099565b630a85bd0160e11b81149150611092565b906004116101355790600490565b906014116101355790601490565b6001600160e01b0319903581811693926004811061120f57505050565b60040360031b82901b16169150565b6bffffffffffffffffffffffff19903581811693926014811061124057505050565b60140360031b82901b16169150565b1561125657565b608460405162461bcd60e51b815260206004820152603460248201527f76616c6964617465557365724f703a207061796d61737465722072657175697260448201527f656420696e20657865637574652829206d6f64650000000000000000000000006064820152fd5b9497959290936112e1610a009a98956112ef9460c0895260c089019161096b565b91868303602088015261096b565b9560408401526060830152608082015260a081850391015261096b565b1561131357565b608460405162461bcd60e51b815260206004820152602360248201527f76616c6964617465557365724f703a206e6f742066726f6d20656e747279506f60448201527f696e7400000000000000000000000000000000000000000000000000000000006064820152fd5b9160608301600461138e8286610f0a565b90501015806114ef575b611411575090610ea56107386113e894610de8946113d66171716113cf336001600160a01b03166000526000602052604060002090565b541461130c565b806113f8575b50610100810190610f0a565b54156113f357600090565b600190565b600080808093335af15061140a6108da565b50386113dc565b915050611422610100830183610f0a565b905061116a576114a960209160e0840190603461143f8387610f0a565b90501015806114b6575b6114529061124f565b6114a061147d610e8c61147461146b60408a018a610f0a565b9190958a610f0a565b9390968a610f0a565b918a6040519788968c88019a60c084013594608060a0860135950135938d6112c0565b51902060401b90565b910135036113f357600090565b506114526114e56114d06114ca8589610f0a565b906111e4565b6bffffffffffffffffffffffff19929161121e565b1615159050611449565b507fa2ea6766000000000000000000000000000000000000000000000000000000006001600160e01b031961153661153061152a8589610f0a565b906111d6565b906111f2565b1614611398565b81601f82011215610135578051611553816108be565b92611561604051948561089c565b8184526020828401011161013557610a00916020808501910161098c565b906080828203126101355781516115958161016b565b9260208301516115a48161016b565b9260408101519267ffffffffffffffff9384811161013557816115c891840161153d565b93606083015190811161013557610a00920161153d565b6040906001600160a01b03610a00949316815281602082015201906109af565b1561160657565b606460405162461bcd60e51b815260206004820152601b60248201527f45585445524e414c5f56414c49444154494f4e5f4e4f545f53455400000000006044820152fd5b91908260409103126101355760206116618361102e565b92015190565b9061168c61167d606092838552838501906109af565b602094848203868601526109af565b926040928381860391015284519182855281850182808560051b8801019701946000925b8584106116c257505050505050505090565b90919293949596989785806117056001938d601f1990820301885285878d516001600160a01b0381511684528581015186850152015191818982015201906109af565b9a9b990197969591909101930191906116b0565b6040906117496117396117346117d095600098973691610b5a565b611833565b506020808251830101910161157f565b916001600160a01b0398919880911693169761179b61177b8a6001600160a01b03166000526000602052604060002090565b548751602081019061179281610e8c878b866115df565b519020146115ff565b8551968795869485937ffcfbba4d00000000000000000000000000000000000000000000000000000000855260048501611667565b03925af1801561115d5760009182916117e857509091565b905061047d915060403d811161180b575b611803818361089c565b81019061164a565b503d6117f9565b805160401015610a595760600190565b908151811015610a59570160200190565b90600019916118458382510182611822565b5160f81c928151908101908111610a1257611860908261248f565b9190565b61187091600191611d0e565b6118775790565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f555345445f554e424f554e4400000000000000000000000000000000006044820152fd5b156118c257565b606460405162461bcd60e51b815260206004820152600960248201527f53565f5349474c454e00000000000000000000000000000000000000000000006044820152fd5b6007111561191057565b634e487b7160e01b600052602160045260246000fd5b6040519061193382610880565b600682527f416d6269726500000000000000000000000000000000000000000000000000006020830152565b6040519061196c82610880565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b604051906119a58261085f565b602d82527f62797465733332206861736829000000000000000000000000000000000000006040837f416d626972654f7065726174696f6e2861646472657373206163636f756e742c60208201520152565b156119fe57565b606460405162461bcd60e51b815260206004820152600f60248201527f53565f53504f4f465f4f524947494e00000000000000000000000000000000006044820152fd5b15611a4957565b606460405162461bcd60e51b815260206004820152600c60248201527f53565f53504f4f465f4c454e00000000000000000000000000000000000000006044820152fd5b1561013557565b908160209103126101355751610a008161016b565b15611ab057565b606460405162461bcd60e51b815260206004820152600d60248201527f53565f4c454e5f57414c4c4554000000000000000000000000000000000000006044820152fd5b908160209103126101355751610a0081610123565b604090610a009392815281602082015201906109af565b15611b2757565b606460405162461bcd60e51b815260206004820152601160248201527f53565f57414c4c45545f494e56414c49440000000000000000000000000000006044820152fd5b90602090818382031261013557825167ffffffffffffffff93848211610135570181601f82011215610135578051611ba281610bdc565b94611bb0604051968761089c565b818652848087019260051b8401019380851161013557858401925b858410611bdc575050505050505090565b8351838111610135578791611bf6848480948a010161153d565b815201930192611bcb565b9190826080910312610135578151916020810151916060604083015192015160ff811681036101355790565b15611c3457565b606460405162461bcd60e51b815260206004820152600b60248201527f53565f5a45524f5f5349470000000000000000000000000000000000000000006044820152fd5b15611c7f57565b606460405162461bcd60e51b815260206004820152601160248201527f53565f5343484e4f52525f4641494c45440000000000000000000000000000006044820152fd5b15611cca57565b606460405162461bcd60e51b815260206004820152600660248201527f53565f4c454e00000000000000000000000000000000000000000000000000006044820152fd5b90929192611d1e815115156118bb565b611d59610d8e611d3360001984510184611822565b517fff000000000000000000000000000000000000000000000000000000000000001690565b600660ff821610156123e5575b60ff1693611d7385611906565b600090611d7f86611906565b851595861587816123d0575b88156122aa575b611d9b83611906565b90612297575b15611e435750505080602092611dc66000935160418114908115611e38575b50611cc3565b611e12611dd28361249b565b92611deb610d8e611d33611de5846124ef565b93611812565b93604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561115d576000515b6118606001600160a01b0382161515611c2d565b604291501438611dc0565b611e4c81611906565b60048103611ffe57505050611eab611eeb926020611e8784611e79611e7360009751610a03565b8261248f565b828082518301019101611c01565b978396899398949270014551231950b75fc4402da1732fc9bebe1993849109610a17565b91611ec4611ebb828a8c09610a17565b91841415611a8d565b87604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561115d57611f9e6110ed938392611ff996611f8160005192611f216001600160a01b0385161515611c2d565b6040519687936020850195869290605594927fff00000000000000000000000000000000000000000000000000000000000000916bffffffffffffffffffffffff199060601b16855260f81b166014840152601583015260358201520190565b0393611f95601f199586810183528261089c565b51902014611c78565b611fea6040519182611fde6020820195866027917f5343484e4f525200000000000000000000000000000000000000000000000000825260078201520190565b0390810183528261089c565b5190206001600160a01b031690565b611e24565b61200d81979397959495611906565b600581036120ca5750505061202b6120258351610a03565b8361248f565b61203f602092838082518301019101611b6b565b600080955b825187146120bf57612062600061205b8986610f3d565b5186611d0e565b6120b6575b6110ed6120b092610e8c611fea6120aa946040519283918c83019586906028926bffffffffffffffffffffffff19809260601b16835260601b1660148201520190565b96610ed9565b95612044565b60019250612067565b935094505050611e24565b6120d78197949397611906565b6002810361219557505061213d91506120f36021845111611aa9565b60206001600160a01b03811985510161211f6121186110ed6110ed6110ed858b6124ff565b918761248f565b169360405180948192630b135d3f60e11b9586845260048401611b09565b0381865afa91821561115d57611ff9926001600160e01b031991600091612167575b501614611b20565b612188915060203d811161218e575b612180818361089c565b810190611af4565b3861215f565b503d612176565b60039192506121a381611906565b14908161228f575b501561224a5760013214801561223f575b6121c5906119f7565b6121d26021835114611a42565b6121db8261243b565b6020816040518061220381906000606060808401938281528260208201528260408201520152565b838052039060015afa1561115d57611ff991612230611b396001600160a01b036110ed9451161415611a8d565b60208082518301019101611a94565b5032611b39146121bc565b60405162461bcd60e51b815260206004820152600760248201527f53565f54595045000000000000000000000000000000000000000000000000006044820152606490fd5b9050386121ab565b506122a181611906565b60018114611da1565b956122b3611926565b6123c761232682516020809401206122c961195f565b805190850120604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472818801908152602081019490945290830191909152466060830152306080830152600060a083015291829060c0830190565b039161233a601f199384810183528261089c565b5190209361237461238061234c611998565b8051908701206040805180890192835230602084015290820194909452929182906060850190565b0384810183528261089c565b51902092611fde6040519485928301968790916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b51902095611d92565b97506123db82611906565b6005821497611d8b565b5080516041036123f6576000611d66565b60405162461bcd60e51b815260206004820152600a60248201527f53565f5349474d4f4445000000000000000000000000000000000000000000006044820152606490fd5b60208151111561244b5760209052565b606460405162461bcd60e51b815260206004820152601860248201527f42797465734c69623a206f6e6c7920736872696e6b696e6700000000000000006044820152fd5b818151111561244b5752565b60208151106124ab576020015190565b606460405162461bcd60e51b815260206004820152601060248201527f42797465734c69623a206c656e677468000000000000000000000000000000006044820152fd5b60408151106124ab576040015190565b9060208101808211610a12578251106124ab5701602001519056fea2646970667358221220e24ede8e30bacdcc17c9d39995e34ce84cab6cbbf5ce39a3d58235b93887c95764736f6c63430008130033" } diff --git a/dist/contracts/compiled/AmbireAccountState.json b/dist/contracts/compiled/AmbireAccountState.json index 25f4ad0d2..12a16bea5 100644 --- a/dist/contracts/compiled/AmbireAccountState.json +++ b/dist/contracts/compiled/AmbireAccountState.json @@ -1 +1 @@ -{ "abi": [{ "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }], "name": "ambireV2Check", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "internalType": "address", "name": "erc4337EntryPoint", "type": "address" }], "internalType": "struct AccountInput", "name": "account", "type": "tuple" }], "name": "gatherAmbireData", "outputs": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes32[]", "name": "privileges", "type": "bytes32[]" }, { "internalType": "bool", "name": "isV2", "type": "bool" }, { "internalType": "uint256", "name": "erc4337Nonce", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "internalType": "address", "name": "erc4337EntryPoint", "type": "address" }], "internalType": "struct AccountInput[]", "name": "accounts", "type": "tuple[]" }], "name": "getAccountsState", "outputs": [{ "components": [{ "internalType": "bool", "name": "isDeployed", "type": "bool" }, { "internalType": "bytes", "name": "deployErr", "type": "bytes" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "bool", "name": "isV2", "type": "bool" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "bool", "name": "isEOA", "type": "bool" }, { "internalType": "uint256", "name": "erc4337Nonce", "type": "uint256" }], "internalType": "struct AccountInfo[]", "name": "accountResult", "type": "tuple[]" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "acc", "type": "address" }, { "internalType": "address", "name": "entryPoint", "type": "address" }], "name": "getErc4337Nonce", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x6080806040523461001657610dd2908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806324b6d45714610813578063dbcc238b14610277578063e4377c6b1461011a5763ef0c7b101461004857600080fd5b34610101576040366003190112610101576004356001600160a01b03908181168091036101015760243591821680920361010157600091604460209260405194859384927f35567e1a000000000000000000000000000000000000000000000000000000008452600484015261027060248401525af1801561010e576000906100d7575b602090604051908152f35b506020813d8211610106575b816100f060209383610b42565b8101031261010157602090516100cc565b600080fd5b3d91506100e3565b6040513d6000823e3d90fd5b3461010157602080600319360112610101576004356001600160a01b03811680910361010157604051907f01ffc9a700000000000000000000000000000000000000000000000000000000918281527f0a4176320000000000000000000000000000000000000000000000000000000060048201528381602481855afa92831561010e57849160009461023f575b5083156101bb575b506040518315158152f35b9091925060246040518094819382527f150b7a020000000000000000000000000000000000000000000000000000000060048301525afa90811561010e5760009161020a575b508282816101b0565b90508181813d8311610238575b6102218183610b42565b810103126101015761023290610d8f565b82610201565b503d610217565b8281939295503d8311610270575b6102578183610b42565b81010312610101576102698491610d8f565b92856101a8565b503d61024d565b346101015760203660031901126101015760043567ffffffffffffffff811161010157366023820112156101015780600401356102b381610b78565b916102c16040519384610b42565b8183526024602084019260051b820101903682116101015760248101925b8284106107e3578451856102f282610b78565b916103006040519384610b42565b80835261030f601f1991610b78565b0160005b81811061076c57505060005b81518114610673576103318183610d35565b51906001600160a01b039182815116319260a093846103508589610d35565b5101526040820193818551161561065d57825182163b156105815760016103778589610d35565b515293905b6040519485927f24b6d4570000000000000000000000000000000000000000000000000000000084526020600485015260c4840183865116602486015260208601519260448601528251809152602060e486019301906000905b8082106105635750505091608061040a60009693838796511660648701526060850151602319878303016084880152610cd0565b9201511660a4830152038183305af160008060009183600094610493575b6104519650610456575050505061043d610d5f565b60206104498387610d35565b510152610d10565b61031f565b6040610462868a610d35565b51015260606104718589610d35565b51015260806104808488610d35565b5101901515905260e06104498387610d35565b949593505050503d90816000823e6104ab8282610b42565b60808183810103126101015780519160208201519067ffffffffffffffff821161010157808301601f83850101121561010157818301516104eb81610b78565b926104f96040519485610b42565b8184526020840192850160208360051b83880101011161010157602081860101925b60208360051b8388010101841061055357505050509061045194939291606061054660408401610d8f565b9201519290919293610428565b835181526020938401930161051b565b825186168552899650602094850194909201916001909101906103d6565b600061058d8589610d35565b51526000808387511660608601519082602083519301915af16105ae610d5f565b5080158015610651575b6105c45750939061037c565b925050506104519250600014610616576040516105e081610b26565b600b81527f63616c6c20776f726b6564000000000000000000000000000000000000000000602082015260206104498387610d35565b60405161062281610b26565b600b81527f63616c6c206661696c6564000000000000000000000000000000000000000000602082015261043d565b50828451163b156105b8565b5050506104519150600160c06104498387610d35565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106106ac57505050500390f35b919390929450603f198682030182528451908151151581526106dd6020830151610100806020850152830190610cd0565b9160408101516040830152606092838201519383820390840152602080855192838152019401906000905b8082106107545750505060019260209260e080859460808082015115159085015260a0808201519085015260c0808201511515908501520151910152960192019201859493919261069d565b90919460208060019288518152019601920190610708565b6040519061010082019180831067ffffffffffffffff8411176107cd576020926040526000815260608084830152600060408301528082015260006080820152600060a0820152600060c0820152600060e082015282828701015201610313565b634e487b7160e01b600052604160045260246000fd5b833567ffffffffffffffff811161010157602091610808839260243691870101610bac565b8152019301926102df565b34610101576020806003193601126101015760043567ffffffffffffffff811161010157610845903690600401610bac565b81810180515161086d61085782610b78565b916108656040519384610b42565b808352610b78565b81850190601f19013682376001600160a01b03908185511691604051927fe4377c6b000000000000000000000000000000000000000000000000000000008452600484015260249087848381305afa92831561010e578894600094610aee575b50600097969594505b855197898951821461098f57889985856108f8858260009c9d9e511694610d35565b5116604051998a9384927fc066a5b100000000000000000000000000000000000000000000000000000000845260048401525af1801561010e578a9660009161095c575b50906109529161094c828a610d35565b52610d10565b97969594506108d6565b8781939892503d8311610988575b6109748183610b42565b81010312610101575189959061095261093c565b503d61096a565b86836000888c898987818451166004604051809881937faffed0e00000000000000000000000000000000000000000000000000000000083525af194851561010e57600095610abf575b506080818451169301511690604051927fef0c7b10000000000000000000000000000000000000000000000000000000008452600484015282015285816044816000305af160009181610a90575b50610a8a5750610a35610d5f565b50600019915b60405194608086019186526080878701525180915260a08501939060005b818110610a76575050508394501515604084015260608301520390f35b825186529487019491870191600101610a59565b91610a3b565b9091508681813d8311610ab8575b610aa88183610b42565b8101031261010157519087610a27565b503d610a9e565b9094508781813d8311610ae7575b610ad78183610b42565b81010312610101575193886109d9565b503d610acd565b8581969295503d8311610b1f575b610b068183610b42565b8101031261010157610b188894610d8f565b92896108cd565b503d610afc565b6040810190811067ffffffffffffffff8211176107cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176107cd57604052565b35906001600160a01b038216820361010157565b67ffffffffffffffff81116107cd5760051b60200190565b67ffffffffffffffff81116107cd57601f01601f191660200190565b919060a08382031261010157604080519167ffffffffffffffff9060a08401828111858210176107cd5783528395610be381610b64565b85526020928382013581811161010157820183601f8201121561010157803590610c0c82610b78565b91610c1988519384610b42565b808352868084019160051b830101918683116101015787809101915b838310610cb85750915050870152610c4e858301610b64565b8587015260608201359081116101015781019382601f8601121561010157843592610c84610c7b85610b90565b92519283610b42565b838252848487010111610101576000848460809795610cb3978997018386013783010152606086015201610b64565b910152565b8190610cc384610b64565b8152019101908790610c35565b919082519283825260005b848110610cfc575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610cdb565b6000198114610d1f5760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610d495760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b3d15610d8a573d90610d7082610b90565b91610d7e6040519384610b42565b82523d6000602084013e565b606090565b519081151582036101015756fea26469706673582212208bc5fd7eaa93d22e18ce2828933fc8ee3949254cde41401daeeaecabb01570e164736f6c63430008130033", "binRuntime": "0x6080604052600436101561001257600080fd5b60003560e01c806324b6d45714610813578063dbcc238b14610277578063e4377c6b1461011a5763ef0c7b101461004857600080fd5b34610101576040366003190112610101576004356001600160a01b03908181168091036101015760243591821680920361010157600091604460209260405194859384927f35567e1a000000000000000000000000000000000000000000000000000000008452600484015261027060248401525af1801561010e576000906100d7575b602090604051908152f35b506020813d8211610106575b816100f060209383610b42565b8101031261010157602090516100cc565b600080fd5b3d91506100e3565b6040513d6000823e3d90fd5b3461010157602080600319360112610101576004356001600160a01b03811680910361010157604051907f01ffc9a700000000000000000000000000000000000000000000000000000000918281527f0a4176320000000000000000000000000000000000000000000000000000000060048201528381602481855afa92831561010e57849160009461023f575b5083156101bb575b506040518315158152f35b9091925060246040518094819382527f150b7a020000000000000000000000000000000000000000000000000000000060048301525afa90811561010e5760009161020a575b508282816101b0565b90508181813d8311610238575b6102218183610b42565b810103126101015761023290610d8f565b82610201565b503d610217565b8281939295503d8311610270575b6102578183610b42565b81010312610101576102698491610d8f565b92856101a8565b503d61024d565b346101015760203660031901126101015760043567ffffffffffffffff811161010157366023820112156101015780600401356102b381610b78565b916102c16040519384610b42565b8183526024602084019260051b820101903682116101015760248101925b8284106107e3578451856102f282610b78565b916103006040519384610b42565b80835261030f601f1991610b78565b0160005b81811061076c57505060005b81518114610673576103318183610d35565b51906001600160a01b039182815116319260a093846103508589610d35565b5101526040820193818551161561065d57825182163b156105815760016103778589610d35565b515293905b6040519485927f24b6d4570000000000000000000000000000000000000000000000000000000084526020600485015260c4840183865116602486015260208601519260448601528251809152602060e486019301906000905b8082106105635750505091608061040a60009693838796511660648701526060850151602319878303016084880152610cd0565b9201511660a4830152038183305af160008060009183600094610493575b6104519650610456575050505061043d610d5f565b60206104498387610d35565b510152610d10565b61031f565b6040610462868a610d35565b51015260606104718589610d35565b51015260806104808488610d35565b5101901515905260e06104498387610d35565b949593505050503d90816000823e6104ab8282610b42565b60808183810103126101015780519160208201519067ffffffffffffffff821161010157808301601f83850101121561010157818301516104eb81610b78565b926104f96040519485610b42565b8184526020840192850160208360051b83880101011161010157602081860101925b60208360051b8388010101841061055357505050509061045194939291606061054660408401610d8f565b9201519290919293610428565b835181526020938401930161051b565b825186168552899650602094850194909201916001909101906103d6565b600061058d8589610d35565b51526000808387511660608601519082602083519301915af16105ae610d5f565b5080158015610651575b6105c45750939061037c565b925050506104519250600014610616576040516105e081610b26565b600b81527f63616c6c20776f726b6564000000000000000000000000000000000000000000602082015260206104498387610d35565b60405161062281610b26565b600b81527f63616c6c206661696c6564000000000000000000000000000000000000000000602082015261043d565b50828451163b156105b8565b5050506104519150600160c06104498387610d35565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106106ac57505050500390f35b919390929450603f198682030182528451908151151581526106dd6020830151610100806020850152830190610cd0565b9160408101516040830152606092838201519383820390840152602080855192838152019401906000905b8082106107545750505060019260209260e080859460808082015115159085015260a0808201519085015260c0808201511515908501520151910152960192019201859493919261069d565b90919460208060019288518152019601920190610708565b6040519061010082019180831067ffffffffffffffff8411176107cd576020926040526000815260608084830152600060408301528082015260006080820152600060a0820152600060c0820152600060e082015282828701015201610313565b634e487b7160e01b600052604160045260246000fd5b833567ffffffffffffffff811161010157602091610808839260243691870101610bac565b8152019301926102df565b34610101576020806003193601126101015760043567ffffffffffffffff811161010157610845903690600401610bac565b81810180515161086d61085782610b78565b916108656040519384610b42565b808352610b78565b81850190601f19013682376001600160a01b03908185511691604051927fe4377c6b000000000000000000000000000000000000000000000000000000008452600484015260249087848381305afa92831561010e578894600094610aee575b50600097969594505b855197898951821461098f57889985856108f8858260009c9d9e511694610d35565b5116604051998a9384927fc066a5b100000000000000000000000000000000000000000000000000000000845260048401525af1801561010e578a9660009161095c575b50906109529161094c828a610d35565b52610d10565b97969594506108d6565b8781939892503d8311610988575b6109748183610b42565b81010312610101575189959061095261093c565b503d61096a565b86836000888c898987818451166004604051809881937faffed0e00000000000000000000000000000000000000000000000000000000083525af194851561010e57600095610abf575b506080818451169301511690604051927fef0c7b10000000000000000000000000000000000000000000000000000000008452600484015282015285816044816000305af160009181610a90575b50610a8a5750610a35610d5f565b50600019915b60405194608086019186526080878701525180915260a08501939060005b818110610a76575050508394501515604084015260608301520390f35b825186529487019491870191600101610a59565b91610a3b565b9091508681813d8311610ab8575b610aa88183610b42565b8101031261010157519087610a27565b503d610a9e565b9094508781813d8311610ae7575b610ad78183610b42565b81010312610101575193886109d9565b503d610acd565b8581969295503d8311610b1f575b610b068183610b42565b8101031261010157610b188894610d8f565b92896108cd565b503d610afc565b6040810190811067ffffffffffffffff8211176107cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176107cd57604052565b35906001600160a01b038216820361010157565b67ffffffffffffffff81116107cd5760051b60200190565b67ffffffffffffffff81116107cd57601f01601f191660200190565b919060a08382031261010157604080519167ffffffffffffffff9060a08401828111858210176107cd5783528395610be381610b64565b85526020928382013581811161010157820183601f8201121561010157803590610c0c82610b78565b91610c1988519384610b42565b808352868084019160051b830101918683116101015787809101915b838310610cb85750915050870152610c4e858301610b64565b8587015260608201359081116101015781019382601f8601121561010157843592610c84610c7b85610b90565b92519283610b42565b838252848487010111610101576000848460809795610cb3978997018386013783010152606086015201610b64565b910152565b8190610cc384610b64565b8152019101908790610c35565b919082519283825260005b848110610cfc575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610cdb565b6000198114610d1f5760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610d495760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b3d15610d8a573d90610d7082610b90565b91610d7e6040519384610b42565b82523d6000602084013e565b606090565b519081151582036101015756fea26469706673582212208bc5fd7eaa93d22e18ce2828933fc8ee3949254cde41401daeeaecabb01570e164736f6c63430008130033" } +{ "abi": [{ "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }], "name": "ambireV2Check", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "pure", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "internalType": "address", "name": "erc4337EntryPoint", "type": "address" }], "internalType": "struct AccountInput", "name": "account", "type": "tuple" }], "name": "gatherAmbireData", "outputs": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes32[]", "name": "privileges", "type": "bytes32[]" }, { "internalType": "bool", "name": "isV2", "type": "bool" }, { "internalType": "uint256", "name": "erc4337Nonce", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "internalType": "address", "name": "erc4337EntryPoint", "type": "address" }], "internalType": "struct AccountInput[]", "name": "accounts", "type": "tuple[]" }], "name": "getAccountsState", "outputs": [{ "components": [{ "internalType": "bool", "name": "isDeployed", "type": "bool" }, { "internalType": "bytes", "name": "deployErr", "type": "bytes" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "bool", "name": "isV2", "type": "bool" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "bool", "name": "isEOA", "type": "bool" }, { "internalType": "uint256", "name": "erc4337Nonce", "type": "uint256" }, { "internalType": "uint256", "name": "currentBlock", "type": "uint256" }], "internalType": "struct AccountInfo[]", "name": "accountResult", "type": "tuple[]" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "acc", "type": "address" }, { "internalType": "address", "name": "entryPoint", "type": "address" }], "name": "getErc4337Nonce", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x6080806040523461001657610e1d908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806324b6d4571461085e578063dbcc238b14610275578063e4377c6b146101185763ef0c7b101461004857600080fd5b346100ff5760403660031901126100ff576004356001600160a01b03908181168091036100ff576024359182168092036100ff57600091604460209260405194859384927f35567e1a00000000000000000000000000000000000000000000000000000000845260048401528160248401525af1801561010c576000906100d5575b602090604051908152f35b506020813d8211610104575b816100ee60209383610b8d565b810103126100ff57602090516100ca565b600080fd5b3d91506100e1565b6040513d6000823e3d90fd5b346100ff576020806003193601126100ff576004356001600160a01b0381168091036100ff57604051907f01ffc9a700000000000000000000000000000000000000000000000000000000918281527f0a4176320000000000000000000000000000000000000000000000000000000060048201528381602481855afa92831561010c57849160009461023d575b5083156101b9575b506040518315158152f35b9091925060246040518094819382527f150b7a020000000000000000000000000000000000000000000000000000000060048301525afa90811561010c57600091610208575b508282816101ae565b90508181813d8311610236575b61021f8183610b8d565b810103126100ff5761023090610dda565b826101ff565b503d610215565b8281939295503d831161026e575b6102558183610b8d565b810103126100ff576102678491610dda565b92856101a6565b503d61024b565b346100ff5760203660031901126100ff5760043567ffffffffffffffff81116100ff57366023820112156100ff5780600401356102b181610bc3565b916102bf6040519384610b8d565b8183526024602084019260051b820101903682116100ff5760248101925b82841061082e578451856102f082610bc3565b916102fe6040519384610b8d565b80835261030d601f1991610bc3565b0160005b8181106107af57505060005b815181146106aa5761032f8183610d80565b51906001600160a01b03825116319160a0928361034c8488610d80565b5101526001600160a01b03604082015116156106965780516001600160a01b03163b156105af57600161037f8387610d80565b51525b60405180937f24b6d457000000000000000000000000000000000000000000000000000000008252602060048301526001600160a01b038351166024830152602083015190604483015260c482018151809152602060e484019201906000905b80821061058a57505050826001600160a01b036080610420859483604060009901511660648701526060850151602319878303016084880152610d1b565b9201511660a4830152038183305af1600080600091836000946104ba575b610467965061046c5750505050610453610daa565b602061045f8387610d80565b510152610d5b565b61031d565b6040610478868a610d80565b51015260606104878589610d80565b51015260806104968488610d80565b5101901515905260e06104a98387610d80565b5101524361010061045f8387610d80565b949593505050503d90816000823e6104d28282610b8d565b60808183810103126100ff5780519160208201519067ffffffffffffffff82116100ff57808301601f8385010112156100ff578183015161051281610bc3565b926105206040519485610b8d565b8184526020840192850160208360051b8388010101116100ff57602081860101925b60208360051b8388010101841061057a57505050509061046794939291606061056d60408401610dda565b920151929091929361043e565b8351815260209384019301610542565b919350916020806001926001600160a01b0387511681520194019201869392916103e2565b60006105bb8387610d80565b51526000806001600160a01b0360408401511660608401519082602083519301915af16105e6610daa565b5080158015610683575b6105fa5750610382565b61046793501590506106485760405161061281610b71565b600b81527f63616c6c20776f726b65640000000000000000000000000000000000000000006020820152602061045f8387610d80565b60405161065481610b71565b600b81527f63616c6c206661696c65640000000000000000000000000000000000000000006020820152610453565b506001600160a01b038251163b156105f0565b506104679150600160c061045f8387610d80565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106106e357505050500390f35b919390929450603f198682030182528451908151151581526107146020830151610120806020850152830190610d1b565b9160408101516040830152606092838201519383820390840152602080855192838152019401906000905b80821061079757505050600192602092839260808082015115159083015260a0808201519083015260c08082015115159083015260e081015160e08301526101008091015191015296019201920185949391926106d4565b9091946020806001928851815201960192019061073f565b6040519061012082019180831067ffffffffffffffff841117610818576020926040526000815260608084830152600060408301528082015260006080820152600060a0820152600060c0820152600060e0820152600061010082015282828701015201610311565b634e487b7160e01b600052604160045260246000fd5b833567ffffffffffffffff81116100ff57602091610853839260243691870101610bf7565b8152019301926102dd565b346100ff576020806003193601126100ff5760043567ffffffffffffffff81116100ff57610890903690600401610bf7565b8181018051516108b86108a282610bc3565b916108b06040519384610b8d565b808352610bc3565b81850190601f19013682376001600160a01b03908185511691604051927fe4377c6b000000000000000000000000000000000000000000000000000000008452600484015260249087848381305afa92831561010c578894600094610b39575b50600097969594505b85519789895182146109da5788998585610943858260009c9d9e511694610d80565b5116604051998a9384927fc066a5b100000000000000000000000000000000000000000000000000000000845260048401525af1801561010c578a966000916109a7575b509061099d91610997828a610d80565b52610d5b565b9796959450610921565b8781939892503d83116109d3575b6109bf8183610b8d565b810103126100ff575189959061099d610987565b503d6109b5565b86836000888c898987818451166004604051809881937faffed0e00000000000000000000000000000000000000000000000000000000083525af194851561010c57600095610b0a575b506080818451169301511690604051927fef0c7b10000000000000000000000000000000000000000000000000000000008452600484015282015285816044816000305af160009181610adb575b50610ad55750610a80610daa565b50600019915b60405194608086019186526080878701525180915260a08501939060005b818110610ac1575050508394501515604084015260608301520390f35b825186529487019491870191600101610aa4565b91610a86565b9091508681813d8311610b03575b610af38183610b8d565b810103126100ff57519087610a72565b503d610ae9565b9094508781813d8311610b32575b610b228183610b8d565b810103126100ff57519388610a24565b503d610b18565b8581969295503d8311610b6a575b610b518183610b8d565b810103126100ff57610b638894610dda565b9289610918565b503d610b47565b6040810190811067ffffffffffffffff82111761081857604052565b90601f8019910116810190811067ffffffffffffffff82111761081857604052565b35906001600160a01b03821682036100ff57565b67ffffffffffffffff81116108185760051b60200190565b67ffffffffffffffff811161081857601f01601f191660200190565b919060a0838203126100ff57604080519167ffffffffffffffff9060a08401828111858210176108185783528395610c2e81610baf565b8552602092838201358181116100ff57820183601f820112156100ff57803590610c5782610bc3565b91610c6488519384610b8d565b808352868084019160051b830101918683116100ff5787809101915b838310610d035750915050870152610c99858301610baf565b8587015260608201359081116100ff5781019382601f860112156100ff57843592610ccf610cc685610bdb565b92519283610b8d565b8382528484870101116100ff576000848460809795610cfe978997018386013783010152606086015201610baf565b910152565b8190610d0e84610baf565b8152019101908790610c80565b919082519283825260005b848110610d47575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610d26565b6000198114610d6a5760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610d945760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b3d15610dd5573d90610dbb82610bdb565b91610dc96040519384610b8d565b82523d6000602084013e565b606090565b519081151582036100ff5756fea2646970667358221220bfcaf330efff50a143fd1c85977ee736b88a6442b5a94bed03257de113f4509264736f6c63430008130033", "binRuntime": "0x6080604052600436101561001257600080fd5b60003560e01c806324b6d4571461085e578063dbcc238b14610275578063e4377c6b146101185763ef0c7b101461004857600080fd5b346100ff5760403660031901126100ff576004356001600160a01b03908181168091036100ff576024359182168092036100ff57600091604460209260405194859384927f35567e1a00000000000000000000000000000000000000000000000000000000845260048401528160248401525af1801561010c576000906100d5575b602090604051908152f35b506020813d8211610104575b816100ee60209383610b8d565b810103126100ff57602090516100ca565b600080fd5b3d91506100e1565b6040513d6000823e3d90fd5b346100ff576020806003193601126100ff576004356001600160a01b0381168091036100ff57604051907f01ffc9a700000000000000000000000000000000000000000000000000000000918281527f0a4176320000000000000000000000000000000000000000000000000000000060048201528381602481855afa92831561010c57849160009461023d575b5083156101b9575b506040518315158152f35b9091925060246040518094819382527f150b7a020000000000000000000000000000000000000000000000000000000060048301525afa90811561010c57600091610208575b508282816101ae565b90508181813d8311610236575b61021f8183610b8d565b810103126100ff5761023090610dda565b826101ff565b503d610215565b8281939295503d831161026e575b6102558183610b8d565b810103126100ff576102678491610dda565b92856101a6565b503d61024b565b346100ff5760203660031901126100ff5760043567ffffffffffffffff81116100ff57366023820112156100ff5780600401356102b181610bc3565b916102bf6040519384610b8d565b8183526024602084019260051b820101903682116100ff5760248101925b82841061082e578451856102f082610bc3565b916102fe6040519384610b8d565b80835261030d601f1991610bc3565b0160005b8181106107af57505060005b815181146106aa5761032f8183610d80565b51906001600160a01b03825116319160a0928361034c8488610d80565b5101526001600160a01b03604082015116156106965780516001600160a01b03163b156105af57600161037f8387610d80565b51525b60405180937f24b6d457000000000000000000000000000000000000000000000000000000008252602060048301526001600160a01b038351166024830152602083015190604483015260c482018151809152602060e484019201906000905b80821061058a57505050826001600160a01b036080610420859483604060009901511660648701526060850151602319878303016084880152610d1b565b9201511660a4830152038183305af1600080600091836000946104ba575b610467965061046c5750505050610453610daa565b602061045f8387610d80565b510152610d5b565b61031d565b6040610478868a610d80565b51015260606104878589610d80565b51015260806104968488610d80565b5101901515905260e06104a98387610d80565b5101524361010061045f8387610d80565b949593505050503d90816000823e6104d28282610b8d565b60808183810103126100ff5780519160208201519067ffffffffffffffff82116100ff57808301601f8385010112156100ff578183015161051281610bc3565b926105206040519485610b8d565b8184526020840192850160208360051b8388010101116100ff57602081860101925b60208360051b8388010101841061057a57505050509061046794939291606061056d60408401610dda565b920151929091929361043e565b8351815260209384019301610542565b919350916020806001926001600160a01b0387511681520194019201869392916103e2565b60006105bb8387610d80565b51526000806001600160a01b0360408401511660608401519082602083519301915af16105e6610daa565b5080158015610683575b6105fa5750610382565b61046793501590506106485760405161061281610b71565b600b81527f63616c6c20776f726b65640000000000000000000000000000000000000000006020820152602061045f8387610d80565b60405161065481610b71565b600b81527f63616c6c206661696c65640000000000000000000000000000000000000000006020820152610453565b506001600160a01b038251163b156105f0565b506104679150600160c061045f8387610d80565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106106e357505050500390f35b919390929450603f198682030182528451908151151581526107146020830151610120806020850152830190610d1b565b9160408101516040830152606092838201519383820390840152602080855192838152019401906000905b80821061079757505050600192602092839260808082015115159083015260a0808201519083015260c08082015115159083015260e081015160e08301526101008091015191015296019201920185949391926106d4565b9091946020806001928851815201960192019061073f565b6040519061012082019180831067ffffffffffffffff841117610818576020926040526000815260608084830152600060408301528082015260006080820152600060a0820152600060c0820152600060e0820152600061010082015282828701015201610311565b634e487b7160e01b600052604160045260246000fd5b833567ffffffffffffffff81116100ff57602091610853839260243691870101610bf7565b8152019301926102dd565b346100ff576020806003193601126100ff5760043567ffffffffffffffff81116100ff57610890903690600401610bf7565b8181018051516108b86108a282610bc3565b916108b06040519384610b8d565b808352610bc3565b81850190601f19013682376001600160a01b03908185511691604051927fe4377c6b000000000000000000000000000000000000000000000000000000008452600484015260249087848381305afa92831561010c578894600094610b39575b50600097969594505b85519789895182146109da5788998585610943858260009c9d9e511694610d80565b5116604051998a9384927fc066a5b100000000000000000000000000000000000000000000000000000000845260048401525af1801561010c578a966000916109a7575b509061099d91610997828a610d80565b52610d5b565b9796959450610921565b8781939892503d83116109d3575b6109bf8183610b8d565b810103126100ff575189959061099d610987565b503d6109b5565b86836000888c898987818451166004604051809881937faffed0e00000000000000000000000000000000000000000000000000000000083525af194851561010c57600095610b0a575b506080818451169301511690604051927fef0c7b10000000000000000000000000000000000000000000000000000000008452600484015282015285816044816000305af160009181610adb575b50610ad55750610a80610daa565b50600019915b60405194608086019186526080878701525180915260a08501939060005b818110610ac1575050508394501515604084015260608301520390f35b825186529487019491870191600101610aa4565b91610a86565b9091508681813d8311610b03575b610af38183610b8d565b810103126100ff57519087610a72565b503d610ae9565b9094508781813d8311610b32575b610b228183610b8d565b810103126100ff57519388610a24565b503d610b18565b8581969295503d8311610b6a575b610b518183610b8d565b810103126100ff57610b638894610dda565b9289610918565b503d610b47565b6040810190811067ffffffffffffffff82111761081857604052565b90601f8019910116810190811067ffffffffffffffff82111761081857604052565b35906001600160a01b03821682036100ff57565b67ffffffffffffffff81116108185760051b60200190565b67ffffffffffffffff811161081857601f01601f191660200190565b919060a0838203126100ff57604080519167ffffffffffffffff9060a08401828111858210176108185783528395610c2e81610baf565b8552602092838201358181116100ff57820183601f820112156100ff57803590610c5782610bc3565b91610c6488519384610b8d565b808352868084019160051b830101918683116100ff5787809101915b838310610d035750915050870152610c99858301610baf565b8587015260608201359081116100ff5781019382601f860112156100ff57843592610ccf610cc685610bdb565b92519283610b8d565b8382528484870101116100ff576000848460809795610cfe978997018386013783010152606086015201610baf565b910152565b8190610d0e84610baf565b8152019101908790610c80565b919082519283825260005b848110610d47575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610d26565b6000198114610d6a5760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610d945760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b3d15610dd5573d90610dbb82610bdb565b91610dc96040519384610b8d565b82523d6000602084013e565b606090565b519081151582036100ff5756fea2646970667358221220bfcaf330efff50a143fd1c85977ee736b88a6442b5a94bed03257de113f4509264736f6c63430008130033" } diff --git a/dist/contracts/compiled/AmbireFactory.json b/dist/contracts/compiled/AmbireFactory.json new file mode 100644 index 000000000..2535c7673 --- /dev/null +++ b/dist/contracts/compiled/AmbireFactory.json @@ -0,0 +1 @@ +{ "abi": [{ "inputs": [{ "internalType": "address", "name": "allowed", "type": "address" }], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [{ "indexed": false, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "salt", "type": "uint256" }], "name": "LogDeployed", "type": "event" }, { "inputs": [], "name": "allowedToDrain", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "gas", "type": "uint256" }], "name": "call", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "code", "type": "bytes" }, { "internalType": "uint256", "name": "salt", "type": "uint256" }], "name": "deploy", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "code", "type": "bytes" }, { "internalType": "uint256", "name": "salt", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "txns", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "deployAndExecute", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "code", "type": "bytes" }, { "internalType": "uint256", "name": "salt", "type": "uint256" }, { "components": [{ "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct IAmbireAccount.ExecuteArgs[]", "name": "toExec", "type": "tuple[]" }], "name": "deployAndExecuteMultiple", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x60a03461007157601f610ad338819003918201601f19168301916001600160401b038311848410176100765780849260209460405283398101031261007157516001600160a01b038116810361007157608052604051610a46908161008d823960805181818161026201526103690152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60406080815260048036101561001457600080fd5b600090813560e01c9283631ce6236f146102475783631e86da2a1461006a5750505080634e4a0c82146100655780639c4ae2d0146100605763a35aa2731461005b57600080fd5b610486565b61042f565b610324565b3461024057600319926080368501126102445767ffffffffffffffff83358181116102405761009c903690860161029b565b959060443583811161023c576100b590369088016102c9565b91909360643590811161023857916100f893916100da6100f3999a9436908c0161029b565b9590946001600160a01b039a8b93602435923691610765565b61090c565b1697883b15610234579481889a959493929a519a8b967f6171d1c90000000000000000000000000000000000000000000000000000000088528a604489019189015252606486019160648260051b8801019781938a925b8c8585106101c5575050505050505091849161017493858097030160248601526107ce565b038183865af19283156101c0576101a3936101a7575b50516001600160a01b0390911681529081906020820190565b0390f35b806101b46101ba926106f2565b8061028b565b8361018a565b610803565b610220879c6101eb600195979961020f9597999b9c9d9e606319908403018952876107ef565b92886101f685610310565b168252602094848680960135868501528281019061079c565b9190926060809282015201916107ce565b9b019301940191938d98979695939161014f565b8680fd5b8580fd5b8480fd5b8280fd5b80fd5b82346102445780600319360112610244576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261029657565b600080fd5b9181601f840112156102965782359167ffffffffffffffff8311610296576020838186019501011161029657565b9181601f840112156102965782359167ffffffffffffffff8311610296576020808501948460051b01011161029657565b600435906001600160a01b038216820361029657565b35906001600160a01b038216820361029657565b346102965760803660031901126102965761033d6102fa565b60443567ffffffffffffffff81116102965761035d90369060040161029b565b91906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036103eb576103e09183604051948593843782019060009485938385809552039160243590606435f13d156103e3573d906103c482610749565b916103d26040519384610727565b82523d84602084013e61080f565b80f35b60609061080f565b606460405162461bcd60e51b815260206004820152600f60248201527f4f4e4c595f415554484f52495a454400000000000000000000000000000000006044820152fd5b346102965760403660031901126102965760043567ffffffffffffffff8111610296576104756100f3610468602093369060040161029b565b9190602435923691610765565b6001600160a01b0360405191168152f35b346102965760603660031901126102965760043567ffffffffffffffff8111610296576104b790369060040161029b565b6044359067ffffffffffffffff8211610296576104f56001600160a01b03916104e76100f39436906004016102c9565b949095602435923691610765565b1690813b1561029657916040519283917fa2ea676600000000000000000000000000000000000000000000000000000000835281602484016020600486015252604483019060448360051b8501019281926000905b82821061059c578688600082808a038183855af19182156101c0576101a392610589575b506040516001600160a01b0390911681529081906020820190565b806101b4610596926106f2565b8261056e565b919395509193604319888203018252853590603e1986360301821215610296578186018035903603601e190181121561029657868301019167ffffffffffffffff83351161029657823560051b8036036020850113610296579260408352604083018135905260608084019484010193602082019160005b8135811061065a575050505061064860019360209361063b848b878181980101910161079c565b91858185039101526107ce565b9701920192018795949293919361054a565b909192956020806106b7600193605f198a820301885260606106a76106818d868b016107ef565b6001600160a01b0361069282610310565b1684528581013586850152604081019061079c565b91909281604082015201916107ce565b98019401929101610614565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161070657604052565b6106c3565b6080810190811067ffffffffffffffff82111761070657604052565b90601f8019910116810190811067ffffffffffffffff82111761070657604052565b67ffffffffffffffff811161070657601f01601f191660200190565b92919261077182610749565b9161077f6040519384610727565b829481845281830111610296578281602093846000960137010152565b9035601e198236030181121561029657016020813591019167ffffffffffffffff821161029657813603831361029657565b908060209392818452848401376000828201840152601f01601f1916010190565b9035605e1982360301811215610296570190565b6040513d6000823e3d90fd5b156108175750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061085d575050604492506000838284010152601f80199101168101030190fd5b848101820151868601604401529381019385935061083a565b1561087d57565b606460405162461bcd60e51b815260206004820152601060248201527f4641494c45445f4445504c4f59494e47000000000000000000000000000000006044820152fd5b156108c857565b606460405162461bcd60e51b815260206004820152600c60248201527f4641494c45445f4d4154434800000000000000000000000000000000000000006044820152fd5b908151906109936109876020850193842060405160208101917fff0000000000000000000000000000000000000000000000000000000000000083526bffffffffffffffffffffffff193060601b1660218301528560358301526055820152605581526109788161070b565b5190206001600160a01b031690565b6001600160a01b031690565b92833b156109a2575b50505090565b7fecef66cbb4d4c8dd18157def75d46290ddc298395ea46f7ff64321c1a912cbad92829151906000f56109ed6001600160a01b03808316906109e5821515610876565b8616146108c1565b604080516001600160a01b039290921682526020820192909252a138808061099c56fea26469706673582212203f6d0d5e7b17e13aaa12ca89cac3b4fadebbc2731afc8c58bd377beb4dc2e83b64736f6c63430008130033", "binRuntime": "0x60406080815260048036101561001457600080fd5b600090813560e01c9283631ce6236f146102475783631e86da2a1461006a5750505080634e4a0c82146100655780639c4ae2d0146100605763a35aa2731461005b57600080fd5b610486565b61042f565b610324565b3461024057600319926080368501126102445767ffffffffffffffff83358181116102405761009c903690860161029b565b959060443583811161023c576100b590369088016102c9565b91909360643590811161023857916100f893916100da6100f3999a9436908c0161029b565b9590946001600160a01b039a8b93602435923691610765565b61090c565b1697883b15610234579481889a959493929a519a8b967f6171d1c90000000000000000000000000000000000000000000000000000000088528a604489019189015252606486019160648260051b8801019781938a925b8c8585106101c5575050505050505091849161017493858097030160248601526107ce565b038183865af19283156101c0576101a3936101a7575b50516001600160a01b0390911681529081906020820190565b0390f35b806101b46101ba926106f2565b8061028b565b8361018a565b610803565b610220879c6101eb600195979961020f9597999b9c9d9e606319908403018952876107ef565b92886101f685610310565b168252602094848680960135868501528281019061079c565b9190926060809282015201916107ce565b9b019301940191938d98979695939161014f565b8680fd5b8580fd5b8480fd5b8280fd5b80fd5b82346102445780600319360112610244576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261029657565b600080fd5b9181601f840112156102965782359167ffffffffffffffff8311610296576020838186019501011161029657565b9181601f840112156102965782359167ffffffffffffffff8311610296576020808501948460051b01011161029657565b600435906001600160a01b038216820361029657565b35906001600160a01b038216820361029657565b346102965760803660031901126102965761033d6102fa565b60443567ffffffffffffffff81116102965761035d90369060040161029b565b91906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036103eb576103e09183604051948593843782019060009485938385809552039160243590606435f13d156103e3573d906103c482610749565b916103d26040519384610727565b82523d84602084013e61080f565b80f35b60609061080f565b606460405162461bcd60e51b815260206004820152600f60248201527f4f4e4c595f415554484f52495a454400000000000000000000000000000000006044820152fd5b346102965760403660031901126102965760043567ffffffffffffffff8111610296576104756100f3610468602093369060040161029b565b9190602435923691610765565b6001600160a01b0360405191168152f35b346102965760603660031901126102965760043567ffffffffffffffff8111610296576104b790369060040161029b565b6044359067ffffffffffffffff8211610296576104f56001600160a01b03916104e76100f39436906004016102c9565b949095602435923691610765565b1690813b1561029657916040519283917fa2ea676600000000000000000000000000000000000000000000000000000000835281602484016020600486015252604483019060448360051b8501019281926000905b82821061059c578688600082808a038183855af19182156101c0576101a392610589575b506040516001600160a01b0390911681529081906020820190565b806101b4610596926106f2565b8261056e565b919395509193604319888203018252853590603e1986360301821215610296578186018035903603601e190181121561029657868301019167ffffffffffffffff83351161029657823560051b8036036020850113610296579260408352604083018135905260608084019484010193602082019160005b8135811061065a575050505061064860019360209361063b848b878181980101910161079c565b91858185039101526107ce565b9701920192018795949293919361054a565b909192956020806106b7600193605f198a820301885260606106a76106818d868b016107ef565b6001600160a01b0361069282610310565b1684528581013586850152604081019061079c565b91909281604082015201916107ce565b98019401929101610614565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161070657604052565b6106c3565b6080810190811067ffffffffffffffff82111761070657604052565b90601f8019910116810190811067ffffffffffffffff82111761070657604052565b67ffffffffffffffff811161070657601f01601f191660200190565b92919261077182610749565b9161077f6040519384610727565b829481845281830111610296578281602093846000960137010152565b9035601e198236030181121561029657016020813591019167ffffffffffffffff821161029657813603831361029657565b908060209392818452848401376000828201840152601f01601f1916010190565b9035605e1982360301811215610296570190565b6040513d6000823e3d90fd5b156108175750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061085d575050604492506000838284010152601f80199101168101030190fd5b848101820151868601604401529381019385935061083a565b1561087d57565b606460405162461bcd60e51b815260206004820152601060248201527f4641494c45445f4445504c4f59494e47000000000000000000000000000000006044820152fd5b156108c857565b606460405162461bcd60e51b815260206004820152600c60248201527f4641494c45445f4d4154434800000000000000000000000000000000000000006044820152fd5b908151906109936109876020850193842060405160208101917fff0000000000000000000000000000000000000000000000000000000000000083526bffffffffffffffffffffffff193060601b1660218301528560358301526055820152605581526109788161070b565b5190206001600160a01b031690565b6001600160a01b031690565b92833b156109a2575b50505090565b7fecef66cbb4d4c8dd18157def75d46290ddc298395ea46f7ff64321c1a912cbad92829151906000f56109ed6001600160a01b03808316906109e5821515610876565b8616146108c1565b604080516001600160a01b039290921682526020820192909252a138808061099c56fea26469706673582212203f6d0d5e7b17e13aaa12ca89cac3b4fadebbc2731afc8c58bd377beb4dc2e83b64736f6c63430008130033" } diff --git a/dist/contracts/compiled/BalanceGetter.json b/dist/contracts/compiled/BalanceGetter.json index f1ae29a84..98a2822cf 100644 --- a/dist/contracts/compiled/BalanceGetter.json +++ b/dist/contracts/compiled/BalanceGetter.json @@ -1 +1 @@ -{ "abi": [{ "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }], "name": "getBalances", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "", "type": "tuple[]" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }], "name": "getBalancesWithInfo", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "", "type": "tuple[]" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "contract IERC20", "name": "token", "type": "address" }], "name": "getERC20TokenInfo", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo", "name": "info", "type": "tuple" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "txns", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Simulation.ToSimulate[]", "name": "toSimulate", "type": "tuple[]" }], "name": "simulate", "outputs": [{ "internalType": "uint256", "name": "startingNonce", "type": "uint256" }, { "internalType": "bool", "name": "", "type": "bool" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "txns", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Simulation.ToSimulate[]", "name": "toSimulate", "type": "tuple[]" }], "name": "simulateAndGetBalances", "outputs": [{ "components": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balances", "type": "tuple[]" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }], "internalType": "struct BalanceGetter.BalancesAtNonce", "name": "before", "type": "tuple" }, { "components": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balances", "type": "tuple[]" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }], "internalType": "struct BalanceGetter.BalancesAtNonce", "name": "afterSimulation", "type": "tuple" }, { "internalType": "bytes", "name": "", "type": "bytes" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x6080806040523461001657610fed908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80632c33eab01461039a578063581970241461035f5780636a385ae91461033057806373e4a467146102515763745a93d81461005857600080fd5b3461024d578060031936011261024d57610070610436565b91602435936001600160a01b0394858116809103610249576100906106bd565b958451957f70a0823100000000000000000000000000000000000000000000000000000000875216828601526020948581602481855afa90811561020e578491610218575b508587015283517f95d89b4100000000000000000000000000000000000000000000000000000000815283818481855afa90811561020e579086929185916101c1575b5087528451928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156101b6578092610175575b50509060ff610171921681850152519282849384528301906105fd565b0390f35b9091508382813d83116101af575b61018d81836104bb565b810103126101ac57509060ff6101a561017193610734565b9192610154565b80fd5b503d610183565b8351903d90823e3d90fd5b919250503d8085833e6101d481836104bb565b810190868183031261020a5780519067ffffffffffffffff82116102065791610200918894930161071a565b38610118565b8580fd5b8480fd5b85513d86823e3d90fd5b90508581813d8311610242575b61022f81836104bb565b8101031261023e5751386100d5565b8380fd5b503d610225565b8280fd5b5080fd5b5090346101ac5760a03660031901126101ac5761026c610436565b9067ffffffffffffffff6024358181116102495761028d9036908701610540565b9095604435926001600160a01b038416840361020a57606435818111610206576102ba90369084016104f9565b946084359182116101ac5750936102ec9361030698936102e4610314989461032198369101610540565b959094610ab9565b94939692839691965198899860a08a5260a08a019061069d565b9088820360208a015261069d565b9186830390870152610594565b91606084015260808301520390f35b503461024d576101719061034c610346366105b9565b916107fd565b9051918291602083526020830190610641565b503461024d5761038b90610375610346366105b9565b905a908051938493606085526060850190610641565b91602084015243908301520390f35b509190346101ac5760803660031901126101ac576103b6610436565b90602435926001600160a01b038416840361024d5767ffffffffffffffff60443581811161023e576103eb90369084016104f9565b926064359182116101ac5750926104179261040f6060969361017196369101610540565b939092610bf5565b9193909480519586958652151560208601528401526060830190610594565b600435906001600160a01b038216820361044c57565b600080fd5b6080810190811067ffffffffffffffff82111761046d57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761046d57604052565b6020810190811067ffffffffffffffff82111761046d57604052565b90601f8019910116810190811067ffffffffffffffff82111761046d57604052565b67ffffffffffffffff811161046d57601f01601f191660200190565b81601f8201121561044c57803590610510826104dd565b9261051e60405194856104bb565b8284526020838301011161044c57816000926020809301838601378301015290565b9181601f8401121561044c5782359167ffffffffffffffff831161044c576020808501948460051b01011161044c57565b60005b8381106105845750506000910152565b8181015183820152602001610574565b906020916105ad81518092818552858086019101610571565b601f01601f1916010190565b90604060031983011261044c576004356001600160a01b038116810361044c57916024359067ffffffffffffffff821161044c576105f991600401610540565b9091565b61063e9160606106168351608084526080840190610594565b926020810151602084015260ff60408201511660408401520151906060818403910152610594565b90565b908082519081815260208091019281808460051b8301019501936000915b84831061066f5750505050505090565b909192939495848061068d600193601f198682030187528a516105fd565b980193019301919493929061065f565b906020806106b48451604085526040850190610641565b93015191015290565b604051906106ca82610451565b6060808381815260006020820152600060408201520152565b909291926106f0816104dd565b916106fe60405193846104bb565b82948284528282011161044c576020610718930190610571565b565b9080601f8301121561044c57815161063e926020016106e3565b519060ff8216820361044c57565b67ffffffffffffffff811161046d5760051b60200190565b60001981146107695760010190565b634e487b7160e01b600052601160045260246000fd5b919081101561078f5760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361044c5790565b805182101561078f5760209160051b010190565b3d156107f8573d906107de826104dd565b916107ec60405193846104bb565b82523d6000602084013e565b606090565b909161080881610742565b92604092610818845195866104bb565b828552601f1961082784610742565b0160005b818110610a7757505060005b83811061084657505050505090565b6001600160a01b03908161086361085e83888861077f565b6107a5565b166108f1576108ec91831631865161087a8161049f565b6000815287519161088a83610451565b885161089581610483565b600381526020907f455448000000000000000000000000000000000000000000000000000000000082820152845283015260128883015260608201526108db82896107b9565b526108e681886107b9565b5061075a565b610837565b8161090061085e83888861077f565b16918651927f745a93d80000000000000000000000000000000000000000000000000000000084526004918516828501526024840152600083604481305afa806000916109c0575b6108ec94506109b4575061095a6107cd565b80519091901561097a57505b6060610972838a6107b9565b51015261075a565b8751915061098782610483565b81527f756e6b6e000000000000000000000000000000000000000000000000000000006020820152610966565b90506108db82896107b9565b919293903d8082843e6109d381846104bb565b820160209182848303126101ac57835167ffffffffffffffff9485821161024957019260808484031261024d578b5194610a0c86610451565b845181811161023e5784610a2191870161071a565b86528185015182870152610a368d8601610734565b8d8701526060948581015191821161023e57019183601f840112156101ac575091816108ec989796959493610a6d935191016106e3565b9082015290610948565b602090610a826106bd565b82828a0101520161082b565b604051906040820182811067ffffffffffffffff82111761046d576040526000602083606081520152565b9296939495610ae89196610acb610a8e565b96610ad4610a8e565b99610ae0868b896107fd565b895286610bf5565b90602097928888015215610ba3575060405163057ff68760e51b815260009680826004818b6001600160a01b038a165af1918215610b98578892610b65575b5081818a015286015103610b52575b50505060405192610b468461049f565b83525a91939291904390565b610b5b926107fd565b8452388080610b36565b9080925081813d8311610b91575b610b7d81836104bb565b81010312610b8d57519038610b27565b8780fd5b503d610b73565b6040513d8a823e3d90fd5b95505050505a91939291904390565b919081101561078f5760051b81013590605e198136030182121561044c570190565b908060209392818452848401376000828201840152601f01601f1916010190565b939291906001600160a01b0385163b15610f86575b505060405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115610f4857600091610f54575b509160005b818110610c6557505050905060405190610c5a8261049f565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b038b165af1908115610f4857600091610f16575b50610ca1828486610bb2565b3514610cb6575b610cb19061075a565b610c41565b610cc1818385610bb2565b6020810135601e19808336030182121561044c5767ffffffffffffffff828401351161044c578183013560051b36036020838501011361044c57610d06848688610bb2565b6040810135918136030182121561044c57019167ffffffffffffffff83351161044c5782353603602084011361044c576001600160a01b0388163b1561044c576040519182917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528282013590526064808401908383013560051b85010192602081840101926000915b808201358310610e305750505050509080610dcc6000936024966003198483030188850152602081359101610bd4565b0381836001600160a01b038c165af19182610e02575b5050610dfd575050509050610df56107cd565b909160009190565b610ca8565b67ffffffffffffffff8211610e1c57506040523880610de2565b634e487b7160e01b60005260416004526000fd5b919395509193606319878203018552607e198284013603018635121561044c57602082840187350101356001600160a01b038116810361044c576001600160a01b031681528535838301016040810135602083015236819003603e1901606090910135121561044c5767ffffffffffffffff602083850188350160608101350101351161044c57606086358484010190810135016020810135360360409091011361044c57606060408083018290526001926020928392610f04928201918b35898901019081013501808501359101610bd4565b97019501930190918695949392610d9c565b90506020813d602011610f40575b81610f31602093836104bb565b8101031261044c575138610c95565b3d9150610f24565b6040513d6000823e3d90fd5b90506020813d602011610f7e575b81610f6f602093836104bb565b8101031261044c575138610c3c565b3d9150610f62565b81600092918360208194519301915af1610f9e6107cd565b9015610faa5780610c0a565b925050506000916000919056fea26469706673582212205f7db1851ea6d7ea21e3bf044bfdefe8f7ae2c6e39841b15a16ba20f81506a3464736f6c63430008130033", "binRuntime": "0x6040608081526004908136101561001557600080fd5b600090813560e01c80632c33eab01461039a578063581970241461035f5780636a385ae91461033057806373e4a467146102515763745a93d81461005857600080fd5b3461024d578060031936011261024d57610070610436565b91602435936001600160a01b0394858116809103610249576100906106bd565b958451957f70a0823100000000000000000000000000000000000000000000000000000000875216828601526020948581602481855afa90811561020e578491610218575b508587015283517f95d89b4100000000000000000000000000000000000000000000000000000000815283818481855afa90811561020e579086929185916101c1575b5087528451928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156101b6578092610175575b50509060ff610171921681850152519282849384528301906105fd565b0390f35b9091508382813d83116101af575b61018d81836104bb565b810103126101ac57509060ff6101a561017193610734565b9192610154565b80fd5b503d610183565b8351903d90823e3d90fd5b919250503d8085833e6101d481836104bb565b810190868183031261020a5780519067ffffffffffffffff82116102065791610200918894930161071a565b38610118565b8580fd5b8480fd5b85513d86823e3d90fd5b90508581813d8311610242575b61022f81836104bb565b8101031261023e5751386100d5565b8380fd5b503d610225565b8280fd5b5080fd5b5090346101ac5760a03660031901126101ac5761026c610436565b9067ffffffffffffffff6024358181116102495761028d9036908701610540565b9095604435926001600160a01b038416840361020a57606435818111610206576102ba90369084016104f9565b946084359182116101ac5750936102ec9361030698936102e4610314989461032198369101610540565b959094610ab9565b94939692839691965198899860a08a5260a08a019061069d565b9088820360208a015261069d565b9186830390870152610594565b91606084015260808301520390f35b503461024d576101719061034c610346366105b9565b916107fd565b9051918291602083526020830190610641565b503461024d5761038b90610375610346366105b9565b905a908051938493606085526060850190610641565b91602084015243908301520390f35b509190346101ac5760803660031901126101ac576103b6610436565b90602435926001600160a01b038416840361024d5767ffffffffffffffff60443581811161023e576103eb90369084016104f9565b926064359182116101ac5750926104179261040f6060969361017196369101610540565b939092610bf5565b9193909480519586958652151560208601528401526060830190610594565b600435906001600160a01b038216820361044c57565b600080fd5b6080810190811067ffffffffffffffff82111761046d57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761046d57604052565b6020810190811067ffffffffffffffff82111761046d57604052565b90601f8019910116810190811067ffffffffffffffff82111761046d57604052565b67ffffffffffffffff811161046d57601f01601f191660200190565b81601f8201121561044c57803590610510826104dd565b9261051e60405194856104bb565b8284526020838301011161044c57816000926020809301838601378301015290565b9181601f8401121561044c5782359167ffffffffffffffff831161044c576020808501948460051b01011161044c57565b60005b8381106105845750506000910152565b8181015183820152602001610574565b906020916105ad81518092818552858086019101610571565b601f01601f1916010190565b90604060031983011261044c576004356001600160a01b038116810361044c57916024359067ffffffffffffffff821161044c576105f991600401610540565b9091565b61063e9160606106168351608084526080840190610594565b926020810151602084015260ff60408201511660408401520151906060818403910152610594565b90565b908082519081815260208091019281808460051b8301019501936000915b84831061066f5750505050505090565b909192939495848061068d600193601f198682030187528a516105fd565b980193019301919493929061065f565b906020806106b48451604085526040850190610641565b93015191015290565b604051906106ca82610451565b6060808381815260006020820152600060408201520152565b909291926106f0816104dd565b916106fe60405193846104bb565b82948284528282011161044c576020610718930190610571565b565b9080601f8301121561044c57815161063e926020016106e3565b519060ff8216820361044c57565b67ffffffffffffffff811161046d5760051b60200190565b60001981146107695760010190565b634e487b7160e01b600052601160045260246000fd5b919081101561078f5760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361044c5790565b805182101561078f5760209160051b010190565b3d156107f8573d906107de826104dd565b916107ec60405193846104bb565b82523d6000602084013e565b606090565b909161080881610742565b92604092610818845195866104bb565b828552601f1961082784610742565b0160005b818110610a7757505060005b83811061084657505050505090565b6001600160a01b03908161086361085e83888861077f565b6107a5565b166108f1576108ec91831631865161087a8161049f565b6000815287519161088a83610451565b885161089581610483565b600381526020907f455448000000000000000000000000000000000000000000000000000000000082820152845283015260128883015260608201526108db82896107b9565b526108e681886107b9565b5061075a565b610837565b8161090061085e83888861077f565b16918651927f745a93d80000000000000000000000000000000000000000000000000000000084526004918516828501526024840152600083604481305afa806000916109c0575b6108ec94506109b4575061095a6107cd565b80519091901561097a57505b6060610972838a6107b9565b51015261075a565b8751915061098782610483565b81527f756e6b6e000000000000000000000000000000000000000000000000000000006020820152610966565b90506108db82896107b9565b919293903d8082843e6109d381846104bb565b820160209182848303126101ac57835167ffffffffffffffff9485821161024957019260808484031261024d578b5194610a0c86610451565b845181811161023e5784610a2191870161071a565b86528185015182870152610a368d8601610734565b8d8701526060948581015191821161023e57019183601f840112156101ac575091816108ec989796959493610a6d935191016106e3565b9082015290610948565b602090610a826106bd565b82828a0101520161082b565b604051906040820182811067ffffffffffffffff82111761046d576040526000602083606081520152565b9296939495610ae89196610acb610a8e565b96610ad4610a8e565b99610ae0868b896107fd565b895286610bf5565b90602097928888015215610ba3575060405163057ff68760e51b815260009680826004818b6001600160a01b038a165af1918215610b98578892610b65575b5081818a015286015103610b52575b50505060405192610b468461049f565b83525a91939291904390565b610b5b926107fd565b8452388080610b36565b9080925081813d8311610b91575b610b7d81836104bb565b81010312610b8d57519038610b27565b8780fd5b503d610b73565b6040513d8a823e3d90fd5b95505050505a91939291904390565b919081101561078f5760051b81013590605e198136030182121561044c570190565b908060209392818452848401376000828201840152601f01601f1916010190565b939291906001600160a01b0385163b15610f86575b505060405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115610f4857600091610f54575b509160005b818110610c6557505050905060405190610c5a8261049f565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b038b165af1908115610f4857600091610f16575b50610ca1828486610bb2565b3514610cb6575b610cb19061075a565b610c41565b610cc1818385610bb2565b6020810135601e19808336030182121561044c5767ffffffffffffffff828401351161044c578183013560051b36036020838501011361044c57610d06848688610bb2565b6040810135918136030182121561044c57019167ffffffffffffffff83351161044c5782353603602084011361044c576001600160a01b0388163b1561044c576040519182917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528282013590526064808401908383013560051b85010192602081840101926000915b808201358310610e305750505050509080610dcc6000936024966003198483030188850152602081359101610bd4565b0381836001600160a01b038c165af19182610e02575b5050610dfd575050509050610df56107cd565b909160009190565b610ca8565b67ffffffffffffffff8211610e1c57506040523880610de2565b634e487b7160e01b60005260416004526000fd5b919395509193606319878203018552607e198284013603018635121561044c57602082840187350101356001600160a01b038116810361044c576001600160a01b031681528535838301016040810135602083015236819003603e1901606090910135121561044c5767ffffffffffffffff602083850188350160608101350101351161044c57606086358484010190810135016020810135360360409091011361044c57606060408083018290526001926020928392610f04928201918b35898901019081013501808501359101610bd4565b97019501930190918695949392610d9c565b90506020813d602011610f40575b81610f31602093836104bb565b8101031261044c575138610c95565b3d9150610f24565b6040513d6000823e3d90fd5b90506020813d602011610f7e575b81610f6f602093836104bb565b8101031261044c575138610c3c565b3d9150610f62565b81600092918360208194519301915af1610f9e6107cd565b9015610faa5780610c0a565b925050506000916000919056fea26469706673582212205f7db1851ea6d7ea21e3bf044bfdefe8f7ae2c6e39841b15a16ba20f81506a3464736f6c63430008130033" } +{ "abi": [{ "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }], "name": "getBalances", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "", "type": "tuple[]" }, { "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }], "name": "getBalancesWithInfo", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "", "type": "tuple[]" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balancesA", "type": "tuple[]" }, { "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balancesB", "type": "tuple[]" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }], "name": "getDelta", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "", "type": "tuple[]" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "contract IERC20", "name": "token", "type": "address" }], "name": "getERC20TokenInfo", "outputs": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo", "name": "info", "type": "tuple" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }], "name": "getSpoof", "outputs": [{ "internalType": "bytes", "name": "spoofSig", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "txns", "type": "tuple[]" }], "internalType": "struct Simulation.ToSimulate[]", "name": "toSimulate", "type": "tuple[]" }], "name": "simulate", "outputs": [{ "internalType": "uint256", "name": "startingNonce", "type": "uint256" }, { "internalType": "bool", "name": "", "type": "bool" }, { "internalType": "bytes", "name": "", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address[]", "name": "tokenAddrs", "type": "address[]" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct Transaction[]", "name": "txns", "type": "tuple[]" }], "internalType": "struct Simulation.ToSimulate[]", "name": "toSimulate", "type": "tuple[]" }], "name": "simulateAndGetBalances", "outputs": [{ "components": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balances", "type": "tuple[]" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }], "internalType": "struct BalanceGetter.BalancesAtNonce", "name": "before", "type": "tuple" }, { "components": [{ "components": [{ "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "bytes", "name": "error", "type": "bytes" }], "internalType": "struct BalanceGetter.TokenInfo[]", "name": "balances", "type": "tuple[]" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }], "internalType": "struct BalanceGetter.BalancesAtNonce", "name": "afterSimulation", "type": "tuple" }, { "internalType": "bytes", "name": "", "type": "bytes" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "address[]", "name": "", "type": "address[]" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x6080806040523461001657611866908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b6000803560e01c8063299ab72a1461051d57806358197024146104e15780636a385ae9146104aa578063745a93d8146102c6578063c52e889e1461023f578063c80aca31146101865763fd201de81461006d57600080fd5b346101735760c036600319011261017357610086610579565b9067ffffffffffffffff602435818111610182576100a7903690870161064c565b9460443582811161017e576100bf90369083016106fa565b91606435936001600160a01b038516850361017a57608435818111610176576100eb9036908401610862565b9560a435918211610173575094610157946101219461013c9a9461011961016f9a9561014a9a3691016106fa565b9690956110cb565b959389939297919599519a8b9a60c08c5260c08c0190610975565b908a820360208c0152610975565b91888303908901526106d5565b926060860152608085015283820360a08501526109dd565b0390f35b80fd5b8680fd5b8580fd5b8380fd5b8280fd5b508290346101735760a0366003190112610173576101a2610579565b9067ffffffffffffffff602435818111610182576101c3903690860161064c565b93604435916001600160a01b038316830361017e5760643581811161023b576101ef9036908401610862565b936084359182116101735750926060959261021461016f969361021c963691016106fa565b949093611203565b91939094805195869586521515602086015284015260608301906106d5565b8480fd5b5091346101825760603660031901126101825767ffffffffffffffff90803582811161023b57610272903690830161087d565b9160243581811161017a5761028a903690840161087d565b946044359182116101735750916102ab61016f95926102b3943691016106fa565b929091610de3565b90519182916020835260208301906107b3565b5090346104a657806003193601126104a6576102e0610579565b91602435936001600160a01b039485811680910361018257610300610a1a565b958451957f70a0823100000000000000000000000000000000000000000000000000000000875216828601526020948581602481855afa90811561046f578491610479575b508587015283517f95d89b4100000000000000000000000000000000000000000000000000000000815283818481855afa90811561046f5790869291859161042a575b5087528451928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa91821561041f5780926103e1575b50509060ff61016f9216818501525192828493845283019061076f565b9091508382813d8311610418575b6103f98183610612565b8101031261017357509060ff61041161016f93610a82565b91926103c4565b503d6103ef565b8351903d90823e3d90fd5b919250503d8085833e61043d8183610612565b810190868183031261023b5780519067ffffffffffffffff821161017a57916104699188949301610a40565b38610388565b85513d86823e3d90fd5b90508581813d831161049f575b6104908183610612565b8101031261017e575138610345565b503d610486565b5080fd5b503461017357506104c36104bd3661072b565b91610b83565b82518381529283926104d7918401906107b3565b9060208301520390f35b5090346104a657610510906104f86104bd3661072b565b9190915a9180519485946060865260608601906107b3565b9260208501528301520390f35b509134610182578160031936011261018257610537610579565b926024359067ffffffffffffffff82116101735750926105606105669261016f9536910161064c565b90611675565b90519182916020835260208301906106d5565b600435906001600160a01b038216820361058f57565b600080fd5b35906001600160a01b038216820361058f57565b6080810190811067ffffffffffffffff8211176105c457604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff8211176105c457604052565b6020810190811067ffffffffffffffff8211176105c457604052565b90601f8019910116810190811067ffffffffffffffff8211176105c457604052565b67ffffffffffffffff81116105c45760051b60200190565b81601f8201121561058f5780359161066383610634565b926106716040519485610612565b808452602092838086019260051b82010192831161058f578301905b82821061069b575050505090565b8380916106a784610594565b81520191019061068d565b60005b8381106106c55750506000910152565b81810151838201526020016106b5565b906020916106ee815180928185528580860191016106b2565b601f01601f1916010190565b9181601f8401121561058f5782359167ffffffffffffffff831161058f576020808501948460051b01011161058f57565b90604060031983011261058f576004356001600160a01b038116810361058f57916024359067ffffffffffffffff821161058f5761076b916004016106fa565b9091565b6107b091606061078883516080845260808401906106d5565b926020810151602084015260ff604082015116604084015201519060608184039101526106d5565b90565b908082519081815260208091019281808460051b8301019501936000915b8483106107e15750505050505090565b90919293949584806107ff600193601f198682030187528a5161076f565b98019301930191949392906107d1565b67ffffffffffffffff81116105c457601f01601f191660200190565b9291926108378261080f565b916108456040519384610612565b82948184528183011161058f578281602093846000960137010152565b9080601f8301121561058f578160206107b09335910161082b565b9080601f8301121561058f57813561089481610634565b926040916108a483519586610612565b808552602093848087019260051b8401019381851161058f57858401925b8584106108d3575050505050505090565b67ffffffffffffffff843581811161058f57860191608080601f19858803011261058f57845190610903826105a8565b8a85013584811161058f57850187603f8201121561058f578781888e61092c940135910161082b565b8252858501358b8301526060908186013560ff8116810361058f578784015285013593841161058f57610966878c80979681970101610862565b908201528152019301926108c2565b9060408101918051906040835281518094526060830160608560051b850101946020809401916000905b8282106109b3575050505081015191015290565b9091929685806109cf600193605f198b82030186528b5161076f565b99019201920190929161099f565b90815180825260208080930193019160005b8281106109fd575050505090565b83516001600160a01b0316855293810193928101926001016109ef565b60405190610a27826105a8565b6060808381815260006020820152600060408201520152565b81601f8201121561058f578051610a568161080f565b92610a646040519485610612565b8184526020828401011161058f576107b091602080850191016106b2565b519060ff8216820361058f57565b90610a9a82610634565b610aa76040519182610612565b8281528092610ab8601f1991610634565b019060005b828110610ac957505050565b602090610ad4610a1a565b82828501015201610abd565b6000198114610aef5760010190565b634e487b7160e01b600052601160045260246000fd5b9190811015610b155760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361058f5790565b8051821015610b155760209160051b010190565b3d15610b7e573d90610b648261080f565b91610b726040519384610612565b82523d6000602084013e565b606090565b929190610b8f82610a90565b916000945b818610610ba657505050909150904390565b6001600160a01b039586610bc3610bbe838688610b05565b610b2b565b16610c5d57819293949596610c5392163160406012815191610be4836105f6565b60008352805193610bf4856105a8565b8151610bff816105da565b600381526020907f45544800000000000000000000000000000000000000000000000000000000008282015286528501528301526060820152610c428288610b3f565b52610c4d8187610b3f565b50610ae0565b9493929190610b94565b86610c6c610bbe838688610b05565b16966040908151987f745a93d8000000000000000000000000000000000000000000000000000000008a526004918516828b015260248a0152600089604481305afa60009981610d3a575b5098610c5394959697989915600014610d2d5750610cd3610b53565b805190929015610cf45750505b6060610cec8389610b3f565b510152610ae0565b519150610d00826105da565b81527f756e6b6e000000000000000000000000000000000000000000000000000000006020820152610ce0565b915050610c428288610b3f565b3d808c833e610d498183610612565b81019a818c602093849103126104a657805167ffffffffffffffff9182821161017e57016080818f031261018257865193610d83856105a8565b815183811161023b578f610d98918401610a40565b85528082015190850152610dad878201610a82565b878501526060928382015192831161017357509c610dd491610c53999a9b9c9d9e01610a40565b90820152999897969594610cb7565b93929192600092835b8651811015610e3c57602080610e02838a610b3f565b51015190610e108387610b3f565b51015103610e27575b610e2290610ae0565b610dec565b93610e34610e2291610ae0565b949050610e19565b5092909391610e4a82610a90565b91610e6d610e5782610634565b91610e656040519384610612565b808352610634565b60209180830191601f1901368337519067ffffffffffffffff82116105c4576801000000000000000082116105c45760005482600055808310610fe8575b506000805260005b828110610fad57505050600096875b8151811015610fa25782610ed68284610b3f565b51015183610ee48387610b3f565b51015103610efb575b610ef690610ae0565b610ec2565b97610f068985610b3f565b51610f118287610b3f565b52610f1c8186610b3f565b50610f2b610bbe8a8989610b05565b600054821015610b1557610ef691610f9a91600080526001600160a01b03827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ae0565b989050610eed565b509296505050505050565b81516001600160a01b03167f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56382015590830190600101610eb3565b827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56391820191015b81811061101d5750610eab565b60008155600101611010565b604051906040820182811067ffffffffffffffff8211176105c4576040526000602083606081520152565b604051906000548083528260209182820190600080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563936000905b8282106110a8575050506110a692500383610612565b565b85546001600160a01b031684526001958601958895509381019390910190611090565b93956110fb92979198956110dd611029565b976110e6611029565b9a6110f2878c8a610b83565b508a5287611203565b906020979288880152156111cc575060405163057ff68760e51b815260009680826004818b6001600160a01b038a165af19182156111c157889261118e575b5081818a01528601510361116b575b50505060405192611159846105f6565b83525a919392919043906107b0611054565b611179828261118495610b83565b508088528551610de3565b8452388080611149565b9080925081813d83116111ba575b6111a68183610612565b810103126111b65751903861113a565b8780fd5b503d61119c565b6040513d8a823e3d90fd5b95505050505a919392919043906107b0611054565b9190811015610b155760051b81013590603e198136030182121561058f570190565b91939290936001600160a01b0383163b15611643575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af190811561160557600091611611575b509360005b81811061127457505050505060405190611269826105f6565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115611605576000916115d3575b506112b08284876111e1565b35146112c5575b6112c090610ae0565b611250565b6040517f299ab72a0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526040602482015260008180611312604482018a6109dd565b038183305af160009181611592575b5061133c57505050505050611334610b53565b909160009190565b6113478284876111e1565b602081013591601e198236030183121561058f5767ffffffffffffffff838301351161058f578282013560051b36036020848401011361058f576001600160a01b0386163b1561058f5790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064808401908284013560051b85010192602083820101926000905b80830135821061145657505050505061141182916000946003198483030160248501526106d5565b0381836001600160a01b0389165af1908161143e575b50611439575050505050611334610b53565b6112b7565b67ffffffffffffffff81116105c45760405238611427565b91939695509193606319888203018552607e198285013603018735121561058f576001600160a01b0361149060208487018a350101610594565b1681528635848301016040810135602083015236819003603e1901606090910135121561058f5767ffffffffffffffff602083860189350160608101350101351161058f57606087358584010190810135016020810135360360409091011361058f576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f191601919091019791019591019390929101906113e9565b9091503d806000833e6115a58183610612565b810160208282031261058f57815167ffffffffffffffff811161058f576115cc9201610a40565b9038611321565b90506020813d6020116115fd575b816115ee60209383610612565b8101031261058f5751386112a4565b3d91506115e1565b6040513d6000823e3d90fd5b90506020813d60201161163b575b8161162c60209383610612565b8101031261058f57513861124b565b3d915061161f565b81600092918360208194519301915af161165b610b53565b90156116675780611219565b935050505060009160009190565b906060918151156117ec5760005b825181146117a8576001600160a01b038061169e8386610b3f565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af190811561179d57600091611770575b5061170a57505050505061170590610ae0565b611683565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff84118585101761175d5750505290565b604190634e487b7160e01b600052526000fd5b908682813d8311611796575b6117868183610612565b81010312610173575051386116f2565b503d61177c565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea2646970667358221220894f3ed44f0335f4389d0277d74a3f48226e56c74df0c300b08734ab2f5395ec64736f6c63430008130033", "binRuntime": "0x6040608081526004908136101561001557600080fd5b6000803560e01c8063299ab72a1461051d57806358197024146104e15780636a385ae9146104aa578063745a93d8146102c6578063c52e889e1461023f578063c80aca31146101865763fd201de81461006d57600080fd5b346101735760c036600319011261017357610086610579565b9067ffffffffffffffff602435818111610182576100a7903690870161064c565b9460443582811161017e576100bf90369083016106fa565b91606435936001600160a01b038516850361017a57608435818111610176576100eb9036908401610862565b9560a435918211610173575094610157946101219461013c9a9461011961016f9a9561014a9a3691016106fa565b9690956110cb565b959389939297919599519a8b9a60c08c5260c08c0190610975565b908a820360208c0152610975565b91888303908901526106d5565b926060860152608085015283820360a08501526109dd565b0390f35b80fd5b8680fd5b8580fd5b8380fd5b8280fd5b508290346101735760a0366003190112610173576101a2610579565b9067ffffffffffffffff602435818111610182576101c3903690860161064c565b93604435916001600160a01b038316830361017e5760643581811161023b576101ef9036908401610862565b936084359182116101735750926060959261021461016f969361021c963691016106fa565b949093611203565b91939094805195869586521515602086015284015260608301906106d5565b8480fd5b5091346101825760603660031901126101825767ffffffffffffffff90803582811161023b57610272903690830161087d565b9160243581811161017a5761028a903690840161087d565b946044359182116101735750916102ab61016f95926102b3943691016106fa565b929091610de3565b90519182916020835260208301906107b3565b5090346104a657806003193601126104a6576102e0610579565b91602435936001600160a01b039485811680910361018257610300610a1a565b958451957f70a0823100000000000000000000000000000000000000000000000000000000875216828601526020948581602481855afa90811561046f578491610479575b508587015283517f95d89b4100000000000000000000000000000000000000000000000000000000815283818481855afa90811561046f5790869291859161042a575b5087528451928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa91821561041f5780926103e1575b50509060ff61016f9216818501525192828493845283019061076f565b9091508382813d8311610418575b6103f98183610612565b8101031261017357509060ff61041161016f93610a82565b91926103c4565b503d6103ef565b8351903d90823e3d90fd5b919250503d8085833e61043d8183610612565b810190868183031261023b5780519067ffffffffffffffff821161017a57916104699188949301610a40565b38610388565b85513d86823e3d90fd5b90508581813d831161049f575b6104908183610612565b8101031261017e575138610345565b503d610486565b5080fd5b503461017357506104c36104bd3661072b565b91610b83565b82518381529283926104d7918401906107b3565b9060208301520390f35b5090346104a657610510906104f86104bd3661072b565b9190915a9180519485946060865260608601906107b3565b9260208501528301520390f35b509134610182578160031936011261018257610537610579565b926024359067ffffffffffffffff82116101735750926105606105669261016f9536910161064c565b90611675565b90519182916020835260208301906106d5565b600435906001600160a01b038216820361058f57565b600080fd5b35906001600160a01b038216820361058f57565b6080810190811067ffffffffffffffff8211176105c457604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff8211176105c457604052565b6020810190811067ffffffffffffffff8211176105c457604052565b90601f8019910116810190811067ffffffffffffffff8211176105c457604052565b67ffffffffffffffff81116105c45760051b60200190565b81601f8201121561058f5780359161066383610634565b926106716040519485610612565b808452602092838086019260051b82010192831161058f578301905b82821061069b575050505090565b8380916106a784610594565b81520191019061068d565b60005b8381106106c55750506000910152565b81810151838201526020016106b5565b906020916106ee815180928185528580860191016106b2565b601f01601f1916010190565b9181601f8401121561058f5782359167ffffffffffffffff831161058f576020808501948460051b01011161058f57565b90604060031983011261058f576004356001600160a01b038116810361058f57916024359067ffffffffffffffff821161058f5761076b916004016106fa565b9091565b6107b091606061078883516080845260808401906106d5565b926020810151602084015260ff604082015116604084015201519060608184039101526106d5565b90565b908082519081815260208091019281808460051b8301019501936000915b8483106107e15750505050505090565b90919293949584806107ff600193601f198682030187528a5161076f565b98019301930191949392906107d1565b67ffffffffffffffff81116105c457601f01601f191660200190565b9291926108378261080f565b916108456040519384610612565b82948184528183011161058f578281602093846000960137010152565b9080601f8301121561058f578160206107b09335910161082b565b9080601f8301121561058f57813561089481610634565b926040916108a483519586610612565b808552602093848087019260051b8401019381851161058f57858401925b8584106108d3575050505050505090565b67ffffffffffffffff843581811161058f57860191608080601f19858803011261058f57845190610903826105a8565b8a85013584811161058f57850187603f8201121561058f578781888e61092c940135910161082b565b8252858501358b8301526060908186013560ff8116810361058f578784015285013593841161058f57610966878c80979681970101610862565b908201528152019301926108c2565b9060408101918051906040835281518094526060830160608560051b850101946020809401916000905b8282106109b3575050505081015191015290565b9091929685806109cf600193605f198b82030186528b5161076f565b99019201920190929161099f565b90815180825260208080930193019160005b8281106109fd575050505090565b83516001600160a01b0316855293810193928101926001016109ef565b60405190610a27826105a8565b6060808381815260006020820152600060408201520152565b81601f8201121561058f578051610a568161080f565b92610a646040519485610612565b8184526020828401011161058f576107b091602080850191016106b2565b519060ff8216820361058f57565b90610a9a82610634565b610aa76040519182610612565b8281528092610ab8601f1991610634565b019060005b828110610ac957505050565b602090610ad4610a1a565b82828501015201610abd565b6000198114610aef5760010190565b634e487b7160e01b600052601160045260246000fd5b9190811015610b155760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361058f5790565b8051821015610b155760209160051b010190565b3d15610b7e573d90610b648261080f565b91610b726040519384610612565b82523d6000602084013e565b606090565b929190610b8f82610a90565b916000945b818610610ba657505050909150904390565b6001600160a01b039586610bc3610bbe838688610b05565b610b2b565b16610c5d57819293949596610c5392163160406012815191610be4836105f6565b60008352805193610bf4856105a8565b8151610bff816105da565b600381526020907f45544800000000000000000000000000000000000000000000000000000000008282015286528501528301526060820152610c428288610b3f565b52610c4d8187610b3f565b50610ae0565b9493929190610b94565b86610c6c610bbe838688610b05565b16966040908151987f745a93d8000000000000000000000000000000000000000000000000000000008a526004918516828b015260248a0152600089604481305afa60009981610d3a575b5098610c5394959697989915600014610d2d5750610cd3610b53565b805190929015610cf45750505b6060610cec8389610b3f565b510152610ae0565b519150610d00826105da565b81527f756e6b6e000000000000000000000000000000000000000000000000000000006020820152610ce0565b915050610c428288610b3f565b3d808c833e610d498183610612565b81019a818c602093849103126104a657805167ffffffffffffffff9182821161017e57016080818f031261018257865193610d83856105a8565b815183811161023b578f610d98918401610a40565b85528082015190850152610dad878201610a82565b878501526060928382015192831161017357509c610dd491610c53999a9b9c9d9e01610a40565b90820152999897969594610cb7565b93929192600092835b8651811015610e3c57602080610e02838a610b3f565b51015190610e108387610b3f565b51015103610e27575b610e2290610ae0565b610dec565b93610e34610e2291610ae0565b949050610e19565b5092909391610e4a82610a90565b91610e6d610e5782610634565b91610e656040519384610612565b808352610634565b60209180830191601f1901368337519067ffffffffffffffff82116105c4576801000000000000000082116105c45760005482600055808310610fe8575b506000805260005b828110610fad57505050600096875b8151811015610fa25782610ed68284610b3f565b51015183610ee48387610b3f565b51015103610efb575b610ef690610ae0565b610ec2565b97610f068985610b3f565b51610f118287610b3f565b52610f1c8186610b3f565b50610f2b610bbe8a8989610b05565b600054821015610b1557610ef691610f9a91600080526001600160a01b03827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ae0565b989050610eed565b509296505050505050565b81516001600160a01b03167f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56382015590830190600101610eb3565b827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56391820191015b81811061101d5750610eab565b60008155600101611010565b604051906040820182811067ffffffffffffffff8211176105c4576040526000602083606081520152565b604051906000548083528260209182820190600080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563936000905b8282106110a8575050506110a692500383610612565b565b85546001600160a01b031684526001958601958895509381019390910190611090565b93956110fb92979198956110dd611029565b976110e6611029565b9a6110f2878c8a610b83565b508a5287611203565b906020979288880152156111cc575060405163057ff68760e51b815260009680826004818b6001600160a01b038a165af19182156111c157889261118e575b5081818a01528601510361116b575b50505060405192611159846105f6565b83525a919392919043906107b0611054565b611179828261118495610b83565b508088528551610de3565b8452388080611149565b9080925081813d83116111ba575b6111a68183610612565b810103126111b65751903861113a565b8780fd5b503d61119c565b6040513d8a823e3d90fd5b95505050505a919392919043906107b0611054565b9190811015610b155760051b81013590603e198136030182121561058f570190565b91939290936001600160a01b0383163b15611643575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af190811561160557600091611611575b509360005b81811061127457505050505060405190611269826105f6565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115611605576000916115d3575b506112b08284876111e1565b35146112c5575b6112c090610ae0565b611250565b6040517f299ab72a0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526040602482015260008180611312604482018a6109dd565b038183305af160009181611592575b5061133c57505050505050611334610b53565b909160009190565b6113478284876111e1565b602081013591601e198236030183121561058f5767ffffffffffffffff838301351161058f578282013560051b36036020848401011361058f576001600160a01b0386163b1561058f5790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064808401908284013560051b85010192602083820101926000905b80830135821061145657505050505061141182916000946003198483030160248501526106d5565b0381836001600160a01b0389165af1908161143e575b50611439575050505050611334610b53565b6112b7565b67ffffffffffffffff81116105c45760405238611427565b91939695509193606319888203018552607e198285013603018735121561058f576001600160a01b0361149060208487018a350101610594565b1681528635848301016040810135602083015236819003603e1901606090910135121561058f5767ffffffffffffffff602083860189350160608101350101351161058f57606087358584010190810135016020810135360360409091011361058f576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f191601919091019791019591019390929101906113e9565b9091503d806000833e6115a58183610612565b810160208282031261058f57815167ffffffffffffffff811161058f576115cc9201610a40565b9038611321565b90506020813d6020116115fd575b816115ee60209383610612565b8101031261058f5751386112a4565b3d91506115e1565b6040513d6000823e3d90fd5b90506020813d60201161163b575b8161162c60209383610612565b8101031261058f57513861124b565b3d915061161f565b81600092918360208194519301915af161165b610b53565b90156116675780611219565b935050505060009160009190565b906060918151156117ec5760005b825181146117a8576001600160a01b038061169e8386610b3f565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af190811561179d57600091611770575b5061170a57505050505061170590610ae0565b611683565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff84118585101761175d5750505290565b604190634e487b7160e01b600052526000fd5b908682813d8311611796575b6117868183610612565b81010312610173575051386116f2565b503d61177c565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea2646970667358221220894f3ed44f0335f4389d0277d74a3f48226e56c74df0c300b08734ab2f5395ec64736f6c63430008130033" } diff --git a/dist/contracts/compiled/DeFiAAVEPosition.json b/dist/contracts/compiled/DeFiAAVEPosition.json new file mode 100644 index 000000000..212abedaf --- /dev/null +++ b/dist/contracts/compiled/DeFiAAVEPosition.json @@ -0,0 +1 @@ +{ "abi": [{ "inputs": [{ "internalType": "address", "name": "userAddr", "type": "address" }, { "internalType": "address", "name": "poolAddr", "type": "address" }, { "internalType": "uint256", "name": "from", "type": "uint256" }, { "internalType": "uint256", "name": "to", "type": "uint256" }], "name": "getAAVEPosition", "outputs": [{ "components": [{ "components": [{ "internalType": "address", "name": "addr", "type": "address" }, { "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint8", "name": "decimals", "type": "uint8" }, { "internalType": "uint256", "name": "price", "type": "uint256" }, { "internalType": "uint256", "name": "borrowAssetBalance", "type": "uint256" }, { "internalType": "uint256", "name": "stableBorrowAssetBalance", "type": "uint256" }, { "internalType": "uint128", "name": "currentLiquidityRate", "type": "uint128" }, { "internalType": "uint128", "name": "currentVariableBorrowRate", "type": "uint128" }, { "internalType": "uint128", "name": "currentStableBorrowRate", "type": "uint128" }, { "internalType": "address", "name": "aaveAddr", "type": "address" }, { "internalType": "string", "name": "aaveSymbol", "type": "string" }, { "internalType": "uint8", "name": "aaveDecimals", "type": "uint8" }, { "internalType": "address", "name": "aaveSDebtAddr", "type": "address" }, { "internalType": "string", "name": "aaveSDebtSymbol", "type": "string" }, { "internalType": "uint8", "name": "aaveSDebtDecimals", "type": "uint8" }, { "internalType": "address", "name": "aaveVDebtAddr", "type": "address" }, { "internalType": "string", "name": "aaveVDebtSymbol", "type": "string" }, { "internalType": "uint8", "name": "aaveVDebtDecimals", "type": "uint8" }], "internalType": "struct TokenFromBalance[]", "name": "userBalance", "type": "tuple[]" }, { "components": [{ "internalType": "uint256", "name": "totalCollateralBase", "type": "uint256" }, { "internalType": "uint256", "name": "totalDebtBase", "type": "uint256" }, { "internalType": "uint256", "name": "availableBorrowsBase", "type": "uint256" }, { "internalType": "uint256", "name": "currentLiquidationThreshold", "type": "uint256" }, { "internalType": "uint256", "name": "ltv", "type": "uint256" }, { "internalType": "uint256", "name": "healthFactor", "type": "uint256" }], "internalType": "struct UserAccountData", "name": "accountData", "type": "tuple" }, { "internalType": "bytes", "name": "userBalanceErr", "type": "bytes" }, { "internalType": "bytes", "name": "accountDataErr", "type": "bytes" }], "internalType": "struct AAVEUserBalance", "name": "result", "type": "tuple" }], "stateMutability": "view", "type": "function" }], "bin": "0x6080806040523461008557611c708181016001600160401b0381118382101761006f578291610999833903906000f0801561006357600080546001600160a01b0319166001600160a01b039290921691909117905560405161090e908161008b8239f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe600436101561000d57600080fd5b60003560e01c6362ca03ea1461002257600080fd5b34610438576080366003190112610438576004356001600160a01b038116810361043857602435906001600160a01b038216820361043857610100604052606060805260405161007181610806565b6000815260006020820152600060408201526000606082015260006080820152600060a08201526020608001526060604060800152606080608001526001600160a01b03600054166040517fd0a79a8a0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526001600160a01b038416602482015260443560448201526064356064820152600081608481855afa801561043d57600091600091610449575b5060e0526080526040517ff54476490000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152929091166024830152600090829060449082905afa801561043d576000916000916103a9575b5060e05260a052604051602080825260805161012082840152805161014084018190529101908290610160600582901b83018101919060009084015b8282106102475784806102438660a0602060800151805160408601526020810151606086015260408101516080860152606081015182860152608081015160c0860152015160e084015261022e60406080015191601f199283868303016101008701526107e1565b60e051848203909201610120850152906107e1565b0390f35b9193509160208060019261015f198982030185528751906001600160a01b0382511681526102828383015161026080868501528301906107e1565b916040810151604083015261038d61035861032360ff958660608601511660608701526080850151608087015260a085015160a087015260c080860151908701526fffffffffffffffffffffffffffffffff8060e08701511660e088015261010081818801511690880152610120860151166101208701526001600160a01b03610140860151166101408701526101608501518682036101608801526107e1565b610180868186015116908601526101a06001600160a01b038186015116908601526101c08085015190868303908701526107e1565b6101e0858185015116908501526102006001600160a01b038185015116908501526102208084015190858303908601526107e1565b92610240809201511691015296019201920185939194926101c6565b9150503d806000833e6103bc8183610822565b81019080820360e081126104385760c01361043857604051916103de83610806565b815183526020820151602084015260408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015167ffffffffffffffff8111610438576104329201610858565b3861018a565b600080fd5b6040513d6000823e3d90fd5b929150503d92836000843e61045e8484610822565b60408385810103126104385782519167ffffffffffffffff831161043857848401601f84860101121561043857828401519267ffffffffffffffff841161078f578360051b90604051946104b56020840187610822565b855260208501878701602084848a0101011161043857602082880101905b602084848a0101018210610520575050505060208401519267ffffffffffffffff841161043857610515856044956000986001600160a01b0398019101610858565b929550925092610127565b81519067ffffffffffffffff82116104385761026089850183018b8b0103601f19011261043857604051918261026081011067ffffffffffffffff6102608501111761078f57610260830160405261057e602082878d010101610844565b8352604081868c010101519167ffffffffffffffff831161043857859360a083868f8f90829860206105b99284019186868601010101610858565b60208601528082018301606081015160408701526105d9906080016108ad565b6060860152010101516080820152838c01830160c08181015160a084015260e082015190830152849061010090610641908f906106179084016108bb565b60e08601526101209261062f848987850101016108bb565b908601526101409301860183016108bb565b908301526106588d85610160978892010101610844565b908201528b83610180968792010101519367ffffffffffffffff85116104385787956106ab8f8f90936106998a9960208b978501918b898701010101610858565b908601526101a09301860183016108ad565b908301526106c28d856101c0978892010101610844565b908201528b836101e0968792010101519367ffffffffffffffff85116104385787956107158f8f90936107038a9960208b978501918b898701010101610858565b908601526102009301860183016108ad565b9083015261072c8d85610220988992010101610844565b908201528b83610240958692010101519367ffffffffffffffff85116104385761077e6102608f958f8060209a6107728c9b8f948d9c8d91019187878701010101610858565b908801520101016108ad565b9082015281520192019190506104d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381106107d15750506000910152565b81810151838201526020016107c1565b906020916107fa815180928185528580860191016107be565b601f01601f1916010190565b60c0810190811067ffffffffffffffff82111761078f57604052565b90601f8019910116810190811067ffffffffffffffff82111761078f57604052565b51906001600160a01b038216820361043857565b81601f8201121561043857805167ffffffffffffffff811161078f576040519261088c601f8301601f191660200185610822565b81845260208284010111610438576108aa91602080850191016107be565b90565b519060ff8216820361043857565b51906fffffffffffffffffffffffffffffffff821682036104385756fea264697066735822122032ac77b3a4232b89621957a684ca03b9b790ec4bed9b79b4ff6203adbc9e139064736f6c63430008130033608080604052346100855761043e8181016001600160401b0381118382101761006f578291611832833903906000f0801561006357600080546001600160a01b0319166001600160a01b03929092169190911790556040516117a7908161008b8239f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe604060808152600436101561001357600080fd5b600060e08135811c8063d0a79a8a146101cc5763f54476491461003557600080fd5b346101c857826003193601126101c85761004d61039a565b6100556103b5565b84519061006182610413565b8482526020928584840152858784015260c060609287848601528760a06080968288820152015260248951809481937fbf92857c0000000000000000000000000000000000000000000000000000000083526001600160a01b038092166004840152165afa80156101be578690610152575b9694939291905060a08551978896815188528582015186890152808201519088015282810151838801528381015184880152015160a08601528360c0860152518093850152845b83811061013c5750505061010092838284010152601f80199101168101030190f35b818101518782016101000152869450820161011a565b5060c0813d82116101b6575b8161016b60c09383610461565b810103126101b25760a0908188519161018383610413565b805183528681015187840152898101518a840152848101518584015285810151868401520151828201526100d3565b8580fd5b3d915061015e565b87513d88823e3d90fd5b5080fd5b50346101c857608080600319360112610396579291906102036101ed61039a565b6101f56103b5565b90606435916044359161060b565b929091845194808601918187528451809352606080880191818560051b8a010199602080980196945b86861061024a578a8c03898c01528a806102468e8d6103ee565b0390f35b909192939495969a8880866001938f8f605f19908303018b52516103786001600160a01b0380835116845261034961031b61029288860151610260808b8a01528801906103ee565b8b8601518c88015260ff97888188015116908801528c8601518d88015260a0808701519088015260c080870151908801528d6fffffffffffffffffffffffffffffffff90818189015116908901526101008181890151169089015261012090818801511690880152610140848188015116908801526101608087015190888303908901526103ee565b610180878187015116908701526101a0838187015116908701526101c08086015190878303908801526103ee565b906101e086818601511690860152610200908185015116908501526102208084015190858303908601526103ee565b9261024080920151169101529d01960196019496959392919061022c565b8280fd5b600435906001600160a01b03821682036103b057565b600080fd5b602435906001600160a01b03821682036103b057565b60005b8381106103de5750506000910152565b81810151838201526020016103ce565b90602091610407815180928185528580860191016103cb565b601f01601f1916010190565b60c0810190811067ffffffffffffffff82111761042f57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761042f57604052565b90601f8019910116810190811067ffffffffffffffff82111761042f57604052565b67ffffffffffffffff811161042f5760051b60200190565b51906001600160a01b03821682036103b057565b60405190610260820182811067ffffffffffffffff82111761042f5760405281610240600091828152606060208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152606061016082015282610180820152826101a082015260606101c0820152826101e08201528261020082015260606102208201520152565b600019811461055f5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156105895760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b91908260209103126103b0576040516020810181811067ffffffffffffffff82111761042f5760405291518252565b51906fffffffffffffffffffffffffffffffff821682036103b057565b519064ffffffffff821682036103b057565b519060ff821682036103b057565b6040517fd1946dbc0000000000000000000000000000000000000000000000000000000081526060959460009493909290600186846004816001600160a01b0386165afa9384156114b057879461140d575b5086906106686114bb565b916001600160a01b03895416926040517fe55afdd00000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602081602481885afa8b91816113cd575b506113b757506106c96114f8565b60408201528960208201525b60208101516113a35750602460206106eb6114bb565b94604051928380927f221d21480000000000000000000000000000000000000000000000000000000082526001600160a01b038a1660048301525afa8a9181611363575b5061134d575061073d6114f8565b60408401528860208401525b60208301511561133d575050516001600160a01b0316905b60005b845180881161130f57808711611307575b508686039786891161055f5761078a89610483565b986107986040519a8b610461565b808a526107a7601f1991610483565b0160005b8181106112ef5750506112e45760206001600160a01b03936004604051809681937ffca513a8000000000000000000000000000000000000000000000000000000008352165afa928315610b65576000936112a8575b5060005b8688106108185750505050505050509190565b8115610dc3576001600160a01b036108308988610575565b5116604051906335ea6a7560e01b825260048201526101e0816024816001600160a01b0388165afa908115610b6557600091610c4c575b506001600160a01b0361087a8a89610575565b5116906040519163b3596f0760e01b835260048301526020826024816001600160a01b038a165afa918215610b6557600092610c18575b506108ba6104af565b916001600160a01b036108cd8c8b610575565b511683526001600160a01b036101008301511660206001600160a01b0360248b60405194859384926370a0823160e01b84521660048301525afa908115610b65578c91858c92600092610bdd575b50836109476001600160a01b0361094060049760209783976040610951980152610575565b5116611528565b848901528d610575565b51166040519283809263313ce56760e01b82525afa8015610b6557600090610ba3575b60ff91501660608401526080830152602460206001600160a01b0361014084015116604051928380926370a0823160e01b82526001600160a01b038d1660048301525afa908115610b6557600091610b71575b5060a0830152602460206001600160a01b0361012084015116604051928380926370a0823160e01b82526001600160a01b038d1660048301525afa908115610b6557600091610b2f575b509160ff610b016001600160a01b03610140610b299795610b239760c08701526fffffffffffffffffffffffffffffffff8060408301511660e08801528060808301511661010088015260a082015116610120870152826101008201511682870152610a838361010083015116611528565b61016087015284610a9a84610100840151166116a2565b166101808701526101208101805184166101a088015251610abc908416611528565b6101c087015284610ad384610120840151166116a2565b166101e08701528082018051841661020088015251610af3908416611528565b6102208701520151166116a2565b16610240820152610b12828d610575565b52610b1d818c610575565b50610550565b97610550565b96610805565b906020823d602011610b5d575b81610b4960209383610461565b81010312610b5a57505160ff610a11565b80fd5b3d9150610b3c565b6040513d6000823e3d90fd5b906020823d602011610b9b575b81610b8b60209383610461565b81010312610b5a575051386109c7565b3d9150610b7e565b6020823d602011610bd5575b81610bbc60209383610461565b81010312610b5a5750610bd060ff916105fd565b610974565b3d9150610baf565b93505090506020823d602011610c10575b81610bfb60209383610461565b81010312610b5a5750518b908a90858361091b565b3d9150610bee565b90916020823d602011610c44575b81610c3360209383610461565b81010312610b5a57505190386108b1565b3d9150610c26565b6101e0913d6101e011610dbb575b610c648383610461565b6101e0828481010312610b5a5760405192836101e081011067ffffffffffffffff6101e086011117610da757610ca4906101e0850160405283018361059f565b8352610cb2602083016105ce565b6020840152610cc3604083016105ce565b6040840152610cd4606083016105ce565b60608401526080610ce68184016105ce565b9084015260a0610cf78184016105ce565b9084015260c0610d088184016105eb565b9084015260e08201519061ffff82168203610b5a575060e0830152610100610d3181830161049b565b90830152610120610d4381830161049b565b90830152610140610d5581830161049b565b90830152610160610d6781830161049b565b90830152610180610d798183016105ce565b908301526101a0610d8b8183016105ce565b90830152610d9d6101c08092016105ce565b9082015238610867565b602482634e487b7160e01b81526041600452fd5b3d9250610c5a565b6001600160a01b03610dd58988610575565b5116604051906335ea6a7560e01b82526004820152610180816024816001600160a01b0388165afa908115610b655760009161116e575b506001600160a01b03610e1f8a89610575565b5116906040519163b3596f0760e01b835260048301526020826024816001600160a01b038a165afa918215610b655760009261113a575b50610e5f6104af565b916001600160a01b03610e728c8b610575565b511683526001600160a01b0360e08301511660206001600160a01b0360248b60405194859384926370a0823160e01b84521660048301525afa908115610b6557600091611108575b506040840152610ed56001600160a01b036109408d8c610575565b6020840152600460206001600160a01b0360e0850151166040519283809263313ce56760e01b82525afa8015610b65576000906110ce575b60ff91501660608401526080830152602460206001600160a01b0361012084015116604051928380926370a0823160e01b82526001600160a01b038d1660048301525afa908115610b655760009161109c575b5060a0830152602460206001600160a01b0361010084015116604051928380926370a0823160e01b82526001600160a01b038d1660048301525afa908115610b6557600091611069575b509160ff610b016001600160a01b03610120610b299795610b239760c08701526fffffffffffffffffffffffffffffffff8060608301511660e08801528060808301511661010088015260a082015116828701528260e08201511661014087015261101a8360e083015116611528565b610160870152846110308460e0840151166116a2565b166101808701526101008101805184166101a088015251611052908416611528565b6101c087015284610ad384610100840151166116a2565b906020823d602011611094575b8161108360209383610461565b81010312610b5a57505160ff610faa565b3d9150611076565b906020823d6020116110c6575b816110b660209383610461565b81010312610b5a57505138610f60565b3d91506110a9565b6020823d602011611100575b816110e760209383610461565b81010312610b5a57506110fb60ff916105fd565b610f0d565b3d91506110da565b906020823d602011611132575b8161112260209383610461565b81010312610b5a57505138610eba565b3d9150611115565b90916020823d602011611166575b8161115560209383610461565b81010312610b5a5750519038610e56565b3d9150611148565b6101803d610180116112a1575b6111858183610461565b61018082828101031261039657604051928361018081011067ffffffffffffffff6101808601111761128d57506111c690610180840160405282018261059f565b82526111d4602082016105ce565b60208301526111e5604082016105ce565b60408301526111f6606082016105ce565b606083015260806112088183016105ce565b9083015260a06112198183016105ce565b9083015260c061122a8183016105eb565b9083015260e061123b81830161049b565b9083015261010061124d81830161049b565b9083015261012061125f81830161049b565b9083015261014061127181830161049b565b908301526112836101608092016105fd565b9082015238610e0c565b80634e487b7160e01b602492526041600452fd5b503d61117b565b90926020823d6020116112dc575b816112c360209383610461565b81010312610b5a57506112d59061049b565b9138610801565b3d91506112b6565b505050505050509190565b808b602080936112fd6104af565b92010152016107ab565b955038610775565b5050505050505050506040516020810181811067ffffffffffffffff82111761042f57604052600081529190565b9297509850604001519795610761565b6001600160a01b03168352816020840152610749565b9091506020813d60201161139b575b8161137f60209383610461565b81010312611397576113909061049b565b903861072f565b8a80fd5b3d9150611372565b516001600160a01b03169392506107649050565b6001600160a01b031681528260208201526106d5565b9091506020813d602011611405575b816113e960209383610461565b81010312611401576113fa9061049b565b90386106bb565b8b80fd5b3d91506113dc565b9093503d8088833e61141f8183610461565b81019060209081818403126114a85780519067ffffffffffffffff82116114ac57019180601f840112156114a857825161145881610483565b936114666040519586610461565b818552838086019260051b820101928311611397578301905b8282106114915750505050923861065d565b83809161149d8461049b565b81520191019061147f565b8880fd5b8980fd5b6040513d89823e3d90fd5b604051906114c882610445565b606060408360008152600060208201520152565b67ffffffffffffffff811161042f57601f01601f191660200190565b3d15611523573d90611509826114dc565b916115176040519384610461565b82523d6000602084013e565b606090565b60409081519161153783610445565b6060835260208084016000938482528386019060608252856001600160a01b0360248183541693885194859384927f81a73ad50000000000000000000000000000000000000000000000000000000084521660048301525afa869181611625575b5061161957506115a66114f8565b90528381525b51156115b9575050505190565b815192949350908281019067ffffffffffffffff8211848310176116055752600582527f6572726f72000000000000000000000000000000000000000000000000000000908201529150565b602486634e487b7160e01b81526041600452fd5b865250600181526115ac565b9091503d8088833e6116378183610461565b810190858183031261169e5780519067ffffffffffffffff82116114a8570181601f8201121561169e5780519061166d826114dc565b9261167a89519485610461565b8284528783830101116114a85790611697918780850191016103cb565b9038611598565b8780fd5b6116aa6114bb565b906001600160a01b039081600054166040519283927f785c7cf600000000000000000000000000000000000000000000000000000000845216600483015281602460209485935afa6000918161173a575b5061172a57506117096114f8565b60408301526000818301525b81015115611724575160ff1690565b50601390565b60ff168252600181830152611715565b90918382813d831161176a575b6117518183610461565b81010312610b5a5750611763906105fd565b90386116fb565b503d61174756fea26469706673582212209e0e9fc9beac9a5411167c3566fe523379f5b331140fa1171b91e9a40cdd531364736f6c634300081300336080806040523461001657610422908161001c8239f35b600080fdfe608060408181526004908136101561001657600080fd5b600092833560e01c908163221d2148146102f857508063785c7cf61461024057806381a73ad5146100fe5763e55afdd01461005057600080fd5b346100fa5760203660031901126100fa578135906001600160a01b03918281168091036100f6576020908251948580927f0542975c0000000000000000000000000000000000000000000000000000000082525afa9283156100ec57602094936100bd575b505191168152f35b6100de919350843d81116100e5575b6100d68183610390565b8101906103c8565b91386100b5565b503d6100cc565b81513d86823e3d90fd5b8480fd5b8280fd5b50823461021a576020908160031936011261021a5783356001600160a01b03811680910361023057908085928551968780927f95d89b410000000000000000000000000000000000000000000000000000000082525afa918215610234578192610194575b50506101869350825193828593845282519281848093870152868601910161036d565b601f01601f19168101030190f35b9091503d8083873e6101a68187610390565b850191838684031261021a57855167ffffffffffffffff968782116100fa57019183601f8401121561023057825196871161021d57508451926101f2601f8801601f1916860185610390565b86845284878401011161021a5750610186946102139184808501910161036d565b8480610163565b80fd5b906041602492634e487b7160e01b835252fd5b5080fd5b508351903d90823e3d90fd5b50346100fa576020928360031936011261021a5782356001600160a01b0381168091036102305784908351948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9283156102ec5781936102ae575b505060ff905191168152f35b909192508381813d83116102e5575b6102c78183610390565b8101031261023057519060ff8216820361021a57509060ff386102a2565b503d6102bd565b509051903d90823e3d90fd5b9291905034610369576020366003190112610369578135916001600160a01b0392838116809103610365576020918580927ffe65acfe0000000000000000000000000000000000000000000000000000000082525afa9283156100ec57602094936100bd57505191168152f35b8580fd5b8380fd5b60005b8381106103805750506000910152565b8181015183820152602001610370565b90601f8019910116810190811067ffffffffffffffff8211176103b257604052565b634e487b7160e01b600052604160045260246000fd5b908160209103126103e757516001600160a01b03811681036103e75790565b600080fdfea26469706673582212207f9da3b457663070e837c64ba53839b4c87b0f9a140621ea332ade05a54766db64736f6c63430008130033", "binRuntime": "0x600436101561000d57600080fd5b60003560e01c6362ca03ea1461002257600080fd5b34610438576080366003190112610438576004356001600160a01b038116810361043857602435906001600160a01b038216820361043857610100604052606060805260405161007181610806565b6000815260006020820152600060408201526000606082015260006080820152600060a08201526020608001526060604060800152606080608001526001600160a01b03600054166040517fd0a79a8a0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526001600160a01b038416602482015260443560448201526064356064820152600081608481855afa801561043d57600091600091610449575b5060e0526080526040517ff54476490000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152929091166024830152600090829060449082905afa801561043d576000916000916103a9575b5060e05260a052604051602080825260805161012082840152805161014084018190529101908290610160600582901b83018101919060009084015b8282106102475784806102438660a0602060800151805160408601526020810151606086015260408101516080860152606081015182860152608081015160c0860152015160e084015261022e60406080015191601f199283868303016101008701526107e1565b60e051848203909201610120850152906107e1565b0390f35b9193509160208060019261015f198982030185528751906001600160a01b0382511681526102828383015161026080868501528301906107e1565b916040810151604083015261038d61035861032360ff958660608601511660608701526080850151608087015260a085015160a087015260c080860151908701526fffffffffffffffffffffffffffffffff8060e08701511660e088015261010081818801511690880152610120860151166101208701526001600160a01b03610140860151166101408701526101608501518682036101608801526107e1565b610180868186015116908601526101a06001600160a01b038186015116908601526101c08085015190868303908701526107e1565b6101e0858185015116908501526102006001600160a01b038185015116908501526102208084015190858303908601526107e1565b92610240809201511691015296019201920185939194926101c6565b9150503d806000833e6103bc8183610822565b81019080820360e081126104385760c01361043857604051916103de83610806565b815183526020820151602084015260408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015167ffffffffffffffff8111610438576104329201610858565b3861018a565b600080fd5b6040513d6000823e3d90fd5b929150503d92836000843e61045e8484610822565b60408385810103126104385782519167ffffffffffffffff831161043857848401601f84860101121561043857828401519267ffffffffffffffff841161078f578360051b90604051946104b56020840187610822565b855260208501878701602084848a0101011161043857602082880101905b602084848a0101018210610520575050505060208401519267ffffffffffffffff841161043857610515856044956000986001600160a01b0398019101610858565b929550925092610127565b81519067ffffffffffffffff82116104385761026089850183018b8b0103601f19011261043857604051918261026081011067ffffffffffffffff6102608501111761078f57610260830160405261057e602082878d010101610844565b8352604081868c010101519167ffffffffffffffff831161043857859360a083868f8f90829860206105b99284019186868601010101610858565b60208601528082018301606081015160408701526105d9906080016108ad565b6060860152010101516080820152838c01830160c08181015160a084015260e082015190830152849061010090610641908f906106179084016108bb565b60e08601526101209261062f848987850101016108bb565b908601526101409301860183016108bb565b908301526106588d85610160978892010101610844565b908201528b83610180968792010101519367ffffffffffffffff85116104385787956106ab8f8f90936106998a9960208b978501918b898701010101610858565b908601526101a09301860183016108ad565b908301526106c28d856101c0978892010101610844565b908201528b836101e0968792010101519367ffffffffffffffff85116104385787956107158f8f90936107038a9960208b978501918b898701010101610858565b908601526102009301860183016108ad565b9083015261072c8d85610220988992010101610844565b908201528b83610240958692010101519367ffffffffffffffff85116104385761077e6102608f958f8060209a6107728c9b8f948d9c8d91019187878701010101610858565b908801520101016108ad565b9082015281520192019190506104d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381106107d15750506000910152565b81810151838201526020016107c1565b906020916107fa815180928185528580860191016107be565b601f01601f1916010190565b60c0810190811067ffffffffffffffff82111761078f57604052565b90601f8019910116810190811067ffffffffffffffff82111761078f57604052565b51906001600160a01b038216820361043857565b81601f8201121561043857805167ffffffffffffffff811161078f576040519261088c601f8301601f191660200185610822565b81845260208284010111610438576108aa91602080850191016107be565b90565b519060ff8216820361043857565b51906fffffffffffffffffffffffffffffffff821682036104385756fea264697066735822122032ac77b3a4232b89621957a684ca03b9b790ec4bed9b79b4ff6203adbc9e139064736f6c63430008130033" } diff --git a/dist/contracts/compiled/DeFiUniswapV3Positions.json b/dist/contracts/compiled/DeFiUniswapV3Positions.json new file mode 100644 index 000000000..3823b113a --- /dev/null +++ b/dist/contracts/compiled/DeFiUniswapV3Positions.json @@ -0,0 +1 @@ +{ "abi": [{ "inputs": [{ "internalType": "address", "name": "userAddr", "type": "address" }, { "internalType": "address", "name": "positionManagementAddr", "type": "address" }, { "internalType": "address", "name": "factoryAddr", "type": "address" }], "name": "getUniV3Position", "outputs": [{ "components": [{ "internalType": "string", "name": "token0Symbol", "type": "string" }, { "internalType": "uint8", "name": "token0Decimals", "type": "uint8" }, { "internalType": "string", "name": "token1Symbol", "type": "string" }, { "internalType": "uint8", "name": "token1Decimals", "type": "uint8" }, { "components": [{ "internalType": "uint96", "name": "nonce", "type": "uint96" }, { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "token0", "type": "address" }, { "internalType": "address", "name": "token1", "type": "address" }, { "internalType": "uint24", "name": "fee", "type": "uint24" }, { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "internalType": "uint256", "name": "feeGrowthInside0LastX128", "type": "uint256" }, { "internalType": "uint256", "name": "feeGrowthInside1LastX128", "type": "uint256" }, { "internalType": "uint128", "name": "tokensOwed0", "type": "uint128" }, { "internalType": "uint128", "name": "tokensOwed1", "type": "uint128" }], "internalType": "struct Position", "name": "positionInfo", "type": "tuple" }, { "components": [{ "internalType": "uint160", "name": "sqrtPriceX96", "type": "uint160" }, { "internalType": "int24", "name": "tick", "type": "int24" }, { "internalType": "uint16", "name": "observationIndex", "type": "uint16" }, { "internalType": "uint16", "name": "observationCardinality", "type": "uint16" }, { "internalType": "uint16", "name": "observationCardinalityNext", "type": "uint16" }, { "internalType": "uint8", "name": "feeProtocol", "type": "uint8" }, { "internalType": "bool", "name": "unlocked", "type": "bool" }], "internalType": "struct PoolSlot0", "name": "poolSlot0", "type": "tuple" }, { "internalType": "uint256", "name": "feeGrowthGlobal0X128", "type": "uint256" }, { "internalType": "uint256", "name": "positionId", "type": "uint256" }], "internalType": "struct UniV3PositionsData[]", "name": "result", "type": "tuple[]" }], "stateMutability": "view", "type": "function" }], "bin": "0x6080806040523461008557610ca98181016001600160401b0381118382101761006f5782916108a1833903906000f0801561006357600080546001600160a01b0319166001600160a01b0392909216919091179055604051610816908161008b8239f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe608080604052600436101561001357600080fd5b60003560e01c63f9b0f55a1461002857600080fd5b34610685576060366003190112610685576004356001600160a01b03811680910361068557602435906001600160a01b038216809203610685576044356001600160a01b038116809103610685578380926064926000956001600160a01b03875416927f2090f4670000000000000000000000000000000000000000000000000000000085526004850152602484015260448301525afa9081156106b9576000916102b4575b5060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106101045785850386f35b909192938280600192603f1989820301855287519061030060e061013184516103208086528501906106e8565b9361015460ff9586888401511688870152604083015186820360408801526106e8565b94806060830151166060860152608090818301516bffffffffffffffffffffffff815116838801526001600160a01b0389820151169160a092838901526001600160a01b036040830151169260c0948594858b01526001600160a01b03606085015116888b015262ffffff818501511661010090818c015282850151906002958c6101208094890b9101528c6101c089830151890b9461014095868401526fffffffffffffffffffffffffffffffff9586918f8390870151169661016097888701528601516101808601528501516101a0850152840151169101520151166101e08b015281870151936001600160a01b038551166102008c01528c850151900b6102208b015261ffff90816040860151166102408c0152816060860151166102608c0152840151166102808a0152820151166102a0880152015115156102c08601528101516102e0850152015191015296019201960195929190926100f7565b3d9150816000823e6102c6828261070d565b60208183810103126106855780519167ffffffffffffffff831161068557808201601f84840101121561068557828201519267ffffffffffffffff841161068a578360051b916040519461031d602085018761070d565b8552602085019080850160208585880101011161068557602083860101915b6020858588010101831061035657505050505050386100ce565b825167ffffffffffffffff811161068557610320878601820184890103601f19011261068557604051918261010081011067ffffffffffffffff6101008501111761068a576101008301604052602082878a0101015167ffffffffffffffff8111610685576103d1906020868b0191858a8d0101010161072f565b83526103e3604083888b010101610784565b6020840152606082878a0101015167ffffffffffffffff811161068557610416906020868b0191858a8d0101010161072f565b604084015261042b608083888b010101610784565b60608401526101808887018301858a0103609f190112610685576040518061018081011067ffffffffffffffff6101808301111761068a57610180810160405260a083888b010101516bffffffffffffffffffffffff8116810361068557815261049b60c084898c010101610792565b60208201526104b060e084898c010101610792565b60408201526104c661010084898c010101610792565b606082015261012083888b0101015162ffffff81168103610685576080820152886101406104f981868b850101016107a6565b60a08401526105546101e0868b61016095610519878484840101016107a6565b60c089015261052f6101808484840101016107b4565b60e089015201016101a08101516101008701526101c0810151610120870152016107b4565b90830152610569610200858a8d0101016107b4565b90820152608084015260e08887018301858a010361021f19011261068557604051908160e081011067ffffffffffffffff60e08401111761068a5760e0820160405261022083888b010101516001600160a01b03811681036106855782526105d861024084898c0101016107a6565b60208301526105ee61026084898c0101016107d1565b604083015261060461028084898c0101016107d1565b606083015261061a6102a084898c0101016107d1565b60808301526106306102c084898c010101610784565b60a08301526102e083888b010101519384151585036106855761032084610300602097968b8e888b9a60c08c9b015260a08801520101015160c0840152898c0101015160e0820152815201930192905061033c565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040513d6000823e3d90fd5b60005b8381106106d85750506000910152565b81810151838201526020016106c8565b90602091610701815180928185528580860191016106c5565b601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff82111761068a57604052565b81601f8201121561068557805167ffffffffffffffff811161068a5760405192610763601f8301601f19166020018561070d565b818452602082840101116106855761078191602080850191016106c5565b90565b519060ff8216820361068557565b51906001600160a01b038216820361068557565b51908160020b820361068557565b51906fffffffffffffffffffffffffffffffff8216820361068557565b519061ffff821682036106855756fea264697066735822122085527a6989ef5678245622898db1e95d96fcdf7a00a7ab0e49bb45bbcc5cbc6c64736f6c634300081300336080806040523461001657610c8d908161001c8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c632090f4671461002857600080fd5b3461065f57606036600319011261065f576004356001600160a01b038116810361065f57602435906001600160a01b038216820361065f57604435906001600160a01b038216820361065f577f70a082310000000000000000000000000000000000000000000000000000000084526001600160a01b03811660048501526020846024816001600160a01b0387165afa93841561066c57600094610a76575b506100d184610b4d565b926100df6040519485610b2b565b8484526100eb85610b4d565b60005b601f198201811061096157505060005b8581106102f157846040518091602082016020835281518091526040830190602060408260051b8601019301916000905b82821061013e57505050500390f35b919360019193955060208091603f1989820301855287519061030060e061016e8451610320808652850190610acd565b9361019160ff958688840151168887015260408301518682036040880152610acd565b94806060830151166060860152608090818301516bffffffffffffffffffffffff815116838801526001600160a01b0389820151169160a092838901526001600160a01b036040830151169260c0948594858b01526001600160a01b03606085015116888b015262ffffff818501511661010090818c015282850151906002958c6101208094890b9101528c6101c089830151890b9461014095868401526fffffffffffffffffffffffffffffffff9586918f8390870151169661016097888701528601516101808601528501516101a0850152840151169101520151166101e08b015281870151936001600160a01b038551166102008c01528c850151900b6102208b015261ffff90816040860151166102408c0152816060860151166102608c0152840151166102808a0152820151166102a0880152015115156102c08601528101516102e08501520151910152960192019201859493919261012f565b6040517f2f745c590000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528160248201526020816044816001600160a01b0387165afa90811561066c5760009161092f575b506040517f99fbab88000000000000000000000000000000000000000000000000000000008152816004820152610180816024816001600160a01b0388165afa90811561066c5760009161081f575b506001600160a01b03604082015116916001600160a01b0360608301511662ffffff60808401511690604051947f1698ee820000000000000000000000000000000000000000000000000000000086526004860152602485015260448401526020836064816001600160a01b038b165afa92831561066c576000936107e3575b5060e0610429858a610ba4565b510152806080610439858a610ba4565b510152604051917f3850c7bd00000000000000000000000000000000000000000000000000000000835260e0836004816001600160a01b0385165afa92831561066c57600093610723575b506020906001600160a01b039360a061049d878c610ba4565b5101526004604051809581937ff3058399000000000000000000000000000000000000000000000000000000008352165afa801561066c576000906106f0575b6004925060c06104ed858a610ba4565b51015260006001600160a01b03604083015116604051938480926395d89b4160e01b82525afa801561066c576004926000916106d5575b5061052f8489610ba4565b515260206001600160a01b036040830151166040519384809263313ce56760e01b82525afa801561066c5760009061069b575b6004925060ff6020610574868b610ba4565b51019116905260006001600160a01b03606083015116604051938480926395d89b4160e01b82525afa801561066c5760606020926001600160a01b0392600495600091610678575b5060406105c9888d610ba4565b5101520151166040519283809263313ce56760e01b82525afa90811561066c5760009161062d575b5060ff60606106008489610ba4565b5101911690526000198114610617576001016100fe565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011610664575b8161064860209383610b2b565b8101031261065f5761065990610bdd565b386105f1565b600080fd5b3d915061063b565b6040513d6000823e3d90fd5b61069591503d806000833e61068d8183610b2b565b810190610beb565b386105bc565b506020823d6020116106cd575b816106b560209383610b2b565b8101031261065f576106c8600492610bdd565b610562565b3d91506106a8565b6106ea91503d806000833e61068d8183610b2b565b38610524565b506020823d60201161071b575b8161070a60209383610b2b565b8101031261065f57600491516104dd565b3d91506106fd565b925060e0833d60e0116107db575b8161073e60e09383610b2b565b8101031261065f576040519261075384610b0f565b8051906001600160a01b038216820361065f5760c091855261077760208201610b79565b602086015261078860408201610bce565b604086015261079960608201610bce565b60608601526107aa60808201610bce565b608086015260a06107bc818301610bdd565b90860152015190811515820361065f5760c08401919091526020610484565b3d9150610731565b9092506020813d602011610817575b816107ff60209383610b2b565b8101031261065f5761081090610b65565b913861041c565b3d91506107f2565b9050610180813d61018011610927575b8161083d6101809383610b2b565b8101031261065f576040519061085282610af2565b80516bffffffffffffffffffffffff8116810361065f57825261087760208201610b65565b602083015261088860408201610b65565b604083015261089960608201610b65565b6060830152608081015162ffffff8116810361065f57608083015260a06108c1818301610b79565b9083015260c06108d2818301610b79565b908301526108e260e08201610b87565b60e08301526101008082015190830152610120808201519083015261014061090b818301610b87565b9083015261091d610160809201610b87565b908201523861039c565b3d915061082f565b90506020813d602011610959575b8161094a60209383610b2b565b8101031261065f57513861034d565b3d915061093d565b604051908161010081011067ffffffffffffffff61010084011117610a605781610100602093016040526060815260008382015260606040820152600060608201526040516109af81610af2565b60008152600084820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e082015260006101008201526000610120820152600061014082015260006101608201526080820152604051610a1481610b0f565b60008152600084820152600060408201526000606082015260006080820152600060a0820152600060c082015260a0820152600060c0820152600060e0820152828289010152016100ee565b634e487b7160e01b600052604160045260246000fd5b9093506020813d602011610aa2575b81610a9260209383610b2b565b8101031261065f575192386100c7565b3d9150610a85565b60005b838110610abd5750506000910152565b8181015183820152602001610aad565b90602091610ae681518092818552858086019101610aaa565b601f01601f1916010190565b610180810190811067ffffffffffffffff821117610a6057604052565b60e0810190811067ffffffffffffffff821117610a6057604052565b90601f8019910116810190811067ffffffffffffffff821117610a6057604052565b67ffffffffffffffff8111610a605760051b60200190565b51906001600160a01b038216820361065f57565b51908160020b820361065f57565b51906fffffffffffffffffffffffffffffffff8216820361065f57565b8051821015610bb85760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b519061ffff8216820361065f57565b519060ff8216820361065f57565b60208183031261065f57805167ffffffffffffffff9182821161065f57019082601f8301121561065f578151908111610a605760405192610c36601f8301601f191660200185610b2b565b8184526020828401011161065f57610c549160208085019101610aaa565b9056fea2646970667358221220d229acd15286762a2d18e2fc53dc6248f1399f9c00dde0e340cfbbe8eadbca2f64736f6c63430008130033", "binRuntime": "0x608080604052600436101561001357600080fd5b60003560e01c63f9b0f55a1461002857600080fd5b34610685576060366003190112610685576004356001600160a01b03811680910361068557602435906001600160a01b038216809203610685576044356001600160a01b038116809103610685578380926064926000956001600160a01b03875416927f2090f4670000000000000000000000000000000000000000000000000000000085526004850152602484015260448301525afa9081156106b9576000916102b4575b5060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106101045785850386f35b909192938280600192603f1989820301855287519061030060e061013184516103208086528501906106e8565b9361015460ff9586888401511688870152604083015186820360408801526106e8565b94806060830151166060860152608090818301516bffffffffffffffffffffffff815116838801526001600160a01b0389820151169160a092838901526001600160a01b036040830151169260c0948594858b01526001600160a01b03606085015116888b015262ffffff818501511661010090818c015282850151906002958c6101208094890b9101528c6101c089830151890b9461014095868401526fffffffffffffffffffffffffffffffff9586918f8390870151169661016097888701528601516101808601528501516101a0850152840151169101520151166101e08b015281870151936001600160a01b038551166102008c01528c850151900b6102208b015261ffff90816040860151166102408c0152816060860151166102608c0152840151166102808a0152820151166102a0880152015115156102c08601528101516102e0850152015191015296019201960195929190926100f7565b3d9150816000823e6102c6828261070d565b60208183810103126106855780519167ffffffffffffffff831161068557808201601f84840101121561068557828201519267ffffffffffffffff841161068a578360051b916040519461031d602085018761070d565b8552602085019080850160208585880101011161068557602083860101915b6020858588010101831061035657505050505050386100ce565b825167ffffffffffffffff811161068557610320878601820184890103601f19011261068557604051918261010081011067ffffffffffffffff6101008501111761068a576101008301604052602082878a0101015167ffffffffffffffff8111610685576103d1906020868b0191858a8d0101010161072f565b83526103e3604083888b010101610784565b6020840152606082878a0101015167ffffffffffffffff811161068557610416906020868b0191858a8d0101010161072f565b604084015261042b608083888b010101610784565b60608401526101808887018301858a0103609f190112610685576040518061018081011067ffffffffffffffff6101808301111761068a57610180810160405260a083888b010101516bffffffffffffffffffffffff8116810361068557815261049b60c084898c010101610792565b60208201526104b060e084898c010101610792565b60408201526104c661010084898c010101610792565b606082015261012083888b0101015162ffffff81168103610685576080820152886101406104f981868b850101016107a6565b60a08401526105546101e0868b61016095610519878484840101016107a6565b60c089015261052f6101808484840101016107b4565b60e089015201016101a08101516101008701526101c0810151610120870152016107b4565b90830152610569610200858a8d0101016107b4565b90820152608084015260e08887018301858a010361021f19011261068557604051908160e081011067ffffffffffffffff60e08401111761068a5760e0820160405261022083888b010101516001600160a01b03811681036106855782526105d861024084898c0101016107a6565b60208301526105ee61026084898c0101016107d1565b604083015261060461028084898c0101016107d1565b606083015261061a6102a084898c0101016107d1565b60808301526106306102c084898c010101610784565b60a08301526102e083888b010101519384151585036106855761032084610300602097968b8e888b9a60c08c9b015260a08801520101015160c0840152898c0101015160e0820152815201930192905061033c565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040513d6000823e3d90fd5b60005b8381106106d85750506000910152565b81810151838201526020016106c8565b90602091610701815180928185528580860191016106c5565b601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff82111761068a57604052565b81601f8201121561068557805167ffffffffffffffff811161068a5760405192610763601f8301601f19166020018561070d565b818452602082840101116106855761078191602080850191016106c5565b90565b519060ff8216820361068557565b51906001600160a01b038216820361068557565b51908160020b820361068557565b51906fffffffffffffffffffffffffffffffff8216820361068557565b519061ffff821682036106855756fea264697066735822122085527a6989ef5678245622898db1e95d96fcdf7a00a7ab0e49bb45bbcc5cbc6c64736f6c63430008130033" } diff --git a/dist/contracts/compiled/EntryPoint.json b/dist/contracts/compiled/EntryPoint.json new file mode 100644 index 000000000..bf8ba4190 --- /dev/null +++ b/dist/contracts/compiled/EntryPoint.json @@ -0,0 +1 @@ +[{ "inputs": [{ "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "ret", "type": "bytes" }], "name": "DelegateAndRevert", "type": "error" }, { "inputs": [{ "internalType": "uint256", "name": "opIndex", "type": "uint256" }, { "internalType": "string", "name": "reason", "type": "string" }], "name": "FailedOp", "type": "error" }, { "inputs": [{ "internalType": "uint256", "name": "opIndex", "type": "uint256" }, { "internalType": "string", "name": "reason", "type": "string" }, { "internalType": "bytes", "name": "inner", "type": "bytes" }], "name": "FailedOpWithRevert", "type": "error" }, { "inputs": [{ "internalType": "bytes", "name": "returnData", "type": "bytes" }], "name": "PostOpReverted", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "sender", "type": "address" }], "name": "SenderAddressResult", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "aggregator", "type": "address" }], "name": "SignatureValidationFailed", "type": "error" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "address", "name": "factory", "type": "address" }, { "indexed": false, "internalType": "address", "name": "paymaster", "type": "address" }], "name": "AccountDeployed", "type": "event" }, { "anonymous": false, "inputs": [], "name": "BeforeExecution", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "totalDeposit", "type": "uint256" }], "name": "Deposited", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "revertReason", "type": "bytes" }], "name": "PostOpRevertReason", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "aggregator", "type": "address" }], "name": "SignatureAggregatorChanged", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "totalStaked", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "unstakeDelaySec", "type": "uint256" }], "name": "StakeLocked", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "withdrawTime", "type": "uint256" }], "name": "StakeUnlocked", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "address", "name": "withdrawAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }], "name": "StakeWithdrawn", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "paymaster", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "success", "type": "bool" }, { "indexed": false, "internalType": "uint256", "name": "actualGasCost", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "actualGasUsed", "type": "uint256" }], "name": "UserOperationEvent", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nonce", "type": "uint256" }], "name": "UserOperationPrefundTooLow", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "revertReason", "type": "bytes" }], "name": "UserOperationRevertReason", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "address", "name": "withdrawAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }], "name": "Withdrawn", "type": "event" }, { "inputs": [{ "internalType": "uint32", "name": "unstakeDelaySec", "type": "uint32" }], "name": "addStake", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], "name": "balanceOf", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "target", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "name": "delegateAndRevert", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], "name": "depositTo", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }], "name": "deposits", "outputs": [{ "internalType": "uint256", "name": "deposit", "type": "uint256" }, { "internalType": "bool", "name": "staked", "type": "bool" }, { "internalType": "uint112", "name": "stake", "type": "uint112" }, { "internalType": "uint32", "name": "unstakeDelaySec", "type": "uint32" }, { "internalType": "uint48", "name": "withdrawTime", "type": "uint48" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], "name": "getDepositInfo", "outputs": [{ "components": [{ "internalType": "uint256", "name": "deposit", "type": "uint256" }, { "internalType": "bool", "name": "staked", "type": "bool" }, { "internalType": "uint112", "name": "stake", "type": "uint112" }, { "internalType": "uint32", "name": "unstakeDelaySec", "type": "uint32" }, { "internalType": "uint48", "name": "withdrawTime", "type": "uint48" }], "internalType": "struct IStakeManager.DepositInfo", "name": "info", "type": "tuple" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint192", "name": "key", "type": "uint192" }], "name": "getNonce", "outputs": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "initCode", "type": "bytes" }], "name": "getSenderAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct PackedUserOperation", "name": "userOp", "type": "tuple" }], "name": "getUserOpHash", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "components": [{ "components": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct PackedUserOperation[]", "name": "userOps", "type": "tuple[]" }, { "internalType": "contract IAggregator", "name": "aggregator", "type": "address" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct IEntryPoint.UserOpsPerAggregator[]", "name": "opsPerAggregator", "type": "tuple[]" }, { "internalType": "address payable", "name": "beneficiary", "type": "address" }], "name": "handleAggregatedOps", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct PackedUserOperation[]", "name": "ops", "type": "tuple[]" }, { "internalType": "address payable", "name": "beneficiary", "type": "address" }], "name": "handleOps", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "uint192", "name": "key", "type": "uint192" }], "name": "incrementNonce", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "callData", "type": "bytes" }, { "components": [{ "components": [{ "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "uint256", "name": "verificationGasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "callGasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "paymasterVerificationGasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "paymasterPostOpGasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "address", "name": "paymaster", "type": "address" }, { "internalType": "uint256", "name": "maxFeePerGas", "type": "uint256" }, { "internalType": "uint256", "name": "maxPriorityFeePerGas", "type": "uint256" }], "internalType": "struct EntryPoint.MemoryUserOp", "name": "mUserOp", "type": "tuple" }, { "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "internalType": "uint256", "name": "prefund", "type": "uint256" }, { "internalType": "uint256", "name": "contextOffset", "type": "uint256" }, { "internalType": "uint256", "name": "preOpGas", "type": "uint256" }], "internalType": "struct EntryPoint.UserOpInfo", "name": "opInfo", "type": "tuple" }, { "internalType": "bytes", "name": "context", "type": "bytes" }], "name": "innerHandleOp", "outputs": [{ "internalType": "uint256", "name": "actualGasCost", "type": "uint256" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint192", "name": "", "type": "uint192" }], "name": "nonceSequenceNumber", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" }], "name": "supportsInterface", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unlockStake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address payable", "name": "withdrawAddress", "type": "address" }], "name": "withdrawStake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address payable", "name": "withdrawAddress", "type": "address" }, { "internalType": "uint256", "name": "withdrawAmount", "type": "uint256" }], "name": "withdrawTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }] diff --git a/dist/contracts/compiled/Estimation.json b/dist/contracts/compiled/Estimation.json index 4d8d52485..7171f7f30 100644 --- a/dist/contracts/compiled/Estimation.json +++ b/dist/contracts/compiled/Estimation.json @@ -1 +1 @@ -{ "abi": [{ "stateMutability": "payable", "type": "fallback" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Estimation.AccountOp", "name": "preExecute", "type": "tuple" }, { "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Estimation.AccountOp", "name": "op", "type": "tuple" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address[]", "name": "feeTokens", "type": "address[]" }, { "internalType": "address", "name": "relayer", "type": "address" }, { "internalType": "address[]", "name": "checkNativeAssetOn", "type": "address[]" }], "name": "estimate", "outputs": [{ "components": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "deployment", "type": "tuple" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "accountOpToExecuteBefore", "type": "tuple" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "op", "type": "tuple" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct Estimation.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "uint256[]", "name": "nativeAssetBalances", "type": "uint256[]" }, { "internalType": "uint256", "name": "gasUsed", "type": "uint256" }], "internalType": "struct Estimation.EstimationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IERC20Subset", "name": "token", "type": "address" }, { "internalType": "address", "name": "addr", "type": "address" }], "name": "getERC20Balance", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }], "name": "simulateDeployment", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "feeTokens", "type": "address[]" }, { "internalType": "bytes", "name": "spoofSig", "type": "bytes" }, { "internalType": "address", "name": "relayer", "type": "address" }], "name": "simulateFeePayments", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct Estimation.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Estimation.AccountOp", "name": "op", "type": "tuple" }], "name": "simulateSigned", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct Estimation.AccountOp", "name": "op", "type": "tuple" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }], "name": "simulateUnsigned", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct Estimation.SimulationOutcome", "name": "outcome", "type": "tuple" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "bytes", "name": "spoofSig", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }], "bin": "0x60808060405234610016576117eb908161001c8239f35b600080fdfe60806040526004361015610018575b361561001657005b005b60003560e01c806306302eef146108515780634af194a61461078b578063bbd1dc50146106fa578063c3a8962c14610649578063d8d16e0f146105f55763f860705c0361000e57346104d0576101203660031901126104d0576100796108a1565b6100816108cb565b67ffffffffffffffff916044358381116104d0576100a3903690600401610973565b906064358481116104d0576100bc903690600401610aa4565b906084358581116104d0576100d5903690600401610aa4565b9160a4358681116104d0576100ee903690600401610a3e565b9160c4358781116104d057610107903690600401610a3e565b916001600160a01b0360e4351660e435036104d057610104358881116104d057610135903690600401610a3e565b956040519889610100810110906101008b0111176105df57610100890160405261015d610bf6565b8952610167610bf6565b60208a0152610174610bf6565b60408a0152600060608a0152606060808a0152606060a08a0152606060c08a0152600060e08a015286516101a781610a26565b906101b56040519283610935565b8082526101c4601f1991610a26565b0136602083013760c08a015260005b898851821461020f579061020a916102048260c06001600160a01b036101f9838f610c5f565b511631930151610c5f565b52610c17565b6101d3565b97505061021f6020918985610cb0565b80885201511515806105d1575b6105be575b60208651015115159081610599575b506104f1575b5050805161036f575b5050604051602081526102a261028c610276845161010060208601526101208501906109fa565b6020850151848203601f190160408601526109fa565b6040840151838203601f190160608501526109fa565b606083015160808301526080830151601f198383030160a08401526020808251938481520191019160005b81811061034357505060a0840151838203601f190160c08501526102f19250610bc2565b60c083015190601f198382030160e08401526020808351928381520192019060005b81811061032d5750505060e0829301516101008301520390f35b8251845260209384019390920191600101610313565b90916020610364600192865190602060409280518352015160208201520190565b9401939291016102cd565b60009160005b825181146104e957600060206001600160a01b0384511660246001600160a01b036103a08689610c5f565b5116604051948593849263c066a5b160e01b845260048401525af19081156104dd576000916104a6575b506103dd576103d890610c17565b610375565b5050505060015b156103f057818061024f565b60c460405162461bcd60e51b815260206004820152606d60248201527f416e74692d627269636b696e6720636865636b206661696c65642c207468697360448201527f206d65616e732074686174206e6f6e65206f662074686520706173736564206160648201527f73736f6369617465644b657973206861732070726976696c656765732061667460848201527f65722073696d756c6174696f6e0000000000000000000000000000000000000060a4820152fd5b90506020813d6020116104d5575b816104c160209383610935565b810103126104d05751866103ca565b600080fd5b3d91506104b4565b6040513d6000823e3d90fd5b5050506103e4565b6104fb8385610d07565b919060a08801526040870152600060206001600160a01b0387511660046040518094819363057ff68760e51b83525af19081156104dd57600091610567575b506060870152825161054d575b50610246565b61055a9260e4359261115b565b6080840152838080610547565b90506020813d602011610591575b8161058260209383610935565b810103126104d057518761053a565b3d9150610575565b604091500151511580156105ae575b86610240565b50602080860151015115156105a8565b6105c781610ed2565b6020870152610231565b50604081015151151561022c565b634e487b7160e01b600052604160045260246000fd5b346104d05760203660031901126104d05760043567ffffffffffffffff81116104d05761063161062c610645923690600401610aa4565b610ed2565b6040519182916020835260208301906109fa565b0390f35b346104d05760403660031901126104d0576004356001600160a01b038082168092036104d057602090602461067c6108cb565b60405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa80156104dd576000906106c8575b602090604051908152f35b506020813d82116106f2575b816106e160209383610935565b810103126104d057602090516106bd565b3d91506106d4565b346104d05760403660031901126104d05767ffffffffffffffff6004358181116104d05761072c903690600401610aa4565b906024359081116104d05761064561075861076f9361075261077d943690600401610a3e565b90610d07565b9193906040519586956060875260608701906109fa565b908582036020870152610bc2565b9083820360408501526109ba565b346104d05760803660031901126104d0576107a46108a1565b67ffffffffffffffff6024358181116104d0576107c5903690600401610a3e565b906044359081116104d0576107de903690600401610973565b606435916001600160a01b03831683036104d0576107fb9361115b565b6040516020918282018383528151809152836040840192019360005b8281106108245784840385f35b90919282610845600192885190602060409280518352015160208201520190565b96019593929101610817565b346104d05760603660031901126104d05761086a6108a1565b6108726108cb565b906044359067ffffffffffffffff82116104d0576106459261089b610631933690600401610973565b91610cb0565b600435906001600160a01b03821682036104d057565b35906001600160a01b03821682036104d057565b602435906001600160a01b03821682036104d057565b6080810190811067ffffffffffffffff8211176105df57604052565b6060810190811067ffffffffffffffff8211176105df57604052565b6040810190811067ffffffffffffffff8211176105df57604052565b90601f8019910116810190811067ffffffffffffffff8211176105df57604052565b67ffffffffffffffff81116105df57601f01601f191660200190565b81601f820112156104d05780359061098a82610957565b926109986040519485610935565b828452602083830101116104d057816000926020809301838601378301015290565b919082519283825260005b8481106109e6575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016109c5565b9060606040610a23938051845260208101511515602085015201519181604082015201906109ba565b90565b67ffffffffffffffff81116105df5760051b60200190565b81601f820112156104d057803591610a5583610a26565b92610a636040519485610935565b808452602092838086019260051b8201019283116104d0578301905b828210610a8d575050505090565b838091610a99846108b7565b815201910190610a7f565b9190916080818403126104d0576040805191610abf836108e1565b8294610aca826108b7565b84526020828101358186015267ffffffffffffffff93808401358581116104d05784019183601f840112156104d057823592610b0584610a26565b93610b1284519586610935565b808552828086019160051b830101918683116104d057838101915b838310610b5a57505050505085015260608201359283116104d057606092610b559201610973565b910152565b82358a81116104d05782019060609081601f19848c0301126104d057875191610b82836108fd565b610b8d8885016108b7565b83528884013588840152830135918c83116104d057610bb38b8980969581960101610973565b89820152815201920191610b2d565b90815180825260208080930193019160005b828110610be2575050505090565b835185529381019392810192600101610bd4565b60405190610c03826108fd565b606060408360008152600060208201520152565b6000198114610c265760010190565b634e487b7160e01b600052601160045260246000fd5b805115610c495760200190565b634e487b7160e01b600052603260045260246000fd5b8051821015610c495760209160051b010190565b3d15610c9e573d90610c8482610957565b91610c926040519384610935565b82523d6000602084013e565b606090565b91908203918211610c2657565b92916001600160a01b03610cc2610bf6565b94163b610cfc5790600080610cf8935a9382602083519301915af1610ce5610c73565b6040860152151560208501525a90610ca3565b8252565b505060016020830152565b919091610d12610bf6565b5060606001600160a01b03908183511690604091825163057ff68760e51b815260209560049187818481600080985af1908115610ec8578491610e97575b5087820152885198610d618a610a26565b99610d6e87519b8c610935565b808b52610d7d601f1991610a26565b0136898c01378998845b82518114610e7a5788610d9a8285610c5f565b5116868b8b87511660248c518094819363c066a5b160e01b8352878d8401525af1908115610e70578e84918a93610e39575b508291610dd891610c5f565b52610ded575b50610de890610c17565b610d87565b8751610dde57610de89197508851908b8201527f03000000000000000000000000000000000000000000000000000000000000008982015260218152610e32816108fd565b9690610dde565b925050508b81813d8311610e69575b610e528183610935565b81010312610e655751828e610dd8610dcc565b8780fd5b503d610e48565b8a513d8a823e3d90fd5b50995050935050509250610e949150826060820152610ed2565b92565b90508781813d8311610ec1575b610eae8183610935565b81010312610ebd575138610d50565b8380fd5b503d610ea4565b86513d86823e3d90fd5b90610edb610bf6565b90602092838101516001600160a01b0394858351169560409283519063057ff68760e51b825283826004816000809d5af19182156110ef5789926110bc575b500361107c575a938181511690848101519060608091015190833b1561107857918a939187519586947f6171d1c9000000000000000000000000000000000000000000000000000000008652896044870191816004890152855180935260648801908b60648560051b8b01019701948c8b945b86861061102357505050505050505083610fb5819387936003198483030160248501526109ba565b03925af19081610ff1575b50610cf89495965015600014610fe55750610fd9610c73565b908501525b5a90610ca3565b60019150850152610fde565b67ffffffffffffffff811161100f5783529495508594610cf8610fc0565b602488634e487b7160e01b81526041600452fd5b8193611060929396999b9d5080979a81838b9f9b6001999c606319908503018d52518a8151168452878101518885015201519382015201906109ba565b99019401940190938f989694928a9896938c8e610f8d565b8a80fd5b5092945090507f4e4f4e43455f4552524f520000000000000000000000000000000000000000008151926110af84610919565b600b845283015282015290565b9091508381813d83116110e8575b6110d48183610935565b810103126110e457519038610f1a565b8880fd5b503d6110ca565b85513d8b823e3d90fd5b60405190611106826108e1565b6060808360008152600060208201528160408201520152565b6040519061112c82610919565b600182528160005b602090818110156111565760209161114a610bf6565b90828501015201611134565b505050565b9392909161116981866114c6565b9483519261117684610a26565b9460409461118686519788610935565b808752611195601f1991610a26565b0160005b8181106114615750508560005b82518114611456576001600160a01b03806111c18386610c5f565b5116906111cc6110f9565b8188168082528a519263057ff68760e51b8452602094600494868187816000885af190811561144b578f908f8f948e918b97958d9460009161140c575b50888b015261121661111f565b818b019781895260608c0152821560001461130d5750505050908461124461125d9594936001983193610c5f565b5101526112518251610c3c565b51908c16905251610c3c565b5101525b8261126c858d610c5f565b510151611285575b50505061128090610c17565b6111a6565b61128e90610ed2565b918c83518061129f575b5050611274565b106112cb575050906112b58b6112809351610ca3565b6112bf828b610c5f565b51529038808c81611298565b6064925089519162461bcd60e51b8352820152601a60248201527f494d504f535349424c455f4741535f434f4e53554d5054494f4e0000000000006044820152fd5b958261131f8a9799959b949698610c3c565b51528151907fa9059cbb000000000000000000000000000000000000000000000000000000008783015260249a168a8201528161137060449560018785015286845261136a846108e1565b51610c3c565b510152519788937fc3a8962c0000000000000000000000000000000000000000000000000000000085528b85015283015281305afa600094816113d2575b506113bd575b50505050611261565b6113c691610c5f565b51015238838c866113b4565b9384919593508092503d8311611405575b6113ed8183610935565b8101031261140257508c8686925193386113ae565b80fd5b503d6113e3565b9698945094505094505082813d8311611444575b61142a8183610935565b810103126114025750918e888f8f948e918b975138611209565b503d611420565b8e513d6000823e3d90fd5b509750505050505050565b8651908782019180831067ffffffffffffffff8411176105df5760209289526000815282600081830152828b01015201611199565b1561149e5750565b6114c29060405191829162461bcd60e51b83526020600484015260248301906109ba565b0390fd5b906001600160a01b036114d76110f9565b921680835260409081519363057ff68760e51b93848652602095600093878260048188855af19182156116f35785929189918493611783575b5081860192835261151f61111f565b8887019581875260608801526115353091610c3c565b5152600461154287610ed2565b99611562848c015115158b8d0180515115156000146116fd575190611496565b8951958693849283525af19182156116f35785926116c0575b50528351611588816108fd565b6002815286845b8681106116aa5750508082526115a53091610c3c565b515251805160011015611696578392916115c7916115ea953091015152610ed2565b9480860151151592808701928351511515905060001461160f5750505190611496565b805191519182811161160a5761160390610a2393610ca3565b9051610ca3565b505090565b7f7574652074776f43616c6c4f704f7574636f6d652c2063616e6e6f742063616c9192507f63616c63756c617465426173654665653a20756e61626c6520746f2065786563815193611660856108e1565b604a85528401528201527f6320626173652066656500000000000000000000000000000000000000000000606082015290611496565b602483634e487b7160e01b81526032600452fd5b6116b2610bf6565b82828501015201879061158f565b9091508781813d83116116ec575b6116d88183610935565b810103126116e85751903861157b565b8480fd5b503d6116ce565b86513d87823e3d90fd5b508b51611709816108e1565b604881527f63616c63756c617465426173654665653a20756e61626c6520746f2065786563878201527f75746520656d7074794f704f7574636f6d652c2063616e6e6f742063616c63208d8201527f6261736520666565000000000000000000000000000000000000000000000000606082015290611496565b9250925081813d83116117ae575b61179b8183610935565b810103126116e857518491889038611510565b503d61179156fea2646970667358221220e6d0e5354610c90404b44bf88730f94cad23f3112b1f6d2513ee501c6a50ae9c64736f6c63430008130033", "binRuntime": "0x60806040526004361015610018575b361561001657005b005b60003560e01c806306302eef146108515780634af194a61461078b578063bbd1dc50146106fa578063c3a8962c14610649578063d8d16e0f146105f55763f860705c0361000e57346104d0576101203660031901126104d0576100796108a1565b6100816108cb565b67ffffffffffffffff916044358381116104d0576100a3903690600401610973565b906064358481116104d0576100bc903690600401610aa4565b906084358581116104d0576100d5903690600401610aa4565b9160a4358681116104d0576100ee903690600401610a3e565b9160c4358781116104d057610107903690600401610a3e565b916001600160a01b0360e4351660e435036104d057610104358881116104d057610135903690600401610a3e565b956040519889610100810110906101008b0111176105df57610100890160405261015d610bf6565b8952610167610bf6565b60208a0152610174610bf6565b60408a0152600060608a0152606060808a0152606060a08a0152606060c08a0152600060e08a015286516101a781610a26565b906101b56040519283610935565b8082526101c4601f1991610a26565b0136602083013760c08a015260005b898851821461020f579061020a916102048260c06001600160a01b036101f9838f610c5f565b511631930151610c5f565b52610c17565b6101d3565b97505061021f6020918985610cb0565b80885201511515806105d1575b6105be575b60208651015115159081610599575b506104f1575b5050805161036f575b5050604051602081526102a261028c610276845161010060208601526101208501906109fa565b6020850151848203601f190160408601526109fa565b6040840151838203601f190160608501526109fa565b606083015160808301526080830151601f198383030160a08401526020808251938481520191019160005b81811061034357505060a0840151838203601f190160c08501526102f19250610bc2565b60c083015190601f198382030160e08401526020808351928381520192019060005b81811061032d5750505060e0829301516101008301520390f35b8251845260209384019390920191600101610313565b90916020610364600192865190602060409280518352015160208201520190565b9401939291016102cd565b60009160005b825181146104e957600060206001600160a01b0384511660246001600160a01b036103a08689610c5f565b5116604051948593849263c066a5b160e01b845260048401525af19081156104dd576000916104a6575b506103dd576103d890610c17565b610375565b5050505060015b156103f057818061024f565b60c460405162461bcd60e51b815260206004820152606d60248201527f416e74692d627269636b696e6720636865636b206661696c65642c207468697360448201527f206d65616e732074686174206e6f6e65206f662074686520706173736564206160648201527f73736f6369617465644b657973206861732070726976696c656765732061667460848201527f65722073696d756c6174696f6e0000000000000000000000000000000000000060a4820152fd5b90506020813d6020116104d5575b816104c160209383610935565b810103126104d05751866103ca565b600080fd5b3d91506104b4565b6040513d6000823e3d90fd5b5050506103e4565b6104fb8385610d07565b919060a08801526040870152600060206001600160a01b0387511660046040518094819363057ff68760e51b83525af19081156104dd57600091610567575b506060870152825161054d575b50610246565b61055a9260e4359261115b565b6080840152838080610547565b90506020813d602011610591575b8161058260209383610935565b810103126104d057518761053a565b3d9150610575565b604091500151511580156105ae575b86610240565b50602080860151015115156105a8565b6105c781610ed2565b6020870152610231565b50604081015151151561022c565b634e487b7160e01b600052604160045260246000fd5b346104d05760203660031901126104d05760043567ffffffffffffffff81116104d05761063161062c610645923690600401610aa4565b610ed2565b6040519182916020835260208301906109fa565b0390f35b346104d05760403660031901126104d0576004356001600160a01b038082168092036104d057602090602461067c6108cb565b60405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa80156104dd576000906106c8575b602090604051908152f35b506020813d82116106f2575b816106e160209383610935565b810103126104d057602090516106bd565b3d91506106d4565b346104d05760403660031901126104d05767ffffffffffffffff6004358181116104d05761072c903690600401610aa4565b906024359081116104d05761064561075861076f9361075261077d943690600401610a3e565b90610d07565b9193906040519586956060875260608701906109fa565b908582036020870152610bc2565b9083820360408501526109ba565b346104d05760803660031901126104d0576107a46108a1565b67ffffffffffffffff6024358181116104d0576107c5903690600401610a3e565b906044359081116104d0576107de903690600401610973565b606435916001600160a01b03831683036104d0576107fb9361115b565b6040516020918282018383528151809152836040840192019360005b8281106108245784840385f35b90919282610845600192885190602060409280518352015160208201520190565b96019593929101610817565b346104d05760603660031901126104d05761086a6108a1565b6108726108cb565b906044359067ffffffffffffffff82116104d0576106459261089b610631933690600401610973565b91610cb0565b600435906001600160a01b03821682036104d057565b35906001600160a01b03821682036104d057565b602435906001600160a01b03821682036104d057565b6080810190811067ffffffffffffffff8211176105df57604052565b6060810190811067ffffffffffffffff8211176105df57604052565b6040810190811067ffffffffffffffff8211176105df57604052565b90601f8019910116810190811067ffffffffffffffff8211176105df57604052565b67ffffffffffffffff81116105df57601f01601f191660200190565b81601f820112156104d05780359061098a82610957565b926109986040519485610935565b828452602083830101116104d057816000926020809301838601378301015290565b919082519283825260005b8481106109e6575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016109c5565b9060606040610a23938051845260208101511515602085015201519181604082015201906109ba565b90565b67ffffffffffffffff81116105df5760051b60200190565b81601f820112156104d057803591610a5583610a26565b92610a636040519485610935565b808452602092838086019260051b8201019283116104d0578301905b828210610a8d575050505090565b838091610a99846108b7565b815201910190610a7f565b9190916080818403126104d0576040805191610abf836108e1565b8294610aca826108b7565b84526020828101358186015267ffffffffffffffff93808401358581116104d05784019183601f840112156104d057823592610b0584610a26565b93610b1284519586610935565b808552828086019160051b830101918683116104d057838101915b838310610b5a57505050505085015260608201359283116104d057606092610b559201610973565b910152565b82358a81116104d05782019060609081601f19848c0301126104d057875191610b82836108fd565b610b8d8885016108b7565b83528884013588840152830135918c83116104d057610bb38b8980969581960101610973565b89820152815201920191610b2d565b90815180825260208080930193019160005b828110610be2575050505090565b835185529381019392810192600101610bd4565b60405190610c03826108fd565b606060408360008152600060208201520152565b6000198114610c265760010190565b634e487b7160e01b600052601160045260246000fd5b805115610c495760200190565b634e487b7160e01b600052603260045260246000fd5b8051821015610c495760209160051b010190565b3d15610c9e573d90610c8482610957565b91610c926040519384610935565b82523d6000602084013e565b606090565b91908203918211610c2657565b92916001600160a01b03610cc2610bf6565b94163b610cfc5790600080610cf8935a9382602083519301915af1610ce5610c73565b6040860152151560208501525a90610ca3565b8252565b505060016020830152565b919091610d12610bf6565b5060606001600160a01b03908183511690604091825163057ff68760e51b815260209560049187818481600080985af1908115610ec8578491610e97575b5087820152885198610d618a610a26565b99610d6e87519b8c610935565b808b52610d7d601f1991610a26565b0136898c01378998845b82518114610e7a5788610d9a8285610c5f565b5116868b8b87511660248c518094819363c066a5b160e01b8352878d8401525af1908115610e70578e84918a93610e39575b508291610dd891610c5f565b52610ded575b50610de890610c17565b610d87565b8751610dde57610de89197508851908b8201527f03000000000000000000000000000000000000000000000000000000000000008982015260218152610e32816108fd565b9690610dde565b925050508b81813d8311610e69575b610e528183610935565b81010312610e655751828e610dd8610dcc565b8780fd5b503d610e48565b8a513d8a823e3d90fd5b50995050935050509250610e949150826060820152610ed2565b92565b90508781813d8311610ec1575b610eae8183610935565b81010312610ebd575138610d50565b8380fd5b503d610ea4565b86513d86823e3d90fd5b90610edb610bf6565b90602092838101516001600160a01b0394858351169560409283519063057ff68760e51b825283826004816000809d5af19182156110ef5789926110bc575b500361107c575a938181511690848101519060608091015190833b1561107857918a939187519586947f6171d1c9000000000000000000000000000000000000000000000000000000008652896044870191816004890152855180935260648801908b60648560051b8b01019701948c8b945b86861061102357505050505050505083610fb5819387936003198483030160248501526109ba565b03925af19081610ff1575b50610cf89495965015600014610fe55750610fd9610c73565b908501525b5a90610ca3565b60019150850152610fde565b67ffffffffffffffff811161100f5783529495508594610cf8610fc0565b602488634e487b7160e01b81526041600452fd5b8193611060929396999b9d5080979a81838b9f9b6001999c606319908503018d52518a8151168452878101518885015201519382015201906109ba565b99019401940190938f989694928a9896938c8e610f8d565b8a80fd5b5092945090507f4e4f4e43455f4552524f520000000000000000000000000000000000000000008151926110af84610919565b600b845283015282015290565b9091508381813d83116110e8575b6110d48183610935565b810103126110e457519038610f1a565b8880fd5b503d6110ca565b85513d8b823e3d90fd5b60405190611106826108e1565b6060808360008152600060208201528160408201520152565b6040519061112c82610919565b600182528160005b602090818110156111565760209161114a610bf6565b90828501015201611134565b505050565b9392909161116981866114c6565b9483519261117684610a26565b9460409461118686519788610935565b808752611195601f1991610a26565b0160005b8181106114615750508560005b82518114611456576001600160a01b03806111c18386610c5f565b5116906111cc6110f9565b8188168082528a519263057ff68760e51b8452602094600494868187816000885af190811561144b578f908f8f948e918b97958d9460009161140c575b50888b015261121661111f565b818b019781895260608c0152821560001461130d5750505050908461124461125d9594936001983193610c5f565b5101526112518251610c3c565b51908c16905251610c3c565b5101525b8261126c858d610c5f565b510151611285575b50505061128090610c17565b6111a6565b61128e90610ed2565b918c83518061129f575b5050611274565b106112cb575050906112b58b6112809351610ca3565b6112bf828b610c5f565b51529038808c81611298565b6064925089519162461bcd60e51b8352820152601a60248201527f494d504f535349424c455f4741535f434f4e53554d5054494f4e0000000000006044820152fd5b958261131f8a9799959b949698610c3c565b51528151907fa9059cbb000000000000000000000000000000000000000000000000000000008783015260249a168a8201528161137060449560018785015286845261136a846108e1565b51610c3c565b510152519788937fc3a8962c0000000000000000000000000000000000000000000000000000000085528b85015283015281305afa600094816113d2575b506113bd575b50505050611261565b6113c691610c5f565b51015238838c866113b4565b9384919593508092503d8311611405575b6113ed8183610935565b8101031261140257508c8686925193386113ae565b80fd5b503d6113e3565b9698945094505094505082813d8311611444575b61142a8183610935565b810103126114025750918e888f8f948e918b975138611209565b503d611420565b8e513d6000823e3d90fd5b509750505050505050565b8651908782019180831067ffffffffffffffff8411176105df5760209289526000815282600081830152828b01015201611199565b1561149e5750565b6114c29060405191829162461bcd60e51b83526020600484015260248301906109ba565b0390fd5b906001600160a01b036114d76110f9565b921680835260409081519363057ff68760e51b93848652602095600093878260048188855af19182156116f35785929189918493611783575b5081860192835261151f61111f565b8887019581875260608801526115353091610c3c565b5152600461154287610ed2565b99611562848c015115158b8d0180515115156000146116fd575190611496565b8951958693849283525af19182156116f35785926116c0575b50528351611588816108fd565b6002815286845b8681106116aa5750508082526115a53091610c3c565b515251805160011015611696578392916115c7916115ea953091015152610ed2565b9480860151151592808701928351511515905060001461160f5750505190611496565b805191519182811161160a5761160390610a2393610ca3565b9051610ca3565b505090565b7f7574652074776f43616c6c4f704f7574636f6d652c2063616e6e6f742063616c9192507f63616c63756c617465426173654665653a20756e61626c6520746f2065786563815193611660856108e1565b604a85528401528201527f6320626173652066656500000000000000000000000000000000000000000000606082015290611496565b602483634e487b7160e01b81526032600452fd5b6116b2610bf6565b82828501015201879061158f565b9091508781813d83116116ec575b6116d88183610935565b810103126116e85751903861157b565b8480fd5b503d6116ce565b86513d87823e3d90fd5b508b51611709816108e1565b604881527f63616c63756c617465426173654665653a20756e61626c6520746f2065786563878201527f75746520656d7074794f704f7574636f6d652c2063616e6e6f742063616c63208d8201527f6261736520666565000000000000000000000000000000000000000000000000606082015290611496565b9250925081813d83116117ae575b61179b8183610935565b810103126116e857518491889038611510565b503d61179156fea2646970667358221220e6d0e5354610c90404b44bf88730f94cad23f3112b1f6d2513ee501c6a50ae9c64736f6c63430008130033" } +{ "abi": [{ "stateMutability": "payable", "type": "fallback" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }, { "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct EstimationStructs.AccountOp", "name": "preExecute", "type": "tuple" }, { "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct EstimationStructs.AccountOp", "name": "op", "type": "tuple" }, { "internalType": "bytes", "name": "probableCallData", "type": "bytes" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address[]", "name": "feeTokens", "type": "address[]" }, { "internalType": "address", "name": "relayer", "type": "address" }, { "internalType": "address[]", "name": "checkNativeAssetOn", "type": "address[]" }, { "internalType": "address", "name": "oracle", "type": "address" }], "name": "estimate", "outputs": [{ "components": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "deployment", "type": "tuple" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "accountOpToExecuteBefore", "type": "tuple" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "op", "type": "tuple" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct EstimationStructs.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "uint256[]", "name": "nativeAssetBalances", "type": "uint256[]" }, { "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "baseFee", "type": "uint256" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithNativePayment", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithTransferPayment", "type": "uint256" }], "internalType": "struct Estimation.L1GasEstimation", "name": "l1GasEstimation", "type": "tuple" }], "internalType": "struct Estimation.EstimationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct EstimationStructs.AccountOp", "name": "op", "type": "tuple" }, { "internalType": "bytes", "name": "probableCallData", "type": "bytes" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }, { "internalType": "address", "name": "relayer", "type": "address" }, { "internalType": "address", "name": "oracle", "type": "address" }], "name": "estimateEoa", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct EstimationStructs.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }, { "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "baseFee", "type": "uint256" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithNativePayment", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithTransferPayment", "type": "uint256" }], "internalType": "struct Estimation.L1GasEstimation", "name": "l1GasEstimation", "type": "tuple" }], "internalType": "struct Estimation.EoaEstimationOutcome", "name": "eoa", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IERC20Subset", "name": "token", "type": "address" }, { "internalType": "address", "name": "addr", "type": "address" }], "name": "getERC20Balance", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "feeTokens", "type": "address[]" }], "name": "getFeeTokenBalances", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct EstimationStructs.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "address", "name": "feeCollector", "type": "address" }, { "internalType": "address", "name": "oracleAddr", "type": "address" }], "name": "getL1GasEstimation", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "baseFee", "type": "uint256" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithNativePayment", "type": "uint256" }, { "internalType": "uint256", "name": "feeWithTransferPayment", "type": "uint256" }], "internalType": "struct Estimation.L1GasEstimation", "name": "l1GasEstimation", "type": "tuple" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }], "name": "getSpoof", "outputs": [{ "internalType": "bytes", "name": "spoofSig", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address", "name": "factory", "type": "address" }, { "internalType": "bytes", "name": "factoryCalldata", "type": "bytes" }], "name": "simulateDeployment", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "address[]", "name": "feeTokens", "type": "address[]" }, { "internalType": "bytes", "name": "spoofSig", "type": "bytes" }, { "internalType": "address", "name": "relayer", "type": "address" }, { "internalType": "uint256", "name": "baseGasConsumption", "type": "uint256" }], "name": "simulateFeePayments", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }], "internalType": "struct EstimationStructs.FeeTokenOutcome[]", "name": "feeTokenOutcomes", "type": "tuple[]" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct EstimationStructs.AccountOp", "name": "op", "type": "tuple" }], "name": "simulateSigned", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "outcome", "type": "tuple" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "components": [{ "internalType": "contract IAmbireAccount", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct IAmbireAccount.Transaction[]", "name": "calls", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "internalType": "struct EstimationStructs.AccountOp", "name": "op", "type": "tuple" }, { "internalType": "address[]", "name": "associatedKeys", "type": "address[]" }], "name": "simulateUnsigned", "outputs": [{ "components": [{ "internalType": "uint256", "name": "gasUsed", "type": "uint256" }, { "internalType": "bool", "name": "success", "type": "bool" }, { "internalType": "bytes", "name": "err", "type": "bytes" }], "internalType": "struct EstimationStructs.SimulationOutcome", "name": "outcome", "type": "tuple" }, { "internalType": "bytes32[]", "name": "associatedKeyPrivileges", "type": "bytes32[]" }, { "internalType": "bytes", "name": "spoofSig", "type": "bytes" }], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }], "bin": "0x60808060405234610016576123a1908161001c8239f35b600080fdfe60806040526004361015610018575b361561001657005b005b60003560e01c806306302eef14610c3357806306e70c7814610ba257806320cdc28614610b2a578063255ee7541461091f578063299ab72a146108f1578063a012c980146108c3578063bbd1dc5014610832578063c3a8962c14610781578063d8d16e0f146107315763e11e41fa0361000e573461054657610160366003190112610546576100a5610c83565b6100ad610cad565b67ffffffffffffffff91604435838111610546576100cf903690600401610d71565b90606435848111610546576100e8903690600401610f17565b9060843585811161054657610101903690600401610f17565b9160a4358681116105465761011a903690600401610e2c565b9260c43588811161054657610133903690600401610e72565b9360e4358981116105465761014c903690600401610e72565b926001600160a01b036101043516610104350361054657610124358a81116105465761017c903690600401610e72565b976001600160a01b0361014435166101443503610546576040519a8b610120810110906101208d01111761071b576101208b016040526101ba6110a9565b8b526101c46110a9565b60208c01526101d16110a9565b60408c0152600060608c0152606060808c0152606060a08c0152606060c08c0152600060e08c01526102016110ca565b6101008c0152885161021281610e5a565b906102206040519283610d33565b80825261022f601f1991610e5a565b0136602083013760c08c015260005b8b8a51821461027b5790610276916102708260c06001600160a01b038f836102659161113d565b51163193015161113d565b526110f5565b61023e565b99505061028b6020918b86611287565b808a52015115158061070d575b6106fa575b606094602089510151151590816106d5575b50610572575b50505050815115159081610567575b506103e5575b50506040516020815261035961034361032361030d6102f786516101a060208801526101c0870190610e00565b6020870151868203601f19016040880152610e00565b6040860151858203601f19016060870152610e00565b606085015160808501526080850151601f198583030160a0860152610ed8565b60a0840151838203601f190160c0850152611075565b60c083015190601f198382030160e08401526020808351928381520192019060005b8181106103cf575050506103cb6101008460e08596015182860152015161012084019060808091805184526020810151602085015260408101516040850152606081015160608501520151910152565b0390f35b825184526020938401939092019160010161037b565b60009160005b8251811461055f57600060206001600160a01b0384511660246001600160a01b03610416868961113d565b5116604051948593849263c066a5b160e01b845260048401525af19081156105535760009161051c575b506104535761044e906110f5565b6103eb565b5050505060015b156104665781806102ca565b60c460405162461bcd60e51b815260206004820152606d60248201527f416e74692d627269636b696e6720636865636b206661696c65642c207468697360448201527f206d65616e732074686174206e6f6e65206f662074686520706173736564206160648201527f73736f6369617465644b657973206861732070726976696c656765732061667460848201527f65722073696d756c6174696f6e0000000000000000000000000000000000000060a4820152fd5b90506020813d60201161054b575b8161053760209383610d33565b81010312610546575186610440565b600080fd5b3d915061052a565b6040513d6000823e3d90fd5b50505061045a565b9050511515846102c4565b909192935061058185876112de565b9182969160a08b015260408a0152600060206001600160a01b038a511660046040518094819363057ff68760e51b83525af190811561055357600091610695575b50906106019560a09594939260608c01528151610653575b505050604051938492839262dce18f60e31b845261014435916101043591600486016111b8565b0381305afa90811561055357600091610625575b50610100850152848080806102b5565b610646915060a03d811161064c575b61063e8183610d33565b810190611151565b85610615565b503d610634565b8251156106815782610668610673948361155a565b926101043592611c25565b60808901525b8880806105da565b61068b9250611ed5565b6080890152610679565b9493929190506020853d6020116106cd575b816106b460209383610d33565b81010312610546579351929391929091906106016105c2565b3d91506106a7565b604091500151511580156106ea575b896102af565b50602080890151015115156106e4565b61070385612148565b602089015261029d565b506040850151511515610298565b634e487b7160e01b600052604160045260246000fd5b346105465760203660031901126105465760043567ffffffffffffffff81116105465761076d6107686103cb923690600401610f17565b612148565b604051918291602083526020830190610e00565b34610546576040366003190112610546576004356001600160a01b038082168092036105465760209060246107b4610cad565b60405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa801561055357600090610800575b602090604051908152f35b506020813d821161082a575b8161081960209383610d33565b8101031261054657602090516107f5565b3d915061080c565b346105465760403660031901126105465767ffffffffffffffff60043581811161054657610864903690600401610f17565b90602435908111610546576103cb6108906108a79361088a6108b5943690600401610e72565b906112de565b919390604051958695606087526060870190610e00565b908582036020870152611075565b908382036040850152610ddb565b34610546576103cb6108dd6108d736611035565b90611ed5565b604051918291602083526020830190610ed8565b34610546576103cb61090b61090536611035565b9061200a565b604051918291602083526020830190610ddb565b346105465760c036600319011261054657610938610c83565b67ffffffffffffffff906024358281116105465761095a903690600401610f17565b60443583811161054657610972903690600401610e2c565b90936064359081116105465761098c903690600401610e72565b90608435906001600160a01b039586831683036105465760a435878116810361054657604051966109bc88610cc3565b60008852602098610a036109ee8b8b019860608a5260408c019a6109de6110ca565b8c526109e86110a9565b506112de565b5050918316926109fd84611fc5565b9061155a565b815180821115610b1b575050515b885260405190610a2082610d17565b600182528960005b818110610af757505091610a659160a0959493318b610a468361111a565b5101528752604051958694859462dce18f60e31b8652600486016111b8565b0381305afa918215610553576103cb92610aa592600091610ad9575b50845260405195869581875251908601525160e06040860152610100850190610ed8565b9151606084019060808091805184526020810151602085015260408101516040850152606081015160608501520151910152565b610af1915060a03d811161064c5761063e8183610d33565b87610a81565b604051610b0381610d17565b60008152600083820152828286010152018a90610a28565b610b2592506111e9565b610a11565b346105465760a036600319011261054657610b43610c83565b67ffffffffffffffff60243581811161054657610b64903690600401610e72565b9060443590811161054657610b7d903690600401610d71565b916064356001600160a01b0381168103610546576103cb936108dd9360843593611c25565b346105465760603660031901126105465760043567ffffffffffffffff811161054657610bd3903690600401610e2c565b90610bdc610cad565b604435906001600160a01b03821682036105465760a093610bfc93611880565b610c31604051809260808091805184526020810151602085015260408101516040850152606081015160608501520151910152565bf35b3461054657606036600319011261054657610c4c610c83565b610c54610cad565b906044359067ffffffffffffffff8211610546576103cb92610c7d61076d933690600401610d71565b91611287565b600435906001600160a01b038216820361054657565b35906001600160a01b038216820361054657565b602435906001600160a01b038216820361054657565b6060810190811067ffffffffffffffff82111761071b57604052565b6080810190811067ffffffffffffffff82111761071b57604052565b60a0810190811067ffffffffffffffff82111761071b57604052565b6040810190811067ffffffffffffffff82111761071b57604052565b90601f8019910116810190811067ffffffffffffffff82111761071b57604052565b67ffffffffffffffff811161071b57601f01601f191660200190565b81601f8201121561054657803590610d8882610d55565b92610d966040519485610d33565b8284526020838301011161054657816000926020809301838601378301015290565b60005b838110610dcb5750506000910152565b8181015183820152602001610dbb565b90602091610df481518092818552858086019101610db8565b601f01601f1916010190565b9060606040610e2993805184526020810151151560208501520151918160408201520190610ddb565b90565b9181601f840112156105465782359167ffffffffffffffff8311610546576020838186019501011161054657565b67ffffffffffffffff811161071b5760051b60200190565b81601f8201121561054657803591610e8983610e5a565b92610e976040519485610d33565b808452602092838086019260051b820101928311610546578301905b828210610ec1575050505090565b838091610ecd84610c99565b815201910190610eb3565b90815180825260208080930193019160005b828110610ef8575050505090565b8351805186528201518583015260409094019392810192600101610eea565b919091608081840312610546576040805191610f3283610cdf565b8294610f3d82610c99565b84526020828101358186015267ffffffffffffffff93808401358581116105465784019183601f8401121561054657823592610f7884610e5a565b93610f8584519586610d33565b808552828086019160051b8301019186831161054657838101915b838310610fcd575050505050850152606082013592831161054657606092610fc89201610d71565b910152565b82358a81116105465782019060609081601f19848c03011261054657875191610ff583610cc3565b611000888501610c99565b83528884013588840152830135918c8311610546576110268b8980969581960101610d71565b89820152815201920191610fa0565b906040600319830112610546576004356001600160a01b038116810361054657916024359067ffffffffffffffff821161054657610e2991600401610e72565b90815180825260208080930193019160005b828110611095575050505090565b835185529381019392810192600101611087565b604051906110b682610cc3565b606060408360008152600060208201520152565b604051906110d782610cfb565b60006080838281528260208201528260408201528260608201520152565b60001981146111045760010190565b634e487b7160e01b600052601160045260246000fd5b8051156111275760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156111275760209160051b010190565b908160a09103126105465760806040519161116b83610cfb565b805183526020810151602084015260408101516040840152606081015160608401520151608082015290565b908060209392818452848401376000828201840152601f01601f1916010190565b92906111d290604093969596606086526060860191611197565b946001600160a01b03809216602085015216910152565b9190820391821161110457565b9061120082610e5a565b60409061120f82519182610d33565b8381528093611220601f1991610e5a565b0191600090815b848110611235575050505050565b602090825161124381610d17565b848152828581830152828701015201611227565b3d15611282573d9061126882610d55565b916112766040519384610d33565b82523d6000602084013e565b606090565b92916001600160a01b036112996110a9565b94163b6112d357906000806112cf935a9382602083519301915af16112bc611257565b6040860152151560208501525a906111e9565b8252565b505060016020830152565b6112e66110a9565b916060906001600160a01b03928381511660409283519263057ff68760e51b845260209160049483818781600080995af19081156114be57859161148d575b50838301528051996113368b610e5a565b9a61134388519c8d610d33565b808c52611352601f1991610e5a565b0136858d01378a855b83518114611422578689878d60248c82611375888c61113d565b51169586938c51169551958694859363c066a5b160e01b85528401525af1908115611418578f84918b936113e1575b5082916113b09161113d565b526113c5575b506113c0906110f5565b61135b565b8a516113b6576113c0919a506113da90611fc5565b99906113b6565b925050508781813d8311611411575b6113fa8183610d33565b8101031261140d5751828f6113b06113a4565b8880fd5b503d6113f0565b8b513d8b823e3d90fd5b509996945099505094955091508460608501528451151560001461144f5750505061144c90612148565b92565b90919592507f53504f4f465f4552524f5200000000000000000000000000000000000000000081519261148184610d17565b600b8452830152850152565b90508381813d83116114b7575b6114a48183610d33565b810103126114b3575138611325565b8480fd5b503d61149a565b87513d87823e3d90fd5b604051906114d582610cdf565b6060808360008152600060208201528160408201520152565b604051906114fb82610d17565b600182528160005b60209081811015611525576020916115196110a9565b90828501015201611503565b505050565b156115325750565b6115569060405191829162461bcd60e51b8352602060048401526024830190610ddb565b0390fd5b906001600160a01b0361156b6114c8565b921680835260409081519363057ff68760e51b93848652602095600093878260048188855af19182156117835785929189918493611813575b508186019283526115b36114ee565b8887019581875260608801526115c9309161111a565b515260046115d687612148565b996115f6848c015115158b8d01805151151560001461178d57519061152a565b8951958693849283525af1918215611783578592611754575b5052835161161c81610cc3565b6002815286845b86811061173e575050808252611639309161111a565b51525180516001101561172a5783929161165b9161167e953091015152612148565b948086015115159280870192835151151590506000146116a3575050519061152a565b805191519182811161169e5761169790610e29936111e9565b90516111e9565b505090565b7f7574652074776f43616c6c4f704f7574636f6d652c2063616e6e6f742063616c9192507f63616c63756c617465426173654665653a20756e61626c6520746f20657865638151936116f485610cdf565b604a85528401528201527f632062617365206665650000000000000000000000000000000000000000000060608201529061152a565b602483634e487b7160e01b81526032600452fd5b6117466110a9565b828285010152018790611623565b9091508781813d831161177c575b61176c8183610d33565b810103126114b35751903861160f565b503d611762565b86513d87823e3d90fd5b508b5161179981610cdf565b604881527f63616c63756c617465426173654665653a20756e61626c6520746f2065786563878201527f75746520656d7074794f704f7574636f6d652c2063616e6e6f742063616c63208d8201527f626173652066656500000000000000000000000000000000000000000000000060608201529061152a565b9250925081813d831161183e575b61182b8183610d33565b810103126114b3575184918890386115a4565b503d611821565b6020908161187e939594611872876040519889958587013784019183830160008152815194859201610db8565b01038085520183610d33565b565b93929161188b6110ca565b946001600160a01b038094168015611c1e5760409485519316926020948486830152600187830152606080830152600260808301527f307800000000000000000000000000000000000000000000000000000000000060a083015260a0825260c082019382851067ffffffffffffffff86111761071b5784885263a9059cbb60e01b60e08401528560e484015260016101048401526044855261192d85610cdf565b8751958787015261196186611953600097888c8401526060808401526080830190610ddb565b03601f198101885287610d33565b87517fde26c4a100000000000000000000000000000000000000000000000000000000815287600482015287818061199d602482018787611197565b0381885afa908115611ba4578691611bed575b508a528751927f49948e0e00000000000000000000000000000000000000000000000000000000938481528860048201528881806119f2602482018888611197565b0381895afa908115611be357908a8d8b938a93611bae575b500152611a3591611a1c908585611845565b8a51809381928883528460048401526024830190610ddb565b0381885afa908115611ba457908b89959493928892611b5e575b5060600152611a7d96611a63929091611845565b908751958692839283528460048401526024830190610ddb565b0381845afa928315611b54579084918394611b1c575b5060049360808901528551938480927f519b4bd30000000000000000000000000000000000000000000000000000000082525afa938415611b1257508093611add575b5050830152565b909180935082813d8311611b0b575b611af68183610d33565b81010312611b08575051903880611ad6565b80fd5b503d611aec565b51903d90823e3d90fd5b828193929495503d8311611b4d575b611b358183610d33565b81010312611b495751919083906004611a93565b8280fd5b503d611b2b565b85513d84823e3d90fd5b929394969798958092508391503d8311611b9d575b611b7d8183610d33565b81010312611b995751929594938793909291908b611a7d611a4f565b8680fd5b503d611b73565b89513d88823e3d90fd5b939250505081813d8311611bdc575b611bc78183610d33565b81010312611b99575188908a8d611a35611a0a565b503d611bbd565b8a513d89823e3d90fd5b90508781813d8311611c17575b611c048183610d33565b81010312611c135751386119b0565b8580fd5b503d611bfa565b5050505050565b94939492919092611c3684516111f6565b9360005b81518114611ecc576001600160a01b0380611c55838561113d565b5116611c5f6114c8565b908286169182815260409384519363057ff68760e51b8552602093600495858188816000875af1908115611ec157898f91948f948f97948a97600091611e83575b50878a01528b611cae6114ee565b818b0199818b5260608c01528215600014611da6575050509185611cdc6001989593611cf49795319361113d565b510152611ce9835161111a565b51911690525161111a565b5101525b81611d03868c61113d565b510151611d1d575b50505050611d18906110f5565b611c3a565b611d2690612148565b928b845180611d37575b5050611d0b565b10611d655750505090611d4e89611d1893516111e9565b611d58828961113d565b5152903880808b81611d30565b60649350519162461bcd60e51b8352820152601a60248201527f494d504f535349424c455f4741535f434f4e53554d5054494f4e0000000000006044820152fd5b611df093979550829691945091611dc0611e269a9361111a565b515283519463a9059cbb60e01b8987015216602485015260446001818601528452611dea84610cdf565b5161111a565b510152875193849283926330ea258b60e21b84528984019060209093929360408301946001600160a01b03809216845216910152565b0381305afa60009181611e54575b50611e40575b50611cf8565b82611e4b878d61113d565b51015238611e3a565b90918482813d8311611e7c575b611e6b8183610d33565b81010312611b085750519038611e34565b503d611e61565b9598509350945094905082813d8311611eba575b611ea18183610d33565b81010312611b085750928d8987948f948f975138611ca0565b503d611e97565b88513d6000823e3d90fd5b50505050509150565b9190611ee181516111f6565b9060005b81518114611fbf576001600160a01b039081611f01828561113d565b511680611f295750611f24918616316020611f1c838761113d565b5101526110f5565b611ee5565b6040516330ea258b60e21b81526001600160a01b03918216600482015292871616602483015260208083604481305afa9081600092611f88575b611f249450611f74575b50506110f5565b611f7e838761113d565b5101523880611f6d565b929390918282813d8311611fb8575b611fa18183610d33565b81010312611b08575090611f249392915191611f63565b503d611f97565b50509150565b6001600160a01b03604051911660208201527f0300000000000000000000000000000000000000000000000000000000000000604082015260218152610e2981610cc3565b908051156121045760005b815181146120c0576001600160a01b0380612030838561113d565b5116906040600081519263c066a5b160e01b84528460048501528360248160209485948c165af19182156120b6575060009161208a575b50905061207d5750612078906110f5565b612015565b915050610e299150611fc5565b82813d83116120af575b61209e8183610d33565b81010312611b085750518038612067565b503d612094565b513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fd5b906121516110a9565b90602092838101516001600160a01b0394858351169560409283519063057ff68760e51b825283826004816000809d5af1918215612361578992612332575b50036122f2575a938181511690848101519060608091015190833b156122ee57918a939187519586947f6171d1c9000000000000000000000000000000000000000000000000000000008652896044870191816004890152855180935260648801908b60648560051b8b01019701948c8b945b8686106122995750505050505050508361222b81938793600319848303016024850152610ddb565b03925af19081612267575b506112cf949596501560001461225b575061224f611257565b908501525b5a906111e9565b60019150850152612254565b67ffffffffffffffff811161228557835294955085946112cf612236565b602488634e487b7160e01b81526041600452fd5b81936122d6929396999b9d5080979a81838b9f9b6001999c606319908503018d52518a815116845287810151888501520151938201520190610ddb565b99019401940190938f989694928a9896938c8e612203565b8a80fd5b5092945090507f4e4f4e43455f4552524f5200000000000000000000000000000000000000000081519261232584610d17565b600b845283015282015290565b9091508381813d831161235a575b61234a8183610d33565b8101031261140d57519038612190565b503d612340565b85513d8b823e3d90fdfea26469706673582212209d90dc61e383710deb860ff305f11cafe5b610571c89c22345590a0d1d71ba4864736f6c63430008130033", "binRuntime": "0x60806040526004361015610018575b361561001657005b005b60003560e01c806306302eef14610c3357806306e70c7814610ba257806320cdc28614610b2a578063255ee7541461091f578063299ab72a146108f1578063a012c980146108c3578063bbd1dc5014610832578063c3a8962c14610781578063d8d16e0f146107315763e11e41fa0361000e573461054657610160366003190112610546576100a5610c83565b6100ad610cad565b67ffffffffffffffff91604435838111610546576100cf903690600401610d71565b90606435848111610546576100e8903690600401610f17565b9060843585811161054657610101903690600401610f17565b9160a4358681116105465761011a903690600401610e2c565b9260c43588811161054657610133903690600401610e72565b9360e4358981116105465761014c903690600401610e72565b926001600160a01b036101043516610104350361054657610124358a81116105465761017c903690600401610e72565b976001600160a01b0361014435166101443503610546576040519a8b610120810110906101208d01111761071b576101208b016040526101ba6110a9565b8b526101c46110a9565b60208c01526101d16110a9565b60408c0152600060608c0152606060808c0152606060a08c0152606060c08c0152600060e08c01526102016110ca565b6101008c0152885161021281610e5a565b906102206040519283610d33565b80825261022f601f1991610e5a565b0136602083013760c08c015260005b8b8a51821461027b5790610276916102708260c06001600160a01b038f836102659161113d565b51163193015161113d565b526110f5565b61023e565b99505061028b6020918b86611287565b808a52015115158061070d575b6106fa575b606094602089510151151590816106d5575b50610572575b50505050815115159081610567575b506103e5575b50506040516020815261035961034361032361030d6102f786516101a060208801526101c0870190610e00565b6020870151868203601f19016040880152610e00565b6040860151858203601f19016060870152610e00565b606085015160808501526080850151601f198583030160a0860152610ed8565b60a0840151838203601f190160c0850152611075565b60c083015190601f198382030160e08401526020808351928381520192019060005b8181106103cf575050506103cb6101008460e08596015182860152015161012084019060808091805184526020810151602085015260408101516040850152606081015160608501520151910152565b0390f35b825184526020938401939092019160010161037b565b60009160005b8251811461055f57600060206001600160a01b0384511660246001600160a01b03610416868961113d565b5116604051948593849263c066a5b160e01b845260048401525af19081156105535760009161051c575b506104535761044e906110f5565b6103eb565b5050505060015b156104665781806102ca565b60c460405162461bcd60e51b815260206004820152606d60248201527f416e74692d627269636b696e6720636865636b206661696c65642c207468697360448201527f206d65616e732074686174206e6f6e65206f662074686520706173736564206160648201527f73736f6369617465644b657973206861732070726976696c656765732061667460848201527f65722073696d756c6174696f6e0000000000000000000000000000000000000060a4820152fd5b90506020813d60201161054b575b8161053760209383610d33565b81010312610546575186610440565b600080fd5b3d915061052a565b6040513d6000823e3d90fd5b50505061045a565b9050511515846102c4565b909192935061058185876112de565b9182969160a08b015260408a0152600060206001600160a01b038a511660046040518094819363057ff68760e51b83525af190811561055357600091610695575b50906106019560a09594939260608c01528151610653575b505050604051938492839262dce18f60e31b845261014435916101043591600486016111b8565b0381305afa90811561055357600091610625575b50610100850152848080806102b5565b610646915060a03d811161064c575b61063e8183610d33565b810190611151565b85610615565b503d610634565b8251156106815782610668610673948361155a565b926101043592611c25565b60808901525b8880806105da565b61068b9250611ed5565b6080890152610679565b9493929190506020853d6020116106cd575b816106b460209383610d33565b81010312610546579351929391929091906106016105c2565b3d91506106a7565b604091500151511580156106ea575b896102af565b50602080890151015115156106e4565b61070385612148565b602089015261029d565b506040850151511515610298565b634e487b7160e01b600052604160045260246000fd5b346105465760203660031901126105465760043567ffffffffffffffff81116105465761076d6107686103cb923690600401610f17565b612148565b604051918291602083526020830190610e00565b34610546576040366003190112610546576004356001600160a01b038082168092036105465760209060246107b4610cad565b60405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa801561055357600090610800575b602090604051908152f35b506020813d821161082a575b8161081960209383610d33565b8101031261054657602090516107f5565b3d915061080c565b346105465760403660031901126105465767ffffffffffffffff60043581811161054657610864903690600401610f17565b90602435908111610546576103cb6108906108a79361088a6108b5943690600401610e72565b906112de565b919390604051958695606087526060870190610e00565b908582036020870152611075565b908382036040850152610ddb565b34610546576103cb6108dd6108d736611035565b90611ed5565b604051918291602083526020830190610ed8565b34610546576103cb61090b61090536611035565b9061200a565b604051918291602083526020830190610ddb565b346105465760c036600319011261054657610938610c83565b67ffffffffffffffff906024358281116105465761095a903690600401610f17565b60443583811161054657610972903690600401610e2c565b90936064359081116105465761098c903690600401610e72565b90608435906001600160a01b039586831683036105465760a435878116810361054657604051966109bc88610cc3565b60008852602098610a036109ee8b8b019860608a5260408c019a6109de6110ca565b8c526109e86110a9565b506112de565b5050918316926109fd84611fc5565b9061155a565b815180821115610b1b575050515b885260405190610a2082610d17565b600182528960005b818110610af757505091610a659160a0959493318b610a468361111a565b5101528752604051958694859462dce18f60e31b8652600486016111b8565b0381305afa918215610553576103cb92610aa592600091610ad9575b50845260405195869581875251908601525160e06040860152610100850190610ed8565b9151606084019060808091805184526020810151602085015260408101516040850152606081015160608501520151910152565b610af1915060a03d811161064c5761063e8183610d33565b87610a81565b604051610b0381610d17565b60008152600083820152828286010152018a90610a28565b610b2592506111e9565b610a11565b346105465760a036600319011261054657610b43610c83565b67ffffffffffffffff60243581811161054657610b64903690600401610e72565b9060443590811161054657610b7d903690600401610d71565b916064356001600160a01b0381168103610546576103cb936108dd9360843593611c25565b346105465760603660031901126105465760043567ffffffffffffffff811161054657610bd3903690600401610e2c565b90610bdc610cad565b604435906001600160a01b03821682036105465760a093610bfc93611880565b610c31604051809260808091805184526020810151602085015260408101516040850152606081015160608501520151910152565bf35b3461054657606036600319011261054657610c4c610c83565b610c54610cad565b906044359067ffffffffffffffff8211610546576103cb92610c7d61076d933690600401610d71565b91611287565b600435906001600160a01b038216820361054657565b35906001600160a01b038216820361054657565b602435906001600160a01b038216820361054657565b6060810190811067ffffffffffffffff82111761071b57604052565b6080810190811067ffffffffffffffff82111761071b57604052565b60a0810190811067ffffffffffffffff82111761071b57604052565b6040810190811067ffffffffffffffff82111761071b57604052565b90601f8019910116810190811067ffffffffffffffff82111761071b57604052565b67ffffffffffffffff811161071b57601f01601f191660200190565b81601f8201121561054657803590610d8882610d55565b92610d966040519485610d33565b8284526020838301011161054657816000926020809301838601378301015290565b60005b838110610dcb5750506000910152565b8181015183820152602001610dbb565b90602091610df481518092818552858086019101610db8565b601f01601f1916010190565b9060606040610e2993805184526020810151151560208501520151918160408201520190610ddb565b90565b9181601f840112156105465782359167ffffffffffffffff8311610546576020838186019501011161054657565b67ffffffffffffffff811161071b5760051b60200190565b81601f8201121561054657803591610e8983610e5a565b92610e976040519485610d33565b808452602092838086019260051b820101928311610546578301905b828210610ec1575050505090565b838091610ecd84610c99565b815201910190610eb3565b90815180825260208080930193019160005b828110610ef8575050505090565b8351805186528201518583015260409094019392810192600101610eea565b919091608081840312610546576040805191610f3283610cdf565b8294610f3d82610c99565b84526020828101358186015267ffffffffffffffff93808401358581116105465784019183601f8401121561054657823592610f7884610e5a565b93610f8584519586610d33565b808552828086019160051b8301019186831161054657838101915b838310610fcd575050505050850152606082013592831161054657606092610fc89201610d71565b910152565b82358a81116105465782019060609081601f19848c03011261054657875191610ff583610cc3565b611000888501610c99565b83528884013588840152830135918c8311610546576110268b8980969581960101610d71565b89820152815201920191610fa0565b906040600319830112610546576004356001600160a01b038116810361054657916024359067ffffffffffffffff821161054657610e2991600401610e72565b90815180825260208080930193019160005b828110611095575050505090565b835185529381019392810192600101611087565b604051906110b682610cc3565b606060408360008152600060208201520152565b604051906110d782610cfb565b60006080838281528260208201528260408201528260608201520152565b60001981146111045760010190565b634e487b7160e01b600052601160045260246000fd5b8051156111275760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156111275760209160051b010190565b908160a09103126105465760806040519161116b83610cfb565b805183526020810151602084015260408101516040840152606081015160608401520151608082015290565b908060209392818452848401376000828201840152601f01601f1916010190565b92906111d290604093969596606086526060860191611197565b946001600160a01b03809216602085015216910152565b9190820391821161110457565b9061120082610e5a565b60409061120f82519182610d33565b8381528093611220601f1991610e5a565b0191600090815b848110611235575050505050565b602090825161124381610d17565b848152828581830152828701015201611227565b3d15611282573d9061126882610d55565b916112766040519384610d33565b82523d6000602084013e565b606090565b92916001600160a01b036112996110a9565b94163b6112d357906000806112cf935a9382602083519301915af16112bc611257565b6040860152151560208501525a906111e9565b8252565b505060016020830152565b6112e66110a9565b916060906001600160a01b03928381511660409283519263057ff68760e51b845260209160049483818781600080995af19081156114be57859161148d575b50838301528051996113368b610e5a565b9a61134388519c8d610d33565b808c52611352601f1991610e5a565b0136858d01378a855b83518114611422578689878d60248c82611375888c61113d565b51169586938c51169551958694859363c066a5b160e01b85528401525af1908115611418578f84918b936113e1575b5082916113b09161113d565b526113c5575b506113c0906110f5565b61135b565b8a516113b6576113c0919a506113da90611fc5565b99906113b6565b925050508781813d8311611411575b6113fa8183610d33565b8101031261140d5751828f6113b06113a4565b8880fd5b503d6113f0565b8b513d8b823e3d90fd5b509996945099505094955091508460608501528451151560001461144f5750505061144c90612148565b92565b90919592507f53504f4f465f4552524f5200000000000000000000000000000000000000000081519261148184610d17565b600b8452830152850152565b90508381813d83116114b7575b6114a48183610d33565b810103126114b3575138611325565b8480fd5b503d61149a565b87513d87823e3d90fd5b604051906114d582610cdf565b6060808360008152600060208201528160408201520152565b604051906114fb82610d17565b600182528160005b60209081811015611525576020916115196110a9565b90828501015201611503565b505050565b156115325750565b6115569060405191829162461bcd60e51b8352602060048401526024830190610ddb565b0390fd5b906001600160a01b0361156b6114c8565b921680835260409081519363057ff68760e51b93848652602095600093878260048188855af19182156117835785929189918493611813575b508186019283526115b36114ee565b8887019581875260608801526115c9309161111a565b515260046115d687612148565b996115f6848c015115158b8d01805151151560001461178d57519061152a565b8951958693849283525af1918215611783578592611754575b5052835161161c81610cc3565b6002815286845b86811061173e575050808252611639309161111a565b51525180516001101561172a5783929161165b9161167e953091015152612148565b948086015115159280870192835151151590506000146116a3575050519061152a565b805191519182811161169e5761169790610e29936111e9565b90516111e9565b505090565b7f7574652074776f43616c6c4f704f7574636f6d652c2063616e6e6f742063616c9192507f63616c63756c617465426173654665653a20756e61626c6520746f20657865638151936116f485610cdf565b604a85528401528201527f632062617365206665650000000000000000000000000000000000000000000060608201529061152a565b602483634e487b7160e01b81526032600452fd5b6117466110a9565b828285010152018790611623565b9091508781813d831161177c575b61176c8183610d33565b810103126114b35751903861160f565b503d611762565b86513d87823e3d90fd5b508b5161179981610cdf565b604881527f63616c63756c617465426173654665653a20756e61626c6520746f2065786563878201527f75746520656d7074794f704f7574636f6d652c2063616e6e6f742063616c63208d8201527f626173652066656500000000000000000000000000000000000000000000000060608201529061152a565b9250925081813d831161183e575b61182b8183610d33565b810103126114b3575184918890386115a4565b503d611821565b6020908161187e939594611872876040519889958587013784019183830160008152815194859201610db8565b01038085520183610d33565b565b93929161188b6110ca565b946001600160a01b038094168015611c1e5760409485519316926020948486830152600187830152606080830152600260808301527f307800000000000000000000000000000000000000000000000000000000000060a083015260a0825260c082019382851067ffffffffffffffff86111761071b5784885263a9059cbb60e01b60e08401528560e484015260016101048401526044855261192d85610cdf565b8751958787015261196186611953600097888c8401526060808401526080830190610ddb565b03601f198101885287610d33565b87517fde26c4a100000000000000000000000000000000000000000000000000000000815287600482015287818061199d602482018787611197565b0381885afa908115611ba4578691611bed575b508a528751927f49948e0e00000000000000000000000000000000000000000000000000000000938481528860048201528881806119f2602482018888611197565b0381895afa908115611be357908a8d8b938a93611bae575b500152611a3591611a1c908585611845565b8a51809381928883528460048401526024830190610ddb565b0381885afa908115611ba457908b89959493928892611b5e575b5060600152611a7d96611a63929091611845565b908751958692839283528460048401526024830190610ddb565b0381845afa928315611b54579084918394611b1c575b5060049360808901528551938480927f519b4bd30000000000000000000000000000000000000000000000000000000082525afa938415611b1257508093611add575b5050830152565b909180935082813d8311611b0b575b611af68183610d33565b81010312611b08575051903880611ad6565b80fd5b503d611aec565b51903d90823e3d90fd5b828193929495503d8311611b4d575b611b358183610d33565b81010312611b495751919083906004611a93565b8280fd5b503d611b2b565b85513d84823e3d90fd5b929394969798958092508391503d8311611b9d575b611b7d8183610d33565b81010312611b995751929594938793909291908b611a7d611a4f565b8680fd5b503d611b73565b89513d88823e3d90fd5b939250505081813d8311611bdc575b611bc78183610d33565b81010312611b99575188908a8d611a35611a0a565b503d611bbd565b8a513d89823e3d90fd5b90508781813d8311611c17575b611c048183610d33565b81010312611c135751386119b0565b8580fd5b503d611bfa565b5050505050565b94939492919092611c3684516111f6565b9360005b81518114611ecc576001600160a01b0380611c55838561113d565b5116611c5f6114c8565b908286169182815260409384519363057ff68760e51b8552602093600495858188816000875af1908115611ec157898f91948f948f97948a97600091611e83575b50878a01528b611cae6114ee565b818b0199818b5260608c01528215600014611da6575050509185611cdc6001989593611cf49795319361113d565b510152611ce9835161111a565b51911690525161111a565b5101525b81611d03868c61113d565b510151611d1d575b50505050611d18906110f5565b611c3a565b611d2690612148565b928b845180611d37575b5050611d0b565b10611d655750505090611d4e89611d1893516111e9565b611d58828961113d565b5152903880808b81611d30565b60649350519162461bcd60e51b8352820152601a60248201527f494d504f535349424c455f4741535f434f4e53554d5054494f4e0000000000006044820152fd5b611df093979550829691945091611dc0611e269a9361111a565b515283519463a9059cbb60e01b8987015216602485015260446001818601528452611dea84610cdf565b5161111a565b510152875193849283926330ea258b60e21b84528984019060209093929360408301946001600160a01b03809216845216910152565b0381305afa60009181611e54575b50611e40575b50611cf8565b82611e4b878d61113d565b51015238611e3a565b90918482813d8311611e7c575b611e6b8183610d33565b81010312611b085750519038611e34565b503d611e61565b9598509350945094905082813d8311611eba575b611ea18183610d33565b81010312611b085750928d8987948f948f975138611ca0565b503d611e97565b88513d6000823e3d90fd5b50505050509150565b9190611ee181516111f6565b9060005b81518114611fbf576001600160a01b039081611f01828561113d565b511680611f295750611f24918616316020611f1c838761113d565b5101526110f5565b611ee5565b6040516330ea258b60e21b81526001600160a01b03918216600482015292871616602483015260208083604481305afa9081600092611f88575b611f249450611f74575b50506110f5565b611f7e838761113d565b5101523880611f6d565b929390918282813d8311611fb8575b611fa18183610d33565b81010312611b08575090611f249392915191611f63565b503d611f97565b50509150565b6001600160a01b03604051911660208201527f0300000000000000000000000000000000000000000000000000000000000000604082015260218152610e2981610cc3565b908051156121045760005b815181146120c0576001600160a01b0380612030838561113d565b5116906040600081519263c066a5b160e01b84528460048501528360248160209485948c165af19182156120b6575060009161208a575b50905061207d5750612078906110f5565b612015565b915050610e299150611fc5565b82813d83116120af575b61209e8183610d33565b81010312611b085750518038612067565b503d612094565b513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fd5b906121516110a9565b90602092838101516001600160a01b0394858351169560409283519063057ff68760e51b825283826004816000809d5af1918215612361578992612332575b50036122f2575a938181511690848101519060608091015190833b156122ee57918a939187519586947f6171d1c9000000000000000000000000000000000000000000000000000000008652896044870191816004890152855180935260648801908b60648560051b8b01019701948c8b945b8686106122995750505050505050508361222b81938793600319848303016024850152610ddb565b03925af19081612267575b506112cf949596501560001461225b575061224f611257565b908501525b5a906111e9565b60019150850152612254565b67ffffffffffffffff811161228557835294955085946112cf612236565b602488634e487b7160e01b81526041600452fd5b81936122d6929396999b9d5080979a81838b9f9b6001999c606319908503018d52518a815116845287810151888501520151938201520190610ddb565b99019401940190938f989694928a9896938c8e612203565b8a80fd5b5092945090507f4e4f4e43455f4552524f5200000000000000000000000000000000000000000081519261232584610d17565b600b845283015282015290565b9091508381813d831161235a575b61234a8183610d33565b8101031261140d57519038612190565b503d612340565b85513d8b823e3d90fdfea26469706673582212209d90dc61e383710deb860ff305f11cafe5b610571c89c22345590a0d1d71ba4864736f6c63430008130033" } diff --git a/dist/contracts/compiled/NFTGetter.json b/dist/contracts/compiled/NFTGetter.json index db460ef44..98716c249 100644 --- a/dist/contracts/compiled/NFTGetter.json +++ b/dist/contracts/compiled/NFTGetter.json @@ -1 +1,491 @@ -{"abi":[{"inputs":[{"internalType":"contractIAmbireAccount","name":"account","type":"address"},{"internalType":"contractNFT[]","name":"collections","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"},{"internalType":"uint256","name":"tokenPerCollectionLimit","type":"uint256"}],"name":"getAllNFTs","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256[]","name":"nfts","type":"uint256[]"},{"internalType":"bytes","name":"error","type":"bytes"}],"internalType":"structNFTGetter.NFTCollectionMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contractIAmbireAccount","name":"account","type":"address"},{"internalType":"contractNFT","name":"collection","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getCollectionMeta","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256[]","name":"nfts","type":"uint256[]"},{"internalType":"bytes","name":"error","type":"bytes"}],"internalType":"structNFTGetter.NFTCollectionMetadata","name":"meta","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contractIAmbireAccount","name":"account","type":"address"},{"internalType":"address[]","name":"associatedKeys","type":"address[]"}],"name":"getSpoof","outputs":[{"internalType":"bytes","name":"spoofSig","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contractIAmbireAccount","name":"account","type":"address"},{"internalType":"address[]","name":"associatedKeys","type":"address[]"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"factoryCalldata","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"structIAmbireAccount.Transaction[]","name":"txns","type":"tuple[]"}],"internalType":"structSimulation.ToSimulate[]","name":"toSimulate","type":"tuple[]"}],"name":"simulate","outputs":[{"internalType":"uint256","name":"startingNonce","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contractIAmbireAccount","name":"account","type":"address"},{"internalType":"address[]","name":"associatedKeys","type":"address[]"},{"internalType":"contractNFT[]","name":"collections","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"},{"internalType":"uint256","name":"tokenPerCollectionLimit","type":"uint256"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"factoryCalldata","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"structIAmbireAccount.Transaction[]","name":"txns","type":"tuple[]"}],"internalType":"structSimulation.ToSimulate[]","name":"toSimulate","type":"tuple[]"}],"name":"simulateAndGetAllNFTs","outputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256[]","name":"nfts","type":"uint256[]"},{"internalType":"bytes","name":"error","type":"bytes"}],"internalType":"structNFTGetter.NFTCollectionMetadata[]","name":"collections","type":"tuple[]"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"structNFTGetter.NFTCollectionAtNonce","name":"before","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256[]","name":"nfts","type":"uint256[]"},{"internalType":"bytes","name":"error","type":"bytes"}],"internalType":"structNFTGetter.NFTCollectionMetadata[]","name":"collections","type":"tuple[]"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"structNFTGetter.NFTCollectionAtNonce","name":"afterSimulation","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"bin":"0x6080806040523461001657611715908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b6000803560e01c806324bb40931461061d578063299ab72a146105c05780634638565e14610196578063c3b60e151461011b5763c80aca311461005657600080fd5b3461010c5760a036600319011261010c5761006f610736565b9067ffffffffffffffff6024358181116101175761009090369086016107ed565b93604435916001600160a01b03831683036101135760643581811161010f576100bc903690840161094e565b9360843591821161010c575092606095926100e161010896936100e996369101610995565b949093611085565b91939094805195869586521515602086015284015260608301906109e9565b0390f35b80fd5b8480fd5b8380fd5b8280fd5b5082903461010c57608036600319011261010c57610137610736565b9267ffffffffffffffff6024358181116101135761015890369084016107ed565b9260443591821161010c5750916101796101089592610183943691016108b1565b9060643592610c71565b9051918291602083526020830190610a99565b509134610117576080366003190112610117576101b1610736565b9260248035906001600160a01b039283831680930361010c57604495863567ffffffffffffffff8111610117576101eb9036908301610853565b96606435956101f8610b15565b9988517f06fdde03000000000000000000000000000000000000000000000000000000008152858186818b5afa90811561059c5786916105a6575b508b528851997f95d89b41000000000000000000000000000000000000000000000000000000008b52858b86818b5afa9a8b1561059c57869b610578575b5060209a8b8d01528051156000146103e5575016918751967f70a082310000000000000000000000000000000000000000000000000000000088528382890152898887818a5afa9788156103db5785986103ac575b508088116103a4575b506102d987610c0f565b95888b01968752845b88810361030657505050505050505050610108905b51928284938452830190610a42565b8951907f2f745c59000000000000000000000000000000000000000000000000000000008252858483015280888301528b828681865afa801561039a578790610365575b610360925061035a828b51610bc6565b52610ba1565b6102e2565b50908b81813d8311610393575b61037c818361079f565b8101031261038f5790610360915161034a565b8680fd5b503d610372565b8b513d89823e3d90fd5b9650386102cf565b9097508981813d83116103d4575b6103c4818361079f565b8101031261010f575196386102c6565b503d6103ba565b89513d87823e3d90fd5b909799939250849a989591969498878c9916985b825181146104a0578b8b146104a0578c6104138285610bc6565b518951906331a9108f60e11b825287820152878187818c5afa918215610495578c928c9290610468575b501614610453575b61044e90610ba1565b6103f9565b9961046061044e91610ba1565b9a9050610445565b6104889150893d8b1161048e575b610480818361079f565b810190610bf0565b3861043d565b503d610476565b8a51903d90823e3d90fd5b50995095939196949290976104b490610c0f565b96838a019788528a988b5b88518114610562578c6104d2828b610bc6565b518751906331a9108f60e11b825285820152858185818a5afa918215610557578a928a929061053a575b501614610512575b61050d90610ba1565b6104bf565b99610532818b61035a61050d948f61052a908f610bc6565b519251610bc6565b9a9050610504565b6105519150873d891161048e57610480818361079f565b386104fc565b8851903d90823e3d90fd5b50505097985050935050505061010891506102f7565b610595919b503d8088833e61058d818361079f565b810190610b7b565b9938610271565b8a513d88823e3d90fd5b6105ba91503d8088833e61058d818361079f565b38610233565b509190346101175781600319360112610117576105db610736565b926024359067ffffffffffffffff821161010c57509261060461060a92610108953691016107ed565b90611537565b90519182916020835260208301906109e9565b5082903461010c5761010036600319011261010c5761063a610736565b9067ffffffffffffffff6024358181116101175761065b90369087016107ed565b926044358281116101135761067390369088016107ed565b9560643583811161010f5761068b90369083016108b1565b9060a435936001600160a01b03851685036107325760c43581811161038f576106b7903690840161094e565b9560e43591821161010c575093610708989361071697936106e261072398946106ee98369101610995565b96909560843593610f69565b94939692839691965198899860a08a5260a08a0190610af5565b9088820360208a0152610af5565b91868303908701526109e9565b91606084015260808301520390f35b8580fd5b600435906001600160a01b038216820361074c57565b600080fd5b6080810190811067ffffffffffffffff82111761076d57604052565b634e487b7160e01b600052604160045260246000fd5b6020810190811067ffffffffffffffff82111761076d57604052565b90601f8019910116810190811067ffffffffffffffff82111761076d57604052565b67ffffffffffffffff811161076d5760051b60200190565b35906001600160a01b038216820361074c57565b81601f8201121561074c57803591610804836107c1565b92610812604051948561079f565b808452602092838086019260051b82010192831161074c578301905b82821061083c575050505090565b838091610848846107d9565b81520191019061082e565b81601f8201121561074c5780359161086a836107c1565b92610878604051948561079f565b808452602092838086019260051b82010192831161074c578301905b8282106108a2575050505090565b81358152908301908301610894565b9080601f8301121561074c578135906108c9826107c1565b926108d7604051948561079f565b828452602092838086019160051b8301019280841161074c57848301915b8483106109055750505050505090565b823567ffffffffffffffff811161074c57869161092784848094890101610853565b8152019201916108f5565b67ffffffffffffffff811161076d57601f01601f191660200190565b81601f8201121561074c5780359061096582610932565b92610973604051948561079f565b8284526020838301011161074c57816000926020809301838601378301015290565b9181601f8401121561074c5782359167ffffffffffffffff831161074c576020808501948460051b01011161074c57565b60005b8381106109d95750506000910152565b81810151838201526020016109c9565b90602091610a02815180928185528580860191016109c6565b601f01601f1916010190565b90815180825260208080930193019160005b828110610a2e575050505090565b835185529381019392810192600101610a20565b610a96916060610a85610a73610a6185516080865260808601906109e9565b602086015185820360208701526109e9565b60408501518482036040860152610a0e565b9201519060608184039101526109e9565b90565b908082519081815260208091019281808460051b8301019501936000915b848310610ac75750505050505090565b9091929394958480610ae5600193601f198682030187528a51610a42565b9801930193019194939290610ab7565b90602080610b0c8451604085526040850190610a99565b93015191015290565b60405190610b2282610751565b606080838181528160208201528160408201520152565b81601f8201121561074c578051610b4f81610932565b92610b5d604051948561079f565b8184526020828401011161074c57610a9691602080850191016109c6565b9060208282031261074c57815167ffffffffffffffff811161074c57610a969201610b39565b6000198114610bb05760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610bda5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9081602091031261074c57516001600160a01b038116810361074c5790565b90610c19826107c1565b610c26604051918261079f565b8281528092610c37601f19916107c1565b0190602036910137565b3d15610c6c573d90610c5282610932565b91610c60604051938461079f565b82523d6000602084013e565b606090565b81519193610c7e836107c1565b94604091610c8e8351978861079f565b848752601f19610c9d866107c1565b0160005b818110610f2757505060005b858103610cbe575050505050505090565b61c3508281029081048303610bb0576001600160a01b0380610ce08487610bc6565b511691610ced848b610bc6565b51906000885180927f4638565e0000000000000000000000000000000000000000000000000000000082526004958c1686830152602496878301528180610d406080978860448401526084830190610a0e565b8b606483015203913090fa918291600093610e16575b5050610df35750610d65610c41565b8051610de657508551918683019183831067ffffffffffffffff841117610dd35750508552600681527f52455645525400000000000000000000000000000000000000000000000000006020820152610dce91905b6060610dc6838c610bc6565b510152610ba1565b610cad565b604190634e487b7160e01b600052526000fd5b9050610dce929150610dba565b9050829150610e05610dce938b610bc6565b52610e10818a610bc6565b50610ba1565b929091923d8083833e610e29818361079f565b810190602093848284031261011357815167ffffffffffffffff9283821161073257019081840312610113578b5194610e6186610751565b81518381116107325784610e76918401610b39565b8652808201518381116107325784610e8f918401610b39565b818701528c82015183811161073257820184601f820112156107325790818e9251610ec5610ebc826107c1565b9451948561079f565b808452828085019160051b83010191878311610f23578301905b828210610f1457505050508c8601526060938482015192831161010c5750610f08929101610b39565b90820152903880610d56565b81518152908301908301610edf565b8880fd5b602090610f32610b15565b82828c01015201610ca1565b604051906040820182811067ffffffffffffffff82111761076d576040526000602083606081520152565b9496829996610f9a93999298610f7d610f3e565b99610f928888610f8b610f3e565b9f8c610c71565b8b5288611085565b90602098928989015215611053575060405163057ff68760e51b815260009780826004818c6001600160a01b038b165af1918215611048578992611019575b5081818b015287015103611005575b5050505060405192610ff984610783565b83525a91939291904390565b61100e93610c71565b845238808080610fe8565b9080925081813d8311611041575b611031818361079f565b81010312610f2357519038610fd9565b503d611027565b6040513d8b823e3d90fd5b9650505050505a91939291904390565b9190811015610bda5760051b81013590603e198136030182121561074c570190565b919493949290926001600160a01b0383163b15611505575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af19081156114c7576000916114d3575b509260005b8181106110f957505050509050604051906110ee82610783565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af19081156114c757600091611495575b50611135828489611063565b351461114a575b61114590610ba1565b6110d4565b6040517f299ab72a00000000000000000000000000000000000000000000000000000000815280604481016001600160a01b0386166004830152604060248301528651809152606482019060208801906000905b808210611470575050509080600092038183305af16000918161142f575b506111d857505050505090506111d0610c41565b909160009190565b6111e3828489611063565b602081013591601e198236030183121561074c5767ffffffffffffffff838301351161074c578282013560051b36036020848401011361074c576001600160a01b0386163b1561074c5790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064830160648284013560051b85010192602083820101926000905b8083013582106112f35750505050506112ad82916000946003198483030160248501526109e9565b0381836001600160a01b0389165af190816112db575b506112d6575050505090506111d0610c41565b61113c565b67ffffffffffffffff811161076d57604052386112c3565b91939695509193606319888203018552607e198285013603018735121561074c576001600160a01b0361132d60208487018a3501016107d9565b1681528635848301016040810135602083015236819003603e1901606090910135121561074c5767ffffffffffffffff602083860189350160608101350101351161074c57606087358584010190810135016020810135360360409091011361074c576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f19160191909101979101959101939092910190611285565b9091503d806000833e611442818361079f565b810160208282031261074c57815167ffffffffffffffff811161074c576114699201610b39565b90386111bc565b919350916020806001926001600160a01b03875116815201940192018493929161119e565b90506020813d6020116114bf575b816114b06020938361079f565b8101031261074c575138611129565b3d91506114a3565b6040513d6000823e3d90fd5b90506020813d6020116114fd575b816114ee6020938361079f565b8101031261074c5751386110cf565b3d91506114e1565b81600092918360208194519301915af161151d610c41565b9015611529578061109d565b935050505060009160009190565b9060609181511561169b5760005b82518114611657576001600160a01b03806115608386610bc6565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af190811561164c5760009161161f575b506115cc5750505050506115c790610ba1565b611545565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff841185851017610dd35750505290565b908682813d8311611645575b611635818361079f565b8101031261010c575051386115b4565b503d61162b565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea26469706673582212203a1076686a457eff957ce362f7d9d2ed47bc0468ae43e5f0bd0a285bcc63ae1b64736f6c63430008130033","binRuntime":"0x60406080815260048036101561001457600080fd5b6000803560e01c806324bb40931461061d578063299ab72a146105c05780634638565e14610196578063c3b60e151461011b5763c80aca311461005657600080fd5b3461010c5760a036600319011261010c5761006f610736565b9067ffffffffffffffff6024358181116101175761009090369086016107ed565b93604435916001600160a01b03831683036101135760643581811161010f576100bc903690840161094e565b9360843591821161010c575092606095926100e161010896936100e996369101610995565b949093611085565b91939094805195869586521515602086015284015260608301906109e9565b0390f35b80fd5b8480fd5b8380fd5b8280fd5b5082903461010c57608036600319011261010c57610137610736565b9267ffffffffffffffff6024358181116101135761015890369084016107ed565b9260443591821161010c5750916101796101089592610183943691016108b1565b9060643592610c71565b9051918291602083526020830190610a99565b509134610117576080366003190112610117576101b1610736565b9260248035906001600160a01b039283831680930361010c57604495863567ffffffffffffffff8111610117576101eb9036908301610853565b96606435956101f8610b15565b9988517f06fdde03000000000000000000000000000000000000000000000000000000008152858186818b5afa90811561059c5786916105a6575b508b528851997f95d89b41000000000000000000000000000000000000000000000000000000008b52858b86818b5afa9a8b1561059c57869b610578575b5060209a8b8d01528051156000146103e5575016918751967f70a082310000000000000000000000000000000000000000000000000000000088528382890152898887818a5afa9788156103db5785986103ac575b508088116103a4575b506102d987610c0f565b95888b01968752845b88810361030657505050505050505050610108905b51928284938452830190610a42565b8951907f2f745c59000000000000000000000000000000000000000000000000000000008252858483015280888301528b828681865afa801561039a578790610365575b610360925061035a828b51610bc6565b52610ba1565b6102e2565b50908b81813d8311610393575b61037c818361079f565b8101031261038f5790610360915161034a565b8680fd5b503d610372565b8b513d89823e3d90fd5b9650386102cf565b9097508981813d83116103d4575b6103c4818361079f565b8101031261010f575196386102c6565b503d6103ba565b89513d87823e3d90fd5b909799939250849a989591969498878c9916985b825181146104a0578b8b146104a0578c6104138285610bc6565b518951906331a9108f60e11b825287820152878187818c5afa918215610495578c928c9290610468575b501614610453575b61044e90610ba1565b6103f9565b9961046061044e91610ba1565b9a9050610445565b6104889150893d8b1161048e575b610480818361079f565b810190610bf0565b3861043d565b503d610476565b8a51903d90823e3d90fd5b50995095939196949290976104b490610c0f565b96838a019788528a988b5b88518114610562578c6104d2828b610bc6565b518751906331a9108f60e11b825285820152858185818a5afa918215610557578a928a929061053a575b501614610512575b61050d90610ba1565b6104bf565b99610532818b61035a61050d948f61052a908f610bc6565b519251610bc6565b9a9050610504565b6105519150873d891161048e57610480818361079f565b386104fc565b8851903d90823e3d90fd5b50505097985050935050505061010891506102f7565b610595919b503d8088833e61058d818361079f565b810190610b7b565b9938610271565b8a513d88823e3d90fd5b6105ba91503d8088833e61058d818361079f565b38610233565b509190346101175781600319360112610117576105db610736565b926024359067ffffffffffffffff821161010c57509261060461060a92610108953691016107ed565b90611537565b90519182916020835260208301906109e9565b5082903461010c5761010036600319011261010c5761063a610736565b9067ffffffffffffffff6024358181116101175761065b90369087016107ed565b926044358281116101135761067390369088016107ed565b9560643583811161010f5761068b90369083016108b1565b9060a435936001600160a01b03851685036107325760c43581811161038f576106b7903690840161094e565b9560e43591821161010c575093610708989361071697936106e261072398946106ee98369101610995565b96909560843593610f69565b94939692839691965198899860a08a5260a08a0190610af5565b9088820360208a0152610af5565b91868303908701526109e9565b91606084015260808301520390f35b8580fd5b600435906001600160a01b038216820361074c57565b600080fd5b6080810190811067ffffffffffffffff82111761076d57604052565b634e487b7160e01b600052604160045260246000fd5b6020810190811067ffffffffffffffff82111761076d57604052565b90601f8019910116810190811067ffffffffffffffff82111761076d57604052565b67ffffffffffffffff811161076d5760051b60200190565b35906001600160a01b038216820361074c57565b81601f8201121561074c57803591610804836107c1565b92610812604051948561079f565b808452602092838086019260051b82010192831161074c578301905b82821061083c575050505090565b838091610848846107d9565b81520191019061082e565b81601f8201121561074c5780359161086a836107c1565b92610878604051948561079f565b808452602092838086019260051b82010192831161074c578301905b8282106108a2575050505090565b81358152908301908301610894565b9080601f8301121561074c578135906108c9826107c1565b926108d7604051948561079f565b828452602092838086019160051b8301019280841161074c57848301915b8483106109055750505050505090565b823567ffffffffffffffff811161074c57869161092784848094890101610853565b8152019201916108f5565b67ffffffffffffffff811161076d57601f01601f191660200190565b81601f8201121561074c5780359061096582610932565b92610973604051948561079f565b8284526020838301011161074c57816000926020809301838601378301015290565b9181601f8401121561074c5782359167ffffffffffffffff831161074c576020808501948460051b01011161074c57565b60005b8381106109d95750506000910152565b81810151838201526020016109c9565b90602091610a02815180928185528580860191016109c6565b601f01601f1916010190565b90815180825260208080930193019160005b828110610a2e575050505090565b835185529381019392810192600101610a20565b610a96916060610a85610a73610a6185516080865260808601906109e9565b602086015185820360208701526109e9565b60408501518482036040860152610a0e565b9201519060608184039101526109e9565b90565b908082519081815260208091019281808460051b8301019501936000915b848310610ac75750505050505090565b9091929394958480610ae5600193601f198682030187528a51610a42565b9801930193019194939290610ab7565b90602080610b0c8451604085526040850190610a99565b93015191015290565b60405190610b2282610751565b606080838181528160208201528160408201520152565b81601f8201121561074c578051610b4f81610932565b92610b5d604051948561079f565b8184526020828401011161074c57610a9691602080850191016109c6565b9060208282031261074c57815167ffffffffffffffff811161074c57610a969201610b39565b6000198114610bb05760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610bda5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9081602091031261074c57516001600160a01b038116810361074c5790565b90610c19826107c1565b610c26604051918261079f565b8281528092610c37601f19916107c1565b0190602036910137565b3d15610c6c573d90610c5282610932565b91610c60604051938461079f565b82523d6000602084013e565b606090565b81519193610c7e836107c1565b94604091610c8e8351978861079f565b848752601f19610c9d866107c1565b0160005b818110610f2757505060005b858103610cbe575050505050505090565b61c3508281029081048303610bb0576001600160a01b0380610ce08487610bc6565b511691610ced848b610bc6565b51906000885180927f4638565e0000000000000000000000000000000000000000000000000000000082526004958c1686830152602496878301528180610d406080978860448401526084830190610a0e565b8b606483015203913090fa918291600093610e16575b5050610df35750610d65610c41565b8051610de657508551918683019183831067ffffffffffffffff841117610dd35750508552600681527f52455645525400000000000000000000000000000000000000000000000000006020820152610dce91905b6060610dc6838c610bc6565b510152610ba1565b610cad565b604190634e487b7160e01b600052526000fd5b9050610dce929150610dba565b9050829150610e05610dce938b610bc6565b52610e10818a610bc6565b50610ba1565b929091923d8083833e610e29818361079f565b810190602093848284031261011357815167ffffffffffffffff9283821161073257019081840312610113578b5194610e6186610751565b81518381116107325784610e76918401610b39565b8652808201518381116107325784610e8f918401610b39565b818701528c82015183811161073257820184601f820112156107325790818e9251610ec5610ebc826107c1565b9451948561079f565b808452828085019160051b83010191878311610f23578301905b828210610f1457505050508c8601526060938482015192831161010c5750610f08929101610b39565b90820152903880610d56565b81518152908301908301610edf565b8880fd5b602090610f32610b15565b82828c01015201610ca1565b604051906040820182811067ffffffffffffffff82111761076d576040526000602083606081520152565b9496829996610f9a93999298610f7d610f3e565b99610f928888610f8b610f3e565b9f8c610c71565b8b5288611085565b90602098928989015215611053575060405163057ff68760e51b815260009780826004818c6001600160a01b038b165af1918215611048578992611019575b5081818b015287015103611005575b5050505060405192610ff984610783565b83525a91939291904390565b61100e93610c71565b845238808080610fe8565b9080925081813d8311611041575b611031818361079f565b81010312610f2357519038610fd9565b503d611027565b6040513d8b823e3d90fd5b9650505050505a91939291904390565b9190811015610bda5760051b81013590603e198136030182121561074c570190565b919493949290926001600160a01b0383163b15611505575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af19081156114c7576000916114d3575b509260005b8181106110f957505050509050604051906110ee82610783565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af19081156114c757600091611495575b50611135828489611063565b351461114a575b61114590610ba1565b6110d4565b6040517f299ab72a00000000000000000000000000000000000000000000000000000000815280604481016001600160a01b0386166004830152604060248301528651809152606482019060208801906000905b808210611470575050509080600092038183305af16000918161142f575b506111d857505050505090506111d0610c41565b909160009190565b6111e3828489611063565b602081013591601e198236030183121561074c5767ffffffffffffffff838301351161074c578282013560051b36036020848401011361074c576001600160a01b0386163b1561074c5790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064830160648284013560051b85010192602083820101926000905b8083013582106112f35750505050506112ad82916000946003198483030160248501526109e9565b0381836001600160a01b0389165af190816112db575b506112d6575050505090506111d0610c41565b61113c565b67ffffffffffffffff811161076d57604052386112c3565b91939695509193606319888203018552607e198285013603018735121561074c576001600160a01b0361132d60208487018a3501016107d9565b1681528635848301016040810135602083015236819003603e1901606090910135121561074c5767ffffffffffffffff602083860189350160608101350101351161074c57606087358584010190810135016020810135360360409091011361074c576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f19160191909101979101959101939092910190611285565b9091503d806000833e611442818361079f565b810160208282031261074c57815167ffffffffffffffff811161074c576114699201610b39565b90386111bc565b919350916020806001926001600160a01b03875116815201940192018493929161119e565b90506020813d6020116114bf575b816114b06020938361079f565b8101031261074c575138611129565b3d91506114a3565b6040513d6000823e3d90fd5b90506020813d6020116114fd575b816114ee6020938361079f565b8101031261074c5751386110cf565b3d91506114e1565b81600092918360208194519301915af161151d610c41565b9015611529578061109d565b935050505060009160009190565b9060609181511561169b5760005b82518114611657576001600160a01b03806115608386610bc6565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af190811561164c5760009161161f575b506115cc5750505050506115c790610ba1565b611545565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff841185851017610dd35750505290565b908682813d8311611645575b611635818361079f565b8101031261010c575051386115b4565b503d61162b565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea26469706673582212203a1076686a457eff957ce362f7d9d2ed47bc0468ae43e5f0bd0a285bcc63ae1b64736f6c63430008130033"} \ No newline at end of file +{ + "abi": [ + { + "inputs": [ + { + "internalType": "contract IAmbireAccount", + "name": "account", + "type": "address" + }, + { + "internalType": "contract NFT[]", + "name": "collections", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "tokenIds", + "type": "uint256[][]" + }, + { + "internalType": "uint256", + "name": "tokenPerCollectionLimit", + "type": "uint256" + } + ], + "name": "getAllNFTs", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IAmbireAccount", + "name": "account", + "type": "address" + }, + { + "internalType": "contract NFT", + "name": "collection", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "name": "getCollectionMeta", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata", + "name": "meta", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "collectionsA", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "collectionsB", + "type": "tuple[]" + }, + { + "internalType": "contract NFT[]", + "name": "collections", + "type": "address[]" + } + ], + "name": "getDelta", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IAmbireAccount", + "name": "account", + "type": "address" + }, + { + "internalType": "address[]", + "name": "associatedKeys", + "type": "address[]" + } + ], + "name": "getSpoof", + "outputs": [ + { + "internalType": "bytes", + "name": "spoofSig", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IAmbireAccount", + "name": "account", + "type": "address" + }, + { + "internalType": "address[]", + "name": "associatedKeys", + "type": "address[]" + }, + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "bytes", + "name": "factoryCalldata", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Transaction[]", + "name": "txns", + "type": "tuple[]" + } + ], + "internalType": "struct Simulation.ToSimulate[]", + "name": "toSimulate", + "type": "tuple[]" + } + ], + "name": "simulate", + "outputs": [ + { + "internalType": "uint256", + "name": "startingNonce", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IAmbireAccount", + "name": "account", + "type": "address" + }, + { + "internalType": "address[]", + "name": "associatedKeys", + "type": "address[]" + }, + { + "internalType": "contract NFT[]", + "name": "collections", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "tokenIds", + "type": "uint256[][]" + }, + { + "internalType": "uint256", + "name": "tokenPerCollectionLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "bytes", + "name": "factoryCalldata", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Transaction[]", + "name": "txns", + "type": "tuple[]" + } + ], + "internalType": "struct Simulation.ToSimulate[]", + "name": "toSimulate", + "type": "tuple[]" + } + ], + "name": "simulateAndGetAllNFTs", + "outputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "collections", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "internalType": "struct NFTGetter.NFTCollectionAtNonce", + "name": "before", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "nfts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "error", + "type": "bytes" + } + ], + "internalType": "struct NFTGetter.NFTCollectionMetadata[]", + "name": "collections", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "internalType": "struct NFTGetter.NFTCollectionAtNonce", + "name": "afterSimulation", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bin": "0x6080806040523461001657611d04908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b6000803560e01c806324bb40931461076b578063299ab72a1461070e5780634638565e14610214578063647eb63e146101a1578063c3b60e15146101265763c80aca311461006157600080fd5b346101175760a03660031901126101175761007a610891565b9067ffffffffffffffff6024358181116101225761009b9036908601610948565b93604435916001600160a01b038316830361011e5760643581811161011a576100c79036908401610aa9565b93608435918211610117575092606095926100ec61011396936100f496369101610af0565b9490936116b4565b9193909480519586958652151560208601528401526060830190610b44565b0390f35b80fd5b8480fd5b8380fd5b8280fd5b5082903461011757608036600319011261011757610142610891565b9267ffffffffffffffff60243581811161011e576101639036908401610948565b92604435918211610117575091610184610113959261018e94369101610a0c565b9060643592610f61565b9051918291602083526020830190610bf4565b508290346101175760603660031901126101175767ffffffffffffffff928035848111610122576101d59036908301610cad565b9360243581811161011e576101ed9036908401610cad565b9260443591821161011757509161020e610113959261018e94369101610948565b916111ea565b5091346101225760803660031901126101225761022f610891565b906024938435946001600160a01b039182871680970361011757604492833567ffffffffffffffff81116101225761026a90369089016109ae565b93606435610276610db5565b9789858c8a51928380927f06fdde030000000000000000000000000000000000000000000000000000000082525afa9081156106ea5786916106f4575b50895287517f95d89b4100000000000000000000000000000000000000000000000000000000815285818c818f5afa9081156106ea578b9c928b9c9492879289916106c8575b506020809d01521694858a519d8e7f70a0823100000000000000000000000000000000000000000000000000000000815201528a8d8981865afa9889156106be57879961068c575b8c9d50828a9b9c9d9a9b11610683575b8b61035b8c610e41565b9a01998a528b517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f780e9d6300000000000000000000000000000000000000000000000000000000868201528d818b81885afa90811561067957899161063f575b508015610636575b1561049357505050845b8881036103f557505050505050505050610113905b51928284938452830190610b9d565b8951907f2f745c59000000000000000000000000000000000000000000000000000000008252858483015280888301528b828681865afa8015610489578790610454575b61044f9250610449828b51610e98565b52610e73565b6103d1565b50908b81813d8311610482575b61046b81836108fa565b8101031261047e579061044f9151610439565b8680fd5b503d610461565b8b513d89823e3d90fd5b92959950979993509995919a8599865b83518114610620578d8d8d1461054a578a8c916104c08488610e98565b518951916331a9108f60e11b83528201528b8189818d5afa8b918161051b575b506104f7575b5050506104f290610e73565b6104a3565b1614610506575b8a8a386104e6565b9a6105136104f291610e73565b9b90506104fe565b61053c9192508d803d10610543575b61053481836108fa565b810190610ec2565b90386104e0565b503d61052a565b505099610561919b50989796959493929198610e41565b8952839a845b8951811461060a57888861057b838d610e98565b518651906331a9108f60e11b825285820152898187818b5afa8991816105eb575b506105b3575b5050506105ae90610e73565b610567565b16146105c2575b8888386105a2565b9b6105e3818c8f6105ae946105db8f9261044993610e98565b519251610e98565b9c90506105ba565b6106039192508b3d8d116105435761053481836108fa565b903861059c565b50505095505050949550505061011391506103e6565b5099610561919b50989796959493929198610e41565b508051156103c7565b90508d81813d8311610672575b61065681836108fa565b8101031261066e5751801515810361066e57386103bf565b8880fd5b503d61064c565b8d513d8b823e3d90fd5b99508199610351565b98508a8d813d83116106b7575b6106a381836108fa565b8101031261047e579b519a9b8c9b98610341565b503d610699565b8a513d89823e3d90fd5b6106e491503d808b833e6106dc81836108fa565b810190610e1b565b386102f9565b89513d88823e3d90fd5b61070891503d8088833e6106dc81836108fa565b386102b3565b50919034610122578160031936011261012257610729610891565b926024359067ffffffffffffffff82116101175750926107526107589261011395369101610948565b90611b26565b9051918291602083526020830190610b44565b508290346101175761010036600319011261011757610788610891565b9067ffffffffffffffff602435818111610122576107a99036908701610948565b9260443582811161011e576107c19036908801610948565b9560643583811161011a576107d99036908301610a0c565b9060a435936001600160a01b038516850361088d5760c43581811161047e576108059036908401610aa9565b9560e4359182116101175750946108759461083f9461085a9a946108336101139a956108689a369101610af0565b9690956084359361157c565b959389939297919599519a8b9a60c08c5260c08c0190610c50565b908a820360208c0152610c50565b9188830390890152610b44565b926060860152608085015283820360a0850152610c70565b8580fd5b600435906001600160a01b03821682036108a757565b600080fd5b6080810190811067ffffffffffffffff8211176108c857604052565b634e487b7160e01b600052604160045260246000fd5b6020810190811067ffffffffffffffff8211176108c857604052565b90601f8019910116810190811067ffffffffffffffff8211176108c857604052565b67ffffffffffffffff81116108c85760051b60200190565b35906001600160a01b03821682036108a757565b81601f820112156108a75780359161095f8361091c565b9261096d60405194856108fa565b808452602092838086019260051b8201019283116108a7578301905b828210610997575050505090565b8380916109a384610934565b815201910190610989565b81601f820112156108a7578035916109c58361091c565b926109d360405194856108fa565b808452602092838086019260051b8201019283116108a7578301905b8282106109fd575050505090565b813581529083019083016109ef565b9080601f830112156108a757813590610a248261091c565b92610a3260405194856108fa565b828452602092838086019160051b830101928084116108a757848301915b848310610a605750505050505090565b823567ffffffffffffffff81116108a7578691610a82848480948901016109ae565b815201920191610a50565b67ffffffffffffffff81116108c857601f01601f191660200190565b81601f820112156108a757803590610ac082610a8d565b92610ace60405194856108fa565b828452602083830101116108a757816000926020809301838601378301015290565b9181601f840112156108a75782359167ffffffffffffffff83116108a7576020808501948460051b0101116108a757565b60005b838110610b345750506000910152565b8181015183820152602001610b24565b90602091610b5d81518092818552858086019101610b21565b601f01601f1916010190565b90815180825260208080930193019160005b828110610b89575050505090565b835185529381019392810192600101610b7b565b610bf1916060610be0610bce610bbc8551608086526080860190610b44565b60208601518582036020870152610b44565b60408501518482036040860152610b69565b920151906060818403910152610b44565b90565b908082519081815260208091019281808460051b8301019501936000915b848310610c225750505050505090565b9091929394958480610c40600193601f198682030187528a51610b9d565b9801930193019194939290610c12565b90602080610c678451604085526040850190610bf4565b93015191015290565b90815180825260208080930193019160005b828110610c90575050505090565b83516001600160a01b031685529381019392810192600101610c82565b9080601f830112156108a7578135610cc48161091c565b92604091610cd4835195866108fa565b808552602093848087019260051b840101938185116108a757858401925b858410610d03575050505050505090565b67ffffffffffffffff84358181116108a757860191608080601f1985880301126108a757845190610d33826108ac565b8a8501358481116108a757878c610d4c92880101610aa9565b8252858501358481116108a757878c610d6792880101610aa9565b8b830152606090818601358581116108a757888d610d87928901016109ae565b878401528501359384116108a757610da6878c80979681970101610aa9565b90820152815201930192610cf2565b60405190610dc2826108ac565b606080838181528160208201528160408201520152565b81601f820112156108a7578051610def81610a8d565b92610dfd60405194856108fa565b818452602082840101116108a757610bf19160208085019101610b21565b906020828203126108a757815167ffffffffffffffff81116108a757610bf19201610dd9565b90610e4b8261091c565b610e5860405191826108fa565b8281528092610e69601f199161091c565b0190602036910137565b6000198114610e825760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610eac5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b908160209103126108a757516001600160a01b03811681036108a75790565b90610eeb8261091c565b610ef860405191826108fa565b8281528092610f09601f199161091c565b019060005b828110610f1a57505050565b602090610f25610db5565b82828501015201610f0e565b3d15610f5c573d90610f4282610a8d565b91610f5060405193846108fa565b82523d6000602084013e565b606090565b81519193610f6e83610ee1565b9460005b848103610f825750505050505090565b61c3508381029081048403610e82576001600160a01b0380610fa48486610e98565b511691610fb1848a610e98565b516040916000835180927f4638565e0000000000000000000000000000000000000000000000000000000082526004968c16878301526024978883015281806110066080978860448401526084830190610b69565b8d606483015203913090fa9182916000936110dd575b50506110b9575061102b610f31565b80516110ab57508051928184019284841067ffffffffffffffff85111761109857505052600681527f5245564552540000000000000000000000000000000000000000000000000000602082015261109391905b606061108b838b610e98565b510152610e73565b610f72565b604190634e487b7160e01b600052526000fd5b91505061109392915061107f565b9150508291506110cc611093938a610e98565b526110d78189610e98565b50610e73565b929091923d8083833e6110f081836108fa565b810190602093848284031261011e57815167ffffffffffffffff9283821161088d5701908184031261011e57865194611128866108ac565b815183811161088d578461113d918401610dd9565b86528082015183811161088d5784611156918401610dd9565b818701528782015183811161088d5782019084601f8301121561088d5781519161117f8361091c565b9261118c8b5194856108fa565b808452828085019160051b8301019187831161066e578301905b8282106111db5750505050878601526060938482015192831161011757506111cf929101610dd9565b9082015290388061101c565b815181529083019083016111a6565b9290600091825b855181101561129c576040806112078389610e98565b510151815191611270602092846112278582019286845285830190610b69565b039461123b601f19968781018352826108fa565b519020938261124a878a610e98565b510151926112648151948592878401978852830190610b69565b039081018352826108fa565b51902003611287575b61128290610e73565b6111f1565b9261129461128291610e73565b939050611279565b509291906112a982610ee1565b916112b38161091c565b6112cd6040926112c5845193846108fa565b80835261091c565b9160209182810190601f19809501368337519067ffffffffffffffff82116108c8576801000000000000000082116108c85760005482600055808310611499575b506000805260005b82811061145e57505050600097885b815181101561145257826113398284610e98565b5101518351611361816113558882019489865288830190610b69565b038881018352826108fa565b5190208361136f8389610e98565b51015184516113978161138b898201948a865289830190610b69565b038981018352826108fa565b519020036113ae575b6113a990610e73565b611325565b986113b98a87610e98565b516113c48289610e98565b526113cf8188610e98565b506001600160a01b036113e28b8a610e98565b5116600054821015610eac576113a99161144a9160008052817f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610e73565b9990506113a0565b50949750505050505050565b81516001600160a01b03167f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56382015590840190600101611316565b827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56391820191015b8181106114ce575061130e565b600081556001016114c1565b604051906040820182811067ffffffffffffffff8211176108c8576040526000602083606081520152565b604051906000548083528260209182820190600080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563936000905b82821061155957505050611557925003836108fa565b565b85546001600160a01b031684526001958601958895509381019390910190611541565b9294966115ae9294989199966115906114da565b986115996114da565b9b6115a68c8a8a8a610f61565b8b52866116b4565b9060209892898901521561167c575060405163057ff68760e51b815260009780826004818c6001600160a01b0389165af1918215611671578992611642575b5081818b01528701510361161f575b505050506040519261160d846108de565b83525a91939291904390610bf1611505565b611637938361162d93610f61565b80875284516111ea565b8452388080806115fc565b9080925081813d831161166a575b61165a81836108fa565b8101031261066e575190386115ed565b503d611650565b6040513d8b823e3d90fd5b9650505050505a91939291904390610bf1611505565b9190811015610eac5760051b81013590603e19813603018212156108a7570190565b91939290936001600160a01b0383163b15611af4575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af1908115611ab657600091611ac2575b509360005b8181106117255750505050506040519061171a826108de565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115611ab657600091611a84575b50611761828487611692565b3514611776575b61177190610e73565b611701565b6040517f299ab72a0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260406024820152600081806117c3604482018a610c70565b038183305af160009181611a43575b506117ed575050505050506117e5610f31565b909160009190565b6117f8828487611692565b602081013591601e19823603018312156108a75767ffffffffffffffff83830135116108a7578282013560051b3603602084840101136108a7576001600160a01b0386163b156108a75790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064808401908284013560051b85010192602083820101926000905b8083013582106119075750505050506118c28291600094600319848303016024850152610b44565b0381836001600160a01b0389165af190816118ef575b506118ea5750505050506117e5610f31565b611768565b67ffffffffffffffff81116108c857604052386118d8565b91939695509193606319888203018552607e19828501360301873512156108a7576001600160a01b0361194160208487018a350101610934565b1681528635848301016040810135602083015236819003603e190160609091013512156108a75767ffffffffffffffff60208386018935016060810135010135116108a75760608735858401019081013501602081013536036040909101136108a7576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f1916019190910197910195910193909291019061189a565b9091503d806000833e611a5681836108fa565b81016020828203126108a757815167ffffffffffffffff81116108a757611a7d9201610dd9565b90386117d2565b90506020813d602011611aae575b81611a9f602093836108fa565b810103126108a7575138611755565b3d9150611a92565b6040513d6000823e3d90fd5b90506020813d602011611aec575b81611add602093836108fa565b810103126108a75751386116fc565b3d9150611ad0565b81600092918360208194519301915af1611b0c610f31565b9015611b1857806116ca565b935050505060009160009190565b90606091815115611c8a5760005b82518114611c46576001600160a01b0380611b4f8386610e98565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af1908115611c3b57600091611c0e575b50611bbb575050505050611bb690610e73565b611b34565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff8411858510176110985750505290565b908682813d8311611c34575b611c2481836108fa565b8101031261011757505138611ba3565b503d611c1a565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea264697066735822122099d72c607a84a2434fe90b47c382bb3a2fe4fed6708a0720bcd3d9f0469fc32964736f6c63430008130033", + "binRuntime": "0x60406080815260048036101561001457600080fd5b6000803560e01c806324bb40931461076b578063299ab72a1461070e5780634638565e14610214578063647eb63e146101a1578063c3b60e15146101265763c80aca311461006157600080fd5b346101175760a03660031901126101175761007a610891565b9067ffffffffffffffff6024358181116101225761009b9036908601610948565b93604435916001600160a01b038316830361011e5760643581811161011a576100c79036908401610aa9565b93608435918211610117575092606095926100ec61011396936100f496369101610af0565b9490936116b4565b9193909480519586958652151560208601528401526060830190610b44565b0390f35b80fd5b8480fd5b8380fd5b8280fd5b5082903461011757608036600319011261011757610142610891565b9267ffffffffffffffff60243581811161011e576101639036908401610948565b92604435918211610117575091610184610113959261018e94369101610a0c565b9060643592610f61565b9051918291602083526020830190610bf4565b508290346101175760603660031901126101175767ffffffffffffffff928035848111610122576101d59036908301610cad565b9360243581811161011e576101ed9036908401610cad565b9260443591821161011757509161020e610113959261018e94369101610948565b916111ea565b5091346101225760803660031901126101225761022f610891565b906024938435946001600160a01b039182871680970361011757604492833567ffffffffffffffff81116101225761026a90369089016109ae565b93606435610276610db5565b9789858c8a51928380927f06fdde030000000000000000000000000000000000000000000000000000000082525afa9081156106ea5786916106f4575b50895287517f95d89b4100000000000000000000000000000000000000000000000000000000815285818c818f5afa9081156106ea578b9c928b9c9492879289916106c8575b506020809d01521694858a519d8e7f70a0823100000000000000000000000000000000000000000000000000000000815201528a8d8981865afa9889156106be57879961068c575b8c9d50828a9b9c9d9a9b11610683575b8b61035b8c610e41565b9a01998a528b517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f780e9d6300000000000000000000000000000000000000000000000000000000868201528d818b81885afa90811561067957899161063f575b508015610636575b1561049357505050845b8881036103f557505050505050505050610113905b51928284938452830190610b9d565b8951907f2f745c59000000000000000000000000000000000000000000000000000000008252858483015280888301528b828681865afa8015610489578790610454575b61044f9250610449828b51610e98565b52610e73565b6103d1565b50908b81813d8311610482575b61046b81836108fa565b8101031261047e579061044f9151610439565b8680fd5b503d610461565b8b513d89823e3d90fd5b92959950979993509995919a8599865b83518114610620578d8d8d1461054a578a8c916104c08488610e98565b518951916331a9108f60e11b83528201528b8189818d5afa8b918161051b575b506104f7575b5050506104f290610e73565b6104a3565b1614610506575b8a8a386104e6565b9a6105136104f291610e73565b9b90506104fe565b61053c9192508d803d10610543575b61053481836108fa565b810190610ec2565b90386104e0565b503d61052a565b505099610561919b50989796959493929198610e41565b8952839a845b8951811461060a57888861057b838d610e98565b518651906331a9108f60e11b825285820152898187818b5afa8991816105eb575b506105b3575b5050506105ae90610e73565b610567565b16146105c2575b8888386105a2565b9b6105e3818c8f6105ae946105db8f9261044993610e98565b519251610e98565b9c90506105ba565b6106039192508b3d8d116105435761053481836108fa565b903861059c565b50505095505050949550505061011391506103e6565b5099610561919b50989796959493929198610e41565b508051156103c7565b90508d81813d8311610672575b61065681836108fa565b8101031261066e5751801515810361066e57386103bf565b8880fd5b503d61064c565b8d513d8b823e3d90fd5b99508199610351565b98508a8d813d83116106b7575b6106a381836108fa565b8101031261047e579b519a9b8c9b98610341565b503d610699565b8a513d89823e3d90fd5b6106e491503d808b833e6106dc81836108fa565b810190610e1b565b386102f9565b89513d88823e3d90fd5b61070891503d8088833e6106dc81836108fa565b386102b3565b50919034610122578160031936011261012257610729610891565b926024359067ffffffffffffffff82116101175750926107526107589261011395369101610948565b90611b26565b9051918291602083526020830190610b44565b508290346101175761010036600319011261011757610788610891565b9067ffffffffffffffff602435818111610122576107a99036908701610948565b9260443582811161011e576107c19036908801610948565b9560643583811161011a576107d99036908301610a0c565b9060a435936001600160a01b038516850361088d5760c43581811161047e576108059036908401610aa9565b9560e4359182116101175750946108759461083f9461085a9a946108336101139a956108689a369101610af0565b9690956084359361157c565b959389939297919599519a8b9a60c08c5260c08c0190610c50565b908a820360208c0152610c50565b9188830390890152610b44565b926060860152608085015283820360a0850152610c70565b8580fd5b600435906001600160a01b03821682036108a757565b600080fd5b6080810190811067ffffffffffffffff8211176108c857604052565b634e487b7160e01b600052604160045260246000fd5b6020810190811067ffffffffffffffff8211176108c857604052565b90601f8019910116810190811067ffffffffffffffff8211176108c857604052565b67ffffffffffffffff81116108c85760051b60200190565b35906001600160a01b03821682036108a757565b81601f820112156108a75780359161095f8361091c565b9261096d60405194856108fa565b808452602092838086019260051b8201019283116108a7578301905b828210610997575050505090565b8380916109a384610934565b815201910190610989565b81601f820112156108a7578035916109c58361091c565b926109d360405194856108fa565b808452602092838086019260051b8201019283116108a7578301905b8282106109fd575050505090565b813581529083019083016109ef565b9080601f830112156108a757813590610a248261091c565b92610a3260405194856108fa565b828452602092838086019160051b830101928084116108a757848301915b848310610a605750505050505090565b823567ffffffffffffffff81116108a7578691610a82848480948901016109ae565b815201920191610a50565b67ffffffffffffffff81116108c857601f01601f191660200190565b81601f820112156108a757803590610ac082610a8d565b92610ace60405194856108fa565b828452602083830101116108a757816000926020809301838601378301015290565b9181601f840112156108a75782359167ffffffffffffffff83116108a7576020808501948460051b0101116108a757565b60005b838110610b345750506000910152565b8181015183820152602001610b24565b90602091610b5d81518092818552858086019101610b21565b601f01601f1916010190565b90815180825260208080930193019160005b828110610b89575050505090565b835185529381019392810192600101610b7b565b610bf1916060610be0610bce610bbc8551608086526080860190610b44565b60208601518582036020870152610b44565b60408501518482036040860152610b69565b920151906060818403910152610b44565b90565b908082519081815260208091019281808460051b8301019501936000915b848310610c225750505050505090565b9091929394958480610c40600193601f198682030187528a51610b9d565b9801930193019194939290610c12565b90602080610c678451604085526040850190610bf4565b93015191015290565b90815180825260208080930193019160005b828110610c90575050505090565b83516001600160a01b031685529381019392810192600101610c82565b9080601f830112156108a7578135610cc48161091c565b92604091610cd4835195866108fa565b808552602093848087019260051b840101938185116108a757858401925b858410610d03575050505050505090565b67ffffffffffffffff84358181116108a757860191608080601f1985880301126108a757845190610d33826108ac565b8a8501358481116108a757878c610d4c92880101610aa9565b8252858501358481116108a757878c610d6792880101610aa9565b8b830152606090818601358581116108a757888d610d87928901016109ae565b878401528501359384116108a757610da6878c80979681970101610aa9565b90820152815201930192610cf2565b60405190610dc2826108ac565b606080838181528160208201528160408201520152565b81601f820112156108a7578051610def81610a8d565b92610dfd60405194856108fa565b818452602082840101116108a757610bf19160208085019101610b21565b906020828203126108a757815167ffffffffffffffff81116108a757610bf19201610dd9565b90610e4b8261091c565b610e5860405191826108fa565b8281528092610e69601f199161091c565b0190602036910137565b6000198114610e825760010190565b634e487b7160e01b600052601160045260246000fd5b8051821015610eac5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b908160209103126108a757516001600160a01b03811681036108a75790565b90610eeb8261091c565b610ef860405191826108fa565b8281528092610f09601f199161091c565b019060005b828110610f1a57505050565b602090610f25610db5565b82828501015201610f0e565b3d15610f5c573d90610f4282610a8d565b91610f5060405193846108fa565b82523d6000602084013e565b606090565b81519193610f6e83610ee1565b9460005b848103610f825750505050505090565b61c3508381029081048403610e82576001600160a01b0380610fa48486610e98565b511691610fb1848a610e98565b516040916000835180927f4638565e0000000000000000000000000000000000000000000000000000000082526004968c16878301526024978883015281806110066080978860448401526084830190610b69565b8d606483015203913090fa9182916000936110dd575b50506110b9575061102b610f31565b80516110ab57508051928184019284841067ffffffffffffffff85111761109857505052600681527f5245564552540000000000000000000000000000000000000000000000000000602082015261109391905b606061108b838b610e98565b510152610e73565b610f72565b604190634e487b7160e01b600052526000fd5b91505061109392915061107f565b9150508291506110cc611093938a610e98565b526110d78189610e98565b50610e73565b929091923d8083833e6110f081836108fa565b810190602093848284031261011e57815167ffffffffffffffff9283821161088d5701908184031261011e57865194611128866108ac565b815183811161088d578461113d918401610dd9565b86528082015183811161088d5784611156918401610dd9565b818701528782015183811161088d5782019084601f8301121561088d5781519161117f8361091c565b9261118c8b5194856108fa565b808452828085019160051b8301019187831161066e578301905b8282106111db5750505050878601526060938482015192831161011757506111cf929101610dd9565b9082015290388061101c565b815181529083019083016111a6565b9290600091825b855181101561129c576040806112078389610e98565b510151815191611270602092846112278582019286845285830190610b69565b039461123b601f19968781018352826108fa565b519020938261124a878a610e98565b510151926112648151948592878401978852830190610b69565b039081018352826108fa565b51902003611287575b61128290610e73565b6111f1565b9261129461128291610e73565b939050611279565b509291906112a982610ee1565b916112b38161091c565b6112cd6040926112c5845193846108fa565b80835261091c565b9160209182810190601f19809501368337519067ffffffffffffffff82116108c8576801000000000000000082116108c85760005482600055808310611499575b506000805260005b82811061145e57505050600097885b815181101561145257826113398284610e98565b5101518351611361816113558882019489865288830190610b69565b038881018352826108fa565b5190208361136f8389610e98565b51015184516113978161138b898201948a865289830190610b69565b038981018352826108fa565b519020036113ae575b6113a990610e73565b611325565b986113b98a87610e98565b516113c48289610e98565b526113cf8188610e98565b506001600160a01b036113e28b8a610e98565b5116600054821015610eac576113a99161144a9160008052817f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610e73565b9990506113a0565b50949750505050505050565b81516001600160a01b03167f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56382015590840190600101611316565b827f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56391820191015b8181106114ce575061130e565b600081556001016114c1565b604051906040820182811067ffffffffffffffff8211176108c8576040526000602083606081520152565b604051906000548083528260209182820190600080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563936000905b82821061155957505050611557925003836108fa565b565b85546001600160a01b031684526001958601958895509381019390910190611541565b9294966115ae9294989199966115906114da565b986115996114da565b9b6115a68c8a8a8a610f61565b8b52866116b4565b9060209892898901521561167c575060405163057ff68760e51b815260009780826004818c6001600160a01b0389165af1918215611671578992611642575b5081818b01528701510361161f575b505050506040519261160d846108de565b83525a91939291904390610bf1611505565b611637938361162d93610f61565b80875284516111ea565b8452388080806115fc565b9080925081813d831161166a575b61165a81836108fa565b8101031261066e575190386115ed565b503d611650565b6040513d8b823e3d90fd5b9650505050505a91939291904390610bf1611505565b9190811015610eac5760051b81013590603e19813603018212156108a7570190565b91939290936001600160a01b0383163b15611af4575b505060405163057ff68760e51b815260208160048160006001600160a01b0387165af1908115611ab657600091611ac2575b509360005b8181106117255750505050506040519061171a826108de565b600082529160019190565b60405163057ff68760e51b815260208160048160006001600160a01b0389165af1908115611ab657600091611a84575b50611761828487611692565b3514611776575b61177190610e73565b611701565b6040517f299ab72a0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260406024820152600081806117c3604482018a610c70565b038183305af160009181611a43575b506117ed575050505050506117e5610f31565b909160009190565b6117f8828487611692565b602081013591601e19823603018312156108a75767ffffffffffffffff83830135116108a7578282013560051b3603602084840101136108a7576001600160a01b0386163b156108a75790916040519283917f6171d1c900000000000000000000000000000000000000000000000000000000835260448301604060048501528183013590526064808401908284013560051b85010192602083820101926000905b8083013582106119075750505050506118c28291600094600319848303016024850152610b44565b0381836001600160a01b0389165af190816118ef575b506118ea5750505050506117e5610f31565b611768565b67ffffffffffffffff81116108c857604052386118d8565b91939695509193606319888203018552607e19828501360301873512156108a7576001600160a01b0361194160208487018a350101610934565b1681528635848301016040810135602083015236819003603e190160609091013512156108a75767ffffffffffffffff60208386018935016060810135010135116108a75760608735858401019081013501602081013536036040909101136108a7576020806060838160406001960152828689018c3501838d898c0190350101350101358282015260008b848a6080958693838c83818601843501918601843501013501013560408d84818701853501918701853501013501018689013735918b0191909101908101350101358301015298998b99813589880101606081013501840135601f01601f1916019190910197910195910193909291019061189a565b9091503d806000833e611a5681836108fa565b81016020828203126108a757815167ffffffffffffffff81116108a757611a7d9201610dd9565b90386117d2565b90506020813d602011611aae575b81611a9f602093836108fa565b810103126108a7575138611755565b3d9150611a92565b6040513d6000823e3d90fd5b90506020813d602011611aec575b81611add602093836108fa565b810103126108a75751386116fc565b3d9150611ad0565b81600092918360208194519301915af1611b0c610f31565b9015611b1857806116ca565b935050505060009160009190565b90606091815115611c8a5760005b82518114611c46576001600160a01b0380611b4f8386610e98565b511690604060008151937fc066a5b100000000000000000000000000000000000000000000000000000000855284600494828683015260209687918160249687928d165af1908115611c3b57600091611c0e575b50611bbb575050505050611bb690610e73565b611b34565b8251948501527f03000000000000000000000000000000000000000000000000000000000000008483015260218452929687019550935090915067ffffffffffffffff8411858510176110985750505290565b908682813d8311611c34575b611c2481836108fa565b8101031261011757505138611ba3565b503d611c1a565b84513d6000823e3d90fd5b606460405162461bcd60e51b815260206004820152601860248201527f53706f6f66206661696c65643a2077726f6e67206b65797300000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f53706f6f66206661696c65643a206e6f206b65797300000000000000000000006044820152fdfea264697066735822122099d72c607a84a2434fe90b47c382bb3a2fe4fed6708a0720bcd3d9f0469fc32964736f6c63430008130033" +} diff --git a/dist/contracts/compiled/UniversalSigValidator.json b/dist/contracts/compiled/UniversalSigValidator.json new file mode 100644 index 000000000..5f8df8325 --- /dev/null +++ b/dist/contracts/compiled/UniversalSigValidator.json @@ -0,0 +1 @@ +{ "abi": [{ "inputs": [{ "internalType": "bytes", "name": "error", "type": "bytes" }], "name": "ERC1271Revert", "type": "error" }, { "inputs": [{ "internalType": "bytes", "name": "error", "type": "bytes" }], "name": "ERC6492DeployFailed", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "_signer", "type": "address" }, { "internalType": "bytes32", "name": "_hash", "type": "bytes32" }, { "internalType": "bytes", "name": "_signature", "type": "bytes" }], "name": "isValidSig", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "_signer", "type": "address" }, { "internalType": "bytes32", "name": "_hash", "type": "bytes32" }, { "internalType": "bytes", "name": "_signature", "type": "bytes" }, { "internalType": "bool", "name": "allowSideEffects", "type": "bool" }, { "internalType": "bool", "name": "tryPrepare", "type": "bool" }], "name": "isValidSigImpl", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "_signer", "type": "address" }, { "internalType": "bytes32", "name": "_hash", "type": "bytes32" }, { "internalType": "bytes", "name": "_signature", "type": "bytes" }], "name": "isValidSigWithSideEffects", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x6080806040523461001657610a92908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c90816376be4cea1461004a575080638f06843014610045576398ef1ed81461004057600080fd5b61020f565b61014c565b346100bb5760a03660031901126100bb5760043590610068826100be565b6044359067ffffffffffffffff82116100bb5760206100b18461008e36600487016100d4565b6064359161009b83610102565b608435936100a885610102565b60243590610527565b6040519015158152f35b80fd5b6001600160a01b038116036100cf57565b600080fd5b9181601f840112156100cf5782359167ffffffffffffffff83116100cf57602083818601950101116100cf57565b801515036100cf57565b60606003198201126100cf57600435610124816100be565b91602435916044359067ffffffffffffffff82116100cf57610148916004016100d4565b9091565b346100cf5760c460206001600160a01b036101663661010c565b8091604097949397519788968795633b5f267560e11b8752166004860152602485015260a060448501528160a48501528484013760008382840101526001606483015260006084830152601f801991011681010301816000305af1801561020a576020916000916101dd575b506040519015158152f35b6101fd9150823d8111610203575b6101f581836102c8565b81019061090a565b386101d2565b503d6101eb565b610480565b346100cf5760206100b16102223661010c565b92919091610975565b601f1981019190821161023a57565b634e487b7160e01b600052601160045260246000fd5b9092919283116100cf579190565b906020116100cf5790602090565b906040116100cf5760200190602090565b909392938483116100cf5784116100cf578101920390565b3590602081106102a3575090565b6000199060200360031b1b1690565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102ea57604052565b6102b2565b67ffffffffffffffff81116102ea57601f01601f191660200190565b929192610317826102ef565b9161032560405193846102c8565b8294818452818301116100cf578281602093846000960137010152565b9080601f830112156100cf5781602061035d9335910161030b565b90565b916060838303126100cf578235610376816100be565b9267ffffffffffffffff9260208201358481116100cf5781610399918401610342565b9360408301359081116100cf5761035d9201610342565b3d156103db573d906103c1826102ef565b916103cf60405193846102c8565b82523d6000602084013e565b606090565b919082519283825260005b84811061040c575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016103eb565b90602061035d9281815201906103e0565b908160209103126100cf57517fffffffff00000000000000000000000000000000000000000000000000000000811681036100cf5790565b60409061035d9392815281602082015201906103e0565b6040513d6000823e3d90fd5b1561049357565b608460405162461bcd60e51b815260206004820152603a60248201527f5369676e617475726556616c696461746f72237265636f7665725369676e657260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152fd5b634e487b7160e01b600052603260045260246000fd5b90604010156105225760400190565b6104fd565b9490919293853b7f649264926492649264926492649264926492649264926492649264926492649261056c6105668861055f8161022b565b818a61027d565b90610295565b1480156108fa576105916105896105828961022b565b8989610250565b810190610360565b91841580156108f3575b610890575b50505b818215610887575b6106f85750505050506105c06041841461048c565b6106166106106105ea6105d6610566878761025e565b956105e4610566828861026c565b95610513565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9060ff8216601b81141590816106ec575b5061067d5761065b600093602095604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561020a576000516001600160a01b0390811691161490565b60405162461bcd60e51b815260206004820152602d60248201527f5369676e617475726556616c696461746f723a20696e76616c6964207369676e60448201527f617475726520762076616c7565000000000000000000000000000000000000006064820152608490fd5b0390fd5b601c9150141538610627565b60409997959396949899516020818c816001600160a01b03816107437f1626ba7e00000000000000000000000000000000000000000000000000000000988983528c60048401610469565b0392165afa60009181610857575b506107bb575050506107616103b0565b961590816107b1575b506107a3576040517f6f2a9599000000000000000000000000000000000000000000000000000000008152806106e88860048301610420565b61035d955060019496610527565b905015153861076a565b7fffffffff00000000000000000000000000000000000000000000000000000000909a92989a96959493961614978815908161084e575b5080610845575b610832575050505015918261082a575b5081610821575b506108185790565b6000526001601ffd5b90501538610810565b915038610809565b909192935061035d965060019550610527565b508415156107f9565b905015386107f2565b61087991925060203d8111610880575b61087181836102c8565b810190610431565b9038610751565b503d610867565b508215156105ab565b8160009291836001600160a01b036020829551940192165af16108b16103b0565b90156108bd57806105a0565b6106e8906040519182917f9d0d6e2d00000000000000000000000000000000000000000000000000000000835260048301610420565b508661059b565b61090536888861030b565b6105a3565b908160209103126100cf575161035d81610102565b9493806000946080946001600160a01b0360c095168952602089015260a060408901528160a08901528388013783828288010152601f8019910116850101938260608201520152565b8051156105225760200190565b610997602093946040519586948594633b5f267560e11b86526004860161091f565b03816000305af160009181610a3c575b5061035d57506109b56103b0565b805160018103610a3957507fff00000000000000000000000000000000000000000000000000000000000000610a34610a0e7f010000000000000000000000000000000000000000000000000000000000000093610968565b517fff000000000000000000000000000000000000000000000000000000000000001690565b161490565b90fd5b610a5591925060203d8111610203576101f581836102c8565b90386109a756fea264697066735822122037875d8e00695f5360c2ebc8e68e92bf0b94639924807681c86bc546005dde3064736f6c63430008130033", "binRuntime": "0x6080604052600436101561001257600080fd5b6000803560e01c90816376be4cea1461004a575080638f06843014610045576398ef1ed81461004057600080fd5b61020f565b61014c565b346100bb5760a03660031901126100bb5760043590610068826100be565b6044359067ffffffffffffffff82116100bb5760206100b18461008e36600487016100d4565b6064359161009b83610102565b608435936100a885610102565b60243590610527565b6040519015158152f35b80fd5b6001600160a01b038116036100cf57565b600080fd5b9181601f840112156100cf5782359167ffffffffffffffff83116100cf57602083818601950101116100cf57565b801515036100cf57565b60606003198201126100cf57600435610124816100be565b91602435916044359067ffffffffffffffff82116100cf57610148916004016100d4565b9091565b346100cf5760c460206001600160a01b036101663661010c565b8091604097949397519788968795633b5f267560e11b8752166004860152602485015260a060448501528160a48501528484013760008382840101526001606483015260006084830152601f801991011681010301816000305af1801561020a576020916000916101dd575b506040519015158152f35b6101fd9150823d8111610203575b6101f581836102c8565b81019061090a565b386101d2565b503d6101eb565b610480565b346100cf5760206100b16102223661010c565b92919091610975565b601f1981019190821161023a57565b634e487b7160e01b600052601160045260246000fd5b9092919283116100cf579190565b906020116100cf5790602090565b906040116100cf5760200190602090565b909392938483116100cf5784116100cf578101920390565b3590602081106102a3575090565b6000199060200360031b1b1690565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102ea57604052565b6102b2565b67ffffffffffffffff81116102ea57601f01601f191660200190565b929192610317826102ef565b9161032560405193846102c8565b8294818452818301116100cf578281602093846000960137010152565b9080601f830112156100cf5781602061035d9335910161030b565b90565b916060838303126100cf578235610376816100be565b9267ffffffffffffffff9260208201358481116100cf5781610399918401610342565b9360408301359081116100cf5761035d9201610342565b3d156103db573d906103c1826102ef565b916103cf60405193846102c8565b82523d6000602084013e565b606090565b919082519283825260005b84811061040c575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016103eb565b90602061035d9281815201906103e0565b908160209103126100cf57517fffffffff00000000000000000000000000000000000000000000000000000000811681036100cf5790565b60409061035d9392815281602082015201906103e0565b6040513d6000823e3d90fd5b1561049357565b608460405162461bcd60e51b815260206004820152603a60248201527f5369676e617475726556616c696461746f72237265636f7665725369676e657260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152fd5b634e487b7160e01b600052603260045260246000fd5b90604010156105225760400190565b6104fd565b9490919293853b7f649264926492649264926492649264926492649264926492649264926492649261056c6105668861055f8161022b565b818a61027d565b90610295565b1480156108fa576105916105896105828961022b565b8989610250565b810190610360565b91841580156108f3575b610890575b50505b818215610887575b6106f85750505050506105c06041841461048c565b6106166106106105ea6105d6610566878761025e565b956105e4610566828861026c565b95610513565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9060ff8216601b81141590816106ec575b5061067d5761065b600093602095604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561020a576000516001600160a01b0390811691161490565b60405162461bcd60e51b815260206004820152602d60248201527f5369676e617475726556616c696461746f723a20696e76616c6964207369676e60448201527f617475726520762076616c7565000000000000000000000000000000000000006064820152608490fd5b0390fd5b601c9150141538610627565b60409997959396949899516020818c816001600160a01b03816107437f1626ba7e00000000000000000000000000000000000000000000000000000000988983528c60048401610469565b0392165afa60009181610857575b506107bb575050506107616103b0565b961590816107b1575b506107a3576040517f6f2a9599000000000000000000000000000000000000000000000000000000008152806106e88860048301610420565b61035d955060019496610527565b905015153861076a565b7fffffffff00000000000000000000000000000000000000000000000000000000909a92989a96959493961614978815908161084e575b5080610845575b610832575050505015918261082a575b5081610821575b506108185790565b6000526001601ffd5b90501538610810565b915038610809565b909192935061035d965060019550610527565b508415156107f9565b905015386107f2565b61087991925060203d8111610880575b61087181836102c8565b810190610431565b9038610751565b503d610867565b508215156105ab565b8160009291836001600160a01b036020829551940192165af16108b16103b0565b90156108bd57806105a0565b6106e8906040519182917f9d0d6e2d00000000000000000000000000000000000000000000000000000000835260048301610420565b508661059b565b61090536888861030b565b6105a3565b908160209103126100cf575161035d81610102565b9493806000946080946001600160a01b0360c095168952602089015260a060408901528160a08901528388013783828288010152601f8019910116850101938260608201520152565b8051156105225760200190565b610997602093946040519586948594633b5f267560e11b86526004860161091f565b03816000305af160009181610a3c575b5061035d57506109b56103b0565b805160018103610a3957507fff00000000000000000000000000000000000000000000000000000000000000610a34610a0e7f010000000000000000000000000000000000000000000000000000000000000093610968565b517fff000000000000000000000000000000000000000000000000000000000000001690565b161490565b90fd5b610a5591925060203d8111610203576101f581836102c8565b90386109a756fea264697066735822122037875d8e00695f5360c2ebc8e68e92bf0b94639924807681c86bc546005dde3064736f6c63430008130033" } diff --git a/dist/contracts/compiled/WALLETSupplyController.json b/dist/contracts/compiled/WALLETSupplyController.json new file mode 100644 index 000000000..813a8b32a --- /dev/null +++ b/dist/contracts/compiled/WALLETSupplyController.json @@ -0,0 +1,518 @@ +[ + { + "inputs": [ + { + "internalType": "contract WALLETToken", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "initialGovernance", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimed", + "type": "uint256" + } + ], + "name": "LogClaimStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "received", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "burned", + "type": "uint256" + } + ], + "name": "LogClaimWithPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "LogMintVesting", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountPerSec", + "type": "uint256" + } + ], + "name": "LogNewVesting", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newPenaltyBps", + "type": "uint256" + } + ], + "name": "LogUpdatePenaltyBps", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountPerSec", + "type": "uint256" + } + ], + "name": "LogVestingUnset", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_CLAIM_NODE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WALLET", + "outputs": [ + { + "internalType": "contract WALLETToken", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newSupplyController", + "type": "address" + } + ], + "name": "changeSupplyController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalRewardInTree", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "toBurnBps", + "type": "uint256" + }, + { + "internalType": "contract IStakingPool", + "name": "stakingPool", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalRewardInTree", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "toBurnBps", + "type": "uint256" + }, + { + "internalType": "contract IStakingPool", + "name": "stakingPool", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "claimWithRootUpdate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "claimed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "hasGovernance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountPerSecond", + "type": "uint256" + } + ], + "name": "mintVesting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountPerSecond", + "type": "uint256" + } + ], + "name": "mintableVesting", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "penaltyBps", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bool", + "name": "level", + "type": "bool" + } + ], + "name": "setGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_penaltyBps", + "type": "uint256" + } + ], + "name": "setPenaltyBps", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "setRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountPerSecond", + "type": "uint256" + } + ], + "name": "setVesting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountPerSecond", + "type": "uint256" + } + ], + "name": "unsetVesting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vestingLastMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenAmount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/dist/contracts/compiled/WETH.json b/dist/contracts/compiled/WETH.json new file mode 100644 index 000000000..45290870c --- /dev/null +++ b/dist/contracts/compiled/WETH.json @@ -0,0 +1,153 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "guy", "type": "address" }, + { "name": "wad", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "src", "type": "address" }, + { "name": "dst", "type": "address" }, + { "name": "wad", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "wad", "type": "uint256" }], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "dst", "type": "address" }, + { "name": "wad", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "deposit", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "", "type": "address" }, + { "name": "", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "src", "type": "address" }, + { "indexed": true, "name": "guy", "type": "address" }, + { "indexed": false, "name": "wad", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "src", "type": "address" }, + { "indexed": true, "name": "dst", "type": "address" }, + { "indexed": false, "name": "wad", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "dst", "type": "address" }, + { "indexed": false, "name": "wad", "type": "uint256" } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "src", "type": "address" }, + { "indexed": false, "name": "wad", "type": "uint256" } + ], + "name": "Withdrawal", + "type": "event" + } +] diff --git a/dist/src/classes/EmittableError.d.ts b/dist/src/classes/EmittableError.d.ts new file mode 100644 index 000000000..11ba026c8 --- /dev/null +++ b/dist/src/classes/EmittableError.d.ts @@ -0,0 +1,12 @@ +import { ErrorRef } from '../controllers/eventEmitter/eventEmitter'; +export default class EmittableError extends Error { + level: ErrorRef['level']; + message: ErrorRef['message']; + error: Error; + constructor(errorRef: { + message: ErrorRef['message']; + level: ErrorRef['level']; + error?: Error; + }); +} +//# sourceMappingURL=EmittableError.d.ts.map \ No newline at end of file diff --git a/dist/src/classes/EmittableError.d.ts.map b/dist/src/classes/EmittableError.d.ts.map new file mode 100644 index 000000000..5a5708386 --- /dev/null +++ b/dist/src/classes/EmittableError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"EmittableError.d.ts","sourceRoot":"","sources":["../../../src/classes/EmittableError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAA;AAEnE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,KAAK;IAC/C,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAExB,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;IAE5B,KAAK,EAAE,KAAK,CAAA;gBAEA,QAAQ,EAAE;QAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAYhG"} \ No newline at end of file diff --git a/dist/src/classes/EmittableError.js b/dist/src/classes/EmittableError.js new file mode 100644 index 000000000..03fc5738f --- /dev/null +++ b/dist/src/classes/EmittableError.js @@ -0,0 +1,18 @@ +export default class EmittableError extends Error { + level; + message; + error; + constructor(errorRef) { + super(); + this.message = errorRef.message; + this.name = 'EmittableError'; + this.level = errorRef.level; + if (!errorRef.error) { + this.error = new Error(errorRef.message); + } + else { + this.error = errorRef.error; + } + } +} +//# sourceMappingURL=EmittableError.js.map \ No newline at end of file diff --git a/dist/src/classes/EmittableError.js.map b/dist/src/classes/EmittableError.js.map new file mode 100644 index 000000000..0629b0a54 --- /dev/null +++ b/dist/src/classes/EmittableError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EmittableError.js","sourceRoot":"","sources":["../../../src/classes/EmittableError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,KAAK;IAC/C,KAAK,CAAmB;IAExB,OAAO,CAAqB;IAE5B,KAAK,CAAO;IAEZ,YAAY,QAAmF;QAC7F,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAE3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;SACzC;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;SAC5B;IACH,CAAC;CACF","sourcesContent":["import { ErrorRef } from '../controllers/eventEmitter/eventEmitter'\n\nexport default class EmittableError extends Error {\n level: ErrorRef['level']\n\n message: ErrorRef['message']\n\n error: Error\n\n constructor(errorRef: { message: ErrorRef['message']; level: ErrorRef['level']; error?: Error }) {\n super()\n this.message = errorRef.message\n this.name = 'EmittableError'\n this.level = errorRef.level\n\n if (!errorRef.error) {\n this.error = new Error(errorRef.message)\n } else {\n this.error = errorRef.error\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.d.ts b/dist/src/classes/ExternalSignerError.d.ts new file mode 100644 index 000000000..ffc99dc92 --- /dev/null +++ b/dist/src/classes/ExternalSignerError.d.ts @@ -0,0 +1,4 @@ +export default class ExternalSignerError extends Error { + constructor(message: string); +} +//# sourceMappingURL=ExternalSignerError.d.ts.map \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.d.ts.map b/dist/src/classes/ExternalSignerError.d.ts.map new file mode 100644 index 000000000..0b69f85fb --- /dev/null +++ b/dist/src/classes/ExternalSignerError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ExternalSignerError.d.ts","sourceRoot":"","sources":["../../../src/classes/ExternalSignerError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAK5B"} \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.js b/dist/src/classes/ExternalSignerError.js new file mode 100644 index 000000000..0d39f1155 --- /dev/null +++ b/dist/src/classes/ExternalSignerError.js @@ -0,0 +1,8 @@ +export default class ExternalSignerError extends Error { + constructor(message) { + super(); + this.name = 'ExternalSignerError'; + this.message = message; + } +} +//# sourceMappingURL=ExternalSignerError.js.map \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.js.map b/dist/src/classes/ExternalSignerError.js.map new file mode 100644 index 000000000..fd7e830b3 --- /dev/null +++ b/dist/src/classes/ExternalSignerError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ExternalSignerError.js","sourceRoot":"","sources":["../../../src/classes/ExternalSignerError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class ExternalSignerError extends Error {\n constructor(message: string) {\n super()\n this.name = 'ExternalSignerError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.d.ts b/dist/src/classes/SwapAndBridgeError.d.ts new file mode 100644 index 000000000..65c5a9a62 --- /dev/null +++ b/dist/src/classes/SwapAndBridgeError.d.ts @@ -0,0 +1,4 @@ +export default class SwapAndBridgeError extends Error { + constructor(message: string); +} +//# sourceMappingURL=SwapAndBridgeError.d.ts.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.d.ts.map b/dist/src/classes/SwapAndBridgeError.d.ts.map new file mode 100644 index 000000000..33dd061b4 --- /dev/null +++ b/dist/src/classes/SwapAndBridgeError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"SwapAndBridgeError.d.ts","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAK5B"} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.js b/dist/src/classes/SwapAndBridgeError.js new file mode 100644 index 000000000..0fdecee15 --- /dev/null +++ b/dist/src/classes/SwapAndBridgeError.js @@ -0,0 +1,8 @@ +export default class SwapAndBridgeError extends Error { + constructor(message) { + super(); + this.name = 'SwapAndBridgeError'; + this.message = message; + } +} +//# sourceMappingURL=SwapAndBridgeError.js.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.js.map b/dist/src/classes/SwapAndBridgeError.js.map new file mode 100644 index 000000000..7c10c9bc2 --- /dev/null +++ b/dist/src/classes/SwapAndBridgeError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SwapAndBridgeError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,KAAK;IACnD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class SwapAndBridgeError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.d.ts b/dist/src/classes/SwapAndBridgeProviderApiError.d.ts new file mode 100644 index 000000000..ffea81009 --- /dev/null +++ b/dist/src/classes/SwapAndBridgeProviderApiError.d.ts @@ -0,0 +1,4 @@ +export default class SwapAndBridgeProviderApiError extends Error { + constructor(message: string); +} +//# sourceMappingURL=SwapAndBridgeProviderApiError.d.ts.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.d.ts.map b/dist/src/classes/SwapAndBridgeProviderApiError.d.ts.map new file mode 100644 index 000000000..af02def8b --- /dev/null +++ b/dist/src/classes/SwapAndBridgeProviderApiError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"SwapAndBridgeProviderApiError.d.ts","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeProviderApiError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,KAAK;gBAClD,OAAO,EAAE,MAAM;CAK5B"} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.js b/dist/src/classes/SwapAndBridgeProviderApiError.js new file mode 100644 index 000000000..3c6ad531d --- /dev/null +++ b/dist/src/classes/SwapAndBridgeProviderApiError.js @@ -0,0 +1,8 @@ +export default class SwapAndBridgeProviderApiError extends Error { + constructor(message) { + super(); + this.name = 'SwapAndBridgeProviderApiError'; + this.message = message; + } +} +//# sourceMappingURL=SwapAndBridgeProviderApiError.js.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.js.map b/dist/src/classes/SwapAndBridgeProviderApiError.js.map new file mode 100644 index 000000000..cdb22820c --- /dev/null +++ b/dist/src/classes/SwapAndBridgeProviderApiError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SwapAndBridgeProviderApiError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeProviderApiError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,KAAK;IAC9D,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class SwapAndBridgeProviderApiError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeProviderApiError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/session.d.ts b/dist/src/classes/session.d.ts new file mode 100644 index 000000000..3022eaa16 --- /dev/null +++ b/dist/src/classes/session.d.ts @@ -0,0 +1,23 @@ +import { Messenger } from '../interfaces/messenger'; +export interface SessionProp { + origin?: string; + icon?: string; + name?: string; + tabId?: number; +} +export declare class Session { + origin: string; + icon: string; + name: string; + tabId: number | null; + messenger: Messenger | null; + sendMessage(event: any, data: any): void; + constructor(data: SessionProp); + setMessenger(messenger: Messenger): void; + setProp({ origin, icon, name, tabId }: SessionProp): void; + get sessionId(): string; + toJSON(): this & { + sessionId: string; + }; +} +//# sourceMappingURL=session.d.ts.map \ No newline at end of file diff --git a/dist/src/classes/session.d.ts.map b/dist/src/classes/session.d.ts.map new file mode 100644 index 000000000..e560f5fec --- /dev/null +++ b/dist/src/classes/session.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/classes/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEnD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAID,qBAAa,OAAO;IAClB,MAAM,EAAE,MAAM,CAAK;IAEnB,IAAI,EAAE,MAAM,CAAK;IAEjB,IAAI,EAAE,MAAM,CAAK;IAEjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAO;IAE3B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAO;IAElC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;gBAMrB,IAAI,EAAE,WAAW;IAI7B,YAAY,CAAC,SAAS,EAAE,SAAS;IAIjC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW;IAOlD,IAAI,SAAS,WAEZ;IAED,MAAM;;;CAMP"} \ No newline at end of file diff --git a/dist/src/classes/session.js b/dist/src/classes/session.js new file mode 100644 index 000000000..4b5a09734 --- /dev/null +++ b/dist/src/classes/session.js @@ -0,0 +1,40 @@ +// Each instance of a Session represents an active connection between a dApp and the wallet. +// For more details on how to use it, refer to the DappsController. +export class Session { + origin = ''; + icon = ''; + name = ''; + tabId = null; + messenger = null; + sendMessage(event, data) { + if (this.messenger) { + this.messenger.send('broadcast', { event, data }, { tabId: this.tabId }); + } + } + constructor(data) { + this.setProp(data); + } + setMessenger(messenger) { + this.messenger = messenger; + } + setProp({ origin, icon, name, tabId }) { + if (origin) + this.origin = origin; + if (icon) + this.icon = icon; + if (name) + this.name = name; + if (tabId) + this.tabId = tabId; + } + get sessionId() { + return `${this.tabId}-${this.origin}`; + } + toJSON() { + return { + ...this, + sessionId: this.sessionId + }; + } +} +//# sourceMappingURL=session.js.map \ No newline at end of file diff --git a/dist/src/classes/session.js.map b/dist/src/classes/session.js.map new file mode 100644 index 000000000..e9c448516 --- /dev/null +++ b/dist/src/classes/session.js.map @@ -0,0 +1 @@ +{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/classes/session.ts"],"names":[],"mappings":"AASA,4FAA4F;AAC5F,mEAAmE;AACnE,MAAM,OAAO,OAAO;IAClB,MAAM,GAAW,EAAE,CAAA;IAEnB,IAAI,GAAW,EAAE,CAAA;IAEjB,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,GAAkB,IAAI,CAAA;IAE3B,SAAS,GAAqB,IAAI,CAAA;IAElC,WAAW,CAAC,KAAU,EAAE,IAAS;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;SACzE;IACH,CAAC;IAED,YAAY,IAAiB;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAe;QAChD,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAChC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAA;IACvC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IACH,CAAC;CACF","sourcesContent":["import { Messenger } from '../interfaces/messenger'\n\nexport interface SessionProp {\n origin?: string\n icon?: string\n name?: string\n tabId?: number\n}\n\n// Each instance of a Session represents an active connection between a dApp and the wallet.\n// For more details on how to use it, refer to the DappsController.\nexport class Session {\n origin: string = ''\n\n icon: string = ''\n\n name: string = ''\n\n tabId: number | null = null\n\n messenger: Messenger | null = null\n\n sendMessage(event: any, data: any) {\n if (this.messenger) {\n this.messenger.send('broadcast', { event, data }, { tabId: this.tabId })\n }\n }\n\n constructor(data: SessionProp) {\n this.setProp(data)\n }\n\n setMessenger(messenger: Messenger) {\n this.messenger = messenger\n }\n\n setProp({ origin, icon, name, tabId }: SessionProp) {\n if (origin) this.origin = origin\n if (icon) this.icon = icon\n if (name) this.name = name\n if (tabId) this.tabId = tabId\n }\n\n get sessionId() {\n return `${this.tabId}-${this.origin}`\n }\n\n toJSON() {\n return {\n ...this,\n sessionId: this.sessionId\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/consts/account.d.ts b/dist/src/consts/account.d.ts new file mode 100644 index 000000000..0b444e30a --- /dev/null +++ b/dist/src/consts/account.d.ts @@ -0,0 +1,2 @@ +export declare const DEFAULT_ACCOUNT_LABEL = "Account"; +//# sourceMappingURL=account.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/account.d.ts.map b/dist/src/consts/account.d.ts.map new file mode 100644 index 000000000..416a695c0 --- /dev/null +++ b/dist/src/consts/account.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/consts/account.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,YAAY,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/account.js b/dist/src/consts/account.js new file mode 100644 index 000000000..73637d220 --- /dev/null +++ b/dist/src/consts/account.js @@ -0,0 +1,2 @@ +export const DEFAULT_ACCOUNT_LABEL = 'Account'; +//# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/consts/account.js.map b/dist/src/consts/account.js.map new file mode 100644 index 000000000..b37a7cb42 --- /dev/null +++ b/dist/src/consts/account.js.map @@ -0,0 +1 @@ +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/consts/account.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAA","sourcesContent":["export const DEFAULT_ACCOUNT_LABEL = 'Account'\n"]} \ No newline at end of file diff --git a/dist/src/consts/addresses.d.ts b/dist/src/consts/addresses.d.ts new file mode 100644 index 000000000..4301a186d --- /dev/null +++ b/dist/src/consts/addresses.d.ts @@ -0,0 +1,18 @@ +export declare const FEE_COLLECTOR = "0x942f9CE5D9a33a82F88D233AEb3292E680230348"; +export declare const PERMIT_2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; +export declare const AMBIRE_V1_QUICK_ACC_MANAGER = "0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF"; +export declare const UNISWAP_UNIVERSAL_ROUTERS: any; +export declare const SUPPLY_CONTROLLER_ADDR = "0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff"; +export declare const WALLET_STAKING_ADDR = "0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935"; +export declare const STK_WALLET = "0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78"; +export declare const WALLET_TOKEN = "0x88800092fF476844f74dC2FC427974BBee2794Ae"; +export declare const RELAYER_EXECUTOR_ADDRESSES: string[]; +export declare const STAGING_RELAYER_EXECUTOR_ADDRESSES: string[]; +export declare const PORTFOLIO_TESTS_V2: { + addr: string; + key: string; + factory: string; + bytecode: string; + salt: string; +}; +//# sourceMappingURL=addresses.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/addresses.d.ts.map b/dist/src/consts/addresses.d.ts.map new file mode 100644 index 000000000..7207e18b9 --- /dev/null +++ b/dist/src/consts/addresses.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../../src/consts/addresses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,+CAA+C,CAAA;AACzE,eAAO,MAAM,gBAAgB,+CAA+C,CAAA;AAC5E,eAAO,MAAM,2BAA2B,+CAA+C,CAAA;AACvF,eAAO,MAAM,yBAAyB,EAAE,GAcvC,CAAA;AACD,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAClF,eAAO,MAAM,mBAAmB,+CAA+C,CAAA;AAC/E,eAAO,MAAM,UAAU,+CAA+C,CAAA;AACtE,eAAO,MAAM,YAAY,+CAA+C,CAAA;AACxE,eAAO,MAAM,0BAA0B,UAGtC,CAAA;AACD,eAAO,MAAM,kCAAkC,UAAiD,CAAA;AAChG,eAAO,MAAM,kBAAkB;;;;;;CAO9B,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/addresses.js b/dist/src/consts/addresses.js new file mode 100644 index 000000000..8ddad2af6 --- /dev/null +++ b/dist/src/consts/addresses.js @@ -0,0 +1,35 @@ +export const FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'; +export const PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'; +export const AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'; +export const UNISWAP_UNIVERSAL_ROUTERS = { + 1: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', + 11155111: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', + 8453: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', + 42161: '0x5E325eDA8064b456f4781070C0738d849c824258', + 421614: '0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2', + 10: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8', + 11155420: '0xD5bBa708b39537d33F2812E5Ea032622456F1A95', + 137: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2', + 84532: '0x050E797f3625EC8785265e1d9BDd4799b97528A1', + 56: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265', + 43114: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265', + 42220: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4', + 81457: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4' +}; +export const SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'; +export const WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'; +export const STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'; +export const WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'; +export const RELAYER_EXECUTOR_ADDRESSES = [ + '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + '0xCFaFC6BdD1B92E510D5409EE460bb1A712165AA8' +]; +export const STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']; +export const PORTFOLIO_TESTS_V2 = { + addr: '0xae376B42699fDB0D80e9ceE068A4f75ae6d70d85', + key: '0xD5Cdb05Df16FB0f84a02ebff3405f80e441d7D57', + factory: '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d', + bytecode: '0x7f00000000000000000000000000000000000000000000000000000000000000027fa85abbdf4f476f0727ae1450f282935c0d57708ae82c281b3fa758db2e21c89b553d602d80604d3d3981f3363d3d373d3d3d363d730f2aa7bcda3d9d210df69a394b6965cb2566c8285af43d82803e903d91602b57fd5bf3', + salt: '0x0000000000000000000000000000000000000000000000000000000000000000' +}; +//# sourceMappingURL=addresses.js.map \ No newline at end of file diff --git a/dist/src/consts/addresses.js.map b/dist/src/consts/addresses.js.map new file mode 100644 index 000000000..338f091ad --- /dev/null +++ b/dist/src/consts/addresses.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/consts/addresses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,4CAA4C,CAAA;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4CAA4C,CAAA;AAC5E,MAAM,CAAC,MAAM,2BAA2B,GAAG,4CAA4C,CAAA;AACvF,MAAM,CAAC,MAAM,yBAAyB,GAAQ;IAC5C,CAAC,EAAE,4CAA4C;IAC/C,QAAQ,EAAE,4CAA4C;IACtD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,EAAE,EAAE,4CAA4C;IAChD,QAAQ,EAAE,4CAA4C;IACtD,GAAG,EAAE,4CAA4C;IACjD,KAAK,EAAE,4CAA4C;IACnD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;CACpD,CAAA;AACD,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C,CAAA;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,4CAA4C,CAAA;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA;AACD,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,4CAA4C,CAAC,CAAA;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,4CAA4C;IAClD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EACN,wPAAwP;IAC1P,IAAI,EAAE,oEAAoE;CAC3E,CAAA","sourcesContent":["export const FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'\nexport const PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\nexport const AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'\nexport const UNISWAP_UNIVERSAL_ROUTERS: any = {\n 1: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 8453: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0x5E325eDA8064b456f4781070C0738d849c824258',\n 421614: '0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2',\n 10: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',\n 11155420: '0xD5bBa708b39537d33F2812E5Ea032622456F1A95',\n 137: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',\n 84532: '0x050E797f3625EC8785265e1d9BDd4799b97528A1',\n 56: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 43114: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 42220: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',\n 81457: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4'\n}\nexport const SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'\nexport const WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'\nexport const STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'\nexport const WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'\nexport const RELAYER_EXECUTOR_ADDRESSES = [\n '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n '0xCFaFC6BdD1B92E510D5409EE460bb1A712165AA8'\n]\nexport const STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']\nexport const PORTFOLIO_TESTS_V2 = {\n addr: '0xae376B42699fDB0D80e9ceE068A4f75ae6d70d85',\n key: '0xD5Cdb05Df16FB0f84a02ebff3405f80e441d7D57',\n factory: '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d',\n bytecode:\n '0x7f00000000000000000000000000000000000000000000000000000000000000027fa85abbdf4f476f0727ae1450f282935c0d57708ae82c281b3fa758db2e21c89b553d602d80604d3d3981f3363d3d373d3d3d363d730f2aa7bcda3d9d210df69a394b6965cb2566c8285af43d82803e903d91602b57fd5bf3',\n salt: '0x0000000000000000000000000000000000000000000000000000000000000000'\n}\n"]} \ No newline at end of file diff --git a/dist/src/consts/bundlers.d.ts b/dist/src/consts/bundlers.d.ts new file mode 100644 index 000000000..d5a15e213 --- /dev/null +++ b/dist/src/consts/bundlers.d.ts @@ -0,0 +1,5 @@ +export declare const PIMLICO = "pimlico"; +export declare const BICONOMY = "biconomy"; +export type BUNDLER = typeof PIMLICO | typeof BICONOMY; +export declare const allBundlers: string[]; +//# sourceMappingURL=bundlers.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/bundlers.d.ts.map b/dist/src/consts/bundlers.d.ts.map new file mode 100644 index 000000000..d78d29ca4 --- /dev/null +++ b/dist/src/consts/bundlers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bundlers.d.ts","sourceRoot":"","sources":["../../../src/consts/bundlers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAY,CAAA;AAChC,eAAO,MAAM,QAAQ,aAAa,CAAA;AAElC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,GAAG,OAAO,QAAQ,CAAA;AAEtD,eAAO,MAAM,WAAW,UAAsB,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/bundlers.js b/dist/src/consts/bundlers.js new file mode 100644 index 000000000..9a12eb9e0 --- /dev/null +++ b/dist/src/consts/bundlers.js @@ -0,0 +1,4 @@ +export const PIMLICO = 'pimlico'; +export const BICONOMY = 'biconomy'; +export const allBundlers = [PIMLICO, BICONOMY]; +//# sourceMappingURL=bundlers.js.map \ No newline at end of file diff --git a/dist/src/consts/bundlers.js.map b/dist/src/consts/bundlers.js.map new file mode 100644 index 000000000..1c040e01c --- /dev/null +++ b/dist/src/consts/bundlers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundlers.js","sourceRoot":"","sources":["../../../src/consts/bundlers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAA;AAChC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAIlC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA","sourcesContent":["export const PIMLICO = 'pimlico'\nexport const BICONOMY = 'biconomy'\n\nexport type BUNDLER = typeof PIMLICO | typeof BICONOMY\n\nexport const allBundlers = [PIMLICO, BICONOMY]\n"]} \ No newline at end of file diff --git a/dist/src/consts/coingecko.d.ts b/dist/src/consts/coingecko.d.ts new file mode 100644 index 000000000..3611ba3db --- /dev/null +++ b/dist/src/consts/coingecko.d.ts @@ -0,0 +1,20 @@ +import { Network } from '../interfaces/network'; +export declare function geckoIdMapper(address: string, network: Network): string | null; +/** + * Maps specific token addresses to alternative addresses if they are missing on + * CoinGecko (so that they are aliased to existing tokens). + */ +export declare function geckoTokenAddressMapper(address: string): string; +/** + * Constructs the CoinGecko API URL for a given token address and network ID. + * Handles special cases where the CoinGecko API handles differently certain + * tokens like the native tokens. + */ +export declare function getCoinGeckoTokenApiUrl({ tokenAddr, geckoChainId, geckoNativeCoinId }: { + tokenAddr: string; + geckoChainId: string; + geckoNativeCoinId: string; +}): string; +/** Constructs the CoinGecko URL for a given token slug. */ +export declare const getCoinGeckoTokenUrl: (slug: string) => string; +//# sourceMappingURL=coingecko.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/coingecko.d.ts.map b/dist/src/consts/coingecko.d.ts.map new file mode 100644 index 000000000..3675e5d72 --- /dev/null +++ b/dist/src/consts/coingecko.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"coingecko.d.ts","sourceRoot":"","sources":["../../../src/consts/coingecko.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAO/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,UAKtD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,SAAS,EACT,YAAY,EACZ,iBAAiB,EAClB,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,UAOA;AAED,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,SAAU,MAAM,WAAmC,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/coingecko.js b/dist/src/consts/coingecko.js index e126ea1c1..add73f536 100644 --- a/dist/src/consts/coingecko.js +++ b/dist/src/consts/coingecko.js @@ -1,30 +1,39 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.geckoIdMapper = exports.geckoNetworkIdMapper = void 0; -// @TODO: can this be better/be eliminated? at worst, we'll just move it out of this file -// maps our own networkId to coingeckoPlatform -function geckoNetworkIdMapper(x) { - return ({ - polygon: 'polygon-pos', - arbitrum: 'arbitrum-one' - }[x] || x); -} -exports.geckoNetworkIdMapper = geckoNetworkIdMapper; +import { ZeroAddress } from 'ethers'; +import { WALLET_STAKING_ADDR, WALLET_TOKEN } from './addresses'; +const COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3/coins/'; +const COINGECKO_BASE_URL = 'https://www.coingecko.com/en/coins/'; // @TODO some form of a constants list -function geckoIdMapper(address, networkId) { - if (address === '0x0000000000000000000000000000000000000000') - return ({ - polygon: 'matic-network', - 'binance-smart-chain': 'binancecoin', - avalanche: 'avalanche-2', - arbitrum: 'ethereum', - metis: 'metis-token', - optimism: 'ethereum' - // kucoin, gnosis, kc not added - }[networkId] || networkId); +export function geckoIdMapper(address, network) { + if (address === ZeroAddress) + return network.nativeAssetId; + // we currently can't map aave so we're leaving this if (address === '0x4da27a545c0c5B758a6BA100e3a049001de870f5') return 'aave'; return null; } -exports.geckoIdMapper = geckoIdMapper; +/** + * Maps specific token addresses to alternative addresses if they are missing on + * CoinGecko (so that they are aliased to existing tokens). + */ +export function geckoTokenAddressMapper(address) { + // xWALLET is missing on CoinGecko, so alias it to WALLET token (that exists on CoinGecko) + if (address === WALLET_STAKING_ADDR) + return WALLET_TOKEN; + return address; +} +/** + * Constructs the CoinGecko API URL for a given token address and network ID. + * Handles special cases where the CoinGecko API handles differently certain + * tokens like the native tokens. + */ +export function getCoinGeckoTokenApiUrl({ tokenAddr, geckoChainId, geckoNativeCoinId }) { + // CoinGecko does not handle native assets (ETH, MATIC, BNB...) via the /contract endpoint. + // Instead, native assets are identified by URL with the `nativeAssetId` directly. + if (tokenAddr === ZeroAddress) + return `${COINGECKO_API_BASE_URL}${geckoNativeCoinId}`; + const geckoTokenAddress = geckoTokenAddressMapper(tokenAddr); + return `${COINGECKO_API_BASE_URL}${geckoChainId}/contract/${geckoTokenAddress}`; +} +/** Constructs the CoinGecko URL for a given token slug. */ +export const getCoinGeckoTokenUrl = (slug) => `${COINGECKO_BASE_URL}${slug}`; //# sourceMappingURL=coingecko.js.map \ No newline at end of file diff --git a/dist/src/consts/coingecko.js.map b/dist/src/consts/coingecko.js.map index c64bfe533..9adeec460 100644 --- a/dist/src/consts/coingecko.js.map +++ b/dist/src/consts/coingecko.js.map @@ -1 +1 @@ -{"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../../src/consts/coingecko.ts"],"names":[],"mappings":";;;AAAA,yFAAyF;AACzF,8CAA8C;AAC9C,SAAgB,oBAAoB,CAAC,CAAS;IAC5C,OAAO,CACL;QACE,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,cAAc;KACzB,CAAC,CAAC,CAAC,IAAI,CAAC,CACV,CAAA;AACH,CAAC;AAPD,oDAOC;AAED,sCAAsC;AACtC,SAAgB,aAAa,CAAC,OAAe,EAAE,SAAiB;IAC9D,IAAI,OAAO,KAAK,4CAA4C;QAC1D,OAAO,CACL;YACE,OAAO,EAAE,eAAe;YACxB,qBAAqB,EAAE,aAAa;YACpC,SAAS,EAAE,aAAa;YACxB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,UAAU;YACpB,+BAA+B;SAChC,CAAC,SAAS,CAAC,IAAI,SAAS,CAC1B,CAAA;IACH,IAAI,OAAO,KAAK,4CAA4C;QAAE,OAAO,MAAM,CAAA;IAC3E,OAAO,IAAI,CAAA;AACb,CAAC;AAfD,sCAeC"} \ No newline at end of file +{"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../../src/consts/coingecko.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAGpC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,sBAAsB,GAAG,yCAAyC,CAAA;AACxE,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AAEhE,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAgB;IAC7D,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,aAAa,CAAA;IAEzD,oDAAoD;IACpD,IAAI,OAAO,KAAK,4CAA4C;QAAE,OAAO,MAAM,CAAA;IAE3E,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,0FAA0F;IAC1F,IAAI,OAAO,KAAK,mBAAmB;QAAE,OAAO,YAAY,CAAA;IAExD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,SAAS,EACT,YAAY,EACZ,iBAAiB,EAKlB;IACC,2FAA2F;IAC3F,kFAAkF;IAClF,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,GAAG,sBAAsB,GAAG,iBAAiB,EAAE,CAAA;IAErF,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAC5D,OAAO,GAAG,sBAAsB,GAAG,YAAY,aAAa,iBAAiB,EAAE,CAAA;AACjF,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,IAAI,EAAE,CAAA","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../interfaces/network'\nimport { WALLET_STAKING_ADDR, WALLET_TOKEN } from './addresses'\n\nconst COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3/coins/'\nconst COINGECKO_BASE_URL = 'https://www.coingecko.com/en/coins/'\n\n// @TODO some form of a constants list\nexport function geckoIdMapper(address: string, network: Network): string | null {\n if (address === ZeroAddress) return network.nativeAssetId\n\n // we currently can't map aave so we're leaving this\n if (address === '0x4da27a545c0c5B758a6BA100e3a049001de870f5') return 'aave'\n\n return null\n}\n\n/**\n * Maps specific token addresses to alternative addresses if they are missing on\n * CoinGecko (so that they are aliased to existing tokens).\n */\nexport function geckoTokenAddressMapper(address: string) {\n // xWALLET is missing on CoinGecko, so alias it to WALLET token (that exists on CoinGecko)\n if (address === WALLET_STAKING_ADDR) return WALLET_TOKEN\n\n return address\n}\n\n/**\n * Constructs the CoinGecko API URL for a given token address and network ID.\n * Handles special cases where the CoinGecko API handles differently certain\n * tokens like the native tokens.\n */\nexport function getCoinGeckoTokenApiUrl({\n tokenAddr,\n geckoChainId,\n geckoNativeCoinId\n}: {\n tokenAddr: string\n geckoChainId: string\n geckoNativeCoinId: string\n}) {\n // CoinGecko does not handle native assets (ETH, MATIC, BNB...) via the /contract endpoint.\n // Instead, native assets are identified by URL with the `nativeAssetId` directly.\n if (tokenAddr === ZeroAddress) return `${COINGECKO_API_BASE_URL}${geckoNativeCoinId}`\n\n const geckoTokenAddress = geckoTokenAddressMapper(tokenAddr)\n return `${COINGECKO_API_BASE_URL}${geckoChainId}/contract/${geckoTokenAddress}`\n}\n\n/** Constructs the CoinGecko URL for a given token slug. */\nexport const getCoinGeckoTokenUrl = (slug: string) => `${COINGECKO_BASE_URL}${slug}`\n"]} \ No newline at end of file diff --git a/dist/src/consts/dappCatalog.json b/dist/src/consts/dappCatalog.json new file mode 100644 index 000000000..d20aa4ced --- /dev/null +++ b/dist/src/consts/dappCatalog.json @@ -0,0 +1,470 @@ +[ + { + "url": "https://legends.ambire.com", + "name": "Ambire Legends", + "icon": "https://legends.ambire.com/images/logo.png", + "description": "Discover the power of Smart Accounts in a gamified way and win a share of the 195M $WALLET reward pool!" + }, + { + "url": "https://app.uniswap.org", + "name": "Uniswap", + "icon": "https://static.debank.com/image/dapp/logo_url/fe004c7bccd24837394c2861a5d4f50c/fe004c7bccd24837394c2861a5d4f50c.png", + "description": "Trade crypto and NFTs with confidence" + }, + { + "url": "https://yearn.finance", + "name": "Yearn Vaults", + "icon": "https://cloudflare-ipfs.com/ipfs/Qme9HuPPhgCtgfj1CktvaDKhTesMueGCV2Kui1Sqna3Xs9/logo.svg", + "description": "Safe App for interacting with Yearn Vaults" + }, + { + "url": "https://galxe.com", + "name": "Galxe", + "icon": "https://static.debank.com/image/dapp/logo_url/863dd269de50fe4a36cdddec136992a9/863dd269de50fe4a36cdddec136992a9.png", + "description": "Galxe is the leading platform for building Web3 community. With over 14 million active users, Galxe has propelled the growth of Optimism, Polygon, Arbitrum, and more than 4000 partners with reward-based loyalty programs." + }, + { + "url": "https://opensea.io", + "name": "OpenSea", + "icon": "https://static.debank.com/image/project/logo_url/opensea/4b23246fac2d4ce53bd8e8079844821c.png", + "description": "OpenSea is the world's first and largest web3 marketplace for NFTs and crypto collectibles. Browse, create, buy, sell, and auction NFTs using OpenSea today." + }, + { + "url": "https://app.1inch.io", + "name": "1inch", + "icon": "https://static.debank.com/image/dapp/logo_url/be29635201e4cbfe68ec4e24849cf87d/be29635201e4cbfe68ec4e24849cf87d.png", + "description": "DeFi / DEX aggregator with the most liquidity and the best rates on Ethereum, Binance Smart Chain, Optimism, Polygon, 1inch dApp is an entry point to the 1inch Network's tech." + }, + { + "url": "https://play.decentraland.org", + "name": "Decentraland", + "icon": "https://dappcatalog.ambire.com/icons/decentraland.png", + "description": "Create, explore and trade in the first-ever virtual world owned by its users." + }, + { + "url": "https://loopring.io", + "name": "Loopring L2", + "icon": "https://loopring.io/favicon.ico", + "description": "Ethereum’s First zkRollup Layer 2" + }, + { + "url": "https://spooky.fi", + "name": "SpookySwap", + "icon": "https://spooky.fi/favicon.png", + "description": "Farm BOO with Spooky LP Tokens" + }, + { + "url": "https://looksrare.org", + "name": "LooksRare", + "icon": "https://pbs.twimg.com/profile_images/1532326779964489728/PRq7gD2P_400x400.jpg", + "description": "Buy & Sell NFTs, Get Rewards" + }, + { + "url": "https://blur.io", + "name": "blur", + "icon": "https://static.debank.com/image/dapp/logo_url/3e852a352d870e42c9cedd1285a4be62/3e852a352d870e42c9cedd1285a4be62.png", + "description": "Sweep NFTs across multiple marketplaces, snipe reveals faster than others, and manage your portfolio with advanced analytics. Zero fees." + }, + { + "url": "https://snapshot.org", + "name": "Snapshot", + "icon": "https://static.debank.com/image/dapp/logo_url/3516a46cef64f3fab4b476ccb38c5a6b/3516a46cef64f3fab4b476ccb38c5a6b.png", + "description": "Snapshot is an off-chain voting platform that allows DAOs, DeFi protocols, or NFT communities to participate in the decentralized governance easily and without gas fees." + }, + { + "url": "https://app.eigenlayer.xyz", + "name": "eigenlayer", + "icon": "https://static.debank.com/image/dapp/logo_url/b4bc2c5b5a63be4692ab5cb2b5201ae4/b4bc2c5b5a63be4692ab5cb2b5201ae4.png", + "description": "Revolutionize Ethereum by restaking ETH across multiple protocols for enhanced security, rewards, and capital efficiency." + }, + { + "url": "https://layer3.xyz", + "name": "Layer3", + "icon": "https://static.debank.com/image/dapp/logo_url/dcde64ae44a5a5a79fe0c2d4f7f97bf8/dcde64ae44a5a5a79fe0c2d4f7f97bf8.png", + "description": "The best way to learn, explore, and succeed in web3. Get started with Quests on Layer3 ⚡" + }, + { + "url": "https://guild.xyz", + "name": "Guild", + "icon": "https://static.debank.com/image/dapp/logo_url/4bba27cba12cb7b98918cb6dccc2fb3c/4bba27cba12cb7b98918cb6dccc2fb3c.png", + "description": "Automated membership management for the platforms your community already uses." + }, + { + "url": "https://swap.defillama.com", + "name": "defillama", + "icon": "https://static.debank.com/image/project/logo_url/arb_defillama/1be7417e6461f9851dcd2521786d41ba.png", + "description": "Open and transparent DeDefiLlama is the largest TVL aggregator for DeFi. Includes sections on yield farming, NFT collections, marketplaces, and more." + }, + { + "url": "https://app.aave.com", + "name": "Aave", + "icon": "https://static.debank.com/image/dapp/logo_url/b8a5ea5ccf34a9a94fde0e8027135492/b8a5ea5ccf34a9a94fde0e8027135492.png", + "description": "Aave is an Open Source Protocol to create Non-Custodial Liquidity Markets to earn interest on supplying and borrowing assets with a variable or stable interest rate. The protocol is designed for easy integration into your products and services." + }, + { + "url": "https://stargate.finance", + "name": "Stargate", + "icon": "https://static.debank.com/image/dapp/logo_url/7769b47348430f848c0e784c68222478/7769b47348430f848c0e784c68222478.png", + "description": "A fully composable native asset bridge with unified liquidity and instant guaranteed finality built on top of LayerZero" + }, + { + "url": "https://app.aevo.xyz", + "name": "Aevo", + "icon": "https://static.debank.com/image/dapp/logo_url/96650df9365d6b7b1569781a35bb562d/96650df9365d6b7b1569781a35bb562d.png", + "description": "Aevo is a decentralized derivatives exchange platform. It enables you to access various financial products like options and perpetual futures through a unified margin account." + }, + { + "url": "https://swap.cow.fi", + "name": "CoW", + "icon": "https://static.debank.com/image/dapp/logo_url/4eae9e02c647daaafa9a7d2050571800/4eae9e02c647daaafa9a7d2050571800.png", + "description": "CoW Swap finds the lowest prices from all decentralized exchanges and DEX aggregators & saves you more with p2p trading and protection from MEV" + }, + { + "url": "https://app.hyperliquid.xyz", + "name": "Hyperliquid", + "icon": "https://static.debank.com/image/dapp/logo_url/06166d17b67b2dedc8e9749d79f7ec32/06166d17b67b2dedc8e9749d79f7ec32.png", + "description": "Hyperliquid is a decentralized perpetual futures exchange. Hyperliquid runs its own L1 in order to keep the whole orderbook onchain for the best transparency." + }, + { + "url": "https://app.optimism.io", + "name": "optimism", + "icon": "https://static.debank.com/image/dapp/logo_url/af50ef510f32f163ed664f33dc178318/af50ef510f32f163ed664f33dc178318.png", + "description": "OP Mainnet is a low-cost and lightning-fast layer 2 blockchain. Scale Ethereum and sustainably fund public goods." + }, + { + "url": "https://app.paraswap.io", + "name": "ParaSwap", + "icon": "https://static.debank.com/image/project/logo_url/matic_paraswap/a9a94be854135149254438560dfa461c.png", + "description": "ParaSwap aggregates DeFi liquidity and offers the best market rates." + }, + { + "url": "https://velodrome.finance", + "name": "Velodrome", + "icon": "https://static.debank.com/image/dapp/logo_url/eabfc13510db10c399f6e336b3ac56db/eabfc13510db10c399f6e336b3ac56db.png", + "description": "Velodrome Finance is a next-generation AMM that combines the best of Curve, Convex and Uniswap. Velodrome NFTs vote on token emissions and receive incentives and fees generated by the protocol." + }, + { + "url": "https://quest.puffer.fi", + "name": "puffer", + "icon": "https://static.debank.com/image/dapp/logo_url/0b414ccf4b117409fdd3f457cace6d8c/0b414ccf4b117409fdd3f457cace6d8c.png", + "description": "Native liquid Ethereum restaking supercharged by EigenLayer." + }, + { + "url": "https://curve.fi", + "name": "Curve", + "icon": "https://static.debank.com/image/dapp/logo_url/9b5695ae1125a207988f850c7003ecff/9b5695ae1125a207988f850c7003ecff.png", + "description": "Curve is automated market-maker optimized for stablecoins, working as an exchange on one side, and allowing liquidity providers to earn fees and lending interest on the other side." + }, + { + "url": "https://balancer.fi/pools", + "name": "Balancer", + "icon": "https://static.debank.com/image/dapp/logo_url/3b6e53ac36d5ffc0ab56a1336bc00c33/3b6e53ac36d5ffc0ab56a1336bc00c33.png", + "description": "A UI that supports core Balancer protocol functionality. Explore & create pools, manage liquidity, swap tokens, get veBAL and claim incentives." + }, + { + "url": "https://www.bungee.exchange", + "name": "Bungee", + "icon": "https://static.debank.com/image/dapp/logo_url/9143180e143503362b0ca763d926c2d2/9143180e143503362b0ca763d926c2d2.png", + "description": "Bungee aggregates all your favourite bridges and gets you the cheapest and fastest routes to jump across chains!" + }, + { + "url": "https://app.camelot.exchange", + "name": "Camelot", + "icon": "https://static.debank.com/image/dapp/logo_url/d118248f4ca987b94eb91788678a3219/d118248f4ca987b94eb91788678a3219.png", + "description": "The Arbitrum native DEX. Custom-built liquidity infrastructure to support builders & generate real yield" + }, + { + "url": "https://app.gmx.io", + "name": "GMX", + "icon": "https://static.debank.com/image/dapp/logo_url/692e1be885d26b8a9cd6d46017387a6c/692e1be885d26b8a9cd6d46017387a6c.png", + "description": "Trade spot or perpetual BTC, ETH, AVAX and other top cryptocurrencies with up to 50x leverage directly from your wallet on Arbitrum and Avalanche." + }, + { + "url": "https://app.gearbox.fi", + "name": "Gearbox", + "icon": "https://static.debank.com/image/dapp/logo_url/52173d1517e6b0c035a638ebb703246c/52173d1517e6b0c035a638ebb703246c.png", + "description": "Leverage farm and stake on Curve, Lido, Balancer, and more. Or simply earn passive APY." + }, + { + "url": "https://app.silo.finance", + "name": "Silo Finance", + "icon": "https://app.silo.finance/silo-icon.png", + "description": "Enabling lending and borrowing of any asset" + }, + { + "url": "https://app.whales.market", + "name": "Whales", + "icon": "https://static.debank.com/image/dapp/logo_url/96c9aa1a07bdfa6e35f5ccf8929e0691/96c9aa1a07bdfa6e35f5ccf8929e0691.png", + "description": "Listing P2P offers for both pre-TGE token allocations and tokens/NFTs trading, each secured by smart contracts for both parties." + }, + { + "url": "https://app.safe.global", + "name": "Safe", + "icon": "https://static.debank.com/image/dapp/logo_url/e732812b49598e14de87c0ec9ea54efe/e732812b49598e14de87c0ec9ea54efe.png", + "description": "Safe (prev. Gnosis Safe) is the most trusted platform to manage digital assets on Ethereum and multiple EVMs. Over $40B secured." + }, + { + "url": "https://app.ethena.fi", + "name": "Ethena", + "icon": "https://static.debank.com/image/dapp/logo_url/47050f6507dd928b3d5acf0aeb19215e/47050f6507dd928b3d5acf0aeb19215e.png", + "description": "Enabling the Internet Bond" + }, + { + "url": "https://kyberswap.com", + "name": "KyberSwap", + "icon": "https://static.debank.com/image/dapp/logo_url/0168c8b0aa262c01452d403f2b3cd57f/0168c8b0aa262c01452d403f2b3cd57f.png", + "description": "KyberSwap is a multi-chain aggregator and DeFi hub that empowers users with the insights and tools to achieve financial autonomy. All the above while being fast, secure, and easy-to-use." + }, + { + "url": "https://app.debridge.finance", + "name": "deBridge", + "icon": "https://static.debank.com/image/dapp/logo_url/811b17297bb5e7e2def952fcdc8bbf11/811b17297bb5e7e2def952fcdc8bbf11.png", + "description": "Interoperability for High Performance dApps" + }, + { + "url": "https://jumper.exchange", + "name": "Jumper", + "icon": "https://static.debank.com/image/dapp/logo_url/f9b26f219f5b87e0377e94a0a6c0d7f4/f9b26f219f5b87e0377e94a0a6c0d7f4.png", + "description": "Multi-Chain Bridging & Swapping (powered by LI.FI)" + }, + { + "url": "https://app.mav.xyz", + "name": "Mav", + "icon": "https://static.debank.com/image/dapp/logo_url/8eb7e8a8c0dadda77331572e913a4921/8eb7e8a8c0dadda77331572e913a4921.png", + "description": "Maverick App" + }, + { + "url": "https://app.ether.fi", + "name": "ether", + "icon": "https://app.ether.fi/favicon/favicon.ico", + "description": "Delegated Staking Protocol" + }, + { + "url": "https://portal.dymension.xyz", + "name": "Dymension", + "icon": "https://static.debank.com/image/dapp/logo_url/c64c6d55b33d41c4f6d40c4d29dc0f6a/c64c6d55b33d41c4f6d40c4d29dc0f6a.png", + "description": "Interact with the Dymension Hub, RollApps and IBC." + }, + { + "url": "https://magiceden.io", + "name": "magiceden", + "icon": "https://static.debank.com/image/dapp/logo_url/7653b6b51076b1efc152cdd33f7a5ddf/7653b6b51076b1efc152cdd33f7a5ddf.png", + "description": "Magic Eden is the leading community-centric NFT marketplace. Home to the next generation of creators. Discover the best and latest NFT collections today." + }, + { + "url": "https://pancakeswap.finance", + "name": "PancakeSwap", + "icon": "https://static.debank.com/image/dapp/logo_url/47366ac53d8be5b8658815a8b2d8b690/47366ac53d8be5b8658815a8b2d8b690.png", + "description": "Trade, earn, and own crypto on the all-in-one multichain DEX" + }, + { + "url": "https://revoke.cash", + "name": "Revoke", + "icon": "https://static.debank.com/image/dapp/logo_url/cdd1046d899f48bdc1793e9a3eb446d5/cdd1046d899f48bdc1793e9a3eb446d5.png", + "description": "Take back control of your wallet and stay safe by revoking token approvals and permissions you granted on Ethereum and over 70 other networks." + }, + { + "url": "https://minter.merkly.com", + "name": "Merkly", + "icon": "https://minter.merkly.com/logo.webp", + "description": "Merkly \nOmnichain Bridging Made Easy." + }, + { + "url": "https://app.pendle.finance", + "name": "Pendle", + "icon": "https://static.debank.com/image/dapp/logo_url/81297971d7ffd8e2698cefd8de2072dc/81297971d7ffd8e2698cefd8de2072dc.png", + "description": "Earn at your convenience." + }, + { + "url": "https://www.tally.xyz", + "name": "Tally", + "icon": "https://static.debank.com/image/dapp/logo_url/aefcb9d0a6fc2285718e21a1cd178aef/aefcb9d0a6fc2285718e21a1cd178aef.png", + "description": "Tally is a DAO operations platform. DAOs use Tally to create and pass proposals, enable delegation, and power voting." + }, + { + "url": "https://quickswap.exchange", + "name": "Quickswap", + "icon": "https://static.debank.com/image/dapp/logo_url/6abc91fcb6f458df8f2b18bd9e39c9fa/6abc91fcb6f458df8f2b18bd9e39c9fa.png", + "description": "QuickSwap is a next-gen #DEX for #DeFi. Trade at lightning-fast speeds with near-zero gas fees." + }, + { + "url": "https://app.questn.com", + "name": "QuestN", + "icon": "https://static.debank.com/image/dapp/logo_url/967a14e9efb3663bb1c6b552d28be22f/967a14e9efb3663bb1c6b552d28be22f.png", + "description": "Marketing, Growth and Analysis For Web3" + }, + { + "url": "https://thirdweb.com", + "name": "thirdweb", + "icon": "https://static.debank.com/image/dapp/logo_url/8b57546aefb7e3cc65c28724007d40b6/8b57546aefb7e3cc65c28724007d40b6.png", + "description": "Build web3 apps easily with thirdweb's powerful SDKs, audited smart contracts, and developer tools—for Ethereum & 700+ EVM chains. Try now." + }, + { + "url": "https://summer.fi", + "name": "summer", + "icon": "https://static.debank.com/image/dapp/logo_url/28c8686e626b247e3f2d8ae0007a1075/28c8686e626b247e3f2d8ae0007a1075.png", + "description": "Borrow, lend or multiply your favourite crypto assets | ETH, WBTC, DAI, USDC and many more | industry leading DeFi automation on Summer.fi" + }, + { + "url": "https://socialscan.io", + "name": "SocialScan", + "icon": "https://static.debank.com/image/dapp/logo_url/6a660aa49572e41acf81aa774751edc3/6a660aa49572e41acf81aa774751edc3.png", + "description": "SocialScan transforms web3 discovery with its AI-powered, community-native platform, providing a comprehensive, real-time view of assets, communities, and members across the web3 ecosystem." + }, + { + "url": "https://app.multichain.org", + "name": "Multichain", + "icon": "https://static.debank.com/image/dapp/logo_url/4e35c280e5744949441157967e1425c4/4e35c280e5744949441157967e1425c4.png", + "description": "Unified cross-chain interface, average transaction speed within 100 secs, no-slippage swap" + }, + { + "url": "https://matcha.xyz", + "name": "Matcha", + "icon": "https://assets-global.website-files.com/6364e65656ab107e465325d2/651deefaa0331025effd2ef0_matcha-green-whitebg.png", + "description": "Matcha DEX aggregator | Search and trade over +5 million tokens across +100 exchanges on 9 chains. Trade now." + }, + { + "url": "https://app.radiant.capital", + "name": "Radiant", + "icon": "https://static.debank.com/image/dapp/logo_url/4637e046054aad90676b17c5c18f0d39/4637e046054aad90676b17c5c18f0d39.png", + "description": "Radiant is the first omnichain money market, where users will be able to deposit any major asset on any major chain and borrow/withdraw a variety of supported assets across multiple chains." + }, + { + "url": "https://www.sushi.com", + "name": "Sushi", + "icon": "https://static.debank.com/image/dapp/logo_url/4e9b06f3c3681488239e16d6feab90f7/4e9b06f3c3681488239e16d6feab90f7.png", + "description": "A Decentralised Finance (DeFi) app with features such as swap, cross chain swap, streaming, vesting, and permissionless market making for liquidity providers." + }, + { + "url": "https://stake.lido.fi", + "name": "Lido", + "icon": "https://static.debank.com/image/dapp/logo_url/57af652b82144416b2b9f83b5c60dfd7/57af652b82144416b2b9f83b5c60dfd7.png", + "description": "Liquid staking with Lido. Stake Ether with Lido to get daily rewards while keeping full control of your staked tokens. Start receiving rewards in just a few clicks." + }, + { + "url": "https://www.mintchain.io", + "name": "mintchain", + "icon": "https://static.debank.com/image/dapp/logo_url/9d4b3d152c7e53602d43750dabe87bf7/9d4b3d152c7e53602d43750dabe87bf7.png", + "description": "Mint is the L2 blockchain for NFTs." + }, + { + "url": "https://rarible.com", + "name": "Rarible", + "icon": "https://static.debank.com/image/dapp/logo_url/17b034dc7990b3a5d5bbc56f625700db/17b034dc7990b3a5d5bbc56f625700db.png", + "description": "Discover, sell and buy NFTs on Rarible! Our aggregated NFT marketplace for Ethereum NFTs and Polygon NFTs powers brands, collections and creator marketplaces." + }, + { + "url": "https://www.memecoin.org", + "name": "Memecoin", + "icon": "https://static.debank.com/image/dapp/logo_url/06c31dcd07732146a972cdf938f72d5d/06c31dcd07732146a972cdf938f72d5d.png", + "description": "One MEME to rule them all." + }, + { + "url": "https://clusters.xyz", + "name": "clusters", + "icon": "https://static.debank.com/image/dapp/logo_url/c0cdf7c84947e7889f9af0499be01d86/c0cdf7c84947e7889f9af0499be01d86.png", + "description": "A single username for all your crypto wallets across different blockchains." + }, + { + "url": "https://app.extrafi.io", + "name": "extrafi", + "icon": "https://static.debank.com/image/dapp/logo_url/7179171ebb0c5d1d7c9121cf4bc4c7ff/7179171ebb0c5d1d7c9121cf4bc4c7ff.png", + "description": "Extra Finance is a community-driven lending & leveraged yield farming protocol built on Optimism." + }, + { + "url": "https://dashboard.walletguard.app", + "name": "walletguard", + "icon": "https://static.debank.com/image/dapp/logo_url/cc6e0907dbbb69724dee970113acf352/cc6e0907dbbb69724dee970113acf352.png", + "description": "Run your first security scan with Wallet Guard. In one click scan for risks from approvals, hacks, honeypots & more. Join the 50,000+ wallets protected." + }, + { + "url": "https://getpass.civic.com", + "name": "Civic", + "icon": "https://static.debank.com/image/dapp/logo_url/10fa0a3f48ee721a9e7c08c1bab397e3/10fa0a3f48ee721a9e7c08c1bab397e3.png", + "description": "A digital ID used on apps to verify your age, location, or identity." + }, + { + "url": "https://app.hop.exchange", + "name": "Hop", + "icon": "https://static.debank.com/image/dapp/logo_url/43db0b55c8fa8df88757309f8b9a1c02/43db0b55c8fa8df88757309f8b9a1c02.png", + "description": "A protocol for sending tokens across rollups and their shared layer-1 network in a quick and trustless manner." + }, + { + "url": "https://app.angle.money", + "name": "Angle", + "icon": "https://static.debank.com/image/dapp/logo_url/5e92315bb6edb473c2d3cd1eaf17f74d/5e92315bb6edb473c2d3cd1eaf17f74d.png", + "description": "Own, spend, borrow and earn Euros onchain, all in one seamless platform powered by Angle transparent and resilient stablecoin ecosystem." + }, + { + "url": "https://hey.xyz", + "name": "Hey", + "icon": "https://static.debank.com/image/dapp/logo_url/14d57f253b061a1dba520c5886022278/14d57f253b061a1dba520c5886022278.png", + "description": "Hey.xyz is a decentralized, and permissionless social media app built with Lens Protocol 🌿" + }, + { + "url": "https://pro.opensea.io", + "name": "OpenSea", + "icon": "https://static.debank.com/image/dapp/logo_url/9e416cf89bdc174e526e4e9279d51aed/9e416cf89bdc174e526e4e9279d51aed.png", + "description": "Buy, sell, and sweep from 170+ NFT marketplaces. With the fastest collection updates, most optimized gas fees, and advanced analytics." + }, + { + "url": "https://app.frax.finance", + "name": "Frax", + "icon": "https://static.debank.com/image/dapp/logo_url/b6accfa80a6be1108f934d333ff0aad8/b6accfa80a6be1108f934d333ff0aad8.png", + "description": "Frax attempts to be the first stablecoin protocol to implement design principles of both to create a highly scalable, trustless, extremely stable, and ideologically pure on-chain money." + }, + { + "url": "https://app.superform.xyz", + "name": "Superform", + "icon": "https://static.debank.com/image/dapp/logo_url/a5f231f76007f510d713bfb4d148c1d2/a5f231f76007f510d713bfb4d148c1d2.png", + "description": "Superform is the Universal Yield Marketplace. Any vault, any chain, any token. One transaction. Permissionlessly list your vaults and access users on all chains." + }, + { + "url": "https://bridge.arbitrum.io", + "name": "Arbitrum", + "icon": "https://static.debank.com/image/dapp/logo_url/ca4ce20e2401c2b31e49bb1953ac28a8/ca4ce20e2401c2b31e49bb1953ac28a8.png", + "description": "Built to scale Ethereum, Arbitrum brings you 10x lower costs while inheriting Ethereum’s security model. Arbitrum is a Layer 2 Optimistic Rollup." + }, + { + "url": "https://mirror.xyz", + "name": "Mirror", + "icon": "https://static.debank.com/image/dapp/logo_url/a3769e8843fff90e357acce4a59adc81/a3769e8843fff90e357acce4a59adc81.png", + "description": "Built on web3 for web3, Mirror’s robust publishing platform pushes the boundaries of writing online—whether it’s the next big white paper or a weekly community update." + }, + { + "url": "https://app.ens.domains", + "name": "ENS", + "icon": "https://static.debank.com/image/dapp/logo_url/c66d2db72eb42ca13e1437ac2175f5f4/c66d2db72eb42ca13e1437ac2175f5f4.png", + "description": "Decentralized naming for wallets, websites, & more." + }, + { + "url": "https://baseswap.fi", + "name": "BaseSwap", + "icon": "https://static.debank.com/image/dapp/logo_url/ac6367301d0f398ffb3cdbdf38c1cb15/ac6367301d0f398ffb3cdbdf38c1cb15.png", + "description": "Welcome to BaseSwap - the leading DEX on Base Chain, where advanced blockchain technology meets unparalleled user experience. Trade, stake, and farm with ease. Dive into our world of concentrated liquidity, exclusive single-stake earning, innovative farmi." + }, + { + "url": "https://polygon.lido.fi/", + "name": "Lido Polygon Staking", + "icon": "https://polygon.lido.fi/favicon-194x194.png", + "description": "Stake your MATIC and receive stMATIC." + }, + { + "url": "https://kwenta.io/market/", + "name": "Kwenta", + "icon": "https://kwenta.io/images/favicon.svg", + "description": "Gain exposure to cryptocurrencies, forex, indices, and commodities on Ethereum with zero slippage." + }, + { + "url": "https://mean.finance/", + "name": "Mean finance", + "icon": "https://mean.finance/favicon.ico", + "description": "Mean Finance is the state-of-the-art DCA protocol. It enables you to set up actions like 'Swap 10 USDC for WBTC every day, for 30 days'." + }, + { + "url": "https://app.defisaver.com/", + "name": "DeFi Saver", + "icon": "https://app.defisaver.com//assets/icons/icon-transparent.svg", + "description": "The next generation DeFi management dashboard." + } +] diff --git a/dist/src/consts/dappCommunication.d.ts b/dist/src/consts/dappCommunication.d.ts new file mode 100644 index 000000000..3f78320a9 --- /dev/null +++ b/dist/src/consts/dappCommunication.d.ts @@ -0,0 +1,3 @@ +declare const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS: string[]; +export { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }; +//# sourceMappingURL=dappCommunication.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/dappCommunication.d.ts.map b/dist/src/consts/dappCommunication.d.ts.map new file mode 100644 index 000000000..12e034939 --- /dev/null +++ b/dist/src/consts/dappCommunication.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"dappCommunication.d.ts","sourceRoot":"","sources":["../../../src/consts/dappCommunication.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,mCAAmC,UAKxC,CAAA;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/dappCommunication.js b/dist/src/consts/dappCommunication.js new file mode 100644 index 000000000..16376a094 --- /dev/null +++ b/dist/src/consts/dappCommunication.js @@ -0,0 +1,8 @@ +const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = [ + 'https://legends.ambire.com', + 'https://legends-staging.ambire.com', + 'http://localhost:19006', + 'http://localhost:19007' +]; +export { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }; +//# sourceMappingURL=dappCommunication.js.map \ No newline at end of file diff --git a/dist/src/consts/dappCommunication.js.map b/dist/src/consts/dappCommunication.js.map new file mode 100644 index 000000000..80e7237de --- /dev/null +++ b/dist/src/consts/dappCommunication.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dappCommunication.js","sourceRoot":"","sources":["../../../src/consts/dappCommunication.ts"],"names":[],"mappings":"AAAA,MAAM,mCAAmC,GAAG;IAC1C,4BAA4B;IAC5B,oCAAoC;IACpC,wBAAwB;IACxB,wBAAwB;CACzB,CAAA;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAA","sourcesContent":["const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = [\n 'https://legends.ambire.com',\n 'https://legends-staging.ambire.com',\n 'http://localhost:19006',\n 'http://localhost:19007'\n]\n\nexport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }\n"]} \ No newline at end of file diff --git a/dist/src/consts/deploy.d.ts b/dist/src/consts/deploy.d.ts new file mode 100644 index 000000000..539703c79 --- /dev/null +++ b/dist/src/consts/deploy.d.ts @@ -0,0 +1,13 @@ +export declare const PROXY_AMBIRE_ACCOUNT = "0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828"; +export declare const AMBIRE_ACCOUNT_FACTORY = "0x26cE6745A633030A6faC5e64e41D21fb6246dc2d"; +export declare const AMBIRE_PAYMASTER = "0xA8B267C68715FA1Dca055993149f30217B572Cf0"; +export declare const AMBIRE_PAYMASTER_SIGNER = "0x39f1B4be409F2DFC8FCB84C1196537728df727f3"; +export declare const ERC_4337_ENTRYPOINT = "0x0000000071727De22E5E9d8BAf0edAc6f37da032"; +export declare const ENTRY_POINT_MARKER = "0x0000000000000000000000000000000000000000000000000000000000007171"; +export declare const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; +export declare const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n; +export declare const PROXY_AMBIRE_4337_ACCOUNT = "0xd590a2aBA89a590b15De795DE559e7166aC293eA"; +export declare const SINGLETON = "0xce0042B868300000d44A59004Da54A005ffdcf9f"; +export declare const OPTIMISTIC_ORACLE = "0x420000000000000000000000000000000000000F"; +export declare const DEPLOYLESS_SIMULATION_FROM = "0x0000000000000000000000000000000000000001"; +//# sourceMappingURL=deploy.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/deploy.d.ts.map b/dist/src/consts/deploy.d.ts.map new file mode 100644 index 000000000..9311883a4 --- /dev/null +++ b/dist/src/consts/deploy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/consts/deploy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,+CAA+C,CAAA;AAChF,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAClF,eAAO,MAAM,gBAAgB,+CAA+C,CAAA;AAC5E,eAAO,MAAM,uBAAuB,+CAA+C,CAAA;AACnF,eAAO,MAAM,mBAAmB,+CAA+C,CAAA;AAC/E,eAAO,MAAM,kBAAkB,uEACuC,CAAA;AACtE,eAAO,MAAM,WAAW,kFACyD,CAAA;AACjF,eAAO,MAAM,WAAW,qDAAqD,CAAA;AAE7E,eAAO,MAAM,yBAAyB,+CAA+C,CAAA;AACrF,eAAO,MAAM,SAAS,+CAA+C,CAAA;AACrE,eAAO,MAAM,iBAAiB,+CAA+C,CAAA;AAE7E,eAAO,MAAM,0BAA0B,+CAA+C,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/deploy.js b/dist/src/consts/deploy.js index 448c0fdb7..0511fe6a5 100644 --- a/dist/src/consts/deploy.js +++ b/dist/src/consts/deploy.js @@ -1,11 +1,14 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MAX_UINT256 = exports.ENTRY_POINT_MARKER = exports.ERC_4337_ENTRYPOINT = exports.AMBIRE_ACCOUNT_FACTORY = exports.PROXY_AMBIRE_ACCOUNT = void 0; -exports.PROXY_AMBIRE_ACCOUNT = '0xfF69afDE895B381eE71e17C60350aE4c70b16a92'; -exports.AMBIRE_ACCOUNT_FACTORY = '0xA3A22Bf212C03ce55eE7C3845D4c177a6fEC418B'; -// official entryPoint -exports.ERC_4337_ENTRYPOINT = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789'; -// entry point privilege -exports.ENTRY_POINT_MARKER = '0x42144640c7cb5ff8aa9595ae175ffcb6dd152db6e737c13cc2d5d07576967020'; -exports.MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; +export const PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'; +export const AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'; +export const AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'; +export const AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'; +export const ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'; +export const ENTRY_POINT_MARKER = '0x0000000000000000000000000000000000000000000000000000000000007171'; +export const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; +export const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n; +export const PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'; +export const SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'; +export const OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'; +// 0x00..01 is the address from which simulation signatures are valid +export const DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'; //# sourceMappingURL=deploy.js.map \ No newline at end of file diff --git a/dist/src/consts/deploy.js.map b/dist/src/consts/deploy.js.map index 2a350a624..727965bb1 100644 --- a/dist/src/consts/deploy.js.map +++ b/dist/src/consts/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/consts/deploy.ts"],"names":[],"mappings":";;;AAAA,mEAAmE;AACnE,wCAAwC;AACxC,4EAA4E;AAC5E,2EAA2E;AAC3E,4BAA4B;AAC5B,0CAA0C;AAC7B,QAAA,oBAAoB,GAAG,4CAA4C,CAAA;AAEhF,oEAAoE;AACvD,QAAA,sBAAsB,GAAG,4CAA4C,CAAA;AAElF,mDAAmD;AACtC,QAAA,gBAAgB,GAAG,4CAA4C,CAAA;AAE5E,6DAA6D;AAChD,QAAA,+BAA+B,GAAG,4CAA4C,CAAA;AAE3F,sCAAsC;AACzB,QAAA,yBAAyB,GAAG,4CAA4C,CAAA;AAErF,sBAAsB;AACT,QAAA,mBAAmB,GAAG,4CAA4C,CAAA;AAE/E,wBAAwB;AACX,QAAA,kBAAkB,GAC7B,oEAAoE,CAAA;AAEzD,QAAA,WAAW,GACtB,+EAA+E,CAAA"} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/consts/deploy.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,4CAA4C,CAAA;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,4CAA4C,CAAA;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAA4C,CAAA;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,oEAAoE,CAAA;AACtE,MAAM,CAAC,MAAM,WAAW,GACtB,+EAA+E,CAAA;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,kDAAkD,CAAA;AAE7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,4CAA4C,CAAA;AACrF,MAAM,CAAC,MAAM,SAAS,GAAG,4CAA4C,CAAA;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAC7E,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAA4C,CAAA","sourcesContent":["export const PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'\nexport const AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'\nexport const AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'\nexport const AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'\nexport const ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'\nexport const ENTRY_POINT_MARKER =\n '0x0000000000000000000000000000000000000000000000000000000000007171'\nexport const MAX_UINT256 =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\nexport const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n\n\nexport const PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'\nexport const SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'\n// 0x00..01 is the address from which simulation signatures are valid\nexport const DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'\n"]} \ No newline at end of file diff --git a/dist/src/consts/deployless.d.ts b/dist/src/consts/deployless.d.ts new file mode 100644 index 000000000..11699a340 --- /dev/null +++ b/dist/src/consts/deployless.d.ts @@ -0,0 +1,2 @@ +export declare const EOA_SIMULATION_NONCE = "0x1000000000000000000000000000000000000000000000000000000000000000"; +//# sourceMappingURL=deployless.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/deployless.d.ts.map b/dist/src/consts/deployless.d.ts.map new file mode 100644 index 000000000..cb89f1094 --- /dev/null +++ b/dist/src/consts/deployless.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"deployless.d.ts","sourceRoot":"","sources":["../../../src/consts/deployless.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,uEACqC,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/deployless.js b/dist/src/consts/deployless.js new file mode 100644 index 000000000..5dd380f13 --- /dev/null +++ b/dist/src/consts/deployless.js @@ -0,0 +1,3 @@ +// fake nonce for EOA simulation +export const EOA_SIMULATION_NONCE = '0x1000000000000000000000000000000000000000000000000000000000000000'; +//# sourceMappingURL=deployless.js.map \ No newline at end of file diff --git a/dist/src/consts/deployless.js.map b/dist/src/consts/deployless.js.map new file mode 100644 index 000000000..71bbd763a --- /dev/null +++ b/dist/src/consts/deployless.js.map @@ -0,0 +1 @@ +{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../src/consts/deployless.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["// fake nonce for EOA simulation\nexport const EOA_SIMULATION_NONCE =\n '0x1000000000000000000000000000000000000000000000000000000000000000'\n"]} \ No newline at end of file diff --git a/dist/src/consts/derivation.d.ts b/dist/src/consts/derivation.d.ts new file mode 100644 index 000000000..f2d694f17 --- /dev/null +++ b/dist/src/consts/derivation.d.ts @@ -0,0 +1,33 @@ +/** + * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS), + * iterating over the `address_index` path out of the 5 levels in BIP44: + * m / purpose' / coin_type' / account' / change / address_index + */ +export declare const BIP44_STANDARD_DERIVATION_TEMPLATE = "m/44'/60'/0'/0/"; +/** + * BIP44 as Ledger (Live) currently implements it. They iterate over the + * `account'` path out of the 5 levels in BIP44: + * m / purpose' / coin_type' / account' / change / address_index + */ +export declare const BIP44_LEDGER_DERIVATION_TEMPLATE = "m/44'/60'/'/0/0"; +/** + * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and + * there is no standard that describes it. Closely related to the BIP44 + * standard, but it does not include the last "/0" which is typically used to + * distinguish between addresses (change addresses). Used previously by + * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto. + */ +export declare const LEGACY_POPULAR_DERIVATION_TEMPLATE = "m/44'/60'/0'/"; +export type HD_PATH_TEMPLATE_TYPE = typeof BIP44_STANDARD_DERIVATION_TEMPLATE | typeof BIP44_LEDGER_DERIVATION_TEMPLATE | typeof LEGACY_POPULAR_DERIVATION_TEMPLATE; +export interface DerivationOption { + label: string; + value: HD_PATH_TEMPLATE_TYPE; +} +export declare const DERIVATION_OPTIONS: DerivationOption[]; +/** + * For basic (EOA) accounts that are Ambire smart account keys use the derived + * address at index N + x, where N is this derivation offset (this constant), + * and x is the given index in the derivation (template) path. + */ +export declare const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000; +//# sourceMappingURL=derivation.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/derivation.d.ts.map b/dist/src/consts/derivation.d.ts.map new file mode 100644 index 000000000..fe377efb9 --- /dev/null +++ b/dist/src/consts/derivation.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"derivation.d.ts","sourceRoot":"","sources":["../../../src/consts/derivation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,6BAA6B,CAAA;AAC5E;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,6BAA6B,CAAA;AAC1E;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,2BAA2B,CAAA;AAG1E,MAAM,MAAM,qBAAqB,GAC7B,OAAO,kCAAkC,GACzC,OAAO,gCAAgC,GACvC,OAAO,kCAAkC,CAAA;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,qBAAqB,CAAA;CAC7B;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAOhD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,0CAA0C,SAAS,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/derivation.js b/dist/src/consts/derivation.js new file mode 100644 index 000000000..0d1cbf338 --- /dev/null +++ b/dist/src/consts/derivation.js @@ -0,0 +1,35 @@ +/** + * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS), + * iterating over the `address_index` path out of the 5 levels in BIP44: + * m / purpose' / coin_type' / account' / change / address_index + */ +export const BIP44_STANDARD_DERIVATION_TEMPLATE = "m/44'/60'/0'/0/"; +/** + * BIP44 as Ledger (Live) currently implements it. They iterate over the + * `account'` path out of the 5 levels in BIP44: + * m / purpose' / coin_type' / account' / change / address_index + */ +export const BIP44_LEDGER_DERIVATION_TEMPLATE = "m/44'/60'/'/0/0"; +/** + * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and + * there is no standard that describes it. Closely related to the BIP44 + * standard, but it does not include the last "/0" which is typically used to + * distinguish between addresses (change addresses). Used previously by + * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto. + */ +export const LEGACY_POPULAR_DERIVATION_TEMPLATE = "m/44'/60'/0'/"; +export const DERIVATION_OPTIONS = [ + { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: BIP44_STANDARD_DERIVATION_TEMPLATE }, + { label: 'BIP44 Ledger Live', value: BIP44_LEDGER_DERIVATION_TEMPLATE }, + { + label: 'Legacy (Ledger, MyEtherWallet, MyCrypto)', + value: LEGACY_POPULAR_DERIVATION_TEMPLATE + } +]; +/** + * For basic (EOA) accounts that are Ambire smart account keys use the derived + * address at index N + x, where N is this derivation offset (this constant), + * and x is the given index in the derivation (template) path. + */ +export const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000; +//# sourceMappingURL=derivation.js.map \ No newline at end of file diff --git a/dist/src/consts/derivation.js.map b/dist/src/consts/derivation.js.map new file mode 100644 index 000000000..a282e305e --- /dev/null +++ b/dist/src/consts/derivation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../../src/consts/derivation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,0BAA0B,CAAA;AAC5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,0BAA0B,CAAA;AAC1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,wBAAwB,CAAA;AAa1E,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,kCAAkC,EAAE;IAChG,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,gCAAgC,EAAE;IACvE;QACE,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE,kCAAkC;KAC1C;CACF,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG,MAAM,CAAA","sourcesContent":["/**\n * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS),\n * iterating over the `address_index` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_STANDARD_DERIVATION_TEMPLATE = \"m/44'/60'/0'/0/\"\n/**\n * BIP44 as Ledger (Live) currently implements it. They iterate over the\n * `account'` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_LEDGER_DERIVATION_TEMPLATE = \"m/44'/60'/'/0/0\"\n/**\n * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and\n * there is no standard that describes it. Closely related to the BIP44\n * standard, but it does not include the last \"/0\" which is typically used to\n * distinguish between addresses (change addresses). Used previously by\n * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto.\n */\nexport const LEGACY_POPULAR_DERIVATION_TEMPLATE = \"m/44'/60'/0'/\"\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type HD_PATH_TEMPLATE_TYPE =\n | typeof BIP44_STANDARD_DERIVATION_TEMPLATE\n | typeof BIP44_LEDGER_DERIVATION_TEMPLATE\n | typeof LEGACY_POPULAR_DERIVATION_TEMPLATE\n\nexport interface DerivationOption {\n label: string\n value: HD_PATH_TEMPLATE_TYPE\n}\n\nexport const DERIVATION_OPTIONS: DerivationOption[] = [\n { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: BIP44_STANDARD_DERIVATION_TEMPLATE },\n { label: 'BIP44 Ledger Live', value: BIP44_LEDGER_DERIVATION_TEMPLATE },\n {\n label: 'Legacy (Ledger, MyEtherWallet, MyCrypto)',\n value: LEGACY_POPULAR_DERIVATION_TEMPLATE\n }\n]\n\n/**\n * For basic (EOA) accounts that are Ambire smart account keys use the derived\n * address at index N + x, where N is this derivation offset (this constant),\n * and x is the given index in the derivation (template) path.\n */\nexport const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000\n"]} \ No newline at end of file diff --git a/dist/src/consts/feeTokens.d.ts b/dist/src/consts/feeTokens.d.ts new file mode 100644 index 000000000..d5b63f939 --- /dev/null +++ b/dist/src/consts/feeTokens.d.ts @@ -0,0 +1,6 @@ +declare const _default: { + address: string; + networkId: string; +}[]; +export default _default; +//# sourceMappingURL=feeTokens.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/feeTokens.d.ts.map b/dist/src/consts/feeTokens.d.ts.map new file mode 100644 index 000000000..98a4235b3 --- /dev/null +++ b/dist/src/consts/feeTokens.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"feeTokens.d.ts","sourceRoot":"","sources":["../../../src/consts/feeTokens.ts"],"names":[],"mappings":";;;;AAIA,wBA8HC"} \ No newline at end of file diff --git a/dist/src/consts/feeTokens.js b/dist/src/consts/feeTokens.js new file mode 100644 index 000000000..f3220ef62 --- /dev/null +++ b/dist/src/consts/feeTokens.js @@ -0,0 +1,131 @@ +// When adding a token to this list, please consider the following: +// 1. Open a block explorer and confirm the address is legit +// 2. Check if the token address exists on the relayer side +export default [ + { + // wrapped eth + address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + networkId: 'ethereum' + }, + { + // USDC + address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + networkId: 'ethereum' + }, + { + // USDT + address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + networkId: 'ethereum' + }, + { + // DAI + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + networkId: 'ethereum' + }, + { + // wBTC + address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', + networkId: 'ethereum' + }, + { + // WALLET + address: '0x88800092fF476844f74dC2FC427974BBee2794Ae', + networkId: 'ethereum' + }, + { + // Aave interest bearing USDC (aUSDC) + address: '0xbcca60bb61934080951369a648fb03df4f96263c', + networkId: 'ethereum' + }, + { + // Aave interest bearing USDT (aUSDT) + address: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811', + networkId: 'ethereum' + }, + { + // Aave interest bearing WBTC (aWBTC) + address: '0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656', + networkId: 'ethereum' + }, + { + // Aave interest bearing WETH (aWETH) + address: '0x030ba81f1c18d280636f32af80b9aad02cf0854e', + networkId: 'ethereum' + }, + { + // Fulcrum DAI iToken (iDAI) + address: '0x493c57c4763932315a328269e1adad09653b9081', + networkId: 'ethereum' + }, + { + // BNT + address: '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c', + networkId: 'ethereum' + }, + { + // USDC + address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', + networkId: 'avalanche' + }, + { + // USDC + address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', + networkId: 'polygon' + }, + { + // USDC.e + address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', + networkId: 'polygon' + }, + { + // USDT + address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F', + networkId: 'polygon' + }, + { + // USDT.e + address: '0xc7198437980c041c805a1edcba50c1ce5db95118', + networkId: 'avalanche' + }, + { + // USDT + address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58', + networkId: 'optimism' + }, + { + // USDC.e + address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', + networkId: 'optimism' + }, + { + // USDC + address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', + networkId: 'optimism' + }, + { + // DAI + address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', + networkId: 'optimism' + }, + { + // USDT + address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', + networkId: 'arbitrum' + }, + { + // USDC.e + address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8', + networkId: 'arbitrum' + }, + { + // DAI + address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', + networkId: 'arbitrum' + }, + { + // USDC + address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + networkId: 'arbitrum' + } +]; +//# sourceMappingURL=feeTokens.js.map \ No newline at end of file diff --git a/dist/src/consts/feeTokens.js.map b/dist/src/consts/feeTokens.js.map new file mode 100644 index 000000000..8944e8adb --- /dev/null +++ b/dist/src/consts/feeTokens.js.map @@ -0,0 +1 @@ +{"version":3,"file":"feeTokens.js","sourceRoot":"","sources":["../../../src/consts/feeTokens.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,4DAA4D;AAC5D,2DAA2D;AAE3D,eAAe;IACb;QACE,cAAc;QACd,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,4BAA4B;QAC5B,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;CACF,CAAA","sourcesContent":["// When adding a token to this list, please consider the following:\n// 1. Open a block explorer and confirm the address is legit\n// 2. Check if the token address exists on the relayer side\n\nexport default [\n {\n // wrapped eth\n address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n networkId: 'ethereum'\n },\n {\n // USDT\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n networkId: 'ethereum'\n },\n {\n // DAI\n address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n networkId: 'ethereum'\n },\n {\n // wBTC\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n networkId: 'ethereum'\n },\n {\n // WALLET\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDC (aUSDC)\n address: '0xbcca60bb61934080951369a648fb03df4f96263c',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDT (aUSDT)\n address: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WBTC (aWBTC)\n address: '0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WETH (aWETH)\n address: '0x030ba81f1c18d280636f32af80b9aad02cf0854e',\n networkId: 'ethereum'\n },\n {\n // Fulcrum DAI iToken (iDAI)\n address: '0x493c57c4763932315a328269e1adad09653b9081',\n networkId: 'ethereum'\n },\n {\n // BNT\n address: '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n networkId: 'avalanche'\n },\n {\n // USDC\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n networkId: 'polygon'\n },\n {\n // USDC.e\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n networkId: 'polygon'\n },\n {\n // USDT\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n networkId: 'polygon'\n },\n {\n // USDT.e\n address: '0xc7198437980c041c805a1edcba50c1ce5db95118',\n networkId: 'avalanche'\n },\n {\n // USDT\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n networkId: 'optimism'\n },\n {\n // USDC.e\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n networkId: 'optimism'\n },\n {\n // USDC\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n networkId: 'optimism'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'optimism'\n },\n {\n // USDT\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n networkId: 'arbitrum'\n },\n {\n // USDC.e\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n networkId: 'arbitrum'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'arbitrum'\n },\n {\n // USDC\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n networkId: 'arbitrum'\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/gasTankFeeTokens.d.ts b/dist/src/consts/gasTankFeeTokens.d.ts new file mode 100644 index 000000000..311bcbd72 --- /dev/null +++ b/dist/src/consts/gasTankFeeTokens.d.ts @@ -0,0 +1,39 @@ +declare const _default: ({ + address: string; + symbol: string; + networkId: string; + decimals: number; + icon: string; + disableGasTankDeposit?: undefined; + disableAsFeeToken?: undefined; + baseToken?: undefined; +} | { + address: string; + symbol: string; + networkId: string; + disableGasTankDeposit: boolean; + decimals: number; + icon: string; + disableAsFeeToken?: undefined; + baseToken?: undefined; +} | { + address: string; + disableGasTankDeposit: boolean; + disableAsFeeToken: boolean; + symbol: string; + networkId: string; + decimals: number; + icon: string; + baseToken?: undefined; +} | { + address: string; + baseToken: string; + symbol: string; + networkId: string; + decimals: number; + icon: string; + disableGasTankDeposit?: undefined; + disableAsFeeToken?: undefined; +})[]; +export default _default; +//# sourceMappingURL=gasTankFeeTokens.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/gasTankFeeTokens.d.ts.map b/dist/src/consts/gasTankFeeTokens.d.ts.map new file mode 100644 index 000000000..7aff8f188 --- /dev/null +++ b/dist/src/consts/gasTankFeeTokens.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gasTankFeeTokens.d.ts","sourceRoot":"","sources":["../../../src/consts/gasTankFeeTokens.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAirBC"} \ No newline at end of file diff --git a/dist/src/consts/gasTankFeeTokens.js b/dist/src/consts/gasTankFeeTokens.js index 43107e24f..a2d696542 100644 --- a/dist/src/consts/gasTankFeeTokens.js +++ b/dist/src/consts/gasTankFeeTokens.js @@ -1,6 +1,4 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = [ +export default [ { address: '0x0000000000000000000000000000000000000000', symbol: 'eth', @@ -10,7 +8,7 @@ exports.default = [ }, { address: '0x0000000000000000000000000000000000000000', - symbol: 'matic', + symbol: 'pol', networkId: 'polygon', decimals: 18, icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png' @@ -75,6 +73,7 @@ exports.default = [ address: '0x0000000000000000000000000000000000000000', symbol: 'xdai', networkId: 'gnosis', + disableGasTankDeposit: true, decimals: 18, icon: 'https://assets.coingecko.com/coins/images/11062/large/Identity-Primary-DarkBG.png' }, @@ -92,6 +91,13 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png' }, + { + address: '0x4200000000000000000000000000000000000006', + symbol: 'weth', + networkId: 'optimism', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png' + }, { address: '0x0000000000000000000000000000000000000000', symbol: 'okt', @@ -120,6 +126,20 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295' }, + { + address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', + symbol: 'stETH', + networkId: 'ethereum', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/13442/standard/steth_logo.png' + }, + { + address: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', + symbol: 'wstETH', + networkId: 'ethereum', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png' + }, { address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', symbol: 'usdc', @@ -165,6 +185,8 @@ exports.default = [ { address: '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935', disableGasTankDeposit: true, + // disable if not in gas tank + disableAsFeeToken: true, symbol: 'xwallet', networkId: 'ethereum', decimals: 18, @@ -217,6 +239,13 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/14073/small/matic.png' }, + { + address: '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd', + symbol: 'wstETH', + networkId: 'polygon', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png' + }, { address: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6', symbol: 'wbtc', @@ -349,6 +378,13 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png' }, + { + address: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7', + symbol: 'wavax', + networkId: 'avalanche', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/15075/small/wrapped-avax.png' + }, { address: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70', symbol: 'dai', @@ -477,6 +513,7 @@ exports.default = [ address: '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83', symbol: 'usdc', networkId: 'gnosis', + disableGasTankDeposit: true, decimals: 6, icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png' }, @@ -484,9 +521,18 @@ exports.default = [ address: '0x4ECaBa5870353805a9F068101A40E0f32ed605C6', symbol: 'usdt', networkId: 'gnosis', + disableGasTankDeposit: true, decimals: 6, icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png' }, + { + address: '0xcB444e90D8198415266c6a2724b7900fb12FC56E', + symbol: 'eure', + networkId: 'gnosis', + disableGasTankDeposit: true, + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/23354/standard/eur.png' + }, { address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58', symbol: 'usdt', @@ -515,6 +561,13 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png' }, + { + address: '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb', + symbol: 'wstETH', + networkId: 'optimism', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png' + }, { address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', symbol: 'usdt', @@ -543,6 +596,20 @@ exports.default = [ decimals: 18, icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png' }, + { + address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', + symbol: 'weth', + networkId: 'arbitrum', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png' + }, + { + address: '0x5979d7b546e38e414f7e9822514be443a4800529', + symbol: 'wstETH', + networkId: 'arbitrum', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png' + }, { address: '0x382bB369d343125BfB2117af9c149795C6C65C50', symbol: 'usdc', @@ -571,12 +638,54 @@ exports.default = [ decimals: 6, icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png' }, + { + address: '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452', + symbol: 'wstETH', + networkId: 'base', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png' + }, + { + address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + symbol: 'usdc', + networkId: 'base', + decimals: 6, + icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png' + }, { address: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb', symbol: 'dai', networkId: 'base', decimals: 18, icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png' + }, + { + networkId: 'scroll', + address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4', + symbol: 'USDC', + decimals: 6, + icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png' + }, + { + networkId: 'scroll', + address: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df', + symbol: 'USDT', + decimals: 6, + icon: 'https://assets.coingecko.com/coins/images/32610/small/usdt_%281%29.png' + }, + { + networkId: 'scroll', + address: '0x5300000000000000000000000000000000000004', + symbol: 'WETH', + decimals: 18, + icon: 'https://assets.coingecko.com/coins/images/32315/small/weth_%281%29.png?1697365181' + }, + { + networkId: 'scroll', + address: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32', + symbol: 'wstETH', + decimals: 18, + icon: 'https://coin-images.coingecko.com/coins/images/18834/small/wstETH.png' } ]; //# sourceMappingURL=gasTankFeeTokens.js.map \ No newline at end of file diff --git a/dist/src/consts/gasTankFeeTokens.js.map b/dist/src/consts/gasTankFeeTokens.js.map index 696ae4224..06e03906b 100644 --- a/dist/src/consts/gasTankFeeTokens.js.map +++ b/dist/src/consts/gasTankFeeTokens.js.map @@ -1 +1 @@ -{"version":3,"file":"gasTankFeeTokens.js","sourceRoot":"","sources":["../../../src/consts/gasTankFeeTokens.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,2EAA2E;KAClF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,sEAAsE;KAC7E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,mFAAmF;KAC1F;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,uFAAuF;KAC9F;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,2EAA2E;KAClF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,8FAA8F;KACrG;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,qBAAqB,EAAE,IAAI;QAC3B,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0FAA0F;KACjG;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,sGAAsG;KAC7G;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;CACF,CAAA"} \ No newline at end of file +{"version":3,"file":"gasTankFeeTokens.js","sourceRoot":"","sources":["../../../src/consts/gasTankFeeTokens.ts"],"names":[],"mappings":"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","sourcesContent":["export default [\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'pol',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'ftm',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4001/large/Fantom.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'bnb',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/825/large/bnb-icon2_2x.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'avax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/12559/large/coin-round-red.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'aeth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'metis',\n networkId: 'andromeda',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15595/large/metis.PNG'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'glmr',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/22459/large/glmr.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'movr',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17984/large/9285.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'xdai',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/11062/large/Identity-Primary-DarkBG.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'kcs',\n networkId: 'kucoin',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/1047/large/sa9z79.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x4200000000000000000000000000000000000006',\n symbol: 'weth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'okt',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13708/large/WeChat_Image_20220118095654.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'matic',\n networkId: 'mumbai',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'sepolia',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'weth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n symbol: 'stETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13442/standard/steth_logo.png'\n },\n {\n address: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n symbol: 'wstETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'usdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'usdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'dai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x4Fabb145d64652a948d72533023f6E7A623C7C53',\n symbol: 'busd',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'wbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n symbol: 'wallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png'\n },\n {\n address: '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935',\n disableGasTankDeposit: true,\n // disable if not in gas tank\n disableAsFeeToken: true,\n symbol: 'xwallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png'\n },\n {\n address: '0x028171bCA77440897B824Ca71D1c56caC55b68A3',\n baseToken: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'adai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0xBcca60bB61934080951369a648Fb03DF4F96263C',\n baseToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'ausdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811',\n baseToken: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'ausdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x9ff58f4fFB29fA2266Ab25e75e2A8b3503311656',\n baseToken: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'awbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x030bA81f1c18d280636F32af80b9AAd02Cf0854e',\n baseToken: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'aweth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'wmatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/14073/small/matic.png'\n },\n {\n address: '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n symbol: 'wstETH',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'wbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'weth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'dai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'usdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'usdc.e',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n symbol: 'usdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8dF3aad3a84da6b69A4DA8aeC3eA40d9091B2Ac4',\n baseToken: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'ammatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17267/small/amWMATIC_2x.png'\n },\n {\n address: '0x27F8D03b3a2196956ED754baDc28D73be8830A6e',\n baseToken: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'amdai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x1a13F4Ca1d028320A707D99520AbFefca3998b7F',\n baseToken: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'amusdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x60D55F02A771d515e077c9C2403a1ef324885CeC',\n baseToken: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'amusdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x5c2ed810328349100A66B82b78a1791B101C9D61',\n baseToken: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'amwbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x28424507fefb6f7f8E9D3860F56504E4e5f5f390',\n baseToken: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'amweth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n symbol: 'busd',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x55d398326f99059fF775485246999027B3197955',\n symbol: 'usdt',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n symbol: 'usdc',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x049d68029688eAbF473097a2fC38ef61633A3C7A',\n symbol: 'usdt',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75',\n symbol: 'usdc',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E',\n symbol: 'dai',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n symbol: 'wavax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15075/small/wrapped-avax.png'\n },\n {\n address: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'dai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'usdc.e',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'weth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'usdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'wbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE',\n baseToken: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'aavadai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x625E7708f30cA75bfd92586e17077590C60eb4cD',\n baseToken: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'aavausdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x6ab707Aca953eDAeFBc4fD23bA73294241490620',\n baseToken: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'aavausdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x078f358208685046a11C85e8ad32895DED33A249',\n baseToken: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'aavawbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8',\n baseToken: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'aavaweth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73',\n symbol: 'usdt',\n networkId: 'moonbeam',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x765277EebeCA2e31912C9946eAe1021199B39C61',\n symbol: 'dai',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xB44a9B6905aF7c801311e8F4E76932ee959c663C',\n symbol: 'usdt',\n networkId: 'moonriver',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x80A16016cC4A2E6a2CACA8a4a498b1699fF0f844',\n symbol: 'dai',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC',\n symbol: 'usdt',\n networkId: 'andromeda',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83',\n symbol: 'usdc',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x4ECaBa5870353805a9F068101A40E0f32ed605C6',\n symbol: 'usdt',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xcB444e90D8198415266c6a2724b7900fb12FC56E',\n symbol: 'eure',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/23354/standard/eur.png'\n },\n {\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n symbol: 'usdt',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n symbol: 'usdc.e',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n symbol: 'usdc',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n symbol: 'wstETH',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n symbol: 'usdt',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n symbol: 'usdc.e',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n symbol: 'usdc',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n symbol: 'weth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x5979d7b546e38e414f7e9822514be443a4800529',\n symbol: 'wstETH',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x382bB369d343125BfB2117af9c149795C6C65C50',\n symbol: 'usdc',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc946DAf81b08146B1C7A8Da2A851Ddf2B3EAaf85',\n symbol: 'usdt',\n networkId: 'okc',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xEF71CA2EE68F45B9Ad6F72fbdb33d707b872315C',\n symbol: 'ethk',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18537/small/0xef71ca2ee68f45b9ad6f72fbdb33d707b872315c.png'\n },\n {\n address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n symbol: 'usdbc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n symbol: 'wstETH',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n symbol: 'usdc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb',\n symbol: 'dai',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n networkId: 'scroll',\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n symbol: 'USDC',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n networkId: 'scroll',\n address: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df',\n symbol: 'USDT',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/32610/small/usdt_%281%29.png'\n },\n {\n networkId: 'scroll',\n address: '0x5300000000000000000000000000000000000004',\n symbol: 'WETH',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/32315/small/weth_%281%29.png?1697365181'\n },\n {\n networkId: 'scroll',\n address: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32',\n symbol: 'wstETH',\n decimals: 18,\n icon: 'https://coin-images.coingecko.com/coins/images/18834/small/wstETH.png'\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/humanizer/humanizerInfo.json b/dist/src/consts/humanizer/humanizerInfo.json new file mode 100644 index 000000000..26032f068 --- /dev/null +++ b/dist/src/consts/humanizer/humanizerInfo.json @@ -0,0 +1,87694 @@ +{ + "abis": { + "PancakeRouter": { + "0xad5c4648": { + "selector": "0xad5c4648", + "type": "function", + "signature": "function WETH() view returns (address)" + }, + "0xe8e33700": { + "selector": "0xe8e33700", + "type": "function", + "signature": "function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)" + }, + "0xf305d719": { + "selector": "0xf305d719", + "type": "function", + "signature": "function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x85f8c259": { + "selector": "0x85f8c259", + "type": "function", + "signature": "function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)" + }, + "0x054d50d4": { + "selector": "0x054d50d4", + "type": "function", + "signature": "function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)" + }, + "0x1f00ca74": { + "selector": "0x1f00ca74", + "type": "function", + "signature": "function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)" + }, + "0xd06ca61f": { + "selector": "0xd06ca61f", + "type": "function", + "signature": "function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)" + }, + "0xad615dec": { + "selector": "0xad615dec", + "type": "function", + "signature": "function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)" + }, + "0xbaa2abde": { + "selector": "0xbaa2abde", + "type": "function", + "signature": "function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)" + }, + "0x02751cec": { + "selector": "0x02751cec", + "type": "function", + "signature": "function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)" + }, + "0xaf2979eb": { + "selector": "0xaf2979eb", + "type": "function", + "signature": "function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)" + }, + "0xded9382a": { + "selector": "0xded9382a", + "type": "function", + "signature": "function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)" + }, + "0x5b0d5984": { + "selector": "0x5b0d5984", + "type": "function", + "signature": "function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)" + }, + "0x2195995c": { + "selector": "0x2195995c", + "type": "function", + "signature": "function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)" + }, + "0xfb3bdb41": { + "selector": "0xfb3bdb41", + "type": "function", + "signature": "function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0x7ff36ab5": { + "selector": "0x7ff36ab5", + "type": "function", + "signature": "function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0xb6f9de95": { + "selector": "0xb6f9de95", + "type": "function", + "signature": "function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable" + }, + "0x18cbafe5": { + "selector": "0x18cbafe5", + "type": "function", + "signature": "function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x791ac947": { + "selector": "0x791ac947", + "type": "function", + "signature": "function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x38ed1739": { + "selector": "0x38ed1739", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x5c11d795": { + "selector": "0x5c11d795", + "type": "function", + "signature": "function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x4a25d94a": { + "selector": "0x4a25d94a", + "type": "function", + "signature": "function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x8803dbee": { + "selector": "0x8803dbee", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + } + }, + "UniV2Router": { + "0xad5c4648": { + "selector": "0xad5c4648", + "type": "function", + "signature": "function WETH() view returns (address)" + }, + "0xe8e33700": { + "selector": "0xe8e33700", + "type": "function", + "signature": "function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)" + }, + "0xf305d719": { + "selector": "0xf305d719", + "type": "function", + "signature": "function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x85f8c259": { + "selector": "0x85f8c259", + "type": "function", + "signature": "function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)" + }, + "0x054d50d4": { + "selector": "0x054d50d4", + "type": "function", + "signature": "function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)" + }, + "0x1f00ca74": { + "selector": "0x1f00ca74", + "type": "function", + "signature": "function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)" + }, + "0xd06ca61f": { + "selector": "0xd06ca61f", + "type": "function", + "signature": "function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)" + }, + "0xad615dec": { + "selector": "0xad615dec", + "type": "function", + "signature": "function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)" + }, + "0xbaa2abde": { + "selector": "0xbaa2abde", + "type": "function", + "signature": "function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)" + }, + "0x02751cec": { + "selector": "0x02751cec", + "type": "function", + "signature": "function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)" + }, + "0xaf2979eb": { + "selector": "0xaf2979eb", + "type": "function", + "signature": "function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)" + }, + "0xded9382a": { + "selector": "0xded9382a", + "type": "function", + "signature": "function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)" + }, + "0x5b0d5984": { + "selector": "0x5b0d5984", + "type": "function", + "signature": "function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)" + }, + "0x2195995c": { + "selector": "0x2195995c", + "type": "function", + "signature": "function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)" + }, + "0xfb3bdb41": { + "selector": "0xfb3bdb41", + "type": "function", + "signature": "function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0x7ff36ab5": { + "selector": "0x7ff36ab5", + "type": "function", + "signature": "function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0xb6f9de95": { + "selector": "0xb6f9de95", + "type": "function", + "signature": "function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable" + }, + "0x18cbafe5": { + "selector": "0x18cbafe5", + "type": "function", + "signature": "function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x791ac947": { + "selector": "0x791ac947", + "type": "function", + "signature": "function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x38ed1739": { + "selector": "0x38ed1739", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x5c11d795": { + "selector": "0x5c11d795", + "type": "function", + "signature": "function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x4a25d94a": { + "selector": "0x4a25d94a", + "type": "function", + "signature": "function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x8803dbee": { + "selector": "0x8803dbee", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + } + }, + "UniV3Router": { + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0xc04b8d59": { + "selector": "0xc04b8d59", + "type": "function", + "signature": "function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)" + }, + "0x414bf389": { + "selector": "0x414bf389", + "type": "function", + "signature": "function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)" + }, + "0xf28c0498": { + "selector": "0xf28c0498", + "type": "function", + "signature": "function exactOutput((bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)" + }, + "0xdb3e2198": { + "selector": "0xdb3e2198", + "type": "function", + "signature": "function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0xe0e189a0": { + "selector": "0xe0e189a0", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + }, + "0x9b2c0a37": { + "selector": "0x9b2c0a37", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + } + }, + "UniV3Router2": { + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0x571ac8b0": { + "selector": "0x571ac8b0", + "type": "function", + "signature": "function approveMax(address token) payable" + }, + "0xcab372ce": { + "selector": "0xcab372ce", + "type": "function", + "signature": "function approveMaxMinusOne(address token) payable" + }, + "0x639d71a9": { + "selector": "0x639d71a9", + "type": "function", + "signature": "function approveZeroThenMax(address token) payable" + }, + "0xab3fdd50": { + "selector": "0xab3fdd50", + "type": "function", + "signature": "function approveZeroThenMaxMinusOne(address token) payable" + }, + "0xb3a2af13": { + "selector": "0xb3a2af13", + "type": "function", + "signature": "function callPositionManager(bytes data) payable returns (bytes result)" + }, + "0xefdeed8e": { + "selector": "0xefdeed8e", + "type": "function", + "signature": "function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xf25801a7": { + "selector": "0xf25801a7", + "type": "function", + "signature": "function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xb858183f": { + "selector": "0xb858183f", + "type": "function", + "signature": "function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)" + }, + "0x04e45aaf": { + "selector": "0x04e45aaf", + "type": "function", + "signature": "function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)" + }, + "0x09b81346": { + "selector": "0x09b81346", + "type": "function", + "signature": "function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)" + }, + "0x5023b4df": { + "selector": "0x5023b4df", + "type": "function", + "signature": "function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x68e0d4e1": { + "selector": "0x68e0d4e1", + "type": "function", + "signature": "function factoryV2() view returns (address)" + }, + "0xdee00f35": { + "selector": "0xdee00f35", + "type": "function", + "signature": "function getApprovalType(address token, uint256 amount) returns (uint8)" + }, + "0xf100b205": { + "selector": "0xf100b205", + "type": "function", + "signature": "function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)" + }, + "0x11ed56c9": { + "selector": "0x11ed56c9", + "type": "function", + "signature": "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)" + }, + "0x1f0464d1": { + "selector": "0x1f0464d1", + "type": "function", + "signature": "function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])" + }, + "0x5ae401dc": { + "selector": "0x5ae401dc", + "type": "function", + "signature": "function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x791b98bc": { + "selector": "0x791b98bc", + "type": "function", + "signature": "function positionManager() view returns (address)" + }, + "0xf2d5d56b": { + "selector": "0xf2d5d56b", + "type": "function", + "signature": "function pull(address token, uint256 value) payable" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x472b43f3": { + "selector": "0x472b43f3", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)" + }, + "0x42712a67": { + "selector": "0x42712a67", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0xe90a182f": { + "selector": "0xe90a182f", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum) payable" + }, + "0x3068c554": { + "selector": "0x3068c554", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0xe0e189a0": { + "selector": "0xe0e189a0", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + }, + "0x49616997": { + "selector": "0x49616997", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum) payable" + }, + "0x9b2c0a37": { + "selector": "0x9b2c0a37", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xd4ef38de": { + "selector": "0xd4ef38de", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0x1c58db4f": { + "selector": "0x1c58db4f", + "type": "function", + "signature": "function wrapETH(uint256 value) payable" + } + }, + "UniV3Router3": { + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0x571ac8b0": { + "selector": "0x571ac8b0", + "type": "function", + "signature": "function approveMax(address token) payable" + }, + "0xcab372ce": { + "selector": "0xcab372ce", + "type": "function", + "signature": "function approveMaxMinusOne(address token) payable" + }, + "0x639d71a9": { + "selector": "0x639d71a9", + "type": "function", + "signature": "function approveZeroThenMax(address token) payable" + }, + "0xab3fdd50": { + "selector": "0xab3fdd50", + "type": "function", + "signature": "function approveZeroThenMaxMinusOne(address token) payable" + }, + "0xb3a2af13": { + "selector": "0xb3a2af13", + "type": "function", + "signature": "function callPositionManager(bytes data) payable returns (bytes result)" + }, + "0xefdeed8e": { + "selector": "0xefdeed8e", + "type": "function", + "signature": "function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xf25801a7": { + "selector": "0xf25801a7", + "type": "function", + "signature": "function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xb858183f": { + "selector": "0xb858183f", + "type": "function", + "signature": "function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)" + }, + "0x04e45aaf": { + "selector": "0x04e45aaf", + "type": "function", + "signature": "function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)" + }, + "0x09b81346": { + "selector": "0x09b81346", + "type": "function", + "signature": "function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)" + }, + "0x5023b4df": { + "selector": "0x5023b4df", + "type": "function", + "signature": "function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x68e0d4e1": { + "selector": "0x68e0d4e1", + "type": "function", + "signature": "function factoryV2() view returns (address)" + }, + "0xdee00f35": { + "selector": "0xdee00f35", + "type": "function", + "signature": "function getApprovalType(address token, uint256 amount) returns (uint8)" + }, + "0xf100b205": { + "selector": "0xf100b205", + "type": "function", + "signature": "function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)" + }, + "0x11ed56c9": { + "selector": "0x11ed56c9", + "type": "function", + "signature": "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)" + }, + "0x1f0464d1": { + "selector": "0x1f0464d1", + "type": "function", + "signature": "function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])" + }, + "0x5ae401dc": { + "selector": "0x5ae401dc", + "type": "function", + "signature": "function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x791b98bc": { + "selector": "0x791b98bc", + "type": "function", + "signature": "function positionManager() view returns (address)" + }, + "0xf2d5d56b": { + "selector": "0xf2d5d56b", + "type": "function", + "signature": "function pull(address token, uint256 value) payable" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x472b43f3": { + "selector": "0x472b43f3", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)" + }, + "0x42712a67": { + "selector": "0x42712a67", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0xe90a182f": { + "selector": "0xe90a182f", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum) payable" + }, + "0x3068c554": { + "selector": "0x3068c554", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0xe0e189a0": { + "selector": "0xe0e189a0", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + }, + "0x49616997": { + "selector": "0x49616997", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum) payable" + }, + "0x9b2c0a37": { + "selector": "0x9b2c0a37", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xd4ef38de": { + "selector": "0xd4ef38de", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0x1c58db4f": { + "selector": "0x1c58db4f", + "type": "function", + "signature": "function wrapETH(uint256 value) payable" + } + }, + "UniV3Router4": { + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0x571ac8b0": { + "selector": "0x571ac8b0", + "type": "function", + "signature": "function approveMax(address token) payable" + }, + "0xcab372ce": { + "selector": "0xcab372ce", + "type": "function", + "signature": "function approveMaxMinusOne(address token) payable" + }, + "0x639d71a9": { + "selector": "0x639d71a9", + "type": "function", + "signature": "function approveZeroThenMax(address token) payable" + }, + "0xab3fdd50": { + "selector": "0xab3fdd50", + "type": "function", + "signature": "function approveZeroThenMaxMinusOne(address token) payable" + }, + "0xb3a2af13": { + "selector": "0xb3a2af13", + "type": "function", + "signature": "function callPositionManager(bytes data) payable returns (bytes result)" + }, + "0xefdeed8e": { + "selector": "0xefdeed8e", + "type": "function", + "signature": "function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xf25801a7": { + "selector": "0xf25801a7", + "type": "function", + "signature": "function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xb858183f": { + "selector": "0xb858183f", + "type": "function", + "signature": "function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)" + }, + "0x04e45aaf": { + "selector": "0x04e45aaf", + "type": "function", + "signature": "function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)" + }, + "0x09b81346": { + "selector": "0x09b81346", + "type": "function", + "signature": "function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)" + }, + "0x5023b4df": { + "selector": "0x5023b4df", + "type": "function", + "signature": "function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x68e0d4e1": { + "selector": "0x68e0d4e1", + "type": "function", + "signature": "function factoryV2() view returns (address)" + }, + "0xdee00f35": { + "selector": "0xdee00f35", + "type": "function", + "signature": "function getApprovalType(address token, uint256 amount) returns (uint8)" + }, + "0xf100b205": { + "selector": "0xf100b205", + "type": "function", + "signature": "function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)" + }, + "0x11ed56c9": { + "selector": "0x11ed56c9", + "type": "function", + "signature": "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)" + }, + "0x1f0464d1": { + "selector": "0x1f0464d1", + "type": "function", + "signature": "function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])" + }, + "0x5ae401dc": { + "selector": "0x5ae401dc", + "type": "function", + "signature": "function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x791b98bc": { + "selector": "0x791b98bc", + "type": "function", + "signature": "function positionManager() view returns (address)" + }, + "0xf2d5d56b": { + "selector": "0xf2d5d56b", + "type": "function", + "signature": "function pull(address token, uint256 value) payable" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x472b43f3": { + "selector": "0x472b43f3", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)" + }, + "0x42712a67": { + "selector": "0x42712a67", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0xe90a182f": { + "selector": "0xe90a182f", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum) payable" + }, + "0x3068c554": { + "selector": "0x3068c554", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0xe0e189a0": { + "selector": "0xe0e189a0", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + }, + "0x49616997": { + "selector": "0x49616997", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum) payable" + }, + "0x9b2c0a37": { + "selector": "0x9b2c0a37", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xd4ef38de": { + "selector": "0xd4ef38de", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0x1c58db4f": { + "selector": "0x1c58db4f", + "type": "function", + "signature": "function wrapETH(uint256 value) payable" + } + }, + "UniV3Router5": { + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0x571ac8b0": { + "selector": "0x571ac8b0", + "type": "function", + "signature": "function approveMax(address token) payable" + }, + "0xcab372ce": { + "selector": "0xcab372ce", + "type": "function", + "signature": "function approveMaxMinusOne(address token) payable" + }, + "0x639d71a9": { + "selector": "0x639d71a9", + "type": "function", + "signature": "function approveZeroThenMax(address token) payable" + }, + "0xab3fdd50": { + "selector": "0xab3fdd50", + "type": "function", + "signature": "function approveZeroThenMaxMinusOne(address token) payable" + }, + "0xb3a2af13": { + "selector": "0xb3a2af13", + "type": "function", + "signature": "function callPositionManager(bytes data) payable returns (bytes result)" + }, + "0xefdeed8e": { + "selector": "0xefdeed8e", + "type": "function", + "signature": "function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xf25801a7": { + "selector": "0xf25801a7", + "type": "function", + "signature": "function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view" + }, + "0xb858183f": { + "selector": "0xb858183f", + "type": "function", + "signature": "function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)" + }, + "0x04e45aaf": { + "selector": "0x04e45aaf", + "type": "function", + "signature": "function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)" + }, + "0x09b81346": { + "selector": "0x09b81346", + "type": "function", + "signature": "function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)" + }, + "0x5023b4df": { + "selector": "0x5023b4df", + "type": "function", + "signature": "function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x68e0d4e1": { + "selector": "0x68e0d4e1", + "type": "function", + "signature": "function factoryV2() view returns (address)" + }, + "0xdee00f35": { + "selector": "0xdee00f35", + "type": "function", + "signature": "function getApprovalType(address token, uint256 amount) returns (uint8)" + }, + "0xf100b205": { + "selector": "0xf100b205", + "type": "function", + "signature": "function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)" + }, + "0x11ed56c9": { + "selector": "0x11ed56c9", + "type": "function", + "signature": "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)" + }, + "0x1f0464d1": { + "selector": "0x1f0464d1", + "type": "function", + "signature": "function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])" + }, + "0x5ae401dc": { + "selector": "0x5ae401dc", + "type": "function", + "signature": "function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x791b98bc": { + "selector": "0x791b98bc", + "type": "function", + "signature": "function positionManager() view returns (address)" + }, + "0xf2d5d56b": { + "selector": "0xf2d5d56b", + "type": "function", + "signature": "function pull(address token, uint256 value) payable" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x472b43f3": { + "selector": "0x472b43f3", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)" + }, + "0x42712a67": { + "selector": "0x42712a67", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0xe90a182f": { + "selector": "0xe90a182f", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum) payable" + }, + "0x3068c554": { + "selector": "0x3068c554", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0xe0e189a0": { + "selector": "0xe0e189a0", + "type": "function", + "signature": "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + }, + "0x49616997": { + "selector": "0x49616997", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum) payable" + }, + "0x9b2c0a37": { + "selector": "0x9b2c0a37", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable" + }, + "0xd4ef38de": { + "selector": "0xd4ef38de", + "type": "function", + "signature": "function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable" + }, + "0x1c58db4f": { + "selector": "0x1c58db4f", + "type": "function", + "signature": "function wrapETH(uint256 value) payable" + } + }, + "UniswapV3Pool": { + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + }, + "0x30adf81f": { + "selector": "0x30adf81f", + "type": "function", + "signature": "function PERMIT_TYPEHASH() view returns (bytes32)" + }, + "0x4aa4a4fc": { + "selector": "0x4aa4a4fc", + "type": "function", + "signature": "function WETH9() view returns (address)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address to, uint256 tokenId)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address owner) view returns (uint256)" + }, + "0x6c0360eb": { + "selector": "0x6c0360eb", + "type": "function", + "signature": "function baseURI() pure returns (string)" + }, + "0x42966c68": { + "selector": "0x42966c68", + "type": "function", + "signature": "function burn(uint256 tokenId) payable" + }, + "0xfc6f7865": { + "selector": "0xfc6f7865", + "type": "function", + "signature": "function collect((uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max) params) payable returns (uint256 amount0, uint256 amount1)" + }, + "0x13ead562": { + "selector": "0x13ead562", + "type": "function", + "signature": "function createAndInitializePoolIfNecessary(address token0, address token1, uint24 fee, uint160 sqrtPriceX96) payable returns (address pool)" + }, + "0x0c49ccbe": { + "selector": "0x0c49ccbe", + "type": "function", + "signature": "function decreaseLiquidity((uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline) params) payable returns (uint256 amount0, uint256 amount1)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x081812fc": { + "selector": "0x081812fc", + "type": "function", + "signature": "function getApproved(uint256 tokenId) view returns (address)" + }, + "0x219f5d17": { + "selector": "0x219f5d17", + "type": "function", + "signature": "function increaseLiquidity((uint256 tokenId, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, uint256 deadline) params) payable returns (uint128 liquidity, uint256 amount0, uint256 amount1)" + }, + "0xe985e9c5": { + "selector": "0xe985e9c5", + "type": "function", + "signature": "function isApprovedForAll(address owner, address operator) view returns (bool)" + }, + "0x88316456": { + "selector": "0x88316456", + "type": "function", + "signature": "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x6352211e": { + "selector": "0x6352211e", + "type": "function", + "signature": "function ownerOf(uint256 tokenId) view returns (address)" + }, + "0x7ac2ff7b": { + "selector": "0x7ac2ff7b", + "type": "function", + "signature": "function permit(address spender, uint256 tokenId, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x99fbab88": { + "selector": "0x99fbab88", + "type": "function", + "signature": "function positions(uint256 tokenId) view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)" + }, + "0x12210e8a": { + "selector": "0x12210e8a", + "type": "function", + "signature": "function refundETH() payable" + }, + "0x42842e0e": { + "selector": "0x42842e0e", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId)" + }, + "0xb88d4fde": { + "selector": "0xb88d4fde", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)" + }, + "0xf3995c67": { + "selector": "0xf3995c67", + "type": "function", + "signature": "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0x4659a494": { + "selector": "0x4659a494", + "type": "function", + "signature": "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa4a78f0c": { + "selector": "0xa4a78f0c", + "type": "function", + "signature": "function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xc2e3140a": { + "selector": "0xc2e3140a", + "type": "function", + "signature": "function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable" + }, + "0xa22cb465": { + "selector": "0xa22cb465", + "type": "function", + "signature": "function setApprovalForAll(address operator, bool approved)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0xdf2ab5bb": { + "selector": "0xdf2ab5bb", + "type": "function", + "signature": "function sweepToken(address token, uint256 amountMinimum, address recipient) payable" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0x4f6ccce7": { + "selector": "0x4f6ccce7", + "type": "function", + "signature": "function tokenByIndex(uint256 index) view returns (uint256)" + }, + "0x2f745c59": { + "selector": "0x2f745c59", + "type": "function", + "signature": "function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)" + }, + "0xc87b56dd": { + "selector": "0xc87b56dd", + "type": "function", + "signature": "function tokenURI(uint256 tokenId) view returns (string)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address from, address to, uint256 tokenId)" + }, + "0xd3487997": { + "selector": "0xd3487997", + "type": "function", + "signature": "function uniswapV3MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes data)" + }, + "0x49404b7c": { + "selector": "0x49404b7c", + "type": "function", + "signature": "function unwrapWETH9(uint256 amountMinimum, address recipient) payable" + } + }, + "Uniswap Router": { + "0xa3281672": { + "selector": "0xa3281672", + "type": "error", + "signature": "error BalanceTooLow()" + }, + "0xae9bdf00": { + "selector": "0xae9bdf00", + "type": "error", + "signature": "error BuyPunkFailed()" + }, + "0x6f5ffb7e": { + "selector": "0x6f5ffb7e", + "type": "error", + "signature": "error ContractLocked()" + }, + "0x1231ae40": { + "selector": "0x1231ae40", + "type": "error", + "signature": "error ETHNotAccepted()" + }, + "0x2c4029e9": { + "selector": "0x2c4029e9", + "type": "error", + "signature": "error ExecutionFailed(uint256 commandIndex, bytes message)" + }, + "0xe7002877": { + "selector": "0xe7002877", + "type": "error", + "signature": "error FromAddressIsNotOwner()" + }, + "0x6a12f104": { + "selector": "0x6a12f104", + "type": "error", + "signature": "error InsufficientETH()" + }, + "0x675cae38": { + "selector": "0x675cae38", + "type": "error", + "signature": "error InsufficientToken()" + }, + "0xdeaa01e6": { + "selector": "0xdeaa01e6", + "type": "error", + "signature": "error InvalidBips()" + }, + "0xd76a1e9e": { + "selector": "0xd76a1e9e", + "type": "error", + "signature": "error InvalidCommandType(uint256 commandType)" + }, + "0x483a6929": { + "selector": "0x483a6929", + "type": "error", + "signature": "error InvalidOwnerERC1155()" + }, + "0x7dbe7e89": { + "selector": "0x7dbe7e89", + "type": "error", + "signature": "error InvalidOwnerERC721()" + }, + "0x20db8267": { + "selector": "0x20db8267", + "type": "error", + "signature": "error InvalidPath()" + }, + "0x7b9c8916": { + "selector": "0x7b9c8916", + "type": "error", + "signature": "error InvalidReserves()" + }, + "0x5461585f": { + "selector": "0x5461585f", + "type": "error", + "signature": "error InvalidSpender()" + }, + "0xff633a38": { + "selector": "0xff633a38", + "type": "error", + "signature": "error LengthMismatch()" + }, + "0x3b99b53d": { + "selector": "0x3b99b53d", + "type": "error", + "signature": "error SliceOutOfBounds()" + }, + "0x5bf6f916": { + "selector": "0x5bf6f916", + "type": "error", + "signature": "error TransactionDeadlinePassed()" + }, + "0x7d529919": { + "selector": "0x7d529919", + "type": "error", + "signature": "error UnableToClaim()" + }, + "0xc4bd89a9": { + "selector": "0xc4bd89a9", + "type": "error", + "signature": "error UnsafeCast()" + }, + "0xae52ad0c": { + "selector": "0xae52ad0c", + "type": "error", + "signature": "error V2InvalidPath()" + }, + "0x849eaf98": { + "selector": "0x849eaf98", + "type": "error", + "signature": "error V2TooLittleReceived()" + }, + "0x8ab0bc16": { + "selector": "0x8ab0bc16", + "type": "error", + "signature": "error V2TooMuchRequested()" + }, + "0xd4e0248e": { + "selector": "0xd4e0248e", + "type": "error", + "signature": "error V3InvalidAmountOut()" + }, + "0x32b13d91": { + "selector": "0x32b13d91", + "type": "error", + "signature": "error V3InvalidCaller()" + }, + "0x316cf0eb": { + "selector": "0x316cf0eb", + "type": "error", + "signature": "error V3InvalidSwap()" + }, + "0x39d35496": { + "selector": "0x39d35496", + "type": "error", + "signature": "error V3TooLittleReceived()" + }, + "0x739dbe52": { + "selector": "0x739dbe52", + "type": "error", + "signature": "error V3TooMuchRequested()" + }, + "0x709a1cc2": { + "selector": "0x709a1cc2", + "type": "function", + "signature": "function collectRewards(bytes looksRareClaim)" + }, + "0x24856bc3": { + "selector": "0x24856bc3", + "type": "function", + "signature": "function execute(bytes commands, bytes[] inputs) payable" + }, + "0x3593564c": { + "selector": "0x3593564c", + "type": "function", + "signature": "function execute(bytes commands, bytes[] inputs, uint256 deadline) payable" + }, + "0xbc197c81": { + "selector": "0xbc197c81", + "type": "function", + "signature": "function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) pure returns (bytes4)" + }, + "0xf23a6e61": { + "selector": "0xf23a6e61", + "type": "function", + "signature": "function onERC1155Received(address, address, uint256, uint256, bytes) pure returns (bytes4)" + }, + "0x150b7a02": { + "selector": "0x150b7a02", + "type": "function", + "signature": "function onERC721Received(address, address, uint256, bytes) pure returns (bytes4)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) pure returns (bool)" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)" + } + }, + "CowSwapSettlement": { + "0x2335c76b": { + "selector": "0x2335c76b", + "type": "function", + "signature": "function authenticator() view returns (address)" + }, + "0xf698da25": { + "selector": "0xf698da25", + "type": "function", + "signature": "function domainSeparator() view returns (bytes32)" + }, + "0x2479fb6e": { + "selector": "0x2479fb6e", + "type": "function", + "signature": "function filledAmount(bytes) view returns (uint256)" + }, + "0xed9f35ce": { + "selector": "0xed9f35ce", + "type": "function", + "signature": "function freeFilledAmountStorage(bytes[] orderUids)" + }, + "0xa2a7d51b": { + "selector": "0xa2a7d51b", + "type": "function", + "signature": "function freePreSignatureStorage(bytes[] orderUids)" + }, + "0x5624b25b": { + "selector": "0x5624b25b", + "type": "function", + "signature": "function getStorageAt(uint256 offset, uint256 length) view returns (bytes)" + }, + "0x15337bc0": { + "selector": "0x15337bc0", + "type": "function", + "signature": "function invalidateOrder(bytes orderUid)" + }, + "0xd08d33d1": { + "selector": "0xd08d33d1", + "type": "function", + "signature": "function preSignature(bytes) view returns (uint256)" + }, + "0xec6cb13f": { + "selector": "0xec6cb13f", + "type": "function", + "signature": "function setPreSignature(bytes orderUid, bool signed)" + }, + "0x13d79a0b": { + "selector": "0x13d79a0b", + "type": "function", + "signature": "function settle(address[] tokens, uint256[] clearingPrices, (uint256 sellTokenIndex, uint256 buyTokenIndex, address receiver, uint256 sellAmount, uint256 buyAmount, uint32 validTo, bytes32 appData, uint256 feeAmount, uint256 flags, uint256 executedAmount, bytes signature)[] trades, (address target, uint256 value, bytes callData)[][3] interactions)" + }, + "0xf84436bd": { + "selector": "0xf84436bd", + "type": "function", + "signature": "function simulateDelegatecall(address targetContract, bytes calldataPayload) returns (bytes response)" + }, + "0x43218e19": { + "selector": "0x43218e19", + "type": "function", + "signature": "function simulateDelegatecallInternal(address targetContract, bytes calldataPayload) returns (bytes response)" + }, + "0x845a101f": { + "selector": "0x845a101f", + "type": "function", + "signature": "function swap((bytes32 poolId, uint256 assetInIndex, uint256 assetOutIndex, uint256 amount, bytes userData)[] swaps, address[] tokens, (uint256 sellTokenIndex, uint256 buyTokenIndex, address receiver, uint256 sellAmount, uint256 buyAmount, uint32 validTo, bytes32 appData, uint256 feeAmount, uint256 flags, uint256 executedAmount, bytes signature) trade)" + }, + "0xfbfa77cf": { + "selector": "0xfbfa77cf", + "type": "function", + "signature": "function vault() view returns (address)" + }, + "0x9b552cc2": { + "selector": "0x9b552cc2", + "type": "function", + "signature": "function vaultRelayer() view returns (address)" + } + }, + "CowSwapGPv2VaultRelayer": { + "0x4817a286": { + "selector": "0x4817a286", + "type": "function", + "signature": "function batchSwapWithFee(uint8 kind, (bytes32 poolId, uint256 assetInIndex, uint256 assetOutIndex, uint256 amount, bytes userData)[] swaps, address[] tokens, (address sender, bool fromInternalBalance, address recipient, bool toInternalBalance) funds, int256[] limits, uint256 deadline, (address account, address token, uint256 amount, bytes32 balance) feeTransfer) returns (int256[] tokenDeltas)" + }, + "0x7d10d11f": { + "selector": "0x7d10d11f", + "type": "function", + "signature": "function transferFromAccounts((address account, address token, uint256 amount, bytes32 balance)[] transfers)" + } + }, + "ParaSwapTokenTransferProxy": { + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x15dacbea": { + "selector": "0x15dacbea", + "type": "function", + "signature": "function transferFrom(address token, address from, address to, uint256 amount)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "ParaSwapV5": { + "0xa217fddf": { + "selector": "0xa217fddf", + "type": "function", + "signature": "function DEFAULT_ADMIN_ROLE() view returns (bytes32)" + }, + "0x30d643b5": { + "selector": "0x30d643b5", + "type": "function", + "signature": "function ROUTER_ROLE() view returns (bytes32)" + }, + "0x7a3226ec": { + "selector": "0x7a3226ec", + "type": "function", + "signature": "function WHITELISTED_ROLE() view returns (bytes32)" + }, + "0x9a5a98d3": { + "selector": "0x9a5a98d3", + "type": "function", + "signature": "function getAdapterData(bytes32 key) view returns (bytes)" + }, + "0x5459060d": { + "selector": "0x5459060d", + "type": "function", + "signature": "function getFeeWallet() view returns (address)" + }, + "0xdc9cc645": { + "selector": "0xdc9cc645", + "type": "function", + "signature": "function getImplementation(bytes4 selector) view returns (address)" + }, + "0x6df77496": { + "selector": "0x6df77496", + "type": "function", + "signature": "function getPartnerFeeStructure(address partner) view returns ((uint256 partnerShare, bool noPositiveSlippage, bool positiveSlippageToUser, uint16 feePercent, string partnerId, bytes data))" + }, + "0x248a9ca3": { + "selector": "0x248a9ca3", + "type": "function", + "signature": "function getRoleAdmin(bytes32 role) view returns (bytes32)" + }, + "0x9010d07c": { + "selector": "0x9010d07c", + "type": "function", + "signature": "function getRoleMember(bytes32 role, uint256 index) view returns (address)" + }, + "0xca15c873": { + "selector": "0xca15c873", + "type": "function", + "signature": "function getRoleMemberCount(bytes32 role) view returns (uint256)" + }, + "0xaa97ef02": { + "selector": "0xaa97ef02", + "type": "function", + "signature": "function getRouterData(bytes32 key) view returns (bytes)" + }, + "0xd2c4b598": { + "selector": "0xd2c4b598", + "type": "function", + "signature": "function getTokenTransferProxy() view returns (address)" + }, + "0x0d8e6e2c": { + "selector": "0x0d8e6e2c", + "type": "function", + "signature": "function getVersion() pure returns (string)" + }, + "0x2f2ff15d": { + "selector": "0x2f2ff15d", + "type": "function", + "signature": "function grantRole(bytes32 role, address account)" + }, + "0x91d14854": { + "selector": "0x91d14854", + "type": "function", + "signature": "function hasRole(bytes32 role, address account) view returns (bool)" + }, + "0x18800219": { + "selector": "0x18800219", + "type": "function", + "signature": "function initializeAdapter(address adapter, bytes data)" + }, + "0x60e35507": { + "selector": "0x60e35507", + "type": "function", + "signature": "function initializeRouter(address router, bytes data)" + }, + "0x3a9243d7": { + "selector": "0x3a9243d7", + "type": "function", + "signature": "function isAdapterInitialized(bytes32 key) view returns (bool)" + }, + "0x9812f33b": { + "selector": "0x9812f33b", + "type": "function", + "signature": "function isRouterInitialized(bytes32 key) view returns (bool)" + }, + "0xaa5b2458": { + "selector": "0xaa5b2458", + "type": "function", + "signature": "function registerPartner(address partner, uint256 _partnerShare, bool _noPositiveSlippage, bool _positiveSlippageToUser, uint16 _feePercent, string partnerId, bytes _data)" + }, + "0x36568abe": { + "selector": "0x36568abe", + "type": "function", + "signature": "function renounceRole(bytes32 role, address account)" + }, + "0xd547741f": { + "selector": "0xd547741f", + "type": "function", + "signature": "function revokeRole(bytes32 role, address account)" + }, + "0x90d49b9d": { + "selector": "0x90d49b9d", + "type": "function", + "signature": "function setFeeWallet(address _feeWallet)" + }, + "0x0815f6fd": { + "selector": "0x0815f6fd", + "type": "function", + "signature": "function setImplementation(bytes4 selector, address implementation)" + }, + "0xa64b6e5f": { + "selector": "0xa64b6e5f", + "type": "function", + "signature": "function transferTokens(address token, address destination, uint256 amount)" + } + }, + "Permit2": { + "0xd81b2f2e": { + "selector": "0xd81b2f2e", + "type": "error", + "signature": "error AllowanceExpired(uint256 deadline)" + }, + "0x24d35a26": { + "selector": "0x24d35a26", + "type": "error", + "signature": "error ExcessiveInvalidation()" + }, + "0xf96fb071": { + "selector": "0xf96fb071", + "type": "error", + "signature": "error InsufficientAllowance(uint256 amount)" + }, + "0x3728b83d": { + "selector": "0x3728b83d", + "type": "error", + "signature": "error InvalidAmount(uint256 maxAmount)" + }, + "0xb0669cbc": { + "selector": "0xb0669cbc", + "type": "error", + "signature": "error InvalidContractSignature()" + }, + "0x756688fe": { + "selector": "0x756688fe", + "type": "error", + "signature": "error InvalidNonce()" + }, + "0x8baa579f": { + "selector": "0x8baa579f", + "type": "error", + "signature": "error InvalidSignature()" + }, + "0x4be6321b": { + "selector": "0x4be6321b", + "type": "error", + "signature": "error InvalidSignatureLength()" + }, + "0x815e1d64": { + "selector": "0x815e1d64", + "type": "error", + "signature": "error InvalidSigner()" + }, + "0xff633a38": { + "selector": "0xff633a38", + "type": "error", + "signature": "error LengthMismatch()" + }, + "0xcd21db4f": { + "selector": "0xcd21db4f", + "type": "error", + "signature": "error SignatureExpired(uint256 signatureDeadline)" + }, + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + }, + "0x927da105": { + "selector": "0x927da105", + "type": "function", + "signature": "function allowance(address, address, address) view returns (uint160 amount, uint48 expiration, uint48 nonce)" + }, + "0x87517c45": { + "selector": "0x87517c45", + "type": "function", + "signature": "function approve(address token, address spender, uint160 amount, uint48 expiration)" + }, + "0x65d9723c": { + "selector": "0x65d9723c", + "type": "function", + "signature": "function invalidateNonces(address token, address spender, uint48 newNonce)" + }, + "0x3ff9dcb1": { + "selector": "0x3ff9dcb1", + "type": "function", + "signature": "function invalidateUnorderedNonces(uint256 wordPos, uint256 mask)" + }, + "0xcc53287f": { + "selector": "0xcc53287f", + "type": "function", + "signature": "function lockdown((address token, address spender)[] approvals)" + }, + "0x4fe02b44": { + "selector": "0x4fe02b44", + "type": "function", + "signature": "function nonceBitmap(address, uint256) view returns (uint256)" + }, + "0x2a2d80d1": { + "selector": "0x2a2d80d1", + "type": "function", + "signature": "function permit(address owner, ((address token, uint160 amount, uint48 expiration, uint48 nonce)[] details, address spender, uint256 sigDeadline) permitBatch, bytes signature)" + }, + "0x2b67b570": { + "selector": "0x2b67b570", + "type": "function", + "signature": "function permit(address owner, ((address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline) permitSingle, bytes signature)" + }, + "0x30f28b7a": { + "selector": "0x30f28b7a", + "type": "function", + "signature": "function permitTransferFrom(((address token, uint256 amount) permitted, uint256 nonce, uint256 deadline) permit, (address to, uint256 requestedAmount) transferDetails, address owner, bytes signature)" + }, + "0xedd9444b": { + "selector": "0xedd9444b", + "type": "function", + "signature": "function permitTransferFrom(((address token, uint256 amount)[] permitted, uint256 nonce, uint256 deadline) permit, (address to, uint256 requestedAmount)[] transferDetails, address owner, bytes signature)" + }, + "0x137c29fe": { + "selector": "0x137c29fe", + "type": "function", + "signature": "function permitWitnessTransferFrom(((address token, uint256 amount) permitted, uint256 nonce, uint256 deadline) permit, (address to, uint256 requestedAmount) transferDetails, address owner, bytes32 witness, string witnessTypeString, bytes signature)" + }, + "0xfe8ec1a7": { + "selector": "0xfe8ec1a7", + "type": "function", + "signature": "function permitWitnessTransferFrom(((address token, uint256 amount)[] permitted, uint256 nonce, uint256 deadline) permit, (address to, uint256 requestedAmount)[] transferDetails, address owner, bytes32 witness, string witnessTypeString, bytes signature)" + }, + "0x0d58b1db": { + "selector": "0x0d58b1db", + "type": "function", + "signature": "function transferFrom((address from, address to, uint160 amount, address token)[] transferDetails)" + }, + "0x36c78516": { + "selector": "0x36c78516", + "type": "function", + "signature": "function transferFrom(address from, address to, uint160 amount, address token)" + } + }, + "Sushiswap": { + "0xad5c4648": { + "selector": "0xad5c4648", + "type": "function", + "signature": "function WETH() view returns (address)" + }, + "0xe8e33700": { + "selector": "0xe8e33700", + "type": "function", + "signature": "function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)" + }, + "0xf305d719": { + "selector": "0xf305d719", + "type": "function", + "signature": "function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x85f8c259": { + "selector": "0x85f8c259", + "type": "function", + "signature": "function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)" + }, + "0x054d50d4": { + "selector": "0x054d50d4", + "type": "function", + "signature": "function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)" + }, + "0x1f00ca74": { + "selector": "0x1f00ca74", + "type": "function", + "signature": "function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)" + }, + "0xd06ca61f": { + "selector": "0xd06ca61f", + "type": "function", + "signature": "function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)" + }, + "0xad615dec": { + "selector": "0xad615dec", + "type": "function", + "signature": "function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)" + }, + "0xbaa2abde": { + "selector": "0xbaa2abde", + "type": "function", + "signature": "function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)" + }, + "0x02751cec": { + "selector": "0x02751cec", + "type": "function", + "signature": "function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)" + }, + "0xaf2979eb": { + "selector": "0xaf2979eb", + "type": "function", + "signature": "function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)" + }, + "0xded9382a": { + "selector": "0xded9382a", + "type": "function", + "signature": "function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)" + }, + "0x5b0d5984": { + "selector": "0x5b0d5984", + "type": "function", + "signature": "function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)" + }, + "0x2195995c": { + "selector": "0x2195995c", + "type": "function", + "signature": "function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)" + }, + "0xfb3bdb41": { + "selector": "0xfb3bdb41", + "type": "function", + "signature": "function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0x7ff36ab5": { + "selector": "0x7ff36ab5", + "type": "function", + "signature": "function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0xb6f9de95": { + "selector": "0xb6f9de95", + "type": "function", + "signature": "function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable" + }, + "0x18cbafe5": { + "selector": "0x18cbafe5", + "type": "function", + "signature": "function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x791ac947": { + "selector": "0x791ac947", + "type": "function", + "signature": "function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x38ed1739": { + "selector": "0x38ed1739", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x5c11d795": { + "selector": "0x5c11d795", + "type": "function", + "signature": "function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x4a25d94a": { + "selector": "0x4a25d94a", + "type": "function", + "signature": "function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x8803dbee": { + "selector": "0x8803dbee", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + } + }, + "RouteProcessor": { + "0x6b2ace87": { + "selector": "0x6b2ace87", + "type": "function", + "signature": "function bentoBox() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x8456cb59": { + "selector": "0x8456cb59", + "type": "function", + "signature": "function pause()" + }, + "0x2646478b": { + "selector": "0x2646478b", + "type": "function", + "signature": "function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x046f7da2": { + "selector": "0x046f7da2", + "type": "function", + "signature": "function resume()" + }, + "0x9a1f3406": { + "selector": "0x9a1f3406", + "type": "function", + "signature": "function setPriviledge(address user, bool priviledge)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x93b3774c": { + "selector": "0x93b3774c", + "type": "function", + "signature": "function transferValueAndprocessRoute(address transferValueTo, uint256 amountValueTransfer, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)" + } + }, + "WETH": { + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address guy, uint256 wad) returns (bool)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address src, address dst, uint256 wad) returns (bool)" + }, + "0x2e1a7d4d": { + "selector": "0x2e1a7d4d", + "type": "function", + "signature": "function withdraw(uint256 wad)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() view returns (uint8)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address) view returns (uint256)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address dst, uint256 wad) returns (bool)" + }, + "0xd0e30db0": { + "selector": "0xd0e30db0", + "type": "function", + "signature": "function deposit() payable" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address, address) view returns (uint256)" + } + }, + "AaveLendingPoolV2": { + "0x074b2e43": { + "selector": "0x074b2e43", + "type": "function", + "signature": "function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)" + }, + "0x8afaff02": { + "selector": "0x8afaff02", + "type": "function", + "signature": "function LENDINGPOOL_REVISION() view returns (uint256)" + }, + "0xf8119d51": { + "selector": "0xf8119d51", + "type": "function", + "signature": "function MAX_NUMBER_RESERVES() view returns (uint256)" + }, + "0xe82fec2f": { + "selector": "0xe82fec2f", + "type": "function", + "signature": "function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() view returns (uint256)" + }, + "0xa415bcad": { + "selector": "0xa415bcad", + "type": "function", + "signature": "function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)" + }, + "0xe8eda9df": { + "selector": "0xe8eda9df", + "type": "function", + "signature": "function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)" + }, + "0xd5ed3933": { + "selector": "0xd5ed3933", + "type": "function", + "signature": "function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)" + }, + "0xab9c4b5d": { + "selector": "0xab9c4b5d", + "type": "function", + "signature": "function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] modes, address onBehalfOf, bytes params, uint16 referralCode)" + }, + "0xfe65acfe": { + "selector": "0xfe65acfe", + "type": "function", + "signature": "function getAddressesProvider() view returns (address)" + }, + "0xc44b11f7": { + "selector": "0xc44b11f7", + "type": "function", + "signature": "function getConfiguration(address asset) view returns ((uint256 data))" + }, + "0x35ea6a75": { + "selector": "0x35ea6a75", + "type": "function", + "signature": "function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id))" + }, + "0xd15e0053": { + "selector": "0xd15e0053", + "type": "function", + "signature": "function getReserveNormalizedIncome(address asset) view returns (uint256)" + }, + "0x386497fd": { + "selector": "0x386497fd", + "type": "function", + "signature": "function getReserveNormalizedVariableDebt(address asset) view returns (uint256)" + }, + "0xd1946dbc": { + "selector": "0xd1946dbc", + "type": "function", + "signature": "function getReservesList() view returns (address[])" + }, + "0xbf92857c": { + "selector": "0xbf92857c", + "type": "function", + "signature": "function getUserAccountData(address user) view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)" + }, + "0x4417a583": { + "selector": "0x4417a583", + "type": "function", + "signature": "function getUserConfiguration(address user) view returns ((uint256 data))" + }, + "0x7a708e92": { + "selector": "0x7a708e92", + "type": "function", + "signature": "function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress)" + }, + "0xc4d66de8": { + "selector": "0xc4d66de8", + "type": "function", + "signature": "function initialize(address provider)" + }, + "0x00a718a9": { + "selector": "0x00a718a9", + "type": "function", + "signature": "function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)" + }, + "0x5c975abb": { + "selector": "0x5c975abb", + "type": "function", + "signature": "function paused() view returns (bool)" + }, + "0xcd112382": { + "selector": "0xcd112382", + "type": "function", + "signature": "function rebalanceStableBorrowRate(address asset, address user)" + }, + "0x573ade81": { + "selector": "0x573ade81", + "type": "function", + "signature": "function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)" + }, + "0xb8d29276": { + "selector": "0xb8d29276", + "type": "function", + "signature": "function setConfiguration(address asset, uint256 configuration)" + }, + "0xbedb86fb": { + "selector": "0xbedb86fb", + "type": "function", + "signature": "function setPause(bool val)" + }, + "0x1d2118f9": { + "selector": "0x1d2118f9", + "type": "function", + "signature": "function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)" + }, + "0x5a3b74b9": { + "selector": "0x5a3b74b9", + "type": "function", + "signature": "function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)" + }, + "0x94ba89a2": { + "selector": "0x94ba89a2", + "type": "function", + "signature": "function swapBorrowRateMode(address asset, uint256 rateMode)" + }, + "0x69328dec": { + "selector": "0x69328dec", + "type": "function", + "signature": "function withdraw(address asset, uint256 amount, address to) returns (uint256)" + } + }, + "AaveWethGatewayV2": { + "0xfd149529": { + "selector": "0xfd149529", + "type": "function", + "signature": "function authorizeLendingPool(address lendingPool)" + }, + "0x66514c97": { + "selector": "0x66514c97", + "type": "function", + "signature": "function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)" + }, + "0x474cf53d": { + "selector": "0x474cf53d", + "type": "function", + "signature": "function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable" + }, + "0xeed88b8d": { + "selector": "0xeed88b8d", + "type": "function", + "signature": "function emergencyEtherTransfer(address to, uint256 amount)" + }, + "0xa3d5b255": { + "selector": "0xa3d5b255", + "type": "function", + "signature": "function emergencyTokenTransfer(address token, address to, uint256 amount)" + }, + "0xaffa8817": { + "selector": "0xaffa8817", + "type": "function", + "signature": "function getWETHAddress() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x02c5fcf8": { + "selector": "0x02c5fcf8", + "type": "function", + "signature": "function repayETH(address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf) payable" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x80500d20": { + "selector": "0x80500d20", + "type": "function", + "signature": "function withdrawETH(address lendingPool, uint256 amount, address to)" + } + }, + "AaveWrappedTokenGateway": { + "0x66514c97": { + "selector": "0x66514c97", + "type": "function", + "signature": "function borrowETH(address, uint256 amount, uint256 interestRateMode, uint16 referralCode)" + }, + "0x474cf53d": { + "selector": "0x474cf53d", + "type": "function", + "signature": "function depositETH(address, address onBehalfOf, uint16 referralCode) payable" + }, + "0xeed88b8d": { + "selector": "0xeed88b8d", + "type": "function", + "signature": "function emergencyEtherTransfer(address to, uint256 amount)" + }, + "0xa3d5b255": { + "selector": "0xa3d5b255", + "type": "function", + "signature": "function emergencyTokenTransfer(address token, address to, uint256 amount)" + }, + "0xaffa8817": { + "selector": "0xaffa8817", + "type": "function", + "signature": "function getWETHAddress() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x02c5fcf8": { + "selector": "0x02c5fcf8", + "type": "function", + "signature": "function repayETH(address, uint256 amount, uint256 rateMode, address onBehalfOf) payable" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x80500d20": { + "selector": "0x80500d20", + "type": "function", + "signature": "function withdrawETH(address, uint256 amount, address to)" + }, + "0xd4c40b6c": { + "selector": "0xd4c40b6c", + "type": "function", + "signature": "function withdrawETHWithPermit(address, uint256 amount, address to, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)" + } + }, + "AavePoolV3": { + "0xf851a440": { + "selector": "0xf851a440", + "type": "function", + "signature": "function admin() returns (address)" + }, + "0x5c60da1b": { + "selector": "0x5c60da1b", + "type": "function", + "signature": "function implementation() returns (address)" + }, + "0xd1f57894": { + "selector": "0xd1f57894", + "type": "function", + "signature": "function initialize(address _logic, bytes _data) payable" + }, + "0x3659cfe6": { + "selector": "0x3659cfe6", + "type": "function", + "signature": "function upgradeTo(address newImplementation)" + }, + "0x4f1ef286": { + "selector": "0x4f1ef286", + "type": "function", + "signature": "function upgradeToAndCall(address newImplementation, bytes data) payable" + } + }, + "AavePool": { + "0xf851a440": { + "selector": "0xf851a440", + "type": "function", + "signature": "function admin() returns (address)" + }, + "0x5c60da1b": { + "selector": "0x5c60da1b", + "type": "function", + "signature": "function implementation() returns (address)" + }, + "0xd1f57894": { + "selector": "0xd1f57894", + "type": "function", + "signature": "function initialize(address _logic, bytes _data) payable" + }, + "0x3659cfe6": { + "selector": "0x3659cfe6", + "type": "function", + "signature": "function upgradeTo(address newImplementation)" + }, + "0x4f1ef286": { + "selector": "0x4f1ef286", + "type": "function", + "signature": "function upgradeToAndCall(address newImplementation, bytes data) payable" + } + }, + "AaveWETHGateway": { + "0x66514c97": { + "selector": "0x66514c97", + "type": "function", + "signature": "function borrowETH(address, uint256 amount, uint256 interesRateMode, uint16 referralCode)" + }, + "0x474cf53d": { + "selector": "0x474cf53d", + "type": "function", + "signature": "function depositETH(address, address onBehalfOf, uint16 referralCode) payable" + }, + "0xeed88b8d": { + "selector": "0xeed88b8d", + "type": "function", + "signature": "function emergencyEtherTransfer(address to, uint256 amount)" + }, + "0xa3d5b255": { + "selector": "0xa3d5b255", + "type": "function", + "signature": "function emergencyTokenTransfer(address token, address to, uint256 amount)" + }, + "0x026b1d5f": { + "selector": "0x026b1d5f", + "type": "function", + "signature": "function getPool() view returns (address)" + }, + "0xaffa8817": { + "selector": "0xaffa8817", + "type": "function", + "signature": "function getWETHAddress() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x02c5fcf8": { + "selector": "0x02c5fcf8", + "type": "function", + "signature": "function repayETH(address, uint256 amount, uint256 rateMode, address onBehalfOf) payable" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x80500d20": { + "selector": "0x80500d20", + "type": "function", + "signature": "function withdrawETH(address, uint256 amount, address to)" + }, + "0xd4c40b6c": { + "selector": "0xd4c40b6c", + "type": "function", + "signature": "function withdrawETHWithPermit(address, uint256 amount, address to, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)" + } + }, + "BalancerCore": { + "0xad5c4648": { + "selector": "0xad5c4648", + "type": "function", + "signature": "function WETH() view returns (address)" + }, + "0x945bcec9": { + "selector": "0x945bcec9", + "type": "function", + "signature": "function batchSwap(uint8 kind, (bytes32 poolId, uint256 assetInIndex, uint256 assetOutIndex, uint256 amount, bytes userData)[] swaps, address[] assets, (address sender, bool fromInternalBalance, address recipient, bool toInternalBalance) funds, int256[] limits, uint256 deadline) payable returns (int256[] assetDeltas)" + }, + "0x7d3aeb96": { + "selector": "0x7d3aeb96", + "type": "function", + "signature": "function deregisterTokens(bytes32 poolId, address[] tokens)" + }, + "0x8bdb3913": { + "selector": "0x8bdb3913", + "type": "function", + "signature": "function exitPool(bytes32 poolId, address sender, address recipient, (address[] assets, uint256[] minAmountsOut, bytes userData, bool toInternalBalance) request)" + }, + "0x5c38449e": { + "selector": "0x5c38449e", + "type": "function", + "signature": "function flashLoan(address recipient, address[] tokens, uint256[] amounts, bytes userData)" + }, + "0x851c1bb3": { + "selector": "0x851c1bb3", + "type": "function", + "signature": "function getActionId(bytes4 selector) view returns (bytes32)" + }, + "0xaaabadc5": { + "selector": "0xaaabadc5", + "type": "function", + "signature": "function getAuthorizer() view returns (address)" + }, + "0xed24911d": { + "selector": "0xed24911d", + "type": "function", + "signature": "function getDomainSeparator() view returns (bytes32)" + }, + "0x0f5a6efa": { + "selector": "0x0f5a6efa", + "type": "function", + "signature": "function getInternalBalance(address user, address[] tokens) view returns (uint256[] balances)" + }, + "0x90193b7c": { + "selector": "0x90193b7c", + "type": "function", + "signature": "function getNextNonce(address user) view returns (uint256)" + }, + "0x1c0de051": { + "selector": "0x1c0de051", + "type": "function", + "signature": "function getPausedState() view returns (bool paused, uint256 pauseWindowEndTime, uint256 bufferPeriodEndTime)" + }, + "0xf6c00927": { + "selector": "0xf6c00927", + "type": "function", + "signature": "function getPool(bytes32 poolId) view returns (address, uint8)" + }, + "0xb05f8e48": { + "selector": "0xb05f8e48", + "type": "function", + "signature": "function getPoolTokenInfo(bytes32 poolId, address token) view returns (uint256 cash, uint256 managed, uint256 lastChangeBlock, address assetManager)" + }, + "0xf94d4668": { + "selector": "0xf94d4668", + "type": "function", + "signature": "function getPoolTokens(bytes32 poolId) view returns (address[] tokens, uint256[] balances, uint256 lastChangeBlock)" + }, + "0xd2946c2b": { + "selector": "0xd2946c2b", + "type": "function", + "signature": "function getProtocolFeesCollector() view returns (address)" + }, + "0xfec90d72": { + "selector": "0xfec90d72", + "type": "function", + "signature": "function hasApprovedRelayer(address user, address relayer) view returns (bool)" + }, + "0xb95cac28": { + "selector": "0xb95cac28", + "type": "function", + "signature": "function joinPool(bytes32 poolId, address sender, address recipient, (address[] assets, uint256[] maxAmountsIn, bytes userData, bool fromInternalBalance) request) payable" + }, + "0xe6c46092": { + "selector": "0xe6c46092", + "type": "function", + "signature": "function managePoolBalance((uint8 kind, bytes32 poolId, address token, uint256 amount)[] ops)" + }, + "0x0e8e3e84": { + "selector": "0x0e8e3e84", + "type": "function", + "signature": "function manageUserBalance((uint8 kind, address asset, uint256 amount, address sender, address recipient)[] ops) payable" + }, + "0xf84d066e": { + "selector": "0xf84d066e", + "type": "function", + "signature": "function queryBatchSwap(uint8 kind, (bytes32 poolId, uint256 assetInIndex, uint256 assetOutIndex, uint256 amount, bytes userData)[] swaps, address[] assets, (address sender, bool fromInternalBalance, address recipient, bool toInternalBalance) funds) returns (int256[])" + }, + "0x09b2760f": { + "selector": "0x09b2760f", + "type": "function", + "signature": "function registerPool(uint8 specialization) returns (bytes32)" + }, + "0x66a9c7d2": { + "selector": "0x66a9c7d2", + "type": "function", + "signature": "function registerTokens(bytes32 poolId, address[] tokens, address[] assetManagers)" + }, + "0x058a628f": { + "selector": "0x058a628f", + "type": "function", + "signature": "function setAuthorizer(address newAuthorizer)" + }, + "0x16c38b3c": { + "selector": "0x16c38b3c", + "type": "function", + "signature": "function setPaused(bool paused)" + }, + "0xfa6e671d": { + "selector": "0xfa6e671d", + "type": "function", + "signature": "function setRelayerApproval(address sender, address relayer, bool approved)" + }, + "0x52bbbe29": { + "selector": "0x52bbbe29", + "type": "function", + "signature": "function swap((bytes32 poolId, uint8 kind, address assetIn, address assetOut, uint256 amount, bytes userData) singleSwap, (address sender, bool fromInternalBalance, address recipient, bool toInternalBalance) funds, uint256 limit, uint256 deadline) payable returns (uint256 amountCalculated)" + } + }, + "StakeWiseETH2": { + "0xf851a440": { + "selector": "0xf851a440", + "type": "function", + "signature": "function admin() returns (address)" + }, + "0x8f283970": { + "selector": "0x8f283970", + "type": "function", + "signature": "function changeAdmin(address newAdmin)" + }, + "0x5c60da1b": { + "selector": "0x5c60da1b", + "type": "function", + "signature": "function implementation() returns (address)" + }, + "0x3659cfe6": { + "selector": "0x3659cfe6", + "type": "function", + "signature": "function upgradeTo(address newImplementation)" + }, + "0x4f1ef286": { + "selector": "0x4f1ef286", + "type": "function", + "signature": "function upgradeToAndCall(address newImplementation, bytes data) payable" + } + }, + "SiloRouterV2": { + "0x8164f842": { + "selector": "0x8164f842", + "type": "error", + "signature": "error ApprovalFailed()" + }, + "0xf27f64e4": { + "selector": "0xf27f64e4", + "type": "error", + "signature": "error ERC20TransferFailed()" + }, + "0x6d963f88": { + "selector": "0x6d963f88", + "type": "error", + "signature": "error EthTransferFailed()" + }, + "0x06cc02d1": { + "selector": "0x06cc02d1", + "type": "error", + "signature": "error InvalidSilo()" + }, + "0x02549074": { + "selector": "0x02549074", + "type": "error", + "signature": "error InvalidSiloRepository()" + }, + "0x73d39f9d": { + "selector": "0x73d39f9d", + "type": "error", + "signature": "error TokenIsNotAContract()" + }, + "0x25e9714f": { + "selector": "0x25e9714f", + "type": "error", + "signature": "error UnsupportedAction()" + }, + "0x4e1028ba": { + "selector": "0x4e1028ba", + "type": "function", + "signature": "function execute((uint8 actionType, address silo, address asset, uint256 amount, bool collateralOnly)[] _actions) payable" + }, + "0xbde12718": { + "selector": "0xbde12718", + "type": "function", + "signature": "function siloRepository() view returns (address)" + }, + "0x25d5bf4e": { + "selector": "0x25d5bf4e", + "type": "function", + "signature": "function siloRouterPing() pure returns (bytes4)" + }, + "0x17fcb39b": { + "selector": "0x17fcb39b", + "type": "function", + "signature": "function wrappedNativeToken() view returns (address)" + } + }, + "SiloLlamaRouter": { + "0x8164f842": { + "selector": "0x8164f842", + "type": "error", + "signature": "error ApprovalFailed()" + }, + "0xf27f64e4": { + "selector": "0xf27f64e4", + "type": "error", + "signature": "error ERC20TransferFailed()" + }, + "0x6d963f88": { + "selector": "0x6d963f88", + "type": "error", + "signature": "error EthTransferFailed()" + }, + "0x06cc02d1": { + "selector": "0x06cc02d1", + "type": "error", + "signature": "error InvalidSilo()" + }, + "0x02549074": { + "selector": "0x02549074", + "type": "error", + "signature": "error InvalidSiloRepository()" + }, + "0x73d39f9d": { + "selector": "0x73d39f9d", + "type": "error", + "signature": "error TokenIsNotAContract()" + }, + "0x25e9714f": { + "selector": "0x25e9714f", + "type": "error", + "signature": "error UnsupportedAction()" + }, + "0x4e1028ba": { + "selector": "0x4e1028ba", + "type": "function", + "signature": "function execute((uint8 actionType, address silo, address asset, uint256 amount, bool collateralOnly)[] _actions) payable" + }, + "0xbde12718": { + "selector": "0xbde12718", + "type": "function", + "signature": "function siloRepository() view returns (address)" + }, + "0x25d5bf4e": { + "selector": "0x25d5bf4e", + "type": "function", + "signature": "function siloRouterPing() pure returns (bytes4)" + }, + "0x17fcb39b": { + "selector": "0x17fcb39b", + "type": "function", + "signature": "function wrappedNativeToken() view returns (address)" + } + }, + "SiloRouter": { + "0x8164f842": { + "selector": "0x8164f842", + "type": "error", + "signature": "error ApprovalFailed()" + }, + "0xf27f64e4": { + "selector": "0xf27f64e4", + "type": "error", + "signature": "error ERC20TransferFailed()" + }, + "0x6d963f88": { + "selector": "0x6d963f88", + "type": "error", + "signature": "error EthTransferFailed()" + }, + "0x06cc02d1": { + "selector": "0x06cc02d1", + "type": "error", + "signature": "error InvalidSilo()" + }, + "0x02549074": { + "selector": "0x02549074", + "type": "error", + "signature": "error InvalidSiloRepository()" + }, + "0x73d39f9d": { + "selector": "0x73d39f9d", + "type": "error", + "signature": "error TokenIsNotAContract()" + }, + "0x25e9714f": { + "selector": "0x25e9714f", + "type": "error", + "signature": "error UnsupportedAction()" + }, + "0x4e1028ba": { + "selector": "0x4e1028ba", + "type": "function", + "signature": "function execute((uint8 actionType, address silo, address asset, uint256 amount, bool collateralOnly)[] _actions) payable" + }, + "0xbde12718": { + "selector": "0xbde12718", + "type": "function", + "signature": "function siloRepository() view returns (address)" + }, + "0x25d5bf4e": { + "selector": "0x25d5bf4e", + "type": "function", + "signature": "function siloRouterPing() pure returns (bytes4)" + }, + "0x17fcb39b": { + "selector": "0x17fcb39b", + "type": "function", + "signature": "function wrappedNativeToken() view returns (address)" + } + }, + "MovrRouter": { + "0x02a9c051": { + "selector": "0x02a9c051", + "type": "function", + "signature": "function addRoutes((address route, bool isEnabled, bool isMiddleware)[] _routes) returns (uint256[])" + }, + "0xffcdf4ed": { + "selector": "0xffcdf4ed", + "type": "function", + "signature": "function disableRoute(uint256 _routeId)" + }, + "0xa44bbb15": { + "selector": "0xa44bbb15", + "type": "function", + "signature": "function outboundTransferTo((address receiverAddress, uint256 toChainId, uint256 amount, (uint256 id, uint256 optionalNativeAmount, address inputToken, bytes data) middlewareRequest, (uint256 id, uint256 optionalNativeAmount, address inputToken, bytes data) bridgeRequest) _userRequest) payable" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x6ccae054": { + "selector": "0x6ccae054", + "type": "function", + "signature": "function rescueFunds(address _token, address _receiverAddress, uint256 _amount)" + }, + "0x726f16d8": { + "selector": "0x726f16d8", + "type": "function", + "signature": "function routes(uint256) view returns (address route, bool isEnabled, bool isMiddleware)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "MovrAnyswap": { + "0x022490c8": { + "selector": "0x022490c8", + "type": "function", + "signature": "function outboundTransferTo(uint256 _amount, address _from, address _to, address _token, uint256 _toChainId, bytes _data)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x7b103999": { + "selector": "0x7b103999", + "type": "function", + "signature": "function registry() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x6ccae054": { + "selector": "0x6ccae054", + "type": "function", + "signature": "function rescueFunds(address token, address userAddress, uint256 amount)" + }, + "0xf887ea40": { + "selector": "0xf887ea40", + "type": "function", + "signature": "function router() view returns (address)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0xc57a8825": { + "selector": "0xc57a8825", + "type": "function", + "signature": "function updateRegistryAddress(address newRegistry)" + } + }, + "ERC721": { + "0x607e20e3": { + "selector": "0x607e20e3", + "type": "function", + "signature": "function BAYC_PROVENANCE() view returns (string)" + }, + "0xbb8a16bd": { + "selector": "0xbb8a16bd", + "type": "function", + "signature": "function MAX_APES() view returns (uint256)" + }, + "0x18e20a38": { + "selector": "0x18e20a38", + "type": "function", + "signature": "function REVEAL_TIMESTAMP() view returns (uint256)" + }, + "0x7a3f451e": { + "selector": "0x7a3f451e", + "type": "function", + "signature": "function apePrice() view returns (uint256)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address to, uint256 tokenId)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address owner) view returns (uint256)" + }, + "0x6c0360eb": { + "selector": "0x6c0360eb", + "type": "function", + "signature": "function baseURI() view returns (string)" + }, + "0x7d17fcbe": { + "selector": "0x7d17fcbe", + "type": "function", + "signature": "function emergencySetStartingIndexBlock()" + }, + "0x34918dfd": { + "selector": "0x34918dfd", + "type": "function", + "signature": "function flipSaleState()" + }, + "0x081812fc": { + "selector": "0x081812fc", + "type": "function", + "signature": "function getApproved(uint256 tokenId) view returns (address)" + }, + "0xe985e9c5": { + "selector": "0xe985e9c5", + "type": "function", + "signature": "function isApprovedForAll(address owner, address operator) view returns (bool)" + }, + "0x571dff3b": { + "selector": "0x571dff3b", + "type": "function", + "signature": "function maxApePurchase() view returns (uint256)" + }, + "0xa723533e": { + "selector": "0xa723533e", + "type": "function", + "signature": "function mintApe(uint256 numberOfTokens) payable" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x6352211e": { + "selector": "0x6352211e", + "type": "function", + "signature": "function ownerOf(uint256 tokenId) view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0xb0f67427": { + "selector": "0xb0f67427", + "type": "function", + "signature": "function reserveApes()" + }, + "0x42842e0e": { + "selector": "0x42842e0e", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId)" + }, + "0xb88d4fde": { + "selector": "0xb88d4fde", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)" + }, + "0xeb8d2444": { + "selector": "0xeb8d2444", + "type": "function", + "signature": "function saleIsActive() view returns (bool)" + }, + "0xa22cb465": { + "selector": "0xa22cb465", + "type": "function", + "signature": "function setApprovalForAll(address operator, bool approved)" + }, + "0x55f804b3": { + "selector": "0x55f804b3", + "type": "function", + "signature": "function setBaseURI(string baseURI)" + }, + "0x10969523": { + "selector": "0x10969523", + "type": "function", + "signature": "function setProvenanceHash(string provenanceHash)" + }, + "0x018a2c37": { + "selector": "0x018a2c37", + "type": "function", + "signature": "function setRevealTimestamp(uint256 revealTimeStamp)" + }, + "0xe9866550": { + "selector": "0xe9866550", + "type": "function", + "signature": "function setStartingIndex()" + }, + "0xcb774d47": { + "selector": "0xcb774d47", + "type": "function", + "signature": "function startingIndex() view returns (uint256)" + }, + "0xe36d6498": { + "selector": "0xe36d6498", + "type": "function", + "signature": "function startingIndexBlock() view returns (uint256)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0x4f6ccce7": { + "selector": "0x4f6ccce7", + "type": "function", + "signature": "function tokenByIndex(uint256 index) view returns (uint256)" + }, + "0x2f745c59": { + "selector": "0x2f745c59", + "type": "function", + "signature": "function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)" + }, + "0xc87b56dd": { + "selector": "0xc87b56dd", + "type": "function", + "signature": "function tokenURI(uint256 tokenId) view returns (string)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address from, address to, uint256 tokenId)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x3ccfd60b": { + "selector": "0x3ccfd60b", + "type": "function", + "signature": "function withdraw()" + } + }, + "YearnVault": { + "0x83b43589": { + "selector": "0x83b43589", + "type": "function", + "signature": "function initialize(address token, address governance, address rewards, string nameOverride, string symbolOverride)" + }, + "0xa5b81fdf": { + "selector": "0xa5b81fdf", + "type": "function", + "signature": "function initialize(address token, address governance, address rewards, string nameOverride, string symbolOverride, address guardian)" + }, + "0x538baeab": { + "selector": "0x538baeab", + "type": "function", + "signature": "function initialize(address token, address governance, address rewards, string nameOverride, string symbolOverride, address guardian, address management)" + }, + "0x25829410": { + "selector": "0x25829410", + "type": "function", + "signature": "function apiVersion() pure returns (string)" + }, + "0xc47f0027": { + "selector": "0xc47f0027", + "type": "function", + "signature": "function setName(string name)" + }, + "0xb84c8246": { + "selector": "0xb84c8246", + "type": "function", + "signature": "function setSymbol(string symbol)" + }, + "0xab033ea9": { + "selector": "0xab033ea9", + "type": "function", + "signature": "function setGovernance(address governance)" + }, + "0x238efcbc": { + "selector": "0x238efcbc", + "type": "function", + "signature": "function acceptGovernance()" + }, + "0xd4a22bde": { + "selector": "0xd4a22bde", + "type": "function", + "signature": "function setManagement(address management)" + }, + "0xec38a862": { + "selector": "0xec38a862", + "type": "function", + "signature": "function setRewards(address rewards)" + }, + "0x7a550365": { + "selector": "0x7a550365", + "type": "function", + "signature": "function setLockedProfitDegradation(uint256 degradation)" + }, + "0xbdc8144b": { + "selector": "0xbdc8144b", + "type": "function", + "signature": "function setDepositLimit(uint256 limit)" + }, + "0x70897b23": { + "selector": "0x70897b23", + "type": "function", + "signature": "function setPerformanceFee(uint256 fee)" + }, + "0xfe56e232": { + "selector": "0xfe56e232", + "type": "function", + "signature": "function setManagementFee(uint256 fee)" + }, + "0x8a0dac4a": { + "selector": "0x8a0dac4a", + "type": "function", + "signature": "function setGuardian(address guardian)" + }, + "0x14c64402": { + "selector": "0x14c64402", + "type": "function", + "signature": "function setEmergencyShutdown(bool active)" + }, + "0x94148415": { + "selector": "0x94148415", + "type": "function", + "signature": "function setWithdrawalQueue(address[20] queue)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address receiver, uint256 amount) returns (bool)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address sender, address receiver, uint256 amount) returns (bool)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address spender, uint256 amount) returns (bool)" + }, + "0x39509351": { + "selector": "0x39509351", + "type": "function", + "signature": "function increaseAllowance(address spender, uint256 amount) returns (bool)" + }, + "0xa457c2d7": { + "selector": "0xa457c2d7", + "type": "function", + "signature": "function decreaseAllowance(address spender, uint256 amount) returns (bool)" + }, + "0x9fd5a6cf": { + "selector": "0x9fd5a6cf", + "type": "function", + "signature": "function permit(address owner, address spender, uint256 amount, uint256 expiry, bytes signature) returns (bool)" + }, + "0x01e1d114": { + "selector": "0x01e1d114", + "type": "function", + "signature": "function totalAssets() view returns (uint256)" + }, + "0xd0e30db0": { + "selector": "0xd0e30db0", + "type": "function", + "signature": "function deposit() returns (uint256)" + }, + "0xb6b55f25": { + "selector": "0xb6b55f25", + "type": "function", + "signature": "function deposit(uint256 _amount) returns (uint256)" + }, + "0x6e553f65": { + "selector": "0x6e553f65", + "type": "function", + "signature": "function deposit(uint256 _amount, address recipient) returns (uint256)" + }, + "0x75de2902": { + "selector": "0x75de2902", + "type": "function", + "signature": "function maxAvailableShares() view returns (uint256)" + }, + "0x3ccfd60b": { + "selector": "0x3ccfd60b", + "type": "function", + "signature": "function withdraw() returns (uint256)" + }, + "0x2e1a7d4d": { + "selector": "0x2e1a7d4d", + "type": "function", + "signature": "function withdraw(uint256 maxShares) returns (uint256)" + }, + "0x00f714ce": { + "selector": "0x00f714ce", + "type": "function", + "signature": "function withdraw(uint256 maxShares, address recipient) returns (uint256)" + }, + "0xe63697c8": { + "selector": "0xe63697c8", + "type": "function", + "signature": "function withdraw(uint256 maxShares, address recipient, uint256 maxLoss) returns (uint256)" + }, + "0x99530b06": { + "selector": "0x99530b06", + "type": "function", + "signature": "function pricePerShare() view returns (uint256)" + }, + "0x14b4e26e": { + "selector": "0x14b4e26e", + "type": "function", + "signature": "function addStrategy(address strategy, uint256 debtRatio, uint256 minDebtPerHarvest, uint256 maxDebtPerHarvest, uint256 performanceFee)" + }, + "0x7c6a4f24": { + "selector": "0x7c6a4f24", + "type": "function", + "signature": "function updateStrategyDebtRatio(address strategy, uint256 debtRatio)" + }, + "0xe722befe": { + "selector": "0xe722befe", + "type": "function", + "signature": "function updateStrategyMinDebtPerHarvest(address strategy, uint256 minDebtPerHarvest)" + }, + "0x4757a156": { + "selector": "0x4757a156", + "type": "function", + "signature": "function updateStrategyMaxDebtPerHarvest(address strategy, uint256 maxDebtPerHarvest)" + }, + "0xd0194ed6": { + "selector": "0xd0194ed6", + "type": "function", + "signature": "function updateStrategyPerformanceFee(address strategy, uint256 performanceFee)" + }, + "0x6cb56d19": { + "selector": "0x6cb56d19", + "type": "function", + "signature": "function migrateStrategy(address oldVersion, address newVersion)" + }, + "0xa0e4af9a": { + "selector": "0xa0e4af9a", + "type": "function", + "signature": "function revokeStrategy()" + }, + "0xbb994d48": { + "selector": "0xbb994d48", + "type": "function", + "signature": "function revokeStrategy(address strategy)" + }, + "0xf76e4caa": { + "selector": "0xf76e4caa", + "type": "function", + "signature": "function addStrategyToQueue(address strategy)" + }, + "0xb22439f5": { + "selector": "0xb22439f5", + "type": "function", + "signature": "function removeStrategyFromQueue(address strategy)" + }, + "0xbf3759b5": { + "selector": "0xbf3759b5", + "type": "function", + "signature": "function debtOutstanding() view returns (uint256)" + }, + "0xbdcf36bb": { + "selector": "0xbdcf36bb", + "type": "function", + "signature": "function debtOutstanding(address strategy) view returns (uint256)" + }, + "0x112c1f9b": { + "selector": "0x112c1f9b", + "type": "function", + "signature": "function creditAvailable() view returns (uint256)" + }, + "0xd7648013": { + "selector": "0xd7648013", + "type": "function", + "signature": "function creditAvailable(address strategy) view returns (uint256)" + }, + "0x153c27c4": { + "selector": "0x153c27c4", + "type": "function", + "signature": "function availableDepositLimit() view returns (uint256)" + }, + "0xd3406abd": { + "selector": "0xd3406abd", + "type": "function", + "signature": "function expectedReturn() view returns (uint256)" + }, + "0x33586b67": { + "selector": "0x33586b67", + "type": "function", + "signature": "function expectedReturn(address strategy) view returns (uint256)" + }, + "0xa1d9bafc": { + "selector": "0xa1d9bafc", + "type": "function", + "signature": "function report(uint256 gain, uint256 loss, uint256 _debtPayment) returns (uint256)" + }, + "0x01681a62": { + "selector": "0x01681a62", + "type": "function", + "signature": "function sweep(address token)" + }, + "0x6ea056a9": { + "selector": "0x6ea056a9", + "type": "function", + "signature": "function sweep(address token, uint256 amount)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() view returns (uint256)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address arg0) view returns (uint256)" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address arg0, address arg1) view returns (uint256)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0xfc0c546a": { + "selector": "0xfc0c546a", + "type": "function", + "signature": "function token() view returns (address)" + }, + "0x5aa6e675": { + "selector": "0x5aa6e675", + "type": "function", + "signature": "function governance() view returns (address)" + }, + "0x88a8d602": { + "selector": "0x88a8d602", + "type": "function", + "signature": "function management() view returns (address)" + }, + "0x452a9320": { + "selector": "0x452a9320", + "type": "function", + "signature": "function guardian() view returns (address)" + }, + "0x39ebf823": { + "selector": "0x39ebf823", + "type": "function", + "signature": "function strategies(address arg0) view returns (uint256 performanceFee, uint256 activation, uint256 debtRatio, uint256 minDebtPerHarvest, uint256 maxDebtPerHarvest, uint256 lastReport, uint256 totalDebt, uint256 totalGain, uint256 totalLoss)" + }, + "0xc822adda": { + "selector": "0xc822adda", + "type": "function", + "signature": "function withdrawalQueue(uint256 arg0) view returns (address)" + }, + "0x3403c2fc": { + "selector": "0x3403c2fc", + "type": "function", + "signature": "function emergencyShutdown() view returns (bool)" + }, + "0xecf70858": { + "selector": "0xecf70858", + "type": "function", + "signature": "function depositLimit() view returns (uint256)" + }, + "0xcea55f57": { + "selector": "0xcea55f57", + "type": "function", + "signature": "function debtRatio() view returns (uint256)" + }, + "0xfc7b9c18": { + "selector": "0xfc7b9c18", + "type": "function", + "signature": "function totalDebt() view returns (uint256)" + }, + "0xc3535b52": { + "selector": "0xc3535b52", + "type": "function", + "signature": "function lastReport() view returns (uint256)" + }, + "0x3629c8de": { + "selector": "0x3629c8de", + "type": "function", + "signature": "function activation() view returns (uint256)" + }, + "0x44b81396": { + "selector": "0x44b81396", + "type": "function", + "signature": "function lockedProfit() view returns (uint256)" + }, + "0x42232716": { + "selector": "0x42232716", + "type": "function", + "signature": "function lockedProfitDegradation() view returns (uint256)" + }, + "0x9ec5a894": { + "selector": "0x9ec5a894", + "type": "function", + "signature": "function rewards() view returns (address)" + }, + "0xa6f7f5d6": { + "selector": "0xa6f7f5d6", + "type": "function", + "signature": "function managementFee() view returns (uint256)" + }, + "0x87788782": { + "selector": "0x87788782", + "type": "function", + "signature": "function performanceFee() view returns (uint256)" + }, + "0x7ecebe00": { + "selector": "0x7ecebe00", + "type": "function", + "signature": "function nonces(address arg0) view returns (uint256)" + }, + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + } + }, + "IdentityFactory": { + "0x1ce6236f": { + "selector": "0x1ce6236f", + "type": "function", + "signature": "function allowedToDrain() view returns (address)" + }, + "0x9c4ae2d0": { + "selector": "0x9c4ae2d0", + "type": "function", + "signature": "function deploy(bytes code, uint256 salt)" + }, + "0x49c81579": { + "selector": "0x49c81579", + "type": "function", + "signature": "function deployAndCall(bytes code, uint256 salt, address callee, bytes data)" + }, + "0x1e86da2a": { + "selector": "0x1e86da2a", + "type": "function", + "signature": "function deployAndExecute(bytes code, uint256 salt, (address to, uint256 value, bytes data)[] txns, bytes signature)" + }, + "0xd9caed12": { + "selector": "0xd9caed12", + "type": "function", + "signature": "function withdraw(address token, address to, uint256 tokenAmount)" + } + }, + "Batcher": { + "0x86df7292": { + "selector": "0x86df7292", + "type": "function", + "signature": "function batchCall((address to, uint256 value, bytes data)[] txns)" + } + }, + "StakingPool": { + "0xc066f75e": { + "selector": "0xc066f75e", + "type": "function", + "signature": "function ADXToken() view returns (address)" + }, + "0xb6dcaf65": { + "selector": "0xb6dcaf65", + "type": "function", + "signature": "function ADXUSDOracle() view returns (address)" + }, + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + }, + "0x30adf81f": { + "selector": "0x30adf81f", + "type": "function", + "signature": "function PERMIT_TYPEHASH() view returns (bytes32)" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address owner, address spender) view returns (uint256 remaining)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address spender, uint256 amount) returns (bool success)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address owner) view returns (uint256 balance)" + }, + "0x996cba68": { + "selector": "0x996cba68", + "type": "function", + "signature": "function claim(address tokenOut, address to, uint256 amount)" + }, + "0x839df945": { + "selector": "0x839df945", + "type": "function", + "signature": "function commitments(bytes32) view returns (uint256)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() view returns (uint8)" + }, + "0xa59f3e0c": { + "selector": "0xa59f3e0c", + "type": "function", + "signature": "function enter(uint256 amount)" + }, + "0xf893d346": { + "selector": "0xf893d346", + "type": "function", + "signature": "function enterTo(address recipient, uint256 amount)" + }, + "0x5aa6e675": { + "selector": "0x5aa6e675", + "type": "function", + "signature": "function governance() view returns (address)" + }, + "0x452a9320": { + "selector": "0x452a9320", + "type": "function", + "signature": "function guardian() view returns (address)" + }, + "0x9b4ee064": { + "selector": "0x9b4ee064", + "type": "function", + "signature": "function leave(uint256 shares, bool skipMint)" + }, + "0x1322ed44": { + "selector": "0x1322ed44", + "type": "function", + "signature": "function limitLastReset() view returns (uint256)" + }, + "0xc6257b4c": { + "selector": "0xc6257b4c", + "type": "function", + "signature": "function limitRemaining() view returns (uint256)" + }, + "0xe336ac44": { + "selector": "0xe336ac44", + "type": "function", + "signature": "function lockedShares(address) view returns (uint256)" + }, + "0x2017422d": { + "selector": "0x2017422d", + "type": "function", + "signature": "function maxDailyPenaltiesPromilles() view returns (uint256)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x7ecebe00": { + "selector": "0x7ecebe00", + "type": "function", + "signature": "function nonces(address) view returns (uint256)" + }, + "0xc7f9218a": { + "selector": "0xc7f9218a", + "type": "function", + "signature": "function penalize(uint256 adxAmount)" + }, + "0xd505accf": { + "selector": "0xd505accf", + "type": "function", + "signature": "function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)" + }, + "0x8a07b419": { + "selector": "0x8a07b419", + "type": "function", + "signature": "function rageLeave(uint256 shares, bool skipMint)" + }, + "0x6e6eff3e": { + "selector": "0x6e6eff3e", + "type": "function", + "signature": "function rageReceivedPromilles() view returns (uint256)" + }, + "0x82734027": { + "selector": "0x82734027", + "type": "function", + "signature": "function setDailyPenaltyMax(uint256 max)" + }, + "0xab033ea9": { + "selector": "0xab033ea9", + "type": "function", + "signature": "function setGovernance(address addr)" + }, + "0x8a0dac4a": { + "selector": "0x8a0dac4a", + "type": "function", + "signature": "function setGuardian(address newGuardian)" + }, + "0x070141c1": { + "selector": "0x070141c1", + "type": "function", + "signature": "function setRageReceived(uint256 rageReceived)" + }, + "0xc4911ee0": { + "selector": "0xc4911ee0", + "type": "function", + "signature": "function setTimeToUnbond(uint256 time)" + }, + "0x38156a97": { + "selector": "0x38156a97", + "type": "function", + "signature": "function setWhitelistedClaimToken(address token, bool whitelisted)" + }, + "0x447b15f4": { + "selector": "0x447b15f4", + "type": "function", + "signature": "function shareValue() view returns (uint256)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xadec4a50": { + "selector": "0xadec4a50", + "type": "function", + "signature": "function timeToUnbond() view returns (uint256)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address to, uint256 amount) returns (bool success)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address from, address to, uint256 amount) returns (bool success)" + }, + "0x8ec0a9eb": { + "selector": "0x8ec0a9eb", + "type": "function", + "signature": "function unbondingCommitmentWorth(address owner, uint256 shares, uint256 unlocksAt) view returns (uint256)" + }, + "0x2681f7e4": { + "selector": "0x2681f7e4", + "type": "function", + "signature": "function uniswap() view returns (address)" + }, + "0x3a5381b5": { + "selector": "0x3a5381b5", + "type": "function", + "signature": "function validator() view returns (address)" + }, + "0x72a3b8b3": { + "selector": "0x72a3b8b3", + "type": "function", + "signature": "function whitelistedClaimTokens(address) view returns (bool)" + }, + "0x33cfcd3b": { + "selector": "0x33cfcd3b", + "type": "function", + "signature": "function withdraw(uint256 shares, uint256 unlocksAt, bool skipMint)" + } + }, + "WyvernExchange": { + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x0eefdbad": { + "selector": "0x0eefdbad", + "type": "function", + "signature": "function tokenTransferProxy() view returns (address)" + }, + "0x10796a47": { + "selector": "0x10796a47", + "type": "function", + "signature": "function staticCall(address target, bytes calldata, bytes extradata) view returns (bool result)" + }, + "0x14350c24": { + "selector": "0x14350c24", + "type": "function", + "signature": "function changeMinimumMakerProtocolFee(uint256 newMinimumMakerProtocolFee)" + }, + "0x1a6b13e2": { + "selector": "0x1a6b13e2", + "type": "function", + "signature": "function changeMinimumTakerProtocolFee(uint256 newMinimumTakerProtocolFee)" + }, + "0x239e83df": { + "selector": "0x239e83df", + "type": "function", + "signature": "function guardedArrayReplace(bytes array, bytes desired, bytes mask) pure returns (bytes)" + }, + "0x28a8ee68": { + "selector": "0x28a8ee68", + "type": "function", + "signature": "function minimumTakerProtocolFee() view returns (uint256)" + }, + "0x31e63199": { + "selector": "0x31e63199", + "type": "function", + "signature": "function codename() view returns (string)" + }, + "0x3464af6a": { + "selector": "0x3464af6a", + "type": "function", + "signature": "function testCopyAddress(address addr) pure returns (bytes)" + }, + "0x3e1e292a": { + "selector": "0x3e1e292a", + "type": "function", + "signature": "function testCopy(bytes arrToCopy) pure returns (bytes)" + }, + "0x3f67ee0d": { + "selector": "0x3f67ee0d", + "type": "function", + "signature": "function calculateCurrentPrice_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata) view returns (uint256)" + }, + "0x514f0330": { + "selector": "0x514f0330", + "type": "function", + "signature": "function changeProtocolFeeRecipient(address newProtocolFeeRecipient)" + }, + "0x54fd4d50": { + "selector": "0x54fd4d50", + "type": "function", + "signature": "function version() view returns (string)" + }, + "0x562b2ebc": { + "selector": "0x562b2ebc", + "type": "function", + "signature": "function orderCalldataCanMatch(bytes buyCalldata, bytes buyReplacementPattern, bytes sellCalldata, bytes sellReplacementPattern) pure returns (bool)" + }, + "0x60bef33a": { + "selector": "0x60bef33a", + "type": "function", + "signature": "function validateOrder_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata, uint8 v, bytes32 r, bytes32 s) view returns (bool)" + }, + "0x63d36c0b": { + "selector": "0x63d36c0b", + "type": "function", + "signature": "function calculateFinalPrice(uint8 side, uint8 saleKind, uint256 basePrice, uint256 extra, uint256 listingTime, uint256 expirationTime) view returns (uint256)" + }, + "0x64df049e": { + "selector": "0x64df049e", + "type": "function", + "signature": "function protocolFeeRecipient() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x71d02b38": { + "selector": "0x71d02b38", + "type": "function", + "signature": "function hashOrder_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata) pure returns (bytes32)" + }, + "0x72593b4c": { + "selector": "0x72593b4c", + "type": "function", + "signature": "function ordersCanMatch_(address[14] addrs, uint256[18] uints, uint8[8] feeMethodsSidesKindsHowToCalls, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell) view returns (bool)" + }, + "0x79666868": { + "selector": "0x79666868", + "type": "function", + "signature": "function approveOrder_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata, bool orderbookInclusionDesired)" + }, + "0x7b103999": { + "selector": "0x7b103999", + "type": "function", + "signature": "function registry() view returns (address)" + }, + "0x7ccefc52": { + "selector": "0x7ccefc52", + "type": "function", + "signature": "function minimumMakerProtocolFee() view returns (uint256)" + }, + "0x7d766981": { + "selector": "0x7d766981", + "type": "function", + "signature": "function hashToSign_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata) pure returns (bytes32)" + }, + "0x8076f005": { + "selector": "0x8076f005", + "type": "function", + "signature": "function cancelledOrFinalized(bytes32) view returns (bool)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0xa25eb5d9": { + "selector": "0xa25eb5d9", + "type": "function", + "signature": "function exchangeToken() view returns (address)" + }, + "0xa8a41c70": { + "selector": "0xa8a41c70", + "type": "function", + "signature": "function cancelOrder_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata, uint8 v, bytes32 r, bytes32 s)" + }, + "0xab834bab": { + "selector": "0xab834bab", + "type": "function", + "signature": "function atomicMatch_(address[14] addrs, uint256[18] uints, uint8[8] feeMethodsSidesKindsHowToCalls, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell, uint8[2] vs, bytes32[5] rssMetadata) payable" + }, + "0xca595b9a": { + "selector": "0xca595b9a", + "type": "function", + "signature": "function validateOrderParameters_(address[7] addrs, uint256[9] uints, uint8 feeMethod, uint8 side, uint8 saleKind, uint8 howToCall, bytes calldata, bytes replacementPattern, bytes staticExtradata) view returns (bool)" + }, + "0xcae6047f": { + "selector": "0xcae6047f", + "type": "function", + "signature": "function INVERSE_BASIS_POINT() view returns (uint256)" + }, + "0xd537e131": { + "selector": "0xd537e131", + "type": "function", + "signature": "function calculateMatchPrice_(address[14] addrs, uint256[18] uints, uint8[8] feeMethodsSidesKindsHowToCalls, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell) view returns (uint256)" + }, + "0xe57d4adb": { + "selector": "0xe57d4adb", + "type": "function", + "signature": "function approvedOrders(bytes32) view returns (bool)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "OpenSeaDrop": { + "0x3f009769": { + "selector": "0x3f009769", + "type": "error", + "signature": "error CreatorPayoutAddressCannotBeZeroAddress()" + }, + "0x798701ac": { + "selector": "0x798701ac", + "type": "error", + "signature": "error DuplicateFeeRecipient()" + }, + "0xd48fd2e6": { + "selector": "0xd48fd2e6", + "type": "error", + "signature": "error DuplicatePayer()" + }, + "0x5136e8d5": { + "selector": "0x5136e8d5", + "type": "error", + "signature": "error FeeRecipientCannotBeZeroAddress()" + }, + "0xf477d26f": { + "selector": "0xf477d26f", + "type": "error", + "signature": "error FeeRecipientNotAllowed()" + }, + "0x0998fbbd": { + "selector": "0x0998fbbd", + "type": "error", + "signature": "error FeeRecipientNotPresent()" + }, + "0x0d35e921": { + "selector": "0x0d35e921", + "type": "error", + "signature": "error IncorrectPayment(uint256 got, uint256 want)" + }, + "0x3329f932": { + "selector": "0x3329f932", + "type": "error", + "signature": "error InvalidFeeBps(uint256 feeBps)" + }, + "0x09bde339": { + "selector": "0x09bde339", + "type": "error", + "signature": "error InvalidProof()" + }, + "0xd855c4f4": { + "selector": "0xd855c4f4", + "type": "error", + "signature": "error InvalidSignature(address recoveredSigner)" + }, + "0x6e1d357d": { + "selector": "0x6e1d357d", + "type": "error", + "signature": "error InvalidSignedEndTime(uint256 got, uint256 maximum)" + }, + "0x79fc44ed": { + "selector": "0x79fc44ed", + "type": "error", + "signature": "error InvalidSignedFeeBps(uint256 got, uint256 minimumOrMaximum)" + }, + "0x6d029c50": { + "selector": "0x6d029c50", + "type": "error", + "signature": "error InvalidSignedMaxTokenSupplyForStage(uint256 got, uint256 maximum)" + }, + "0x4f430578": { + "selector": "0x4f430578", + "type": "error", + "signature": "error InvalidSignedMaxTotalMintableByWallet(uint256 got, uint256 maximum)" + }, + "0xa0c3ed0a": { + "selector": "0xa0c3ed0a", + "type": "error", + "signature": "error InvalidSignedMintPrice(uint256 got, uint256 minimum)" + }, + "0x333d33d0": { + "selector": "0x333d33d0", + "type": "error", + "signature": "error InvalidSignedStartTime(uint256 got, uint256 minimum)" + }, + "0x198441cb": { + "selector": "0x198441cb", + "type": "error", + "signature": "error MintQuantityCannotBeZero()" + }, + "0xedc01273": { + "selector": "0xedc01273", + "type": "error", + "signature": "error MintQuantityExceedsMaxMintedPerWallet(uint256 total, uint256 allowed)" + }, + "0xe12d2314": { + "selector": "0xe12d2314", + "type": "error", + "signature": "error MintQuantityExceedsMaxSupply(uint256 total, uint256 maxSupply)" + }, + "0xb98dabea": { + "selector": "0xb98dabea", + "type": "error", + "signature": "error MintQuantityExceedsMaxTokenSupplyForStage(uint256 total, uint256 maxTokenSupplyForStage)" + }, + "0x13da22f2": { + "selector": "0x13da22f2", + "type": "error", + "signature": "error NotActive(uint256 currentTimestamp, uint256 startTimestamp, uint256 endTimestamp)" + }, + "0x32c5d8cf": { + "selector": "0x32c5d8cf", + "type": "error", + "signature": "error OnlyINonFungibleSeaDropToken(address sender)" + }, + "0xd34468bc": { + "selector": "0xd34468bc", + "type": "error", + "signature": "error PayerCannotBeZeroAddress()" + }, + "0x1fe7da08": { + "selector": "0x1fe7da08", + "type": "error", + "signature": "error PayerNotAllowed()" + }, + "0x4cc11713": { + "selector": "0x4cc11713", + "type": "error", + "signature": "error PayerNotPresent()" + }, + "0x900bb2c9": { + "selector": "0x900bb2c9", + "type": "error", + "signature": "error SignatureAlreadyUsed()" + }, + "0xdb8b2fad": { + "selector": "0xdb8b2fad", + "type": "error", + "signature": "error SignedMintsMustRestrictFeeRecipients()" + }, + "0xcfb6108a": { + "selector": "0xcfb6108a", + "type": "error", + "signature": "error SignerCannotBeZeroAddress()" + }, + "0xb40637e4": { + "selector": "0xb40637e4", + "type": "error", + "signature": "error SignerNotPresent()" + }, + "0x17817dd8": { + "selector": "0x17817dd8", + "type": "error", + "signature": "error TokenGatedDropAllowedNftTokenCannotBeDropToken()" + }, + "0x67156a2d": { + "selector": "0x67156a2d", + "type": "error", + "signature": "error TokenGatedDropAllowedNftTokenCannotBeZeroAddress()" + }, + "0x2b60a32f": { + "selector": "0x2b60a32f", + "type": "error", + "signature": "error TokenGatedDropStageNotPresent()" + }, + "0xda8c7bc7": { + "selector": "0xda8c7bc7", + "type": "error", + "signature": "error TokenGatedNotTokenOwner(address nftContract, address allowedNftToken, uint256 allowedNftTokenId)" + }, + "0xa93f299b": { + "selector": "0xa93f299b", + "type": "error", + "signature": "error TokenGatedTokenIdAlreadyRedeemed(address nftContract, address allowedNftToken, uint256 allowedNftTokenId)" + }, + "0x32bf11f5": { + "selector": "0x32bf11f5", + "type": "function", + "signature": "function getAllowListMerkleRoot(address nftContract) view returns (bytes32)" + }, + "0x68632274": { + "selector": "0x68632274", + "type": "function", + "signature": "function getAllowedFeeRecipients(address nftContract) view returns (address[])" + }, + "0x88aa3d37": { + "selector": "0x88aa3d37", + "type": "function", + "signature": "function getAllowedNftTokenIdIsRedeemed(address nftContract, address allowedNftToken, uint256 allowedNftTokenId) view returns (bool)" + }, + "0x5cb3c4d3": { + "selector": "0x5cb3c4d3", + "type": "function", + "signature": "function getCreatorPayoutAddress(address nftContract) view returns (address)" + }, + "0x322e75d1": { + "selector": "0x322e75d1", + "type": "function", + "signature": "function getFeeRecipientIsAllowed(address nftContract, address feeRecipient) view returns (bool)" + }, + "0xe583141d": { + "selector": "0xe583141d", + "type": "function", + "signature": "function getPayerIsAllowed(address nftContract, address payer) view returns (bool)" + }, + "0x7c35b982": { + "selector": "0x7c35b982", + "type": "function", + "signature": "function getPayers(address nftContract) view returns (address[])" + }, + "0xbc6a629c": { + "selector": "0xbc6a629c", + "type": "function", + "signature": "function getPublicDrop(address nftContract) view returns ((uint80 mintPrice, uint48 startTime, uint48 endTime, uint16 maxTotalMintableByWallet, uint16 feeBps, bool restrictFeeRecipients))" + }, + "0x81bf9af3": { + "selector": "0x81bf9af3", + "type": "function", + "signature": "function getSignedMintValidationParams(address nftContract, address signer) view returns ((uint80 minMintPrice, uint24 maxMaxTotalMintableByWallet, uint40 minStartTime, uint40 maxEndTime, uint40 maxMaxTokenSupplyForStage, uint16 minFeeBps, uint16 maxFeeBps))" + }, + "0x7e3ba6af": { + "selector": "0x7e3ba6af", + "type": "function", + "signature": "function getSigners(address nftContract) view returns (address[])" + }, + "0x2db526eb": { + "selector": "0x2db526eb", + "type": "function", + "signature": "function getTokenGatedAllowedTokens(address nftContract) view returns (address[])" + }, + "0x0b0e8a6e": { + "selector": "0x0b0e8a6e", + "type": "function", + "signature": "function getTokenGatedDrop(address nftContract, address allowedNftToken) view returns ((uint80 mintPrice, uint16 maxTotalMintableByWallet, uint48 startTime, uint48 endTime, uint8 dropStageIndex, uint32 maxTokenSupplyForStage, uint16 feeBps, bool restrictFeeRecipients))" + }, + "0x4300a4e6": { + "selector": "0x4300a4e6", + "type": "function", + "signature": "function mintAllowList(address nftContract, address feeRecipient, address minterIfNotPayer, uint256 quantity, (uint256 mintPrice, uint256 maxTotalMintableByWallet, uint256 startTime, uint256 endTime, uint256 dropStageIndex, uint256 maxTokenSupplyForStage, uint256 feeBps, bool restrictFeeRecipients) mintParams, bytes32[] proof) payable" + }, + "0x99eb900f": { + "selector": "0x99eb900f", + "type": "function", + "signature": "function mintAllowedTokenHolder(address nftContract, address feeRecipient, address minterIfNotPayer, (address allowedNftToken, uint256[] allowedNftTokenIds) mintParams) payable" + }, + "0x161ac21f": { + "selector": "0x161ac21f", + "type": "function", + "signature": "function mintPublic(address nftContract, address feeRecipient, address minterIfNotPayer, uint256 quantity) payable" + }, + "0x4b61cd6f": { + "selector": "0x4b61cd6f", + "type": "function", + "signature": "function mintSigned(address nftContract, address feeRecipient, address minterIfNotPayer, uint256 quantity, (uint256 mintPrice, uint256 maxTotalMintableByWallet, uint256 startTime, uint256 endTime, uint256 dropStageIndex, uint256 maxTokenSupplyForStage, uint256 feeBps, bool restrictFeeRecipients) mintParams, uint256 salt, bytes signature) payable" + }, + "0xebb4a55f": { + "selector": "0xebb4a55f", + "type": "function", + "signature": "function updateAllowList((bytes32 merkleRoot, string[] publicKeyURIs, string allowListURI) allowListData)" + }, + "0x8e7d1e43": { + "selector": "0x8e7d1e43", + "type": "function", + "signature": "function updateAllowedFeeRecipient(address feeRecipient, bool allowed)" + }, + "0x12738db8": { + "selector": "0x12738db8", + "type": "function", + "signature": "function updateCreatorPayoutAddress(address _payoutAddress)" + }, + "0xb957d0cb": { + "selector": "0xb957d0cb", + "type": "function", + "signature": "function updateDropURI(string dropURI)" + }, + "0x7f2a5cca": { + "selector": "0x7f2a5cca", + "type": "function", + "signature": "function updatePayer(address payer, bool allowed)" + }, + "0x01308e65": { + "selector": "0x01308e65", + "type": "function", + "signature": "function updatePublicDrop((uint80 mintPrice, uint48 startTime, uint48 endTime, uint16 maxTotalMintableByWallet, uint16 feeBps, bool restrictFeeRecipients) publicDrop)" + }, + "0x4d380178": { + "selector": "0x4d380178", + "type": "function", + "signature": "function updateSignedMintValidationParams(address signer, (uint80 minMintPrice, uint24 maxMaxTotalMintableByWallet, uint40 minStartTime, uint40 maxEndTime, uint40 maxMaxTokenSupplyForStage, uint16 minFeeBps, uint16 maxFeeBps) signedMintValidationParams)" + }, + "0xfd9ab22a": { + "selector": "0xfd9ab22a", + "type": "function", + "signature": "function updateTokenGatedDrop(address allowedNftToken, (uint80 mintPrice, uint16 maxTotalMintableByWallet, uint48 startTime, uint48 endTime, uint8 dropStageIndex, uint32 maxTokenSupplyForStage, uint16 feeBps, bool restrictFeeRecipients) dropStage)" + } + }, + "Swappin": { + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + }, + "0x06bf53d0": { + "selector": "0x06bf53d0", + "type": "function", + "signature": "function LIMIT_ORDER_RFQ_TYPEHASH() view returns (bytes32)" + }, + "0x825caba1": { + "selector": "0x825caba1", + "type": "function", + "signature": "function cancelOrderRFQ(uint256 orderInfo)" + }, + "0x83197ef0": { + "selector": "0x83197ef0", + "type": "function", + "signature": "function destroy()" + }, + "0xd0a3b665": { + "selector": "0xd0a3b665", + "type": "function", + "signature": "function fillOrderRFQ((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount) payable returns (uint256, uint256)" + }, + "0xbaba5855": { + "selector": "0xbaba5855", + "type": "function", + "signature": "function fillOrderRFQTo((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount, address target) payable returns (uint256, uint256)" + }, + "0x4cc4a27b": { + "selector": "0x4cc4a27b", + "type": "function", + "signature": "function fillOrderRFQToWithPermit((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount, address target, bytes permit) returns (uint256, uint256)" + }, + "0x56f16124": { + "selector": "0x56f16124", + "type": "function", + "signature": "function invalidatorForOrderRFQ(address maker, uint256 slot) view returns (uint256)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x78e3214f": { + "selector": "0x78e3214f", + "type": "function", + "signature": "function rescueFunds(address token, uint256 amount)" + }, + "0x7c025200": { + "selector": "0x7c025200", + "type": "function", + "signature": "function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags, bytes permit) desc, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount, uint256 gasLeft)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0xe449022e": { + "selector": "0xe449022e", + "type": "function", + "signature": "function uniswapV3Swap(uint256 amount, uint256 minReturn, uint256[] pools) payable returns (uint256 returnAmount)" + }, + "0xfa461e33": { + "selector": "0xfa461e33", + "type": "function", + "signature": "function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes)" + }, + "0xbc80f1a8": { + "selector": "0xbc80f1a8", + "type": "function", + "signature": "function uniswapV3SwapTo(address recipient, uint256 amount, uint256 minReturn, uint256[] pools) payable returns (uint256 returnAmount)" + }, + "0x2521b930": { + "selector": "0x2521b930", + "type": "function", + "signature": "function uniswapV3SwapToWithPermit(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools, bytes permit) returns (uint256 returnAmount)" + }, + "0x2e95b6c8": { + "selector": "0x2e95b6c8", + "type": "function", + "signature": "function unoswap(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools) payable returns (uint256 returnAmount)" + }, + "0xa1251d75": { + "selector": "0xa1251d75", + "type": "function", + "signature": "function unoswapWithPermit(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools, bytes permit) returns (uint256 returnAmount)" + } + }, + "SwappinGatewayV2": { + "0x6afdd850": { + "selector": "0x6afdd850", + "type": "function", + "signature": "function PERMIT2() view returns (address)" + }, + "0xbd99d7e1": { + "selector": "0xbd99d7e1", + "type": "function", + "signature": "function _roles(bytes32) view returns (bytes32)" + }, + "0x6b9ae9e0": { + "selector": "0x6b9ae9e0", + "type": "function", + "signature": "function execute((address to, uint256 value, bool msgSender, bytes data)[] txs, int8 eventType, bytes32 eventData, bytes signature) payable" + }, + "0xfc442176": { + "selector": "0xfc442176", + "type": "function", + "signature": "function init(address[] _dests, address[] _tokens, address[] _providers, address[] _providerSpenders, address[] _signers, address _ownerAddress)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x2c0aa444": { + "selector": "0x2c0aa444", + "type": "function", + "signature": "function payWithAnyToken((bytes32 orderId, uint64 refId, address dest, address tokenTo, uint256 minAmountTo) orderInfo, (address swapProvider, address providerSpender, address tokenFrom, uint256 amountFrom, uint256 minAmountTo, bytes swapCalldata)[] swapInfo, (uint8 methodType, bytes methodSpecificData) paymentMethod) payable" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0xea4ab55d": { + "selector": "0xea4ab55d", + "type": "function", + "signature": "function setDestinations(address[] dests, address[] tokens, bytes32 flag)" + }, + "0x63c48dc9": { + "selector": "0x63c48dc9", + "type": "function", + "signature": "function setProviders(address[] _providers, address[] _providerSpenders, bytes32 flag)" + }, + "0xf1469009": { + "selector": "0xf1469009", + "type": "function", + "signature": "function setSigners(address[] signers, bytes32 flag)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "SwappinNFTV2": { + "0x13f73eaa": { + "selector": "0x13f73eaa", + "type": "function", + "signature": "function _blocked(address) view returns (bytes32)" + }, + "0xbd99d7e1": { + "selector": "0xbd99d7e1", + "type": "function", + "signature": "function _roles(bytes32) view returns (bytes32)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address to, uint256 tokenId)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address owner) view returns (uint256)" + }, + "0x42966c68": { + "selector": "0x42966c68", + "type": "function", + "signature": "function burn(uint256 tokenId)" + }, + "0xe8a3d485": { + "selector": "0xe8a3d485", + "type": "function", + "signature": "function contractURI() view returns (string)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() pure returns (uint256)" + }, + "0xc34b3a41": { + "selector": "0xc34b3a41", + "type": "function", + "signature": "function denomination(uint256 tokenId) view returns (uint256)" + }, + "0x081812fc": { + "selector": "0x081812fc", + "type": "function", + "signature": "function getApproved(uint256 tokenId) view returns (address)" + }, + "0xea2707d7": { + "selector": "0xea2707d7", + "type": "function", + "signature": "function init(address[] signers_, address[] forwarders_, address[] minters_, address ownerAddress_, string contractMetadataUri_, address royaltiesReceiver_, uint96 royaltiesFeeNumerator_)" + }, + "0xe985e9c5": { + "selector": "0xe985e9c5", + "type": "function", + "signature": "function isApprovedForAll(address owner, address operator) view returns (bool)" + }, + "0x272ec365": { + "selector": "0x272ec365", + "type": "function", + "signature": "function mint((bytes32 id, uint256 expiresAt, bytes signature) order, (uint256 tokenId, uint256 denomination, address to)[] tokens)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x6352211e": { + "selector": "0x6352211e", + "type": "function", + "signature": "function ownerOf(uint256 tokenId) view returns (address)" + }, + "0x5c975abb": { + "selector": "0x5c975abb", + "type": "function", + "signature": "function paused() view returns (bool)" + }, + "0x022abd4b": { + "selector": "0x022abd4b", + "type": "function", + "signature": "function redeem((bytes32 id, uint256 expiresAt, bytes signature) order, uint256[] burnTokenId, (uint256 tokenId, uint256 denomination, address to)[] tokens)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x2a55205a": { + "selector": "0x2a55205a", + "type": "function", + "signature": "function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address, uint256)" + }, + "0x42842e0e": { + "selector": "0x42842e0e", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId)" + }, + "0xb88d4fde": { + "selector": "0xb88d4fde", + "type": "function", + "signature": "function safeTransferFrom(address from, address to, uint256 tokenId, bytes data)" + }, + "0xa22cb465": { + "selector": "0xa22cb465", + "type": "function", + "signature": "function setApprovalForAll(address operator, bool approved)" + }, + "0xbcca0d2c": { + "selector": "0xbcca0d2c", + "type": "function", + "signature": "function setBlocked(address[] addr_, bytes32 flag)" + }, + "0x938e3d7b": { + "selector": "0x938e3d7b", + "type": "function", + "signature": "function setContractURI(string uri)" + }, + "0x04634d8d": { + "selector": "0x04634d8d", + "type": "function", + "signature": "function setDefaultRoyalty(address receiver, uint96 feeNumerator)" + }, + "0x16c38b3c": { + "selector": "0x16c38b3c", + "type": "function", + "signature": "function setPaused(bool isPause)" + }, + "0xbcf1ef13": { + "selector": "0xbcf1ef13", + "type": "function", + "signature": "function setRoles(address[] addr_, bytes32 roleFlag, bytes32 action)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xc87b56dd": { + "selector": "0xc87b56dd", + "type": "function", + "signature": "function tokenURI(uint256 tokenId) view returns (string)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address from, address to, uint256 tokenId)" + }, + "0x831867f4": { + "selector": "0x831867f4", + "type": "function", + "signature": "function transferFromMany(address[] from, address[] to, uint256[] tokenId)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "PancakeMasterChefV2": { + "0x7398b7ea": { + "selector": "0x7398b7ea", + "type": "function", + "signature": "function ACC_CAKE_PRECISION() view returns (uint256)" + }, + "0xcc6db2da": { + "selector": "0xcc6db2da", + "type": "function", + "signature": "function BOOST_PRECISION() view returns (uint256)" + }, + "0x4ca6ef28": { + "selector": "0x4ca6ef28", + "type": "function", + "signature": "function CAKE() view returns (address)" + }, + "0xe39e1323": { + "selector": "0xe39e1323", + "type": "function", + "signature": "function CAKE_RATE_TOTAL_PRECISION() view returns (uint256)" + }, + "0x39aae5ba": { + "selector": "0x39aae5ba", + "type": "function", + "signature": "function MASTERCHEF_CAKE_PER_BLOCK() view returns (uint256)" + }, + "0xedd8b170": { + "selector": "0xedd8b170", + "type": "function", + "signature": "function MASTER_CHEF() view returns (address)" + }, + "0x61621aaa": { + "selector": "0x61621aaa", + "type": "function", + "signature": "function MASTER_PID() view returns (uint256)" + }, + "0x69b02128": { + "selector": "0x69b02128", + "type": "function", + "signature": "function MAX_BOOST_PRECISION() view returns (uint256)" + }, + "0xc507aeaa": { + "selector": "0xc507aeaa", + "type": "function", + "signature": "function add(uint256 _allocPoint, address _lpToken, bool _isRegular, bool _withUpdate)" + }, + "0xdfcedeee": { + "selector": "0xdfcedeee", + "type": "function", + "signature": "function boostContract() view returns (address)" + }, + "0x81bdf98c": { + "selector": "0x81bdf98c", + "type": "function", + "signature": "function burnAdmin() view returns (address)" + }, + "0x777a97f8": { + "selector": "0x777a97f8", + "type": "function", + "signature": "function burnCake(bool _withUpdate)" + }, + "0x1e9b828b": { + "selector": "0x1e9b828b", + "type": "function", + "signature": "function cakePerBlock(bool _isRegular) view returns (uint256 amount)" + }, + "0x9dcc1b5f": { + "selector": "0x9dcc1b5f", + "type": "function", + "signature": "function cakePerBlockToBurn() view returns (uint256 amount)" + }, + "0xe0f91f6c": { + "selector": "0xe0f91f6c", + "type": "function", + "signature": "function cakeRateToBurn() view returns (uint256)" + }, + "0xaa47bc8e": { + "selector": "0xaa47bc8e", + "type": "function", + "signature": "function cakeRateToRegularFarm() view returns (uint256)" + }, + "0x1ce06d57": { + "selector": "0x1ce06d57", + "type": "function", + "signature": "function cakeRateToSpecialFarm() view returns (uint256)" + }, + "0xe2bbb158": { + "selector": "0xe2bbb158", + "type": "function", + "signature": "function deposit(uint256 _pid, uint256 _amount)" + }, + "0x5312ea8e": { + "selector": "0x5312ea8e", + "type": "function", + "signature": "function emergencyWithdraw(uint256 _pid)" + }, + "0x033186e8": { + "selector": "0x033186e8", + "type": "function", + "signature": "function getBoostMultiplier(address _user, uint256 _pid) view returns (uint256)" + }, + "0x4f70b15a": { + "selector": "0x4f70b15a", + "type": "function", + "signature": "function harvestFromMasterChef()" + }, + "0x19ab453c": { + "selector": "0x19ab453c", + "type": "function", + "signature": "function init(address dummyToken)" + }, + "0x78db4c34": { + "selector": "0x78db4c34", + "type": "function", + "signature": "function lastBurnedBlock() view returns (uint256)" + }, + "0x78ed5d1f": { + "selector": "0x78ed5d1f", + "type": "function", + "signature": "function lpToken(uint256) view returns (address)" + }, + "0x630b5ba1": { + "selector": "0x630b5ba1", + "type": "function", + "signature": "function massUpdatePools()" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x1175a1dd": { + "selector": "0x1175a1dd", + "type": "function", + "signature": "function pendingCake(uint256 _pid, address _user) view returns (uint256)" + }, + "0x1526fe27": { + "selector": "0x1526fe27", + "type": "function", + "signature": "function poolInfo(uint256) view returns (uint256 accCakePerShare, uint256 lastRewardBlock, uint256 allocPoint, uint256 totalBoostedShare, bool isRegular)" + }, + "0x081e3eda": { + "selector": "0x081e3eda", + "type": "function", + "signature": "function poolLength() view returns (uint256 pools)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0x64482f79": { + "selector": "0x64482f79", + "type": "function", + "signature": "function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate)" + }, + "0xc40d337b": { + "selector": "0xc40d337b", + "type": "function", + "signature": "function totalRegularAllocPoint() view returns (uint256)" + }, + "0x99d7e84a": { + "selector": "0x99d7e84a", + "type": "function", + "signature": "function totalSpecialAllocPoint() view returns (uint256)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x9dd2fcc3": { + "selector": "0x9dd2fcc3", + "type": "function", + "signature": "function updateBoostContract(address _newBoostContract)" + }, + "0x041a84c9": { + "selector": "0x041a84c9", + "type": "function", + "signature": "function updateBoostMultiplier(address _user, uint256 _pid, uint256 _newMultiplier)" + }, + "0x0bb844bc": { + "selector": "0x0bb844bc", + "type": "function", + "signature": "function updateBurnAdmin(address _newAdmin)" + }, + "0xdc6363df": { + "selector": "0xdc6363df", + "type": "function", + "signature": "function updateCakeRate(uint256 _burnRate, uint256 _regularFarmRate, uint256 _specialFarmRate, bool _withUpdate)" + }, + "0x51eb05a6": { + "selector": "0x51eb05a6", + "type": "function", + "signature": "function updatePool(uint256 _pid) returns ((uint256 accCakePerShare, uint256 lastRewardBlock, uint256 allocPoint, uint256 totalBoostedShare, bool isRegular) pool)" + }, + "0xac1d0609": { + "selector": "0xac1d0609", + "type": "function", + "signature": "function updateWhiteList(address _user, bool _isValid)" + }, + "0x93f1a40b": { + "selector": "0x93f1a40b", + "type": "function", + "signature": "function userInfo(uint256, address) view returns (uint256 amount, uint256 rewardDebt, uint256 boostMultiplier)" + }, + "0x372c12b1": { + "selector": "0x372c12b1", + "type": "function", + "signature": "function whiteList(address) view returns (bool)" + }, + "0x441a3e70": { + "selector": "0x441a3e70", + "type": "function", + "signature": "function withdraw(uint256 _pid, uint256 _amount)" + } + }, + "SudoSwapFactory": { + "0xa82719c8": { + "selector": "0xa82719c8", + "type": "function", + "signature": "function bondingCurveAllowed(address) view returns (bool)" + }, + "0x1fba95e8": { + "selector": "0x1fba95e8", + "type": "function", + "signature": "function callAllowed(address) view returns (bool)" + }, + "0x9c3c11d2": { + "selector": "0x9c3c11d2", + "type": "function", + "signature": "function changeProtocolFeeMultiplier(uint256 _protocolFeeMultiplier)" + }, + "0x514f0330": { + "selector": "0x514f0330", + "type": "function", + "signature": "function changeProtocolFeeRecipient(address _protocolFeeRecipient)" + }, + "0x59722caa": { + "selector": "0x59722caa", + "type": "function", + "signature": "function createPairERC20((address token, address nft, address bondingCurve, address assetRecipient, uint8 poolType, uint128 delta, uint96 fee, uint128 spotPrice, uint256[] initialNFTIDs, uint256 initialTokenBalance) params) returns (address pair)" + }, + "0xce9c095d": { + "selector": "0xce9c095d", + "type": "function", + "signature": "function createPairETH(address _nft, address _bondingCurve, address _assetRecipient, uint8 _poolType, uint128 _delta, uint96 _fee, uint128 _spotPrice, uint256[] _initialNFTIDs) payable returns (address pair)" + }, + "0x1cad5a40": { + "selector": "0x1cad5a40", + "type": "function", + "signature": "function depositERC20(address token, address recipient, uint256 amount)" + }, + "0x2cdb394b": { + "selector": "0x2cdb394b", + "type": "function", + "signature": "function depositNFTs(address _nft, uint256[] ids, address recipient)" + }, + "0xa427f1ad": { + "selector": "0xa427f1ad", + "type": "function", + "signature": "function enumerableERC20Template() view returns (address)" + }, + "0xad2e5770": { + "selector": "0xad2e5770", + "type": "function", + "signature": "function enumerableETHTemplate() view returns (address)" + }, + "0x08f25a8f": { + "selector": "0x08f25a8f", + "type": "function", + "signature": "function isPair(address potentialPair, uint8 variant) view returns (bool)" + }, + "0x4c6bc433": { + "selector": "0x4c6bc433", + "type": "function", + "signature": "function missingEnumerableERC20Template() view returns (address)" + }, + "0x004885ea": { + "selector": "0x004885ea", + "type": "function", + "signature": "function missingEnumerableETHTemplate() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x1ce4c78b": { + "selector": "0x1ce4c78b", + "type": "function", + "signature": "function protocolFeeMultiplier() view returns (uint256)" + }, + "0x64df049e": { + "selector": "0x64df049e", + "type": "function", + "signature": "function protocolFeeRecipient() view returns (address)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0xa93ec68b": { + "selector": "0xa93ec68b", + "type": "function", + "signature": "function routerStatus(address) view returns (bool allowed, bool wasEverAllowed)" + }, + "0x4bf107c1": { + "selector": "0x4bf107c1", + "type": "function", + "signature": "function setBondingCurveAllowed(address bondingCurve, bool isAllowed)" + }, + "0xebd0f693": { + "selector": "0xebd0f693", + "type": "function", + "signature": "function setCallAllowed(address target, bool isAllowed)" + }, + "0x6cc88edb": { + "selector": "0x6cc88edb", + "type": "function", + "signature": "function setRouterAllowed(address _router, bool isAllowed)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0xcc5bc20b": { + "selector": "0xcc5bc20b", + "type": "function", + "signature": "function withdrawERC20ProtocolFees(address token, uint256 amount)" + }, + "0xb483eddc": { + "selector": "0xb483eddc", + "type": "function", + "signature": "function withdrawETHProtocolFees()" + } + }, + "SudoSwapRouter": { + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x4b456d0c": { + "selector": "0x4b456d0c", + "type": "function", + "signature": "function pairTransferERC20From(address token, address from, address to, uint256 amount, uint8 variant)" + }, + "0x748ff339": { + "selector": "0x748ff339", + "type": "function", + "signature": "function pairTransferNFTFrom(address nft, address from, address to, uint256 id, uint8 variant)" + }, + "0xc5cf5704": { + "selector": "0xc5cf5704", + "type": "function", + "signature": "function robustSwapERC20ForAnyNFTs(((address pair, uint256 numItems) swapInfo, uint256 maxCost)[] swapList, uint256 inputAmount, address nftRecipient, uint256 deadline) returns (uint256 remainingValue)" + }, + "0xdb6ddb26": { + "selector": "0xdb6ddb26", + "type": "function", + "signature": "function robustSwapERC20ForSpecificNFTs(((address pair, uint256[] nftIds) swapInfo, uint256 maxCost)[] swapList, uint256 inputAmount, address nftRecipient, uint256 deadline) payable returns (uint256 remainingValue)" + }, + "0x8c1daa2b": { + "selector": "0x8c1daa2b", + "type": "function", + "signature": "function robustSwapERC20ForSpecificNFTsAndNFTsToToken((((address pair, uint256[] nftIds) swapInfo, uint256 maxCost)[] tokenToNFTTrades, ((address pair, uint256[] nftIds) swapInfo, uint256 minOutput)[] nftToTokenTrades, uint256 inputAmount, address tokenRecipient, address nftRecipient) params) payable returns (uint256 remainingValue, uint256 outputAmount)" + }, + "0x2f9b9d4e": { + "selector": "0x2f9b9d4e", + "type": "function", + "signature": "function robustSwapETHForAnyNFTs(((address pair, uint256 numItems) swapInfo, uint256 maxCost)[] swapList, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 remainingValue)" + }, + "0x3efd9e71": { + "selector": "0x3efd9e71", + "type": "function", + "signature": "function robustSwapETHForSpecificNFTs(((address pair, uint256[] nftIds) swapInfo, uint256 maxCost)[] swapList, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 remainingValue)" + }, + "0xab5c0da2": { + "selector": "0xab5c0da2", + "type": "function", + "signature": "function robustSwapETHForSpecificNFTsAndNFTsToToken((((address pair, uint256[] nftIds) swapInfo, uint256 maxCost)[] tokenToNFTTrades, ((address pair, uint256[] nftIds) swapInfo, uint256 minOutput)[] nftToTokenTrades, uint256 inputAmount, address tokenRecipient, address nftRecipient) params) payable returns (uint256 remainingValue, uint256 outputAmount)" + }, + "0x2b997f8e": { + "selector": "0x2b997f8e", + "type": "function", + "signature": "function robustSwapNFTsForToken(((address pair, uint256[] nftIds) swapInfo, uint256 minOutput)[] swapList, address tokenRecipient, uint256 deadline) returns (uint256 outputAmount)" + }, + "0xad134450": { + "selector": "0xad134450", + "type": "function", + "signature": "function swapERC20ForAnyNFTs((address pair, uint256 numItems)[] swapList, uint256 inputAmount, address nftRecipient, uint256 deadline) returns (uint256 remainingValue)" + }, + "0x14db3784": { + "selector": "0x14db3784", + "type": "function", + "signature": "function swapERC20ForSpecificNFTs((address pair, uint256[] nftIds)[] swapList, uint256 inputAmount, address nftRecipient, uint256 deadline) returns (uint256 remainingValue)" + }, + "0xdb42312a": { + "selector": "0xdb42312a", + "type": "function", + "signature": "function swapETHForAnyNFTs((address pair, uint256 numItems)[] swapList, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 remainingValue)" + }, + "0x11132000": { + "selector": "0x11132000", + "type": "function", + "signature": "function swapETHForSpecificNFTs((address pair, uint256[] nftIds)[] swapList, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 remainingValue)" + }, + "0xf138513a": { + "selector": "0xf138513a", + "type": "function", + "signature": "function swapNFTsForAnyNFTsThroughERC20(((address pair, uint256[] nftIds)[] nftToTokenTrades, (address pair, uint256 numItems)[] tokenToNFTTrades) trade, uint256 inputAmount, uint256 minOutput, address nftRecipient, uint256 deadline) returns (uint256 outputAmount)" + }, + "0xd89bb2b5": { + "selector": "0xd89bb2b5", + "type": "function", + "signature": "function swapNFTsForAnyNFTsThroughETH(((address pair, uint256[] nftIds)[] nftToTokenTrades, (address pair, uint256 numItems)[] tokenToNFTTrades) trade, uint256 minOutput, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 outputAmount)" + }, + "0x84a4c8c4": { + "selector": "0x84a4c8c4", + "type": "function", + "signature": "function swapNFTsForSpecificNFTsThroughERC20(((address pair, uint256[] nftIds)[] nftToTokenTrades, (address pair, uint256[] nftIds)[] tokenToNFTTrades) trade, uint256 inputAmount, uint256 minOutput, address nftRecipient, uint256 deadline) returns (uint256 outputAmount)" + }, + "0xa833d43a": { + "selector": "0xa833d43a", + "type": "function", + "signature": "function swapNFTsForSpecificNFTsThroughETH(((address pair, uint256[] nftIds)[] nftToTokenTrades, (address pair, uint256[] nftIds)[] tokenToNFTTrades) trade, uint256 minOutput, address ethRecipient, address nftRecipient, uint256 deadline) payable returns (uint256 outputAmount)" + }, + "0xdabf67d7": { + "selector": "0xdabf67d7", + "type": "function", + "signature": "function swapNFTsForToken((address pair, uint256[] nftIds)[] swapList, uint256 minOutput, address tokenRecipient, uint256 deadline) returns (uint256 outputAmount)" + } + }, + "LSSVMPairEnumerableETH": { + "0xe4f2c5ac": { + "selector": "0xe4f2c5ac", + "type": "error", + "signature": "error BondingCurveError(uint8 error)" + }, + "0xedf1b1fc": { + "selector": "0xedf1b1fc", + "type": "error", + "signature": "error Ownable_NewOwnerZeroAddress()" + }, + "0x5eee3ad1": { + "selector": "0x5eee3ad1", + "type": "error", + "signature": "error Ownable_NotOwner()" + }, + "0x3bfa67fe": { + "selector": "0x3bfa67fe", + "type": "function", + "signature": "function assetRecipient() view returns (address)" + }, + "0xeff1d50e": { + "selector": "0xeff1d50e", + "type": "function", + "signature": "function bondingCurve() pure returns (address _bondingCurve)" + }, + "0x1b8b921d": { + "selector": "0x1b8b921d", + "type": "function", + "signature": "function call(address target, bytes data)" + }, + "0xf4629549": { + "selector": "0xf4629549", + "type": "function", + "signature": "function changeAssetRecipient(address newRecipient)" + }, + "0x6809f664": { + "selector": "0x6809f664", + "type": "function", + "signature": "function changeDelta(uint128 newDelta)" + }, + "0x6b7a2200": { + "selector": "0x6b7a2200", + "type": "function", + "signature": "function changeFee(uint96 newFee)" + }, + "0xd8a1890c": { + "selector": "0xd8a1890c", + "type": "function", + "signature": "function changeSpotPrice(uint128 newSpotPrice)" + }, + "0x12b495a8": { + "selector": "0x12b495a8", + "type": "function", + "signature": "function delta() view returns (uint128)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() pure returns (address _factory)" + }, + "0xddca3f43": { + "selector": "0xddca3f43", + "type": "function", + "signature": "function fee() view returns (uint96)" + }, + "0x2f4fefaf": { + "selector": "0x2f4fefaf", + "type": "function", + "signature": "function getAllHeldIds() view returns (uint256[])" + }, + "0x79eac6c2": { + "selector": "0x79eac6c2", + "type": "function", + "signature": "function getAssetRecipient() view returns (address _assetRecipient)" + }, + "0xa5cb2b91": { + "selector": "0xa5cb2b91", + "type": "function", + "signature": "function getBuyNFTQuote(uint256 numNFTs) view returns (uint8 error, uint256 newSpotPrice, uint256 newDelta, uint256 inputAmount, uint256 protocolFee)" + }, + "0x0c295e56": { + "selector": "0x0c295e56", + "type": "function", + "signature": "function getSellNFTQuote(uint256 numNFTs) view returns (uint8 error, uint256 newSpotPrice, uint256 newDelta, uint256 outputAmount, uint256 protocolFee)" + }, + "0xfd17aef9": { + "selector": "0xfd17aef9", + "type": "function", + "signature": "function initialize(address _owner, address _assetRecipient, uint128 _delta, uint96 _fee, uint128 _spotPrice) payable" + }, + "0x1e9701d4": { + "selector": "0x1e9701d4", + "type": "function", + "signature": "function multicall(bytes[] calls, bool revertOnFail)" + }, + "0x47ccca02": { + "selector": "0x47ccca02", + "type": "function", + "signature": "function nft() pure returns (address _nft)" + }, + "0xbc197c81": { + "selector": "0xbc197c81", + "type": "function", + "signature": "function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) returns (bytes4)" + }, + "0xf23a6e61": { + "selector": "0xf23a6e61", + "type": "function", + "signature": "function onERC1155Received(address, address, uint256, uint256, bytes) returns (bytes4)" + }, + "0x150b7a02": { + "selector": "0x150b7a02", + "type": "function", + "signature": "function onERC721Received(address, address, uint256, bytes) returns (bytes4)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x3053fc58": { + "selector": "0x3053fc58", + "type": "function", + "signature": "function pairVariant() pure returns (uint8)" + }, + "0xb1dd61b6": { + "selector": "0xb1dd61b6", + "type": "function", + "signature": "function poolType() pure returns (uint8 _poolType)" + }, + "0x398482d8": { + "selector": "0x398482d8", + "type": "function", + "signature": "function spotPrice() view returns (uint128)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0xb1d3f1c1": { + "selector": "0xb1d3f1c1", + "type": "function", + "signature": "function swapNFTsForToken(uint256[] nftIds, uint256 minExpectedTokenOutput, address tokenRecipient, bool isRouter, address routerCaller) returns (uint256 outputAmount)" + }, + "0x28b8aee1": { + "selector": "0x28b8aee1", + "type": "function", + "signature": "function swapTokenForAnyNFTs(uint256 numNFTs, uint256 maxExpectedTokenInput, address nftRecipient, bool isRouter, address routerCaller) payable returns (uint256 inputAmount)" + }, + "0x6d8b99f7": { + "selector": "0x6d8b99f7", + "type": "function", + "signature": "function swapTokenForSpecificNFTs(uint256[] nftIds, uint256 maxExpectedTokenInput, address nftRecipient, bool isRouter, address routerCaller) payable returns (uint256 inputAmount)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + }, + "0x90386bbf": { + "selector": "0x90386bbf", + "type": "function", + "signature": "function withdrawAllETH()" + }, + "0xa5ceac99": { + "selector": "0xa5ceac99", + "type": "function", + "signature": "function withdrawERC1155(address a, uint256[] ids, uint256[] amounts)" + }, + "0xa1db9782": { + "selector": "0xa1db9782", + "type": "function", + "signature": "function withdrawERC20(address a, uint256 amount)" + }, + "0x13edab81": { + "selector": "0x13edab81", + "type": "function", + "signature": "function withdrawERC721(address a, uint256[] nftIds)" + }, + "0xf14210a6": { + "selector": "0xf14210a6", + "type": "function", + "signature": "function withdrawETH(uint256 amount)" + } + }, + "MeanFinance": { + "0x6b2f2183": { + "selector": "0x6b2f2183", + "type": "error", + "signature": "error AmountTooBig()" + }, + "0xa020d7b8": { + "selector": "0xa020d7b8", + "type": "error", + "signature": "error HighFee()" + }, + "0x52f17a74": { + "selector": "0x52f17a74", + "type": "error", + "signature": "error HighPlatformFeeRatio()" + }, + "0x8b52594f": { + "selector": "0x8b52594f", + "type": "error", + "signature": "error IntervalNotAllowed()" + }, + "0x89db1695": { + "selector": "0x89db1695", + "type": "error", + "signature": "error InvalidAllowedTokensInput()" + }, + "0x58d620b3": { + "selector": "0x58d620b3", + "type": "error", + "signature": "error InvalidFee()" + }, + "0x5fabb610": { + "selector": "0x5fabb610", + "type": "error", + "signature": "error InvalidInterval()" + }, + "0xbf3cad0b": { + "selector": "0xbf3cad0b", + "type": "error", + "signature": "error InvalidMask()" + }, + "0x5dd49b5d": { + "selector": "0x5dd49b5d", + "type": "error", + "signature": "error InvalidPairs()" + }, + "0xce7e065e": { + "selector": "0xce7e065e", + "type": "error", + "signature": "error InvalidPosition()" + }, + "0xc1ab6dc1": { + "selector": "0xc1ab6dc1", + "type": "error", + "signature": "error InvalidToken()" + }, + "0x672215de": { + "selector": "0x672215de", + "type": "error", + "signature": "error InvalidTokens()" + }, + "0xd562e29f": { + "selector": "0xd562e29f", + "type": "error", + "signature": "error LiquidityNotReturned()" + }, + "0x8df1af62": { + "selector": "0x8df1af62", + "type": "error", + "signature": "error NoSwapsToExecute()" + }, + "0x60acc76a": { + "selector": "0x60acc76a", + "type": "error", + "signature": "error PositionDoesNotMatchToken()" + }, + "0xda045aa0": { + "selector": "0xda045aa0", + "type": "error", + "signature": "error UnallowedToken()" + }, + "0x5c427cd9": { + "selector": "0x5c427cd9", + "type": "error", + "signature": "error UnauthorizedCaller()" + }, + "0xd92e233d": { + "selector": "0xd92e233d", + "type": "error", + "signature": "error ZeroAddress()" + }, + "0x1f2a2005": { + "selector": "0x1f2a2005", + "type": "error", + "signature": "error ZeroAmount()" + }, + "0x792432d6": { + "selector": "0x792432d6", + "type": "error", + "signature": "error ZeroSwaps()" + }, + "0xa217fddf": { + "selector": "0xa217fddf", + "type": "function", + "signature": "function DEFAULT_ADMIN_ROLE() view returns (bytes32)" + }, + "0x7d361dd3": { + "selector": "0x7d361dd3", + "type": "function", + "signature": "function IMMEDIATE_ROLE() view returns (bytes32)" + }, + "0xbc063e1a": { + "selector": "0xbc063e1a", + "type": "function", + "signature": "function MAX_FEE() view returns (uint32)" + }, + "0x1b8b8c34": { + "selector": "0x1b8b8c34", + "type": "function", + "signature": "function MAX_PLATFORM_FEE_RATIO() view returns (uint16)" + }, + "0xfc448158": { + "selector": "0xfc448158", + "type": "function", + "signature": "function PLATFORM_WITHDRAW_ROLE() view returns (bytes32)" + }, + "0x64857370": { + "selector": "0x64857370", + "type": "function", + "signature": "function PRIVILEGED_SWAPPER_ROLE() view returns (bytes32)" + }, + "0x4eeeb3eb": { + "selector": "0x4eeeb3eb", + "type": "function", + "signature": "function TIME_LOCKED_ROLE() view returns (bytes32)" + }, + "0x0b1aa984": { + "selector": "0x0b1aa984", + "type": "function", + "signature": "function accumRatio(address, address, bytes1, uint32) view returns (uint256 accumRatioAToB, uint256 accumRatioBToA)" + }, + "0x582cf84b": { + "selector": "0x582cf84b", + "type": "function", + "signature": "function activeSwapIntervals(address, address) view returns (bytes1)" + }, + "0x3feb1493": { + "selector": "0x3feb1493", + "type": "function", + "signature": "function addSwapIntervalsToAllowedList(uint32[] _swapIntervals)" + }, + "0x480e5da1": { + "selector": "0x480e5da1", + "type": "function", + "signature": "function allowedSwapIntervals() view returns (bytes1)" + }, + "0xe744092e": { + "selector": "0xe744092e", + "type": "function", + "signature": "function allowedTokens(address) view returns (bool)" + }, + "0x6b29e1bd": { + "selector": "0x6b29e1bd", + "type": "function", + "signature": "function deposit(address _from, address _to, uint256 _amount, uint32 _amountOfSwaps, uint32 _swapInterval, address _owner, (address operator, uint8[] permissions)[] _permissions) returns (uint256)" + }, + "0xb2b513c1": { + "selector": "0xb2b513c1", + "type": "function", + "signature": "function deposit(address _from, address _to, uint256 _amount, uint32 _amountOfSwaps, uint32 _swapInterval, address _owner, (address operator, uint8[] permissions)[] _permissions, bytes _miscellaneous) returns (uint256 _positionId)" + }, + "0x4997cdc3": { + "selector": "0x4997cdc3", + "type": "function", + "signature": "function getNextSwapInfo(address[] _tokens, (uint8 indexTokenA, uint8 indexTokenB)[] _pairs, bool _calculatePrivilegedAvailability, bytes _oracleData) view returns (((address token, uint256 reward, uint256 toProvide, uint256 platformFee)[] tokens, (address tokenA, address tokenB, uint256 totalAmountToSwapTokenA, uint256 totalAmountToSwapTokenB, uint256 ratioAToB, uint256 ratioBToA, bytes1 intervalsInSwap)[] pairs) _swapInformation)" + }, + "0x248a9ca3": { + "selector": "0x248a9ca3", + "type": "function", + "signature": "function getRoleAdmin(bytes32 role) view returns (bytes32)" + }, + "0x2f2ff15d": { + "selector": "0x2f2ff15d", + "type": "function", + "signature": "function grantRole(bytes32 role, address account)" + }, + "0x91d14854": { + "selector": "0x91d14854", + "type": "function", + "signature": "function hasRole(bytes32 role, address account) view returns (bool)" + }, + "0xded700a6": { + "selector": "0xded700a6", + "type": "function", + "signature": "function increasePosition(uint256 _positionId, uint256 _amount, uint32 _newAmountOfSwaps)" + }, + "0x7dc0d1d0": { + "selector": "0x7dc0d1d0", + "type": "function", + "signature": "function oracle() view returns (address)" + }, + "0x8456cb59": { + "selector": "0x8456cb59", + "type": "function", + "signature": "function pause()" + }, + "0x5c975abb": { + "selector": "0x5c975abb", + "type": "function", + "signature": "function paused() view returns (bool)" + }, + "0xcc7a2049": { + "selector": "0xcc7a2049", + "type": "function", + "signature": "function permissionManager() view returns (address)" + }, + "0xc67e32e9": { + "selector": "0xc67e32e9", + "type": "function", + "signature": "function platformBalance(address) view returns (uint256)" + }, + "0x57ae1cec": { + "selector": "0x57ae1cec", + "type": "function", + "signature": "function platformFeeRatio() view returns (uint16)" + }, + "0xf1accf39": { + "selector": "0xf1accf39", + "type": "function", + "signature": "function reducePosition(uint256 _positionId, uint256 _amount, uint32 _newAmountOfSwaps, address _recipient)" + }, + "0x7d8e8603": { + "selector": "0x7d8e8603", + "type": "function", + "signature": "function removeSwapIntervalsFromAllowedList(uint32[] _swapIntervals)" + }, + "0x36568abe": { + "selector": "0x36568abe", + "type": "function", + "signature": "function renounceRole(bytes32 role, address account)" + }, + "0xd547741f": { + "selector": "0xd547741f", + "type": "function", + "signature": "function revokeRole(bytes32 role, address account)" + }, + "0x74ae623b": { + "selector": "0x74ae623b", + "type": "function", + "signature": "function setAllowedTokens(address[] _tokens, bool[] _allowed)" + }, + "0x7adbf973": { + "selector": "0x7adbf973", + "type": "function", + "signature": "function setOracle(address _oracle)" + }, + "0x6eefd134": { + "selector": "0x6eefd134", + "type": "function", + "signature": "function setPlatformFeeRatio(uint16 _platformFeeRatio)" + }, + "0xd6d788c3": { + "selector": "0xd6d788c3", + "type": "function", + "signature": "function setSwapFee(uint32 _swapFee)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0xb39461e5": { + "selector": "0xb39461e5", + "type": "function", + "signature": "function swap(address[] _tokens, (uint8 indexTokenA, uint8 indexTokenB)[] _pairsToSwap, address _rewardRecipient, address _callbackHandler, uint256[] _borrow, bytes _callbackData, bytes _oracleData) returns (((address token, uint256 reward, uint256 toProvide, uint256 platformFee)[] tokens, (address tokenA, address tokenB, uint256 totalAmountToSwapTokenA, uint256 totalAmountToSwapTokenB, uint256 ratioAToB, uint256 ratioBToA, bytes1 intervalsInSwap)[] pairs) _swapInformation)" + }, + "0x4aa91aee": { + "selector": "0x4aa91aee", + "type": "function", + "signature": "function swapAmountDelta(address, address, bytes1, uint32) view returns (uint128 swapDeltaAToB, uint128 swapDeltaBToA)" + }, + "0x808ba8e0": { + "selector": "0x808ba8e0", + "type": "function", + "signature": "function swapData(address, address, bytes1) view returns (uint32 performedSwaps, uint224 nextAmountToSwapAToB, uint32 lastSwappedAt, uint224 nextAmountToSwapBToA)" + }, + "0x54cf2aeb": { + "selector": "0x54cf2aeb", + "type": "function", + "signature": "function swapFee() view returns (uint32)" + }, + "0x72ada4c5": { + "selector": "0x72ada4c5", + "type": "function", + "signature": "function terminate(uint256 _positionId, address _recipientUnswapped, address _recipientSwapped) returns (uint256 _unswapped, uint256 _swapped)" + }, + "0x16cd7af8": { + "selector": "0x16cd7af8", + "type": "function", + "signature": "function tokenMagnitude(address) view returns (uint120)" + }, + "0x36639580": { + "selector": "0x36639580", + "type": "function", + "signature": "function totalCreatedPositions() view returns (uint256)" + }, + "0x3f4ba83a": { + "selector": "0x3f4ba83a", + "type": "function", + "signature": "function unpause()" + }, + "0x5b6fd01d": { + "selector": "0x5b6fd01d", + "type": "function", + "signature": "function userPosition(uint256 _positionId) view returns ((address from, address to, uint32 swapInterval, uint32 swapsExecuted, uint256 swapped, uint32 swapsLeft, uint256 remaining, uint120 rate) _userPosition)" + }, + "0x560c6499": { + "selector": "0x560c6499", + "type": "function", + "signature": "function withdrawFromPlatformBalance((address token, uint256 amount)[] _amounts, address _recipient)" + }, + "0x17621890": { + "selector": "0x17621890", + "type": "function", + "signature": "function withdrawSwapped(uint256 _positionId, address _recipient) returns (uint256)" + }, + "0x480b3796": { + "selector": "0x480b3796", + "type": "function", + "signature": "function withdrawSwappedMany((address token, uint256[] positionIds)[] _positions, address _recipient) returns (uint256[] _swapped)" + } + }, + "DCAHubCompanion": { + "0xe6250e33": { + "selector": "0xe6250e33", + "type": "error", + "signature": "error GovernorIsZeroAddress()" + }, + "0x1f0b33c3": { + "selector": "0x1f0b33c3", + "type": "error", + "signature": "error InvalidAllowanceTarget(address spender)" + }, + "0xbf3cad0b": { + "selector": "0xbf3cad0b", + "type": "error", + "signature": "error InvalidMask()" + }, + "0xe0a8b920": { + "selector": "0xe0a8b920", + "type": "error", + "signature": "error OnlyGovernor()" + }, + "0x9ba0305d": { + "selector": "0x9ba0305d", + "type": "error", + "signature": "error OnlyPendingGovernor()" + }, + "0x763dfca0": { + "selector": "0x763dfca0", + "type": "error", + "signature": "error ReceivedTooLittleTokenOut(uint256 received, uint256 expected)" + }, + "0x493703af": { + "selector": "0x493703af", + "type": "error", + "signature": "error SimulatedCall((bool success, bytes result, uint256 gasSpent) result)" + }, + "0x220d24fd": { + "selector": "0x220d24fd", + "type": "error", + "signature": "error SwapperNotAllowlisted(address swapper)" + }, + "0x5c427cd9": { + "selector": "0x5c427cd9", + "type": "error", + "signature": "error UnauthorizedCaller()" + }, + "0xd92e233d": { + "selector": "0xd92e233d", + "type": "error", + "signature": "error ZeroAddress()" + }, + "0x6afdd850": { + "selector": "0x6afdd850", + "type": "function", + "signature": "function PERMIT2() view returns (address)" + }, + "0x585cc6a5": { + "selector": "0x585cc6a5", + "type": "function", + "signature": "function PROTOCOL_TOKEN() view returns (address)" + }, + "0xb3b48afb": { + "selector": "0xb3b48afb", + "type": "function", + "signature": "function SWAPPER_REGISTRY() view returns (address)" + }, + "0x13f6986d": { + "selector": "0x13f6986d", + "type": "function", + "signature": "function acceptPendingGovernor()" + }, + "0x910cab11": { + "selector": "0x910cab11", + "type": "function", + "signature": "function allowanceTarget() view returns (address)" + }, + "0x62b850c7": { + "selector": "0x62b850c7", + "type": "function", + "signature": "function batchPermitTakeFromCaller((address token, uint256 amount)[] _tokens, uint256 _nonce, uint256 _deadline, bytes _signature, address _recipient) payable" + }, + "0xfa0c9555": { + "selector": "0xfa0c9555", + "type": "function", + "signature": "function deposit(address _hub, address _from, address _to, uint256 _amount, uint32 _amountOfSwaps, uint32 _swapInterval, address _owner, (address operator, uint8[] permissions)[] _permissions, bytes _miscellaneous) payable returns (uint256 _positionId)" + }, + "0x89352328": { + "selector": "0x89352328", + "type": "function", + "signature": "function depositWithBalanceOnContract(address _hub, address _from, address _to, uint32 _amountOfSwaps, uint32 _swapInterval, address _owner, (address operator, uint8[] permissions)[] _permissions, bytes _miscellaneous) payable returns (uint256 _positionId)" + }, + "0x484b3577": { + "selector": "0x484b3577", + "type": "function", + "signature": "function getNextSwapInfo(address _hub, (address tokenA, address tokenB)[] _pairs, bool _calculatePrivilegedAvailability, bytes _oracleData) view returns (((address token, uint256 reward, uint256 toProvide, uint256 platformFee)[] tokens, (address tokenA, address tokenB, uint256 totalAmountToSwapTokenA, uint256 totalAmountToSwapTokenB, uint256 ratioAToB, uint256 ratioBToA, bytes1 intervalsInSwap)[] pairs))" + }, + "0x0c340a24": { + "selector": "0x0c340a24", + "type": "function", + "signature": "function governor() view returns (address)" + }, + "0x05ce20d6": { + "selector": "0x05ce20d6", + "type": "function", + "signature": "function increasePosition(address _hub, uint256 _positionId, uint256 _amount, uint32 _newSwaps) payable" + }, + "0x40c5710c": { + "selector": "0x40c5710c", + "type": "function", + "signature": "function increasePositionWithBalanceOnContract(address _hub, uint256 _positionId, uint32 _newSwaps) payable" + }, + "0xe43581b8": { + "selector": "0xe43581b8", + "type": "function", + "signature": "function isGovernor(address _account) view returns (bool)" + }, + "0xdf08aed5": { + "selector": "0xdf08aed5", + "type": "function", + "signature": "function isPendingGovernor(address _account) view returns (bool)" + }, + "0x5684c275": { + "selector": "0x5684c275", + "type": "function", + "signature": "function legacyGetNextSwapInfo(address _hub, (address tokenA, address tokenB)[] _pairs) view returns (((address token, uint256 reward, uint256 toProvide, uint256 platformFee)[] tokens, (address tokenA, address tokenB, uint256 ratioAToB, uint256 ratioBToA, bytes1 intervalsInSwap)[] pairs))" + }, + "0x62dd9af3": { + "selector": "0x62dd9af3", + "type": "function", + "signature": "function multiPermissionPermit(address _permissionManager, (uint256 tokenId, (address operator, uint8[] permissions)[] permissionSets)[] _permissions, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s) payable" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] _data) payable returns (bytes[] _results)" + }, + "0xe3056a34": { + "selector": "0xe3056a34", + "type": "function", + "signature": "function pendingGovernor() view returns (address)" + }, + "0x1f8b479d": { + "selector": "0x1f8b479d", + "type": "function", + "signature": "function permissionPermit(address _permissionManager, (address operator, uint8[] permissions)[] _permissions, uint256 _tokenId, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s) payable" + }, + "0xd9a673ef": { + "selector": "0xd9a673ef", + "type": "function", + "signature": "function permitTakeFromCaller(address _token, uint256 _amount, uint256 _nonce, uint256 _deadline, bytes _signature, address _recipient) payable" + }, + "0xdb8266de": { + "selector": "0xdb8266de", + "type": "function", + "signature": "function reducePosition(address _hub, uint256 _positionId, uint256 _amount, uint32 _newSwaps, address _recipient) payable" + }, + "0xe9c04071": { + "selector": "0xe9c04071", + "type": "function", + "signature": "function revokeAllowances((address spender, address[] tokens)[] _revokeActions)" + }, + "0x5d25d6eb": { + "selector": "0x5d25d6eb", + "type": "function", + "signature": "function runSwap(address _allowanceToken, uint256 _value, bytes _swapData, address _tokenOut, uint256 _minTokenOut) payable returns (uint256 _amountOut)" + }, + "0xbb2871a5": { + "selector": "0xbb2871a5", + "type": "function", + "signature": "function secondsUntilNextSwap(address _hub, (address tokenA, address tokenB)[] _pairs, bool _calculatePrivilegedAvailability) view returns (uint256[])" + }, + "0x340b532f": { + "selector": "0x340b532f", + "type": "function", + "signature": "function sendBalanceOnContractToRecipient(address _token, address _recipient) payable" + }, + "0x3a79d674": { + "selector": "0x3a79d674", + "type": "function", + "signature": "function sendToRecipient(address _token, uint256 _amount, address _recipient) payable" + }, + "0xf235757f": { + "selector": "0xf235757f", + "type": "function", + "signature": "function setPendingGovernor(address _pendingGovernor)" + }, + "0xeffca705": { + "selector": "0xeffca705", + "type": "function", + "signature": "function setSwapper(address _newSwapper, address _newAllowanceTarget)" + }, + "0x3ed242b4": { + "selector": "0x3ed242b4", + "type": "function", + "signature": "function simulate(bytes[] _calls) payable returns ((bool success, bytes result, uint256 gasSpent)[] _results)" + }, + "0xbcbef206": { + "selector": "0xbcbef206", + "type": "function", + "signature": "function simulateAndRevert(bytes _call) payable" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 _interfaceId) view returns (bool)" + }, + "0x2b3297f9": { + "selector": "0x2b3297f9", + "type": "function", + "signature": "function swapper() view returns (address)" + }, + "0x37b0c09d": { + "selector": "0x37b0c09d", + "type": "function", + "signature": "function takeFromCaller(address _token, uint256 _amount, address _recipient) payable" + }, + "0x5f963dcf": { + "selector": "0x5f963dcf", + "type": "function", + "signature": "function terminate(address _hub, uint256 _positionId, address _recipientUnswapped, address _recipientSwapped) payable returns (uint256 _unswapped, uint256 _swapped)" + }, + "0x1f66925c": { + "selector": "0x1f66925c", + "type": "function", + "signature": "function withdrawSwapped(address _hub, uint256 _positionId, address _recipient) payable returns (uint256 _swapped)" + }, + "0x35ac2a50": { + "selector": "0x35ac2a50", + "type": "function", + "signature": "function withdrawSwappedMany(address _hub, (address token, uint256[] positionIds)[] _positions, address _recipient) payable returns (uint256[] _withdrawn)" + } + }, + "GMXPositionRouter": { + "0x126082cf": { + "selector": "0x126082cf", + "type": "function", + "signature": "function BASIS_POINTS_DIVISOR() view returns (uint256)" + }, + "0xf851a440": { + "selector": "0xf851a440", + "type": "function", + "signature": "function admin() view returns (address)" + }, + "0xe1f21c67": { + "selector": "0xe1f21c67", + "type": "function", + "signature": "function approve(address _token, address _spender, uint256 _amount)" + }, + "0x24f74697": { + "selector": "0x24f74697", + "type": "function", + "signature": "function callbackGasLimit() view returns (uint256)" + }, + "0x60a362e2": { + "selector": "0x60a362e2", + "type": "function", + "signature": "function cancelDecreasePosition(bytes32 _key, address _executionFeeReceiver) returns (bool)" + }, + "0x225fc9fd": { + "selector": "0x225fc9fd", + "type": "function", + "signature": "function cancelIncreasePosition(bytes32 _key, address _executionFeeReceiver) returns (bool)" + }, + "0x7be7d141": { + "selector": "0x7be7d141", + "type": "function", + "signature": "function createDecreasePosition(address[] _path, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver, uint256 _acceptablePrice, uint256 _minOut, uint256 _executionFee, bool _withdrawETH, address _callbackTarget) payable returns (bytes32)" + }, + "0xf2ae372f": { + "selector": "0xf2ae372f", + "type": "function", + "signature": "function createIncreasePosition(address[] _path, address _indexToken, uint256 _amountIn, uint256 _minOut, uint256 _sizeDelta, bool _isLong, uint256 _acceptablePrice, uint256 _executionFee, bytes32 _referralCode, address _callbackTarget) payable returns (bytes32)" + }, + "0x5b88e8c6": { + "selector": "0x5b88e8c6", + "type": "function", + "signature": "function createIncreasePositionETH(address[] _path, address _indexToken, uint256 _minOut, uint256 _sizeDelta, bool _isLong, uint256 _acceptablePrice, uint256 _executionFee, bytes32 _referralCode, address _callbackTarget) payable returns (bytes32)" + }, + "0x4278555f": { + "selector": "0x4278555f", + "type": "function", + "signature": "function decreasePositionRequestKeys(uint256) view returns (bytes32)" + }, + "0x1bca8cf0": { + "selector": "0x1bca8cf0", + "type": "function", + "signature": "function decreasePositionRequestKeysStart() view returns (uint256)" + }, + "0x1f285106": { + "selector": "0x1f285106", + "type": "function", + "signature": "function decreasePositionRequests(bytes32) view returns (address account, address indexToken, uint256 collateralDelta, uint256 sizeDelta, bool isLong, address receiver, uint256 acceptablePrice, uint256 minOut, uint256 executionFee, uint256 blockNumber, uint256 blockTime, bool withdrawETH, address callbackTarget)" + }, + "0xfa444577": { + "selector": "0xfa444577", + "type": "function", + "signature": "function decreasePositionsIndex(address) view returns (uint256)" + }, + "0x67a52793": { + "selector": "0x67a52793", + "type": "function", + "signature": "function depositFee() view returns (uint256)" + }, + "0x0d4d003d": { + "selector": "0x0d4d003d", + "type": "function", + "signature": "function executeDecreasePosition(bytes32 _key, address _executionFeeReceiver) returns (bool)" + }, + "0xf3883d8b": { + "selector": "0xf3883d8b", + "type": "function", + "signature": "function executeDecreasePositions(uint256 _endIndex, address _executionFeeReceiver)" + }, + "0x27b42c0f": { + "selector": "0x27b42c0f", + "type": "function", + "signature": "function executeIncreasePosition(bytes32 _key, address _executionFeeReceiver) returns (bool)" + }, + "0x9a208100": { + "selector": "0x9a208100", + "type": "function", + "signature": "function executeIncreasePositions(uint256 _endIndex, address _executionFeeReceiver)" + }, + "0x1ce9cb8f": { + "selector": "0x1ce9cb8f", + "type": "function", + "signature": "function feeReserves(address) view returns (uint256)" + }, + "0x5d5c22e8": { + "selector": "0x5d5c22e8", + "type": "function", + "signature": "function getDecreasePositionRequestPath(bytes32 _key) view returns (address[])" + }, + "0x95e9bbd7": { + "selector": "0x95e9bbd7", + "type": "function", + "signature": "function getIncreasePositionRequestPath(bytes32 _key) view returns (address[])" + }, + "0x62f8a3fe": { + "selector": "0x62f8a3fe", + "type": "function", + "signature": "function getRequestKey(address _account, uint256 _index) pure returns (bytes32)" + }, + "0xf2cea6a5": { + "selector": "0xf2cea6a5", + "type": "function", + "signature": "function getRequestQueueLengths() view returns (uint256, uint256, uint256, uint256)" + }, + "0x12d43a51": { + "selector": "0x12d43a51", + "type": "function", + "signature": "function gov() view returns (address)" + }, + "0x98d1e03a": { + "selector": "0x98d1e03a", + "type": "function", + "signature": "function increasePositionBufferBps() view returns (uint256)" + }, + "0x04225954": { + "selector": "0x04225954", + "type": "function", + "signature": "function increasePositionRequestKeys(uint256) view returns (bytes32)" + }, + "0x9b578620": { + "selector": "0x9b578620", + "type": "function", + "signature": "function increasePositionRequestKeysStart() view returns (uint256)" + }, + "0xfaf990f3": { + "selector": "0xfaf990f3", + "type": "function", + "signature": "function increasePositionRequests(bytes32) view returns (address account, address indexToken, uint256 amountIn, uint256 minOut, uint256 sizeDelta, bool isLong, uint256 acceptablePrice, uint256 executionFee, uint256 blockNumber, uint256 blockTime, bool hasCollateralInETH, address callbackTarget)" + }, + "0x633451de": { + "selector": "0x633451de", + "type": "function", + "signature": "function increasePositionsIndex(address) view returns (uint256)" + }, + "0x3e72a262": { + "selector": "0x3e72a262", + "type": "function", + "signature": "function isLeverageEnabled() view returns (bool)" + }, + "0x36eba48a": { + "selector": "0x36eba48a", + "type": "function", + "signature": "function isPositionKeeper(address) view returns (bool)" + }, + "0x1045c74e": { + "selector": "0x1045c74e", + "type": "function", + "signature": "function maxGlobalLongSizes(address) view returns (uint256)" + }, + "0x9698d25a": { + "selector": "0x9698d25a", + "type": "function", + "signature": "function maxGlobalShortSizes(address) view returns (uint256)" + }, + "0xcb0269c9": { + "selector": "0xcb0269c9", + "type": "function", + "signature": "function maxTimeDelay() view returns (uint256)" + }, + "0x5841fcaa": { + "selector": "0x5841fcaa", + "type": "function", + "signature": "function minBlockDelayKeeper() view returns (uint256)" + }, + "0x63ae2103": { + "selector": "0x63ae2103", + "type": "function", + "signature": "function minExecutionFee() view returns (uint256)" + }, + "0x3a2a80c7": { + "selector": "0x3a2a80c7", + "type": "function", + "signature": "function minTimeDelayPublic() view returns (uint256)" + }, + "0x006cc35e": { + "selector": "0x006cc35e", + "type": "function", + "signature": "function referralStorage() view returns (address)" + }, + "0xf887ea40": { + "selector": "0xf887ea40", + "type": "function", + "signature": "function router() view returns (address)" + }, + "0x24a084df": { + "selector": "0x24a084df", + "type": "function", + "signature": "function sendValue(address _receiver, uint256 _amount)" + }, + "0x704b6c02": { + "selector": "0x704b6c02", + "type": "function", + "signature": "function setAdmin(address _admin)" + }, + "0x8a54942f": { + "selector": "0x8a54942f", + "type": "function", + "signature": "function setCallbackGasLimit(uint256 _callbackGasLimit)" + }, + "0x4067b132": { + "selector": "0x4067b132", + "type": "function", + "signature": "function setDelayValues(uint256 _minBlockDelayKeeper, uint256 _minTimeDelayPublic, uint256 _maxTimeDelay)" + }, + "0x490ae210": { + "selector": "0x490ae210", + "type": "function", + "signature": "function setDepositFee(uint256 _depositFee)" + }, + "0xcfad57a2": { + "selector": "0xcfad57a2", + "type": "function", + "signature": "function setGov(address _gov)" + }, + "0x233bfe3b": { + "selector": "0x233bfe3b", + "type": "function", + "signature": "function setIncreasePositionBufferBps(uint256 _increasePositionBufferBps)" + }, + "0x7c2eb9f7": { + "selector": "0x7c2eb9f7", + "type": "function", + "signature": "function setIsLeverageEnabled(bool _isLeverageEnabled)" + }, + "0xef12c67e": { + "selector": "0xef12c67e", + "type": "function", + "signature": "function setMaxGlobalSizes(address[] _tokens, uint256[] _longSizes, uint256[] _shortSizes)" + }, + "0xfc2cee62": { + "selector": "0xfc2cee62", + "type": "function", + "signature": "function setMinExecutionFee(uint256 _minExecutionFee)" + }, + "0x3422ead1": { + "selector": "0x3422ead1", + "type": "function", + "signature": "function setPositionKeeper(address _account, bool _isActive)" + }, + "0xae4d7f9a": { + "selector": "0xae4d7f9a", + "type": "function", + "signature": "function setReferralStorage(address _referralStorage)" + }, + "0x308aa81f": { + "selector": "0x308aa81f", + "type": "function", + "signature": "function setRequestKeysStartValues(uint256 _increasePositionRequestKeysStart, uint256 _decreasePositionRequestKeysStart)" + }, + "0x657bc5d0": { + "selector": "0x657bc5d0", + "type": "function", + "signature": "function shortsTracker() view returns (address)" + }, + "0xfbfa77cf": { + "selector": "0xfbfa77cf", + "type": "function", + "signature": "function vault() view returns (address)" + }, + "0x3fc8cef3": { + "selector": "0x3fc8cef3", + "type": "function", + "signature": "function weth() view returns (address)" + }, + "0xf2555278": { + "selector": "0xf2555278", + "type": "function", + "signature": "function withdrawFees(address _token, address _receiver)" + } + }, + "GMXOrderHandler": { + "0xbdec9c0d": { + "selector": "0xbdec9c0d", + "type": "error", + "signature": "error CompactedArrayOutOfBounds(uint256[] compactedValues, uint256 index, uint256 slotIndex, string label)" + }, + "0xdd70e0c9": { + "selector": "0xdd70e0c9", + "type": "error", + "signature": "error DisabledFeature(bytes32 key)" + }, + "0x09f8c937": { + "selector": "0x09f8c937", + "type": "error", + "signature": "error DisabledMarket(address market)" + }, + "0x693ebfba": { + "selector": "0x693ebfba", + "type": "error", + "signature": "error EmptyCompactedBlockNumber(uint256 index)" + }, + "0x05fbc1ae": { + "selector": "0x05fbc1ae", + "type": "error", + "signature": "error EmptyMarket()" + }, + "0x16307797": { + "selector": "0x16307797", + "type": "error", + "signature": "error EmptyOrder()" + }, + "0x4e48dcda": { + "selector": "0x4e48dcda", + "type": "error", + "signature": "error EndOfOracleSimulation()" + }, + "0x5dac504d": { + "selector": "0x5dac504d", + "type": "error", + "signature": "error InsufficientExecutionFee(uint256 minExecutionFee, uint256 executionFee)" + }, + "0xbb416f93": { + "selector": "0xbb416f93", + "type": "error", + "signature": "error InsufficientExecutionGas(uint256 startingGas, uint256 estimatedGasLimit, uint256 minAdditionalGasForExecution)" + }, + "0x79293964": { + "selector": "0x79293964", + "type": "error", + "signature": "error InsufficientExecutionGasForErrorHandling(uint256 startingGas, uint256 minHandleErrorGas)" + }, + "0x3083b9e5": { + "selector": "0x3083b9e5", + "type": "error", + "signature": "error InsufficientHandleExecutionErrorGas(uint256 gas, uint256 minHandleExecutionErrorGas)" + }, + "0xe5feddc0": { + "selector": "0xe5feddc0", + "type": "error", + "signature": "error InvalidKeeperForFrozenOrder(address keeper)" + }, + "0x663de023": { + "selector": "0x663de023", + "type": "error", + "signature": "error InvalidPrimaryPricesForSimulation(uint256 primaryTokensLength, uint256 primaryPricesLength)" + }, + "0xcb9bd134": { + "selector": "0xcb9bd134", + "type": "error", + "signature": "error InvalidSwapMarket(address market)" + }, + "0x9aba92cb": { + "selector": "0x9aba92cb", + "type": "error", + "signature": "error OrderNotUpdatable(uint256 orderType)" + }, + "0xe8266438": { + "selector": "0xe8266438", + "type": "error", + "signature": "error RequestNotYetCancellable(uint256 requestAge, uint256 requestExpirationAge, string requestType)" + }, + "0xa35b150b": { + "selector": "0xa35b150b", + "type": "error", + "signature": "error Unauthorized(address msgSender, string role)" + }, + "0xb6029281": { + "selector": "0xb6029281", + "type": "error", + "signature": "error UnsupportedOracleBlockNumberType(uint256 oracleBlockNumberType)" + }, + "0xc1c00831": { + "selector": "0xc1c00831", + "type": "error", + "signature": "error UnsupportedOrderType()" + }, + "0xaf6c1dc3": { + "selector": "0xaf6c1dc3", + "type": "function", + "signature": "function _executeOrder(bytes32 key, ((address account, address receiver, address callbackContract, address uiFeeReceiver, address market, address initialCollateralToken, address[] swapPath) addresses, (uint8 orderType, uint8 decreasePositionSwapType, uint256 sizeDeltaUsd, uint256 initialCollateralDeltaAmount, uint256 triggerPrice, uint256 acceptablePrice, uint256 executionFee, uint256 callbackGasLimit, uint256 minOutputAmount, uint256 updatedAtBlock) numbers, (bool isLong, bool shouldUnwrapNativeToken, bool isFrozen) flags) order, (uint256 signerInfo, address[] tokens, uint256[] compactedMinOracleBlockNumbers, uint256[] compactedMaxOracleBlockNumbers, uint256[] compactedOracleTimestamps, uint256[] compactedDecimals, uint256[] compactedMinPrices, uint256[] compactedMinPricesIndexes, uint256[] compactedMaxPrices, uint256[] compactedMaxPricesIndexes, bytes[] signatures, address[] priceFeedTokens, address[] realtimeFeedTokens, bytes[] realtimeFeedData) oracleParams, address keeper)" + }, + "0x7489ec23": { + "selector": "0x7489ec23", + "type": "function", + "signature": "function cancelOrder(bytes32 key)" + }, + "0xe3146172": { + "selector": "0xe3146172", + "type": "function", + "signature": "function createOrder(address account, ((address receiver, address callbackContract, address uiFeeReceiver, address market, address initialCollateralToken, address[] swapPath) addresses, (uint256 sizeDeltaUsd, uint256 initialCollateralDeltaAmount, uint256 triggerPrice, uint256 acceptablePrice, uint256 executionFee, uint256 callbackGasLimit, uint256 minOutputAmount) numbers, uint8 orderType, uint8 decreasePositionSwapType, bool isLong, bool shouldUnwrapNativeToken, bytes32 referralCode) params) returns (bytes32)" + }, + "0x660d0d67": { + "selector": "0x660d0d67", + "type": "function", + "signature": "function dataStore() view returns (address)" + }, + "0x9ff78c30": { + "selector": "0x9ff78c30", + "type": "function", + "signature": "function eventEmitter() view returns (address)" + }, + "0x943a6f4a": { + "selector": "0x943a6f4a", + "type": "function", + "signature": "function executeOrder(bytes32 key, (uint256 signerInfo, address[] tokens, uint256[] compactedMinOracleBlockNumbers, uint256[] compactedMaxOracleBlockNumbers, uint256[] compactedOracleTimestamps, uint256[] compactedDecimals, uint256[] compactedMinPrices, uint256[] compactedMinPricesIndexes, uint256[] compactedMaxPrices, uint256[] compactedMaxPricesIndexes, bytes[] signatures, address[] priceFeedTokens, address[] realtimeFeedTokens, bytes[] realtimeFeedData) oracleParams)" + }, + "0x7dc0d1d0": { + "selector": "0x7dc0d1d0", + "type": "function", + "signature": "function oracle() view returns (address)" + }, + "0x93845e46": { + "selector": "0x93845e46", + "type": "function", + "signature": "function orderVault() view returns (address)" + }, + "0x006cc35e": { + "selector": "0x006cc35e", + "type": "function", + "signature": "function referralStorage() view returns (address)" + }, + "0x4a4a7b04": { + "selector": "0x4a4a7b04", + "type": "function", + "signature": "function roleStore() view returns (address)" + }, + "0x263ea0fa": { + "selector": "0x263ea0fa", + "type": "function", + "signature": "function simulateExecuteOrder(bytes32 key, (address[] primaryTokens, (uint256 min, uint256 max)[] primaryPrices) params)" + }, + "0x8a53aaac": { + "selector": "0x8a53aaac", + "type": "function", + "signature": "function swapHandler() view returns (address)" + }, + "0x96fe6a93": { + "selector": "0x96fe6a93", + "type": "function", + "signature": "function updateOrder(bytes32 key, uint256 sizeDeltaUsd, uint256 acceptablePrice, uint256 triggerPrice, uint256 minOutputAmount, ((address account, address receiver, address callbackContract, address uiFeeReceiver, address market, address initialCollateralToken, address[] swapPath) addresses, (uint8 orderType, uint8 decreasePositionSwapType, uint256 sizeDeltaUsd, uint256 initialCollateralDeltaAmount, uint256 triggerPrice, uint256 acceptablePrice, uint256 executionFee, uint256 callbackGasLimit, uint256 minOutputAmount, uint256 updatedAtBlock) numbers, (bool isLong, bool shouldUnwrapNativeToken, bool isFrozen) flags) order)" + } + }, + "ExchangeRouter": { + "0xec6d89c8": { + "selector": "0xec6d89c8", + "type": "error", + "signature": "error CollateralAlreadyClaimed(uint256 adjustedClaimableAmount, uint256 claimedAmount)" + }, + "0xdd70e0c9": { + "selector": "0xdd70e0c9", + "type": "error", + "signature": "error DisabledFeature(bytes32 key)" + }, + "0x09f8c937": { + "selector": "0x09f8c937", + "type": "error", + "signature": "error DisabledMarket(address market)" + }, + "0xe474a425": { + "selector": "0xe474a425", + "type": "error", + "signature": "error EmptyAddressInMarketTokenBalanceValidation(address market, address token)" + }, + "0x95b66fe9": { + "selector": "0x95b66fe9", + "type": "error", + "signature": "error EmptyDeposit()" + }, + "0xe9b78bd4": { + "selector": "0xe9b78bd4", + "type": "error", + "signature": "error EmptyHoldingAddress()" + }, + "0x05fbc1ae": { + "selector": "0x05fbc1ae", + "type": "error", + "signature": "error EmptyMarket()" + }, + "0x16307797": { + "selector": "0x16307797", + "type": "error", + "signature": "error EmptyOrder()" + }, + "0xd551823d": { + "selector": "0xd551823d", + "type": "error", + "signature": "error EmptyReceiver()" + }, + "0x9fc297fa": { + "selector": "0x9fc297fa", + "type": "error", + "signature": "error EmptyTokenTranferGasLimit(address token)" + }, + "0x5b3043dd": { + "selector": "0x5b3043dd", + "type": "error", + "signature": "error InvalidClaimAffiliateRewardsInput(uint256 marketsLength, uint256 tokensLength)" + }, + "0x42c0d1f2": { + "selector": "0x42c0d1f2", + "type": "error", + "signature": "error InvalidClaimCollateralInput(uint256 marketsLength, uint256 tokensLength, uint256 timeKeysLength)" + }, + "0x7363cfa5": { + "selector": "0x7363cfa5", + "type": "error", + "signature": "error InvalidClaimFundingFeesInput(uint256 marketsLength, uint256 tokensLength)" + }, + "0x74cee48d": { + "selector": "0x74cee48d", + "type": "error", + "signature": "error InvalidClaimUiFeesInput(uint256 marketsLength, uint256 tokensLength)" + }, + "0x33a1ea6b": { + "selector": "0x33a1ea6b", + "type": "error", + "signature": "error InvalidMarketTokenBalance(address market, address token, uint256 balance, uint256 expectedMinBalance)" + }, + "0x9dd026db": { + "selector": "0x9dd026db", + "type": "error", + "signature": "error InvalidMarketTokenBalanceForClaimableFunding(address market, address token, uint256 balance, uint256 claimableFundingFeeAmount)" + }, + "0x808c464f": { + "selector": "0x808c464f", + "type": "error", + "signature": "error InvalidMarketTokenBalanceForCollateralAmount(address market, address token, uint256 balance, uint256 collateralAmount)" + }, + "0x81468139": { + "selector": "0x81468139", + "type": "error", + "signature": "error InvalidUiFeeFactor(uint256 uiFeeFactor, uint256 maxUiFeeFactor)" + }, + "0x979dc780": { + "selector": "0x979dc780", + "type": "error", + "signature": "error TokenTransferError(address token, address receiver, uint256 amount)" + }, + "0xa35b150b": { + "selector": "0xa35b150b", + "type": "error", + "signature": "error Unauthorized(address msgSender, string role)" + }, + "0x31404484": { + "selector": "0x31404484", + "type": "function", + "signature": "function cancelDeposit(bytes32 key) payable" + }, + "0x7489ec23": { + "selector": "0x7489ec23", + "type": "function", + "signature": "function cancelOrder(bytes32 key) payable" + }, + "0x7213c5a0": { + "selector": "0x7213c5a0", + "type": "function", + "signature": "function cancelWithdrawal(bytes32 key) payable" + }, + "0x49287a22": { + "selector": "0x49287a22", + "type": "function", + "signature": "function claimAffiliateRewards(address[] markets, address[] tokens, address receiver) payable returns (uint256[])" + }, + "0xe9249b57": { + "selector": "0xe9249b57", + "type": "function", + "signature": "function claimCollateral(address[] markets, address[] tokens, uint256[] timeKeys, address receiver) payable returns (uint256[])" + }, + "0xc41b1ab3": { + "selector": "0xc41b1ab3", + "type": "function", + "signature": "function claimFundingFees(address[] markets, address[] tokens, address receiver) payable returns (uint256[])" + }, + "0x01a9cbb2": { + "selector": "0x01a9cbb2", + "type": "function", + "signature": "function claimUiFees(address[] markets, address[] tokens, address receiver) payable returns (uint256[])" + }, + "0x5b4e9561": { + "selector": "0x5b4e9561", + "type": "function", + "signature": "function createDeposit((address receiver, address callbackContract, address uiFeeReceiver, address market, address initialLongToken, address initialShortToken, address[] longTokenSwapPath, address[] shortTokenSwapPath, uint256 minMarketTokens, bool shouldUnwrapNativeToken, uint256 executionFee, uint256 callbackGasLimit) params) payable returns (bytes32)" + }, + "0x4a393a41": { + "selector": "0x4a393a41", + "type": "function", + "signature": "function createOrder(((address receiver, address callbackContract, address uiFeeReceiver, address market, address initialCollateralToken, address[] swapPath) addresses, (uint256 sizeDeltaUsd, uint256 initialCollateralDeltaAmount, uint256 triggerPrice, uint256 acceptablePrice, uint256 executionFee, uint256 callbackGasLimit, uint256 minOutputAmount) numbers, uint8 orderType, uint8 decreasePositionSwapType, bool isLong, bool shouldUnwrapNativeToken, bytes32 referralCode) params) payable returns (bytes32)" + }, + "0xad23c5a1": { + "selector": "0xad23c5a1", + "type": "function", + "signature": "function createWithdrawal((address receiver, address callbackContract, address uiFeeReceiver, address market, address[] longTokenSwapPath, address[] shortTokenSwapPath, uint256 minLongTokenAmount, uint256 minShortTokenAmount, bool shouldUnwrapNativeToken, uint256 executionFee, uint256 callbackGasLimit) params) payable returns (bytes32)" + }, + "0x660d0d67": { + "selector": "0x660d0d67", + "type": "function", + "signature": "function dataStore() view returns (address)" + }, + "0x9c8b2cfb": { + "selector": "0x9c8b2cfb", + "type": "function", + "signature": "function depositHandler() view returns (address)" + }, + "0x9ff78c30": { + "selector": "0x9ff78c30", + "type": "function", + "signature": "function eventEmitter() view returns (address)" + }, + "0xac9650d8": { + "selector": "0xac9650d8", + "type": "function", + "signature": "function multicall(bytes[] data) payable returns (bytes[] results)" + }, + "0xb5848305": { + "selector": "0xb5848305", + "type": "function", + "signature": "function orderHandler() view returns (address)" + }, + "0x4a4a7b04": { + "selector": "0x4a4a7b04", + "type": "function", + "signature": "function roleStore() view returns (address)" + }, + "0xf887ea40": { + "selector": "0xf887ea40", + "type": "function", + "signature": "function router() view returns (address)" + }, + "0x53ead2d3": { + "selector": "0x53ead2d3", + "type": "function", + "signature": "function sendNativeToken(address receiver, uint256 amount) payable" + }, + "0xe6d66ac8": { + "selector": "0xe6d66ac8", + "type": "function", + "signature": "function sendTokens(address token, address receiver, uint256 amount) payable" + }, + "0x7d39aaf1": { + "selector": "0x7d39aaf1", + "type": "function", + "signature": "function sendWnt(address receiver, uint256 amount) payable" + }, + "0x073fb09e": { + "selector": "0x073fb09e", + "type": "function", + "signature": "function setSavedCallbackContract(address market, address callbackContract) payable" + }, + "0x5a03cd94": { + "selector": "0x5a03cd94", + "type": "function", + "signature": "function setUiFeeFactor(uint256 uiFeeFactor) payable" + }, + "0xb9e2f5ee": { + "selector": "0xb9e2f5ee", + "type": "function", + "signature": "function simulateExecuteDeposit(bytes32 key, (address[] primaryTokens, (uint256 min, uint256 max)[] primaryPrices) simulatedOracleParams) payable" + }, + "0x263ea0fa": { + "selector": "0x263ea0fa", + "type": "function", + "signature": "function simulateExecuteOrder(bytes32 key, (address[] primaryTokens, (uint256 min, uint256 max)[] primaryPrices) simulatedOracleParams) payable" + }, + "0x6331d7a7": { + "selector": "0x6331d7a7", + "type": "function", + "signature": "function simulateExecuteWithdrawal(bytes32 key, (address[] primaryTokens, (uint256 min, uint256 max)[] primaryPrices) simulatedOracleParams) payable" + }, + "0xaab286f8": { + "selector": "0xaab286f8", + "type": "function", + "signature": "function updateOrder(bytes32 key, uint256 sizeDeltaUsd, uint256 acceptablePrice, uint256 triggerPrice, uint256 minOutputAmount) payable" + }, + "0x2c2f3c07": { + "selector": "0x2c2f3c07", + "type": "function", + "signature": "function withdrawalHandler() view returns (address)" + } + }, + "SocketGateway": { + "0xa24a13a6": { + "selector": "0xa24a13a6", + "type": "error", + "signature": "error ArrayLengthMismatch()" + }, + "0xc963e34d": { + "selector": "0xc963e34d", + "type": "error", + "signature": "error IncorrectBridgeRatios()" + }, + "0x7c91ccdd": { + "selector": "0x7c91ccdd", + "type": "error", + "signature": "error OnlyNominee()" + }, + "0x5fc483c5": { + "selector": "0x5fc483c5", + "type": "error", + "signature": "error OnlyOwner()" + }, + "0x8579befe": { + "selector": "0x8579befe", + "type": "error", + "signature": "error ZeroAddressNotAllowed()" + }, + "0x52283e35": { + "selector": "0x52283e35", + "type": "function", + "signature": "function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)" + }, + "0xa69685b5": { + "selector": "0xa69685b5", + "type": "function", + "signature": "function CENT_PERCENT() view returns (uint256)" + }, + "0xa7fc7a07": { + "selector": "0xa7fc7a07", + "type": "function", + "signature": "function addController(address controllerAddress) returns (uint32)" + }, + "0x8c95ff1e": { + "selector": "0x8c95ff1e", + "type": "function", + "signature": "function addRoute(address routeAddress) returns (uint32)" + }, + "0x915ad7e9": { + "selector": "0x915ad7e9", + "type": "function", + "signature": "function addressAt(uint32 routeId) view returns (address)" + }, + "0x3bd1adec": { + "selector": "0x3bd1adec", + "type": "function", + "signature": "function claimOwner()" + }, + "0x15b9a8b8": { + "selector": "0x15b9a8b8", + "type": "function", + "signature": "function controllerCount() view returns (uint32)" + }, + "0x90ea7413": { + "selector": "0x90ea7413", + "type": "function", + "signature": "function controllers(uint32) view returns (address)" + }, + "0x734427c8": { + "selector": "0x734427c8", + "type": "function", + "signature": "function disableController(uint32 controllerId)" + }, + "0x9e0bbd9f": { + "selector": "0x9e0bbd9f", + "type": "function", + "signature": "function disableRoute(uint32 routeId)" + }, + "0x42cf3527": { + "selector": "0x42cf3527", + "type": "function", + "signature": "function disabledRouteAddress() view returns (address)" + }, + "0x37c6145a": { + "selector": "0x37c6145a", + "type": "function", + "signature": "function executeController((uint32 controllerId, bytes data) socketControllerRequest) payable returns (bytes)" + }, + "0x5dbd8f6b": { + "selector": "0x5dbd8f6b", + "type": "function", + "signature": "function executeControllers((uint32 controllerId, bytes data)[] controllerRequests) payable" + }, + "0x1028c2bd": { + "selector": "0x1028c2bd", + "type": "function", + "signature": "function executeRoute(uint32 routeId, bytes routeData) payable returns (bytes)" + }, + "0xc3540448": { + "selector": "0xc3540448", + "type": "function", + "signature": "function executeRoutes(uint32[] routeIds, bytes[] dataItems) payable" + }, + "0xa67f534d": { + "selector": "0xa67f534d", + "type": "function", + "signature": "function getController(uint32 controllerId) view returns (address)" + }, + "0x7095d471": { + "selector": "0x7095d471", + "type": "function", + "signature": "function getRoute(uint32 routeId) view returns (address)" + }, + "0x5b94db27": { + "selector": "0x5b94db27", + "type": "function", + "signature": "function nominateOwner(address nominee_)" + }, + "0x20f99c0a": { + "selector": "0x20f99c0a", + "type": "function", + "signature": "function nominee() view returns (address)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0xe42e0ea9": { + "selector": "0xe42e0ea9", + "type": "function", + "signature": "function rescueEther(address userAddress, uint256 amount)" + }, + "0x6ccae054": { + "selector": "0x6ccae054", + "type": "function", + "signature": "function rescueFunds(address token, address userAddress, uint256 amount)" + }, + "0x263af8e8": { + "selector": "0x263af8e8", + "type": "function", + "signature": "function routes(uint32) view returns (address)" + }, + "0xfd326921": { + "selector": "0xfd326921", + "type": "function", + "signature": "function routesCount() view returns (uint32)" + }, + "0x82230446": { + "selector": "0x82230446", + "type": "function", + "signature": "function setApprovalForRouters(address[] routeAddresses, address[] tokenAddresses, bool isMax)" + }, + "0x96f4130c": { + "selector": "0x96f4130c", + "type": "function", + "signature": "function swapAndMultiBridge((uint32 swapRouteId, bytes swapImplData, uint32[] bridgeRouteIds, bytes[] bridgeImplDataItems, uint256[] bridgeRatios, bytes[] eventDataItems) swapMultiBridgeRequest) payable" + } + }, + "JoeRouter": { + "0x73b295c2": { + "selector": "0x73b295c2", + "type": "function", + "signature": "function WAVAX() view returns (address)" + }, + "0xe8e33700": { + "selector": "0xe8e33700", + "type": "function", + "signature": "function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)" + }, + "0xf91b3f72": { + "selector": "0xf91b3f72", + "type": "function", + "signature": "function addLiquidityAVAX(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountAVAX, uint256 liquidity)" + }, + "0xc45a0155": { + "selector": "0xc45a0155", + "type": "function", + "signature": "function factory() view returns (address)" + }, + "0x85f8c259": { + "selector": "0x85f8c259", + "type": "function", + "signature": "function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)" + }, + "0x054d50d4": { + "selector": "0x054d50d4", + "type": "function", + "signature": "function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)" + }, + "0x1f00ca74": { + "selector": "0x1f00ca74", + "type": "function", + "signature": "function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)" + }, + "0xd06ca61f": { + "selector": "0xd06ca61f", + "type": "function", + "signature": "function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)" + }, + "0xad615dec": { + "selector": "0xad615dec", + "type": "function", + "signature": "function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)" + }, + "0xbaa2abde": { + "selector": "0xbaa2abde", + "type": "function", + "signature": "function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)" + }, + "0x33c6b725": { + "selector": "0x33c6b725", + "type": "function", + "signature": "function removeLiquidityAVAX(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountAVAX)" + }, + "0x73bc79cf": { + "selector": "0x73bc79cf", + "type": "function", + "signature": "function removeLiquidityAVAXSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline) returns (uint256 amountAVAX)" + }, + "0x2c407024": { + "selector": "0x2c407024", + "type": "function", + "signature": "function removeLiquidityAVAXWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountAVAX)" + }, + "0x9fc27226": { + "selector": "0x9fc27226", + "type": "function", + "signature": "function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountAVAX)" + }, + "0x2195995c": { + "selector": "0x2195995c", + "type": "function", + "signature": "function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)" + }, + "0x8a657e67": { + "selector": "0x8a657e67", + "type": "function", + "signature": "function swapAVAXForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0xa2a1623d": { + "selector": "0xa2a1623d", + "type": "function", + "signature": "function swapExactAVAXForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)" + }, + "0xc57559dd": { + "selector": "0xc57559dd", + "type": "function", + "signature": "function swapExactAVAXForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable" + }, + "0x676528d1": { + "selector": "0x676528d1", + "type": "function", + "signature": "function swapExactTokensForAVAX(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x762b1562": { + "selector": "0x762b1562", + "type": "function", + "signature": "function swapExactTokensForAVAXSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x38ed1739": { + "selector": "0x38ed1739", + "type": "function", + "signature": "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x5c11d795": { + "selector": "0x5c11d795", + "type": "function", + "signature": "function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)" + }, + "0x7a42416a": { + "selector": "0x7a42416a", + "type": "function", + "signature": "function swapTokensForExactAVAX(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + }, + "0x8803dbee": { + "selector": "0x8803dbee", + "type": "function", + "signature": "function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)" + } + }, + "LidoStETH": { + "0x046f7da2": { + "selector": "0x046f7da2", + "type": "function", + "signature": "function resume()" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() pure returns (string)" + }, + "0x07da68f5": { + "selector": "0x07da68f5", + "type": "function", + "signature": "function stop()" + }, + "0x0803fac0": { + "selector": "0x0803fac0", + "type": "function", + "signature": "function hasInitialized() view returns (bool)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address _spender, uint256 _amount) returns (bool)" + }, + "0x136dd43c": { + "selector": "0x136dd43c", + "type": "function", + "signature": "function STAKING_CONTROL_ROLE() view returns (bytes32)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0x19208451": { + "selector": "0x19208451", + "type": "function", + "signature": "function getSharesByPooledEth(uint256 _ethAmount) view returns (uint256)" + }, + "0x1ea7ca89": { + "selector": "0x1ea7ca89", + "type": "function", + "signature": "function isStakingPaused() view returns (bool)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address _sender, address _recipient, uint256 _amount) returns (bool)" + }, + "0x2914b9bd": { + "selector": "0x2914b9bd", + "type": "function", + "signature": "function getEVMScriptExecutor(bytes _script) view returns (address)" + }, + "0x2cb5f784": { + "selector": "0x2cb5f784", + "type": "function", + "signature": "function setStakingLimit(uint256 _maxStakeLimit, uint256 _stakeLimitIncreasePerBlock)" + }, + "0x2de03aa1": { + "selector": "0x2de03aa1", + "type": "function", + "signature": "function RESUME_ROLE() view returns (bytes32)" + }, + "0x2f85e57c": { + "selector": "0x2f85e57c", + "type": "function", + "signature": "function finalizeUpgrade_v2(address _lidoLocator, address _eip712StETH)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() pure returns (uint8)" + }, + "0x32f0a3b5": { + "selector": "0x32f0a3b5", + "type": "function", + "signature": "function getRecoveryVault() view returns (address)" + }, + "0x3644e515": { + "selector": "0x3644e515", + "type": "function", + "signature": "function DOMAIN_SEPARATOR() view returns (bytes32)" + }, + "0x37cfdaca": { + "selector": "0x37cfdaca", + "type": "function", + "signature": "function getTotalPooledEther() view returns (uint256)" + }, + "0x38998624": { + "selector": "0x38998624", + "type": "function", + "signature": "function unsafeChangeDepositedValidators(uint256 _newDepositedValidators)" + }, + "0x389ed267": { + "selector": "0x389ed267", + "type": "function", + "signature": "function PAUSE_ROLE() view returns (bytes32)" + }, + "0x39509351": { + "selector": "0x39509351", + "type": "function", + "signature": "function increaseAllowance(address _spender, uint256 _addedValue) returns (bool)" + }, + "0x3b19e84a": { + "selector": "0x3b19e84a", + "type": "function", + "signature": "function getTreasury() view returns (address)" + }, + "0x3f683b6a": { + "selector": "0x3f683b6a", + "type": "function", + "signature": "function isStopped() view returns (bool)" + }, + "0x47b714e0": { + "selector": "0x47b714e0", + "type": "function", + "signature": "function getBufferedEther() view returns (uint256)" + }, + "0x485cc955": { + "selector": "0x485cc955", + "type": "function", + "signature": "function initialize(address _lidoLocator, address _eip712StETH) payable" + }, + "0x4ad509b2": { + "selector": "0x4ad509b2", + "type": "function", + "signature": "function receiveELRewards() payable" + }, + "0x56396715": { + "selector": "0x56396715", + "type": "function", + "signature": "function getWithdrawalCredentials() view returns (bytes32)" + }, + "0x609c4c6c": { + "selector": "0x609c4c6c", + "type": "function", + "signature": "function getCurrentStakeLimit() view returns (uint256)" + }, + "0x665b4b0b": { + "selector": "0x665b4b0b", + "type": "function", + "signature": "function getStakeLimitFullInfo() view returns (bool isStakingPaused, bool isStakingLimitSet, uint256 currentStakeLimit, uint256 maxStakeLimit, uint256 maxStakeLimitGrowthBlocks, uint256 prevStakeLimit, uint256 prevStakeBlockNumber)" + }, + "0x6d780459": { + "selector": "0x6d780459", + "type": "function", + "signature": "function transferSharesFrom(address _sender, address _recipient, uint256 _sharesAmount) returns (uint256)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address _account) view returns (uint256)" + }, + "0x7475f913": { + "selector": "0x7475f913", + "type": "function", + "signature": "function resumeStaking()" + }, + "0x752f77f1": { + "selector": "0x752f77f1", + "type": "function", + "signature": "function getFeeDistribution() view returns (uint16 treasuryFeeBasisPoints, uint16 insuranceFeeBasisPoints, uint16 operatorsFeeBasisPoints)" + }, + "0x78ffcfe2": { + "selector": "0x78ffcfe2", + "type": "function", + "signature": "function receiveWithdrawals() payable" + }, + "0x7a28fb88": { + "selector": "0x7a28fb88", + "type": "function", + "signature": "function getPooledEthByShares(uint256 _sharesAmount) view returns (uint256)" + }, + "0x7e7db6e1": { + "selector": "0x7e7db6e1", + "type": "function", + "signature": "function allowRecoverability(address token) view returns (bool)" + }, + "0x7ecebe00": { + "selector": "0x7ecebe00", + "type": "function", + "signature": "function nonces(address owner) view returns (uint256)" + }, + "0x80afdea8": { + "selector": "0x80afdea8", + "type": "function", + "signature": "function appId() view returns (bytes32)" + }, + "0x833b1fce": { + "selector": "0x833b1fce", + "type": "function", + "signature": "function getOracle() view returns (address)" + }, + "0x84b0196e": { + "selector": "0x84b0196e", + "type": "function", + "signature": "function eip712Domain() view returns (string name, string version, uint256 chainId, address verifyingContract)" + }, + "0x8aa10435": { + "selector": "0x8aa10435", + "type": "function", + "signature": "function getContractVersion() view returns (uint256)" + }, + "0x8b3dd749": { + "selector": "0x8b3dd749", + "type": "function", + "signature": "function getInitializationBlock() view returns (uint256)" + }, + "0x8fcb4e5b": { + "selector": "0x8fcb4e5b", + "type": "function", + "signature": "function transferShares(address _recipient, uint256 _sharesAmount) returns (uint256)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() pure returns (string)" + }, + "0x9861f8e5": { + "selector": "0x9861f8e5", + "type": "function", + "signature": "function getEIP712StETH() view returns (address)" + }, + "0x9d4941d8": { + "selector": "0x9d4941d8", + "type": "function", + "signature": "function transferToVault(address)" + }, + "0xa1658fad": { + "selector": "0xa1658fad", + "type": "function", + "signature": "function canPerform(address _sender, bytes32 _role, uint256[] _params) view returns (bool)" + }, + "0xa1903eab": { + "selector": "0xa1903eab", + "type": "function", + "signature": "function submit(address _referral) payable returns (uint256)" + }, + "0xa457c2d7": { + "selector": "0xa457c2d7", + "type": "function", + "signature": "function decreaseAllowance(address _spender, uint256 _subtractedValue) returns (bool)" + }, + "0xa479e508": { + "selector": "0xa479e508", + "type": "function", + "signature": "function getEVMScriptRegistry() view returns (address)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address _recipient, uint256 _amount) returns (bool)" + }, + "0xaa0b7db7": { + "selector": "0xaa0b7db7", + "type": "function", + "signature": "function deposit(uint256 _maxDepositsCount, uint256 _stakingModuleId, bytes _depositCalldata)" + }, + "0xad1394e9": { + "selector": "0xad1394e9", + "type": "function", + "signature": "function UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE() view returns (bytes32)" + }, + "0xae2e3538": { + "selector": "0xae2e3538", + "type": "function", + "signature": "function getBeaconStat() view returns (uint256 depositedValidators, uint256 beaconValidators, uint256 beaconBalance)" + }, + "0xb3320d9a": { + "selector": "0xb3320d9a", + "type": "function", + "signature": "function removeStakingLimit()" + }, + "0xbac3f3c5": { + "selector": "0xbac3f3c5", + "type": "function", + "signature": "function handleOracleReport(uint256 _reportTimestamp, uint256 _timeElapsed, uint256 _clValidators, uint256 _clBalance, uint256 _withdrawalVaultBalance, uint256 _elRewardsVaultBalance, uint256 _sharesRequestedToBurn, uint256[] _withdrawalFinalizationBatches, uint256 _simulatedShareRate) returns (uint256[4] postRebaseAmounts)" + }, + "0xced72f87": { + "selector": "0xced72f87", + "type": "function", + "signature": "function getFee() view returns (uint16 totalFee)" + }, + "0xd4aae0c4": { + "selector": "0xd4aae0c4", + "type": "function", + "signature": "function kernel() view returns (address)" + }, + "0xd5002f2e": { + "selector": "0xd5002f2e", + "type": "function", + "signature": "function getTotalShares() view returns (uint256)" + }, + "0xd505accf": { + "selector": "0xd505accf", + "type": "function", + "signature": "function permit(address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s)" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address _owner, address _spender) view returns (uint256)" + }, + "0xde4796ed": { + "selector": "0xde4796ed", + "type": "function", + "signature": "function isPetrified() view returns (bool)" + }, + "0xe654ff17": { + "selector": "0xe654ff17", + "type": "function", + "signature": "function getLidoLocator() view returns (address)" + }, + "0xe78a5875": { + "selector": "0xe78a5875", + "type": "function", + "signature": "function canDeposit() view returns (bool)" + }, + "0xeb85262f": { + "selector": "0xeb85262f", + "type": "function", + "signature": "function STAKING_PAUSE_ROLE() view returns (bytes32)" + }, + "0xf2cfa87d": { + "selector": "0xf2cfa87d", + "type": "function", + "signature": "function getDepositableEther() view returns (uint256)" + }, + "0xf5eb42dc": { + "selector": "0xf5eb42dc", + "type": "function", + "signature": "function sharesOf(address _account) view returns (uint256)" + }, + "0xf999c506": { + "selector": "0xf999c506", + "type": "function", + "signature": "function pauseStaking()" + }, + "0xfa64ebac": { + "selector": "0xfa64ebac", + "type": "function", + "signature": "function getTotalELRewardsCollected() view returns (uint256)" + } + }, + "unstETH": { + "0x02d715c2": { + "selector": "0x02d715c2", + "type": "error", + "signature": "error AdminZeroAddress()" + }, + "0x93f51786": { + "selector": "0x93f51786", + "type": "error", + "signature": "error ApprovalToOwner()" + }, + "0xb06307db": { + "selector": "0xb06307db", + "type": "error", + "signature": "error ApproveToCaller()" + }, + "0x4c59bf28": { + "selector": "0x4c59bf28", + "type": "error", + "signature": "error ArraysLengthMismatch(uint256 _firstArrayLength, uint256 _secondArrayLength)" + }, + "0xcdf129c4": { + "selector": "0xcdf129c4", + "type": "error", + "signature": "error BatchesAreNotSorted()" + }, + "0x0f0b498d": { + "selector": "0x0f0b498d", + "type": "error", + "signature": "error CantSendValueRecipientMayHaveReverted()" + }, + "0x12de1df3": { + "selector": "0x12de1df3", + "type": "error", + "signature": "error EmptyBatches()" + }, + "0x167679d5": { + "selector": "0x167679d5", + "type": "error", + "signature": "error InvalidContractVersionIncrement()" + }, + "0xcee778e2": { + "selector": "0xcee778e2", + "type": "error", + "signature": "error InvalidHint(uint256 _hint)" + }, + "0x01e4f954": { + "selector": "0x01e4f954", + "type": "error", + "signature": "error InvalidOwnerAddress(address)" + }, + "0x34819c03": { + "selector": "0x34819c03", + "type": "error", + "signature": "error InvalidReportTimestamp()" + }, + "0xc969e0f2": { + "selector": "0xc969e0f2", + "type": "error", + "signature": "error InvalidRequestId(uint256 _requestId)" + }, + "0x71894257": { + "selector": "0x71894257", + "type": "error", + "signature": "error InvalidRequestIdRange(uint256 startId, uint256 endId)" + }, + "0xbaf3f0f7": { + "selector": "0xbaf3f0f7", + "type": "error", + "signature": "error InvalidState()" + }, + "0x61394a84": { + "selector": "0x61394a84", + "type": "error", + "signature": "error NonZeroContractVersionOnInit()" + }, + "0x8a0d3779": { + "selector": "0x8a0d3779", + "type": "error", + "signature": "error NotEnoughEther()" + }, + "0x23295f0e": { + "selector": "0x23295f0e", + "type": "error", + "signature": "error NotOwner(address _sender, address _owner)" + }, + "0xaee697e7": { + "selector": "0xaee697e7", + "type": "error", + "signature": "error NotOwnerOrApproved(address sender)" + }, + "0x41aaefac": { + "selector": "0x41aaefac", + "type": "error", + "signature": "error NotOwnerOrApprovedForAll(address sender)" + }, + "0x73c5d8a6": { + "selector": "0x73c5d8a6", + "type": "error", + "signature": "error PauseUntilMustBeInFuture()" + }, + "0xb047186b": { + "selector": "0xb047186b", + "type": "error", + "signature": "error PausedExpected()" + }, + "0xf0e0cc2d": { + "selector": "0xf0e0cc2d", + "type": "error", + "signature": "error RequestAlreadyClaimed(uint256 _requestId)" + }, + "0x8ebfb78d": { + "selector": "0x8ebfb78d", + "type": "error", + "signature": "error RequestAmountTooLarge(uint256 _amountOfStETH)" + }, + "0xb89b87c8": { + "selector": "0xb89b87c8", + "type": "error", + "signature": "error RequestAmountTooSmall(uint256 _amountOfStETH)" + }, + "0x374e8bd1": { + "selector": "0x374e8bd1", + "type": "error", + "signature": "error RequestIdsNotSorted()" + }, + "0x4ae50228": { + "selector": "0x4ae50228", + "type": "error", + "signature": "error RequestNotFoundOrNotFinalized(uint256 _requestId)" + }, + "0x14378398": { + "selector": "0x14378398", + "type": "error", + "signature": "error ResumedExpected()" + }, + "0x305a27a9": { + "selector": "0x305a27a9", + "type": "error", + "signature": "error StringTooLong(string str)" + }, + "0x252dfe81": { + "selector": "0x252dfe81", + "type": "error", + "signature": "error TooMuchEtherToFinalize(uint256 sent, uint256 maxExpected)" + }, + "0xc0eeaa61": { + "selector": "0xc0eeaa61", + "type": "error", + "signature": "error TransferFromIncorrectOwner(address from, address realOwner)" + }, + "0x160fca8a": { + "selector": "0x160fca8a", + "type": "error", + "signature": "error TransferFromZeroAddress()" + }, + "0x09f844e3": { + "selector": "0x09f844e3", + "type": "error", + "signature": "error TransferToNonIERC721Receiver(address)" + }, + "0x52ce6f21": { + "selector": "0x52ce6f21", + "type": "error", + "signature": "error TransferToThemselves()" + }, + "0xea553b34": { + "selector": "0xea553b34", + "type": "error", + "signature": "error TransferToZeroAddress()" + }, + "0x0eaf9e0c": { + "selector": "0x0eaf9e0c", + "type": "error", + "signature": "error UnexpectedContractVersion(uint256 expected, uint256 received)" + }, + "0x91dc1cb4": { + "selector": "0x91dc1cb4", + "type": "error", + "signature": "error ZeroAmountOfETH()" + }, + "0x71178d66": { + "selector": "0x71178d66", + "type": "error", + "signature": "error ZeroMetadata()" + }, + "0xad58bfc7": { + "selector": "0xad58bfc7", + "type": "error", + "signature": "error ZeroPauseDuration()" + }, + "0xd27b4443": { + "selector": "0xd27b4443", + "type": "error", + "signature": "error ZeroRecipient()" + }, + "0xe4e97357": { + "selector": "0xe4e97357", + "type": "error", + "signature": "error ZeroShareRate()" + }, + "0xda16d767": { + "selector": "0xda16d767", + "type": "error", + "signature": "error ZeroTimestamp()" + }, + "0xe7c0835d": { + "selector": "0xe7c0835d", + "type": "function", + "signature": "function BUNKER_MODE_DISABLED_TIMESTAMP() view returns (uint256)" + }, + "0xa217fddf": { + "selector": "0xa217fddf", + "type": "function", + "signature": "function DEFAULT_ADMIN_ROLE() view returns (bytes32)" + }, + "0x220ca2f4": { + "selector": "0x220ca2f4", + "type": "function", + "signature": "function FINALIZE_ROLE() view returns (bytes32)" + }, + "0xb7bdf748": { + "selector": "0xb7bdf748", + "type": "function", + "signature": "function MANAGE_TOKEN_URI_ROLE() view returns (bytes32)" + }, + "0x29fd065d": { + "selector": "0x29fd065d", + "type": "function", + "signature": "function MAX_BATCHES_LENGTH() view returns (uint256)" + }, + "0xdb2296cd": { + "selector": "0xdb2296cd", + "type": "function", + "signature": "function MAX_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)" + }, + "0x0d25a957": { + "selector": "0x0d25a957", + "type": "function", + "signature": "function MIN_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)" + }, + "0x07e2cea5": { + "selector": "0x07e2cea5", + "type": "function", + "signature": "function ORACLE_ROLE() view returns (bytes32)" + }, + "0xa302ee38": { + "selector": "0xa302ee38", + "type": "function", + "signature": "function PAUSE_INFINITELY() view returns (uint256)" + }, + "0x389ed267": { + "selector": "0x389ed267", + "type": "function", + "signature": "function PAUSE_ROLE() view returns (bytes32)" + }, + "0x2de03aa1": { + "selector": "0x2de03aa1", + "type": "function", + "signature": "function RESUME_ROLE() view returns (bytes32)" + }, + "0xe00bfe50": { + "selector": "0xe00bfe50", + "type": "function", + "signature": "function STETH() view returns (address)" + }, + "0xd9fb643a": { + "selector": "0xd9fb643a", + "type": "function", + "signature": "function WSTETH() view returns (address)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address _to, uint256 _requestId)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address _owner) view returns (uint256)" + }, + "0x9b36be58": { + "selector": "0x9b36be58", + "type": "function", + "signature": "function bunkerModeSinceTimestamp() view returns (uint256)" + }, + "0xeed53bf5": { + "selector": "0xeed53bf5", + "type": "function", + "signature": "function calculateFinalizationBatches(uint256 _maxShareRate, uint256 _maxTimestamp, uint256 _maxRequestsPerCall, (uint256 remainingEthBudget, bool finished, uint256[36] batches, uint256 batchesLength) _state) view returns ((uint256 remainingEthBudget, bool finished, uint256[36] batches, uint256 batchesLength))" + }, + "0xf8444436": { + "selector": "0xf8444436", + "type": "function", + "signature": "function claimWithdrawal(uint256 _requestId)" + }, + "0xe3afe0a3": { + "selector": "0xe3afe0a3", + "type": "function", + "signature": "function claimWithdrawals(uint256[] _requestIds, uint256[] _hints)" + }, + "0x5e7eead9": { + "selector": "0x5e7eead9", + "type": "function", + "signature": "function claimWithdrawalsTo(uint256[] _requestIds, uint256[] _hints, address _recipient)" + }, + "0xb6013cef": { + "selector": "0xb6013cef", + "type": "function", + "signature": "function finalize(uint256 _lastRequestIdToBeFinalized, uint256 _maxShareRate) payable" + }, + "0x62abe3fa": { + "selector": "0x62abe3fa", + "type": "function", + "signature": "function findCheckpointHints(uint256[] _requestIds, uint256 _firstIndex, uint256 _lastIndex) view returns (uint256[] hintIds)" + }, + "0x081812fc": { + "selector": "0x081812fc", + "type": "function", + "signature": "function getApproved(uint256 _requestId) view returns (address)" + }, + "0x714c5398": { + "selector": "0x714c5398", + "type": "function", + "signature": "function getBaseURI() view returns (string)" + }, + "0xc97912d8": { + "selector": "0xc97912d8", + "type": "function", + "signature": "function getClaimableEther(uint256[] _requestIds, uint256[] _hints) view returns (uint256[] claimableEthValues)" + }, + "0x8aa10435": { + "selector": "0x8aa10435", + "type": "function", + "signature": "function getContractVersion() view returns (uint256)" + }, + "0x526eae3e": { + "selector": "0x526eae3e", + "type": "function", + "signature": "function getLastCheckpointIndex() view returns (uint256)" + }, + "0x4f069a13": { + "selector": "0x4f069a13", + "type": "function", + "signature": "function getLastFinalizedRequestId() view returns (uint256)" + }, + "0x19c2b4c3": { + "selector": "0x19c2b4c3", + "type": "function", + "signature": "function getLastRequestId() view returns (uint256)" + }, + "0xf6fa8a47": { + "selector": "0xf6fa8a47", + "type": "function", + "signature": "function getLockedEtherAmount() view returns (uint256)" + }, + "0x46a086b4": { + "selector": "0x46a086b4", + "type": "function", + "signature": "function getNFTDescriptorAddress() view returns (address)" + }, + "0x589ff76c": { + "selector": "0x589ff76c", + "type": "function", + "signature": "function getResumeSinceTimestamp() view returns (uint256)" + }, + "0x248a9ca3": { + "selector": "0x248a9ca3", + "type": "function", + "signature": "function getRoleAdmin(bytes32 role) view returns (bytes32)" + }, + "0x9010d07c": { + "selector": "0x9010d07c", + "type": "function", + "signature": "function getRoleMember(bytes32 role, uint256 index) view returns (address)" + }, + "0xca15c873": { + "selector": "0xca15c873", + "type": "function", + "signature": "function getRoleMemberCount(bytes32 role) view returns (uint256)" + }, + "0x7d031b65": { + "selector": "0x7d031b65", + "type": "function", + "signature": "function getWithdrawalRequests(address _owner) view returns (uint256[] requestsIds)" + }, + "0xb8c4b85a": { + "selector": "0xb8c4b85a", + "type": "function", + "signature": "function getWithdrawalStatus(uint256[] _requestIds) view returns ((uint256 amountOfStETH, uint256 amountOfShares, address owner, uint256 timestamp, bool isFinalized, bool isClaimed)[] statuses)" + }, + "0x2f2ff15d": { + "selector": "0x2f2ff15d", + "type": "function", + "signature": "function grantRole(bytes32 role, address account)" + }, + "0x91d14854": { + "selector": "0x91d14854", + "type": "function", + "signature": "function hasRole(bytes32 role, address account) view returns (bool)" + }, + "0xc4d66de8": { + "selector": "0xc4d66de8", + "type": "function", + "signature": "function initialize(address _admin)" + }, + "0xe985e9c5": { + "selector": "0xe985e9c5", + "type": "function", + "signature": "function isApprovedForAll(address _owner, address _operator) view returns (bool)" + }, + "0x2b95b781": { + "selector": "0x2b95b781", + "type": "function", + "signature": "function isBunkerModeActive() view returns (bool)" + }, + "0xb187bd26": { + "selector": "0xb187bd26", + "type": "function", + "signature": "function isPaused() view returns (bool)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x96992fed": { + "selector": "0x96992fed", + "type": "function", + "signature": "function onOracleReport(bool _isBunkerModeNow, uint256 _bunkerStartTimestamp, uint256 _currentReportTimestamp)" + }, + "0x6352211e": { + "selector": "0x6352211e", + "type": "function", + "signature": "function ownerOf(uint256 _requestId) view returns (address)" + }, + "0xf3f449c7": { + "selector": "0xf3f449c7", + "type": "function", + "signature": "function pauseFor(uint256 _duration)" + }, + "0xabe9cfc8": { + "selector": "0xabe9cfc8", + "type": "function", + "signature": "function pauseUntil(uint256 _pauseUntilInclusive)" + }, + "0xa52e9c9f": { + "selector": "0xa52e9c9f", + "type": "function", + "signature": "function prefinalize(uint256[] _batches, uint256 _maxShareRate) view returns (uint256 ethToLock, uint256 sharesToBurn)" + }, + "0x36568abe": { + "selector": "0x36568abe", + "type": "function", + "signature": "function renounceRole(bytes32 role, address account)" + }, + "0xd6681042": { + "selector": "0xd6681042", + "type": "function", + "signature": "function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)" + }, + "0xacf41e4d": { + "selector": "0xacf41e4d", + "type": "function", + "signature": "function requestWithdrawalsWithPermit(uint256[] _amounts, address _owner, (uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) _permit) returns (uint256[] requestIds)" + }, + "0x19aa6257": { + "selector": "0x19aa6257", + "type": "function", + "signature": "function requestWithdrawalsWstETH(uint256[] _amounts, address _owner) returns (uint256[] requestIds)" + }, + "0x7951b76f": { + "selector": "0x7951b76f", + "type": "function", + "signature": "function requestWithdrawalsWstETHWithPermit(uint256[] _amounts, address _owner, (uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) _permit) returns (uint256[] requestIds)" + }, + "0x046f7da2": { + "selector": "0x046f7da2", + "type": "function", + "signature": "function resume()" + }, + "0xd547741f": { + "selector": "0xd547741f", + "type": "function", + "signature": "function revokeRole(bytes32 role, address account)" + }, + "0x42842e0e": { + "selector": "0x42842e0e", + "type": "function", + "signature": "function safeTransferFrom(address _from, address _to, uint256 _requestId)" + }, + "0xb88d4fde": { + "selector": "0xb88d4fde", + "type": "function", + "signature": "function safeTransferFrom(address _from, address _to, uint256 _requestId, bytes _data)" + }, + "0xa22cb465": { + "selector": "0xa22cb465", + "type": "function", + "signature": "function setApprovalForAll(address _operator, bool _approved)" + }, + "0x55f804b3": { + "selector": "0x55f804b3", + "type": "function", + "signature": "function setBaseURI(string _baseURI)" + }, + "0x92b18a47": { + "selector": "0x92b18a47", + "type": "function", + "signature": "function setNFTDescriptorAddress(address _nftDescriptorAddress)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xc87b56dd": { + "selector": "0xc87b56dd", + "type": "function", + "signature": "function tokenURI(uint256 _requestId) view returns (string)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address _from, address _to, uint256 _requestId)" + }, + "0xc2fc7aff": { + "selector": "0xc2fc7aff", + "type": "function", + "signature": "function unfinalizedRequestNumber() view returns (uint256)" + }, + "0xd0fb84e8": { + "selector": "0xd0fb84e8", + "type": "function", + "signature": "function unfinalizedStETH() view returns (uint256)" + } + }, + "LidoStMATIC": { + "0x98fabd3a": { + "selector": "0x98fabd3a", + "type": "function", + "signature": "function DAO() view returns (bytes32)" + }, + "0xa217fddf": { + "selector": "0xa217fddf", + "type": "function", + "signature": "function DEFAULT_ADMIN_ROLE() view returns (bytes32)" + }, + "0x389ed267": { + "selector": "0x389ed267", + "type": "function", + "signature": "function PAUSE_ROLE() view returns (bytes32)" + }, + "0x309756fb": { + "selector": "0x309756fb", + "type": "function", + "signature": "function UNPAUSE_ROLE() view returns (bytes32)" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address owner, address spender) view returns (uint256)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address spender, uint256 amount) returns (bool)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address account) view returns (uint256)" + }, + "0xafd290a7": { + "selector": "0xafd290a7", + "type": "function", + "signature": "function calculatePendingBufferedTokens() view returns (uint256 pendingBufferedTokens)" + }, + "0x46e04a2f": { + "selector": "0x46e04a2f", + "type": "function", + "signature": "function claimTokens(uint256 _tokenId)" + }, + "0x4cfeb862": { + "selector": "0x4cfeb862", + "type": "function", + "signature": "function claimTokensFromValidatorToContract(uint256 _index)" + }, + "0x917a52f5": { + "selector": "0x917a52f5", + "type": "function", + "signature": "function convertMaticToStMatic(uint256 _amountInMatic) view returns (uint256 amountInStMatic, uint256 totalStMaticSupply, uint256 totalPooledMatic)" + }, + "0xd968447c": { + "selector": "0xd968447c", + "type": "function", + "signature": "function convertStMaticToMatic(uint256 _amountInStMatic) view returns (uint256 amountInMatic, uint256 totalStMaticAmount, uint256 totalPooledMatic)" + }, + "0x4162169f": { + "selector": "0x4162169f", + "type": "function", + "signature": "function dao() view returns (address)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() view returns (uint8)" + }, + "0xa457c2d7": { + "selector": "0xa457c2d7", + "type": "function", + "signature": "function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)" + }, + "0xc89e4361": { + "selector": "0xc89e4361", + "type": "function", + "signature": "function delegate()" + }, + "0x0d7abc33": { + "selector": "0x0d7abc33", + "type": "function", + "signature": "function delegationLowerBound() view returns (uint256)" + }, + "0x6f4a2cd0": { + "selector": "0x6f4a2cd0", + "type": "function", + "signature": "function distributeRewards()" + }, + "0x964a7596": { + "selector": "0x964a7596", + "type": "function", + "signature": "function entityFees() view returns (uint8 dao, uint8 operators, uint8 insurance)" + }, + "0xe062b10b": { + "selector": "0xe062b10b", + "type": "function", + "signature": "function fxStateRootTunnel() view returns (address)" + }, + "0x676e5550": { + "selector": "0x676e5550", + "type": "function", + "signature": "function getLiquidRewards(address _validatorShare) view returns (uint256)" + }, + "0x720bcf1d": { + "selector": "0x720bcf1d", + "type": "function", + "signature": "function getMaticFromTokenId(uint256 _tokenId) view returns (uint256)" + }, + "0x248a9ca3": { + "selector": "0x248a9ca3", + "type": "function", + "signature": "function getRoleAdmin(bytes32 role) view returns (bytes32)" + }, + "0x253d1735": { + "selector": "0x253d1735", + "type": "function", + "signature": "function getToken2WithdrawRequests(uint256 _tokenId) view returns ((uint256 amount2WithdrawFromStMATIC, uint256 validatorNonce, uint256 requestEpoch, address validatorAddress)[])" + }, + "0xe00222a0": { + "selector": "0xe00222a0", + "type": "function", + "signature": "function getTotalPooledMatic() view returns (uint256)" + }, + "0x1e7ff8f6": { + "selector": "0x1e7ff8f6", + "type": "function", + "signature": "function getTotalStake(address _validatorShare) view returns (uint256, uint256)" + }, + "0x7e978af8": { + "selector": "0x7e978af8", + "type": "function", + "signature": "function getTotalStakeAcrossAllValidators() view returns (uint256)" + }, + "0x916b9eba": { + "selector": "0x916b9eba", + "type": "function", + "signature": "function getTotalWithdrawRequest() view returns ((uint256 amount2WithdrawFromStMATIC, uint256 validatorNonce, uint256 requestEpoch, address validatorAddress)[])" + }, + "0x2f2ff15d": { + "selector": "0x2f2ff15d", + "type": "function", + "signature": "function grantRole(bytes32 role, address account)" + }, + "0x91d14854": { + "selector": "0x91d14854", + "type": "function", + "signature": "function hasRole(bytes32 role, address account) view returns (bool)" + }, + "0x39509351": { + "selector": "0x39509351", + "type": "function", + "signature": "function increaseAllowance(address spender, uint256 addedValue) returns (bool)" + }, + "0x35876476": { + "selector": "0x35876476", + "type": "function", + "signature": "function initialize(address _nodeOperatorRegistry, address _token, address _dao, address _insurance, address _stakeManager, address _poLidoNFT, address _fxStateRootTunnel)" + }, + "0x89cf3204": { + "selector": "0x89cf3204", + "type": "function", + "signature": "function insurance() view returns (address)" + }, + "0x71975a3e": { + "selector": "0x71975a3e", + "type": "function", + "signature": "function lastWithdrawnValidatorId() view returns (uint256)" + }, + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0xe8f8708f": { + "selector": "0xe8f8708f", + "type": "function", + "signature": "function nodeOperatorRegistry() view returns (address)" + }, + "0x8456cb59": { + "selector": "0x8456cb59", + "type": "function", + "signature": "function pause()" + }, + "0x5c975abb": { + "selector": "0x5c975abb", + "type": "function", + "signature": "function paused() view returns (bool)" + }, + "0x7029c90e": { + "selector": "0x7029c90e", + "type": "function", + "signature": "function poLidoNFT() view returns (address)" + }, + "0xb0e21e8a": { + "selector": "0xb0e21e8a", + "type": "function", + "signature": "function protocolFee() view returns (uint8)" + }, + "0xd280f14f": { + "selector": "0xd280f14f", + "type": "function", + "signature": "function rebalanceDelegatedTokens()" + }, + "0x36568abe": { + "selector": "0x36568abe", + "type": "function", + "signature": "function renounceRole(bytes32 role, address account)" + }, + "0xccc143b8": { + "selector": "0xccc143b8", + "type": "function", + "signature": "function requestWithdraw(uint256 _amount, address _referral) returns (uint256)" + }, + "0x509c5df6": { + "selector": "0x509c5df6", + "type": "function", + "signature": "function reservedFunds() view returns (uint256)" + }, + "0xd547741f": { + "selector": "0xd547741f", + "type": "function", + "signature": "function revokeRole(bytes32 role, address account)" + }, + "0xa2452947": { + "selector": "0xa2452947", + "type": "function", + "signature": "function rewardDistributionLowerBound() view returns (uint256)" + }, + "0x9a3cac6a": { + "selector": "0x9a3cac6a", + "type": "function", + "signature": "function setDaoAddress(address _newDAO)" + }, + "0x7682c902": { + "selector": "0x7682c902", + "type": "function", + "signature": "function setDelegationLowerBound(uint256 _delegationLowerBound)" + }, + "0xf6794fdb": { + "selector": "0xf6794fdb", + "type": "function", + "signature": "function setFees(uint8 _daoFee, uint8 _operatorsFee, uint8 _insuranceFee)" + }, + "0x70bf9fe9": { + "selector": "0x70bf9fe9", + "type": "function", + "signature": "function setFxStateRootTunnel(address _newFxStateRootTunnel)" + }, + "0xbb208f55": { + "selector": "0xbb208f55", + "type": "function", + "signature": "function setInsuranceAddress(address _address)" + }, + "0x0f2b2639": { + "selector": "0x0f2b2639", + "type": "function", + "signature": "function setNodeOperatorRegistryAddress(address _address)" + }, + "0x15539d3f": { + "selector": "0x15539d3f", + "type": "function", + "signature": "function setPoLidoNFT(address _newLidoNFT)" + }, + "0x4e91f811": { + "selector": "0x4e91f811", + "type": "function", + "signature": "function setProtocolFee(uint8 _newProtocolFee)" + }, + "0x3b573c4a": { + "selector": "0x3b573c4a", + "type": "function", + "signature": "function setRewardDistributionLowerBound(uint256 _newRewardDistributionLowerBound)" + }, + "0x788bc78c": { + "selector": "0x788bc78c", + "type": "function", + "signature": "function setVersion(string _newVersion)" + }, + "0xf1a13fce": { + "selector": "0xf1a13fce", + "type": "function", + "signature": "function stMaticWithdrawRequest(uint256) view returns (uint256 amount2WithdrawFromStMATIC, uint256 validatorNonce, uint256 requestEpoch, address validatorAddress)" + }, + "0x7542ff95": { + "selector": "0x7542ff95", + "type": "function", + "signature": "function stakeManager() view returns (address)" + }, + "0xf532e86a": { + "selector": "0xf532e86a", + "type": "function", + "signature": "function submit(uint256 _amount, address _referral) returns (uint256)" + }, + "0xe259faf7": { + "selector": "0xe259faf7", + "type": "function", + "signature": "function submitHandler() view returns (bool)" + }, + "0x893818a3": { + "selector": "0x893818a3", + "type": "function", + "signature": "function submitThreshold() view returns (uint256)" + }, + "0x01ffc9a7": { + "selector": "0x01ffc9a7", + "type": "function", + "signature": "function supportsInterface(bytes4 interfaceId) view returns (bool)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xfc0c546a": { + "selector": "0xfc0c546a", + "type": "function", + "signature": "function token() view returns (address)" + }, + "0xf08711fe": { + "selector": "0xf08711fe", + "type": "function", + "signature": "function token2WithdrawRequest(uint256) view returns (uint256 amount2WithdrawFromStMATIC, uint256 validatorNonce, uint256 requestEpoch, address validatorAddress)" + }, + "0xc697d2c7": { + "selector": "0xc697d2c7", + "type": "function", + "signature": "function token2WithdrawRequests(uint256, uint256) view returns (uint256 amount2WithdrawFromStMATIC, uint256 validatorNonce, uint256 requestEpoch, address validatorAddress)" + }, + "0x52349b17": { + "selector": "0x52349b17", + "type": "function", + "signature": "function totalBuffered() view returns (uint256)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address to, uint256 amount) returns (bool)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address from, address to, uint256 amount) returns (bool)" + }, + "0x3f4ba83a": { + "selector": "0x3f4ba83a", + "type": "function", + "signature": "function unpause()" + }, + "0x54fd4d50": { + "selector": "0x54fd4d50", + "type": "function", + "signature": "function version() view returns (string)" + }, + "0xc75e7832": { + "selector": "0xc75e7832", + "type": "function", + "signature": "function withdrawTotalDelegated(address _validatorShare)" + } + }, + "SwappinOwn": { + "0xb94bb57a": { + "selector": "0xb94bb57a", + "type": "function", + "signature": "function destinations(bytes32) view returns (bytes32)" + }, + "0xc0600939": { + "selector": "0xc0600939", + "type": "function", + "signature": "function init(address[] _dests, address[] _tokens, address[] _providers, address[] _providerSpenders, address _ownerAddress)" + }, + "0x8da5cb5b": { + "selector": "0x8da5cb5b", + "type": "function", + "signature": "function owner() view returns (address)" + }, + "0x5639a77f": { + "selector": "0x5639a77f", + "type": "function", + "signature": "function payWithAnyToken(bytes32 orderId, uint64 refId, address swapProvider, address providerSpender, bytes swapCalldata, address tokenFrom, address tokenTo, uint256 amountFrom, uint256 minAmountTo, address dest)" + }, + "0x0ff5e72b": { + "selector": "0x0ff5e72b", + "type": "function", + "signature": "function payWithEth(bytes32 orderId, uint64 refId, uint256 amountFrom, uint256 minAmountTo, address swapProvider, bytes swapCalldata, address dest, address token) payable" + }, + "0x526aa6bf": { + "selector": "0x526aa6bf", + "type": "function", + "signature": "function payWithUsdToken(bytes32 orderId, uint64 refId, uint256 amount, address dest, address token)" + }, + "0x1acc050e": { + "selector": "0x1acc050e", + "type": "function", + "signature": "function providers(bytes32) view returns (bytes32)" + }, + "0x715018a6": { + "selector": "0x715018a6", + "type": "function", + "signature": "function renounceOwnership()" + }, + "0xea4ab55d": { + "selector": "0xea4ab55d", + "type": "function", + "signature": "function setDestinations(address[] dests, address[] tokens, bytes32 flag)" + }, + "0x63c48dc9": { + "selector": "0x63c48dc9", + "type": "function", + "signature": "function setProviders(address[] _providers, address[] _providerSpenders, bytes32 flag)" + }, + "0xf2fde38b": { + "selector": "0xf2fde38b", + "type": "function", + "signature": "function transferOwnership(address newOwner)" + } + }, + "StargateImplL2V2": { + "0x38647caa": { + "selector": "0x38647caa", + "type": "error", + "signature": "error OnlySocketDeployer()" + }, + "0xb20ca365": { + "selector": "0xb20ca365", + "type": "error", + "signature": "error OnlySocketGatewayOwner()" + }, + "0x52283e35": { + "selector": "0x52283e35", + "type": "function", + "signature": "function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)" + }, + "0xdf2ebdbb": { + "selector": "0xdf2ebdbb", + "type": "function", + "signature": "function NATIVE_TOKEN_ADDRESS() view returns (address)" + }, + "0x0edc9afe": { + "selector": "0x0edc9afe", + "type": "function", + "signature": "function STARGATE_L1_SWAP_BRIDGE_SELECTOR() view returns (bytes4)" + }, + "0xed801ee8": { + "selector": "0xed801ee8", + "type": "function", + "signature": "function STARGATE_L2_ERC20_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)" + }, + "0x8871de7b": { + "selector": "0x8871de7b", + "type": "function", + "signature": "function STARGATE_L2_NATIVE_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)" + }, + "0x3c72b6c3": { + "selector": "0x3c72b6c3", + "type": "function", + "signature": "function StargateIdentifier() view returns (bytes32)" + }, + "0xd0949f99": { + "selector": "0xd0949f99", + "type": "function", + "signature": "function UINT256_MAX() view returns (uint256)" + }, + "0xb3dc8da4": { + "selector": "0xb3dc8da4", + "type": "function", + "signature": "function bridgeAfterSwap(uint256 amount, bytes bridgeData) payable" + }, + "0x2ffc4222": { + "selector": "0x2ffc4222", + "type": "function", + "signature": "function bridgeERC20To(address token, address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable" + }, + "0xb1f98a65": { + "selector": "0xb1f98a65", + "type": "function", + "signature": "function bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable" + }, + "0x24d97a4a": { + "selector": "0x24d97a4a", + "type": "function", + "signature": "function killme()" + }, + "0xe42e0ea9": { + "selector": "0xe42e0ea9", + "type": "function", + "signature": "function rescueEther(address userAddress, uint256 amount)" + }, + "0x6ccae054": { + "selector": "0x6ccae054", + "type": "function", + "signature": "function rescueFunds(address token, address userAddress, uint256 amount)" + }, + "0xf887ea40": { + "selector": "0xf887ea40", + "type": "function", + "signature": "function router() view returns (address)" + }, + "0xbc852760": { + "selector": "0xbc852760", + "type": "function", + "signature": "function socketDeployFactory() view returns (address)" + }, + "0x678fcd61": { + "selector": "0x678fcd61", + "type": "function", + "signature": "function socketGateway() view returns (address)" + }, + "0x79285133": { + "selector": "0x79285133", + "type": "function", + "signature": "function socketRoute() view returns (address)" + }, + "0x38e31d39": { + "selector": "0x38e31d39", + "type": "function", + "signature": "function stargateEthVault() view returns (address)" + }, + "0xa1b4f14b": { + "selector": "0xa1b4f14b", + "type": "function", + "signature": "function swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, address senderAddress, uint256 value, uint256 srcPoolId, uint256 dstPoolId, uint256 minReceivedAmt, uint256 destinationGasLimit, bool isNativeSwapRequired, uint16 stargateDstChainId, uint32 swapId, bytes swapData, bytes32 metadata, bytes destinationPayload) stargateBridgeData) payable" + } + }, + "ERC-4337-EntryPoint-0.6.0": { + "0x8b7ac980": { + "selector": "0x8b7ac980", + "type": "error", + "signature": "error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult)" + }, + "0x220266b6": { + "selector": "0x220266b6", + "type": "error", + "signature": "error FailedOp(uint256 opIndex, string reason)" + }, + "0x6ca7b806": { + "selector": "0x6ca7b806", + "type": "error", + "signature": "error SenderAddressResult(address sender)" + }, + "0x86a9f750": { + "selector": "0x86a9f750", + "type": "error", + "signature": "error SignatureValidationFailed(address aggregator)" + }, + "0xe0cff05f": { + "selector": "0xe0cff05f", + "type": "error", + "signature": "error ValidationResult((uint256 preOpGas, uint256 prefund, bool sigFailed, uint48 validAfter, uint48 validUntil, bytes paymasterContext) returnInfo, (uint256 stake, uint256 unstakeDelaySec) senderInfo, (uint256 stake, uint256 unstakeDelaySec) factoryInfo, (uint256 stake, uint256 unstakeDelaySec) paymasterInfo)" + }, + "0xfaecb4e4": { + "selector": "0xfaecb4e4", + "type": "error", + "signature": "error ValidationResultWithAggregation((uint256 preOpGas, uint256 prefund, bool sigFailed, uint48 validAfter, uint48 validUntil, bytes paymasterContext) returnInfo, (uint256 stake, uint256 unstakeDelaySec) senderInfo, (uint256 stake, uint256 unstakeDelaySec) factoryInfo, (uint256 stake, uint256 unstakeDelaySec) paymasterInfo, (address aggregator, (uint256 stake, uint256 unstakeDelaySec) stakeInfo) aggregatorInfo)" + }, + "0x8f41ec5a": { + "selector": "0x8f41ec5a", + "type": "function", + "signature": "function SIG_VALIDATION_FAILED() view returns (uint256)" + }, + "0x957122ab": { + "selector": "0x957122ab", + "type": "function", + "signature": "function _validateSenderAndPaymaster(bytes initCode, address sender, bytes paymasterAndData) view" + }, + "0x0396cb60": { + "selector": "0x0396cb60", + "type": "function", + "signature": "function addStake(uint32 unstakeDelaySec) payable" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address account) view returns (uint256)" + }, + "0xb760faf9": { + "selector": "0xb760faf9", + "type": "function", + "signature": "function depositTo(address account) payable" + }, + "0xfc7e286d": { + "selector": "0xfc7e286d", + "type": "function", + "signature": "function deposits(address) view returns (uint112 deposit, bool staked, uint112 stake, uint32 unstakeDelaySec, uint48 withdrawTime)" + }, + "0x5287ce12": { + "selector": "0x5287ce12", + "type": "function", + "signature": "function getDepositInfo(address account) view returns ((uint112 deposit, bool staked, uint112 stake, uint32 unstakeDelaySec, uint48 withdrawTime) info)" + }, + "0x35567e1a": { + "selector": "0x35567e1a", + "type": "function", + "signature": "function getNonce(address sender, uint192 key) view returns (uint256 nonce)" + }, + "0x9b249f69": { + "selector": "0x9b249f69", + "type": "function", + "signature": "function getSenderAddress(bytes initCode)" + }, + "0xa6193531": { + "selector": "0xa6193531", + "type": "function", + "signature": "function getUserOpHash((address sender, uint256 nonce, bytes initCode, bytes callData, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas, bytes paymasterAndData, bytes signature) userOp) view returns (bytes32)" + }, + "0x4b1d7cf5": { + "selector": "0x4b1d7cf5", + "type": "function", + "signature": "function handleAggregatedOps(((address sender, uint256 nonce, bytes initCode, bytes callData, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas, bytes paymasterAndData, bytes signature)[] userOps, address aggregator, bytes signature)[] opsPerAggregator, address beneficiary)" + }, + "0x1fad948c": { + "selector": "0x1fad948c", + "type": "function", + "signature": "function handleOps((address sender, uint256 nonce, bytes initCode, bytes callData, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas, bytes paymasterAndData, bytes signature)[] ops, address beneficiary)" + }, + "0x0bd28e3b": { + "selector": "0x0bd28e3b", + "type": "function", + "signature": "function incrementNonce(uint192 key)" + }, + "0x1d732756": { + "selector": "0x1d732756", + "type": "function", + "signature": "function innerHandleOp(bytes callData, ((address sender, uint256 nonce, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, address paymaster, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas) mUserOp, bytes32 userOpHash, uint256 prefund, uint256 contextOffset, uint256 preOpGas) opInfo, bytes context) returns (uint256 actualGasCost)" + }, + "0x1b2e01b8": { + "selector": "0x1b2e01b8", + "type": "function", + "signature": "function nonceSequenceNumber(address, uint192) view returns (uint256)" + }, + "0xd6383f94": { + "selector": "0xd6383f94", + "type": "function", + "signature": "function simulateHandleOp((address sender, uint256 nonce, bytes initCode, bytes callData, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas, bytes paymasterAndData, bytes signature) op, address target, bytes targetCallData)" + }, + "0xee219423": { + "selector": "0xee219423", + "type": "function", + "signature": "function simulateValidation((address sender, uint256 nonce, bytes initCode, bytes callData, uint256 callGasLimit, uint256 verificationGasLimit, uint256 preVerificationGas, uint256 maxFeePerGas, uint256 maxPriorityFeePerGas, bytes paymasterAndData, bytes signature) userOp)" + }, + "0xbb9fe6bf": { + "selector": "0xbb9fe6bf", + "type": "function", + "signature": "function unlockStake()" + }, + "0xc23a5cea": { + "selector": "0xc23a5cea", + "type": "function", + "signature": "function withdrawStake(address withdrawAddress)" + }, + "0x205c2878": { + "selector": "0x205c2878", + "type": "function", + "signature": "function withdrawTo(address withdrawAddress, uint256 withdrawAmount)" + } + }, + "ERC20": { + "0x06fdde03": { + "selector": "0x06fdde03", + "type": "function", + "signature": "function name() view returns (string)" + }, + "0x095ea7b3": { + "selector": "0x095ea7b3", + "type": "function", + "signature": "function approve(address _spender, uint256 _value) returns (bool)" + }, + "0x18160ddd": { + "selector": "0x18160ddd", + "type": "function", + "signature": "function totalSupply() view returns (uint256)" + }, + "0x23b872dd": { + "selector": "0x23b872dd", + "type": "function", + "signature": "function transferFrom(address _from, address _to, uint256 _value) returns (bool)" + }, + "0x313ce567": { + "selector": "0x313ce567", + "type": "function", + "signature": "function decimals() view returns (uint8)" + }, + "0x70a08231": { + "selector": "0x70a08231", + "type": "function", + "signature": "function balanceOf(address _owner) view returns (uint256 balance)" + }, + "0x95d89b41": { + "selector": "0x95d89b41", + "type": "function", + "signature": "function symbol() view returns (string)" + }, + "0xa9059cbb": { + "selector": "0xa9059cbb", + "type": "function", + "signature": "function transfer(address _to, uint256 _value) returns (bool)" + }, + "0xdd62ed3e": { + "selector": "0xdd62ed3e", + "type": "function", + "signature": "function allowance(address _owner, address _spender) view returns (uint256)" + } + }, + "NO_ABI": { + "0xb0ac19a0": { + "type": "function", + "signature": "function computeAddress2(uint256 salt) view returns (address)", + "selector": "0xb0ac19a0" + }, + "0xd8ccd0f3": { + "type": "function", + "signature": "function free(uint256 value) returns (uint256)", + "selector": "0xd8ccd0f3" + }, + "0x5f2e2b45": { + "type": "function", + "signature": "function freeFrom(address from, uint256 value) returns (uint256)", + "selector": "0x5f2e2b45" + }, + "0x079d229f": { + "type": "function", + "signature": "function freeFromUpTo(address from, uint256 value) returns (uint256)", + "selector": "0x079d229f" + }, + "0x6366b936": { + "type": "function", + "signature": "function freeUpTo(uint256 value) returns (uint256)", + "selector": "0x6366b936" + }, + "0xa0712d68": { + "type": "function", + "signature": "function mint(uint256 mintAmount) returns (uint256)", + "selector": "0xa0712d68" + }, + "0xd89135cd": { + "type": "function", + "signature": "function totalBurned() view returns (uint256)", + "selector": "0xd89135cd" + }, + "0xa2309ff8": { + "type": "function", + "signature": "function totalMinted() view returns (uint256)", + "selector": "0xa2309ff8" + }, + "0x0562b1a4": { + "type": "function", + "signature": "function setMarketActiveState(bool state)", + "selector": "0x0562b1a4" + }, + "0x057f8a38": { + "type": "function", + "signature": "function executeReserveReserveTradeWithData(address makerReserve, address takerReserve, tuple(address makerToken, address takerToken, uint256 makerAmount, uint256 takerAmount, uint256 makerFee, uint256 takerFee, uint256 gasLimit) trade, bytes32[] makerData, bytes32[] takerData) returns (bool)", + "selector": "0x057f8a38" + }, + "0x06789047": { + "type": "function", + "signature": "function settleReserveReserveTradeWithData(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) tradeInput, bytes32[] makerData, bytes32[] takerData)", + "selector": "0x06789047" + }, + "0x06b297d2": { + "type": "function", + "signature": "function settleReserveReserveTrade(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) tradeInput)", + "selector": "0x06b297d2" + }, + "0x0902f1ac": { + "type": "function", + "signature": "function getReserves() view returns (address[])", + "selector": "0x0902f1ac" + }, + "0x12fde4b7": { + "type": "function", + "signature": "function getFeeCollector() view returns (address)", + "selector": "0x12fde4b7" + }, + "0x268139d5": { + "type": "function", + "signature": "function removePublicReserveAddress(address reserve)", + "selector": "0x268139d5" + }, + "0x2a1e58c0": { + "type": "function", + "signature": "function ringTradeFromInput(tuple(bytes32 packedInput1, bytes32 packedInput2) packed) view returns (tuple(bool isReserve, uint256 identifier, address giveToken, uint256 giveAmount, uint256 fee, uint256 rebate, uint256 gasLimit))", + "selector": "0x2a1e58c0" + }, + "0x2c580a1f": { + "type": "function", + "signature": "function nominateFeeCollector(address collector)", + "selector": "0x2c580a1f" + }, + "0x338b5dea": { + "type": "function", + "signature": "function depositToken(address token, uint256 amount)", + "selector": "0x338b5dea" + }, + "0x3af89d03": { + "type": "function", + "signature": "function directWithdrawal(address token, uint256 amount) returns (bool)", + "selector": "0x3af89d03" + }, + "0x49c35605": { + "type": "function", + "signature": "function multiSigTransfer(address token, uint256 amount, uint64 nonce, uint8 v, bytes32 r, bytes32 s, address receiving_address)", + "selector": "0x49c35605" + }, + "0x4a0c3c3b": { + "type": "function", + "signature": "function delegateAddress(address delegate)", + "selector": "0x4a0c3c3b" + }, + "0x4f94d4c3": { + "type": "function", + "signature": "function orderFromInput(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s) orderInput) view returns (tuple(address sellToken, uint256 sellAmount, address buyToken, uint256 buyAmount, uint256 expiry, bytes32 hash, address signee))", + "selector": "0x4f94d4c3" + }, + "0x574c748d": { + "type": "function", + "signature": "function batchSettleTrades(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s)[] orderInput, tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3)[] tradeInput)", + "selector": "0x574c748d" + }, + "0x59b07e7a": { + "type": "function", + "signature": "function removeTokenAddressFromArr(address token)", + "selector": "0x59b07e7a" + }, + "0x5d7bdccd": { + "type": "function", + "signature": "function multiSigSend(address token, uint256 amount, uint64 nonce, uint8 v, bytes32 r, bytes32 s, address receiving_address)", + "selector": "0x5d7bdccd" + }, + "0x5e5dd317": { + "type": "function", + "signature": "function executeReserveReserveTrade(address makerReserve, address takerReserve, tuple(address makerToken, address takerToken, uint256 makerAmount, uint256 takerAmount, uint256 makerFee, uint256 takerFee, uint256 gasLimit) trade) returns (bool)", + "selector": "0x5e5dd317" + }, + "0x5e75228f": { + "type": "function", + "signature": "function swap(address sell_token, uint256 sell_amount, address buy_token, uint256 min_output, uint256 deadline) payable returns (uint256)", + "selector": "0x5e75228f" + }, + "0x61902470": { + "type": "function", + "signature": "function cacheTokenAddress(address token, uint256 index)", + "selector": "0x61902470" + }, + "0x660c5132": { + "type": "function", + "signature": "function getBestReserve(address sell_token, uint256 sell_amount, address buy_token) view returns (address, uint256)", + "selector": "0x660c5132" + }, + "0x66c0bd24": { + "type": "function", + "signature": "function getTokenIndex(address token) view returns (uint256)", + "selector": "0x66c0bd24" + }, + "0x6849dbe5": { + "type": "function", + "signature": "function nominateArbiter(address arbiter, bool status)", + "selector": "0x6849dbe5" + }, + "0x68bc15b0": { + "type": "function", + "signature": "function reserveTradeFromInput(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) packed) pure returns (tuple(uint256 orderAmount, uint256 reserveAmount, uint256 orderFee, uint256 reserveFee, uint256 orderRebate, uint256 reserveRebate, bool orderIsMaker, uint256 gasLimit))", + "selector": "0x68bc15b0" + }, + "0x72521dcd": { + "type": "function", + "signature": "function lockFeeCollector()", + "selector": "0x72521dcd" + }, + "0x73ee4d09": { + "type": "function", + "signature": "function executeReserveTrade(address sellToken, uint256 sellAmount, address buyToken, uint256 buyAmount, address reserve) returns (bool)", + "selector": "0x73ee4d09" + }, + "0x7bae7c22": { + "type": "function", + "signature": "function swapWithReserve(address sell_token, uint256 sell_amount, address buy_token, uint256 min_output, address reserve, uint256 deadline) payable returns (uint256)", + "selector": "0x7bae7c22" + }, + "0x862f9f5a": { + "type": "function", + "signature": "function getLastBlockedTimestamp(address user) view returns (uint256)", + "selector": "0x862f9f5a" + }, + "0x888d0e1d": { + "type": "function", + "signature": "function multiSigOrderBatchCancel(bytes32[] orderHashes, uint8 v, bytes32 r, bytes32 s)", + "selector": "0x888d0e1d" + }, + "0x8e0be445": { + "type": "function", + "signature": "function settleReserveTradeWithData(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s) orderInput, tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) tradeInput, bytes32[] data)", + "selector": "0x8e0be445" + }, + "0x90216c8c": { + "type": "function", + "signature": "function reserveReserveTradeFromInput(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) packed) view returns (tuple(address makerToken, address takerToken, uint256 makerAmount, uint256 takerAmount, uint256 makerFee, uint256 takerFee, uint256 gasLimit))", + "selector": "0x90216c8c" + }, + "0x94785a0c": { + "type": "function", + "signature": "function blockFundsForSingleSigWithdrawal(address token, uint256 amount)", + "selector": "0x94785a0c" + }, + "0x98a968c1": { + "type": "function", + "signature": "function depositWrappedEther(uint256 amount)", + "selector": "0x98a968c1" + }, + "0x98ea5fca": { + "type": "function", + "signature": "function depositEther() payable", + "selector": "0x98ea5fca" + }, + "0x9946ce7d": { + "type": "function", + "signature": "function getTokenFromIndex(uint256 index) view returns (address)", + "selector": "0x9946ce7d" + }, + "0x9bafc515": { + "type": "function", + "signature": "function userSigWithdrawal(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s)", + "selector": "0x9bafc515" + }, + "0x9e892372": { + "type": "function", + "signature": "function multiSigWithdrawal(address token, uint256 amount, uint64 nonce, uint8 v, bytes32 r, bytes32 s)", + "selector": "0x9e892372" + }, + "0xa2c38a23": { + "type": "function", + "signature": "function initiateSingleSigWithdrawal(address token, uint256 amount)", + "selector": "0xa2c38a23" + }, + "0xa46555d3": { + "type": "function", + "signature": "function settleRingTrade(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s)[] orderInput, tuple(bytes32 packedInput1, bytes32 packedInput2)[] tradeInput)", + "selector": "0xa46555d3" + }, + "0xa4d72d7c": { + "type": "function", + "signature": "function getReserveFromIndex(uint256 index) view returns (address)", + "selector": "0xa4d72d7c" + }, + "0xa6f9dae1": { + "type": "function", + "signature": "function changeOwner(address new_owner)", + "selector": "0xa6f9dae1" + }, + "0xaa6ca808": { + "type": "function", + "signature": "function getTokens() view returns (address[] tokens)", + "selector": "0xaa6ca808" + }, + "0xb695d805": { + "type": "function", + "signature": "function changeSingleSigWaitingPeriod(uint256 waiting_period)", + "selector": "0xb695d805" + }, + "0xb78e1bcc": { + "type": "function", + "signature": "function tradeFromInput(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) packed) pure returns (tuple(uint256 makerAmount, uint256 takerAmount, uint256 makerFee, uint256 takerFee, uint256 makerRebate))", + "selector": "0xb78e1bcc" + }, + "0xc47b8164": { + "type": "function", + "signature": "function cacheReserveAddress(address reserve, uint256 index, bool is_public)", + "selector": "0xc47b8164" + }, + "0xc84693a7": { + "type": "function", + "signature": "function settleTrade(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s) makerOrderInput, tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s) takerOrderInput, tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) tradeInput)", + "selector": "0xc84693a7" + }, + "0xcabfc903": { + "type": "function", + "signature": "function getSwapOutput(address sell_token, uint256 sell_amount, address buy_token) view returns (uint256)", + "selector": "0xcabfc903" + }, + "0xd0847f1c": { + "type": "function", + "signature": "function mintGasTokens(uint256 amount)", + "selector": "0xd0847f1c" + }, + "0xd4fac45d": { + "type": "function", + "signature": "function getBalance(address token, address user) view returns (uint256)", + "selector": "0xd4fac45d" + }, + "0xdedcc21b": { + "type": "function", + "signature": "function getReserveIndex(address reserve) view returns (uint256)", + "selector": "0xdedcc21b" + }, + "0xe21407ba": { + "type": "function", + "signature": "function settleRingTradeWithData(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s)[] orderInput, tuple(bytes32 packedInput1, bytes32 packedInput2)[] tradeInput, bytes32[][] data)", + "selector": "0xe21407ba" + }, + "0xe4e695fe": { + "type": "function", + "signature": "function getAvailableGasTokens() view returns (uint256 amount)", + "selector": "0xe4e695fe" + }, + "0xebf26a42": { + "type": "function", + "signature": "function revokeDelegation(address delegate, uint8 v, bytes32 r, bytes32 s)", + "selector": "0xebf26a42" + }, + "0xf6188339": { + "type": "function", + "signature": "function getBlocked(address token, address holder) view returns (uint256)", + "selector": "0xf6188339" + }, + "0xf8cd6e01": { + "type": "function", + "signature": "function executeReserveTradeWithData(address sellToken, uint256 sellAmount, address buyToken, uint256 buyAmount, address reserve, bytes32[] data) returns (bool)", + "selector": "0xf8cd6e01" + }, + "0xfdf99543": { + "type": "function", + "signature": "function settleReserveTrade(tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 r, bytes32 s) orderInput, tuple(bytes32 packedInput1, bytes32 packedInput2, bytes32 packedInput3) tradeInput)", + "selector": "0xfdf99543" + }, + "0x07f7aafb": { + "type": "function", + "signature": "function approveContract(address _contract)", + "selector": "0x07f7aafb" + }, + "0x69dc9ff3": { + "type": "function", + "signature": "function contracts(address) view returns (bool)", + "selector": "0x69dc9ff3" + }, + "0xb7e2077e": { + "type": "function", + "signature": "function denyContract(address _contract)", + "selector": "0xb7e2077e" + }, + "0xa8034df1": { + "type": "function", + "signature": "function grantApproval()", + "selector": "0xa8034df1" + }, + "0x90d02b3c": { + "type": "function", + "signature": "function revokeApproval()", + "selector": "0x90d02b3c" + }, + "0x4a3e3a1f": { + "type": "function", + "signature": "function revokedApproval(address) view returns (bool)", + "selector": "0x4a3e3a1f" + }, + "0x74a9402e": { + "type": "function", + "signature": "function transferERC1155(address collection, address from, address to, uint256 tokenId, uint256 amount)", + "selector": "0x74a9402e" + }, + "0xda3e8ce4": { + "type": "function", + "signature": "function transferERC20(address token, address from, address to, uint256 amount)", + "selector": "0xda3e8ce4" + }, + "0x789f93f6": { + "type": "function", + "signature": "function transferERC721(address collection, address from, address to, uint256 tokenId)", + "selector": "0x789f93f6" + }, + "0xca72da8e": { + "type": "function", + "signature": "function transferERC721Unsafe(address collection, address from, address to, uint256 tokenId)", + "selector": "0xca72da8e" + }, + "0x66d38203": { + "type": "function", + "signature": "function setup(address token_addr)", + "selector": "0x66d38203" + }, + "0x422f1043": { + "type": "function", + "signature": "function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) payable returns (uint256 out)", + "selector": "0x422f1043" + }, + "0xf88bf15a": { + "type": "function", + "signature": "function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) returns (uint256 out, uint256 out)", + "selector": "0xf88bf15a" + }, + "0x89402a72": { + "type": "function", + "signature": "function __default__() payable", + "selector": "0x89402a72" + }, + "0xf39b5b9b": { + "type": "function", + "signature": "function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) payable returns (uint256 out)", + "selector": "0xf39b5b9b" + }, + "0xad65d76d": { + "type": "function", + "signature": "function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) payable returns (uint256 out)", + "selector": "0xad65d76d" + }, + "0x6b1d4db7": { + "type": "function", + "signature": "function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) payable returns (uint256 out)", + "selector": "0x6b1d4db7" + }, + "0x0b573638": { + "type": "function", + "signature": "function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) payable returns (uint256 out)", + "selector": "0x0b573638" + }, + "0x95e3c50b": { + "type": "function", + "signature": "function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) returns (uint256 out)", + "selector": "0x95e3c50b" + }, + "0x7237e031": { + "type": "function", + "signature": "function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) returns (uint256 out)", + "selector": "0x7237e031" + }, + "0x013efd8b": { + "type": "function", + "signature": "function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) returns (uint256 out)", + "selector": "0x013efd8b" + }, + "0xd4e4841d": { + "type": "function", + "signature": "function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) returns (uint256 out)", + "selector": "0xd4e4841d" + }, + "0xddf7e1a7": { + "type": "function", + "signature": "function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) returns (uint256 out)", + "selector": "0xddf7e1a7" + }, + "0xf552d91b": { + "type": "function", + "signature": "function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) returns (uint256 out)", + "selector": "0xf552d91b" + }, + "0xb040d545": { + "type": "function", + "signature": "function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) returns (uint256 out)", + "selector": "0xb040d545" + }, + "0xf3c0efe9": { + "type": "function", + "signature": "function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) returns (uint256 out)", + "selector": "0xf3c0efe9" + }, + "0xb1cb43bf": { + "type": "function", + "signature": "function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) returns (uint256 out)", + "selector": "0xb1cb43bf" + }, + "0xec384a3e": { + "type": "function", + "signature": "function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) returns (uint256 out)", + "selector": "0xec384a3e" + }, + "0xea650c7d": { + "type": "function", + "signature": "function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) returns (uint256 out)", + "selector": "0xea650c7d" + }, + "0x981a1327": { + "type": "function", + "signature": "function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) returns (uint256 out)", + "selector": "0x981a1327" + }, + "0xcd7724c3": { + "type": "function", + "signature": "function getEthToTokenInputPrice(uint256 eth_sold) view returns (uint256 out)", + "selector": "0xcd7724c3" + }, + "0x59e94862": { + "type": "function", + "signature": "function getEthToTokenOutputPrice(uint256 tokens_bought) view returns (uint256 out)", + "selector": "0x59e94862" + }, + "0x95b68fe7": { + "type": "function", + "signature": "function getTokenToEthInputPrice(uint256 tokens_sold) view returns (uint256 out)", + "selector": "0x95b68fe7" + }, + "0x2640f62c": { + "type": "function", + "signature": "function getTokenToEthOutputPrice(uint256 eth_bought) view returns (uint256 out)", + "selector": "0x2640f62c" + }, + "0x9d76ea58": { + "type": "function", + "signature": "function tokenAddress() view returns (address out)", + "selector": "0x9d76ea58" + }, + "0x966dae0e": { + "type": "function", + "signature": "function factoryAddress() view returns (address out)", + "selector": "0x966dae0e" + }, + "0xb29526b9": { + "type": "error", + "signature": "error BearAlreadyClaimedReward()", + "selector": "0xb29526b9" + }, + "0x3c16d2dc": { + "type": "error", + "signature": "error BitAlreadyClaimedReward()", + "selector": "0x3c16d2dc" + }, + "0x49e27cff": { + "type": "error", + "signature": "error InvalidOwner()", + "selector": "0x49e27cff" + }, + "0x9430a17e": { + "type": "error", + "signature": "error NonExistentToken()", + "selector": "0x9430a17e" + }, + "0x5fd76e04": { + "type": "error", + "signature": "error NotCompleted()", + "selector": "0x5fd76e04" + }, + "0x091fe61c": { + "type": "error", + "signature": "error NotYourToken()", + "selector": "0x091fe61c" + }, + "0xa3df9bcf": { + "type": "error", + "signature": "error StakingNotEnabled()", + "selector": "0xa3df9bcf" + }, + "0x8cd22d19": { + "type": "error", + "signature": "error TransferNotAllowed()", + "selector": "0x8cd22d19" + }, + "0x27e235e3": { + "type": "function", + "signature": "function balances(address) view returns (uint256)", + "selector": "0x27e235e3" + }, + "0xdc39f583": { + "type": "function", + "signature": "function bearsClaimed(uint256) view returns (bool)", + "selector": "0xdc39f583" + }, + "0x4c7cecdd": { + "type": "function", + "signature": "function bitsClaimed(uint256) view returns (bool)", + "selector": "0x4c7cecdd" + }, + "0xb1a8adfd": { + "type": "function", + "signature": "function enter(uint256[] bears, uint256[] bits)", + "selector": "0xb1a8adfd" + }, + "0x9c87e0a8": { + "type": "function", + "signature": "function escape(uint256[] bears)", + "selector": "0x9c87e0a8" + }, + "0xb0297e68": { + "type": "function", + "signature": "function exit(uint256[] bears, uint256[] rewards, bytes signature)", + "selector": "0xb0297e68" + }, + "0xf9374284": { + "type": "function", + "signature": "function killaBearsContract() view returns (address)", + "selector": "0xf9374284" + }, + "0x7670f7dd": { + "type": "function", + "signature": "function killaBitsContract() view returns (address)", + "selector": "0x7670f7dd" + }, + "0x220cce97": { + "type": "function", + "signature": "function rewardsContract() view returns (address)", + "selector": "0x220cce97" + }, + "0x3a6462e4": { + "type": "function", + "signature": "function setRewarder(address addr)", + "selector": "0x3a6462e4" + }, + "0xb77a2c1c": { + "type": "function", + "signature": "function stakeTime() view returns (uint256)", + "selector": "0xb77a2c1c" + }, + "0xd5a44f86": { + "type": "function", + "signature": "function stakes(uint256) view returns (uint32 ts, address owner, uint16 bit)", + "selector": "0xd5a44f86" + }, + "0x1cfff51b": { + "type": "function", + "signature": "function stakingEnabled() view returns (bool)", + "selector": "0x1cfff51b" + }, + "0x233a095d": { + "type": "function", + "signature": "function stakingEnabledFor(address) view returns (bool)", + "selector": "0x233a095d" + }, + "0x69805981": { + "type": "function", + "signature": "function toggleStaking(bool enabled)", + "selector": "0x69805981" + }, + "0x1a91ca5f": { + "type": "function", + "signature": "function toggleStakingFor(address who, bool enabled)", + "selector": "0x1a91ca5f" + }, + "0xe2a7b501": { + "type": "function", + "signature": "function tridentCLSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)", + "selector": "0xe2a7b501" + }, + "0x819faf7b": { + "type": "function", + "signature": "function aave() view returns (address)", + "selector": "0x819faf7b" + }, + "0x06a3fe59": { + "type": "function", + "signature": "function aaveToken() view returns (address)", + "selector": "0x06a3fe59" + }, + "0x99b71d5c": { + "type": "function", + "signature": "function approveToken()", + "selector": "0x99b71d5c" + }, + "0x57ded9c9": { + "type": "function", + "signature": "function apr() view returns (address)", + "selector": "0x57ded9c9" + }, + "0xb69ef8a8": { + "type": "function", + "signature": "function balance() view returns (uint256)", + "selector": "0xb69ef8a8" + }, + "0xcf8ca426": { + "type": "function", + "signature": "function balanceAave() view returns (uint256)", + "selector": "0xcf8ca426" + }, + "0x61c1ec55": { + "type": "function", + "signature": "function balanceCompound() view returns (uint256)", + "selector": "0x61c1ec55" + }, + "0xa7287971": { + "type": "function", + "signature": "function balanceCompoundInToken() view returns (uint256)", + "selector": "0xa7287971" + }, + "0x39c0a7e1": { + "type": "function", + "signature": "function balanceDydx() view returns (uint256)", + "selector": "0x39c0a7e1" + }, + "0x0eb2a267": { + "type": "function", + "signature": "function balanceFulcrum() view returns (uint256)", + "selector": "0x0eb2a267" + }, + "0xf5a41dea": { + "type": "function", + "signature": "function balanceFulcrumInToken() view returns (uint256)", + "selector": "0xf5a41dea" + }, + "0x7137ef99": { + "type": "function", + "signature": "function calcPoolValueInToken() view returns (uint256)", + "selector": "0x7137ef99" + }, + "0xf69e2046": { + "type": "function", + "signature": "function compound() view returns (address)", + "selector": "0xf69e2046" + }, + "0xd9d7858a": { + "type": "function", + "signature": "function dToken() view returns (uint256)", + "selector": "0xd9d7858a" + }, + "0x8e4ec6ef": { + "type": "function", + "signature": "function dydx() view returns (address)", + "selector": "0x8e4ec6ef" + }, + "0x58782c21": { + "type": "function", + "signature": "function fulcrum() view returns (address)", + "selector": "0x58782c21" + }, + "0xf7c1ec77": { + "type": "function", + "signature": "function getAave() view returns (address)", + "selector": "0xf7c1ec77" + }, + "0xf82ce27d": { + "type": "function", + "signature": "function getAaveCore() view returns (address)", + "selector": "0xf82ce27d" + }, + "0x77c7b8fc": { + "type": "function", + "signature": "function getPricePerFullShare() view returns (uint256)", + "selector": "0x77c7b8fc" + }, + "0x8f32d59b": { + "type": "function", + "signature": "function isOwner() view returns (bool)", + "selector": "0x8f32d59b" + }, + "0x16f0115b": { + "type": "function", + "signature": "function pool() view returns (uint256)", + "selector": "0x16f0115b" + }, + "0x085d4883": { + "type": "function", + "signature": "function provider() view returns (uint8)", + "selector": "0x085d4883" + }, + "0x7d7c2a1c": { + "type": "function", + "signature": "function rebalance()", + "selector": "0x7d7c2a1c" + }, + "0xa160176d": { + "type": "function", + "signature": "function recommend() view returns (uint8)", + "selector": "0xa160176d" + }, + "0x46357473": { + "type": "function", + "signature": "function set_new_APR(address _new_APR)", + "selector": "0x46357473" + }, + "0xf5ff1916": { + "type": "function", + "signature": "function set_new_COMPOUND(address _new_COMPOUND)", + "selector": "0xf5ff1916" + }, + "0x9ff011b9": { + "type": "function", + "signature": "function set_new_DTOKEN(uint256 _new_DTOKEN)", + "selector": "0x9ff011b9" + }, + "0x65aab749": { + "type": "function", + "signature": "function supplyAave(uint256 amount)", + "selector": "0x65aab749" + }, + "0xe849d659": { + "type": "function", + "signature": "function supplyCompound(uint256 amount)", + "selector": "0xe849d659" + }, + "0x06636c1c": { + "type": "function", + "signature": "function supplyDydx(uint256 amount) returns (uint256)", + "selector": "0x06636c1c" + }, + "0x8124955c": { + "type": "function", + "signature": "function supplyFulcrum(uint256 amount)", + "selector": "0x8124955c" + }, + "0xf60a15ed": { + "type": "function", + "signature": "function inCaseETHGetsStuck()", + "selector": "0xf60a15ed" + }, + "0x2e8d6e18": { + "type": "function", + "signature": "function inCaseTokenGetsStuck(address _TokenAddress)", + "selector": "0x2e8d6e18" + }, + "0x2afcf480": { + "type": "function", + "signature": "function invest(uint256 _amount)", + "selector": "0x2afcf480" + }, + "0x3990ab4f": { + "type": "function", + "signature": "function investSelf()", + "selector": "0x3990ab4f" + }, + "0xdb006a75": { + "type": "function", + "signature": "function redeem(uint256 redeemTokens) returns (uint256)", + "selector": "0xdb006a75" + }, + "0x812adb06": { + "type": "function", + "signature": "function set_new_AAVE(address _new_AAVE)", + "selector": "0x812adb06" + }, + "0xa9de245b": { + "type": "function", + "signature": "function set_new_ATOKEN(address _new_ATOKEN)", + "selector": "0xa9de245b" + }, + "0x2c7a5ae4": { + "type": "function", + "signature": "function set_new_DYDX(address _new_DYDX)", + "selector": "0x2c7a5ae4" + }, + "0xbbf31644": { + "type": "function", + "signature": "function set_new_FULCRUM(address _new_FULCRUM)", + "selector": "0xbbf31644" + }, + "0x6c25b346": { + "type": "function", + "signature": "function dai(address _account) view returns (uint256)", + "selector": "0x6c25b346" + }, + "0xc11645bc": { + "type": "function", + "signature": "function daiJoin() view returns (address)", + "selector": "0xc11645bc" + }, + "0xbe22f546": { + "type": "function", + "signature": "function daiToken() view returns (address)", + "selector": "0xbe22f546" + }, + "0x4a03707c": { + "type": "function", + "signature": "function draw(address src, uint256 wad)", + "selector": "0x4a03707c" + }, + "0xef693bed": { + "type": "function", + "signature": "function exit(address src, uint256 wad)", + "selector": "0xef693bed" + }, + "0x3b4da69f": { + "type": "function", + "signature": "function join(address dst, uint256 wad)", + "selector": "0x3b4da69f" + }, + "0xbb35783b": { + "type": "function", + "signature": "function move(address src, address dst, uint256 wad) returns (bool)", + "selector": "0xbb35783b" + }, + "0x8fcbaf0c": { + "type": "function", + "signature": "function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s)", + "selector": "0x8fcbaf0c" + }, + "0x4ba2363a": { + "type": "function", + "signature": "function pot() view returns (address)", + "selector": "0x4ba2363a" + }, + "0x36569e77": { + "type": "function", + "signature": "function vat() view returns (address)", + "selector": "0x36569e77" + }, + "0x06394c9b": { + "type": "function", + "signature": "function changeOperator(address _newOperator)", + "selector": "0x06394c9b" + }, + "0x17cc915c": { + "type": "function", + "signature": "function nullifierHashes(bytes32) view returns (bool)", + "selector": "0x17cc915c" + }, + "0x21a0adb6": { + "type": "function", + "signature": "function withdraw(bytes _proof, bytes32 _root, bytes32 _nullifierHash, address _recipient, address _relayer, uint256 _fee, uint256 _refund) payable", + "selector": "0x21a0adb6" + }, + "0x2b7ac3f3": { + "type": "function", + "signature": "function verifier() view returns (address)", + "selector": "0x2b7ac3f3" + }, + "0x38bf282e": { + "type": "function", + "signature": "function hashLeftRight(bytes32 _left, bytes32 _right) pure returns (bytes32)", + "selector": "0x38bf282e" + }, + "0x414a37ba": { + "type": "function", + "signature": "function FIELD_SIZE() view returns (uint256)", + "selector": "0x414a37ba" + }, + "0x4ecf518b": { + "type": "function", + "signature": "function levels() view returns (uint32)", + "selector": "0x4ecf518b" + }, + "0x570ca735": { + "type": "function", + "signature": "function operator() view returns (address)", + "selector": "0x570ca735" + }, + "0x6d9833e3": { + "type": "function", + "signature": "function isKnownRoot(bytes32 _root) view returns (bool)", + "selector": "0x6d9833e3" + }, + "0x8bca6d16": { + "type": "function", + "signature": "function denomination() view returns (uint256)", + "selector": "0x8bca6d16" + }, + "0x90eeb02b": { + "type": "function", + "signature": "function currentRootIndex() view returns (uint32)", + "selector": "0x90eeb02b" + }, + "0x97fc007c": { + "type": "function", + "signature": "function updateVerifier(address _newVerifier)", + "selector": "0x97fc007c" + }, + "0x9fa12d0b": { + "type": "function", + "signature": "function isSpentArray(bytes32[] _nullifierHashes) view returns (bool[] spent)", + "selector": "0x9fa12d0b" + }, + "0xb214faa5": { + "type": "function", + "signature": "function deposit(bytes32 _commitment) payable", + "selector": "0xb214faa5" + }, + "0xba70f757": { + "type": "function", + "signature": "function getLastRoot() view returns (bytes32)", + "selector": "0xba70f757" + }, + "0xc2b40ae4": { + "type": "function", + "signature": "function roots(uint256) view returns (bytes32)", + "selector": "0xc2b40ae4" + }, + "0xcd87a3b4": { + "type": "function", + "signature": "function ROOT_HISTORY_SIZE() view returns (uint32)", + "selector": "0xcd87a3b4" + }, + "0xe5285dcc": { + "type": "function", + "signature": "function isSpent(bytes32 _nullifierHash) view returns (bool)", + "selector": "0xe5285dcc" + }, + "0xe8295588": { + "type": "function", + "signature": "function zeros(uint256) view returns (bytes32)", + "selector": "0xe8295588" + }, + "0xec732959": { + "type": "function", + "signature": "function ZERO_VALUE() view returns (uint256)", + "selector": "0xec732959" + }, + "0xf178e47c": { + "type": "function", + "signature": "function filledSubtrees(uint256) view returns (bytes32)", + "selector": "0xf178e47c" + }, + "0xfc7e9c6f": { + "type": "function", + "signature": "function nextIndex() view returns (uint32)", + "selector": "0xfc7e9c6f" + }, + "0x0b82d33d": { + "type": "function", + "signature": "function withdrawBalanceDifference() returns (bool success)", + "selector": "0x0b82d33d" + }, + "0x0e7c1cb5": { + "type": "function", + "signature": "function originalToken() view returns (address)", + "selector": "0x0e7c1cb5" + }, + "0x1d6f757d": { + "type": "function", + "signature": "function withdraw(uint256 _value, uint8 v, bytes32 r, bytes32 s, uint256 signatureValidUntilBlock) returns (bool success)", + "selector": "0x1d6f757d" + }, + "0x45164b3e": { + "type": "function", + "signature": "function TRANSFER_PROXY_VEFX() view returns (address)", + "selector": "0x45164b3e" + }, + "0x74f1d6ce": { + "type": "function", + "signature": "function keccak(address _sender, address _wrapper, uint256 _validTill) view returns (bytes32)", + "selector": "0x74f1d6ce" + }, + "0x7df73e27": { + "type": "function", + "signature": "function isSigner(address) view returns (bool)", + "selector": "0x7df73e27" + }, + "0x8b257d3d": { + "type": "function", + "signature": "function isValidSignature(bytes32 hash, uint8 v, bytes32 r, bytes32 s) view returns (bool)", + "selector": "0x8b257d3d" + }, + "0xad93640f": { + "type": "function", + "signature": "function TRANSFER_PROXY_V2() view returns (address)", + "selector": "0xad93640f" + }, + "0xcc891023": { + "type": "function", + "signature": "function depositLock(address) view returns (uint256)", + "selector": "0xcc891023" + }, + "0xdc42f2ed": { + "type": "function", + "signature": "function withdrawDifferentToken(address _differentToken) returns (bool)", + "selector": "0xdc42f2ed" + }, + "0xeb12d61e": { + "type": "function", + "signature": "function addSigner(address _newSigner)", + "selector": "0xeb12d61e" + }, + "0x0bdbb71b": { + "type": "error", + "signature": "error CanNoLongerEscape()", + "selector": "0x0bdbb71b" + }, + "0x64da4178": { + "type": "function", + "signature": "function adminEscape(uint256[] bears)", + "selector": "0x64da4178" + }, + "0xb76aa710": { + "type": "function", + "signature": "function adminExit(address holder, uint256[] bears, uint256[] rewards)", + "selector": "0xb76aa710" + }, + "0xc7e3677b": { + "type": "function", + "signature": "function escapeAndMarkAsClaimed(uint256[] bears)", + "selector": "0xc7e3677b" + }, + "0xd2f7265a": { + "type": "function", + "signature": "function exchange() view returns (address)", + "selector": "0xd2f7265a" + }, + "0x99f0d6c5": { + "type": "function", + "signature": "function transferNFT(address collection, uint256 tokenId, uint256, address from, address to)", + "selector": "0x99f0d6c5" + }, + "0x118e31b7": { + "type": "function", + "signature": "function getBorrowBalance(address account, address asset) view returns (uint256)", + "selector": "0x118e31b7" + }, + "0x24021127": { + "type": "function", + "signature": "function _setOriginationFee(uint256 originationFeeMantissa) returns (uint256)", + "selector": "0x24021127" + }, + "0x26617c28": { + "type": "function", + "signature": "function _setPaused(bool requestedState) returns (uint256)", + "selector": "0x26617c28" + }, + "0x26782247": { + "type": "function", + "signature": "function pendingAdmin() view returns (address)", + "selector": "0x26782247" + }, + "0x3be59443": { + "type": "function", + "signature": "function _setOracle(address newOracle) returns (uint256)", + "selector": "0x3be59443" + }, + "0x4706c375": { + "type": "function", + "signature": "function _withdrawEquity(address asset, uint256 amount) returns (uint256)", + "selector": "0x4706c375" + }, + "0x4b8a3529": { + "type": "function", + "signature": "function borrow(address asset, uint256 amount) returns (uint256)", + "selector": "0x4b8a3529" + }, + "0x5cf756d2": { + "type": "function", + "signature": "function _setMarketInterestRateModel(address asset, address interestRateModel) returns (uint256)", + "selector": "0x5cf756d2" + }, + "0x5e9a523c": { + "type": "function", + "signature": "function assetPrices(address asset) view returns (uint256)", + "selector": "0x5e9a523c" + }, + "0x5ec88c79": { + "type": "function", + "signature": "function getAccountLiquidity(address account) view returns (int256)", + "selector": "0x5ec88c79" + }, + "0x6e2ede03": { + "type": "function", + "signature": "function getCollateralMarketsLength() view returns (uint256)", + "selector": "0x6e2ede03" + }, + "0x8053fcbe": { + "type": "function", + "signature": "function liquidationDiscount() view returns (uint256 mantissa)", + "selector": "0x8053fcbe" + }, + "0x8e8f294b": { + "type": "function", + "signature": "function markets(address) view returns (bool isSupported, uint256 blockNumber, address interestRateModel, uint256 totalSupply, uint256 supplyRateMantissa, uint256 supplyIndex, uint256 totalBorrows, uint256 borrowRateMantissa, uint256 borrowIndex)", + "selector": "0x8e8f294b" + }, + "0x9f180cf1": { + "type": "function", + "signature": "function calculateAccountValues(address userAddress) view returns (uint256, uint256, uint256)", + "selector": "0x9f180cf1" + }, + "0xabdb5ea8": { + "type": "function", + "signature": "function repayBorrow(address asset, uint256 amount) returns (uint256)", + "selector": "0xabdb5ea8" + }, + "0xb4eae1cb": { + "type": "function", + "signature": "function collateralRatio() view returns (uint256 mantissa)", + "selector": "0xb4eae1cb" + }, + "0xb71d1a0c": { + "type": "function", + "signature": "function _setPendingAdmin(address newPendingAdmin) returns (uint256)", + "selector": "0xb71d1a0c" + }, + "0xb7adddac": { + "type": "function", + "signature": "function supplyBalances(address, address) view returns (uint256 principal, uint256 interestIndex)", + "selector": "0xb7adddac" + }, + "0xb8bb5c42": { + "type": "function", + "signature": "function originationFee() view returns (uint256 mantissa)", + "selector": "0xb8bb5c42" + }, + "0xba377731": { + "type": "function", + "signature": "function getSupplyBalance(address account, address asset) view returns (uint256)", + "selector": "0xba377731" + }, + "0xbeb54615": { + "type": "function", + "signature": "function collateralMarkets(uint256) view returns (address)", + "selector": "0xbeb54615" + }, + "0xc1abfaa3": { + "type": "function", + "signature": "function _supportMarket(address asset, address interestRateModel) returns (uint256)", + "selector": "0xc1abfaa3" + }, + "0xc365a646": { + "type": "function", + "signature": "function _setRiskParameters(uint256 collateralRatioMantissa, uint256 liquidationDiscountMantissa) returns (uint256)", + "selector": "0xc365a646" + }, + "0xdbe2bc84": { + "type": "function", + "signature": "function _suspendMarket(address asset) returns (uint256)", + "selector": "0xdbe2bc84" + }, + "0xe61604cf": { + "type": "function", + "signature": "function liquidateBorrow(address targetAccount, address assetBorrow, address assetCollateral, uint256 requestedAmountClose) returns (uint256)", + "selector": "0xe61604cf" + }, + "0xe9c714f2": { + "type": "function", + "signature": "function _acceptAdmin() returns (uint256)", + "selector": "0xe9c714f2" + }, + "0xf2b9fdb8": { + "type": "function", + "signature": "function supply(address asset, uint256 amount) returns (uint256)", + "selector": "0xf2b9fdb8" + }, + "0xf3fef3a3": { + "type": "function", + "signature": "function withdraw(address token, uint256 amount) returns (bool success)", + "selector": "0xf3fef3a3" + }, + "0xfc7d42d7": { + "type": "function", + "signature": "function borrowBalances(address, address) view returns (uint256 principal, uint256 interestIndex)", + "selector": "0xfc7d42d7" + }, + "0xd6d75f51": { + "type": "function", + "signature": "function moneyMarket() view returns (address)", + "selector": "0xd6d75f51" + }, + "0x01d22ccd": { + "type": "function", + "signature": "function rebalancer() view returns (address)", + "selector": "0x01d22ccd" + }, + "0x194a62a8": { + "type": "function", + "signature": "function redeemInterestBearingTokens(uint256 _amount)", + "selector": "0x194a62a8" + }, + "0x1a5d6705": { + "type": "function", + "signature": "function getParamsForRedeemIdleToken(uint256 _amount, bool _skipRebalance) returns (address[], uint256[])", + "selector": "0x1a5d6705" + }, + "0x1aaa4a18": { + "type": "function", + "signature": "function setMinRateDifference(uint256 _rate)", + "selector": "0x1aaa4a18" + }, + "0x22c9f971": { + "type": "function", + "signature": "function minRateDifference() view returns (uint256)", + "selector": "0x22c9f971" + }, + "0x36a00082": { + "type": "function", + "signature": "function allAvailableTokens(uint256) view returns (address)", + "selector": "0x36a00082" + }, + "0x3b97e856": { + "type": "function", + "signature": "function tokenDecimals() view returns (uint256)", + "selector": "0x3b97e856" + }, + "0x3cfcef64": { + "type": "function", + "signature": "function mintIdleToken(uint256 _amount, uint256[] _clientProtocolAmounts) returns (uint256 mintedTokens)", + "selector": "0x3cfcef64" + }, + "0x408cfe24": { + "type": "function", + "signature": "function iToken() view returns (address)", + "selector": "0x408cfe24" + }, + "0x45c8026c": { + "type": "function", + "signature": "function protocolWrappers(address) view returns (address)", + "selector": "0x45c8026c" + }, + "0x46fbf68e": { + "type": "function", + "signature": "function isPauser(address account) view returns (bool)", + "selector": "0x46fbf68e" + }, + "0x47ce6522": { + "type": "function", + "signature": "function getParamsForMintIdleToken(uint256 _amount) returns (address[], uint256[])", + "selector": "0x47ce6522" + }, + "0x56a5178b": { + "type": "function", + "signature": "function claimITokens(uint256[] _clientProtocolAmounts) returns (uint256 claimedTokens)", + "selector": "0x56a5178b" + }, + "0x6922d7b6": { + "type": "function", + "signature": "function setPriceCalculator(address _priceCalculator)", + "selector": "0x6922d7b6" + }, + "0x69ad6af2": { + "type": "function", + "signature": "function rebalance(uint256 _newAmount, uint256[] _clientProtocolAmounts) returns (bool)", + "selector": "0x69ad6af2" + }, + "0x6cfd1553": { + "type": "function", + "signature": "function setRebalancer(address _rebalancer)", + "selector": "0x6cfd1553" + }, + "0x6ef8d66d": { + "type": "function", + "signature": "function renouncePauser()", + "selector": "0x6ef8d66d" + }, + "0x7e2a53af": { + "type": "function", + "signature": "function setIToken(address _iToken)", + "selector": "0x7e2a53af" + }, + "0x7ff9b596": { + "type": "function", + "signature": "function tokenPrice() view returns (uint256 price)", + "selector": "0x7ff9b596" + }, + "0x82ba653d": { + "type": "function", + "signature": "function setManualPlay(bool _manualPlay)", + "selector": "0x82ba653d" + }, + "0x82dc1ec4": { + "type": "function", + "signature": "function addPauser(address account)", + "selector": "0x82dc1ec4" + }, + "0x8b95e335": { + "type": "function", + "signature": "function priceCalculator() view returns (address)", + "selector": "0x8b95e335" + }, + "0x9fc7875b": { + "type": "function", + "signature": "function manualPlay() view returns (bool)", + "selector": "0x9fc7875b" + }, + "0xb13bd491": { + "type": "function", + "signature": "function getAPRs() view returns (address[] addresses, uint256[] aprs)", + "selector": "0xb13bd491" + }, + "0xbf959bb8": { + "type": "function", + "signature": "function currentTokensUsed(uint256) view returns (address)", + "selector": "0xbf959bb8" + }, + "0xc4a664b8": { + "type": "function", + "signature": "function getParamsForRebalance(uint256 _newAmount) returns (address[], uint256[])", + "selector": "0xc4a664b8" + }, + "0xc85c93aa": { + "type": "function", + "signature": "function redeemIdleToken(uint256 _amount, bool _skipRebalance, uint256[] _clientProtocolAmounts) returns (uint256 redeemedTokens)", + "selector": "0xc85c93aa" + }, + "0xf2ce5806": { + "type": "function", + "signature": "function setProtocolWrapper(address _token, address _wrapper)", + "selector": "0xf2ce5806" + }, + "0xf2d50ba6": { + "type": "function", + "signature": "function lastITokenPrice() view returns (uint256)", + "selector": "0xf2d50ba6" + }, + "0x6c4a483e": { + "type": "function", + "signature": "function discountedSwap(address caller, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags, bytes permit) desc, bytes data) payable returns (uint256 returnAmount, uint256 gasLeft, uint256 chiSpent)", + "selector": "0x6c4a483e" + }, + "0x34b0793b": { + "type": "function", + "signature": "function discountedSwap(address caller, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, tuple(uint256 targetWithMandatory, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)", + "selector": "0x34b0793b" + }, + "0x90411a32": { + "type": "function", + "signature": "function swap(address caller, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, tuple(uint256 targetWithMandatory, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)", + "selector": "0x90411a32" + }, + "0x4ca88867": { + "type": "error", + "signature": "error AccessDenied()", + "selector": "0x4ca88867" + }, + "0xbd71636d": { + "type": "error", + "signature": "error AdvanceNonceFailed()", + "selector": "0xbd71636d" + }, + "0x41a26a63": { + "type": "error", + "signature": "error AlreadyFilled()", + "selector": "0x41a26a63" + }, + "0x1f1b8f61": { + "type": "error", + "signature": "error ArbitraryStaticCallFailed()", + "selector": "0x1f1b8f61" + }, + "0xb2c02722": { + "type": "error", + "signature": "error BadPool()", + "selector": "0xb2c02722" + }, + "0x5cd5d233": { + "type": "error", + "signature": "error BadSignature()", + "selector": "0x5cd5d233" + }, + "0xb12d13eb": { + "type": "error", + "signature": "error ETHTransferFailed()", + "selector": "0xb12d13eb" + }, + "0x67e7c0f6": { + "type": "error", + "signature": "error EmptyPools()", + "selector": "0x67e7c0f6" + }, + "0x1b10b0f9": { + "type": "error", + "signature": "error EthDepositRejected()", + "selector": "0x1b10b0f9" + }, + "0x110b8e73": { + "type": "error", + "signature": "error GetAmountCallFailed()", + "selector": "0x110b8e73" + }, + "0xef356d7a": { + "type": "error", + "signature": "error IncorrectDataLength()", + "selector": "0xef356d7a" + }, + "0xf4d678b8": { + "type": "error", + "signature": "error InsufficientBalance()", + "selector": "0xf4d678b8" + }, + "0x1841b4e1": { + "type": "error", + "signature": "error InvalidMsgValue()", + "selector": "0x1841b4e1" + }, + "0xf71fbda2": { + "type": "error", + "signature": "error InvalidatedOrder()", + "selector": "0xf71fbda2" + }, + "0xaa34b696": { + "type": "error", + "signature": "error MakingAmountExceeded()", + "selector": "0xaa34b696" + }, + "0x481ea392": { + "type": "error", + "signature": "error MakingAmountTooLow()", + "selector": "0x481ea392" + }, + "0x00e2a522": { + "type": "error", + "signature": "error OnlyOneAmountShouldBeZero()", + "selector": "0x00e2a522" + }, + "0xc56873ba": { + "type": "error", + "signature": "error OrderExpired()", + "selector": "0xc56873ba" + }, + "0xd9e1c6dc": { + "type": "error", + "signature": "error PermitLengthTooLow()", + "selector": "0xd9e1c6dc" + }, + "0xb6629c02": { + "type": "error", + "signature": "error PredicateIsNotTrue()", + "selector": "0xb6629c02" + }, + "0xd4dfdafe": { + "type": "error", + "signature": "error PrivateOrder()", + "selector": "0xd4dfdafe" + }, + "0x17c2b1f1": { + "type": "error", + "signature": "error RFQBadSignature()", + "selector": "0x17c2b1f1" + }, + "0xe8c66321": { + "type": "error", + "signature": "error RFQPrivateOrder()", + "selector": "0xe8c66321" + }, + "0x07b6e79f": { + "type": "error", + "signature": "error RFQSwapWithZeroAmount()", + "selector": "0x07b6e79f" + }, + "0x692e45e0": { + "type": "error", + "signature": "error RFQZeroTargetIsForbidden()", + "selector": "0x692e45e0" + }, + "0xc5f2be51": { + "type": "error", + "signature": "error ReentrancyDetected()", + "selector": "0xc5f2be51" + }, + "0xecef3664": { + "type": "error", + "signature": "error RemainingAmountIsZero()", + "selector": "0xecef3664" + }, + "0x85cd58dc": { + "type": "error", + "signature": "error ReservesCallFailed()", + "selector": "0x85cd58dc" + }, + "0xf32bec2f": { + "type": "error", + "signature": "error ReturnAmountIsNotEnough()", + "selector": "0xf32bec2f" + }, + "0x68275857": { + "type": "error", + "signature": "error SafePermitBadLength()", + "selector": "0x68275857" + }, + "0xfb7f5079": { + "type": "error", + "signature": "error SafeTransferFailed()", + "selector": "0xfb7f5079" + }, + "0xf4059071": { + "type": "error", + "signature": "error SafeTransferFromFailed()", + "selector": "0xf4059071" + }, + "0x1934afc8": { + "type": "error", + "signature": "error SimulationResults(bool success, bytes res)", + "selector": "0x1934afc8" + }, + "0xcf0b4d3a": { + "type": "error", + "signature": "error SwapAmountTooLarge()", + "selector": "0xcf0b4d3a" + }, + "0xfba5a276": { + "type": "error", + "signature": "error SwapWithZeroAmount()", + "selector": "0xfba5a276" + }, + "0x7f902a93": { + "type": "error", + "signature": "error TakingAmountExceeded()", + "selector": "0x7f902a93" + }, + "0x939c4204": { + "type": "error", + "signature": "error TakingAmountIncreased()", + "selector": "0x939c4204" + }, + "0xfb8ae129": { + "type": "error", + "signature": "error TakingAmountTooHigh()", + "selector": "0xfb8ae129" + }, + "0x70a03f48": { + "type": "error", + "signature": "error TransferFromMakerToTakerFailed()", + "selector": "0x70a03f48" + }, + "0x478a5205": { + "type": "error", + "signature": "error TransferFromTakerToMakerFailed()", + "selector": "0x478a5205" + }, + "0xb838de96": { + "type": "error", + "signature": "error UnknownOrder()", + "selector": "0xb838de96" + }, + "0x49986e73": { + "type": "error", + "signature": "error WrongAmount()", + "selector": "0x49986e73" + }, + "0xbec74c85": { + "type": "error", + "signature": "error WrongGetter()", + "selector": "0xbec74c85" + }, + "0x0262dde4": { + "type": "error", + "signature": "error ZeroMinReturn()", + "selector": "0x0262dde4" + }, + "0x28ebf247": { + "type": "error", + "signature": "error ZeroReturnAmount()", + "selector": "0x28ebf247" + }, + "0xb0c4d05f": { + "type": "error", + "signature": "error ZeroTargetIsForbidden()", + "selector": "0xb0c4d05f" + }, + "0x72c244a8": { + "type": "function", + "signature": "function advanceNonce(uint8 amount)", + "selector": "0x72c244a8" + }, + "0xbfa75143": { + "type": "function", + "signature": "function and(uint256 offsets, bytes data) view returns (bool)", + "selector": "0xbfa75143" + }, + "0xbf15fcd8": { + "type": "function", + "signature": "function arbitraryStaticCall(address target, bytes data) view returns (uint256)", + "selector": "0xbf15fcd8" + }, + "0x2d9a56f6": { + "type": "function", + "signature": "function cancelOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order) returns (uint256 orderRemaining, bytes32 orderHash)", + "selector": "0x2d9a56f6" + }, + "0xbddccd35": { + "type": "function", + "signature": "function cancelOrderRFQ(uint256 orderInfo, uint256 additionalMask)", + "selector": "0xbddccd35" + }, + "0x6c838250": { + "type": "function", + "signature": "function checkPredicate(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order) view returns (bool)", + "selector": "0x6c838250" + }, + "0x84bd6d29": { + "type": "function", + "signature": "function clipperSwap(address clipperExchange, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs) payable returns (uint256 returnAmount)", + "selector": "0x84bd6d29" + }, + "0x093d4fa5": { + "type": "function", + "signature": "function clipperSwapTo(address clipperExchange, address recipient, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs) payable returns (uint256 returnAmount)", + "selector": "0x093d4fa5" + }, + "0xc805a666": { + "type": "function", + "signature": "function clipperSwapToWithPermit(address clipperExchange, address recipient, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs, bytes permit) returns (uint256 returnAmount)", + "selector": "0xc805a666" + }, + "0x6fe7b0ba": { + "type": "function", + "signature": "function eq(uint256 value, bytes data) view returns (bool)", + "selector": "0x6fe7b0ba" + }, + "0x62e238bb": { + "type": "function", + "signature": "function fillOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount) payable returns (uint256, uint256, bytes32)", + "selector": "0x62e238bb" + }, + "0x3eca9c0a": { + "type": "function", + "signature": "function fillOrderRFQ(tuple(uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount) payable returns (uint256, uint256, bytes32)", + "selector": "0x3eca9c0a" + }, + "0x9570eeee": { + "type": "function", + "signature": "function fillOrderRFQCompact(tuple(uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes32 r, bytes32 vs, uint256 flagsAndAmount) payable returns (uint256 filledMakingAmount, uint256 filledTakingAmount, bytes32 orderHash)", + "selector": "0x9570eeee" + }, + "0x5a099843": { + "type": "function", + "signature": "function fillOrderRFQTo(tuple(uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount, address target) payable returns (uint256 filledMakingAmount, uint256 filledTakingAmount, bytes32 orderHash)", + "selector": "0x5a099843" + }, + "0x70ccbd31": { + "type": "function", + "signature": "function fillOrderRFQToWithPermit(tuple(uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount, address target, bytes permit) returns (uint256, uint256, bytes32)", + "selector": "0x70ccbd31" + }, + "0xe5d7bde6": { + "type": "function", + "signature": "function fillOrderTo(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order_, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount, address target) payable returns (uint256 actualMakingAmount, uint256 actualTakingAmount, bytes32 orderHash)", + "selector": "0xe5d7bde6" + }, + "0xd365c695": { + "type": "function", + "signature": "function fillOrderToWithPermit(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount, address target, bytes permit) returns (uint256, uint256, bytes32)", + "selector": "0xd365c695" + }, + "0x4f38e2b8": { + "type": "function", + "signature": "function gt(uint256 value, bytes data) view returns (bool)", + "selector": "0x4f38e2b8" + }, + "0x37e7316f": { + "type": "function", + "signature": "function hashOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order) view returns (bytes32)", + "selector": "0x37e7316f" + }, + "0xc53a0292": { + "type": "function", + "signature": "function increaseNonce()", + "selector": "0xc53a0292" + }, + "0xca4ece22": { + "type": "function", + "signature": "function lt(uint256 value, bytes data) view returns (bool)", + "selector": "0xca4ece22" + }, + "0x70ae92d2": { + "type": "function", + "signature": "function nonce(address) view returns (uint256)", + "selector": "0x70ae92d2" + }, + "0xcf6fc6e3": { + "type": "function", + "signature": "function nonceEquals(address makerAddress, uint256 makerNonce) view returns (bool)", + "selector": "0xcf6fc6e3" + }, + "0x74261145": { + "type": "function", + "signature": "function or(uint256 offsets, bytes data) view returns (bool)", + "selector": "0x74261145" + }, + "0xbc1ed74c": { + "type": "function", + "signature": "function remaining(bytes32 orderHash) view returns (uint256)", + "selector": "0xbc1ed74c" + }, + "0x7e54f092": { + "type": "function", + "signature": "function remainingRaw(bytes32 orderHash) view returns (uint256)", + "selector": "0x7e54f092" + }, + "0x942461bb": { + "type": "function", + "signature": "function remainingsRaw(bytes32[] orderHashes) view returns (uint256[])", + "selector": "0x942461bb" + }, + "0xbd61951d": { + "type": "function", + "signature": "function simulate(address target, bytes data)", + "selector": "0xbd61951d" + }, + "0x12aa3caf": { + "type": "function", + "signature": "function swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)", + "selector": "0x12aa3caf" + }, + "0x63592c2b": { + "type": "function", + "signature": "function timestampBelow(uint256 time) view returns (bool)", + "selector": "0x63592c2b" + }, + "0x2cc2878d": { + "type": "function", + "signature": "function timestampBelowAndNonceEquals(uint256 timeNonceAccount) view returns (bool)", + "selector": "0x2cc2878d" + }, + "0x0502b1c5": { + "type": "function", + "signature": "function unoswap(address srcToken, uint256 amount, uint256 minReturn, uint256[] pools) payable returns (uint256 returnAmount)", + "selector": "0x0502b1c5" + }, + "0xf78dc253": { + "type": "function", + "signature": "function unoswapTo(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools) payable returns (uint256 returnAmount)", + "selector": "0xf78dc253" + }, + "0x3c15fd91": { + "type": "function", + "signature": "function unoswapToWithPermit(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools, bytes permit) returns (uint256 returnAmount)", + "selector": "0x3c15fd91" + }, + "0xb0431182": { + "type": "function", + "signature": "function clipperSwap(address srcToken, address dstToken, uint256 amount, uint256 minReturn) payable returns (uint256 returnAmount)", + "selector": "0xb0431182" + }, + "0x9994dd15": { + "type": "function", + "signature": "function clipperSwapTo(address recipient, address srcToken, address dstToken, uint256 amount, uint256 minReturn) payable returns (uint256 returnAmount)", + "selector": "0x9994dd15" + }, + "0xd6a92a5d": { + "type": "function", + "signature": "function clipperSwapToWithPermit(address recipient, address srcToken, address dstToken, uint256 amount, uint256 minReturn, bytes permit) returns (uint256 returnAmount)", + "selector": "0xd6a92a5d" + }, + "0x71a2039a": { + "type": "function", + "signature": "function getOrdersInfoRespectingBalancesAndAllowances(address token, address zrx, address zrxTokenProxy, tuple(address makerAddress, address takerAddress, address feeRecipientAddress, address senderAddress, uint256 makerAssetAmount, uint256 takerAssetAmount, uint256 makerFee, uint256 takerFee, uint256 expirationTimeSeconds, uint256 salt, bytes makerAssetData, bytes takerAssetData)[] orders) view returns (tuple(uint8 orderStatus, bytes32 orderHash, uint256 orderTakerAssetFilledAmount)[] ordersInfo)", + "selector": "0x71a2039a" + }, + "0xa96c400e": { + "type": "function", + "signature": "function marketSellOrdersProportion(address tokenSell, address tokenBuy, address zrxExchange, address zrxTokenProxy, tuple(address makerAddress, address takerAddress, address feeRecipientAddress, address senderAddress, uint256 makerAssetAmount, uint256 takerAssetAmount, uint256 makerFee, uint256 takerFee, uint256 expirationTimeSeconds, uint256 salt, bytes makerAssetData, bytes takerAssetData)[] orders, bytes[] signatures, uint256 mul, uint256 div)", + "selector": "0xa96c400e" + }, + "0xae4dd0fc": { + "type": "function", + "signature": "function withdrawAllToken(address token)", + "selector": "0xae4dd0fc" + }, + "0xbf86d690": { + "type": "function", + "signature": "function isShutdown() view returns (bool)", + "selector": "0xbf86d690" + }, + "0xc9b27359": { + "type": "function", + "signature": "function infiniteApproveIfNeeded(address token, address to)", + "selector": "0xc9b27359" + }, + "0xe8edc816": { + "type": "function", + "signature": "function spender() view returns (address)", + "selector": "0xe8edc816" + }, + "0xf88309d7": { + "type": "function", + "signature": "function swap(address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, uint256 guaranteedAmount, address referrer, address[] callAddresses, bytes callDataConcat, uint256[] starts, uint256[] gasLimitsAndValues) payable returns (uint256 returnAmount)", + "selector": "0xf88309d7" + }, + "0xfc0e74d1": { + "type": "function", + "signature": "function shutdown()", + "selector": "0xfc0e74d1" + }, + "0xfcc06f8e": { + "type": "function", + "signature": "function marketSellOrders(address makerAsset, address zrxExchange, address zrxTokenProxy, uint256 takerAssetFillAmount, tuple(address makerAddress, address takerAddress, address feeRecipientAddress, address senderAddress, uint256 makerAssetAmount, uint256 takerAssetAmount, uint256 makerFee, uint256 takerFee, uint256 expirationTimeSeconds, uint256 salt, bytes makerAssetData, bytes takerAssetData)[] orders, bytes[] signatures) returns (tuple(uint256 makerAssetFilledAmount, uint256 takerAssetFilledAmount, uint256 makerFeePaid, uint256 takerFeePaid) totalFillResults)", + "selector": "0xfcc06f8e" + }, + "0x54dd5f74": { + "type": "function", + "signature": "function LIMIT_ORDER_TYPEHASH() view returns (bytes32)", + "selector": "0x54dd5f74" + }, + "0x961d5b1e": { + "type": "function", + "signature": "function and(address[] targets, bytes[] data) view returns (bool)", + "selector": "0x961d5b1e" + }, + "0xb244b450": { + "type": "function", + "signature": "function cancelOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order)", + "selector": "0xb244b450" + }, + "0xa65a0e71": { + "type": "function", + "signature": "function checkPredicate(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order) view returns (bool)", + "selector": "0xa65a0e71" + }, + "0x36006bf3": { + "type": "function", + "signature": "function doublePrice(address oracle1, address oracle2, uint256 spread, uint256 amount) view returns (uint256)", + "selector": "0x36006bf3" + }, + "0x32565d61": { + "type": "function", + "signature": "function eq(uint256 value, address target, bytes data) view returns (bool)", + "selector": "0x32565d61" + }, + "0x655d13cd": { + "type": "function", + "signature": "function fillOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order, bytes signature, uint256 makingAmount, uint256 takingAmount, uint256 thresholdAmount) returns (uint256, uint256)", + "selector": "0x655d13cd" + }, + "0xb2610fe3": { + "type": "function", + "signature": "function fillOrderTo(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order, bytes signature, uint256 makingAmount, uint256 takingAmount, uint256 thresholdAmount, address target) returns (uint256, uint256)", + "selector": "0xb2610fe3" + }, + "0x6073cc20": { + "type": "function", + "signature": "function fillOrderToWithPermit(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order, bytes signature, uint256 makingAmount, uint256 takingAmount, uint256 thresholdAmount, address target, bytes permit) returns (uint256, uint256)", + "selector": "0x6073cc20" + }, + "0xf4a215c3": { + "type": "function", + "signature": "function getMakerAmount(uint256 orderMakerAmount, uint256 orderTakerAmount, uint256 swapTakerAmount) pure returns (uint256)", + "selector": "0xf4a215c3" + }, + "0x296637bf": { + "type": "function", + "signature": "function getTakerAmount(uint256 orderMakerAmount, uint256 orderTakerAmount, uint256 swapMakerAmount) pure returns (uint256)", + "selector": "0x296637bf" + }, + "0x057702e9": { + "type": "function", + "signature": "function gt(uint256 value, address target, bytes data) view returns (bool)", + "selector": "0x057702e9" + }, + "0xfa1cb9f2": { + "type": "function", + "signature": "function hashOrder(tuple(uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, bytes makerAssetData, bytes takerAssetData, bytes getMakerAmount, bytes getTakerAmount, bytes predicate, bytes permit, bytes interaction) order) view returns (bytes32)", + "selector": "0xfa1cb9f2" + }, + "0x871919d5": { + "type": "function", + "signature": "function lt(uint256 value, address target, bytes data) view returns (bool)", + "selector": "0x871919d5" + }, + "0xe6133301": { + "type": "function", + "signature": "function or(address[] targets, bytes[] data) view returns (bool)", + "selector": "0xe6133301" + }, + "0x7f29a59d": { + "type": "function", + "signature": "function simulateCalls(address[] targets, bytes[] data)", + "selector": "0x7f29a59d" + }, + "0xc05435f1": { + "type": "function", + "signature": "function singlePrice(address oracle, uint256 inverseAndSpread, uint256 amount) view returns (uint256)", + "selector": "0xc05435f1" + }, + "0x42200566": { + "type": "error", + "signature": "error CalldataEmptyButInitNotZero()", + "selector": "0x42200566" + }, + "0x79c9df22": { + "type": "error", + "signature": "error FacetAddressIsNotZero()", + "selector": "0x79c9df22" + }, + "0xc68ec83a": { + "type": "error", + "signature": "error FacetAddressIsZero()", + "selector": "0xc68ec83a" + }, + "0xe3500600": { + "type": "error", + "signature": "error FacetContainsNoCode()", + "selector": "0xe3500600" + }, + "0xa023275d": { + "type": "error", + "signature": "error FunctionAlreadyExists()", + "selector": "0xa023275d" + }, + "0xa9ad62f8": { + "type": "error", + "signature": "error FunctionDoesNotExist()", + "selector": "0xa9ad62f8" + }, + "0xc3c5ec37": { + "type": "error", + "signature": "error FunctionIsImmutable()", + "selector": "0xc3c5ec37" + }, + "0xe548e6b5": { + "type": "error", + "signature": "error IncorrectFacetCutAction()", + "selector": "0xe548e6b5" + }, + "0xc53ebed5": { + "type": "error", + "signature": "error InitReverted()", + "selector": "0xc53ebed5" + }, + "0x98116860": { + "type": "error", + "signature": "error InitZeroButCalldataNotEmpty()", + "selector": "0x98116860" + }, + "0x7bc55950": { + "type": "error", + "signature": "error NoSelectorsInFace()", + "selector": "0x7bc55950" + }, + "0x6ba355aa": { + "type": "function", + "signature": "function initializeTreeForMigration(bytes32[] _filledSubtrees, bytes32 _root)", + "selector": "0x6ba355aa" + }, + "0x88d761f2": { + "type": "function", + "signature": "function finishMigration() payable", + "selector": "0x88d761f2" + }, + "0x916710aa": { + "type": "function", + "signature": "function migrateState(bytes32[] _commitments, bytes32[] _nullifierHashes)", + "selector": "0x916710aa" + }, + "0xb06faf62": { + "type": "function", + "signature": "function isMigrated() view returns (bool)", + "selector": "0xb06faf62" + }, + "0x0e752702": { + "type": "function", + "signature": "function repayBorrow(uint256 repayAmount) returns (uint256)", + "selector": "0x0e752702" + }, + "0x173b9904": { + "type": "function", + "signature": "function reserveFactorMantissa() view returns (uint256)", + "selector": "0x173b9904" + }, + "0x17bfdfbc": { + "type": "function", + "signature": "function borrowBalanceCurrent(address account) returns (uint256)", + "selector": "0x17bfdfbc" + }, + "0x182df0f5": { + "type": "function", + "signature": "function exchangeRateStored() view returns (uint256)", + "selector": "0x182df0f5" + }, + "0x2608f818": { + "type": "function", + "signature": "function repayBorrowBehalf(address borrower, uint256 repayAmount) returns (uint256)", + "selector": "0x2608f818" + }, + "0x3af9e669": { + "type": "function", + "signature": "function balanceOfUnderlying(address owner) returns (uint256)", + "selector": "0x3af9e669" + }, + "0x3b1d21a2": { + "type": "function", + "signature": "function getCash() view returns (uint256)", + "selector": "0x3b1d21a2" + }, + "0x4576b5db": { + "type": "function", + "signature": "function _setComptroller(address newComptroller) returns (uint256)", + "selector": "0x4576b5db" + }, + "0x47bd3718": { + "type": "function", + "signature": "function totalBorrows() view returns (uint256)", + "selector": "0x47bd3718" + }, + "0x5fe3b567": { + "type": "function", + "signature": "function comptroller() view returns (address)", + "selector": "0x5fe3b567" + }, + "0x601a0bf1": { + "type": "function", + "signature": "function _reduceReserves(uint256 reduceAmount) returns (uint256)", + "selector": "0x601a0bf1" + }, + "0x675d972c": { + "type": "function", + "signature": "function initialExchangeRateMantissa() view returns (uint256)", + "selector": "0x675d972c" + }, + "0x6c540baf": { + "type": "function", + "signature": "function accrualBlockNumber() view returns (uint256)", + "selector": "0x6c540baf" + }, + "0x6f307dc3": { + "type": "function", + "signature": "function underlying() view returns (address)", + "selector": "0x6f307dc3" + }, + "0x73acee98": { + "type": "function", + "signature": "function totalBorrowsCurrent() returns (uint256)", + "selector": "0x73acee98" + }, + "0x852a12e3": { + "type": "function", + "signature": "function redeemUnderlying(uint256 redeemAmount) returns (uint256)", + "selector": "0x852a12e3" + }, + "0x8f840ddd": { + "type": "function", + "signature": "function totalReserves() view returns (uint256)", + "selector": "0x8f840ddd" + }, + "0x95dd9193": { + "type": "function", + "signature": "function borrowBalanceStored(address account) view returns (uint256)", + "selector": "0x95dd9193" + }, + "0xa6afed95": { + "type": "function", + "signature": "function accrueInterest() returns (uint256)", + "selector": "0xa6afed95" + }, + "0xaa5af0fd": { + "type": "function", + "signature": "function borrowIndex() view returns (uint256)", + "selector": "0xaa5af0fd" + }, + "0xae9d70b0": { + "type": "function", + "signature": "function supplyRatePerBlock() view returns (uint256)", + "selector": "0xae9d70b0" + }, + "0xb2a02ff1": { + "type": "function", + "signature": "function seize(address liquidator, address borrower, uint256 seizeTokens) returns (uint256)", + "selector": "0xb2a02ff1" + }, + "0xbd6d894d": { + "type": "function", + "signature": "function exchangeRateCurrent() returns (uint256)", + "selector": "0xbd6d894d" + }, + "0xc37f68e2": { + "type": "function", + "signature": "function getAccountSnapshot(address account) view returns (uint256, uint256, uint256, uint256)", + "selector": "0xc37f68e2" + }, + "0xc5ebeaec": { + "type": "function", + "signature": "function borrow(uint256 borrowAmount) returns (uint256)", + "selector": "0xc5ebeaec" + }, + "0xf2b3abbd": { + "type": "function", + "signature": "function _setInterestRateModel(address newInterestRateModel) returns (uint256)", + "selector": "0xf2b3abbd" + }, + "0xf3fdb15a": { + "type": "function", + "signature": "function interestRateModel() view returns (address)", + "selector": "0xf3fdb15a" + }, + "0xf5e3c462": { + "type": "function", + "signature": "function liquidateBorrow(address borrower, uint256 repayAmount, address cTokenCollateral) returns (uint256)", + "selector": "0xf5e3c462" + }, + "0xf8f9da28": { + "type": "function", + "signature": "function borrowRatePerBlock() view returns (uint256)", + "selector": "0xf8f9da28" + }, + "0xfca7820b": { + "type": "function", + "signature": "function _setReserveFactor(uint256 newReserveFactorMantissa) returns (uint256)", + "selector": "0xfca7820b" + }, + "0xfe9c44ae": { + "type": "function", + "signature": "function isCToken() view returns (bool)", + "selector": "0xfe9c44ae" + }, + "0x1413dc7d": { + "type": "function", + "signature": "function CUBE_COUNTER_KEY() view returns (bytes32)", + "selector": "0x1413dc7d" + }, + "0x0f532d18": { + "type": "function", + "signature": "function MSG_SENDER_KEY() view returns (bytes32)", + "selector": "0x0f532d18" + }, + "0x87c13943": { + "type": "function", + "signature": "function PERCENTAGE_BASE() view returns (uint256)", + "selector": "0x87c13943" + }, + "0xfa2901a5": { + "type": "function", + "signature": "function POSTPROCESS_SIG() view returns (bytes4)", + "selector": "0xfa2901a5" + }, + "0x38c5c08e": { + "type": "function", + "signature": "function batchExec(address[] tos, bytes32[] configs, bytes[] datas) payable", + "selector": "0x38c5c08e" + }, + "0x99eb59b9": { + "type": "function", + "signature": "function cache(bytes32) view returns (bytes32)", + "selector": "0x99eb59b9" + }, + "0x71938509": { + "type": "function", + "signature": "function execs(address[] tos, bytes32[] configs, bytes[] datas) payable", + "selector": "0x71938509" + }, + "0xdc9031c4": { + "type": "function", + "signature": "function stack(uint256) view returns (bytes32)", + "selector": "0xdc9031c4" + }, + "0x7388614b": { + "type": "function", + "signature": "function buyCover(address coveredContractAddress, bytes4 coverCurrency, uint256[] coverDetails, uint16 coverPeriod, uint8 _v, bytes32 _r, bytes32 _s) payable", + "selector": "0x7388614b" + }, + "0x445def2e": { + "type": "function", + "signature": "function distributorFeePercentage() view returns (uint256)", + "selector": "0x445def2e" + }, + "0xdc4645c3": { + "type": "function", + "signature": "function getCoverStatus(uint256 tokenId) view returns (uint8 coverStatus, bool payoutCompleted)", + "selector": "0xdc4645c3" + }, + "0x4e170591": { + "type": "function", + "signature": "function getMemberRoles() view returns (address)", + "selector": "0x4e170591" + }, + "0xb4634a5e": { + "type": "function", + "signature": "function nxMaster() view returns (address)", + "selector": "0xb4634a5e" + }, + "0x91be3713": { + "type": "function", + "signature": "function nxmTokenApprove(address _spender, uint256 _value)", + "selector": "0x91be3713" + }, + "0x3500e4a9": { + "type": "function", + "signature": "function redeemClaim(uint256 tokenId)", + "selector": "0x3500e4a9" + }, + "0x74bd0ace": { + "type": "function", + "signature": "function sellNXMTokens(uint256 amount)", + "selector": "0x74bd0ace" + }, + "0x6aa14a96": { + "type": "function", + "signature": "function submitClaim(uint256 tokenId)", + "selector": "0x6aa14a96" + }, + "0x4ed75d47": { + "type": "function", + "signature": "function switchMembership(address _newMembership)", + "selector": "0x4ed75d47" + }, + "0x4f64b2be": { + "type": "function", + "signature": "function tokens(uint256 i) view returns (address)", + "selector": "0x4f64b2be" + }, + "0x522f6815": { + "type": "function", + "signature": "function withdrawEther(address recipient, uint256 amount)", + "selector": "0x522f6815" + }, + "0x165ffdcc": { + "type": "function", + "signature": "function withdrawTokens(address _recipient, uint256 _amount, bytes4 _currency)", + "selector": "0x165ffdcc" + }, + "0xe9744712": { + "type": "function", + "signature": "function withdrawableTokens(bytes4) view returns (uint256)", + "selector": "0xe9744712" + }, + "0xe320176b": { + "type": "error", + "signature": "error NonZeroValue()", + "selector": "0xe320176b" + }, + "0x3d2f7ef6": { + "type": "error", + "signature": "error TokenNonExistent(uint256 tokenId)", + "selector": "0x3d2f7ef6" + }, + "0xbb690064": { + "type": "error", + "signature": "error TokenNonOwner(uint256 tokenId)", + "selector": "0xbb690064" + }, + "0x595162dd": { + "type": "error", + "signature": "error Unapprovable()", + "selector": "0x595162dd" + }, + "0x072b78c7": { + "type": "error", + "signature": "error Untransferable()", + "selector": "0x072b78c7" + }, + "0xbb4b5734": { + "type": "function", + "signature": "function EXPIRATION() view returns (uint256)", + "selector": "0xbb4b5734" + }, + "0x1852e8d9": { + "type": "function", + "signature": "function calculateReward(address account, uint256 tokenId) view returns (uint256 total)", + "selector": "0x1852e8d9" + }, + "0x068c526f": { + "type": "function", + "signature": "function calculateRewards(address account, uint256[] tokenIds) view returns (uint256[] rewards)", + "selector": "0x068c526f" + }, + "0x5eac6239": { + "type": "function", + "signature": "function claimRewards(uint256[] tokenIds)", + "selector": "0x5eac6239" + }, + "0x598b8e71": { + "type": "function", + "signature": "function deposit(uint256[] tokenIds)", + "selector": "0x598b8e71" + }, + "0xe3a9db1a": { + "type": "function", + "signature": "function depositsOf(address account) view returns (uint256[])", + "selector": "0xe3a9db1a" + }, + "0x276184ae": { + "type": "function", + "signature": "function erc20Address() view returns (address)", + "selector": "0x276184ae" + }, + "0x2352a864": { + "type": "function", + "signature": "function erc721Address() view returns (address)", + "selector": "0x2352a864" + }, + "0x940414ce": { + "type": "function", + "signature": "function findRate(uint256 tokenId) view returns (uint256 rate)", + "selector": "0x940414ce" + }, + "0x5773d778": { + "type": "function", + "signature": "function pauseTokenEmissions() view returns (bool)", + "selector": "0x5773d778" + }, + "0x3320d501": { + "type": "function", + "signature": "function pausedDepositBlocks() view returns (bool)", + "selector": "0x3320d501" + }, + "0xcea01962": { + "type": "function", + "signature": "function rewardRate(uint256) view returns (uint256)", + "selector": "0xcea01962" + }, + "0x9a03d9a3": { + "type": "function", + "signature": "function setERC721Address(address _newErc721Address)", + "selector": "0x9a03d9a3" + }, + "0x4a39fa80": { + "type": "function", + "signature": "function setErc20Address(address _newErc20Address)", + "selector": "0x4a39fa80" + }, + "0xdb3b947f": { + "type": "function", + "signature": "function setStakedSealsAddress(address _stakingContractV1Address)", + "selector": "0xdb3b947f" + }, + "0x7c79d73b": { + "type": "function", + "signature": "function stakeSealsV1() view returns (address)", + "selector": "0x7c79d73b" + }, + "0x5e1bef32": { + "type": "function", + "signature": "function staked(uint256) view returns (uint256 claimedAt)", + "selector": "0x5e1bef32" + }, + "0x335e15a2": { + "type": "function", + "signature": "function stakedInfoOf(uint256[] tokenIds) view returns (bytes[])", + "selector": "0x335e15a2" + }, + "0x19a249a8": { + "type": "function", + "signature": "function toggleEmissions()", + "selector": "0x19a249a8" + }, + "0xc620994b": { + "type": "function", + "signature": "function togglePauseDepositBlocks()", + "selector": "0xc620994b" + }, + "0xb32534cf": { + "type": "function", + "signature": "function updateRewardRate(uint256 index, uint256 rate)", + "selector": "0xb32534cf" + }, + "0x983d95ce": { + "type": "function", + "signature": "function withdraw(uint256[] tokenIds)", + "selector": "0x983d95ce" + }, + "0x315a095d": { + "type": "function", + "signature": "function withdrawTokens(uint256 amount)", + "selector": "0x315a095d" + }, + "0x98891923": { + "type": "error", + "signature": "error BadReturnValueFromERC20OnTransfer(address token, address from, address to, uint256 amount)", + "selector": "0x98891923" + }, + "0x93daadf2": { + "type": "error", + "signature": "error ChannelClosed(address channel)", + "selector": "0x93daadf2" + }, + "0x924e341e": { + "type": "error", + "signature": "error ChannelStatusAlreadySet(address channel, bool isOpen)", + "selector": "0x924e341e" + }, + "0xafc445e2": { + "type": "error", + "signature": "error ERC1155BatchTransferGenericFailure(address token, address from, address to, uint256[] identifiers, uint256[] amounts)", + "selector": "0xafc445e2" + }, + "0xeba2084c": { + "type": "error", + "signature": "error Invalid1155BatchTransferEncoding()", + "selector": "0xeba2084c" + }, + "0x6d5769be": { + "type": "error", + "signature": "error InvalidController()", + "selector": "0x6d5769be" + }, + "0xefcc00b1": { + "type": "error", + "signature": "error InvalidERC721TransferAmount()", + "selector": "0xefcc00b1" + }, + "0x7932f1fc": { + "type": "error", + "signature": "error InvalidItemType()", + "selector": "0x7932f1fc" + }, + "0x91b3e514": { + "type": "error", + "signature": "error MissingItemAmount()", + "selector": "0x91b3e514" + }, + "0x5f15d672": { + "type": "error", + "signature": "error NoContract(address account)", + "selector": "0x5f15d672" + }, + "0xf486bc87": { + "type": "error", + "signature": "error TokenTransferGenericFailure(address token, address from, address to, uint256 identifier, uint256 amount)", + "selector": "0xf486bc87" + }, + "0x6ab37ce7": { + "type": "error", + "signature": "error UnusedItemParameters()", + "selector": "0x6ab37ce7" + }, + "0x4ce34aa2": { + "type": "function", + "signature": "function execute(tuple(uint8 itemType, address token, address from, address to, uint256 identifier, uint256 amount)[] transfers) returns (bytes4 magicValue)", + "selector": "0x4ce34aa2" + }, + "0x8df25d92": { + "type": "function", + "signature": "function executeBatch1155(tuple(address token, address from, address to, uint256[] ids, uint256[] amounts)[] batchTransfers) returns (bytes4 magicValue)", + "selector": "0x8df25d92" + }, + "0x899e104c": { + "type": "function", + "signature": "function executeWithBatch1155(tuple(uint8 itemType, address token, address from, address to, uint256 identifier, uint256 amount)[] standardTransfers, tuple(address token, address from, address to, uint256[] ids, uint256[] amounts)[] batchTransfers) returns (bytes4 magicValue)", + "selector": "0x899e104c" + }, + "0xc4e8fcb5": { + "type": "function", + "signature": "function updateChannel(address channel, bool isOpen)", + "selector": "0xc4e8fcb5" + }, + "0x042069d6": { + "type": "function", + "signature": "function ownerSetSpreadPremium(uint256 marketId, tuple(uint256 value) spreadPremium)", + "selector": "0x042069d6" + }, + "0x052f72d7": { + "type": "function", + "signature": "function getIsGlobalOperator(address operator) view returns (bool)", + "selector": "0x052f72d7" + }, + "0x062bd3e9": { + "type": "function", + "signature": "function getMarketTokenAddress(uint256 marketId) view returns (address)", + "selector": "0x062bd3e9" + }, + "0x121fb72f": { + "type": "function", + "signature": "function ownerSetInterestSetter(uint256 marketId, address interestSetter)", + "selector": "0x121fb72f" + }, + "0x124f914c": { + "type": "function", + "signature": "function getAccountValues(tuple(address owner, uint256 number) account) view returns (tuple(uint256 value), tuple(uint256 value))", + "selector": "0x124f914c" + }, + "0x13368364": { + "type": "function", + "signature": "function getMarketPriceOracle(uint256 marketId) view returns (address)", + "selector": "0x13368364" + }, + "0x197f0f05": { + "type": "function", + "signature": "function getMarketInterestSetter(uint256 marketId) view returns (address)", + "selector": "0x197f0f05" + }, + "0x1a7777bb": { + "type": "function", + "signature": "function getMarketSpreadPremium(uint256 marketId) view returns (tuple(uint256 value))", + "selector": "0x1a7777bb" + }, + "0x295c39a5": { + "type": "function", + "signature": "function getNumMarkets() view returns (uint256)", + "selector": "0x295c39a5" + }, + "0x2a560845": { + "type": "function", + "signature": "function ownerWithdrawUnsupportedTokens(address token, address recipient) returns (uint256)", + "selector": "0x2a560845" + }, + "0x2e822af3": { + "type": "function", + "signature": "function ownerSetMinBorrowedValue(tuple(uint256 value) minBorrowedValue)", + "selector": "0x2e822af3" + }, + "0x3063bce2": { + "type": "function", + "signature": "function ownerSetLiquidationSpread(tuple(uint256 value) spread)", + "selector": "0x3063bce2" + }, + "0x387a498a": { + "type": "function", + "signature": "function ownerSetEarningsRate(tuple(uint256 value) earningsRate)", + "selector": "0x387a498a" + }, + "0x3a031bf0": { + "type": "function", + "signature": "function getIsLocalOperator(address owner, address operator) view returns (bool)", + "selector": "0x3a031bf0" + }, + "0x47d1b53c": { + "type": "function", + "signature": "function getAccountPar(tuple(address owner, uint256 number) account, uint256 marketId) view returns (tuple(bool sign, uint128 value))", + "selector": "0x47d1b53c" + }, + "0x4be87414": { + "type": "function", + "signature": "function ownerSetMarginPremium(uint256 marketId, tuple(uint256 value) marginPremium)", + "selector": "0x4be87414" + }, + "0x4f3c1542": { + "type": "function", + "signature": "function getMarginRatio() view returns (tuple(uint256 value))", + "selector": "0x4f3c1542" + }, + "0x56ea84b2": { + "type": "function", + "signature": "function getMarketCurrentIndex(uint256 marketId) view returns (tuple(uint96 borrow, uint96 supply, uint32 lastUpdate))", + "selector": "0x56ea84b2" + }, + "0x5ac7d17c": { + "type": "function", + "signature": "function getMarketIsClosing(uint256 marketId) view returns (bool)", + "selector": "0x5ac7d17c" + }, + "0x69794795": { + "type": "function", + "signature": "function getRiskParams() view returns (tuple(tuple(uint256 value) marginRatio, tuple(uint256 value) liquidationSpread, tuple(uint256 value) earningsRate, tuple(uint256 value) minBorrowedValue))", + "selector": "0x69794795" + }, + "0x6a8194e7": { + "type": "function", + "signature": "function getAccountBalances(tuple(address owner, uint256 number) account) view returns (address[], tuple(bool sign, uint128 value)[], tuple(bool sign, uint256 value)[])", + "selector": "0x6a8194e7" + }, + "0x7e9eaf41": { + "type": "function", + "signature": "function getMinBorrowedValue() view returns (tuple(uint256 value))", + "selector": "0x7e9eaf41" + }, + "0x85b53fc8": { + "type": "function", + "signature": "function setOperators(tuple(address operator, bool trusted)[] args)", + "selector": "0x85b53fc8" + }, + "0x8928378e": { + "type": "function", + "signature": "function getMarketPrice(uint256 marketId) view returns (tuple(uint256 value))", + "selector": "0x8928378e" + }, + "0x8f6bc659": { + "type": "function", + "signature": "function ownerWithdrawExcessTokens(uint256 marketId, address recipient) returns (uint256)", + "selector": "0x8f6bc659" + }, + "0x982f323c": { + "type": "function", + "signature": "function ownerAddMarket(address token, address priceOracle, address interestSetter, tuple(uint256 value) marginPremium, tuple(uint256 value) spreadPremium)", + "selector": "0x982f323c" + }, + "0xa67a6a45": { + "type": "function", + "signature": "function operate(tuple(address owner, uint256 number)[] accounts, tuple(uint8 actionType, uint256 accountId, tuple(bool sign, uint8 denomination, uint8 ref, uint256 value) amount, uint256 primaryMarketId, uint256 secondaryMarketId, address otherAddress, uint256 otherAccountId, bytes data)[] actions)", + "selector": "0xa67a6a45" + }, + "0xb548b892": { + "type": "function", + "signature": "function getMarketWithInfo(uint256 marketId) view returns (tuple(address token, tuple(uint128 borrow, uint128 supply) totalPar, tuple(uint96 borrow, uint96 supply, uint32 lastUpdate) index, address priceOracle, address interestSetter, tuple(uint256 value) marginPremium, tuple(uint256 value) spreadPremium, bool isClosing), tuple(uint96 borrow, uint96 supply, uint32 lastUpdate), tuple(uint256 value), tuple(uint256 value))", + "selector": "0xb548b892" + }, + "0xc0bb72b7": { + "type": "function", + "signature": "function ownerSetMarginRatio(tuple(uint256 value) ratio)", + "selector": "0xc0bb72b7" + }, + "0xc1460942": { + "type": "function", + "signature": "function getLiquidationSpread() view returns (tuple(uint256 value))", + "selector": "0xc1460942" + }, + "0xc190c2ec": { + "type": "function", + "signature": "function getAccountWei(tuple(address owner, uint256 number) account, uint256 marketId) view returns (tuple(bool sign, uint256 value))", + "selector": "0xc190c2ec" + }, + "0xcb04a34c": { + "type": "function", + "signature": "function getMarketTotalPar(uint256 marketId) view returns (tuple(uint128 borrow, uint128 supply))", + "selector": "0xcb04a34c" + }, + "0xd24c48bc": { + "type": "function", + "signature": "function getLiquidationSpreadForPair(uint256 heldMarketId, uint256 owedMarketId) view returns (tuple(uint256 value))", + "selector": "0xd24c48bc" + }, + "0xd5ecf7c5": { + "type": "function", + "signature": "function getNumExcessTokens(uint256 marketId) view returns (tuple(bool sign, uint256 value))", + "selector": "0xd5ecf7c5" + }, + "0xdeec053d": { + "type": "function", + "signature": "function getMarketCachedIndex(uint256 marketId) view returns (tuple(uint96 borrow, uint96 supply, uint32 lastUpdate))", + "selector": "0xdeec053d" + }, + "0xe51bfcb4": { + "type": "function", + "signature": "function getAccountStatus(tuple(address owner, uint256 number) account) view returns (uint8)", + "selector": "0xe51bfcb4" + }, + "0xe5520228": { + "type": "function", + "signature": "function getEarningsRate() view returns (tuple(uint256 value))", + "selector": "0xe5520228" + }, + "0xe8e72f75": { + "type": "function", + "signature": "function ownerSetPriceOracle(uint256 marketId, address priceOracle)", + "selector": "0xe8e72f75" + }, + "0xeb1c6e6b": { + "type": "function", + "signature": "function getRiskLimits() view returns (tuple(uint64 marginRatioMax, uint64 liquidationSpreadMax, uint64 earningsRateMax, uint64 marginPremiumMax, uint64 spreadPremiumMax, uint128 minBorrowedValueMax))", + "selector": "0xeb1c6e6b" + }, + "0xeb44fdd3": { + "type": "function", + "signature": "function getMarket(uint256 marketId) view returns (tuple(address token, tuple(uint128 borrow, uint128 supply) totalPar, tuple(uint96 borrow, uint96 supply, uint32 lastUpdate) index, address priceOracle, address interestSetter, tuple(uint256 value) marginPremium, tuple(uint256 value) spreadPremium, bool isClosing))", + "selector": "0xeb44fdd3" + }, + "0xef6957d0": { + "type": "function", + "signature": "function ownerSetIsClosing(uint256 marketId, bool isClosing)", + "selector": "0xef6957d0" + }, + "0xf2901ae2": { + "type": "function", + "signature": "function ownerSetGlobalOperator(address operator, bool approved)", + "selector": "0xf2901ae2" + }, + "0xf9416052": { + "type": "function", + "signature": "function getAdjustedAccountValues(tuple(address owner, uint256 number) account) view returns (tuple(uint256 value), tuple(uint256 value))", + "selector": "0xf9416052" + }, + "0xfd04b606": { + "type": "function", + "signature": "function getMarketMarginPremium(uint256 marketId) view returns (tuple(uint256 value))", + "selector": "0xfd04b606" + }, + "0xfd47eda6": { + "type": "function", + "signature": "function getMarketInterestRate(uint256 marketId) view returns (tuple(uint256 value))", + "selector": "0xfd47eda6" + }, + "0x9de66604": { + "type": "function", + "signature": "function erc20old() view returns (bool)", + "selector": "0x9de66604" + }, + "0xd9ee369a": { + "type": "function", + "signature": "function withdrawDifferentToken(address _differentToken, bool _erc20old) returns (bool)", + "selector": "0xd9ee369a" + }, + "0x972fdd26": { + "type": "function", + "signature": "function getFunctionImplementation(bytes4 selector) view returns (address impl)", + "selector": "0x972fdd26" + }, + "0x06df453e": { + "type": "function", + "signature": "function approveDelegate(address delegate)", + "selector": "0x06df453e" + }, + "0x0c511d11": { + "type": "function", + "signature": "function isOrderCancelled(bytes32 orderHash) view returns (bool isCancelled)", + "selector": "0x0c511d11" + }, + "0x0f8eeeb0": { + "type": "function", + "signature": "function isAccountLiquidatable(address user, uint16 marketID) view returns (bool isLiquidatable)", + "selector": "0x0f8eeeb0" + }, + "0x101424d9": { + "type": "function", + "signature": "function getPoolCashableAmount(address asset) view returns (uint256 cashableAmount)", + "selector": "0x101424d9" + }, + "0x13a30013": { + "type": "function", + "signature": "function getMarket(uint16 marketID) view returns (tuple(address baseAsset, address quoteAsset, uint256 liquidateRate, uint256 withdrawRate, uint256 auctionRatioStart, uint256 auctionRatioPerBlock, bool borrowEnable) market)", + "selector": "0x13a30013" + }, + "0x168ba56c": { + "type": "function", + "signature": "function liquidateAccount(address user, uint16 marketID) returns (bool hasAuction, uint32 auctionID)", + "selector": "0x168ba56c" + }, + "0x1a8cd123": { + "type": "function", + "signature": "function getMarketTransferableAmount(uint16 marketID, address asset, address user) view returns (uint256 amount)", + "selector": "0x1a8cd123" + }, + "0x21028767": { + "type": "function", + "signature": "function updateMarket(uint16 marketID, uint256 newAuctionRatioStart, uint256 newAuctionRatioPerBlock, uint256 newLiquidateRate, uint256 newWithdrawRate)", + "selector": "0x21028767" + }, + "0x2a2b1240": { + "type": "function", + "signature": "function fillAuctionWithAmount(uint32 auctionID, uint256 amount)", + "selector": "0x2a2b1240" + }, + "0x2d6a6025": { + "type": "function", + "signature": "function getAuctionDetails(uint32 auctionID) view returns (tuple(address borrower, uint16 marketID, address debtAsset, address collateralAsset, uint256 leftDebtAmount, uint256 leftCollateralAmount, uint256 ratio, uint256 price, bool finished) details)", + "selector": "0x2d6a6025" + }, + "0x30b8b2c6": { + "type": "function", + "signature": "function getAsset(address assetAddress) view returns (tuple(address lendingPoolToken, address priceOracle, address interestModel) asset)", + "selector": "0x30b8b2c6" + }, + "0x316e5b1e": { + "type": "function", + "signature": "function getAmountSupplied(address asset, address user) view returns (uint256 amount)", + "selector": "0x316e5b1e" + }, + "0x325b7b03": { + "type": "function", + "signature": "function getHydroTokenAddress() view returns (address hydroTokenAddress)", + "selector": "0x325b7b03" + }, + "0x3560c5cd": { + "type": "function", + "signature": "function exitIncentiveSystem()", + "selector": "0x3560c5cd" + }, + "0x3b481b0a": { + "type": "function", + "signature": "function createAsset(address asset, address oracleAddress, address interestModelAddress, string poolTokenName, string poolTokenSymbol, uint8 poolTokenDecimals)", + "selector": "0x3b481b0a" + }, + "0x3e5893be": { + "type": "function", + "signature": "function canMatchOrdersFrom(address relayer) view returns (bool canMatch)", + "selector": "0x3e5893be" + }, + "0x43239e9b": { + "type": "function", + "signature": "function getInterestRates(address asset, uint256 extraBorrowAmount) view returns (uint256 borrowInterestRate, uint256 supplyInterestRate)", + "selector": "0x43239e9b" + }, + "0x4376abf1": { + "type": "function", + "signature": "function getDiscountedRate(address user) view returns (uint256 rate)", + "selector": "0x4376abf1" + }, + "0x53bab42e": { + "type": "function", + "signature": "function getAccountDetails(address user, uint16 marketID) view returns (tuple(bool liquidatable, uint8 status, uint256 debtsTotalUSDValue, uint256 balancesTotalUSDValue) details)", + "selector": "0x53bab42e" + }, + "0x55559a86": { + "type": "function", + "signature": "function getOrderFilledAmount(bytes32 orderHash) view returns (uint256 amount)", + "selector": "0x55559a86" + }, + "0x5be53e74": { + "type": "function", + "signature": "function getCurrentAuctions() view returns (uint32[])", + "selector": "0x5be53e74" + }, + "0x5dae042d": { + "type": "function", + "signature": "function getAssetOraclePrice(address assetAddress) view returns (uint256 price)", + "selector": "0x5dae042d" + }, + "0x637b93ed": { + "type": "function", + "signature": "function getInsuranceBalance(address asset) view returns (uint256 amount)", + "selector": "0x637b93ed" + }, + "0x68da10ae": { + "type": "function", + "signature": "function getTotalSupply(address asset) view returns (uint256 amount)", + "selector": "0x68da10ae" + }, + "0x762a4862": { + "type": "function", + "signature": "function updateAsset(address asset, address oracleAddress, address interestModelAddress)", + "selector": "0x762a4862" + }, + "0x7e6ef7fc": { + "type": "function", + "signature": "function isValidSignature(bytes32 hash, address signerAddress, tuple(bytes32 config, bytes32 r, bytes32 s) signature) pure returns (bool isValid)", + "selector": "0x7e6ef7fc" + }, + "0x8059cf3b": { + "type": "function", + "signature": "function batch(tuple(uint8 actionType, bytes encodedParams)[] actions) payable", + "selector": "0x8059cf3b" + }, + "0x8538d14e": { + "type": "function", + "signature": "function getTotalBorrow(address asset) view returns (uint256 amount)", + "selector": "0x8538d14e" + }, + "0x86e4d973": { + "type": "function", + "signature": "function createMarket(tuple(address baseAsset, address quoteAsset, uint256 liquidateRate, uint256 withdrawRate, uint256 auctionRatioStart, uint256 auctionRatioPerBlock, bool borrowEnable) market)", + "selector": "0x86e4d973" + }, + "0x8ea17c7b": { + "type": "function", + "signature": "function getAmountBorrowed(address asset, address user, uint16 marketID) view returns (uint256 amount)", + "selector": "0x8ea17c7b" + }, + "0x929066f5": { + "type": "function", + "signature": "function isParticipant(address relayer) view returns (bool result)", + "selector": "0x929066f5" + }, + "0x9c61a3dd": { + "type": "function", + "signature": "function getAllMarketsCount() view returns (uint256 count)", + "selector": "0x9c61a3dd" + }, + "0x9f0bf0a7": { + "type": "function", + "signature": "function matchOrders(tuple(tuple(address trader, uint256 baseAssetAmount, uint256 quoteAssetAmount, uint256 gasTokenAmount, bytes32 data, tuple(bytes32 config, bytes32 r, bytes32 s) signature) takerOrderParam, tuple(address trader, uint256 baseAssetAmount, uint256 quoteAssetAmount, uint256 gasTokenAmount, bytes32 data, tuple(bytes32 config, bytes32 r, bytes32 s) signature)[] makerOrderParams, uint256[] baseAssetFilledAmounts, tuple(address baseAsset, address quoteAsset, address relayer) orderAddressSet) params)", + "selector": "0x9f0bf0a7" + }, + "0xa6fc9191": { + "type": "function", + "signature": "function updateAuctionInitiatorRewardRatio(uint256 newInitiatorRewardRatio)", + "selector": "0xa6fc9191" + }, + "0xb31610db": { + "type": "function", + "signature": "function getIndex(address asset) view returns (uint256 supplyIndex, uint256 borrowIndex)", + "selector": "0xb31610db" + }, + "0xb6b3618e": { + "type": "function", + "signature": "function cancelOrder(tuple(address trader, address relayer, address baseAsset, address quoteAsset, uint256 baseAssetAmount, uint256 quoteAssetAmount, uint256 gasTokenAmount, bytes32 data) order)", + "selector": "0xb6b3618e" + }, + "0xb875bdf1": { + "type": "function", + "signature": "function joinIncentiveSystem()", + "selector": "0xb875bdf1" + }, + "0xbb6d5838": { + "type": "function", + "signature": "function updateInsuranceRatio(uint256 newInsuranceRatio)", + "selector": "0xbb6d5838" + }, + "0xc747fcc0": { + "type": "function", + "signature": "function updateDiscountConfig(bytes32 newConfig)", + "selector": "0xc747fcc0" + }, + "0xddf1f0f4": { + "type": "function", + "signature": "function setMarketBorrowUsability(uint16 marketID, bool usability)", + "selector": "0xddf1f0f4" + }, + "0xe45c1879": { + "type": "function", + "signature": "function getAuctionsCount() view returns (uint32 count)", + "selector": "0xe45c1879" + }, + "0xee684955": { + "type": "function", + "signature": "function marketBalanceOf(uint16 marketID, address asset, address user) view returns (uint256 balance)", + "selector": "0xee684955" + }, + "0xf7888aec": { + "type": "function", + "signature": "function balanceOf(address token, address user) view returns (uint256)", + "selector": "0xf7888aec" + }, + "0xfa352c00": { + "type": "function", + "signature": "function revokeDelegate(address delegate)", + "selector": "0xfa352c00" + }, + "0xc7d26c86": { + "type": "function", + "signature": "function provideDelegateOrder(tuple(uint256 nonce, uint256 expiry, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) signer, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) sender, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) affiliate, tuple(address signatory, address validator, bytes1 version, uint8 v, bytes32 r, bytes32 s) signature) order, address delegate) payable", + "selector": "0xc7d26c86" + }, + "0x67641c2f": { + "type": "function", + "signature": "function swap(tuple(uint256 nonce, uint256 expiry, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) signer, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) sender, tuple(bytes4 kind, address wallet, address token, uint256 amount, uint256 id) affiliate, tuple(address signatory, address validator, bytes1 version, uint8 v, bytes32 r, bytes32 s) signature) order)", + "selector": "0x67641c2f" + }, + "0x8ea83031": { + "type": "function", + "signature": "function swapContract() view returns (address)", + "selector": "0x8ea83031" + }, + "0x4780eac1": { + "type": "function", + "signature": "function wethContract() view returns (address)", + "selector": "0x4780eac1" + }, + "0x0f15f4c0": { + "type": "function", + "signature": "function activate()", + "selector": "0x0f15f4c0" + }, + "0xb040785a": { + "type": "function", + "signature": "function availableToBorrowETH() view returns (uint256)", + "selector": "0xb040785a" + }, + "0x929c8849": { + "type": "function", + "signature": "function availableToBorrowReserve() view returns (uint256)", + "selector": "0x929c8849" + }, + "0xa75ac608": { + "type": "function", + "signature": "function claimInsurance()", + "selector": "0xa75ac608" + }, + "0xf77c4791": { + "type": "function", + "signature": "function controller() view returns (address)", + "selector": "0xf77c4791" + }, + "0xa06d083c": { + "type": "function", + "signature": "function credit() view returns (uint256)", + "selector": "0xa06d083c" + }, + "0x0dca59c1": { + "type": "function", + "signature": "function debt() view returns (uint256)", + "selector": "0x0dca59c1" + }, + "0x2851e2e0": { + "type": "function", + "signature": "function debtShare(address _lp) view returns (uint256)", + "selector": "0x2851e2e0" + }, + "0xde5f6268": { + "type": "function", + "signature": "function depositAll()", + "selector": "0xde5f6268" + }, + "0xd389800f": { + "type": "function", + "signature": "function earn()", + "selector": "0xd389800f" + }, + "0x9f287e16": { + "type": "function", + "signature": "function getAaveOracle() view returns (address)", + "selector": "0x9f287e16" + }, + "0xf0722322": { + "type": "function", + "signature": "function getReservePrice() view returns (uint256)", + "selector": "0xf0722322" + }, + "0x11dddca4": { + "type": "function", + "signature": "function getReservePriceETH(address reserve) view returns (uint256)", + "selector": "0x11dddca4" + }, + "0x468f02d2": { + "type": "function", + "signature": "function getUnderlyingPrice() view returns (uint256)", + "selector": "0x468f02d2" + }, + "0xdd90a791": { + "type": "function", + "signature": "function getUnderlyingPriceETH(uint256 _amount) view returns (uint256)", + "selector": "0xdd90a791" + }, + "0x018ee9b7": { + "type": "function", + "signature": "function harvest(address reserve, uint256 amount)", + "selector": "0x018ee9b7" + }, + "0x22841f01": { + "type": "function", + "signature": "function healthFactor() view returns (uint256)", + "selector": "0x22841f01" + }, + "0xcf309012": { + "type": "function", + "signature": "function locked() view returns (bool)", + "selector": "0xcf309012" + }, + "0x6fb49d73": { + "type": "function", + "signature": "function ltv() view returns (uint256)", + "selector": "0x6fb49d73" + }, + "0x6ac5db19": { + "type": "function", + "signature": "function max() view returns (uint256)", + "selector": "0x6ac5db19" + }, + "0x62f5548d": { + "type": "function", + "signature": "function maxSafeETH() view returns (uint256 maxBorrowsETH, uint256 totalBorrowsETH, uint256 availableBorrowsETH)", + "selector": "0x62f5548d" + }, + "0x27afd028": { + "type": "function", + "signature": "function maxWithdrawal(address account) view returns (uint256)", + "selector": "0x27afd028" + }, + "0x6ad4e251": { + "type": "function", + "signature": "function over(uint256 _amount) view returns (uint256)", + "selector": "0x6ad4e251" + }, + "0x7eaef50c": { + "type": "function", + "signature": "function over() view returns (uint256)", + "selector": "0x7eaef50c" + }, + "0x22867d78": { + "type": "function", + "signature": "function repay(address reserve, uint256 amount)", + "selector": "0x22867d78" + }, + "0xfa3ae6dc": { + "type": "function", + "signature": "function repayAll()", + "selector": "0xfa3ae6dc" + }, + "0xcd3293de": { + "type": "function", + "signature": "function reserve() view returns (address)", + "selector": "0xcd3293de" + }, + "0x7fd42617": { + "type": "function", + "signature": "function safeWithdraw()", + "selector": "0x7fd42617" + }, + "0x92eefe9b": { + "type": "function", + "signature": "function setController(address _controller)", + "selector": "0x92eefe9b" + }, + "0x31111708": { + "type": "function", + "signature": "function setHealthFactor(uint256 _hf)", + "selector": "0x31111708" + }, + "0x1b93e5b0": { + "type": "function", + "signature": "function shouldBorrow() view returns (bool)", + "selector": "0x1b93e5b0" + }, + "0xae2c1d5f": { + "type": "function", + "signature": "function shouldRebalance() view returns (bool)", + "selector": "0xae2c1d5f" + }, + "0x853828b6": { + "type": "function", + "signature": "function withdrawAll()", + "selector": "0x853828b6" + }, + "0x010f3237": { + "type": "function", + "signature": "function exitExcessPie() returns (bool)", + "selector": "0x010f3237" + }, + "0x207e6467": { + "type": "function", + "signature": "function pieBalances(address) view returns (uint256)", + "selector": "0x207e6467" + }, + "0x20eb1342": { + "type": "function", + "signature": "function withdrawVatBalance(uint256 _rad) returns (bool)", + "selector": "0x20eb1342" + }, + "0x29731b0e": { + "type": "function", + "signature": "function totalPie() view returns (uint256)", + "selector": "0x29731b0e" + }, + "0x4c255c97": { + "type": "function", + "signature": "function MAX_PERCENTAGE() view returns (uint256)", + "selector": "0x4c255c97" + }, + "0x5b56d6f5": { + "type": "function", + "signature": "function setInterestFee(uint256 _interestFee) returns (bool)", + "selector": "0x5b56d6f5" + }, + "0xa75df498": { + "type": "function", + "signature": "function interestFee() view returns (uint256)", + "selector": "0xa75df498" + }, + "0xcb13cddb": { + "type": "function", + "signature": "function deposited(address) view returns (uint256)", + "selector": "0xcb13cddb" + }, + "0x0674763c": { + "type": "function", + "signature": "function assert(bool assertion)", + "selector": "0x0674763c" + }, + "0x13af4035": { + "type": "function", + "signature": "function setOwner(address owner_)", + "selector": "0x13af4035" + }, + "0x2295115b": { + "type": "function", + "signature": "function adminWithdraw(address token, uint256 amount, address user, uint256 nonce, uint8 v, bytes32 r, bytes32 s, uint256 feeWithdrawal) returns (bool success)", + "selector": "0x2295115b" + }, + "0x254dcfe2": { + "type": "function", + "signature": "function lastActiveTransaction(address) view returns (uint256)", + "selector": "0x254dcfe2" + }, + "0x3823d66c": { + "type": "function", + "signature": "function withdrawn(bytes32) view returns (bool)", + "selector": "0x3823d66c" + }, + "0x429b62e5": { + "type": "function", + "signature": "function admins(address) view returns (bool)", + "selector": "0x429b62e5" + }, + "0x4b0bddd2": { + "type": "function", + "signature": "function setAdmin(address admin, bool isAdmin)", + "selector": "0x4b0bddd2" + }, + "0x508493bc": { + "type": "function", + "signature": "function tokens(address, address) view returns (uint256)", + "selector": "0x508493bc" + }, + "0x65e17c9d": { + "type": "function", + "signature": "function feeAccount() view returns (address)", + "selector": "0x65e17c9d" + }, + "0x83dbb27b": { + "type": "function", + "signature": "function invalidOrder(address) view returns (uint256)", + "selector": "0x83dbb27b" + }, + "0x893d20e8": { + "type": "function", + "signature": "function getOwner() view returns (address)", + "selector": "0x893d20e8" + }, + "0xa293d1e8": { + "type": "function", + "signature": "function safeSub(uint256 a, uint256 b) returns (uint256)", + "selector": "0xa293d1e8" + }, + "0xb12de559": { + "type": "function", + "signature": "function invalidateOrdersBefore(address user, uint256 nonce)", + "selector": "0xb12de559" + }, + "0xd05c78da": { + "type": "function", + "signature": "function safeMul(uint256 a, uint256 b) returns (uint256)", + "selector": "0xd05c78da" + }, + "0xd5813323": { + "type": "function", + "signature": "function traded(bytes32) view returns (bool)", + "selector": "0xd5813323" + }, + "0xdd93c74a": { + "type": "function", + "signature": "function setInactivityReleasePeriod(uint256 expiry) returns (bool success)", + "selector": "0xdd93c74a" + }, + "0xe6cb9013": { + "type": "function", + "signature": "function safeAdd(uint256 a, uint256 b) returns (uint256)", + "selector": "0xe6cb9013" + }, + "0xef343588": { + "type": "function", + "signature": "function trade(uint256[8] tradeValues, address[4] tradeAddresses, uint8[2] v, bytes32[4] rs) returns (bool success)", + "selector": "0xef343588" + }, + "0xf31174ee": { + "type": "function", + "signature": "function inactivityReleasePeriod() view returns (uint256)", + "selector": "0xf31174ee" + }, + "0xf7213db6": { + "type": "function", + "signature": "function orderFills(bytes32) view returns (uint256)", + "selector": "0xf7213db6" + }, + "0xbb7b8b80": { + "type": "function", + "signature": "function get_virtual_price() view returns (uint256)", + "selector": "0xbb7b8b80" + }, + "0x0b4c7e4d": { + "type": "function", + "signature": "function add_liquidity(uint256[2] amounts, uint256 min_mint_amount) payable returns (uint256)", + "selector": "0x0b4c7e4d" + }, + "0x5e0d443f": { + "type": "function", + "signature": "function get_dy(int128 i, int128 j, uint256 dx) view returns (uint256)", + "selector": "0x5e0d443f" + }, + "0x07211ef7": { + "type": "function", + "signature": "function get_dy_underlying(int128 i, int128 j, uint256 dx) view returns (uint256 out)", + "selector": "0x07211ef7" + }, + "0x17f1bdf0": { + "type": "function", + "signature": "function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy, uint256 deadline)", + "selector": "0x17f1bdf0" + }, + "0x882ff7fc": { + "type": "function", + "signature": "function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy, uint256 deadline)", + "selector": "0x882ff7fc" + }, + "0x59639fa9": { + "type": "function", + "signature": "function remove_liquidity(uint256 _amount, uint256 deadline, uint256[2] min_amounts)", + "selector": "0x59639fa9" + }, + "0xe3103273": { + "type": "function", + "signature": "function remove_liquidity_imbalance(uint256[2] _amounts, uint256 _max_burn_amount) returns (uint256)", + "selector": "0xe3103273" + }, + "0xe1ceefda": { + "type": "function", + "signature": "function commit_new_parameters(int128 amplification, int128 new_fee, int128 new_admin_fee)", + "selector": "0xe1ceefda" + }, + "0x2a7dd7cd": { + "type": "function", + "signature": "function apply_new_parameters()", + "selector": "0x2a7dd7cd" + }, + "0x226840fb": { + "type": "function", + "signature": "function revert_new_parameters()", + "selector": "0x226840fb" + }, + "0x6b441a40": { + "type": "function", + "signature": "function commit_transfer_ownership(address _owner)", + "selector": "0x6b441a40" + }, + "0x6a1c05ae": { + "type": "function", + "signature": "function apply_transfer_ownership()", + "selector": "0x6a1c05ae" + }, + "0x86fbf193": { + "type": "function", + "signature": "function revert_transfer_ownership()", + "selector": "0x86fbf193" + }, + "0x30c54085": { + "type": "function", + "signature": "function withdraw_admin_fees()", + "selector": "0x30c54085" + }, + "0xe3698853": { + "type": "function", + "signature": "function kill_me()", + "selector": "0xe3698853" + }, + "0x3046f972": { + "type": "function", + "signature": "function unkill_me()", + "selector": "0x3046f972" + }, + "0x23746eb8": { + "type": "function", + "signature": "function coins(int128 arg0) view returns (address out)", + "selector": "0x23746eb8" + }, + "0xb739953e": { + "type": "function", + "signature": "function underlying_coins(int128 arg0) view returns (address out)", + "selector": "0xb739953e" + }, + "0x065a80d8": { + "type": "function", + "signature": "function balances(int128 arg0) view returns (uint256 out)", + "selector": "0x065a80d8" + }, + "0xf446c1d0": { + "type": "function", + "signature": "function A() view returns (uint256)", + "selector": "0xf446c1d0" + }, + "0xfee3f7f9": { + "type": "function", + "signature": "function admin_fee() view returns (uint256)", + "selector": "0xfee3f7f9" + }, + "0x405e28f8": { + "type": "function", + "signature": "function admin_actions_deadline() view returns (uint256)", + "selector": "0x405e28f8" + }, + "0xe0a0b586": { + "type": "function", + "signature": "function transfer_ownership_deadline() view returns (uint256)", + "selector": "0xe0a0b586" + }, + "0xb4b577ad": { + "type": "function", + "signature": "function future_A() view returns (uint256)", + "selector": "0xb4b577ad" + }, + "0x58680d0b": { + "type": "function", + "signature": "function future_fee() view returns (uint256 out)", + "selector": "0x58680d0b" + }, + "0xe3824462": { + "type": "function", + "signature": "function future_admin_fee() view returns (uint256)", + "selector": "0xe3824462" + }, + "0x1ec0cdc1": { + "type": "function", + "signature": "function future_owner() view returns (address)", + "selector": "0x1ec0cdc1" + }, + "0xcf7a1d77": { + "type": "function", + "signature": "function initialize(address _logic, address _admin, bytes _data) payable", + "selector": "0xcf7a1d77" + }, + "0x48a0d754": { + "type": "function", + "signature": "function available() view returns (uint256)", + "selector": "0x48a0d754" + }, + "0xf8897945": { + "type": "function", + "signature": "function min() view returns (uint256)", + "selector": "0xf8897945" + }, + "0x45dc3dd8": { + "type": "function", + "signature": "function setMin(uint256 _min)", + "selector": "0x45dc3dd8" + }, + "0x024c7ec7": { + "type": "function", + "signature": "function restrictRegistryUpdate(bool _adminOnly)", + "selector": "0x024c7ec7" + }, + "0x02ef521e": { + "type": "function", + "signature": "function registerEtherToken(address _token, bool _register)", + "selector": "0x02ef521e" + }, + "0x046dc166": { + "type": "function", + "signature": "function setSignerAddress(address _signerAddress)", + "selector": "0x046dc166" + }, + "0x0c8496cc": { + "type": "function", + "signature": "function getReturnByPath(address[] _path, uint256 _amount) view returns (uint256, uint256)", + "selector": "0x0c8496cc" + }, + "0x1134269a": { + "type": "function", + "signature": "function convertForPrioritized(address[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint256 _nonce, uint8 _v, bytes32 _r, bytes32 _s) payable returns (uint256)", + "selector": "0x1134269a" + }, + "0x2978c10e": { + "type": "function", + "signature": "function claimAndConvertFor2(address[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee) returns (uint256)", + "selector": "0x2978c10e" + }, + "0x49d10b64": { + "type": "function", + "signature": "function updateRegistry()", + "selector": "0x49d10b64" + }, + "0x4de006cb": { + "type": "function", + "signature": "function convertForPrioritized4(address[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256[] _signature, address _affiliateAccount, uint256 _affiliateFee) payable returns (uint256)", + "selector": "0x4de006cb" + }, + "0x569706eb": { + "type": "function", + "signature": "function convert2(address[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) payable returns (uint256)", + "selector": "0x569706eb" + }, + "0x5b7633d0": { + "type": "function", + "signature": "function signerAddress() view returns (address)", + "selector": "0x5b7633d0" + }, + "0x5d732ff2": { + "type": "function", + "signature": "function maxAffiliateFee() view returns (uint256)", + "selector": "0x5d732ff2" + }, + "0x5e35359e": { + "type": "function", + "signature": "function withdrawTokens(address _token, address _to, uint256 _amount)", + "selector": "0x5e35359e" + }, + "0x61cd756e": { + "type": "function", + "signature": "function prevRegistry() view returns (address)", + "selector": "0x61cd756e" + }, + "0x6896b999": { + "type": "function", + "signature": "function xConvertPrioritized(address[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s) payable returns (uint256)", + "selector": "0x6896b999" + }, + "0x6b08f2ef": { + "type": "function", + "signature": "function convertForPrioritized2(address[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s) payable returns (uint256)", + "selector": "0x6b08f2ef" + }, + "0x79ba5097": { + "type": "function", + "signature": "function acceptOwnership()", + "selector": "0x79ba5097" + }, + "0x8077ccf7": { + "type": "function", + "signature": "function etherTokens(address) view returns (bool)", + "selector": "0x8077ccf7" + }, + "0x89e63a60": { + "type": "function", + "signature": "function conversionHashes(bytes32) view returns (bool)", + "selector": "0x89e63a60" + }, + "0x8dc56657": { + "type": "function", + "signature": "function xConvertPrioritized3(address[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId, uint256[] _signature, address _affiliateAccount, uint256 _affiliateFee) payable returns (uint256)", + "selector": "0x8dc56657" + }, + "0x92d1abb7": { + "type": "function", + "signature": "function CONVERTER_CONVERSION_WHITELIST() view returns (uint256)", + "selector": "0x92d1abb7" + }, + "0xab6214ce": { + "type": "function", + "signature": "function convertFor2(address[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee) payable returns (uint256)", + "selector": "0xab6214ce" + }, + "0xb1e9932b": { + "type": "function", + "signature": "function claimAndConvertFor(address[] _path, uint256 _amount, uint256 _minReturn, address _for) returns (uint256)", + "selector": "0xb1e9932b" + }, + "0xb406d386": { + "type": "function", + "signature": "function convertForPrioritized3(address[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _customVal, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s) payable returns (uint256)", + "selector": "0xb406d386" + }, + "0xb4a176d3": { + "type": "function", + "signature": "function restoreRegistry()", + "selector": "0xb4a176d3" + }, + "0xc52173de": { + "type": "function", + "signature": "function xConvert(address[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId) payable returns (uint256)", + "selector": "0xc52173de" + }, + "0xc7ba24bc": { + "type": "function", + "signature": "function claimAndConvert(address[] _path, uint256 _amount, uint256 _minReturn) returns (uint256)", + "selector": "0xc7ba24bc" + }, + "0xc976a359": { + "type": "function", + "signature": "function adminOnly() view returns (bool)", + "selector": "0xc976a359" + }, + "0xc98fefed": { + "type": "function", + "signature": "function convertFor(address[] _path, uint256 _amount, uint256 _minReturn, address _for) payable returns (uint256)", + "selector": "0xc98fefed" + }, + "0xcb32564e": { + "type": "function", + "signature": "function xConvert2(address[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId, address _affiliateAccount, uint256 _affiliateFee) payable returns (uint256)", + "selector": "0xcb32564e" + }, + "0xce200963": { + "type": "function", + "signature": "function xConvertPrioritized2(address[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId, uint256[] _signature) payable returns (uint256)", + "selector": "0xce200963" + }, + "0xd4ee1d90": { + "type": "function", + "signature": "function newOwner() view returns (address)", + "selector": "0xd4ee1d90" + }, + "0xe57738e5": { + "type": "function", + "signature": "function claimAndConvert2(address[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) returns (uint256)", + "selector": "0xe57738e5" + }, + "0xf3898a97": { + "type": "function", + "signature": "function convert(address[] _path, uint256 _amount, uint256 _minReturn) payable returns (uint256)", + "selector": "0xf3898a97" + }, + "0xf3bc7d2a": { + "type": "function", + "signature": "function setMaxAffiliateFee(uint256 _maxAffiliateFee)", + "selector": "0xf3bc7d2a" + }, + "0x8743ad58": { + "type": "function", + "signature": "function batchSwapExactIn(tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[] swaps, address tokenIn, address tokenOut, uint256 totalAmountIn, uint256 minTotalAmountOut) payable returns (uint256 totalAmountOut)", + "selector": "0x8743ad58" + }, + "0x2db58134": { + "type": "function", + "signature": "function batchSwapExactOut(tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[] swaps, address tokenIn, address tokenOut, uint256 maxTotalAmountIn) payable returns (uint256 totalAmountIn)", + "selector": "0x2db58134" + }, + "0xe2b39746": { + "type": "function", + "signature": "function multihopBatchSwapExactIn(tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[][] swapSequences, address tokenIn, address tokenOut, uint256 totalAmountIn, uint256 minTotalAmountOut) payable returns (uint256 totalAmountOut)", + "selector": "0xe2b39746" + }, + "0x86b2ecc4": { + "type": "function", + "signature": "function multihopBatchSwapExactOut(tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[][] swapSequences, address tokenIn, address tokenOut, uint256 maxTotalAmountIn) payable returns (uint256 totalAmountIn)", + "selector": "0x86b2ecc4" + }, + "0xa91ee0dc": { + "type": "function", + "signature": "function setRegistry(address _registry)", + "selector": "0xa91ee0dc" + }, + "0x21b0eb85": { + "type": "function", + "signature": "function smartSwapExactIn(address tokenIn, address tokenOut, uint256 totalAmountIn, uint256 minTotalAmountOut, uint256 nPools) payable returns (uint256 totalAmountOut)", + "selector": "0x21b0eb85" + }, + "0xb40f39ee": { + "type": "function", + "signature": "function smartSwapExactOut(address tokenIn, address tokenOut, uint256 totalAmountOut, uint256 maxTotalAmountIn, uint256 nPools) payable returns (uint256 totalAmountIn)", + "selector": "0xb40f39ee" + }, + "0x4b0f93fb": { + "type": "function", + "signature": "function viewSplitExactIn(address tokenIn, address tokenOut, uint256 swapAmount, uint256 nPools) view returns (tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[] swaps, uint256 totalOutput)", + "selector": "0x4b0f93fb" + }, + "0x368bb1fc": { + "type": "function", + "signature": "function viewSplitExactOut(address tokenIn, address tokenOut, uint256 swapAmount, uint256 nPools) view returns (tuple(address pool, address tokenIn, address tokenOut, uint256 swapAmount, uint256 limitReturnAmount, uint256 maxPrice)[] swaps, uint256 totalOutput)", + "selector": "0x368bb1fc" + }, + "0x98c4f76d": { + "type": "function", + "signature": "function CHALLENGE_AMOUNT_DIVISOR() view returns (uint256)", + "selector": "0x98c4f76d" + }, + "0x4de8c6e6": { + "type": "function", + "signature": "function TIME_SLOT_SIZE() view returns (uint256)", + "selector": "0x4de8c6e6" + }, + "0x5325937f": { + "type": "function", + "signature": "function addBonder(address bonder)", + "selector": "0x5325937f" + }, + "0x8d8798bf": { + "type": "function", + "signature": "function bondTransferRoot(bytes32 rootHash, uint256 destinationChainId, uint256 totalAmount)", + "selector": "0x8d8798bf" + }, + "0x23c452cd": { + "type": "function", + "signature": "function bondWithdrawal(address recipient, uint256 amount, bytes32 transferNonce, uint256 bonderFee)", + "selector": "0x23c452cd" + }, + "0xfc110b67": { + "type": "function", + "signature": "function chainBalance(uint256) view returns (uint256)", + "selector": "0xfc110b67" + }, + "0xf3f480d9": { + "type": "function", + "signature": "function challengePeriod() view returns (uint256)", + "selector": "0xf3f480d9" + }, + "0x767631d5": { + "type": "function", + "signature": "function challengeResolutionPeriod() view returns (uint256)", + "selector": "0x767631d5" + }, + "0x1bbe15ea": { + "type": "function", + "signature": "function challengeTransferBond(bytes32 rootHash, uint256 originalAmount, uint256 destinationChainId) payable", + "selector": "0x1bbe15ea" + }, + "0xef6ebe5e": { + "type": "function", + "signature": "function confirmTransferRoot(uint256 originChainId, bytes32 rootHash, uint256 destinationChainId, uint256 totalAmount, uint256 rootCommittedAt)", + "selector": "0xef6ebe5e" + }, + "0xa35962f3": { + "type": "function", + "signature": "function crossDomainMessengerWrappers(uint256) view returns (address)", + "selector": "0xa35962f3" + }, + "0xe19be150": { + "type": "function", + "signature": "function getBondForTransferAmount(uint256 amount) pure returns (uint256)", + "selector": "0xe19be150" + }, + "0x302830ab": { + "type": "function", + "signature": "function getBondedWithdrawalAmount(address bonder, bytes32 transferId) view returns (uint256)", + "selector": "0x302830ab" + }, + "0x3408e470": { + "type": "function", + "signature": "function getChainId() view returns (uint256 chainId)", + "selector": "0x3408e470" + }, + "0xa239f5ee": { + "type": "function", + "signature": "function getChallengeAmountForTransferAmount(uint256 amount) pure returns (uint256)", + "selector": "0xa239f5ee" + }, + "0x57344e6f": { + "type": "function", + "signature": "function getCredit(address bonder) view returns (uint256)", + "selector": "0x57344e6f" + }, + "0xffa9286c": { + "type": "function", + "signature": "function getDebitAndAdditionalDebit(address bonder) view returns (uint256)", + "selector": "0xffa9286c" + }, + "0xd5ef7551": { + "type": "function", + "signature": "function getIsBonder(address maybeBonder) view returns (bool)", + "selector": "0xd5ef7551" + }, + "0x13948c76": { + "type": "function", + "signature": "function getRawDebit(address bonder) view returns (uint256)", + "selector": "0x13948c76" + }, + "0x2b85dcc9": { + "type": "function", + "signature": "function getTimeSlot(uint256 time) pure returns (uint256)", + "selector": "0x2b85dcc9" + }, + "0xaf215f94": { + "type": "function", + "signature": "function getTransferId(uint256 chainId, address recipient, uint256 amount, bytes32 transferNonce, uint256 bonderFee, uint256 amountOutMin, uint256 deadline) pure returns (bytes32)", + "selector": "0xaf215f94" + }, + "0xce803b4f": { + "type": "function", + "signature": "function getTransferRoot(bytes32 rootHash, uint256 totalAmount) view returns (tuple(uint256 total, uint256 amountWithdrawn, uint256 createdAt))", + "selector": "0xce803b4f" + }, + "0x960a7afa": { + "type": "function", + "signature": "function getTransferRootId(bytes32 rootHash, uint256 totalAmount) pure returns (bytes32)", + "selector": "0x960a7afa" + }, + "0xfa2a69a3": { + "type": "function", + "signature": "function isChainIdPaused(uint256) view returns (bool)", + "selector": "0xfa2a69a3" + }, + "0x3a7af631": { + "type": "function", + "signature": "function isTransferIdSpent(bytes32 transferId) view returns (bool)", + "selector": "0x3a7af631" + }, + "0xb7a0bda6": { + "type": "function", + "signature": "function l1CanonicalToken() view returns (address)", + "selector": "0xb7a0bda6" + }, + "0x6cff06a7": { + "type": "function", + "signature": "function minTransferRootBondDelay() view returns (uint256)", + "selector": "0x6cff06a7" + }, + "0x04e6c2c0": { + "type": "function", + "signature": "function removeBonder(address bonder)", + "selector": "0x04e6c2c0" + }, + "0xcbd1642e": { + "type": "function", + "signature": "function rescueTransferRoot(bytes32 rootHash, uint256 originalAmount, address recipient)", + "selector": "0xcbd1642e" + }, + "0x81707b80": { + "type": "function", + "signature": "function resolveChallenge(bytes32 rootHash, uint256 originalAmount, uint256 destinationChainId)", + "selector": "0x81707b80" + }, + "0xdeace8f5": { + "type": "function", + "signature": "function sendToL2(uint256 chainId, address recipient, uint256 amount, uint256 amountOutMin, uint256 deadline, address relayer, uint256 relayerFee) payable", + "selector": "0xdeace8f5" + }, + "0x14942024": { + "type": "function", + "signature": "function setChainIdDepositsPaused(uint256 chainId, bool isPaused)", + "selector": "0x14942024" + }, + "0x5d475fdd": { + "type": "function", + "signature": "function setChallengePeriod(uint256 _challengePeriod)", + "selector": "0x5d475fdd" + }, + "0xeecd57e6": { + "type": "function", + "signature": "function setChallengeResolutionPeriod(uint256 _challengeResolutionPeriod)", + "selector": "0xeecd57e6" + }, + "0xd4448163": { + "type": "function", + "signature": "function setCrossDomainMessengerWrapper(uint256 chainId, address _crossDomainMessengerWrapper)", + "selector": "0xd4448163" + }, + "0x39ada669": { + "type": "function", + "signature": "function setMinTransferRootBondDelay(uint256 _minTransferRootBondDelay)", + "selector": "0x39ada669" + }, + "0xc7525dd3": { + "type": "function", + "signature": "function settleBondedWithdrawal(address bonder, bytes32 transferId, bytes32 rootHash, uint256 transferRootTotalAmount, uint256 transferIdTreeIndex, bytes32[] siblings, uint256 totalLeaves)", + "selector": "0xc7525dd3" + }, + "0xb162717e": { + "type": "function", + "signature": "function settleBondedWithdrawals(address bonder, bytes32[] transferIds, uint256 totalAmount)", + "selector": "0xb162717e" + }, + "0xadc9772e": { + "type": "function", + "signature": "function stake(address bonder, uint256 amount) payable", + "selector": "0xadc9772e" + }, + "0x7398d282": { + "type": "function", + "signature": "function timeSlotToAmountBonded(uint256, address) view returns (uint256)", + "selector": "0x7398d282" + }, + "0x5a7e1083": { + "type": "function", + "signature": "function transferBonds(bytes32) view returns (address bonder, uint256 createdAt, uint256 totalAmount, uint256 challengeStartTime, address challenger, bool challengeResolved)", + "selector": "0x5a7e1083" + }, + "0x3b8fea28": { + "type": "function", + "signature": "function transferRootCommittedAt(uint256, bytes32) view returns (uint256)", + "selector": "0x3b8fea28" + }, + "0x2e17de78": { + "type": "function", + "signature": "function unstake(uint256 amount)", + "selector": "0x2e17de78" + }, + "0x0f7aadb7": { + "type": "function", + "signature": "function withdraw(address recipient, uint256 amount, bytes32 transferNonce, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, bytes32 rootHash, uint256 transferRootTotalAmount, uint256 transferIdTreeIndex, bytes32[] siblings, uint256 totalLeaves)", + "selector": "0x0f7aadb7" + }, + "0x025b22bc": { + "type": "function", + "signature": "function updateImplementation(address _newProxyTo)", + "selector": "0x025b22bc" + }, + "0x42fc47fb": { + "type": "function", + "signature": "function childChain() view returns (address)", + "selector": "0x42fc47fb" + }, + "0x4555d5c9": { + "type": "function", + "signature": "function proxyType() pure returns (uint256 proxyTypeId)", + "selector": "0x4555d5c9" + }, + "0x987ab9db": { + "type": "function", + "signature": "function rootChain() view returns (address)", + "selector": "0x987ab9db" + }, + "0xa69df4b5": { + "type": "function", + "signature": "function unlock()", + "selector": "0xa69df4b5" + }, + "0xb02c43d0": { + "type": "function", + "signature": "function deposits(uint256) view returns (bytes32 depositHash, uint256 createdAt)", + "selector": "0xb02c43d0" + }, + "0xcb10f94c": { + "type": "function", + "signature": "function stateSender() view returns (address)", + "selector": "0xcb10f94c" + }, + "0xe7af7ba1": { + "type": "function", + "signature": "function maxErc20Deposit() view returns (uint256)", + "selector": "0xe7af7ba1" + }, + "0xf83d08ba": { + "type": "function", + "signature": "function lock()", + "selector": "0xf83d08ba" + }, + "0x025313a2": { + "type": "function", + "signature": "function proxyOwner() view returns (address)", + "selector": "0x025313a2" + }, + "0xf1739cae": { + "type": "function", + "signature": "function transferProxyOwnership(address newOwner)", + "selector": "0xf1739cae" + }, + "0xd88ca2c8": { + "type": "function", + "signature": "function updateAndCall(address _newProxyTo, bytes data) payable", + "selector": "0xd88ca2c8" + }, + "0x53755b8f": { + "type": "function", + "signature": "function authorizeSender(address authorizedSender)", + "selector": "0x53755b8f" + }, + "0xbfe51c10": { + "type": "function", + "signature": "function authorizeSigner(address authorizedSigner)", + "selector": "0xbfe51c10" + }, + "0x2e340823": { + "type": "function", + "signature": "function cancel(uint256[] nonces)", + "selector": "0x2e340823" + }, + "0x3c641910": { + "type": "function", + "signature": "function cancelUpTo(uint256 minimumNonce)", + "selector": "0x3c641910" + }, + "0xab204282": { + "type": "function", + "signature": "function revokeSender(address authorizedSender)", + "selector": "0xab204282" + }, + "0xc34b44a0": { + "type": "function", + "signature": "function revokeSigner(address authorizedSigner)", + "selector": "0xc34b44a0" + }, + "0x4f94c536": { + "type": "function", + "signature": "function senderAuthorizations(address, address) view returns (bool)", + "selector": "0x4f94c536" + }, + "0x41ac49a3": { + "type": "function", + "signature": "function signerAuthorizations(address, address) view returns (bool)", + "selector": "0x41ac49a3" + }, + "0x5e68e11f": { + "type": "function", + "signature": "function signerMinimumNonce(address) view returns (uint256)", + "selector": "0x5e68e11f" + }, + "0xbfb96279": { + "type": "function", + "signature": "function signerNonceStatus(address, uint256) view returns (bytes1)", + "selector": "0xbfb96279" + }, + "0xcf701ff7": { + "type": "function", + "signature": "function calc_token_amount(uint256[4] amounts, bool deposit) view returns (uint256 out)", + "selector": "0xcf701ff7" + }, + "0x029b2f34": { + "type": "function", + "signature": "function add_liquidity(uint256[4] amounts, uint256 min_mint_amount)", + "selector": "0x029b2f34" + }, + "0x67df02ca": { + "type": "function", + "signature": "function get_dx(int128 i, int128 j, uint256 dy) view returns (uint256 out)", + "selector": "0x67df02ca" + }, + "0x0e71d1b9": { + "type": "function", + "signature": "function get_dx_underlying(int128 i, int128 j, uint256 dy) view returns (uint256 out)", + "selector": "0x0e71d1b9" + }, + "0x3df02124": { + "type": "function", + "signature": "function exchange(int128 i, int128 j, uint256 _dx, uint256 _min_dy) returns (uint256)", + "selector": "0x3df02124" + }, + "0xa6417ed6": { + "type": "function", + "signature": "function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy)", + "selector": "0xa6417ed6" + }, + "0x7d49d875": { + "type": "function", + "signature": "function remove_liquidity(uint256 _amount, uint256[4] min_amounts)", + "selector": "0x7d49d875" + }, + "0x18a7bd76": { + "type": "function", + "signature": "function remove_liquidity_imbalance(uint256[4] amounts, uint256 max_burn_amount)", + "selector": "0x18a7bd76" + }, + "0xee11f5b6": { + "type": "function", + "signature": "function commit_new_parameters(uint256 amplification, uint256 new_fee, uint256 new_admin_fee)", + "selector": "0xee11f5b6" + }, + "0x9a8a0592": { + "type": "function", + "signature": "function chainId() view returns (uint256)", + "selector": "0x9a8a0592" + }, + "0x5285e058": { + "type": "function", + "signature": "function crossDomainAdmin() view returns (address)", + "selector": "0x5285e058" + }, + "0x49228978": { + "type": "function", + "signature": "function deposit(address recipient, address originToken, uint256 amount, uint256 destinationChainId, uint64 relayerFeePct, uint32 quoteTimestamp) payable", + "selector": "0x49228978" + }, + "0x57f6dcb8": { + "type": "function", + "signature": "function depositQuoteTimeBuffer() view returns (uint32)", + "selector": "0x57f6dcb8" + }, + "0x8a7860ce": { + "type": "function", + "signature": "function emergencyDeleteRootBundle(uint256 rootBundleId)", + "selector": "0x8a7860ce" + }, + "0x5249fef1": { + "type": "function", + "signature": "function enabledDepositRoutes(address, uint256) view returns (bool)", + "selector": "0x5249fef1" + }, + "0x1b3d5559": { + "type": "function", + "signature": "function executeRelayerRefundLeaf(uint32 rootBundleId, tuple(uint256 amountToReturn, uint256 chainId, uint256[] refundAmounts, uint32 leafId, address l2TokenAddress, address[] refundAddresses) relayerRefundLeaf, bytes32[] proof)", + "selector": "0x1b3d5559" + }, + "0xbe3576ee": { + "type": "function", + "signature": "function executeSlowRelayLeaf(address depositor, address recipient, address destinationToken, uint256 amount, uint256 originChainId, uint64 realizedLpFeePct, uint64 relayerFeePct, uint32 depositId, uint32 rootBundleId, bytes32[] proof)", + "selector": "0xbe3576ee" + }, + "0x89a153cc": { + "type": "function", + "signature": "function fillRelay(address depositor, address recipient, address destinationToken, uint256 amount, uint256 maxTokensToSend, uint256 repaymentChainId, uint256 originChainId, uint64 realizedLpFeePct, uint64 relayerFeePct, uint32 depositId)", + "selector": "0x89a153cc" + }, + "0xffc351a3": { + "type": "function", + "signature": "function fillRelayWithUpdatedFee(address depositor, address recipient, address destinationToken, uint256 amount, uint256 maxTokensToSend, uint256 repaymentChainId, uint256 originChainId, uint64 realizedLpFeePct, uint64 relayerFeePct, uint64 newRelayerFeePct, uint32 depositId, bytes depositorSignature)", + "selector": "0xffc351a3" + }, + "0x29cb924d": { + "type": "function", + "signature": "function getCurrentTime() view returns (uint256)", + "selector": "0x29cb924d" + }, + "0xe1904402": { + "type": "function", + "signature": "function hubPool() view returns (address)", + "selector": "0xe1904402" + }, + "0xa1244c67": { + "type": "function", + "signature": "function numberOfDeposits() view returns (uint32)", + "selector": "0xa1244c67" + }, + "0xf06850f6": { + "type": "function", + "signature": "function relayFills(bytes32) view returns (uint256)", + "selector": "0xf06850f6" + }, + "0x493a4f84": { + "type": "function", + "signature": "function relayRootBundle(bytes32 relayerRefundRoot, bytes32 slowRelayRoot)", + "selector": "0x493a4f84" + }, + "0xee2a53f8": { + "type": "function", + "signature": "function rootBundles(uint256) view returns (bytes32 slowRelayRoot, bytes32 relayerRefundRoot)", + "selector": "0xee2a53f8" + }, + "0xde7eba78": { + "type": "function", + "signature": "function setCrossDomainAdmin(address newCrossDomainAdmin)", + "selector": "0xde7eba78" + }, + "0x22f8e566": { + "type": "function", + "signature": "function setCurrentTime(uint256 time)", + "selector": "0x22f8e566" + }, + "0x2752042e": { + "type": "function", + "signature": "function setDepositQuoteTimeBuffer(uint32 newDepositQuoteTimeBuffer)", + "selector": "0x2752042e" + }, + "0x272751c7": { + "type": "function", + "signature": "function setEnableRoute(address originToken, uint256 destinationChainId, bool enabled)", + "selector": "0x272751c7" + }, + "0x1dfb2d02": { + "type": "function", + "signature": "function setHubPool(address newHubPool)", + "selector": "0x1dfb2d02" + }, + "0xe282d5b9": { + "type": "function", + "signature": "function speedUpDeposit(address depositor, uint64 newRelayerFeePct, uint32 depositId, bytes depositorSignature)", + "selector": "0xe282d5b9" + }, + "0x1c39c38d": { + "type": "function", + "signature": "function timerAddress() view returns (address)", + "selector": "0x1c39c38d" + }, + "0x1249c58b": { + "type": "function", + "signature": "function mint() payable", + "selector": "0x1249c58b" + }, + "0x4e4d9fea": { + "type": "function", + "signature": "function repayBorrow() payable", + "selector": "0x4e4d9fea" + }, + "0xaae40a2a": { + "type": "function", + "signature": "function liquidateBorrow(address borrower, address cTokenCollateral) payable", + "selector": "0xaae40a2a" + }, + "0xe5974619": { + "type": "function", + "signature": "function repayBorrowBehalf(address borrower) payable", + "selector": "0xe5974619" + }, + "0x3ad06d16": { + "type": "function", + "signature": "function upgradeTo(uint256 version, address implementation)", + "selector": "0x3ad06d16" + }, + "0x6fde8202": { + "type": "function", + "signature": "function upgradeabilityOwner() view returns (address)", + "selector": "0x6fde8202" + }, + "0xa9c45fcb": { + "type": "function", + "signature": "function upgradeToAndCall(uint256 version, address implementation, bytes data) payable", + "selector": "0xa9c45fcb" + }, + "0x9870d7fe": { + "type": "function", + "signature": "function addOperator(address newOperator)", + "selector": "0x9870d7fe" + }, + "0x9c1c2ee9": { + "type": "function", + "signature": "function erc1155safeTransferFrom(address token, address from, address to, uint256 id, uint256 value, bytes data)", + "selector": "0x9c1c2ee9" + }, + "0xf709b906": { + "type": "function", + "signature": "function erc721safeTransferFrom(address token, address from, address to, uint256 tokenId)", + "selector": "0xf709b906" + }, + "0x6d70f7ae": { + "type": "function", + "signature": "function isOperator(address account) view returns (bool)", + "selector": "0x6d70f7ae" + }, + "0xac8a584a": { + "type": "function", + "signature": "function removeOperator(address operator)", + "selector": "0xac8a584a" + }, + "0x3883e119": { + "type": "function", + "signature": "function calc_token_amount(uint256[3] amounts, bool deposit) view returns (uint256 out)", + "selector": "0x3883e119" + }, + "0x4515cef3": { + "type": "function", + "signature": "function add_liquidity(uint256[3] amounts, uint256 min_mint_amount)", + "selector": "0x4515cef3" + }, + "0xecb586a5": { + "type": "function", + "signature": "function remove_liquidity(uint256 _amount, uint256[3] min_amounts)", + "selector": "0xecb586a5" + }, + "0x9fdaea0c": { + "type": "function", + "signature": "function remove_liquidity_imbalance(uint256[3] amounts, uint256 max_burn_amount)", + "selector": "0x9fdaea0c" + }, + "0x7fc82484": { + "type": "function", + "signature": "function buyAndRedeem(uint256 vaultId, uint256 amount, uint256[] specificIds, address[] path, address to) payable", + "selector": "0x7fc82484" + }, + "0x4447d888": { + "type": "function", + "signature": "function buyAndRedeemWETH(uint256 vaultId, uint256 amount, uint256[] specificIds, uint256 maxWethIn, address[] path, address to)", + "selector": "0x4447d888" + }, + "0x57e836dc": { + "type": "function", + "signature": "function buyAndSwap1155(uint256 vaultId, uint256[] idsIn, uint256[] amounts, uint256[] specificIds, address[] path, address to) payable", + "selector": "0x57e836dc" + }, + "0x42c4ccaa": { + "type": "function", + "signature": "function buyAndSwap1155WETH(uint256 vaultId, uint256[] idsIn, uint256[] amounts, uint256[] specificIds, uint256 maxWethIn, address[] path, address to) payable", + "selector": "0x42c4ccaa" + }, + "0x58fbdd0a": { + "type": "function", + "signature": "function buyAndSwap721(uint256 vaultId, uint256[] idsIn, uint256[] specificIds, address[] path, address to) payable", + "selector": "0x58fbdd0a" + }, + "0x5d8117a6": { + "type": "function", + "signature": "function buyAndSwap721WETH(uint256 vaultId, uint256[] idsIn, uint256[] specificIds, uint256 maxWethIn, address[] path, address to)", + "selector": "0x5d8117a6" + }, + "0x9bf1401c": { + "type": "function", + "signature": "function lpStaking() view returns (address)", + "selector": "0x9bf1401c" + }, + "0xab3a4121": { + "type": "function", + "signature": "function mintAndSell1155(uint256 vaultId, uint256[] ids, uint256[] amounts, uint256 minWethOut, address[] path, address to)", + "selector": "0xab3a4121" + }, + "0xa0271617": { + "type": "function", + "signature": "function mintAndSell1155WETH(uint256 vaultId, uint256[] ids, uint256[] amounts, uint256 minWethOut, address[] path, address to)", + "selector": "0xa0271617" + }, + "0x0956642b": { + "type": "function", + "signature": "function mintAndSell721(uint256 vaultId, uint256[] ids, uint256 minWethOut, address[] path, address to)", + "selector": "0x0956642b" + }, + "0x929bf3d3": { + "type": "function", + "signature": "function mintAndSell721WETH(uint256 vaultId, uint256[] ids, uint256 minWethOut, address[] path, address to)", + "selector": "0x929bf3d3" + }, + "0x5ee50f88": { + "type": "function", + "signature": "function nftxFactory() view returns (address)", + "selector": "0x5ee50f88" + }, + "0x6d13582c": { + "type": "function", + "signature": "function sushiRouter() view returns (address)", + "selector": "0x6d13582c" + }, + "0x74a28f79": { + "type": "function", + "signature": "function batchExec(address[] tos, bytes[] datas) payable", + "selector": "0x74a28f79" + }, + "0x94da7864": { + "type": "function", + "signature": "function execs(address[] tos, bytes[] datas) payable", + "selector": "0x94da7864" + }, + "0xba52c1b5": { + "type": "error", + "signature": "error BAKCAlreadyPaired()", + "selector": "0xba52c1b5" + }, + "0xde72b61e": { + "type": "error", + "signature": "error BAKCNotOwnedOrPaired()", + "selector": "0xde72b61e" + }, + "0x5cd83192": { + "type": "error", + "signature": "error CallerNotOwner()", + "selector": "0x5cd83192" + }, + "0x50e75a80": { + "type": "error", + "signature": "error DepositMoreThanOneAPE()", + "selector": "0x50e75a80" + }, + "0x8b853e25": { + "type": "error", + "signature": "error EndNotWholeHour()", + "selector": "0x8b853e25" + }, + "0xf03ac374": { + "type": "error", + "signature": "error ExceededCapAmount()", + "selector": "0xf03ac374" + }, + "0x9acaefc7": { + "type": "error", + "signature": "error ExceededStakedAmount()", + "selector": "0x9acaefc7" + }, + "0x0afa7ee8": { + "type": "error", + "signature": "error InvalidPoolId()", + "selector": "0x0afa7ee8" + }, + "0xa3fdbb52": { + "type": "error", + "signature": "error MainTokenNotOwnedOrPaired()", + "selector": "0xa3fdbb52" + }, + "0x4a2f3865": { + "type": "error", + "signature": "error NeitherTokenInPairOwnedByCaller()", + "selector": "0x4a2f3865" + }, + "0x2c8348bb": { + "type": "error", + "signature": "error NotOwnerOfBAKC()", + "selector": "0x2c8348bb" + }, + "0x2b19ae75": { + "type": "error", + "signature": "error NotOwnerOfMain()", + "selector": "0x2b19ae75" + }, + "0xccc819da": { + "type": "error", + "signature": "error ProvidedTokensNotPaired()", + "selector": "0xccc819da" + }, + "0xe373a085": { + "type": "error", + "signature": "error SplitPairCantPartiallyWithdraw()", + "selector": "0xe373a085" + }, + "0xd67e3109": { + "type": "error", + "signature": "error StartMustBeGreaterThanEnd()", + "selector": "0xd67e3109" + }, + "0x9424dcd9": { + "type": "error", + "signature": "error StartMustEqualLastEnd()", + "selector": "0x9424dcd9" + }, + "0xf7985df1": { + "type": "error", + "signature": "error StartNotWholeHour()", + "selector": "0xf7985df1" + }, + "0x4614cb02": { + "type": "error", + "signature": "error UncommitWrongParameters()", + "selector": "0x4614cb02" + }, + "0xbb628f20": { + "type": "function", + "signature": "function addTimeRange(uint256 _poolId, uint256 _amount, uint256 _startTimestamp, uint256 _endTimeStamp, uint256 _capPerPosition)", + "selector": "0xbb628f20" + }, + "0x05ece226": { + "type": "function", + "signature": "function addressPosition(address) view returns (uint256 stakedAmount, int256 rewardsDebt)", + "selector": "0x05ece226" + }, + "0xac7ad9ba": { + "type": "function", + "signature": "function apeCoin() view returns (address)", + "selector": "0xac7ad9ba" + }, + "0xb4f95752": { + "type": "function", + "signature": "function bakcToMain(uint256, uint256) view returns (uint248 tokenId, bool isPaired)", + "selector": "0xb4f95752" + }, + "0x2ee2de66": { + "type": "function", + "signature": "function claimApeCoin(address _recipient)", + "selector": "0x2ee2de66" + }, + "0x07f5fa4a": { + "type": "function", + "signature": "function claimBAKC(tuple(uint128 mainTokenId, uint128 bakcTokenId)[] _baycPairs, tuple(uint128 mainTokenId, uint128 bakcTokenId)[] _maycPairs, address _recipient)", + "selector": "0x07f5fa4a" + }, + "0xb682e859": { + "type": "function", + "signature": "function claimBAYC(uint256[] _nfts, address _recipient)", + "selector": "0xb682e859" + }, + "0x57a26300": { + "type": "function", + "signature": "function claimMAYC(uint256[] _nfts, address _recipient)", + "selector": "0x57a26300" + }, + "0x8279e760": { + "type": "function", + "signature": "function claimSelfApeCoin()", + "selector": "0x8279e760" + }, + "0xe0347e4f": { + "type": "function", + "signature": "function claimSelfBAKC(tuple(uint128 mainTokenId, uint128 bakcTokenId)[] _baycPairs, tuple(uint128 mainTokenId, uint128 bakcTokenId)[] _maycPairs)", + "selector": "0xe0347e4f" + }, + "0x20a325d0": { + "type": "function", + "signature": "function claimSelfBAYC(uint256[] _nfts)", + "selector": "0x20a325d0" + }, + "0x381b4682": { + "type": "function", + "signature": "function claimSelfMAYC(uint256[] _nfts)", + "selector": "0x381b4682" + }, + "0xbd5023a9": { + "type": "function", + "signature": "function depositApeCoin(uint256 _amount, address _recipient)", + "selector": "0xbd5023a9" + }, + "0xd346cbd9": { + "type": "function", + "signature": "function depositBAKC(tuple(uint32 mainTokenId, uint32 bakcTokenId, uint184 amount)[] _baycPairs, tuple(uint32 mainTokenId, uint32 bakcTokenId, uint184 amount)[] _maycPairs)", + "selector": "0xd346cbd9" + }, + "0x46583a05": { + "type": "function", + "signature": "function depositBAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts)", + "selector": "0x46583a05" + }, + "0x8ecbffa7": { + "type": "function", + "signature": "function depositMAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts)", + "selector": "0x8ecbffa7" + }, + "0x9dcaafb4": { + "type": "function", + "signature": "function depositSelfApeCoin(uint256 _amount)", + "selector": "0x9dcaafb4" + }, + "0x04238994": { + "type": "function", + "signature": "function getAllStakes(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair)[])", + "selector": "0x04238994" + }, + "0xd9f11fb2": { + "type": "function", + "signature": "function getApeCoinStake(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair))", + "selector": "0xd9f11fb2" + }, + "0x00191b44": { + "type": "function", + "signature": "function getBakcStakes(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair)[])", + "selector": "0x00191b44" + }, + "0x9860037e": { + "type": "function", + "signature": "function getBaycStakes(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair)[])", + "selector": "0x9860037e" + }, + "0xf4c6f602": { + "type": "function", + "signature": "function getMaycStakes(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair)[])", + "selector": "0xf4c6f602" + }, + "0x770dade5": { + "type": "function", + "signature": "function getPoolsUI() view returns (tuple(uint256 poolId, uint256 stakedAmount, tuple(uint48 startTimestampHour, uint48 endTimestampHour, uint96 rewardsPerHour, uint96 capPerPosition) currentTimeRange), tuple(uint256 poolId, uint256 stakedAmount, tuple(uint48 startTimestampHour, uint48 endTimestampHour, uint96 rewardsPerHour, uint96 capPerPosition) currentTimeRange), tuple(uint256 poolId, uint256 stakedAmount, tuple(uint48 startTimestampHour, uint48 endTimestampHour, uint96 rewardsPerHour, uint96 capPerPosition) currentTimeRange), tuple(uint256 poolId, uint256 stakedAmount, tuple(uint48 startTimestampHour, uint48 endTimestampHour, uint96 rewardsPerHour, uint96 capPerPosition) currentTimeRange))", + "selector": "0x770dade5" + }, + "0x0ed368f1": { + "type": "function", + "signature": "function getSplitStakes(address _address) view returns (tuple(uint256 poolId, uint256 tokenId, uint256 deposited, uint256 unclaimed, uint256 rewards24hr, tuple(uint256 mainTokenId, uint256 mainTypePoolId) pair)[])", + "selector": "0x0ed368f1" + }, + "0x09e833c6": { + "type": "function", + "signature": "function getTimeRangeBy(uint256 _poolId, uint256 _index) view returns (tuple(uint48 startTimestampHour, uint48 endTimestampHour, uint96 rewardsPerHour, uint96 capPerPosition))", + "selector": "0x09e833c6" + }, + "0x304f88c0": { + "type": "function", + "signature": "function mainToBakc(uint256, uint256) view returns (uint248 tokenId, bool isPaired)", + "selector": "0x304f88c0" + }, + "0x0bb4d82a": { + "type": "function", + "signature": "function nftContracts(uint256) view returns (address)", + "selector": "0x0bb4d82a" + }, + "0x98ada4a2": { + "type": "function", + "signature": "function nftPosition(uint256, uint256) view returns (uint256 stakedAmount, int256 rewardsDebt)", + "selector": "0x98ada4a2" + }, + "0x2c018f91": { + "type": "function", + "signature": "function pendingRewards(uint256 _poolId, address _address, uint256 _tokenId) view returns (uint256)", + "selector": "0x2c018f91" + }, + "0xac4afa38": { + "type": "function", + "signature": "function pools(uint256) view returns (uint48 lastRewardedTimestampHour, uint16 lastRewardsRangeIndex, uint96 stakedAmount, uint96 accumulatedRewardsPerShare)", + "selector": "0xac4afa38" + }, + "0xd363dc17": { + "type": "function", + "signature": "function removeLastTimeRange(uint256 _poolId)", + "selector": "0xd363dc17" + }, + "0xd7464ee9": { + "type": "function", + "signature": "function rewardsBy(uint256 _poolId, uint256 _from, uint256 _to) view returns (uint256, uint256)", + "selector": "0xd7464ee9" + }, + "0xf5679189": { + "type": "function", + "signature": "function stakedTotal(address _address) view returns (uint256)", + "selector": "0xf5679189" + }, + "0xe4e81847": { + "type": "function", + "signature": "function withdrawApeCoin(uint256 _amount, address _recipient)", + "selector": "0xe4e81847" + }, + "0x26fb2249": { + "type": "function", + "signature": "function withdrawBAKC(tuple(uint32 mainTokenId, uint32 bakcTokenId, uint184 amount, bool isUncommit)[] _baycPairs, tuple(uint32 mainTokenId, uint32 bakcTokenId, uint184 amount, bool isUncommit)[] _maycPairs)", + "selector": "0x26fb2249" + }, + "0xaceb3629": { + "type": "function", + "signature": "function withdrawBAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts, address _recipient)", + "selector": "0xaceb3629" + }, + "0xed23c906": { + "type": "function", + "signature": "function withdrawMAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts, address _recipient)", + "selector": "0xed23c906" + }, + "0x7f60d338": { + "type": "function", + "signature": "function withdrawSelfApeCoin(uint256 _amount)", + "selector": "0x7f60d338" + }, + "0xfe31446c": { + "type": "function", + "signature": "function withdrawSelfBAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts)", + "selector": "0xfe31446c" + }, + "0xc63389c3": { + "type": "function", + "signature": "function withdrawSelfMAYC(tuple(uint32 tokenId, uint224 amount)[] _nfts)", + "selector": "0xc63389c3" + }, + "0xcbd2ec65": { + "type": "function", + "signature": "function cancelAllOrdersForSender(uint256 minNonce)", + "selector": "0xcbd2ec65" + }, + "0x9e53a69a": { + "type": "function", + "signature": "function cancelMultipleMakerOrders(uint256[] orderNonces)", + "selector": "0x9e53a69a" + }, + "0x0f747d74": { + "type": "function", + "signature": "function currencyManager() view returns (address)", + "selector": "0x0f747d74" + }, + "0x483abb9f": { + "type": "function", + "signature": "function executionManager() view returns (address)", + "selector": "0x483abb9f" + }, + "0x31e27e27": { + "type": "function", + "signature": "function isUserOrderNonceExecutedOrCancelled(address user, uint256 orderNonce) view returns (bool)", + "selector": "0x31e27e27" + }, + "0x38e29209": { + "type": "function", + "signature": "function matchAskWithTakerBid(tuple(bool isOrderAsk, address taker, uint256 price, uint256 tokenId, uint256 minPercentageToAsk, bytes params) takerBid, tuple(bool isOrderAsk, address signer, address collection, uint256 price, uint256 tokenId, uint256 amount, address strategy, address currency, uint256 nonce, uint256 startTime, uint256 endTime, uint256 minPercentageToAsk, bytes params, uint8 v, bytes32 r, bytes32 s) makerAsk)", + "selector": "0x38e29209" + }, + "0xb4e4b296": { + "type": "function", + "signature": "function matchAskWithTakerBidUsingETHAndWETH(tuple(bool isOrderAsk, address taker, uint256 price, uint256 tokenId, uint256 minPercentageToAsk, bytes params) takerBid, tuple(bool isOrderAsk, address signer, address collection, uint256 price, uint256 tokenId, uint256 amount, address strategy, address currency, uint256 nonce, uint256 startTime, uint256 endTime, uint256 minPercentageToAsk, bytes params, uint8 v, bytes32 r, bytes32 s) makerAsk) payable", + "selector": "0xb4e4b296" + }, + "0x3b6d032e": { + "type": "function", + "signature": "function matchBidWithTakerAsk(tuple(bool isOrderAsk, address taker, uint256 price, uint256 tokenId, uint256 minPercentageToAsk, bytes params) takerAsk, tuple(bool isOrderAsk, address signer, address collection, uint256 price, uint256 tokenId, uint256 amount, address strategy, address currency, uint256 nonce, uint256 startTime, uint256 endTime, uint256 minPercentageToAsk, bytes params, uint8 v, bytes32 r, bytes32 s) makerBid)", + "selector": "0x3b6d032e" + }, + "0x87e4401f": { + "type": "function", + "signature": "function royaltyFeeManager() view returns (address)", + "selector": "0x87e4401f" + }, + "0x5e14f68e": { + "type": "function", + "signature": "function transferSelectorNFT() view returns (address)", + "selector": "0x5e14f68e" + }, + "0x5ce052d7": { + "type": "function", + "signature": "function updateCurrencyManager(address _currencyManager)", + "selector": "0x5ce052d7" + }, + "0xd4ff41dc": { + "type": "function", + "signature": "function updateExecutionManager(address _executionManager)", + "selector": "0xd4ff41dc" + }, + "0x1df47f80": { + "type": "function", + "signature": "function updateProtocolFeeRecipient(address _protocolFeeRecipient)", + "selector": "0x1df47f80" + }, + "0xc5498769": { + "type": "function", + "signature": "function updateRoyaltyFeeManager(address _royaltyFeeManager)", + "selector": "0xc5498769" + }, + "0xf75ff53f": { + "type": "function", + "signature": "function updateTransferSelectorNFT(address _transferSelectorNFT)", + "selector": "0xf75ff53f" + }, + "0x4266581e": { + "type": "function", + "signature": "function userMinOrderNonce(address) view returns (uint256)", + "selector": "0x4266581e" + }, + "0x9ca37a0b": { + "type": "function", + "signature": "function ZapIn(address _FromTokenContractAddress, address _pairAddress, uint256 _amount, uint256 _minPoolTokens, address _swapTarget, bytes swapData, address affiliate, bool transferResidual, bool shouldSellEntireBalance) payable returns (uint256)", + "selector": "0x9ca37a0b" + }, + "0x1781261f": { + "type": "function", + "signature": "function affiliateBalance(address, address) view returns (uint256)", + "selector": "0x1781261f" + }, + "0x4f51e294": { + "type": "function", + "signature": "function affiliates(address) view returns (bool)", + "selector": "0x4f51e294" + }, + "0x0dc9de85": { + "type": "function", + "signature": "function affilliateWithdraw(address[] tokens)", + "selector": "0x0dc9de85" + }, + "0x9779d1a6": { + "type": "function", + "signature": "function approvedTargets(address) view returns (bool)", + "selector": "0x9779d1a6" + }, + "0xd408f657": { + "type": "function", + "signature": "function feeWhitelist(address) view returns (bool)", + "selector": "0xd408f657" + }, + "0x5de0398e": { + "type": "function", + "signature": "function goodwill() view returns (uint16)", + "selector": "0x5de0398e" + }, + "0x9735a634": { + "type": "function", + "signature": "function setApprovedTargets(address[] targets, bool[] isApproved)", + "selector": "0x9735a634" + }, + "0x3ff428c7": { + "type": "function", + "signature": "function set_affiliate(address _affiliate, bool _status)", + "selector": "0x3ff428c7" + }, + "0xfbec27bf": { + "type": "function", + "signature": "function set_feeWhitelist(address zapAddress, bool status)", + "selector": "0xfbec27bf" + }, + "0x01e980d4": { + "type": "function", + "signature": "function set_new_affiliateSplit(uint256 _new_affiliateSplit)", + "selector": "0x01e980d4" + }, + "0x550bfa56": { + "type": "function", + "signature": "function set_new_goodwill(uint256 _new_goodwill)", + "selector": "0x550bfa56" + }, + "0x75f12b21": { + "type": "function", + "signature": "function stopped() view returns (bool)", + "selector": "0x75f12b21" + }, + "0x1385d24c": { + "type": "function", + "signature": "function toggleContractActive()", + "selector": "0x1385d24c" + }, + "0x18b135e3": { + "type": "function", + "signature": "function totalAffiliateBalance(address) view returns (uint256)", + "selector": "0x18b135e3" + }, + "0x5ecb16cd": { + "type": "function", + "signature": "function withdrawTokens(address[] tokens)", + "selector": "0x5ecb16cd" + }, + "0x56f36dbf": { + "type": "function", + "signature": "function PROXY_GOVERNANCE_TAG() view returns (string)", + "selector": "0x56f36dbf" + }, + "0xf7b456d0": { + "type": "function", + "signature": "function UPGRADE_ACTIVATION_DELAY() view returns (uint256)", + "selector": "0xf7b456d0" + }, + "0x5e3a97e7": { + "type": "function", + "signature": "function addImplementation(address newImplementation, bytes data, bool finalize)", + "selector": "0x5e3a97e7" + }, + "0x439fab91": { + "type": "function", + "signature": "function initialize(bytes) pure", + "selector": "0x439fab91" + }, + "0xe907fa3c": { + "type": "function", + "signature": "function isNotFinalized() view returns (bool notFinal)", + "selector": "0xe907fa3c" + }, + "0x6684b1d6": { + "type": "function", + "signature": "function proxyAcceptGovernance()", + "selector": "0x6684b1d6" + }, + "0xf9bcdde4": { + "type": "function", + "signature": "function proxyCancelNomination()", + "selector": "0xf9bcdde4" + }, + "0xb449ea5d": { + "type": "function", + "signature": "function proxyIsGovernor(address testGovernor) view returns (bool)", + "selector": "0xb449ea5d" + }, + "0x8757653f": { + "type": "function", + "signature": "function proxyNominateNewGovernor(address newGovernor)", + "selector": "0x8757653f" + }, + "0x12f16e6d": { + "type": "function", + "signature": "function proxyRemoveGovernor(address governorForRemoval)", + "selector": "0x12f16e6d" + }, + "0x22175a32": { + "type": "function", + "signature": "function removeImplementation(address newImplementation)", + "selector": "0x22175a32" + }, + "0x7147855d": { + "type": "function", + "signature": "function upgradeTo(address newImplementation, bytes data, bool finalize) payable", + "selector": "0x7147855d" + }, + "0x3e941010": { + "type": "function", + "signature": "function _addReserves(uint256 addAmount) returns (uint256)", + "selector": "0x3e941010" + }, + "0x555bcc40": { + "type": "function", + "signature": "function _setImplementation(address implementation_, bool allowResign, bytes becomeImplementationData)", + "selector": "0x555bcc40" + }, + "0x0933c1ed": { + "type": "function", + "signature": "function delegateToImplementation(bytes data) returns (bytes)", + "selector": "0x0933c1ed" + }, + "0x4487152f": { + "type": "function", + "signature": "function delegateToViewImplementation(bytes data) view returns (bytes)", + "selector": "0x4487152f" + }, + "0x451ee4a1": { + "type": "function", + "signature": "function adjustment() view returns (bool add, uint256 rate, uint256 target, uint256 buffer, uint256 lastBlock)", + "selector": "0x451ee4a1" + }, + "0xcd1234b3": { + "type": "function", + "signature": "function bondInfo(address) view returns (uint256 payout, uint256 vesting, uint256 lastBlock, uint256 truePricePaid)", + "selector": "0xcd1234b3" + }, + "0xd7ccfb0b": { + "type": "function", + "signature": "function bondPrice() view returns (uint256 price_)", + "selector": "0xd7ccfb0b" + }, + "0x3f0fb92f": { + "type": "function", + "signature": "function changeOlympusTreasury(address _olympusTreasury)", + "selector": "0x3f0fb92f" + }, + "0x759076e5": { + "type": "function", + "signature": "function currentDebt() view returns (uint256)", + "selector": "0x759076e5" + }, + "0x4799afda": { + "type": "function", + "signature": "function currentOlympusFee() view returns (uint256 currentFee_)", + "selector": "0x4799afda" + }, + "0xe392a262": { + "type": "function", + "signature": "function debtDecay() view returns (uint256 decay_)", + "selector": "0xe392a262" + }, + "0x8dbdbe6d": { + "type": "function", + "signature": "function deposit(uint256 _amount, uint256 _maxPrice, address _depositor) returns (uint256)", + "selector": "0x8dbdbe6d" + }, + "0xa50603b2": { + "type": "function", + "signature": "function initializeBond(uint256 _controlVariable, uint256 _vestingTerm, uint256 _minimumPrice, uint256 _maxPayout, uint256 _maxDebt, uint256 _initialDebt)", + "selector": "0xa50603b2" + }, + "0xf5c2ab5b": { + "type": "function", + "signature": "function lastDecay() view returns (uint256)", + "selector": "0xf5c2ab5b" + }, + "0xe0176de8": { + "type": "function", + "signature": "function maxPayout() view returns (uint256)", + "selector": "0xe0176de8" + }, + "0xa9bc6b71": { + "type": "function", + "signature": "function paySubsidy() returns (uint256 payoutSinceLastSubsidy_)", + "selector": "0xa9bc6b71" + }, + "0x7927ebf8": { + "type": "function", + "signature": "function payoutFor(uint256 _value) view returns (uint256 _payout, uint256 _fee)", + "selector": "0x7927ebf8" + }, + "0x01b88ee8": { + "type": "function", + "signature": "function pendingPayoutFor(address _depositor) view returns (uint256 pendingPayout_)", + "selector": "0x01b88ee8" + }, + "0x507930ec": { + "type": "function", + "signature": "function percentVestedFor(address _depositor) view returns (uint256 percentVested_)", + "selector": "0x507930ec" + }, + "0x0505c8c9": { + "type": "function", + "signature": "function policy() view returns (address)", + "selector": "0x0505c8c9" + }, + "0x95a2251f": { + "type": "function", + "signature": "function redeem(address _depositor) returns (uint256)", + "selector": "0x95a2251f" + }, + "0x1a3d0068": { + "type": "function", + "signature": "function setAdjustment(bool _addition, uint256 _increment, uint256 _target, uint256 _buffer)", + "selector": "0x1a3d0068" + }, + "0x1e321a0f": { + "type": "function", + "signature": "function setBondTerms(uint8 _parameter, uint256 _input)", + "selector": "0x1e321a0f" + }, + "0xd5025625": { + "type": "function", + "signature": "function terms() view returns (uint256 controlVariable, uint256 vestingTerm, uint256 minimumPrice, uint256 maxPayout, uint256 maxDebt)", + "selector": "0xd5025625" + }, + "0x2bab6bde": { + "type": "function", + "signature": "function totalPayoutGiven() view returns (uint256)", + "selector": "0x2bab6bde" + }, + "0x7cbe044c": { + "type": "function", + "signature": "function totalPrincipalBonded() view returns (uint256)", + "selector": "0x7cbe044c" + }, + "0x3bfdd7de": { + "type": "function", + "signature": "function transferManagment(address _newOwner)", + "selector": "0x3bfdd7de" + }, + "0x0a748489": { + "type": "function", + "signature": "function trueBondPrice() view returns (uint256 price_)", + "selector": "0x0a748489" + }, + "0x02e371de": { + "type": "function", + "signature": "function COMPONENT_1() view returns (address)", + "selector": "0x02e371de" + }, + "0xb7dec1b7": { + "type": "function", + "signature": "function GENESIS() view returns (address)", + "selector": "0xb7dec1b7" + }, + "0x51464e29": { + "type": "function", + "signature": "function PSILOCYBIN() view returns (address)", + "selector": "0x51464e29" + }, + "0x7b4382cd": { + "type": "function", + "signature": "function TOKEN_CONTRACTS(uint256) view returns (address)", + "selector": "0x7b4382cd" + }, + "0xbed08e0b": { + "type": "function", + "signature": "function batchStake(uint256[] _ids, uint8 _tokenType)", + "selector": "0xbed08e0b" + }, + "0x6fd6da6f": { + "type": "function", + "signature": "function batchTimeSinceStaked(uint8 _tokenType, uint256[] _ids) view returns (uint256[])", + "selector": "0x6fd6da6f" + }, + "0x1b38e212": { + "type": "function", + "signature": "function batchUnstake(uint256[] _ids, uint8 _tokenType)", + "selector": "0x1b38e212" + }, + "0x4432c4e4": { + "type": "function", + "signature": "function delegatedBatchUnstake(uint256[] _ids, uint8 _tokenType)", + "selector": "0x4432c4e4" + }, + "0xef216af3": { + "type": "function", + "signature": "function delegatedUnstake(uint256 _id, uint8 _tokenType)", + "selector": "0xef216af3" + }, + "0xa7433cf5": { + "type": "function", + "signature": "function getStakedTokens(address _owner, uint8 _tokenType) view returns (uint256[])", + "selector": "0xa7433cf5" + }, + "0x3e28391d": { + "type": "function", + "signature": "function isDelegated(address _a) view returns (bool)", + "selector": "0x3e28391d" + }, + "0x86fbad9c": { + "type": "function", + "signature": "function isStaked(address _owner, uint8 _tokenType, uint256 _id) view returns (bool)", + "selector": "0x86fbad9c" + }, + "0x4cb2c889": { + "type": "function", + "signature": "function setDelegated(address _a, bool _bool)", + "selector": "0x4cb2c889" + }, + "0x77d03e74": { + "type": "function", + "signature": "function stakedBalance(address _owner, uint8 _tokenType) view returns (uint256)", + "selector": "0x77d03e74" + }, + "0x92f69aee": { + "type": "function", + "signature": "function timeSinceStaked(uint8 _tokenType, uint256 _id) view returns (uint256)", + "selector": "0x92f69aee" + }, + "0xf376d0de": { + "type": "function", + "signature": "function tokenInfo(uint8, uint256) view returns (address owner, uint256 timeStaked)", + "selector": "0xf376d0de" + }, + "0xbc9699f1": { + "type": "function", + "signature": "function unstake(uint256 _id, uint8 _tokenType)", + "selector": "0xbc9699f1" + }, + "0x42f1181e": { + "type": "function", + "signature": "function addAuthorizedAddress(address target)", + "selector": "0x42f1181e" + }, + "0x494503d4": { + "type": "function", + "signature": "function authorities(uint256) view returns (address)", + "selector": "0x494503d4" + }, + "0x70712939": { + "type": "function", + "signature": "function removeAuthorizedAddress(address target)", + "selector": "0x70712939" + }, + "0xb9181611": { + "type": "function", + "signature": "function authorized(address) view returns (bool)", + "selector": "0xb9181611" + }, + "0xd39de6e9": { + "type": "function", + "signature": "function getAuthorizedAddresses() view returns (address[])", + "selector": "0xd39de6e9" + }, + "0x74c1d7d3": { + "type": "function", + "signature": "function _best(address, address) view returns (uint256)", + "selector": "0x74c1d7d3" + }, + "0x91be90c8": { + "type": "function", + "signature": "function _dust(address) view returns (uint256)", + "selector": "0x91be90c8" + }, + "0xa78d4316": { + "type": "function", + "signature": "function _near(uint256) view returns (uint256)", + "selector": "0xa78d4316" + }, + "0xc2d526aa": { + "type": "function", + "signature": "function _rank(uint256) view returns (uint256 next, uint256 prev, uint256 delb)", + "selector": "0xc2d526aa" + }, + "0x677170e1": { + "type": "function", + "signature": "function _span(address, address) view returns (uint256)", + "selector": "0x677170e1" + }, + "0xbf7e214f": { + "type": "function", + "signature": "function authority() view returns (address)", + "selector": "0xbf7e214f" + }, + "0x779997c3": { + "type": "function", + "signature": "function bump(bytes32 id_)", + "selector": "0x779997c3" + }, + "0xd6febde8": { + "type": "function", + "signature": "function buy(uint256 id, uint256 amount) returns (bool)", + "selector": "0xd6febde8" + }, + "0x8185402b": { + "type": "function", + "signature": "function buyAllAmount(address buy_gem, uint256 buy_amt, address pay_gem, uint256 max_fill_amount) returns (uint256 fill_amt)", + "selector": "0x8185402b" + }, + "0xf582d293": { + "type": "function", + "signature": "function buyEnabled() view returns (bool)", + "selector": "0xf582d293" + }, + "0x40e58ee5": { + "type": "function", + "signature": "function cancel(uint256 id) returns (bool success)", + "selector": "0x40e58ee5" + }, + "0x6377ebca": { + "type": "function", + "signature": "function close_time() view returns (uint64)", + "selector": "0x6377ebca" + }, + "0x467f0b7b": { + "type": "function", + "signature": "function del_rank(uint256 id) returns (bool)", + "selector": "0x467f0b7b" + }, + "0x56ad8764": { + "type": "function", + "signature": "function dustId() view returns (uint256)", + "selector": "0x56ad8764" + }, + "0x0374fc6f": { + "type": "function", + "signature": "function getBestOffer(address sell_gem, address buy_gem) view returns (uint256)", + "selector": "0x0374fc6f" + }, + "0x911550f4": { + "type": "function", + "signature": "function getBetterOffer(uint256 id) view returns (uint256)", + "selector": "0x911550f4" + }, + "0x144a2752": { + "type": "function", + "signature": "function getBuyAmount(address buy_gem, address pay_gem, uint256 pay_amt) view returns (uint256 fill_amt)", + "selector": "0x144a2752" + }, + "0x8af82a2e": { + "type": "function", + "signature": "function getFirstUnsortedOffer() view returns (uint256)", + "selector": "0x8af82a2e" + }, + "0x511fa487": { + "type": "function", + "signature": "function getMinSell(address pay_gem) view returns (uint256)", + "selector": "0x511fa487" + }, + "0x61f54a79": { + "type": "function", + "signature": "function getNextUnsortedOffer(uint256 id) view returns (uint256)", + "selector": "0x61f54a79" + }, + "0x4579268a": { + "type": "function", + "signature": "function getOffer(uint256 id) view returns (uint256, address, uint256, address)", + "selector": "0x4579268a" + }, + "0x7ca9429a": { + "type": "function", + "signature": "function getOfferCount(address sell_gem, address buy_gem) view returns (uint256)", + "selector": "0x7ca9429a" + }, + "0xc41a360a": { + "type": "function", + "signature": "function getOwner(uint256 id) view returns (address owner)", + "selector": "0xc41a360a" + }, + "0xff1fd974": { + "type": "function", + "signature": "function getPayAmount(address pay_gem, address buy_gem, uint256 buy_amt) view returns (uint256 fill_amt)", + "selector": "0xff1fd974" + }, + "0x557ed1ba": { + "type": "function", + "signature": "function getTime() view returns (uint64)", + "selector": "0x557ed1ba" + }, + "0x943911bc": { + "type": "function", + "signature": "function getWorseOffer(uint256 id) view returns (uint256)", + "selector": "0x943911bc" + }, + "0x1d834a1b": { + "type": "function", + "signature": "function insert(uint256 id, uint256 pos) returns (bool)", + "selector": "0x1d834a1b" + }, + "0x82afd23b": { + "type": "function", + "signature": "function isActive(uint256 id) view returns (bool active)", + "selector": "0x82afd23b" + }, + "0xc2b6b58c": { + "type": "function", + "signature": "function isClosed() view returns (bool closed)", + "selector": "0xc2b6b58c" + }, + "0xd2b420ce": { + "type": "function", + "signature": "function isOfferSorted(uint256 id) view returns (bool)", + "selector": "0xd2b420ce" + }, + "0xb4f9b6c8": { + "type": "function", + "signature": "function kill(bytes32 id)", + "selector": "0xb4f9b6c8" + }, + "0x232cae0b": { + "type": "function", + "signature": "function last_offer_id() view returns (uint256)", + "selector": "0x232cae0b" + }, + "0x093f5198": { + "type": "function", + "signature": "function make(address pay_gem, address buy_gem, uint128 pay_amt, uint128 buy_amt) returns (bytes32)", + "selector": "0x093f5198" + }, + "0x01492a0b": { + "type": "function", + "signature": "function matchingEnabled() view returns (bool)", + "selector": "0x01492a0b" + }, + "0x1b33d412": { + "type": "function", + "signature": "function offer(uint256 pay_amt, address pay_gem, uint256 buy_amt, address buy_gem, uint256 pos) returns (uint256)", + "selector": "0x1b33d412" + }, + "0xe1a6f014": { + "type": "function", + "signature": "function offer(uint256 pay_amt, address pay_gem, uint256 buy_amt, address buy_gem, uint256 pos, bool rounding) returns (uint256)", + "selector": "0xe1a6f014" + }, + "0xf09ea2a6": { + "type": "function", + "signature": "function offer(uint256 pay_amt, address pay_gem, uint256 buy_amt, address buy_gem) returns (uint256)", + "selector": "0xf09ea2a6" + }, + "0x8a72ea6a": { + "type": "function", + "signature": "function offers(uint256) view returns (uint256 pay_amt, address pay_gem, uint256 buy_amt, address buy_gem, address owner, uint64 timestamp)", + "selector": "0x8a72ea6a" + }, + "0x0621b4f6": { + "type": "function", + "signature": "function sellAllAmount(address pay_gem, uint256 pay_amt, address buy_gem, uint256 min_fill_amount) returns (uint256 fill_amt)", + "selector": "0x0621b4f6" + }, + "0x7a9e5e4b": { + "type": "function", + "signature": "function setAuthority(address authority_)", + "selector": "0x7a9e5e4b" + }, + "0xd6f15469": { + "type": "function", + "signature": "function setBuyEnabled(bool buyEnabled_) returns (bool)", + "selector": "0xd6f15469" + }, + "0x2aed1905": { + "type": "function", + "signature": "function setMatchingEnabled(bool matchingEnabled_) returns (bool)", + "selector": "0x2aed1905" + }, + "0xbf7c734e": { + "type": "function", + "signature": "function setMinSell(address pay_gem, uint256 dust) returns (bool)", + "selector": "0xbf7c734e" + }, + "0x49606455": { + "type": "function", + "signature": "function take(bytes32 id, uint128 maxTakeAmount)", + "selector": "0x49606455" + }, + "0x7234d8f2": { + "type": "function", + "signature": "function KIND_AUCTION() view returns (uint8)", + "selector": "0x7234d8f2" + }, + "0xe1784a02": { + "type": "function", + "signature": "function KIND_BUY() view returns (uint8)", + "selector": "0xe1784a02" + }, + "0x25593ac2": { + "type": "function", + "signature": "function KIND_SELL() view returns (uint8)", + "selector": "0x25593ac2" + }, + "0x7ae1ace0": { + "type": "function", + "signature": "function OP_ACCEPT_AUCTION() view returns (uint8)", + "selector": "0x7ae1ace0" + }, + "0x11f0794c": { + "type": "function", + "signature": "function OP_ACCEPT_BUY() view returns (uint8)", + "selector": "0x11f0794c" + }, + "0x81787a85": { + "type": "function", + "signature": "function OP_BID() view returns (uint8)", + "selector": "0x81787a85" + }, + "0xeb374261": { + "type": "function", + "signature": "function OP_BUY() view returns (uint8)", + "selector": "0xeb374261" + }, + "0x9e57feb5": { + "type": "function", + "signature": "function OP_CANCEL_BUY() view returns (uint8)", + "selector": "0x9e57feb5" + }, + "0x6acc65db": { + "type": "function", + "signature": "function OP_COMPLETE_AUCTION() view returns (uint8)", + "selector": "0x6acc65db" + }, + "0xb50a2a55": { + "type": "function", + "signature": "function OP_COMPLETE_BUY() view returns (uint8)", + "selector": "0xb50a2a55" + }, + "0x8f18439e": { + "type": "function", + "signature": "function OP_COMPLETE_SELL() view returns (uint8)", + "selector": "0x8f18439e" + }, + "0xf0954160": { + "type": "function", + "signature": "function OP_MAX() view returns (uint8)", + "selector": "0xf0954160" + }, + "0x90c2b10e": { + "type": "function", + "signature": "function OP_MIN() view returns (uint8)", + "selector": "0x90c2b10e" + }, + "0x1bb03ca9": { + "type": "function", + "signature": "function OP_REJECT_BUY() view returns (uint8)", + "selector": "0x1bb03ca9" + }, + "0x0873c6ec": { + "type": "function", + "signature": "function RATE_BASE() view returns (uint256)", + "selector": "0x0873c6ec" + }, + "0x5a4e5a15": { + "type": "function", + "signature": "function STATUS_CANCELLED() view returns (uint8)", + "selector": "0x5a4e5a15" + }, + "0x740db280": { + "type": "function", + "signature": "function STATUS_DONE() view returns (uint8)", + "selector": "0x740db280" + }, + "0x24f8515b": { + "type": "function", + "signature": "function STATUS_OPEN() view returns (uint8)", + "selector": "0x24f8515b" + }, + "0xf0d250ba": { + "type": "function", + "signature": "function TOKEN_1155() view returns (uint8)", + "selector": "0xf0d250ba" + }, + "0xc477be20": { + "type": "function", + "signature": "function TOKEN_721() view returns (uint8)", + "selector": "0xc477be20" + }, + "0x853ca41a": { + "type": "function", + "signature": "function TOKEN_MINT() view returns (uint8)", + "selector": "0x853ca41a" + }, + "0xc1c30e80": { + "type": "function", + "signature": "function cancelBuys(uint256[] ids)", + "selector": "0xc1c30e80" + }, + "0x3ed9ffb7": { + "type": "function", + "signature": "function couponSpent(uint256) view returns (bool)", + "selector": "0x3ed9ffb7" + }, + "0xe7d4a999": { + "type": "function", + "signature": "function emergencyCancelAuction(uint256 id, bool noBundle)", + "selector": "0xe7d4a999" + }, + "0xf5116bc9": { + "type": "function", + "signature": "function hasInv(uint256 id) view returns (bool)", + "selector": "0xf5116bc9" + }, + "0xac5e2cb1": { + "type": "function", + "signature": "function hasSignedIntention(uint8 op) pure returns (bool)", + "selector": "0xac5e2cb1" + }, + "0x80bc688f": { + "type": "function", + "signature": "function inCaseMoneyGetsStuck(address to, address currency, uint256 amount)", + "selector": "0x80bc688f" + }, + "0xcd78ba01": { + "type": "function", + "signature": "function inventories(uint256) view returns (address seller, address buyer, address currency, uint256 price, uint256 netPrice, uint256 deadline, uint8 kind, uint8 status)", + "selector": "0xcd78ba01" + }, + "0x5fd34298": { + "type": "function", + "signature": "function inventoryTokenCounts(uint256) view returns (uint256)", + "selector": "0x5fd34298" + }, + "0xb4533aad": { + "type": "function", + "signature": "function inventoryTokens(uint256, uint256) view returns (address token, uint256 tokenId, uint256 amount, uint8 kind, bytes mintData)", + "selector": "0xb4533aad" + }, + "0x8704f2a3": { + "type": "function", + "signature": "function isAuction(uint256 id) view returns (bool)", + "selector": "0x8704f2a3" + }, + "0x0ad48628": { + "type": "function", + "signature": "function isAuctionOpen(uint256 id) view returns (bool)", + "selector": "0x0ad48628" + }, + "0xf4a33e0d": { + "type": "function", + "signature": "function isBundleApproved(uint256 invId, address owner) view returns (bool)", + "selector": "0xf4a33e0d" + }, + "0xa80d33fb": { + "type": "function", + "signature": "function isBuy(uint256 id) view returns (bool)", + "selector": "0xa80d33fb" + }, + "0xbdf52b45": { + "type": "function", + "signature": "function isBuyOpen(uint256 id) view returns (bool)", + "selector": "0xbdf52b45" + }, + "0xd9548e53": { + "type": "function", + "signature": "function isExpired(uint256 id) view returns (bool)", + "selector": "0xd9548e53" + }, + "0x1b01e72c": { + "type": "function", + "signature": "function isSell(uint256 id) view returns (bool)", + "selector": "0x1b01e72c" + }, + "0x781dc70a": { + "type": "function", + "signature": "function isSignatureValid(bytes signature, bytes32 hash, address signer) pure returns (bool)", + "selector": "0x781dc70a" + }, + "0xee98ce91": { + "type": "function", + "signature": "function isStatusOpen(uint256 id) view returns (bool)", + "selector": "0xee98ce91" + }, + "0x2bcd27df": { + "type": "function", + "signature": "function marketSigners(address) view returns (bool)", + "selector": "0x2bcd27df" + }, + "0x54134876": { + "type": "function", + "signature": "function minAuctionDuration() view returns (uint256)", + "selector": "0x54134876" + }, + "0x708d4d35": { + "type": "function", + "signature": "function minAuctionIncrement() view returns (uint256)", + "selector": "0x708d4d35" + }, + "0xba847759": { + "type": "function", + "signature": "function run(tuple(address user, tuple(address token, uint256 tokenId, uint256 amount, uint8 kind, bytes mintData)[] bundle, address currency, uint256 price, uint256 deadline, bytes32 salt, uint8 kind) intent, tuple(bytes32 intentionHash, address signer, uint256 txDeadline, bytes32 salt, uint256 id, uint8 opcode, address caller, address currency, uint256 price, uint256 incentiveRate, tuple(uint256[] coupons, uint256 feeRate, uint256 royaltyRate, uint256 buyerCashbackRate, address feeAddress, address royaltyAddress) settlement, tuple(address token, uint256 tokenId, uint256 amount, uint8 kind, bytes mintData)[] bundle, uint256 deadline) detail, bytes sigIntent, bytes sigDetail) payable", + "selector": "0xba847759" + }, + "0xafd76a0b": { + "type": "function", + "signature": "function send(address to, tuple(address token, uint256 tokenId)[] tokens)", + "selector": "0xafd76a0b" + }, + "0xe91274f3": { + "type": "function", + "signature": "function swap(tuple(bytes32 salt, address creator, uint256 deadline, tuple(address token, uint256 tokenId)[] has, tuple(address token, uint256 tokenId)[] wants) req, bytes signature)", + "selector": "0xe91274f3" + }, + "0x015af8ee": { + "type": "function", + "signature": "function updateSettings(uint256 minAuctionIncrement_, uint256 minAuctionDuration_)", + "selector": "0x015af8ee" + }, + "0xf460590b": { + "type": "function", + "signature": "function updateSigner(address addr, bool remove)", + "selector": "0xf460590b" + }, + "0x9120491c": { + "type": "function", + "signature": "function donate(tuple(address token, uint256 amount, address dest)[] _donations) payable", + "selector": "0x9120491c" + }, + "0xaf933b57": { + "type": "function", + "signature": "function withdrawEther(address _dest)", + "selector": "0xaf933b57" + }, + "0x3aeac4e1": { + "type": "function", + "signature": "function withdrawToken(address _tokenAddress, address _dest)", + "selector": "0x3aeac4e1" + }, + "0x1d572320": { + "type": "function", + "signature": "function ZapIn(address _toWhomToIssue, address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount, uint256 _minPoolTokens) payable returns (uint256)", + "selector": "0x1d572320" + }, + "0xb2bdfa7b": { + "type": "function", + "signature": "function _owner() view returns (address)", + "selector": "0xb2bdfa7b" + }, + "0x8d7e41a8": { + "type": "function", + "signature": "function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) pure returns (uint256)", + "selector": "0x8d7e41a8" + }, + "0x3f975d5f": { + "type": "function", + "signature": "function canSwapFromV1(address _fromToken, address _toToken, uint256 fromAmount, uint256 toAmount) view returns (bool)", + "selector": "0x3f975d5f" + }, + "0xf27cf320": { + "type": "function", + "signature": "function canSwapFromV2(address _fromToken, address _toToken) view returns (bool)", + "selector": "0xf27cf320" + }, + "0x551196d5": { + "type": "function", + "signature": "function inCaseTokengetsStuck(address _TokenAddress)", + "selector": "0x551196d5" + }, + "0xb10e1dbc": { + "type": "function", + "signature": "function set_new_goodwill(uint16 _new_goodwill)", + "selector": "0xb10e1dbc" + }, + "0x01a12fd3": { + "type": "function", + "signature": "function removeAlerter(address alerter)", + "selector": "0x01a12fd3" + }, + "0x238dafe0": { + "type": "function", + "signature": "function enabled() view returns (bool)", + "selector": "0x238dafe0" + }, + "0x27a099d8": { + "type": "function", + "signature": "function getOperators() view returns (address[])", + "selector": "0x27a099d8" + }, + "0x29589f61": { + "type": "function", + "signature": "function tradeWithHint(address src, uint256 srcAmount, address dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId, bytes hint) payable returns (uint256)", + "selector": "0x29589f61" + }, + "0x3bba21dc": { + "type": "function", + "signature": "function swapTokenToEther(address token, uint256 srcAmount, uint256 minConversionRate) returns (uint256)", + "selector": "0x3bba21dc" + }, + "0x3ccdbb28": { + "type": "function", + "signature": "function withdrawToken(address token, uint256 amount, address sendTo)", + "selector": "0x3ccdbb28" + }, + "0x3de39c11": { + "type": "function", + "signature": "function maxGasPrice() view returns (uint256)", + "selector": "0x3de39c11" + }, + "0x408ee7fe": { + "type": "function", + "signature": "function addAlerter(address newAlerter)", + "selector": "0x408ee7fe" + }, + "0x4f61ff8b": { + "type": "function", + "signature": "function kyberNetworkContract() view returns (address)", + "selector": "0x4f61ff8b" + }, + "0x6432679f": { + "type": "function", + "signature": "function getUserCapInWei(address user) view returns (uint256)", + "selector": "0x6432679f" + }, + "0x7409e2eb": { + "type": "function", + "signature": "function swapTokenToToken(address src, uint256 srcAmount, address dest, uint256 minConversionRate) returns (uint256)", + "selector": "0x7409e2eb" + }, + "0x75829def": { + "type": "function", + "signature": "function transferAdmin(address newAdmin)", + "selector": "0x75829def" + }, + "0x77f50f97": { + "type": "function", + "signature": "function claimAdmin()", + "selector": "0x77f50f97" + }, + "0x7a2a0456": { + "type": "function", + "signature": "function swapEtherToToken(address token, uint256 minConversionRate) payable returns (uint256)", + "selector": "0x7a2a0456" + }, + "0x7acc8678": { + "type": "function", + "signature": "function transferAdminQuickly(address newAdmin)", + "selector": "0x7acc8678" + }, + "0x7c423f54": { + "type": "function", + "signature": "function getAlerters() view returns (address[])", + "selector": "0x7c423f54" + }, + "0x809a9e55": { + "type": "function", + "signature": "function getExpectedRate(address src, address dest, uint256 srcQty) view returns (uint256 expectedRate, uint256 slippageRate)", + "selector": "0x809a9e55" + }, + "0x8eaaeecf": { + "type": "function", + "signature": "function getUserCapInTokenWei(address user, address token) view returns (uint256)", + "selector": "0x8eaaeecf" + }, + "0xabd188a8": { + "type": "function", + "signature": "function setKyberNetworkContract(address _kyberNetworkContract)", + "selector": "0xabd188a8" + }, + "0xb64a097e": { + "type": "function", + "signature": "function info(bytes32 field) view returns (uint256)", + "selector": "0xb64a097e" + }, + "0xcb3c28c7": { + "type": "function", + "signature": "function trade(address src, uint256 srcAmount, address dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId) payable returns (uint256)", + "selector": "0xcb3c28c7" + }, + "0xce56c454": { + "type": "function", + "signature": "function withdrawEther(uint256 amount, address sendTo)", + "selector": "0xce56c454" + }, + "0xa461b3c8": { + "type": "function", + "signature": "function initialize(string _name, string _symbol, address[4] _coins, uint256[4] _rate_multipliers, uint256 _A, uint256 _fee)", + "selector": "0xa461b3c8" + }, + "0x4903b0d1": { + "type": "function", + "signature": "function balances(uint256 arg0) view returns (uint256)", + "selector": "0x4903b0d1" + }, + "0x14f05979": { + "type": "function", + "signature": "function get_balances() view returns (uint256[2])", + "selector": "0x14f05979" + }, + "0x76a2f0f0": { + "type": "function", + "signature": "function A_precise() view returns (uint256)", + "selector": "0x76a2f0f0" + }, + "0xed8e84f3": { + "type": "function", + "signature": "function calc_token_amount(uint256[2] _amounts, bool _is_deposit) view returns (uint256)", + "selector": "0xed8e84f3" + }, + "0x0c3e4b54": { + "type": "function", + "signature": "function add_liquidity(uint256[2] _amounts, uint256 _min_mint_amount, address _receiver) returns (uint256)", + "selector": "0x0c3e4b54" + }, + "0xddc1f59d": { + "type": "function", + "signature": "function exchange(int128 i, int128 j, uint256 _dx, uint256 _min_dy, address _receiver) returns (uint256)", + "selector": "0xddc1f59d" + }, + "0x5b36389c": { + "type": "function", + "signature": "function remove_liquidity(uint256 _amount, uint256[2] min_amounts)", + "selector": "0x5b36389c" + }, + "0x3eb1719f": { + "type": "function", + "signature": "function remove_liquidity(uint256 _burn_amount, uint256[2] _min_amounts, address _receiver) returns (uint256[2])", + "selector": "0x3eb1719f" + }, + "0x52d2cfdd": { + "type": "function", + "signature": "function remove_liquidity_imbalance(uint256[2] _amounts, uint256 _max_burn_amount, address _receiver) returns (uint256)", + "selector": "0x52d2cfdd" + }, + "0xcc2b27d7": { + "type": "function", + "signature": "function calc_withdraw_one_coin(uint256 _burn_amount, int128 i) view returns (uint256)", + "selector": "0xcc2b27d7" + }, + "0x1a4d01d2": { + "type": "function", + "signature": "function remove_liquidity_one_coin(uint256 _burn_amount, int128 i, uint256 _min_received) returns (uint256)", + "selector": "0x1a4d01d2" + }, + "0x081579a5": { + "type": "function", + "signature": "function remove_liquidity_one_coin(uint256 _burn_amount, int128 i, uint256 _min_received, address _receiver) returns (uint256)", + "selector": "0x081579a5" + }, + "0x3c157e64": { + "type": "function", + "signature": "function ramp_A(uint256 _future_A, uint256 _future_time)", + "selector": "0x3c157e64" + }, + "0x551a6588": { + "type": "function", + "signature": "function stop_ramp_A()", + "selector": "0x551a6588" + }, + "0xc6610657": { + "type": "function", + "signature": "function coins(uint256 i) view returns (address)", + "selector": "0xc6610657" + }, + "0xe2e7d264": { + "type": "function", + "signature": "function admin_balances(uint256 i) view returns (uint256)", + "selector": "0xe2e7d264" + }, + "0x5409491a": { + "type": "function", + "signature": "function initial_A() view returns (uint256)", + "selector": "0x5409491a" + }, + "0x2081066c": { + "type": "function", + "signature": "function initial_A_time() view returns (uint256)", + "selector": "0x2081066c" + }, + "0x14052288": { + "type": "function", + "signature": "function future_A_time() view returns (uint256)", + "selector": "0x14052288" + }, + "0xb1373929": { + "type": "function", + "signature": "function gamma() view returns (uint256)", + "selector": "0xb1373929" + }, + "0x5b41b908": { + "type": "function", + "signature": "function exchange(uint256 i, uint256 j, uint256 dx, uint256 min_dy) payable returns (uint256)", + "selector": "0x5b41b908" + }, + "0x394747c5": { + "type": "function", + "signature": "function exchange(uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth) payable returns (uint256)", + "selector": "0x394747c5" + }, + "0x65b2489b": { + "type": "function", + "signature": "function exchange_underlying(uint256 i, uint256 j, uint256 dx, uint256 min_dy) payable returns (uint256)", + "selector": "0x65b2489b" + }, + "0x556d6e9f": { + "type": "function", + "signature": "function get_dy(uint256 i, uint256 j, uint256 dx) view returns (uint256)", + "selector": "0x556d6e9f" + }, + "0xee22be23": { + "type": "function", + "signature": "function add_liquidity(uint256[2] amounts, uint256 min_mint_amount, bool use_eth) payable returns (uint256)", + "selector": "0xee22be23" + }, + "0x269b5581": { + "type": "function", + "signature": "function remove_liquidity(uint256 _amount, uint256[2] min_amounts, bool use_eth)", + "selector": "0x269b5581" + }, + "0x8d8ea727": { + "type": "function", + "signature": "function calc_token_amount(uint256[2] amounts) view returns (uint256)", + "selector": "0x8d8ea727" + }, + "0x4fb08c5e": { + "type": "function", + "signature": "function calc_withdraw_one_coin(uint256 token_amount, uint256 i) view returns (uint256)", + "selector": "0x4fb08c5e" + }, + "0xf1dc3cc9": { + "type": "function", + "signature": "function remove_liquidity_one_coin(uint256 token_amount, uint256 i, uint256 min_amount) returns (uint256)", + "selector": "0xf1dc3cc9" + }, + "0x8f15b6b5": { + "type": "function", + "signature": "function remove_liquidity_one_coin(uint256 token_amount, uint256 i, uint256 min_amount, bool use_eth) returns (uint256)", + "selector": "0x8f15b6b5" + }, + "0xc93f49e8": { + "type": "function", + "signature": "function claim_admin_fees()", + "selector": "0xc93f49e8" + }, + "0x5e248072": { + "type": "function", + "signature": "function ramp_A_gamma(uint256 future_A, uint256 future_gamma, uint256 future_time)", + "selector": "0x5e248072" + }, + "0x244c7c2e": { + "type": "function", + "signature": "function stop_ramp_A_gamma()", + "selector": "0x244c7c2e" + }, + "0xa43c3351": { + "type": "function", + "signature": "function commit_new_parameters(uint256 _new_mid_fee, uint256 _new_out_fee, uint256 _new_admin_fee, uint256 _new_fee_gamma, uint256 _new_allowed_extra_profit, uint256 _new_adjustment_step, uint256 _new_ma_half_time)", + "selector": "0xa43c3351" + }, + "0x7242e524": { + "type": "function", + "signature": "function set_admin_fee_receiver(address _admin_fee_receiver)", + "selector": "0x7242e524" + }, + "0x54f0f7d5": { + "type": "function", + "signature": "function lp_price() view returns (uint256)", + "selector": "0x54f0f7d5" + }, + "0xb9e8c9fd": { + "type": "function", + "signature": "function price_scale() view returns (uint256)", + "selector": "0xb9e8c9fd" + }, + "0x86fc88d3": { + "type": "function", + "signature": "function price_oracle() view returns (uint256)", + "selector": "0x86fc88d3" + }, + "0xc146bf94": { + "type": "function", + "signature": "function last_prices() view returns (uint256)", + "selector": "0xc146bf94" + }, + "0x6112c747": { + "type": "function", + "signature": "function last_prices_timestamp() view returns (uint256)", + "selector": "0x6112c747" + }, + "0x204fe3d5": { + "type": "function", + "signature": "function initial_A_gamma() view returns (uint256)", + "selector": "0x204fe3d5" + }, + "0xf30cfad5": { + "type": "function", + "signature": "function future_A_gamma() view returns (uint256)", + "selector": "0xf30cfad5" + }, + "0xe89876ff": { + "type": "function", + "signature": "function initial_A_gamma_time() view returns (uint256)", + "selector": "0xe89876ff" + }, + "0xf9ed9597": { + "type": "function", + "signature": "function future_A_gamma_time() view returns (uint256)", + "selector": "0xf9ed9597" + }, + "0x49fe9e77": { + "type": "function", + "signature": "function allowed_extra_profit() view returns (uint256)", + "selector": "0x49fe9e77" + }, + "0x727ced57": { + "type": "function", + "signature": "function future_allowed_extra_profit() view returns (uint256)", + "selector": "0x727ced57" + }, + "0x72d4f0e2": { + "type": "function", + "signature": "function fee_gamma() view returns (uint256)", + "selector": "0x72d4f0e2" + }, + "0xd7c3dcbe": { + "type": "function", + "signature": "function future_fee_gamma() view returns (uint256)", + "selector": "0xd7c3dcbe" + }, + "0x083812e5": { + "type": "function", + "signature": "function adjustment_step() view returns (uint256)", + "selector": "0x083812e5" + }, + "0x4ea12c7d": { + "type": "function", + "signature": "function future_adjustment_step() view returns (uint256)", + "selector": "0x4ea12c7d" + }, + "0x662b6274": { + "type": "function", + "signature": "function ma_half_time() view returns (uint256)", + "selector": "0x662b6274" + }, + "0x0c5e23d4": { + "type": "function", + "signature": "function future_ma_half_time() view returns (uint256)", + "selector": "0x0c5e23d4" + }, + "0x92526c0c": { + "type": "function", + "signature": "function mid_fee() view returns (uint256)", + "selector": "0x92526c0c" + }, + "0xee8de675": { + "type": "function", + "signature": "function out_fee() view returns (uint256)", + "selector": "0xee8de675" + }, + "0x7cf9aedc": { + "type": "function", + "signature": "function future_mid_fee() view returns (uint256)", + "selector": "0x7cf9aedc" + }, + "0x7d1b060c": { + "type": "function", + "signature": "function future_out_fee() view returns (uint256)", + "selector": "0x7d1b060c" + }, + "0x0f529ba2": { + "type": "function", + "signature": "function D() view returns (uint256)", + "selector": "0x0f529ba2" + }, + "0x7ba1a74d": { + "type": "function", + "signature": "function xcp_profit() view returns (uint256)", + "selector": "0x7ba1a74d" + }, + "0x0b7b594b": { + "type": "function", + "signature": "function xcp_profit_a() view returns (uint256)", + "selector": "0x0b7b594b" + }, + "0x0c46b72a": { + "type": "function", + "signature": "function virtual_price() view returns (uint256)", + "selector": "0x0c46b72a" + }, + "0x9c868ac0": { + "type": "function", + "signature": "function is_killed() view returns (bool)", + "selector": "0x9c868ac0" + }, + "0x2a426896": { + "type": "function", + "signature": "function kill_deadline() view returns (uint256)", + "selector": "0x2a426896" + }, + "0x6e42e4d2": { + "type": "function", + "signature": "function admin_fee_receiver() view returns (address)", + "selector": "0x6e42e4d2" + }, + "0xb5268389": { + "type": "function", + "signature": "function adapterRemoved(string) view returns (bool)", + "selector": "0xb5268389" + }, + "0xb84f5d1e": { + "type": "function", + "signature": "function adapters(string) view returns (address addr, bytes4 selector, bytes data)", + "selector": "0xb84f5d1e" + }, + "0xc92aecc4": { + "type": "function", + "signature": "function chi() view returns (address)", + "selector": "0xc92aecc4" + }, + "0x558b7dd1": { + "type": "function", + "signature": "function pauseSwaps()", + "selector": "0x558b7dd1" + }, + "0x3ef11fd7": { + "type": "function", + "signature": "function removeAdapter(string aggregatorId)", + "selector": "0x3ef11fd7" + }, + "0x459a39fb": { + "type": "function", + "signature": "function setAdapter(string aggregatorId, address addr, bytes4 selector, bytes data)", + "selector": "0x459a39fb" + }, + "0x5f575529": { + "type": "function", + "signature": "function swap(string aggregatorId, address tokenFrom, uint256 amount, bytes data) payable", + "selector": "0x5f575529" + }, + "0x6b68764c": { + "type": "function", + "signature": "function swapUsingGasToken(string aggregatorId, address tokenFrom, uint256 amount, bytes data) payable", + "selector": "0x6b68764c" + }, + "0x9804a380": { + "type": "function", + "signature": "function unpauseSwaps()", + "selector": "0x9804a380" + }, + "0x1766486d": { + "type": "function", + "signature": "function timeLockedUpgrades(bytes32) view returns (uint256)", + "selector": "0x1766486d" + }, + "0x709a385e": { + "type": "function", + "signature": "function batchTransfer(address[] _tokens, uint256[] _quantities, address _from, address _to)", + "selector": "0x709a385e" + }, + "0x78446bc1": { + "type": "function", + "signature": "function timeLockPeriod() view returns (uint256)", + "selector": "0x78446bc1" + }, + "0x9303b16f": { + "type": "function", + "signature": "function setTimeLockPeriod(uint256 _timeLockPeriod)", + "selector": "0x9303b16f" + }, + "0xa6c4e467": { + "type": "function", + "signature": "function transfer(address _token, uint256 _quantity, address _from, address _to)", + "selector": "0xa6c4e467" + }, + "0x01e33667": { + "type": "function", + "signature": "function withdrawToken(address token, address to, uint256 tokenAmount) returns (bool)", + "selector": "0x01e33667" + }, + "0x72e98a79": { + "type": "function", + "signature": "function transferBZxOwnership(address newBZxContractAddress)", + "selector": "0x72e98a79" + }, + "0xe4a72b13": { + "type": "function", + "signature": "function bZxContractAddress() view returns (address)", + "selector": "0xe4a72b13" + }, + "0xe5994905": { + "type": "function", + "signature": "function transferTokenFrom(address token, address from, address to, uint256 tokenAmount) returns (bool)", + "selector": "0xe5994905" + }, + "0xfb0f97a8": { + "type": "function", + "signature": "function depositToken(address token, address from, uint256 tokenAmount) returns (bool)", + "selector": "0xfb0f97a8" + }, + "0x0a19b14a": { + "type": "function", + "signature": "function trade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount)", + "selector": "0x0a19b14a" + }, + "0x0b927666": { + "type": "function", + "signature": "function order(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce)", + "selector": "0x0b927666" + }, + "0x19774d43": { + "type": "function", + "signature": "function orderFills(address, bytes32) view returns (uint256)", + "selector": "0x19774d43" + }, + "0x278b8c0e": { + "type": "function", + "signature": "function cancelOrder(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, uint8 v, bytes32 r, bytes32 s)", + "selector": "0x278b8c0e" + }, + "0x46be96c3": { + "type": "function", + "signature": "function amountFilled(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s) view returns (uint256)", + "selector": "0x46be96c3" + }, + "0x54d03b5c": { + "type": "function", + "signature": "function changeFeeMake(uint256 feeMake_)", + "selector": "0x54d03b5c" + }, + "0x57786394": { + "type": "function", + "signature": "function feeMake() view returns (uint256)", + "selector": "0x57786394" + }, + "0x5e1d7ae4": { + "type": "function", + "signature": "function changeFeeRebate(uint256 feeRebate_)", + "selector": "0x5e1d7ae4" + }, + "0x6c86888b": { + "type": "function", + "signature": "function testTrade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount, address sender) view returns (bool)", + "selector": "0x6c86888b" + }, + "0x71ffcb16": { + "type": "function", + "signature": "function changeFeeAccount(address feeAccount_)", + "selector": "0x71ffcb16" + }, + "0x731c2f81": { + "type": "function", + "signature": "function feeRebate() view returns (uint256)", + "selector": "0x731c2f81" + }, + "0x8823a9c0": { + "type": "function", + "signature": "function changeFeeTake(uint256 feeTake_)", + "selector": "0x8823a9c0" + }, + "0x9e281a98": { + "type": "function", + "signature": "function withdrawToken(address token, uint256 amount)", + "selector": "0x9e281a98" + }, + "0xbb5f4629": { + "type": "function", + "signature": "function orders(address, bytes32) view returns (bool)", + "selector": "0xbb5f4629" + }, + "0xc281309e": { + "type": "function", + "signature": "function feeTake() view returns (uint256)", + "selector": "0xc281309e" + }, + "0xe8f6bc2e": { + "type": "function", + "signature": "function changeAccountLevelsAddr(address accountLevelsAddr_)", + "selector": "0xe8f6bc2e" + }, + "0xf3412942": { + "type": "function", + "signature": "function accountLevelsAddr() view returns (address)", + "selector": "0xf3412942" + }, + "0xfb6e155f": { + "type": "function", + "signature": "function availableVolume(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s) view returns (uint256)", + "selector": "0xfb6e155f" + }, + "0x6d98ebe3": { + "type": "function", + "signature": "function STARKWARE_CONTRACT() view returns (address)", + "selector": "0x6d98ebe3" + }, + "0x27cc37b0": { + "type": "function", + "signature": "function deposit(uint256 depositAmount, uint256 starkKey, uint256 positionId, bytes signature)", + "selector": "0x27cc37b0" + }, + "0x9f2c365a": { + "type": "function", + "signature": "function depositERC20(address tokenFrom, uint256 tokenFromAmount, uint256 starkKey, uint256 positionId, address exchangeProxy, bytes exchangeProxyData, bytes signature) returns (uint256)", + "selector": "0x9f2c365a" + }, + "0xe1e1a91a": { + "type": "function", + "signature": "function depositEth(uint256 starkKey, uint256 positionId, address exchangeProxy, bytes exchangeProxyData, bytes signature) payable returns (uint256)", + "selector": "0xe1e1a91a" + }, + "0x572b6c05": { + "type": "function", + "signature": "function isTrustedForwarder(address forwarder) view returns (bool)", + "selector": "0x572b6c05" + }, + "0x1bf33004": { + "type": "function", + "signature": "function acceptSwap(uint256 swapId)", + "selector": "0x1bf33004" + }, + "0x54d6a2b7": { + "type": "function", + "signature": "function cancelSwap(uint256 swapId)", + "selector": "0x54d6a2b7" + }, + "0xdbd6dd5f": { + "type": "function", + "signature": "function initiateSwap(uint256 swapId, address[] nftAddresses, uint256[] nftIds) payable", + "selector": "0xdbd6dd5f" + }, + "0x55a36d56": { + "type": "function", + "signature": "function proposeSwap(address secondUser, address[] nftAddresses, uint256[] nftIds) payable", + "selector": "0x55a36d56" + }, + "0x7ea5482a": { + "type": "function", + "signature": "function setAppFee(uint256 newFee)", + "selector": "0x7ea5482a" + }, + "0x1247ae58": { + "type": "function", + "signature": "function filled_subtrees() view returns (uint256[])", + "selector": "0x1247ae58" + }, + "0x1f79a1e9": { + "type": "function", + "signature": "function nullifierHashes(uint256) view returns (bool)", + "selector": "0x1f79a1e9" + }, + "0x2d9ed8d5": { + "type": "function", + "signature": "function transferValue() view returns (uint256)", + "selector": "0x2d9ed8d5" + }, + "0x393fe1cd": { + "type": "function", + "signature": "function roots() view returns (uint256[])", + "selector": "0x393fe1cd" + }, + "0x49ce8997": { + "type": "function", + "signature": "function commitments(uint256) view returns (bool)", + "selector": "0x49ce8997" + }, + "0x4cd212eb": { + "type": "function", + "signature": "function zeros() view returns (uint256[])", + "selector": "0x4cd212eb" + }, + "0x551c4fd2": { + "type": "function", + "signature": "function withdraw(uint256[2] a, uint256[2][2] b, uint256[2] c, uint256[4] input)", + "selector": "0x551c4fd2" + }, + "0x5777bf50": { + "type": "function", + "signature": "function isDepositsEnabled() view returns (bool)", + "selector": "0x5777bf50" + }, + "0x5a129efe": { + "type": "function", + "signature": "function isSpent(uint256 nullifier) view returns (bool)", + "selector": "0x5a129efe" + }, + "0x5bb93995": { + "type": "function", + "signature": "function hashLeftRight(uint256 left, uint256 right) pure returns (uint256 mimc_hash)", + "selector": "0x5bb93995" + }, + "0x65576fab": { + "type": "function", + "signature": "function next_index() view returns (uint32)", + "selector": "0x65576fab" + }, + "0x8b145d6d": { + "type": "function", + "signature": "function current_root() view returns (uint256)", + "selector": "0x8b145d6d" + }, + "0xa6232a93": { + "type": "function", + "signature": "function isKnownRoot(uint256 root) view returns (bool)", + "selector": "0xa6232a93" + }, + "0xd907813c": { + "type": "function", + "signature": "function toggleDeposits()", + "selector": "0xd907813c" + }, + "0x9ad26744": { + "type": "function", + "signature": "function removeAuthorizedAddressAtIndex(address target, uint256 index)", + "selector": "0x9ad26744" + }, + "0xae25532e": { + "type": "function", + "signature": "function getProxyId() pure returns (bytes4)", + "selector": "0xae25532e" + }, + "0x6f6941b9": { + "type": "function", + "signature": "function cDAI() view returns (address)", + "selector": "0x6f6941b9" + }, + "0x10d95969": { + "type": "function", + "signature": "function crvapr() view returns (uint256)", + "selector": "0x10d95969" + }, + "0x7165485d": { + "type": "function", + "signature": "function curve() view returns (address)", + "selector": "0x7165485d" + }, + "0x4f39059c": { + "type": "function", + "signature": "function curveToken() view returns (address)", + "selector": "0x4f39059c" + }, + "0x458e3234": { + "type": "function", + "signature": "function set_new_TOKEN(address _new_TOKEN)", + "selector": "0x458e3234" + }, + "0x855fed81": { + "type": "function", + "signature": "function set_new_cDAI(address _new_cDAI)", + "selector": "0x855fed81" + }, + "0x89a642a9": { + "type": "function", + "signature": "function set_new_curveToken(address _new_set_new_curveToken)", + "selector": "0x89a642a9" + }, + "0xc532a774": { + "type": "function", + "signature": "function calc_withdraw_one_coin(uint256 _burn_amount, int128 i, bool _previous) view returns (uint256)", + "selector": "0xc532a774" + }, + "0x1ed86f19": { + "type": "function", + "signature": "function addModule(address module)", + "selector": "0x1ed86f19" + }, + "0x5cf1cd2b": { + "type": "function", + "signature": "function batchNotifyFor(address[] accounts)", + "selector": "0x5cf1cd2b" + }, + "0xec954594": { + "type": "function", + "signature": "function inchToken() view returns (address)", + "selector": "0xec954594" + }, + "0x899f5898": { + "type": "function", + "signature": "function notify()", + "selector": "0x899f5898" + }, + "0x132b4fc8": { + "type": "function", + "signature": "function notifyFor(address account)", + "selector": "0x132b4fc8" + }, + "0xa0632461": { + "type": "function", + "signature": "function removeModule(address module)", + "selector": "0xa0632461" + }, + "0xa694fc3a": { + "type": "function", + "signature": "function stake(uint256 amount)", + "selector": "0xa694fc3a" + }, + "0x131b9c04": { + "type": "function", + "signature": "function getEarnings(address tokenAddress) view returns (uint256)", + "selector": "0x131b9c04" + }, + "0x1e99d569": { + "type": "function", + "signature": "function nextStreamId() view returns (uint256)", + "selector": "0x1e99d569" + }, + "0x2b8a119d": { + "type": "function", + "signature": "function getCompoundingStream(uint256 streamId) view returns (address sender, address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 ratePerSecond, uint256 exchangeRateInitial, uint256 senderSharePercentage, uint256 recipientSharePercentage)", + "selector": "0x2b8a119d" + }, + "0x3656eec2": { + "type": "function", + "signature": "function balanceOf(uint256 streamId, address who) view returns (uint256 balance)", + "selector": "0x3656eec2" + }, + "0x6db9241b": { + "type": "function", + "signature": "function cancelStream(uint256 streamId) returns (bool)", + "selector": "0x6db9241b" + }, + "0x7a9b2c6c": { + "type": "function", + "signature": "function withdrawFromStream(uint256 streamId, uint256 amount) returns (bool)", + "selector": "0x7a9b2c6c" + }, + "0x8129fc1c": { + "type": "function", + "signature": "function initialize()", + "selector": "0x8129fc1c" + }, + "0x8195aeaa": { + "type": "function", + "signature": "function createCompoundingStream(address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 senderSharePercentage, uint256 recipientSharePercentage) returns (uint256)", + "selector": "0x8195aeaa" + }, + "0x894e9a0d": { + "type": "function", + "signature": "function getStream(uint256 streamId) view returns (address sender, address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 ratePerSecond)", + "selector": "0x894e9a0d" + }, + "0x8c9a3252": { + "type": "function", + "signature": "function interestOf(uint256 streamId, uint256 amount) returns (uint256 senderInterest, uint256 recipientInterest, uint256 sablierInterest)", + "selector": "0x8c9a3252" + }, + "0x9012c4a8": { + "type": "function", + "signature": "function updateFee(uint256 feePercentage)", + "selector": "0x9012c4a8" + }, + "0xa734d51b": { + "type": "function", + "signature": "function isCompoundingStream(uint256 streamId) view returns (bool)", + "selector": "0xa734d51b" + }, + "0xa82ccd4d": { + "type": "function", + "signature": "function deltaOf(uint256 streamId) view returns (uint256 delta)", + "selector": "0xa82ccd4d" + }, + "0xc1eb9ee0": { + "type": "function", + "signature": "function takeEarnings(address tokenAddress, uint256 amount)", + "selector": "0xc1eb9ee0" + }, + "0xcc1b4bf6": { + "type": "function", + "signature": "function createStream(address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime) returns (uint256)", + "selector": "0xcc1b4bf6" + }, + "0xd2cba55c": { + "type": "function", + "signature": "function cTokenManager() view returns (address)", + "selector": "0xd2cba55c" + }, + "0xccd34cd5": { + "type": "function", + "signature": "function PRECISION_FACTOR() view returns (uint256)", + "selector": "0xccd34cd5" + }, + "0x097aad10": { + "type": "function", + "signature": "function calculatePendingRewards(address user) view returns (uint256)", + "selector": "0x097aad10" + }, + "0x6de26e38": { + "type": "function", + "signature": "function calculateSharePriceInLOOKS() view returns (uint256)", + "selector": "0x6de26e38" + }, + "0xab5e32af": { + "type": "function", + "signature": "function calculateSharesValueInLOOKS(address user) view returns (uint256)", + "selector": "0xab5e32af" + }, + "0xcb4aec61": { + "type": "function", + "signature": "function currentRewardPerBlock() view returns (uint256)", + "selector": "0xcb4aec61" + }, + "0x9a408321": { + "type": "function", + "signature": "function deposit(uint256 amount, bool claimRewardToken)", + "selector": "0x9a408321" + }, + "0x4641257d": { + "type": "function", + "signature": "function harvest()", + "selector": "0x4641257d" + }, + "0x40d2abae": { + "type": "function", + "signature": "function lastRewardAdjustment() view returns (uint256)", + "selector": "0x40d2abae" + }, + "0xa9f8d181": { + "type": "function", + "signature": "function lastRewardBlock() view returns (uint256)", + "selector": "0xa9f8d181" + }, + "0xa218141b": { + "type": "function", + "signature": "function lastUpdateBlock() view returns (uint256)", + "selector": "0xa218141b" + }, + "0x36db9fb2": { + "type": "function", + "signature": "function looksRareToken() view returns (address)", + "selector": "0x36db9fb2" + }, + "0x442da82f": { + "type": "function", + "signature": "function periodEndBlock() view returns (uint256)", + "selector": "0x442da82f" + }, + "0xdf136d65": { + "type": "function", + "signature": "function rewardPerTokenStored() view returns (uint256)", + "selector": "0xdf136d65" + }, + "0xf7c618c1": { + "type": "function", + "signature": "function rewardToken() view returns (address)", + "selector": "0xf7c618c1" + }, + "0x18a6bc32": { + "type": "function", + "signature": "function tokenDistributor() view returns (address)", + "selector": "0x18a6bc32" + }, + "0x3a98ef39": { + "type": "function", + "signature": "function totalShares() view returns (uint256)", + "selector": "0x3a98ef39" + }, + "0x97e50818": { + "type": "function", + "signature": "function updateRewards(uint256 reward, uint256 rewardDurationInBlocks)", + "selector": "0x97e50818" + }, + "0x1959a002": { + "type": "function", + "signature": "function userInfo(address) view returns (uint256 shares, uint256 userRewardPerTokenPaid, uint256 rewards)", + "selector": "0x1959a002" + }, + "0x38d07436": { + "type": "function", + "signature": "function withdraw(uint256 shares, bool claimRewardToken)", + "selector": "0x38d07436" + }, + "0x1c1c6fe5": { + "type": "function", + "signature": "function withdrawAll(bool claimRewardToken)", + "selector": "0x1c1c6fe5" + }, + "0xc7977be7": { + "type": "function", + "signature": "function EIP712_DOMAIN_TYPEHASH() view returns (bytes32)", + "selector": "0xc7977be7" + }, + "0x07502cc1": { + "type": "function", + "signature": "function SettleAggregateOrder(tuple(uint256 expiry, address taker_address, address[] maker_addresses, uint256[] maker_nonces, address[][] taker_tokens, address[][] maker_tokens, uint256[][] taker_amounts, uint256[][] maker_amounts, address receiver) order, bytes takerSig, tuple(uint8 signatureType, bytes signatureBytes)[] makerSigs) payable returns (bool)", + "selector": "0x07502cc1" + }, + "0x3f6e8a8e": { + "type": "function", + "signature": "function hashAggregateOrder(tuple(uint256 expiry, address taker_address, address[] maker_addresses, uint256[] maker_nonces, address[][] taker_tokens, address[][] maker_tokens, uint256[][] taker_amounts, uint256[][] maker_amounts, address receiver) order) view returns (bytes32)", + "selector": "0x3f6e8a8e" + }, + "0xf453f4e3": { + "type": "function", + "signature": "function hashPartialOrder(tuple(uint256 expiry, address taker_address, address maker_address, uint256 maker_nonce, address[] taker_tokens, address[] maker_tokens, uint256[] taker_amounts, uint256[] maker_amounts, address receiver) order) view returns (bytes32)", + "selector": "0xf453f4e3" + }, + "0xea7faa61": { + "type": "function", + "signature": "function registerAllowedOrderSigner(address signer, bool allowed)", + "selector": "0xea7faa61" + }, + "0x5b730ecd": { + "type": "function", + "signature": "function validateMakerSignature(address maker_address, bytes32 hash, tuple(uint8 signatureType, bytes signatureBytes) signature) view", + "selector": "0x5b730ecd" + }, + "0x93e4eaa9": { + "type": "function", + "signature": "function RUNE() view returns (address)", + "selector": "0x93e4eaa9" + }, + "0x1fece7b4": { + "type": "function", + "signature": "function deposit(address vault, address asset, uint256 amount, string memo) payable", + "selector": "0x1fece7b4" + }, + "0x44bc937b": { + "type": "function", + "signature": "function depositWithExpiry(address vault, address asset, uint256 amount, string memo, uint256 expiration) payable", + "selector": "0x44bc937b" + }, + "0x2923e82e": { + "type": "function", + "signature": "function returnVaultAssets(address router, address asgard, tuple(address asset, uint256 amount)[] coins, string memo) payable", + "selector": "0x2923e82e" + }, + "0x1b738b32": { + "type": "function", + "signature": "function transferAllowance(address router, address newVault, address asset, uint256 amount, string memo)", + "selector": "0x1b738b32" + }, + "0x574da717": { + "type": "function", + "signature": "function transferOut(address to, address asset, uint256 amount, string memo) payable", + "selector": "0x574da717" + }, + "0x4039fd4b": { + "type": "function", + "signature": "function transferOutAndCall(address aggregator, address finalToken, address to, uint256 amountOutMin, string memo) payable", + "selector": "0x4039fd4b" + }, + "0x03b6a673": { + "type": "function", + "signature": "function vaultAllowance(address vault, address token) view returns (uint256 amount)", + "selector": "0x03b6a673" + }, + "0x0a5ea466": { + "type": "function", + "signature": "function claimTokens(address token, address who, address dest, uint256 amount)", + "selector": "0x0a5ea466" + }, + "0xb1746b86": { + "type": "function", + "signature": "function burnGasToken(uint256 gasSpent)", + "selector": "0xb1746b86" + }, + "0xc91d59fe": { + "type": "function", + "signature": "function gasToken() view returns (address)", + "selector": "0xc91d59fe" + }, + "0xccf1af31": { + "type": "function", + "signature": "function gasTokenOwner() view returns (address)", + "selector": "0xccf1af31" + }, + "0xcc94a63a": { + "type": "error", + "signature": "error NoSlice()", + "selector": "0xcc94a63a" + }, + "0x47aaf07a": { + "type": "error", + "signature": "error SliceOverflow()", + "selector": "0x47aaf07a" + }, + "0xa78aa27f": { + "type": "error", + "signature": "error ToAddressOutOfBounds()", + "selector": "0xa78aa27f" + }, + "0x77146e62": { + "type": "error", + "signature": "error ToAddressOverflow()", + "selector": "0x77146e62" + }, + "0xd9096a3e": { + "type": "error", + "signature": "error ToUint24OutOfBounds()", + "selector": "0xd9096a3e" + }, + "0x855859b4": { + "type": "error", + "signature": "error ToUint24Overflow()", + "selector": "0x855859b4" + }, + "0xbca8c7b5": { + "type": "function", + "signature": "function executeCall(address target, bytes callData) returns (bytes resultData)", + "selector": "0xbca8c7b5" + }, + "0x8e325979": { + "type": "function", + "signature": "function DELEGATION_CALLER() view returns (bytes32)", + "selector": "0x8e325979" + }, + "0x2c436e5b": { + "type": "function", + "signature": "function delegateType() view returns (uint256)", + "selector": "0x2c436e5b" + }, + "0x3672c911": { + "type": "function", + "signature": "function executeAuctionComplete(address, address buyer, bytes data) returns (bool)", + "selector": "0x3672c911" + }, + "0xf477e4fd": { + "type": "function", + "signature": "function executeAuctionRefund(address seller, address, bytes data) returns (bool)", + "selector": "0xf477e4fd" + }, + "0xc23725f9": { + "type": "function", + "signature": "function executeBid(address seller, address previousBidder, address, bytes data) returns (bool)", + "selector": "0xc23725f9" + }, + "0x16721626": { + "type": "function", + "signature": "function executeBuy(address seller, address buyer, bytes data) returns (bool)", + "selector": "0x16721626" + }, + "0xbc553f0f": { + "type": "function", + "signature": "function executeSell(address seller, address buyer, bytes data) returns (bool)", + "selector": "0xbc553f0f" + }, + "0x3cbf4f8a": { + "type": "function", + "signature": "function transferBatch(tuple(address token, uint256 tokenId)[] pairs, address to)", + "selector": "0x3cbf4f8a" + }, + "0xb238b533": { + "type": "function", + "signature": "function addNativeLiquidity() payable", + "selector": "0xb238b533" + }, + "0xedd9587b": { + "type": "function", + "signature": "function addSupportedToken(address tokenAddress, uint256 minCapLimit, uint256 maxCapLimit)", + "selector": "0xedd9587b" + }, + "0x14fe72aa": { + "type": "function", + "signature": "function addTokenLiquidity(address tokenAddress, uint256 amount)", + "selector": "0x14fe72aa" + }, + "0xa0be06f9": { + "type": "function", + "signature": "function adminFee() view returns (uint256)", + "selector": "0xa0be06f9" + }, + "0xfcc4d59a": { + "type": "function", + "signature": "function adminFeeAccumulatedByToken(address) view returns (uint256)", + "selector": "0xfcc4d59a" + }, + "0x583bbc40": { + "type": "function", + "signature": "function baseGas() view returns (uint256)", + "selector": "0x583bbc40" + }, + "0xb6632cb3": { + "type": "function", + "signature": "function changeAdminFee(uint256 newAdminFee)", + "selector": "0xb6632cb3" + }, + "0x2cd271e7": { + "type": "function", + "signature": "function changePauser(address newPauser)", + "selector": "0x2cd271e7" + }, + "0x85a25597": { + "type": "function", + "signature": "function checkHashStatus(address tokenAddress, uint256 amount, address receiver, bytes depositHash) view returns (bytes32 hashSendTransaction, bool status)", + "selector": "0x85a25597" + }, + "0x13fe24e1": { + "type": "function", + "signature": "function depositErc20(address tokenAddress, address receiver, uint256 amount, uint256 toChainId)", + "selector": "0x13fe24e1" + }, + "0x02279b4a": { + "type": "function", + "signature": "function depositNative(address receiver, uint256 toChainId) payable", + "selector": "0x02279b4a" + }, + "0xe06179fe": { + "type": "function", + "signature": "function gasFeeAccumulatedByToken(address) view returns (uint256)", + "selector": "0xe06179fe" + }, + "0x2a905ccc": { + "type": "function", + "signature": "function getAdminFee() view returns (uint256)", + "selector": "0x2a905ccc" + }, + "0xab1635b7": { + "type": "function", + "signature": "function getExecutorManager() view returns (address)", + "selector": "0xab1635b7" + }, + "0xea526de7": { + "type": "function", + "signature": "function getLiquidity(address liquidityProviderAddress, address tokenAddress) view returns (uint256)", + "selector": "0xea526de7" + }, + "0x7008b548": { + "type": "function", + "signature": "function getPauser() view returns (address)", + "selector": "0x7008b548" + }, + "0x6a8a3b96": { + "type": "function", + "signature": "function isPauser() view returns (bool)", + "selector": "0x6a8a3b96" + }, + "0xfc07ec25": { + "type": "function", + "signature": "function permitAndDepositErc20(address tokenAddress, address receiver, uint256 amount, uint256 toChainId, tuple(uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) permitOptions)", + "selector": "0xfc07ec25" + }, + "0x6125ca02": { + "type": "function", + "signature": "function permitEIP2612AndDepositErc20(address tokenAddress, address receiver, uint256 amount, uint256 toChainId, tuple(uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) permitOptions)", + "selector": "0x6125ca02" + }, + "0x760d098a": { + "type": "function", + "signature": "function processedHash(bytes32) view returns (bool)", + "selector": "0x760d098a" + }, + "0xf72780ef": { + "type": "function", + "signature": "function removeNativeLiquidity(uint256 amount)", + "selector": "0xf72780ef" + }, + "0x76319190": { + "type": "function", + "signature": "function removeSupportedToken(address tokenAddress)", + "selector": "0x76319190" + }, + "0x84d93612": { + "type": "function", + "signature": "function removeTokenLiquidity(address tokenAddress, uint256 amount)", + "selector": "0x84d93612" + }, + "0x8909bb83": { + "type": "function", + "signature": "function sendFundsToUser(address tokenAddress, uint256 amount, address receiver, bytes depositHash, uint256 tokenGasPrice)", + "selector": "0x8909bb83" + }, + "0xccb844e1": { + "type": "function", + "signature": "function setBaseGas(uint128 gas)", + "selector": "0xccb844e1" + }, + "0xef0d4572": { + "type": "function", + "signature": "function setExecutorManager(address _executorManagerAddress)", + "selector": "0xef0d4572" + }, + "0x8b56d0b7": { + "type": "function", + "signature": "function setTokenTransferOverhead(address tokenAddress, uint256 gasOverhead)", + "selector": "0x8b56d0b7" + }, + "0xda742228": { + "type": "function", + "signature": "function setTrustedForwarder(address forwarderAddress)", + "selector": "0xda742228" + }, + "0xba8dbea2": { + "type": "function", + "signature": "function tokensInfo(address) view returns (uint256 transferOverhead, bool supportedToken, uint256 minCap, uint256 maxCap, uint256 liquidity)", + "selector": "0xba8dbea2" + }, + "0x7da0a877": { + "type": "function", + "signature": "function trustedForwarder() view returns (address)", + "selector": "0x7da0a877" + }, + "0x56e3866d": { + "type": "function", + "signature": "function updateTokenCap(address tokenAddress, uint256 minCapLimit, uint256 maxCapLimit)", + "selector": "0x56e3866d" + }, + "0x486ff0cd": { + "type": "function", + "signature": "function versionRecipient() view returns (string)", + "selector": "0x486ff0cd" + }, + "0xc7e42b1b": { + "type": "function", + "signature": "function withdrawErc20(address tokenAddress)", + "selector": "0xc7e42b1b" + }, + "0x1ff14860": { + "type": "function", + "signature": "function withdrawErc20AdminFee(address tokenAddress, address receiver)", + "selector": "0x1ff14860" + }, + "0x1a2b4381": { + "type": "function", + "signature": "function withdrawErc20GasFee(address tokenAddress, address receiver)", + "selector": "0x1a2b4381" + }, + "0x50431ce4": { + "type": "function", + "signature": "function withdrawNative()", + "selector": "0x50431ce4" + }, + "0xfa181699": { + "type": "function", + "signature": "function withdrawNativeAdminFee(address receiver)", + "selector": "0xfa181699" + }, + "0x23868d6c": { + "type": "function", + "signature": "function withdrawNativeGasFee(address receiver)", + "selector": "0x23868d6c" + }, + "0x3dd7df50": { + "type": "function", + "signature": "function LOOKS_RARE_EXCHANGE() view returns (address)", + "selector": "0x3dd7df50" + }, + "0x33f2fa9f": { + "type": "function", + "signature": "function transferNonFungibleToken(address collection, address from, address to, uint256 tokenId, uint256)", + "selector": "0x33f2fa9f" + }, + "0x1878d1f1": { + "type": "function", + "signature": "function ETH_TOKEN_ADDRESS() view returns (address)", + "selector": "0x1878d1f1" + }, + "0xd337e37b": { + "type": "function", + "signature": "function pay(address src, uint256 srcAmount, address dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId, bytes paymentData, bytes hint, address kyberNetworkProxy) payable", + "selector": "0xd337e37b" + }, + "0x48d67e1b": { + "type": "function", + "signature": "function decayPeriod() view returns (uint256)", + "selector": "0x48d67e1b" + }, + "0xeaadf848": { + "type": "function", + "signature": "function decayPeriodVote(uint256 vote)", + "selector": "0xeaadf848" + }, + "0x7e82a6f3": { + "type": "function", + "signature": "function decayPeriodVotes(address user) view returns (uint256)", + "selector": "0x7e82a6f3" + }, + "0x3049105d": { + "type": "function", + "signature": "function deposit(uint256[2] maxAmounts, uint256[2] minAmounts) payable returns (uint256 fairSupply, uint256[2] receivedAmounts)", + "selector": "0x3049105d" + }, + "0x9ea5ce0a": { + "type": "function", + "signature": "function depositFor(uint256[2] maxAmounts, uint256[2] minAmounts, address target) payable returns (uint256 fairSupply, uint256[2] receivedAmounts)", + "selector": "0x9ea5ce0a" + }, + "0xf76d13b4": { + "type": "function", + "signature": "function discardDecayPeriodVote()", + "selector": "0xf76d13b4" + }, + "0x93028d83": { + "type": "function", + "signature": "function discardFeeVote()", + "selector": "0x93028d83" + }, + "0x6669302a": { + "type": "function", + "signature": "function discardSlippageFeeVote()", + "selector": "0x6669302a" + }, + "0x11212d66": { + "type": "function", + "signature": "function feeVote(uint256 vote)", + "selector": "0x11212d66" + }, + "0x9aad141b": { + "type": "function", + "signature": "function feeVotes(address user) view returns (uint256)", + "selector": "0x9aad141b" + }, + "0xd7d3aab5": { + "type": "function", + "signature": "function getBalanceForAddition(address token) view returns (uint256)", + "selector": "0xd7d3aab5" + }, + "0xe7ff42c9": { + "type": "function", + "signature": "function getBalanceForRemoval(address token) view returns (uint256)", + "selector": "0xe7ff42c9" + }, + "0x1e1401f8": { + "type": "function", + "signature": "function getReturn(address src, address dst, uint256 amount) view returns (uint256)", + "selector": "0x1e1401f8" + }, + "0xd9a0c217": { + "type": "function", + "signature": "function mooniswapFactoryGovernance() view returns (address)", + "selector": "0xd9a0c217" + }, + "0xc40d4d66": { + "type": "function", + "signature": "function setMooniswapFactoryGovernance(address newMooniswapFactoryGovernance)", + "selector": "0xc40d4d66" + }, + "0x3732b394": { + "type": "function", + "signature": "function slippageFee() view returns (uint256)", + "selector": "0x3732b394" + }, + "0x07a80070": { + "type": "function", + "signature": "function slippageFeeVote(uint256 vote)", + "selector": "0x07a80070" + }, + "0x95cad3c7": { + "type": "function", + "signature": "function slippageFeeVotes(address user) view returns (uint256)", + "selector": "0x95cad3c7" + }, + "0xd5bcb9b5": { + "type": "function", + "signature": "function swap(address src, address dst, uint256 amount, uint256 minReturn, address referral) payable returns (uint256 result)", + "selector": "0xd5bcb9b5" + }, + "0xe331d039": { + "type": "function", + "signature": "function swapFor(address src, address dst, uint256 amount, uint256 minReturn, address referral, address receiver) payable returns (uint256 result)", + "selector": "0xe331d039" + }, + "0x0dfe1681": { + "type": "function", + "signature": "function token0() view returns (address)", + "selector": "0x0dfe1681" + }, + "0xd21220a7": { + "type": "function", + "signature": "function token1() view returns (address)", + "selector": "0xd21220a7" + }, + "0x6edc2c09": { + "type": "function", + "signature": "function virtualBalancesForAddition(address) view returns (uint216 balance, uint40 time)", + "selector": "0x6edc2c09" + }, + "0x5ed9156d": { + "type": "function", + "signature": "function virtualBalancesForRemoval(address) view returns (uint216 balance, uint40 time)", + "selector": "0x5ed9156d" + }, + "0x0146081f": { + "type": "function", + "signature": "function virtualDecayPeriod() view returns (uint104, uint104, uint48)", + "selector": "0x0146081f" + }, + "0xf1ea6042": { + "type": "function", + "signature": "function virtualFee() view returns (uint104, uint104, uint48)", + "selector": "0xf1ea6042" + }, + "0x23e8cae1": { + "type": "function", + "signature": "function virtualSlippageFee() view returns (uint104, uint104, uint48)", + "selector": "0x23e8cae1" + }, + "0xb1ec4c40": { + "type": "function", + "signature": "function volumes(address) view returns (uint128 confirmed, uint128 result)", + "selector": "0xb1ec4c40" + }, + "0x5915d806": { + "type": "function", + "signature": "function withdraw(uint256 amount, uint256[] minReturns) returns (uint256[2] withdrawnAmounts)", + "selector": "0x5915d806" + }, + "0x3c6216a6": { + "type": "function", + "signature": "function withdrawFor(uint256 amount, uint256[] minReturns, address target) returns (uint256[2] withdrawnAmounts)", + "selector": "0x3c6216a6" + }, + "0xdd1fe62c": { + "type": "function", + "signature": "function freeReduxTokens(address user, uint256 tokensToFree)", + "selector": "0xdd1fe62c" + }, + "0x7fb93127": { + "type": "function", + "signature": "function reduxToken() view returns (address)", + "selector": "0x7fb93127" + }, + "0xa619486e": { + "type": "function", + "signature": "function masterCopy() view returns (address)", + "selector": "0xa619486e" + }, + "0x48ccda3c": { + "type": "function", + "signature": "function AAVE() view returns (address)", + "selector": "0x48ccda3c" + }, + "0x0542975c": { + "type": "function", + "signature": "function ADDRESSES_PROVIDER() view returns (address)", + "selector": "0x0542975c" + }, + "0xf301e781": { + "type": "function", + "signature": "function LEND() view returns (address)", + "selector": "0xf301e781" + }, + "0xb4dcfc77": { + "type": "function", + "signature": "function LENDING_POOL() view returns (address)", + "selector": "0xb4dcfc77" + }, + "0xa56152e8": { + "type": "function", + "signature": "function LENDING_POOL_V1() view returns (address)", + "selector": "0xa56152e8" + }, + "0x3bcb753f": { + "type": "function", + "signature": "function LENDING_POOL_V1_CORE() view returns (address)", + "selector": "0x3bcb753f" + }, + "0x4484c213": { + "type": "function", + "signature": "function LEND_TO_AAVE_MIGRATOR() view returns (address)", + "selector": "0x4484c213" + }, + "0x920f5c84": { + "type": "function", + "signature": "function executeOperation(address[] assets, uint256[] amounts, uint256[] premiums, address initiator, bytes params) returns (bool)", + "selector": "0x920f5c84" + }, + "0x6321c7e8": { + "type": "function", + "signature": "function migrateATokens(address[] v1ATokens, uint256[] aTokensAmounts)", + "selector": "0x6321c7e8" + }, + "0x2e0e9fbd": { + "type": "function", + "signature": "function relayers(address, uint256) view returns (bool)", + "selector": "0x2e0e9fbd" + }, + "0x482879aa": { + "type": "function", + "signature": "function sablier() view returns (address)", + "selector": "0x482879aa" + }, + "0x52e877d2": { + "type": "function", + "signature": "function whitelistRelayer(address relayer, uint256 salaryId)", + "selector": "0x52e877d2" + }, + "0x591bc226": { + "type": "function", + "signature": "function discardRelayer(address relayer, uint256 salaryId)", + "selector": "0x591bc226" + }, + "0x73f4823e": { + "type": "function", + "signature": "function createCompoundingSalary(address employee, uint256 salary, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 senderSharePercentage, uint256 recipientSharePercentage) returns (uint256 salaryId)", + "selector": "0x73f4823e" + }, + "0x74e861d6": { + "type": "function", + "signature": "function getHubAddr() view returns (address)", + "selector": "0x74e861d6" + }, + "0x80274db7": { + "type": "function", + "signature": "function preRelayedCall(bytes context) returns (bytes32)", + "selector": "0x80274db7" + }, + "0x80bfacc2": { + "type": "function", + "signature": "function getSalary(uint256 salaryId) view returns (address company, address employee, uint256 salary, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 rate)", + "selector": "0x80bfacc2" + }, + "0x83947ea0": { + "type": "function", + "signature": "function acceptRelayedCall(address relay, address from, bytes encodedFunction, uint256 transactionFee, uint256 gasPrice, uint256 gasLimit, uint256 nonce, bytes approvalData, uint256) view returns (uint256, bytes)", + "selector": "0x83947ea0" + }, + "0xad61ccd5": { + "type": "function", + "signature": "function relayHubVersion() view returns (string)", + "selector": "0xad61ccd5" + }, + "0xc0c53b8b": { + "type": "function", + "signature": "function initialize(address ownerAddress, address signerAddress, address sablierAddress)", + "selector": "0xc0c53b8b" + }, + "0xc5a66ff9": { + "type": "function", + "signature": "function cancelSalary(uint256 salaryId) returns (bool success)", + "selector": "0xc5a66ff9" + }, + "0xdc7d9369": { + "type": "function", + "signature": "function createSalary(address employee, uint256 salary, address tokenAddress, uint256 startTime, uint256 stopTime) returns (uint256 salaryId)", + "selector": "0xdc7d9369" + }, + "0xde8fd678": { + "type": "function", + "signature": "function nextSalaryId() view returns (uint256)", + "selector": "0xde8fd678" + }, + "0xe06e0e22": { + "type": "function", + "signature": "function postRelayedCall(bytes context, bool success, uint256 actualCharge, bytes32 preRetVal)", + "selector": "0xe06e0e22" + }, + "0xfea7c53f": { + "type": "function", + "signature": "function withdrawFromSalary(uint256 salaryId, uint256 amount) returns (bool success)", + "selector": "0xfea7c53f" + }, + "0x0510111e": { + "type": "function", + "signature": "function MAXIMUM_COLLATERALIZATION_LIMIT() view returns (uint256)", + "selector": "0x0510111e" + }, + "0x30d4d190": { + "type": "function", + "signature": "function MINIMUM_COLLATERALIZATION_LIMIT() view returns (uint256)", + "selector": "0x30d4d190" + }, + "0x45f867b3": { + "type": "function", + "signature": "function PERCENT_RESOLUTION() view returns (uint256)", + "selector": "0x45f867b3" + }, + "0x538ba4f9": { + "type": "function", + "signature": "function ZERO_ADDRESS() view returns (address)", + "selector": "0x538ba4f9" + }, + "0xa005fda3": { + "type": "function", + "signature": "function _linkGasOracle() view returns (address)", + "selector": "0xa005fda3" + }, + "0x4aaf7c65": { + "type": "function", + "signature": "function collateralizationLimit() view returns (tuple(uint256 x))", + "selector": "0x4aaf7c65" + }, + "0x5641ec03": { + "type": "function", + "signature": "function emergencyExit() view returns (bool)", + "selector": "0x5641ec03" + }, + "0x6b9f96ea": { + "type": "function", + "signature": "function flush() returns (uint256)", + "selector": "0x6b9f96ea" + }, + "0xf0d787a3": { + "type": "function", + "signature": "function flushActivator() view returns (uint256)", + "selector": "0xf0d787a3" + }, + "0x9a9af221": { + "type": "function", + "signature": "function getCdpLastDeposit(address _account) view returns (uint256)", + "selector": "0x9a9af221" + }, + "0xfc00e8a0": { + "type": "function", + "signature": "function getCdpTotalCredit(address _account) view returns (uint256)", + "selector": "0xfc00e8a0" + }, + "0xaa6e0434": { + "type": "function", + "signature": "function getCdpTotalDebt(address _account) view returns (uint256)", + "selector": "0xaa6e0434" + }, + "0xa1e401a9": { + "type": "function", + "signature": "function getCdpTotalDeposited(address _account) view returns (uint256)", + "selector": "0xa1e401a9" + }, + "0x2670fdd8": { + "type": "function", + "signature": "function getVaultAdapter(uint256 _vaultId) view returns (address)", + "selector": "0x2670fdd8" + }, + "0xaaf16660": { + "type": "function", + "signature": "function getVaultTotalDeposited(uint256 _vaultId) view returns (uint256)", + "selector": "0xaaf16660" + }, + "0xddc63262": { + "type": "function", + "signature": "function harvest(uint256 _vaultId) returns (uint256, uint256)", + "selector": "0xddc63262" + }, + "0xb5962917": { + "type": "function", + "signature": "function harvestFee() view returns (uint256)", + "selector": "0xb5962917" + }, + "0x158ef93e": { + "type": "function", + "signature": "function initialized() view returns (bool)", + "selector": "0x158ef93e" + }, + "0x415f1240": { + "type": "function", + "signature": "function liquidate(uint256 _amount) returns (uint256, uint256)", + "selector": "0x415f1240" + }, + "0xce5494bb": { + "type": "function", + "signature": "function migrate(address _adapter)", + "selector": "0xce5494bb" + }, + "0x3847f038": { + "type": "function", + "signature": "function pegMinimum() view returns (uint256)", + "selector": "0x3847f038" + }, + "0xf39c38a0": { + "type": "function", + "signature": "function pendingGovernance() view returns (address)", + "selector": "0xf39c38a0" + }, + "0xfefdc5d1": { + "type": "function", + "signature": "function recall(uint256 _vaultId, uint256 _amount) returns (uint256, uint256)", + "selector": "0xfefdc5d1" + }, + "0x4c3a8e02": { + "type": "function", + "signature": "function recallAll(uint256 _vaultId) returns (uint256, uint256)", + "selector": "0x4c3a8e02" + }, + "0xd8aed145": { + "type": "function", + "signature": "function repay(uint256 _parentAmount, uint256 _childAmount)", + "selector": "0xd8aed145" + }, + "0xf58c251c": { + "type": "function", + "signature": "function sentinel() view returns (address)", + "selector": "0xf58c251c" + }, + "0x53ffa18b": { + "type": "function", + "signature": "function setCollateralizationLimit(uint256 _limit)", + "selector": "0x53ffa18b" + }, + "0x45ee0755": { + "type": "function", + "signature": "function setEmergencyExit(bool _emergencyExit)", + "selector": "0x45ee0755" + }, + "0x22c37b75": { + "type": "function", + "signature": "function setFlushActivator(uint256 _flushActivator)", + "selector": "0x22c37b75" + }, + "0x792b55b6": { + "type": "function", + "signature": "function setHarvestFee(uint256 _harvestFee)", + "selector": "0x792b55b6" + }, + "0x5a9b5e92": { + "type": "function", + "signature": "function setOracleAddress(address Oracle, uint256 peg)", + "selector": "0x5a9b5e92" + }, + "0x0abb6035": { + "type": "function", + "signature": "function setPendingGovernance(address _pendingGovernance)", + "selector": "0x0abb6035" + }, + "0x09dac061": { + "type": "function", + "signature": "function setSentinel(address _sentinel)", + "selector": "0x09dac061" + }, + "0xadb4a9ad": { + "type": "function", + "signature": "function setTransmuter(address _transmuter)", + "selector": "0xadb4a9ad" + }, + "0xff50abdc": { + "type": "function", + "signature": "function totalDeposited() view returns (uint256)", + "selector": "0xff50abdc" + }, + "0x7239d2b9": { + "type": "function", + "signature": "function transmuter() view returns (address)", + "selector": "0x7239d2b9" + }, + "0xa7c6a100": { + "type": "function", + "signature": "function vaultCount() view returns (uint256)", + "selector": "0xa7c6a100" + }, + "0x1718a68f": { + "type": "function", + "signature": "function xtoken() view returns (address)", + "selector": "0x1718a68f" + }, + "0xbb038e15": { + "type": "function", + "signature": "function cdpManager() view returns (address)", + "selector": "0xbb038e15" + }, + "0xe19b8ee3": { + "type": "function", + "signature": "function migrate(bytes32 cup) returns (uint256 cdp)", + "selector": "0xe19b8ee3" + }, + "0x0b14408f": { + "type": "function", + "signature": "function saiJoin() view returns (address)", + "selector": "0x0b14408f" + }, + "0xc41780ba": { + "type": "function", + "signature": "function swapDaiToSai(uint256 wad)", + "selector": "0xc41780ba" + }, + "0xfbabdebd": { + "type": "function", + "signature": "function swapSaiToDai(uint256 wad)", + "selector": "0xfbabdebd" + }, + "0x34e70cc2": { + "type": "function", + "signature": "function tub() view returns (address)", + "selector": "0x34e70cc2" + }, + "0x2dbacef3": { + "type": "function", + "signature": "function wethJoin() view returns (address)", + "selector": "0x2dbacef3" + }, + "0x1652e9fc": { + "type": "function", + "signature": "function set_minter(address _minter)", + "selector": "0x1652e9fc" + }, + "0x40c10f19": { + "type": "function", + "signature": "function mint(address _to, uint256 _value)", + "selector": "0x40c10f19" + }, + "0x79cc6790": { + "type": "function", + "signature": "function burnFrom(address _to, uint256 _value)", + "selector": "0x79cc6790" + } + } + }, + "knownAddresses": { + "0x0000000000004946c0e9f43f4dee607b0ef1fa1c": { + "address": "0x0000000000004946c0e9f43f4dee607b0ef1fa1c", + "name": "1inch CHI", + "isSC": {} + }, + "0x000000000000541e251335090ac5b47176af4f7e": { + "address": "0x000000000000541e251335090ac5b47176af4f7e", + "name": "dex.blue", + "isSC": {} + }, + "0x00000000000111abe46ff893f3b2fdf1f759a8a8": { + "address": "0x00000000000111abe46ff893f3b2fdf1f759a8a8", + "name": "Blur", + "isSC": {} + }, + "0x000000000022d473030f116ddee9f6b43ac78ba3": { + "name": "Permit2", + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "isSC": {} + }, + "0x0034ea9808e620a0ef79261c51af20614b742b24": { + "address": "0x0034ea9808e620a0ef79261c51af20614b742b24", + "name": "PoolTogether", + "isSC": {} + }, + "0x006b6e89ee1531cfe5b6d32da0d80cc30506a339": { + "address": "0x006b6e89ee1531cfe5b6d32da0d80cc30506a339", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x01621c6180d8adfad5b0c8f69d7d4abf49c7868f": { + "address": "0x01621c6180d8adfad5b0c8f69d7d4abf49c7868f", + "name": "Killabears", + "isSC": {} + }, + "0x03c341408d0edf502e702b9b24ec305819357c56": { + "address": "0x03c341408d0edf502e702b9b24ec305819357c56", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x044b75f554b886a065b9567891e45c79542d7357": { + "address": "0x044b75f554b886a065b9567891e45c79542d7357", + "name": "SushiSwap", + "isSC": {} + }, + "0x04aa51bbcb46541455ccf1b8bef2ebc5d3787ec9": { + "address": "0x04aa51bbcb46541455ccf1b8bef2ebc5d3787ec9", + "name": "Yearn", + "isSC": {} + }, + "0x04ef8121ad039ff41d10029c91ea1694432514e9": { + "address": "0x04ef8121ad039ff41d10029c91ea1694432514e9", + "name": "Yearn", + "isSC": {} + }, + "0x069c97dba948175d10af4b2414969e0b88d44669": { + "address": "0x069c97dba948175d10af4b2414969e0b88d44669", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x06af07097c9eeb7fd685c692751d5c66db49c215": { + "name": "Chai", + "address": "0x06af07097c9eeb7fd685c692751d5c66db49c215", + "token": { + "decimals": 18, + "symbol": "CHAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CHAI.svg" + }, + "0x06a5bf70bff314177488864fe03576ff608e6aec": { + "address": "0x06a5bf70bff314177488864fe03576ff608e6aec", + "name": "Staked.us", + "isSC": {} + }, + "0x077d52b047735976dfda76fef74d4d988ac25196": { + "address": "0x077d52b047735976dfda76fef74d4d988ac25196", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x0836222f2b2b24a3f36f98668ed8f0b38d1a872f": { + "address": "0x0836222f2b2b24a3f36f98668ed8f0b38d1a872f", + "name": "Tornado.cash", + "isSC": {} + }, + "0x086d4daab14741b195dee65aff050ba184b65045": { + "address": "0x086d4daab14741b195dee65aff050ba184b65045", + "name": "IPOR", + "isSC": {} + }, + "0x0890fbf0f9b3d55a7e3f251b6afcbe691a29873b": { + "address": "0x0890fbf0f9b3d55a7e3f251b6afcbe691a29873b", + "name": "DeversiFi", + "isSC": {} + }, + "0x09f448c70c99124024cd9e8dcae6c2f51c0896db": { + "address": "0x09f448c70c99124024cd9e8dcae6c2f51c0896db", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x09cabec1ead1c0ba254b09efb3ee13841712be14": { + "address": "0x09cabec1ead1c0ba254b09efb3ee13841712be14", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x0f88a6cbeb3bd153c0584c7136fbcc86c2dd657f": { + "address": "0x0f88a6cbeb3bd153c0584c7136fbcc86c2dd657f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x0e6a53b13688018a3df8c69f99afb19a3068d04f": { + "address": "0x0e6a53b13688018a3df8c69f99afb19a3068d04f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x0a1730279b86a00c7214abc624f19261f8fd9a88": { + "address": "0x0a1730279b86a00c7214abc624f19261f8fd9a88", + "name": "Killabears", + "isSC": {} + }, + "0x0eb7177b30d8415d36ed5ca71faa7673c4fbe187": { + "address": "0x0eb7177b30d8415d36ed5ca71faa7673c4fbe187", + "name": "X Marketplace", + "isSC": {} + }, + "0x0eee3e3828a45f7601d5f54bf49bb01d1a9df5ea": { + "address": "0x0eee3e3828a45f7601d5f54bf49bb01d1a9df5ea", + "name": "Lendf", + "isSC": {} + }, + "0x1055be4bf7338c7606d9efdcf80593f180ba043e": { + "address": "0x1055be4bf7338c7606d9efdcf80593f180ba043e", + "name": "Compound", + "isSC": {} + }, + "0x10ec0d497824e342bcb0edce00959142aaa766dd": { + "address": "0x10ec0d497824e342bcb0edce00959142aaa766dd", + "name": "Idle", + "isSC": {} + }, + "0x11111112542d85b3ef69ae05771c2dccff4faa26": { + "address": "0x11111112542d85b3ef69ae05771c2dccff4faa26", + "name": "1inch", + "isSC": {} + }, + "0x111111125434b319222cdbf8c261674adb56f3ae": { + "address": "0x111111125434b319222cdbf8c261674adb56f3ae", + "name": "1inch", + "isSC": {} + }, + "0x1111111254eeb25477b68fb85ed929f73a960582": { + "address": "0x1111111254eeb25477b68fb85ed929f73a960582", + "name": "1inch", + "isSC": {} + }, + "0x1111111254fb6c44bac0bed2854e76f90643097d": { + "name": "1inch", + "address": "0x1111111254fb6c44bac0bed2854e76f90643097d", + "isSC": {} + }, + "0x11111254369792b2ca5d084ab5eea397ca8fa48b": { + "address": "0x11111254369792b2ca5d084ab5eea397ca8fa48b", + "name": "1inch", + "isSC": {} + }, + "0x119c71d3bbac22029622cbaec24854d3d32d2828": { + "address": "0x119c71d3bbac22029622cbaec24854d3d32d2828", + "name": "1inch", + "isSC": {} + }, + "0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae": { + "address": "0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae", + "name": "LI.FI", + "isSC": {} + }, + "0x12d66f87a04a9e220743712ce6d9bb1b5616b8fc": { + "address": "0x12d66f87a04a9e220743712ce6d9bb1b5616b8fc", + "name": "Tornado.cash", + "isSC": {} + }, + "0x134c16be1e0f19ce41855b71e0e29fba539728e9": { + "address": "0x134c16be1e0f19ce41855b71e0e29fba539728e9", + "name": "DeversiFi", + "isSC": {} + }, + "0x1356c899d8c9467c7f71c195612f8a395abf2f0a": { + "address": "0x1356c899d8c9467c7f71c195612f8a395abf2f0a", + "name": "Tornado.cash", + "isSC": {} + }, + "0x137000352b4ed784e8fa8815d225c713ab2e7dc9": { + "address": "0x137000352b4ed784e8fa8815d225c713ab2e7dc9", + "name": "IPOR", + "isSC": {} + }, + "0x158079ee67fce2f58472a96584a73c7ab9ac95c1": { + "address": "0x158079ee67fce2f58472a96584a73c7ab9ac95c1", + "name": "Compound Augur", + "isSC": {}, + "token": { + "decimals": 8, + "symbol": "cREP" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-rep.svg" + }, + "0x169ad27a470d064dede56a2d3ff727986b15d52b": { + "address": "0x169ad27a470d064dede56a2d3ff727986b15d52b", + "name": "Tornado.cash", + "isSC": {} + }, + "0x16de59092dae5ccf4a1e6439d611fd0653f0bd01": { + "address": "0x16de59092dae5ccf4a1e6439d611fd0653f0bd01", + "name": "Yearn", + "isSC": {} + }, + "0x17e8ca1b4798b97602895f63206afcd1fc90ca5f": { + "address": "0x17e8ca1b4798b97602895f63206afcd1fc90ca5f", + "name": "Furucombo", + "isSC": {} + }, + "0x181aea6936b407514ebfc0754a37704eb8d98f91": { + "address": "0x181aea6936b407514ebfc0754a37704eb8d98f91", + "name": "yinsure", + "isSC": {} + }, + "0x19d97d8fa813ee2f51ad4b4e04ea08baf4dffc28": { + "name": "BBADGER token contract", + "address": "0x19d97d8fa813ee2f51ad4b4e04ea08baf4dffc28", + "token": { + "decimals": 18, + "symbol": "BBADGER" + }, + "isSC": {} + }, + "0x1c6c712b1f4a7c263b1dbd8f97fb447c945d3b9a": { + "address": "0x1c6c712b1f4a7c263b1dbd8f97fb447c945d3b9a", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x1c70d0a86475cc707b48aa79f112857e7957274f": { + "address": "0x1c70d0a86475cc707b48aa79f112857e7957274f", + "name": "Sappy Seals", + "isSC": {} + }, + "0x1e0049783f008a0085193e00003d00cd54003c71": { + "address": "0x1e0049783f008a0085193e00003d00cd54003c71", + "name": "OpenSea", + "isSC": {} + }, + "0x1e0447b19bb6ecfdae1e4ae1694b0c3659614e4e": { + "address": "0x1e0447b19bb6ecfdae1e4ae1694b0c3659614e4e", + "name": "dYdX", + "isSC": {} + }, + "0x1aec8f11a7e78dc22477e91ed924fab46e3a88fd": { + "address": "0x1aec8f11a7e78dc22477e91ed924fab46e3a88fd", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x1c0f17436740bfb92c1070ee86322de890837c6a": { + "address": "0x1c0f17436740bfb92c1070ee86322de890837c6a", + "name": "DeversiFi", + "isSC": {} + }, + "0x20f780a973856b93f63670377900c1d2a50a77c4": { + "address": "0x20f780a973856b93f63670377900c1d2a50a77c4", + "name": "Element", + "isSC": {} + }, + "0x216b4b4ba9f3e719726886d34a177484278bfcae": { + "name": "ParaSwapV5", + "address": "0x216b4b4ba9f3e719726886d34a177484278bfcae", + "isSC": {} + }, + "0x22aaa7720ddd5388a3c0a3333430953c68f1849b": { + "address": "0x22aaa7720ddd5388a3c0a3333430953c68f1849b", + "name": "Tornado.cash", + "isSC": {} + }, + "0x241e82c79452f51fbfc89fac6d912e021db1a3b7": { + "address": "0x241e82c79452f51fbfc89fac6d912e021db1a3b7", + "name": "DDEX", + "isSC": {} + }, + "0x243318cb80785ab92f2c39543cb58958320e64b2": { + "address": "0x243318cb80785ab92f2c39543cb58958320e64b2", + "name": "DeversiFi", + "isSC": {} + }, + "0x261b45d85ccfeabb11f022eba346ee8d1cd488c0": { + "address": "0x261b45d85ccfeabb11f022eba346ee8d1cd488c0", + "name": "rDAI", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "rDAI" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rdai.svg" + }, + "0x26cc0eab6cb650b0db4d0d0da8cb5bf69f4ad692": { + "address": "0x26cc0eab6cb650b0db4d0d0da8cb5bf69f4ad692", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x28bc58e600ef718b9e97d294098abecb8c96b687": { + "address": "0x28bc58e600ef718b9e97d294098abecb8c96b687", + "name": "IPOR", + "isSC": {} + }, + "0x28d9353611c5a0d5a026a648c05e5d6523e41cbf": { + "address": "0x28d9353611c5a0d5a026a648c05e5d6523e41cbf", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x28de5c5f56b6216441ee114e832808d5b9d4a775": { + "address": "0x28de5c5f56b6216441ee114e832808d5b9d4a775", + "name": "AirSwap", + "isSC": {} + }, + "0x29e240cfd7946ba20895a7a02edb25c210f9f324": { + "address": "0x29e240cfd7946ba20895a7a02edb25c210f9f324", + "name": "Yearn", + "isSC": {} + }, + "0x29fe7d60ddf151e5b52e5fab4f1325da6b2bd958": { + "address": "0x29fe7d60ddf151e5b52e5fab4f1325da6b2bd958", + "name": "PoolTogether", + "isSC": {} + }, + "0x2bf5a5ba29e60682fc56b2fcf9ce07bef4f6196f": { + "address": "0x2bf5a5ba29e60682fc56b2fcf9ce07bef4f6196f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x2c4bd064b998838076fa341a83d007fc2fa50957": { + "address": "0x2c4bd064b998838076fa341a83d007fc2fa50957", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x2cd04bb68786834f199ce12074da7b8832129fe1": { + "address": "0x2cd04bb68786834f199ce12074da7b8832129fe1", + "name": "DeversiFi", + "isSC": {} + }, + "0x2e642b8d59b45a1d8c5aef716a84ff44ea665914": { + "address": "0x2e642b8d59b45a1d8c5aef716a84ff44ea665914", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x2a0c0dbecc7e4d658f48e01e3fa353f44050c208": { + "address": "0x2a0c0dbecc7e4d658f48e01e3fa353f44050c208", + "name": "IDEX", + "isSC": {} + }, + "0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667": { + "address": "0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x2afc64cd5e64a32a363ea84b8cad1ce5239a1a3d": { + "address": "0x2afc64cd5e64a32a363ea84b8cad1ce5239a1a3d", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x2e60cf74d81ac34eb21eeff58db4d385920ef419": { + "address": "0x2e60cf74d81ac34eb21eeff58db4d385920ef419", + "name": "Curve.fi", + "isSC": {} + }, + "0x317625234562b1526ea2fac4030ea499c5291de4": { + "address": "0x317625234562b1526ea2fac4030ea499c5291de4", + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "isSC": {} + }, + "0x2f08119c6f07c006695e079aafc638b8789faf18": { + "address": "0x2f08119c6f07c006695e079aafc638b8789faf18", + "name": "Yearn", + "isSC": {} + }, + "0x33c5a44fd6e76fc2b50a9187cfeac336a74324ac": { + "address": "0x33c5a44fd6e76fc2b50a9187cfeac336a74324ac", + "name": "IPOR", + "isSC": {} + }, + "0x33d019eb137b853f0cdf555a5d5bd2749135ac31": { + "address": "0x33d019eb137b853f0cdf555a5d5bd2749135ac31", + "name": "DeversiFi", + "isSC": {} + }, + "0x34c3f58058e2ad098ef437ee5ea1ff1fe2fe4214": { + "address": "0x34c3f58058e2ad098ef437ee5ea1ff1fe2fe4214", + "name": "Predomain", + "isSC": {} + }, + "0x36324b8168f960a12a8fd01406c9c78143d41380": { + "address": "0x36324b8168f960a12a8fd01406c9c78143d41380", + "name": "Yearn", + "isSC": {} + }, + "0x394e524b47a3ab3d3327f7ff6629dc378c1494a3": { + "address": "0x394e524b47a3ab3d3327f7ff6629dc378c1494a3", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x3958b4ec427f8fa24eb60f42821760e88d485f7f": { + "address": "0x3958b4ec427f8fa24eb60f42821760e88d485f7f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x39aa39c021dfbae8fac545936693ac917d5e7563": { + "name": "Compound USD Coin", + "address": "0x39aa39c021dfbae8fac545936693ac917d5e7563", + "token": { + "decimals": 8, + "symbol": "cUSDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-usdc.svg" + }, + "0x3ab6564d5c214bc416ee8421e05219960504eead": { + "address": "0x3ab6564d5c214bc416ee8421e05219960504eead", + "name": "Bancor", + "isSC": {} + }, + "0x3bc26582062fd8aaa084ee874f6764718c398203": { + "address": "0x3bc26582062fd8aaa084ee874f6764718c398203", + "name": "DeversiFi", + "isSC": {} + }, + "0x3e66b66fd1d0b02fda6c811da9e0547970db2f21": { + "address": "0x3e66b66fd1d0b02fda6c811da9e0547970db2f21", + "name": "Balancer", + "isSC": {} + }, + "0x3ad9539c143b335794bac9211aa5491daeda85bf": { + "address": "0x3ad9539c143b335794bac9211aa5491daeda85bf", + "name": "DeversiFi", + "isSC": {} + }, + "0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1": { + "address": "0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1", + "name": "Hop", + "isSC": {} + }, + "0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3": { + "address": "0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3", + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "isSC": {} + }, + "0x401f6c983ea34274ec46f84d70b31c151321188b": { + "address": "0x401f6c983ea34274ec46f84d70b31c151321188b", + "name": "Polygon Bridge", + "isSC": {} + }, + "0x3f46e145dfcd84230c8e0684efb8bce3f0965fba": { + "address": "0x3f46e145dfcd84230c8e0684efb8bce3f0965fba", + "name": "DeversiFi", + "isSC": {} + }, + "0x40ec5b33f54e0e8a33a975908c5ba1c14e5bbbdf": { + "address": "0x40ec5b33f54e0e8a33a975908c5ba1c14e5bbbdf", + "name": "Polygon Bridge", + "isSC": {} + }, + "0x417cb32bc991fbbdcae230c7c4771cc0d69daa6b": { + "address": "0x417cb32bc991fbbdcae230c7c4771cc0d69daa6b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x43892992b0b102459e895b88601bb2c76736942c": { + "address": "0x43892992b0b102459e895b88601bb2c76736942c", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4572f2554421bd64bef1c22c8a81840e8d496bea": { + "address": "0x4572f2554421bd64bef1c22c8a81840e8d496bea", + "name": "AirSwap", + "isSC": {} + }, + "0x45a2fdfed7f7a2c791fb1bdf6075b83fad821dde": { + "address": "0x45a2fdfed7f7a2c791fb1bdf6075b83fad821dde", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x45f783cce6b7ff23b2ab2d70e416cdb7d6055f51": { + "address": "0x45f783cce6b7ff23b2ab2d70e416cdb7d6055f51", + "name": "Curve.fi", + "isSC": {} + }, + "0x4736dcf1b7a3d580672cce6e7c65cd5cc9cfba9d": { + "address": "0x4736dcf1b7a3d580672cce6e7c65cd5cc9cfba9d", + "name": "Tornado.cash", + "isSC": {} + }, + "0x47ce0c6ed5b0ce3d3a51fdb1c52dc66a7c3c2936": { + "address": "0x47ce0c6ed5b0ce3d3a51fdb1c52dc66a7c3c2936", + "name": "Tornado.cash", + "isSC": {} + }, + "0x48b04d2a05b6b604d8d5223fd1984f191ded51af": { + "address": "0x48b04d2a05b6b604d8d5223fd1984f191ded51af", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x49c4f9bc14884f6210f28342ced592a633801a8b": { + "address": "0x49c4f9bc14884f6210f28342ced592a633801a8b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4b17685b330307c751b47f33890c8398df4fe407": { + "address": "0x4b17685b330307c751b47f33890c8398df4fe407", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4d9079bb4165aeb4084c526a32695dcfd2f77381": { + "address": "0x4d9079bb4165aeb4084c526a32695dcfd2f77381", + "name": "Across Protocol", + "isSC": {} + }, + "0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5": { + "name": "Compound Ether", + "address": "0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5", + "token": { + "decimals": 8, + "symbol": "cETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-eth.svg" + }, + "0x4f0d6e2179938828cff93da40a8ba1df7519ca8c": { + "address": "0x4f0d6e2179938828cff93da40a8ba1df7519ca8c", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4f30e682d0541eac91748bd38a648d759261b8f3": { + "address": "0x4f30e682d0541eac91748bd38a648d759261b8f3", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4aa42145aa6ebf72e164c9bbc74fbd3788045016": { + "address": "0x4aa42145aa6ebf72e164c9bbc74fbd3788045016", + "name": "xDAI Bridge", + "isSC": {} + }, + "0x4d2f5cfba55ae412221182d8475bc85799a5644b": { + "address": "0x4d2f5cfba55ae412221182d8475bc85799a5644b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4e395304655f0796bc3bc63709db72173b9ddf98": { + "address": "0x4e395304655f0796bc3bc63709db72173b9ddf98", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x5048b9d01097498fd72f3f14bc9bc74a5aac8fa7": { + "address": "0x5048b9d01097498fd72f3f14bc9bc74a5aac8fa7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x4fee7b061c97c9c496b01dbce9cdb10c02f0a0be": { + "address": "0x4fee7b061c97c9c496b01dbce9cdb10c02f0a0be", + "name": "Rarible", + "isSC": {} + }, + "0x505c02b4aa1286375fbdf0c390ac0fe9209dcb05": { + "address": "0x505c02b4aa1286375fbdf0c390ac0fe9209dcb05", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x50cb61afa3f023d17276dcfb35abf85c710d1cff": { + "address": "0x50cb61afa3f023d17276dcfb35abf85c710d1cff", + "name": "DeversiFi", + "isSC": {} + }, + "0x52ea46506b9cc5ef470c5bf89f17dc28bb35d85c": { + "address": "0x52ea46506b9cc5ef470c5bf89f17dc28bb35d85c", + "name": "Curve.fi", + "isSC": {} + }, + "0x5542abc7dc05fa2c8142804bdbcc0da8a0dc98ad": { + "address": "0x5542abc7dc05fa2c8142804bdbcc0da8a0dc98ad", + "name": "NFTX", + "isSC": {} + }, + "0x57805e5a227937bac2b0fdacaa30413ddac6b8e1": { + "address": "0x57805e5a227937bac2b0fdacaa30413ddac6b8e1", + "name": "Furucombo", + "isSC": {} + }, + "0x5954ab967bc958940b7eb73ee84797dc8a2afbb9": { + "address": "0x5954ab967bc958940b7eb73ee84797dc8a2afbb9", + "name": "ApeCoin", + "isSC": {} + }, + "0x59728544b08ab483533076417fbbb2fd0b17ce3a": { + "address": "0x59728544b08ab483533076417fbbb2fd0b17ce3a", + "name": "LooksRare", + "isSC": {} + }, + "0x597ad1e0c13bfe8025993d9e79c69e1c0233522e": { + "address": "0x597ad1e0c13bfe8025993d9e79c69e1c0233522e", + "name": "Yearn", + "isSC": {} + }, + "0x5ee39beffcda53c5fa2890c2161247582e2210bb": { + "address": "0x5ee39beffcda53c5fa2890c2161247582e2210bb", + "name": "DeversiFi", + "isSC": {} + }, + "0x5abfbe56553a5d794330eaccf556ca1d2a55647c": { + "address": "0x5abfbe56553a5d794330eaccf556ca1d2a55647c", + "name": "Zapper", + "isSC": {} + }, + "0x5d22045daceab03b158031ecb7d9d06fad24609b": { + "address": "0x5d22045daceab03b158031ecb7d9d06fad24609b", + "name": "DeversiFi", + "isSC": {} + }, + "0x5d3a536e4d6dbd6114cc1ead35777bab948e3643": { + "name": "Compound Dai", + "address": "0x5d3a536e4d6dbd6114cc1ead35777bab948e3643", + "token": { + "decimals": 8, + "symbol": "cDAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-dai.svg" + }, + "0x60a87cc7fca7e53867facb79da73181b1bb4238b": { + "address": "0x60a87cc7fca7e53867facb79da73181b1bb4238b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x634e27269a029edb2b70b5ef43273f5eed9ebcc2": { + "address": "0x634e27269a029edb2b70b5ef43273f5eed9ebcc2", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45": { + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45", + "isSC": {} + }, + "0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e": { + "name": "Compound Basic Attention Token", + "address": "0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e", + "token": { + "decimals": 8, + "symbol": "cBAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-bat.svg" + }, + "0x6d987dda4358a9ba4f695ca4e6aa3933d7bc1b08": { + "address": "0x6d987dda4358a9ba4f695ca4e6aa3933d7bc1b08", + "name": "Alchemix Finance", + "isSC": {} + }, + "0x6b4540f5ee32ddd5616c792f713435e6ee4f24ab": { + "address": "0x6b4540f5ee32ddd5616c792f713435e6ee4f24ab", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x6bfa119a191576ba26bc5e711432aca0cfda04de": { + "address": "0x6bfa119a191576ba26bc5e711432aca0cfda04de", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x6eb211caf6d304a76efe37d9abdfaddc2d4363d1": { + "address": "0x6eb211caf6d304a76efe37d9abdfaddc2d4363d1", + "name": "Rabby", + "isSC": {} + }, + "0x700520b1e2ccc5bf5fa89a5f7b8fd9beba3f04b0": { + "address": "0x700520b1e2ccc5bf5fa89a5f7b8fd9beba3f04b0", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x701564aa6e26816147d4fa211a0779f1b774bb9b": { + "address": "0x701564aa6e26816147d4fa211a0779f1b774bb9b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x73555a153d301d95a3f90919e645d301f1f9e219": { + "address": "0x73555a153d301d95a3f90919e645d301f1f9e219", + "name": "Psychedelics Anonymous", + "isSC": {} + }, + "0x73a052500105205d34daf004eab301916da8190f": { + "address": "0x73a052500105205d34daf004eab301916da8190f", + "name": "Yearn", + "isSC": {} + }, + "0x74758acfce059f503a7e6b0fc2c8737600f9f2c4": { + "address": "0x74758acfce059f503a7e6b0fc2c8737600f9f2c4", + "name": "Totle", + "isSC": {} + }, + "0x755160062e3e09d34af0a00ff8cab8500e81e0d7": { + "address": "0x755160062e3e09d34af0a00ff8cab8500e81e0d7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x755899f0540c3548b99e68c59adb0f15d2695188": { + "address": "0x755899f0540c3548b99e68c59adb0f15d2695188", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x794e6e91555438afc3ccf1c5076a74f42133d08d": { + "address": "0x794e6e91555438afc3ccf1c5076a74f42133d08d", + "name": "Oasis", + "isSC": {} + }, + "0x7d03cecb36820b4666f45e1b4ca2538724db271c": { + "address": "0x7d03cecb36820b4666f45e1b4ca2538724db271c", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x7a250d5630b4cf539739df2c5dacb4c659f2488d": { + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x7a250d5630b4cf539739df2c5dacb4c659f2488d", + "isSC": {} + }, + "0x7becbc91db4eb3c5e9a6cda1db391ee648e53779": { + "address": "0x7becbc91db4eb3c5e9a6cda1db391ee648e53779", + "name": "DeversiFi", + "isSC": {} + }, + "0x7bc8b1b5aba4df3be9f9a32dae501214dc0e4f3f": { + "address": "0x7bc8b1b5aba4df3be9f9a32dae501214dc0e4f3f", + "name": "tofuNFT", + "isSC": {} + }, + "0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9", + "isSC": {} + }, + "0x7d655c57f71464b6f83811c55d84009cd9f5221c": { + "address": "0x7d655c57f71464b6f83811c55d84009cd9f5221c", + "name": "Gitcoin", + "isSC": {} + }, + "0x7dc095a5cf7d6208cc680fa9866f80a53911041a": { + "address": "0x7dc095a5cf7d6208cc680fa9866f80a53911041a", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x7ea7134ed6c41d9e35dae7e7e1ff0fcc406224ca": { + "address": "0x7ea7134ed6c41d9e35dae7e7e1ff0fcc406224ca", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x80c5e6908368cb9db503ba968d7ec5a565bfb389": { + "address": "0x80c5e6908368cb9db503ba968d7ec5a565bfb389", + "name": "Zapper.Fi", + "isSC": {} + }, + "0x80f0f3e1482bab7fb6ed70185476f2fcdb596fa9": { + "address": "0x80f0f3e1482bab7fb6ed70185476f2fcdb596fa9", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x818e6fecd516ecc3849daf6845e3ec868087b755": { + "address": "0x818e6fecd516ecc3849daf6845e3ec868087b755", + "name": "Kyber", + "isSC": {} + }, + "0x828b154032950c8ff7cf8085d841723db2696056": { + "address": "0x828b154032950c8ff7cf8085d841723db2696056", + "name": "Curvefi", + "isSC": {} + }, + "0x8301ae4fc9c624d1d396cbdaa1ed877821d7c511": { + "address": "0x8301ae4fc9c624d1d396cbdaa1ed877821d7c511", + "name": "Curvefi", + "isSC": {} + }, + "0x83f798e925bcd4017eb265844fddabb448f1707d": { + "address": "0x83f798e925bcd4017eb265844fddabb448f1707d", + "name": "Yearn", + "isSC": {} + }, + "0x8589427373d6d84e98730d7795d8f6f8731fda16": { + "address": "0x8589427373d6d84e98730d7795d8f6f8731fda16", + "name": "Tornado.cash", + "isSC": {} + }, + "0x862916f9709e499a94fbca7a8f451eb443d34cad": { + "address": "0x862916f9709e499a94fbca7a8f451eb443d34cad", + "name": "DeversiFi", + "isSC": {} + }, + "0x87d80dbd37e551f58680b4217b23af6a752da83f": { + "address": "0x87d80dbd37e551f58680b4217b23af6a752da83f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x881d40237659c251811cec9c364ef91dc08d300c": { + "address": "0x881d40237659c251811cec9c364ef91dc08d300c", + "name": "MetaMask", + "isSC": {} + }, + "0x882d80d3a191859d64477eb78cca46599307ec1c": { + "address": "0x882d80d3a191859d64477eb78cca46599307ec1c", + "name": "Set Protocol", + "isSC": {} + }, + "0x884715e2dce8757c9ee19739c366b2c7c65f05b1": { + "address": "0x884715e2dce8757c9ee19739c366b2c7c65f05b1", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x88ad09518695c6c3712ac10a214be5109a655671": { + "address": "0x88ad09518695c6c3712ac10a214be5109a655671", + "name": "Gnosis Bridge", + "isSC": {} + }, + "0x88df13889e20efa93ff9a0c08f101f431bd9ddd7": { + "address": "0x88df13889e20efa93ff9a0c08f101f431bd9ddd7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x8b3d70d628ebd30d4a2ea82db95ba2e906c71633": { + "address": "0x8b3d70d628ebd30d4a2ea82db95ba2e906c71633", + "name": "bZx", + "isSC": {} + }, + "0x8a8d7ad4b89d91983cd069c58c4aa9f2f4166298": { + "address": "0x8a8d7ad4b89d91983cd069c58c4aa9f2f4166298", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x8c871606331caff597ef08f59d6fd6b97d70ba7b": { + "address": "0x8c871606331caff597ef08f59d6fd6b97d70ba7b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x8d12a197cb00d4747a1fe03395095ce2a5cc6819": { + "address": "0x8d12a197cb00d4747a1fe03395095ce2a5cc6819", + "name": "ForkDelta", + "isSC": {} + }, + "0x8de0d002dc83478f479dc31f76cb0a8aa7ccea17": { + "address": "0x8de0d002dc83478f479dc31f76cb0a8aa7ccea17", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x8e8bd01b5a9eb272cc3892a2e40e64a716aa2a40": { + "address": "0x8e8bd01b5a9eb272cc3892a2e40e64a716aa2a40", + "name": "dYdX", + "isSC": {} + }, + "0x910cbd523d972eb0a6f4cae4618ad62622b39dbf": { + "address": "0x910cbd523d972eb0a6f4cae4618ad62622b39dbf", + "name": "Tornado.cash", + "isSC": {} + }, + "0x91cf769a44e9d09b8e249886d0de4dbe0aa998f9": { + "address": "0x91cf769a44e9d09b8e249886d0de4dbe0aa998f9", + "name": "DeversiFi", + "isSC": {} + }, + "0x93ff6375e9ba6e8fba84b322944b237d7decc2d8": { + "address": "0x93ff6375e9ba6e8fba84b322944b237d7decc2d8", + "name": "SwapKiwi", + "isSC": {} + }, + "0x94a1b5cdb22c43faab4abeb5c74999895464ddaf": { + "address": "0x94a1b5cdb22c43faab4abeb5c74999895464ddaf", + "name": "Tornado.cash", + "isSC": {} + }, + "0x95e4649f5209dd292caf1f087b8f1db3be24927f": { + "address": "0x95e4649f5209dd292caf1f087b8f1db3be24927f", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x95e6f48254609a6ee006f7d493c8e5fb97094cef": { + "address": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", + "name": "0x", + "isSC": {} + }, + "0x97dec872013f6b5fb443861090ad931542878126": { + "address": "0x97dec872013f6b5fb443861090ad931542878126", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0x9ad122c22b14202b4490edaf288fdb3c7cb3ff5e": { + "address": "0x9ad122c22b14202b4490edaf288fdb3c7cb3ff5e", + "name": "Tornado.cash", + "isSC": {} + }, + "0x9ce551a9d2b1a4ec0cc6eb0e0cc12977f6ed306c": { + "address": "0x9ce551a9d2b1a4ec0cc6eb0e0cc12977f6ed306c", + "name": "Yearn", + "isSC": {} + }, + "0x9d0464996170c6b9e75eed71c68b99ddedf279e8": { + "address": "0x9d0464996170c6b9e75eed71c68b99ddedf279e8", + "name": "Curvefi", + "isSC": {} + }, + "0x9d25057e62939d3408406975ad75ffe834da4cdd": { + "address": "0x9d25057e62939d3408406975ad75ffe834da4cdd", + "name": "Yearn", + "isSC": {} + }, + "0xa0446d8804611944f1b527ecd37d7dcbe442caba": { + "address": "0xa0446d8804611944f1b527ecd37d7dcbe442caba", + "name": "1inch", + "isSC": {} + }, + "0xa160cdab225685da1d56aa342ad8841c3b53f291": { + "address": "0xa160cdab225685da1d56aa342ad8841c3b53f291", + "name": "Tornado.cash", + "isSC": {} + }, + "0xa2881a90bf33f03e7a3f803765cd2ed5c8928dfb": { + "address": "0xa2881a90bf33f03e7a3f803765cd2ed5c8928dfb", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xa42f6cada809bcf417deefbdd69c5c5a909249c0": { + "address": "0xa42f6cada809bcf417deefbdd69c5c5a909249c0", + "name": "NFT20", + "isSC": {} + }, + "0xa4fc358455febe425536fd1878be67ffdbdec59a": { + "address": "0xa4fc358455febe425536fd1878be67ffdbdec59a", + "name": "Sablier", + "isSC": {} + }, + "0xa60c772958a3ed56c1f15dd055ba37ac8e523a0d": { + "address": "0xa60c772958a3ed56c1f15dd055ba37ac8e523a0d", + "name": "Tornado.cash", + "isSC": {} + }, + "0xa7a7899d944fe658c4b0a1803bab2f490bd3849e": { + "address": "0xa7a7899d944fe658c4b0a1803bab2f490bd3849e", + "name": "IDEX", + "isSC": {} + }, + "0xa825cae02b310e9901b4776806ce25db520c8642": { + "address": "0xa825cae02b310e9901b4776806ce25db520c8642", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xa931f4eb165ac307fd7431b5ec6eadde53e14b0c": { + "address": "0xa931f4eb165ac307fd7431b5ec6eadde53e14b0c", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xacd43e627e64355f1861cec6d3a6688b31a6f952": { + "address": "0xacd43e627e64355f1861cec6d3a6688b31a6f952", + "name": "Yearn", + "isSC": {} + }, + "0xab0cd9fabcd3487cf22eb0b6a8c3ec1c0e00e643": { + "address": "0xab0cd9fabcd3487cf22eb0b6a8c3ec1c0e00e643", + "name": "DeversiFi", + "isSC": {} + }, + "0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407": { + "name": "Compound 0x", + "address": "0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407", + "token": { + "decimals": 8, + "symbol": "cZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-zrx.svg" + }, + "0xb576491f1e6e5e62f1d8f26062ee822b40b0e0d4": { + "address": "0xb576491f1e6e5e62f1d8f26062ee822b40b0e0d4", + "name": "Curvefi", + "isSC": {} + }, + "0xb5dfdfb2a1c97b329361d261239c51e5f88d035d": { + "address": "0xb5dfdfb2a1c97b329361d261239c51e5f88d035d", + "name": "DeversiFi", + "isSC": {} + }, + "0xb944d13b2f4047fc7bd3f7013bcf01b115fb260d": { + "address": "0xb944d13b2f4047fc7bd3f7013bcf01b115fb260d", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xba12222222228d8ba445958a75a0704d566bf2c8": { + "name": "Balancer", + "address": "0xba12222222228d8ba445958a75a0704d566bf2c8", + "isSC": {} + }, + "0xba214c1c1928a32bffe790263e38b4af9bfcd659": { + "address": "0xba214c1c1928a32bffe790263e38b4af9bfcd659", + "name": "Tornado.cash", + "isSC": {} + }, + "0xba2e7fed597fd0e3e70f5130bcdbbfe06bb94fe1": { + "address": "0xba2e7fed597fd0e3e70f5130bcdbbfe06bb94fe1", + "name": "Yearn", + "isSC": {} + }, + "0xbcdf538581f7167ec8228ec2c9b1cfc2f74788c7": { + "address": "0xbcdf538581f7167ec8228ec2c9b1cfc2f74788c7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xbcd7254a1d759efa08ec7c3291b2e85c5dcc12ce": { + "address": "0xbcd7254a1d759efa08ec7c3291b2e85c5dcc12ce", + "name": "LooksRare", + "isSC": {} + }, + "0xbeb09beb09e95e6febf0d6eeb1d0d46d1013cc3c": { + "address": "0xbeb09beb09e95e6febf0d6eeb1d0d46d1013cc3c", + "name": "Bebop", + "isSC": {} + }, + "0xbf06ea47c2cc300da596767024f87777d7e41d72": { + "address": "0xbf06ea47c2cc300da596767024f87777d7e41d72", + "name": "DeversiFi", + "isSC": {} + }, + "0xbf86f56cd4592fed0d7893e12461e19fcbbf0cd5": { + "address": "0xbf86f56cd4592fed0d7893e12461e19fcbbf0cd5", + "name": "DeversiFi", + "isSC": {} + }, + "0xc040d51b07aea5d94a89bc21e8078b77366fc6c7": { + "address": "0xc040d51b07aea5d94a89bc21e8078b77366fc6c7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xc0c59cde851bfcbdddd3377ec10ea54a18efb937": { + "address": "0xc0c59cde851bfcbdddd3377ec10ea54a18efb937", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xc11b1268c1a384e55c48c2391d8d480264a3a7f4": { + "address": "0xc11b1268c1a384e55c48c2391d8d480264a3a7f4", + "name": "Compound Wrapped BTC", + "isSC": {}, + "token": { + "decimals": 8, + "symbol": "cWBTC" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-wbtc.svg" + }, + "0xc36442b4a4522e871399cd717abdd847ab11fe88": { + "name": "UniswapV3Pool", + "address": "0xc36442b4a4522e871399cd717abdd847ab11fe88", + "isSC": {} + }, + "0xc3c028721f854bc75967cbe432fb0e221908baa1": { + "address": "0xc3c028721f854bc75967cbe432fb0e221908baa1", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xc52569b5a349a7055e9192dbdd271f1bd8133277": { + "address": "0xc52569b5a349a7055e9192dbdd271f1bd8133277", + "name": "IPOR", + "isSC": {} + }, + "0xc6581ce3a005e2801c1e0903281bbd318ec5b5c2": { + "address": "0xc6581ce3a005e2801c1e0903281bbd318ec5b5c2", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xc79764398a159ea8e61af98d7da6f2c8cae4c3a9": { + "address": "0xc79764398a159ea8e61af98d7da6f2c8cae4c3a9", + "name": "Idle", + "isSC": {} + }, + "0xc92e8bdf79f0507f65a392b0ab4667716bfe0110": { + "name": "CowSwap", + "address": "0xc92e8bdf79f0507f65a392b0ab4667716bfe0110", + "isSC": {} + }, + "0xcb6e4b9b7403ec4f2f6abd20beec457ae22eccf1": { + "address": "0xcb6e4b9b7403ec4f2f6abd20beec457ae22eccf1", + "name": "RooTroop", + "isSC": {} + }, + "0xd01590bf566d070d4ce04743705e835f81ff77ca": { + "address": "0xd01590bf566d070d4ce04743705e835f81ff77ca", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xd1f3e9b413f5c9fd56f044699c64ff710e7e5a9a": { + "address": "0xd1f3e9b413f5c9fd56f044699c64ff710e7e5a9a", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xd37bbe5744d730a1d98d8dc97c42f0ca46ad7146": { + "address": "0xd37bbe5744d730a1d98d8dc97c42f0ca46ad7146", + "name": "THORChain", + "isSC": {} + }, + "0xd4b88df4d29f5cedd6857912842cff3b20c8cfa3": { + "address": "0xd4b88df4d29f5cedd6857912842cff3b20c8cfa3", + "name": "Tornado.cash", + "isSC": {} + }, + "0xd55c1ca9f5992a2e5e379dce49abf24294abe055": { + "address": "0xd55c1ca9f5992a2e5e379dce49abf24294abe055", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xd691f27f38b395864ea86cfc7253969b409c362d": { + "address": "0xd691f27f38b395864ea86cfc7253969b409c362d", + "name": "Tornado.cash", + "isSC": {} + }, + "0xd883264737ed969d2696ee4b4caf529c2fc2a141": { + "address": "0xd883264737ed969d2696ee4b4caf529c2fc2a141", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xd91ff16ef92568fc27f466c3c5613e43313ab1dc": { + "address": "0xd91ff16ef92568fc27f466c3c5613e43313ab1dc", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xdef1c0ded9bec7f1a1670819833240f027b25eff": { + "address": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", + "name": "0x", + "isSC": {} + }, + "0xe2e3441004e7d377a2d97142e75d465e0dd36af9": { + "address": "0xe2e3441004e7d377a2d97142e75d465e0dd36af9", + "name": "Hashflow", + "isSC": {} + }, + "0xe499657190d515119077af5d64f44b6f850baea5": { + "address": "0xe499657190d515119077af5d64f44b6f850baea5", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xe4c9194962532feb467dce8b3d42419641c6ed2e": { + "address": "0xe4c9194962532feb467dce8b3d42419641c6ed2e", + "name": "1inch.exchange", + "isSC": {} + }, + "0xe592427a0aece92de3edee1f18e0157c05861564": { + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0xe592427a0aece92de3edee1f18e0157c05861564", + "isSC": {} + }, + "0xe5c783ee536cf5e63e792988335c4255169be4e1": { + "address": "0xe5c783ee536cf5e63e792988335c4255169be4e1", + "name": "OpenSea (old)", + "isSC": {} + }, + "0xed7d74aa7eb1f12f83da36dfac1de2257b4e7523": { + "address": "0xed7d74aa7eb1f12f83da36dfac1de2257b4e7523", + "name": "IPOR", + "isSC": {} + }, + "0xed9d5aa6124a3310b80a2468c67763627653887d": { + "address": "0xed9d5aa6124a3310b80a2468c67763627653887d", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b": { + "address": "0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xf173214c720f58e03e194085b1db28b50acdeead": { + "address": "0xf173214c720f58e03e194085b1db28b50acdeead", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xf506828b166de88ca2edb2a98d960abba0d2402a": { + "address": "0xf506828b166de88ca2edb2a98d960abba0d2402a", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xf53bbfbff01c50f2d42d542b09637dca97935ff7": { + "address": "0xf53bbfbff01c50f2d42d542b09637dca97935ff7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xf5dce57282a584d2746faf1593d3121fcac444dc": { + "address": "0xf5dce57282a584d2746faf1593d3121fcac444dc", + "name": "Compound Sai (Legacy Dai)", + "isSC": {}, + "token": { + "decimals": 8, + "symbol": "cSAI" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-sai.svg" + }, + "0xf5bb20e73c59e0f643ae4bcd89d761ebdec83b73": { + "address": "0xf5bb20e73c59e0f643ae4bcd89d761ebdec83b73", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xf60dd140cff0706bae9cd734ac3ae76ad9ebc32a": { + "address": "0xf60dd140cff0706bae9cd734ac3ae76ad9ebc32a", + "name": "Tornado.cash", + "isSC": {} + }, + "0xf67721a2d8f736e75a49fdd7fad2e31d8676542a": { + "address": "0xf67721a2d8f736e75a49fdd7fad2e31d8676542a", + "name": "Tornado.cash", + "isSC": {} + }, + "0xf6d7e24ff16195a9f5c5df431ef4b3f78c23bf6d": { + "address": "0xf6d7e24ff16195a9f5c5df431ef4b3f78c23bf6d", + "name": "DeversiFi", + "isSC": {} + }, + "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb": { + "address": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", + "name": "0x", + "isSC": {} + }, + "0xf849de01b080adc3a814fabe1e2087475cf2e354": { + "address": "0xf849de01b080adc3a814fabe1e2087475cf2e354", + "name": "X2Y2", + "isSC": {} + }, + "0xf78765bd14b4e8527d9e4e5c5a5c11a44ad12f47": { + "address": "0xf78765bd14b4e8527d9e4e5c5a5c11a44ad12f47", + "name": "Biconomy", + "isSC": {} + }, + "0xfed24ec7e22f573c2e08aef55aa6797ca2b3a051": { + "address": "0xfed24ec7e22f573c2e08aef55aa6797ca2b3a051", + "name": "LooksRare", + "isSC": {} + }, + "0xfd8610d20aa15b7b2e3be39b396a1bc3516c7144": { + "address": "0xfd8610d20aa15b7b2e3be39b396a1bc3516c7144", + "name": "Tornado.cash", + "isSC": {} + }, + "0xfa71b63935cf9878e009ba6595da08f6d75c4aa1": { + "address": "0xfa71b63935cf9878e009ba6595da08f6d75c4aa1", + "name": "Kyber", + "isSC": {} + }, + "0xf996d7d9bacb9217ca64bbce1b1cd72e0e886be6": { + "address": "0xf996d7d9bacb9217ca64bbce1b1cd72e0e886be6", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xa1787206d5b1be0f432c4c4f96dc4d1257a1dd14": { + "address": "0xa1787206d5b1be0f432c4c4f96dc4d1257a1dd14", + "name": "Yearn", + "isSC": {} + }, + "0xa2609b2b43ac0f5ebe27deb944d2a399c201e3da": { + "address": "0xa2609b2b43ac0f5ebe27deb944d2a399c201e3da", + "name": "Yearn", + "isSC": {} + }, + "0xa3a7b6f88361f48403514059f1f16c8e78d60eec": { + "address": "0xa3a7b6f88361f48403514059f1f16c8e78d60eec", + "name": "Arbitrum Bridge", + "isSC": {} + }, + "0xa9429271a28f8543efffa136994c0839e7d7bf77": { + "address": "0xa9429271a28f8543efffa136994c0839e7d7bf77", + "name": "Badger", + "isSC": {} + }, + "0xae76c84c9262cdb9abc0c2c8888e62db8e22a0bf": { + "address": "0xae76c84c9262cdb9abc0c2c8888e62db8e22a0bf", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xaeaac358560e11f52454d997aaff2c5731b6f8a6": { + "address": "0xaeaac358560e11f52454d997aaff2c5731b6f8a6", + "name": "Tornado.cash", + "isSC": {} + }, + "0xaf7adb208ac7d5a548cf9aa5b4141818190a41aa": { + "address": "0xaf7adb208ac7d5a548cf9aa5b4141818190a41aa", + "name": "1inch", + "isSC": {} + }, + "0xaf8ae6955d07776ab690e565ba6fbc79b8de3a5d": { + "address": "0xaf8ae6955d07776ab690e565ba6fbc79b8de3a5d", + "name": "DeversiFi", + "isSC": {} + }, + "0xb16c1342e617a5b6e4b631eb114483fdb289c0a4": { + "name": "SudoSwapFactory", + "address": "0xb16c1342e617a5b6e4b631eb114483fdb289c0a4", + "isSC": {} + }, + "0xb1c8094b234dce6e03f10a5b673c1d8c69739a00": { + "address": "0xb1c8094b234dce6e03f10a5b673c1d8c69739a00", + "name": "Tornado.cash", + "isSC": {} + }, + "0xb4a2e49818dd8a5cdd818f22ab99263b62ddeb6c": { + "address": "0xb4a2e49818dd8a5cdd818f22ab99263b62ddeb6c", + "name": "X Marketplace", + "isSC": {} + }, + "0xb4db55a20e0624edd82a0cf356e3488b4669bd27": { + "address": "0xb4db55a20e0624edd82a0cf356e3488b4669bd27", + "name": "1inch", + "isSC": {} + }, + "0xb541fc07bc7619fd4062a54d96268525cbc6ffef": { + "address": "0xb541fc07bc7619fd4062a54d96268525cbc6ffef", + "name": "Tornado.cash", + "isSC": {} + }, + "0xb5e96c3ad1ccc79e7ab13433471baf785bb4977e": { + "address": "0xb5e96c3ad1ccc79e7ab13433471baf785bb4977e", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xb6cfbf322db47d39331e306005dc7e5e6549942b": { + "address": "0xb6cfbf322db47d39331e306005dc7e5e6549942b", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xb70bc06d2c9bf03b3373799606dc7d39346c06b3": { + "address": "0xb70bc06d2c9bf03b3373799606dc7d39346c06b3", + "name": "Paraswap", + "isSC": {} + }, + "0xb7520a5f8c832c573d6bd0df955fc5c9b72400f7": { + "address": "0xb7520a5f8c832c573d6bd0df955fc5c9b72400f7", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xb7896fce748396ecfc240f5a0d3cc92ca42d7d84": { + "address": "0xb7896fce748396ecfc240f5a0d3cc92ca42d7d84", + "name": "PoolTogether", + "isSC": {} + }, + "0xb92de8b30584392af27726d5ce04ef3c4e5c9924": { + "address": "0xb92de8b30584392af27726d5ce04ef3c4e5c9924", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xb9812e2fa995ec53b5b6df34d21f9304762c5497": { + "address": "0xb9812e2fa995ec53b5b6df34d21f9304762c5497", + "name": "DutchX", + "isSC": {} + }, + "0xb99a23b1a4585fc56d0ec3b76528c27cad427473": { + "address": "0xb99a23b1a4585fc56d0ec3b76528c27cad427473", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xbcc4371cc40592794bf5b727c17cf7de37ac180a": { + "address": "0xbcc4371cc40592794bf5b727c17cf7de37ac180a", + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "isSC": {} + }, + "0xbd6a40bb904aea5a49c59050b5395f7484a4203d": { + "address": "0xbd6a40bb904aea5a49c59050b5395f7484a4203d", + "name": "Sablier", + "isSC": {} + }, + "0xc21d353ff4ee73c572425697f4f5aad2109fe35b": { + "address": "0xc21d353ff4ee73c572425697f4f5aad2109fe35b", + "name": "Alchemix", + "isSC": {} + }, + "0xc4a1c45d5546029fd57128483ae65b56124bfa6a": { + "address": "0xc4a1c45d5546029fd57128483ae65b56124bfa6a", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xc73e0383f3aff3215e6f04b0331d58cecf0ab849": { + "address": "0xc73e0383f3aff3215e6f04b0331d58cecf0ab849", + "name": "MakerDAO", + "isSC": {} + }, + "0xc7eb739e2651484daa1717433de1736a6529cfcc": { + "address": "0xc7eb739e2651484daa1717433de1736a6529cfcc", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xcee284f754e854890e311e3280b767f80797180d": { + "address": "0xcee284f754e854890e311e3280b767f80797180d", + "name": "Arbitrum Bridge", + "isSC": {} + }, + "0xd4777e164c6c683e10593e08760b803d58529a8e": { + "address": "0xd4777e164c6c683e10593e08760b803d58529a8e", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xd6ad7a6750a7593e092a9b218d66c0a814a3436e": { + "address": "0xd6ad7a6750a7593e092a9b218d66c0a814a3436e", + "name": "Yearn", + "isSC": {} + }, + "0xd96f2b1c14db8458374d9aca76e26c3d18364307": { + "address": "0xd96f2b1c14db8458374d9aca76e26c3d18364307", + "name": "Tornado.cash", + "isSC": {} + }, + "0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f": { + "name": "SushiSwap", + "address": "0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f", + "isSC": {} + }, + "0xdf02ffeafdb79e564ae9fdac6545c5f4c2178400": { + "address": "0xdf02ffeafdb79e564ae9fdac6545c5f4c2178400", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xdf869fad6db91f437b59f1edefab319493d4c4ce": { + "address": "0xdf869fad6db91f437b59f1edefab319493d4c4ce", + "name": "Gitcoin", + "isSC": {} + }, + "0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8": { + "address": "0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8", + "name": "Curve.fi", + "isSC": {} + }, + "0xe89a6d0509faf730bd707bf868d9a2a744a363c7": { + "address": "0xe89a6d0509faf730bd707bf868d9a2a744a363c7", + "name": "C.R.E.A.M", + "isSC": {} + }, + "0xe28ffac44b0c430aa3e62a9bc211f7d825d6c1f9": { + "address": "0xe28ffac44b0c430aa3e62a9bc211f7d825d6c1f9", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xe8e45431b93215566ba923a7e611b7342ea954df": { + "address": "0xe8e45431b93215566ba923a7e611b7342ea954df", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xe9078a97eef2bb502a9f792169f9c03626649248": { + "address": "0xe9078a97eef2bb502a9f792169f9c03626649248", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xeb66acc3d011056b00ea521f8203580c2e5d3991": { + "address": "0xeb66acc3d011056b00ea521f8203580c2e5d3991", + "name": "Idle", + "isSC": {} + }, + "0xe9cf7887b93150d4f2da7dfc6d502b216438f244": { + "address": "0xe9cf7887b93150d4f2da7dfc6d502b216438f244", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad": { + "address": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", + "name": "0x", + "isSC": {} + }, + "0xf13d9f380cfefe97b1fb52fb279655962fca47af": { + "address": "0xf13d9f380cfefe97b1fb52fb279655962fca47af", + "name": "X Marketplace", + "isSC": {} + }, + "0xf42aa99f011a1fa7cda90e5e98b277e306bca83e": { + "address": "0xf42aa99f011a1fa7cda90e5e98b277e306bca83e", + "name": "LooksRare", + "isSC": {} + }, + "0xf79cb3bea83bd502737586a6e8b133c378fd1ff2": { + "address": "0xf79cb3bea83bd502737586a6e8b133c378fd1ff2", + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "isSC": {} + }, + "0xff33b21bc54aee753891a15e72b7a152a5a782dc": { + "address": "0xff33b21bc54aee753891a15e72b7a152a5a782dc", + "name": "DeversiFi", + "isSC": {} + }, + "0xfe65d1ba9a745b131dad1a066861bb5d9ce4767b": { + "address": "0xfe65d1ba9a745b131dad1a066861bb5d9ce4767b", + "name": "DeversiFi", + "isSC": {} + }, + "0xf61718057901f84c4eec4339ef8f0d86d2b45600": { + "address": "0xf61718057901f84c4eec4339ef8f0d86d2b45600", + "name": "Yearn", + "isSC": {} + }, + "0xa69b8074ce03a33b13057b1e9d37dcde0024aaff": { + "name": "$WALLET distributor", + "address": "0xa69b8074ce03a33b13057b1e9d37dcde0024aaff", + "isSC": {} + }, + "0x10ed43c718714eb63d5aa57b78b54704e256024e": { + "name": "PancakeSwap", + "address": "0x10ed43c718714eb63d5aa57b78b54704e256024e", + "isSC": {} + }, + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad", + "isSC": {} + }, + "0x643770e279d5d0733f21d6dc03a8efbabf3255b4": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x643770e279d5d0733f21d6dc03a8efbabf3255b4", + "isSC": {} + }, + "0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4", + "isSC": {} + }, + "0x5302086a3a25d473aabbd0356eff8dd811a4d89b": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x5302086a3a25d473aabbd0356eff8dd811a4d89b", + "isSC": {} + }, + "0x198ef79f1f515f02dfe9e3115ed9fc07183f02fc": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x198ef79f1f515f02dfe9e3115ed9fc07183f02fc", + "isSC": {} + }, + "0x82635af6146972cd6601161c4472ffe97237d292": { + "name": "Uniswap Router", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg", + "address": "0x82635af6146972cd6601161c4472ffe97237d292", + "isSC": {} + }, + "0x9008d19f58aabd9ed0d60971565aa8510560ab41": { + "name": "CowSwap", + "address": "0x9008d19f58aabd9ed0d60971565aa8510560ab41", + "isSC": {} + }, + "0xdef171fe48cf0115b1d80b88dc8eab59176fee57": { + "name": "ParaSwapV5", + "address": "0xdef171fe48cf0115b1d80b88dc8eab59176fee57", + "isSC": {} + }, + "0xeb94eca012ec0bbb254722fdda2ce7475875a52b": { + "name": "SushiSwap", + "address": "0xeb94eca012ec0bbb254722fdda2ce7475875a52b", + "isSC": {} + }, + "0x1b02da8cb0d097eb8d57a175b88c7d8b47997506": { + "name": "SushiSwap", + "address": "0x1b02da8cb0d097eb8d57a175b88c7d8b47997506", + "isSC": {} + }, + "0xe7eb31f23a5befeeff76dbd2ed6adc822568a5d2": { + "name": "SushiSwap", + "address": "0xe7eb31f23a5befeeff76dbd2ed6adc822568a5d2", + "isSC": {} + }, + "0xc35dadb65012ec5796536bd9864ed8773abc74c4": { + "name": "BentoBoxV1", + "address": "0xc35dadb65012ec5796536bd9864ed8773abc74c4", + "isSC": {} + }, + "0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff": { + "name": "QuickSwap", + "address": "0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff", + "isSC": {} + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "name": "Wrapped Ether", + "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/weth.svg" + }, + "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270": { + "name": "Wrapped MATIC", + "address": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "WMATIC" + } + }, + "0x8dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x8dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf", + "isSC": {} + }, + "0xeffc18fc3b7eb8e676dac549e0c693ad50d1ce31": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0xeffc18fc3b7eb8e676dac549e0c693ad50d1ce31", + "isSC": {} + }, + "0xcc9a0b7c43dc2a5f023bb9b738e45b0ef6b06e04": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0xcc9a0b7c43dc2a5f023bb9b738e45b0ef6b06e04", + "isSC": {} + }, + "0xd322a49006fc828f9b5b37ab215f99b4e5cab19c": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0xd322a49006fc828f9b5b37ab215f99b4e5cab19c", + "isSC": {} + }, + "0xbeadf48d62acc944a06eeae0a9054a90e5a7dc97": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0xbeadf48d62acc944a06eeae0a9054a90e5a7dc97", + "isSC": {} + }, + "0x1e4b7a6b903680eab0c5dabcb8fd429cd2a9598c": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x1e4b7a6b903680eab0c5dabcb8fd429cd2a9598c", + "isSC": {} + }, + "0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2": { + "name": "AavePoolV3", + "address": "0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2", + "isSC": {} + }, + "0x794a61358d6845594f94dc1db02a252b5b4814ad": { + "name": "Aave pool", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x794a61358d6845594f94dc1db02a252b5b4814ad", + "isSC": {} + }, + "0x5760e34c4003752329bc77790b1de44c2799f8c3": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x5760e34c4003752329bc77790b1de44c2799f8c3", + "isSC": {} + }, + "0x76d3030728e52deb8848d5613abade88441cbc59": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x76d3030728e52deb8848d5613abade88441cbc59", + "isSC": {} + }, + "0x90df02551bb792286e8d4f13e0e357b4bf1d6a57": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg", + "address": "0x90df02551bb792286e8d4f13e0e357b4bf1d6a57", + "isSC": {} + }, + "0xc874b064f465bdd6411d45734b56fac750cda29a": { + "name": "StakeWise", + "address": "0xc874b064f465bdd6411d45734b56fac750cda29a", + "isSC": {} + }, + "0x8658047e48cc09161f4152c79155dac1d710ff0a": { + "name": "Silo", + "address": "0x8658047e48cc09161f4152c79155dac1d710ff0a", + "isSC": {} + }, + "0xf380f025675a868ed5614a1dd77c6b05f4147004": { + "name": "SiloLlama", + "address": "0xf380f025675a868ed5614a1dd77c6b05f4147004", + "isSC": {} + }, + "0x9992f660137979c1ca7f8b119cd16361594e3681": { + "name": "Silo", + "address": "0x9992f660137979c1ca7f8b119cd16361594e3681", + "isSC": {} + }, + "0x8f9eaee5c5df888aba3c1ab19689a0660d042c6d": { + "name": "Movr 1inch", + "address": "0x8f9eaee5c5df888aba3c1ab19689a0660d042c6d", + "isSC": {} + }, + "0x2fc9c3bf505b74e59a538fe9d67bc1deb4c03d91": { + "name": "Movr 1inch", + "address": "0x2fc9c3bf505b74e59a538fe9d67bc1deb4c03d91", + "isSC": {} + }, + "0xc30141b657f4216252dc59af2e7cdb9d8792e1b0": { + "name": "Movr Router", + "address": "0xc30141b657f4216252dc59af2e7cdb9d8792e1b0", + "isSC": {} + }, + "0x3901581b7ff54667a2bf51cb93dba704e60e24f4": { + "name": "Movr Anyswap", + "address": "0x3901581b7ff54667a2bf51cb93dba704e60e24f4", + "isSC": {} + }, + "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d": { + "name": "BoredApeYachtClub", + "address": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bayc.svg" + }, + "0xa258c4606ca8206d8aa700ce2143d7db854d168c": { + "name": "Yearn WETH Vault", + "address": "0xa258c4606ca8206d8aa700ce2143d7db854d168c", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVWETH" + } + }, + "0xa354f35829ae975e850e23e9615b11da1b3dc4de": { + "name": "Yearn USDC Vault", + "address": "0xa354f35829ae975e850e23e9615b11da1b3dc4de", + "isSC": {}, + "token": { + "decimals": 6, + "symbol": "YVUSDC" + } + }, + "0x7da96a3891add058ada2e826306d812c638d87a7": { + "name": "Yearn USDT Vault", + "address": "0x7da96a3891add058ada2e826306d812c638d87a7", + "isSC": {} + }, + "0xda816459f1ab5631232fe5e97a05bbbb94970c95": { + "name": "Yearn DAI Vault", + "address": "0xda816459f1ab5631232fe5e97a05bbbb94970c95", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVDAI" + } + }, + "0xdb25ca703181e7484a155dd612b06f57e12be5f0": { + "name": "Yearn YFI Vault", + "address": "0xdb25ca703181e7484a155dd612b06f57e12be5f0", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVYFI" + } + }, + "0xa696a63cc78dffa1a63e9e50587c197387ff6c7e": { + "name": "Yearn WBTC Vault", + "address": "0xa696a63cc78dffa1a63e9e50587c197387ff6c7e", + "isSC": {}, + "token": { + "decimals": 8, + "symbol": "YVWBTC" + } + }, + "0xb8c3b7a2a618c552c23b1e4701109a9e756bab67": { + "name": "Yearn 1INCH Vault", + "address": "0xb8c3b7a2a618c552c23b1e4701109a9e756bab67", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YV1INCH" + } + }, + "0xe11ba472f74869176652c35d30db89854b5ae84d": { + "name": "Yearn HEGIC Vault", + "address": "0xe11ba472f74869176652c35d30db89854b5ae84d", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVHEGIC" + } + }, + "0xfbeb78a723b8087fd2ea7ef1afec93d35e8bed42": { + "name": "Yearn UNI Vault", + "address": "0xfbeb78a723b8087fd2ea7ef1afec93d35e8bed42", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVUNI" + } + }, + "0x6d765cbe5bc922694afe112c140b8878b9fb0390": { + "name": "Yearn SUSHI Vault", + "address": "0x6d765cbe5bc922694afe112c140b8878b9fb0390", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVSUSHI" + } + }, + "0xfd0877d9095789caf24c98f7cce092fa8e120775": { + "name": "Yearn TUSD Vault", + "address": "0xfd0877d9095789caf24c98f7cce092fa8e120775", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVTUSD" + } + }, + "0xd9788f3931ede4d5018184e198699dc6d66c1915": { + "name": "Yearn AAVE Vault", + "address": "0xd9788f3931ede4d5018184e198699dc6d66c1915", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "YVAAVE" + } + }, + "0x03b82e4070ca32ff63a03f2ecfc16c0165689a9d": { + "name": "Curve AVAX yVault", + "address": "0x03b82e4070ca32ff63a03f2ecfc16c0165689a9d", + "isSC": {} + }, + "0x0446acab3e0242fcf33aa526f1c95a88068d5042": { + "name": "CRV yVault", + "address": "0x0446acab3e0242fcf33aa526f1c95a88068d5042", + "isSC": {} + }, + "0x0a0b23d9786963de69cb2447dc125c49929419d8": { + "name": "MIM yVault", + "address": "0x0a0b23d9786963de69cb2447dc125c49929419d8", + "isSC": {} + }, + "0x0dec85e74a92c52b7f708c4b10207d9560cefaf0": { + "name": "WFTM yVault", + "address": "0x0dec85e74a92c52b7f708c4b10207d9560cefaf0", + "isSC": {} + }, + "0x0fbbf9848d969776a5eb842edafaf29ef4467698": { + "name": "BOO yVault", + "address": "0x0fbbf9848d969776a5eb842edafaf29ef4467698", + "isSC": {} + }, + "0x1482faf8b5a9c458c94e6a561ccf93ed7a9f552e": { + "name": "WFTM yVault", + "address": "0x1482faf8b5a9c458c94e6a561ccf93ed7a9f552e", + "isSC": {} + }, + "0x148c05caf1bb09b5670f00d511718f733c54bc4c": { + "name": "USDT yVault", + "address": "0x148c05caf1bb09b5670f00d511718f733c54bc4c", + "isSC": {} + }, + "0x1b48641d8251c3e84ecbe3f2bd76b3701401906d": { + "name": "DOLA yVault", + "address": "0x1b48641d8251c3e84ecbe3f2bd76b3701401906d", + "isSC": {} + }, + "0x1e2fe8074a5ce1bb7394856b0c618e75d823b93b": { + "name": "fBEETS yVault", + "address": "0x1e2fe8074a5ce1bb7394856b0c618e75d823b93b", + "isSC": {} + }, + "0x209667b173fe4e9559bda7818e53bd5f5e0f9acd": { + "name": "MIM yVault", + "address": "0x209667b173fe4e9559bda7818e53bd5f5e0f9acd", + "isSC": {} + }, + "0x27cbf0fddb356a2d1ebdef604cfa90f8f300d34e": { + "name": "WFTM yVault", + "address": "0x27cbf0fddb356a2d1ebdef604cfa90f8f300d34e", + "isSC": {} + }, + "0x2c850cced00ce2b14aa9d658b7cad5df659493db": { + "name": "YFI yVault", + "address": "0x2c850cced00ce2b14aa9d658b7cad5df659493db", + "isSC": {} + }, + "0x357ca46da26e1eefc195287ce9d838a6d5023ef3": { + "name": "FRAX yVault", + "address": "0x357ca46da26e1eefc195287ce9d838a6d5023ef3", + "isSC": {} + }, + "0x3d8473724287eb1d903fe62688d3734de2b97ee8": { + "name": "Curve Geist yVault", + "address": "0x3d8473724287eb1d903fe62688d3734de2b97ee8", + "isSC": {} + }, + "0x3f0e90a85eab7f2c441379cfc9a080a4e864ae82": { + "name": "fBEETS yVault", + "address": "0x3f0e90a85eab7f2c441379cfc9a080a4e864ae82", + "isSC": {} + }, + "0x637ec617c86d24e421328e6caea1d92114892439": { + "name": "DAI yVault", + "address": "0x637ec617c86d24e421328e6caea1d92114892439", + "isSC": {} + }, + "0x85611d071406a9e08ba49c073087e3eb57819839": { + "name": "WBTC yVault", + "address": "0x85611d071406a9e08ba49c073087e3eb57819839", + "isSC": {} + }, + "0x8853a6232e3debe12098bf682898a92ec10c9921": { + "name": "WFTM yVault", + "address": "0x8853a6232e3debe12098bf682898a92ec10c9921", + "isSC": {} + }, + "0x9e3922fcbb28f40026da2e58926f0f249d8a138d": { + "name": "USDC yVault", + "address": "0x9e3922fcbb28f40026da2e58926f0f249d8a138d", + "isSC": {} + }, + "0x9f87fc463327021b510f7e84a5683e1bdce02dcc": { + "name": "USDC yVault", + "address": "0x9f87fc463327021b510f7e84a5683e1bdce02dcc", + "isSC": {} + }, + "0xa946c861de1dd6cb530a07687da99e989b929139": { + "name": "Curve USDT yVault", + "address": "0xa946c861de1dd6cb530a07687da99e989b929139", + "isSC": {} + }, + "0xa97e7da01c7047d6a65f894c99be8c832227a8bc": { + "name": "Curve MIM Pool Vault", + "address": "0xa97e7da01c7047d6a65f894c99be8c832227a8bc", + "isSC": {} + }, + "0xcbcaf8cb8cbeafa927ecee0c5c56560f83e9b7d9": { + "name": "Curve Tricrypto Pool yVault", + "address": "0xcbcaf8cb8cbeafa927ecee0c5c56560f83e9b7d9", + "isSC": {} + }, + "0xce2fc0bdc18bd6a4d9a725791a3dee33f3a23bb7": { + "name": "WETH yVault", + "address": "0xce2fc0bdc18bd6a4d9a725791a3dee33f3a23bb7", + "isSC": {} + }, + "0xd3c19eb022cac706c898d60d756bf1535d605e1d": { + "name": "SPELL yVault", + "address": "0xd3c19eb022cac706c898d60d756bf1535d605e1d", + "isSC": {} + }, + "0xef0210eb96c7eb36af8ed1c20306462764935607": { + "name": "USDC yVault", + "address": "0xef0210eb96c7eb36af8ed1c20306462764935607", + "isSC": {} + }, + "0xf137d22d7b23eeb1950b3e19d1f578c053ed9715": { + "name": "Curve Geist Pool yVault", + "address": "0xf137d22d7b23eeb1950b3e19d1f578c053ed9715", + "isSC": {} + }, + "0xc3ca90f164d43e2053cca591ac6e63fcaad80782": { + "name": "WFTM yVault", + "address": "0xc3ca90f164d43e2053cca591ac6e63fcaad80782", + "isSC": {} + }, + "0xd817a100ab8a29fe3dbd925c2eb489d67f758da9": { + "name": "WBTC yVault", + "address": "0xd817a100ab8a29fe3dbd925c2eb489d67f758da9", + "isSC": {} + }, + "0xf2d323621785a066e64282d2b407eac79cc04966": { + "name": "LINK yVault", + "address": "0xf2d323621785a066e64282d2b407eac79cc04966", + "isSC": {} + }, + "0x57bdbb788d0f39aeabe66774436c19196653c3f2": { + "name": "Tesseract USDC Vault", + "address": "0x57bdbb788d0f39aeabe66774436c19196653c3f2", + "isSC": {} + }, + "0x4c8c6379b7cd039c892ab179846cd30a1a52b125": { + "name": "Tesseract DAI Vault", + "address": "0x4c8c6379b7cd039c892ab179846cd30a1a52b125", + "isSC": {} + }, + "0x6962785c731e812073948a1f5e181cf83274d7c6": { + "name": "Tesseract WBTC Vault", + "address": "0x6962785c731e812073948a1f5e181cf83274d7c6", + "isSC": {} + }, + "0x3d44f03a04b08863cc8825384f834dfb97466b9b": { + "name": "Tesseract WETH Vault", + "address": "0x3d44f03a04b08863cc8825384f834dfb97466b9b", + "isSC": {} + }, + "0xe11678341625cd88bb25544e39b2c62cedcc83f1": { + "name": "Tesseract WMATIC Vault", + "address": "0xe11678341625cd88bb25544e39b2c62cedcc83f1", + "isSC": {} + }, + "0xbf07a0df119ca234634588fbdb5625594e2a5bca": { + "name": "Ambire Factory", + "address": "0xbf07a0df119ca234634588fbdb5625594e2a5bca", + "isSC": {} + }, + "0x460fad03099f67391d84c9cc0ea7aa2457969cea": { + "name": "Ambire Batcher", + "address": "0x460fad03099f67391d84c9cc0ea7aa2457969cea", + "isSC": {} + }, + "0x47cd7e91c3cbaaf266369fe8518345fc4fc12935": { + "name": "WALLET Staking Pool", + "address": "0x47cd7e91c3cbaaf266369fe8518345fc4fc12935", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "xWALLET" + } + }, + "0xb6456b57f03352be48bf101b46c1752a0813491a": { + "name": "ADX Staking Pool", + "address": "0xb6456b57f03352be48bf101b46c1752a0813491a", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "ADX-STAKING" + } + }, + "0x7be8076f4ea4a4ad08075c2508e481d6c946d12b": { + "name": "OpenSea", + "address": "0x7be8076f4ea4a4ad08075c2508e481d6c946d12b", + "isSC": {} + }, + "0x00005ea00ac477b1030ce78506496e8c2de24bf5": { + "name": "OpenSeaDrop", + "address": "0x00005ea00ac477b1030ce78506496e8c2de24bf5", + "isSC": {} + }, + "0x0f545c6178830e249117b5162120378735fdd635": { + "name": "Swappin", + "address": "0x0f545c6178830e249117b5162120378735fdd635", + "isSC": {} + }, + "0xfd090f34707ac2ca546a4b442ff708308ded8909": { + "name": "Swappin", + "address": "0xfd090f34707ac2ca546a4b442ff708308ded8909", + "isSC": {} + }, + "0xa5f8c5dbd5f286960b9d90548680ae5ebff07652": { + "name": "PancakeFarm", + "address": "0xa5f8c5dbd5f286960b9d90548680ae5ebff07652", + "isSC": {} + }, + "0x2b2e8cda09bba9660dca5cb6233787738ad68329": { + "name": "SudoSwapRouter", + "address": "0x2b2e8cda09bba9660dca5cb6233787738ad68329", + "isSC": {} + }, + "0x08ce97807a81896e85841d74fb7e7b065ab3ef05": { + "name": "LSSVMPairEnumerableETH", + "address": "0x08ce97807a81896e85841d74fb7e7b065ab3ef05", + "isSC": {} + }, + "0xa5adc5484f9997fbf7d405b9aa62a7d88883c345": { + "name": "Mean finance", + "address": "0xa5adc5484f9997fbf7d405b9aa62a7d88883c345", + "isSC": {} + }, + "0xdf0dbc66f85979a1d54671c4d9e439f306be27ee": { + "name": "DCAHub Companion", + "address": "0xdf0dbc66f85979a1d54671c4d9e439f306be27ee", + "isSC": {} + }, + "0xfff6d276bc37c61a23f06410dce4a400f66420f8": { + "name": "GMXPositionRouter", + "address": "0xfff6d276bc37c61a23f06410dce4a400f66420f8", + "isSC": {} + }, + "0x352f684ab9e97a6321a13cf03a61316b681d9fd2": { + "name": "GMXOrderHandler", + "address": "0x352f684ab9e97a6321a13cf03a61316b681d9fd2", + "isSC": {} + }, + "0x7c68c7866a64fa2160f78eeae12217ffbf871fa8": { + "name": "ExchangeRouter", + "address": "0x7c68c7866a64fa2160f78eeae12217ffbf871fa8", + "isSC": {} + }, + "0x11e590f6092d557bf71baded50d81521674f8275": { + "name": "ExchangeRouter", + "address": "0x11e590f6092d557bf71baded50d81521674f8275", + "isSC": {} + }, + "0x3a23f943181408eac424116af7b7790c94cb97a5": { + "name": "SocketGateway", + "address": "0x3a23f943181408eac424116af7b7790c94cb97a5", + "isSC": {} + }, + "0x942f9ce5d9a33a82f88d233aeb3292e680230348": { + "name": "Gas Tank", + "address": "0x942f9ce5d9a33a82f88d233aeb3292e680230348" + }, + "0x60ae616a2155ee3d9a68541ba4544862310933d4": { + "name": "Joe Router", + "address": "0x60ae616a2155ee3d9a68541ba4544862310933d4", + "isSC": {} + }, + "0xae7ab96520de3a18e5e111b5eaab095312d7fe84": { + "name": "Liquid staked Ether 2.0", + "address": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "stETH" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stETH.svg" + }, + "0x17144556fd3424edc8fc8a4c940b2d04936d17eb": { + "name": "Lido Staking Ether Implementation", + "address": "0x17144556fd3424edc8fc8a4c940b2d04936d17eb", + "isSC": {} + }, + "0x889edc2edab5f40e902b864ad4d7ade8e412f9b1": { + "name": "stETH Withdrawal NFT (unstETH)", + "address": "0x889edc2edab5f40e902b864ad4d7ade8e412f9b1", + "isSC": {} + }, + "0xe42c659dc09109566720ea8b2de186c2be7d94d9": { + "name": "stETH Withdrawal NFT (unstETH) implementation", + "address": "0xe42c659dc09109566720ea8b2de186c2be7d94d9", + "isSC": {} + }, + "0x9ee91f9f426fa633d227f7a9b000e28b9dfd8599": { + "name": "Liquid staked MATIC", + "address": "0x9ee91f9f426fa633d227f7a9b000e28b9dfd8599", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "stMATIC" + }, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stMATIC.svg" + }, + "0x6c25aebd494a9984a3d7c8cf395c8713e0c74d98": { + "name": "Lido Staking Matic Implementation", + "address": "0x6c25aebd494a9984a3d7c8cf395c8713e0c74d98", + "isSC": {} + }, + "0x0c2de78e008020500c38e76e2956ae4a81c5124c": { + "name": "Swappin", + "address": "0x0c2de78e008020500c38e76e2956ae4a81c5124c", + "isSC": {} + }, + "0xa3c4e32af0da5efaddb20cc9fb26159f55c8c42f": { + "name": "Stargate Implementation L2 V2", + "address": "0xa3c4e32af0da5efaddb20cc9fb26159f55c8c42f", + "isSC": {} + }, + "0x9ab2de34a33fb459b538c43f251eb825645e8595": { + "name": "GMX Vault", + "address": "0x9ab2de34a33fb459b538c43f251eb825645e8595", + "isSC": {} + }, + "0x5f719c2f1095f7b9fc68a68e35b51194f4b6abe8": { + "name": "GMX Router", + "address": "0x5f719c2f1095f7b9fc68a68e35b51194f4b6abe8", + "isSC": {} + }, + "0xe1ae4d4b06a5fe1fc288f6b4cd72f9f8323b107f": { + "name": "GMX Glp Manager", + "address": "0xe1ae4d4b06a5fe1fc288f6b4cd72f9f8323b107f", + "isSC": {} + }, + "0x82147c5a7e850ea4e28155df107f2590fd4ba327": { + "name": "GMX Reward RouterV2", + "address": "0x82147c5a7e850ea4e28155df107f2590fd4ba327", + "isSC": {} + }, + "0x01234181085565ed162a948b6a5e88758cd7c7b8": { + "name": "GMX GLP", + "address": "0x01234181085565ed162a948b6a5e88758cd7c7b8", + "isSC": {} + }, + "0x62edc0692bd897d2295872a9ffcac5425011c661": { + "name": "GMX GMX", + "address": "0x62edc0692bd897d2295872a9ffcac5425011c661", + "isSC": {} + }, + "0xff1489227bbaac61a9209a08929e4c2a526ddd17": { + "name": "GMX EsGMX", + "address": "0xff1489227bbaac61a9209a08929e4c2a526ddd17", + "isSC": {} + }, + "0x8087a341d32d445d9ac8acc9c14f5781e04a26d2": { + "name": "GMX BnGMX", + "address": "0x8087a341d32d445d9ac8acc9c14f5781e04a26d2", + "isSC": {} + }, + "0xc0253c3cc6aa5ab407b5795a04c28fb063273894": { + "name": "GMX USDG", + "address": "0xc0253c3cc6aa5ab407b5795a04c28fb063273894", + "isSC": {} + }, + "0x2bd10f8e93b3669b6d42e74eeedc65dd1b0a1342": { + "name": "GMX Staked Gmx Tracker", + "address": "0x2bd10f8e93b3669b6d42e74eeedc65dd1b0a1342", + "isSC": {} + }, + "0x908c4d94d34924765f1edc22a1dd098397c59dd4": { + "name": "GMX Bonus Gmx Tracker", + "address": "0x908c4d94d34924765f1edc22a1dd098397c59dd4", + "isSC": {} + }, + "0x4d268a7d4c16ceb5a606c173bd974984343fea13": { + "name": "GMX Fee Gmx Tracker", + "address": "0x4d268a7d4c16ceb5a606c173bd974984343fea13", + "isSC": {} + }, + "0x9e295b5b976a184b14ad8cd72413ad846c299660": { + "name": "GMX Staked Glp Tracker", + "address": "0x9e295b5b976a184b14ad8cd72413ad846c299660", + "isSC": {} + }, + "0xd2d1162512f927a7e282ef43a362659e4f2a728f": { + "name": "GMX Fee Glp Tracker", + "address": "0xd2d1162512f927a7e282ef43a362659e4f2a728f", + "isSC": {} + }, + "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a": { + "name": "GMX Staked Gmx Distributor", + "address": "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a", + "isSC": {}, + "token": { + "decimals": 18, + "symbol": "GMX" + } + }, + "0x23208b91a98c7c1cd9fe63085bff68311494f193": { + "name": "GMX Bonus Gmx Distributor", + "address": "0x23208b91a98c7c1cd9fe63085bff68311494f193", + "isSC": {} + }, + "0x03f349b3cc4f200d7fae4d8ddaf1507f5a40d356": { + "name": "GMX Fee Gmx Distributor", + "address": "0x03f349b3cc4f200d7fae4d8ddaf1507f5a40d356", + "isSC": {} + }, + "0xdd593cf40734199afc9207ebe9fff23da4bf7720": { + "name": "GMX Staked Glp Distributor", + "address": "0xdd593cf40734199afc9207ebe9fff23da4bf7720", + "isSC": {} + }, + "0x1de098faf30bd74f22753c28db17a2560d4f5554": { + "name": "GMX Fee Glp Distributor", + "address": "0x1de098faf30bd74f22753c28db17a2560d4f5554", + "isSC": {} + }, + "0x472361d3ca5f49c8e633fb50385bfad1e018b445": { + "name": "GMX Gmx Vester", + "address": "0x472361d3ca5f49c8e633fb50385bfad1e018b445", + "isSC": {} + }, + "0x62331a7bd1dfb3a7642b7db50b5509e57ca3154a": { + "name": "GMX Glp Vester", + "address": "0x62331a7bd1dfb3a7642b7db50b5509e57ca3154a", + "isSC": {} + }, + "0x5643f4b25e36478ee1e90418d5343cb6591bcb9d": { + "name": "GMX Staked Glp", + "address": "0x5643f4b25e36478ee1e90418d5343cb6591bcb9d", + "isSC": {} + }, + "0x4296e307f108b2f583ff2f7b7270ee7831574ae5": { + "name": "GMX Order Book", + "address": "0x4296e307f108b2f583ff2f7b7270ee7831574ae5", + "isSC": {} + }, + "0x5c5dbbcdf420b5d81d4ffdba5b26eb24e6e60d52": { + "name": "GMX AdlHandler", + "address": "0x5c5dbbcdf420b5d81d4ffdba5b26eb24e6e60d52", + "isSC": {} + }, + "0x80edf3ea04d30fec027c4b397ab034d7fa98b894": { + "name": "GMX AdlUtils", + "address": "0x80edf3ea04d30fec027c4b397ab034d7fa98b894", + "isSC": {} + }, + "0x1771eeec42da492f2294010ec5292e9bce25f288": { + "name": "GMX BaseOrderUtils", + "address": "0x1771eeec42da492f2294010ec5292e9bce25f288", + "isSC": {} + }, + "0x61af99b07995cb7ee8c2facf6d8fb6042feaa0d9": { + "name": "GMX CallbackUtils", + "address": "0x61af99b07995cb7ee8c2facf6d8fb6042feaa0d9", + "isSC": {} + }, + "0x7309223e21dc2ffbb660e5bd5abf95ae06ba4da0": { + "name": "GMX Config", + "address": "0x7309223e21dc2ffbb660e5bd5abf95ae06ba4da0", + "isSC": {} + }, + "0x2f0b22339414aded7d5f06f9d604c7ff5b2fe3f6": { + "name": "GMX DataStore", + "address": "0x2f0b22339414aded7d5f06f9d604c7ff5b2fe3f6", + "isSC": {} + }, + "0x5104257d85df1af13b267e161e289847dd8950c6": { + "name": "GMX DecreaseOrderUtils", + "address": "0x5104257d85df1af13b267e161e289847dd8950c6", + "isSC": {} + }, + "0x901f26a57edce65ef3fbccd260433de9b2279852": { + "name": "GMX DecreasePositionCollateralUtils", + "address": "0x901f26a57edce65ef3fbccd260433de9b2279852", + "isSC": {} + }, + "0xb92b643950f57d0accf79950d6436557c869c5f8": { + "name": "GMX DecreasePositionSwapUtils", + "address": "0xb92b643950f57d0accf79950d6436557c869c5f8", + "isSC": {} + }, + "0x17b80086d9b00f1ee4c245409b03383e9cee2a7e": { + "name": "GMX DecreasePositionUtils", + "address": "0x17b80086d9b00f1ee4c245409b03383e9cee2a7e", + "isSC": {} + }, + "0x1a4d623301b9f58405d3fff7a63624411d5eb940": { + "name": "GMX DepositEventUtils", + "address": "0x1a4d623301b9f58405d3fff7a63624411d5eb940", + "isSC": {} + }, + "0x72fa3978e2e330c7b2debc23cb676a3ae63333f6": { + "name": "GMX DepositHandler", + "address": "0x72fa3978e2e330c7b2debc23cb676a3ae63333f6", + "isSC": {} + }, + "0xb5fbb36853a136dd5dff9314c48df6ac0278dc72": { + "name": "GMX DepositStoreUtils", + "address": "0xb5fbb36853a136dd5dff9314c48df6ac0278dc72", + "isSC": {} + }, + "0xb4085c68765beaf991d3e4eebc48427edecba778": { + "name": "GMX DepositUtils", + "address": "0xb4085c68765beaf991d3e4eebc48427edecba778", + "isSC": {} + }, + "0x90c670825d0c62ede1c5ee9571d6d9a17a722dff": { + "name": "GMX DepositVault", + "address": "0x90c670825d0c62ede1c5ee9571d6d9a17a722dff", + "isSC": {} + }, + "0xdb17b211c34240b014ab6d61d4a31fa0c0e20c26": { + "name": "GMX EventEmitter", + "address": "0xdb17b211c34240b014ab6d61d4a31fa0c0e20c26", + "isSC": {} + }, + "0xd5c33a34915cb7199537a20f1098ff666203c42c": { + "name": "GMX ExecuteDepositUtils", + "address": "0xd5c33a34915cb7199537a20f1098ff666203c42c", + "isSC": {} + }, + "0x6ebff697250ae729ad0752f5ca6ce98bc62d4213": { + "name": "GMX ExecuteWithdrawalUtils", + "address": "0x6ebff697250ae729ad0752f5ca6ce98bc62d4213", + "isSC": {} + }, + "0xc7d8e3561f1247ebda491ba5f042699c2807c33c": { + "name": "GMX FeeHandler", + "address": "0xc7d8e3561f1247ebda491ba5f042699c2807c33c", + "isSC": {} + }, + "0xa254b60cbb85a92f6151b10e1233639f601f2f0f": { + "name": "GMX FeeUtils", + "address": "0xa254b60cbb85a92f6151b10e1233639f601f2f0f", + "isSC": {} + }, + "0xa99ac1961f3ab92af63a217aede378fc0e49359f": { + "name": "GMX GasUtils", + "address": "0xa99ac1961f3ab92af63a217aede378fc0e49359f", + "isSC": {} + }, + "0x40d680e41fc4bf973f0ea664981f6359195a6383": { + "name": "GMX IncreaseOrderUtils", + "address": "0x40d680e41fc4bf973f0ea664981f6359195a6383", + "isSC": {} + }, + "0xdc613305e9267f0770072deab8c03162e0554b2d": { + "name": "GMX IncreasePositionUtils", + "address": "0xdc613305e9267f0770072deab8c03162e0554b2d", + "isSC": {} + }, + "0x931c18af613f56289253f0eed57f315de7dbafcd": { + "name": "GMX LiquidationHandler", + "address": "0x931c18af613f56289253f0eed57f315de7dbafcd", + "isSC": {} + }, + "0xe137bf562908deec9e697657f59750ce84ebbc7f": { + "name": "GMX LiquidationUtils", + "address": "0xe137bf562908deec9e697657f59750ce84ebbc7f", + "isSC": {} + }, + "0x5f5b2022cc2cce4e375c2c79f5b370a99a74940b": { + "name": "GMX MarketEventUtils", + "address": "0x5f5b2022cc2cce4e375c2c79f5b370a99a74940b", + "isSC": {} + }, + "0xc57c155faccd93f62546f329d1483e0e5b9c1241": { + "name": "GMX MarketFactory", + "address": "0xc57c155faccd93f62546f329d1483e0e5b9c1241", + "isSC": {} + }, + "0x796dbdab1e36a0969e139dd64b6abbeedcbfb658": { + "name": "GMX MarketStoreUtils", + "address": "0x796dbdab1e36a0969e139dd64b6abbeedcbfb658", + "isSC": {} + }, + "0x58f9c8b240e28fd1970605001a516c3c44f8addb": { + "name": "GMX MarketUtils", + "address": "0x58f9c8b240e28fd1970605001a516c3c44f8addb", + "isSC": {} + }, + "0x50474cae810b316c294111807f94f9f48527e7f8": { + "name": "GMX Multicall3", + "address": "0x50474cae810b316c294111807f94f9f48527e7f8", + "isSC": {} + }, + "0x090fa7eb8b4647dadbea315e68f8f88e8e62bd54": { + "name": "GMX Oracle", + "address": "0x090fa7eb8b4647dadbea315e68f8f88e8e62bd54", + "isSC": {} + }, + "0xed467ce941ba9ec2aa74dcdaea7a53995840a79d": { + "name": "GMX OracleModuleTest", + "address": "0xed467ce941ba9ec2aa74dcdaea7a53995840a79d", + "isSC": {} + }, + "0xa6ac2e08c6d6bbd9b237e0daaecd7577996f4e84": { + "name": "GMX OracleStore", + "address": "0xa6ac2e08c6d6bbd9b237e0daaecd7577996f4e84", + "isSC": {} + }, + "0x3efdcd2b09f2c234c661a758e2304514d1be7dab": { + "name": "GMX OrderEventUtils", + "address": "0x3efdcd2b09f2c234c661a758e2304514d1be7dab", + "isSC": {} + }, + "0xd3b6e962f135634c43415d57a28e688fb4f15a58": { + "name": "GMX OrderHandler", + "address": "0xd3b6e962f135634c43415d57a28e688fb4f15a58", + "isSC": {} + }, + "0x7b61992477dacb757eb92e22bfc8a19e428a94aa": { + "name": "GMX OrderStoreUtils", + "address": "0x7b61992477dacb757eb92e22bfc8a19e428a94aa", + "isSC": {} + }, + "0x4ef8394cd5dd7e3ee6d30824689ef461783a3360": { + "name": "GMX OrderUtils", + "address": "0x4ef8394cd5dd7e3ee6d30824689ef461783a3360", + "isSC": {} + }, + "0xd3d60d22d415ad43b7e64b510d86a30f19b1b12c": { + "name": "GMX OrderVault", + "address": "0xd3d60d22d415ad43b7e64b510d86a30f19b1b12c", + "isSC": {} + }, + "0x77356449b835976410bea4d4571d84a1a3e048bd": { + "name": "GMX PositionEventUtils", + "address": "0x77356449b835976410bea4d4571d84a1a3e048bd", + "isSC": {} + }, + "0xda7ae3598a4fc9ddcc5fcf5eb81087b1ed35ef3f": { + "name": "GMX PositionPricingUtils", + "address": "0xda7ae3598a4fc9ddcc5fcf5eb81087b1ed35ef3f", + "isSC": {} + }, + "0x094ed353aa973aaa8ac41ac27b57136a6f1de539": { + "name": "GMX PositionStoreUtils", + "address": "0x094ed353aa973aaa8ac41ac27b57136a6f1de539", + "isSC": {} + }, + "0x174632b051728c288464ea08a6e6eefbcaafe1ef": { + "name": "GMX PositionUtils", + "address": "0x174632b051728c288464ea08a6e6eefbcaafe1ef", + "isSC": {} + }, + "0x73ba021acf4bb6741e82690ddb821e7936050f8c": { + "name": "GMX Reader", + "address": "0x73ba021acf4bb6741e82690ddb821e7936050f8c", + "isSC": {} + }, + "0x731643975e628184462fdd8c0aa57104c79a6589": { + "name": "GMX ReaderDepositUtils", + "address": "0x731643975e628184462fdd8c0aa57104c79a6589", + "isSC": {} + }, + "0x1639063f217e14635674baa129abc80bc21b24aa": { + "name": "GMX ReaderPricingUtils", + "address": "0x1639063f217e14635674baa129abc80bc21b24aa", + "isSC": {} + }, + "0x47aa86ef9ab65ccea0bf5babb5ddd4c576125ef7": { + "name": "GMX ReaderUtils", + "address": "0x47aa86ef9ab65ccea0bf5babb5ddd4c576125ef7", + "isSC": {} + }, + "0x50715a98095a137942de15c17e18f1856e102cf6": { + "name": "GMX ReaderWithdrawalUtils", + "address": "0x50715a98095a137942de15c17e18f1856e102cf6", + "isSC": {} + }, + "0x2f6799988b4fee7067217bb4c91ec5b1b7276712": { + "name": "GMX ReferralEventUtils", + "address": "0x2f6799988b4fee7067217bb4c91ec5b1b7276712", + "isSC": {} + }, + "0xfbb9c41046e27405224a911f44602c3667f9d8f6": { + "name": "GMX ReferralUtils", + "address": "0xfbb9c41046e27405224a911f44602c3667f9d8f6", + "isSC": {} + }, + "0xa44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd": { + "name": "GMX RoleStore", + "address": "0xa44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd", + "isSC": {} + }, + "0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68": { + "name": "GMX Router", + "address": "0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68", + "isSC": {} + }, + "0xee027373517a6d96fe62f70e9a0a395cb5a39eee": { + "name": "GMX SwapHandler", + "address": "0xee027373517a6d96fe62f70e9a0a395cb5a39eee", + "isSC": {} + }, + "0x0eaabf9234333ff67cb8fdbc3dafe13f7e7c2b71": { + "name": "GMX SwapOrderUtils", + "address": "0x0eaabf9234333ff67cb8fdbc3dafe13f7e7c2b71", + "isSC": {} + }, + "0xa42677e4974ab236b72d71c3102493b484ef39c6": { + "name": "GMX SwapPricingUtils", + "address": "0xa42677e4974ab236b72d71c3102493b484ef39c6", + "isSC": {} + }, + "0x02391482c3837c92fc51277cf7d78a179ba647c3": { + "name": "GMX SwapUtils", + "address": "0x02391482c3837c92fc51277cf7d78a179ba647c3", + "isSC": {} + }, + "0x4db91a1fa4ba3c75510b2885d7d7da48e0209f38": { + "name": "GMX Timelock", + "address": "0x4db91a1fa4ba3c75510b2885d7d7da48e0209f38", + "isSC": {} + }, + "0x348eca94e7c6f35430af1cacce27c29e9bef9ae3": { + "name": "GMX WithdrawalEventUtils", + "address": "0x348eca94e7c6f35430af1cacce27c29e9bef9ae3", + "isSC": {} + }, + "0x790ee987b9b253374d700b07f16347a7d4c4ff2e": { + "name": "GMX WithdrawalHandler", + "address": "0x790ee987b9b253374d700b07f16347a7d4c4ff2e", + "isSC": {} + }, + "0x7f8ef83c92b48a4b5b954a24d98a6cd0ed4d160a": { + "name": "GMX WithdrawalStoreUtils", + "address": "0x7f8ef83c92b48a4b5b954a24d98a6cd0ed4d160a", + "isSC": {} + }, + "0x8622db0e78671e3c5696af763d6679de5c18890c": { + "name": "GMX WithdrawalUtils", + "address": "0x8622db0e78671e3c5696af763d6679de5c18890c", + "isSC": {} + }, + "0xf5f30b10141e1f63fc11ed772931a8294a591996": { + "name": "GMX WithdrawalVault", + "address": "0xf5f30b10141e1f63fc11ed772931a8294a591996", + "isSC": {} + }, + "0x489ee077994b6658eafa855c308275ead8097c4a": { + "name": "GMX Vault", + "address": "0x489ee077994b6658eafa855c308275ead8097c4a", + "isSC": {} + }, + "0xabbc5f99639c9b6bcb58544ddf04efa6802f4064": { + "name": "GMX Router", + "address": "0xabbc5f99639c9b6bcb58544ddf04efa6802f4064", + "isSC": {} + }, + "0x321f653eed006ad1c29d174e17d96351bde22649": { + "name": "GMX Glp Manager", + "address": "0x321f653eed006ad1c29d174e17d96351bde22649", + "isSC": {} + }, + "0xa906f338cb21815cbc4bc87ace9e68c87ef8d8f1": { + "name": "GMX Reward RouterV2", + "address": "0xa906f338cb21815cbc4bc87ace9e68c87ef8d8f1", + "isSC": {} + }, + "0x4277f8f2c384827b5273592ff7cebd9f2c1ac258": { + "name": "GMX GLP", + "address": "0x4277f8f2c384827b5273592ff7cebd9f2c1ac258", + "isSC": {} + }, + "0xf42ae1d54fd613c9bb14810b0588faaa09a426ca": { + "name": "GMX EsGMX", + "address": "0xf42ae1d54fd613c9bb14810b0588faaa09a426ca", + "isSC": {} + }, + "0x35247165119b69a40edd5304969560d0ef486921": { + "name": "GMX BnGMX", + "address": "0x35247165119b69a40edd5304969560d0ef486921", + "isSC": {} + }, + "0x45096e7aa921f27590f8f19e457794eb09678141": { + "name": "GMX USDG", + "address": "0x45096e7aa921f27590f8f19e457794eb09678141", + "isSC": {} + }, + "0x1addd80e6039594ee970e5872d247bf0414c8903": { + "name": "GMX Staked Glp Tracker", + "address": "0x1addd80e6039594ee970e5872d247bf0414c8903", + "isSC": {} + }, + "0x4e971a87900b931ff39d1aad67697f49835400b6": { + "name": "GMX Fee Glp Tracker", + "address": "0x4e971a87900b931ff39d1aad67697f49835400b6", + "isSC": {} + }, + "0x60519b48ec4183a61ca2b8e37869e675fd203b34": { + "name": "GMX Staked Glp Distributor", + "address": "0x60519b48ec4183a61ca2b8e37869e675fd203b34", + "isSC": {} + }, + "0x5c04a12eb54a093c396f61355c6da0b15890150d": { + "name": "GMX Fee Glp Distributor", + "address": "0x5c04a12eb54a093c396f61355c6da0b15890150d", + "isSC": {} + }, + "0x199070ddfd1cfb69173aa2f7e20906f26b363004": { + "name": "GMX Gmx Vester", + "address": "0x199070ddfd1cfb69173aa2f7e20906f26b363004", + "isSC": {} + }, + "0xa75287d2f8b217273e7fcd7e86ef07d33972042e": { + "name": "GMX Glp Vester", + "address": "0xa75287d2f8b217273e7fcd7e86ef07d33972042e", + "isSC": {} + }, + "0x3f3e77421e30271568ef7a0ab5c5f2667675341e": { + "name": "GMX Timelock", + "address": "0x3f3e77421e30271568ef7a0ab5c5f2667675341e", + "isSC": {} + }, + "0x01af26b74409d10e15b102621edd29c326ba1c55": { + "name": "GMX Staked Glp", + "address": "0x01af26b74409d10e15b102621edd29c326ba1c55", + "isSC": {} + }, + "0x13e0bbe893b33b64d4f3f96725dd70531fa4ebce": { + "name": "GMX Glp Balance", + "address": "0x13e0bbe893b33b64d4f3f96725dd70531fa4ebce", + "isSC": {} + }, + "0x09f77e8a13de9a35a7231028187e9fd5db8a2acb": { + "name": "GMX Order Book", + "address": "0x09f77e8a13de9a35a7231028187e9fd5db8a2acb", + "isSC": {} + }, + "0x8514fc704317057fa86961ba9b9490956993a5ed": { + "name": "GMX AdlHandler", + "address": "0x8514fc704317057fa86961ba9b9490956993a5ed", + "isSC": {} + }, + "0x0dbb1b891636dc90a2bca29d1cfb80dfdd73193f": { + "name": "GMX AdlUtils", + "address": "0x0dbb1b891636dc90a2bca29d1cfb80dfdd73193f", + "isSC": {} + }, + "0xa2f2f7f0766cb06fff3241ff7d3469efc961b907": { + "name": "GMX BaseOrderUtils", + "address": "0xa2f2f7f0766cb06fff3241ff7d3469efc961b907", + "isSC": {} + }, + "0xc55e165bf9247256dbeca8dde892ae9a7b271b2d": { + "name": "GMX CallbackUtils", + "address": "0xc55e165bf9247256dbeca8dde892ae9a7b271b2d", + "isSC": {} + }, + "0x226ed647c6ea2c0ce4c08578e2f37b8c2f922849": { + "name": "GMX Config", + "address": "0x226ed647c6ea2c0ce4c08578e2f37b8c2f922849", + "isSC": {} + }, + "0xfd70de6b91282d8017aa4e741e9ae325cab992d8": { + "name": "GMX DataStore", + "address": "0xfd70de6b91282d8017aa4e741e9ae325cab992d8", + "isSC": {} + }, + "0xadc8aac56a7e9b17ba7338cadf0a4a8c6ae29f8c": { + "name": "GMX DecreaseOrderUtils", + "address": "0xadc8aac56a7e9b17ba7338cadf0a4a8c6ae29f8c", + "isSC": {} + }, + "0x368a8539d4034313dc5a029c874c33e3d0caa456": { + "name": "GMX DecreasePositionCollateralUtils", + "address": "0x368a8539d4034313dc5a029c874c33e3d0caa456", + "isSC": {} + }, + "0x86e92e21a0773cf542fecbc791c05e4bae35a92f": { + "name": "GMX DecreasePositionSwapUtils", + "address": "0x86e92e21a0773cf542fecbc791c05e4bae35a92f", + "isSC": {} + }, + "0x5f95c1bbfb8985981fedd2fb4dd28725d726ca46": { + "name": "GMX DecreasePositionUtils", + "address": "0x5f95c1bbfb8985981fedd2fb4dd28725d726ca46", + "isSC": {} + }, + "0x224330635e0ca7447e42c563590c5474ceb377bc": { + "name": "GMX DepositEventUtils", + "address": "0x224330635e0ca7447e42c563590c5474ceb377bc", + "isSC": {} + }, + "0x9dc4f12eb2d8405b499fb5b8af79a5f64ab8a457": { + "name": "GMX DepositHandler", + "address": "0x9dc4f12eb2d8405b499fb5b8af79a5f64ab8a457", + "isSC": {} + }, + "0x556665e81c1516b6028d04ee081518b3818d1453": { + "name": "GMX DepositStoreUtils", + "address": "0x556665e81c1516b6028d04ee081518b3818d1453", + "isSC": {} + }, + "0xaa31cf8c39b1c5d56e1d87fe940128492cc218e4": { + "name": "GMX DepositUtils", + "address": "0xaa31cf8c39b1c5d56e1d87fe940128492cc218e4", + "isSC": {} + }, + "0xf89e77e8dc11691c9e8757e84aafbcd8a67d7a55": { + "name": "GMX DepositVault", + "address": "0xf89e77e8dc11691c9e8757e84aafbcd8a67d7a55", + "isSC": {} + }, + "0xc8ee91a54287db53897056e12d9819156d3822fb": { + "name": "GMX EventEmitter", + "address": "0xc8ee91a54287db53897056e12d9819156d3822fb", + "isSC": {} + }, + "0x527fa75aa16e4835f5298cd2cb4f91a5b1cfbbd2": { + "name": "GMX ExecuteDepositUtils", + "address": "0x527fa75aa16e4835f5298cd2cb4f91a5b1cfbbd2", + "isSC": {} + }, + "0xb54c8fb6b2f143dd58f5b00fde7da4fa05077b20": { + "name": "GMX ExecuteWithdrawalUtils", + "address": "0xb54c8fb6b2f143dd58f5b00fde7da4fa05077b20", + "isSC": {} + }, + "0xbf56a2f030c3f920f0e2ad9cf456b9954c49383a": { + "name": "GMX FeeHandler", + "address": "0xbf56a2f030c3f920f0e2ad9cf456b9954c49383a", + "isSC": {} + }, + "0xbf225c4c4471419b214064ca20e1dc2523594f91": { + "name": "GMX FeeUtils", + "address": "0xbf225c4c4471419b214064ca20e1dc2523594f91", + "isSC": {} + }, + "0x6ee83f82757c5b10468855753f5374fff826bdcb": { + "name": "GMX GasUtils", + "address": "0x6ee83f82757c5b10468855753f5374fff826bdcb", + "isSC": {} + }, + "0xbbdb0d899698146119fe63e4b4d9efd8af23b448": { + "name": "GMX IncreaseOrderUtils", + "address": "0xbbdb0d899698146119fe63e4b4d9efd8af23b448", + "isSC": {} + }, + "0x78cf6e5370a262ff6618d328cd748b2fa1917ca4": { + "name": "GMX IncreasePositionUtils", + "address": "0x78cf6e5370a262ff6618d328cd748b2fa1917ca4", + "isSC": {} + }, + "0x9e0521c3dbb18e849f4955087e065e5c9c879917": { + "name": "GMX LiquidationHandler", + "address": "0x9e0521c3dbb18e849f4955087e065e5c9c879917", + "isSC": {} + }, + "0xa0c51eb832c683d69af71c225fa9b57ee409299e": { + "name": "GMX LiquidationUtils", + "address": "0xa0c51eb832c683d69af71c225fa9b57ee409299e", + "isSC": {} + }, + "0xdfe1ea56e7200b04ee596737caee714937824304": { + "name": "GMX MarketEventUtils", + "address": "0xdfe1ea56e7200b04ee596737caee714937824304", + "isSC": {} + }, + "0x41613136174912714faf4cf0680fb1acbe0cc7d1": { + "name": "GMX MarketStoreUtils", + "address": "0x41613136174912714faf4cf0680fb1acbe0cc7d1", + "isSC": {} + }, + "0x7fff7ef2fc8db5159b0046ad49d018a5ab40db11": { + "name": "GMX MarketUtils", + "address": "0x7fff7ef2fc8db5159b0046ad49d018a5ab40db11", + "isSC": {} + }, + "0xe79118d6d92a4b23369ba356c90b9a7abf1cb961": { + "name": "GMX Multicall3", + "address": "0xe79118d6d92a4b23369ba356c90b9a7abf1cb961", + "isSC": {} + }, + "0xa11b501c2dd83acd29f6727570f2502faaa617f2": { + "name": "GMX Oracle", + "address": "0xa11b501c2dd83acd29f6727570f2502faaa617f2", + "isSC": {} + }, + "0x2e246061be08dc56d33e03dc0cb962c2155722b5": { + "name": "GMX OracleModuleTest", + "address": "0x2e246061be08dc56d33e03dc0cb962c2155722b5", + "isSC": {} + }, + "0xa8af9b86fc47deade1bc66b12673706615e2b011": { + "name": "GMX OracleStore", + "address": "0xa8af9b86fc47deade1bc66b12673706615e2b011", + "isSC": {} + }, + "0x805a15bf16582ec8d76841062a47dffea7903131": { + "name": "GMX OrderEventUtils", + "address": "0x805a15bf16582ec8d76841062a47dffea7903131", + "isSC": {} + }, + "0xa5cd5caa2453daf1daaf1a5c8e9e52cbb750386b": { + "name": "GMX OrderStoreUtils", + "address": "0xa5cd5caa2453daf1daaf1a5c8e9e52cbb750386b", + "isSC": {} + }, + "0x09c7a13e0ff43d4f9e3cfd2ed3b2b41198af761f": { + "name": "GMX OrderUtils", + "address": "0x09c7a13e0ff43d4f9e3cfd2ed3b2b41198af761f", + "isSC": {} + }, + "0x31ef83a530fde1b38ee9a18093a333d8bbbc40d5": { + "name": "GMX OrderVault", + "address": "0x31ef83a530fde1b38ee9a18093a333d8bbbc40d5", + "isSC": {} + }, + "0x0f9bb54ec2cc65344cde88cfb06c71f68599d2a4": { + "name": "GMX PositionEventUtils", + "address": "0x0f9bb54ec2cc65344cde88cfb06c71f68599d2a4", + "isSC": {} + }, + "0xac3d81b7a9ceac542c556734799c0f68ae1cda4d": { + "name": "GMX PositionPricingUtils", + "address": "0xac3d81b7a9ceac542c556734799c0f68ae1cda4d", + "isSC": {} + }, + "0xdfec6f2a72bea53660a04806cceefa7b970a0e46": { + "name": "GMX PositionStoreUtils", + "address": "0xdfec6f2a72bea53660a04806cceefa7b970a0e46", + "isSC": {} + }, + "0xd7458f20433f77d81b066361435e17dbbc33fef4": { + "name": "GMX PositionUtils", + "address": "0xd7458f20433f77d81b066361435e17dbbc33fef4", + "isSC": {} + }, + "0xf60becbba223eea9495da3f606753867ec10d139": { + "name": "GMX Reader", + "address": "0xf60becbba223eea9495da3f606753867ec10d139", + "isSC": {} + }, + "0x43d27c0e3b235ad25e787c80c8bdfab731cba26c": { + "name": "GMX ReaderDepositUtils", + "address": "0x43d27c0e3b235ad25e787c80c8bdfab731cba26c", + "isSC": {} + }, + "0xaf7984f705249f2c8720a634dd0d8b00d5ee5d39": { + "name": "GMX ReaderPricingUtils", + "address": "0xaf7984f705249f2c8720a634dd0d8b00d5ee5d39", + "isSC": {} + }, + "0xae2453dca7704080052af3c212e862cab50d65c0": { + "name": "GMX ReaderUtils", + "address": "0xae2453dca7704080052af3c212e862cab50d65c0", + "isSC": {} + }, + "0xe2628ebb4aebbc246f758942c48e87b646ee75b3": { + "name": "GMX ReaderWithdrawalUtils", + "address": "0xe2628ebb4aebbc246f758942c48e87b646ee75b3", + "isSC": {} + }, + "0x7f397b555f71f711d5331241519825180dc78489": { + "name": "GMX ReferralEventUtils", + "address": "0x7f397b555f71f711d5331241519825180dc78489", + "isSC": {} + }, + "0x4045a052a14a08d5053d79afd06128cfb3946aa8": { + "name": "GMX ReferralUtils", + "address": "0x4045a052a14a08d5053d79afd06128cfb3946aa8", + "isSC": {} + }, + "0x3c3d99fd298f679dbc2cecd132b4ec4d0f5e6e72": { + "name": "GMX RoleStore", + "address": "0x3c3d99fd298f679dbc2cecd132b4ec4d0f5e6e72", + "isSC": {} + }, + "0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6": { + "name": "GMX Router", + "address": "0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6", + "isSC": {} + }, + "0xf6b804f6cc847a22f2d022c9b0373190850be34d": { + "name": "GMX SwapHandler", + "address": "0xf6b804f6cc847a22f2d022c9b0373190850be34d", + "isSC": {} + }, + "0x1dab177e756ba3c0e22ac1de7a030b76dd158174": { + "name": "GMX SwapOrderUtils", + "address": "0x1dab177e756ba3c0e22ac1de7a030b76dd158174", + "isSC": {} + }, + "0xfd20a53afd789997451f1c9dd8c02d6a6d3f96dc": { + "name": "GMX SwapPricingUtils", + "address": "0xfd20a53afd789997451f1c9dd8c02d6a6d3f96dc", + "isSC": {} + }, + "0xb34a6e9dc8e721361a9c620eef245535d6a5b234": { + "name": "GMX SwapUtils", + "address": "0xb34a6e9dc8e721361a9c620eef245535d6a5b234", + "isSC": {} + }, + "0x62ab76ed722c507f297f2b97920dca04518fe274": { + "name": "GMX Timelock", + "address": "0x62ab76ed722c507f297f2b97920dca04518fe274", + "isSC": {} + }, + "0xad7a7568f500f65aea3d9417a210cbc5dcd7b273": { + "name": "GMX WithdrawalEventUtils", + "address": "0xad7a7568f500f65aea3d9417a210cbc5dcd7b273", + "isSC": {} + }, + "0x9e32088f3c1a5eb38d32d1ec6ba0bcbf499dc9ac": { + "name": "GMX WithdrawalHandler", + "address": "0x9e32088f3c1a5eb38d32d1ec6ba0bcbf499dc9ac", + "isSC": {} + }, + "0x713c6a2479f6c079055a6ad3690d95dedcef9e1e": { + "name": "GMX WithdrawalStoreUtils", + "address": "0x713c6a2479f6c079055a6ad3690d95dedcef9e1e", + "isSC": {} + }, + "0x46088fa22988c40ce5abc0647a7638d27a8bf7d1": { + "name": "GMX WithdrawalUtils", + "address": "0x46088fa22988c40ce5abc0647a7638d27a8bf7d1", + "isSC": {} + }, + "0x0628d46b5d145f183adb6ef1f2c97ed1c4701c55": { + "name": "GMX WithdrawalVault", + "address": "0x0628d46b5d145f183adb6ef1f2c97ed1c4701c55", + "isSC": {} + }, + "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789": { + "name": "Account abstraction entry point v0.6.0", + "address": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "isSC": {} + }, + "0x0000000071727de22e5e9d8baf0edac6f37da032": { + "name": "Account abstraction entry point v0.7.0", + "address": "0x0000000071727de22e5e9d8baf0edac6f37da032", + "isSC": {} + }, + "0x0000000000085d4780b73119b644ae5ecd22b376": { + "name": "TrueUSD", + "address": "0x0000000000085d4780b73119b644ae5ecd22b376", + "token": { + "decimals": 18, + "symbol": "TUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TUSD.svg" + }, + "0x0000000000095413afc295d19edeb1ad7b71c952": { + "name": "LON token contract", + "address": "0x0000000000095413afc295d19edeb1ad7b71c952", + "token": { + "decimals": 18, + "symbol": "LON" + }, + "isSC": {} + }, + "0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7": { + "name": "SKALE", + "address": "0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7", + "token": { + "decimals": 18, + "symbol": "SKL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/skl.svg" + }, + "0x0202be363b8a4820f3f4de7faf5224ff05943ab1": { + "name": "UFT token contract", + "address": "0x0202be363b8a4820f3f4de7faf5224ff05943ab1", + "token": { + "decimals": 18, + "symbol": "UFT" + }, + "isSC": {} + }, + "0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a": { + "name": "ORN token contract", + "address": "0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a", + "token": { + "decimals": 8, + "symbol": "ORN" + }, + "isSC": {} + }, + "0x03ab458634910aad20ef5f1c8ee96f1d6ac54919": { + "name": "Rai Reflex Index", + "address": "0x03ab458634910aad20ef5f1c8ee96f1d6ac54919", + "token": { + "decimals": 18, + "symbol": "RAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rai.svg" + }, + "0x0488401c3f535193fa8df029d9ffe615a06e74e6": { + "name": "SRK token contract", + "address": "0x0488401c3f535193fa8df029d9ffe615a06e74e6", + "token": { + "decimals": 18, + "symbol": "SRK" + }, + "isSC": {} + }, + "0x04fa0d235c4abf4bcf4787af4cf447de572ef828": { + "name": "UMA", + "address": "0x04fa0d235c4abf4bcf4787af4cf447de572ef828", + "token": { + "decimals": 18, + "symbol": "UMA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/uma.svg" + }, + "0x06a01a4d579479dd5d884ebf61a31727a3d8d442": { + "name": "SKEY token contract", + "address": "0x06a01a4d579479dd5d884ebf61a31727a3d8d442", + "token": { + "decimals": 8, + "symbol": "SKEY" + }, + "isSC": {} + }, + "0x07150e919b4de5fd6a63de1f9384828396f25fdc": { + "name": "BASE token contract", + "address": "0x07150e919b4de5fd6a63de1f9384828396f25fdc", + "token": { + "decimals": 9, + "symbol": "BASE" + }, + "isSC": {} + }, + "0x09a3ecafa817268f77be1283176b946c4ff2e608": { + "name": "MIR Token - Shuttle", + "address": "0x09a3ecafa817268f77be1283176b946c4ff2e608", + "token": { + "decimals": 18, + "symbol": "MIR-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MIR.svg" + }, + "0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0": { + "name": "GRO token contract", + "address": "0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0", + "token": { + "decimals": 18, + "symbol": "GRO" + }, + "isSC": {} + }, + "0x0a50c93c762fdd6e56d86215c24aaad43ab629aa": { + "name": "LGO Token", + "address": "0x0a50c93c762fdd6e56d86215c24aaad43ab629aa", + "token": { + "decimals": 8, + "symbol": "LGO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/lgo.png" + }, + "0x0ae055097c6d159879521c384f1d2123d1f195e6": { + "name": "STAKE Token", + "address": "0x0ae055097c6d159879521c384f1d2123d1f195e6", + "token": { + "decimals": 18, + "symbol": "STAKE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stake.svg" + }, + "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e": { + "name": "yearn.finance", + "address": "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e", + "token": { + "decimals": 18, + "symbol": "YFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yfi.svg" + }, + "0x0c7d5ae016f806603cb1782bea29ac69471cab9c": { + "name": "BFC token contract", + "address": "0x0c7d5ae016f806603cb1782bea29ac69471cab9c", + "token": { + "decimals": 18, + "symbol": "BFC" + }, + "isSC": {} + }, + "0x0cdf9acd87e940837ff21bb40c9fd55f68bba059": { + "name": "MINT token contract", + "address": "0x0cdf9acd87e940837ff21bb40c9fd55f68bba059", + "token": { + "decimals": 18, + "symbol": "MINT" + }, + "isSC": {} + }, + "0x0cec1a9154ff802e7934fc916ed7ca50bde6844e": { + "name": "POOL token contract", + "address": "0x0cec1a9154ff802e7934fc916ed7ca50bde6844e", + "token": { + "decimals": 18, + "symbol": "POOL" + }, + "isSC": {} + }, + "0x0d8775f648430679a709e98d2b0cb6250d2887ef": { + "name": "Basic Attention Token", + "address": "0x0d8775f648430679a709e98d2b0cb6250d2887ef", + "token": { + "decimals": 18, + "symbol": "BAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bat.svg" + }, + "0x0f51bb10119727a7e5ea3538074fb341f56b09ad": { + "name": "DAO token contract", + "address": "0x0f51bb10119727a7e5ea3538074fb341f56b09ad", + "token": { + "decimals": 18, + "symbol": "DAO" + }, + "isSC": {} + }, + "0x0f5d2fb29fb7d3cfee444a200298f468908cc942": { + "name": "Decentraland", + "address": "0x0f5d2fb29fb7d3cfee444a200298f468908cc942", + "token": { + "decimals": 18, + "symbol": "MANA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mana.svg" + }, + "0x0f7f961648ae6db43c75663ac7e5414eb79b5704": { + "name": "XIO token contract", + "address": "0x0f7f961648ae6db43c75663ac7e5414eb79b5704", + "token": { + "decimals": 18, + "symbol": "XIO" + }, + "isSC": {} + }, + "0x0fd10b9899882a6f2fcb5c371e17e70fdee00c38": { + "name": "PUNDIX token contract", + "address": "0x0fd10b9899882a6f2fcb5c371e17e70fdee00c38", + "token": { + "decimals": 18, + "symbol": "PUNDIX" + }, + "isSC": {} + }, + "0x0ff6ffcfda92c53f615a4a75d982f399c989366b": { + "name": "LAYER token contract", + "address": "0x0ff6ffcfda92c53f615a4a75d982f399c989366b", + "token": { + "decimals": 18, + "symbol": "LAYER" + }, + "isSC": {} + }, + "0x10be9a8dae441d276a5027936c3aaded2d82bc15": { + "name": "UMX token contract", + "address": "0x10be9a8dae441d276a5027936c3aaded2d82bc15", + "token": { + "decimals": 18, + "symbol": "UMX" + }, + "isSC": {} + }, + "0x111111111117dc0aa78b770fa6a738034120c302": { + "name": "1INCH Token", + "address": "0x111111111117dc0aa78b770fa6a738034120c302", + "token": { + "decimals": 18, + "symbol": "1INCH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/1inch.svg" + }, + "0x1337def16f9b486faed0293eb623dc8395dfe46a": { + "name": "ARMOR token contract", + "address": "0x1337def16f9b486faed0293eb623dc8395dfe46a", + "token": { + "decimals": 18, + "symbol": "ARMOR" + }, + "isSC": {} + }, + "0x1337def18c680af1f9f45cbcab6309562975b1dd": { + "name": "arNXM token contract", + "address": "0x1337def18c680af1f9f45cbcab6309562975b1dd", + "token": { + "decimals": 18, + "symbol": "arNXM" + }, + "isSC": {} + }, + "0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b": { + "name": "DPI token contract", + "address": "0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b", + "token": { + "decimals": 18, + "symbol": "DPI" + }, + "isSC": {} + }, + "0x152687bc4a7fcc89049cf119f9ac3e5acf2ee7ef": { + "name": "DHC token contract", + "address": "0x152687bc4a7fcc89049cf119f9ac3e5acf2ee7ef", + "token": { + "decimals": 18, + "symbol": "DHC" + }, + "isSC": {} + }, + "0x15874d65e649880c2614e7a480cb7c9a55787ff6": { + "name": "EMAX token contract", + "address": "0x15874d65e649880c2614e7a480cb7c9a55787ff6", + "token": { + "decimals": 18, + "symbol": "EMAX" + }, + "isSC": {} + }, + "0x1614f18fc94f47967a3fbe5ffcd46d4e7da3d787": { + "name": "PAID token contract", + "address": "0x1614f18fc94f47967a3fbe5ffcd46d4e7da3d787", + "token": { + "decimals": 18, + "symbol": "PAID" + }, + "isSC": {} + }, + "0x16980b3b4a3f9d89e33311b5aa8f80303e5ca4f8": { + "name": "KEX token contract", + "address": "0x16980b3b4a3f9d89e33311b5aa8f80303e5ca4f8", + "token": { + "decimals": 6, + "symbol": "KEX" + }, + "isSC": {} + }, + "0x1796ae0b0fa4862485106a0de9b654efe301d0b2": { + "name": "Polychain Monsters", + "address": "0x1796ae0b0fa4862485106a0de9b654efe301d0b2", + "token": { + "decimals": 18, + "symbol": "PMON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PMON.svg" + }, + "0x17ac188e09a7890a1844e5e65471fe8b0ccfadf3": { + "name": "CC10 token contract", + "address": "0x17ac188e09a7890a1844e5e65471fe8b0ccfadf3", + "token": { + "decimals": 18, + "symbol": "CC10" + }, + "isSC": {} + }, + "0x18aaa7115705e8be94bffebde57af9bfc265b998": { + "name": "Audius", + "address": "0x18aaa7115705e8be94bffebde57af9bfc265b998", + "token": { + "decimals": 18, + "symbol": "AUDIO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/audius.svg" + }, + "0x1985365e9f78359a9b6ad760e32412f4a445e862": { + "name": "Reputation Old", + "address": "0x1985365e9f78359a9b6ad760e32412f4a445e862", + "token": { + "decimals": 18, + "symbol": "REP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rep.svg" + }, + "0x1b40183efb4dd766f11bda7a7c3ad8982e998421": { + "name": "Vesper", + "address": "0x1b40183efb4dd766f11bda7a7c3ad8982e998421", + "token": { + "decimals": 18, + "symbol": "VSP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/vsp.svg" + }, + "0x1c9491865a1de77c5b6e19d2e6a5f1d7a6f2b25f": { + "name": "MATTER token contract", + "address": "0x1c9491865a1de77c5b6e19d2e6a5f1d7a6f2b25f", + "token": { + "decimals": 18, + "symbol": "MATTER" + }, + "isSC": {} + }, + "0x1c9922314ed1415c95b9fd453c3818fd41867d0b": { + "name": "TOWER token contract", + "address": "0x1c9922314ed1415c95b9fd453c3818fd41867d0b", + "token": { + "decimals": 18, + "symbol": "TOWER" + }, + "isSC": {} + }, + "0x1cbb83ebcd552d5ebf8131ef8c9cd9d9bab342bc": { + "name": "NFY token contract", + "address": "0x1cbb83ebcd552d5ebf8131ef8c9cd9d9bab342bc", + "token": { + "decimals": 18, + "symbol": "NFY" + }, + "isSC": {} + }, + "0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44": { + "name": "KP3R token contract", + "address": "0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44", + "token": { + "decimals": 18, + "symbol": "KP3R" + }, + "isSC": {} + }, + "0x1dd80016e3d4ae146ee2ebb484e8edd92dacc4ce": { + "name": "LEAD token contract", + "address": "0x1dd80016e3d4ae146ee2ebb484e8edd92dacc4ce", + "token": { + "decimals": 18, + "symbol": "LEAD" + }, + "isSC": {} + }, + "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984": { + "name": "Uniswap", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/uni.svg", + "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", + "token": { + "decimals": 18, + "symbol": "UNI" + }, + "isSC": {} + }, + "0x1fe24f25b1cf609b9c4e7e12d802e3640dfa5e43": { + "name": "CGG token contract", + "address": "0x1fe24f25b1cf609b9c4e7e12d802e3640dfa5e43", + "token": { + "decimals": 18, + "symbol": "CGG" + }, + "isSC": {} + }, + "0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697": { + "name": "OVR", + "address": "0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697", + "token": { + "decimals": 18, + "symbol": "OVR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/OVR.svg" + }, + "0x221657776846890989a759ba2973e427dff5c9bb": { + "name": "Reputation", + "address": "0x221657776846890989a759ba2973e427dff5c9bb", + "token": { + "decimals": 18, + "symbol": "REPv2" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/repv2.svg" + }, + "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": { + "name": "Wrapped BTC", + "address": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "token": { + "decimals": 8, + "symbol": "WBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wbtc.svg" + }, + "0x226f7b842e0f0120b7e194d05432b3fd14773a9d": { + "name": "UNN token contract", + "address": "0x226f7b842e0f0120b7e194d05432b3fd14773a9d", + "token": { + "decimals": 18, + "symbol": "UNN" + }, + "isSC": {} + }, + "0x23b608675a2b2fb1890d3abbd85c5775c51691d5": { + "name": "SOCKS token contract", + "address": "0x23b608675a2b2fb1890d3abbd85c5775c51691d5", + "token": { + "decimals": 18, + "symbol": "SOCKS" + }, + "isSC": {} + }, + "0x25e1474170c4c0aa64fa98123bdc8db49d7802fa": { + "name": "BID token contract", + "address": "0x25e1474170c4c0aa64fa98123bdc8db49d7802fa", + "token": { + "decimals": 18, + "symbol": "BID" + }, + "isSC": {} + }, + "0x26c8afbbfe1ebaca03c2bb082e69d0476bffe099": { + "name": "CELL token contract", + "address": "0x26c8afbbfe1ebaca03c2bb082e69d0476bffe099", + "token": { + "decimals": 18, + "symbol": "CELL" + }, + "isSC": {} + }, + "0x26e43759551333e57f073bb0772f50329a957b30": { + "name": "DGVC token contract", + "address": "0x26e43759551333e57f073bb0772f50329a957b30", + "token": { + "decimals": 18, + "symbol": "DGVC" + }, + "isSC": {} + }, + "0x27c70cd1946795b66be9d954418546998b546634": { + "name": "LEASH token contract", + "address": "0x27c70cd1946795b66be9d954418546998b546634", + "token": { + "decimals": 18, + "symbol": "LEASH" + }, + "isSC": {} + }, + "0x29502fe4d233ef0b45c3647101fa1252ce0634bd": { + "name": "FROGE token contract", + "address": "0x29502fe4d233ef0b45c3647101fa1252ce0634bd", + "token": { + "decimals": 9, + "symbol": "FROGE" + }, + "isSC": {} + }, + "0x2b591e99afe9f32eaa6214f7b7629768c40eeb39": { + "name": "HEX", + "address": "0x2b591e99afe9f32eaa6214f7b7629768c40eeb39", + "token": { + "decimals": 8, + "symbol": "HEX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hex.svg" + }, + "0x2ba592f78db6436527729929aaf6c908497cb200": { + "name": "Cream", + "address": "0x2ba592f78db6436527729929aaf6c908497cb200", + "token": { + "decimals": 18, + "symbol": "CREAM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/cream.svg" + }, + "0x2e1e15c44ffe4df6a0cb7371cd00d5028e571d14": { + "name": "Mettalex", + "address": "0x2e1e15c44ffe4df6a0cb7371cd00d5028e571d14", + "token": { + "decimals": 18, + "symbol": "MTLX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mettalex.svg" + }, + "0x2e2f3246b6c65ccc4239c9ee556ec143a7e5de2c": { + "name": "YFIM token contract", + "address": "0x2e2f3246b6c65ccc4239c9ee556ec143a7e5de2c", + "token": { + "decimals": 18, + "symbol": "YFIM" + }, + "isSC": {} + }, + "0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5": { + "name": "ZEE token contract", + "address": "0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5", + "token": { + "decimals": 18, + "symbol": "ZEE" + }, + "isSC": {} + }, + "0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3": { + "name": "DEC token contract", + "address": "0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3", + "token": { + "decimals": 18, + "symbol": "DEC" + }, + "isSC": {} + }, + "0x3301ee63fb29f863f2333bd4466acb46cd8323e6": { + "name": "AKITA token contract", + "address": "0x3301ee63fb29f863f2333bd4466acb46cd8323e6", + "token": { + "decimals": 18, + "symbol": "AKITA" + }, + "isSC": {} + }, + "0x3383c5a8969dc413bfddc9656eb80a1408e4ba20": { + "name": "wANATHA token contract", + "address": "0x3383c5a8969dc413bfddc9656eb80a1408e4ba20", + "token": { + "decimals": 18, + "symbol": "wANATHA" + }, + "isSC": {} + }, + "0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f": { + "name": "RAMP token contract", + "address": "0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f", + "token": { + "decimals": 18, + "symbol": "RAMP" + }, + "isSC": {} + }, + "0x3593d125a4f7849a1b059e64f4517a86dd60c95d": { + "name": "OM token contract", + "address": "0x3593d125a4f7849a1b059e64f4517a86dd60c95d", + "token": { + "decimals": 18, + "symbol": "OM" + }, + "isSC": {} + }, + "0x362bc847a3a9637d3af6624eec853618a43ed7d2": { + "name": "PARSIQ", + "address": "0x362bc847a3a9637d3af6624eec853618a43ed7d2", + "token": { + "decimals": 18, + "symbol": "PRQ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/parsiq.svg" + }, + "0x3845badade8e6dff049820680d1f14bd3903a5d0": { + "name": "SAND", + "address": "0x3845badade8e6dff049820680d1f14bd3903a5d0", + "token": { + "decimals": 18, + "symbol": "SAND" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SAND.svg" + }, + "0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1": { + "name": "Concentrated Voting Power", + "address": "0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1", + "token": { + "decimals": 18, + "symbol": "CVP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PowerPool.svg" + }, + "0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe": { + "name": "DSLA token contract", + "address": "0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe", + "token": { + "decimals": 18, + "symbol": "DSLA" + }, + "isSC": {} + }, + "0x3d3d35bb9bec23b06ca00fe472b50e7a4c692c30": { + "name": "VIDYA token contract", + "address": "0x3d3d35bb9bec23b06ca00fe472b50e7a4c692c30", + "token": { + "decimals": 18, + "symbol": "VIDYA" + }, + "isSC": {} + }, + "0x408e41876cccdc0f92210600ef50372656052a38": { + "name": "Republic Token", + "address": "0x408e41876cccdc0f92210600ef50372656052a38", + "token": { + "decimals": 18, + "symbol": "REN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ren.svg" + }, + "0x40fd72257597aa14c7231a7b1aaa29fce868f677": { + "name": "SORA", + "address": "0x40fd72257597aa14c7231a7b1aaa29fce868f677", + "token": { + "decimals": 18, + "symbol": "XOR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sora-xor.svg" + }, + "0x419d0d8bdd9af5e606ae2232ed285aff190e711b": { + "name": "FunFair", + "address": "0x419d0d8bdd9af5e606ae2232ed285aff190e711b", + "token": { + "decimals": 8, + "symbol": "FUN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fun.svg" + }, + "0x41a3dba3d677e573636ba691a70ff2d606c29666": { + "name": "BLANK token contract", + "address": "0x41a3dba3d677e573636ba691a70ff2d606c29666", + "token": { + "decimals": 18, + "symbol": "BLANK" + }, + "isSC": {} + }, + "0x429881672b9ae42b8eba0e26cd9c73711b891ca5": { + "name": "PICKLE token contract", + "address": "0x429881672b9ae42b8eba0e26cd9c73711b891ca5", + "token": { + "decimals": 18, + "symbol": "PICKLE" + }, + "isSC": {} + }, + "0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0": { + "name": "dForce", + "address": "0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0", + "token": { + "decimals": 18, + "symbol": "DF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DF.svg" + }, + "0xcf0c122c6b73ff809c693db761e7baebe62b6a2e": { + "name": "FLOKI", + "address": "0xcf0c122c6b73ff809c693db761e7baebe62b6a2e", + "token": { + "decimals": 9, + "symbol": "FLOKI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/floki.svg" + }, + "0x4575f41308ec1483f3d399aa9a2826d74da13deb": { + "name": "Orchid", + "address": "0x4575f41308ec1483f3d399aa9a2826d74da13deb", + "token": { + "decimals": 18, + "symbol": "OXT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/OXT.svg" + }, + "0x45804880de22913dafe09f4980848ece6ecbaf78": { + "name": "PAX Gold", + "address": "0x45804880de22913dafe09f4980848ece6ecbaf78", + "token": { + "decimals": 18, + "symbol": "PAXG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/paxg.svg" + }, + "0x4691937a7508860f876c9c0a2a617e7d9e945d4b": { + "name": "Wootrade Network", + "address": "0x4691937a7508860f876c9c0a2a617e7d9e945d4b", + "token": { + "decimals": 18, + "symbol": "WOO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wootrade.svg" + }, + "0x4a220e6096b25eadb88358cb44068a3248254675": { + "name": "Quant Network", + "address": "0x4a220e6096b25eadb88358cb44068a3248254675", + "token": { + "decimals": 18, + "symbol": "QNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/quant-network.svg" + }, + "0x4b1e80cac91e2216eeb63e29b957eb91ae9c2be8": { + "name": "JUP token contract", + "address": "0x4b1e80cac91e2216eeb63e29b957eb91ae9c2be8", + "token": { + "decimals": 18, + "symbol": "JUP" + }, + "isSC": {} + }, + "0x4c11249814f11b9346808179cf06e71ac328c1b5": { + "name": "ORAI token contract", + "address": "0x4c11249814f11b9346808179cf06e71ac328c1b5", + "token": { + "decimals": 18, + "symbol": "ORAI" + }, + "isSC": {} + }, + "0x4c19596f5aaff459fa38b0f7ed92f11ae6543784": { + "name": "TRU token contract", + "address": "0x4c19596f5aaff459fa38b0f7ed92f11ae6543784", + "token": { + "decimals": 8, + "symbol": "TRU" + }, + "isSC": {} + }, + "0x4e352cf164e64adcbad318c3a1e222e9eba4ce42": { + "name": "MCB token contract", + "address": "0x4e352cf164e64adcbad318c3a1e222e9eba4ce42", + "token": { + "decimals": 18, + "symbol": "MCB" + }, + "isSC": {} + }, + "0x4fe83213d56308330ec302a8bd641f1d0113a4cc": { + "name": "NU token contract", + "address": "0x4fe83213d56308330ec302a8bd641f1d0113a4cc", + "token": { + "decimals": 18, + "symbol": "NU" + }, + "isSC": {} + }, + "0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd": { + "name": "RAZOR token contract", + "address": "0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd", + "token": { + "decimals": 18, + "symbol": "RAZOR" + }, + "isSC": {} + }, + "0x514910771af9ca656af840dff83e8264ecf986ca": { + "name": "Chainlink Token", + "address": "0x514910771af9ca656af840dff83e8264ecf986ca", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/chainlink.svg" + }, + "0x5218e472cfcfe0b64a064f055b43b4cdc9efd3a6": { + "name": "unFederalReserve Token", + "address": "0x5218e472cfcfe0b64a064f055b43b4cdc9efd3a6", + "token": { + "decimals": 18, + "symbol": "eRSDL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eRSDL.svg" + }, + "0x5228a22e72ccc52d415ecfd199f99d0665e7733b": { + "name": "PBTC token contract", + "address": "0x5228a22e72ccc52d415ecfd199f99d0665e7733b", + "token": { + "decimals": 18, + "symbol": "PBTC" + }, + "isSC": {} + }, + "0x54c9ea2e9c9e8ed865db4a4ce6711c2a0d5063ba": { + "name": "BART token contract", + "address": "0x54c9ea2e9c9e8ed865db4a4ce6711c2a0d5063ba", + "token": { + "decimals": 18, + "symbol": "BART" + }, + "isSC": {} + }, + "0x557b933a7c2c45672b610f8954a3deb39a51a8ca": { + "name": "REVV", + "address": "0x557b933a7c2c45672b610f8954a3deb39a51a8ca", + "token": { + "decimals": 18, + "symbol": "REVV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/revv.svg" + }, + "0x57ab1ec28d129707052df4df418d58a2d46d5f51": { + "name": "Synth sUSD", + "address": "0x57ab1ec28d129707052df4df418d58a2d46d5f51", + "token": { + "decimals": 18, + "symbol": "SUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/synthetix_susd.svg" + }, + "0x584bc13c7d411c00c01a62e8019472de68768430": { + "name": "HEGIC token contract", + "address": "0x584bc13c7d411c00c01a62e8019472de68768430", + "token": { + "decimals": 18, + "symbol": "HEGIC" + }, + "isSC": {} + }, + "0x5a666c7d92e5fa7edcb6390e4efd6d0cdd69cf37": { + "name": "MARSH token contract", + "address": "0x5a666c7d92e5fa7edcb6390e4efd6d0cdd69cf37", + "token": { + "decimals": 18, + "symbol": "MARSH" + }, + "isSC": {} + }, + "0x5befbb272290dd5b8521d4a938f6c4757742c430": { + "name": "XFI token contract", + "address": "0x5befbb272290dd5b8521d4a938f6c4757742c430", + "token": { + "decimals": 18, + "symbol": "XFI" + }, + "isSC": {} + }, + "0x5caf454ba92e6f2c929df14667ee360ed9fd5b26": { + "name": "DEV token contract", + "address": "0x5caf454ba92e6f2c929df14667ee360ed9fd5b26", + "token": { + "decimals": 18, + "symbol": "DEV" + }, + "isSC": {} + }, + "0x5dc02ea99285e17656b8350722694c35154db1e8": { + "name": "BOND token contract", + "address": "0x5dc02ea99285e17656b8350722694c35154db1e8", + "token": { + "decimals": 8, + "symbol": "BOND" + }, + "isSC": {} + }, + "0x5f64ab1544d28732f0a24f4713c2c8ec0da089f0": { + "name": "DEXTF token contract", + "address": "0x5f64ab1544d28732f0a24f4713c2c8ec0da089f0", + "token": { + "decimals": 18, + "symbol": "DEXTF" + }, + "isSC": {} + }, + "0x5f98805a4e8be255a32880fdec7f6728c6568ba0": { + "name": "LUSD token contract", + "address": "0x5f98805a4e8be255a32880fdec7f6728c6568ba0", + "token": { + "decimals": 18, + "symbol": "LUSD" + }, + "isSC": {} + }, + "0x607f4c5bb672230e8672085532f7e901544a7375": { + "name": "iExec RLC Token", + "address": "0x607f4c5bb672230e8672085532f7e901544a7375", + "token": { + "decimals": 9, + "symbol": "RLC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rlc.svg" + }, + "0x6149c26cd2f7b5ccdb32029af817123f6e37df5b": { + "name": "LPOOL token contract", + "address": "0x6149c26cd2f7b5ccdb32029af817123f6e37df5b", + "token": { + "decimals": 18, + "symbol": "LPOOL" + }, + "isSC": {} + }, + "0x62359ed7505efc61ff1d56fef82158ccaffa23d7": { + "name": "CORE token contract", + "address": "0x62359ed7505efc61ff1d56fef82158ccaffa23d7", + "token": { + "decimals": 18, + "symbol": "CORE" + }, + "isSC": {} + }, + "0x6243d8cea23066d098a15582d81a598b4e8391f4": { + "name": "Reflexer Ungovernance Token", + "address": "0x6243d8cea23066d098a15582d81a598b4e8391f4", + "token": { + "decimals": 18, + "symbol": "FLX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/flx.svg" + }, + "0x626e8036deb333b408be468f951bdb42433cbf18": { + "name": "AIOZ token contract", + "address": "0x626e8036deb333b408be468f951bdb42433cbf18", + "token": { + "decimals": 18, + "symbol": "AIOZ" + }, + "isSC": {} + }, + "0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4": { + "name": "CFI token contract", + "address": "0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4", + "token": { + "decimals": 18, + "symbol": "CFI" + }, + "isSC": {} + }, + "0x66a0f676479cee1d7373f3dc2e2952778bff5bd6": { + "name": "WISE Token", + "address": "0x66a0f676479cee1d7373f3dc2e2952778bff5bd6", + "token": { + "decimals": 18, + "symbol": "WISE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wise.svg" + }, + "0x67b6d479c7bb412c54e03dca8e1bc6740ce6b99c": { + "name": "KYL token contract", + "address": "0x67b6d479c7bb412c54e03dca8e1bc6740ce6b99c", + "token": { + "decimals": 18, + "symbol": "KYL" + }, + "isSC": {} + }, + "0x67c597624b17b16fb77959217360b7cd18284253": { + "name": "MARK token contract", + "address": "0x67c597624b17b16fb77959217360b7cd18284253", + "token": { + "decimals": 9, + "symbol": "MARK" + }, + "isSC": {} + }, + "0x6810e776880c02933d47db1b9fc05908e5386b96": { + "name": "Gnosis Token", + "address": "0x6810e776880c02933d47db1b9fc05908e5386b96", + "token": { + "decimals": 18, + "symbol": "GNO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gnosis.svg" + }, + "0x69692d3345010a207b759a7d1af6fc7f38b35c5e": { + "name": "CHADS token contract", + "address": "0x69692d3345010a207b759a7d1af6fc7f38b35c5e", + "token": { + "decimals": 18, + "symbol": "CHADS" + }, + "isSC": {} + }, + "0x69af81e73a73b40adf4f3d4223cd9b1ece623074": { + "name": "Mask Network", + "address": "0x69af81e73a73b40adf4f3d4223cd9b1ece623074", + "token": { + "decimals": 18, + "symbol": "MASK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mask.svg" + }, + "0x6b175474e89094c44da98b954eedeac495271d0f": { + "name": "Dai Stablecoin", + "address": "0x6b175474e89094c44da98b954eedeac495271d0f", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dai.svg" + }, + "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2": { + "name": "SushiSwap", + "address": "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sushi.svg" + }, + "0x6bff2fe249601ed0db3a87424a2e923118bb0312": { + "name": "FYZ token contract", + "address": "0x6bff2fe249601ed0db3a87424a2e923118bb0312", + "token": { + "decimals": 18, + "symbol": "FYZ" + }, + "isSC": {} + }, + "0x6c6ee5e31d828de241282b9606c8e98ea48526e2": { + "name": "HoloToken", + "address": "0x6c6ee5e31d828de241282b9606c8e98ea48526e2", + "token": { + "decimals": 18, + "symbol": "HOT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hot.svg" + }, + "0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8": { + "name": "QuiverX", + "address": "0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8", + "token": { + "decimals": 18, + "symbol": "QRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/quiverx.svg" + }, + "0x6f87d756daf0503d08eb8993686c7fc01dc44fb1": { + "name": "TRADE token contract", + "address": "0x6f87d756daf0503d08eb8993686c7fc01dc44fb1", + "token": { + "decimals": 18, + "symbol": "TRADE" + }, + "isSC": {} + }, + "0x6fc13eace26590b80cccab1ba5d51890577d83b2": { + "name": "UMB token contract", + "address": "0x6fc13eace26590b80cccab1ba5d51890577d83b2", + "token": { + "decimals": 18, + "symbol": "UMB" + }, + "isSC": {} + }, + "0x70401dfd142a16dc7031c56e862fc88cb9537ce0": { + "name": "BIRD token contract", + "address": "0x70401dfd142a16dc7031c56e862fc88cb9537ce0", + "token": { + "decimals": 18, + "symbol": "BIRD" + }, + "isSC": {} + }, + "0x71f85b2e46976bd21302b64329868fd15eb0d127": { + "name": "Axion", + "address": "0x71f85b2e46976bd21302b64329868fd15eb0d127", + "token": { + "decimals": 18, + "symbol": "AXN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/axion.svg" + }, + "0x725c263e32c72ddc3a19bea12c5a0479a81ee688": { + "name": "BMI token contract", + "address": "0x725c263e32c72ddc3a19bea12c5a0479a81ee688", + "token": { + "decimals": 18, + "symbol": "BMI" + }, + "isSC": {} + }, + "0x72630b1e3b42874bf335020ba0249e3e9e47bafc": { + "name": "EPAN token contract", + "address": "0x72630b1e3b42874bf335020ba0249e3e9e47bafc", + "token": { + "decimals": 18, + "symbol": "EPAN" + }, + "isSC": {} + }, + "0x72e364f2abdc788b7e918bc238b21f109cd634d7": { + "name": "MVI token contract", + "address": "0x72e364f2abdc788b7e918bc238b21f109cd634d7", + "token": { + "decimals": 18, + "symbol": "MVI" + }, + "isSC": {} + }, + "0x72e9d9038ce484ee986fea183f8d8df93f9ada13": { + "name": "SMARTCREDIT token contract", + "address": "0x72e9d9038ce484ee986fea183f8d8df93f9ada13", + "token": { + "decimals": 18, + "symbol": "SMARTCREDIT" + }, + "isSC": {} + }, + "0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3": { + "name": "ELON token contract", + "address": "0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3", + "token": { + "decimals": 18, + "symbol": "ELON" + }, + "isSC": {} + }, + "0x7659ce147d0e714454073a5dd7003544234b6aa0": { + "name": "XCAD Token", + "address": "0x7659ce147d0e714454073a5dd7003544234b6aa0", + "token": { + "decimals": 18, + "symbol": "XCAD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/xcad.svg" + }, + "0x7671904eed7f10808b664fc30bb8693fd7237abf": { + "name": "BBR token contract", + "address": "0x7671904eed7f10808b664fc30bb8693fd7237abf", + "token": { + "decimals": 18, + "symbol": "BBR" + }, + "isSC": {} + }, + "0x77777feddddffc19ff86db637967013e6c6a116c": { + "name": "TORN token contract", + "address": "0x77777feddddffc19ff86db637967013e6c6a116c", + "token": { + "decimals": 18, + "symbol": "TORN" + }, + "isSC": {} + }, + "0x7a2bc711e19ba6aff6ce8246c546e8c4b4944dfd": { + "name": "WAXE token contract", + "address": "0x7a2bc711e19ba6aff6ce8246c546e8c4b4944dfd", + "token": { + "decimals": 8, + "symbol": "WAXE" + }, + "isSC": {} + }, + "0x7b123f53421b1bf8533339bfbdc7c98aa94163db": { + "name": "BUIDL token contract", + "address": "0x7b123f53421b1bf8533339bfbdc7c98aa94163db", + "token": { + "decimals": 18, + "symbol": "BUIDL" + }, + "isSC": {} + }, + "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0": { + "name": "Matic Network Token", + "address": "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", + "token": { + "decimals": 18, + "symbol": "MATIC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/matic.svg" + }, + "0x7de91b204c1c737bcee6f000aaa6569cf7061cb7": { + "name": "XRT token contract", + "address": "0x7de91b204c1c737bcee6f000aaa6569cf7061cb7", + "token": { + "decimals": 9, + "symbol": "XRT" + }, + "isSC": {} + }, + "0x7f3edcdd180dbe4819bd98fee8929b5cedb3adeb": { + "name": "XTK token contract", + "address": "0x7f3edcdd180dbe4819bd98fee8929b5cedb3adeb", + "token": { + "decimals": 18, + "symbol": "XTK" + }, + "isSC": {} + }, + "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9": { + "name": "Aave", + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/AAVE.svg", + "address": "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0x7ff4169a6b5122b664c51c95727d87750ec07c84": { + "name": "10SET token contract", + "address": "0x7ff4169a6b5122b664c51c95727d87750ec07c84", + "token": { + "decimals": 18, + "symbol": "10SET" + }, + "isSC": {} + }, + "0x8207c1ffc5b6804f6024322ccf34f29c3541ae26": { + "name": "Origin Protocol", + "address": "0x8207c1ffc5b6804f6024322ccf34f29c3541ae26", + "token": { + "decimals": 18, + "symbol": "OGN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ogn.svg" + }, + "0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa": { + "name": "PolkastarterToken", + "address": "0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa", + "token": { + "decimals": 18, + "symbol": "POLS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pols.svg" + }, + "0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e": { + "name": "Unibright", + "address": "0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e", + "token": { + "decimals": 8, + "symbol": "UBT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ubt.svg" + }, + "0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419": { + "name": "DIAdata", + "address": "0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419", + "token": { + "decimals": 18, + "symbol": "DIA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dia.svg" + }, + "0x853d955acef822db058eb8505911ed77f175b99e": { + "name": "Frax", + "address": "0x853d955acef822db058eb8505911ed77f175b99e", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/frax.svg" + }, + "0x85eee30c52b0b379b046fb0f85f4f3dc3009afec": { + "name": "KEEP", + "address": "0x85eee30c52b0b379b046fb0f85f4f3dc3009afec", + "token": { + "decimals": 18, + "symbol": "KEEP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/keep.svg" + }, + "0x8888801af4d980682e47f1a9036e589479e835c5": { + "name": "MPH token contract", + "address": "0x8888801af4d980682e47f1a9036e589479e835c5", + "token": { + "decimals": 18, + "symbol": "MPH" + }, + "isSC": {} + }, + "0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab": { + "name": "MIST token contract", + "address": "0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab", + "token": { + "decimals": 18, + "symbol": "MIST" + }, + "isSC": {} + }, + "0x88ef27e69108b2633f8e1c184cc37940a075cc02": { + "name": "DEGO token contract", + "address": "0x88ef27e69108b2633f8e1c184cc37940a075cc02", + "token": { + "decimals": 18, + "symbol": "DEGO" + }, + "isSC": {} + }, + "0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed": { + "name": "PNT token contract", + "address": "0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed", + "token": { + "decimals": 18, + "symbol": "PNT" + }, + "isSC": {} + }, + "0x8a40c222996f9f3431f63bf80244c36822060f12": { + "name": "FXF token contract", + "address": "0x8a40c222996f9f3431f63bf80244c36822060f12", + "token": { + "decimals": 18, + "symbol": "FXF" + }, + "isSC": {} + }, + "0x8a854288a5976036a725879164ca3e91d30c6a1b": { + "name": "Guaranteed Entrance Token", + "address": "0x8a854288a5976036a725879164ca3e91d30c6a1b", + "token": { + "decimals": 18, + "symbol": "GET" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/get-logo.svg" + }, + "0x8b39b70e39aa811b69365398e0aace9bee238aeb": { + "name": "PolkaFoundry", + "address": "0x8b39b70e39aa811b69365398e0aace9bee238aeb", + "token": { + "decimals": 18, + "symbol": "PKF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pkf.svg" + }, + "0x8c15ef5b4b21951d50e53e4fbda8298ffad25057": { + "name": "FX token contract", + "address": "0x8c15ef5b4b21951d50e53e4fbda8298ffad25057", + "token": { + "decimals": 18, + "symbol": "FX" + }, + "isSC": {} + }, + "0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9": { + "name": "SXP token contract", + "address": "0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9", + "token": { + "decimals": 18, + "symbol": "SXP" + }, + "isSC": {} + }, + "0x8daebade922df735c38c80c7ebd708af50815faa": { + "name": "tBTC", + "address": "0x8daebade922df735c38c80c7ebd708af50815faa", + "token": { + "decimals": 18, + "symbol": "TBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tbtc.svg" + }, + "0x5b7533812759b45c2b44c19e320ba2cd2681b542": { + "name": "AGIX token contract", + "address": "0x5b7533812759b45c2b44c19e320ba2cd2681b542", + "token": { + "decimals": 8, + "symbol": "AGIX" + }, + "isSC": {} + }, + "0x8f8221afbb33998d8584a2b05749ba73c37a938a": { + "name": "Request", + "address": "0x8f8221afbb33998d8584a2b05749ba73c37a938a", + "token": { + "decimals": 18, + "symbol": "REQ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/request.svg" + }, + "0x9355372396e3f6daf13359b7b607a3374cc638e0": { + "name": "WHALE token contract", + "address": "0x9355372396e3f6daf13359b7b607a3374cc638e0", + "token": { + "decimals": 4, + "symbol": "WHALE" + }, + "isSC": {} + }, + "0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d": { + "name": "Pinakion Token", + "address": "0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d", + "token": { + "decimals": 18, + "symbol": "PNK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pinakion.svg" + }, + "0x9469d013805bffb7d3debe5e7839237e535ec483": { + "name": "Darwinia Network Native Token", + "address": "0x9469d013805bffb7d3debe5e7839237e535ec483", + "token": { + "decimals": 18, + "symbol": "RING" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ring.svg" + }, + "0x954b890704693af242613edef1b603825afcd708": { + "name": "CARD token contract", + "address": "0x954b890704693af242613edef1b603825afcd708", + "token": { + "decimals": 18, + "symbol": "CARD" + }, + "isSC": {} + }, + "0x956f47f50a910163d8bf957cf5846d573e7f87ca": { + "name": "FEI token contract", + "address": "0x956f47f50a910163d8bf957cf5846d573e7f87ca", + "token": { + "decimals": 18, + "symbol": "FEI" + }, + "isSC": {} + }, + "0x95a4492f028aa1fd432ea71146b433e7b4446611": { + "name": "APY token contract", + "address": "0x95a4492f028aa1fd432ea71146b433e7b4446611", + "token": { + "decimals": 18, + "symbol": "APY" + }, + "isSC": {} + }, + "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce": { + "name": "SHIBA INU", + "address": "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", + "token": { + "decimals": 18, + "symbol": "SHIB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/shib.svg" + }, + "0x967da4048cd07ab37855c090aaf366e4ce1b9f48": { + "name": "Ocean Token", + "address": "0x967da4048cd07ab37855c090aaf366e4ce1b9f48", + "token": { + "decimals": 18, + "symbol": "OCEAN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ocean.svg" + }, + "0x990f341946a3fdb507ae7e52d17851b87168017c": { + "name": "STRONG token contract", + "address": "0x990f341946a3fdb507ae7e52d17851b87168017c", + "token": { + "decimals": 18, + "symbol": "STRONG" + }, + "isSC": {} + }, + "0x9b02dd390a603add5c07f9fd9175b7dabe8d63b7": { + "name": "SPI token contract", + "address": "0x9b02dd390a603add5c07f9fd9175b7dabe8d63b7", + "token": { + "decimals": 18, + "symbol": "SPI" + }, + "isSC": {} + }, + "0x9be89d2a4cd102d8fecc6bf9da793be995c22541": { + "name": "BBTC token contract", + "address": "0x9be89d2a4cd102d8fecc6bf9da793be995c22541", + "token": { + "decimals": 8, + "symbol": "BBTC" + }, + "isSC": {} + }, + "0x9ceb84f92a0561fa3cc4132ab9c0b76a59787544": { + "name": "DOKI token contract", + "address": "0x9ceb84f92a0561fa3cc4132ab9c0b76a59787544", + "token": { + "decimals": 18, + "symbol": "DOKI" + }, + "isSC": {} + }, + "0x9ea3b5b4ec044b70375236a281986106457b20ef": { + "name": "DELTA token contract", + "address": "0x9ea3b5b4ec044b70375236a281986106457b20ef", + "token": { + "decimals": 18, + "symbol": "DELTA" + }, + "isSC": {} + }, + "0x9ed8e7c9604790f7ec589f99b94361d8aab64e5e": { + "name": "UNISTAKE token contract", + "address": "0x9ed8e7c9604790f7ec589f99b94361d8aab64e5e", + "token": { + "decimals": 18, + "symbol": "UNISTAKE" + }, + "isSC": {} + }, + "0x9f7229af0c4b9740e207ea283b9094983f78ba04": { + "name": "TAD token contract", + "address": "0x9f7229af0c4b9740e207ea283b9094983f78ba04", + "token": { + "decimals": 18, + "symbol": "TAD" + }, + "isSC": {} + }, + "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2": { + "name": "Maker", + "address": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", + "token": { + "decimals": 18, + "symbol": "MKR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mkr.svg" + }, + "0x9f9c8ec3534c3ce16f928381372bfbfbfb9f4d24": { + "name": "GraphLinq", + "address": "0x9f9c8ec3534c3ce16f928381372bfbfbfb9f4d24", + "token": { + "decimals": 18, + "symbol": "GLQ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/glq.svg" + }, + "0xa0246c9032bc3a600820415ae600c6388619a14d": { + "name": "FARM token contract", + "address": "0xa0246c9032bc3a600820415ae600c6388619a14d", + "token": { + "decimals": 18, + "symbol": "FARM" + }, + "isSC": {} + }, + "0xa0afaa285ce85974c3c881256cb7f225e3a1178a": { + "name": "wCRES token contract", + "address": "0xa0afaa285ce85974c3c881256cb7f225e3a1178a", + "token": { + "decimals": 18, + "symbol": "wCRES" + }, + "isSC": {} + }, + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": { + "name": "USDC", + "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usdc.svg" + }, + "0xa117000000f279d81a1d3cc75430faa017fa5a2e": { + "name": "Aragon Network Token", + "address": "0xa117000000f279d81a1d3cc75430faa017fa5a2e", + "token": { + "decimals": 18, + "symbol": "ANT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/antv2.svg" + }, + "0xa1d6df714f91debf4e0802a542e13067f31b8262": { + "name": "RFOX token contract", + "address": "0xa1d6df714f91debf4e0802a542e13067f31b8262", + "token": { + "decimals": 18, + "symbol": "RFOX" + }, + "isSC": {} + }, + "0xa393473d64d2f9f026b60b6df7859a689715d092": { + "name": "LTX token contract", + "address": "0xa393473d64d2f9f026b60b6df7859a689715d092", + "token": { + "decimals": 8, + "symbol": "LTX" + }, + "isSC": {} + }, + "0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2": { + "name": "Meta", + "address": "0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2", + "token": { + "decimals": 18, + "symbol": "MTA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MTA.svg" + }, + "0xa4eed63db85311e22df4473f87ccfc3dadcfa3e3": { + "name": "Rubic", + "address": "0xa4eed63db85311e22df4473f87ccfc3dadcfa3e3", + "token": { + "decimals": 18, + "symbol": "RBC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Rubic.svg" + }, + "0xa8b919680258d369114910511cc87595aec0be6d": { + "name": "LYXE token contract", + "address": "0xa8b919680258d369114910511cc87595aec0be6d", + "token": { + "decimals": 18, + "symbol": "LYXE" + }, + "isSC": {} + }, + "0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca": { + "name": "NOIA token contract", + "address": "0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca", + "token": { + "decimals": 18, + "symbol": "NOIA" + }, + "isSC": {} + }, + "0xa91ac63d040deb1b7a5e4d4134ad23eb0ba07e14": { + "name": "BEL token contract", + "address": "0xa91ac63d040deb1b7a5e4d4134ad23eb0ba07e14", + "token": { + "decimals": 18, + "symbol": "BEL" + }, + "isSC": {} + }, + "0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd": { + "name": "ETH2X-FLI token contract", + "address": "0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd", + "token": { + "decimals": 18, + "symbol": "ETH2X-FLI" + }, + "isSC": {} + }, + "0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f": { + "name": "TRAC token contract", + "address": "0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f", + "token": { + "decimals": 18, + "symbol": "TRAC" + }, + "isSC": {} + }, + "0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d": { + "name": "Celsius", + "address": "0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d", + "token": { + "decimals": 4, + "symbol": "CEL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/celsius.svg" + }, + "0xaaaf91d9b90df800df4f55c205fd6989c977e73a": { + "name": "Monolith TKN", + "address": "0xaaaf91d9b90df800df4f55c205fd6989c977e73a", + "token": { + "decimals": 8, + "symbol": "TKN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tkn.svg" + }, + "0xac0104cca91d167873b8601d2e71eb3d4d8c33e0": { + "name": "CWS token contract", + "address": "0xac0104cca91d167873b8601d2e71eb3d4d8c33e0", + "token": { + "decimals": 18, + "symbol": "CWS" + }, + "isSC": {} + }, + "0xad4f86a25bbc20ffb751f2fac312a0b4d8f88c64": { + "name": "ROOM token contract", + "address": "0xad4f86a25bbc20ffb751f2fac312a0b4d8f88c64", + "token": { + "decimals": 18, + "symbol": "ROOM" + }, + "isSC": {} + }, + "0xadb2437e6f65682b85f814fbc12fec0508a7b1d0": { + "name": "UNCX token contract", + "address": "0xadb2437e6f65682b85f814fbc12fec0508a7b1d0", + "token": { + "decimals": 18, + "symbol": "UNCX" + }, + "isSC": {} + }, + "0xade00c28244d5ce17d72e40330b1c318cd12b7c3": { + "name": "AdEx Token", + "address": "0xade00c28244d5ce17d72e40330b1c318cd12b7c3", + "token": { + "decimals": 18, + "symbol": "ADX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/adex.svg" + }, + "0xae1eaae3f627aaca434127644371b67b18444051": { + "name": "YOP token contract", + "address": "0xae1eaae3f627aaca434127644371b67b18444051", + "token": { + "decimals": 8, + "symbol": "YOP" + }, + "isSC": {} + }, + "0xae697f994fc5ebc000f8e22ebffee04612f98a0d": { + "name": "LGCY token contract", + "address": "0xae697f994fc5ebc000f8e22ebffee04612f98a0d", + "token": { + "decimals": 18, + "symbol": "LGCY" + }, + "isSC": {} + }, + "0xaf9f549774ecedbd0966c52f250acc548d3f36e5": { + "name": "RFUEL", + "address": "0xaf9f549774ecedbd0966c52f250acc548d3f36e5", + "token": { + "decimals": 18, + "symbol": "RFUEL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/RFUEL.svg" + }, + "0xb1e9157c2fdcc5a856c8da8b2d89b6c32b3c1229": { + "name": "ZEFU token contract", + "address": "0xb1e9157c2fdcc5a856c8da8b2d89b6c32b3c1229", + "token": { + "decimals": 18, + "symbol": "ZEFU" + }, + "isSC": {} + }, + "0xb26631c6dda06ad89b93c71400d25692de89c068": { + "name": "Minds", + "address": "0xb26631c6dda06ad89b93c71400d25692de89c068", + "token": { + "decimals": 18, + "symbol": "MINDS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/minds.svg" + }, + "0x745407c86df8db893011912d3ab28e68b62e49b0": { + "name": "MahaDAO", + "address": "0x745407c86df8db893011912d3ab28e68b62e49b0", + "token": { + "decimals": 18, + "symbol": "MAHA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MAHA.svg" + }, + "0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206": { + "name": "NEXO", + "address": "0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206", + "token": { + "decimals": 18, + "symbol": "NEXO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NEXO.svg" + }, + "0xb6ff96b8a8d214544ca0dbc9b33f7ad6503efd32": { + "name": "SYNC token contract", + "address": "0xb6ff96b8a8d214544ca0dbc9b33f7ad6503efd32", + "token": { + "decimals": 18, + "symbol": "SYNC" + }, + "isSC": {} + }, + "0xb753428af26e81097e7fd17f40c88aaa3e04902c": { + "name": "Spice", + "address": "0xb753428af26e81097e7fd17f40c88aaa3e04902c", + "token": { + "decimals": 18, + "symbol": "SFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sfi.svg" + }, + "0xb987d48ed8f2c468d52d6405624eadba5e76d723": { + "name": "STBZ token contract", + "address": "0xb987d48ed8f2c468d52d6405624eadba5e76d723", + "token": { + "decimals": 18, + "symbol": "STBZ" + }, + "isSC": {} + }, + "0xb9d99c33ea2d86ec5ec6b8a4dd816ebba64404af": { + "name": "K21 token contract", + "address": "0xb9d99c33ea2d86ec5ec6b8a4dd816ebba64404af", + "token": { + "decimals": 18, + "symbol": "K21" + }, + "isSC": {} + }, + "0xb9ef770b6a5e12e45983c5d80545258aa38f3b78": { + "name": "ZCN token contract", + "address": "0xb9ef770b6a5e12e45983c5d80545258aa38f3b78", + "token": { + "decimals": 10, + "symbol": "ZCN" + }, + "isSC": {} + }, + "0xba100000625a3754423978a60c9317c58a424e3d": { + "name": "Balancer (BAL)", + "address": "0xba100000625a3754423978a60c9317c58a424e3d", + "token": { + "decimals": 18, + "symbol": "BAL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/balancer.svg" + }, + "0xba11d00c5f74255f56a5e366f4f77f5a186d7f55": { + "name": "BAND token contract", + "address": "0xba11d00c5f74255f56a5e366f4f77f5a186d7f55", + "token": { + "decimals": 18, + "symbol": "BAND" + }, + "isSC": {} + }, + "0xba21ef4c9f433ede00badefcc2754b8e74bd538a": { + "name": "SWFL token contract", + "address": "0xba21ef4c9f433ede00badefcc2754b8e74bd538a", + "token": { + "decimals": 18, + "symbol": "SWFL" + }, + "isSC": {} + }, + "0xbbbbca6a901c926f240b89eacb641d8aec7aeafd": { + "name": "Loopring", + "address": "0xbbbbca6a901c926f240b89eacb641d8aec7aeafd", + "token": { + "decimals": 18, + "symbol": "LRC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LRC.svg" + }, + "0xbbc2ae13b23d715c30720f079fcd9b4a74093505": { + "name": "Ethernity Chain Token", + "address": "0xbbc2ae13b23d715c30720f079fcd9b4a74093505", + "token": { + "decimals": 18, + "symbol": "ERN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ERN.svg" + }, + "0xbc396689893d065f41bc2c6ecbee5e0085233447": { + "name": "Perpetual", + "address": "0xbc396689893d065f41bc2c6ecbee5e0085233447", + "token": { + "decimals": 18, + "symbol": "PERP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PERP.svg" + }, + "0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab": { + "name": "GYSR token contract", + "address": "0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab", + "token": { + "decimals": 18, + "symbol": "GYSR" + }, + "isSC": {} + }, + "0xbf494f02ee3fde1f20bee6242bce2d1ed0c15e47": { + "name": "WORLD token contract", + "address": "0xbf494f02ee3fde1f20bee6242bce2d1ed0c15e47", + "token": { + "decimals": 18, + "symbol": "WORLD" + }, + "isSC": {} + }, + "0xc00e94cb662c3520282e6f5717214004a7f26888": { + "name": "Compound", + "address": "0xc00e94cb662c3520282e6f5717214004a7f26888", + "token": { + "decimals": 18, + "symbol": "COMP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/comp.svg" + }, + "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f": { + "name": "Synthetix Network Token", + "address": "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", + "token": { + "decimals": 18, + "symbol": "SNX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/synthetix.svg" + }, + "0xc0ba369c8db6eb3924965e5c4fd0b4c1b91e305f": { + "name": "DLP Duck Token", + "address": "0xc0ba369c8db6eb3924965e5c4fd0b4c1b91e305f", + "token": { + "decimals": 18, + "symbol": "DUCK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dlpducktoken.svg" + }, + "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72": { + "name": "Ethereum Name Service", + "address": "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72", + "token": { + "decimals": 18, + "symbol": "ENS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ens.svg" + }, + "0xc4c2614e694cf534d407ee49f8e44d125e4681c4": { + "name": "CHAIN token contract", + "address": "0xc4c2614e694cf534d407ee49f8e44d125e4681c4", + "token": { + "decimals": 18, + "symbol": "CHAIN" + }, + "isSC": {} + }, + "0xc52c326331e9ce41f04484d3b5e5648158028804": { + "name": "ZCX token contract", + "address": "0xc52c326331e9ce41f04484d3b5e5648158028804", + "token": { + "decimals": 18, + "symbol": "ZCX" + }, + "isSC": {} + }, + "0xc57d533c50bc22247d49a368880fb49a1caa39f7": { + "name": "PTF token contract", + "address": "0xc57d533c50bc22247d49a368880fb49a1caa39f7", + "token": { + "decimals": 18, + "symbol": "PTF" + }, + "isSC": {} + }, + "0xc719d010b63e5bbf2c0551872cd5316ed26acd83": { + "name": "DIP token contract", + "address": "0xc719d010b63e5bbf2c0551872cd5316ed26acd83", + "token": { + "decimals": 18, + "symbol": "DIP" + }, + "isSC": {} + }, + "0xc7283b66eb1eb5fb86327f08e1b5816b0720212b": { + "name": "TRIBE token contract", + "address": "0xc7283b66eb1eb5fb86327f08e1b5816b0720212b", + "token": { + "decimals": 18, + "symbol": "TRIBE" + }, + "isSC": {} + }, + "0xc834fa996fa3bec7aad3693af486ae53d8aa8b50": { + "name": "CONV token contract", + "address": "0xc834fa996fa3bec7aad3693af486ae53d8aa8b50", + "token": { + "decimals": 18, + "symbol": "CONV" + }, + "isSC": {} + }, + "0xc944e90c64b2c07662a292be6244bdf05cda44a7": { + "name": "Graph Token", + "address": "0xc944e90c64b2c07662a292be6244bdf05cda44a7", + "token": { + "decimals": 18, + "symbol": "GRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/graphToken.svg" + }, + "0xcb5f72d37685c3d5ad0bb5f982443bc8fcdf570e": { + "name": "ROOT token contract", + "address": "0xcb5f72d37685c3d5ad0bb5f982443bc8fcdf570e", + "token": { + "decimals": 18, + "symbol": "ROOT" + }, + "isSC": {} + }, + "0xcbfef8fdd706cde6f208460f2bf39aa9c785f05d": { + "name": "KINE token contract", + "address": "0xcbfef8fdd706cde6f208460f2bf39aa9c785f05d", + "token": { + "decimals": 18, + "symbol": "KINE" + }, + "isSC": {} + }, + "0xcc4304a31d09258b0029ea7fe63d032f52e44efe": { + "name": "SWAP token contract", + "address": "0xcc4304a31d09258b0029ea7fe63d032f52e44efe", + "token": { + "decimals": 18, + "symbol": "SWAP" + }, + "isSC": {} + }, + "0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a": { + "name": "BEPRO token contract", + "address": "0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a", + "token": { + "decimals": 18, + "symbol": "BEPRO" + }, + "isSC": {} + }, + "0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988": { + "name": "TVK token contract", + "address": "0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988", + "token": { + "decimals": 18, + "symbol": "TVK" + }, + "isSC": {} + }, + "0xd23ac27148af6a2f339bd82d0e3cff380b5093de": { + "name": "SI token contract", + "address": "0xd23ac27148af6a2f339bd82d0e3cff380b5093de", + "token": { + "decimals": 18, + "symbol": "SI" + }, + "isSC": {} + }, + "0xd26114cd6ee289accf82350c8d8487fedb8a0c07": { + "name": "OmiseGO", + "address": "0xd26114cd6ee289accf82350c8d8487fedb8a0c07", + "token": { + "decimals": 18, + "symbol": "OMG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/omg.svg" + }, + "0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9": { + "name": "LUNA Token - Shuttle", + "address": "0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9", + "token": { + "decimals": 18, + "symbol": "LUNC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/lunc.svg" + }, + "0xd379700999f4805ce80aa32db46a94df64561108": { + "name": "DETS token contract", + "address": "0xd379700999f4805ce80aa32db46a94df64561108", + "token": { + "decimals": 18, + "symbol": "DETS" + }, + "isSC": {} + }, + "0xd46ba6d942050d489dbd938a2c909a5d5039a161": { + "name": "Ampleforth", + "address": "0xd46ba6d942050d489dbd938a2c909a5d5039a161", + "token": { + "decimals": 9, + "symbol": "AMPL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ampl.svg" + }, + "0xd478161c952357f05f0292b56012cd8457f1cfbf": { + "name": "POLK token contract", + "address": "0xd478161c952357f05f0292b56012cd8457f1cfbf", + "token": { + "decimals": 18, + "symbol": "POLK" + }, + "isSC": {} + }, + "0xd533a949740bb3306d119cc777fa900ba034cd52": { + "name": "Curve DAO Token", + "address": "0xd533a949740bb3306d119cc777fa900ba034cd52", + "token": { + "decimals": 18, + "symbol": "CRV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/crv.svg" + }, + "0xd5525d397898e5502075ea5e830d8914f6f0affe": { + "name": "MEME token contract", + "address": "0xd5525d397898e5502075ea5e830d8914f6f0affe", + "token": { + "decimals": 8, + "symbol": "MEME" + }, + "isSC": {} + }, + "0xd6c67b93a7b248df608a653d82a100556144c5da": { + "name": "EXNT token contract", + "address": "0xd6c67b93a7b248df608a653d82a100556144c5da", + "token": { + "decimals": 16, + "symbol": "EXNT" + }, + "isSC": {} + }, + "0xdac17f958d2ee523a2206206994597c13d831ec7": { + "name": "Tether USD", + "address": "0xdac17f958d2ee523a2206206994597c13d831ec7", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usdt.svg" + }, + "0xdacd69347de42babfaecd09dc88958378780fb62": { + "name": "Atari Token", + "address": "0xdacd69347de42babfaecd09dc88958378780fb62", + "token": { + "decimals": 0, + "symbol": "ATRI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/atrilast.svg" + }, + "0xdcb01cc464238396e213a6fdd933e36796eaff9f": { + "name": "Yield", + "address": "0xdcb01cc464238396e213a6fdd933e36796eaff9f", + "token": { + "decimals": 18, + "symbol": "YLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yield-logo.svg" + }, + "0xddb3422497e61e13543bea06989c0789117555c5": { + "name": "COTI token contract", + "address": "0xddb3422497e61e13543bea06989c0789117555c5", + "token": { + "decimals": 18, + "symbol": "COTI" + }, + "isSC": {} + }, + "0xe1c7e30c42c24582888c758984f6e382096786bd": { + "name": "XCUR token contract", + "address": "0xe1c7e30c42c24582888c758984f6e382096786bd", + "token": { + "decimals": 8, + "symbol": "XCUR" + }, + "isSC": {} + }, + "0xe28b3b32b6c345a34ff64674606124dd5aceca30": { + "name": "Injective", + "address": "0xe28b3b32b6c345a34ff64674606124dd5aceca30", + "token": { + "decimals": 18, + "symbol": "INJ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/inj.svg" + }, + "0xe3818504c1b32bf1557b16c238b2e01fd3149c17": { + "name": "Pillar", + "address": "0xe3818504c1b32bf1557b16c238b2e01fd3149c17", + "token": { + "decimals": 18, + "symbol": "PLR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plr.svg" + }, + "0xe41d2489571d322189246dafa5ebde1f4699f498": { + "name": "0x", + "address": "0xe41d2489571d322189246dafa5ebde1f4699f498", + "token": { + "decimals": 18, + "symbol": "ZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zrx.svg" + }, + "0xe452e6ea2ddeb012e20db73bf5d3863a3ac8d77a": { + "name": "Wrapped Celo", + "address": "0xe452e6ea2ddeb012e20db73bf5d3863a3ac8d77a", + "token": { + "decimals": 18, + "symbol": "wCELO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WCELO.svg" + }, + "0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55": { + "name": "SUPER token contract", + "address": "0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55", + "token": { + "decimals": 18, + "symbol": "SUPER" + }, + "isSC": {} + }, + "0xe5caef4af8780e59df925470b050fb23c43ca68c": { + "name": "Ferrum Network Token", + "address": "0xe5caef4af8780e59df925470b050fb23c43ca68c", + "token": { + "decimals": 6, + "symbol": "FRM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/frm.svg" + }, + "0xe61fdaf474fac07063f2234fb9e60c1163cfa850": { + "name": "COIN token contract", + "address": "0xe61fdaf474fac07063f2234fb9e60c1163cfa850", + "token": { + "decimals": 18, + "symbol": "COIN" + }, + "isSC": {} + }, + "0xe95a203b1a91a908f9b9ce46459d101078c2c3cb": { + "name": "ANKRETH token contract", + "address": "0xe95a203b1a91a908f9b9ce46459d101078c2c3cb", + "token": { + "decimals": 18, + "symbol": "ANKRETH" + }, + "isSC": {} + }, + "0xea1ea0972fa092dd463f2968f9bb51cc4c981d71": { + "name": "MOD token contract", + "address": "0xea1ea0972fa092dd463f2968f9bb51cc4c981d71", + "token": { + "decimals": 18, + "symbol": "MOD" + }, + "isSC": {} + }, + "0xea319e87cf06203dae107dd8e5672175e3ee976c": { + "name": "SURF token contract", + "address": "0xea319e87cf06203dae107dd8e5672175e3ee976c", + "token": { + "decimals": 18, + "symbol": "SURF" + }, + "isSC": {} + }, + "0xeb4c2781e4eba804ce9a9803c67d0893436bb27d": { + "name": "renBTC", + "address": "0xeb4c2781e4eba804ce9a9803c67d0893436bb27d", + "token": { + "decimals": 8, + "symbol": "renBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/renBTC.svg" + }, + "0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83": { + "name": "ID token contract", + "address": "0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83", + "token": { + "decimals": 18, + "symbol": "ID" + }, + "isSC": {} + }, + "0xed91879919b71bb6905f23af0a68d231ecf87b14": { + "name": "DMG token contract", + "address": "0xed91879919b71bb6905f23af0a68d231ecf87b14", + "token": { + "decimals": 18, + "symbol": "DMG" + }, + "isSC": {} + }, + "0xee573a945b01b788b9287ce062a0cfc15be9fd86": { + "name": "XED token contract", + "address": "0xee573a945b01b788b9287ce062a0cfc15be9fd86", + "token": { + "decimals": 18, + "symbol": "XED" + }, + "isSC": {} + }, + "0xeeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107": { + "name": "GOVI token contract", + "address": "0xeeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107", + "token": { + "decimals": 18, + "symbol": "GOVI" + }, + "isSC": {} + }, + "0xeec2be5c91ae7f8a338e1e5f3b5de49d07afdc81": { + "name": "DPX token contract", + "address": "0xeec2be5c91ae7f8a338e1e5f3b5de49d07afdc81", + "token": { + "decimals": 18, + "symbol": "DPX" + }, + "isSC": {} + }, + "0xeef9f339514298c6a857efcfc1a762af84438dee": { + "name": "HEZ token contract", + "address": "0xeef9f339514298c6a857efcfc1a762af84438dee", + "token": { + "decimals": 18, + "symbol": "HEZ" + }, + "isSC": {} + }, + "0xf063fe1ab7a291c5d06a86e14730b00bf24cb589": { + "name": "SALE token contract", + "address": "0xf063fe1ab7a291c5d06a86e14730b00bf24cb589", + "token": { + "decimals": 18, + "symbol": "SALE" + }, + "isSC": {} + }, + "0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b": { + "name": "RLY token contract", + "address": "0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b", + "token": { + "decimals": 18, + "symbol": "RLY" + }, + "isSC": {} + }, + "0xf21661d0d1d76d3ecb8e1b9f1c923dbfffae4097": { + "name": "Realio Network", + "address": "0xf21661d0d1d76d3ecb8e1b9f1c923dbfffae4097", + "token": { + "decimals": 18, + "symbol": "RIO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rio.svg" + }, + "0xf411903cbc70a74d22900a5de66a2dda66507255": { + "name": "VRA token contract", + "address": "0xf411903cbc70a74d22900a5de66a2dda66507255", + "token": { + "decimals": 18, + "symbol": "VRA" + }, + "isSC": {} + }, + "0xf418588522d5dd018b425e472991e52ebbeeeeee": { + "name": "PUSH token contract", + "address": "0xf418588522d5dd018b425e472991e52ebbeeeeee", + "token": { + "decimals": 18, + "symbol": "PUSH" + }, + "isSC": {} + }, + "0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577": { + "name": "YF-DAI token contract", + "address": "0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577", + "token": { + "decimals": 18, + "symbol": "YF-DAI" + }, + "isSC": {} + }, + "0xf4d861575ecc9493420a3f5a14f85b13f0b50eb3": { + "name": "Fractal Protocol", + "address": "0xf4d861575ecc9493420a3f5a14f85b13f0b50eb3", + "token": { + "decimals": 18, + "symbol": "FCL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fractal.svg" + }, + "0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c": { + "name": "Enjin Coin", + "address": "0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c", + "token": { + "decimals": 18, + "symbol": "ENJ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/enj.svg" + }, + "0xf6537fe0df7f0cc0985cf00792cc98249e73efa0": { + "name": "GIV token contract", + "address": "0xf6537fe0df7f0cc0985cf00792cc98249e73efa0", + "token": { + "decimals": 8, + "symbol": "GIV" + }, + "isSC": {} + }, + "0xf938424f7210f31df2aee3011291b658f872e91e": { + "name": "VISOR", + "address": "0xf938424f7210f31df2aee3011291b658f872e91e", + "token": { + "decimals": 18, + "symbol": "VISR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/VISR.svg" + }, + "0xf94b5c5651c888d928439ab6514b93944eee6f48": { + "name": "Yield App", + "address": "0xf94b5c5651c888d928439ab6514b93944eee6f48", + "token": { + "decimals": 18, + "symbol": "YLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yield-app.svg" + }, + "0xfad45e47083e4607302aa43c65fb3106f1cd7607": { + "name": "Hoge Finance", + "address": "0xfad45e47083e4607302aa43c65fb3106f1cd7607", + "token": { + "decimals": 9, + "symbol": "HOGE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/HogeFinanceLogo.svg" + }, + "0xfbeea1c75e4c4465cb2fccc9c6d6afe984558e20": { + "name": "DuckDaoDime", + "address": "0xfbeea1c75e4c4465cb2fccc9c6d6afe984558e20", + "token": { + "decimals": 18, + "symbol": "DDIM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ddim.svg" + }, + "0xfc98e825a2264d890f9a1e68ed50e1526abccacd": { + "name": "MCO2 token contract", + "address": "0xfc98e825a2264d890f9a1e68ed50e1526abccacd", + "token": { + "decimals": 18, + "symbol": "MCO2" + }, + "isSC": {} + }, + "0xfca59cd816ab1ead66534d82bc21e7515ce441cf": { + "name": "Rarible", + "address": "0xfca59cd816ab1ead66534d82bc21e7515ce441cf", + "token": { + "decimals": 18, + "symbol": "RARI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rari.svg" + }, + "0xfe3e6a25e6b192a42a44ecddcd13796471735acf": { + "name": "Reef Finance", + "address": "0xfe3e6a25e6b192a42a44ecddcd13796471735acf", + "token": { + "decimals": 18, + "symbol": "REEF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/reef.svg" + }, + "0xff20817765cb7f73d4bde2e66e067e58d11095c2": { + "name": "AMP token contract", + "address": "0xff20817765cb7f73d4bde2e66e067e58d11095c2", + "token": { + "decimals": 18, + "symbol": "AMP" + }, + "isSC": {} + }, + "0xfffffffff15abf397da76f1dcc1a1604f45126db": { + "name": "FSW token contract", + "address": "0xfffffffff15abf397da76f1dcc1a1604f45126db", + "token": { + "decimals": 18, + "symbol": "FSW" + }, + "isSC": {} + }, + "0x383518188c0c6d7730d91b2c03a03c837814a899": { + "name": "OHM token contract", + "address": "0x383518188c0c6d7730d91b2c03a03c837814a899", + "token": { + "decimals": 9, + "symbol": "OHM" + }, + "isSC": {} + }, + "0x767fe9edc9e0df98e07454847909b5e959d7ca0e": { + "name": "Illuvium", + "address": "0x767fe9edc9e0df98e07454847909b5e959d7ca0e", + "token": { + "decimals": 18, + "symbol": "ILV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/illuvium.svg" + }, + "0xd1d2eb1b1e90b638588728b4130137d262c87cae": { + "name": "GALA token contract", + "address": "0xd1d2eb1b1e90b638588728b4130137d262c87cae", + "token": { + "decimals": 8, + "symbol": "GALA" + }, + "isSC": {} + }, + "0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b": { + "name": "CVX token contract", + "address": "0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b", + "token": { + "decimals": 18, + "symbol": "CVX" + }, + "isSC": {} + }, + "0x090185f2135308bad17527004364ebcc2d37e5f6": { + "name": "SPELL token contract", + "address": "0x090185f2135308bad17527004364ebcc2d37e5f6", + "token": { + "decimals": 18, + "symbol": "SPELL" + }, + "isSC": {} + }, + "0x3b484b82567a09e2588a13d54d032153f0c0aee0": { + "name": "SOS token contract", + "address": "0x3b484b82567a09e2588a13d54d032153f0c0aee0", + "token": { + "decimals": 18, + "symbol": "SOS" + }, + "isSC": {} + }, + "0x6bba316c48b49bd1eac44573c5c871ff02958469": { + "name": "GAS token contract", + "address": "0x6bba316c48b49bd1eac44573c5c871ff02958469", + "token": { + "decimals": 18, + "symbol": "GAS" + }, + "isSC": {} + }, + "0x4fabb145d64652a948d72533023f6e7a623c7c53": { + "name": "Binance USD", + "address": "0x4fabb145d64652a948d72533023f6e7a623c7c53", + "token": { + "decimals": 18, + "symbol": "BUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/busd.svg" + }, + "0x9e32b13ce7f2e80a01932b42553652e053d6ed8e": { + "name": "METIS token contract", + "address": "0x9e32b13ce7f2e80a01932b42553652e053d6ed8e", + "token": { + "decimals": 18, + "symbol": "METIS" + }, + "isSC": {} + }, + "0xf4d2888d29d722226fafa5d9b24f9164c092421e": { + "name": "LOOKS token contract", + "address": "0xf4d2888d29d722226fafa5d9b24f9164c092421e", + "token": { + "decimals": 18, + "symbol": "LOOKS" + }, + "isSC": {} + }, + "0x1e4ede388cbc9f4b5c79681b7f94d36a11abebc9": { + "name": "X2Y2 token contract", + "address": "0x1e4ede388cbc9f4b5c79681b7f94d36a11abebc9", + "token": { + "decimals": 18, + "symbol": "X2Y2" + }, + "isSC": {} + }, + "0x4d224452801aced8b2f0aebe155379bb5d594381": { + "name": "ApeCoin", + "address": "0x4d224452801aced8b2f0aebe155379bb5d594381", + "token": { + "decimals": 18, + "symbol": "APE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/APE.svg" + }, + "0xaf5191b0de278c7286d6c7cc6ab6bb8a73ba2cd6": { + "name": "STG token contract", + "address": "0xaf5191b0de278c7286d6c7cc6ab6bb8a73ba2cd6", + "token": { + "decimals": 18, + "symbol": "STG" + }, + "isSC": {} + }, + "0x70e8de73ce538da2beed35d14187f6959a8eca96": { + "name": "XSGD token contract", + "address": "0x70e8de73ce538da2beed35d14187f6959a8eca96", + "token": { + "decimals": 6, + "symbol": "XSGD" + }, + "isSC": {} + }, + "0xbafdabadcf19d0cfbbe0ab9c69cf050d86ff888c": { + "name": "ZEDXION token contract", + "address": "0xbafdabadcf19d0cfbbe0ab9c69cf050d86ff888c", + "token": { + "decimals": 18, + "symbol": "ZEDXION" + }, + "isSC": {} + }, + "0xb0c7a3ba49c7a6eaba6cd4a96c55a1391070ac9a": { + "name": "Treasure", + "address": "0xb0c7a3ba49c7a6eaba6cd4a96c55a1391070ac9a", + "token": { + "decimals": 18, + "symbol": "MAGIC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MAGIC.svg" + }, + "0xceba2a8f6ec221aeb5f3a7bcd15cbc7e6a387bfb": { + "name": "Peter Pan", + "address": "0xceba2a8f6ec221aeb5f3a7bcd15cbc7e6a387bfb", + "token": { + "decimals": 18, + "symbol": "PAN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PeterPan.svg" + }, + "0xcf60870dcedcad18d987af20687ca4717cae0533": { + "name": "DFC token contract", + "address": "0xcf60870dcedcad18d987af20687ca4717cae0533", + "token": { + "decimals": 18, + "symbol": "DFC" + }, + "isSC": {} + }, + "0xda47862a83dac0c112ba89c6abc2159b95afd71c": { + "name": "PRISMA token contract", + "address": "0xda47862a83dac0c112ba89c6abc2159b95afd71c", + "token": { + "decimals": 18, + "symbol": "PRISMA" + }, + "isSC": {} + }, + "0x397deb686c72384fad502a81f4d7fdb89e1f1280": { + "name": "XELS token contract", + "address": "0x397deb686c72384fad502a81f4d7fdb89e1f1280", + "token": { + "decimals": 8, + "symbol": "XELS" + }, + "isSC": {} + }, + "0x1122b6a0e00dce0563082b6e2953f3a943855c1f": { + "name": "CENNZ token contract", + "address": "0x1122b6a0e00dce0563082b6e2953f3a943855c1f", + "token": { + "decimals": 18, + "symbol": "CENNZ" + }, + "isSC": {} + }, + "0xb1f1ee126e9c96231cc3d3fad7c08b4cf873b1f1": { + "name": "BIFI token contract", + "address": "0xb1f1ee126e9c96231cc3d3fad7c08b4cf873b1f1", + "token": { + "decimals": 18, + "symbol": "BIFI" + }, + "isSC": {} + }, + "0xcdeb595293511115d9d9d44b189cc0da4a08cfaf": { + "name": "JFISH token contract", + "address": "0xcdeb595293511115d9d9d44b189cc0da4a08cfaf", + "token": { + "decimals": 18, + "symbol": "JFISH" + }, + "isSC": {} + }, + "0xaa846b1ec76cdf864ea03e1df665f6c8d5510923": { + "name": "LDAO token contract", + "address": "0xaa846b1ec76cdf864ea03e1df665f6c8d5510923", + "token": { + "decimals": 18, + "symbol": "LDAO" + }, + "isSC": {} + }, + "0x8765b1a0eb57ca49be7eacd35b24a574d0203656": { + "name": "MGH token contract", + "address": "0x8765b1a0eb57ca49be7eacd35b24a574d0203656", + "token": { + "decimals": 18, + "symbol": "MGH" + }, + "isSC": {} + }, + "0x9f9643209dcce8d7399d7bf932354768069ebc64": { + "name": "ICG token contract", + "address": "0x9f9643209dcce8d7399d7bf932354768069ebc64", + "token": { + "decimals": 18, + "symbol": "ICG" + }, + "isSC": {} + }, + "0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3": { + "name": "LEO token contract", + "address": "0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3", + "token": { + "decimals": 18, + "symbol": "LEO" + }, + "isSC": {} + }, + "0x038ed1383763d704d4271fe856ac96b4557e9d06": { + "name": "ALPHABET token contract", + "address": "0x038ed1383763d704d4271fe856ac96b4557e9d06", + "token": { + "decimals": 18, + "symbol": "ALPHABET" + }, + "isSC": {} + }, + "0x43d7e65b8ff49698d9550a7f315c87e67344fb59": { + "name": "SHIA token contract", + "address": "0x43d7e65b8ff49698d9550a7f315c87e67344fb59", + "token": { + "decimals": 18, + "symbol": "SHIA" + }, + "isSC": {} + }, + "0x209a78d23f825950a5df4d6d21288e5212b44f2c": { + "name": "ANVA token contract", + "address": "0x209a78d23f825950a5df4d6d21288e5212b44f2c", + "token": { + "decimals": 18, + "symbol": "ANVA" + }, + "isSC": {} + }, + "0xab306326bc72c2335bd08f42cbec383691ef8446": { + "name": "PPIZZA token contract", + "address": "0xab306326bc72c2335bd08f42cbec383691ef8446", + "token": { + "decimals": 18, + "symbol": "PPIZZA" + }, + "isSC": {} + }, + "0xcc2d17dfa245dc2aa3705fc75d2f7df3fe6440c7": { + "name": "RSRV token contract", + "address": "0xcc2d17dfa245dc2aa3705fc75d2f7df3fe6440c7", + "token": { + "decimals": 18, + "symbol": "RSRV" + }, + "isSC": {} + }, + "0x653aab62056b92641116d63927de6141d780e596": { + "name": "ACHF token contract", + "address": "0x653aab62056b92641116d63927de6141d780e596", + "token": { + "decimals": 18, + "symbol": "ACHF" + }, + "isSC": {} + }, + "0xada86b1b313d1d5267e3fc0bb303f0a2b66d0ea7": { + "name": "COV token contract", + "address": "0xada86b1b313d1d5267e3fc0bb303f0a2b66d0ea7", + "token": { + "decimals": 18, + "symbol": "COV" + }, + "isSC": {} + }, + "0xf49311af05a4ffb1dbf33d61e9b2d4f0a7d4a71c": { + "name": "CBOT token contract", + "address": "0xf49311af05a4ffb1dbf33d61e9b2d4f0a7d4a71c", + "token": { + "decimals": 9, + "symbol": "CBOT" + }, + "isSC": {} + }, + "0x29ef81cc8737f19449d501396d4968d138140675": { + "name": "0XCON token contract", + "address": "0x29ef81cc8737f19449d501396d4968d138140675", + "token": { + "decimals": 9, + "symbol": "0XCON" + }, + "isSC": {} + }, + "0x788b6d2b37aa51d916f2837ae25b05f0e61339d1": { + "name": "MVD token contract", + "address": "0x788b6d2b37aa51d916f2837ae25b05f0e61339d1", + "token": { + "decimals": 9, + "symbol": "MVD" + }, + "isSC": {} + }, + "0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5": { + "name": "Olympus", + "address": "0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5", + "token": { + "decimals": 9, + "symbol": "OHM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/OHM.svg" + }, + "0x97d4f49eeb0e2c96d5ebaa71ab8418e563ecd9fd": { + "name": "LSD token contract", + "address": "0x97d4f49eeb0e2c96d5ebaa71ab8418e563ecd9fd", + "token": { + "decimals": 9, + "symbol": "LSD" + }, + "isSC": {} + }, + "0xe085ff62e049b5e3a8d12bc6dffc2dfa329a8894": { + "name": "FLEX token contract", + "address": "0xe085ff62e049b5e3a8d12bc6dffc2dfa329a8894", + "token": { + "decimals": 18, + "symbol": "FLEX" + }, + "isSC": {} + }, + "0xb39364b51d2c97b62b838bc5213b8627eb469101": { + "name": "SWOT token contract", + "address": "0xb39364b51d2c97b62b838bc5213b8627eb469101", + "token": { + "decimals": 18, + "symbol": "SWOT" + }, + "isSC": {} + }, + "0x553531c45eabc2f3343d19885262ac784046fd5f": { + "name": "CYOP token contract", + "address": "0x553531c45eabc2f3343d19885262ac784046fd5f", + "token": { + "decimals": 18, + "symbol": "CYOP" + }, + "isSC": {} + }, + "0xb81914f05daf95802eb30726a399733e0696cd79": { + "name": "HOLA token contract", + "address": "0xb81914f05daf95802eb30726a399733e0696cd79", + "token": { + "decimals": 18, + "symbol": "HOLA" + }, + "isSC": {} + }, + "0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0": { + "name": "Frax Share", + "address": "0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0", + "token": { + "decimals": 18, + "symbol": "FXS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fxs.svg" + }, + "0x7da2641000cbb407c329310c461b2cb9c70c3046": { + "name": "AGI token contract", + "address": "0x7da2641000cbb407c329310c461b2cb9c70c3046", + "token": { + "decimals": 18, + "symbol": "AGI" + }, + "isSC": {} + }, + "0x8af78f0c818302164f73b2365fe152c2d1fe80e1": { + "name": "FNCT token contract", + "address": "0x8af78f0c818302164f73b2365fe152c2d1fe80e1", + "token": { + "decimals": 18, + "symbol": "FNCT" + }, + "isSC": {} + }, + "0x028171bca77440897b824ca71d1c56cac55b68a3": { + "name": "Aave DAI", + "address": "0x028171bca77440897b824ca71d1c56cac55b68a3", + "token": { + "decimals": 18, + "symbol": "aDAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aDAI.svg" + }, + "0xbe1dbe6741fb988fb571ab1e28cffb36e3c62629": { + "name": "MAV token contract", + "address": "0xbe1dbe6741fb988fb571ab1e28cffb36e3c62629", + "token": { + "decimals": 18, + "symbol": "MAV" + }, + "isSC": {} + }, + "0x3a6dc7eefef660be5c254c8aa1b710202151e345": { + "name": "PARROT token contract", + "address": "0x3a6dc7eefef660be5c254c8aa1b710202151e345", + "token": { + "decimals": 18, + "symbol": "PARROT" + }, + "isSC": {} + }, + "0xcb8fb2438a805664cd8c3e640b85ac473da5be87": { + "name": "CTI token contract", + "address": "0xcb8fb2438a805664cd8c3e640b85ac473da5be87", + "token": { + "decimals": 18, + "symbol": "CTI" + }, + "isSC": {} + }, + "0x644192291cc835a93d6330b24ea5f5fedd0eef9e": { + "name": "NXRA token contract", + "address": "0x644192291cc835a93d6330b24ea5f5fedd0eef9e", + "token": { + "decimals": 18, + "symbol": "NXRA" + }, + "isSC": {} + }, + "0x8bcbef61acd66537362f38167f11875134ffcd63": { + "name": "PEPEG token contract", + "address": "0x8bcbef61acd66537362f38167f11875134ffcd63", + "token": { + "decimals": 18, + "symbol": "PEPEG" + }, + "isSC": {} + }, + "0x513c3200f227ebb62e3b3d00b7a83779643a71cf": { + "name": "LIFT token contract", + "address": "0x513c3200f227ebb62e3b3d00b7a83779643a71cf", + "token": { + "decimals": 18, + "symbol": "LIFT" + }, + "isSC": {} + }, + "0x8baef8c9568c21b1a2b2fd048f8b4da835691fd0": { + "name": "USDZ token contract", + "address": "0x8baef8c9568c21b1a2b2fd048f8b4da835691fd0", + "token": { + "decimals": 18, + "symbol": "USDZ" + }, + "isSC": {} + }, + "0x8806926ab68eb5a7b909dcaf6fdbe5d93271d6e2": { + "name": "UQC token contract", + "address": "0x8806926ab68eb5a7b909dcaf6fdbe5d93271d6e2", + "token": { + "decimals": 18, + "symbol": "UQC" + }, + "isSC": {} + }, + "0x39142c18b6db2a8a41b7018f49e1478837560cad": { + "name": "STATS token contract", + "address": "0x39142c18b6db2a8a41b7018f49e1478837560cad", + "token": { + "decimals": 9, + "symbol": "STATS" + }, + "isSC": {} + }, + "0x26fb86579e371c7aedc461b2ddef0a8628c93d3b": { + "name": "BORA token contract", + "address": "0x26fb86579e371c7aedc461b2ddef0a8628c93d3b", + "token": { + "decimals": 18, + "symbol": "BORA" + }, + "isSC": {} + }, + "0x6553565eac5daa9bfc5e2892b36291634c9b2ad6": { + "name": "RAKE token contract", + "address": "0x6553565eac5daa9bfc5e2892b36291634c9b2ad6", + "token": { + "decimals": 18, + "symbol": "RAKE" + }, + "isSC": {} + }, + "0x6034e0d6999741f07cb6fb1162cbaa46a1d33d36": { + "name": "VITA-FAST token contract", + "address": "0x6034e0d6999741f07cb6fb1162cbaa46a1d33d36", + "token": { + "decimals": 18, + "symbol": "VITA-FAST" + }, + "isSC": {} + }, + "0x72e4f9f808c49a2a61de9c5896298920dc4eeea9": { + "name": "BITCOIN token contract", + "address": "0x72e4f9f808c49a2a61de9c5896298920dc4eeea9", + "token": { + "decimals": 8, + "symbol": "BITCOIN" + }, + "isSC": {} + }, + "0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec": { + "name": "REL token contract", + "address": "0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec", + "token": { + "decimals": 18, + "symbol": "REL" + }, + "isSC": {} + }, + "0xef19f4e48830093ce5bc8b3ff7f903a0ae3e9fa1": { + "name": "BOTX token contract", + "address": "0xef19f4e48830093ce5bc8b3ff7f903a0ae3e9fa1", + "token": { + "decimals": 18, + "symbol": "BOTX" + }, + "isSC": {} + }, + "0x5e3346444010135322268a4630d2ed5f8d09446c": { + "name": "LOC token contract", + "address": "0x5e3346444010135322268a4630d2ed5f8d09446c", + "token": { + "decimals": 18, + "symbol": "LOC" + }, + "isSC": {} + }, + "0x97effb790f2fbb701d88f89db4521348a2b77be8": { + "name": "CVG token contract", + "address": "0x97effb790f2fbb701d88f89db4521348a2b77be8", + "token": { + "decimals": 18, + "symbol": "CVG" + }, + "isSC": {} + }, + "0x92868a5255c628da08f550a858a802f5351c5223": { + "name": "BRIDGE token contract", + "address": "0x92868a5255c628da08f550a858a802f5351c5223", + "token": { + "decimals": 18, + "symbol": "BRIDGE" + }, + "isSC": {} + }, + "0x3c2a309d9005433c1bc2c92ef1be06489e5bf258": { + "name": "WPCI token contract", + "address": "0x3c2a309d9005433c1bc2c92ef1be06489e5bf258", + "token": { + "decimals": 8, + "symbol": "WPCI" + }, + "isSC": {} + }, + "0x183395dbd0b5e93323a7286d1973150697fffcb3": { + "name": "CVXFXN token contract", + "address": "0x183395dbd0b5e93323a7286d1973150697fffcb3", + "token": { + "decimals": 18, + "symbol": "CVXFXN" + }, + "isSC": {} + }, + "0x120a3879da835a5af037bb2d1456bebd6b54d4ba": { + "name": "RVST token contract", + "address": "0x120a3879da835a5af037bb2d1456bebd6b54d4ba", + "token": { + "decimals": 18, + "symbol": "RVST" + }, + "isSC": {} + }, + "0x674c964ac0e89d847d6b0abd144b797bf78ba56b": { + "name": "GWD token contract", + "address": "0x674c964ac0e89d847d6b0abd144b797bf78ba56b", + "token": { + "decimals": 6, + "symbol": "GWD" + }, + "isSC": {} + }, + "0xc1ad0aa69454603a5dee55cf9bd9341e01328544": { + "name": "HIGAZERS token contract", + "address": "0xc1ad0aa69454603a5dee55cf9bd9341e01328544", + "token": { + "decimals": 18, + "symbol": "HIGAZERS" + }, + "isSC": {} + }, + "0x930ae5999210724248b36265e8d3696128115946": { + "name": "SAITAMA token contract", + "address": "0x930ae5999210724248b36265e8d3696128115946", + "token": { + "decimals": 8, + "symbol": "SAITAMA" + }, + "isSC": {} + }, + "0x42476f744292107e34519f9c357927074ea3f75d": { + "name": "Loom", + "address": "0x42476f744292107e34519f9c357927074ea3f75d", + "token": { + "decimals": 18, + "symbol": "LOOM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/loom.svg" + }, + "0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17": { + "name": "DYP token contract", + "address": "0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17", + "token": { + "decimals": 18, + "symbol": "DYP" + }, + "isSC": {} + }, + "0x58b6a8a3302369daec383334672404ee733ab239": { + "name": "Livepeer", + "address": "0x58b6a8a3302369daec383334672404ee733ab239", + "token": { + "decimals": 18, + "symbol": "LPT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/lpt.svg" + }, + "0x03ee5026c07d85ff8ae791370dd0f4c1ae6c97fc": { + "name": "OXL token contract", + "address": "0x03ee5026c07d85ff8ae791370dd0f4c1ae6c97fc", + "token": { + "decimals": 18, + "symbol": "OXL" + }, + "isSC": {} + }, + "0xa62cc35625b0c8dc1faea39d33625bb4c15bd71c": { + "name": "StormX", + "address": "0xa62cc35625b0c8dc1faea39d33625bb4c15bd71c", + "token": { + "decimals": 18, + "symbol": "STMX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stormx.svg" + }, + "0xf4b5470523ccd314c6b9da041076e7d79e0df267": { + "name": "BBANK token contract", + "address": "0xf4b5470523ccd314c6b9da041076e7d79e0df267", + "token": { + "decimals": 18, + "symbol": "BBANK" + }, + "isSC": {} + }, + "0xc55126051b22ebb829d00368f4b12bde432de5da": { + "name": "BTRFLY token contract", + "address": "0xc55126051b22ebb829d00368f4b12bde432de5da", + "token": { + "decimals": 18, + "symbol": "BTRFLY" + }, + "isSC": {} + }, + "0x179cd91631d96e8fafee6a744eac6ffdbb923520": { + "name": "IXI token contract", + "address": "0x179cd91631d96e8fafee6a744eac6ffdbb923520", + "token": { + "decimals": 8, + "symbol": "IXI" + }, + "isSC": {} + }, + "0x6fc16de36e040e0c7d1a70d039ef701516516b32": { + "name": "SCOPEX token contract", + "address": "0x6fc16de36e040e0c7d1a70d039ef701516516b32", + "token": { + "decimals": 9, + "symbol": "SCOPEX" + }, + "isSC": {} + }, + "0xd85ad783cc94bd04196a13dc042a3054a9b52210": { + "name": "HAKA token contract", + "address": "0xd85ad783cc94bd04196a13dc042a3054a9b52210", + "token": { + "decimals": 18, + "symbol": "HAKA" + }, + "isSC": {} + }, + "0x7d225c4cc612e61d26523b099b0718d03152edef": { + "name": "FORK token contract", + "address": "0x7d225c4cc612e61d26523b099b0718d03152edef", + "token": { + "decimals": 18, + "symbol": "FORK" + }, + "isSC": {} + }, + "0x3b0fccbd5dae0570a70f1fb6d8d666a33c89d71e": { + "name": "FLOOR token contract", + "address": "0x3b0fccbd5dae0570a70f1fb6d8d666a33c89d71e", + "token": { + "decimals": 18, + "symbol": "FLOOR" + }, + "isSC": {} + }, + "0x0018d5e01e53878f90feab02f1b2019a21adf8b1": { + "name": "SHADOWCATS token contract", + "address": "0x0018d5e01e53878f90feab02f1b2019a21adf8b1", + "token": { + "decimals": 18, + "symbol": "SHADOWCATS" + }, + "isSC": {} + }, + "0x0ec72cd6690db40b16be166858299f19d4f8e5b0": { + "name": "GOLD1 token contract", + "address": "0x0ec72cd6690db40b16be166858299f19d4f8e5b0", + "token": { + "decimals": 9, + "symbol": "GOLD1" + }, + "isSC": {} + }, + "0x80008bcd713c38af90a9930288d446bc3bd2e684": { + "name": "KARATE token contract", + "address": "0x80008bcd713c38af90a9930288d446bc3bd2e684", + "token": { + "decimals": 18, + "symbol": "KARATE" + }, + "isSC": {} + }, + "0x8390a1da07e376ef7add4be859ba74fb83aa02d5": { + "name": "GROK token contract", + "address": "0x8390a1da07e376ef7add4be859ba74fb83aa02d5", + "token": { + "decimals": 9, + "symbol": "GROK" + }, + "isSC": {} + }, + "0x9f5f3cfd7a32700c93f971637407ff17b91c7342": { + "name": "DDD token contract", + "address": "0x9f5f3cfd7a32700c93f971637407ff17b91c7342", + "token": { + "decimals": 18, + "symbol": "DDD" + }, + "isSC": {} + }, + "0x089453742936dd35134383aee9d78bee63a69b01": { + "name": "GOLD token contract", + "address": "0x089453742936dd35134383aee9d78bee63a69b01", + "token": { + "decimals": 18, + "symbol": "GOLD" + }, + "isSC": {} + }, + "0x31c2415c946928e9fd1af83cdfa38d3edbd4326f": { + "name": "UMAD token contract", + "address": "0x31c2415c946928e9fd1af83cdfa38d3edbd4326f", + "token": { + "decimals": 8, + "symbol": "UMAD" + }, + "isSC": {} + }, + "0xac51066d7bec65dc4589368da368b212745d63e8": { + "name": "ALICE token contract", + "address": "0xac51066d7bec65dc4589368da368b212745d63e8", + "token": { + "decimals": 6, + "symbol": "ALICE" + }, + "isSC": {} + }, + "0x616e8bfa43f920657b3497dbf40d6b1a02d4608d": { + "name": "AURABAL token contract", + "address": "0x616e8bfa43f920657b3497dbf40d6b1a02d4608d", + "token": { + "decimals": 18, + "symbol": "AURABAL" + }, + "isSC": {} + }, + "0xf2a22b900dde3ba18ec2aef67d4c8c1a0dab6aac": { + "name": "MONKEYS token contract", + "address": "0xf2a22b900dde3ba18ec2aef67d4c8c1a0dab6aac", + "token": { + "decimals": 9, + "symbol": "MONKEYS" + }, + "isSC": {} + }, + "0xacc48f65f8701f376bc4ba13f4bc103f31dda74e": { + "name": "SWIFT token contract", + "address": "0xacc48f65f8701f376bc4ba13f4bc103f31dda74e", + "token": { + "decimals": 18, + "symbol": "SWIFT" + }, + "isSC": {} + }, + "0x05fe069626543842439ef90d9fa1633640c50cf1": { + "name": "EVEAI token contract", + "address": "0x05fe069626543842439ef90d9fa1633640c50cf1", + "token": { + "decimals": 18, + "symbol": "EVEAI" + }, + "isSC": {} + }, + "0xe0a189c975e4928222978a74517442239a0b86ff": { + "name": "KEYS token contract", + "address": "0xe0a189c975e4928222978a74517442239a0b86ff", + "token": { + "decimals": 9, + "symbol": "KEYS" + }, + "isSC": {} + }, + "0x1903be033d3e436dd79a8cf9030675bcf97ab589": { + "name": "BJK token contract", + "address": "0x1903be033d3e436dd79a8cf9030675bcf97ab589", + "token": { + "decimals": 6, + "symbol": "BJK" + }, + "isSC": {} + }, + "0xa0cc4428fbb652c396f28dce8868b8743742a71c": { + "name": "PAI token contract", + "address": "0xa0cc4428fbb652c396f28dce8868b8743742a71c", + "token": { + "decimals": 18, + "symbol": "PAI" + }, + "isSC": {} + }, + "0xc382e04099a435439725bb40647e2b32dc136806": { + "name": "COGE token contract", + "address": "0xc382e04099a435439725bb40647e2b32dc136806", + "token": { + "decimals": 18, + "symbol": "COGE" + }, + "isSC": {} + }, + "0x8c3d11360a70fb708762b394be8ef23e3a633e3f": { + "name": "UBAKC token contract", + "address": "0x8c3d11360a70fb708762b394be8ef23e3a633e3f", + "token": { + "decimals": 18, + "symbol": "UBAKC" + }, + "isSC": {} + }, + "0x51fa2efd62ee56a493f24ae963eace7d0051929e": { + "name": "PSDNOCEAN token contract", + "address": "0x51fa2efd62ee56a493f24ae963eace7d0051929e", + "token": { + "decimals": 18, + "symbol": "PSDNOCEAN" + }, + "isSC": {} + }, + "0x232fb065d9d24c34708eedbf03724f2e95abe768": { + "name": "SHEESHA token contract", + "address": "0x232fb065d9d24c34708eedbf03724f2e95abe768", + "token": { + "decimals": 18, + "symbol": "SHEESHA" + }, + "isSC": {} + }, + "0x312d43881860807fa04b193d69744d087fc3308a": { + "name": "BD20 token contract", + "address": "0x312d43881860807fa04b193d69744d087fc3308a", + "token": { + "decimals": 18, + "symbol": "BD20" + }, + "isSC": {} + }, + "0x17f7fea5f87d0f289d9827be78fc96027f8ed724": { + "name": "EHCK token contract", + "address": "0x17f7fea5f87d0f289d9827be78fc96027f8ed724", + "token": { + "decimals": 0, + "symbol": "EHCK" + }, + "isSC": {} + }, + "0x8ed97a637a790be1feff5e888d43629dc05408f6": { + "name": "NPC token contract", + "address": "0x8ed97a637a790be1feff5e888d43629dc05408f6", + "token": { + "decimals": 18, + "symbol": "NPC" + }, + "isSC": {} + }, + "0xc5d27f27f08d1fd1e3ebbaa50b3442e6c0d50439": { + "name": "APP token contract", + "address": "0xc5d27f27f08d1fd1e3ebbaa50b3442e6c0d50439", + "token": { + "decimals": 18, + "symbol": "APP" + }, + "isSC": {} + }, + "0x1500205f50bf3fd976466d0662905c9ff254fc9c": { + "name": "BBT token contract", + "address": "0x1500205f50bf3fd976466d0662905c9ff254fc9c", + "token": { + "decimals": 4, + "symbol": "BBT" + }, + "isSC": {} + }, + "0x5a338f22b798490ec3e70cd5e64d0cc0754241c0": { + "name": "NSF token contract", + "address": "0x5a338f22b798490ec3e70cd5e64d0cc0754241c0", + "token": { + "decimals": 18, + "symbol": "NSF" + }, + "isSC": {} + }, + "0x68037790a0229e9ce6eaa8a99ea92964106c4703": { + "name": "PAR token contract", + "address": "0x68037790a0229e9ce6eaa8a99ea92964106c4703", + "token": { + "decimals": 18, + "symbol": "PAR" + }, + "isSC": {} + }, + "0x71fc860f7d3a592a4a98740e39db31d25db65ae8": { + "name": "AUSDT token contract", + "address": "0x71fc860f7d3a592a4a98740e39db31d25db65ae8", + "token": { + "decimals": 6, + "symbol": "AUSDT" + }, + "isSC": {} + }, + "0x9870fb2a93fe3c1ad2fc585dba873e5cb77f3e4c": { + "name": "MRSPEPE token contract", + "address": "0x9870fb2a93fe3c1ad2fc585dba873e5cb77f3e4c", + "token": { + "decimals": 18, + "symbol": "MRSPEPE" + }, + "isSC": {} + }, + "0xb62e45c3df611dce236a6ddc7a493d79f9dfadef": { + "name": "WSM token contract", + "address": "0xb62e45c3df611dce236a6ddc7a493d79f9dfadef", + "token": { + "decimals": 18, + "symbol": "WSM" + }, + "isSC": {} + }, + "0xb8a87405d9a4f2f866319b77004e88dff66c0d92": { + "name": "SORA token contract", + "address": "0xb8a87405d9a4f2f866319b77004e88dff66c0d92", + "token": { + "decimals": 18, + "symbol": "SORA" + }, + "isSC": {} + }, + "0x3da932456d082cba208feb0b096d49b202bf89c8": { + "name": "DEGO token contract", + "address": "0x3da932456d082cba208feb0b096d49b202bf89c8", + "token": { + "decimals": 18, + "symbol": "DEGO" + }, + "isSC": {} + }, + "0xf7e945fce8f19302aacc7e1418b0a0bdef89327b": { + "name": "IZE token contract", + "address": "0xf7e945fce8f19302aacc7e1418b0a0bdef89327b", + "token": { + "decimals": 8, + "symbol": "IZE" + }, + "isSC": {} + }, + "0xb98d4c97425d9908e66e53a6fdf673acca0be986": { + "name": "ABT token contract", + "address": "0xb98d4c97425d9908e66e53a6fdf673acca0be986", + "token": { + "decimals": 18, + "symbol": "ABT" + }, + "isSC": {} + }, + "0x5fbc3cb8b428cc00a04808870295d39962cc7fee": { + "name": "BTZ token contract", + "address": "0x5fbc3cb8b428cc00a04808870295d39962cc7fee", + "token": { + "decimals": 18, + "symbol": "BTZ" + }, + "isSC": {} + }, + "0x369733153e6e08d38f2bc72ae2432e855cfbe221": { + "name": "XALPHA token contract", + "address": "0x369733153e6e08d38f2bc72ae2432e855cfbe221", + "token": { + "decimals": 18, + "symbol": "XALPHA" + }, + "isSC": {} + }, + "0x6ef460eb3563cfcc73f8147b0a77daffee71f867": { + "name": "ZEUS token contract", + "address": "0x6ef460eb3563cfcc73f8147b0a77daffee71f867", + "token": { + "decimals": 18, + "symbol": "ZEUS" + }, + "isSC": {} + }, + "0xa02120696c7b8fe16c09c749e4598819b2b0e915": { + "name": "WXT token contract", + "address": "0xa02120696c7b8fe16c09c749e4598819b2b0e915", + "token": { + "decimals": 18, + "symbol": "WXT" + }, + "isSC": {} + }, + "0x486f4641ef2b50cc130dadbd27b6f271723873b8": { + "name": "GOLD token contract", + "address": "0x486f4641ef2b50cc130dadbd27b6f271723873b8", + "token": { + "decimals": 18, + "symbol": "GOLD" + }, + "isSC": {} + }, + "0xf0068a3657526bc7f824b55575714ebffe9ca67e": { + "name": "PGA token contract", + "address": "0xf0068a3657526bc7f824b55575714ebffe9ca67e", + "token": { + "decimals": 18, + "symbol": "PGA" + }, + "isSC": {} + }, + "0x485c665d8eeaca7987c48057ffd0591e2aaa797e": { + "name": "MMT token contract", + "address": "0x485c665d8eeaca7987c48057ffd0591e2aaa797e", + "token": { + "decimals": 18, + "symbol": "MMT" + }, + "isSC": {} + }, + "0x0aee8703d34dd9ae107386d3eff22ae75dd616d1": { + "name": "SLICE token contract", + "address": "0x0aee8703d34dd9ae107386d3eff22ae75dd616d1", + "token": { + "decimals": 18, + "symbol": "SLICE" + }, + "isSC": {} + }, + "0x777fd20c983d6658c1d50b3958b3a1733d1cd1e1": { + "name": "PUBLISH", + "address": "0x777fd20c983d6658c1d50b3958b3a1733d1cd1e1", + "token": { + "decimals": 9, + "symbol": "NEWS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/publish.svg" + }, + "0x12ef10a4fc6e1ea44b4ca9508760ff51c647bb71": { + "name": "RSTK token contract", + "address": "0x12ef10a4fc6e1ea44b4ca9508760ff51c647bb71", + "token": { + "decimals": 18, + "symbol": "RSTK" + }, + "isSC": {} + }, + "0x3acfc40a19520d97648eb7c0891e747b7f2b0283": { + "name": "UAZUKI token contract", + "address": "0x3acfc40a19520d97648eb7c0891e747b7f2b0283", + "token": { + "decimals": 18, + "symbol": "UAZUKI" + }, + "isSC": {} + }, + "0xaecc217a749c2405b5ebc9857a16d58bdc1c367f": { + "name": "PAWTH token contract", + "address": "0xaecc217a749c2405b5ebc9857a16d58bdc1c367f", + "token": { + "decimals": 9, + "symbol": "PAWTH" + }, + "isSC": {} + }, + "0x922d8563631b03c2c4cf817f4d18f6883aba0109": { + "name": "LOCK token contract", + "address": "0x922d8563631b03c2c4cf817f4d18f6883aba0109", + "token": { + "decimals": 18, + "symbol": "LOCK" + }, + "isSC": {} + }, + "0x5da151b95657e788076d04d56234bd93e409cb09": { + "name": "OTSEA token contract", + "address": "0x5da151b95657e788076d04d56234bd93e409cb09", + "token": { + "decimals": 18, + "symbol": "OTSEA" + }, + "isSC": {} + }, + "0x830a8512db4f6fca51968593e2667156c2c483a8": { + "name": "WEN token contract", + "address": "0x830a8512db4f6fca51968593e2667156c2c483a8", + "token": { + "decimals": 18, + "symbol": "WEN" + }, + "isSC": {} + }, + "0xfd1450a131599ff34f3be1775d8c8bf79e353d8c": { + "name": "SHIBA token contract", + "address": "0xfd1450a131599ff34f3be1775d8c8bf79e353d8c", + "token": { + "decimals": 18, + "symbol": "SHIBA" + }, + "isSC": {} + }, + "0x4096fc7119040175589387656f7c6073265f4096": { + "name": "4096 token contract", + "address": "0x4096fc7119040175589387656f7c6073265f4096", + "token": { + "decimals": 0, + "symbol": "4096" + }, + "isSC": {} + }, + "0xd9c2d319cd7e6177336b0a9c93c21cb48d84fb54": { + "name": "HAPI token contract", + "address": "0xd9c2d319cd7e6177336b0a9c93c21cb48d84fb54", + "token": { + "decimals": 18, + "symbol": "HAPI" + }, + "isSC": {} + }, + "0xaaee1a9723aadb7afa2810263653a34ba2c21c7a": { + "name": "MOG token contract", + "address": "0xaaee1a9723aadb7afa2810263653a34ba2c21c7a", + "token": { + "decimals": 18, + "symbol": "MOG" + }, + "isSC": {} + }, + "0x1f19f83fc9a25f3c861260143e36c17706257986": { + "name": "VEST token contract", + "address": "0x1f19f83fc9a25f3c861260143e36c17706257986", + "token": { + "decimals": 18, + "symbol": "VEST" + }, + "isSC": {} + }, + "0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5": { + "name": "BETS token contract", + "address": "0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5", + "token": { + "decimals": 18, + "symbol": "BETS" + }, + "isSC": {} + }, + "0x0001a500a6b18995b03f44bb040a5ffc28e45cb0": { + "name": "OLAS token contract", + "address": "0x0001a500a6b18995b03f44bb040a5ffc28e45cb0", + "token": { + "decimals": 18, + "symbol": "OLAS" + }, + "isSC": {} + }, + "0x470c8950c0c3aa4b09654bc73b004615119a44b5": { + "name": "KIZUNA token contract", + "address": "0x470c8950c0c3aa4b09654bc73b004615119a44b5", + "token": { + "decimals": 18, + "symbol": "KIZUNA" + }, + "isSC": {} + }, + "0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06": { + "name": "PAR token contract", + "address": "0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06", + "token": { + "decimals": 18, + "symbol": "PAR" + }, + "isSC": {} + }, + "0x7104d1f179cc9cc7fb5c79be6da846e3fbc4c105": { + "name": "X7104 token contract", + "address": "0x7104d1f179cc9cc7fb5c79be6da846e3fbc4c105", + "token": { + "decimals": 18, + "symbol": "X7104" + }, + "isSC": {} + }, + "0x177c3973b16c16fb5d934ca92b6e6afb03383268": { + "name": "P404 token contract", + "address": "0x177c3973b16c16fb5d934ca92b6e6afb03383268", + "token": { + "decimals": 18, + "symbol": "P404" + }, + "isSC": {} + }, + "0xb056c38f6b7dc4064367403e26424cd2c60655e1": { + "name": "CEEK token contract", + "address": "0xb056c38f6b7dc4064367403e26424cd2c60655e1", + "token": { + "decimals": 18, + "symbol": "CEEK" + }, + "isSC": {} + }, + "0x99e186e8671db8b10d45b7a1c430952a9fbe0d40": { + "name": "SHOP token contract", + "address": "0x99e186e8671db8b10d45b7a1c430952a9fbe0d40", + "token": { + "decimals": 18, + "symbol": "SHOP" + }, + "isSC": {} + }, + "0x8dc89f4716e027394bba225b82328c1ea2ea58bf": { + "name": "GVC token contract", + "address": "0x8dc89f4716e027394bba225b82328c1ea2ea58bf", + "token": { + "decimals": 18, + "symbol": "GVC" + }, + "isSC": {} + }, + "0x5919dea604631016c15c805e3d948a0384879892": { + "name": "PEEP token contract", + "address": "0x5919dea604631016c15c805e3d948a0384879892", + "token": { + "decimals": 9, + "symbol": "PEEP" + }, + "isSC": {} + }, + "0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd": { + "name": "MAV token contract", + "address": "0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd", + "token": { + "decimals": 18, + "symbol": "MAV" + }, + "isSC": {} + }, + "0x60c0d11c10a0c04acb47c6296156bdffac62ef97": { + "name": "BBCG token contract", + "address": "0x60c0d11c10a0c04acb47c6296156bdffac62ef97", + "token": { + "decimals": 4, + "symbol": "BBCG" + }, + "isSC": {} + }, + "0x4c4a50a61bed3b9024d8ffc1f1d168dc8cb1c689": { + "name": "BARC token contract", + "address": "0x4c4a50a61bed3b9024d8ffc1f1d168dc8cb1c689", + "token": { + "decimals": 9, + "symbol": "BARC" + }, + "isSC": {} + }, + "0xbfabde619ed5c4311811cf422562709710db587d": { + "name": "DIVA token contract", + "address": "0xbfabde619ed5c4311811cf422562709710db587d", + "token": { + "decimals": 18, + "symbol": "DIVA" + }, + "isSC": {} + }, + "0x6b0faca7ba905a86f221ceb5ca404f605e5b3131": { + "name": "DEFI token contract", + "address": "0x6b0faca7ba905a86f221ceb5ca404f605e5b3131", + "token": { + "decimals": 18, + "symbol": "DEFI" + }, + "isSC": {} + }, + "0xf70e5e46a50bba54917d9cb7aeb8b83610bcd969": { + "name": "EGMC token contract", + "address": "0xf70e5e46a50bba54917d9cb7aeb8b83610bcd969", + "token": { + "decimals": 18, + "symbol": "EGMC" + }, + "isSC": {} + }, + "0x2de7b02ae3b1f11d51ca7b2495e9094874a064c0": { + "name": "SHIB2 token contract", + "address": "0x2de7b02ae3b1f11d51ca7b2495e9094874a064c0", + "token": { + "decimals": 18, + "symbol": "SHIB2" + }, + "isSC": {} + }, + "0xcd2828fc4d8e8a0ede91bb38cf64b1a81de65bf6": { + "name": "ODDZ token contract", + "address": "0xcd2828fc4d8e8a0ede91bb38cf64b1a81de65bf6", + "token": { + "decimals": 18, + "symbol": "ODDZ" + }, + "isSC": {} + }, + "0x1e917e764bc34d3bc313fe8159a6bd9d9ffd450d": { + "name": "WEWE token contract", + "address": "0x1e917e764bc34d3bc313fe8159a6bd9d9ffd450d", + "token": { + "decimals": 18, + "symbol": "WEWE" + }, + "isSC": {} + }, + "0x89d584a1edb3a70b3b07963f9a3ea5399e38b136": { + "name": "AIT token contract", + "address": "0x89d584a1edb3a70b3b07963f9a3ea5399e38b136", + "token": { + "decimals": 18, + "symbol": "AIT" + }, + "isSC": {} + }, + "0xbb97e381f1d1e94ffa2a5844f6875e6146981009": { + "name": "WBX token contract", + "address": "0xbb97e381f1d1e94ffa2a5844f6875e6146981009", + "token": { + "decimals": 18, + "symbol": "WBX" + }, + "isSC": {} + }, + "0x545bd6c032efdde65a377a6719def2796c8e0f2e": { + "name": "AENS token contract", + "address": "0x545bd6c032efdde65a377a6719def2796c8e0f2e", + "token": { + "decimals": 18, + "symbol": "AENS" + }, + "isSC": {} + }, + "0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe": { + "name": "StableUSD", + "address": "0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe", + "token": { + "decimals": 6, + "symbol": "USDS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usds.svg" + }, + "0x92d529163c5e880b9de86f01de0cb8924d790357": { + "name": "EYE token contract", + "address": "0x92d529163c5e880b9de86f01de0cb8924d790357", + "token": { + "decimals": 18, + "symbol": "EYE" + }, + "isSC": {} + }, + "0x94e496474f1725f1c1824cb5bdb92d7691a4f03a": { + "name": "BANANA token contract", + "address": "0x94e496474f1725f1c1824cb5bdb92d7691a4f03a", + "token": { + "decimals": 18, + "symbol": "BANANA" + }, + "isSC": {} + }, + "0x12b6893ce26ea6341919fe289212ef77e51688c8": { + "name": "TAMA token contract", + "address": "0x12b6893ce26ea6341919fe289212ef77e51688c8", + "token": { + "decimals": 18, + "symbol": "TAMA" + }, + "isSC": {} + }, + "0x142a774e8b52550e88e196cedd7a5835acb646d0": { + "name": "SRLTY token contract", + "address": "0x142a774e8b52550e88e196cedd7a5835acb646d0", + "token": { + "decimals": 9, + "symbol": "SRLTY" + }, + "isSC": {} + }, + "0x3810a4ddf41e586fa0dba1463a7951b748cecfca": { + "name": "MPAY token contract", + "address": "0x3810a4ddf41e586fa0dba1463a7951b748cecfca", + "token": { + "decimals": 18, + "symbol": "MPAY" + }, + "isSC": {} + }, + "0x7f792db54b0e580cdc755178443f0430cf799aca": { + "name": "VOLT token contract", + "address": "0x7f792db54b0e580cdc755178443f0430cf799aca", + "token": { + "decimals": 9, + "symbol": "VOLT" + }, + "isSC": {} + }, + "0xdefcafe7eac90d31bbba841038df365de3c4e207": { + "name": "CAFE token contract", + "address": "0xdefcafe7eac90d31bbba841038df365de3c4e207", + "token": { + "decimals": 9, + "symbol": "CAFE" + }, + "isSC": {} + }, + "0x33bc4e44054fdb21d5a7cea5c03613782d821e45": { + "name": "XUDO token contract", + "address": "0x33bc4e44054fdb21d5a7cea5c03613782d821e45", + "token": { + "decimals": 18, + "symbol": "XUDO" + }, + "isSC": {} + }, + "0xd66c27518e72be89999ab1e53c3d9ff73f7f2858": { + "name": "TETHER token contract", + "address": "0xd66c27518e72be89999ab1e53c3d9ff73f7f2858", + "token": { + "decimals": 8, + "symbol": "TETHER" + }, + "isSC": {} + }, + "0x893c47bc1ff55c2269236ac7a4288681532161e0": { + "name": "ERR token contract", + "address": "0x893c47bc1ff55c2269236ac7a4288681532161e0", + "token": { + "decimals": 18, + "symbol": "ERR" + }, + "isSC": {} + }, + "0xc608557d966f6b7568e5c9345285f0c8c90a96a2": { + "name": "XCATGE token contract", + "address": "0xc608557d966f6b7568e5c9345285f0c8c90a96a2", + "token": { + "decimals": 9, + "symbol": "XCATGE" + }, + "isSC": {} + }, + "0x4fa5836b58d6f1877a616e7833c7350781e21202": { + "name": "UOTHR token contract", + "address": "0x4fa5836b58d6f1877a616e7833c7350781e21202", + "token": { + "decimals": 18, + "symbol": "UOTHR" + }, + "isSC": {} + }, + "0x470ebf5f030ed85fc1ed4c2d36b9dd02e77cf1b7": { + "name": "TEMPLE token contract", + "address": "0x470ebf5f030ed85fc1ed4c2d36b9dd02e77cf1b7", + "token": { + "decimals": 18, + "symbol": "TEMPLE" + }, + "isSC": {} + }, + "0xde67d97b8770dc98c746a3fc0093c538666eb493": { + "name": "BROCK token contract", + "address": "0xde67d97b8770dc98c746a3fc0093c538666eb493", + "token": { + "decimals": 9, + "symbol": "BROCK" + }, + "isSC": {} + }, + "0x18b7f4d5d8d1e36af2975be978fbb5438fd3c2a5": { + "name": "BETROCK token contract", + "address": "0x18b7f4d5d8d1e36af2975be978fbb5438fd3c2a5", + "token": { + "decimals": 18, + "symbol": "BETROCK" + }, + "isSC": {} + }, + "0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05": { + "name": "GEL token contract", + "address": "0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05", + "token": { + "decimals": 18, + "symbol": "GEL" + }, + "isSC": {} + }, + "0x940a2db1b7008b6c776d4faaca729d6d4a4aa551": { + "name": "DUSK token contract", + "address": "0x940a2db1b7008b6c776d4faaca729d6d4a4aa551", + "token": { + "decimals": 18, + "symbol": "DUSK" + }, + "isSC": {} + }, + "0xc2456d2118299a2efdfe6522ff79aa48fc5d2b00": { + "name": "MARU token contract", + "address": "0xc2456d2118299a2efdfe6522ff79aa48fc5d2b00", + "token": { + "decimals": 9, + "symbol": "MARU" + }, + "isSC": {} + }, + "0x661ecf29b533e7d09f67f597af77eeaf3cc6b1e7": { + "name": "NUDE token contract", + "address": "0x661ecf29b533e7d09f67f597af77eeaf3cc6b1e7", + "token": { + "decimals": 9, + "symbol": "NUDE" + }, + "isSC": {} + }, + "0xb970e14df2161c0a2f32eba35901f2446581b482": { + "name": "RKR token contract", + "address": "0xb970e14df2161c0a2f32eba35901f2446581b482", + "token": { + "decimals": 9, + "symbol": "RKR" + }, + "isSC": {} + }, + "0x2e85ae1c47602f7927bcabc2ff99c40aa222ae15": { + "name": "KATA token contract", + "address": "0x2e85ae1c47602f7927bcabc2ff99c40aa222ae15", + "token": { + "decimals": 18, + "symbol": "KATA" + }, + "isSC": {} + }, + "0xa4cb0dce4849bdcad2d553e9e68644cf40e26cce": { + "name": "BAKED token contract", + "address": "0xa4cb0dce4849bdcad2d553e9e68644cf40e26cce", + "token": { + "decimals": 18, + "symbol": "BAKED" + }, + "isSC": {} + }, + "0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24": { + "name": "Render Token", + "address": "0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24", + "token": { + "decimals": 18, + "symbol": "RNDR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/RNDR.svg" + }, + "0x570936840fa942c96ca4c57a170dda494dd9b9c6": { + "name": "ART token contract", + "address": "0x570936840fa942c96ca4c57a170dda494dd9b9c6", + "token": { + "decimals": 18, + "symbol": "ART" + }, + "isSC": {} + }, + "0x07ac55797d4f43f57ca92a49e65ca582cc287c27": { + "name": "TBT token contract", + "address": "0x07ac55797d4f43f57ca92a49e65ca582cc287c27", + "token": { + "decimals": 18, + "symbol": "TBT" + }, + "isSC": {} + }, + "0x7f59b64c6ee521c0d7e590cf8e4b843caa236f96": { + "name": "CELL token contract", + "address": "0x7f59b64c6ee521c0d7e590cf8e4b843caa236f96", + "token": { + "decimals": 0, + "symbol": "CELL" + }, + "isSC": {} + }, + "0xc3f8143212871014b472ea83285af7f25928dee4": { + "name": "SOHOT token contract", + "address": "0xc3f8143212871014b472ea83285af7f25928dee4", + "token": { + "decimals": 9, + "symbol": "SOHOT" + }, + "isSC": {} + }, + "0xff00644ca76def7a3f7501a281ffe45934aefbfe": { + "name": "GANG token contract", + "address": "0xff00644ca76def7a3f7501a281ffe45934aefbfe", + "token": { + "decimals": 9, + "symbol": "GANG" + }, + "isSC": {} + }, + "0x7d4b8cce0591c9044a22ee543533b72e976e36c3": { + "name": "Change", + "address": "0x7d4b8cce0591c9044a22ee543533b72e976e36c3", + "token": { + "decimals": 18, + "symbol": "CAG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/change.svg" + }, + "0xb23d80f5fefcddaa212212f028021b41ded428cf": { + "name": "PRIME token contract", + "address": "0xb23d80f5fefcddaa212212f028021b41ded428cf", + "token": { + "decimals": 18, + "symbol": "PRIME" + }, + "isSC": {} + }, + "0xa72332af4a7efbce221903e7a09175be64f0400d": { + "name": "GUM token contract", + "address": "0xa72332af4a7efbce221903e7a09175be64f0400d", + "token": { + "decimals": 18, + "symbol": "GUM" + }, + "isSC": {} + }, + "0x37cfc2e83665d49364670dfea6d2dd4cb1215f22": { + "name": "RRETH token contract", + "address": "0x37cfc2e83665d49364670dfea6d2dd4cb1215f22", + "token": { + "decimals": 18, + "symbol": "RRETH" + }, + "isSC": {} + }, + "0x377de38159bf87111c1523055b4a8c3a1a971722": { + "name": "GROKGROW token contract", + "address": "0x377de38159bf87111c1523055b4a8c3a1a971722", + "token": { + "decimals": 18, + "symbol": "GROKGROW" + }, + "isSC": {} + }, + "0x8a7adc1b690e81c758f1bd0f72dfe27ae6ec56a5": { + "name": "BLID token contract", + "address": "0x8a7adc1b690e81c758f1bd0f72dfe27ae6ec56a5", + "token": { + "decimals": 18, + "symbol": "BLID" + }, + "isSC": {} + }, + "0x34ba042827996821cffeb06477d48a2ff9474483": { + "name": "SHIB20 token contract", + "address": "0x34ba042827996821cffeb06477d48a2ff9474483", + "token": { + "decimals": 8, + "symbol": "SHIB20" + }, + "isSC": {} + }, + "0xe0c28a5a2da3920946e8bf821f61f7bea311048b": { + "name": "KETH token contract", + "address": "0xe0c28a5a2da3920946e8bf821f61f7bea311048b", + "token": { + "decimals": 18, + "symbol": "KETH" + }, + "isSC": {} + }, + "0xabc93b1c8ffa3a69f478068676360021bbaab4bf": { + "name": "DFUND token contract", + "address": "0xabc93b1c8ffa3a69f478068676360021bbaab4bf", + "token": { + "decimals": 18, + "symbol": "DFUND" + }, + "isSC": {} + }, + "0xc1ecfaf43c53bec9b9143ab274f35603fd10b886": { + "name": "SSHIP token contract", + "address": "0xc1ecfaf43c53bec9b9143ab274f35603fd10b886", + "token": { + "decimals": 18, + "symbol": "SSHIP" + }, + "isSC": {} + }, + "0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac": { + "name": "Storj", + "address": "0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac", + "token": { + "decimals": 8, + "symbol": "STORJ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/storj.svg" + }, + "0x37f74e99794853777a10ea1dc08a64c86958f06a": { + "name": "DILI token contract", + "address": "0x37f74e99794853777a10ea1dc08a64c86958f06a", + "token": { + "decimals": 18, + "symbol": "DILI" + }, + "isSC": {} + }, + "0x57a5a0567187ff4a8dcc1a9bba86155e355878f2": { + "name": "INETHX token contract", + "address": "0x57a5a0567187ff4a8dcc1a9bba86155e355878f2", + "token": { + "decimals": 18, + "symbol": "INETHX" + }, + "isSC": {} + }, + "0xaaaaaa20d9e0e2461697782ef11675f668207961": { + "name": "AURORA token contract", + "address": "0xaaaaaa20d9e0e2461697782ef11675f668207961", + "token": { + "decimals": 18, + "symbol": "AURORA" + }, + "isSC": {} + }, + "0x6f259637dcd74c767781e37bc6133cd6a68aa161": { + "name": "HT token contract", + "address": "0x6f259637dcd74c767781e37bc6133cd6a68aa161", + "token": { + "decimals": 18, + "symbol": "HT" + }, + "isSC": {} + }, + "0xe9572938bcbf08adcee86fd12a7c0d08dc4ab841": { + "name": "INS token contract", + "address": "0xe9572938bcbf08adcee86fd12a7c0d08dc4ab841", + "token": { + "decimals": 18, + "symbol": "INS" + }, + "isSC": {} + }, + "0x8cb73eb53fa81f808f704bea15a677b6464a1f90": { + "name": "GAURO token contract", + "address": "0x8cb73eb53fa81f808f704bea15a677b6464a1f90", + "token": { + "decimals": 9, + "symbol": "GAURO" + }, + "isSC": {} + }, + "0x562e362876c8aee4744fc2c6aac8394c312d215d": { + "name": "OPTI token contract", + "address": "0x562e362876c8aee4744fc2c6aac8394c312d215d", + "token": { + "decimals": 9, + "symbol": "OPTI" + }, + "isSC": {} + }, + "0x2fc246aa66f0da5bb1368f688548ecbbe9bdee5d": { + "name": "TEMCO token contract", + "address": "0x2fc246aa66f0da5bb1368f688548ecbbe9bdee5d", + "token": { + "decimals": 18, + "symbol": "TEMCO" + }, + "isSC": {} + }, + "0x20a62aca58526836165ca53fe67dd884288c8abf": { + "name": "RNB token contract", + "address": "0x20a62aca58526836165ca53fe67dd884288c8abf", + "token": { + "decimals": 18, + "symbol": "RNB" + }, + "isSC": {} + }, + "0xc03fbf20a586fa89c2a5f6f941458e1fbc40c661": { + "name": "COMBO token contract", + "address": "0xc03fbf20a586fa89c2a5f6f941458e1fbc40c661", + "token": { + "decimals": 18, + "symbol": "COMBO" + }, + "isSC": {} + }, + "0x7237c0b30b1355f1b76355582f182f6f04b08740": { + "name": "MGG token contract", + "address": "0x7237c0b30b1355f1b76355582f182f6f04b08740", + "token": { + "decimals": 18, + "symbol": "MGG" + }, + "isSC": {} + }, + "0x45b3cf56896c4547426a4145ad1d0ae971120214": { + "name": "404BLOCKS token contract", + "address": "0x45b3cf56896c4547426a4145ad1d0ae971120214", + "token": { + "decimals": 18, + "symbol": "404BLOCKS" + }, + "isSC": {} + }, + "0x8290333cef9e6d528dd5618fb97a76f268f3edd4": { + "name": "ANKR token contract", + "address": "0x8290333cef9e6d528dd5618fb97a76f268f3edd4", + "token": { + "decimals": 18, + "symbol": "ANKR" + }, + "isSC": {} + }, + "0x9baa12a9e3b9dc355f162082762f95626367d087": { + "name": "HANDZ token contract", + "address": "0x9baa12a9e3b9dc355f162082762f95626367d087", + "token": { + "decimals": 18, + "symbol": "HANDZ" + }, + "isSC": {} + }, + "0x549020a9cb845220d66d3e9c6d9f9ef61c981102": { + "name": "SIDUS token contract", + "address": "0x549020a9cb845220d66d3e9c6d9f9ef61c981102", + "token": { + "decimals": 18, + "symbol": "SIDUS" + }, + "isSC": {} + }, + "0xd101dcc414f310268c37eeb4cd376ccfa507f571": { + "name": "RSC token contract", + "address": "0xd101dcc414f310268c37eeb4cd376ccfa507f571", + "token": { + "decimals": 18, + "symbol": "RSC" + }, + "isSC": {} + }, + "0xa80f2c8f61c56546001f5fc2eb8d6e4e72c45d4c": { + "name": "UNQT token contract", + "address": "0xa80f2c8f61c56546001f5fc2eb8d6e4e72c45d4c", + "token": { + "decimals": 18, + "symbol": "UNQT" + }, + "isSC": {} + }, + "0xc7bba5b765581efb2cdd2679db5bea9ee79b201f": { + "name": "GEM token contract", + "address": "0xc7bba5b765581efb2cdd2679db5bea9ee79b201f", + "token": { + "decimals": 18, + "symbol": "GEM" + }, + "isSC": {} + }, + "0xb87b96868644d99cc70a8565ba7311482edebf6e": { + "name": "OCP404 token contract", + "address": "0xb87b96868644d99cc70a8565ba7311482edebf6e", + "token": { + "decimals": 18, + "symbol": "OCP404" + }, + "isSC": {} + }, + "0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d": { + "name": "Fuse Token", + "address": "0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d", + "token": { + "decimals": 18, + "symbol": "FUSE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fuse.svg" + }, + "0x33bd66c334274989b673a8e8c8d1a3f1b8de5889": { + "name": "HIODBS token contract", + "address": "0x33bd66c334274989b673a8e8c8d1a3f1b8de5889", + "token": { + "decimals": 18, + "symbol": "HIODBS" + }, + "isSC": {} + }, + "0xe7eaec9bca79d537539c00c58ae93117fb7280b9": { + "name": "DOGEP token contract", + "address": "0xe7eaec9bca79d537539c00c58ae93117fb7280b9", + "token": { + "decimals": 18, + "symbol": "DOGEP" + }, + "isSC": {} + }, + "0x3aeff9536ced04e4443908cb0cebac952a5550c3": { + "name": "PENGYX token contract", + "address": "0x3aeff9536ced04e4443908cb0cebac952a5550c3", + "token": { + "decimals": 18, + "symbol": "PENGYX" + }, + "isSC": {} + }, + "0x07f9702ce093db82dfdc92c2c6e578d6ea8d5e22": { + "name": "OBT token contract", + "address": "0x07f9702ce093db82dfdc92c2c6e578d6ea8d5e22", + "token": { + "decimals": 18, + "symbol": "OBT" + }, + "isSC": {} + }, + "0xa0ef786bf476fe0810408caba05e536ac800ff86": { + "name": "MYRIA token contract", + "address": "0xa0ef786bf476fe0810408caba05e536ac800ff86", + "token": { + "decimals": 18, + "symbol": "MYRIA" + }, + "isSC": {} + }, + "0xf17e65822b568b3903685a7c9f496cf7656cc6c2": { + "name": "BICO token contract", + "address": "0xf17e65822b568b3903685a7c9f496cf7656cc6c2", + "token": { + "decimals": 18, + "symbol": "BICO" + }, + "isSC": {} + }, + "0x72bab498fa50a33a03362d0024bb27efbc50a7b7": { + "name": "BET token contract", + "address": "0x72bab498fa50a33a03362d0024bb27efbc50a7b7", + "token": { + "decimals": 18, + "symbol": "BET" + }, + "isSC": {} + }, + "0x3c3a81e81dc49a522a592e7622a7e711c06bf354": { + "name": "MNT token contract", + "address": "0x3c3a81e81dc49a522a592e7622a7e711c06bf354", + "token": { + "decimals": 18, + "symbol": "MNT" + }, + "isSC": {} + }, + "0xf31826269ac7f452b1274cc884812f426c18ddca": { + "name": "MILK token contract", + "address": "0xf31826269ac7f452b1274cc884812f426c18ddca", + "token": { + "decimals": 18, + "symbol": "MILK" + }, + "isSC": {} + }, + "0x5b649c07e7ba0a1c529deaabed0b47699919b4a2": { + "name": "SGT token contract", + "address": "0x5b649c07e7ba0a1c529deaabed0b47699919b4a2", + "token": { + "decimals": 8, + "symbol": "SGT" + }, + "isSC": {} + }, + "0x1b5036bec1b82d44d52fa953a370b3c6cd9328b5": { + "name": "ELAN token contract", + "address": "0x1b5036bec1b82d44d52fa953a370b3c6cd9328b5", + "token": { + "decimals": 18, + "symbol": "ELAN" + }, + "isSC": {} + }, + "0x8ab2ff0116a279a99950c66a12298962d152b83c": { + "name": "ORDS token contract", + "address": "0x8ab2ff0116a279a99950c66a12298962d152b83c", + "token": { + "decimals": 18, + "symbol": "ORDS" + }, + "isSC": {} + }, + "0xc6dddb5bc6e61e0841c54f3e723ae1f3a807260b": { + "name": "URUS token contract", + "address": "0xc6dddb5bc6e61e0841c54f3e723ae1f3a807260b", + "token": { + "decimals": 18, + "symbol": "URUS" + }, + "isSC": {} + }, + "0xa1faa113cbe53436df28ff0aee54275c13b40975": { + "name": "ALPHA token contract", + "address": "0xa1faa113cbe53436df28ff0aee54275c13b40975", + "token": { + "decimals": 18, + "symbol": "ALPHA" + }, + "isSC": {} + }, + "0xcd152e2a8c19bbfc2c89c5d9b19e53ab17a29b2a": { + "name": "CDY token contract", + "address": "0xcd152e2a8c19bbfc2c89c5d9b19e53ab17a29b2a", + "token": { + "decimals": 18, + "symbol": "CDY" + }, + "isSC": {} + }, + "0x6a26edf3bbc9f154ca9175216ceb9812f5305e6e": { + "name": "PIXE token contract", + "address": "0x6a26edf3bbc9f154ca9175216ceb9812f5305e6e", + "token": { + "decimals": 18, + "symbol": "PIXE" + }, + "isSC": {} + }, + "0xbe393aa534f82c0ffac31bf06a23e283acb3352b": { + "name": "NTB token contract", + "address": "0xbe393aa534f82c0ffac31bf06a23e283acb3352b", + "token": { + "decimals": 18, + "symbol": "NTB" + }, + "isSC": {} + }, + "0x38e68a37e401f7271568cecaac63c6b1e19130b4": { + "name": "BANANA token contract", + "address": "0x38e68a37e401f7271568cecaac63c6b1e19130b4", + "token": { + "decimals": 18, + "symbol": "BANANA" + }, + "isSC": {} + }, + "0x12ed0641242e4c6c220e3ca8f616e9d5470ac99a": { + "name": "EARN token contract", + "address": "0x12ed0641242e4c6c220e3ca8f616e9d5470ac99a", + "token": { + "decimals": 18, + "symbol": "EARN" + }, + "isSC": {} + }, + "0x2c5bc2ba3614fd27fcc7022ea71d9172e2632c16": { + "name": "SOV token contract", + "address": "0x2c5bc2ba3614fd27fcc7022ea71d9172e2632c16", + "token": { + "decimals": 18, + "symbol": "SOV" + }, + "isSC": {} + }, + "0x163f8c2467924be0ae7b5347228cabf260318753": { + "name": "WLD token contract", + "address": "0x163f8c2467924be0ae7b5347228cabf260318753", + "token": { + "decimals": 18, + "symbol": "WLD" + }, + "isSC": {} + }, + "0x1e0b2992079b620aa13a7c2e7c88d2e1e18e46e9": { + "name": "KOMPETE token contract", + "address": "0x1e0b2992079b620aa13a7c2e7c88d2e1e18e46e9", + "token": { + "decimals": 10, + "symbol": "KOMPETE" + }, + "isSC": {} + }, + "0x51015f4fefe3366c6f62539140149f8088888888": { + "name": "NUKEM token contract", + "address": "0x51015f4fefe3366c6f62539140149f8088888888", + "token": { + "decimals": 9, + "symbol": "NUKEM" + }, + "isSC": {} + }, + "0xd714d91a169127e11d8fab3665d72e8b7ef9dbe2": { + "name": "BLACK token contract", + "address": "0xd714d91a169127e11d8fab3665d72e8b7ef9dbe2", + "token": { + "decimals": 18, + "symbol": "BLACK" + }, + "isSC": {} + }, + "0x6a6c2ada3ce053561c2fbc3ee211f23d9b8c520a": { + "name": "TON token contract", + "address": "0x6a6c2ada3ce053561c2fbc3ee211f23d9b8c520a", + "token": { + "decimals": 18, + "symbol": "TON" + }, + "isSC": {} + }, + "0x6bd361e10c1afed0d95259e7c0115f3a60e4ea99": { + "name": "BOLLY token contract", + "address": "0x6bd361e10c1afed0d95259e7c0115f3a60e4ea99", + "token": { + "decimals": 18, + "symbol": "BOLLY" + }, + "isSC": {} + }, + "0x5b02ac27767b9bc8f5379ba7a835094aa81bf26f": { + "name": "UNIWAR token contract", + "address": "0x5b02ac27767b9bc8f5379ba7a835094aa81bf26f", + "token": { + "decimals": 18, + "symbol": "UNIWAR" + }, + "isSC": {} + }, + "0x6876eba317272fe221c67405c5e8eb3b24535547": { + "name": "MCT token contract", + "address": "0x6876eba317272fe221c67405c5e8eb3b24535547", + "token": { + "decimals": 18, + "symbol": "MCT" + }, + "isSC": {} + }, + "0x90b831fa3bebf58e9744a14d638e25b4ee06f9bc": { + "name": "MIMO token contract", + "address": "0x90b831fa3bebf58e9744a14d638e25b4ee06f9bc", + "token": { + "decimals": 18, + "symbol": "MIMO" + }, + "isSC": {} + }, + "0x949d48eca67b17269629c7194f4b727d4ef9e5d6": { + "name": "MC token contract", + "address": "0x949d48eca67b17269629c7194f4b727d4ef9e5d6", + "token": { + "decimals": 18, + "symbol": "MC" + }, + "isSC": {} + }, + "0x1e4746dc744503b53b4a082cb3607b169a289090": { + "name": "IPOR token contract", + "address": "0x1e4746dc744503b53b4a082cb3607b169a289090", + "token": { + "decimals": 18, + "symbol": "IPOR" + }, + "isSC": {} + }, + "0xbb6881874825e60e1160416d6c426eae65f2459e": { + "name": "BB-A-WETH token contract", + "address": "0xbb6881874825e60e1160416d6c426eae65f2459e", + "token": { + "decimals": 18, + "symbol": "BB-A-WETH" + }, + "isSC": {} + }, + "0x5de597849cf72c72f073e9085bdd0dadd8e6c199": { + "name": "FBX token contract", + "address": "0x5de597849cf72c72f073e9085bdd0dadd8e6c199", + "token": { + "decimals": 18, + "symbol": "FBX" + }, + "isSC": {} + }, + "0xa2e3356610840701bdf5611a53974510ae27e2e1": { + "name": "WBETH token contract", + "address": "0xa2e3356610840701bdf5611a53974510ae27e2e1", + "token": { + "decimals": 18, + "symbol": "WBETH" + }, + "isSC": {} + }, + "0x04506dddbf689714487f91ae1397047169afcf34": { + "name": "UNKMAV token contract", + "address": "0x04506dddbf689714487f91ae1397047169afcf34", + "token": { + "decimals": 18, + "symbol": "UNKMAV" + }, + "isSC": {} + }, + "0xfa14fa6958401314851a17d6c5360ca29f74b57b": { + "name": "SAITO token contract", + "address": "0xfa14fa6958401314851a17d6c5360ca29f74b57b", + "token": { + "decimals": 18, + "symbol": "SAITO" + }, + "isSC": {} + }, + "0x808507121b80c02388fad14726482e061b8da827": { + "name": "PENDLE token contract", + "address": "0x808507121b80c02388fad14726482e061b8da827", + "token": { + "decimals": 18, + "symbol": "PENDLE" + }, + "isSC": {} + }, + "0x97de57ec338ab5d51557da3434828c5dbfada371": { + "name": "EUSD token contract", + "address": "0x97de57ec338ab5d51557da3434828c5dbfada371", + "token": { + "decimals": 18, + "symbol": "EUSD" + }, + "isSC": {} + }, + "0xfa2629b9cf3998d52726994e0fcdb750224d8b9d": { + "name": "INANKRETH token contract", + "address": "0xfa2629b9cf3998d52726994e0fcdb750224d8b9d", + "token": { + "decimals": 18, + "symbol": "INANKRETH" + }, + "isSC": {} + }, + "0x2a8e1e676ec238d8a992307b495b45b3feaa5e86": { + "name": "Origin Dollar", + "address": "0x2a8e1e676ec238d8a992307b495b45b3feaa5e86", + "token": { + "decimals": 18, + "symbol": "OUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ousd.svg" + }, + "0xbd15ad921e1b480209af549874a2fcb80dc312bf": { + "name": "HRP token contract", + "address": "0xbd15ad921e1b480209af549874a2fcb80dc312bf", + "token": { + "decimals": 18, + "symbol": "HRP" + }, + "isSC": {} + }, + "0x4b7265d153886a7dc717e815862acde6ff7b5bc8": { + "name": "DENCH token contract", + "address": "0x4b7265d153886a7dc717e815862acde6ff7b5bc8", + "token": { + "decimals": 18, + "symbol": "DENCH" + }, + "isSC": {} + }, + "0xaea46a60368a7bd060eec7df8cba43b7ef41ad85": { + "name": "Fetch", + "address": "0xaea46a60368a7bd060eec7df8cba43b7ef41ad85", + "token": { + "decimals": 18, + "symbol": "FET" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fetch.svg" + }, + "0xec6d73557937974077911a0b6fdc436b0ff70296": { + "name": "SKRIMP token contract", + "address": "0xec6d73557937974077911a0b6fdc436b0ff70296", + "token": { + "decimals": 18, + "symbol": "SKRIMP" + }, + "isSC": {} + }, + "0x8dcaec45365e5ada5676073a07b418c2f538145a": { + "name": "SHELL token contract", + "address": "0x8dcaec45365e5ada5676073a07b418c2f538145a", + "token": { + "decimals": 18, + "symbol": "SHELL" + }, + "isSC": {} + }, + "0x1da87b114f35e1dc91f72bf57fc07a768ad40bb0": { + "name": "Equalizer", + "address": "0x1da87b114f35e1dc91f72bf57fc07a768ad40bb0", + "token": { + "decimals": 18, + "symbol": "EQZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/EQZ.svg" + }, + "0x635f15eb7aa2e62d122f6b1f9f519fdccf4abdda": { + "name": "HIMAYC token contract", + "address": "0x635f15eb7aa2e62d122f6b1f9f519fdccf4abdda", + "token": { + "decimals": 18, + "symbol": "HIMAYC" + }, + "isSC": {} + }, + "0x53263d9ef74db583b15fbc6d5d4e8b83833fa134": { + "name": "LEAP token contract", + "address": "0x53263d9ef74db583b15fbc6d5d4e8b83833fa134", + "token": { + "decimals": 18, + "symbol": "LEAP" + }, + "isSC": {} + }, + "0x9c2dc0c3cc2badde84b0025cf4df1c5af288d835": { + "name": "Coreto", + "address": "0x9c2dc0c3cc2badde84b0025cf4df1c5af288d835", + "token": { + "decimals": 18, + "symbol": "COR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/coreto.svg" + }, + "0x6e2a43be0b1d33b726f0ca3b8de60b3482b8b050": { + "name": "ARKM token contract", + "address": "0x6e2a43be0b1d33b726f0ca3b8de60b3482b8b050", + "token": { + "decimals": 18, + "symbol": "ARKM" + }, + "isSC": {} + }, + "0xf1df7305e4bab3885cab5b1e4dfc338452a67891": { + "name": "PALM token contract", + "address": "0xf1df7305e4bab3885cab5b1e4dfc338452a67891", + "token": { + "decimals": 9, + "symbol": "PALM" + }, + "isSC": {} + }, + "0x2ba8349123de45e931a8c8264c332e6e9cf593f9": { + "name": "BCMC token contract", + "address": "0x2ba8349123de45e931a8c8264c332e6e9cf593f9", + "token": { + "decimals": 18, + "symbol": "BCMC" + }, + "isSC": {} + }, + "0xb7037457de15fed6cbecc0c62d5d610834b958ec": { + "name": "WHIRL token contract", + "address": "0xb7037457de15fed6cbecc0c62d5d610834b958ec", + "token": { + "decimals": 18, + "symbol": "WHIRL" + }, + "isSC": {} + }, + "0x5cb3ce6d081fb00d5f6677d196f2d70010ea3f4a": { + "name": "BUSY token contract", + "address": "0x5cb3ce6d081fb00d5f6677d196f2d70010ea3f4a", + "token": { + "decimals": 18, + "symbol": "BUSY" + }, + "isSC": {} + }, + "0x08389495d7456e1951ddf7c3a1314a4bfb646d8b": { + "name": "CRPT token contract", + "address": "0x08389495d7456e1951ddf7c3a1314a4bfb646d8b", + "token": { + "decimals": 18, + "symbol": "CRPT" + }, + "isSC": {} + }, + "0xde171d5151668a330ecf5f6e882b98aff5f3d24e": { + "name": "FURIE token contract", + "address": "0xde171d5151668a330ecf5f6e882b98aff5f3d24e", + "token": { + "decimals": 9, + "symbol": "FURIE" + }, + "isSC": {} + }, + "0xc5fb36dd2fb59d3b98deff88425a3f425ee469ed": { + "name": "TSUKA token contract", + "address": "0xc5fb36dd2fb59d3b98deff88425a3f425ee469ed", + "token": { + "decimals": 9, + "symbol": "TSUKA" + }, + "isSC": {} + }, + "0x9dc7094530cb1bcf5442c3b9389ee386738a190c": { + "name": "MACRV token contract", + "address": "0x9dc7094530cb1bcf5442c3b9389ee386738a190c", + "token": { + "decimals": 18, + "symbol": "MACRV" + }, + "isSC": {} + }, + "0x1900e8b5619a3596745f715d0427fe617c729ba9": { + "name": "CBG token contract", + "address": "0x1900e8b5619a3596745f715d0427fe617c729ba9", + "token": { + "decimals": 18, + "symbol": "CBG" + }, + "isSC": {} + }, + "0x849c479d7a90eb378dbd00e8f166371176244eb1": { + "name": "MUU token contract", + "address": "0x849c479d7a90eb378dbd00e8f166371176244eb1", + "token": { + "decimals": 9, + "symbol": "MUU" + }, + "isSC": {} + }, + "0x46305b2ebcd92809d5fcef577c20c28a185af03c": { + "name": "SHADOW token contract", + "address": "0x46305b2ebcd92809d5fcef577c20c28a185af03c", + "token": { + "decimals": 18, + "symbol": "SHADOW" + }, + "isSC": {} + }, + "0xe15a66b7b8e385caa6f69fd0d55984b96d7263cf": { + "name": "ADDY token contract", + "address": "0xe15a66b7b8e385caa6f69fd0d55984b96d7263cf", + "token": { + "decimals": 18, + "symbol": "ADDY" + }, + "isSC": {} + }, + "0x943af2ece93118b973c95c2f698ee9d15002e604": { + "name": "DUEL token contract", + "address": "0x943af2ece93118b973c95c2f698ee9d15002e604", + "token": { + "decimals": 18, + "symbol": "DUEL" + }, + "isSC": {} + }, + "0x05030203674173fa6df6f9f7e34d6e70e9a761d7": { + "name": "MU token contract", + "address": "0x05030203674173fa6df6f9f7e34d6e70e9a761d7", + "token": { + "decimals": 18, + "symbol": "MU" + }, + "isSC": {} + }, + "0x38d64ce1bdf1a9f24e0ec469c9cade61236fb4a0": { + "name": "VETH token contract", + "address": "0x38d64ce1bdf1a9f24e0ec469c9cade61236fb4a0", + "token": { + "decimals": 18, + "symbol": "VETH" + }, + "isSC": {} + }, + "0x4667765333494049921709a1cec32dedc529d59e": { + "name": "AION token contract", + "address": "0x4667765333494049921709a1cec32dedc529d59e", + "token": { + "decimals": 18, + "symbol": "AION" + }, + "isSC": {} + }, + "0x0f2d719407fdbeff09d87557abb7232601fd9f29": { + "name": "SYN token contract", + "address": "0x0f2d719407fdbeff09d87557abb7232601fd9f29", + "token": { + "decimals": 18, + "symbol": "SYN" + }, + "isSC": {} + }, + "0x5a9261b023692405f2f680240c6b010638e416dd": { + "name": "JAN token contract", + "address": "0x5a9261b023692405f2f680240c6b010638e416dd", + "token": { + "decimals": 18, + "symbol": "JAN" + }, + "isSC": {} + }, + "0x8e01397163b21f64cec1f06ca6cc7d9aa8f718e9": { + "name": "LSHARE token contract", + "address": "0x8e01397163b21f64cec1f06ca6cc7d9aa8f718e9", + "token": { + "decimals": 18, + "symbol": "LSHARE" + }, + "isSC": {} + }, + "0x218de5e6324c5351c3a2bf0c40d76f585b8de04d": { + "name": "STPETH token contract", + "address": "0x218de5e6324c5351c3a2bf0c40d76f585b8de04d", + "token": { + "decimals": 18, + "symbol": "STPETH" + }, + "isSC": {} + }, + "0xb533687ef77459093368c43e95f8df1c2b5a1f7a": { + "name": "ASG token contract", + "address": "0xb533687ef77459093368c43e95f8df1c2b5a1f7a", + "token": { + "decimals": 18, + "symbol": "ASG" + }, + "isSC": {} + }, + "0x8b0fde007458ee153bd0f66cd448af5fb3d99b43": { + "name": "MASTERMIND token contract", + "address": "0x8b0fde007458ee153bd0f66cd448af5fb3d99b43", + "token": { + "decimals": 18, + "symbol": "MASTERMIND" + }, + "isSC": {} + }, + "0xb17548c7b510427baac4e267bea62e800b247173": { + "name": "SMT token contract", + "address": "0xb17548c7b510427baac4e267bea62e800b247173", + "token": { + "decimals": 18, + "symbol": "SMT" + }, + "isSC": {} + }, + "0xd33526068d116ce69f19a9ee46f0bd304f21a51f": { + "name": "Rocket Pool", + "address": "0xd33526068d116ce69f19a9ee46f0bd304f21a51f", + "token": { + "decimals": 18, + "symbol": "RPL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rpl.svg" + }, + "0xd2287a52287dd64ae2c690d74322e2e345dc8f69": { + "name": "BBW token contract", + "address": "0xd2287a52287dd64ae2c690d74322e2e345dc8f69", + "token": { + "decimals": 18, + "symbol": "BBW" + }, + "isSC": {} + }, + "0x2ea6cc1ac06fdc01b568fcad8d842dec3f2ce1ad": { + "name": "BLOB token contract", + "address": "0x2ea6cc1ac06fdc01b568fcad8d842dec3f2ce1ad", + "token": { + "decimals": 18, + "symbol": "BLOB" + }, + "isSC": {} + }, + "0x3486b751a36f731a1bebff779374bad635864919": { + "name": "INEDIBLE token contract", + "address": "0x3486b751a36f731a1bebff779374bad635864919", + "token": { + "decimals": 18, + "symbol": "INEDIBLE" + }, + "isSC": {} + }, + "0xb3e2cb7cccfe139f8ff84013823bf22da6b6390a": { + "name": "ICNQ token contract", + "address": "0xb3e2cb7cccfe139f8ff84013823bf22da6b6390a", + "token": { + "decimals": 18, + "symbol": "ICNQ" + }, + "isSC": {} + }, + "0x96f6ef951840721adbf46ac996b59e0235cb985c": { + "name": "USDY token contract", + "address": "0x96f6ef951840721adbf46ac996b59e0235cb985c", + "token": { + "decimals": 18, + "symbol": "USDY" + }, + "isSC": {} + }, + "0x14da230d6726c50f759bc1838717f8ce6373509c": { + "name": "KAT token contract", + "address": "0x14da230d6726c50f759bc1838717f8ce6373509c", + "token": { + "decimals": 18, + "symbol": "KAT" + }, + "isSC": {} + }, + "0x0305f515fa978cf87226cf8a9776d25bcfb2cc0b": { + "name": "PEPE20 token contract", + "address": "0x0305f515fa978cf87226cf8a9776d25bcfb2cc0b", + "token": { + "decimals": 18, + "symbol": "PEPE20" + }, + "isSC": {} + }, + "0x6b0b3a982b4634ac68dd83a4dbf02311ce324181": { + "name": "ALI token contract", + "address": "0x6b0b3a982b4634ac68dd83a4dbf02311ce324181", + "token": { + "decimals": 18, + "symbol": "ALI" + }, + "isSC": {} + }, + "0x378cb52b00f9d0921cb46dfc099cff73b42419dc": { + "name": "YVLUSD token contract", + "address": "0x378cb52b00f9d0921cb46dfc099cff73b42419dc", + "token": { + "decimals": 18, + "symbol": "YVLUSD" + }, + "isSC": {} + }, + "0x52f4d5ee6c91e01be67ca1f64b11ed0ee370817d": { + "name": "CIA token contract", + "address": "0x52f4d5ee6c91e01be67ca1f64b11ed0ee370817d", + "token": { + "decimals": 9, + "symbol": "CIA" + }, + "isSC": {} + }, + "0xcba78d126f0b1feda0c538bcaf4c852a7a171099": { + "name": "MOE token contract", + "address": "0xcba78d126f0b1feda0c538bcaf4c852a7a171099", + "token": { + "decimals": 18, + "symbol": "MOE" + }, + "isSC": {} + }, + "0x96eafff5bedf18566b18fce71c2323b69c795623": { + "name": "ASPC token contract", + "address": "0x96eafff5bedf18566b18fce71c2323b69c795623", + "token": { + "decimals": 18, + "symbol": "ASPC" + }, + "isSC": {} + }, + "0x6123b0049f904d730db3c36a31167d9d4121fa6b": { + "name": "RBN token contract", + "address": "0x6123b0049f904d730db3c36a31167d9d4121fa6b", + "token": { + "decimals": 18, + "symbol": "RBN" + }, + "isSC": {} + }, + "0xd12b2859227b88c8065b6216e6e1b980d8dfe152": { + "name": "SND token contract", + "address": "0xd12b2859227b88c8065b6216e6e1b980d8dfe152", + "token": { + "decimals": 18, + "symbol": "SND" + }, + "isSC": {} + }, + "0x148255a3b10666d9788ec48bc61ea3e48974bf2c": { + "name": "DMCCOIN", + "address": "0x148255a3b10666d9788ec48bc61ea3e48974bf2c", + "token": { + "decimals": 18, + "symbol": "DMCC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DMCC.svg" + }, + "0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17": { + "name": "DUBBZ token contract", + "address": "0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17", + "token": { + "decimals": 18, + "symbol": "DUBBZ" + }, + "isSC": {} + }, + "0x1cfa5641c01406ab8ac350ded7d735ec41298372": { + "name": "CJPY token contract", + "address": "0x1cfa5641c01406ab8ac350ded7d735ec41298372", + "token": { + "decimals": 18, + "symbol": "CJPY" + }, + "isSC": {} + }, + "0x8aec4bbdcfb451aa289bfbd3c2f4e34a44ada1be": { + "name": "DOGWIFHAT token contract", + "address": "0x8aec4bbdcfb451aa289bfbd3c2f4e34a44ada1be", + "token": { + "decimals": 9, + "symbol": "DOGWIFHAT" + }, + "isSC": {} + }, + "0x3d1e5cf16077f349e999d6b21a4f646e83cd90c5": { + "name": "DETH token contract", + "address": "0x3d1e5cf16077f349e999d6b21a4f646e83cd90c5", + "token": { + "decimals": 18, + "symbol": "DETH" + }, + "isSC": {} + }, + "0x53bd789f2cdb846b227d8ffc7b46ed4263231fdf": { + "name": "SMBSWAP token contract", + "address": "0x53bd789f2cdb846b227d8ffc7b46ed4263231fdf", + "token": { + "decimals": 18, + "symbol": "SMBSWAP" + }, + "isSC": {} + }, + "0x821a278dfff762c76410264303f25bf42e195c0c": { + "name": "PETH token contract", + "address": "0x821a278dfff762c76410264303f25bf42e195c0c", + "token": { + "decimals": 18, + "symbol": "PETH" + }, + "isSC": {} + }, + "0x465a5a630482f3abd6d3b84b39b29b07214d19e5": { + "name": "FUSDC token contract", + "address": "0x465a5a630482f3abd6d3b84b39b29b07214d19e5", + "token": { + "decimals": 8, + "symbol": "FUSDC" + }, + "isSC": {} + }, + "0x6fc73113fc1afab4c28d3dd4c537a1da6045d47d": { + "name": "TRENDAI token contract", + "address": "0x6fc73113fc1afab4c28d3dd4c537a1da6045d47d", + "token": { + "decimals": 18, + "symbol": "TRENDAI" + }, + "isSC": {} + }, + "0x476c5e26a75bd202a9683ffd34359c0cc15be0ff": { + "name": "SRM token contract", + "address": "0x476c5e26a75bd202a9683ffd34359c0cc15be0ff", + "token": { + "decimals": 6, + "symbol": "SRM" + }, + "isSC": {} + }, + "0x94b888e11a9e960a9c3b3528eb6ac807b27ca62e": { + "name": "INLSETH token contract", + "address": "0x94b888e11a9e960a9c3b3528eb6ac807b27ca62e", + "token": { + "decimals": 18, + "symbol": "INLSETH" + }, + "isSC": {} + }, + "0x72c60bfffef18dca51db32b52b819a951b6ddbed": { + "name": "SHIDO token contract", + "address": "0x72c60bfffef18dca51db32b52b819a951b6ddbed", + "token": { + "decimals": 18, + "symbol": "SHIDO" + }, + "isSC": {} + }, + "0xd90e69f67203ebe02c917b5128629e77b4cd92dc": { + "name": "ONC token contract", + "address": "0xd90e69f67203ebe02c917b5128629e77b4cd92dc", + "token": { + "decimals": 18, + "symbol": "ONC" + }, + "isSC": {} + }, + "0xc89d9aa9d9e54bb196319c6195aea1038d2bc936": { + "name": "TRENDX token contract", + "address": "0xc89d9aa9d9e54bb196319c6195aea1038d2bc936", + "token": { + "decimals": 18, + "symbol": "TRENDX" + }, + "isSC": {} + }, + "0x4385328cc4d643ca98dfea734360c0f596c83449": { + "name": "TOMI token contract", + "address": "0x4385328cc4d643ca98dfea734360c0f596c83449", + "token": { + "decimals": 18, + "symbol": "TOMI" + }, + "isSC": {} + }, + "0xedeec5691f23e4914cf0183a4196bbeb30d027a0": { + "name": "WSTA token contract", + "address": "0xedeec5691f23e4914cf0183a4196bbeb30d027a0", + "token": { + "decimals": 18, + "symbol": "WSTA" + }, + "isSC": {} + }, + "0x95e05e2abbd26943874ac000d87c3d9e115b543c": { + "name": "BIBLE token contract", + "address": "0x95e05e2abbd26943874ac000d87c3d9e115b543c", + "token": { + "decimals": 18, + "symbol": "BIBLE" + }, + "isSC": {} + }, + "0xffc97d72e13e01096502cb8eb52dee56f74dad7b": { + "name": "Aave AAVE", + "address": "0xffc97d72e13e01096502cb8eb52dee56f74dad7b", + "token": { + "decimals": 18, + "symbol": "aAAVE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aAAVE.svg" + }, + "0xf073bac22dab7faf4a3dd6c6189a70d54110525c": { + "name": "GENETH token contract", + "address": "0xf073bac22dab7faf4a3dd6c6189a70d54110525c", + "token": { + "decimals": 18, + "symbol": "GENETH" + }, + "isSC": {} + }, + "0x0abdace70d3790235af448c88547603b945604ea": { + "name": "district0x", + "address": "0x0abdace70d3790235af448c88547603b945604ea", + "token": { + "decimals": 18, + "symbol": "DNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/district0x.svg" + }, + "0xf941d3aabf2ee0f5589e68ba6047b8329592b366": { + "name": "HEEL token contract", + "address": "0xf941d3aabf2ee0f5589e68ba6047b8329592b366", + "token": { + "decimals": 9, + "symbol": "HEEL" + }, + "isSC": {} + }, + "0x52a8845df664d76c69d2eea607cd793565af42b8": { + "name": "APEX token contract", + "address": "0x52a8845df664d76c69d2eea607cd793565af42b8", + "token": { + "decimals": 18, + "symbol": "APEX" + }, + "isSC": {} + }, + "0x62939f78a9a1cc4f9f1ea41cff95cd4f6b912d1b": { + "name": "NUME2 token contract", + "address": "0x62939f78a9a1cc4f9f1ea41cff95cd4f6b912d1b", + "token": { + "decimals": 18, + "symbol": "NUME2" + }, + "isSC": {} + }, + "0xbe9ab37a414c517b2be2bfa5945665bb07379054": { + "name": "TOMS token contract", + "address": "0xbe9ab37a414c517b2be2bfa5945665bb07379054", + "token": { + "decimals": 18, + "symbol": "TOMS" + }, + "isSC": {} + }, + "0x382a1667c9062f0621362f49076ef6e4fe4c9ec7": { + "name": "RUSH token contract", + "address": "0x382a1667c9062f0621362f49076ef6e4fe4c9ec7", + "token": { + "decimals": 18, + "symbol": "RUSH" + }, + "isSC": {} + }, + "0xdefa4e8a7bcba345f687a2f1456f5edd9ce97202": { + "name": "KNC token contract", + "address": "0xdefa4e8a7bcba345f687a2f1456f5edd9ce97202", + "token": { + "decimals": 18, + "symbol": "KNC" + }, + "isSC": {} + }, + "0x70b790d0948a760e80bc3f892b142f7779b538b2": { + "name": "DORA token contract", + "address": "0x70b790d0948a760e80bc3f892b142f7779b538b2", + "token": { + "decimals": 18, + "symbol": "DORA" + }, + "isSC": {} + }, + "0xecf3672a6d2147e2a77f07069fb48d8cf6f6fbf9": { + "name": "INMETH token contract", + "address": "0xecf3672a6d2147e2a77f07069fb48d8cf6f6fbf9", + "token": { + "decimals": 18, + "symbol": "INMETH" + }, + "isSC": {} + }, + "0xfd07fd5ebea6f24888a397997e262179bf494336": { + "name": "INOSETH token contract", + "address": "0xfd07fd5ebea6f24888a397997e262179bf494336", + "token": { + "decimals": 18, + "symbol": "INOSETH" + }, + "isSC": {} + }, + "0x9181f633e9b9f15a32d5e37094f4c93b333e0e92": { + "name": "INOETH token contract", + "address": "0x9181f633e9b9f15a32d5e37094f4c93b333e0e92", + "token": { + "decimals": 18, + "symbol": "INOETH" + }, + "isSC": {} + }, + "0x80d69e79258fe9d056c822461c4eb0b4ca8802e2": { + "name": "INRETH token contract", + "address": "0x80d69e79258fe9d056c822461c4eb0b4ca8802e2", + "token": { + "decimals": 18, + "symbol": "INRETH" + }, + "isSC": {} + }, + "0x6930450a416252c7206fbce76c01ecc850a36cb9": { + "name": "SHEB token contract", + "address": "0x6930450a416252c7206fbce76c01ecc850a36cb9", + "token": { + "decimals": 9, + "symbol": "SHEB" + }, + "isSC": {} + }, + "0x80c62fe4487e1351b47ba49809ebd60ed085bf52": { + "name": "CLV token contract", + "address": "0x80c62fe4487e1351b47ba49809ebd60ed085bf52", + "token": { + "decimals": 18, + "symbol": "CLV" + }, + "isSC": {} + }, + "0x40e9187078032afe1a30cfcf76e4fe3d7ab5c6c5": { + "name": "AIX token contract", + "address": "0x40e9187078032afe1a30cfcf76e4fe3d7ab5c6c5", + "token": { + "decimals": 18, + "symbol": "AIX" + }, + "isSC": {} + }, + "0x3f0c858c26775df75e45934b189154c436bd7335": { + "name": "CHFP token contract", + "address": "0x3f0c858c26775df75e45934b189154c436bd7335", + "token": { + "decimals": 8, + "symbol": "CHFP" + }, + "isSC": {} + }, + "0xf6d2224916ddfbbab6e6bd0d1b7034f4ae0cab18": { + "name": "AUNI token contract", + "address": "0xf6d2224916ddfbbab6e6bd0d1b7034f4ae0cab18", + "token": { + "decimals": 18, + "symbol": "AUNI" + }, + "isSC": {} + }, + "0x3496b523e5c00a4b4150d6721320cddb234c3079": { + "name": "NUM token contract", + "address": "0x3496b523e5c00a4b4150d6721320cddb234c3079", + "token": { + "decimals": 18, + "symbol": "NUM" + }, + "isSC": {} + }, + "0x88df592f8eb5d7bd38bfef7deb0fbc02cf3778a0": { + "name": "Tellor Tributes", + "address": "0x88df592f8eb5d7bd38bfef7deb0fbc02cf3778a0", + "token": { + "decimals": 18, + "symbol": "TRB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TRB.svg" + }, + "0xd05e3cfe984a00f5d6a1e5b75dee43d7e9ab63c8": { + "name": "PVFYBO token contract", + "address": "0xd05e3cfe984a00f5d6a1e5b75dee43d7e9ab63c8", + "token": { + "decimals": 18, + "symbol": "PVFYBO" + }, + "isSC": {} + }, + "0x4da08a1bff50be96bded5c7019227164b49c2bfc": { + "name": "MONONOKE-INU token contract", + "address": "0x4da08a1bff50be96bded5c7019227164b49c2bfc", + "token": { + "decimals": 9, + "symbol": "MONONOKE-INU" + }, + "isSC": {} + }, + "0xa5f2211b9b8170f694421f2046281775e8468044": { + "name": "THOR token contract", + "address": "0xa5f2211b9b8170f694421f2046281775e8468044", + "token": { + "decimals": 18, + "symbol": "THOR" + }, + "isSC": {} + }, + "0x77be1ba1cd2d7a63bffc772d361168cc327dd8bc": { + "name": "Meow Meow Coin", + "address": "0x77be1ba1cd2d7a63bffc772d361168cc327dd8bc", + "token": { + "decimals": 9, + "symbol": "MEOW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/meow.svg" + }, + "0x576e2bed8f7b46d34016198911cdf9886f78bea7": { + "name": "TRUMP token contract", + "address": "0x576e2bed8f7b46d34016198911cdf9886f78bea7", + "token": { + "decimals": 9, + "symbol": "TRUMP" + }, + "isSC": {} + }, + "0x7fa768e035f956c41d6aeaa3bd857e7e5141cad5": { + "name": "INSTETH token contract", + "address": "0x7fa768e035f956c41d6aeaa3bd857e7e5141cad5", + "token": { + "decimals": 18, + "symbol": "INSTETH" + }, + "isSC": {} + }, + "0x378e1be15be6d6d1f23cfe7090b6a77660dbf14d": { + "name": "FOXE token contract", + "address": "0x378e1be15be6d6d1f23cfe7090b6a77660dbf14d", + "token": { + "decimals": 18, + "symbol": "FOXE" + }, + "isSC": {} + }, + "0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd": { + "name": "DODO bird", + "address": "0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd", + "token": { + "decimals": 18, + "symbol": "DODO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DODO.svg" + }, + "0x79c6ffe2ccbca761e9e289a69432bffb0b744876": { + "name": "PINEOWL token contract", + "address": "0x79c6ffe2ccbca761e9e289a69432bffb0b744876", + "token": { + "decimals": 9, + "symbol": "PINEOWL" + }, + "isSC": {} + }, + "0xd9016a907dc0ecfa3ca425ab20b6b785b42f2373": { + "name": "GMEE token contract", + "address": "0xd9016a907dc0ecfa3ca425ab20b6b785b42f2373", + "token": { + "decimals": 18, + "symbol": "GMEE" + }, + "isSC": {} + }, + "0xbb19da2482308ec02a242aced4fe0f09d06b12a7": { + "name": "FLASH token contract", + "address": "0xbb19da2482308ec02a242aced4fe0f09d06b12a7", + "token": { + "decimals": 18, + "symbol": "FLASH" + }, + "isSC": {} + }, + "0x1d00e86748573c322f4cc41518aa0e77bd912eb4": { + "name": "USDE token contract", + "address": "0x1d00e86748573c322f4cc41518aa0e77bd912eb4", + "token": { + "decimals": 18, + "symbol": "USDE" + }, + "isSC": {} + }, + "0x61db59daf2af68310fffa003d3b2f452260b673c": { + "name": "LAURION token contract", + "address": "0x61db59daf2af68310fffa003d3b2f452260b673c", + "token": { + "decimals": 18, + "symbol": "LAURION" + }, + "isSC": {} + }, + "0xbe1bc2e2338defcd88e7f9f5f745ddb222180ab9": { + "name": "TESO token contract", + "address": "0xbe1bc2e2338defcd88e7f9f5f745ddb222180ab9", + "token": { + "decimals": 9, + "symbol": "TESO" + }, + "isSC": {} + }, + "0xbf19eead55a6b100667f04f8fbc5371e03e8ab2e": { + "name": "INCBETH token contract", + "address": "0xbf19eead55a6b100667f04f8fbc5371e03e8ab2e", + "token": { + "decimals": 18, + "symbol": "INCBETH" + }, + "isSC": {} + }, + "0x296233e84c1d7bff11121bf6d60f0ffa39c3f0cf": { + "name": "NOONE token contract", + "address": "0x296233e84c1d7bff11121bf6d60f0ffa39c3f0cf", + "token": { + "decimals": 9, + "symbol": "NOONE" + }, + "isSC": {} + }, + "0xc1534fe936be00369c7a827a6e731a233bd0ed34": { + "name": "CAVA token contract", + "address": "0xc1534fe936be00369c7a827a6e731a233bd0ed34", + "token": { + "decimals": 18, + "symbol": "CAVA" + }, + "isSC": {} + }, + "0x7b744eea1deca2f1b7b31f15ba036fa1759452d7": { + "name": "HIPP token contract", + "address": "0x7b744eea1deca2f1b7b31f15ba036fa1759452d7", + "token": { + "decimals": 18, + "symbol": "HIPP" + }, + "isSC": {} + }, + "0x7512200f2ae3e1625a060d589348716f65923d75": { + "name": "ARENA token contract", + "address": "0x7512200f2ae3e1625a060d589348716f65923d75", + "token": { + "decimals": 18, + "symbol": "ARENA" + }, + "isSC": {} + }, + "0x55b2cfcfe99110c773f00b023560dd9ef6c8a13b": { + "name": "CDETI token contract", + "address": "0x55b2cfcfe99110c773f00b023560dd9ef6c8a13b", + "token": { + "decimals": 18, + "symbol": "CDETI" + }, + "isSC": {} + }, + "0xe4dae00bc1c46ea2f44ae71b1beb8b171c15d812": { + "name": "PREMA", + "address": "0xe4dae00bc1c46ea2f44ae71b1beb8b171c15d812", + "token": { + "decimals": 18, + "symbol": "PRMX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PREMA.svg" + }, + "0x0d248ce39e26fb00f911fb1e7a45a00d8c94341c": { + "name": "BUTTER token contract", + "address": "0x0d248ce39e26fb00f911fb1e7a45a00d8c94341c", + "token": { + "decimals": 18, + "symbol": "BUTTER" + }, + "isSC": {} + }, + "0x76bc677d444f1e9d57daf5187ee2b7dc852745ae": { + "name": "XFT token contract", + "address": "0x76bc677d444f1e9d57daf5187ee2b7dc852745ae", + "token": { + "decimals": 18, + "symbol": "XFT" + }, + "isSC": {} + }, + "0x06677dc4fe12d3ba3c7ccfd0df8cd45e4d4095bf": { + "name": "WQT token contract", + "address": "0x06677dc4fe12d3ba3c7ccfd0df8cd45e4d4095bf", + "token": { + "decimals": 18, + "symbol": "WQT" + }, + "isSC": {} + }, + "0xc0a4df35568f116c370e6a6a6022ceb908eeddac": { + "name": "UX token contract", + "address": "0xc0a4df35568f116c370e6a6a6022ceb908eeddac", + "token": { + "decimals": 6, + "symbol": "UX" + }, + "isSC": {} + }, + "0x2e19067cbeb38d6554d31a1a83aefc4018a1688a": { + "name": "CBK token contract", + "address": "0x2e19067cbeb38d6554d31a1a83aefc4018a1688a", + "token": { + "decimals": 18, + "symbol": "CBK" + }, + "isSC": {} + }, + "0xbd6323a83b613f668687014e8a5852079494fb68": { + "name": "BTC token contract", + "address": "0xbd6323a83b613f668687014e8a5852079494fb68", + "token": { + "decimals": 18, + "symbol": "BTC" + }, + "isSC": {} + }, + "0x668308d77be3533c909a692302cb4d135bf8041c": { + "name": "INSFRXETH token contract", + "address": "0x668308d77be3533c909a692302cb4d135bf8041c", + "token": { + "decimals": 18, + "symbol": "INSFRXETH" + }, + "isSC": {} + }, + "0x5a98fcbea516cf06857215779fd812ca3bef1b32": { + "name": "Lido DAO Token", + "address": "0x5a98fcbea516cf06857215779fd812ca3bef1b32", + "token": { + "decimals": 18, + "symbol": "LDO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LDO.svg" + }, + "0xfe67a4450907459c3e1fff623aa927dd4e28c67a": { + "name": "NEXT token contract", + "address": "0xfe67a4450907459c3e1fff623aa927dd4e28c67a", + "token": { + "decimals": 18, + "symbol": "NEXT" + }, + "isSC": {} + }, + "0x045da4bfe02b320f4403674b3b7d121737727a36": { + "name": "DCHF token contract", + "address": "0x045da4bfe02b320f4403674b3b7d121737727a36", + "token": { + "decimals": 18, + "symbol": "DCHF" + }, + "isSC": {} + }, + "0x530824da86689c9c17cdc2871ff29b058345b44a": { + "name": "STBT token contract", + "address": "0x530824da86689c9c17cdc2871ff29b058345b44a", + "token": { + "decimals": 18, + "symbol": "STBT" + }, + "isSC": {} + }, + "0x824e35f7a75324f99300afac75ecf7354e17ea26": { + "name": "TIA token contract", + "address": "0x824e35f7a75324f99300afac75ecf7354e17ea26", + "token": { + "decimals": 9, + "symbol": "TIA" + }, + "isSC": {} + }, + "0x4d4d883f920f7c0c36a1be71a02aa0cde2aa22d1": { + "name": "OPCH token contract", + "address": "0x4d4d883f920f7c0c36a1be71a02aa0cde2aa22d1", + "token": { + "decimals": 18, + "symbol": "OPCH" + }, + "isSC": {} + }, + "0x508e00d5cef397b02d260d035e5ee80775e4c821": { + "name": "1CAT token contract", + "address": "0x508e00d5cef397b02d260d035e5ee80775e4c821", + "token": { + "decimals": 18, + "symbol": "1CAT" + }, + "isSC": {} + }, + "0x04e3a2932bfe7b669c9f18df44b2b0a0ee681c19": { + "name": "PASTA token contract", + "address": "0x04e3a2932bfe7b669c9f18df44b2b0a0ee681c19", + "token": { + "decimals": 18, + "symbol": "PASTA" + }, + "isSC": {} + }, + "0x668dbf100635f593a3847c0bdaf21f0a09380188": { + "name": "BNSD token contract", + "address": "0x668dbf100635f593a3847c0bdaf21f0a09380188", + "token": { + "decimals": 18, + "symbol": "BNSD" + }, + "isSC": {} + }, + "0xa92c49c403386111c1629aee00936eed2a9e74a6": { + "name": "KLTR token contract", + "address": "0xa92c49c403386111c1629aee00936eed2a9e74a6", + "token": { + "decimals": 18, + "symbol": "KLTR" + }, + "isSC": {} + }, + "0x746dda2ea243400d5a63e0700f190ab79f06489e": { + "name": "BOSAGORA", + "address": "0x746dda2ea243400d5a63e0700f190ab79f06489e", + "token": { + "decimals": 7, + "symbol": "BOA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BOA.svg" + }, + "0x856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc3": { + "name": "Origin Ether", + "address": "0x856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc3", + "token": { + "decimals": 18, + "symbol": "OETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/oeth.svg" + }, + "0x8e57c27761ebbd381b0f9d09bb92ceb51a358abb": { + "name": "XDNA token contract", + "address": "0x8e57c27761ebbd381b0f9d09bb92ceb51a358abb", + "token": { + "decimals": 18, + "symbol": "XDNA" + }, + "isSC": {} + }, + "0x0b38210ea11411557c13457d4da7dc6ea731b88a": { + "name": "API3 token contract", + "address": "0x0b38210ea11411557c13457d4da7dc6ea731b88a", + "token": { + "decimals": 18, + "symbol": "API3" + }, + "isSC": {} + }, + "0x168e209d7b2f58f1f24b8ae7b7d35e662bbf11cc": { + "name": "LAI token contract", + "address": "0x168e209d7b2f58f1f24b8ae7b7d35e662bbf11cc", + "token": { + "decimals": 18, + "symbol": "LAI" + }, + "isSC": {} + }, + "0x788d86e00ab31db859c3d6b80d5a9375801d7f2a": { + "name": "TENET token contract", + "address": "0x788d86e00ab31db859c3d6b80d5a9375801d7f2a", + "token": { + "decimals": 18, + "symbol": "TENET" + }, + "isSC": {} + }, + "0xec213f83defb583af3a000b1c0ada660b1902a0f": { + "name": "PRE token contract", + "address": "0xec213f83defb583af3a000b1c0ada660b1902a0f", + "token": { + "decimals": 18, + "symbol": "PRE" + }, + "isSC": {} + }, + "0x71aef7b30728b9bb371578f36c5a1f1502a5723e": { + "name": "A1INCH token contract", + "address": "0x71aef7b30728b9bb371578f36c5a1f1502a5723e", + "token": { + "decimals": 18, + "symbol": "A1INCH" + }, + "isSC": {} + }, + "0x4bc2213ee6c99dc38099690603f044980a4f5dba": { + "name": "BEAR token contract", + "address": "0x4bc2213ee6c99dc38099690603f044980a4f5dba", + "token": { + "decimals": 18, + "symbol": "BEAR" + }, + "isSC": {} + }, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "name": "SPYRO token contract", + "address": "0x6d7497751656618fc38cfb5478994a20f7e235df", + "token": { + "decimals": 18, + "symbol": "SPYRO" + }, + "isSC": {} + }, + "0x2c06ba9e7f0daccbc1f6a33ea67e85bb68fbee3a": { + "name": "LENDS token contract", + "address": "0x2c06ba9e7f0daccbc1f6a33ea67e85bb68fbee3a", + "token": { + "decimals": 18, + "symbol": "LENDS" + }, + "isSC": {} + }, + "0x75ce16d11b83605aa039d40d7d846ff23064fb65": { + "name": "DUB token contract", + "address": "0x75ce16d11b83605aa039d40d7d846ff23064fb65", + "token": { + "decimals": 9, + "symbol": "DUB" + }, + "isSC": {} + }, + "0xdd782657af86492771bdb369caeb8c246be362f5": { + "name": "RUG token contract", + "address": "0xdd782657af86492771bdb369caeb8c246be362f5", + "token": { + "decimals": 12, + "symbol": "RUG" + }, + "isSC": {} + }, + "0x320623b8e4ff03373931769a31fc52a4e78b5d70": { + "name": "Reserve Rights", + "address": "0x320623b8e4ff03373931769a31fc52a4e78b5d70", + "token": { + "decimals": 18, + "symbol": "RSR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rsr.svg" + }, + "0x7340ea46360576dc46ef49bce99bc5072c32421d": { + "name": "DSQ token contract", + "address": "0x7340ea46360576dc46ef49bce99bc5072c32421d", + "token": { + "decimals": 18, + "symbol": "DSQ" + }, + "isSC": {} + }, + "0xb8fa12f8409da31a4fc43d15c4c78c33d8213b9b": { + "name": "CALI token contract", + "address": "0xb8fa12f8409da31a4fc43d15c4c78c33d8213b9b", + "token": { + "decimals": 18, + "symbol": "CALI" + }, + "isSC": {} + }, + "0x686f2404e77ab0d9070a46cdfb0b7fecdd2318b0": { + "name": "LORDS token contract", + "address": "0x686f2404e77ab0d9070a46cdfb0b7fecdd2318b0", + "token": { + "decimals": 18, + "symbol": "LORDS" + }, + "isSC": {} + }, + "0xf725f73caee250ae384ec38bb2c77c38ef2cccea": { + "name": "AIR token contract", + "address": "0xf725f73caee250ae384ec38bb2c77c38ef2cccea", + "token": { + "decimals": 18, + "symbol": "AIR" + }, + "isSC": {} + }, + "0x966e770030209c95f974f37edbde65d98e853354": { + "name": "MAXX token contract", + "address": "0x966e770030209c95f974f37edbde65d98e853354", + "token": { + "decimals": 18, + "symbol": "MAXX" + }, + "isSC": {} + }, + "0x9c32185b81766a051e08de671207b34466dd1021": { + "name": "BTCPX token contract", + "address": "0x9c32185b81766a051e08de671207b34466dd1021", + "token": { + "decimals": 8, + "symbol": "BTCPX" + }, + "isSC": {} + }, + "0x6982508145454ce325ddbe47a25d4ec3d2311933": { + "name": "PEPE token contract", + "address": "0x6982508145454ce325ddbe47a25d4ec3d2311933", + "token": { + "decimals": 18, + "symbol": "PEPE" + }, + "isSC": {} + }, + "0xbf0b8b7475edb32d103001efd19fdd2753d7b76d": { + "name": "ABI token contract", + "address": "0xbf0b8b7475edb32d103001efd19fdd2753d7b76d", + "token": { + "decimals": 18, + "symbol": "ABI" + }, + "isSC": {} + }, + "0x4a527d8fc13c5203ab24ba0944f4cb14658d1db6": { + "name": "MITX token contract", + "address": "0x4a527d8fc13c5203ab24ba0944f4cb14658d1db6", + "token": { + "decimals": 18, + "symbol": "MITX" + }, + "isSC": {} + }, + "0x58fad9e3c3ae54c9ba98c3f0e4bf88ab3e8cf3c5": { + "name": "SPAY token contract", + "address": "0x58fad9e3c3ae54c9ba98c3f0e4bf88ab3e8cf3c5", + "token": { + "decimals": 18, + "symbol": "SPAY" + }, + "isSC": {} + }, + "0x443b29fc978058abe3fc2f4c3c6b76c57fdecc02": { + "name": "IDEAS token contract", + "address": "0x443b29fc978058abe3fc2f4c3c6b76c57fdecc02", + "token": { + "decimals": 18, + "symbol": "IDEAS" + }, + "isSC": {} + }, + "0x4156d3342d5c385a87d264f90653733592000581": { + "name": "SALT token contract", + "address": "0x4156d3342d5c385a87d264f90653733592000581", + "token": { + "decimals": 8, + "symbol": "SALT" + }, + "isSC": {} + }, + "0x30cf203b48edaa42c3b4918e955fed26cd012a3f": { + "name": "SEED token contract", + "address": "0x30cf203b48edaa42c3b4918e955fed26cd012a3f", + "token": { + "decimals": 18, + "symbol": "SEED" + }, + "isSC": {} + }, + "0x02f92800f57bcd74066f5709f1daa1a4302df875": { + "name": "PEAS token contract", + "address": "0x02f92800f57bcd74066f5709f1daa1a4302df875", + "token": { + "decimals": 18, + "symbol": "PEAS" + }, + "isSC": {} + }, + "0xd92b7adfdb79c26b5983a56ba7540d48d4616b8e": { + "name": "DOBBY token contract", + "address": "0xd92b7adfdb79c26b5983a56ba7540d48d4616b8e", + "token": { + "decimals": 18, + "symbol": "DOBBY" + }, + "isSC": {} + }, + "0xc5170dd7386247cdb8c48545c803f5d0e3347022": { + "name": "TI token contract", + "address": "0xc5170dd7386247cdb8c48545c803f5d0e3347022", + "token": { + "decimals": 18, + "symbol": "TI" + }, + "isSC": {} + }, + "0xf80d589b3dbe130c270a69f1a69d050f268786df": { + "name": "DAM token contract", + "address": "0xf80d589b3dbe130c270a69f1a69d050f268786df", + "token": { + "decimals": 18, + "symbol": "DAM" + }, + "isSC": {} + }, + "0x678e840c640f619e17848045d23072844224dd37": { + "name": "CRTS token contract", + "address": "0x678e840c640f619e17848045d23072844224dd37", + "token": { + "decimals": 18, + "symbol": "CRTS" + }, + "isSC": {} + }, + "0x2f4404c4012476929b6503e1397707480bf23b7f": { + "name": "TAI token contract", + "address": "0x2f4404c4012476929b6503e1397707480bf23b7f", + "token": { + "decimals": 9, + "symbol": "TAI" + }, + "isSC": {} + }, + "0x719e7f0dadfdea25b78595da944f44d15d7e6795": { + "name": "MUSK token contract", + "address": "0x719e7f0dadfdea25b78595da944f44d15d7e6795", + "token": { + "decimals": 18, + "symbol": "MUSK" + }, + "isSC": {} + }, + "0xea81dab2e0ecbc6b5c4172de4c22b6ef6e55bd8f": { + "name": "PLEB token contract", + "address": "0xea81dab2e0ecbc6b5c4172de4c22b6ef6e55bd8f", + "token": { + "decimals": 18, + "symbol": "PLEB" + }, + "isSC": {} + }, + "0x925206b8a707096ed26ae47c84747fe0bb734f59": { + "name": "WBT token contract", + "address": "0x925206b8a707096ed26ae47c84747fe0bb734f59", + "token": { + "decimals": 8, + "symbol": "WBT" + }, + "isSC": {} + }, + "0x07e0edf8ce600fb51d44f51e3348d77d67f298ae": { + "name": "XRP token contract", + "address": "0x07e0edf8ce600fb51d44f51e3348d77d67f298ae", + "token": { + "decimals": 8, + "symbol": "XRP" + }, + "isSC": {} + }, + "0xfcf8eda095e37a41e002e266daad7efc1579bc0a": { + "name": "FLEX token contract", + "address": "0xfcf8eda095e37a41e002e266daad7efc1579bc0a", + "token": { + "decimals": 18, + "symbol": "FLEX" + }, + "isSC": {} + }, + "0x979aca85ba37c675e78322ed5d97fa980b9bdf00": { + "name": "FSN token contract", + "address": "0x979aca85ba37c675e78322ed5d97fa980b9bdf00", + "token": { + "decimals": 18, + "symbol": "FSN" + }, + "isSC": {} + }, + "0x87d73e916d7057945c9bcd8cdd94e42a6f47f776": { + "name": "NFTX token contract", + "address": "0x87d73e916d7057945c9bcd8cdd94e42a6f47f776", + "token": { + "decimals": 18, + "symbol": "NFTX" + }, + "isSC": {} + }, + "0x8254e26e453eb5abd29b3c37ac9e8da32e5d3299": { + "name": "RBX token contract", + "address": "0x8254e26e453eb5abd29b3c37ac9e8da32e5d3299", + "token": { + "decimals": 18, + "symbol": "RBX" + }, + "isSC": {} + }, + "0x467bccd9d29f223bce8043b84e8c8b282827790f": { + "name": "TEL token contract", + "address": "0x467bccd9d29f223bce8043b84e8c8b282827790f", + "token": { + "decimals": 2, + "symbol": "TEL" + }, + "isSC": {} + }, + "0x1bb9b64927e0c5e207c9db4093b3738eef5d8447": { + "name": "VEC token contract", + "address": "0x1bb9b64927e0c5e207c9db4093b3738eef5d8447", + "token": { + "decimals": 9, + "symbol": "VEC" + }, + "isSC": {} + }, + "0x579cea1889991f68acc35ff5c3dd0621ff29b0c9": { + "name": "IQ token contract", + "address": "0x579cea1889991f68acc35ff5c3dd0621ff29b0c9", + "token": { + "decimals": 18, + "symbol": "IQ" + }, + "isSC": {} + }, + "0x8d9d725aaa3f6236763ff548051657a342c37623": { + "name": "NED token contract", + "address": "0x8d9d725aaa3f6236763ff548051657a342c37623", + "token": { + "decimals": 18, + "symbol": "NED" + }, + "isSC": {} + }, + "0x0c08638473cafbca3beb113616a1871f4bfad4f9": { + "name": "ZOO token contract", + "address": "0x0c08638473cafbca3beb113616a1871f4bfad4f9", + "token": { + "decimals": 18, + "symbol": "ZOO" + }, + "isSC": {} + }, + "0x9506d37f70eb4c3d79c398d326c871abbf10521d": { + "name": "MLT token contract", + "address": "0x9506d37f70eb4c3d79c398d326c871abbf10521d", + "token": { + "decimals": 18, + "symbol": "MLT" + }, + "isSC": {} + }, + "0x7d5121505149065b562c789a0145ed750e6e8cdd": { + "name": "VR token contract", + "address": "0x7d5121505149065b562c789a0145ed750e6e8cdd", + "token": { + "decimals": 18, + "symbol": "VR" + }, + "isSC": {} + }, + "0xe5ca70281149be03da30778fb5ec6183d339f7a5": { + "name": "GPBP token contract", + "address": "0xe5ca70281149be03da30778fb5ec6183d339f7a5", + "token": { + "decimals": 9, + "symbol": "GPBP" + }, + "isSC": {} + }, + "0x18e5f92103d1b34623738ee79214b1659f2ee109": { + "name": "WCELL token contract", + "address": "0x18e5f92103d1b34623738ee79214b1659f2ee109", + "token": { + "decimals": 18, + "symbol": "WCELL" + }, + "isSC": {} + }, + "0x2b91c5a73b7c4a70a61536429a2bf45461d85b27": { + "name": "RIG token contract", + "address": "0x2b91c5a73b7c4a70a61536429a2bf45461d85b27", + "token": { + "decimals": 18, + "symbol": "RIG" + }, + "isSC": {} + }, + "0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2": { + "name": "PPAY token contract", + "address": "0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2", + "token": { + "decimals": 18, + "symbol": "PPAY" + }, + "isSC": {} + }, + "0x06450dee7fd2fb8e39061434babcfc05599a6fb8": { + "name": "XEN token contract", + "address": "0x06450dee7fd2fb8e39061434babcfc05599a6fb8", + "token": { + "decimals": 18, + "symbol": "XEN" + }, + "isSC": {} + }, + "0x6cacdb97e3fc8136805a9e7c342d866ab77d0957": { + "name": "SWPR token contract", + "address": "0x6cacdb97e3fc8136805a9e7c342d866ab77d0957", + "token": { + "decimals": 18, + "symbol": "SWPR" + }, + "isSC": {} + }, + "0x09f098b155d561fc9f7bccc97038b7e3d20baf74": { + "name": "ZOO token contract", + "address": "0x09f098b155d561fc9f7bccc97038b7e3d20baf74", + "token": { + "decimals": 18, + "symbol": "ZOO" + }, + "isSC": {} + }, + "0xc691bc298a304d591ad9b352c7a8d216de9f2ced": { + "name": "POLA token contract", + "address": "0xc691bc298a304d591ad9b352c7a8d216de9f2ced", + "token": { + "decimals": 18, + "symbol": "POLA" + }, + "isSC": {} + }, + "0x888888848b652b3e3a0f34c96e00eec0f3a23f72": { + "name": "TLM token contract", + "address": "0x888888848b652b3e3a0f34c96e00eec0f3a23f72", + "token": { + "decimals": 4, + "symbol": "TLM" + }, + "isSC": {} + }, + "0x51cb253744189f11241becb29bedd3f1b5384fdb": { + "name": "DMTR token contract", + "address": "0x51cb253744189f11241becb29bedd3f1b5384fdb", + "token": { + "decimals": 18, + "symbol": "DMTR" + }, + "isSC": {} + }, + "0xcda2f16c6aa895d533506b426aff827b709c87f5": { + "name": "FAI token contract", + "address": "0xcda2f16c6aa895d533506b426aff827b709c87f5", + "token": { + "decimals": 18, + "symbol": "FAI" + }, + "isSC": {} + }, + "0x6733f0283711f225a447e759d859a70b0c0fd2bc": { + "name": "SVETH token contract", + "address": "0x6733f0283711f225a447e759d859a70b0c0fd2bc", + "token": { + "decimals": 18, + "symbol": "SVETH" + }, + "isSC": {} + }, + "0xe33ae4e795114279721047484e5ad5cc7df24fcb": { + "name": "MCF token contract", + "address": "0xe33ae4e795114279721047484e5ad5cc7df24fcb", + "token": { + "decimals": 10, + "symbol": "MCF" + }, + "isSC": {} + }, + "0xfc4b4ec763722b71eb1d729749b447a9645f5f30": { + "name": "GME token contract", + "address": "0xfc4b4ec763722b71eb1d729749b447a9645f5f30", + "token": { + "decimals": 9, + "symbol": "GME" + }, + "isSC": {} + }, + "0x9559aaa82d9649c7a7b220e7c461d2e74c9a3593": { + "name": "RETH token contract", + "address": "0x9559aaa82d9649c7a7b220e7c461d2e74c9a3593", + "token": { + "decimals": 18, + "symbol": "RETH" + }, + "isSC": {} + }, + "0xae6e307c3fe9e922e5674dbd7f830ed49c014c6b": { + "name": "CREDI token contract", + "address": "0xae6e307c3fe9e922e5674dbd7f830ed49c014c6b", + "token": { + "decimals": 18, + "symbol": "CREDI" + }, + "isSC": {} + }, + "0x9681ee0d91e737c3b60aceba7fbdae61b5462f42": { + "name": "CYCE token contract", + "address": "0x9681ee0d91e737c3b60aceba7fbdae61b5462f42", + "token": { + "decimals": 6, + "symbol": "CYCE" + }, + "isSC": {} + }, + "0x973e00eee6d180b5a0eb08ce3047ac4ea7a45cd5": { + "name": "TOTO token contract", + "address": "0x973e00eee6d180b5a0eb08ce3047ac4ea7a45cd5", + "token": { + "decimals": 9, + "symbol": "TOTO" + }, + "isSC": {} + }, + "0x10f2cf6ef155460c5b716080eb57928652867f2e": { + "name": "MUSK token contract", + "address": "0x10f2cf6ef155460c5b716080eb57928652867f2e", + "token": { + "decimals": 18, + "symbol": "MUSK" + }, + "isSC": {} + }, + "0x469eda64aed3a3ad6f868c44564291aa415cb1d9": { + "name": "FLUX token contract", + "address": "0x469eda64aed3a3ad6f868c44564291aa415cb1d9", + "token": { + "decimals": 18, + "symbol": "FLUX" + }, + "isSC": {} + }, + "0xcd24ba0e3364233ee9301c1d608a14753c8739c5": { + "name": "SOUTH token contract", + "address": "0xcd24ba0e3364233ee9301c1d608a14753c8739c5", + "token": { + "decimals": 18, + "symbol": "SOUTH" + }, + "isSC": {} + }, + "0x1bed97cbc3c24a4fb5c069c6e311a967386131f7": { + "name": "YETH token contract", + "address": "0x1bed97cbc3c24a4fb5c069c6e311a967386131f7", + "token": { + "decimals": 18, + "symbol": "YETH" + }, + "isSC": {} + }, + "0xd13cfd3133239a3c73a9e535a5c4dadee36b395c": { + "name": "VAI token contract", + "address": "0xd13cfd3133239a3c73a9e535a5c4dadee36b395c", + "token": { + "decimals": 18, + "symbol": "VAI" + }, + "isSC": {} + }, + "0x08a1c30bbb26425c1031ee9e43fa0b9960742539": { + "name": "LNDX token contract", + "address": "0x08a1c30bbb26425c1031ee9e43fa0b9960742539", + "token": { + "decimals": 6, + "symbol": "LNDX" + }, + "isSC": {} + }, + "0xfc09c7cfd9c175dd9423ca02ae1249579ab12f12": { + "name": "TOTORO token contract", + "address": "0xfc09c7cfd9c175dd9423ca02ae1249579ab12f12", + "token": { + "decimals": 9, + "symbol": "TOTORO" + }, + "isSC": {} + }, + "0xc08512927d12348f6620a698105e1baac6ecd911": { + "name": "GYEN token contract", + "address": "0xc08512927d12348f6620a698105e1baac6ecd911", + "token": { + "decimals": 6, + "symbol": "GYEN" + }, + "isSC": {} + }, + "0x2f6f397332b0f8b4536430bcc97980aa838f62f9": { + "name": "YUNA token contract", + "address": "0x2f6f397332b0f8b4536430bcc97980aa838f62f9", + "token": { + "decimals": 18, + "symbol": "YUNA" + }, + "isSC": {} + }, + "0x7e77dcb127f99ece88230a64db8d595f31f1b068": { + "name": "SILV2 token contract", + "address": "0x7e77dcb127f99ece88230a64db8d595f31f1b068", + "token": { + "decimals": 18, + "symbol": "SILV2" + }, + "isSC": {} + }, + "0x4e1a609ec87cf6477613f515f6eb64ef2d31089a": { + "name": "DGCS token contract", + "address": "0x4e1a609ec87cf6477613f515f6eb64ef2d31089a", + "token": { + "decimals": 0, + "symbol": "DGCS" + }, + "isSC": {} + }, + "0x4501a82790ef2587dfeb93dc038541228e516597": { + "name": "HYDRA token contract", + "address": "0x4501a82790ef2587dfeb93dc038541228e516597", + "token": { + "decimals": 18, + "symbol": "HYDRA" + }, + "isSC": {} + }, + "0xb3ad645db386d7f6d753b2b9c3f4b853da6890b8": { + "name": "CTR token contract", + "address": "0xb3ad645db386d7f6d753b2b9c3f4b853da6890b8", + "token": { + "decimals": 18, + "symbol": "CTR" + }, + "isSC": {} + }, + "0x19de6b897ed14a376dda0fe53a5420d2ac828a28": { + "name": "BGB token contract", + "address": "0x19de6b897ed14a376dda0fe53a5420d2ac828a28", + "token": { + "decimals": 18, + "symbol": "BGB" + }, + "isSC": {} + }, + "0x21381e026ad6d8266244f2a583b35f9e4413fa2a": { + "name": "Formation Finance", + "address": "0x21381e026ad6d8266244f2a583b35f9e4413fa2a", + "token": { + "decimals": 18, + "symbol": "FORM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/form.svg" + }, + "0xf8c3527cc04340b208c854e985240c02f7b7793f": { + "name": "FRONT token contract", + "address": "0xf8c3527cc04340b208c854e985240c02f7b7793f", + "token": { + "decimals": 18, + "symbol": "FRONT" + }, + "isSC": {} + }, + "0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c": { + "name": "X8X token contract", + "address": "0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c", + "token": { + "decimals": 18, + "symbol": "X8X" + }, + "isSC": {} + }, + "0x4cff49d0a19ed6ff845a9122fa912abcfb1f68a6": { + "name": "WTK token contract", + "address": "0x4cff49d0a19ed6ff845a9122fa912abcfb1f68a6", + "token": { + "decimals": 18, + "symbol": "WTK" + }, + "isSC": {} + }, + "0x035df12e0f3ac6671126525f1015e47d79dfeddf": { + "name": "0XMR token contract", + "address": "0x035df12e0f3ac6671126525f1015e47d79dfeddf", + "token": { + "decimals": 18, + "symbol": "0XMR" + }, + "isSC": {} + }, + "0x354c8cda7e3b737d360513a0dc5abcee8ee1cea3": { + "name": "BABYTRUMP token contract", + "address": "0x354c8cda7e3b737d360513a0dc5abcee8ee1cea3", + "token": { + "decimals": 18, + "symbol": "BABYTRUMP" + }, + "isSC": {} + }, + "0xee503d43ad447cdfc719f688207bfcb2fbb9471c": { + "name": "DAO token contract", + "address": "0xee503d43ad447cdfc719f688207bfcb2fbb9471c", + "token": { + "decimals": 18, + "symbol": "DAO" + }, + "isSC": {} + }, + "0x625ae63000f46200499120b906716420bd059240": { + "name": "ASUSD token contract", + "address": "0x625ae63000f46200499120b906716420bd059240", + "token": { + "decimals": 18, + "symbol": "ASUSD" + }, + "isSC": {} + }, + "0x04c17b9d3b29a78f7bd062a57cf44fc633e71f85": { + "name": "IMPT token contract", + "address": "0x04c17b9d3b29a78f7bd062a57cf44fc633e71f85", + "token": { + "decimals": 18, + "symbol": "IMPT" + }, + "isSC": {} + }, + "0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce": { + "name": "BEAM token contract", + "address": "0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce", + "token": { + "decimals": 18, + "symbol": "BEAM" + }, + "isSC": {} + }, + "0x6911f552842236bd9e8ea8ddbb3fb414e2c5fa9d": { + "name": "SNP token contract", + "address": "0x6911f552842236bd9e8ea8ddbb3fb414e2c5fa9d", + "token": { + "decimals": 18, + "symbol": "SNP" + }, + "isSC": {} + }, + "0x5ca135cb8527d76e932f34b5145575f9d8cbe08e": { + "name": "FPI token contract", + "address": "0x5ca135cb8527d76e932f34b5145575f9d8cbe08e", + "token": { + "decimals": 18, + "symbol": "FPI" + }, + "isSC": {} + }, + "0xc56c2b7e71b54d38aab6d52e94a04cbfa8f604fa": { + "name": "ZUSD token contract", + "address": "0xc56c2b7e71b54d38aab6d52e94a04cbfa8f604fa", + "token": { + "decimals": 6, + "symbol": "ZUSD" + }, + "isSC": {} + }, + "0xc8871267e07408b89aa5aecc58adca5e574557f8": { + "name": "IUSDC token contract", + "address": "0xc8871267e07408b89aa5aecc58adca5e574557f8", + "token": { + "decimals": 6, + "symbol": "IUSDC" + }, + "isSC": {} + }, + "0x75c97384ca209f915381755c582ec0e2ce88c1ba": { + "name": "FINE token contract", + "address": "0x75c97384ca209f915381755c582ec0e2ce88c1ba", + "token": { + "decimals": 18, + "symbol": "FINE" + }, + "isSC": {} + }, + "0xa5f1dbb0e55bc31f32c6d032bee330288490e722": { + "name": "DBD token contract", + "address": "0xa5f1dbb0e55bc31f32c6d032bee330288490e722", + "token": { + "decimals": 18, + "symbol": "DBD" + }, + "isSC": {} + }, + "0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e": { + "name": "DRGN token contract", + "address": "0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e", + "token": { + "decimals": 18, + "symbol": "DRGN" + }, + "isSC": {} + }, + "0xf57e7e7c23978c3caec3c3548e3d615c346e79ff": { + "name": "Immutable X", + "address": "0xf57e7e7c23978c3caec3c3548e3d615c346e79ff", + "token": { + "decimals": 18, + "symbol": "IMX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/imx.svg" + }, + "0x87edffde3e14c7a66c9b9724747a1c5696b742e6": { + "name": "SWAG token contract", + "address": "0x87edffde3e14c7a66c9b9724747a1c5696b742e6", + "token": { + "decimals": 18, + "symbol": "SWAG" + }, + "isSC": {} + }, + "0x17c50d62e6e8d20d2dc18e9ad79c43263d0720d9": { + "name": "NFAI token contract", + "address": "0x17c50d62e6e8d20d2dc18e9ad79c43263d0720d9", + "token": { + "decimals": 18, + "symbol": "NFAI" + }, + "isSC": {} + }, + "0x4e9fcd48af4738e3bf1382009dc1e93ebfce698f": { + "name": "TAONU token contract", + "address": "0x4e9fcd48af4738e3bf1382009dc1e93ebfce698f", + "token": { + "decimals": 18, + "symbol": "TAONU" + }, + "isSC": {} + }, + "0xac9518ba93eeb2336a03137d254d8cc2e4d0fa38": { + "name": "EDUM token contract", + "address": "0xac9518ba93eeb2336a03137d254d8cc2e4d0fa38", + "token": { + "decimals": 18, + "symbol": "EDUM" + }, + "isSC": {} + }, + "0xfa219a9bd37712ef04e5b04abce9ace538ffafb7": { + "name": "DOGPET token contract", + "address": "0xfa219a9bd37712ef04e5b04abce9ace538ffafb7", + "token": { + "decimals": 18, + "symbol": "DOGPET" + }, + "isSC": {} + }, + "0x667102bd3413bfeaa3dffb48fa8288819e480a88": { + "name": "TKX token contract", + "address": "0x667102bd3413bfeaa3dffb48fa8288819e480a88", + "token": { + "decimals": 8, + "symbol": "TKX" + }, + "isSC": {} + }, + "0x64bc2ca1be492be7185faa2c8835d9b824c8a194": { + "name": "BIGTIME token contract", + "address": "0x64bc2ca1be492be7185faa2c8835d9b824c8a194", + "token": { + "decimals": 18, + "symbol": "BIGTIME" + }, + "isSC": {} + }, + "0xad038eb671c44b853887a7e32528fab35dc5d710": { + "name": "DBR token contract", + "address": "0xad038eb671c44b853887a7e32528fab35dc5d710", + "token": { + "decimals": 18, + "symbol": "DBR" + }, + "isSC": {} + }, + "0x95d8bf2f57cf973251972b496dc6b1d9c6b5bce3": { + "name": "BLUE token contract", + "address": "0x95d8bf2f57cf973251972b496dc6b1d9c6b5bce3", + "token": { + "decimals": 18, + "symbol": "BLUE" + }, + "isSC": {} + }, + "0x1e053d89e08c24aa2ce5c5b4206744dc2d7bd8f5": { + "name": "TT token contract", + "address": "0x1e053d89e08c24aa2ce5c5b4206744dc2d7bd8f5", + "token": { + "decimals": 18, + "symbol": "TT" + }, + "isSC": {} + }, + "0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41": { + "name": "Props", + "address": "0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41", + "token": { + "decimals": 18, + "symbol": "PROPS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/props.png" + }, + "0x6c5024cd4f8a59110119c56f8933403a539555eb": { + "name": "Aave SUSD", + "address": "0x6c5024cd4f8a59110119c56f8933403a539555eb", + "token": { + "decimals": 18, + "symbol": "aSUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aSUSD.svg" + }, + "0x6100dd79fcaa88420750dcee3f735d168abcb771": { + "name": "OS token contract", + "address": "0x6100dd79fcaa88420750dcee3f735d168abcb771", + "token": { + "decimals": 18, + "symbol": "OS" + }, + "isSC": {} + }, + "0xb8b295df2cd735b15be5eb419517aa626fc43cd5": { + "name": "STLINK token contract", + "address": "0xb8b295df2cd735b15be5eb419517aa626fc43cd5", + "token": { + "decimals": 18, + "symbol": "STLINK" + }, + "isSC": {} + }, + "0xc3ade5ace1bbb033ccae8177c12ecbfa16bd6a9d": { + "name": "INSWETH token contract", + "address": "0xc3ade5ace1bbb033ccae8177c12ecbfa16bd6a9d", + "token": { + "decimals": 18, + "symbol": "INSWETH" + }, + "isSC": {} + }, + "0x00c8555542158fff0feb892c8e000a8d1831762c": { + "name": "MORI token contract", + "address": "0x00c8555542158fff0feb892c8e000a8d1831762c", + "token": { + "decimals": 18, + "symbol": "MORI" + }, + "isSC": {} + }, + "0x3106a0a076bedae847652f42ef07fd58589e001f": { + "name": "ADS token contract", + "address": "0x3106a0a076bedae847652f42ef07fd58589e001f", + "token": { + "decimals": 18, + "symbol": "ADS" + }, + "isSC": {} + }, + "0x5c8c8d560048f34e5f7f8ad71f2f81a89dbd273e": { + "name": "CART token contract", + "address": "0x5c8c8d560048f34e5f7f8ad71f2f81a89dbd273e", + "token": { + "decimals": 18, + "symbol": "CART" + }, + "isSC": {} + }, + "0x9ff58067bd8d239000010c154c6983a325df138e": { + "name": "PROPC token contract", + "address": "0x9ff58067bd8d239000010c154c6983a325df138e", + "token": { + "decimals": 18, + "symbol": "PROPC" + }, + "isSC": {} + }, + "0x6fce4a401b6b80ace52baaefe4421bd188e76f6f": { + "name": "AMANA token contract", + "address": "0x6fce4a401b6b80ace52baaefe4421bd188e76f6f", + "token": { + "decimals": 18, + "symbol": "AMANA" + }, + "isSC": {} + }, + "0xde8cd13b812bcd82218754a740b27e76ec1e86ad": { + "name": "TRESTLE token contract", + "address": "0xde8cd13b812bcd82218754a740b27e76ec1e86ad", + "token": { + "decimals": 18, + "symbol": "TRESTLE" + }, + "isSC": {} + }, + "0x9d91be44c06d373a8a226e1f3b146956083803eb": { + "name": "AKNC token contract", + "address": "0x9d91be44c06d373a8a226e1f3b146956083803eb", + "token": { + "decimals": 18, + "symbol": "AKNC" + }, + "isSC": {} + }, + "0xc78b628b060258300218740b1a7a5b3c82b3bd9f": { + "name": "COMAI token contract", + "address": "0xc78b628b060258300218740b1a7a5b3c82b3bd9f", + "token": { + "decimals": 18, + "symbol": "COMAI" + }, + "isSC": {} + }, + "0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f": { + "name": "WINTER token contract", + "address": "0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f", + "token": { + "decimals": 18, + "symbol": "WINTER" + }, + "isSC": {} + }, + "0xdcb5645eda1ed34c5641d81b927d33ebae9cf2a4": { + "name": "PAYB token contract", + "address": "0xdcb5645eda1ed34c5641d81b927d33ebae9cf2a4", + "token": { + "decimals": 18, + "symbol": "PAYB" + }, + "isSC": {} + }, + "0x430ef9263e76dae63c84292c3409d61c598e9682": { + "name": "PYR token contract", + "address": "0x430ef9263e76dae63c84292c3409d61c598e9682", + "token": { + "decimals": 18, + "symbol": "PYR" + }, + "isSC": {} + }, + "0x3bd7d4f524d09f4e331577247a048d56e4b67a7f": { + "name": "5IRE token contract", + "address": "0x3bd7d4f524d09f4e331577247a048d56e4b67a7f", + "token": { + "decimals": 18, + "symbol": "5IRE" + }, + "isSC": {} + }, + "0x89b69f2d1adffa9a253d40840b6baa7fc903d697": { + "name": "DIONE token contract", + "address": "0x89b69f2d1adffa9a253d40840b6baa7fc903d697", + "token": { + "decimals": 9, + "symbol": "DIONE" + }, + "isSC": {} + }, + "0x1571ed0bed4d987fe2b498ddbae7dfa19519f651": { + "name": "IFARM token contract", + "address": "0x1571ed0bed4d987fe2b498ddbae7dfa19519f651", + "token": { + "decimals": 18, + "symbol": "IFARM" + }, + "isSC": {} + }, + "0xddcc69879e1d2376ce799051afa98c689f234cca": { + "name": "SMRT token contract", + "address": "0xddcc69879e1d2376ce799051afa98c689f234cca", + "token": { + "decimals": 18, + "symbol": "SMRT" + }, + "isSC": {} + }, + "0xd567b5f02b9073ad3a982a099a23bf019ff11d1c": { + "name": "GAME token contract", + "address": "0xd567b5f02b9073ad3a982a099a23bf019ff11d1c", + "token": { + "decimals": 5, + "symbol": "GAME" + }, + "isSC": {} + }, + "0x473037de59cf9484632f4a27b509cfe8d4a31404": { + "name": "GST-ETH token contract", + "address": "0x473037de59cf9484632f4a27b509cfe8d4a31404", + "token": { + "decimals": 8, + "symbol": "GST-ETH" + }, + "isSC": {} + }, + "0xe59b14e43479dc30d77f553e4b5c6fc67e1f6caf": { + "name": "LEXA token contract", + "address": "0xe59b14e43479dc30d77f553e4b5c6fc67e1f6caf", + "token": { + "decimals": 18, + "symbol": "LEXA" + }, + "isSC": {} + }, + "0x544c42fbb96b39b21df61cf322b5edc285ee7429": { + "name": "InsurAce", + "address": "0x544c42fbb96b39b21df61cf322b5edc285ee7429", + "token": { + "decimals": 18, + "symbol": "INSUR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/INSUR.svg" + }, + "0xcafe001067cdef266afb7eb5a286dcfd277f3de5": { + "name": "PSP token contract", + "address": "0xcafe001067cdef266afb7eb5a286dcfd277f3de5", + "token": { + "decimals": 18, + "symbol": "PSP" + }, + "isSC": {} + }, + "0x47d20c7800906e01adfc890f283c110ba70a6c97": { + "name": "AZR token contract", + "address": "0x47d20c7800906e01adfc890f283c110ba70a6c97", + "token": { + "decimals": 9, + "symbol": "AZR" + }, + "isSC": {} + }, + "0x6fb0855c404e09c47c3fbca25f08d4e41f9f062f": { + "name": "AZRX token contract", + "address": "0x6fb0855c404e09c47c3fbca25f08d4e41f9f062f", + "token": { + "decimals": 18, + "symbol": "AZRX" + }, + "isSC": {} + }, + "0x8de5b80a0c1b02fe4976851d030b36122dbb8624": { + "name": "VANRY token contract", + "address": "0x8de5b80a0c1b02fe4976851d030b36122dbb8624", + "token": { + "decimals": 18, + "symbol": "VANRY" + }, + "isSC": {} + }, + "0x33e07f5055173cf8febede8b21b12d1e2b523205": { + "name": "ELAND token contract", + "address": "0x33e07f5055173cf8febede8b21b12d1e2b523205", + "token": { + "decimals": 18, + "symbol": "ELAND" + }, + "isSC": {} + }, + "0x0f17bc9a994b87b5225cfb6a2cd4d667adb4f20b": { + "name": "JEUR token contract", + "address": "0x0f17bc9a994b87b5225cfb6a2cd4d667adb4f20b", + "token": { + "decimals": 18, + "symbol": "JEUR" + }, + "isSC": {} + }, + "0xa60b6c2537078b903e3e965d4e36b7280b0b53a9": { + "name": "PYPY token contract", + "address": "0xa60b6c2537078b903e3e965d4e36b7280b0b53a9", + "token": { + "decimals": 9, + "symbol": "PYPY" + }, + "isSC": {} + }, + "0xc5190e7fec4d97a3a3b1ab42dfedac608e2d0793": { + "name": "FXI token contract", + "address": "0xc5190e7fec4d97a3a3b1ab42dfedac608e2d0793", + "token": { + "decimals": 18, + "symbol": "FXI" + }, + "isSC": {} + }, + "0xce246eea10988c495b4a90a905ee9237a0f91543": { + "name": "VCX token contract", + "address": "0xce246eea10988c495b4a90a905ee9237a0f91543", + "token": { + "decimals": 18, + "symbol": "VCX" + }, + "isSC": {} + }, + "0xa6a1cc527d48585538b137e6abc14b2a55489d11": { + "name": "LWC token contract", + "address": "0xa6a1cc527d48585538b137e6abc14b2a55489d11", + "token": { + "decimals": 8, + "symbol": "LWC" + }, + "isSC": {} + }, + "0xf091867ec603a6628ed83d274e835539d82e9cc8": { + "name": "ZETA token contract", + "address": "0xf091867ec603a6628ed83d274e835539d82e9cc8", + "token": { + "decimals": 18, + "symbol": "ZETA" + }, + "isSC": {} + }, + "0xea068fba19ce95f12d252ad8cb2939225c4ea02d": { + "name": "FIEF token contract", + "address": "0xea068fba19ce95f12d252ad8cb2939225c4ea02d", + "token": { + "decimals": 18, + "symbol": "FIEF" + }, + "isSC": {} + }, + "0xc237868a9c5729bdf3173dddacaa336a0a5bb6e0": { + "name": "WGR token contract", + "address": "0xc237868a9c5729bdf3173dddacaa336a0a5bb6e0", + "token": { + "decimals": 8, + "symbol": "WGR" + }, + "isSC": {} + }, + "0x177d39ac676ed1c67a2b268ad7f1e58826e5b0af": { + "name": "CDT token contract", + "address": "0x177d39ac676ed1c67a2b268ad7f1e58826e5b0af", + "token": { + "decimals": 18, + "symbol": "CDT" + }, + "isSC": {} + }, + "0x65def5029a0e7591e46b38742bfedd1fb7b24436": { + "name": "Kanpeki", + "address": "0x65def5029a0e7591e46b38742bfedd1fb7b24436", + "token": { + "decimals": 18, + "symbol": "KAE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kanpeki-green.svg" + }, + "0x6069c9223e8a5da1ec49ac5525d4bb757af72cd8": { + "name": "MUSK token contract", + "address": "0x6069c9223e8a5da1ec49ac5525d4bb757af72cd8", + "token": { + "decimals": 18, + "symbol": "MUSK" + }, + "isSC": {} + }, + "0x5d30ad9c6374bf925d0a75454fa327aacf778492": { + "name": "PERI token contract", + "address": "0x5d30ad9c6374bf925d0a75454fa327aacf778492", + "token": { + "decimals": 18, + "symbol": "PERI" + }, + "isSC": {} + }, + "0x9ba00d6856a4edf4665bca2c2309936572473b7e": { + "name": "AUSDC token contract", + "address": "0x9ba00d6856a4edf4665bca2c2309936572473b7e", + "token": { + "decimals": 6, + "symbol": "AUSDC" + }, + "isSC": {} + }, + "0xac6df26a590f08dcc95d5a4705ae8abbc88509ef": { + "name": "Aave ENJ", + "address": "0xac6df26a590f08dcc95d5a4705ae8abbc88509ef", + "token": { + "decimals": 18, + "symbol": "aENJ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aENJ.svg" + }, + "0xdc63269ea166b70d4780b3a11f5c825c2b761b01": { + "name": "PAW token contract", + "address": "0xdc63269ea166b70d4780b3a11f5c825c2b761b01", + "token": { + "decimals": 18, + "symbol": "PAW" + }, + "isSC": {} + }, + "0x2a69655c22eda32ff48d315bb26ed45f150700b4": { + "name": "WXTZ token contract", + "address": "0x2a69655c22eda32ff48d315bb26ed45f150700b4", + "token": { + "decimals": 6, + "symbol": "WXTZ" + }, + "isSC": {} + }, + "0x9e20461bc2c4c980f62f1b279d71734207a6a356": { + "name": "OMNI token contract", + "address": "0x9e20461bc2c4c980f62f1b279d71734207a6a356", + "token": { + "decimals": 18, + "symbol": "OMNI" + }, + "isSC": {} + }, + "0xd82fd4d6d62f89a1e50b1db69ad19932314aa408": { + "name": "LIQ token contract", + "address": "0xd82fd4d6d62f89a1e50b1db69ad19932314aa408", + "token": { + "decimals": 18, + "symbol": "LIQ" + }, + "isSC": {} + }, + "0x19062190b1925b5b6689d7073fdfc8c2976ef8cb": { + "name": "Swarm", + "address": "0x19062190b1925b5b6689d7073fdfc8c2976ef8cb", + "token": { + "decimals": 16, + "symbol": "BZZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ethswarm.svg" + }, + "0x6f40d4a6237c257fff2db00fa0510deeecd303eb": { + "name": "INST token contract", + "address": "0x6f40d4a6237c257fff2db00fa0510deeecd303eb", + "token": { + "decimals": 18, + "symbol": "INST" + }, + "isSC": {} + }, + "0xf66cd2f8755a21d3c8683a10269f795c0532dd58": { + "name": "COREDAO token contract", + "address": "0xf66cd2f8755a21d3c8683a10269f795c0532dd58", + "token": { + "decimals": 18, + "symbol": "COREDAO" + }, + "isSC": {} + }, + "0x08ba718f288c3b12b01146816bef9fa03cc635bc": { + "name": "CENT token contract", + "address": "0x08ba718f288c3b12b01146816bef9fa03cc635bc", + "token": { + "decimals": 18, + "symbol": "CENT" + }, + "isSC": {} + }, + "0xdc1de096ed4ec5b48f4b0496a6ecee3d63e74f53": { + "name": "PNF token contract", + "address": "0xdc1de096ed4ec5b48f4b0496a6ecee3d63e74f53", + "token": { + "decimals": 18, + "symbol": "PNF" + }, + "isSC": {} + }, + "0x666d875c600aa06ac1cf15641361dec3b00432ef": { + "name": "BTSE token contract", + "address": "0x666d875c600aa06ac1cf15641361dec3b00432ef", + "token": { + "decimals": 8, + "symbol": "BTSE" + }, + "isSC": {} + }, + "0x92d6c1e31e14520e676a687f0a93788b716beff5": { + "name": "dYdX", + "address": "0x92d6c1e31e14520e676a687f0a93788b716beff5", + "token": { + "decimals": 18, + "symbol": "DYDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dydx.svg" + }, + "0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18": { + "name": "XCN token contract", + "address": "0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18", + "token": { + "decimals": 18, + "symbol": "XCN" + }, + "isSC": {} + }, + "0x1294f4183763743c7c9519bec51773fb3acd78fd": { + "name": "FI token contract", + "address": "0x1294f4183763743c7c9519bec51773fb3acd78fd", + "token": { + "decimals": 18, + "symbol": "FI" + }, + "isSC": {} + }, + "0x5f0e628b693018f639d10e4a4f59bd4d8b2b6b44": { + "name": "WHITE token contract", + "address": "0x5f0e628b693018f639d10e4a4f59bd4d8b2b6b44", + "token": { + "decimals": 18, + "symbol": "WHITE" + }, + "isSC": {} + }, + "0x35f67c1d929e106fdff8d1a55226afe15c34dbe2": { + "name": "BETA token contract", + "address": "0x35f67c1d929e106fdff8d1a55226afe15c34dbe2", + "token": { + "decimals": 18, + "symbol": "BETA" + }, + "isSC": {} + }, + "0xb62e24b747eaa41454857cf6011832117df59cb8": { + "name": "EPIKO token contract", + "address": "0xb62e24b747eaa41454857cf6011832117df59cb8", + "token": { + "decimals": 18, + "symbol": "EPIKO" + }, + "isSC": {} + }, + "0x69fa10cac03047a47ff32d7cddd6085ff1583d03": { + "name": "HYPER token contract", + "address": "0x69fa10cac03047a47ff32d7cddd6085ff1583d03", + "token": { + "decimals": 18, + "symbol": "HYPER" + }, + "isSC": {} + }, + "0x98968f0747e0a261532cacc0be296375f5c08398": { + "name": "MOONCAT token contract", + "address": "0x98968f0747e0a261532cacc0be296375f5c08398", + "token": { + "decimals": 18, + "symbol": "MOONCAT" + }, + "isSC": {} + }, + "0x455e53cbb86018ac2b8092fdcd39d8444affc3f6": { + "name": "Polygon Network Token", + "address": "0x455e53cbb86018ac2b8092fdcd39d8444affc3f6", + "token": { + "decimals": 18, + "symbol": "POL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pol.svg" + }, + "0xd36306a5d6bfde4f57b5159c6518d93f171fe755": { + "name": "RSTETH token contract", + "address": "0xd36306a5d6bfde4f57b5159c6518d93f171fe755", + "token": { + "decimals": 18, + "symbol": "RSTETH" + }, + "isSC": {} + }, + "0xe4efdd2eb216a4620cfa55c5cc67bd09dc64ff24": { + "name": " token contract", + "address": "0xe4efdd2eb216a4620cfa55c5cc67bd09dc64ff24", + "token": { + "decimals": 9, + "symbol": "" + }, + "isSC": {} + }, + "0xed35af169af46a02ee13b9d79eb57d6d68c1749e": { + "name": "OMI token contract", + "address": "0xed35af169af46a02ee13b9d79eb57d6d68c1749e", + "token": { + "decimals": 18, + "symbol": "OMI" + }, + "isSC": {} + }, + "0xbe59baad09b07086ee6c39bd0fc234c157c31ccc": { + "name": "LONG token contract", + "address": "0xbe59baad09b07086ee6c39bd0fc234c157c31ccc", + "token": { + "decimals": 18, + "symbol": "LONG" + }, + "isSC": {} + }, + "0x36ac219f90f5a6a3c77f2a7b660e3cc701f68e25": { + "name": "XCM token contract", + "address": "0x36ac219f90f5a6a3c77f2a7b660e3cc701f68e25", + "token": { + "decimals": 18, + "symbol": "XCM" + }, + "isSC": {} + }, + "0x7a2631aa3590fd6361d2d7afb51d5fe9d33ab2ec": { + "name": "CHECKDM token contract", + "address": "0x7a2631aa3590fd6361d2d7afb51d5fe9d33ab2ec", + "token": { + "decimals": 9, + "symbol": "CHECKDM" + }, + "isSC": {} + }, + "0x298d492e8c1d909d3f63bc4a36c66c64acb3d695": { + "name": "PBR token contract", + "address": "0x298d492e8c1d909d3f63bc4a36c66c64acb3d695", + "token": { + "decimals": 18, + "symbol": "PBR" + }, + "isSC": {} + }, + "0xd4318fa09c45cfb6355ded6085b0d698b64ec1cd": { + "name": "FEDAI token contract", + "address": "0xd4318fa09c45cfb6355ded6085b0d698b64ec1cd", + "token": { + "decimals": 8, + "symbol": "FEDAI" + }, + "isSC": {} + }, + "0x6ef3d766dfe02dc4bf04aae9122eb9a0ded25615": { + "name": "PRIMEETH token contract", + "address": "0x6ef3d766dfe02dc4bf04aae9122eb9a0ded25615", + "token": { + "decimals": 18, + "symbol": "PRIMEETH" + }, + "isSC": {} + }, + "0x25f8087ead173b73d6e8b84329989a8eea16cf73": { + "name": "YGG token contract", + "address": "0x25f8087ead173b73d6e8b84329989a8eea16cf73", + "token": { + "decimals": 18, + "symbol": "YGG" + }, + "isSC": {} + }, + "0x03a0657fc10d7169305a0179eb80d4f568cda705": { + "name": "BLITZ token contract", + "address": "0x03a0657fc10d7169305a0179eb80d4f568cda705", + "token": { + "decimals": 18, + "symbol": "BLITZ" + }, + "isSC": {} + }, + "0x5cf04716ba20127f1e2297addcf4b5035000c9eb": { + "name": "NKN token contract", + "address": "0x5cf04716ba20127f1e2297addcf4b5035000c9eb", + "token": { + "decimals": 18, + "symbol": "NKN" + }, + "isSC": {} + }, + "0x045109cf1be9edec048aa0b3d7a323154a1aea65": { + "name": "ELEV token contract", + "address": "0x045109cf1be9edec048aa0b3d7a323154a1aea65", + "token": { + "decimals": 18, + "symbol": "ELEV" + }, + "isSC": {} + }, + "0x102fa93ef3d2dc5b0b9ed3e7b3bf832796cb7b95": { + "name": "BBC token contract", + "address": "0x102fa93ef3d2dc5b0b9ed3e7b3bf832796cb7b95", + "token": { + "decimals": 18, + "symbol": "BBC" + }, + "isSC": {} + }, + "0xce20bb92ccf9bbf5091ef85649e71e552819ad8c": { + "name": "SMART token contract", + "address": "0xce20bb92ccf9bbf5091ef85649e71e552819ad8c", + "token": { + "decimals": 18, + "symbol": "SMART" + }, + "isSC": {} + }, + "0x78a0a62fba6fb21a83fe8a3433d44c73a4017a6f": { + "name": "OX token contract", + "address": "0x78a0a62fba6fb21a83fe8a3433d44c73a4017a6f", + "token": { + "decimals": 18, + "symbol": "OX" + }, + "isSC": {} + }, + "0x7a58c0be72be218b41c608b7fe7c5bb630736c71": { + "name": "ConstitutionDAO", + "address": "0x7a58c0be72be218b41c608b7fe7c5bb630736c71", + "token": { + "decimals": 18, + "symbol": "PEOPLE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PEOPLE.svg" + }, + "0xc9bc48c72154ef3e5425641a3c747242112a46af": { + "name": "ARAI token contract", + "address": "0xc9bc48c72154ef3e5425641a3c747242112a46af", + "token": { + "decimals": 18, + "symbol": "ARAI" + }, + "isSC": {} + }, + "0x5c872500c00565505f3624ab435c222e558e9ff8": { + "name": "COT token contract", + "address": "0x5c872500c00565505f3624ab435c222e558e9ff8", + "token": { + "decimals": 18, + "symbol": "COT" + }, + "isSC": {} + }, + "0x3472a5a71965499acd81997a54bba8d852c6e53d": { + "name": "BADGER", + "address": "0x3472a5a71965499acd81997a54bba8d852c6e53d", + "token": { + "decimals": 18, + "symbol": "BADGER" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/badger.svg" + }, + "0xdd2e93924bdd4e20c3cf4a8736e5955224fa450e": { + "name": "FOHO token contract", + "address": "0xdd2e93924bdd4e20c3cf4a8736e5955224fa450e", + "token": { + "decimals": 8, + "symbol": "FOHO" + }, + "isSC": {} + }, + "0xa849cd6239906f23b63ba34441b73a5c6eba8a00": { + "name": "HASH token contract", + "address": "0xa849cd6239906f23b63ba34441b73a5c6eba8a00", + "token": { + "decimals": 18, + "symbol": "HASH" + }, + "isSC": {} + }, + "0x24fcfc492c1393274b6bcd568ac9e225bec93584": { + "name": "MAVIA token contract", + "address": "0x24fcfc492c1393274b6bcd568ac9e225bec93584", + "token": { + "decimals": 18, + "symbol": "MAVIA" + }, + "isSC": {} + }, + "0x6a4f9a1372235c3fea4fb07170a635b26417382b": { + "name": "ALICE token contract", + "address": "0x6a4f9a1372235c3fea4fb07170a635b26417382b", + "token": { + "decimals": 18, + "symbol": "ALICE" + }, + "isSC": {} + }, + "0x40d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817": { + "name": "GOLD token contract", + "address": "0x40d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817", + "token": { + "decimals": 18, + "symbol": "GOLD" + }, + "isSC": {} + }, + "0x7c28310cc0b8d898c57b93913098e74a3ba23228": { + "name": "PCE token contract", + "address": "0x7c28310cc0b8d898c57b93913098e74a3ba23228", + "token": { + "decimals": 18, + "symbol": "PCE" + }, + "isSC": {} + }, + "0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7": { + "name": "AKRO token contract", + "address": "0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7", + "token": { + "decimals": 18, + "symbol": "AKRO" + }, + "isSC": {} + }, + "0xca0e7269600d353f70b14ad118a49575455c0f2f": { + "name": "AMLT", + "address": "0xca0e7269600d353f70b14ad118a49575455c0f2f", + "token": { + "decimals": 18, + "symbol": "AMLT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/amlt.png" + }, + "0x5faa989af96af85384b8a938c2ede4a7378d9875": { + "name": "GAL token contract", + "address": "0x5faa989af96af85384b8a938c2ede4a7378d9875", + "token": { + "decimals": 18, + "symbol": "GAL" + }, + "isSC": {} + }, + "0x6ae2a128cd07d672164ca9f2712ea737d198dd41": { + "name": "GOAT token contract", + "address": "0x6ae2a128cd07d672164ca9f2712ea737d198dd41", + "token": { + "decimals": 18, + "symbol": "GOAT" + }, + "isSC": {} + }, + "0xc5f0f7b66764f6ec8c8dff7ba683102295e16409": { + "name": "FDUSD token contract", + "address": "0xc5f0f7b66764f6ec8c8dff7ba683102295e16409", + "token": { + "decimals": 18, + "symbol": "FDUSD" + }, + "isSC": {} + }, + "0x4db26817c88a57d2ef84cfd90168f535ee83bda9": { + "name": "HIAZUKI token contract", + "address": "0x4db26817c88a57d2ef84cfd90168f535ee83bda9", + "token": { + "decimals": 18, + "symbol": "HIAZUKI" + }, + "isSC": {} + }, + "0x661013bb8d1c95d86d9c85f76e9004561f1bb36f": { + "name": "DRBT token contract", + "address": "0x661013bb8d1c95d86d9c85f76e9004561f1bb36f", + "token": { + "decimals": 18, + "symbol": "DRBT" + }, + "isSC": {} + }, + "0x50d1c8e131dca8b9226c0a0f78947557497374b3": { + "name": "BRIDGE token contract", + "address": "0x50d1c8e131dca8b9226c0a0f78947557497374b3", + "token": { + "decimals": 9, + "symbol": "BRIDGE" + }, + "isSC": {} + }, + "0xdd69db25f6d620a7bad3023c5d32761d353d3de9": { + "name": "GETH token contract", + "address": "0xdd69db25f6d620a7bad3023c5d32761d353d3de9", + "token": { + "decimals": 18, + "symbol": "GETH" + }, + "isSC": {} + }, + "0x43a8f41644a3f07818a43455b975d940ce16a3fa": { + "name": "FREN token contract", + "address": "0x43a8f41644a3f07818a43455b975d940ce16a3fa", + "token": { + "decimals": 18, + "symbol": "FREN" + }, + "isSC": {} + }, + "0x2a79324c19ef2b89ea98b23bc669b7e7c9f8a517": { + "name": "WAXP token contract", + "address": "0x2a79324c19ef2b89ea98b23bc669b7e7c9f8a517", + "token": { + "decimals": 8, + "symbol": "WAXP" + }, + "isSC": {} + }, + "0xdf574c24545e5ffecb9a659c229253d4111d87e1": { + "name": "HUSD", + "address": "0xdf574c24545e5ffecb9a659c229253d4111d87e1", + "token": { + "decimals": 8, + "symbol": "HUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/HUSD.svg" + }, + "0x75858677e27c930fb622759feaffee2b754af07f": { + "name": "SOUL token contract", + "address": "0x75858677e27c930fb622759feaffee2b754af07f", + "token": { + "decimals": 8, + "symbol": "SOUL" + }, + "isSC": {} + }, + "0xa0d69e286b938e21cbf7e51d71f6a4c8918f482f": { + "name": "EUSD token contract", + "address": "0xa0d69e286b938e21cbf7e51d71f6a4c8918f482f", + "token": { + "decimals": 18, + "symbol": "EUSD" + }, + "isSC": {} + }, + "0x50b806c5fe274c07e46b96be8c68d2fd2d9597b4": { + "name": "TUCKER token contract", + "address": "0x50b806c5fe274c07e46b96be8c68d2fd2d9597b4", + "token": { + "decimals": 18, + "symbol": "TUCKER" + }, + "isSC": {} + }, + "0xcbe7142f5c16755d8683ba329efa1abf7b54482d": { + "name": "MVEDA token contract", + "address": "0xcbe7142f5c16755d8683ba329efa1abf7b54482d", + "token": { + "decimals": 8, + "symbol": "MVEDA" + }, + "isSC": {} + }, + "0xc4e8a9d47000ab8e59c7031e311762c68215e467": { + "name": "STARX token contract", + "address": "0xc4e8a9d47000ab8e59c7031e311762c68215e467", + "token": { + "decimals": 18, + "symbol": "STARX" + }, + "isSC": {} + }, + "0x6d56cddd23a693ed3851fa0a5d8c67a8739537c8": { + "name": "SONIC token contract", + "address": "0x6d56cddd23a693ed3851fa0a5d8c67a8739537c8", + "token": { + "decimals": 9, + "symbol": "SONIC" + }, + "isSC": {} + }, + "0x467719ad09025fcc6cf6f8311755809d45a5e5f3": { + "name": "Axelar", + "address": "0x467719ad09025fcc6cf6f8311755809d45a5e5f3", + "token": { + "decimals": 6, + "symbol": "AXL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/axelar.svg" + }, + "0x3007083eaa95497cd6b2b809fb97b6a30bdf53d3": { + "name": "PSYOP token contract", + "address": "0x3007083eaa95497cd6b2b809fb97b6a30bdf53d3", + "token": { + "decimals": 18, + "symbol": "PSYOP" + }, + "isSC": {} + }, + "0x3819f64f282bf135d62168c1e513280daf905e06": { + "name": "HDRN token contract", + "address": "0x3819f64f282bf135d62168c1e513280daf905e06", + "token": { + "decimals": 9, + "symbol": "HDRN" + }, + "isSC": {} + }, + "0xa6ed258e3126be568a5f53ade7b6a1e478e5ef98": { + "name": "XYN token contract", + "address": "0xa6ed258e3126be568a5f53ade7b6a1e478e5ef98", + "token": { + "decimals": 18, + "symbol": "XYN" + }, + "isSC": {} + }, + "0xbc4171f45ef0ef66e76f979df021a34b46dcc81d": { + "name": "DORA token contract", + "address": "0xbc4171f45ef0ef66e76f979df021a34b46dcc81d", + "token": { + "decimals": 18, + "symbol": "DORA" + }, + "isSC": {} + }, + "0xa444ec96ee01bb219a44b285de47bf33c3447ad5": { + "name": "LEOX token contract", + "address": "0xa444ec96ee01bb219a44b285de47bf33c3447ad5", + "token": { + "decimals": 18, + "symbol": "LEOX" + }, + "isSC": {} + }, + "0xd8912c10681d8b21fd3742244f44658dba12264e": { + "name": "Pluton", + "address": "0xd8912c10681d8b21fd3742244f44658dba12264e", + "token": { + "decimals": 18, + "symbol": "PLU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plutus-god.svg" + }, + "0x3e9bc21c9b189c09df3ef1b824798658d5011937": { + "name": "LINA token contract", + "address": "0x3e9bc21c9b189c09df3ef1b824798658d5011937", + "token": { + "decimals": 18, + "symbol": "LINA" + }, + "isSC": {} + }, + "0x5b502e3796385e1e9755d7043b9c945c3accec9c": { + "name": "AKNC token contract", + "address": "0x5b502e3796385e1e9755d7043b9c945c3accec9c", + "token": { + "decimals": 18, + "symbol": "AKNC" + }, + "isSC": {} + }, + "0xe340b25fe32b1011616bb8ec495a4d503e322177": { + "name": "AAMMUNIDAIUSDC token contract", + "address": "0xe340b25fe32b1011616bb8ec495a4d503e322177", + "token": { + "decimals": 18, + "symbol": "AAMMUNIDAIUSDC" + }, + "isSC": {} + }, + "0x228ba514309ffdf03a81a205a6d040e429d6e80c": { + "name": "GSC token contract", + "address": "0x228ba514309ffdf03a81a205a6d040e429d6e80c", + "token": { + "decimals": 18, + "symbol": "GSC" + }, + "isSC": {} + }, + "0x5c1d9aa868a30795f92fae903edc9eff269044bf": { + "name": "CNG token contract", + "address": "0x5c1d9aa868a30795f92fae903edc9eff269044bf", + "token": { + "decimals": 18, + "symbol": "CNG" + }, + "isSC": {} + }, + "0x0888fd2960ddf57cfb561b59d73dd2b9524f6a26": { + "name": "MIKAWA token contract", + "address": "0x0888fd2960ddf57cfb561b59d73dd2b9524f6a26", + "token": { + "decimals": 9, + "symbol": "MIKAWA" + }, + "isSC": {} + }, + "0x586ee5df24c5a426e42ed7ea6e3eb0f00a4a2256": { + "name": "AMB token contract", + "address": "0x586ee5df24c5a426e42ed7ea6e3eb0f00a4a2256", + "token": { + "decimals": 18, + "symbol": "AMB" + }, + "isSC": {} + }, + "0x7deb5e830be29f91e298ba5ff1356bb7f8146998": { + "name": "AMKR token contract", + "address": "0x7deb5e830be29f91e298ba5ff1356bb7f8146998", + "token": { + "decimals": 18, + "symbol": "AMKR" + }, + "isSC": {} + }, + "0x60158131416f5e53d55d73a11be2e203cb26abcc": { + "name": "EON token contract", + "address": "0x60158131416f5e53d55d73a11be2e203cb26abcc", + "token": { + "decimals": 8, + "symbol": "EON" + }, + "isSC": {} + }, + "0x21413c119b0c11c5d96ae1bd328917bc5c8ed67e": { + "name": "GENE token contract", + "address": "0x21413c119b0c11c5d96ae1bd328917bc5c8ed67e", + "token": { + "decimals": 18, + "symbol": "GENE" + }, + "isSC": {} + }, + "0x1cdd2eab61112697626f7b4bb0e23da4febf7b7c": { + "name": "USDTSO token contract", + "address": "0x1cdd2eab61112697626f7b4bb0e23da4febf7b7c", + "token": { + "decimals": 6, + "symbol": "USDTSO" + }, + "isSC": {} + }, + "0x881ba05de1e78f549cc63a8f6cabb1d4ad32250d": { + "name": "00", + "address": "0x881ba05de1e78f549cc63a8f6cabb1d4ad32250d", + "token": { + "decimals": 18, + "symbol": "00" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/00.svg" + }, + "0x4b9278b94a1112cad404048903b8d343a810b07e": { + "name": "Hifi Finance", + "address": "0x4b9278b94a1112cad404048903b8d343a810b07e", + "token": { + "decimals": 18, + "symbol": "HIFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hifi.svg" + }, + "0xd4568d313fa2d5c6eba37c9f30f6fb8d1c552ddd": { + "name": "LDY token contract", + "address": "0xd4568d313fa2d5c6eba37c9f30f6fb8d1c552ddd", + "token": { + "decimals": 18, + "symbol": "LDY" + }, + "isSC": {} + }, + "0xfd4ca4a692f14d88af3e7ae13cf00d5095213b25": { + "name": "WSKR token contract", + "address": "0xfd4ca4a692f14d88af3e7ae13cf00d5095213b25", + "token": { + "decimals": 18, + "symbol": "WSKR" + }, + "isSC": {} + }, + "0xe453c3409f8ad2b1fe1ed08e189634d359705a5b": { + "name": "DGI token contract", + "address": "0xe453c3409f8ad2b1fe1ed08e189634d359705a5b", + "token": { + "decimals": 18, + "symbol": "DGI" + }, + "isSC": {} + }, + "0x0b4bdc478791897274652dc15ef5c135cae61e60": { + "name": "DAX token contract", + "address": "0x0b4bdc478791897274652dc15ef5c135cae61e60", + "token": { + "decimals": 18, + "symbol": "DAX" + }, + "isSC": {} + }, + "0x038a68ff68c393373ec894015816e33ad41bd564": { + "name": "GLCH token contract", + "address": "0x038a68ff68c393373ec894015816e33ad41bd564", + "token": { + "decimals": 18, + "symbol": "GLCH" + }, + "isSC": {} + }, + "0x8947da500eb47f82df21143d0c01a29862a8c3c5": { + "name": "THALES token contract", + "address": "0x8947da500eb47f82df21143d0c01a29862a8c3c5", + "token": { + "decimals": 18, + "symbol": "THALES" + }, + "isSC": {} + }, + "0xa92e7c82b11d10716ab534051b271d2f6aef7df5": { + "name": "ARA token contract", + "address": "0xa92e7c82b11d10716ab534051b271d2f6aef7df5", + "token": { + "decimals": 18, + "symbol": "ARA" + }, + "isSC": {} + }, + "0x6e5970dbd6fc7eb1f29c6d2edf2bc4c36124c0c1": { + "name": "TRADE token contract", + "address": "0x6e5970dbd6fc7eb1f29c6d2edf2bc4c36124c0c1", + "token": { + "decimals": 18, + "symbol": "TRADE" + }, + "isSC": {} + }, + "0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4": { + "name": "Route", + "address": "0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4", + "token": { + "decimals": 18, + "symbol": "ROUTE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/route.svg" + }, + "0x182c00807f2d4904d02d5e0d179600ff6a3ae67c": { + "name": "BTEX token contract", + "address": "0x182c00807f2d4904d02d5e0d179600ff6a3ae67c", + "token": { + "decimals": 18, + "symbol": "BTEX" + }, + "isSC": {} + }, + "0x6c5ba91642f10282b576d91922ae6448c9d52f4e": { + "name": "PHA token contract", + "address": "0x6c5ba91642f10282b576d91922ae6448c9d52f4e", + "token": { + "decimals": 18, + "symbol": "PHA" + }, + "isSC": {} + }, + "0xbaac2b4491727d78d2b78815144570b9f2fe8899": { + "name": "DOG token contract", + "address": "0xbaac2b4491727d78d2b78815144570b9f2fe8899", + "token": { + "decimals": 18, + "symbol": "DOG" + }, + "isSC": {} + }, + "0xfae103dc9cf190ed75350761e95403b7b8afa6c0": { + "name": "RSWETH token contract", + "address": "0xfae103dc9cf190ed75350761e95403b7b8afa6c0", + "token": { + "decimals": 18, + "symbol": "RSWETH" + }, + "isSC": {} + }, + "0x8d75959f1e61ec2571aa72798237101f084de63a": { + "name": "SUB token contract", + "address": "0x8d75959f1e61ec2571aa72798237101f084de63a", + "token": { + "decimals": 18, + "symbol": "SUB" + }, + "isSC": {} + }, + "0x7ca5af5ba3472af6049f63c1abc324475d44efc1": { + "name": "KNDX token contract", + "address": "0x7ca5af5ba3472af6049f63c1abc324475d44efc1", + "token": { + "decimals": 9, + "symbol": "KNDX" + }, + "isSC": {} + }, + "0xc8bf8bc34874e07f6a0d4abc8be22ba9e372631b": { + "name": "SWGT token contract", + "address": "0xc8bf8bc34874e07f6a0d4abc8be22ba9e372631b", + "token": { + "decimals": 8, + "symbol": "SWGT" + }, + "isSC": {} + }, + "0x0fe0ed7f146cb12e4b9759aff4fa8d34571802ca": { + "name": "PARTY token contract", + "address": "0x0fe0ed7f146cb12e4b9759aff4fa8d34571802ca", + "token": { + "decimals": 18, + "symbol": "PARTY" + }, + "isSC": {} + }, + "0xa3d59c6d24f428dcfedc09724869e7af4d281fdd": { + "name": "DEV token contract", + "address": "0xa3d59c6d24f428dcfedc09724869e7af4d281fdd", + "token": { + "decimals": 6, + "symbol": "DEV" + }, + "isSC": {} + }, + "0x4c5cb5d87709387f8821709f7a6664f00dcf0c93": { + "name": "RAFT token contract", + "address": "0x4c5cb5d87709387f8821709f7a6664f00dcf0c93", + "token": { + "decimals": 18, + "symbol": "RAFT" + }, + "isSC": {} + }, + "0x0d438f3b5175bebc262bf23753c1e53d03432bde": { + "name": "WNXM token contract", + "address": "0x0d438f3b5175bebc262bf23753c1e53d03432bde", + "token": { + "decimals": 18, + "symbol": "WNXM" + }, + "isSC": {} + }, + "0x17837004ea685690b32dbead02a274ec4333a26a": { + "name": "BEAR token contract", + "address": "0x17837004ea685690b32dbead02a274ec4333a26a", + "token": { + "decimals": 18, + "symbol": "BEAR" + }, + "isSC": {} + }, + "0x9657477ac915f56ca87c253db1320218ec2d5ddd": { + "name": "JNE token contract", + "address": "0x9657477ac915f56ca87c253db1320218ec2d5ddd", + "token": { + "decimals": 18, + "symbol": "JNE" + }, + "isSC": {} + }, + "0x69fa0fee221ad11012bab0fdb45d444d3d2ce71c": { + "name": "XRUNE token contract", + "address": "0x69fa0fee221ad11012bab0fdb45d444d3d2ce71c", + "token": { + "decimals": 18, + "symbol": "XRUNE" + }, + "isSC": {} + }, + "0x70881d5c8a5950ceedf1f1b4b5d4105718642548": { + "name": "BAG token contract", + "address": "0x70881d5c8a5950ceedf1f1b4b5d4105718642548", + "token": { + "decimals": 18, + "symbol": "BAG" + }, + "isSC": {} + }, + "0x1982b2f5814301d4e9a8b0201555376e62f82428": { + "name": "ASTETH token contract", + "address": "0x1982b2f5814301d4e9a8b0201555376e62f82428", + "token": { + "decimals": 18, + "symbol": "ASTETH" + }, + "isSC": {} + }, + "0x4b13006980acb09645131b91d259eaa111eaf5ba": { + "name": "MYC token contract", + "address": "0x4b13006980acb09645131b91d259eaa111eaf5ba", + "token": { + "decimals": 18, + "symbol": "MYC" + }, + "isSC": {} + }, + "0xe063f04f280c60aeca68b38341c2eecbec703ae2": { + "name": "XETH token contract", + "address": "0xe063f04f280c60aeca68b38341c2eecbec703ae2", + "token": { + "decimals": 18, + "symbol": "XETH" + }, + "isSC": {} + }, + "0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d": { + "name": "CTSI token contract", + "address": "0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d", + "token": { + "decimals": 18, + "symbol": "CTSI" + }, + "isSC": {} + }, + "0x4c3bae16c79c30eeb1004fb03c878d89695e3a99": { + "name": "AUTUMN token contract", + "address": "0x4c3bae16c79c30eeb1004fb03c878d89695e3a99", + "token": { + "decimals": 18, + "symbol": "AUTUMN" + }, + "isSC": {} + }, + "0xf6aeaf0fe66cf2ef2e738ba465fb531ffe39b4e2": { + "name": "ATR token contract", + "address": "0xf6aeaf0fe66cf2ef2e738ba465fb531ffe39b4e2", + "token": { + "decimals": 9, + "symbol": "ATR" + }, + "isSC": {} + }, + "0x43415eb6ff9db7e26a15b704e7a3edce97d31c4e": { + "name": "USTB token contract", + "address": "0x43415eb6ff9db7e26a15b704e7a3edce97d31c4e", + "token": { + "decimals": 6, + "symbol": "USTB" + }, + "isSC": {} + }, + "0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa": { + "name": "Mantle Staked Ether", + "address": "0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa", + "token": { + "decimals": 18, + "symbol": "mETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mETH.svg" + }, + "0x1b073382e63411e3bcffe90ac1b9a43fefa1ec6f": { + "name": "BEST token contract", + "address": "0x1b073382e63411e3bcffe90ac1b9a43fefa1ec6f", + "token": { + "decimals": 8, + "symbol": "BEST" + }, + "isSC": {} + }, + "0x8e0e57dcb1ce8d9091df38ec1bfc3b224529754a": { + "name": "CAH token contract", + "address": "0x8e0e57dcb1ce8d9091df38ec1bfc3b224529754a", + "token": { + "decimals": 18, + "symbol": "CAH" + }, + "isSC": {} + }, + "0xa35b1b31ce002fbf2058d22f30f95d405200a15b": { + "name": "ETHX token contract", + "address": "0xa35b1b31ce002fbf2058d22f30f95d405200a15b", + "token": { + "decimals": 18, + "symbol": "ETHX" + }, + "isSC": {} + }, + "0x71a28feaee902966dc8d355e7b8aa427d421e7e0": { + "name": "LUNCH token contract", + "address": "0x71a28feaee902966dc8d355e7b8aa427d421e7e0", + "token": { + "decimals": 18, + "symbol": "LUNCH" + }, + "isSC": {} + }, + "0x846c66cf71c43f80403b51fe3906b3599d63336f": { + "name": "PMA token contract", + "address": "0x846c66cf71c43f80403b51fe3906b3599d63336f", + "token": { + "decimals": 18, + "symbol": "PMA" + }, + "isSC": {} + }, + "0x69e37422cb87d963367f73a119c8ce9a4d529b72": { + "name": "ADVT token contract", + "address": "0x69e37422cb87d963367f73a119c8ce9a4d529b72", + "token": { + "decimals": 9, + "symbol": "ADVT" + }, + "isSC": {} + }, + "0xb9f69c75a3b67425474f8bcab9a3626d8b8249e1": { + "name": "TOYBOX token contract", + "address": "0xb9f69c75a3b67425474f8bcab9a3626d8b8249e1", + "token": { + "decimals": 18, + "symbol": "TOYBOX" + }, + "isSC": {} + }, + "0x0b61c4f33bcdef83359ab97673cb5961c6435f4e": { + "name": "EARN token contract", + "address": "0x0b61c4f33bcdef83359ab97673cb5961c6435f4e", + "token": { + "decimals": 18, + "symbol": "EARN" + }, + "isSC": {} + }, + "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3": { + "name": "MIM token contract", + "address": "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", + "token": { + "decimals": 18, + "symbol": "MIM" + }, + "isSC": {} + }, + "0x57b946008913b82e4df85f501cbaed910e58d26c": { + "name": "Marlin", + "address": "0x57b946008913b82e4df85f501cbaed910e58d26c", + "token": { + "decimals": 18, + "symbol": "POND" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/POND.svg" + }, + "0x7ba5273d53d8a964b0a338e25def0c082f5c29d3": { + "name": "WEN token contract", + "address": "0x7ba5273d53d8a964b0a338e25def0c082f5c29d3", + "token": { + "decimals": 8, + "symbol": "WEN" + }, + "isSC": {} + }, + "0xd24946147829deaa935be2ad85a3291dbf109c80": { + "name": "AAMMUSDC token contract", + "address": "0xd24946147829deaa935be2ad85a3291dbf109c80", + "token": { + "decimals": 6, + "symbol": "AAMMUSDC" + }, + "isSC": {} + }, + "0xd7efb00d12c2c13131fd319336fdf952525da2af": { + "name": "Proton", + "address": "0xd7efb00d12c2c13131fd319336fdf952525da2af", + "token": { + "decimals": 4, + "symbol": "XPR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/proton.svg" + }, + "0x6dc6a27822ae2ca3a47da39a2f2bbd525dd693f8": { + "name": "CYDOGE token contract", + "address": "0x6dc6a27822ae2ca3a47da39a2f2bbd525dd693f8", + "token": { + "decimals": 18, + "symbol": "CYDOGE" + }, + "isSC": {} + }, + "0x013062189dc3dcc99e9cee714c513033b8d99e3c": { + "name": "INFRA token contract", + "address": "0x013062189dc3dcc99e9cee714c513033b8d99e3c", + "token": { + "decimals": 18, + "symbol": "INFRA" + }, + "isSC": {} + }, + "0xecd48f326e70388d993694de59b4542ce8af7649": { + "name": "TADPOLE token contract", + "address": "0xecd48f326e70388d993694de59b4542ce8af7649", + "token": { + "decimals": 18, + "symbol": "TADPOLE" + }, + "isSC": {} + }, + "0x3f382dbd960e3a9bbceae22651e88158d2791550": { + "name": "GHST token contract", + "address": "0x3f382dbd960e3a9bbceae22651e88158d2791550", + "token": { + "decimals": 18, + "symbol": "GHST" + }, + "isSC": {} + }, + "0x4f604735c1cf31399c6e711d5962b2b3e0225ad3": { + "name": "USDGLO token contract", + "address": "0x4f604735c1cf31399c6e711d5962b2b3e0225ad3", + "token": { + "decimals": 18, + "symbol": "USDGLO" + }, + "isSC": {} + }, + "0x68b429161ec09a6c1d65ba70727ab1faa5bc4026": { + "name": "ODOGE token contract", + "address": "0x68b429161ec09a6c1d65ba70727ab1faa5bc4026", + "token": { + "decimals": 18, + "symbol": "ODOGE" + }, + "isSC": {} + }, + "0x41ea5d41eeacc2d5c4072260945118a13bb7ebce": { + "name": "CRE token contract", + "address": "0x41ea5d41eeacc2d5c4072260945118a13bb7ebce", + "token": { + "decimals": 18, + "symbol": "CRE" + }, + "isSC": {} + }, + "0x24e3794605c84e580eea4972738d633e8a7127c8": { + "name": "KTLYO token contract", + "address": "0x24e3794605c84e580eea4972738d633e8a7127c8", + "token": { + "decimals": 18, + "symbol": "KTLYO" + }, + "isSC": {} + }, + "0xd289ea09aeece390629e9414d41b4d9d9bf43fd9": { + "name": "AITEK token contract", + "address": "0xd289ea09aeece390629e9414d41b4d9d9bf43fd9", + "token": { + "decimals": 18, + "symbol": "AITEK" + }, + "isSC": {} + }, + "0x7dedbce5a2e31e4c75f87fea60bf796c17718715": { + "name": "PNP token contract", + "address": "0x7dedbce5a2e31e4c75f87fea60bf796c17718715", + "token": { + "decimals": 18, + "symbol": "PNP" + }, + "isSC": {} + }, + "0x4341a2c412b1b7bee50616de6e6e1172719c6351": { + "name": "GUPPI token contract", + "address": "0x4341a2c412b1b7bee50616de6e6e1172719c6351", + "token": { + "decimals": 18, + "symbol": "GUPPI" + }, + "isSC": {} + }, + "0x8df4197669cf7af9fd29d768c932251a0c2e3e94": { + "name": "NINJA token contract", + "address": "0x8df4197669cf7af9fd29d768c932251a0c2e3e94", + "token": { + "decimals": 18, + "symbol": "NINJA" + }, + "isSC": {} + }, + "0x58083b54013631bacc0bbb6d4efa543fee1d9ce0": { + "name": "FRC token contract", + "address": "0x58083b54013631bacc0bbb6d4efa543fee1d9ce0", + "token": { + "decimals": 18, + "symbol": "FRC" + }, + "isSC": {} + }, + "0xedc1004886d010751f74ec0ad223819f9f3b1910": { + "name": "AGN token contract", + "address": "0xedc1004886d010751f74ec0ad223819f9f3b1910", + "token": { + "decimals": 18, + "symbol": "AGN" + }, + "isSC": {} + }, + "0xbe33f57f41a20b2f00dec91dcc1169597f36221f": { + "name": "RUG token contract", + "address": "0xbe33f57f41a20b2f00dec91dcc1169597f36221f", + "token": { + "decimals": 18, + "symbol": "RUG" + }, + "isSC": {} + }, + "0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e": { + "name": "SWFTC token contract", + "address": "0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e", + "token": { + "decimals": 8, + "symbol": "SWFTC" + }, + "isSC": {} + }, + "0xdd974d5c2e2928dea5f71b9825b8b646686bd200": { + "name": "Kyber Network Crystal", + "address": "0xdd974d5c2e2928dea5f71b9825b8b646686bd200", + "token": { + "decimals": 18, + "symbol": "KNC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kyber.svg" + }, + "0x712db54daa836b53ef1ecbb9c6ba3b9efb073f40": { + "name": "AENJ token contract", + "address": "0x712db54daa836b53ef1ecbb9c6ba3b9efb073f40", + "token": { + "decimals": 18, + "symbol": "AENJ" + }, + "isSC": {} + }, + "0x046eee2cc3188071c02bfc1745a6b17c656e3f3d": { + "name": "RLB token contract", + "address": "0x046eee2cc3188071c02bfc1745a6b17c656e3f3d", + "token": { + "decimals": 18, + "symbol": "RLB" + }, + "isSC": {} + }, + "0xb9d7cb55f463405cdfbe4e90a6d2df01c2b92bf1": { + "name": "Aave UNI", + "address": "0xb9d7cb55f463405cdfbe4e90a6d2df01c2b92bf1", + "token": { + "decimals": 18, + "symbol": "aUNI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aUNI.svg" + }, + "0x196c81385bc536467433014042788eb707703934": { + "name": "CTASK token contract", + "address": "0x196c81385bc536467433014042788eb707703934", + "token": { + "decimals": 18, + "symbol": "CTASK" + }, + "isSC": {} + }, + "0x6d57b2e05f26c26b549231c866bdd39779e4a488": { + "name": "VNXAU token contract", + "address": "0x6d57b2e05f26c26b549231c866bdd39779e4a488", + "token": { + "decimals": 18, + "symbol": "VNXAU" + }, + "isSC": {} + }, + "0x000000000075f13bcf2e6652e84821e8b544f6f9": { + "name": "SIG token contract", + "address": "0x000000000075f13bcf2e6652e84821e8b544f6f9", + "token": { + "decimals": 18, + "symbol": "SIG" + }, + "isSC": {} + }, + "0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3": { + "name": "ONDO token contract", + "address": "0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3", + "token": { + "decimals": 18, + "symbol": "ONDO" + }, + "isSC": {} + }, + "0x8c7ac134ed985367eadc6f727d79e8295e11435c": { + "name": "KEKEC token contract", + "address": "0x8c7ac134ed985367eadc6f727d79e8295e11435c", + "token": { + "decimals": 18, + "symbol": "KEKEC" + }, + "isSC": {} + }, + "0x72108a8cc3254813c6be2f1b77be53e185abfdd9": { + "name": "ES token contract", + "address": "0x72108a8cc3254813c6be2f1b77be53e185abfdd9", + "token": { + "decimals": 18, + "symbol": "ES" + }, + "isSC": {} + }, + "0x9dfad1b7102d46b1b197b90095b5c4e9f5845bba": { + "name": "BOTTO token contract", + "address": "0x9dfad1b7102d46b1b197b90095b5c4e9f5845bba", + "token": { + "decimals": 18, + "symbol": "BOTTO" + }, + "isSC": {} + }, + "0x662b67d00a13faf93254714dd601f5ed49ef2f51": { + "name": "ORC token contract", + "address": "0x662b67d00a13faf93254714dd601f5ed49ef2f51", + "token": { + "decimals": 18, + "symbol": "ORC" + }, + "isSC": {} + }, + "0x641927e970222b10b2e8cdbc96b1b4f427316f16": { + "name": "MEEB token contract", + "address": "0x641927e970222b10b2e8cdbc96b1b4f427316f16", + "token": { + "decimals": 18, + "symbol": "MEEB" + }, + "isSC": {} + }, + "0x66fd97a78d8854fec445cd1c80a07896b0b4851f": { + "name": "Lunch Money", + "address": "0x66fd97a78d8854fec445cd1c80a07896b0b4851f", + "token": { + "decimals": 18, + "symbol": "LMY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LMY.svg" + }, + "0x77571a64342667f7818520ef004b2b91f47a266b": { + "name": "SNM token contract", + "address": "0x77571a64342667f7818520ef004b2b91f47a266b", + "token": { + "decimals": 18, + "symbol": "SNM" + }, + "isSC": {} + }, + "0x9e9fbde7c7a83c43913bddc8779158f1368f0413": { + "name": "PANDORA token contract", + "address": "0x9e9fbde7c7a83c43913bddc8779158f1368f0413", + "token": { + "decimals": 18, + "symbol": "PANDORA" + }, + "isSC": {} + }, + "0x2c7f442aab99d5e18cfae2291c507c0b5f3c1eb5": { + "name": "KEKO token contract", + "address": "0x2c7f442aab99d5e18cfae2291c507c0b5f3c1eb5", + "token": { + "decimals": 18, + "symbol": "KEKO" + }, + "isSC": {} + }, + "0x274e7eb07b485cfde53d02270555213447570ac6": { + "name": "GOV token contract", + "address": "0x274e7eb07b485cfde53d02270555213447570ac6", + "token": { + "decimals": 18, + "symbol": "GOV" + }, + "isSC": {} + }, + "0x525a8f6f3ba4752868cde25164382bfbae3990e1": { + "name": "NYM token contract", + "address": "0x525a8f6f3ba4752868cde25164382bfbae3990e1", + "token": { + "decimals": 6, + "symbol": "NYM" + }, + "isSC": {} + }, + "0x8642a849d0dcb7a15a974794668adcfbe4794b56": { + "name": "PROS token contract", + "address": "0x8642a849d0dcb7a15a974794668adcfbe4794b56", + "token": { + "decimals": 18, + "symbol": "PROS" + }, + "isSC": {} + }, + "0x0022228a2cc5e7ef0274a7baa600d44da5ab5776": { + "name": "Staked USDA", + "address": "0x0022228a2cc5e7ef0274a7baa600d44da5ab5776", + "token": { + "decimals": 18, + "symbol": "stUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stUSD.svg" + }, + "0x42a7797351dfd281a80807196c8508eb70bb2af9": { + "name": "AIS token contract", + "address": "0x42a7797351dfd281a80807196c8508eb70bb2af9", + "token": { + "decimals": 18, + "symbol": "AIS" + }, + "isSC": {} + }, + "0xb281d84989c06e2a6ccdc5ea7bf1663c79a1c31a": { + "name": "ZETA token contract", + "address": "0xb281d84989c06e2a6ccdc5ea7bf1663c79a1c31a", + "token": { + "decimals": 18, + "symbol": "ZETA" + }, + "isSC": {} + }, + "0x3a1bda28adb5b0a812a7cf10a1950c920f79bcd3": { + "name": "FLP token contract", + "address": "0x3a1bda28adb5b0a812a7cf10a1950c920f79bcd3", + "token": { + "decimals": 18, + "symbol": "FLP" + }, + "isSC": {} + }, + "0x6c4c193bff0a117f0c2b516802abba961a1eeb12": { + "name": "PAPA token contract", + "address": "0x6c4c193bff0a117f0c2b516802abba961a1eeb12", + "token": { + "decimals": 18, + "symbol": "PAPA" + }, + "isSC": {} + }, + "0xe4b91faf8810f8895772e7ca065d4cb889120f94": { + "name": "BOXFEE token contract", + "address": "0xe4b91faf8810f8895772e7ca065d4cb889120f94", + "token": { + "decimals": 18, + "symbol": "BOXFEE" + }, + "isSC": {} + }, + "0xa3d4bee77b05d4a0c943877558ce21a763c4fa29": { + "name": "ROOT token contract", + "address": "0xa3d4bee77b05d4a0c943877558ce21a763c4fa29", + "token": { + "decimals": 6, + "symbol": "ROOT" + }, + "isSC": {} + }, + "0xa1e770be76bde604f8ebb66f640250a787b9422b": { + "name": "DEB token contract", + "address": "0xa1e770be76bde604f8ebb66f640250a787b9422b", + "token": { + "decimals": 18, + "symbol": "DEB" + }, + "isSC": {} + }, + "0x2c9aceb63181cd08a093d052ec041e191f229692": { + "name": "ANB token contract", + "address": "0x2c9aceb63181cd08a093d052ec041e191f229692", + "token": { + "decimals": 18, + "symbol": "ANB" + }, + "isSC": {} + }, + "0x1b5e16c5b20fb5ee87c61fe9afe735cca3b21a65": { + "name": "IC21 token contract", + "address": "0x1b5e16c5b20fb5ee87c61fe9afe735cca3b21a65", + "token": { + "decimals": 18, + "symbol": "IC21" + }, + "isSC": {} + }, + "0xfe39c384d702914127a005523f9915addb9bd59b": { + "name": "HPO token contract", + "address": "0xfe39c384d702914127a005523f9915addb9bd59b", + "token": { + "decimals": 18, + "symbol": "HPO" + }, + "isSC": {} + }, + "0xb0e99627bc29adef1178f16117bf495351e81997": { + "name": "DXC token contract", + "address": "0xb0e99627bc29adef1178f16117bf495351e81997", + "token": { + "decimals": 18, + "symbol": "DXC" + }, + "isSC": {} + }, + "0x30d0e4e6fb0330e45a13e1e06260837f27015de5": { + "name": "YOD token contract", + "address": "0x30d0e4e6fb0330e45a13e1e06260837f27015de5", + "token": { + "decimals": 18, + "symbol": "YOD" + }, + "isSC": {} + }, + "0x00282fd551d03dc033256c4bf119532e8c735d8a": { + "name": "BIAO token contract", + "address": "0x00282fd551d03dc033256c4bf119532e8c735d8a", + "token": { + "decimals": 2, + "symbol": "BIAO" + }, + "isSC": {} + }, + "0x29de166064e1f9467b70bd561e516564a5a9ba3c": { + "name": "POVCHAIN token contract", + "address": "0x29de166064e1f9467b70bd561e516564a5a9ba3c", + "token": { + "decimals": 9, + "symbol": "POVCHAIN" + }, + "isSC": {} + }, + "0x8a0cdfab62ed35b836dc0633482798421c81b3ec": { + "name": "SPHRI token contract", + "address": "0x8a0cdfab62ed35b836dc0633482798421c81b3ec", + "token": { + "decimals": 18, + "symbol": "SPHRI" + }, + "isSC": {} + }, + "0x728f30fa2f100742c7949d1961804fa8e0b1387d": { + "name": "GHX token contract", + "address": "0x728f30fa2f100742c7949d1961804fa8e0b1387d", + "token": { + "decimals": 18, + "symbol": "GHX" + }, + "isSC": {} + }, + "0x414cbf31c62d99515bfd66497b495a585b52f703": { + "name": "CHAP token contract", + "address": "0x414cbf31c62d99515bfd66497b495a585b52f703", + "token": { + "decimals": 0, + "symbol": "CHAP" + }, + "isSC": {} + }, + "0x73d7c860998ca3c01ce8c808f5577d94d545d1b4": { + "name": "IXS token contract", + "address": "0x73d7c860998ca3c01ce8c808f5577d94d545d1b4", + "token": { + "decimals": 18, + "symbol": "IXS" + }, + "isSC": {} + }, + "0xb478c6245e3d85d6ec3486b62ea872128d562541": { + "name": "LOOT token contract", + "address": "0xb478c6245e3d85d6ec3486b62ea872128d562541", + "token": { + "decimals": 18, + "symbol": "LOOT" + }, + "isSC": {} + }, + "0x80d55c03180349fff4a229102f62328220a96444": { + "name": "OPUL token contract", + "address": "0x80d55c03180349fff4a229102f62328220a96444", + "token": { + "decimals": 18, + "symbol": "OPUL" + }, + "isSC": {} + }, + "0x6923f9b683111dcc0e20124e9a031deeae5dad93": { + "name": "HUB token contract", + "address": "0x6923f9b683111dcc0e20124e9a031deeae5dad93", + "token": { + "decimals": 18, + "symbol": "HUB" + }, + "isSC": {} + }, + "0x3f68e7b44e9bcb486c2feadb7a2289d9cdfc9088": { + "name": "ICONS token contract", + "address": "0x3f68e7b44e9bcb486c2feadb7a2289d9cdfc9088", + "token": { + "decimals": 18, + "symbol": "ICONS" + }, + "isSC": {} + }, + "0xd2af830e8cbdfed6cc11bab697bb25496ed6fa62": { + "name": "WOUSD token contract", + "address": "0xd2af830e8cbdfed6cc11bab697bb25496ed6fa62", + "token": { + "decimals": 18, + "symbol": "WOUSD" + }, + "isSC": {} + }, + "0x38a94e92a19e970c144ded0b2dd47278ca11cc1f": { + "name": "F9 token contract", + "address": "0x38a94e92a19e970c144ded0b2dd47278ca11cc1f", + "token": { + "decimals": 9, + "symbol": "F9" + }, + "isSC": {} + }, + "0x07bac35846e5ed502aa91adf6a9e7aa210f2dcbe": { + "name": "EROWAN token contract", + "address": "0x07bac35846e5ed502aa91adf6a9e7aa210f2dcbe", + "token": { + "decimals": 18, + "symbol": "EROWAN" + }, + "isSC": {} + }, + "0x16756ec1deb89a2106c35e0b586a799d0a61837d": { + "name": "CHEDDA token contract", + "address": "0x16756ec1deb89a2106c35e0b586a799d0a61837d", + "token": { + "decimals": 18, + "symbol": "CHEDDA" + }, + "isSC": {} + }, + "0xa34ee6108fe427f91edce0d6520d9fec0e64f67b": { + "name": "PLPC token contract", + "address": "0xa34ee6108fe427f91edce0d6520d9fec0e64f67b", + "token": { + "decimals": 9, + "symbol": "PLPC" + }, + "isSC": {} + }, + "0xbcca60bb61934080951369a648fb03df4f96263c": { + "name": "Aave USDC", + "address": "0xbcca60bb61934080951369a648fb03df4f96263c", + "token": { + "decimals": 6, + "symbol": "aUSDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aUSDC.svg" + }, + "0x7ddc52c4de30e94be3a6a0a2b259b2850f421989": { + "name": "GMT token contract", + "address": "0x7ddc52c4de30e94be3a6a0a2b259b2850f421989", + "token": { + "decimals": 18, + "symbol": "GMT" + }, + "isSC": {} + }, + "0x39c6b3e42d6a679d7d776778fe880bc9487c2eda": { + "name": "Aave KNC", + "address": "0x39c6b3e42d6a679d7d776778fe880bc9487c2eda", + "token": { + "decimals": 18, + "symbol": "aKNC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aKNC.svg" + }, + "0xec19caef9c046f5f87a497154766742ab9c90820": { + "name": "UY00TS token contract", + "address": "0xec19caef9c046f5f87a497154766742ab9c90820", + "token": { + "decimals": 18, + "symbol": "UY00TS" + }, + "isSC": {} + }, + "0xbddc20ed7978b7d59ef190962f441cd18c14e19f": { + "name": "CAGA token contract", + "address": "0xbddc20ed7978b7d59ef190962f441cd18c14e19f", + "token": { + "decimals": 18, + "symbol": "CAGA" + }, + "isSC": {} + }, + "0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9": { + "name": "FTT token contract", + "address": "0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9", + "token": { + "decimals": 18, + "symbol": "FTT" + }, + "isSC": {} + }, + "0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84": { + "name": "ALINK token contract", + "address": "0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84", + "token": { + "decimals": 18, + "symbol": "ALINK" + }, + "isSC": {} + }, + "0x5ba19d656b65f1684cfea4af428c23b9f3628f97": { + "name": "AAG token contract", + "address": "0x5ba19d656b65f1684cfea4af428c23b9f3628f97", + "token": { + "decimals": 18, + "symbol": "AAG" + }, + "isSC": {} + }, + "0xae36155a55f04a696b8362777620027882b31db5": { + "name": "KISHIMOTO token contract", + "address": "0xae36155a55f04a696b8362777620027882b31db5", + "token": { + "decimals": 9, + "symbol": "KISHIMOTO" + }, + "isSC": {} + }, + "0x8b79656fc38a04044e495e22fad747126ca305c4": { + "name": "AgaveCoin", + "address": "0x8b79656fc38a04044e495e22fad747126ca305c4", + "token": { + "decimals": 18, + "symbol": "AGVC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/agvc.svg" + }, + "0x1a403e1c96792dfedb8232cf56400eb72ab95acb": { + "name": "SML token contract", + "address": "0x1a403e1c96792dfedb8232cf56400eb72ab95acb", + "token": { + "decimals": 18, + "symbol": "SML" + }, + "isSC": {} + }, + "0xc3cc3076cb304494775b3193ef1aa080ba6bf962": { + "name": "ODGN token contract", + "address": "0xc3cc3076cb304494775b3193ef1aa080ba6bf962", + "token": { + "decimals": 18, + "symbol": "ODGN" + }, + "isSC": {} + }, + "0x21b8bfbbefc9e2b9a994871ecd742a5132b98aed": { + "name": "CRE token contract", + "address": "0x21b8bfbbefc9e2b9a994871ecd742a5132b98aed", + "token": { + "decimals": 18, + "symbol": "CRE" + }, + "isSC": {} + }, + "0x6cd7fc3118a8ffa40af0f99f3cbda54b0c6d4d1d": { + "name": "UMIL token contract", + "address": "0x6cd7fc3118a8ffa40af0f99f3cbda54b0c6d4d1d", + "token": { + "decimals": 18, + "symbol": "UMIL" + }, + "isSC": {} + }, + "0x1a7e4e63778b4f12a199c062f3efdd288afcbce8": { + "name": "EURA", + "address": "0x1a7e4e63778b4f12a199c062f3efdd288afcbce8", + "token": { + "decimals": 18, + "symbol": "EURA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/EURA.svg" + }, + "0x2ebd53d035150f328bd754d6dc66b99b0edb89aa": { + "name": "MET token contract", + "address": "0x2ebd53d035150f328bd754d6dc66b99b0edb89aa", + "token": { + "decimals": 18, + "symbol": "MET" + }, + "isSC": {} + }, + "0x431d5dff03120afa4bdf332c61a6e1766ef37bdb": { + "name": "JPYC token contract", + "address": "0x431d5dff03120afa4bdf332c61a6e1766ef37bdb", + "token": { + "decimals": 18, + "symbol": "JPYC" + }, + "isSC": {} + }, + "0x68a47fe1cf42eba4a030a10cd4d6a1031ca3ca0a": { + "name": "TET token contract", + "address": "0x68a47fe1cf42eba4a030a10cd4d6a1031ca3ca0a", + "token": { + "decimals": 8, + "symbol": "TET" + }, + "isSC": {} + }, + "0x1a59eec501745ad6bdfc37558ddacb38ca5a8c48": { + "name": "COSMIC token contract", + "address": "0x1a59eec501745ad6bdfc37558ddacb38ca5a8c48", + "token": { + "decimals": 18, + "symbol": "COSMIC" + }, + "isSC": {} + }, + "0xca9d8ef4ba15ae66347b3d22afe2970b89980f88": { + "name": "INNOVA token contract", + "address": "0xca9d8ef4ba15ae66347b3d22afe2970b89980f88", + "token": { + "decimals": 18, + "symbol": "INNOVA" + }, + "isSC": {} + }, + "0xcb56b52316041a62b6b5d0583dce4a8ae7a3c629": { + "name": "Cigarettes", + "address": "0xcb56b52316041a62b6b5d0583dce4a8ae7a3c629", + "token": { + "decimals": 18, + "symbol": "CIG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/cig.svg" + }, + "0x3e5d9d8a63cc8a88748f229999cf59487e90721e": { + "name": "XMT token contract", + "address": "0x3e5d9d8a63cc8a88748f229999cf59487e90721e", + "token": { + "decimals": 18, + "symbol": "XMT" + }, + "isSC": {} + }, + "0x0262e9374e95b9667b78136c3897cb4e4ef7f0c2": { + "name": "FAKT token contract", + "address": "0x0262e9374e95b9667b78136c3897cb4e4ef7f0c2", + "token": { + "decimals": 18, + "symbol": "FAKT" + }, + "isSC": {} + }, + "0x9f1c9741cb9bcb2adc062f23e2ed90c3eb47cb80": { + "name": "VBUCK token contract", + "address": "0x9f1c9741cb9bcb2adc062f23e2ed90c3eb47cb80", + "token": { + "decimals": 18, + "symbol": "VBUCK" + }, + "isSC": {} + }, + "0xb5c457ddb4ce3312a6c5a2b056a1652bd542a208": { + "name": "ROCK token contract", + "address": "0xb5c457ddb4ce3312a6c5a2b056a1652bd542a208", + "token": { + "decimals": 18, + "symbol": "ROCK" + }, + "isSC": {} + }, + "0xd7b2c1a7f3c67fb0ea57a7ef29bc1f18d7be3195": { + "name": "VMINT token contract", + "address": "0xd7b2c1a7f3c67fb0ea57a7ef29bc1f18d7be3195", + "token": { + "decimals": 18, + "symbol": "VMINT" + }, + "isSC": {} + }, + "0x3ffdde70f128de8a5c8b116142d79889d6d5a551": { + "name": "XLM token contract", + "address": "0x3ffdde70f128de8a5c8b116142d79889d6d5a551", + "token": { + "decimals": 9, + "symbol": "XLM" + }, + "isSC": {} + }, + "0x8a7664e782860e856031d6c31eb3bde721bc362b": { + "name": "REKT token contract", + "address": "0x8a7664e782860e856031d6c31eb3bde721bc362b", + "token": { + "decimals": 18, + "symbol": "REKT" + }, + "isSC": {} + }, + "0x7e9afd25f5ec0eb24d7d4b089ae7ecb9651c8b1f": { + "name": "BAOUSD-LUSD-STABLEP token contract", + "address": "0x7e9afd25f5ec0eb24d7d4b089ae7ecb9651c8b1f", + "token": { + "decimals": 18, + "symbol": "BAOUSD-LUSD-STABLEP" + }, + "isSC": {} + }, + "0x19ae49b9f38dd836317363839a5f6bfbfa7e319a": { + "name": "STC token contract", + "address": "0x19ae49b9f38dd836317363839a5f6bfbfa7e319a", + "token": { + "decimals": 9, + "symbol": "STC" + }, + "isSC": {} + }, + "0xdefb0b264032e4e128b00d02b3fd0aa00331237b": { + "name": "BUDDHA token contract", + "address": "0xdefb0b264032e4e128b00d02b3fd0aa00331237b", + "token": { + "decimals": 18, + "symbol": "BUDDHA" + }, + "isSC": {} + }, + "0xeb986da994e4a118d5956b02d8b7c3c7ce373674": { + "name": "GTH token contract", + "address": "0xeb986da994e4a118d5956b02d8b7c3c7ce373674", + "token": { + "decimals": 18, + "symbol": "GTH" + }, + "isSC": {} + }, + "0x24ec2ca132abf8f6f8a6e24a1b97943e31f256a7": { + "name": "MOOV token contract", + "address": "0x24ec2ca132abf8f6f8a6e24a1b97943e31f256a7", + "token": { + "decimals": 18, + "symbol": "MOOV" + }, + "isSC": {} + }, + "0x12e2b8033420270db2f3b328e32370cb5b2ca134": { + "name": "SFP token contract", + "address": "0x12e2b8033420270db2f3b328e32370cb5b2ca134", + "token": { + "decimals": 18, + "symbol": "SFP" + }, + "isSC": {} + }, + "0xcaeda9650ccd356af7776057a105f9e6ffe68213": { + "name": "LOONG token contract", + "address": "0xcaeda9650ccd356af7776057a105f9e6ffe68213", + "token": { + "decimals": 18, + "symbol": "LOONG" + }, + "isSC": {} + }, + "0xa2fe5e51729be71261bcf42854012827bc44c044": { + "name": "BURN token contract", + "address": "0xa2fe5e51729be71261bcf42854012827bc44c044", + "token": { + "decimals": 18, + "symbol": "BURN" + }, + "isSC": {} + }, + "0x39a9728fb398583154e6cc5e3defa60908f58e2f": { + "name": "BEFY token contract", + "address": "0x39a9728fb398583154e6cc5e3defa60908f58e2f", + "token": { + "decimals": 18, + "symbol": "BEFY" + }, + "isSC": {} + }, + "0xe8b1e79d937c648ce1fe96e6739ddb2714058a18": { + "name": "GTM token contract", + "address": "0xe8b1e79d937c648ce1fe96e6739ddb2714058a18", + "token": { + "decimals": 18, + "symbol": "GTM" + }, + "isSC": {} + }, + "0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5": { + "name": "0X0 token contract", + "address": "0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5", + "token": { + "decimals": 9, + "symbol": "0X0" + }, + "isSC": {} + }, + "0x018008bfb33d285247a21d44e50697654f754e63": { + "name": "ADAI token contract", + "address": "0x018008bfb33d285247a21d44e50697654f754e63", + "token": { + "decimals": 18, + "symbol": "ADAI" + }, + "isSC": {} + }, + "0x423352f2c6e0e72422b69af03aba259310146d90": { + "name": "RMV token contract", + "address": "0x423352f2c6e0e72422b69af03aba259310146d90", + "token": { + "decimals": 18, + "symbol": "RMV" + }, + "isSC": {} + }, + "0xfe5f141bf94fe84bc28ded0ab966c16b17490657": { + "name": "LBA token contract", + "address": "0xfe5f141bf94fe84bc28ded0ab966c16b17490657", + "token": { + "decimals": 18, + "symbol": "LBA" + }, + "isSC": {} + }, + "0xbd356a39bff2cada8e9248532dd879147221cf76": { + "name": "WOM token contract", + "address": "0xbd356a39bff2cada8e9248532dd879147221cf76", + "token": { + "decimals": 18, + "symbol": "WOM" + }, + "isSC": {} + }, + "0xb4357054c3da8d46ed642383f03139ac7f090343": { + "name": "PORT3 token contract", + "address": "0xb4357054c3da8d46ed642383f03139ac7f090343", + "token": { + "decimals": 18, + "symbol": "PORT3" + }, + "isSC": {} + }, + "0x2598c30330d5771ae9f983979209486ae26de875": { + "name": "AI token contract", + "address": "0x2598c30330d5771ae9f983979209486ae26de875", + "token": { + "decimals": 18, + "symbol": "AI" + }, + "isSC": {} + }, + "0x8e0fe2947752be0d5acf73aae77362daf79cb379": { + "name": "NFTD token contract", + "address": "0x8e0fe2947752be0d5acf73aae77362daf79cb379", + "token": { + "decimals": 18, + "symbol": "NFTD" + }, + "isSC": {} + }, + "0x7f280dac515121dcda3eac69eb4c13a52392cace": { + "name": "FNC token contract", + "address": "0x7f280dac515121dcda3eac69eb4c13a52392cace", + "token": { + "decimals": 18, + "symbol": "FNC" + }, + "isSC": {} + }, + "0x30d20208d987713f46dfd34ef128bb16c404d10f": { + "name": "SD token contract", + "address": "0x30d20208d987713f46dfd34ef128bb16c404d10f", + "token": { + "decimals": 18, + "symbol": "SD" + }, + "isSC": {} + }, + "0x5c77bffc54e33ee4ae303a168a4a0e45b238d09c": { + "name": "WORMZ token contract", + "address": "0x5c77bffc54e33ee4ae303a168a4a0e45b238d09c", + "token": { + "decimals": 18, + "symbol": "WORMZ" + }, + "isSC": {} + }, + "0x2d80f5f5328fdcb6eceb7cacf5dd8aedaec94e20": { + "name": "AGA token contract", + "address": "0x2d80f5f5328fdcb6eceb7cacf5dd8aedaec94e20", + "token": { + "decimals": 4, + "symbol": "AGA" + }, + "isSC": {} + }, + "0x0c37bcf456bc661c14d596683325623076d7e283": { + "name": "ARNX token contract", + "address": "0x0c37bcf456bc661c14d596683325623076d7e283", + "token": { + "decimals": 18, + "symbol": "ARNX" + }, + "isSC": {} + }, + "0x8be8b0dde627dd6be9a4b7fcadd04899aabdb2b1": { + "name": "RND token contract", + "address": "0x8be8b0dde627dd6be9a4b7fcadd04899aabdb2b1", + "token": { + "decimals": 6, + "symbol": "RND" + }, + "isSC": {} + }, + "0xa792ff98afd4ccb8d33f2590d0bc9420a062e555": { + "name": "AGF token contract", + "address": "0xa792ff98afd4ccb8d33f2590d0bc9420a062e555", + "token": { + "decimals": 18, + "symbol": "AGF" + }, + "isSC": {} + }, + "0xb59490ab09a0f526cc7305822ac65f2ab12f9723": { + "name": "LIT token contract", + "address": "0xb59490ab09a0f526cc7305822ac65f2ab12f9723", + "token": { + "decimals": 18, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xc775c0c30840cb9f51e21061b054ebf1a00acc29": { + "name": "PSL token contract", + "address": "0xc775c0c30840cb9f51e21061b054ebf1a00acc29", + "token": { + "decimals": 5, + "symbol": "PSL" + }, + "isSC": {} + }, + "0x5fc111f3fa4c6b32eaf65659cfebdeed57234069": { + "name": "0XGAS token contract", + "address": "0x5fc111f3fa4c6b32eaf65659cfebdeed57234069", + "token": { + "decimals": 18, + "symbol": "0XGAS" + }, + "isSC": {} + }, + "0xacb47686b92fdde6d233ec6445c1f8d4d0d59c38": { + "name": "SWIPE token contract", + "address": "0xacb47686b92fdde6d233ec6445c1f8d4d0d59c38", + "token": { + "decimals": 8, + "symbol": "SWIPE" + }, + "isSC": {} + }, + "0x9813037ee2218799597d83d4a5b6f3b6778218d9": { + "name": "BONE token contract", + "address": "0x9813037ee2218799597d83d4a5b6f3b6778218d9", + "token": { + "decimals": 18, + "symbol": "BONE" + }, + "isSC": {} + }, + "0xeeee2a622330e6d2036691e983dee87330588603": { + "name": "ASKO token contract", + "address": "0xeeee2a622330e6d2036691e983dee87330588603", + "token": { + "decimals": 18, + "symbol": "ASKO" + }, + "isSC": {} + }, + "0xed354cae598148846aa9694254c854fc7051163c": { + "name": "SHIDO token contract", + "address": "0xed354cae598148846aa9694254c854fc7051163c", + "token": { + "decimals": 18, + "symbol": "SHIDO" + }, + "isSC": {} + }, + "0x1f0efa15e9cb7ea9596257da63fecc36ba469b30": { + "name": "ANON token contract", + "address": "0x1f0efa15e9cb7ea9596257da63fecc36ba469b30", + "token": { + "decimals": 18, + "symbol": "ANON" + }, + "isSC": {} + }, + "0xe16f2ec94e8a0819eb93022c45e05d582f4e5c15": { + "name": "PCT token contract", + "address": "0xe16f2ec94e8a0819eb93022c45e05d582f4e5c15", + "token": { + "decimals": 18, + "symbol": "PCT" + }, + "isSC": {} + }, + "0xb131f4a55907b10d1f0a50d8ab8fa09ec342cd74": { + "name": "MEME token contract", + "address": "0xb131f4a55907b10d1f0a50d8ab8fa09ec342cd74", + "token": { + "decimals": 18, + "symbol": "MEME" + }, + "isSC": {} + }, + "0x823556202e86763853b40e9cde725f412e294689": { + "name": "ASTO token contract", + "address": "0x823556202e86763853b40e9cde725f412e294689", + "token": { + "decimals": 18, + "symbol": "ASTO" + }, + "isSC": {} + }, + "0x7616113782aadab041d7b10d474f8a0c04eff258": { + "name": "VEE token contract", + "address": "0x7616113782aadab041d7b10d474f8a0c04eff258", + "token": { + "decimals": 18, + "symbol": "VEE" + }, + "isSC": {} + }, + "0xf1dc500fde233a4055e25e5bbf516372bc4f6871": { + "name": "SDL token contract", + "address": "0xf1dc500fde233a4055e25e5bbf516372bc4f6871", + "token": { + "decimals": 18, + "symbol": "SDL" + }, + "isSC": {} + }, + "0x36a17b52b5322846fcf894ee1535c8aa23df6765": { + "name": "UPOTATOZ token contract", + "address": "0x36a17b52b5322846fcf894ee1535c8aa23df6765", + "token": { + "decimals": 18, + "symbol": "UPOTATOZ" + }, + "isSC": {} + }, + "0x244517dc59943e8cdfbd424bdb3262c5f04a1387": { + "name": "FDAI token contract", + "address": "0x244517dc59943e8cdfbd424bdb3262c5f04a1387", + "token": { + "decimals": 6, + "symbol": "FDAI" + }, + "isSC": {} + }, + "0xd0d19f52ad8705e60ff31df75a7aca8f1399a69e": { + "name": "404A token contract", + "address": "0xd0d19f52ad8705e60ff31df75a7aca8f1399a69e", + "token": { + "decimals": 18, + "symbol": "404A" + }, + "isSC": {} + }, + "0x80fb784b7ed66730e8b1dbd9820afd29931aab03": { + "name": "ETHLend Token", + "address": "0x80fb784b7ed66730e8b1dbd9820afd29931aab03", + "token": { + "decimals": 18, + "symbol": "LEND" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/lend.svg" + }, + "0xbededdf2ef49e87037c4fb2ca34d1ff3d3992a11": { + "name": "FEG token contract", + "address": "0xbededdf2ef49e87037c4fb2ca34d1ff3d3992a11", + "token": { + "decimals": 18, + "symbol": "FEG" + }, + "isSC": {} + }, + "0xd1c8fa30fded3e0031dc24c1646d74108b096cc2": { + "name": "LUCKY token contract", + "address": "0xd1c8fa30fded3e0031dc24c1646d74108b096cc2", + "token": { + "decimals": 9, + "symbol": "LUCKY" + }, + "isSC": {} + }, + "0xd38bb40815d2b0c2d2c866e0c72c5728ffc76dd9": { + "name": "SIS token contract", + "address": "0xd38bb40815d2b0c2d2c866e0c72c5728ffc76dd9", + "token": { + "decimals": 18, + "symbol": "SIS" + }, + "isSC": {} + }, + "0x571042b7138ee957a96a6820fce79c48fe2da816": { + "name": "ESLBR token contract", + "address": "0x571042b7138ee957a96a6820fce79c48fe2da816", + "token": { + "decimals": 18, + "symbol": "ESLBR" + }, + "isSC": {} + }, + "0x6cf9788cda282aeb729477f6bda9c4db082b5746": { + "name": "KINGDOM token contract", + "address": "0x6cf9788cda282aeb729477f6bda9c4db082b5746", + "token": { + "decimals": 0, + "symbol": "KINGDOM" + }, + "isSC": {} + }, + "0xa0f0546eb5e3ee7e8cfc5da12e5949f3ae622675": { + "name": "TOKO token contract", + "address": "0xa0f0546eb5e3ee7e8cfc5da12e5949f3ae622675", + "token": { + "decimals": 18, + "symbol": "TOKO" + }, + "isSC": {} + }, + "0x10703ca5e253306e2ababd68e963198be8887c81": { + "name": "SCAN token contract", + "address": "0x10703ca5e253306e2ababd68e963198be8887c81", + "token": { + "decimals": 18, + "symbol": "SCAN" + }, + "isSC": {} + }, + "0xb3a58eb551b5f80ec70b7f69ab7b664453271412": { + "name": "MIXCOIN token contract", + "address": "0xb3a58eb551b5f80ec70b7f69ab7b664453271412", + "token": { + "decimals": 18, + "symbol": "MIXCOIN" + }, + "isSC": {} + }, + "0x508b27902c6c14972a10a4e413b9cfa449e9cedb": { + "name": "AISIG token contract", + "address": "0x508b27902c6c14972a10a4e413b9cfa449e9cedb", + "token": { + "decimals": 0, + "symbol": "AISIG" + }, + "isSC": {} + }, + "0xa067237f8016d5e3770cf08b20e343ab9ee813d5": { + "name": "GRL token contract", + "address": "0xa067237f8016d5e3770cf08b20e343ab9ee813d5", + "token": { + "decimals": 9, + "symbol": "GRL" + }, + "isSC": {} + }, + "0x6369c3dadfc00054a42ba8b2c09c48131dd4aa38": { + "name": "MPH token contract", + "address": "0x6369c3dadfc00054a42ba8b2c09c48131dd4aa38", + "token": { + "decimals": 18, + "symbol": "MPH" + }, + "isSC": {} + }, + "0x14778860e937f509e651192a90589de711fb88a9": { + "name": "CYBER token contract", + "address": "0x14778860e937f509e651192a90589de711fb88a9", + "token": { + "decimals": 18, + "symbol": "CYBER" + }, + "isSC": {} + }, + "0x24ae2da0f361aa4be46b48eb19c91e02c5e4f27e": { + "name": "MEVETH token contract", + "address": "0x24ae2da0f361aa4be46b48eb19c91e02c5e4f27e", + "token": { + "decimals": 18, + "symbol": "MEVETH" + }, + "isSC": {} + }, + "0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2": { + "name": "CAPS token contract", + "address": "0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2", + "token": { + "decimals": 18, + "symbol": "CAPS" + }, + "isSC": {} + }, + "0x2b89bf8ba858cd2fcee1fada378d5cd6936968be": { + "name": "WSCRT token contract", + "address": "0x2b89bf8ba858cd2fcee1fada378d5cd6936968be", + "token": { + "decimals": 6, + "symbol": "WSCRT" + }, + "isSC": {} + }, + "0x5fe72ed557d8a02fff49b3b826792c765d5ce162": { + "name": "SHEZMU token contract", + "address": "0x5fe72ed557d8a02fff49b3b826792c765d5ce162", + "token": { + "decimals": 18, + "symbol": "SHEZMU" + }, + "isSC": {} + }, + "0x070e984fda37dd942f5c953f6b2375339adac308": { + "name": "AXE token contract", + "address": "0x070e984fda37dd942f5c953f6b2375339adac308", + "token": { + "decimals": 18, + "symbol": "AXE" + }, + "isSC": {} + }, + "0xfd957f21bd95e723645c07c48a2d8acb8ffb3794": { + "name": "ETHM token contract", + "address": "0xfd957f21bd95e723645c07c48a2d8acb8ffb3794", + "token": { + "decimals": 18, + "symbol": "ETHM" + }, + "isSC": {} + }, + "0xec70ff4a5b09110e4d20ada4f2db4a86ec61fac6": { + "name": "GRP token contract", + "address": "0xec70ff4a5b09110e4d20ada4f2db4a86ec61fac6", + "token": { + "decimals": 18, + "symbol": "GRP" + }, + "isSC": {} + }, + "0xb1f871ae9462f1b2c6826e88a7827e76f86751d4": { + "name": "GNY token contract", + "address": "0xb1f871ae9462f1b2c6826e88a7827e76f86751d4", + "token": { + "decimals": 18, + "symbol": "GNY" + }, + "isSC": {} + }, + "0x51fe05eac152494908ff1ebbd50e116e960baf64": { + "name": "XGPT token contract", + "address": "0x51fe05eac152494908ff1ebbd50e116e960baf64", + "token": { + "decimals": 18, + "symbol": "XGPT" + }, + "isSC": {} + }, + "0xf8b358b3397a8ea5464f8cc753645d42e14b79ea": { + "name": "ABL token contract", + "address": "0xf8b358b3397a8ea5464f8cc753645d42e14b79ea", + "token": { + "decimals": 18, + "symbol": "ABL" + }, + "isSC": {} + }, + "0x6c10d1611a5a95cb967e4bcab5791fd101194949": { + "name": "XERS token contract", + "address": "0x6c10d1611a5a95cb967e4bcab5791fd101194949", + "token": { + "decimals": 18, + "symbol": "XERS" + }, + "isSC": {} + }, + "0xf939e0a03fb07f59a73314e73794be0e57ac1b4e": { + "name": "CRVUSD token contract", + "address": "0xf939e0a03fb07f59a73314e73794be0e57ac1b4e", + "token": { + "decimals": 18, + "symbol": "CRVUSD" + }, + "isSC": {} + }, + "0x0aa1582bebf8d96ea384b6829a5d41278579cd88": { + "name": "LYVE token contract", + "address": "0x0aa1582bebf8d96ea384b6829a5d41278579cd88", + "token": { + "decimals": 18, + "symbol": "LYVE" + }, + "isSC": {} + }, + "0xd7d8f3b8bc8bc48d3acc37879eaba7b85889fa52": { + "name": "CLH token contract", + "address": "0xd7d8f3b8bc8bc48d3acc37879eaba7b85889fa52", + "token": { + "decimals": 18, + "symbol": "CLH" + }, + "isSC": {} + }, + "0xeb953eda0dc65e3246f43dc8fa13f35623bdd5ed": { + "name": "RAINI token contract", + "address": "0xeb953eda0dc65e3246f43dc8fa13f35623bdd5ed", + "token": { + "decimals": 18, + "symbol": "RAINI" + }, + "isSC": {} + }, + "0xc353bf07405304aeab75f4c2fac7e88d6a68f98e": { + "name": "HOPE token contract", + "address": "0xc353bf07405304aeab75f4c2fac7e88d6a68f98e", + "token": { + "decimals": 18, + "symbol": "HOPE" + }, + "isSC": {} + }, + "0x8f0921f30555624143d427b340b1156914882c10": { + "name": "FYP token contract", + "address": "0x8f0921f30555624143d427b340b1156914882c10", + "token": { + "decimals": 18, + "symbol": "FYP" + }, + "isSC": {} + }, + "0x0ceccd54323b953a5464fddefc47171c397043f7": { + "name": "LBOT token contract", + "address": "0x0ceccd54323b953a5464fddefc47171c397043f7", + "token": { + "decimals": 18, + "symbol": "LBOT" + }, + "isSC": {} + }, + "0x70edf1c215d0ce69e7f16fd4e6276ba0d99d4de7": { + "name": "CHEQ token contract", + "address": "0x70edf1c215d0ce69e7f16fd4e6276ba0d99d4de7", + "token": { + "decimals": 9, + "symbol": "CHEQ" + }, + "isSC": {} + }, + "0xf250b1f6193941bb8bff4152d719edf1a59c0e69": { + "name": "AIRM token contract", + "address": "0xf250b1f6193941bb8bff4152d719edf1a59c0e69", + "token": { + "decimals": 18, + "symbol": "AIRM" + }, + "isSC": {} + }, + "0xdc47f2ba852669b178699449e50682d6ceaf8c07": { + "name": "STON token contract", + "address": "0xdc47f2ba852669b178699449e50682d6ceaf8c07", + "token": { + "decimals": 18, + "symbol": "STON" + }, + "isSC": {} + }, + "0xa6422e3e219ee6d4c1b18895275fe43556fd50ed": { + "name": "STBU token contract", + "address": "0xa6422e3e219ee6d4c1b18895275fe43556fd50ed", + "token": { + "decimals": 18, + "symbol": "STBU" + }, + "isSC": {} + }, + "0xbc19712feb3a26080ebf6f2f7849b417fdd792ca": { + "name": "BORING token contract", + "address": "0xbc19712feb3a26080ebf6f2f7849b417fdd792ca", + "token": { + "decimals": 18, + "symbol": "BORING" + }, + "isSC": {} + }, + "0x06f3c323f0238c72bf35011071f2b5b7f43a054c": { + "name": "MASQ token contract", + "address": "0x06f3c323f0238c72bf35011071f2b5b7f43a054c", + "token": { + "decimals": 18, + "symbol": "MASQ" + }, + "isSC": {} + }, + "0xb26c4b3ca601136daf98593feaeff9e0ca702a8d": { + "name": "ALD token contract", + "address": "0xb26c4b3ca601136daf98593feaeff9e0ca702a8d", + "token": { + "decimals": 18, + "symbol": "ALD" + }, + "isSC": {} + }, + "0x943ed852dadb5c3938ecdc6883718df8142de4c8": { + "name": "FTI token contract", + "address": "0x943ed852dadb5c3938ecdc6883718df8142de4c8", + "token": { + "decimals": 18, + "symbol": "FTI" + }, + "isSC": {} + }, + "0xd71ecff9342a5ced620049e616c5035f1db98620": { + "name": "SEUR token contract", + "address": "0xd71ecff9342a5ced620049e616c5035f1db98620", + "token": { + "decimals": 18, + "symbol": "SEUR" + }, + "isSC": {} + }, + "0xa52b7ea0365310ca87ab73aef4f2f75c9a999af3": { + "name": "MASS token contract", + "address": "0xa52b7ea0365310ca87ab73aef4f2f75c9a999af3", + "token": { + "decimals": 18, + "symbol": "MASS" + }, + "isSC": {} + }, + "0x51fe2e572e97bfeb1d719809d743ec2675924edc": { + "name": "VPAD token contract", + "address": "0x51fe2e572e97bfeb1d719809d743ec2675924edc", + "token": { + "decimals": 18, + "symbol": "VPAD" + }, + "isSC": {} + }, + "0x14cc8dfaf2258e1b8b2869300dba1b734dc0fe43": { + "name": "KTT token contract", + "address": "0x14cc8dfaf2258e1b8b2869300dba1b734dc0fe43", + "token": { + "decimals": 18, + "symbol": "KTT" + }, + "isSC": {} + }, + "0x1ba9843bd4327c6c77011406de5fa8749f7e3479": { + "name": "ASTG token contract", + "address": "0x1ba9843bd4327c6c77011406de5fa8749f7e3479", + "token": { + "decimals": 18, + "symbol": "ASTG" + }, + "isSC": {} + }, + "0xa1d0e215a23d7030842fc67ce582a6afa3ccab83": { + "name": "YFII token contract", + "address": "0xa1d0e215a23d7030842fc67ce582a6afa3ccab83", + "token": { + "decimals": 18, + "symbol": "YFII" + }, + "isSC": {} + }, + "0xdfc3829b127761a3218bfcee7fc92e1232c9d116": { + "name": "PRCY token contract", + "address": "0xdfc3829b127761a3218bfcee7fc92e1232c9d116", + "token": { + "decimals": 8, + "symbol": "PRCY" + }, + "isSC": {} + }, + "0x6bea7cfef803d1e3d5f7c0103f7ded065644e197": { + "name": "Gamma", + "address": "0x6bea7cfef803d1e3d5f7c0103f7ded065644e197", + "token": { + "decimals": 18, + "symbol": "GAMMA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Gamma.svg" + }, + "0x8c543aed163909142695f2d2acd0d55791a9edb9": { + "name": "VLX token contract", + "address": "0x8c543aed163909142695f2d2acd0d55791a9edb9", + "token": { + "decimals": 18, + "symbol": "VLX" + }, + "isSC": {} + }, + "0x1af4f195a8aaa7ffd752c28a13b719b84056f0d6": { + "name": "NTP token contract", + "address": "0x1af4f195a8aaa7ffd752c28a13b719b84056f0d6", + "token": { + "decimals": 18, + "symbol": "NTP" + }, + "isSC": {} + }, + "0x2d886570a0da04885bfd6eb48ed8b8ff01a0eb7e": { + "name": "BCB token contract", + "address": "0x2d886570a0da04885bfd6eb48ed8b8ff01a0eb7e", + "token": { + "decimals": 9, + "symbol": "BCB" + }, + "isSC": {} + }, + "0x9fd5555d0360adc2b5d92179e9bc36802bba8621": { + "name": "APES token contract", + "address": "0x9fd5555d0360adc2b5d92179e9bc36802bba8621", + "token": { + "decimals": 18, + "symbol": "APES" + }, + "isSC": {} + }, + "0xda9b11cd701e10c2ec1a284f80820edd128c5246": { + "name": "INWBETH token contract", + "address": "0xda9b11cd701e10c2ec1a284f80820edd128c5246", + "token": { + "decimals": 18, + "symbol": "INWBETH" + }, + "isSC": {} + }, + "0x7df18e4efd6e6f73cfb462937dac40fe42533016": { + "name": "ZKITTY token contract", + "address": "0x7df18e4efd6e6f73cfb462937dac40fe42533016", + "token": { + "decimals": 18, + "symbol": "ZKITTY" + }, + "isSC": {} + }, + "0x3b604747ad1720c01ded0455728b62c0d2f100f0": { + "name": "WAGMIGAMES token contract", + "address": "0x3b604747ad1720c01ded0455728b62c0d2f100f0", + "token": { + "decimals": 18, + "symbol": "WAGMIGAMES" + }, + "isSC": {} + }, + "0xb870679a7fa65b924026f496de7f27c1dd0e5c5f": { + "name": "PET token contract", + "address": "0xb870679a7fa65b924026f496de7f27c1dd0e5c5f", + "token": { + "decimals": 18, + "symbol": "PET" + }, + "isSC": {} + }, + "0x83f20f44975d03b1b09e64809b757c47f942beea": { + "name": "SDAI token contract", + "address": "0x83f20f44975d03b1b09e64809b757c47f942beea", + "token": { + "decimals": 18, + "symbol": "SDAI" + }, + "isSC": {} + }, + "0x9c354503c38481a7a7a51629142963f98ecc12d0": { + "name": "Origin DeFi Governance", + "address": "0x9c354503c38481a7a7a51629142963f98ecc12d0", + "token": { + "decimals": 18, + "symbol": "OGV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ogv.svg" + }, + "0x3e8203e0b1d56984abc66f183a8d0b1a09a7e607": { + "name": "LP token contract", + "address": "0x3e8203e0b1d56984abc66f183a8d0b1a09a7e607", + "token": { + "decimals": 9, + "symbol": "LP" + }, + "isSC": {} + }, + "0xe3dbc4f88eaa632ddf9708732e2832eeaa6688ab": { + "name": "AIUS token contract", + "address": "0xe3dbc4f88eaa632ddf9708732e2832eeaa6688ab", + "token": { + "decimals": 18, + "symbol": "AIUS" + }, + "isSC": {} + }, + "0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2": { + "name": "CHR token contract", + "address": "0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2", + "token": { + "decimals": 6, + "symbol": "CHR" + }, + "isSC": {} + }, + "0x571e21a545842c6ce596663cda5caa8196ac1c7a": { + "name": "CHAMPZ token contract", + "address": "0x571e21a545842c6ce596663cda5caa8196ac1c7a", + "token": { + "decimals": 8, + "symbol": "CHAMPZ" + }, + "isSC": {} + }, + "0xd75f1f81b69bdd4df8efbb70e9c6f4609009d753": { + "name": "YASHA token contract", + "address": "0xd75f1f81b69bdd4df8efbb70e9c6f4609009d753", + "token": { + "decimals": 18, + "symbol": "YASHA" + }, + "isSC": {} + }, + "0x6e39a587691b8c9d4341ce0a960998ed6f537af6": { + "name": "MEMAG token contract", + "address": "0x6e39a587691b8c9d4341ce0a960998ed6f537af6", + "token": { + "decimals": 18, + "symbol": "MEMAG" + }, + "isSC": {} + }, + "0x8954d907520532c1f0d89d42569232fd0f995fdf": { + "name": "TX token contract", + "address": "0x8954d907520532c1f0d89d42569232fd0f995fdf", + "token": { + "decimals": 8, + "symbol": "TX" + }, + "isSC": {} + }, + "0x037a54aab062628c9bbae1fdb1583c195585fe41": { + "name": "LCX token contract", + "address": "0x037a54aab062628c9bbae1fdb1583c195585fe41", + "token": { + "decimals": 18, + "symbol": "LCX" + }, + "isSC": {} + }, + "0x50eec6d765792dcfb0913c8403ef2a12e1b861a6": { + "name": "Z3 token contract", + "address": "0x50eec6d765792dcfb0913c8403ef2a12e1b861a6", + "token": { + "decimals": 18, + "symbol": "Z3" + }, + "isSC": {} + }, + "0x53805a76e1f5ebbfe7115f16f9c87c2f7e633726": { + "name": "FETH token contract", + "address": "0x53805a76e1f5ebbfe7115f16f9c87c2f7e633726", + "token": { + "decimals": 18, + "symbol": "FETH" + }, + "isSC": {} + }, + "0x5b322514ff727253292637d9054301600c2c81e8": { + "name": "DAD token contract", + "address": "0x5b322514ff727253292637d9054301600c2c81e8", + "token": { + "decimals": 9, + "symbol": "DAD" + }, + "isSC": {} + }, + "0xd9a442856c234a39a81a089c06451ebaa4306a72": { + "name": "PUFETH token contract", + "address": "0xd9a442856c234a39a81a089c06451ebaa4306a72", + "token": { + "decimals": 18, + "symbol": "PUFETH" + }, + "isSC": {} + }, + "0x0000206329b97db379d5e1bf586bbdb969c63274": { + "name": "USDA", + "address": "0x0000206329b97db379d5e1bf586bbdb969c63274", + "token": { + "decimals": 18, + "symbol": "USDA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/USDA.svg" + }, + "0xbadff0ef41d2a68f22de21eabca8a59aaf495cf0": { + "name": "KABOSU token contract", + "address": "0xbadff0ef41d2a68f22de21eabca8a59aaf495cf0", + "token": { + "decimals": 18, + "symbol": "KABOSU" + }, + "isSC": {} + }, + "0x8df5066cf67d909eb67b82854cf54026d31fffae": { + "name": "KOI token contract", + "address": "0x8df5066cf67d909eb67b82854cf54026d31fffae", + "token": { + "decimals": 18, + "symbol": "KOI" + }, + "isSC": {} + }, + "0xbe1a001fe942f96eea22ba08783140b9dcc09d28": { + "name": "BETA token contract", + "address": "0xbe1a001fe942f96eea22ba08783140b9dcc09d28", + "token": { + "decimals": 18, + "symbol": "BETA" + }, + "isSC": {} + }, + "0xdcd85914b8ae28c1e62f1c488e1d968d5aaffe2b": { + "name": "TOP Network Token", + "address": "0xdcd85914b8ae28c1e62f1c488e1d968d5aaffe2b", + "token": { + "decimals": 18, + "symbol": "TOP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TOP.svg" + }, + "0xaaa9214f675316182eaa21c85f0ca99160cc3aaa": { + "name": "QANX token contract", + "address": "0xaaa9214f675316182eaa21c85f0ca99160cc3aaa", + "token": { + "decimals": 18, + "symbol": "QANX" + }, + "isSC": {} + }, + "0xc3c221fe28c33814c28c822b631fd76047ef1a63": { + "name": "MM token contract", + "address": "0xc3c221fe28c33814c28c822b631fd76047ef1a63", + "token": { + "decimals": 18, + "symbol": "MM" + }, + "isSC": {} + }, + "0xed04915c23f00a313a544955524eb7dbd823143d": { + "name": "Alchemy Pay", + "address": "0xed04915c23f00a313a544955524eb7dbd823143d", + "token": { + "decimals": 8, + "symbol": "ACH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ACH.svg" + }, + "0x6fb3e0a217407efff7ca062d46c26e5d60a14d69": { + "name": "IoTeX", + "address": "0x6fb3e0a217407efff7ca062d46c26e5d60a14d69", + "token": { + "decimals": 18, + "symbol": "IOTX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/iotex.svg" + }, + "0xf920e4f3fbef5b3ad0a25017514b769bdc4ac135": { + "name": "BAX token contract", + "address": "0xf920e4f3fbef5b3ad0a25017514b769bdc4ac135", + "token": { + "decimals": 18, + "symbol": "BAX" + }, + "isSC": {} + }, + "0x304645590f197d99fad9fa1d05e7bcdc563e1378": { + "name": "GUARDIAN token contract", + "address": "0x304645590f197d99fad9fa1d05e7bcdc563e1378", + "token": { + "decimals": 9, + "symbol": "GUARDIAN" + }, + "isSC": {} + }, + "0x6dca182ac5e3f99985bc4ee0f726d6472ab1ec55": { + "name": "USHI token contract", + "address": "0x6dca182ac5e3f99985bc4ee0f726d6472ab1ec55", + "token": { + "decimals": 18, + "symbol": "USHI" + }, + "isSC": {} + }, + "0x23352036e911a22cfc692b5e2e196692658aded9": { + "name": "FDZ token contract", + "address": "0x23352036e911a22cfc692b5e2e196692658aded9", + "token": { + "decimals": 18, + "symbol": "FDZ" + }, + "isSC": {} + }, + "0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c": { + "name": "Bancor Network Token", + "address": "0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c", + "token": { + "decimals": 18, + "symbol": "BNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bnt.svg" + }, + "0xe803178b48a0e560c2b19f3b3d4e504f79d229ce": { + "name": "BOBC token contract", + "address": "0xe803178b48a0e560c2b19f3b3d4e504f79d229ce", + "token": { + "decimals": 18, + "symbol": "BOBC" + }, + "isSC": {} + }, + "0xc82e3db60a52cf7529253b4ec688f631aad9e7c2": { + "name": "ARC token contract", + "address": "0xc82e3db60a52cf7529253b4ec688f631aad9e7c2", + "token": { + "decimals": 18, + "symbol": "ARC" + }, + "isSC": {} + }, + "0xeaa260c1d247135cec29ec10fb6acedf2a55dc6b": { + "name": "TADA token contract", + "address": "0xeaa260c1d247135cec29ec10fb6acedf2a55dc6b", + "token": { + "decimals": 9, + "symbol": "TADA" + }, + "isSC": {} + }, + "0xe5a3229ccb22b6484594973a03a3851dcd948756": { + "name": "RAE Token", + "address": "0xe5a3229ccb22b6484594973a03a3851dcd948756", + "token": { + "decimals": 18, + "symbol": "RAE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rae.svg" + }, + "0x7420b4b9a0110cdc71fb720908340c03f9bc03ec": { + "name": "JasmyCoin", + "address": "0x7420b4b9a0110cdc71fb720908340c03f9bc03ec", + "token": { + "decimals": 18, + "symbol": "JASMY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/JASMY.svg" + }, + "0x558ec3152e2eb2174905cd19aea4e34a23de9ad6": { + "name": "BRD token contract", + "address": "0x558ec3152e2eb2174905cd19aea4e34a23de9ad6", + "token": { + "decimals": 18, + "symbol": "BRD" + }, + "isSC": {} + }, + "0x86ed939b500e121c0c5f493f399084db596dad20": { + "name": "SPC token contract", + "address": "0x86ed939b500e121c0c5f493f399084db596dad20", + "token": { + "decimals": 18, + "symbol": "SPC" + }, + "isSC": {} + }, + "0x869dbe51dc214fcb663604b0f7b548592f8c71f5": { + "name": "DOKI token contract", + "address": "0x869dbe51dc214fcb663604b0f7b548592f8c71f5", + "token": { + "decimals": 9, + "symbol": "DOKI" + }, + "isSC": {} + }, + "0xa408090a36cef0b23c3f518484a4e06c7c7df27c": { + "name": "LONG token contract", + "address": "0xa408090a36cef0b23c3f518484a4e06c7c7df27c", + "token": { + "decimals": 18, + "symbol": "LONG" + }, + "isSC": {} + }, + "0xbdab72602e9ad40fc6a6852caf43258113b8f7a5": { + "name": "SOV token contract", + "address": "0xbdab72602e9ad40fc6a6852caf43258113b8f7a5", + "token": { + "decimals": 18, + "symbol": "SOV" + }, + "isSC": {} + }, + "0x7a8adcf432ebcc2311b955d176ee4bfed13bb9a7": { + "name": "MANDOX token contract", + "address": "0x7a8adcf432ebcc2311b955d176ee4bfed13bb9a7", + "token": { + "decimals": 9, + "symbol": "MANDOX" + }, + "isSC": {} + }, + "0x8b91f277501cf8322ebe34f137dd35b384b353c7": { + "name": "CORE token contract", + "address": "0x8b91f277501cf8322ebe34f137dd35b384b353c7", + "token": { + "decimals": 9, + "symbol": "CORE" + }, + "isSC": {} + }, + "0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a": { + "name": "CGT token contract", + "address": "0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a", + "token": { + "decimals": 18, + "symbol": "CGT" + }, + "isSC": {} + }, + "0x14fee680690900ba0cccfc76ad70fd1b95d10e16": { + "name": "PAAL token contract", + "address": "0x14fee680690900ba0cccfc76ad70fd1b95d10e16", + "token": { + "decimals": 9, + "symbol": "PAAL" + }, + "isSC": {} + }, + "0xaec65404ddc3af3c897ad89571d5772c1a695f22": { + "name": "PHX token contract", + "address": "0xaec65404ddc3af3c897ad89571d5772c1a695f22", + "token": { + "decimals": 18, + "symbol": "PHX" + }, + "isSC": {} + }, + "0xe2976a66e8cef3932cdaeb935e114dcd5ce20f20": { + "name": "CFSH token contract", + "address": "0xe2976a66e8cef3932cdaeb935e114dcd5ce20f20", + "token": { + "decimals": 18, + "symbol": "CFSH" + }, + "isSC": {} + }, + "0x24b47299e756af0571f512232a3629e0dabb52ed": { + "name": "CVT token contract", + "address": "0x24b47299e756af0571f512232a3629e0dabb52ed", + "token": { + "decimals": 18, + "symbol": "CVT" + }, + "isSC": {} + }, + "0x0f59bfdd1d95a3736d2e219f905ae9b2e69c6638": { + "name": "KIWI token contract", + "address": "0x0f59bfdd1d95a3736d2e219f905ae9b2e69c6638", + "token": { + "decimals": 9, + "symbol": "KIWI" + }, + "isSC": {} + }, + "0xb3999f658c0391d94a37f7ff328f3fec942bcadc": { + "name": "HFT token contract", + "address": "0xb3999f658c0391d94a37f7ff328f3fec942bcadc", + "token": { + "decimals": 18, + "symbol": "HFT" + }, + "isSC": {} + }, + "0x4b520c812e8430659fc9f12f6d0c39026c83588d": { + "name": "DG token contract", + "address": "0x4b520c812e8430659fc9f12f6d0c39026c83588d", + "token": { + "decimals": 18, + "symbol": "DG" + }, + "isSC": {} + }, + "0x5483dc6abda5f094865120b2d251b5744fc2ecb5": { + "name": "TPAD token contract", + "address": "0x5483dc6abda5f094865120b2d251b5744fc2ecb5", + "token": { + "decimals": 18, + "symbol": "TPAD" + }, + "isSC": {} + }, + "0x75231f58b43240c9718dd58b4967c5114342a86c": { + "name": "OKB token contract", + "address": "0x75231f58b43240c9718dd58b4967c5114342a86c", + "token": { + "decimals": 18, + "symbol": "OKB" + }, + "isSC": {} + }, + "0x2a5fa016ffb20c70e2ef36058c08547f344677aa": { + "name": "VSG token contract", + "address": "0x2a5fa016ffb20c70e2ef36058c08547f344677aa", + "token": { + "decimals": 18, + "symbol": "VSG" + }, + "isSC": {} + }, + "0xce3f08e664693ca792cace4af1364d5e220827b2": { + "name": "SAITAMA token contract", + "address": "0xce3f08e664693ca792cace4af1364d5e220827b2", + "token": { + "decimals": 9, + "symbol": "SAITAMA" + }, + "isSC": {} + }, + "0xcd7492db29e2ab436e819b249452ee1bbdf52214": { + "name": "SMI token contract", + "address": "0xcd7492db29e2ab436e819b249452ee1bbdf52214", + "token": { + "decimals": 8, + "symbol": "SMI" + }, + "isSC": {} + }, + "0xd807f7e2818db8eda0d28b5be74866338eaedb86": { + "name": "JIM token contract", + "address": "0xd807f7e2818db8eda0d28b5be74866338eaedb86", + "token": { + "decimals": 18, + "symbol": "JIM" + }, + "isSC": {} + }, + "0x3fe7940616e5bc47b0775a0dccf6237893353bb4": { + "name": "IDLEDAIYIELD token contract", + "address": "0x3fe7940616e5bc47b0775a0dccf6237893353bb4", + "token": { + "decimals": 18, + "symbol": "IDLEDAIYIELD" + }, + "isSC": {} + }, + "0x733b5056a0697e7a4357305fe452999a0c409feb": { + "name": "VCORE token contract", + "address": "0x733b5056a0697e7a4357305fe452999a0c409feb", + "token": { + "decimals": 18, + "symbol": "VCORE" + }, + "isSC": {} + }, + "0xf7168c8abb0ff80116413a8d95396bbdc318a3ff": { + "name": "KEKE token contract", + "address": "0xf7168c8abb0ff80116413a8d95396bbdc318a3ff", + "token": { + "decimals": 7, + "symbol": "KEKE" + }, + "isSC": {} + }, + "0x3506424f91fd33084466f402d5d97f05f8e3b4af": { + "name": "chiliZ", + "address": "0x3506424f91fd33084466f402d5d97f05f8e3b4af", + "token": { + "decimals": 18, + "symbol": "CHZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/chz.svg" + }, + "0xc314b0e758d5ff74f63e307a86ebfe183c95767b": { + "name": "ADP token contract", + "address": "0xc314b0e758d5ff74f63e307a86ebfe183c95767b", + "token": { + "decimals": 18, + "symbol": "ADP" + }, + "isSC": {} + }, + "0xb4b9dc1c77bdbb135ea907fd5a08094d98883a35": { + "name": "SWEAT token contract", + "address": "0xb4b9dc1c77bdbb135ea907fd5a08094d98883a35", + "token": { + "decimals": 18, + "symbol": "SWEAT" + }, + "isSC": {} + }, + "0x4740735aa98dc8aa232bd049f8f0210458e7fca3": { + "name": "RDT token contract", + "address": "0x4740735aa98dc8aa232bd049f8f0210458e7fca3", + "token": { + "decimals": 18, + "symbol": "RDT" + }, + "isSC": {} + }, + "0x2dc917b722184ece1dcb9bb9dddfb1d63ccd25eb": { + "name": "WHRH token contract", + "address": "0x2dc917b722184ece1dcb9bb9dddfb1d63ccd25eb", + "token": { + "decimals": 18, + "symbol": "WHRH" + }, + "isSC": {} + }, + "0x2f3d0d2317802a65faac6e4cd94067c37b4d4804": { + "name": "DCARD token contract", + "address": "0x2f3d0d2317802a65faac6e4cd94067c37b4d4804", + "token": { + "decimals": 9, + "symbol": "DCARD" + }, + "isSC": {} + }, + "0x0a913bead80f321e7ac35285ee10d9d922659cb7": { + "name": "DOS token contract", + "address": "0x0a913bead80f321e7ac35285ee10d9d922659cb7", + "token": { + "decimals": 18, + "symbol": "DOS" + }, + "isSC": {} + }, + "0x834e7fdc574cc0c95857da38190b453a3666387e": { + "name": "RUNNER token contract", + "address": "0x834e7fdc574cc0c95857da38190b453a3666387e", + "token": { + "decimals": 18, + "symbol": "RUNNER" + }, + "isSC": {} + }, + "0x2c000c0093de75a8fa2fccd3d97b314e20b431c3": { + "name": "HLTC token contract", + "address": "0x2c000c0093de75a8fa2fccd3d97b314e20b431c3", + "token": { + "decimals": 18, + "symbol": "HLTC" + }, + "isSC": {} + }, + "0xc666081073e8dff8d3d1c2292a29ae1a2153ec09": { + "name": "DGTX token contract", + "address": "0xc666081073e8dff8d3d1c2292a29ae1a2153ec09", + "token": { + "decimals": 18, + "symbol": "DGTX" + }, + "isSC": {} + }, + "0x436da116249044e8b4464f0cf21dd93311d88190": { + "name": "ZEUM token contract", + "address": "0x436da116249044e8b4464f0cf21dd93311d88190", + "token": { + "decimals": 18, + "symbol": "ZEUM" + }, + "isSC": {} + }, + "0xe0c05ec44775e4ad62cdc2eecdf337aa7a143363": { + "name": "MANC token contract", + "address": "0xe0c05ec44775e4ad62cdc2eecdf337aa7a143363", + "token": { + "decimals": 2, + "symbol": "MANC" + }, + "isSC": {} + }, + "0xea18dc833653172bbe819feb5320d9da9f99799a": { + "name": "ELON20 token contract", + "address": "0xea18dc833653172bbe819feb5320d9da9f99799a", + "token": { + "decimals": 18, + "symbol": "ELON20" + }, + "isSC": {} + }, + "0x49642110b712c1fd7261bc074105e9e44676c68f": { + "name": "DinoLFG", + "address": "0x49642110b712c1fd7261bc074105e9e44676c68f", + "token": { + "decimals": 18, + "symbol": "DINO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DINO.svg" + }, + "0x5aa158404fed6b4730c13f49d3a7f820e14a636f": { + "name": "ULX token contract", + "address": "0x5aa158404fed6b4730c13f49d3a7f820e14a636f", + "token": { + "decimals": 18, + "symbol": "ULX" + }, + "isSC": {} + }, + "0x32c6f1c1731ff8f98ee2ede8954f696446307846": { + "name": "BEARDY token contract", + "address": "0x32c6f1c1731ff8f98ee2ede8954f696446307846", + "token": { + "decimals": 18, + "symbol": "BEARDY" + }, + "isSC": {} + }, + "0xe6fd75ff38adca4b97fbcd938c86b98772431867": { + "name": "ELA token contract", + "address": "0xe6fd75ff38adca4b97fbcd938c86b98772431867", + "token": { + "decimals": 18, + "symbol": "ELA" + }, + "isSC": {} + }, + "0x71ab77b7dbb4fa7e017bc15090b2163221420282": { + "name": "HIGH token contract", + "address": "0x71ab77b7dbb4fa7e017bc15090b2163221420282", + "token": { + "decimals": 18, + "symbol": "HIGH" + }, + "isSC": {} + }, + "0x40a7df3df8b56147b781353d379cb960120211d7": { + "name": "MOBY token contract", + "address": "0x40a7df3df8b56147b781353d379cb960120211d7", + "token": { + "decimals": 18, + "symbol": "MOBY" + }, + "isSC": {} + }, + "0x865ec58b06bf6305b886793aa20a2da31d034e68": { + "name": "MOC token contract", + "address": "0x865ec58b06bf6305b886793aa20a2da31d034e68", + "token": { + "decimals": 18, + "symbol": "MOC" + }, + "isSC": {} + }, + "0x15f0eedf9ce24fc4b6826e590a8292ce5524a1da": { + "name": "DENA token contract", + "address": "0x15f0eedf9ce24fc4b6826e590a8292ce5524a1da", + "token": { + "decimals": 18, + "symbol": "DENA" + }, + "isSC": {} + }, + "0x1cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a": { + "name": "WAVES", + "address": "0x1cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a", + "token": { + "decimals": 18, + "symbol": "WAVES" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/waves.svg" + }, + "0xdd66781d0e9a08d4fbb5ec7bac80b691be27f21d": { + "name": "AXGT token contract", + "address": "0xdd66781d0e9a08d4fbb5ec7bac80b691be27f21d", + "token": { + "decimals": 18, + "symbol": "AXGT" + }, + "isSC": {} + }, + "0x1776e1f26f98b1a5df9cd347953a26dd3cb46671": { + "name": "Numeraire", + "address": "0x1776e1f26f98b1a5df9cd347953a26dd3cb46671", + "token": { + "decimals": 18, + "symbol": "NMR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nmr.png" + }, + "0x5283d291dbcf85356a21ba090e6db59121208b44": { + "name": "BLUR token contract", + "address": "0x5283d291dbcf85356a21ba090e6db59121208b44", + "token": { + "decimals": 18, + "symbol": "BLUR" + }, + "isSC": {} + }, + "0xd585aaafa2b58b1cd75092b51ade9fa4ce52f247": { + "name": "PEUSD token contract", + "address": "0xd585aaafa2b58b1cd75092b51ade9fa4ce52f247", + "token": { + "decimals": 18, + "symbol": "PEUSD" + }, + "isSC": {} + }, + "0xb7955695d1df86f35bfbda5e5b7d3069a5639a19": { + "name": "BULLY token contract", + "address": "0xb7955695d1df86f35bfbda5e5b7d3069a5639a19", + "token": { + "decimals": 18, + "symbol": "BULLY" + }, + "isSC": {} + }, + "0x4f9254c83eb525f9fcf346490bbb3ed28a81c667": { + "name": "Celer Network Token", + "address": "0x4f9254c83eb525f9fcf346490bbb3ed28a81c667", + "token": { + "decimals": 18, + "symbol": "CELR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CELR.svg" + }, + "0x6a7eff1e2c355ad6eb91bebb5ded49257f3fed98": { + "name": "OPSEC token contract", + "address": "0x6a7eff1e2c355ad6eb91bebb5ded49257f3fed98", + "token": { + "decimals": 18, + "symbol": "OPSEC" + }, + "isSC": {} + }, + "0x630d98424efe0ea27fb1b3ab7741907dffeaad78": { + "name": "PEAK token contract", + "address": "0x630d98424efe0ea27fb1b3ab7741907dffeaad78", + "token": { + "decimals": 8, + "symbol": "PEAK" + }, + "isSC": {} + }, + "0x25b4f5d4c314bcd5d7962734936c957b947cb7cf": { + "name": "TGC token contract", + "address": "0x25b4f5d4c314bcd5d7962734936c957b947cb7cf", + "token": { + "decimals": 18, + "symbol": "TGC" + }, + "isSC": {} + }, + "0xa3b3beaf9c0a6160a8e47f000c094d34121f1a57": { + "name": "COFFEE token contract", + "address": "0xa3b3beaf9c0a6160a8e47f000c094d34121f1a57", + "token": { + "decimals": 18, + "symbol": "COFFEE" + }, + "isSC": {} + }, + "0x3429d03c6f7521aec737a0bbf2e5ddcef2c3ae31": { + "name": "PIXEL token contract", + "address": "0x3429d03c6f7521aec737a0bbf2e5ddcef2c3ae31", + "token": { + "decimals": 18, + "symbol": "PIXEL" + }, + "isSC": {} + }, + "0xd07d9fe2d2cc067015e2b4917d24933804f42cfa": { + "name": "TOL token contract", + "address": "0xd07d9fe2d2cc067015e2b4917d24933804f42cfa", + "token": { + "decimals": 18, + "symbol": "TOL" + }, + "isSC": {} + }, + "0xb7be27ba608641f0b6f152c8b432757f3685d2b0": { + "name": "U token contract", + "address": "0xb7be27ba608641f0b6f152c8b432757f3685d2b0", + "token": { + "decimals": 18, + "symbol": "U" + }, + "isSC": {} + }, + "0xd13c7342e1ef687c5ad21b27c2b65d772cab5c8c": { + "name": "UOS token contract", + "address": "0xd13c7342e1ef687c5ad21b27c2b65d772cab5c8c", + "token": { + "decimals": 4, + "symbol": "UOS" + }, + "isSC": {} + }, + "0xd2bdaaf2b9cc6981fd273dcb7c04023bfbe0a7fe": { + "name": "AVI token contract", + "address": "0xd2bdaaf2b9cc6981fd273dcb7c04023bfbe0a7fe", + "token": { + "decimals": 18, + "symbol": "AVI" + }, + "isSC": {} + }, + "0x4507cef57c46789ef8d1a19ea45f4216bae2b528": { + "name": "TokenFi", + "address": "0x4507cef57c46789ef8d1a19ea45f4216bae2b528", + "token": { + "decimals": 9, + "symbol": "TOKEN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tokenfi.svg" + }, + "0xcb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e": { + "name": "VEGA token contract", + "address": "0xcb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e", + "token": { + "decimals": 18, + "symbol": "VEGA" + }, + "isSC": {} + }, + "0xadd8abdea5cb95f4dcd8e128eeef64f023615a6a": { + "name": "CHZB token contract", + "address": "0xadd8abdea5cb95f4dcd8e128eeef64f023615a6a", + "token": { + "decimals": 18, + "symbol": "CHZB" + }, + "isSC": {} + }, + "0xd98f75b1a3261dab9eed4956c93f33749027a964": { + "name": "SHR token contract", + "address": "0xd98f75b1a3261dab9eed4956c93f33749027a964", + "token": { + "decimals": 2, + "symbol": "SHR" + }, + "isSC": {} + }, + "0x6602e9319f2c5ec0ba31ffcdc4301d7ef03b709e": { + "name": "WBRGE token contract", + "address": "0x6602e9319f2c5ec0ba31ffcdc4301d7ef03b709e", + "token": { + "decimals": 18, + "symbol": "WBRGE" + }, + "isSC": {} + }, + "0xf32aa187d5bc16a2c02a6afb7df1459d0d107574": { + "name": "INU token contract", + "address": "0xf32aa187d5bc16a2c02a6afb7df1459d0d107574", + "token": { + "decimals": 18, + "symbol": "INU" + }, + "isSC": {} + }, + "0xed1167b6dc64e8a366db86f2e952a482d0981ebd": { + "name": "LBR token contract", + "address": "0xed1167b6dc64e8a366db86f2e952a482d0981ebd", + "token": { + "decimals": 18, + "symbol": "LBR" + }, + "isSC": {} + }, + "0xef89c37fe9e5c906b404cd7edae4a2992b5d25fa": { + "name": "TIME token contract", + "address": "0xef89c37fe9e5c906b404cd7edae4a2992b5d25fa", + "token": { + "decimals": 18, + "symbol": "TIME" + }, + "isSC": {} + }, + "0xa9049425b938c46ac3e312d4cdaeccb26282aeb2": { + "name": "WIK token contract", + "address": "0xa9049425b938c46ac3e312d4cdaeccb26282aeb2", + "token": { + "decimals": 18, + "symbol": "WIK" + }, + "isSC": {} + }, + "0x115ec79f1de567ec68b7ae7eda501b406626478e": { + "name": "CRE token contract", + "address": "0x115ec79f1de567ec68b7ae7eda501b406626478e", + "token": { + "decimals": 18, + "symbol": "CRE" + }, + "isSC": {} + }, + "0xe44ac096d96b7918afc0d98cb18d40c5ca5868ab": { + "name": "OSMO token contract", + "address": "0xe44ac096d96b7918afc0d98cb18d40c5ca5868ab", + "token": { + "decimals": 18, + "symbol": "OSMO" + }, + "isSC": {} + }, + "0x6c061d18d2b5bbfbe8a8d1eeb9ee27efd544cc5d": { + "name": "MNRCH token contract", + "address": "0x6c061d18d2b5bbfbe8a8d1eeb9ee27efd544cc5d", + "token": { + "decimals": 18, + "symbol": "MNRCH" + }, + "isSC": {} + }, + "0xf819d9cb1c2a819fd991781a822de3ca8607c3c9": { + "name": "UNIBOT token contract", + "address": "0xf819d9cb1c2a819fd991781a822de3ca8607c3c9", + "token": { + "decimals": 18, + "symbol": "UNIBOT" + }, + "isSC": {} + }, + "0xe1d7c7a4596b038ced2a84bf65b8647271c53208": { + "name": "NFTY token contract", + "address": "0xe1d7c7a4596b038ced2a84bf65b8647271c53208", + "token": { + "decimals": 18, + "symbol": "NFTY" + }, + "isSC": {} + }, + "0x329c6e459ffa7475718838145e5e85802db2a303": { + "name": "EMAID token contract", + "address": "0x329c6e459ffa7475718838145e5e85802db2a303", + "token": { + "decimals": 18, + "symbol": "EMAID" + }, + "isSC": {} + }, + "0xd3e4ba569045546d09cf021ecc5dfe42b1d7f6e4": { + "name": "MNW token contract", + "address": "0xd3e4ba569045546d09cf021ecc5dfe42b1d7f6e4", + "token": { + "decimals": 18, + "symbol": "MNW" + }, + "isSC": {} + }, + "0x814a870726edb7dfc4798300ae1ce3e5da0ac467": { + "name": "DACAT token contract", + "address": "0x814a870726edb7dfc4798300ae1ce3e5da0ac467", + "token": { + "decimals": 18, + "symbol": "DACAT" + }, + "isSC": {} + }, + "0x5922c10653143f7eb8c0733563ede65e2e4e618e": { + "name": "VDT token contract", + "address": "0x5922c10653143f7eb8c0733563ede65e2e4e618e", + "token": { + "decimals": 18, + "symbol": "VDT" + }, + "isSC": {} + }, + "0xfbe6f37d3db3fc939f665cfe21238c11a5447831": { + "name": "ETH20 token contract", + "address": "0xfbe6f37d3db3fc939f665cfe21238c11a5447831", + "token": { + "decimals": 9, + "symbol": "ETH20" + }, + "isSC": {} + }, + "0xd559f20296ff4895da39b5bd9add54b442596a61": { + "name": "FTX token contract", + "address": "0xd559f20296ff4895da39b5bd9add54b442596a61", + "token": { + "decimals": 18, + "symbol": "FTX" + }, + "isSC": {} + }, + "0x18084fba666a33d37592fa2633fd49a74dd93a88": { + "name": "TBTC token contract", + "address": "0x18084fba666a33d37592fa2633fd49a74dd93a88", + "token": { + "decimals": 18, + "symbol": "TBTC" + }, + "isSC": {} + }, + "0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31": { + "name": "ITP token contract", + "address": "0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31", + "token": { + "decimals": 18, + "symbol": "ITP" + }, + "isSC": {} + }, + "0x9a96ec9b57fb64fbc60b423d1f4da7691bd35079": { + "name": "AJNA token contract", + "address": "0x9a96ec9b57fb64fbc60b423d1f4da7691bd35079", + "token": { + "decimals": 18, + "symbol": "AJNA" + }, + "isSC": {} + }, + "0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de": { + "name": "MILK2 token contract", + "address": "0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de", + "token": { + "decimals": 18, + "symbol": "MILK2" + }, + "isSC": {} + }, + "0xffffffff2ba8f66d4e51811c5190992176930278": { + "name": "COMBO token contract", + "address": "0xffffffff2ba8f66d4e51811c5190992176930278", + "token": { + "decimals": 18, + "symbol": "COMBO" + }, + "isSC": {} + }, + "0x36905fc93280f52362a1cbab151f25dc46742fb5": { + "name": "BTO token contract", + "address": "0x36905fc93280f52362a1cbab151f25dc46742fb5", + "token": { + "decimals": 18, + "symbol": "BTO" + }, + "isSC": {} + }, + "0x0c9c7712c83b3c70e7c5e11100d33d9401bdf9dd": { + "name": "WOMBAT token contract", + "address": "0x0c9c7712c83b3c70e7c5e11100d33d9401bdf9dd", + "token": { + "decimals": 18, + "symbol": "WOMBAT" + }, + "isSC": {} + }, + "0x27702a26126e0b3702af63ee09ac4d1a084ef628": { + "name": "Aleph.im Token", + "address": "0x27702a26126e0b3702af63ee09ac4d1a084ef628", + "token": { + "decimals": 18, + "symbol": "ALEPH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aleph.svg" + }, + "0x7f9b09f4717072cf4dc18b95d1b09e2b30c76790": { + "name": "VAULT token contract", + "address": "0x7f9b09f4717072cf4dc18b95d1b09e2b30c76790", + "token": { + "decimals": 18, + "symbol": "VAULT" + }, + "isSC": {} + }, + "0x4bdcb66b968060d9390c1d12bd29734496205581": { + "name": "ACQ token contract", + "address": "0x4bdcb66b968060d9390c1d12bd29734496205581", + "token": { + "decimals": 18, + "symbol": "ACQ" + }, + "isSC": {} + }, + "0xdc8af07a7861bedd104b8093ae3e9376fc8596d2": { + "name": "RVF token contract", + "address": "0xdc8af07a7861bedd104b8093ae3e9376fc8596d2", + "token": { + "decimals": 18, + "symbol": "RVF" + }, + "isSC": {} + }, + "0x1e87d63d11d1c16052bbca06d43ba4ceb4ee686c": { + "name": "BRC20 token contract", + "address": "0x1e87d63d11d1c16052bbca06d43ba4ceb4ee686c", + "token": { + "decimals": 9, + "symbol": "BRC20" + }, + "isSC": {} + }, + "0xc0db17bc219c5ca8746c29ee47862ee3ad742f4a": { + "name": "SCOTTY token contract", + "address": "0xc0db17bc219c5ca8746c29ee47862ee3ad742f4a", + "token": { + "decimals": 16, + "symbol": "SCOTTY" + }, + "isSC": {} + }, + "0xd87996ff3d06858bfc20989aef50cc5fcd4d84ca": { + "name": "GOLDEN token contract", + "address": "0xd87996ff3d06858bfc20989aef50cc5fcd4d84ca", + "token": { + "decimals": 9, + "symbol": "GOLDEN" + }, + "isSC": {} + }, + "0x9fa69536d1cda4a04cfb50688294de75b505a9ae": { + "name": "DERC token contract", + "address": "0x9fa69536d1cda4a04cfb50688294de75b505a9ae", + "token": { + "decimals": 18, + "symbol": "DERC" + }, + "isSC": {} + }, + "0x3446dd70b2d52a6bf4a5a192d9b0a161295ab7f9": { + "name": "SUDO token contract", + "address": "0x3446dd70b2d52a6bf4a5a192d9b0a161295ab7f9", + "token": { + "decimals": 18, + "symbol": "SUDO" + }, + "isSC": {} + }, + "0x83869de76b9ad8125e22b857f519f001588c0f62": { + "name": "EXM token contract", + "address": "0x83869de76b9ad8125e22b857f519f001588c0f62", + "token": { + "decimals": 8, + "symbol": "EXM" + }, + "isSC": {} + }, + "0x97d0cfeb4fde54b430307c9482d6f79c761fe9b6": { + "name": "EPOCH token contract", + "address": "0x97d0cfeb4fde54b430307c9482d6f79c761fe9b6", + "token": { + "decimals": 18, + "symbol": "EPOCH" + }, + "isSC": {} + }, + "0xae05559e5bc86ecca132956fa0482dd7d4b2d76d": { + "name": "UCLONEX token contract", + "address": "0xae05559e5bc86ecca132956fa0482dd7d4b2d76d", + "token": { + "decimals": 18, + "symbol": "UCLONEX" + }, + "isSC": {} + }, + "0xb2617246d0c6c0087f18703d576831899ca94f01": { + "name": "ZIG token contract", + "address": "0xb2617246d0c6c0087f18703d576831899ca94f01", + "token": { + "decimals": 18, + "symbol": "ZIG" + }, + "isSC": {} + }, + "0xfa05a73ffe78ef8f1a739473e462c54bae6567d9": { + "name": "Lunyr Token", + "address": "0xfa05a73ffe78ef8f1a739473e462c54bae6567d9", + "token": { + "decimals": 18, + "symbol": "LUN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/lun.svg" + }, + "0xe1bad922f84b198a08292fb600319300ae32471b": { + "name": "FCT token contract", + "address": "0xe1bad922f84b198a08292fb600319300ae32471b", + "token": { + "decimals": 18, + "symbol": "FCT" + }, + "isSC": {} + }, + "0x8fac8031e079f409135766c7d5de29cf22ef897c": { + "name": "HEART token contract", + "address": "0x8fac8031e079f409135766c7d5de29cf22ef897c", + "token": { + "decimals": 18, + "symbol": "HEART" + }, + "isSC": {} + }, + "0x8457ca5040ad67fdebbcc8edce889a335bc0fbfb": { + "name": "ALT token contract", + "address": "0x8457ca5040ad67fdebbcc8edce889a335bc0fbfb", + "token": { + "decimals": 18, + "symbol": "ALT" + }, + "isSC": {} + }, + "0xcc0d1b36d88fd8f5f26fd00e4e769e2dab4e3e07": { + "name": "LIGHT token contract", + "address": "0xcc0d1b36d88fd8f5f26fd00e4e769e2dab4e3e07", + "token": { + "decimals": 18, + "symbol": "LIGHT" + }, + "isSC": {} + }, + "0x15e6e0d4ebeac120f9a97e71faa6a0235b85ed12": { + "name": "SAVM token contract", + "address": "0x15e6e0d4ebeac120f9a97e71faa6a0235b85ed12", + "token": { + "decimals": 18, + "symbol": "SAVM" + }, + "isSC": {} + }, + "0x28b5e12cce51f15594b0b91d5b5adaa70f684a02": { + "name": "NPX token contract", + "address": "0x28b5e12cce51f15594b0b91d5b5adaa70f684a02", + "token": { + "decimals": 2, + "symbol": "NPX" + }, + "isSC": {} + }, + "0xbb0e17ef65f82ab018d8edd776e8dd940327b28b": { + "name": "Axie Infinity Shard", + "address": "0xbb0e17ef65f82ab018d8edd776e8dd940327b28b", + "token": { + "decimals": 18, + "symbol": "AXS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/AXS.svg" + }, + "0x0e573ce2736dd9637a0b21058352e1667925c7a8": { + "name": "USDV token contract", + "address": "0x0e573ce2736dd9637a0b21058352e1667925c7a8", + "token": { + "decimals": 6, + "symbol": "USDV" + }, + "isSC": {} + }, + "0x69fa8e7f6bf1ca1fb0de61e1366f7412b827cc51": { + "name": "NRCH token contract", + "address": "0x69fa8e7f6bf1ca1fb0de61e1366f7412b827cc51", + "token": { + "decimals": 9, + "symbol": "NRCH" + }, + "isSC": {} + }, + "0x6bb61215298f296c55b19ad842d3df69021da2ef": { + "name": "DOP token contract", + "address": "0x6bb61215298f296c55b19ad842d3df69021da2ef", + "token": { + "decimals": 18, + "symbol": "DOP" + }, + "isSC": {} + }, + "0x734c90044a0ba31b3f2e640c10dc5d3540499bfd": { + "name": "TSX token contract", + "address": "0x734c90044a0ba31b3f2e640c10dc5d3540499bfd", + "token": { + "decimals": 18, + "symbol": "TSX" + }, + "isSC": {} + }, + "0x69bbc3f8787d573f1bbdd0a5f40c7ba0aee9bcc9": { + "name": "YUP token contract", + "address": "0x69bbc3f8787d573f1bbdd0a5f40c7ba0aee9bcc9", + "token": { + "decimals": 18, + "symbol": "YUP" + }, + "isSC": {} + }, + "0xf0f67ddb45c90946d717f2225910cb940c28afae": { + "name": "MEMES token contract", + "address": "0xf0f67ddb45c90946d717f2225910cb940c28afae", + "token": { + "decimals": 18, + "symbol": "MEMES" + }, + "isSC": {} + }, + "0x2ed2cc2c858a8a8219fd2f2d9e170285dbd02756": { + "name": "SBET token contract", + "address": "0x2ed2cc2c858a8a8219fd2f2d9e170285dbd02756", + "token": { + "decimals": 18, + "symbol": "SBET" + }, + "isSC": {} + }, + "0x382ac32e9abe17f424a74e8ce0a92c0f18788f9a": { + "name": "HOTT token contract", + "address": "0x382ac32e9abe17f424a74e8ce0a92c0f18788f9a", + "token": { + "decimals": 18, + "symbol": "HOTT" + }, + "isSC": {} + }, + "0x471ea49dd8e60e697f4cac262b5fafcc307506e4": { + "name": "RMRK token contract", + "address": "0x471ea49dd8e60e697f4cac262b5fafcc307506e4", + "token": { + "decimals": 10, + "symbol": "RMRK" + }, + "isSC": {} + }, + "0xcf9560b9e952b195d408be966e4f6cf4ab8206e5": { + "name": "EVIL token contract", + "address": "0xcf9560b9e952b195d408be966e4f6cf4ab8206e5", + "token": { + "decimals": 18, + "symbol": "EVIL" + }, + "isSC": {} + }, + "0x7c32db0645a259fae61353c1f891151a2e7f8c1e": { + "name": "PTM token contract", + "address": "0x7c32db0645a259fae61353c1f891151a2e7f8c1e", + "token": { + "decimals": 18, + "symbol": "PTM" + }, + "isSC": {} + }, + "0xf5cfbc74057c610c8ef151a439252680ac68c6dc": { + "name": "OCT token contract", + "address": "0xf5cfbc74057c610c8ef151a439252680ac68c6dc", + "token": { + "decimals": 18, + "symbol": "OCT" + }, + "isSC": {} + }, + "0x2a03a891add2dc6d0f7b94419086630ba5cb65b6": { + "name": "DV token contract", + "address": "0x2a03a891add2dc6d0f7b94419086630ba5cb65b6", + "token": { + "decimals": 18, + "symbol": "DV" + }, + "isSC": {} + }, + "0xfd26e39807772251c3bb90fb1fcd9ce5b80c5c24": { + "name": "CODEX token contract", + "address": "0xfd26e39807772251c3bb90fb1fcd9ce5b80c5c24", + "token": { + "decimals": 9, + "symbol": "CODEX" + }, + "isSC": {} + }, + "0xa1d65e8fb6e87b60feccbc582f7f97804b725521": { + "name": "DXD token contract", + "address": "0xa1d65e8fb6e87b60feccbc582f7f97804b725521", + "token": { + "decimals": 18, + "symbol": "DXD" + }, + "isSC": {} + }, + "0xea3983fc6d0fbbc41fb6f6091f68f3e08894dc06": { + "name": "UDO token contract", + "address": "0xea3983fc6d0fbbc41fb6f6091f68f3e08894dc06", + "token": { + "decimals": 18, + "symbol": "UDO" + }, + "isSC": {} + }, + "0x9625ce7753ace1fa1865a47aae2c5c2ce4418569": { + "name": "KAP Games", + "address": "0x9625ce7753ace1fa1865a47aae2c5c2ce4418569", + "token": { + "decimals": 18, + "symbol": "KAP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kap-games.svg" + }, + "0x7a8946eda77817126ffe301249f6dc4c7df293c3": { + "name": "DYL token contract", + "address": "0x7a8946eda77817126ffe301249f6dc4c7df293c3", + "token": { + "decimals": 18, + "symbol": "DYL" + }, + "isSC": {} + }, + "0x93109af5638be68ed2d0e094f618777ff1051d28": { + "name": "UN token contract", + "address": "0x93109af5638be68ed2d0e094f618777ff1051d28", + "token": { + "decimals": 18, + "symbol": "UN" + }, + "isSC": {} + }, + "0x8353b92201f19b4812eee32efd325f7ede123718": { + "name": "SCM token contract", + "address": "0x8353b92201f19b4812eee32efd325f7ede123718", + "token": { + "decimals": 18, + "symbol": "SCM" + }, + "isSC": {} + }, + "0x973e52691176d36453868d9d86572788d27041a9": { + "name": "DX token contract", + "address": "0x973e52691176d36453868d9d86572788d27041a9", + "token": { + "decimals": 18, + "symbol": "DX" + }, + "isSC": {} + }, + "0x243cacb4d5ff6814ad668c3e225246efa886ad5a": { + "name": "Shina Inu", + "address": "0x243cacb4d5ff6814ad668c3e225246efa886ad5a", + "token": { + "decimals": 18, + "symbol": "SHI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/shina.svg" + }, + "0x97a3bd8a445cc187c6a751f392e15c3b2134d695": { + "name": "BXR token contract", + "address": "0x97a3bd8a445cc187c6a751f392e15c3b2134d695", + "token": { + "decimals": 18, + "symbol": "BXR" + }, + "isSC": {} + }, + "0xa5ca62d95d24a4a350983d5b8ac4eb8638887396": { + "name": "YVSUSD token contract", + "address": "0xa5ca62d95d24a4a350983d5b8ac4eb8638887396", + "token": { + "decimals": 18, + "symbol": "YVSUSD" + }, + "isSC": {} + }, + "0x36919a60a2b67b6d2329863093d180d23d5a0308": { + "name": "KUSUNOKI token contract", + "address": "0x36919a60a2b67b6d2329863093d180d23d5a0308", + "token": { + "decimals": 18, + "symbol": "KUSUNOKI" + }, + "isSC": {} + }, + "0x2ef8a2ccb058915e00e16aa13cc6e36f19d8893b": { + "name": "VDO token contract", + "address": "0x2ef8a2ccb058915e00e16aa13cc6e36f19d8893b", + "token": { + "decimals": 18, + "symbol": "VDO" + }, + "isSC": {} + }, + "0xbf2179859fc6d5bee9bf9158632dc51678a4100e": { + "name": "AELF", + "address": "0xbf2179859fc6d5bee9bf9158632dc51678a4100e", + "token": { + "decimals": 18, + "symbol": "ELF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/elf.svg" + }, + "0x2f1ee92524285012c02a4e638ec010fa7f61fd94": { + "name": "SLS token contract", + "address": "0x2f1ee92524285012c02a4e638ec010fa7f61fd94", + "token": { + "decimals": 18, + "symbol": "SLS" + }, + "isSC": {} + }, + "0xa21af1050f7b26e0cff45ee51548254c41ed6b5c": { + "name": "OSAK token contract", + "address": "0xa21af1050f7b26e0cff45ee51548254c41ed6b5c", + "token": { + "decimals": 18, + "symbol": "OSAK" + }, + "isSC": {} + }, + "0x27b5739e22ad9033bcbf192059122d163b60349d": { + "name": "ST-YCRV token contract", + "address": "0x27b5739e22ad9033bcbf192059122d163b60349d", + "token": { + "decimals": 18, + "symbol": "ST-YCRV" + }, + "isSC": {} + }, + "0x8c088775e4139af116ac1fa6f281bbf71e8c1c73": { + "name": "PUMLX token contract", + "address": "0x8c088775e4139af116ac1fa6f281bbf71e8c1c73", + "token": { + "decimals": 18, + "symbol": "PUMLX" + }, + "isSC": {} + }, + "0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d": { + "name": "LQTY token contract", + "address": "0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d", + "token": { + "decimals": 18, + "symbol": "LQTY" + }, + "isSC": {} + }, + "0xacdf0dba4b9839b96221a8487e9ca660a48212be": { + "name": "HYUSD token contract", + "address": "0xacdf0dba4b9839b96221a8487e9ca660a48212be", + "token": { + "decimals": 18, + "symbol": "HYUSD" + }, + "isSC": {} + }, + "0xd3210f246ae54c5a45a7b4a83315bf718f591bfc": { + "name": "ArkiTech", + "address": "0xd3210f246ae54c5a45a7b4a83315bf718f591bfc", + "token": { + "decimals": 9, + "symbol": "ARKI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ARKI.svg" + }, + "0xb459f7204a8ac84f9e7758d6d839ebd01670e35c": { + "name": "LOTTY token contract", + "address": "0xb459f7204a8ac84f9e7758d6d839ebd01670e35c", + "token": { + "decimals": 18, + "symbol": "LOTTY" + }, + "isSC": {} + }, + "0x4086e77c5e993fdb90a406285d00111a974f877a": { + "name": "BRWL token contract", + "address": "0x4086e77c5e993fdb90a406285d00111a974f877a", + "token": { + "decimals": 4, + "symbol": "BRWL" + }, + "isSC": {} + }, + "0x44face2e310e543f6d85867eb06fb251e3bfe1fc": { + "name": "BAKE token contract", + "address": "0x44face2e310e543f6d85867eb06fb251e3bfe1fc", + "token": { + "decimals": 9, + "symbol": "BAKE" + }, + "isSC": {} + }, + "0x42069d11a2cc72388a2e06210921e839cfbd3280": { + "name": "GNOME token contract", + "address": "0x42069d11a2cc72388a2e06210921e839cfbd3280", + "token": { + "decimals": 18, + "symbol": "GNOME" + }, + "isSC": {} + }, + "0xb25ea095997f5bbaa6cea962c4fbf3bfc3c09776": { + "name": "FIRE token contract", + "address": "0xb25ea095997f5bbaa6cea962c4fbf3bfc3c09776", + "token": { + "decimals": 9, + "symbol": "FIRE" + }, + "isSC": {} + }, + "0x2ad9addd0d97ec3cdba27f92bf6077893b76ab0b": { + "name": "PLANET token contract", + "address": "0x2ad9addd0d97ec3cdba27f92bf6077893b76ab0b", + "token": { + "decimals": 18, + "symbol": "PLANET" + }, + "isSC": {} + }, + "0x42bbfa2e77757c645eeaad1655e0911a7553efbc": { + "name": "BOBA token contract", + "address": "0x42bbfa2e77757c645eeaad1655e0911a7553efbc", + "token": { + "decimals": 18, + "symbol": "BOBA" + }, + "isSC": {} + }, + "0x44ff8620b8ca30902395a7bd3f2407e1a091bf73": { + "name": "VIRTUAL token contract", + "address": "0x44ff8620b8ca30902395a7bd3f2407e1a091bf73", + "token": { + "decimals": 18, + "symbol": "VIRTUAL" + }, + "isSC": {} + }, + "0x0391d2021f89dc339f60fff84546ea23e337750f": { + "name": "BOND token contract", + "address": "0x0391d2021f89dc339f60fff84546ea23e337750f", + "token": { + "decimals": 18, + "symbol": "BOND" + }, + "isSC": {} + }, + "0x52662717e448be36cb54588499d5a8328bd95292": { + "name": "TENSHI token contract", + "address": "0x52662717e448be36cb54588499d5a8328bd95292", + "token": { + "decimals": 18, + "symbol": "TENSHI" + }, + "isSC": {} + }, + "0x1250b98cbde9f99f4c42dcdacee193221f17eb50": { + "name": "AC token contract", + "address": "0x1250b98cbde9f99f4c42dcdacee193221f17eb50", + "token": { + "decimals": 18, + "symbol": "AC" + }, + "isSC": {} + }, + "0x00c2999c8b2adf4abc835cc63209533973718eb1": { + "name": "STATE token contract", + "address": "0x00c2999c8b2adf4abc835cc63209533973718eb1", + "token": { + "decimals": 18, + "symbol": "STATE" + }, + "isSC": {} + }, + "0x3597bfd533a99c9aa083587b074434e61eb0a258": { + "name": "DENT token contract", + "address": "0x3597bfd533a99c9aa083587b074434e61eb0a258", + "token": { + "decimals": 8, + "symbol": "DENT" + }, + "isSC": {} + }, + "0x757c67cb79a4dc8af386cb3abf32359c9a99f652": { + "name": "MLP token contract", + "address": "0x757c67cb79a4dc8af386cb3abf32359c9a99f652", + "token": { + "decimals": 9, + "symbol": "MLP" + }, + "isSC": {} + }, + "0x817bbdbc3e8a1204f3691d14bb44992841e3db35": { + "name": "CUDOS token contract", + "address": "0x817bbdbc3e8a1204f3691d14bb44992841e3db35", + "token": { + "decimals": 18, + "symbol": "CUDOS" + }, + "isSC": {} + }, + "0x3832d2f059e55934220881f831be501d180671a7": { + "name": "RENDOGE token contract", + "address": "0x3832d2f059e55934220881f831be501d180671a7", + "token": { + "decimals": 8, + "symbol": "RENDOGE" + }, + "isSC": {} + }, + "0x8248270620aa532e4d64316017be5e873e37cc09": { + "name": "DEVVE token contract", + "address": "0x8248270620aa532e4d64316017be5e873e37cc09", + "token": { + "decimals": 18, + "symbol": "DEVVE" + }, + "isSC": {} + }, + "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f": { + "name": "Gitcoin", + "address": "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", + "token": { + "decimals": 18, + "symbol": "GTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gtc.svg" + }, + "0xcfa0885131f602d11d4da248d2c65a62063567a9": { + "name": "TORG token contract", + "address": "0xcfa0885131f602d11d4da248d2c65a62063567a9", + "token": { + "decimals": 18, + "symbol": "TORG" + }, + "isSC": {} + }, + "0x4ffe9cc172527df1e40d0b2efe1e9f05884a13da": { + "name": "USA token contract", + "address": "0x4ffe9cc172527df1e40d0b2efe1e9f05884a13da", + "token": { + "decimals": 18, + "symbol": "USA" + }, + "isSC": {} + }, + "0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c": { + "name": "GOF token contract", + "address": "0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c", + "token": { + "decimals": 18, + "symbol": "GOF" + }, + "isSC": {} + }, + "0xa64efd5fe826f62e310a951332b519e1e3871489": { + "name": "BCAU token contract", + "address": "0xa64efd5fe826f62e310a951332b519e1e3871489", + "token": { + "decimals": 18, + "symbol": "BCAU" + }, + "isSC": {} + }, + "0xc3dbd99da846ea38d34430d852795684a211428b": { + "name": "LYF token contract", + "address": "0xc3dbd99da846ea38d34430d852795684a211428b", + "token": { + "decimals": 18, + "symbol": "LYF" + }, + "isSC": {} + }, + "0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd": { + "name": "EVY token contract", + "address": "0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd", + "token": { + "decimals": 12, + "symbol": "EVY" + }, + "isSC": {} + }, + "0xce593a29905951e8fc579bc092eca72577da575c": { + "name": "GR token contract", + "address": "0xce593a29905951e8fc579bc092eca72577da575c", + "token": { + "decimals": 6, + "symbol": "GR" + }, + "isSC": {} + }, + "0x7d8146cf21e8d7cbe46054e01588207b51198729": { + "name": "BOB token contract", + "address": "0x7d8146cf21e8d7cbe46054e01588207b51198729", + "token": { + "decimals": 18, + "symbol": "BOB" + }, + "isSC": {} + }, + "0x320d31183100280ccdf69366cd56180ea442a3e8": { + "name": "LHC token contract", + "address": "0x320d31183100280ccdf69366cd56180ea442a3e8", + "token": { + "decimals": 8, + "symbol": "LHC" + }, + "isSC": {} + }, + "0xea4a2327e75252517535fd013b7c6706609819db": { + "name": "SNS token contract", + "address": "0xea4a2327e75252517535fd013b7c6706609819db", + "token": { + "decimals": 18, + "symbol": "SNS" + }, + "isSC": {} + }, + "0xc8807f0f5ba3fa45ffbdc66928d71c5289249014": { + "name": "ISP token contract", + "address": "0xc8807f0f5ba3fa45ffbdc66928d71c5289249014", + "token": { + "decimals": 18, + "symbol": "ISP" + }, + "isSC": {} + }, + "0xa2847348b58ced0ca58d23c7e9106a49f1427df6": { + "name": "CVXFPIS token contract", + "address": "0xa2847348b58ced0ca58d23c7e9106a49f1427df6", + "token": { + "decimals": 18, + "symbol": "CVXFPIS" + }, + "isSC": {} + }, + "0xb009bfaaf85e53f55d8657781eb69feaaed83672": { + "name": "EGS token contract", + "address": "0xb009bfaaf85e53f55d8657781eb69feaaed83672", + "token": { + "decimals": 18, + "symbol": "EGS" + }, + "isSC": {} + }, + "0xf951e335afb289353dc249e82926178eac7ded78": { + "name": "SWETH token contract", + "address": "0xf951e335afb289353dc249e82926178eac7ded78", + "token": { + "decimals": 18, + "symbol": "SWETH" + }, + "isSC": {} + }, + "0xdab396ccf3d84cf2d07c4454e10c8a6f5b008d2b": { + "name": "GFI token contract", + "address": "0xdab396ccf3d84cf2d07c4454e10c8a6f5b008d2b", + "token": { + "decimals": 18, + "symbol": "GFI" + }, + "isSC": {} + }, + "0x993864e43caa7f7f12953ad6feb1d1ca635b875f": { + "name": "SDAO token contract", + "address": "0x993864e43caa7f7f12953ad6feb1d1ca635b875f", + "token": { + "decimals": 18, + "symbol": "SDAO" + }, + "isSC": {} + }, + "0xae0585a259a3bcab258d6ee02fb583f7b33c2a12": { + "name": "TempleCoin", + "address": "0xae0585a259a3bcab258d6ee02fb583f7b33c2a12", + "token": { + "decimals": 18, + "symbol": "TEM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tem.svg" + }, + "0x7635b612792e4bfb7f2fa12a3e5d5a3f2e3c34bc": { + "name": "LCNY token contract", + "address": "0x7635b612792e4bfb7f2fa12a3e5d5a3f2e3c34bc", + "token": { + "decimals": 18, + "symbol": "LCNY" + }, + "isSC": {} + }, + "0x63f7b1b538a78cb699e5399621b3d2e047c40de4": { + "name": "MAX token contract", + "address": "0x63f7b1b538a78cb699e5399621b3d2e047c40de4", + "token": { + "decimals": 18, + "symbol": "MAX" + }, + "isSC": {} + }, + "0xc31cebf8f9e825d1d1244d73d0a65e44bd5210db": { + "name": "CRYN token contract", + "address": "0xc31cebf8f9e825d1d1244d73d0a65e44bd5210db", + "token": { + "decimals": 8, + "symbol": "CRYN" + }, + "isSC": {} + }, + "0x96610186f3ab8d73ebee1cf950c750f3b1fb79c2": { + "name": "EJS token contract", + "address": "0x96610186f3ab8d73ebee1cf950c750f3b1fb79c2", + "token": { + "decimals": 18, + "symbol": "EJS" + }, + "isSC": {} + }, + "0xf2dfdbe1ea71bbdcb5a4662a16dbf5e487be3ebe": { + "name": "CLOUD token contract", + "address": "0xf2dfdbe1ea71bbdcb5a4662a16dbf5e487be3ebe", + "token": { + "decimals": 18, + "symbol": "CLOUD" + }, + "isSC": {} + }, + "0x1fac00ccee478eced6a120a50ed2ab28ee7fe32b": { + "name": "TUNE token contract", + "address": "0x1fac00ccee478eced6a120a50ed2ab28ee7fe32b", + "token": { + "decimals": 18, + "symbol": "TUNE" + }, + "isSC": {} + }, + "0x2da719db753dfa10a62e140f436e1d67f2ddb0d6": { + "name": "CERE token contract", + "address": "0x2da719db753dfa10a62e140f436e1d67f2ddb0d6", + "token": { + "decimals": 10, + "symbol": "CERE" + }, + "isSC": {} + }, + "0xa1817b6d8d890f3943b61648992730373b71f156": { + "name": "MONGOOSE token contract", + "address": "0xa1817b6d8d890f3943b61648992730373b71f156", + "token": { + "decimals": 9, + "symbol": "MONGOOSE" + }, + "isSC": {} + }, + "0x433fce7dfbec729a79999eaf056cb073b2153eba": { + "name": "CNW token contract", + "address": "0x433fce7dfbec729a79999eaf056cb073b2153eba", + "token": { + "decimals": 6, + "symbol": "CNW" + }, + "isSC": {} + }, + "0x5224f552f110ec78e6e0468138950ae5f3040942": { + "name": "ANOM token contract", + "address": "0x5224f552f110ec78e6e0468138950ae5f3040942", + "token": { + "decimals": 18, + "symbol": "ANOM" + }, + "isSC": {} + }, + "0x116c4b65e14449947bc6fa1bbe844cb16a162d53": { + "name": "BMAX token contract", + "address": "0x116c4b65e14449947bc6fa1bbe844cb16a162d53", + "token": { + "decimals": 18, + "symbol": "BMAX" + }, + "isSC": {} + }, + "0xb2a63a5dd36c91ec2da59b188ff047f66fac122a": { + "name": "FOLO token contract", + "address": "0xb2a63a5dd36c91ec2da59b188ff047f66fac122a", + "token": { + "decimals": 18, + "symbol": "FOLO" + }, + "isSC": {} + }, + "0xd04202abd9568a8a8798484ca1bd8778411f7103": { + "name": "FIREBOT token contract", + "address": "0xd04202abd9568a8a8798484ca1bd8778411f7103", + "token": { + "decimals": 18, + "symbol": "FIREBOT" + }, + "isSC": {} + }, + "0xa1a4e303e9c56962f201c5e834abc1e677a3c4f3": { + "name": "CVNX token contract", + "address": "0xa1a4e303e9c56962f201c5e834abc1e677a3c4f3", + "token": { + "decimals": 18, + "symbol": "CVNX" + }, + "isSC": {} + }, + "0x16594930d16f3970e1a4317c6016555cb2e7b7fc": { + "name": "TKB token contract", + "address": "0x16594930d16f3970e1a4317c6016555cb2e7b7fc", + "token": { + "decimals": 18, + "symbol": "TKB" + }, + "isSC": {} + }, + "0xd01409314acb3b245cea9500ece3f6fd4d70ea30": { + "name": "LTO Network Token", + "address": "0xd01409314acb3b245cea9500ece3f6fd4d70ea30", + "token": { + "decimals": 8, + "symbol": "LTO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LTO.svg" + }, + "0xe3668873d944e4a949da05fc8bde419eff543882": { + "name": "YPRISMA token contract", + "address": "0xe3668873d944e4a949da05fc8bde419eff543882", + "token": { + "decimals": 18, + "symbol": "YPRISMA" + }, + "isSC": {} + }, + "0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321": { + "name": "VITA token contract", + "address": "0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321", + "token": { + "decimals": 18, + "symbol": "VITA" + }, + "isSC": {} + }, + "0x2f573070e6090b3264fe707e2c9f201716f123c7": { + "name": "MUMU token contract", + "address": "0x2f573070e6090b3264fe707e2c9f201716f123c7", + "token": { + "decimals": 18, + "symbol": "MUMU" + }, + "isSC": {} + }, + "0xd578779dbc9252218e12d18d628e3cb27e4a56f2": { + "name": "BRT token contract", + "address": "0xd578779dbc9252218e12d18d628e3cb27e4a56f2", + "token": { + "decimals": 18, + "symbol": "BRT" + }, + "isSC": {} + }, + "0x0100546f2cd4c9d97f798ffc9755e47865ff7ee6": { + "name": "ALETH token contract", + "address": "0x0100546f2cd4c9d97f798ffc9755e47865ff7ee6", + "token": { + "decimals": 18, + "symbol": "ALETH" + }, + "isSC": {} + }, + "0x7658b8cd4719080ad377dfe28dfc19c761a3cb75": { + "name": "MAI token contract", + "address": "0x7658b8cd4719080ad377dfe28dfc19c761a3cb75", + "token": { + "decimals": 18, + "symbol": "MAI" + }, + "isSC": {} + }, + "0x3ac81633a291f342b62e7de5d00eb02924032e06": { + "name": "FANX token contract", + "address": "0x3ac81633a291f342b62e7de5d00eb02924032e06", + "token": { + "decimals": 18, + "symbol": "FANX" + }, + "isSC": {} + }, + "0xcf4c68db4c2fa0bf58df07b14f45ce7709a716ac": { + "name": "SHIELD token contract", + "address": "0xcf4c68db4c2fa0bf58df07b14f45ce7709a716ac", + "token": { + "decimals": 18, + "symbol": "SHIELD" + }, + "isSC": {} + }, + "0x340d2bde5eb28c1eed91b2f790723e3b160613b7": { + "name": "VEE token contract", + "address": "0x340d2bde5eb28c1eed91b2f790723e3b160613b7", + "token": { + "decimals": 18, + "symbol": "VEE" + }, + "isSC": {} + }, + "0xc150a5841e5b0f046a46e85fb22cbd05185b20f2": { + "name": "FLASH token contract", + "address": "0xc150a5841e5b0f046a46e85fb22cbd05185b20f2", + "token": { + "decimals": 18, + "symbol": "FLASH" + }, + "isSC": {} + }, + "0x97a9bac06f90940bce9caec2b880ff17707519e4": { + "name": "MNTO token contract", + "address": "0x97a9bac06f90940bce9caec2b880ff17707519e4", + "token": { + "decimals": 18, + "symbol": "MNTO" + }, + "isSC": {} + }, + "0x411099c0b413f4feddb10edf6a8be63bd321311c": { + "name": "HELLO token contract", + "address": "0x411099c0b413f4feddb10edf6a8be63bd321311c", + "token": { + "decimals": 18, + "symbol": "HELLO" + }, + "isSC": {} + }, + "0x38e382f74dfb84608f3c1f10187f6bef5951de93": { + "name": "MUBI", + "address": "0x38e382f74dfb84608f3c1f10187f6bef5951de93", + "token": { + "decimals": 18, + "symbol": "MUBI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MUBI.svg" + }, + "0xdac657ffd44a3b9d8aba8749830bf14beb66ff2d": { + "name": "HDAO token contract", + "address": "0xdac657ffd44a3b9d8aba8749830bf14beb66ff2d", + "token": { + "decimals": 18, + "symbol": "HDAO" + }, + "isSC": {} + }, + "0xda23d301761e4e2bf474951f978f6dfb6f3c9f14": { + "name": "TKINU token contract", + "address": "0xda23d301761e4e2bf474951f978f6dfb6f3c9f14", + "token": { + "decimals": 9, + "symbol": "TKINU" + }, + "isSC": {} + }, + "0xdfb03da57a3c56124c72a47729a1d0ed54d38ff5": { + "name": "HEDEX token contract", + "address": "0xdfb03da57a3c56124c72a47729a1d0ed54d38ff5", + "token": { + "decimals": 9, + "symbol": "HEDEX" + }, + "isSC": {} + }, + "0x9f284e1337a815fe77d2ff4ae46544645b20c5ff": { + "name": "Darwinia Commitment Token", + "address": "0x9f284e1337a815fe77d2ff4ae46544645b20c5ff", + "token": { + "decimals": 18, + "symbol": "KTON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kton.svg" + }, + "0xe22910d04bdc9d55570f3bc52e786b49dddf37b4": { + "name": "GATSBY token contract", + "address": "0xe22910d04bdc9d55570f3bc52e786b49dddf37b4", + "token": { + "decimals": 18, + "symbol": "GATSBY" + }, + "isSC": {} + }, + "0x9cf98eb8a8b28c83e8612046cf55701ce3eb0063": { + "name": "UGT token contract", + "address": "0x9cf98eb8a8b28c83e8612046cf55701ce3eb0063", + "token": { + "decimals": 18, + "symbol": "UGT" + }, + "isSC": {} + }, + "0xf3bb9f16677f2b86efd1dfca1c141a99783fde58": { + "name": "CROWN token contract", + "address": "0xf3bb9f16677f2b86efd1dfca1c141a99783fde58", + "token": { + "decimals": 18, + "symbol": "CROWN" + }, + "isSC": {} + }, + "0x710287d1d39dcf62094a83ebb3e736e79400068a": { + "name": "ENQAI token contract", + "address": "0x710287d1d39dcf62094a83ebb3e736e79400068a", + "token": { + "decimals": 18, + "symbol": "ENQAI" + }, + "isSC": {} + }, + "0x674c6ad92fd080e4004b2312b45f796a192d27a0": { + "name": "Neutrino USD", + "address": "0x674c6ad92fd080e4004b2312b45f796a192d27a0", + "token": { + "decimals": 18, + "symbol": "USDN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usdn.svg" + }, + "0x18cc2ba8995c6307e355726244adb023cf00522f": { + "name": "MONKE token contract", + "address": "0x18cc2ba8995c6307e355726244adb023cf00522f", + "token": { + "decimals": 9, + "symbol": "MONKE" + }, + "isSC": {} + }, + "0x9b44793a0177c84dd01ad81137db696531902871": { + "name": "PVP token contract", + "address": "0x9b44793a0177c84dd01ad81137db696531902871", + "token": { + "decimals": 18, + "symbol": "PVP" + }, + "isSC": {} + }, + "0xec5483804e637d45cde22fa0869656b64b5ab1ab": { + "name": "ACE token contract", + "address": "0xec5483804e637d45cde22fa0869656b64b5ab1ab", + "token": { + "decimals": 18, + "symbol": "ACE" + }, + "isSC": {} + }, + "0xb8a768cd332e4461fccfbdb1d0292ceffbb2bb8a": { + "name": "COLLIE token contract", + "address": "0xb8a768cd332e4461fccfbdb1d0292ceffbb2bb8a", + "token": { + "decimals": 18, + "symbol": "COLLIE" + }, + "isSC": {} + }, + "0xf252b65e702e88a1040be99b2c1bdb645a7e1b0a": { + "name": "BREAD token contract", + "address": "0xf252b65e702e88a1040be99b2c1bdb645a7e1b0a", + "token": { + "decimals": 18, + "symbol": "BREAD" + }, + "isSC": {} + }, + "0xf720e38f678b29b243f7d53b56acbf5de98f2385": { + "name": "UPR token contract", + "address": "0xf720e38f678b29b243f7d53b56acbf5de98f2385", + "token": { + "decimals": 18, + "symbol": "UPR" + }, + "isSC": {} + }, + "0x19dd1cc08a8bdb124a3f57a364f1d72b7a19c3ef": { + "name": "RAS token contract", + "address": "0x19dd1cc08a8bdb124a3f57a364f1d72b7a19c3ef", + "token": { + "decimals": 18, + "symbol": "RAS" + }, + "isSC": {} + }, + "0x7cdbfc86a0bfa20f133748b0cf5cea5b787b182c": { + "name": "TKST token contract", + "address": "0x7cdbfc86a0bfa20f133748b0cf5cea5b787b182c", + "token": { + "decimals": 18, + "symbol": "TKST" + }, + "isSC": {} + }, + "0x3b58c52c03ca5eb619eba171091c86c34d603e5f": { + "name": "CYCLUB token contract", + "address": "0x3b58c52c03ca5eb619eba171091c86c34d603e5f", + "token": { + "decimals": 9, + "symbol": "CYCLUB" + }, + "isSC": {} + }, + "0x17bb9f3572d0c69e017dcd048ec7304eecc981c8": { + "name": "MRPOTATO token contract", + "address": "0x17bb9f3572d0c69e017dcd048ec7304eecc981c8", + "token": { + "decimals": 18, + "symbol": "MRPOTATO" + }, + "isSC": {} + }, + "0xf1c9acdc66974dfb6decb12aa385b9cd01190e38": { + "name": "OSETH token contract", + "address": "0xf1c9acdc66974dfb6decb12aa385b9cd01190e38", + "token": { + "decimals": 18, + "symbol": "OSETH" + }, + "isSC": {} + }, + "0x43a9c989597efeadf11faec609ad8df7d3c18cdb": { + "name": "MCBASE token contract", + "address": "0x43a9c989597efeadf11faec609ad8df7d3c18cdb", + "token": { + "decimals": 18, + "symbol": "MCBASE" + }, + "isSC": {} + }, + "0x313cae7ad4454aac7b208c1f089da2b0e5825e46": { + "name": "RPK token contract", + "address": "0x313cae7ad4454aac7b208c1f089da2b0e5825e46", + "token": { + "decimals": 18, + "symbol": "RPK" + }, + "isSC": {} + }, + "0xe55d97a97ae6a17706ee281486e98a84095d8aaf": { + "name": "AIPAD token contract", + "address": "0xe55d97a97ae6a17706ee281486e98a84095d8aaf", + "token": { + "decimals": 18, + "symbol": "AIPAD" + }, + "isSC": {} + }, + "0x8e1a7f380963945061c4460b0f9c6dc0bdafd94f": { + "name": "XMRY token contract", + "address": "0x8e1a7f380963945061c4460b0f9c6dc0bdafd94f", + "token": { + "decimals": 18, + "symbol": "XMRY" + }, + "isSC": {} + }, + "0xeaa63125dd63f10874f99cdbbb18410e7fc79dd3": { + "name": "HEMULE token contract", + "address": "0xeaa63125dd63f10874f99cdbbb18410e7fc79dd3", + "token": { + "decimals": 18, + "symbol": "HEMULE" + }, + "isSC": {} + }, + "0xcd14517c7397a003aec7404cb8159f16a90f9fe9": { + "name": "AIRBOT token contract", + "address": "0xcd14517c7397a003aec7404cb8159f16a90f9fe9", + "token": { + "decimals": 18, + "symbol": "AIRBOT" + }, + "isSC": {} + }, + "0x33f289d91286535c47270c8479f6776fb3adeb3e": { + "name": "BXBT token contract", + "address": "0x33f289d91286535c47270c8479f6776fb3adeb3e", + "token": { + "decimals": 18, + "symbol": "BXBT" + }, + "isSC": {} + }, + "0xb1e4a5f70090947e6ad3fa2dc648cba7b6f913e9": { + "name": "RAP token contract", + "address": "0xb1e4a5f70090947e6ad3fa2dc648cba7b6f913e9", + "token": { + "decimals": 18, + "symbol": "RAP" + }, + "isSC": {} + }, + "0x33840024177a7daca3468912363bed8b425015c5": { + "name": "EBOX token contract", + "address": "0x33840024177a7daca3468912363bed8b425015c5", + "token": { + "decimals": 18, + "symbol": "EBOX" + }, + "isSC": {} + }, + "0x0eb3032bcac2be1fa95e296442f225edb80fc3cd": { + "name": "ATC token contract", + "address": "0x0eb3032bcac2be1fa95e296442f225edb80fc3cd", + "token": { + "decimals": 18, + "symbol": "ATC" + }, + "isSC": {} + }, + "0x0f7b3f5a8fed821c5eb60049538a548db2d479ce": { + "name": "ATOR token contract", + "address": "0x0f7b3f5a8fed821c5eb60049538a548db2d479ce", + "token": { + "decimals": 18, + "symbol": "ATOR" + }, + "isSC": {} + }, + "0x08c32b0726c5684024ea6e141c50ade9690bbdcc": { + "name": "Stratos Token", + "address": "0x08c32b0726c5684024ea6e141c50ade9690bbdcc", + "token": { + "decimals": 18, + "symbol": "STOS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stos.svg" + }, + "0xce391315b414d4c7555956120461d21808a69f3a": { + "name": "BAO token contract", + "address": "0xce391315b414d4c7555956120461d21808a69f3a", + "token": { + "decimals": 18, + "symbol": "BAO" + }, + "isSC": {} + }, + "0x886124e6472bd36474df6ff3c8f814e998233296": { + "name": "CIA token contract", + "address": "0x886124e6472bd36474df6ff3c8f814e998233296", + "token": { + "decimals": 18, + "symbol": "CIA" + }, + "isSC": {} + }, + "0x0447d3454b25935eed47f65b4bd22b9b23be326a": { + "name": "GEM token contract", + "address": "0x0447d3454b25935eed47f65b4bd22b9b23be326a", + "token": { + "decimals": 18, + "symbol": "GEM" + }, + "isSC": {} + }, + "0xc32db1d3282e872d98f6437d3bcfa57801ca6d5c": { + "name": "ETHEREUM token contract", + "address": "0xc32db1d3282e872d98f6437d3bcfa57801ca6d5c", + "token": { + "decimals": 18, + "symbol": "ETHEREUM" + }, + "isSC": {} + }, + "0x35e78b3982e87ecfd5b3f3265b601c046cdbe232": { + "name": "XAI token contract", + "address": "0x35e78b3982e87ecfd5b3f3265b601c046cdbe232", + "token": { + "decimals": 18, + "symbol": "XAI" + }, + "isSC": {} + }, + "0x27206f5a9afd0c51da95f20972885545d3b33647": { + "name": "KUKU token contract", + "address": "0x27206f5a9afd0c51da95f20972885545d3b33647", + "token": { + "decimals": 0, + "symbol": "KUKU" + }, + "isSC": {} + }, + "0xa1f3aca66403d29b909605040c30ae1f1245d14c": { + "name": "TFBILL token contract", + "address": "0xa1f3aca66403d29b909605040c30ae1f1245d14c", + "token": { + "decimals": 6, + "symbol": "TFBILL" + }, + "isSC": {} + }, + "0x3a97e00b48d56bd5e0502e1a2a8c036a040e1b99": { + "name": "JBOT token contract", + "address": "0x3a97e00b48d56bd5e0502e1a2a8c036a040e1b99", + "token": { + "decimals": 9, + "symbol": "JBOT" + }, + "isSC": {} + }, + "0x31429d1856ad1377a8a0079410b297e1a9e214c2": { + "name": "ANGLE", + "address": "0x31429d1856ad1377a8a0079410b297e1a9e214c2", + "token": { + "decimals": 18, + "symbol": "ANGLE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ANGLE.svg" + }, + "0x3ba925fdeae6b46d0bb4d424d829982cb2f7309e": { + "name": "RBX token contract", + "address": "0x3ba925fdeae6b46d0bb4d424d829982cb2f7309e", + "token": { + "decimals": 18, + "symbol": "RBX" + }, + "isSC": {} + }, + "0xbbeca80a4c99c3b1bd3c10e64595d0fc7dc26ee0": { + "name": "HIMEEBITS token contract", + "address": "0xbbeca80a4c99c3b1bd3c10e64595d0fc7dc26ee0", + "token": { + "decimals": 18, + "symbol": "HIMEEBITS" + }, + "isSC": {} + }, + "0xd624e5c89466a15812c1d45ce1533be1f16c1702": { + "name": "UBDN token contract", + "address": "0xd624e5c89466a15812c1d45ce1533be1f16c1702", + "token": { + "decimals": 18, + "symbol": "UBDN" + }, + "isSC": {} + }, + "0x738865301a9b7dd80dc3666dd48cf034ec42bdda": { + "name": "AGRS token contract", + "address": "0x738865301a9b7dd80dc3666dd48cf034ec42bdda", + "token": { + "decimals": 8, + "symbol": "AGRS" + }, + "isSC": {} + }, + "0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036": { + "name": "0KN token contract", + "address": "0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036", + "token": { + "decimals": 18, + "symbol": "0KN" + }, + "isSC": {} + }, + "0x7c5095bb2dae81bb9a21ee9f1b7815cd710194e5": { + "name": "OBX token contract", + "address": "0x7c5095bb2dae81bb9a21ee9f1b7815cd710194e5", + "token": { + "decimals": 18, + "symbol": "OBX" + }, + "isSC": {} + }, + "0xf1fb4cf949277adc3f89c0d6091100789033b7b5": { + "name": "AIBOT token contract", + "address": "0xf1fb4cf949277adc3f89c0d6091100789033b7b5", + "token": { + "decimals": 18, + "symbol": "AIBOT" + }, + "isSC": {} + }, + "0xbc953fccbcc9e95dafb35d46992cee966aa972cd": { + "name": "DAWAE token contract", + "address": "0xbc953fccbcc9e95dafb35d46992cee966aa972cd", + "token": { + "decimals": 18, + "symbol": "DAWAE" + }, + "isSC": {} + }, + "0xcc09f34accdb36ee3ed98358a3b8a6ae5c29ea07": { + "name": "AW3 token contract", + "address": "0xcc09f34accdb36ee3ed98358a3b8a6ae5c29ea07", + "token": { + "decimals": 18, + "symbol": "AW3" + }, + "isSC": {} + }, + "0x9aeb50f542050172359a0e1a25a9933bc8c01259": { + "name": "OIN token contract", + "address": "0x9aeb50f542050172359a0e1a25a9933bc8c01259", + "token": { + "decimals": 8, + "symbol": "OIN" + }, + "isSC": {} + }, + "0x59d1e836f7b7210a978b25a855085cc46fd090b5": { + "name": "JUSTICE token contract", + "address": "0x59d1e836f7b7210a978b25a855085cc46fd090b5", + "token": { + "decimals": 18, + "symbol": "JUSTICE" + }, + "isSC": {} + }, + "0xa35923162c49cf95e6bf26623385eb431ad920d3": { + "name": "TURBO token contract", + "address": "0xa35923162c49cf95e6bf26623385eb431ad920d3", + "token": { + "decimals": 18, + "symbol": "TURBO" + }, + "isSC": {} + }, + "0x581911b360b6eb3a14ef295a83a91dc2bce2d6f7": { + "name": "MVC token contract", + "address": "0x581911b360b6eb3a14ef295a83a91dc2bce2d6f7", + "token": { + "decimals": 18, + "symbol": "MVC" + }, + "isSC": {} + }, + "0xae83511c4ef07358e2d95b0c219a5f9eb8656a61": { + "name": "BABYFLOKI token contract", + "address": "0xae83511c4ef07358e2d95b0c219a5f9eb8656a61", + "token": { + "decimals": 18, + "symbol": "BABYFLOKI" + }, + "isSC": {} + }, + "0x4e51a6b3cc6d5ae69a0d44db9de846aeb5a582dd": { + "name": "GYOZA token contract", + "address": "0x4e51a6b3cc6d5ae69a0d44db9de846aeb5a582dd", + "token": { + "decimals": 9, + "symbol": "GYOZA" + }, + "isSC": {} + }, + "0xd555498a524612c67f286df0e0a9a64a73a7cdc7": { + "name": "DEFROGS token contract", + "address": "0xd555498a524612c67f286df0e0a9a64a73a7cdc7", + "token": { + "decimals": 18, + "symbol": "DEFROGS" + }, + "isSC": {} + }, + "0xa5b947687163fe88c3e6af5b17ae69896f4abccf": { + "name": "PSDN token contract", + "address": "0xa5b947687163fe88c3e6af5b17ae69896f4abccf", + "token": { + "decimals": 18, + "symbol": "PSDN" + }, + "isSC": {} + }, + "0x94e0bab2f6ab1f19f4750e42d7349f2740513ad5": { + "name": "UNIC token contract", + "address": "0x94e0bab2f6ab1f19f4750e42d7349f2740513ad5", + "token": { + "decimals": 18, + "symbol": "UNIC" + }, + "isSC": {} + }, + "0xc106b98c4d0b3f1c92da0e9a6089e9c63ceacbb0": { + "name": "TRND token contract", + "address": "0xc106b98c4d0b3f1c92da0e9a6089e9c63ceacbb0", + "token": { + "decimals": 9, + "symbol": "TRND" + }, + "isSC": {} + }, + "0xbbc25e2a2948df4abf61a138f570ce6c4e729fb1": { + "name": "SLURP token contract", + "address": "0xbbc25e2a2948df4abf61a138f570ce6c4e729fb1", + "token": { + "decimals": 18, + "symbol": "SLURP" + }, + "isSC": {} + }, + "0x36e43065e977bc72cb86dbd8405fae7057cdc7fd": { + "name": "ARCHA token contract", + "address": "0x36e43065e977bc72cb86dbd8405fae7057cdc7fd", + "token": { + "decimals": 9, + "symbol": "ARCHA" + }, + "isSC": {} + }, + "0xa1290d69c65a6fe4df752f95823fae25cb99e5a7": { + "name": "RSETH token contract", + "address": "0xa1290d69c65a6fe4df752f95823fae25cb99e5a7", + "token": { + "decimals": 18, + "symbol": "RSETH" + }, + "isSC": {} + }, + "0x20910e5b5f087f6439dfcb0dda4e27d1014ac2b8": { + "name": "BNA token contract", + "address": "0x20910e5b5f087f6439dfcb0dda4e27d1014ac2b8", + "token": { + "decimals": 18, + "symbol": "BNA" + }, + "isSC": {} + }, + "0x67b66c99d3eb37fa76aa3ed1ff33e8e39f0b9c7a": { + "name": "IBETH token contract", + "address": "0x67b66c99d3eb37fa76aa3ed1ff33e8e39f0b9c7a", + "token": { + "decimals": 18, + "symbol": "IBETH" + }, + "isSC": {} + }, + "0x0e79de3a7ee59abf6086c2138231b1f8ec8c638e": { + "name": "DUEL token contract", + "address": "0x0e79de3a7ee59abf6086c2138231b1f8ec8c638e", + "token": { + "decimals": 18, + "symbol": "DUEL" + }, + "isSC": {} + }, + "0xf9fb4ad91812b704ba883b11d2b576e890a6730a": { + "name": "AAMMWETH token contract", + "address": "0xf9fb4ad91812b704ba883b11d2b576e890a6730a", + "token": { + "decimals": 18, + "symbol": "AAMMWETH" + }, + "isSC": {} + }, + "0xa683929289b52a0f3f24fef9d6bf1fbbaeb49e9d": { + "name": "VELOS token contract", + "address": "0xa683929289b52a0f3f24fef9d6bf1fbbaeb49e9d", + "token": { + "decimals": 9, + "symbol": "VELOS" + }, + "isSC": {} + }, + "0x32b86b99441480a7e5bd3a26c124ec2373e3f015": { + "name": "BAD token contract", + "address": "0x32b86b99441480a7e5bd3a26c124ec2373e3f015", + "token": { + "decimals": 18, + "symbol": "BAD" + }, + "isSC": {} + }, + "0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5": { + "name": "FACTR token contract", + "address": "0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5", + "token": { + "decimals": 18, + "symbol": "FACTR" + }, + "isSC": {} + }, + "0x9e976f211daea0d652912ab99b0dc21a7fd728e4": { + "name": "MAP token contract", + "address": "0x9e976f211daea0d652912ab99b0dc21a7fd728e4", + "token": { + "decimals": 18, + "symbol": "MAP" + }, + "isSC": {} + }, + "0xb624fde1a972b1c89ec1dad691442d5e8e891469": { + "name": "SPORK token contract", + "address": "0xb624fde1a972b1c89ec1dad691442d5e8e891469", + "token": { + "decimals": 18, + "symbol": "SPORK" + }, + "isSC": {} + }, + "0x3b27f92c0e212c671ea351827edf93db27cc0c65": { + "name": "YVUSDT token contract", + "address": "0x3b27f92c0e212c671ea351827edf93db27cc0c65", + "token": { + "decimals": 6, + "symbol": "YVUSDT" + }, + "isSC": {} + }, + "0xc0c293ce456ff0ed870add98a0828dd4d2903dbf": { + "name": "AURA token contract", + "address": "0xc0c293ce456ff0ed870add98a0828dd4d2903dbf", + "token": { + "decimals": 18, + "symbol": "AURA" + }, + "isSC": {} + }, + "0xb9f599ce614feb2e1bbe58f180f370d05b39344e": { + "name": "PORK token contract", + "address": "0xb9f599ce614feb2e1bbe58f180f370d05b39344e", + "token": { + "decimals": 18, + "symbol": "PORK" + }, + "isSC": {} + }, + "0x95e40e065afb3059dcabe4aaf404c1f92756603a": { + "name": "KDAG token contract", + "address": "0x95e40e065afb3059dcabe4aaf404c1f92756603a", + "token": { + "decimals": 18, + "symbol": "KDAG" + }, + "isSC": {} + }, + "0x97bd0d0a3e9635325ec0b383cff62914a7d50642": { + "name": "USAPS token contract", + "address": "0x97bd0d0a3e9635325ec0b383cff62914a7d50642", + "token": { + "decimals": 18, + "symbol": "USAPS" + }, + "isSC": {} + }, + "0x2daf397be543cb416ff09a7f48ee5505b074bede": { + "name": "ROS token contract", + "address": "0x2daf397be543cb416ff09a7f48ee5505b074bede", + "token": { + "decimals": 18, + "symbol": "ROS" + }, + "isSC": {} + }, + "0x0e192d382a36de7011f795acc4391cd302003606": { + "name": "FST token contract", + "address": "0x0e192d382a36de7011f795acc4391cd302003606", + "token": { + "decimals": 18, + "symbol": "FST" + }, + "isSC": {} + }, + "0xe0c8b298db4cffe05d1bea0bb1ba414522b33c1b": { + "name": "NCDT token contract", + "address": "0xe0c8b298db4cffe05d1bea0bb1ba414522b33c1b", + "token": { + "decimals": 18, + "symbol": "NCDT" + }, + "isSC": {} + }, + "0x61a35258107563f6b6f102ae25490901c8760b12": { + "name": "KITTY token contract", + "address": "0x61a35258107563f6b6f102ae25490901c8760b12", + "token": { + "decimals": 18, + "symbol": "KITTY" + }, + "isSC": {} + }, + "0xae78736cd615f374d3085123a210448e74fc6393": { + "name": "Rocket Pool ETH", + "address": "0xae78736cd615f374d3085123a210448e74fc6393", + "token": { + "decimals": 18, + "symbol": "rETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rETH.svg" + }, + "0x0d02755a5700414b26ff040e1de35d337df56218": { + "name": "Bend Token", + "address": "0x0d02755a5700414b26ff040e1de35d337df56218", + "token": { + "decimals": 18, + "symbol": "BEND" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BendDAO.svg" + }, + "0x3656bd0f3f07623bb7f429b390d208f894e44ece": { + "name": "IFV token contract", + "address": "0x3656bd0f3f07623bb7f429b390d208f894e44ece", + "token": { + "decimals": 18, + "symbol": "IFV" + }, + "isSC": {} + }, + "0x55296f69f40ea6d20e478533c15a6b08b654e758": { + "name": "XYO token contract", + "address": "0x55296f69f40ea6d20e478533c15a6b08b654e758", + "token": { + "decimals": 18, + "symbol": "XYO" + }, + "isSC": {} + }, + "0x186ef81fd8e77eec8bffc3039e7ec41d5fc0b457": { + "name": "INSP token contract", + "address": "0x186ef81fd8e77eec8bffc3039e7ec41d5fc0b457", + "token": { + "decimals": 18, + "symbol": "INSP" + }, + "isSC": {} + }, + "0x8ccd897ca6160ed76755383b201c1948394328c7": { + "name": "BAI token contract", + "address": "0x8ccd897ca6160ed76755383b201c1948394328c7", + "token": { + "decimals": 9, + "symbol": "BAI" + }, + "isSC": {} + }, + "0x961d4921e1718e633bac8ded88c4a1cae44b785a": { + "name": "STFLIP token contract", + "address": "0x961d4921e1718e633bac8ded88c4a1cae44b785a", + "token": { + "decimals": 18, + "symbol": "STFLIP" + }, + "isSC": {} + }, + "0x590f820444fa3638e022776752c5eef34e2f89a6": { + "name": "ALPH token contract", + "address": "0x590f820444fa3638e022776752c5eef34e2f89a6", + "token": { + "decimals": 18, + "symbol": "ALPH" + }, + "isSC": {} + }, + "0xb3207935ff56120f3499e8ad08461dd403bf16b8": { + "name": "DAMM token contract", + "address": "0xb3207935ff56120f3499e8ad08461dd403bf16b8", + "token": { + "decimals": 18, + "symbol": "DAMM" + }, + "isSC": {} + }, + "0x9ab7bb7fdc60f4357ecfef43986818a2a3569c62": { + "name": "GOG token contract", + "address": "0x9ab7bb7fdc60f4357ecfef43986818a2a3569c62", + "token": { + "decimals": 18, + "symbol": "GOG" + }, + "isSC": {} + }, + "0x34be5b8c30ee4fde069dc878989686abe9884470": { + "name": "SENATE token contract", + "address": "0x34be5b8c30ee4fde069dc878989686abe9884470", + "token": { + "decimals": 18, + "symbol": "SENATE" + }, + "isSC": {} + }, + "0x1234567461d3f8db7496581774bd869c83d51c93": { + "name": "BitClave", + "address": "0x1234567461d3f8db7496581774bd869c83d51c93", + "token": { + "decimals": 18, + "symbol": "CAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bitclave.svg" + }, + "0x14a32f050facf226ec60882398a9bf36d91dbac2": { + "name": "KYOKO token contract", + "address": "0x14a32f050facf226ec60882398a9bf36d91dbac2", + "token": { + "decimals": 18, + "symbol": "KYOKO" + }, + "isSC": {} + }, + "0xbc526a4ae9632d42291ad9d5ef29d36dd4d0ce26": { + "name": "UMOONBIRDS token contract", + "address": "0xbc526a4ae9632d42291ad9d5ef29d36dd4d0ce26", + "token": { + "decimals": 18, + "symbol": "UMOONBIRDS" + }, + "isSC": {} + }, + "0x389999216860ab8e0175387a0c90e5c52522c945": { + "name": "FEG token contract", + "address": "0x389999216860ab8e0175387a0c90e5c52522c945", + "token": { + "decimals": 9, + "symbol": "FEG" + }, + "isSC": {} + }, + "0x149cac67f1cd5d80651e7c9bb359ec285d821a05": { + "name": "MINTY token contract", + "address": "0x149cac67f1cd5d80651e7c9bb359ec285d821a05", + "token": { + "decimals": 18, + "symbol": "MINTY" + }, + "isSC": {} + }, + "0x47b751e318fe7e9769f4b56fabbffb05d530a88c": { + "name": "PMW token contract", + "address": "0x47b751e318fe7e9769f4b56fabbffb05d530a88c", + "token": { + "decimals": 18, + "symbol": "PMW" + }, + "isSC": {} + }, + "0x2559813bbb508c4c79e9ccce4703bcb1f149edd7": { + "name": "WAIT token contract", + "address": "0x2559813bbb508c4c79e9ccce4703bcb1f149edd7", + "token": { + "decimals": 9, + "symbol": "WAIT" + }, + "isSC": {} + }, + "0x1e7a53220c128d100b56970ce88ee963a9511370": { + "name": "PNPC token contract", + "address": "0x1e7a53220c128d100b56970ce88ee963a9511370", + "token": { + "decimals": 18, + "symbol": "PNPC" + }, + "isSC": {} + }, + "0xb5d730d442e1d5b119fb4e5c843c48a64202ef92": { + "name": "SABAI token contract", + "address": "0xb5d730d442e1d5b119fb4e5c843c48a64202ef92", + "token": { + "decimals": 18, + "symbol": "SABAI" + }, + "isSC": {} + }, + "0x8b802513d4aa6f349b197a4ea4c26563cd6fd5b2": { + "name": "HIGHER token contract", + "address": "0x8b802513d4aa6f349b197a4ea4c26563cd6fd5b2", + "token": { + "decimals": 18, + "symbol": "HIGHER" + }, + "isSC": {} + }, + "0x820802fa8a99901f52e39acd21177b0be6ee2974": { + "name": "EUROE token contract", + "address": "0x820802fa8a99901f52e39acd21177b0be6ee2974", + "token": { + "decimals": 6, + "symbol": "EUROE" + }, + "isSC": {} + }, + "0xb4725590574bb8afae4a3f44f05f9c0f5ebd8f4b": { + "name": "HOLE token contract", + "address": "0xb4725590574bb8afae4a3f44f05f9c0f5ebd8f4b", + "token": { + "decimals": 18, + "symbol": "HOLE" + }, + "isSC": {} + }, + "0x2fda8c6783aa36bed645bad28a4cdc8769dcd252": { + "name": "D2O token contract", + "address": "0x2fda8c6783aa36bed645bad28a4cdc8769dcd252", + "token": { + "decimals": 18, + "symbol": "D2O" + }, + "isSC": {} + }, + "0xcaabcaa4ca42e1d86de1a201c818639def0ba7a7": { + "name": "TALK token contract", + "address": "0xcaabcaa4ca42e1d86de1a201c818639def0ba7a7", + "token": { + "decimals": 18, + "symbol": "TALK" + }, + "isSC": {} + }, + "0xaf69d0518d341af4961b5fcfdb86a3e3453f1dc5": { + "name": "LONG token contract", + "address": "0xaf69d0518d341af4961b5fcfdb86a3e3453f1dc5", + "token": { + "decimals": 9, + "symbol": "LONG" + }, + "isSC": {} + }, + "0xe5ef42d0e5e4aa6b36c613d00db8dad303d505f3": { + "name": "MSOT token contract", + "address": "0xe5ef42d0e5e4aa6b36c613d00db8dad303d505f3", + "token": { + "decimals": 18, + "symbol": "MSOT" + }, + "isSC": {} + }, + "0xe70e1d6a2e971ff6debc21dd2540064c25c9bc0d": { + "name": "SPIDER token contract", + "address": "0xe70e1d6a2e971ff6debc21dd2540064c25c9bc0d", + "token": { + "decimals": 18, + "symbol": "SPIDER" + }, + "isSC": {} + }, + "0xba10085f901ae4048134e556d579cfd1bfaf89cf": { + "name": "UELEM token contract", + "address": "0xba10085f901ae4048134e556d579cfd1bfaf89cf", + "token": { + "decimals": 18, + "symbol": "UELEM" + }, + "isSC": {} + }, + "0x1ccf27211e8bf052f6255329ed641b4e94e80603": { + "name": "BABY token contract", + "address": "0x1ccf27211e8bf052f6255329ed641b4e94e80603", + "token": { + "decimals": 18, + "symbol": "BABY" + }, + "isSC": {} + }, + "0x85b6acaba696b9e4247175274f8263f99b4b9180": { + "name": "SPR token contract", + "address": "0x85b6acaba696b9e4247175274f8263f99b4b9180", + "token": { + "decimals": 18, + "symbol": "SPR" + }, + "isSC": {} + }, + "0x2534588fa8ecddf160c6c0ae7d62523604df0a75": { + "name": "ARCN token contract", + "address": "0x2534588fa8ecddf160c6c0ae7d62523604df0a75", + "token": { + "decimals": 18, + "symbol": "ARCN" + }, + "isSC": {} + }, + "0x0a6e18fb2842855c3af925310b0f50a4bfa17909": { + "name": "CHP token contract", + "address": "0x0a6e18fb2842855c3af925310b0f50a4bfa17909", + "token": { + "decimals": 18, + "symbol": "CHP" + }, + "isSC": {} + }, + "0x85614a474dbeed440d5bbdb8ac50b0f22367f997": { + "name": "XVG token contract", + "address": "0x85614a474dbeed440d5bbdb8ac50b0f22367f997", + "token": { + "decimals": 18, + "symbol": "XVG" + }, + "isSC": {} + }, + "0x276e84edc5bd94731b65c207dc1512fc5391572f": { + "name": "PTN token contract", + "address": "0x276e84edc5bd94731b65c207dc1512fc5391572f", + "token": { + "decimals": 18, + "symbol": "PTN" + }, + "isSC": {} + }, + "0x0c7b199ac2bca0dba8d1785480648f0318b9a7b8": { + "name": "ORDIBOT token contract", + "address": "0x0c7b199ac2bca0dba8d1785480648f0318b9a7b8", + "token": { + "decimals": 9, + "symbol": "ORDIBOT" + }, + "isSC": {} + }, + "0xc30769d445d1cbbc5f85fcdb4294b827bd3e7dda": { + "name": "MMARS token contract", + "address": "0xc30769d445d1cbbc5f85fcdb4294b827bd3e7dda", + "token": { + "decimals": 18, + "symbol": "MMARS" + }, + "isSC": {} + }, + "0x443f9ff91a72f1482d13dfd40eec107bb84ca1e5": { + "name": "FARM token contract", + "address": "0x443f9ff91a72f1482d13dfd40eec107bb84ca1e5", + "token": { + "decimals": 18, + "symbol": "FARM" + }, + "isSC": {} + }, + "0x2730d6fdc86c95a74253beffaa8306b40fedecbb": { + "name": "UNI token contract", + "address": "0x2730d6fdc86c95a74253beffaa8306b40fedecbb", + "token": { + "decimals": 8, + "symbol": "UNI" + }, + "isSC": {} + }, + "0x8503a7b00b4b52692cc6c14e5b96f142e30547b7": { + "name": "MEED token contract", + "address": "0x8503a7b00b4b52692cc6c14e5b96f142e30547b7", + "token": { + "decimals": 18, + "symbol": "MEED" + }, + "isSC": {} + }, + "0x18a3563c21062897950bb09339c82b9686a35667": { + "name": "ENXS token contract", + "address": "0x18a3563c21062897950bb09339c82b9686a35667", + "token": { + "decimals": 9, + "symbol": "ENXS" + }, + "isSC": {} + }, + "0x343cf59a43bd7ddd38b7236a478139a86a26222b": { + "name": "CAESAR token contract", + "address": "0x343cf59a43bd7ddd38b7236a478139a86a26222b", + "token": { + "decimals": 18, + "symbol": "CAESAR" + }, + "isSC": {} + }, + "0x7d3b4f8d5dd14a0c263c4bee7be434c15e188d3e": { + "name": "MOE token contract", + "address": "0x7d3b4f8d5dd14a0c263c4bee7be434c15e188d3e", + "token": { + "decimals": 18, + "symbol": "MOE" + }, + "isSC": {} + }, + "0x149d8290f653deb8e34c037d239d3d8eee9de5ad": { + "name": "KING token contract", + "address": "0x149d8290f653deb8e34c037d239d3d8eee9de5ad", + "token": { + "decimals": 18, + "symbol": "KING" + }, + "isSC": {} + }, + "0xe530441f4f73bdb6dc2fa5af7c3fc5fd551ec838": { + "name": "GSE token contract", + "address": "0xe530441f4f73bdb6dc2fa5af7c3fc5fd551ec838", + "token": { + "decimals": 4, + "symbol": "GSE" + }, + "isSC": {} + }, + "0xba386a4ca26b85fd057ab1ef86e3dc7bdeb5ce70": { + "name": "JESUS token contract", + "address": "0xba386a4ca26b85fd057ab1ef86e3dc7bdeb5ce70", + "token": { + "decimals": 18, + "symbol": "JESUS" + }, + "isSC": {} + }, + "0x5f7827fdeb7c20b443265fc2f40845b715385ff2": { + "name": "EURCV token contract", + "address": "0x5f7827fdeb7c20b443265fc2f40845b715385ff2", + "token": { + "decimals": 18, + "symbol": "EURCV" + }, + "isSC": {} + }, + "0x13832bec9b7029a82988017a7f6095bdf0207d62": { + "name": "MILK token contract", + "address": "0x13832bec9b7029a82988017a7f6095bdf0207d62", + "token": { + "decimals": 9, + "symbol": "MILK" + }, + "isSC": {} + }, + "0x722f97a435278b7383a1e3c47f41773bebf3232c": { + "name": "UCM token contract", + "address": "0x722f97a435278b7383a1e3c47f41773bebf3232c", + "token": { + "decimals": 18, + "symbol": "UCM" + }, + "isSC": {} + }, + "0x3e828ac5c480069d4765654fb4b8733b910b13b2": { + "name": "CLNY token contract", + "address": "0x3e828ac5c480069d4765654fb4b8733b910b13b2", + "token": { + "decimals": 18, + "symbol": "CLNY" + }, + "isSC": {} + }, + "0x4485561db76614ff727f8e0a3ea95690b8b16022": { + "name": "INVOX token contract", + "address": "0x4485561db76614ff727f8e0a3ea95690b8b16022", + "token": { + "decimals": 18, + "symbol": "INVOX" + }, + "isSC": {} + }, + "0xf47245e9a3ba3dca8b004e34afc1290b1d435a52": { + "name": "MBLK token contract", + "address": "0xf47245e9a3ba3dca8b004e34afc1290b1d435a52", + "token": { + "decimals": 18, + "symbol": "MBLK" + }, + "isSC": {} + }, + "0xb446566d6d644249d5d82aab5fea8a5b7da3f691": { + "name": "TBOS token contract", + "address": "0xb446566d6d644249d5d82aab5fea8a5b7da3f691", + "token": { + "decimals": 0, + "symbol": "TBOS" + }, + "isSC": {} + }, + "0xd17c18979a45c0f3604331831c409f7bff64d3c1": { + "name": "FRENS token contract", + "address": "0xd17c18979a45c0f3604331831c409f7bff64d3c1", + "token": { + "decimals": 18, + "symbol": "FRENS" + }, + "isSC": {} + }, + "0x64e8cc11ddccea70cc800231a62f0d9ea46c94ac": { + "name": "WAX token contract", + "address": "0x64e8cc11ddccea70cc800231a62f0d9ea46c94ac", + "token": { + "decimals": 18, + "symbol": "WAX" + }, + "isSC": {} + }, + "0x162bb2bb5fb03976a69dd25bb9afce6140db1433": { + "name": "DOG token contract", + "address": "0x162bb2bb5fb03976a69dd25bb9afce6140db1433", + "token": { + "decimals": 9, + "symbol": "DOG" + }, + "isSC": {} + }, + "0x0ba470c6b349d2ae4c93d8c2072b8bfdab95e28a": { + "name": "SWORD token contract", + "address": "0x0ba470c6b349d2ae4c93d8c2072b8bfdab95e28a", + "token": { + "decimals": 18, + "symbol": "SWORD" + }, + "isSC": {} + }, + "0x456815812b3129a4389ea4d73e9706697cc91373": { + "name": "0XS token contract", + "address": "0x456815812b3129a4389ea4d73e9706697cc91373", + "token": { + "decimals": 18, + "symbol": "0XS" + }, + "isSC": {} + }, + "0x9dc251f27a7477313242a022181d4b5a3a1e4a0f": { + "name": "BETS token contract", + "address": "0x9dc251f27a7477313242a022181d4b5a3a1e4a0f", + "token": { + "decimals": 18, + "symbol": "BETS" + }, + "isSC": {} + }, + "0xc96df921009b790dffca412375251ed1a2b75c60": { + "name": "ORME token contract", + "address": "0xc96df921009b790dffca412375251ed1a2b75c60", + "token": { + "decimals": 8, + "symbol": "ORME" + }, + "isSC": {} + }, + "0x9754d5e5ea788c62f11d34a818aeae927aeac84c": { + "name": "NOLO token contract", + "address": "0x9754d5e5ea788c62f11d34a818aeae927aeac84c", + "token": { + "decimals": 18, + "symbol": "NOLO" + }, + "isSC": {} + }, + "0xaae3cf9968d26925bdb73ce3864e0084a20f4687": { + "name": "FAR token contract", + "address": "0xaae3cf9968d26925bdb73ce3864e0084a20f4687", + "token": { + "decimals": 18, + "symbol": "FAR" + }, + "isSC": {} + }, + "0x1028083026fe1e8e1e79170ceae0edbad07b052d": { + "name": "MONK token contract", + "address": "0x1028083026fe1e8e1e79170ceae0edbad07b052d", + "token": { + "decimals": 18, + "symbol": "MONK" + }, + "isSC": {} + }, + "0x66761fa41377003622aee3c7675fc7b5c1c2fac5": { + "name": "CPOOL token contract", + "address": "0x66761fa41377003622aee3c7675fc7b5c1c2fac5", + "token": { + "decimals": 18, + "symbol": "CPOOL" + }, + "isSC": {} + }, + "0xedae06a2dbdd21038608adce58fd173afdba5add": { + "name": "ULP token contract", + "address": "0xedae06a2dbdd21038608adce58fd173afdba5add", + "token": { + "decimals": 18, + "symbol": "ULP" + }, + "isSC": {} + }, + "0x443459d45c30a03f90037d011cbe22e2183d3b12": { + "name": "TYPE token contract", + "address": "0x443459d45c30a03f90037d011cbe22e2183d3b12", + "token": { + "decimals": 18, + "symbol": "TYPE" + }, + "isSC": {} + }, + "0xe831f96a7a1dce1aa2eb760b1e296c6a74caa9d5": { + "name": "Nexum Coin", + "address": "0xe831f96a7a1dce1aa2eb760b1e296c6a74caa9d5", + "token": { + "decimals": 8, + "symbol": "Nexm" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nexum.svg" + }, + "0x628a3b2e302c7e896acc432d2d0dd22b6cb9bc88": { + "name": "LMWR token contract", + "address": "0x628a3b2e302c7e896acc432d2d0dd22b6cb9bc88", + "token": { + "decimals": 18, + "symbol": "LMWR" + }, + "isSC": {} + }, + "0xd31a59c85ae9d8edefec411d448f90841571b89c": { + "name": "SOL token contract", + "address": "0xd31a59c85ae9d8edefec411d448f90841571b89c", + "token": { + "decimals": 9, + "symbol": "SOL" + }, + "isSC": {} + }, + "0xf3ae5d769e153ef72b4e3591ac004e89f48107a1": { + "name": "DPR token contract", + "address": "0xf3ae5d769e153ef72b4e3591ac004e89f48107a1", + "token": { + "decimals": 18, + "symbol": "DPR" + }, + "isSC": {} + }, + "0xa2d6b59758d307df27d5809426252d91a060cb24": { + "name": "PNS token contract", + "address": "0xa2d6b59758d307df27d5809426252d91a060cb24", + "token": { + "decimals": 0, + "symbol": "PNS" + }, + "isSC": {} + }, + "0x33ba0f96980314cf962bd6224b5c3befa5946202": { + "name": "N token contract", + "address": "0x33ba0f96980314cf962bd6224b5c3befa5946202", + "token": { + "decimals": 18, + "symbol": "N" + }, + "isSC": {} + }, + "0x393e888b031e000a258a3f646e3d8043c57a1f05": { + "name": "SIFY token contract", + "address": "0x393e888b031e000a258a3f646e3d8043c57a1f05", + "token": { + "decimals": 18, + "symbol": "SIFY" + }, + "isSC": {} + }, + "0x25c7b64a93eb1261e130ec21a3e9918caa38b611": { + "name": "WVG0 token contract", + "address": "0x25c7b64a93eb1261e130ec21a3e9918caa38b611", + "token": { + "decimals": 18, + "symbol": "WVG0" + }, + "isSC": {} + }, + "0x8ee325ae3e54e83956ef2d5952d3c8bc1fa6ec27": { + "name": "TYRANT token contract", + "address": "0x8ee325ae3e54e83956ef2d5952d3c8bc1fa6ec27", + "token": { + "decimals": 9, + "symbol": "TYRANT" + }, + "isSC": {} + }, + "0x4c746edf20762dc201ac40135e0c13e400d23d58": { + "name": "GOD token contract", + "address": "0x4c746edf20762dc201ac40135e0c13e400d23d58", + "token": { + "decimals": 9, + "symbol": "GOD" + }, + "isSC": {} + }, + "0x243da8a5561cf5642b852c4c4c3fada3f3116d2d": { + "name": "PAL token contract", + "address": "0x243da8a5561cf5642b852c4c4c3fada3f3116d2d", + "token": { + "decimals": 18, + "symbol": "PAL" + }, + "isSC": {} + }, + "0xf134519cbe2042b06ee7ce20df51d09b55559896": { + "name": "MOCHI token contract", + "address": "0xf134519cbe2042b06ee7ce20df51d09b55559896", + "token": { + "decimals": 18, + "symbol": "MOCHI" + }, + "isSC": {} + }, + "0xb67718b98d52318240c52e71a898335da4a28c42": { + "name": "INNBC token contract", + "address": "0xb67718b98d52318240c52e71a898335da4a28c42", + "token": { + "decimals": 6, + "symbol": "INNBC" + }, + "isSC": {} + }, + "0xa995d67fd0187b4b8fea3a60e11f31a08e4ac40b": { + "name": "PDS token contract", + "address": "0xa995d67fd0187b4b8fea3a60e11f31a08e4ac40b", + "token": { + "decimals": 0, + "symbol": "PDS" + }, + "isSC": {} + }, + "0x3c4b6e6e1ea3d4863700d7f76b36b7f3d3f13e3d": { + "name": "VGX token contract", + "address": "0x3c4b6e6e1ea3d4863700d7f76b36b7f3d3f13e3d", + "token": { + "decimals": 8, + "symbol": "VGX" + }, + "isSC": {} + }, + "0x0173661769325565d4f011b2e5cda688689cc87c": { + "name": "QLT token contract", + "address": "0x0173661769325565d4f011b2e5cda688689cc87c", + "token": { + "decimals": 9, + "symbol": "QLT" + }, + "isSC": {} + }, + "0x642ac912a58428767fa14a26a749f9a1b001ba92": { + "name": "XX token contract", + "address": "0x642ac912a58428767fa14a26a749f9a1b001ba92", + "token": { + "decimals": 9, + "symbol": "XX" + }, + "isSC": {} + }, + "0xf55a93b613d172b86c2ba3981a849dae2aecde2f": { + "name": "YFX token contract", + "address": "0xf55a93b613d172b86c2ba3981a849dae2aecde2f", + "token": { + "decimals": 18, + "symbol": "YFX" + }, + "isSC": {} + }, + "0xc9cb16ac87c43697b838c64ee416d748817f2b77": { + "name": "GROOOOOK token contract", + "address": "0xc9cb16ac87c43697b838c64ee416d748817f2b77", + "token": { + "decimals": 9, + "symbol": "GROOOOOK" + }, + "isSC": {} + }, + "0xb705268213d593b8fd88d3fdeff93aff5cbdcfae": { + "name": "IDEX token contract", + "address": "0xb705268213d593b8fd88d3fdeff93aff5cbdcfae", + "token": { + "decimals": 18, + "symbol": "IDEX" + }, + "isSC": {} + }, + "0xcccd1ba9f7acd6117834e0d28f25645decb1736a": { + "name": "ECOX token contract", + "address": "0xcccd1ba9f7acd6117834e0d28f25645decb1736a", + "token": { + "decimals": 18, + "symbol": "ECOX" + }, + "isSC": {} + }, + "0x8747a3114ef7f0eebd3eb337f745e31dbf81a952": { + "name": "DQTS token contract", + "address": "0x8747a3114ef7f0eebd3eb337f745e31dbf81a952", + "token": { + "decimals": 0, + "symbol": "DQTS" + }, + "isSC": {} + }, + "0x553c7f9c780316fc1d34b8e14ac2465ab22a090b": { + "name": "REALU token contract", + "address": "0x553c7f9c780316fc1d34b8e14ac2465ab22a090b", + "token": { + "decimals": 0, + "symbol": "REALU" + }, + "isSC": {} + }, + "0x7bd44cf5c0566aab26150a0cd5c3d20c5535686f": { + "name": "EVILPEPE token contract", + "address": "0x7bd44cf5c0566aab26150a0cd5c3d20c5535686f", + "token": { + "decimals": 18, + "symbol": "EVILPEPE" + }, + "isSC": {} + }, + "0x1a4b46696b2bb4794eb3d4c26f1c55f9170fa4c5": { + "name": "BitDAO", + "address": "0x1a4b46696b2bb4794eb3d4c26f1c55f9170fa4c5", + "token": { + "decimals": 18, + "symbol": "BIT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BitDAO.svg" + }, + "0x3b544e6fcf6c8dce9d8b45a4fdf21c9b02f9fda9": { + "name": "GHD token contract", + "address": "0x3b544e6fcf6c8dce9d8b45a4fdf21c9b02f9fda9", + "token": { + "decimals": 18, + "symbol": "GHD" + }, + "isSC": {} + }, + "0xb44377b74ef1773639b663d0754cb8410a847d02": { + "name": "DREAM token contract", + "address": "0xb44377b74ef1773639b663d0754cb8410a847d02", + "token": { + "decimals": 18, + "symbol": "DREAM" + }, + "isSC": {} + }, + "0x015628ce9150db1bce2fbb717a09e846f8a32436": { + "name": "BBC token contract", + "address": "0x015628ce9150db1bce2fbb717a09e846f8a32436", + "token": { + "decimals": 18, + "symbol": "BBC" + }, + "isSC": {} + }, + "0xf0f9d895aca5c8678f706fb8216fa22957685a13": { + "name": "CULT token contract", + "address": "0xf0f9d895aca5c8678f706fb8216fa22957685a13", + "token": { + "decimals": 18, + "symbol": "CULT" + }, + "isSC": {} + }, + "0x6dda263994aab33f5ed612294e26f2a13df0da05": { + "name": "IQT token contract", + "address": "0x6dda263994aab33f5ed612294e26f2a13df0da05", + "token": { + "decimals": 18, + "symbol": "IQT" + }, + "isSC": {} + }, + "0x682f3317a8db21ba205dc84a0b7bd5010333bda7": { + "name": "DAOG token contract", + "address": "0x682f3317a8db21ba205dc84a0b7bd5010333bda7", + "token": { + "decimals": 18, + "symbol": "DAOG" + }, + "isSC": {} + }, + "0x1ce270557c1f68cfb577b856766310bf8b47fd9c": { + "name": "MONG token contract", + "address": "0x1ce270557c1f68cfb577b856766310bf8b47fd9c", + "token": { + "decimals": 18, + "symbol": "MONG" + }, + "isSC": {} + }, + "0x0c48250eb1f29491f1efbeec0261eb556f0973c7": { + "name": "AIMBOT token contract", + "address": "0x0c48250eb1f29491f1efbeec0261eb556f0973c7", + "token": { + "decimals": 18, + "symbol": "AIMBOT" + }, + "isSC": {} + }, + "0xc8ef1460277ea47d179dec66d1c5f8b7f7ae5a28": { + "name": "RIFI token contract", + "address": "0xc8ef1460277ea47d179dec66d1c5f8b7f7ae5a28", + "token": { + "decimals": 18, + "symbol": "RIFI" + }, + "isSC": {} + }, + "0x5b1d655c93185b06b00f7925791106132cb3ad75": { + "name": "DMT token contract", + "address": "0x5b1d655c93185b06b00f7925791106132cb3ad75", + "token": { + "decimals": 18, + "symbol": "DMT" + }, + "isSC": {} + }, + "0x37ac5730cfb1549715647828a05b3a8ed781134b": { + "name": "AIFI token contract", + "address": "0x37ac5730cfb1549715647828a05b3a8ed781134b", + "token": { + "decimals": 18, + "symbol": "AIFI" + }, + "isSC": {} + }, + "0x80a2ae356fc9ef4305676f7a3e2ed04e12c33946": { + "name": "CYFI token contract", + "address": "0x80a2ae356fc9ef4305676f7a3e2ed04e12c33946", + "token": { + "decimals": 8, + "symbol": "CYFI" + }, + "isSC": {} + }, + "0x226d6d842d49b4d757bef1632053a198d5d9c8aa": { + "name": "BLOCK token contract", + "address": "0x226d6d842d49b4d757bef1632053a198d5d9c8aa", + "token": { + "decimals": 18, + "symbol": "BLOCK" + }, + "isSC": {} + }, + "0xddd5592cf4759313c649eb4e624a79541ed222ed": { + "name": "PEPEXL token contract", + "address": "0xddd5592cf4759313c649eb4e624a79541ed222ed", + "token": { + "decimals": 18, + "symbol": "PEPEXL" + }, + "isSC": {} + }, + "0xa66daa57432024023db65477ba87d4e7f5f95213": { + "name": "HPT token contract", + "address": "0xa66daa57432024023db65477ba87d4e7f5f95213", + "token": { + "decimals": 18, + "symbol": "HPT" + }, + "isSC": {} + }, + "0xae3359ed3c567482fb0102c584c23daa2693eacf": { + "name": "DORK token contract", + "address": "0xae3359ed3c567482fb0102c584c23daa2693eacf", + "token": { + "decimals": 18, + "symbol": "DORK" + }, + "isSC": {} + }, + "0xd38e031f4529a07996aab977d2b79f0e00656c56": { + "name": "WTBT token contract", + "address": "0xd38e031f4529a07996aab977d2b79f0e00656c56", + "token": { + "decimals": 18, + "symbol": "WTBT" + }, + "isSC": {} + }, + "0xc256f81d35a54c3599b424171d719e9ae87b2e9b": { + "name": "ZOOA token contract", + "address": "0xc256f81d35a54c3599b424171d719e9ae87b2e9b", + "token": { + "decimals": 18, + "symbol": "ZOOA" + }, + "isSC": {} + }, + "0xd9adfb67381d392c6e9671f64cdd9014bfcd74f2": { + "name": "MORRA token contract", + "address": "0xd9adfb67381d392c6e9671f64cdd9014bfcd74f2", + "token": { + "decimals": 18, + "symbol": "MORRA" + }, + "isSC": {} + }, + "0xbed4ab0019ff361d83ddeb74883dac8a70f5ea1e": { + "name": "MRCH token contract", + "address": "0xbed4ab0019ff361d83ddeb74883dac8a70f5ea1e", + "token": { + "decimals": 18, + "symbol": "MRCH" + }, + "isSC": {} + }, + "0x6c059413686565d5ad6cce6eed7742c42dbc44ca": { + "name": "LAELAPS token contract", + "address": "0x6c059413686565d5ad6cce6eed7742c42dbc44ca", + "token": { + "decimals": 18, + "symbol": "LAELAPS" + }, + "isSC": {} + }, + "0xdcee70654261af21c44c093c300ed3bb97b78192": { + "name": "WOETH token contract", + "address": "0xdcee70654261af21c44c093c300ed3bb97b78192", + "token": { + "decimals": 18, + "symbol": "WOETH" + }, + "isSC": {} + }, + "0x53dfea0a8cc2a2a2e425e1c174bc162999723ea0": { + "name": "JCHF token contract", + "address": "0x53dfea0a8cc2a2a2e425e1c174bc162999723ea0", + "token": { + "decimals": 18, + "symbol": "JCHF" + }, + "isSC": {} + }, + "0x4d9b0b7a6db042cb990d36a0df5aa2960e552f16": { + "name": "TETHER token contract", + "address": "0x4d9b0b7a6db042cb990d36a0df5aa2960e552f16", + "token": { + "decimals": 9, + "symbol": "TETHER" + }, + "isSC": {} + }, + "0x7d60de2e7d92cb5c863bc82f8d59b37c59fc0a7a": { + "name": "DLANCE token contract", + "address": "0x7d60de2e7d92cb5c863bc82f8d59b37c59fc0a7a", + "token": { + "decimals": 18, + "symbol": "DLANCE" + }, + "isSC": {} + }, + "0x13630da53ac2f3004e6e2a127546935ad932f92f": { + "name": "WAGYU token contract", + "address": "0x13630da53ac2f3004e6e2a127546935ad932f92f", + "token": { + "decimals": 9, + "symbol": "WAGYU" + }, + "isSC": {} + }, + "0x7dc85f00715c9d9ec1b50731a9bcc8df95087c55": { + "name": "CLEXY token contract", + "address": "0x7dc85f00715c9d9ec1b50731a9bcc8df95087c55", + "token": { + "decimals": 9, + "symbol": "CLEXY" + }, + "isSC": {} + }, + "0x95aa5d2dbd3c16ee3fdea82d5c6ec3e38ce3314f": { + "name": "PXP token contract", + "address": "0x95aa5d2dbd3c16ee3fdea82d5c6ec3e38ce3314f", + "token": { + "decimals": 18, + "symbol": "PXP" + }, + "isSC": {} + }, + "0x4123a133ae3c521fd134d7b13a2dec35b56c2463": { + "name": "QRDO token contract", + "address": "0x4123a133ae3c521fd134d7b13a2dec35b56c2463", + "token": { + "decimals": 8, + "symbol": "QRDO" + }, + "isSC": {} + }, + "0xe9287543684f440b2f29983a3472987bf7b0ed12": { + "name": "SHINO token contract", + "address": "0xe9287543684f440b2f29983a3472987bf7b0ed12", + "token": { + "decimals": 18, + "symbol": "SHINO" + }, + "isSC": {} + }, + "0x5c8190b76e90b4dd0702740cf6eb0f7ee01ab5e9": { + "name": "ARCAI token contract", + "address": "0x5c8190b76e90b4dd0702740cf6eb0f7ee01ab5e9", + "token": { + "decimals": 9, + "symbol": "ARCAI" + }, + "isSC": {} + }, + "0x3d330b8d4eb25b0933e564d7284d462346d453ef": { + "name": "GROQ token contract", + "address": "0x3d330b8d4eb25b0933e564d7284d462346d453ef", + "token": { + "decimals": 9, + "symbol": "GROQ" + }, + "isSC": {} + }, + "0xa150db9b1fa65b44799d4dd949d922c0a33ee606": { + "name": "DRC token contract", + "address": "0xa150db9b1fa65b44799d4dd949d922c0a33ee606", + "token": { + "decimals": 0, + "symbol": "DRC" + }, + "isSC": {} + }, + "0x102c776ddb30c754ded4fdcc77a19230a60d4e4f": { + "name": "FLC token contract", + "address": "0x102c776ddb30c754ded4fdcc77a19230a60d4e4f", + "token": { + "decimals": 18, + "symbol": "FLC" + }, + "isSC": {} + }, + "0x242914f264d44e4c5ead31092ec133dcb6c4d73f": { + "name": "SFRIEND token contract", + "address": "0x242914f264d44e4c5ead31092ec133dcb6c4d73f", + "token": { + "decimals": 18, + "symbol": "SFRIEND" + }, + "isSC": {} + }, + "0xb5ce43fe2fcffffb2eece95ec413d08def28046f": { + "name": "PELO token contract", + "address": "0xb5ce43fe2fcffffb2eece95ec413d08def28046f", + "token": { + "decimals": 18, + "symbol": "PELO" + }, + "isSC": {} + }, + "0xf03d5fc6e08de6ad886fca34abf9a59ef633b78a": { + "name": "CAPY token contract", + "address": "0xf03d5fc6e08de6ad886fca34abf9a59ef633b78a", + "token": { + "decimals": 18, + "symbol": "CAPY" + }, + "isSC": {} + }, + "0x357c915d7c12dc506d13332bb06c932af13e99a0": { + "name": "LUCKYSLP token contract", + "address": "0x357c915d7c12dc506d13332bb06c932af13e99a0", + "token": { + "decimals": 18, + "symbol": "LUCKYSLP" + }, + "isSC": {} + }, + "0xcc802c45b55581713cecd1eb17be9ab7fccb0844": { + "name": "BHNY token contract", + "address": "0xcc802c45b55581713cecd1eb17be9ab7fccb0844", + "token": { + "decimals": 18, + "symbol": "BHNY" + }, + "isSC": {} + }, + "0xb0f92f94d02a4d634fd394c1889fe3cab1fcffc7": { + "name": "DOGB token contract", + "address": "0xb0f92f94d02a4d634fd394c1889fe3cab1fcffc7", + "token": { + "decimals": 18, + "symbol": "DOGB" + }, + "isSC": {} + }, + "0x53fd2342b43ecd24aef1535bc3797f509616ce8c": { + "name": "ANARCHY token contract", + "address": "0x53fd2342b43ecd24aef1535bc3797f509616ce8c", + "token": { + "decimals": 9, + "symbol": "ANARCHY" + }, + "isSC": {} + }, + "0x6eff556748ee452cbdaf31bcb8c76a28651509bd": { + "name": "TIUSD token contract", + "address": "0x6eff556748ee452cbdaf31bcb8c76a28651509bd", + "token": { + "decimals": 18, + "symbol": "TIUSD" + }, + "isSC": {} + }, + "0x056fd409e1d7a124bd7017459dfea2f387b6d5cd": { + "name": "Gemini Dollar", + "address": "0x056fd409e1d7a124bd7017459dfea2f387b6d5cd", + "token": { + "decimals": 2, + "symbol": "GUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gusd.svg" + }, + "0xe9514a6eba63a0bbbe2faea919e773ebe0f527c1": { + "name": "KEK token contract", + "address": "0xe9514a6eba63a0bbbe2faea919e773ebe0f527c1", + "token": { + "decimals": 18, + "symbol": "KEK" + }, + "isSC": {} + }, + "0xd7f5cabdf696d7d1bf384d7688926a4bdb092c67": { + "name": "DRC token contract", + "address": "0xd7f5cabdf696d7d1bf384d7688926a4bdb092c67", + "token": { + "decimals": 18, + "symbol": "DRC" + }, + "isSC": {} + }, + "0xc3c7b03335eb950a2a9207ac5cac0571de34d844": { + "name": "BWSM token contract", + "address": "0xc3c7b03335eb950a2a9207ac5cac0571de34d844", + "token": { + "decimals": 18, + "symbol": "BWSM" + }, + "isSC": {} + }, + "0xb627a1bf727f578384ba18b2a2b46f4fb924ab3b": { + "name": "P3PE token contract", + "address": "0xb627a1bf727f578384ba18b2a2b46f4fb924ab3b", + "token": { + "decimals": 18, + "symbol": "P3PE" + }, + "isSC": {} + }, + "0x3b6564b5da73a41d3a66e6558a98fd0e9e1e77ad": { + "name": "UTS token contract", + "address": "0x3b6564b5da73a41d3a66e6558a98fd0e9e1e77ad", + "token": { + "decimals": 18, + "symbol": "UTS" + }, + "isSC": {} + }, + "0x4168bbc34baea34e55721809911bca5baaef6ba6": { + "name": "CEP token contract", + "address": "0x4168bbc34baea34e55721809911bca5baaef6ba6", + "token": { + "decimals": 18, + "symbol": "CEP" + }, + "isSC": {} + }, + "0xc581b735a1688071a1746c968e0798d642ede491": { + "name": "EURT token contract", + "address": "0xc581b735a1688071a1746c968e0798d642ede491", + "token": { + "decimals": 6, + "symbol": "EURT" + }, + "isSC": {} + }, + "0xe1ec350ea16d1ddaff57f31387b2d9708eb7ce28": { + "name": "PC token contract", + "address": "0xe1ec350ea16d1ddaff57f31387b2d9708eb7ce28", + "token": { + "decimals": 9, + "symbol": "PC" + }, + "isSC": {} + }, + "0x8b4d316e40ac4baf08957963210c6cff683a152b": { + "name": "SCARCE token contract", + "address": "0x8b4d316e40ac4baf08957963210c6cff683a152b", + "token": { + "decimals": 0, + "symbol": "SCARCE" + }, + "isSC": {} + }, + "0x693c216aa181ebf776730d16c7ba06842548415e": { + "name": "PAPI token contract", + "address": "0x693c216aa181ebf776730d16c7ba06842548415e", + "token": { + "decimals": 18, + "symbol": "PAPI" + }, + "isSC": {} + }, + "0x1a8b8e526d093476ac5c488a3ea057f8de9c0dee": { + "name": "JEFF token contract", + "address": "0x1a8b8e526d093476ac5c488a3ea057f8de9c0dee", + "token": { + "decimals": 18, + "symbol": "JEFF" + }, + "isSC": {} + }, + "0x4e4a47cac6a28a62dcc20990ed2cda9bc659469f": { + "name": "SHIT token contract", + "address": "0x4e4a47cac6a28a62dcc20990ed2cda9bc659469f", + "token": { + "decimals": 18, + "symbol": "SHIT" + }, + "isSC": {} + }, + "0x9ce07410673206c693bcec9b07710767637a564c": { + "name": "MONKEYS token contract", + "address": "0x9ce07410673206c693bcec9b07710767637a564c", + "token": { + "decimals": 9, + "symbol": "MONKEYS" + }, + "isSC": {} + }, + "0x7865ec47bef9823ad0010c4970ed90a5e8107e53": { + "name": "NAAI token contract", + "address": "0x7865ec47bef9823ad0010c4970ed90a5e8107e53", + "token": { + "decimals": 18, + "symbol": "NAAI" + }, + "isSC": {} + }, + "0x612e1726435fe38dd49a0b35b4065b56f49c8f11": { + "name": "CCV2 token contract", + "address": "0x612e1726435fe38dd49a0b35b4065b56f49c8f11", + "token": { + "decimals": 18, + "symbol": "CCV2" + }, + "isSC": {} + }, + "0x6c74ebb3d9b4a1e77558f1871cd9c8ef07b4dfb2": { + "name": "TISM token contract", + "address": "0x6c74ebb3d9b4a1e77558f1871cd9c8ef07b4dfb2", + "token": { + "decimals": 18, + "symbol": "TISM" + }, + "isSC": {} + }, + "0xdf87270e04bc5ac140e93571d0dd0c6f4a058b41": { + "name": "MLH token contract", + "address": "0xdf87270e04bc5ac140e93571d0dd0c6f4a058b41", + "token": { + "decimals": 18, + "symbol": "MLH" + }, + "isSC": {} + }, + "0x146ae546b7a2d676e5ed9e5d92647c8ddb8e2388": { + "name": "GTD token contract", + "address": "0x146ae546b7a2d676e5ed9e5d92647c8ddb8e2388", + "token": { + "decimals": 18, + "symbol": "GTD" + }, + "isSC": {} + }, + "0xf1d1a5306daae314af6c5d027a492b313e07e1a0": { + "name": "ENV token contract", + "address": "0xf1d1a5306daae314af6c5d027a492b313e07e1a0", + "token": { + "decimals": 18, + "symbol": "ENV" + }, + "isSC": {} + }, + "0x6d0f5149c502faf215c89ab306ec3e50b15e2892": { + "name": "Portion Token", + "address": "0x6d0f5149c502faf215c89ab306ec3e50b15e2892", + "token": { + "decimals": 18, + "symbol": "PRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PRT.svg" + }, + "0x018fb5af9d015af25592a014c4266a84143de7a0": { + "name": "MP3 token contract", + "address": "0x018fb5af9d015af25592a014c4266a84143de7a0", + "token": { + "decimals": 18, + "symbol": "MP3" + }, + "isSC": {} + }, + "0xbb9fd9fa4863c03c574007ff3370787b9ce65ff6": { + "name": "HILO token contract", + "address": "0xbb9fd9fa4863c03c574007ff3370787b9ce65ff6", + "token": { + "decimals": 18, + "symbol": "HILO" + }, + "isSC": {} + }, + "0x0080428794a79a40ae03cf6e6c1d56bd5467a4a2": { + "name": "LONG token contract", + "address": "0x0080428794a79a40ae03cf6e6c1d56bd5467a4a2", + "token": { + "decimals": 18, + "symbol": "LONG" + }, + "isSC": {} + }, + "0x8052327f1baf94a9dc8b26b9100f211ee3774f54": { + "name": "ATD token contract", + "address": "0x8052327f1baf94a9dc8b26b9100f211ee3774f54", + "token": { + "decimals": 18, + "symbol": "ATD" + }, + "isSC": {} + }, + "0x3127294f1fd3c097ef31e54301069346b29d0209": { + "name": "BLAST token contract", + "address": "0x3127294f1fd3c097ef31e54301069346b29d0209", + "token": { + "decimals": 18, + "symbol": "BLAST" + }, + "isSC": {} + }, + "0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef": { + "name": "SDEX token contract", + "address": "0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef", + "token": { + "decimals": 18, + "symbol": "SDEX" + }, + "isSC": {} + }, + "0xf4cccfda0781ae019a9d4e1853dcd3e288daaa89": { + "name": "PINCHI token contract", + "address": "0xf4cccfda0781ae019a9d4e1853dcd3e288daaa89", + "token": { + "decimals": 9, + "symbol": "PINCHI" + }, + "isSC": {} + }, + "0x9d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804": { + "name": "NVIR token contract", + "address": "0x9d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804", + "token": { + "decimals": 18, + "symbol": "NVIR" + }, + "isSC": {} + }, + "0xa3c519683010d59fa54a4a6c4cac0f55cb20bb3f": { + "name": "BETIT token contract", + "address": "0xa3c519683010d59fa54a4a6c4cac0f55cb20bb3f", + "token": { + "decimals": 18, + "symbol": "BETIT" + }, + "isSC": {} + }, + "0x7199f1dffe926c8fd36567d8df6f41edb01bf632": { + "name": "OKIKU token contract", + "address": "0x7199f1dffe926c8fd36567d8df6f41edb01bf632", + "token": { + "decimals": 18, + "symbol": "OKIKU" + }, + "isSC": {} + }, + "0xb4c25205f7a76ae08cbe95e27864106e1b93732c": { + "name": "EXTROPIC token contract", + "address": "0xb4c25205f7a76ae08cbe95e27864106e1b93732c", + "token": { + "decimals": 9, + "symbol": "EXTROPIC" + }, + "isSC": {} + }, + "0x2105465ab589b74747b01afdaf606d058fb082be": { + "name": "HIXOKDKEKJCJDKSICND token contract", + "address": "0x2105465ab589b74747b01afdaf606d058fb082be", + "token": { + "decimals": 18, + "symbol": "HIXOKDKEKJCJDKSICND" + }, + "isSC": {} + }, + "0xd1b5651e55d4ceed36251c61c50c889b36f6abb5": { + "name": "SDCRV token contract", + "address": "0xd1b5651e55d4ceed36251c61c50c889b36f6abb5", + "token": { + "decimals": 18, + "symbol": "SDCRV" + }, + "isSC": {} + }, + "0xf19308f923582a6f7c465e5ce7a9dc1bec6665b1": { + "name": "TITANX token contract", + "address": "0xf19308f923582a6f7c465e5ce7a9dc1bec6665b1", + "token": { + "decimals": 18, + "symbol": "TITANX" + }, + "isSC": {} + }, + "0x3ab6ed69ef663bd986ee59205ccad8a20f98b4c2": { + "name": "DREP token contract", + "address": "0x3ab6ed69ef663bd986ee59205ccad8a20f98b4c2", + "token": { + "decimals": 18, + "symbol": "DREP" + }, + "isSC": {} + }, + "0xbeef8e0982874e0292e6c5751c5a4092b3e1beef": { + "name": "MOOBIFI token contract", + "address": "0xbeef8e0982874e0292e6c5751c5a4092b3e1beef", + "token": { + "decimals": 18, + "symbol": "MOOBIFI" + }, + "isSC": {} + }, + "0x0db8d8b76bc361bacbb72e2c491e06085a97ab31": { + "name": "IQeon", + "address": "0x0db8d8b76bc361bacbb72e2c491e06085a97ab31", + "token": { + "decimals": 18, + "symbol": "IQN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/iqeon.svg" + }, + "0xf61bf4d1a948487d61b8fa63808aac06bda55f98": { + "name": "TR3 token contract", + "address": "0xf61bf4d1a948487d61b8fa63808aac06bda55f98", + "token": { + "decimals": 18, + "symbol": "TR3" + }, + "isSC": {} + }, + "0x59f7b6bb42cb9c47f16fb0fbb15f154f1046ec60": { + "name": "THUND token contract", + "address": "0x59f7b6bb42cb9c47f16fb0fbb15f154f1046ec60", + "token": { + "decimals": 18, + "symbol": "THUND" + }, + "isSC": {} + }, + "0xcbd55d4ffc43467142761a764763652b48b969ff": { + "name": "ASTRO token contract", + "address": "0xcbd55d4ffc43467142761a764763652b48b969ff", + "token": { + "decimals": 18, + "symbol": "ASTRO" + }, + "isSC": {} + }, + "0xcb69b067d9d8d6dd1209fe4557c43586e54f9045": { + "name": "PSM token contract", + "address": "0xcb69b067d9d8d6dd1209fe4557c43586e54f9045", + "token": { + "decimals": 18, + "symbol": "PSM" + }, + "isSC": {} + }, + "0x65ccd72c0813ce6f2703593b633202a0f3ca6a0c": { + "name": "EGG token contract", + "address": "0x65ccd72c0813ce6f2703593b633202a0f3ca6a0c", + "token": { + "decimals": 18, + "symbol": "EGG" + }, + "isSC": {} + }, + "0x55af2344088e2fbca58cacc36b4b2815675a3f98": { + "name": "VMS token contract", + "address": "0x55af2344088e2fbca58cacc36b4b2815675a3f98", + "token": { + "decimals": 18, + "symbol": "VMS" + }, + "isSC": {} + }, + "0x3ec15c4745e21ab3831d1f51c492e3b5582d6239": { + "name": "PICKLE token contract", + "address": "0x3ec15c4745e21ab3831d1f51c492e3b5582d6239", + "token": { + "decimals": 18, + "symbol": "PICKLE" + }, + "isSC": {} + }, + "0xfeef77d3f69374f66429c91d732a244f074bdf74": { + "name": "CVXFXS token contract", + "address": "0xfeef77d3f69374f66429c91d732a244f074bdf74", + "token": { + "decimals": 18, + "symbol": "CVXFXS" + }, + "isSC": {} + }, + "0xf8f1f1d2eb683bfc3971f2901045893065d58af5": { + "name": "SBWP token contract", + "address": "0xf8f1f1d2eb683bfc3971f2901045893065d58af5", + "token": { + "decimals": 18, + "symbol": "SBWP" + }, + "isSC": {} + }, + "0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25": { + "name": "SRN token contract", + "address": "0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25", + "token": { + "decimals": 18, + "symbol": "SRN" + }, + "isSC": {} + }, + "0x85225ed797fd4128ac45a992c46ea4681a7a15da": { + "name": "HYPE token contract", + "address": "0x85225ed797fd4128ac45a992c46ea4681a7a15da", + "token": { + "decimals": 18, + "symbol": "HYPE" + }, + "isSC": {} + }, + "0x1cc7047e15825f639e0752eb1b89e4225f5327f2": { + "name": "PLX token contract", + "address": "0x1cc7047e15825f639e0752eb1b89e4225f5327f2", + "token": { + "decimals": 18, + "symbol": "PLX" + }, + "isSC": {} + }, + "0xb71bdc7014f3740d0267d41d632cab8371f8ba3c": { + "name": "MILEI token contract", + "address": "0xb71bdc7014f3740d0267d41d632cab8371f8ba3c", + "token": { + "decimals": 18, + "symbol": "MILEI" + }, + "isSC": {} + }, + "0x3fab0bbaa03bceaf7c49e2b12877db0142be65fc": { + "name": "CAST token contract", + "address": "0x3fab0bbaa03bceaf7c49e2b12877db0142be65fc", + "token": { + "decimals": 8, + "symbol": "CAST" + }, + "isSC": {} + }, + "0x4af5ff1a60a6ef6c7c8f9c4e304cd9051fca3ec0": { + "name": "RGP token contract", + "address": "0x4af5ff1a60a6ef6c7c8f9c4e304cd9051fca3ec0", + "token": { + "decimals": 18, + "symbol": "RGP" + }, + "isSC": {} + }, + "0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6": { + "name": "Raiden Network Token", + "address": "0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6", + "token": { + "decimals": 18, + "symbol": "RDN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/raiden.svg" + }, + "0x33349b282065b0284d756f0577fb39c158f935e6": { + "name": "Maple Finance", + "address": "0x33349b282065b0284d756f0577fb39c158f935e6", + "token": { + "decimals": 18, + "symbol": "MPL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/maple-finance.svg" + }, + "0x5441765d3ab74e0347df52ffab5a69e5146b5d26": { + "name": "BTCMEME token contract", + "address": "0x5441765d3ab74e0347df52ffab5a69e5146b5d26", + "token": { + "decimals": 18, + "symbol": "BTCMEME" + }, + "isSC": {} + }, + "0x128ad1ad707c3b36e6f2ac9739f9df7516fdb592": { + "name": "ALFA token contract", + "address": "0x128ad1ad707c3b36e6f2ac9739f9df7516fdb592", + "token": { + "decimals": 18, + "symbol": "ALFA" + }, + "isSC": {} + }, + "0xc9a1f104fbbda8b8752946f7d56d59d28284037f": { + "name": "DOUG token contract", + "address": "0xc9a1f104fbbda8b8752946f7d56d59d28284037f", + "token": { + "decimals": 18, + "symbol": "DOUG" + }, + "isSC": {} + }, + "0x1e3778dd6dbfdc1c5b89f95f7c098b21e80ec4fa": { + "name": "VIC token contract", + "address": "0x1e3778dd6dbfdc1c5b89f95f7c098b21e80ec4fa", + "token": { + "decimals": 18, + "symbol": "VIC" + }, + "isSC": {} + }, + "0xf04af3f4e4929f7cd25a751e6149a3318373d4fe": { + "name": "SPRING token contract", + "address": "0xf04af3f4e4929f7cd25a751e6149a3318373d4fe", + "token": { + "decimals": 18, + "symbol": "SPRING" + }, + "isSC": {} + }, + "0x9b01637302b6adfc2c82678e2a8d680cff6337b7": { + "name": "FIT token contract", + "address": "0x9b01637302b6adfc2c82678e2a8d680cff6337b7", + "token": { + "decimals": 18, + "symbol": "FIT" + }, + "isSC": {} + }, + "0x0e74a58557555cb44415df5a960d9eb14e96142a": { + "name": "VEGAS token contract", + "address": "0x0e74a58557555cb44415df5a960d9eb14e96142a", + "token": { + "decimals": 18, + "symbol": "VEGAS" + }, + "isSC": {} + }, + "0x8c1bed5b9a0928467c9b1341da1d7bd5e10b6549": { + "name": "LSETH token contract", + "address": "0x8c1bed5b9a0928467c9b1341da1d7bd5e10b6549", + "token": { + "decimals": 18, + "symbol": "LSETH" + }, + "isSC": {} + }, + "0x8ce55da273fb5cf4b1ffc5d4066bd62445a43543": { + "name": "BRNR token contract", + "address": "0x8ce55da273fb5cf4b1ffc5d4066bd62445a43543", + "token": { + "decimals": 18, + "symbol": "BRNR" + }, + "isSC": {} + }, + "0xd69a0a9682f679f50e34de40105a93bebb2ff43d": { + "name": "MACKE token contract", + "address": "0xd69a0a9682f679f50e34de40105a93bebb2ff43d", + "token": { + "decimals": 18, + "symbol": "MACKE" + }, + "isSC": {} + }, + "0xf75c7a59bcd9bd207c4ab1beb0b32eed3b6392f3": { + "name": "KEI token contract", + "address": "0xf75c7a59bcd9bd207c4ab1beb0b32eed3b6392f3", + "token": { + "decimals": 8, + "symbol": "KEI" + }, + "isSC": {} + }, + "0xadc3f2c3d728202658930860158c726d8180a38f": { + "name": "SMETA token contract", + "address": "0xadc3f2c3d728202658930860158c726d8180a38f", + "token": { + "decimals": 18, + "symbol": "SMETA" + }, + "isSC": {} + }, + "0x3a429a151ad985e678a834f9db057163181f58e8": { + "name": "ENCR token contract", + "address": "0x3a429a151ad985e678a834f9db057163181f58e8", + "token": { + "decimals": 18, + "symbol": "ENCR" + }, + "isSC": {} + }, + "0x91cdacba4559ade84daa1a51b6fbd94ec3f1202e": { + "name": "BRRRRR token contract", + "address": "0x91cdacba4559ade84daa1a51b6fbd94ec3f1202e", + "token": { + "decimals": 9, + "symbol": "BRRRRR" + }, + "isSC": {} + }, + "0x335f4e66b9b61cee5ceade4e727fcec20156b2f0": { + "name": "ELMO token contract", + "address": "0x335f4e66b9b61cee5ceade4e727fcec20156b2f0", + "token": { + "decimals": 18, + "symbol": "ELMO" + }, + "isSC": {} + }, + "0x3757232b55e60da4a8793183ac030cfce4c3865d": { + "name": "YDR token contract", + "address": "0x3757232b55e60da4a8793183ac030cfce4c3865d", + "token": { + "decimals": 18, + "symbol": "YDR" + }, + "isSC": {} + }, + "0x04cb855a5e5c4e92dd90bce82548669b4fe88702": { + "name": "BOOK token contract", + "address": "0x04cb855a5e5c4e92dd90bce82548669b4fe88702", + "token": { + "decimals": 18, + "symbol": "BOOK" + }, + "isSC": {} + }, + "0xfbbe9b1142c699512545f47937ee6fae0e4b0aa9": { + "name": "EDDA token contract", + "address": "0xfbbe9b1142c699512545f47937ee6fae0e4b0aa9", + "token": { + "decimals": 18, + "symbol": "EDDA" + }, + "isSC": {} + }, + "0x80ce3027a70e0a928d9268994e9b85d03bd4cdcf": { + "name": "LKR token contract", + "address": "0x80ce3027a70e0a928d9268994e9b85d03bd4cdcf", + "token": { + "decimals": 18, + "symbol": "LKR" + }, + "isSC": {} + }, + "0x7acc3f723419fa0c1f789618f798e75c5189c24f": { + "name": "DADA token contract", + "address": "0x7acc3f723419fa0c1f789618f798e75c5189c24f", + "token": { + "decimals": 18, + "symbol": "DADA" + }, + "isSC": {} + }, + "0xb2d2e1309db33b38a19ee2a7cd9cb5de39d76663": { + "name": "COLR token contract", + "address": "0xb2d2e1309db33b38a19ee2a7cd9cb5de39d76663", + "token": { + "decimals": 18, + "symbol": "COLR" + }, + "isSC": {} + }, + "0x5acd02940d2e56d9402b8d224e56bd800c544466": { + "name": " token contract", + "address": "0x5acd02940d2e56d9402b8d224e56bd800c544466", + "token": { + "decimals": 9, + "symbol": "" + }, + "isSC": {} + }, + "0x5f944b0c4315cb7c3a846b025ab4045da44abf6c": { + "name": "GCAKE token contract", + "address": "0x5f944b0c4315cb7c3a846b025ab4045da44abf6c", + "token": { + "decimals": 18, + "symbol": "GCAKE" + }, + "isSC": {} + }, + "0x45448e05020576929fcdeabc228e35b420098840": { + "name": "IDV token contract", + "address": "0x45448e05020576929fcdeabc228e35b420098840", + "token": { + "decimals": 18, + "symbol": "IDV" + }, + "isSC": {} + }, + "0x4527a3b4a8a150403090a99b87effc96f2195047": { + "name": "P2PS token contract", + "address": "0x4527a3b4a8a150403090a99b87effc96f2195047", + "token": { + "decimals": 8, + "symbol": "P2PS" + }, + "isSC": {} + }, + "0xda31d0d1bc934fc34f7189e38a413ca0a5e8b44f": { + "name": "BSSB token contract", + "address": "0xda31d0d1bc934fc34f7189e38a413ca0a5e8b44f", + "token": { + "decimals": 18, + "symbol": "BSSB" + }, + "isSC": {} + }, + "0x0ee27a1f959ea7ea2aa171a7e2e48fd9f17bb8eb": { + "name": "GROK token contract", + "address": "0x0ee27a1f959ea7ea2aa171a7e2e48fd9f17bb8eb", + "token": { + "decimals": 9, + "symbol": "GROK" + }, + "isSC": {} + }, + "0xa2a54f1ec1f09316ef12c1770d32ed8f21b1fb6a": { + "name": "DFT token contract", + "address": "0xa2a54f1ec1f09316ef12c1770d32ed8f21b1fb6a", + "token": { + "decimals": 8, + "symbol": "DFT" + }, + "isSC": {} + }, + "0xbdbda38e3aa4216408b2d39fa6fbd17bdfe9af08": { + "name": "PPLS token contract", + "address": "0xbdbda38e3aa4216408b2d39fa6fbd17bdfe9af08", + "token": { + "decimals": 18, + "symbol": "PPLS" + }, + "isSC": {} + }, + "0x792833b894775bd769b3c602ba7172e59a83ab3f": { + "name": "TOONS token contract", + "address": "0x792833b894775bd769b3c602ba7172e59a83ab3f", + "token": { + "decimals": 18, + "symbol": "TOONS" + }, + "isSC": {} + }, + "0xf017d3690346eb8234b85f74cee5e15821fee1f4": { + "name": "GEKKO token contract", + "address": "0xf017d3690346eb8234b85f74cee5e15821fee1f4", + "token": { + "decimals": 18, + "symbol": "GEKKO" + }, + "isSC": {} + }, + "0x5eeaa2dcb23056f4e8654a349e57ebe5e76b5e6e": { + "name": "VPP token contract", + "address": "0x5eeaa2dcb23056f4e8654a349e57ebe5e76b5e6e", + "token": { + "decimals": 18, + "symbol": "VPP" + }, + "isSC": {} + }, + "0xa849eaae994fb86afa73382e9bd88c2b6b18dc71": { + "name": "Mass Vehicle Ledger", + "address": "0xa849eaae994fb86afa73382e9bd88c2b6b18dc71", + "token": { + "decimals": 18, + "symbol": "MVL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mvl.svg" + }, + "0x009c43b42aefac590c719e971020575974122803": { + "name": "BIX token contract", + "address": "0x009c43b42aefac590c719e971020575974122803", + "token": { + "decimals": 18, + "symbol": "BIX" + }, + "isSC": {} + }, + "0xe50365f5d679cb98a1dd62d6f6e58e59321bcddf": { + "name": "LA token contract", + "address": "0xe50365f5d679cb98a1dd62d6f6e58e59321bcddf", + "token": { + "decimals": 18, + "symbol": "LA" + }, + "isSC": {} + }, + "0x0b4663216b812e4a2f0fc2029ff1232958f4bf8c": { + "name": "IUCN token contract", + "address": "0x0b4663216b812e4a2f0fc2029ff1232958f4bf8c", + "token": { + "decimals": 18, + "symbol": "IUCN" + }, + "isSC": {} + }, + "0x0af0e83d064f160376303ac67dd9a7971af88d4c": { + "name": "MESLBR token contract", + "address": "0x0af0e83d064f160376303ac67dd9a7971af88d4c", + "token": { + "decimals": 18, + "symbol": "MESLBR" + }, + "isSC": {} + }, + "0x7707aada3ce7722ac63b91727daf1999849f6835": { + "name": "BNK token contract", + "address": "0x7707aada3ce7722ac63b91727daf1999849f6835", + "token": { + "decimals": 8, + "symbol": "BNK" + }, + "isSC": {} + }, + "0x1de852cd18323bc5ebda842b8eef46c6e551aa47": { + "name": "HIRENGA token contract", + "address": "0x1de852cd18323bc5ebda842b8eef46c6e551aa47", + "token": { + "decimals": 18, + "symbol": "HIRENGA" + }, + "isSC": {} + }, + "0x427a03fb96d9a94a6727fbcfbba143444090dd64": { + "name": "PIXL token contract", + "address": "0x427a03fb96d9a94a6727fbcfbba143444090dd64", + "token": { + "decimals": 18, + "symbol": "PIXL" + }, + "isSC": {} + }, + "0xdb81f7b3f0b2baebd5009cddade5c9a9c82378bb": { + "name": "JJ token contract", + "address": "0xdb81f7b3f0b2baebd5009cddade5c9a9c82378bb", + "token": { + "decimals": 18, + "symbol": "JJ" + }, + "isSC": {} + }, + "0xd417144312dbf50465b1c641d016962017ef6240": { + "name": "CQT token contract", + "address": "0xd417144312dbf50465b1c641d016962017ef6240", + "token": { + "decimals": 18, + "symbol": "CQT" + }, + "isSC": {} + }, + "0x5b71bee9d961b1b848f8485eec8d8787f80217f5": { + "name": "BF token contract", + "address": "0x5b71bee9d961b1b848f8485eec8d8787f80217f5", + "token": { + "decimals": 18, + "symbol": "BF" + }, + "isSC": {} + }, + "0x61e90a50137e1f645c9ef4a0d3a4f01477738406": { + "name": "LOKA token contract", + "address": "0x61e90a50137e1f645c9ef4a0d3a4f01477738406", + "token": { + "decimals": 18, + "symbol": "LOKA" + }, + "isSC": {} + }, + "0x11eef04c884e24d9b7b4760e7476d06ddf797f36": { + "name": "MX token contract", + "address": "0x11eef04c884e24d9b7b4760e7476d06ddf797f36", + "token": { + "decimals": 18, + "symbol": "MX" + }, + "isSC": {} + }, + "0xe29f1241e6015a4949cb7e3f07234ba794006181": { + "name": "BIGCAP token contract", + "address": "0xe29f1241e6015a4949cb7e3f07234ba794006181", + "token": { + "decimals": 18, + "symbol": "BIGCAP" + }, + "isSC": {} + }, + "0x3dbb00c9be5a327e25caf4f650844c5dba81e34b": { + "name": "RMATIC token contract", + "address": "0x3dbb00c9be5a327e25caf4f650844c5dba81e34b", + "token": { + "decimals": 18, + "symbol": "RMATIC" + }, + "isSC": {} + }, + "0x17d2628d30f8e9e966c9ba831c9b9b01ea8ea75c": { + "name": "ISK token contract", + "address": "0x17d2628d30f8e9e966c9ba831c9b9b01ea8ea75c", + "token": { + "decimals": 18, + "symbol": "ISK" + }, + "isSC": {} + }, + "0xe2ba8693ce7474900a045757fe0efca900f6530b": { + "name": "FDAI token contract", + "address": "0xe2ba8693ce7474900a045757fe0efca900f6530b", + "token": { + "decimals": 8, + "symbol": "FDAI" + }, + "isSC": {} + }, + "0x6f38e0f1a73c96cb3f42598613ea3474f09cb200": { + "name": "DAKS token contract", + "address": "0x6f38e0f1a73c96cb3f42598613ea3474f09cb200", + "token": { + "decimals": 0, + "symbol": "DAKS" + }, + "isSC": {} + }, + "0xc77b230f31b517f1ef362e59c173c2be6540b5e8": { + "name": "VIDY token contract", + "address": "0xc77b230f31b517f1ef362e59c173c2be6540b5e8", + "token": { + "decimals": 18, + "symbol": "VIDY" + }, + "isSC": {} + }, + "0xb70835d7822ebb9426b56543e391846c107bd32c": { + "name": "GTC token contract", + "address": "0xb70835d7822ebb9426b56543e391846c107bd32c", + "token": { + "decimals": 18, + "symbol": "GTC" + }, + "isSC": {} + }, + "0x9ae380f0272e2162340a5bb646c354271c0f5cfc": { + "name": "CNC token contract", + "address": "0x9ae380f0272e2162340a5bb646c354271c0f5cfc", + "token": { + "decimals": 18, + "symbol": "CNC" + }, + "isSC": {} + }, + "0xfeeeef4d7b4bf3cc8bd012d02d32ba5fd3d51e31": { + "name": "TAIL token contract", + "address": "0xfeeeef4d7b4bf3cc8bd012d02d32ba5fd3d51e31", + "token": { + "decimals": 18, + "symbol": "TAIL" + }, + "isSC": {} + }, + "0xd3b9a9e5ee4aab3963c95dd715882def4f22b449": { + "name": "REVHUB token contract", + "address": "0xd3b9a9e5ee4aab3963c95dd715882def4f22b449", + "token": { + "decimals": 18, + "symbol": "REVHUB" + }, + "isSC": {} + }, + "0x89303500a7abfb178b274fd89f2469c264951e1f": { + "name": "REF token contract", + "address": "0x89303500a7abfb178b274fd89f2469c264951e1f", + "token": { + "decimals": 8, + "symbol": "REF" + }, + "isSC": {} + }, + "0x291aa47c58558adfc2bcd6f060578fdae1f6570c": { + "name": "MBASE token contract", + "address": "0x291aa47c58558adfc2bcd6f060578fdae1f6570c", + "token": { + "decimals": 18, + "symbol": "MBASE" + }, + "isSC": {} + }, + "0xcbcc0f036ed4788f63fc0fee32873d6a7487b908": { + "name": "HMQ token contract", + "address": "0xcbcc0f036ed4788f63fc0fee32873d6a7487b908", + "token": { + "decimals": 8, + "symbol": "HMQ" + }, + "isSC": {} + }, + "0x8cc379a292a47cb8406fb1bd8a6d98f442275f0e": { + "name": "U token contract", + "address": "0x8cc379a292a47cb8406fb1bd8a6d98f442275f0e", + "token": { + "decimals": 18, + "symbol": "U" + }, + "isSC": {} + }, + "0x3541a5c1b04adaba0b83f161747815cd7b1516bc": { + "name": "KNIGHT token contract", + "address": "0x3541a5c1b04adaba0b83f161747815cd7b1516bc", + "token": { + "decimals": 18, + "symbol": "KNIGHT" + }, + "isSC": {} + }, + "0xf024e6387392a3c3a03ebd0b9d6b747ff5359417": { + "name": "ORLA token contract", + "address": "0xf024e6387392a3c3a03ebd0b9d6b747ff5359417", + "token": { + "decimals": 18, + "symbol": "ORLA" + }, + "isSC": {} + }, + "0x8c688327c9371bb3bd69f6e1f1a6d8c9ca0880a7": { + "name": "DADA token contract", + "address": "0x8c688327c9371bb3bd69f6e1f1a6d8c9ca0880a7", + "token": { + "decimals": 18, + "symbol": "DADA" + }, + "isSC": {} + }, + "0xfca47962d45adfdfd1ab2d972315db4ce7ccf094": { + "name": "IXT token contract", + "address": "0xfca47962d45adfdfd1ab2d972315db4ce7ccf094", + "token": { + "decimals": 8, + "symbol": "IXT" + }, + "isSC": {} + }, + "0x9a6aea7c2b0d563eab701e3255110d30f08b5a64": { + "name": "MAPS token contract", + "address": "0x9a6aea7c2b0d563eab701e3255110d30f08b5a64", + "token": { + "decimals": 8, + "symbol": "MAPS" + }, + "isSC": {} + }, + "0xddf688e96cb2531a69bf6347c02f069266c1aa81": { + "name": "MMVG token contract", + "address": "0xddf688e96cb2531a69bf6347c02f069266c1aa81", + "token": { + "decimals": 18, + "symbol": "MMVG" + }, + "isSC": {} + }, + "0xa3c31927a092bd54eb9a0b5dfe01d9db5028bd4f": { + "name": "ESPR token contract", + "address": "0xa3c31927a092bd54eb9a0b5dfe01d9db5028bd4f", + "token": { + "decimals": 9, + "symbol": "ESPR" + }, + "isSC": {} + }, + "0xb755d5bc7de83232b9df1886bd5cdb38895933b0": { + "name": "HIMFERS token contract", + "address": "0xb755d5bc7de83232b9df1886bd5cdb38895933b0", + "token": { + "decimals": 18, + "symbol": "HIMFERS" + }, + "isSC": {} + }, + "0x223028738503838e89fc5fd5b1a42f1d024d9600": { + "name": "DGNS token contract", + "address": "0x223028738503838e89fc5fd5b1a42f1d024d9600", + "token": { + "decimals": 18, + "symbol": "DGNS" + }, + "isSC": {} + }, + "0xe3fedaecd47aa8eab6b23227b0ee56f092c967a9": { + "name": "PST token contract", + "address": "0xe3fedaecd47aa8eab6b23227b0ee56f092c967a9", + "token": { + "decimals": 18, + "symbol": "PST" + }, + "isSC": {} + }, + "0x38a2fdc11f526ddd5a607c1f251c065f40fbf2f7": { + "name": "PHNX token contract", + "address": "0x38a2fdc11f526ddd5a607c1f251c065f40fbf2f7", + "token": { + "decimals": 18, + "symbol": "PHNX" + }, + "isSC": {} + }, + "0x5274891bec421b39d23760c04a6755ecb444797c": { + "name": "IDLEUSDCYIELD token contract", + "address": "0x5274891bec421b39d23760c04a6755ecb444797c", + "token": { + "decimals": 18, + "symbol": "IDLEUSDCYIELD" + }, + "isSC": {} + }, + "0x52e7b23e1faba6d83376725e2ccad75efbd8736e": { + "name": "BURN token contract", + "address": "0x52e7b23e1faba6d83376725e2ccad75efbd8736e", + "token": { + "decimals": 18, + "symbol": "BURN" + }, + "isSC": {} + }, + "0x72f020f8f3e8fd9382705723cd26380f8d0c66bb": { + "name": "PlotX", + "address": "0x72f020f8f3e8fd9382705723cd26380f8d0c66bb", + "token": { + "decimals": 18, + "symbol": "PLOT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plotx.svg" + }, + "0x0c90c57aaf95a3a87eadda6ec3974c99d786511f": { + "name": "HAN token contract", + "address": "0x0c90c57aaf95a3a87eadda6ec3974c99d786511f", + "token": { + "decimals": 18, + "symbol": "HAN" + }, + "isSC": {} + }, + "0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78": { + "name": "DPAY token contract", + "address": "0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78", + "token": { + "decimals": 18, + "symbol": "DPAY" + }, + "isSC": {} + }, + "0x07e3c70653548b04f0a75970c1f81b4cbbfb606f": { + "name": "DLT token contract", + "address": "0x07e3c70653548b04f0a75970c1f81b4cbbfb606f", + "token": { + "decimals": 18, + "symbol": "DLT" + }, + "isSC": {} + }, + "0x0058c8581b9fed6864faa654505bc89890cdb2dd": { + "name": "BS9000 token contract", + "address": "0x0058c8581b9fed6864faa654505bc89890cdb2dd", + "token": { + "decimals": 9, + "symbol": "BS9000" + }, + "isSC": {} + }, + "0xcae72a7a0fd9046cf6b165ca54c9e3a3872109e0": { + "name": "ANRX token contract", + "address": "0xcae72a7a0fd9046cf6b165ca54c9e3a3872109e0", + "token": { + "decimals": 18, + "symbol": "ANRX" + }, + "isSC": {} + }, + "0xa3ee21c306a700e682abcdfe9baa6a08f3820419": { + "name": "CTC token contract", + "address": "0xa3ee21c306a700e682abcdfe9baa6a08f3820419", + "token": { + "decimals": 18, + "symbol": "CTC" + }, + "isSC": {} + }, + "0x903ff0ba636e32de1767a4b5eeb55c155763d8b7": { + "name": "NONE token contract", + "address": "0x903ff0ba636e32de1767a4b5eeb55c155763d8b7", + "token": { + "decimals": 18, + "symbol": "NONE" + }, + "isSC": {} + }, + "0x9d39a5de30e57443bff2a8307a4256c8797a3497": { + "name": "SUSDE token contract", + "address": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "token": { + "decimals": 18, + "symbol": "SUSDE" + }, + "isSC": {} + }, + "0xad8f047d9b742565bb9e10c7655bd3ee9c1eab75": { + "name": "GROC token contract", + "address": "0xad8f047d9b742565bb9e10c7655bd3ee9c1eab75", + "token": { + "decimals": 9, + "symbol": "GROC" + }, + "isSC": {} + }, + "0x5df2aa6d903410b2a747c90dbf2de0de7b15ac60": { + "name": "0XG token contract", + "address": "0x5df2aa6d903410b2a747c90dbf2de0de7b15ac60", + "token": { + "decimals": 8, + "symbol": "0XG" + }, + "isSC": {} + }, + "0x6995923faa52f1d0cd3ed7870eb273ebb1b0970b": { + "name": "MXRBOT token contract", + "address": "0x6995923faa52f1d0cd3ed7870eb273ebb1b0970b", + "token": { + "decimals": 18, + "symbol": "MXRBOT" + }, + "isSC": {} + }, + "0xa9b1eb5908cfc3cdf91f9b8b3a74108598009096": { + "name": "AUCTION token contract", + "address": "0xa9b1eb5908cfc3cdf91f9b8b3a74108598009096", + "token": { + "decimals": 18, + "symbol": "AUCTION" + }, + "isSC": {} + }, + "0xcae0dd4bda7ff3e700355c7629b24d5d728bd2ce": { + "name": "BOWIE token contract", + "address": "0xcae0dd4bda7ff3e700355c7629b24d5d728bd2ce", + "token": { + "decimals": 18, + "symbol": "BOWIE" + }, + "isSC": {} + }, + "0xfa5047c9c78b8877af97bdcb85db743fd7313d4a": { + "name": "ROOK", + "address": "0xfa5047c9c78b8877af97bdcb85db743fd7313d4a", + "token": { + "decimals": 18, + "symbol": "ROOK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Rook.svg" + }, + "0x009668a9691e456972c8ec4cc84e99486308b84d": { + "name": "TERA token contract", + "address": "0x009668a9691e456972c8ec4cc84e99486308b84d", + "token": { + "decimals": 18, + "symbol": "TERA" + }, + "isSC": {} + }, + "0x1c48f86ae57291f7686349f12601910bd8d470bb": { + "name": "USDK token contract", + "address": "0x1c48f86ae57291f7686349f12601910bd8d470bb", + "token": { + "decimals": 18, + "symbol": "USDK" + }, + "isSC": {} + }, + "0x36f8d0d0573ae92326827c4a82fe4ce4c244cab6": { + "name": "MADAI token contract", + "address": "0x36f8d0d0573ae92326827c4a82fe4ce4c244cab6", + "token": { + "decimals": 18, + "symbol": "MADAI" + }, + "isSC": {} + }, + "0xd4e245848d6e1220dbe62e155d89fa327e43cb06": { + "name": "AFRAX token contract", + "address": "0xd4e245848d6e1220dbe62e155d89fa327e43cb06", + "token": { + "decimals": 18, + "symbol": "AFRAX" + }, + "isSC": {} + }, + "0x1045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0": { + "name": "DFIAT token contract", + "address": "0x1045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0", + "token": { + "decimals": 18, + "symbol": "DFIAT" + }, + "isSC": {} + }, + "0x7138eb0d563f3f6722500936a11dcae99d738a2c": { + "name": "LIF3 token contract", + "address": "0x7138eb0d563f3f6722500936a11dcae99d738a2c", + "token": { + "decimals": 18, + "symbol": "LIF3" + }, + "isSC": {} + }, + "0x6cb7d80bdefef3f820a3a77ee56f06afcb20ea7e": { + "name": "HUNDRED token contract", + "address": "0x6cb7d80bdefef3f820a3a77ee56f06afcb20ea7e", + "token": { + "decimals": 18, + "symbol": "HUNDRED" + }, + "isSC": {} + }, + "0xb53ecf1345cabee6ea1a65100ebb153cebcac40f": { + "name": "O token contract", + "address": "0xb53ecf1345cabee6ea1a65100ebb153cebcac40f", + "token": { + "decimals": 18, + "symbol": "O" + }, + "isSC": {} + }, + "0xc0da2786176dac9eda661c566828950ca571348c": { + "name": "ARTS token contract", + "address": "0xc0da2786176dac9eda661c566828950ca571348c", + "token": { + "decimals": 0, + "symbol": "ARTS" + }, + "isSC": {} + }, + "0xc740181345c65552333e1edc797e03f11852b1c8": { + "name": "KNTO token contract", + "address": "0xc740181345c65552333e1edc797e03f11852b1c8", + "token": { + "decimals": 18, + "symbol": "KNTO" + }, + "isSC": {} + }, + "0x486c280024b5428459ec3360f99183a61d41d9a3": { + "name": "ETHLINQ token contract", + "address": "0x486c280024b5428459ec3360f99183a61d41d9a3", + "token": { + "decimals": 18, + "symbol": "ETHLINQ" + }, + "isSC": {} + }, + "0x3ee4b152824b657644c7a9b50694787e80eb8f4a": { + "name": "BAZED token contract", + "address": "0x3ee4b152824b657644c7a9b50694787e80eb8f4a", + "token": { + "decimals": 18, + "symbol": "BAZED" + }, + "isSC": {} + }, + "0x5f9123d661459af6f398b6f1566f53222612541e": { + "name": "MARAN token contract", + "address": "0x5f9123d661459af6f398b6f1566f53222612541e", + "token": { + "decimals": 18, + "symbol": "MARAN" + }, + "isSC": {} + }, + "0x0f4dc5ada841cf5a7652e52d04ae786070cc9472": { + "name": "GMCS token contract", + "address": "0x0f4dc5ada841cf5a7652e52d04ae786070cc9472", + "token": { + "decimals": 0, + "symbol": "GMCS" + }, + "isSC": {} + }, + "0x68b36248477277865c64dfc78884ef80577078f3": { + "name": "HOLD token contract", + "address": "0x68b36248477277865c64dfc78884ef80577078f3", + "token": { + "decimals": 18, + "symbol": "HOLD" + }, + "isSC": {} + }, + "0x9012744b7a564623b6c3e40b144fc196bdedf1a9": { + "name": "OXN token contract", + "address": "0x9012744b7a564623b6c3e40b144fc196bdedf1a9", + "token": { + "decimals": 18, + "symbol": "OXN" + }, + "isSC": {} + }, + "0x58f9102bf53cf186682bd9a281d3cd3c616eec41": { + "name": "TRL token contract", + "address": "0x58f9102bf53cf186682bd9a281d3cd3c616eec41", + "token": { + "decimals": 18, + "symbol": "TRL" + }, + "isSC": {} + }, + "0x1a88df1cfe15af22b3c4c783d4e6f7f9e0c1885d": { + "name": "Staked GHO Token", + "address": "0x1a88df1cfe15af22b3c4c783d4e6f7f9e0c1885d", + "token": { + "decimals": 18, + "symbol": "STKGHO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stkGHO.svg" + }, + "0x8770b7dd89e5f759ee3b226e0c45e890f87ddc48": { + "name": "MIRL token contract", + "address": "0x8770b7dd89e5f759ee3b226e0c45e890f87ddc48", + "token": { + "decimals": 18, + "symbol": "MIRL" + }, + "isSC": {} + }, + "0x3c6a7ab47b5f058be0e7c7fe1a4b7925b8aca40e": { + "name": "CAJ token contract", + "address": "0x3c6a7ab47b5f058be0e7c7fe1a4b7925b8aca40e", + "token": { + "decimals": 18, + "symbol": "CAJ" + }, + "isSC": {} + }, + "0x0425e5bf7f52591a04fbe24c454ac004179c4318": { + "name": "ALLBI token contract", + "address": "0x0425e5bf7f52591a04fbe24c454ac004179c4318", + "token": { + "decimals": 18, + "symbol": "ALLBI" + }, + "isSC": {} + }, + "0xbe56ab825fd35678a32dc35bc4eb17e238e1404f": { + "name": "DIGITS token contract", + "address": "0xbe56ab825fd35678a32dc35bc4eb17e238e1404f", + "token": { + "decimals": 18, + "symbol": "DIGITS" + }, + "isSC": {} + }, + "0x4309e88d1d511f3764ee0f154cee98d783b61f09": { + "name": "OCAI token contract", + "address": "0x4309e88d1d511f3764ee0f154cee98d783b61f09", + "token": { + "decimals": 18, + "symbol": "OCAI" + }, + "isSC": {} + }, + "0x506b8f75bdef0edac36b0a6f9cf313485e4341b0": { + "name": "WCA token contract", + "address": "0x506b8f75bdef0edac36b0a6f9cf313485e4341b0", + "token": { + "decimals": 18, + "symbol": "WCA" + }, + "isSC": {} + }, + "0x4bcea5e4d0f6ed53cf45e7a28febb2d3621d7438": { + "name": "MODEX token contract", + "address": "0x4bcea5e4d0f6ed53cf45e7a28febb2d3621d7438", + "token": { + "decimals": 18, + "symbol": "MODEX" + }, + "isSC": {} + }, + "0x0b4c2708f052dca413600e237675e4d6778a9375": { + "name": "CLM token contract", + "address": "0x0b4c2708f052dca413600e237675e4d6778a9375", + "token": { + "decimals": 16, + "symbol": "CLM" + }, + "isSC": {} + }, + "0xc626e0619ac79afea9281c8eb9b1a9f9d3fab532": { + "name": "FR token contract", + "address": "0xc626e0619ac79afea9281c8eb9b1a9f9d3fab532", + "token": { + "decimals": 18, + "symbol": "FR" + }, + "isSC": {} + }, + "0xea01906843ea8d910658a2c485ffce7c104ab2b6": { + "name": "QTO token contract", + "address": "0xea01906843ea8d910658a2c485ffce7c104ab2b6", + "token": { + "decimals": 18, + "symbol": "QTO" + }, + "isSC": {} + }, + "0xaf4ce7cd4f8891ecf1799878c3e9a35b8be57e09": { + "name": "WUSK token contract", + "address": "0xaf4ce7cd4f8891ecf1799878c3e9a35b8be57e09", + "token": { + "decimals": 18, + "symbol": "WUSK" + }, + "isSC": {} + }, + "0x27f103f86070cc639fef262787a16887d22d8415": { + "name": "FOFO token contract", + "address": "0x27f103f86070cc639fef262787a16887d22d8415", + "token": { + "decimals": 18, + "symbol": "FOFO" + }, + "isSC": {} + }, + "0x00b7db6b4431e345eee5cc23d21e8dbc1d5cada3": { + "name": "CTC token contract", + "address": "0x00b7db6b4431e345eee5cc23d21e8dbc1d5cada3", + "token": { + "decimals": 18, + "symbol": "CTC" + }, + "isSC": {} + }, + "0x6311fcfef61e75e11c6e78949d7849f3b07e3a15": { + "name": "ZAT token contract", + "address": "0x6311fcfef61e75e11c6e78949d7849f3b07e3a15", + "token": { + "decimals": 9, + "symbol": "ZAT" + }, + "isSC": {} + }, + "0x56015bbe3c01fe05bc30a8a9a9fd9a88917e7db3": { + "name": "CAT token contract", + "address": "0x56015bbe3c01fe05bc30a8a9a9fd9a88917e7db3", + "token": { + "decimals": 18, + "symbol": "CAT" + }, + "isSC": {} + }, + "0x5afff9876c1f98b7d2b53bcb69eb57e92408319f": { + "name": "MESA token contract", + "address": "0x5afff9876c1f98b7d2b53bcb69eb57e92408319f", + "token": { + "decimals": 18, + "symbol": "MESA" + }, + "isSC": {} + }, + "0x0789dbae94fb18e5789b8e4489bcb7a1adb58622": { + "name": "FSCC token contract", + "address": "0x0789dbae94fb18e5789b8e4489bcb7a1adb58622", + "token": { + "decimals": 8, + "symbol": "FSCC" + }, + "isSC": {} + }, + "0x286f851b049ccce1419e09b6468dc3297f86a703": { + "name": "HISEALS token contract", + "address": "0x286f851b049ccce1419e09b6468dc3297f86a703", + "token": { + "decimals": 18, + "symbol": "HISEALS" + }, + "isSC": {} + }, + "0x94d863173ee77439e4292284ff13fad54b3ba182": { + "name": "ADEL token contract", + "address": "0x94d863173ee77439e4292284ff13fad54b3ba182", + "token": { + "decimals": 18, + "symbol": "ADEL" + }, + "isSC": {} + }, + "0x8a458a9dc9048e005d22849f470891b840296619": { + "name": "AMKR token contract", + "address": "0x8a458a9dc9048e005d22849f470891b840296619", + "token": { + "decimals": 18, + "symbol": "AMKR" + }, + "isSC": {} + }, + "0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c": { + "name": "UTK token contract", + "address": "0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c", + "token": { + "decimals": 18, + "symbol": "UTK" + }, + "isSC": {} + }, + "0x0c0725282cbf037e6781fe84e0361b01daa88ddf": { + "name": "HIPVP token contract", + "address": "0x0c0725282cbf037e6781fe84e0361b01daa88ddf", + "token": { + "decimals": 16, + "symbol": "HIPVP" + }, + "isSC": {} + }, + "0x4ba942d56a3b95b03c0af7a91b7294e0e95271f4": { + "name": "RICH token contract", + "address": "0x4ba942d56a3b95b03c0af7a91b7294e0e95271f4", + "token": { + "decimals": 18, + "symbol": "RICH" + }, + "isSC": {} + }, + "0x695d38eb4e57e0f137e36df7c1f0f2635981246b": { + "name": "MEMEAI token contract", + "address": "0x695d38eb4e57e0f137e36df7c1f0f2635981246b", + "token": { + "decimals": 9, + "symbol": "MEMEAI" + }, + "isSC": {} + }, + "0xafe7131a57e44f832cb2de78ade38cad644aac2f": { + "name": "MAUSDT token contract", + "address": "0xafe7131a57e44f832cb2de78ade38cad644aac2f", + "token": { + "decimals": 18, + "symbol": "MAUSDT" + }, + "isSC": {} + }, + "0xf12ccd17759367cf139776710b47b00c43d1ac2b": { + "name": "EMOJI token contract", + "address": "0xf12ccd17759367cf139776710b47b00c43d1ac2b", + "token": { + "decimals": 9, + "symbol": "EMOJI" + }, + "isSC": {} + }, + "0x0d15009896efe9972f8e086bdd3bcba5c1f74bf3": { + "name": "SONO token contract", + "address": "0x0d15009896efe9972f8e086bdd3bcba5c1f74bf3", + "token": { + "decimals": 8, + "symbol": "SONO" + }, + "isSC": {} + }, + "0x6dde4ffd6db302bc9a46850f61399e082f6c2122": { + "name": "IAI token contract", + "address": "0x6dde4ffd6db302bc9a46850f61399e082f6c2122", + "token": { + "decimals": 18, + "symbol": "IAI" + }, + "isSC": {} + }, + "0xcfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec": { + "name": "VEMP token contract", + "address": "0xcfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec", + "token": { + "decimals": 18, + "symbol": "VEMP" + }, + "isSC": {} + }, + "0xbf52f2ab39e26e0951d2a02b49b7702abe30406a": { + "name": "ODE token contract", + "address": "0xbf52f2ab39e26e0951d2a02b49b7702abe30406a", + "token": { + "decimals": 18, + "symbol": "ODE" + }, + "isSC": {} + }, + "0x8b1f49491477e0fb46a29fef53f1ea320d13c349": { + "name": "AMM token contract", + "address": "0x8b1f49491477e0fb46a29fef53f1ea320d13c349", + "token": { + "decimals": 6, + "symbol": "AMM" + }, + "isSC": {} + }, + "0xec21890967a8ceb3e55a3f79dac4e90673ba3c2e": { + "name": "BEBE token contract", + "address": "0xec21890967a8ceb3e55a3f79dac4e90673ba3c2e", + "token": { + "decimals": 8, + "symbol": "BEBE" + }, + "isSC": {} + }, + "0x8cc0f052fff7ead7f2edcccac895502e884a8a71": { + "name": "ARTH Valuecoin", + "address": "0x8cc0f052fff7ead7f2edcccac895502e884a8a71", + "token": { + "decimals": 18, + "symbol": "ARTH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ARTH.svg" + }, + "0x94e9eb8b5ab9fd6b9ea3169d55ffade62a01702e": { + "name": "BREED token contract", + "address": "0x94e9eb8b5ab9fd6b9ea3169d55ffade62a01702e", + "token": { + "decimals": 18, + "symbol": "BREED" + }, + "isSC": {} + }, + "0x3fd8f39a962efda04956981c31ab89fab5fb8bc8": { + "name": "RTH token contract", + "address": "0x3fd8f39a962efda04956981c31ab89fab5fb8bc8", + "token": { + "decimals": 18, + "symbol": "RTH" + }, + "isSC": {} + }, + "0x5e72ad4bf50c952b11a63b6769d02bb486a9a897": { + "name": "888 token contract", + "address": "0x5e72ad4bf50c952b11a63b6769d02bb486a9a897", + "token": { + "decimals": 18, + "symbol": "888" + }, + "isSC": {} + }, + "0x7c8155909cd385f120a56ef90728dd50f9ccbe52": { + "name": "NII token contract", + "address": "0x7c8155909cd385f120a56ef90728dd50f9ccbe52", + "token": { + "decimals": 15, + "symbol": "NII" + }, + "isSC": {} + }, + "0x5fa54fddf1870c344dbfabb37dfab8700ec0def1": { + "name": "FROGEX token contract", + "address": "0x5fa54fddf1870c344dbfabb37dfab8700ec0def1", + "token": { + "decimals": 9, + "symbol": "FROGEX" + }, + "isSC": {} + }, + "0xe89751b31cd4e2eb7006ce168857f72c8e37bceb": { + "name": "MATH token contract", + "address": "0xe89751b31cd4e2eb7006ce168857f72c8e37bceb", + "token": { + "decimals": 18, + "symbol": "MATH" + }, + "isSC": {} + }, + "0x8cc5aba81a610f4fc01b42c83508ce7a59b8cc10": { + "name": "HDR token contract", + "address": "0x8cc5aba81a610f4fc01b42c83508ce7a59b8cc10", + "token": { + "decimals": 9, + "symbol": "HDR" + }, + "isSC": {} + }, + "0x49849c98ae39fff122806c06791fa73784fb3675": { + "name": "RENBTCCURVE token contract", + "address": "0x49849c98ae39fff122806c06791fa73784fb3675", + "token": { + "decimals": 18, + "symbol": "RENBTCCURVE" + }, + "isSC": {} + }, + "0xabec00542d141bddf58649bfe860c6449807237c": { + "name": "X token contract", + "address": "0xabec00542d141bddf58649bfe860c6449807237c", + "token": { + "decimals": 18, + "symbol": "X" + }, + "isSC": {} + }, + "0x2b8ddaf520f38c23bb638766666c6f6952b2d064": { + "name": "FRIENDX token contract", + "address": "0x2b8ddaf520f38c23bb638766666c6f6952b2d064", + "token": { + "decimals": 18, + "symbol": "FRIENDX" + }, + "isSC": {} + }, + "0xb076bda1abc154ddb4ccd9be45542a823aee290e": { + "name": "FLEX token contract", + "address": "0xb076bda1abc154ddb4ccd9be45542a823aee290e", + "token": { + "decimals": 18, + "symbol": "FLEX" + }, + "isSC": {} + }, + "0xd12443d642d021dc52d0af8f5f6191e02d1e9419": { + "name": "IGNT token contract", + "address": "0xd12443d642d021dc52d0af8f5f6191e02d1e9419", + "token": { + "decimals": 18, + "symbol": "IGNT" + }, + "isSC": {} + }, + "0x1a57367c6194199e5d9aea1ce027431682dfb411": { + "name": "MDF token contract", + "address": "0x1a57367c6194199e5d9aea1ce027431682dfb411", + "token": { + "decimals": 18, + "symbol": "MDF" + }, + "isSC": {} + }, + "0x3850952491606a0e420eb929b1a2e1a450d013f1": { + "name": "PANO token contract", + "address": "0x3850952491606a0e420eb929b1a2e1a450d013f1", + "token": { + "decimals": 18, + "symbol": "PANO" + }, + "isSC": {} + }, + "0x561cf9121e89926c27fa1cfc78dfcc4c422937a4": { + "name": "SQUID token contract", + "address": "0x561cf9121e89926c27fa1cfc78dfcc4c422937a4", + "token": { + "decimals": 18, + "symbol": "SQUID" + }, + "isSC": {} + }, + "0x4be2b2c45b432ba362f198c08094017b61e3bdc6": { + "name": "MSWAP token contract", + "address": "0x4be2b2c45b432ba362f198c08094017b61e3bdc6", + "token": { + "decimals": 18, + "symbol": "MSWAP" + }, + "isSC": {} + }, + "0xb64fde8f199f073f41c132b9ec7ad5b61de0b1b7": { + "name": "PRV token contract", + "address": "0xb64fde8f199f073f41c132b9ec7ad5b61de0b1b7", + "token": { + "decimals": 9, + "symbol": "PRV" + }, + "isSC": {} + }, + "0x2e880962a9609aa3eab4def919fe9e917e99073b": { + "name": "BOSS token contract", + "address": "0x2e880962a9609aa3eab4def919fe9e917e99073b", + "token": { + "decimals": 0, + "symbol": "BOSS" + }, + "isSC": {} + }, + "0x68ddd6812684ff87d483342b69db5a89c2af711b": { + "name": "NOOTNOOT token contract", + "address": "0x68ddd6812684ff87d483342b69db5a89c2af711b", + "token": { + "decimals": 18, + "symbol": "NOOTNOOT" + }, + "isSC": {} + }, + "0x003fe85895030ce120e954b98dc1d96a262a9e89": { + "name": "DEGEN token contract", + "address": "0x003fe85895030ce120e954b98dc1d96a262a9e89", + "token": { + "decimals": 18, + "symbol": "DEGEN" + }, + "isSC": {} + }, + "0x9e78b8274e1d6a76a0dbbf90418894df27cbceb5": { + "name": "UNIFI token contract", + "address": "0x9e78b8274e1d6a76a0dbbf90418894df27cbceb5", + "token": { + "decimals": 18, + "symbol": "UNIFI" + }, + "isSC": {} + }, + "0x873fb544277fd7b977b196a826459a69e27ea4ea": { + "name": "YVRAI token contract", + "address": "0x873fb544277fd7b977b196a826459a69e27ea4ea", + "token": { + "decimals": 18, + "symbol": "YVRAI" + }, + "isSC": {} + }, + "0xc8de43bfe33ff496fa14c270d9cb29bda196b9b5": { + "name": "BIG token contract", + "address": "0xc8de43bfe33ff496fa14c270d9cb29bda196b9b5", + "token": { + "decimals": 18, + "symbol": "BIG" + }, + "isSC": {} + }, + "0x24c19f7101c1731b85f1127eaa0407732e36ecdd": { + "name": "SGTV2 token contract", + "address": "0x24c19f7101c1731b85f1127eaa0407732e36ecdd", + "token": { + "decimals": 18, + "symbol": "SGTV2" + }, + "isSC": {} + }, + "0x9a2af0abb12bee5369b180976be01e8c80d0e7b6": { + "name": "EMPIRE token contract", + "address": "0x9a2af0abb12bee5369b180976be01e8c80d0e7b6", + "token": { + "decimals": 9, + "symbol": "EMPIRE" + }, + "isSC": {} + }, + "0x9863bcc2fb23dfdf5fe275aa4c5575a32a580911": { + "name": "PEPURAI token contract", + "address": "0x9863bcc2fb23dfdf5fe275aa4c5575a32a580911", + "token": { + "decimals": 18, + "symbol": "PEPURAI" + }, + "isSC": {} + }, + "0xcc9ee9483f662091a1de4795249e24ac0ac2630f": { + "name": "ARETH token contract", + "address": "0xcc9ee9483f662091a1de4795249e24ac0ac2630f", + "token": { + "decimals": 18, + "symbol": "ARETH" + }, + "isSC": {} + }, + "0xa4ffdf3208f46898ce063e25c1c43056fa754739": { + "name": "ATH token contract", + "address": "0xa4ffdf3208f46898ce063e25c1c43056fa754739", + "token": { + "decimals": 18, + "symbol": "ATH" + }, + "isSC": {} + }, + "0x7ecbb21346c501fd07eb165e406120fa32381c16": { + "name": "ECOREAL token contract", + "address": "0x7ecbb21346c501fd07eb165e406120fa32381c16", + "token": { + "decimals": 18, + "symbol": "ECOREAL" + }, + "isSC": {} + }, + "0xfcdb9e987f9159dab2f507007d5e3d10c510aa70": { + "name": "0X1 token contract", + "address": "0xfcdb9e987f9159dab2f507007d5e3d10c510aa70", + "token": { + "decimals": 18, + "symbol": "0X1" + }, + "isSC": {} + }, + "0xb4f8ae8d7d29ac74894cd40ecc24e50f6f146ca6": { + "name": "SPOT token contract", + "address": "0xb4f8ae8d7d29ac74894cd40ecc24e50f6f146ca6", + "token": { + "decimals": 9, + "symbol": "SPOT" + }, + "isSC": {} + }, + "0xf257a2783f6633a149b5966e32432b5bb3462c96": { + "name": "DOGECOIN token contract", + "address": "0xf257a2783f6633a149b5966e32432b5bb3462c96", + "token": { + "decimals": 8, + "symbol": "DOGECOIN" + }, + "isSC": {} + }, + "0x6ffcc20d3b4d506870225109edb5a332e6c94529": { + "name": "AGRI token contract", + "address": "0x6ffcc20d3b4d506870225109edb5a332e6c94529", + "token": { + "decimals": 18, + "symbol": "AGRI" + }, + "isSC": {} + }, + "0xb668473944d2e25b6af6d46917eb0233dbac53ae": { + "name": "NTO token contract", + "address": "0xb668473944d2e25b6af6d46917eb0233dbac53ae", + "token": { + "decimals": 18, + "symbol": "NTO" + }, + "isSC": {} + }, + "0x4752613b11dfc4e735c4853692c43542e87f0cc2": { + "name": "GOOFY token contract", + "address": "0x4752613b11dfc4e735c4853692c43542e87f0cc2", + "token": { + "decimals": 9, + "symbol": "GOOFY" + }, + "isSC": {} + }, + "0xc6980fa29a42e44852e29492268d9285d89c9dac": { + "name": "MEGODS token contract", + "address": "0xc6980fa29a42e44852e29492268d9285d89c9dac", + "token": { + "decimals": 18, + "symbol": "MEGODS" + }, + "isSC": {} + }, + "0x3ecab35b64345bfc472477a653e4a3abe70532d9": { + "name": "ENTC token contract", + "address": "0x3ecab35b64345bfc472477a653e4a3abe70532d9", + "token": { + "decimals": 18, + "symbol": "ENTC" + }, + "isSC": {} + }, + "0x00d8318e44780edeefcf3020a5448f636788883c": { + "name": "DAPPX token contract", + "address": "0x00d8318e44780edeefcf3020a5448f636788883c", + "token": { + "decimals": 18, + "symbol": "DAPPX" + }, + "isSC": {} + }, + "0xbe6be64e9e5042b6e84e4c27956cce6353efa5f5": { + "name": "BEG token contract", + "address": "0xbe6be64e9e5042b6e84e4c27956cce6353efa5f5", + "token": { + "decimals": 18, + "symbol": "BEG" + }, + "isSC": {} + }, + "0x77d9046ee15faaceb89439ffdde4be071c2f07bd": { + "name": "JIYUU token contract", + "address": "0x77d9046ee15faaceb89439ffdde4be071c2f07bd", + "token": { + "decimals": 18, + "symbol": "JIYUU" + }, + "isSC": {} + }, + "0x8dc2906de0d7409c3cace9482fbffd566639c593": { + "name": "PEPEINU token contract", + "address": "0x8dc2906de0d7409c3cace9482fbffd566639c593", + "token": { + "decimals": 18, + "symbol": "PEPEINU" + }, + "isSC": {} + }, + "0x1936ae42b59876192a2e263b3807343c448e3c85": { + "name": "EMBR token contract", + "address": "0x1936ae42b59876192a2e263b3807343c448e3c85", + "token": { + "decimals": 18, + "symbol": "EMBR" + }, + "isSC": {} + }, + "0x416cdaf616a82d7dd46e0dbf36e7d6fe412bc40e": { + "name": "LUNA token contract", + "address": "0x416cdaf616a82d7dd46e0dbf36e7d6fe412bc40e", + "token": { + "decimals": 18, + "symbol": "LUNA" + }, + "isSC": {} + }, + "0xc81b0d02393a956234e24564805a896f14ad1250": { + "name": "BPD token contract", + "address": "0xc81b0d02393a956234e24564805a896f14ad1250", + "token": { + "decimals": 9, + "symbol": "BPD" + }, + "isSC": {} + }, + "0xebe4a49df7885d015329c919bf43e6460a858f1e": { + "name": "SHK token contract", + "address": "0xebe4a49df7885d015329c919bf43e6460a858f1e", + "token": { + "decimals": 18, + "symbol": "SHK" + }, + "isSC": {} + }, + "0x01ba67aac7f75f647d94220cc98fb30fcc5105bf": { + "name": "LYRA token contract", + "address": "0x01ba67aac7f75f647d94220cc98fb30fcc5105bf", + "token": { + "decimals": 18, + "symbol": "LYRA" + }, + "isSC": {} + }, + "0x466a756e9a7401b5e2444a3fcb3c2c12fbea0a54": { + "name": "PUSD token contract", + "address": "0x466a756e9a7401b5e2444a3fcb3c2c12fbea0a54", + "token": { + "decimals": 18, + "symbol": "PUSD" + }, + "isSC": {} + }, + "0x4aecc899b68f086c008e920eafdc2a66d88aa7f1": { + "name": "SAFEMARS token contract", + "address": "0x4aecc899b68f086c008e920eafdc2a66d88aa7f1", + "token": { + "decimals": 9, + "symbol": "SAFEMARS" + }, + "isSC": {} + }, + "0x73c6a7491d0db90bdb0060308cde0f49dfd1d0b0": { + "name": "DOBO token contract", + "address": "0x73c6a7491d0db90bdb0060308cde0f49dfd1d0b0", + "token": { + "decimals": 18, + "symbol": "DOBO" + }, + "isSC": {} + }, + "0x6fdb90535c09b82825e38d41edf5e66211d4b442": { + "name": "MAGNET token contract", + "address": "0x6fdb90535c09b82825e38d41edf5e66211d4b442", + "token": { + "decimals": 18, + "symbol": "MAGNET" + }, + "isSC": {} + }, + "0xee9e7bb7e55bbc86414047b61d65c9c0d91ffbd0": { + "name": "FT token contract", + "address": "0xee9e7bb7e55bbc86414047b61d65c9c0d91ffbd0", + "token": { + "decimals": 18, + "symbol": "FT" + }, + "isSC": {} + }, + "0x593114f03a0a575aece9ed675e52ed68d2172b8c": { + "name": "BDP token contract", + "address": "0x593114f03a0a575aece9ed675e52ed68d2172b8c", + "token": { + "decimals": 18, + "symbol": "BDP" + }, + "isSC": {} + }, + "0xe785ec36356b973d8c0a071d478940d6f42c0178": { + "name": "BIGF token contract", + "address": "0xe785ec36356b973d8c0a071d478940d6f42c0178", + "token": { + "decimals": 8, + "symbol": "BIGF" + }, + "isSC": {} + }, + "0xd6327ce1fb9d6020e8c2c0e124a1ec23dcab7536": { + "name": "CUMINU token contract", + "address": "0xd6327ce1fb9d6020e8c2c0e124a1ec23dcab7536", + "token": { + "decimals": 18, + "symbol": "CUMINU" + }, + "isSC": {} + }, + "0x95640a134721475bc78594c8ea66c0182c7b9a50": { + "name": "MXH token contract", + "address": "0x95640a134721475bc78594c8ea66c0182c7b9a50", + "token": { + "decimals": 9, + "symbol": "MXH" + }, + "isSC": {} + }, + "0xd4ae236a5080a09c0f7bd6e6b84919523573a43b": { + "name": "FUTURE token contract", + "address": "0xd4ae236a5080a09c0f7bd6e6b84919523573a43b", + "token": { + "decimals": 18, + "symbol": "FUTURE" + }, + "isSC": {} + }, + "0x12970e6868f88f6557b76120662c1b3e50a646bf": { + "name": "LADYS token contract", + "address": "0x12970e6868f88f6557b76120662c1b3e50a646bf", + "token": { + "decimals": 18, + "symbol": "LADYS" + }, + "isSC": {} + }, + "0x9c05d54645306d4c4ead6f75846000e1554c0360": { + "name": "21ADA token contract", + "address": "0x9c05d54645306d4c4ead6f75846000e1554c0360", + "token": { + "decimals": 6, + "symbol": "21ADA" + }, + "isSC": {} + }, + "0x15e5d3deff5c3a13adca4f313ff44735881ebd6c": { + "name": "MAC token contract", + "address": "0x15e5d3deff5c3a13adca4f313ff44735881ebd6c", + "token": { + "decimals": 18, + "symbol": "MAC" + }, + "isSC": {} + }, + "0x4a615bb7166210cce20e6642a6f8fb5d4d044496": { + "name": "NAOS Finance", + "address": "0x4a615bb7166210cce20e6642a6f8fb5d4d044496", + "token": { + "decimals": 18, + "symbol": "NAOS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/naos.svg" + }, + "0x94dd57da120c7c564d9aa438773068705e828781": { + "name": "JRNY token contract", + "address": "0x94dd57da120c7c564d9aa438773068705e828781", + "token": { + "decimals": 18, + "symbol": "JRNY" + }, + "isSC": {} + }, + "0xd909c5862cdb164adb949d92622082f0092efc3d": { + "name": "IPT token contract", + "address": "0xd909c5862cdb164adb949d92622082f0092efc3d", + "token": { + "decimals": 18, + "symbol": "IPT" + }, + "isSC": {} + }, + "0x4208aa4d7a9a10f4f8bb7f6400c1b2161d946969": { + "name": "DONG token contract", + "address": "0x4208aa4d7a9a10f4f8bb7f6400c1b2161d946969", + "token": { + "decimals": 18, + "symbol": "DONG" + }, + "isSC": {} + }, + "0xed0d5747a9ab03a75fbfec3228cd55848245b75d": { + "name": "NGM token contract", + "address": "0xed0d5747a9ab03a75fbfec3228cd55848245b75d", + "token": { + "decimals": 6, + "symbol": "NGM" + }, + "isSC": {} + }, + "0xcd6adc6b8bd396e2d53ccd7d7257b4de55be4fbe": { + "name": "CFL365 token contract", + "address": "0xcd6adc6b8bd396e2d53ccd7d7257b4de55be4fbe", + "token": { + "decimals": 18, + "symbol": "CFL365" + }, + "isSC": {} + }, + "0x4d67edef87a5ff910954899f4e5a0aaf107afd42": { + "name": "BLUESPARROW token contract", + "address": "0x4d67edef87a5ff910954899f4e5a0aaf107afd42", + "token": { + "decimals": 9, + "symbol": "BLUESPARROW" + }, + "isSC": {} + }, + "0x8d610e20481f4c4f3acb87bba9c46bef7795fdfe": { + "name": "UNT token contract", + "address": "0x8d610e20481f4c4f3acb87bba9c46bef7795fdfe", + "token": { + "decimals": 18, + "symbol": "UNT" + }, + "isSC": {} + }, + "0x41545f8b9472d758bb669ed8eaeeecd7a9c4ec29": { + "name": "FORT token contract", + "address": "0x41545f8b9472d758bb669ed8eaeeecd7a9c4ec29", + "token": { + "decimals": 18, + "symbol": "FORT" + }, + "isSC": {} + }, + "0xe7ac8545e34771de3706598abb3db9a19af2a07f": { + "name": "MONKED token contract", + "address": "0xe7ac8545e34771de3706598abb3db9a19af2a07f", + "token": { + "decimals": 8, + "symbol": "MONKED" + }, + "isSC": {} + }, + "0xbc5991ccd8caceba01edc44c2bb9832712c29cab": { + "name": "UUSDC token contract", + "address": "0xbc5991ccd8caceba01edc44c2bb9832712c29cab", + "token": { + "decimals": 6, + "symbol": "UUSDC" + }, + "isSC": {} + }, + "0xe153f65ddaf4f2234bd56f51f546d4b493acb091": { + "name": "ZEUS token contract", + "address": "0xe153f65ddaf4f2234bd56f51f546d4b493acb091", + "token": { + "decimals": 18, + "symbol": "ZEUS" + }, + "isSC": {} + }, + "0x0f1e49d6dcfc9eefcce9d5ae3c660f8ead75061a": { + "name": "VNLNK token contract", + "address": "0x0f1e49d6dcfc9eefcce9d5ae3c660f8ead75061a", + "token": { + "decimals": 9, + "symbol": "VNLNK" + }, + "isSC": {} + }, + "0x3505f494c3f0fed0b594e01fa41dd3967645ca39": { + "name": "SWARM", + "address": "0x3505f494c3f0fed0b594e01fa41dd3967645ca39", + "token": { + "decimals": 18, + "symbol": "SWM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/swarm.svg" + }, + "0x69ed89ecd35082e031fe52b75123f801db083306": { + "name": "KAERI token contract", + "address": "0x69ed89ecd35082e031fe52b75123f801db083306", + "token": { + "decimals": 9, + "symbol": "KAERI" + }, + "isSC": {} + }, + "0x0dcee5f694e492f0dd842a7fbe5bed4c6e4665a6": { + "name": "CATBOY token contract", + "address": "0x0dcee5f694e492f0dd842a7fbe5bed4c6e4665a6", + "token": { + "decimals": 18, + "symbol": "CATBOY" + }, + "isSC": {} + }, + "0xb3e6ee8d2c586fa03ab70aef96b8ae6d12d64ec7": { + "name": "HIFIDENZA token contract", + "address": "0xb3e6ee8d2c586fa03ab70aef96b8ae6d12d64ec7", + "token": { + "decimals": 18, + "symbol": "HIFIDENZA" + }, + "isSC": {} + }, + "0x5d0ebc4ec5ac18d30512fb6287886245061b3dbd": { + "name": "GATSBY token contract", + "address": "0x5d0ebc4ec5ac18d30512fb6287886245061b3dbd", + "token": { + "decimals": 9, + "symbol": "GATSBY" + }, + "isSC": {} + }, + "0xc25a3a3b969415c80451098fa907ec722572917f": { + "name": "SCURVE token contract", + "address": "0xc25a3a3b969415c80451098fa907ec722572917f", + "token": { + "decimals": 18, + "symbol": "SCURVE" + }, + "isSC": {} + }, + "0x42b91f1d05afea671a2da3c780eda2abf0a2a366": { + "name": "MNB token contract", + "address": "0x42b91f1d05afea671a2da3c780eda2abf0a2a366", + "token": { + "decimals": 18, + "symbol": "MNB" + }, + "isSC": {} + }, + "0x74e5e53056526b2609d82e85486005ef2a2db001": { + "name": "TRUMATIC-MATIC token contract", + "address": "0x74e5e53056526b2609d82e85486005ef2a2db001", + "token": { + "decimals": 18, + "symbol": "TRUMATIC-MATIC" + }, + "isSC": {} + }, + "0x00c5ca160a968f47e7272a0cfcda36428f386cb6": { + "name": "USDEBT token contract", + "address": "0x00c5ca160a968f47e7272a0cfcda36428f386cb6", + "token": { + "decimals": 18, + "symbol": "USDEBT" + }, + "isSC": {} + }, + "0x4727a02269943b225a7de9ef28496f36d454b983": { + "name": "FBT token contract", + "address": "0x4727a02269943b225a7de9ef28496f36d454b983", + "token": { + "decimals": 18, + "symbol": "FBT" + }, + "isSC": {} + }, + "0x52498f8d9791736f1d6398fe95ba3bd868114d10": { + "name": "NETVR token contract", + "address": "0x52498f8d9791736f1d6398fe95ba3bd868114d10", + "token": { + "decimals": 18, + "symbol": "NETVR" + }, + "isSC": {} + }, + "0xbbff34e47e559ef680067a6b1c980639eeb64d24": { + "name": "L2 token contract", + "address": "0xbbff34e47e559ef680067a6b1c980639eeb64d24", + "token": { + "decimals": 18, + "symbol": "L2" + }, + "isSC": {} + }, + "0xce9de5365739b1bed5c8546867aee4209fbb8538": { + "name": "THUG token contract", + "address": "0xce9de5365739b1bed5c8546867aee4209fbb8538", + "token": { + "decimals": 18, + "symbol": "THUG" + }, + "isSC": {} + }, + "0x7409856cae628f5d578b285b45669b36e7005283": { + "name": "JGBP token contract", + "address": "0x7409856cae628f5d578b285b45669b36e7005283", + "token": { + "decimals": 18, + "symbol": "JGBP" + }, + "isSC": {} + }, + "0x247dc9cbbaadabce6e30e2a84ec6c53a419913ad": { + "name": "EMS token contract", + "address": "0x247dc9cbbaadabce6e30e2a84ec6c53a419913ad", + "token": { + "decimals": 18, + "symbol": "EMS" + }, + "isSC": {} + }, + "0x40986a85b4cfcdb054a6cbfb1210194fee51af88": { + "name": "UFARM token contract", + "address": "0x40986a85b4cfcdb054a6cbfb1210194fee51af88", + "token": { + "decimals": 18, + "symbol": "UFARM" + }, + "isSC": {} + }, + "0xc57f1d079c862b70aa12faab19293f827187aaf6": { + "name": "GLG token contract", + "address": "0xc57f1d079c862b70aa12faab19293f827187aaf6", + "token": { + "decimals": 18, + "symbol": "GLG" + }, + "isSC": {} + }, + "0xf406f7a9046793267bc276908778b29563323996": { + "name": "VISION token contract", + "address": "0xf406f7a9046793267bc276908778b29563323996", + "token": { + "decimals": 18, + "symbol": "VISION" + }, + "isSC": {} + }, + "0xc0b68eb52c89e3fffa62d78012ac8b661bfaa323": { + "name": "VIX token contract", + "address": "0xc0b68eb52c89e3fffa62d78012ac8b661bfaa323", + "token": { + "decimals": 18, + "symbol": "VIX" + }, + "isSC": {} + }, + "0xc8020985a6b30773d866cbef65a7a11f96773413": { + "name": "ENVI token contract", + "address": "0xc8020985a6b30773d866cbef65a7a11f96773413", + "token": { + "decimals": 18, + "symbol": "ENVI" + }, + "isSC": {} + }, + "0xc07a150ecadf2cc352f5586396e344a6b17625eb": { + "name": "BIOT token contract", + "address": "0xc07a150ecadf2cc352f5586396e344a6b17625eb", + "token": { + "decimals": 9, + "symbol": "BIOT" + }, + "isSC": {} + }, + "0xa4cf2afd3b165975afffbf7e487cdd40c894ab6b": { + "name": "SHIBAKEN token contract", + "address": "0xa4cf2afd3b165975afffbf7e487cdd40c894ab6b", + "token": { + "decimals": 0, + "symbol": "SHIBAKEN" + }, + "isSC": {} + }, + "0xe221db71c5c527149bdf56c4d13a54cf55e543c1": { + "name": "VIDS token contract", + "address": "0xe221db71c5c527149bdf56c4d13a54cf55e543c1", + "token": { + "decimals": 0, + "symbol": "VIDS" + }, + "isSC": {} + }, + "0xa9e201a4e269d6cd5e9f0fcbcb78520cf815878b": { + "name": "AAMMUNIRENWETH token contract", + "address": "0xa9e201a4e269d6cd5e9f0fcbcb78520cf815878b", + "token": { + "decimals": 18, + "symbol": "AAMMUNIRENWETH" + }, + "isSC": {} + }, + "0x2a304fda5a85182dca1d03741bb2f07881b9e095": { + "name": "DCO token contract", + "address": "0x2a304fda5a85182dca1d03741bb2f07881b9e095", + "token": { + "decimals": 8, + "symbol": "DCO" + }, + "isSC": {} + }, + "0x6a4c76874e686a7d080d173987a35a9c48905583": { + "name": "LPNT token contract", + "address": "0x6a4c76874e686a7d080d173987a35a9c48905583", + "token": { + "decimals": 18, + "symbol": "LPNT" + }, + "isSC": {} + }, + "0x5dd57da40e6866c9fcc34f4b6ddc89f1ba740dfe": { + "name": "BRIGHT token contract", + "address": "0x5dd57da40e6866c9fcc34f4b6ddc89f1ba740dfe", + "token": { + "decimals": 18, + "symbol": "BRIGHT" + }, + "isSC": {} + }, + "0x5026f006b85729a8b14553fae6af249ad16c9aab": { + "name": "WOJAK token contract", + "address": "0x5026f006b85729a8b14553fae6af249ad16c9aab", + "token": { + "decimals": 18, + "symbol": "WOJAK" + }, + "isSC": {} + }, + "0x5394794be8b6ed5572fcd6b27103f46b5f390e8f": { + "name": "AAMMUNIYFIWETH token contract", + "address": "0x5394794be8b6ed5572fcd6b27103f46b5f390e8f", + "token": { + "decimals": 18, + "symbol": "AAMMUNIYFIWETH" + }, + "isSC": {} + }, + "0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429": { + "name": "Golem Network Token", + "address": "0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429", + "token": { + "decimals": 18, + "symbol": "GLM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/glm.svg" + }, + "0x76306f029f8f99effe509534037ba7030999e3cf": { + "name": "ACR token contract", + "address": "0x76306f029f8f99effe509534037ba7030999e3cf", + "token": { + "decimals": 18, + "symbol": "ACR" + }, + "isSC": {} + }, + "0x445bd590a01fe6709d4f13a8f579c1e4846921db": { + "name": "DUMMY token contract", + "address": "0x445bd590a01fe6709d4f13a8f579c1e4846921db", + "token": { + "decimals": 18, + "symbol": "DUMMY" + }, + "isSC": {} + }, + "0x6d8f7ac13e8c2944d27e0f9bc6aa0122f2ec1384": { + "name": "SUPER token contract", + "address": "0x6d8f7ac13e8c2944d27e0f9bc6aa0122f2ec1384", + "token": { + "decimals": 18, + "symbol": "SUPER" + }, + "isSC": {} + }, + "0xaf91e8afbe87642dc628786188a54b78580a4d76": { + "name": "FOY token contract", + "address": "0xaf91e8afbe87642dc628786188a54b78580a4d76", + "token": { + "decimals": 18, + "symbol": "FOY" + }, + "isSC": {} + }, + "0x249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b": { + "name": "UFO token contract", + "address": "0x249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b", + "token": { + "decimals": 18, + "symbol": "UFO" + }, + "isSC": {} + }, + "0xd37ee7e4f452c6638c96536e68090de8cbcdb583": { + "name": "Aave GUSD", + "address": "0xd37ee7e4f452c6638c96536e68090de8cbcdb583", + "token": { + "decimals": 2, + "symbol": "aGUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aGUSD.svg" + }, + "0x207e14389183a94343942de7afbc607f57460618": { + "name": "THOL token contract", + "address": "0x207e14389183a94343942de7afbc607f57460618", + "token": { + "decimals": 18, + "symbol": "THOL" + }, + "isSC": {} + }, + "0x9532ca064278ce3ba4fcc66cebec6d9f04f58f70": { + "name": "BOTC token contract", + "address": "0x9532ca064278ce3ba4fcc66cebec6d9f04f58f70", + "token": { + "decimals": 9, + "symbol": "BOTC" + }, + "isSC": {} + }, + "0x7321a13bbf58220bca94a605eff3e24daee86376": { + "name": "HOOD token contract", + "address": "0x7321a13bbf58220bca94a605eff3e24daee86376", + "token": { + "decimals": 18, + "symbol": "HOOD" + }, + "isSC": {} + }, + "0xcd54df3c19a7ae672897f2a09821d2c287d36326": { + "name": "BABYMEME token contract", + "address": "0xcd54df3c19a7ae672897f2a09821d2c287d36326", + "token": { + "decimals": 9, + "symbol": "BABYMEME" + }, + "isSC": {} + }, + "0x1236ea13c7339287cd00ab196aaa8217006b04dc": { + "name": "EPL token contract", + "address": "0x1236ea13c7339287cd00ab196aaa8217006b04dc", + "token": { + "decimals": 18, + "symbol": "EPL" + }, + "isSC": {} + }, + "0x6ad9a31f02f1e790ff85584ea3c3d0001e45cd64": { + "name": "C2H6 token contract", + "address": "0x6ad9a31f02f1e790ff85584ea3c3d0001e45cd64", + "token": { + "decimals": 9, + "symbol": "C2H6" + }, + "isSC": {} + }, + "0x328a268b191ef593b72498a9e8a481c086eb21be": { + "name": "MZERO token contract", + "address": "0x328a268b191ef593b72498a9e8a481c086eb21be", + "token": { + "decimals": 18, + "symbol": "MZERO" + }, + "isSC": {} + }, + "0x60be1e1fe41c1370adaf5d8e66f07cf1c2df2268": { + "name": "Perion Credits", + "address": "0x60be1e1fe41c1370adaf5d8e66f07cf1c2df2268", + "token": { + "decimals": 18, + "symbol": "PERC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/perc.svg" + }, + "0x75ecb52e403c617679fbd3e77a50f9d10a842387": { + "name": "CSR token contract", + "address": "0x75ecb52e403c617679fbd3e77a50f9d10a842387", + "token": { + "decimals": 18, + "symbol": "CSR" + }, + "isSC": {} + }, + "0x55c08ca52497e2f1534b59e2917bf524d4765257": { + "name": "UWU token contract", + "address": "0x55c08ca52497e2f1534b59e2917bf524d4765257", + "token": { + "decimals": 18, + "symbol": "UWU" + }, + "isSC": {} + }, + "0x9839675308f4a83e45f4b0c89b8fa264d68b7812": { + "name": "CIPHER token contract", + "address": "0x9839675308f4a83e45f4b0c89b8fa264d68b7812", + "token": { + "decimals": 18, + "symbol": "CIPHER" + }, + "isSC": {} + }, + "0xa946fb6b6b860c68df3c293f1e2c3881b243e08c": { + "name": "DRAGON token contract", + "address": "0xa946fb6b6b860c68df3c293f1e2c3881b243e08c", + "token": { + "decimals": 18, + "symbol": "DRAGON" + }, + "isSC": {} + }, + "0xb18f98822c22492bd6b77d19cae9367f3d60fcbf": { + "name": "STEALTH token contract", + "address": "0xb18f98822c22492bd6b77d19cae9367f3d60fcbf", + "token": { + "decimals": 8, + "symbol": "STEALTH" + }, + "isSC": {} + }, + "0xa2120b9e674d3fc3875f415a7df52e382f141225": { + "name": "ATA token contract", + "address": "0xa2120b9e674d3fc3875f415a7df52e382f141225", + "token": { + "decimals": 18, + "symbol": "ATA" + }, + "isSC": {} + }, + "0x5c0217e4e126d501896594bec409898a9afc5970": { + "name": "FRENS token contract", + "address": "0x5c0217e4e126d501896594bec409898a9afc5970", + "token": { + "decimals": 18, + "symbol": "FRENS" + }, + "isSC": {} + }, + "0x2fe39f22eac6d3c1c86dd9d143640ebb94609fce": { + "name": "JDC token contract", + "address": "0x2fe39f22eac6d3c1c86dd9d143640ebb94609fce", + "token": { + "decimals": 18, + "symbol": "JDC" + }, + "isSC": {} + }, + "0xf79c694605f29ddf3f0eb41319c38672ab6fa89f": { + "name": "MACKS token contract", + "address": "0xf79c694605f29ddf3f0eb41319c38672ab6fa89f", + "token": { + "decimals": 18, + "symbol": "MACKS" + }, + "isSC": {} + }, + "0x55c5bd14ec3b3e24fd8c5e8b8eb9a52e876e5a06": { + "name": "NITRO token contract", + "address": "0x55c5bd14ec3b3e24fd8c5e8b8eb9a52e876e5a06", + "token": { + "decimals": 18, + "symbol": "NITRO" + }, + "isSC": {} + }, + "0xa685a61171bb30d4072b338c80cb7b2c865c873e": { + "name": "Aave MANA", + "address": "0xa685a61171bb30d4072b338c80cb7b2c865c873e", + "token": { + "decimals": 18, + "symbol": "aMANA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aMANA.svg" + }, + "0x024b6e7dc26f4d5579bdd936f8d7bc31f2339999": { + "name": "MIS token contract", + "address": "0x024b6e7dc26f4d5579bdd936f8d7bc31f2339999", + "token": { + "decimals": 18, + "symbol": "MIS" + }, + "isSC": {} + }, + "0xf434908dcf8206691bb99cae9232d4833ec257d4": { + "name": "JACK token contract", + "address": "0xf434908dcf8206691bb99cae9232d4833ec257d4", + "token": { + "decimals": 18, + "symbol": "JACK" + }, + "isSC": {} + }, + "0x809826cceab68c387726af962713b64cb5cb3cca": { + "name": "NCASH token contract", + "address": "0x809826cceab68c387726af962713b64cb5cb3cca", + "token": { + "decimals": 18, + "symbol": "NCASH" + }, + "isSC": {} + }, + "0x6aeb95f06cda84ca345c2de0f3b7f96923a44f4c": { + "name": "BERRY token contract", + "address": "0x6aeb95f06cda84ca345c2de0f3b7f96923a44f4c", + "token": { + "decimals": 14, + "symbol": "BERRY" + }, + "isSC": {} + }, + "0xd38b5bf25976378b7c33d39f508119545ab90535": { + "name": "CRAZYPEPE token contract", + "address": "0xd38b5bf25976378b7c33d39f508119545ab90535", + "token": { + "decimals": 18, + "symbol": "CRAZYPEPE" + }, + "isSC": {} + }, + "0xcfc5bd99915aaa815401c5a41a927ab7a38d29cf": { + "name": "THUSD token contract", + "address": "0xcfc5bd99915aaa815401c5a41a927ab7a38d29cf", + "token": { + "decimals": 18, + "symbol": "THUSD" + }, + "isSC": {} + }, + "0x22fc5a29bd3d6cce19a06f844019fd506fce4455": { + "name": "EPENDLE token contract", + "address": "0x22fc5a29bd3d6cce19a06f844019fd506fce4455", + "token": { + "decimals": 18, + "symbol": "EPENDLE" + }, + "isSC": {} + }, + "0xd3843c6be03520f45871874375d618b3c7923019": { + "name": "ORDIBRIDGE token contract", + "address": "0xd3843c6be03520f45871874375d618b3c7923019", + "token": { + "decimals": 9, + "symbol": "ORDIBRIDGE" + }, + "isSC": {} + }, + "0x2c056f9402a0627bc0e580365bb12979fc011e2c": { + "name": "SQUID2 token contract", + "address": "0x2c056f9402a0627bc0e580365bb12979fc011e2c", + "token": { + "decimals": 18, + "symbol": "SQUID2" + }, + "isSC": {} + }, + "0x83e817e1574e2201a005ec0f7e700ed5606f555e": { + "name": "MPENDLE token contract", + "address": "0x83e817e1574e2201a005ec0f7e700ed5606f555e", + "token": { + "decimals": 18, + "symbol": "MPENDLE" + }, + "isSC": {} + }, + "0x42f1ffeabd9551aec26d70257c8a4d4c31b72180": { + "name": "U0N1 token contract", + "address": "0x42f1ffeabd9551aec26d70257c8a4d4c31b72180", + "token": { + "decimals": 18, + "symbol": "U0N1" + }, + "isSC": {} + }, + "0xe38149abc673a117abeb8af7d1ff3d0d1aa5af15": { + "name": "RCBETH token contract", + "address": "0xe38149abc673a117abeb8af7d1ff3d0d1aa5af15", + "token": { + "decimals": 18, + "symbol": "RCBETH" + }, + "isSC": {} + }, + "0x2001f2a0cf801ecfda622f6c28fb6e10d803d969": { + "name": "CLT token contract", + "address": "0x2001f2a0cf801ecfda622f6c28fb6e10d803d969", + "token": { + "decimals": 8, + "symbol": "CLT" + }, + "isSC": {} + }, + "0x56c9d5f1e727de03643af220b5ce52de23d4d973": { + "name": "DBOX token contract", + "address": "0x56c9d5f1e727de03643af220b5ce52de23d4d973", + "token": { + "decimals": 18, + "symbol": "DBOX" + }, + "isSC": {} + }, + "0xf1b4cb8ab3146edd856ed696c199a9a647178854": { + "name": "SPIDERCAT token contract", + "address": "0xf1b4cb8ab3146edd856ed696c199a9a647178854", + "token": { + "decimals": 8, + "symbol": "SPIDERCAT" + }, + "isSC": {} + }, + "0xf36c5f04127f7470834ed6f98bddc1be62aba48d": { + "name": "CAI token contract", + "address": "0xf36c5f04127f7470834ed6f98bddc1be62aba48d", + "token": { + "decimals": 18, + "symbol": "CAI" + }, + "isSC": {} + }, + "0x99295f1141d58a99e939f7be6bbe734916a875b8": { + "name": "LPL token contract", + "address": "0x99295f1141d58a99e939f7be6bbe734916a875b8", + "token": { + "decimals": 18, + "symbol": "LPL" + }, + "isSC": {} + }, + "0x1b54a6fa1360bd71a0f28f77a1d6fba215d498c3": { + "name": "CASINU token contract", + "address": "0x1b54a6fa1360bd71a0f28f77a1d6fba215d498c3", + "token": { + "decimals": 9, + "symbol": "CASINU" + }, + "isSC": {} + }, + "0x96add417293a49e80f024734e96cfd8b355bcc14": { + "name": "LILA token contract", + "address": "0x96add417293a49e80f024734e96cfd8b355bcc14", + "token": { + "decimals": 18, + "symbol": "LILA" + }, + "isSC": {} + }, + "0x45f93404ae1e4f0411a7f42bc6a5dc395792738d": { + "name": "DGEN token contract", + "address": "0x45f93404ae1e4f0411a7f42bc6a5dc395792738d", + "token": { + "decimals": 18, + "symbol": "DGEN" + }, + "isSC": {} + }, + "0x4d953cf077c0c95ba090226e59a18fcf97db44ec": { + "name": "MINI token contract", + "address": "0x4d953cf077c0c95ba090226e59a18fcf97db44ec", + "token": { + "decimals": 18, + "symbol": "MINI" + }, + "isSC": {} + }, + "0x556d4f40982cb95e0714989e0c229c42be8b1499": { + "name": "GLTM token contract", + "address": "0x556d4f40982cb95e0714989e0c229c42be8b1499", + "token": { + "decimals": 18, + "symbol": "GLTM" + }, + "isSC": {} + }, + "0x4be10da47a07716af28ad199fbe020501bddd7af": { + "name": "XT token contract", + "address": "0x4be10da47a07716af28ad199fbe020501bddd7af", + "token": { + "decimals": 18, + "symbol": "XT" + }, + "isSC": {} + }, + "0xf29ae508698bdef169b89834f76704c3b205aedf": { + "name": "YVSNX token contract", + "address": "0xf29ae508698bdef169b89834f76704c3b205aedf", + "token": { + "decimals": 18, + "symbol": "YVSNX" + }, + "isSC": {} + }, + "0x5d74468b69073f809d4fae90afec439e69bf6263": { + "name": "CSETH token contract", + "address": "0x5d74468b69073f809d4fae90afec439e69bf6263", + "token": { + "decimals": 18, + "symbol": "CSETH" + }, + "isSC": {} + }, + "0x807534b396919783b7e30383fe57d857bc084338": { + "name": "TEST token contract", + "address": "0x807534b396919783b7e30383fe57d857bc084338", + "token": { + "decimals": 18, + "symbol": "TEST" + }, + "isSC": {} + }, + "0x21ead867c8c5181854f6f8ce71f75b173d2bc16a": { + "name": "ETHX token contract", + "address": "0x21ead867c8c5181854f6f8ce71f75b173d2bc16a", + "token": { + "decimals": 18, + "symbol": "ETHX" + }, + "isSC": {} + }, + "0x7a3f7f6675514d4d611b442a4b76752f6ab77670": { + "name": "TORA token contract", + "address": "0x7a3f7f6675514d4d611b442a4b76752f6ab77670", + "token": { + "decimals": 18, + "symbol": "TORA" + }, + "isSC": {} + }, + "0xde342a3e269056fc3305f9e315f4c40d917ba521": { + "name": "BYTE token contract", + "address": "0xde342a3e269056fc3305f9e315f4c40d917ba521", + "token": { + "decimals": 9, + "symbol": "BYTE" + }, + "isSC": {} + }, + "0x65f9a292f1aeed5d755aa2fd2fb17ab2e9431447": { + "name": "SOMEE token contract", + "address": "0x65f9a292f1aeed5d755aa2fd2fb17ab2e9431447", + "token": { + "decimals": 18, + "symbol": "SOMEE" + }, + "isSC": {} + }, + "0x0cdbbc7fe1c8da0cc41ba96d7edb4cce5982f23f": { + "name": "ULS token contract", + "address": "0x0cdbbc7fe1c8da0cc41ba96d7edb4cce5982f23f", + "token": { + "decimals": 18, + "symbol": "ULS" + }, + "isSC": {} + }, + "0xe0a6136f866684c0f19936c0c42a8c181c066f1b": { + "name": "TIDE token contract", + "address": "0xe0a6136f866684c0f19936c0c42a8c181c066f1b", + "token": { + "decimals": 18, + "symbol": "TIDE" + }, + "isSC": {} + }, + "0xdd50c053c096cb04a3e3362e2b622529ec5f2e8a": { + "name": "TBILL token contract", + "address": "0xdd50c053c096cb04a3e3362e2b622529ec5f2e8a", + "token": { + "decimals": 6, + "symbol": "TBILL" + }, + "isSC": {} + }, + "0xb435a47ecea7f5366b2520e45b9bed7e01d2ffae": { + "name": "NEMS token contract", + "address": "0xb435a47ecea7f5366b2520e45b9bed7e01d2ffae", + "token": { + "decimals": 18, + "symbol": "NEMS" + }, + "isSC": {} + }, + "0x0eb1e72204c42de2263d37db606fb25c21d649b8": { + "name": "ASTROX token contract", + "address": "0x0eb1e72204c42de2263d37db606fb25c21d649b8", + "token": { + "decimals": 9, + "symbol": "ASTROX" + }, + "isSC": {} + }, + "0x83031984b45553070a088273f341bff7fb4f2f46": { + "name": "HIBAYC token contract", + "address": "0x83031984b45553070a088273f341bff7fb4f2f46", + "token": { + "decimals": 18, + "symbol": "HIBAYC" + }, + "isSC": {} + }, + "0xbd1848e1491d4308ad18287a745dd4db2a4bd55b": { + "name": "MOMA token contract", + "address": "0xbd1848e1491d4308ad18287a745dd4db2a4bd55b", + "token": { + "decimals": 18, + "symbol": "MOMA" + }, + "isSC": {} + }, + "0x955d5c14c8d4944da1ea7836bd44d54a8ec35ba1": { + "name": "RFD token contract", + "address": "0x955d5c14c8d4944da1ea7836bd44d54a8ec35ba1", + "token": { + "decimals": 18, + "symbol": "RFD" + }, + "isSC": {} + }, + "0x46b2deae6eff3011008ea27ea36b7c27255ddfa9": { + "name": "WETHDYDX token contract", + "address": "0x46b2deae6eff3011008ea27ea36b7c27255ddfa9", + "token": { + "decimals": 18, + "symbol": "WETHDYDX" + }, + "isSC": {} + }, + "0x0ab39ac604f992aaec3c36de337c3cd3917a7d26": { + "name": "KVERSE token contract", + "address": "0x0ab39ac604f992aaec3c36de337c3cd3917a7d26", + "token": { + "decimals": 18, + "symbol": "KVERSE" + }, + "isSC": {} + }, + "0xd3131fb503e9a20261402aec98caf0603cb913f5": { + "name": "CALIC token contract", + "address": "0xd3131fb503e9a20261402aec98caf0603cb913f5", + "token": { + "decimals": 18, + "symbol": "CALIC" + }, + "isSC": {} + }, + "0x8c81121b15197fa0eeaee1dc75533419dcfd3151": { + "name": "IDLEWBTCYIELD token contract", + "address": "0x8c81121b15197fa0eeaee1dc75533419dcfd3151", + "token": { + "decimals": 18, + "symbol": "IDLEWBTCYIELD" + }, + "isSC": {} + }, + "0x3442fbf264b6d723e01775a710850dcef6e6847c": { + "name": "VNN token contract", + "address": "0x3442fbf264b6d723e01775a710850dcef6e6847c", + "token": { + "decimals": 18, + "symbol": "VNN" + }, + "isSC": {} + }, + "0x7df571694b35ef60e9b6651967486c8017491f9b": { + "name": "DOGE-1 token contract", + "address": "0x7df571694b35ef60e9b6651967486c8017491f9b", + "token": { + "decimals": 18, + "symbol": "DOGE-1" + }, + "isSC": {} + }, + "0xf34842d05a1c888ca02769a633df37177415c2f8": { + "name": "IDLEUSDTYIELD token contract", + "address": "0xf34842d05a1c888ca02769a633df37177415c2f8", + "token": { + "decimals": 18, + "symbol": "IDLEUSDTYIELD" + }, + "isSC": {} + }, + "0x60f5672a271c7e39e787427a18353ba59a4a3578": { + "name": "PIKA token contract", + "address": "0x60f5672a271c7e39e787427a18353ba59a4a3578", + "token": { + "decimals": 18, + "symbol": "PIKA" + }, + "isSC": {} + }, + "0x3d26dcd840fcc8e4b2193ace8a092e4a65832f9f": { + "name": "AAMMUNIUNIWETH token contract", + "address": "0x3d26dcd840fcc8e4b2193ace8a092e4a65832f9f", + "token": { + "decimals": 18, + "symbol": "AAMMUNIUNIWETH" + }, + "isSC": {} + }, + "0x0e8d2eb7d6bdf28393c25a1966385ad32ff0259a": { + "name": "STREAMERINU token contract", + "address": "0x0e8d2eb7d6bdf28393c25a1966385ad32ff0259a", + "token": { + "decimals": 18, + "symbol": "STREAMERINU" + }, + "isSC": {} + }, + "0xfe459828c90c0ba4bc8b42f5c5d44f316700b430": { + "name": "BBS token contract", + "address": "0xfe459828c90c0ba4bc8b42f5c5d44f316700b430", + "token": { + "decimals": 18, + "symbol": "BBS" + }, + "isSC": {} + }, + "0x2c10c0de3362ff21f8ed6bc7f4ac5e391153fd2c": { + "name": "VIZ token contract", + "address": "0x2c10c0de3362ff21f8ed6bc7f4ac5e391153fd2c", + "token": { + "decimals": 18, + "symbol": "VIZ" + }, + "isSC": {} + }, + "0xabd601423a2cd5723cb546acc5c40fb01c3422cf": { + "name": "BABYX token contract", + "address": "0xabd601423a2cd5723cb546acc5c40fb01c3422cf", + "token": { + "decimals": 9, + "symbol": "BABYX" + }, + "isSC": {} + }, + "0x6d4ca1177087924edfe0908ef655169ea766fdc3": { + "name": "HEDGEHOG token contract", + "address": "0x6d4ca1177087924edfe0908ef655169ea766fdc3", + "token": { + "decimals": 18, + "symbol": "HEDGEHOG" + }, + "isSC": {} + }, + "0x9a44fd41566876a39655f74971a3a6ea0a17a454": { + "name": "ALDO token contract", + "address": "0x9a44fd41566876a39655f74971a3a6ea0a17a454", + "token": { + "decimals": 18, + "symbol": "ALDO" + }, + "isSC": {} + }, + "0x37e1160184f7dd29f00b78c050bf13224780b0b0": { + "name": "YCC token contract", + "address": "0x37e1160184f7dd29f00b78c050bf13224780b0b0", + "token": { + "decimals": 8, + "symbol": "YCC" + }, + "isSC": {} + }, + "0xc221b7e65ffc80de234bbb6667abdd46593d34f0": { + "name": "WCFG token contract", + "address": "0xc221b7e65ffc80de234bbb6667abdd46593d34f0", + "token": { + "decimals": 18, + "symbol": "WCFG" + }, + "isSC": {} + }, + "0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8": { + "name": "ABUSD token contract", + "address": "0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8", + "token": { + "decimals": 18, + "symbol": "ABUSD" + }, + "isSC": {} + }, + "0x2f4eb47a1b1f4488c71fc10e39a4aa56af33dd49": { + "name": "UNCL token contract", + "address": "0x2f4eb47a1b1f4488c71fc10e39a4aa56af33dd49", + "token": { + "decimals": 18, + "symbol": "UNCL" + }, + "isSC": {} + }, + "0xb475332d25d34b59176f5c1d94cb9bc9b5e3954a": { + "name": "HOBBES token contract", + "address": "0xb475332d25d34b59176f5c1d94cb9bc9b5e3954a", + "token": { + "decimals": 9, + "symbol": "HOBBES" + }, + "isSC": {} + }, + "0xfd20e1b78c353877a25274c85fb5566277e5f60e": { + "name": "NOON token contract", + "address": "0xfd20e1b78c353877a25274c85fb5566277e5f60e", + "token": { + "decimals": 18, + "symbol": "NOON" + }, + "isSC": {} + }, + "0x2341dd0a96a0dab62aa1efb93d59ff7f3bdb8932": { + "name": "PROT token contract", + "address": "0x2341dd0a96a0dab62aa1efb93d59ff7f3bdb8932", + "token": { + "decimals": 18, + "symbol": "PROT" + }, + "isSC": {} + }, + "0x8efe7dd5984640537b6596fb28b762f6c000f184": { + "name": "DARK token contract", + "address": "0x8efe7dd5984640537b6596fb28b762f6c000f184", + "token": { + "decimals": 9, + "symbol": "DARK" + }, + "isSC": {} + }, + "0xa8dfdfdf9d288e909a96178e15731a6f4048a7aa": { + "name": "SCAN token contract", + "address": "0xa8dfdfdf9d288e909a96178e15731a6f4048a7aa", + "token": { + "decimals": 9, + "symbol": "SCAN" + }, + "isSC": {} + }, + "0x19be3a0f1a6cccc99b3cdc13475613e559be551c": { + "name": "MEF token contract", + "address": "0x19be3a0f1a6cccc99b3cdc13475613e559be551c", + "token": { + "decimals": 18, + "symbol": "MEF" + }, + "isSC": {} + }, + "0x64d0f55cd8c7133a9d7102b13987235f486f2224": { + "name": "BORG token contract", + "address": "0x64d0f55cd8c7133a9d7102b13987235f486f2224", + "token": { + "decimals": 18, + "symbol": "BORG" + }, + "isSC": {} + }, + "0x0b452278223d3954f4ac050949d7998e373e7e43": { + "name": "SUZUME token contract", + "address": "0x0b452278223d3954f4ac050949d7998e373e7e43", + "token": { + "decimals": 18, + "symbol": "SUZUME" + }, + "isSC": {} + }, + "0x97b65710d03e12775189f0d113202cc1443b0aa2": { + "name": "ELONONE token contract", + "address": "0x97b65710d03e12775189f0d113202cc1443b0aa2", + "token": { + "decimals": 9, + "symbol": "ELONONE" + }, + "isSC": {} + }, + "0x6b4ceb0beb0dcf0043c9389e01e3f1c84b422e4f": { + "name": "ULTIMATEBO token contract", + "address": "0x6b4ceb0beb0dcf0043c9389e01e3f1c84b422e4f", + "token": { + "decimals": 9, + "symbol": "ULTIMATEBO" + }, + "isSC": {} + }, + "0x06b884e60794ce02aafab13791b59a2e6a07442f": { + "name": "UNBNK token contract", + "address": "0x06b884e60794ce02aafab13791b59a2e6a07442f", + "token": { + "decimals": 18, + "symbol": "UNBNK" + }, + "isSC": {} + }, + "0x33f391f4c4fe802b70b77ae37670037a92114a7c": { + "name": "BURP token contract", + "address": "0x33f391f4c4fe802b70b77ae37670037a92114a7c", + "token": { + "decimals": 18, + "symbol": "BURP" + }, + "isSC": {} + }, + "0xf0d33beda4d734c72684b5f9abbebf715d0a7935": { + "name": "NTX token contract", + "address": "0xf0d33beda4d734c72684b5f9abbebf715d0a7935", + "token": { + "decimals": 6, + "symbol": "NTX" + }, + "isSC": {} + }, + "0x4a621d9f1b19296d1c0f87637b3a8d4978e9bf82": { + "name": "CYFM token contract", + "address": "0x4a621d9f1b19296d1c0f87637b3a8d4978e9bf82", + "token": { + "decimals": 18, + "symbol": "CYFM" + }, + "isSC": {} + }, + "0x5e67e49a95b8ccc7a46b68bcdc1c35dc799ef9e0": { + "name": "DFUND token contract", + "address": "0x5e67e49a95b8ccc7a46b68bcdc1c35dc799ef9e0", + "token": { + "decimals": 9, + "symbol": "DFUND" + }, + "isSC": {} + }, + "0x81ef51fce2b14874cb840515facf5be667ea4d8f": { + "name": "MADAPE token contract", + "address": "0x81ef51fce2b14874cb840515facf5be667ea4d8f", + "token": { + "decimals": 18, + "symbol": "MADAPE" + }, + "isSC": {} + }, + "0x57f5e098cad7a3d1eed53991d4d66c45c9af7812": { + "name": "WUSDM token contract", + "address": "0x57f5e098cad7a3d1eed53991d4d66c45c9af7812", + "token": { + "decimals": 18, + "symbol": "WUSDM" + }, + "isSC": {} + }, + "0x4cf488387f035ff08c371515562cba712f9015d4": { + "name": "WPR token contract", + "address": "0x4cf488387f035ff08c371515562cba712f9015d4", + "token": { + "decimals": 18, + "symbol": "WPR" + }, + "isSC": {} + }, + "0xdb05ea0877a2622883941b939f0bb11d1ac7c400": { + "name": "Opacity", + "address": "0xdb05ea0877a2622883941b939f0bb11d1ac7c400", + "token": { + "decimals": 18, + "symbol": "OPCT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/opct.svg" + }, + "0xe6f47303032a09c8c0f8ebb713c00e6ed345e8c3": { + "name": "RISITA token contract", + "address": "0xe6f47303032a09c8c0f8ebb713c00e6ed345e8c3", + "token": { + "decimals": 18, + "symbol": "RISITA" + }, + "isSC": {} + }, + "0x4946fcea7c692606e8908002e55a582af44ac121": { + "name": "FOAM", + "address": "0x4946fcea7c692606e8908002e55a582af44ac121", + "token": { + "decimals": 18, + "symbol": "FOAM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/FOAM.svg" + }, + "0xe8e8486228753e01dbc222da262aa706bd67e601": { + "name": "WEB3 token contract", + "address": "0xe8e8486228753e01dbc222da262aa706bd67e601", + "token": { + "decimals": 18, + "symbol": "WEB3" + }, + "isSC": {} + }, + "0x69168908793294d0a9ea938673e12c36ecae6969": { + "name": "6969 token contract", + "address": "0x69168908793294d0a9ea938673e12c36ecae6969", + "token": { + "decimals": 9, + "symbol": "6969" + }, + "isSC": {} + }, + "0x3eef95e483b0a013d34b9482c6f4afcbd4d38146": { + "name": "PORT token contract", + "address": "0x3eef95e483b0a013d34b9482c6f4afcbd4d38146", + "token": { + "decimals": 18, + "symbol": "PORT" + }, + "isSC": {} + }, + "0x7e84c0890ca316458d41497146b2176f6a226277": { + "name": "RAVE token contract", + "address": "0x7e84c0890ca316458d41497146b2176f6a226277", + "token": { + "decimals": 18, + "symbol": "RAVE" + }, + "isSC": {} + }, + "0x187d1018e8ef879be4194d6ed7590987463ead85": { + "name": "FUZE token contract", + "address": "0x187d1018e8ef879be4194d6ed7590987463ead85", + "token": { + "decimals": 18, + "symbol": "FUZE" + }, + "isSC": {} + }, + "0xeb575c45004bd7b61c6a8d3446a62a05a6ce18d8": { + "name": "ELS token contract", + "address": "0xeb575c45004bd7b61c6a8d3446a62a05a6ce18d8", + "token": { + "decimals": 18, + "symbol": "ELS" + }, + "isSC": {} + }, + "0xc4de189abf94c57f396bd4c52ab13b954febefd8": { + "name": "B20 token contract", + "address": "0xc4de189abf94c57f396bd4c52ab13b954febefd8", + "token": { + "decimals": 18, + "symbol": "B20" + }, + "isSC": {} + }, + "0xba5bde662c17e2adff1075610382b9b691296350": { + "name": "SuperRare Token", + "address": "0xba5bde662c17e2adff1075610382b9b691296350", + "token": { + "decimals": 18, + "symbol": "RARE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rare.svg" + }, + "0x6524b87960c2d573ae514fd4181777e7842435d4": { + "name": "BZN token contract", + "address": "0x6524b87960c2d573ae514fd4181777e7842435d4", + "token": { + "decimals": 18, + "symbol": "BZN" + }, + "isSC": {} + }, + "0xeda43fa2f35ea174a7e9b73658b18a7da00adf38": { + "name": "NAMX token contract", + "address": "0xeda43fa2f35ea174a7e9b73658b18a7da00adf38", + "token": { + "decimals": 18, + "symbol": "NAMX" + }, + "isSC": {} + }, + "0xd7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b": { + "name": "NXM token contract", + "address": "0xd7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b", + "token": { + "decimals": 18, + "symbol": "NXM" + }, + "isSC": {} + }, + "0x201b5b64438843553e3c3671810ae671c93c685c": { + "name": "MEGABOT token contract", + "address": "0x201b5b64438843553e3c3671810ae671c93c685c", + "token": { + "decimals": 18, + "symbol": "MEGABOT" + }, + "isSC": {} + }, + "0xa7a5c1058194af8f00c187adb7fcc0c95f1c6c2d": { + "name": "SPIZ token contract", + "address": "0xa7a5c1058194af8f00c187adb7fcc0c95f1c6c2d", + "token": { + "decimals": 18, + "symbol": "SPIZ" + }, + "isSC": {} + }, + "0xfd8b38d453ff6448e1a348f9b153e6873b6ca1ce": { + "name": "XLOTTO token contract", + "address": "0xfd8b38d453ff6448e1a348f9b153e6873b6ca1ce", + "token": { + "decimals": 18, + "symbol": "XLOTTO" + }, + "isSC": {} + }, + "0x68592c5c98c4f4a8a4bc6da2121e65da3d1c0917": { + "name": "USDLR token contract", + "address": "0x68592c5c98c4f4a8a4bc6da2121e65da3d1c0917", + "token": { + "decimals": 6, + "symbol": "USDLR" + }, + "isSC": {} + }, + "0x66a39d581961d4cfa9bd3953ccc4e7ec7bd56716": { + "name": "YELLOW token contract", + "address": "0x66a39d581961d4cfa9bd3953ccc4e7ec7bd56716", + "token": { + "decimals": 9, + "symbol": "YELLOW" + }, + "isSC": {} + }, + "0xd87d72248093597df8d56d2a53c1ab7c1a0cc8da": { + "name": "HAHA token contract", + "address": "0xd87d72248093597df8d56d2a53c1ab7c1a0cc8da", + "token": { + "decimals": 18, + "symbol": "HAHA" + }, + "isSC": {} + }, + "0xf974b5f9ac9c6632fee8b76c61b0242ce69c839d": { + "name": "ZYX token contract", + "address": "0xf974b5f9ac9c6632fee8b76c61b0242ce69c839d", + "token": { + "decimals": 18, + "symbol": "ZYX" + }, + "isSC": {} + }, + "0x1a6658f40e51b372e593b7d2144c1402d5cf33e8": { + "name": "PUBLX token contract", + "address": "0x1a6658f40e51b372e593b7d2144c1402d5cf33e8", + "token": { + "decimals": 18, + "symbol": "PUBLX" + }, + "isSC": {} + }, + "0xd8e163967fed76806df0097b704ba721b9b37656": { + "name": "Cope", + "address": "0xd8e163967fed76806df0097b704ba721b9b37656", + "token": { + "decimals": 18, + "symbol": "COPE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/cope.svg" + }, + "0x3391bc034f2935ef0e1e41619445f998b2680d35": { + "name": "IDLEUSDCSAFE token contract", + "address": "0x3391bc034f2935ef0e1e41619445f998b2680d35", + "token": { + "decimals": 18, + "symbol": "IDLEUSDCSAFE" + }, + "isSC": {} + }, + "0x891de5f139791ddf9dbabf519cfe2a049f8fc6d3": { + "name": "DIBBLE token contract", + "address": "0x891de5f139791ddf9dbabf519cfe2a049f8fc6d3", + "token": { + "decimals": 18, + "symbol": "DIBBLE" + }, + "isSC": {} + }, + "0x569d0e52c3dbe95983bcc2434cb9f69d905be919": { + "name": "ROAR token contract", + "address": "0x569d0e52c3dbe95983bcc2434cb9f69d905be919", + "token": { + "decimals": 9, + "symbol": "ROAR" + }, + "isSC": {} + }, + "0xde4ce5447ce0c67920a1371605a39187cb6847c8": { + "name": "LOVE token contract", + "address": "0xde4ce5447ce0c67920a1371605a39187cb6847c8", + "token": { + "decimals": 18, + "symbol": "LOVE" + }, + "isSC": {} + }, + "0x1a2eb478fa07125c9935a77b3c03a82470801e30": { + "name": "AMO token contract", + "address": "0x1a2eb478fa07125c9935a77b3c03a82470801e30", + "token": { + "decimals": 18, + "symbol": "AMO" + }, + "isSC": {} + }, + "0x15927156df05361ccf0fc9561cc2f60fac319e14": { + "name": "CHIBI token contract", + "address": "0x15927156df05361ccf0fc9561cc2f60fac319e14", + "token": { + "decimals": 8, + "symbol": "CHIBI" + }, + "isSC": {} + }, + "0xb685145d7f127b9093d7f9278bae902ef59ff486": { + "name": "FREQAI token contract", + "address": "0xb685145d7f127b9093d7f9278bae902ef59ff486", + "token": { + "decimals": 18, + "symbol": "FREQAI" + }, + "isSC": {} + }, + "0xbb63e6be33bc5b5386d7ab0529dc6c400f2ac2ec": { + "name": "CUCK token contract", + "address": "0xbb63e6be33bc5b5386d7ab0529dc6c400f2ac2ec", + "token": { + "decimals": 18, + "symbol": "CUCK" + }, + "isSC": {} + }, + "0x8ae4bf2c33a8e667de34b54938b0ccd03eb8cc06": { + "name": "PTOY token contract", + "address": "0x8ae4bf2c33a8e667de34b54938b0ccd03eb8cc06", + "token": { + "decimals": 8, + "symbol": "PTOY" + }, + "isSC": {} + }, + "0x8f693ca8d21b157107184d29d398a8d082b38b76": { + "name": "Streamr", + "address": "0x8f693ca8d21b157107184d29d398a8d082b38b76", + "token": { + "decimals": 18, + "symbol": "DATA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/streamr.svg" + }, + "0xd8f1460044925d2d5c723c7054cd9247027415b7": { + "name": "SAIL token contract", + "address": "0xd8f1460044925d2d5c723c7054cd9247027415b7", + "token": { + "decimals": 18, + "symbol": "SAIL" + }, + "isSC": {} + }, + "0x01202c9a1adfc1475c960c23bdf7530698330fa0": { + "name": "JUDGE token contract", + "address": "0x01202c9a1adfc1475c960c23bdf7530698330fa0", + "token": { + "decimals": 18, + "symbol": "JUDGE" + }, + "isSC": {} + }, + "0x6f2dec5da475333b0af4a3ffc9a33b0211a9a452": { + "name": "CT token contract", + "address": "0x6f2dec5da475333b0af4a3ffc9a33b0211a9a452", + "token": { + "decimals": 18, + "symbol": "CT" + }, + "isSC": {} + }, + "0x5f48d1fd6814cd1cd38aeb895755e57d519196d1": { + "name": "WINS token contract", + "address": "0x5f48d1fd6814cd1cd38aeb895755e57d519196d1", + "token": { + "decimals": 18, + "symbol": "WINS" + }, + "isSC": {} + }, + "0xa8b12cc90abf65191532a12bb5394a714a46d358": { + "name": "PBTC35A token contract", + "address": "0xa8b12cc90abf65191532a12bb5394a714a46d358", + "token": { + "decimals": 18, + "symbol": "PBTC35A" + }, + "isSC": {} + }, + "0xa6345ffadfa23dfc9014bce72ff2fa8712e54231": { + "name": "KEK token contract", + "address": "0xa6345ffadfa23dfc9014bce72ff2fa8712e54231", + "token": { + "decimals": 9, + "symbol": "KEK" + }, + "isSC": {} + }, + "0xe90ce7764d8401d19ed3733a211bd3b06c631bc0": { + "name": "POD token contract", + "address": "0xe90ce7764d8401d19ed3733a211bd3b06c631bc0", + "token": { + "decimals": 18, + "symbol": "POD" + }, + "isSC": {} + }, + "0x20bc832ca081b91433ff6c17f85701b6e92486c5": { + "name": "RETH2 token contract", + "address": "0x20bc832ca081b91433ff6c17f85701b6e92486c5", + "token": { + "decimals": 18, + "symbol": "RETH2" + }, + "isSC": {} + }, + "0x9ca98c8b217c3b45074834908555d36af2ac6449": { + "name": "SABR token contract", + "address": "0x9ca98c8b217c3b45074834908555d36af2ac6449", + "token": { + "decimals": 18, + "symbol": "SABR" + }, + "isSC": {} + }, + "0xa203eb78fee91c8459c6d4ef3a899d8724ee5b35": { + "name": "MERC token contract", + "address": "0xa203eb78fee91c8459c6d4ef3a899d8724ee5b35", + "token": { + "decimals": 18, + "symbol": "MERC" + }, + "isSC": {} + }, + "0x39795344cbcc76cc3fb94b9d1b15c23c2070c66d": { + "name": "SHARE token contract", + "address": "0x39795344cbcc76cc3fb94b9d1b15c23c2070c66d", + "token": { + "decimals": 9, + "symbol": "SHARE" + }, + "isSC": {} + }, + "0xb4272071ecadd69d933adcd19ca99fe80664fc08": { + "name": "CryptoFranc", + "address": "0xb4272071ecadd69d933adcd19ca99fe80664fc08", + "token": { + "decimals": 18, + "symbol": "XCHF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/XCHF.svg" + }, + "0xf90c7f66eac7e2130bf677d69a250b2136cf6697": { + "name": "HAKI token contract", + "address": "0xf90c7f66eac7e2130bf677d69a250b2136cf6697", + "token": { + "decimals": 18, + "symbol": "HAKI" + }, + "isSC": {} + }, + "0x171d76d931529384639bc9aad5b77b77041ed604": { + "name": "MOTG token contract", + "address": "0x171d76d931529384639bc9aad5b77b77041ed604", + "token": { + "decimals": 18, + "symbol": "MOTG" + }, + "isSC": {} + }, + "0x53250b5dfa8c911547afeaf18db025024c8e919a": { + "name": "KERMIT token contract", + "address": "0x53250b5dfa8c911547afeaf18db025024c8e919a", + "token": { + "decimals": 9, + "symbol": "KERMIT" + }, + "isSC": {} + }, + "0x9d67d207b0cbdbd6dc50f465555cc777bd51159e": { + "name": "UU token contract", + "address": "0x9d67d207b0cbdbd6dc50f465555cc777bd51159e", + "token": { + "decimals": 18, + "symbol": "UU" + }, + "isSC": {} + }, + "0xd689933dafeec0041385d278adf5492a2b3b68fb": { + "name": "DIA token contract", + "address": "0xd689933dafeec0041385d278adf5492a2b3b68fb", + "token": { + "decimals": 18, + "symbol": "DIA" + }, + "isSC": {} + }, + "0x64b5a241b829bca14eb42d00097ba8fd8135841e": { + "name": "MEF token contract", + "address": "0x64b5a241b829bca14eb42d00097ba8fd8135841e", + "token": { + "decimals": 18, + "symbol": "MEF" + }, + "isSC": {} + }, + "0x064797ac7f833d01faeeae0e69f3af5a52a91fc8": { + "name": "SU token contract", + "address": "0x064797ac7f833d01faeeae0e69f3af5a52a91fc8", + "token": { + "decimals": 9, + "symbol": "SU" + }, + "isSC": {} + }, + "0x44aad22afbb2606d7828ca1f8f9e5af00e779ae1": { + "name": "SIMPSON token contract", + "address": "0x44aad22afbb2606d7828ca1f8f9e5af00e779ae1", + "token": { + "decimals": 9, + "symbol": "SIMPSON" + }, + "isSC": {} + }, + "0xb4a677b0e363c3815d46326954a4e4d2b1ace357": { + "name": "THE token contract", + "address": "0xb4a677b0e363c3815d46326954a4e4d2b1ace357", + "token": { + "decimals": 18, + "symbol": "THE" + }, + "isSC": {} + }, + "0xd27b128dc6536309cdebf7f1aff0cb7717bc0268": { + "name": "ETE token contract", + "address": "0xd27b128dc6536309cdebf7f1aff0cb7717bc0268", + "token": { + "decimals": 18, + "symbol": "ETE" + }, + "isSC": {} + }, + "0x05d3606d5c81eb9b7b18530995ec9b29da05faba": { + "name": "TOMOE token contract", + "address": "0x05d3606d5c81eb9b7b18530995ec9b29da05faba", + "token": { + "decimals": 18, + "symbol": "TOMOE" + }, + "isSC": {} + }, + "0x6b785a0322126826d8226d77e173d75dafb84d11": { + "name": "VLT token contract", + "address": "0x6b785a0322126826d8226d77e173d75dafb84d11", + "token": { + "decimals": 18, + "symbol": "VLT" + }, + "isSC": {} + }, + "0xd5df655087d99b7b720a5bc8711f296180a4f44b": { + "name": "OPTIG token contract", + "address": "0xd5df655087d99b7b720a5bc8711f296180a4f44b", + "token": { + "decimals": 18, + "symbol": "OPTIG" + }, + "isSC": {} + }, + "0x2cbbce628af16de2fcaad681a3c79ec25043f279": { + "name": "SCARAB token contract", + "address": "0x2cbbce628af16de2fcaad681a3c79ec25043f279", + "token": { + "decimals": 18, + "symbol": "SCARAB" + }, + "isSC": {} + }, + "0x6400b5522f8d448c0803e6245436dd1c81df09ce": { + "name": "CVNT token contract", + "address": "0x6400b5522f8d448c0803e6245436dd1c81df09ce", + "token": { + "decimals": 8, + "symbol": "CVNT" + }, + "isSC": {} + }, + "0x318ee488af8881f9945b6d3d69e8b395fb559bb1": { + "name": "MONTE token contract", + "address": "0x318ee488af8881f9945b6d3d69e8b395fb559bb1", + "token": { + "decimals": 18, + "symbol": "MONTE" + }, + "isSC": {} + }, + "0x0c29ff5e5f27ed032eab2a97aa489e9c6da5a4a8": { + "name": "ROULETTEBO token contract", + "address": "0x0c29ff5e5f27ed032eab2a97aa489e9c6da5a4a8", + "token": { + "decimals": 18, + "symbol": "ROULETTEBO" + }, + "isSC": {} + }, + "0x068e3563b1c19590f822c0e13445c4fa1b9eefa5": { + "name": "WUSD token contract", + "address": "0x068e3563b1c19590f822c0e13445c4fa1b9eefa5", + "token": { + "decimals": 18, + "symbol": "WUSD" + }, + "isSC": {} + }, + "0xb840d10d840ef47c233fec1fd040f5b145a6dfa5": { + "name": "STREETH token contract", + "address": "0xb840d10d840ef47c233fec1fd040f5b145a6dfa5", + "token": { + "decimals": 18, + "symbol": "STREETH" + }, + "isSC": {} + }, + "0xde47a2460e4b6c36b26919ef9255b4f3f86de0a0": { + "name": " token contract", + "address": "0xde47a2460e4b6c36b26919ef9255b4f3f86de0a0", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x87de305311d5788e8da38d19bb427645b09cb4e5": { + "name": "VRX token contract", + "address": "0x87de305311d5788e8da38d19bb427645b09cb4e5", + "token": { + "decimals": 18, + "symbol": "VRX" + }, + "isSC": {} + }, + "0xccc8cb5229b0ac8069c51fd58367fd1e622afd97": { + "name": "Gods Unchained", + "address": "0xccc8cb5229b0ac8069c51fd58367fd1e622afd97", + "token": { + "decimals": 18, + "symbol": "GODS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gods.svg" + }, + "0xdadb4ae5b5d3099dd1f586f990b845f2404a1c4c": { + "name": " token contract", + "address": "0xdadb4ae5b5d3099dd1f586f990b845f2404a1c4c", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x7697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a": { + "name": "SARCO token contract", + "address": "0x7697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a", + "token": { + "decimals": 18, + "symbol": "SARCO" + }, + "isSC": {} + }, + "0x0bf43350076f95e0d16120b4d6bdfa1c9d50bdbd": { + "name": "AGT token contract", + "address": "0x0bf43350076f95e0d16120b4d6bdfa1c9d50bdbd", + "token": { + "decimals": 18, + "symbol": "AGT" + }, + "isSC": {} + }, + "0x19cc7acbe3365e5597d5cb411623112fa70050f3": { + "name": "WASH token contract", + "address": "0x19cc7acbe3365e5597d5cb411623112fa70050f3", + "token": { + "decimals": 18, + "symbol": "WASH" + }, + "isSC": {} + }, + "0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc": { + "name": "MyBit", + "address": "0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc", + "token": { + "decimals": 18, + "symbol": "MYB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MYB.svg" + }, + "0x7d29a64504629172a429e64183d6673b9dacbfce": { + "name": "VXV token contract", + "address": "0x7d29a64504629172a429e64183d6673b9dacbfce", + "token": { + "decimals": 18, + "symbol": "VXV" + }, + "isSC": {} + }, + "0x29d7139271398d0c2e22523fda06e023dcb07f8f": { + "name": "KLUB token contract", + "address": "0x29d7139271398d0c2e22523fda06e023dcb07f8f", + "token": { + "decimals": 18, + "symbol": "KLUB" + }, + "isSC": {} + }, + "0xa1afffe3f4d611d252010e3eaf6f4d77088b0cd7": { + "name": "Reflect Finance", + "address": "0xa1afffe3f4d611d252010e3eaf6f4d77088b0cd7", + "token": { + "decimals": 9, + "symbol": "RFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/RFI.svg" + }, + "0x1494951b4656075e473843161c4ff0201a235cec": { + "name": "SOOOOOOOOO token contract", + "address": "0x1494951b4656075e473843161c4ff0201a235cec", + "token": { + "decimals": 9, + "symbol": "SOOOOOOOOO" + }, + "isSC": {} + }, + "0xbb3d7f42c58abd83616ad7c8c72473ee46df2678": { + "name": "CHAT token contract", + "address": "0xbb3d7f42c58abd83616ad7c8c72473ee46df2678", + "token": { + "decimals": 18, + "symbol": "CHAT" + }, + "isSC": {} + }, + "0xc06d9013a1d3f25f76ee5291bbc04a181985814e": { + "name": "YERTLE token contract", + "address": "0xc06d9013a1d3f25f76ee5291bbc04a181985814e", + "token": { + "decimals": 9, + "symbol": "YERTLE" + }, + "isSC": {} + }, + "0xce2b26bec3c6945f0922a983f3cfa11cd79176f4": { + "name": "ELON token contract", + "address": "0xce2b26bec3c6945f0922a983f3cfa11cd79176f4", + "token": { + "decimals": 9, + "symbol": "ELON" + }, + "isSC": {} + }, + "0x09637e374ec5bab8c9e9654a97c9593e3038c5b3": { + "name": "ZKP token contract", + "address": "0x09637e374ec5bab8c9e9654a97c9593e3038c5b3", + "token": { + "decimals": 9, + "symbol": "ZKP" + }, + "isSC": {} + }, + "0x6cadf6abbceb53e631c288778daacf125481c1bb": { + "name": "CITADEL token contract", + "address": "0x6cadf6abbceb53e631c288778daacf125481c1bb", + "token": { + "decimals": 18, + "symbol": "CITADEL" + }, + "isSC": {} + }, + "0xab5d6508e4726141d29c6074ab366afa03f4ec8d": { + "name": "TRUCK token contract", + "address": "0xab5d6508e4726141d29c6074ab366afa03f4ec8d", + "token": { + "decimals": 18, + "symbol": "TRUCK" + }, + "isSC": {} + }, + "0x74588af8de14287e91d89758636d277d66f217b6": { + "name": "0XOS token contract", + "address": "0x74588af8de14287e91d89758636d277d66f217b6", + "token": { + "decimals": 18, + "symbol": "0XOS" + }, + "isSC": {} + }, + "0x0e9cc0f7e550bd43bd2af2214563c47699f96479": { + "name": "UNLEASH token contract", + "address": "0x0e9cc0f7e550bd43bd2af2214563c47699f96479", + "token": { + "decimals": 18, + "symbol": "UNLEASH" + }, + "isSC": {} + }, + "0x4e114d405b9ba2f59524941733e505ae03fb1fb5": { + "name": "JOY token contract", + "address": "0x4e114d405b9ba2f59524941733e505ae03fb1fb5", + "token": { + "decimals": 18, + "symbol": "JOY" + }, + "isSC": {} + }, + "0x3c48ca59bf2699e51d4974d4b6d284ae52076e5e": { + "name": "CDS token contract", + "address": "0x3c48ca59bf2699e51d4974d4b6d284ae52076e5e", + "token": { + "decimals": 18, + "symbol": "CDS" + }, + "isSC": {} + }, + "0x9b06f3c5de42d4623d7a2bd940ec735103c68a76": { + "name": "VOLTA token contract", + "address": "0x9b06f3c5de42d4623d7a2bd940ec735103c68a76", + "token": { + "decimals": 18, + "symbol": "VOLTA" + }, + "isSC": {} + }, + "0x19f5d973335480d26270dc498459e2f39cf2da53": { + "name": "FINU token contract", + "address": "0x19f5d973335480d26270dc498459e2f39cf2da53", + "token": { + "decimals": 18, + "symbol": "FINU" + }, + "isSC": {} + }, + "0xc5b490371870201e2fe6308850507db6e9cba732": { + "name": "BROK token contract", + "address": "0xc5b490371870201e2fe6308850507db6e9cba732", + "token": { + "decimals": 9, + "symbol": "BROK" + }, + "isSC": {} + }, + "0x8df60cfc67c1bf51fe3dd61b34b156f14f538f5d": { + "name": "WOJAK269 token contract", + "address": "0x8df60cfc67c1bf51fe3dd61b34b156f14f538f5d", + "token": { + "decimals": 9, + "symbol": "WOJAK269" + }, + "isSC": {} + }, + "0x62d04c79c1f3a2d7230ffcd3ab01794e1d153239": { + "name": "OGMF token contract", + "address": "0x62d04c79c1f3a2d7230ffcd3ab01794e1d153239", + "token": { + "decimals": 18, + "symbol": "OGMF" + }, + "isSC": {} + }, + "0xb8112a01744fe88bc8672cd977378169e33eb9a5": { + "name": "OIB token contract", + "address": "0xb8112a01744fe88bc8672cd977378169e33eb9a5", + "token": { + "decimals": 9, + "symbol": "OIB" + }, + "isSC": {} + }, + "0x80592d613a383f2ba3c42e4c247067289ee60152": { + "name": "TURBO token contract", + "address": "0x80592d613a383f2ba3c42e4c247067289ee60152", + "token": { + "decimals": 18, + "symbol": "TURBO" + }, + "isSC": {} + }, + "0x0b0a8c7c34374c1d0c649917a97eee6c6c929b1b": { + "name": "SHEPE token contract", + "address": "0x0b0a8c7c34374c1d0c649917a97eee6c6c929b1b", + "token": { + "decimals": 9, + "symbol": "SHEPE" + }, + "isSC": {} + }, + "0x29cbd0510eec0327992cd6006e63f9fa8e7f33b7": { + "name": "TIDAL token contract", + "address": "0x29cbd0510eec0327992cd6006e63f9fa8e7f33b7", + "token": { + "decimals": 18, + "symbol": "TIDAL" + }, + "isSC": {} + }, + "0xccdb064a41afcd432bcea6f6d0d1e7c371d0b002": { + "name": "QR token contract", + "address": "0xccdb064a41afcd432bcea6f6d0d1e7c371d0b002", + "token": { + "decimals": 9, + "symbol": "QR" + }, + "isSC": {} + }, + "0xcb86c6a22cb56b6cf40cafedb06ba0df188a416e": { + "name": "SURE token contract", + "address": "0xcb86c6a22cb56b6cf40cafedb06ba0df188a416e", + "token": { + "decimals": 18, + "symbol": "SURE" + }, + "isSC": {} + }, + "0xdc5864ede28bd4405aa04d93e05a0531797d9d59": { + "name": "Falcon", + "address": "0xdc5864ede28bd4405aa04d93e05a0531797d9d59", + "token": { + "decimals": 6, + "symbol": "FNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/fnt.svg" + }, + "0x63a0db25159672326ac8fbf512c409598801b145": { + "name": "XPPT token contract", + "address": "0x63a0db25159672326ac8fbf512c409598801b145", + "token": { + "decimals": 4, + "symbol": "XPPT" + }, + "isSC": {} + }, + "0xb39185e33e8c28e0bb3dbbce24da5dea6379ae91": { + "name": "PHUNK token contract", + "address": "0xb39185e33e8c28e0bb3dbbce24da5dea6379ae91", + "token": { + "decimals": 18, + "symbol": "PHUNK" + }, + "isSC": {} + }, + "0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6": { + "name": "ABYSS token contract", + "address": "0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6", + "token": { + "decimals": 18, + "symbol": "ABYSS" + }, + "isSC": {} + }, + "0x3212b29e33587a00fb1c83346f5dbfa69a458923": { + "name": "IMBTC token contract", + "address": "0x3212b29e33587a00fb1c83346f5dbfa69a458923", + "token": { + "decimals": 8, + "symbol": "IMBTC" + }, + "isSC": {} + }, + "0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf": { + "name": "DGX token contract", + "address": "0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf", + "token": { + "decimals": 9, + "symbol": "DGX" + }, + "isSC": {} + }, + "0xc73abe8d7a0da644743fe2ad24f4e16bb7ed43f8": { + "name": "WEBAI token contract", + "address": "0xc73abe8d7a0da644743fe2ad24f4e16bb7ed43f8", + "token": { + "decimals": 9, + "symbol": "WEBAI" + }, + "isSC": {} + }, + "0x9e04f519b094f5f8210441e285f603f4d2b50084": { + "name": "1EARTH token contract", + "address": "0x9e04f519b094f5f8210441e285f603f4d2b50084", + "token": { + "decimals": 18, + "symbol": "1EARTH" + }, + "isSC": {} + }, + "0x8e81d527f8fa05d82c514401c8144275174557cd": { + "name": "CCB token contract", + "address": "0x8e81d527f8fa05d82c514401c8144275174557cd", + "token": { + "decimals": 18, + "symbol": "CCB" + }, + "isSC": {} + }, + "0xf915110898d9a455ad2da51bf49520b41655ccea": { + "name": "TAI token contract", + "address": "0xf915110898d9a455ad2da51bf49520b41655ccea", + "token": { + "decimals": 18, + "symbol": "TAI" + }, + "isSC": {} + }, + "0x3f3cd642e81d030d7b514a2ab5e3a5536beb90ec": { + "name": "RHO token contract", + "address": "0x3f3cd642e81d030d7b514a2ab5e3a5536beb90ec", + "token": { + "decimals": 18, + "symbol": "RHO" + }, + "isSC": {} + }, + "0xdb5c3c46e28b53a39c255aa39a411dd64e5fed9c": { + "name": "NCR token contract", + "address": "0xdb5c3c46e28b53a39c255aa39a411dd64e5fed9c", + "token": { + "decimals": 18, + "symbol": "NCR" + }, + "isSC": {} + }, + "0x7fbec0bb6a7152e77c30d005b5d49cbc08a602c3": { + "name": "DDOS token contract", + "address": "0x7fbec0bb6a7152e77c30d005b5d49cbc08a602c3", + "token": { + "decimals": 18, + "symbol": "DDOS" + }, + "isSC": {} + }, + "0xfca89d55a768375ab7ca04485a35a964bea828dd": { + "name": "DELREY token contract", + "address": "0xfca89d55a768375ab7ca04485a35a964bea828dd", + "token": { + "decimals": 18, + "symbol": "DELREY" + }, + "isSC": {} + }, + "0x8dbf9a4c99580fc7fd4024ee08f3994420035727": { + "name": "ECO token contract", + "address": "0x8dbf9a4c99580fc7fd4024ee08f3994420035727", + "token": { + "decimals": 18, + "symbol": "ECO" + }, + "isSC": {} + }, + "0x2f30700735697baac1b9177d404303f0cc0e1a74": { + "name": "STAR token contract", + "address": "0x2f30700735697baac1b9177d404303f0cc0e1a74", + "token": { + "decimals": 18, + "symbol": "STAR" + }, + "isSC": {} + }, + "0x0f3b904172f937748af7f09353b016219a14562c": { + "name": "POS token contract", + "address": "0x0f3b904172f937748af7f09353b016219a14562c", + "token": { + "decimals": 18, + "symbol": "POS" + }, + "isSC": {} + }, + "0x524ebc93beef838f70b4ae54b675d3e971d5884e": { + "name": "HERO token contract", + "address": "0x524ebc93beef838f70b4ae54b675d3e971d5884e", + "token": { + "decimals": 9, + "symbol": "HERO" + }, + "isSC": {} + }, + "0x4c601dc69affb0d4fc8de1ac303705e432a4a27e": { + "name": "KCT token contract", + "address": "0x4c601dc69affb0d4fc8de1ac303705e432a4a27e", + "token": { + "decimals": 18, + "symbol": "KCT" + }, + "isSC": {} + }, + "0xf62ac0fcae17f9195280ced4de978313effe2daa": { + "name": "CHART token contract", + "address": "0xf62ac0fcae17f9195280ced4de978313effe2daa", + "token": { + "decimals": 18, + "symbol": "CHART" + }, + "isSC": {} + }, + "0xad32a8e6220741182940c5abf610bde99e737b2d": { + "name": "DOUGH token contract", + "address": "0xad32a8e6220741182940c5abf610bde99e737b2d", + "token": { + "decimals": 18, + "symbol": "DOUGH" + }, + "isSC": {} + }, + "0x444444444444c1a66f394025ac839a535246fcc8": { + "name": "GENI token contract", + "address": "0x444444444444c1a66f394025ac839a535246fcc8", + "token": { + "decimals": 9, + "symbol": "GENI" + }, + "isSC": {} + }, + "0x0edf9bc41bbc1354c70e2107f80c42cae7fbbca8": { + "name": "STRM token contract", + "address": "0x0edf9bc41bbc1354c70e2107f80c42cae7fbbca8", + "token": { + "decimals": 18, + "symbol": "STRM" + }, + "isSC": {} + }, + "0x52a047ee205701895ee06a375492490ec9c597ce": { + "name": "PULSE token contract", + "address": "0x52a047ee205701895ee06a375492490ec9c597ce", + "token": { + "decimals": 18, + "symbol": "PULSE" + }, + "isSC": {} + }, + "0xb04bf60e468743418e87291d7c9301a5299d984d": { + "name": "4SHIBA token contract", + "address": "0xb04bf60e468743418e87291d7c9301a5299d984d", + "token": { + "decimals": 18, + "symbol": "4SHIBA" + }, + "isSC": {} + }, + "0xfeb6d5238ed8f1d59dcab2db381aa948e625966d": { + "name": "DGTV token contract", + "address": "0xfeb6d5238ed8f1d59dcab2db381aa948e625966d", + "token": { + "decimals": 18, + "symbol": "DGTV" + }, + "isSC": {} + }, + "0xe9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5": { + "name": "ZENF token contract", + "address": "0xe9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5", + "token": { + "decimals": 18, + "symbol": "ZENF" + }, + "isSC": {} + }, + "0x8928f8d41377856ddf099d23b260375d178e5677": { + "name": "RAKE token contract", + "address": "0x8928f8d41377856ddf099d23b260375d178e5677", + "token": { + "decimals": 18, + "symbol": "RAKE" + }, + "isSC": {} + }, + "0xf6c0aa7ebfe9992200c67e5388e4f42da49e1783": { + "name": "USD1 token contract", + "address": "0xf6c0aa7ebfe9992200c67e5388e4f42da49e1783", + "token": { + "decimals": 2, + "symbol": "USD1" + }, + "isSC": {} + }, + "0xb10cc888cb2cce7036f4c7ecad8a57da16161338": { + "name": "SWITCH token contract", + "address": "0xb10cc888cb2cce7036f4c7ecad8a57da16161338", + "token": { + "decimals": 8, + "symbol": "SWITCH" + }, + "isSC": {} + }, + "0x269616d549d7e8eaa82dfb17028d0b212d11232a": { + "name": "PUNK token contract", + "address": "0x269616d549d7e8eaa82dfb17028d0b212d11232a", + "token": { + "decimals": 18, + "symbol": "PUNK" + }, + "isSC": {} + }, + "0x368c5290b13caa10284db58b4ad4f3e9ee8bf4c9": { + "name": "KKO token contract", + "address": "0x368c5290b13caa10284db58b4ad4f3e9ee8bf4c9", + "token": { + "decimals": 18, + "symbol": "KKO" + }, + "isSC": {} + }, + "0xbc6da0fe9ad5f3b0d58160288917aa56653660e9": { + "name": "ALUSD token contract", + "address": "0xbc6da0fe9ad5f3b0d58160288917aa56653660e9", + "token": { + "decimals": 18, + "symbol": "ALUSD" + }, + "isSC": {} + }, + "0x74faab6986560fd1140508e4266d8a7b87274ffd": { + "name": "HDAO token contract", + "address": "0x74faab6986560fd1140508e4266d8a7b87274ffd", + "token": { + "decimals": 18, + "symbol": "HDAO" + }, + "isSC": {} + }, + "0x9ab165d795019b6d8b3e971dda91071421305e5a": { + "name": "AOA token contract", + "address": "0x9ab165d795019b6d8b3e971dda91071421305e5a", + "token": { + "decimals": 18, + "symbol": "AOA" + }, + "isSC": {} + }, + "0x8e1308f4808788767a864eee9a4927e38c790352": { + "name": "PHYSICS token contract", + "address": "0x8e1308f4808788767a864eee9a4927e38c790352", + "token": { + "decimals": 18, + "symbol": "PHYSICS" + }, + "isSC": {} + }, + "0x64b78325d7495d6d4be92f234fa3f3b8d8964b8b": { + "name": "SHOP token contract", + "address": "0x64b78325d7495d6d4be92f234fa3f3b8d8964b8b", + "token": { + "decimals": 18, + "symbol": "SHOP" + }, + "isSC": {} + }, + "0x8b937af714ac7e2129bd33d93641f52b665ca352": { + "name": "JIZZ token contract", + "address": "0x8b937af714ac7e2129bd33d93641f52b665ca352", + "token": { + "decimals": 18, + "symbol": "JIZZ" + }, + "isSC": {} + }, + "0xfa93660c3f6a848556bb8e265f994160a1f2b289": { + "name": "CBT token contract", + "address": "0xfa93660c3f6a848556bb8e265f994160a1f2b289", + "token": { + "decimals": 18, + "symbol": "CBT" + }, + "isSC": {} + }, + "0x42dbbd5ae373fea2fc320f62d44c058522bb3758": { + "name": "MEM token contract", + "address": "0x42dbbd5ae373fea2fc320f62d44c058522bb3758", + "token": { + "decimals": 18, + "symbol": "MEM" + }, + "isSC": {} + }, + "0xb2e96a63479c2edd2fd62b382c89d5ca79f572d3": { + "name": "ZNN token contract", + "address": "0xb2e96a63479c2edd2fd62b382c89d5ca79f572d3", + "token": { + "decimals": 8, + "symbol": "ZNN" + }, + "isSC": {} + }, + "0xb1c064c3f2908f741c9dea4afc5773238b53e6cc": { + "name": "XRP token contract", + "address": "0xb1c064c3f2908f741c9dea4afc5773238b53e6cc", + "token": { + "decimals": 9, + "symbol": "XRP" + }, + "isSC": {} + }, + "0x64d91f12ece7362f91a6f8e7940cd55f05060b92": { + "name": "ASH token contract", + "address": "0x64d91f12ece7362f91a6f8e7940cd55f05060b92", + "token": { + "decimals": 18, + "symbol": "ASH" + }, + "isSC": {} + }, + "0xf482d79ae6e8725c199213fc909d6bc30df62815": { + "name": "RIWA token contract", + "address": "0xf482d79ae6e8725c199213fc909d6bc30df62815", + "token": { + "decimals": 9, + "symbol": "RIWA" + }, + "isSC": {} + }, + "0xa4cb3ef5f41a4d89d6fced22ea8a1c57957629aa": { + "name": "MR token contract", + "address": "0xa4cb3ef5f41a4d89d6fced22ea8a1c57957629aa", + "token": { + "decimals": 18, + "symbol": "MR" + }, + "isSC": {} + }, + "0xf256cc7847e919fac9b808cc216cac87ccf2f47a": { + "name": "AXSUSHI token contract", + "address": "0xf256cc7847e919fac9b808cc216cac87ccf2f47a", + "token": { + "decimals": 18, + "symbol": "AXSUSHI" + }, + "isSC": {} + }, + "0xffd822149fa6749176c7a1424e71a417f26189c8": { + "name": "THING token contract", + "address": "0xffd822149fa6749176c7a1424e71a417f26189c8", + "token": { + "decimals": 18, + "symbol": "THING" + }, + "isSC": {} + }, + "0xab97bf5fb097e503bba2c86b7c56c0059ac0dc06": { + "name": "CHAN token contract", + "address": "0xab97bf5fb097e503bba2c86b7c56c0059ac0dc06", + "token": { + "decimals": 18, + "symbol": "CHAN" + }, + "isSC": {} + }, + "0x8e235f491ae66b82296d58332adc2a021c449c10": { + "name": "TIPJA token contract", + "address": "0x8e235f491ae66b82296d58332adc2a021c449c10", + "token": { + "decimals": 18, + "symbol": "TIPJA" + }, + "isSC": {} + }, + "0xf98ab0874b13a7fdc39d7295dedd49850a5d426b": { + "name": "KIRA token contract", + "address": "0xf98ab0874b13a7fdc39d7295dedd49850a5d426b", + "token": { + "decimals": 8, + "symbol": "KIRA" + }, + "isSC": {} + }, + "0xebb82c932759b515b2efc1cfbb6bf2f6dbace404": { + "name": "SHARES token contract", + "address": "0xebb82c932759b515b2efc1cfbb6bf2f6dbace404", + "token": { + "decimals": 18, + "symbol": "SHARES" + }, + "isSC": {} + }, + "0xa0117792d4b100fd329b37e8ab4181df8a5b3326": { + "name": "BREPE token contract", + "address": "0xa0117792d4b100fd329b37e8ab4181df8a5b3326", + "token": { + "decimals": 18, + "symbol": "BREPE" + }, + "isSC": {} + }, + "0xf0610eb7d8ee12d59412da32625d5e273e78ff0b": { + "name": "MDEX token contract", + "address": "0xf0610eb7d8ee12d59412da32625d5e273e78ff0b", + "token": { + "decimals": 18, + "symbol": "MDEX" + }, + "isSC": {} + }, + "0x3f817b28da4940f018c6b5c0a11c555ebb1264f9": { + "name": "A3A token contract", + "address": "0x3f817b28da4940f018c6b5c0a11c555ebb1264f9", + "token": { + "decimals": 18, + "symbol": "A3A" + }, + "isSC": {} + }, + "0x33e80a92a9ea73dd02f6e732d1702d58c68388ca": { + "name": "XB token contract", + "address": "0x33e80a92a9ea73dd02f6e732d1702d58c68388ca", + "token": { + "decimals": 2, + "symbol": "XB" + }, + "isSC": {} + }, + "0x0463af01962893f585f2326057af48e53d4dd7ed": { + "name": "HAPPYCAT token contract", + "address": "0x0463af01962893f585f2326057af48e53d4dd7ed", + "token": { + "decimals": 18, + "symbol": "HAPPYCAT" + }, + "isSC": {} + }, + "0x428487ad75dc9197cccb496629ab516974329dc1": { + "name": "RAEL token contract", + "address": "0x428487ad75dc9197cccb496629ab516974329dc1", + "token": { + "decimals": 18, + "symbol": "RAEL" + }, + "isSC": {} + }, + "0x79b87d52a03ed26a19c1914be4ce37f812e2056c": { + "name": "USP token contract", + "address": "0x79b87d52a03ed26a19c1914be4ce37f812e2056c", + "token": { + "decimals": 18, + "symbol": "USP" + }, + "isSC": {} + }, + "0xe2f2a5c287993345a840db3b0845fbc70f5935a5": { + "name": "mStable USD", + "address": "0xe2f2a5c287993345a840db3b0845fbc70f5935a5", + "token": { + "decimals": 18, + "symbol": "mUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mUSD.svg" + }, + "0x1f1f26c966f483997728bed0f9814938b2b5e294": { + "name": "MEOWL token contract", + "address": "0x1f1f26c966f483997728bed0f9814938b2b5e294", + "token": { + "decimals": 18, + "symbol": "MEOWL" + }, + "isSC": {} + }, + "0xb5b1b659da79a2507c27aad509f15b4874edc0cc": { + "name": "DUST token contract", + "address": "0xb5b1b659da79a2507c27aad509f15b4874edc0cc", + "token": { + "decimals": 9, + "symbol": "DUST" + }, + "isSC": {} + }, + "0x6d5777dce2541175adf6d49cadd666f3ab0ac142": { + "name": "CARTMAN token contract", + "address": "0x6d5777dce2541175adf6d49cadd666f3ab0ac142", + "token": { + "decimals": 18, + "symbol": "CARTMAN" + }, + "isSC": {} + }, + "0x3be65bd36c1ad28d33acc1c9dd8338a2706ca000": { + "name": "KAIROS token contract", + "address": "0x3be65bd36c1ad28d33acc1c9dd8338a2706ca000", + "token": { + "decimals": 9, + "symbol": "KAIROS" + }, + "isSC": {} + }, + "0x31ea0de8119307aa264bb4b38727aab4e36b074f": { + "name": "STORE token contract", + "address": "0x31ea0de8119307aa264bb4b38727aab4e36b074f", + "token": { + "decimals": 18, + "symbol": "STORE" + }, + "isSC": {} + }, + "0xdc5e9445169c73cf21e1da0b270e8433cac69959": { + "name": "ETHEREUM token contract", + "address": "0xdc5e9445169c73cf21e1da0b270e8433cac69959", + "token": { + "decimals": 9, + "symbol": "ETHEREUM" + }, + "isSC": {} + }, + "0xe2f98dd7506807ef82d1988aa77c320bc52f8df4": { + "name": "HODL token contract", + "address": "0xe2f98dd7506807ef82d1988aa77c320bc52f8df4", + "token": { + "decimals": 9, + "symbol": "HODL" + }, + "isSC": {} + }, + "0x0563dce613d559a47877ffd1593549fb9d3510d6": { + "name": "SUPERBID token contract", + "address": "0x0563dce613d559a47877ffd1593549fb9d3510d6", + "token": { + "decimals": 18, + "symbol": "SUPERBID" + }, + "isSC": {} + }, + "0x72adadb447784dd7ab1f472467750fc485e4cb2d": { + "name": "WRC token contract", + "address": "0x72adadb447784dd7ab1f472467750fc485e4cb2d", + "token": { + "decimals": 6, + "symbol": "WRC" + }, + "isSC": {} + }, + "0x0b9ae6b1d4f0eeed904d1cef68b9bd47499f3fff": { + "name": "NATI token contract", + "address": "0x0b9ae6b1d4f0eeed904d1cef68b9bd47499f3fff", + "token": { + "decimals": 18, + "symbol": "NATI" + }, + "isSC": {} + }, + "0x450e7f6e3a2f247a51b98c39297a9a5bfbdb3170": { + "name": "EGT token contract", + "address": "0x450e7f6e3a2f247a51b98c39297a9a5bfbdb3170", + "token": { + "decimals": 9, + "symbol": "EGT" + }, + "isSC": {} + }, + "0xb777eb033557490abb7fb8f3948000826423ea07": { + "name": "CHAD token contract", + "address": "0xb777eb033557490abb7fb8f3948000826423ea07", + "token": { + "decimals": 18, + "symbol": "CHAD" + }, + "isSC": {} + }, + "0xe7ef051c6ea1026a70967e8f04da143c67fa4e1f": { + "name": "VETME token contract", + "address": "0xe7ef051c6ea1026a70967e8f04da143c67fa4e1f", + "token": { + "decimals": 9, + "symbol": "VETME" + }, + "isSC": {} + }, + "0x244b36af168cc3b3a24b1e6ade3a90817cf07d22": { + "name": "COPYBOT token contract", + "address": "0x244b36af168cc3b3a24b1e6ade3a90817cf07d22", + "token": { + "decimals": 18, + "symbol": "COPYBOT" + }, + "isSC": {} + }, + "0xbea0000029ad1c77d3d5d23ba2d8893db9d1efab": { + "name": "BEAN token contract", + "address": "0xbea0000029ad1c77d3d5d23ba2d8893db9d1efab", + "token": { + "decimals": 6, + "symbol": "BEAN" + }, + "isSC": {} + }, + "0xe925aa77d51746b865e5c05165a879820cb4b720": { + "name": "CCASH token contract", + "address": "0xe925aa77d51746b865e5c05165a879820cb4b720", + "token": { + "decimals": 18, + "symbol": "CCASH" + }, + "isSC": {} + }, + "0x668d78571f124415581b38d32fa9a16f1aaa8417": { + "name": "1EX token contract", + "address": "0x668d78571f124415581b38d32fa9a16f1aaa8417", + "token": { + "decimals": 18, + "symbol": "1EX" + }, + "isSC": {} + }, + "0x7a9b4f64712aac0cc4a0ae78b35f813c479ec46f": { + "name": "MONKE token contract", + "address": "0x7a9b4f64712aac0cc4a0ae78b35f813c479ec46f", + "token": { + "decimals": 18, + "symbol": "MONKE" + }, + "isSC": {} + }, + "0x9f4a8167ca311a87b0d03aafa44e0d2c3d8a3631": { + "name": "BBOX token contract", + "address": "0x9f4a8167ca311a87b0d03aafa44e0d2c3d8a3631", + "token": { + "decimals": 18, + "symbol": "BBOX" + }, + "isSC": {} + }, + "0x77ebcf0659bbf4e68d8ce6d84bb25c5cde207b97": { + "name": "MOOX token contract", + "address": "0x77ebcf0659bbf4e68d8ce6d84bb25c5cde207b97", + "token": { + "decimals": 18, + "symbol": "MOOX" + }, + "isSC": {} + }, + "0xf2cdf38e24738ba379ffa38d47bc88a941df5627": { + "name": "ALY token contract", + "address": "0xf2cdf38e24738ba379ffa38d47bc88a941df5627", + "token": { + "decimals": 2, + "symbol": "ALY" + }, + "isSC": {} + }, + "0x6692de64716a177c15360d8d010bc522bbc530a0": { + "name": "TNT token contract", + "address": "0x6692de64716a177c15360d8d010bc522bbc530a0", + "token": { + "decimals": 18, + "symbol": "TNT" + }, + "isSC": {} + }, + "0xcc12abe4ff81c9378d670de1b57f8e0dd228d77a": { + "name": "Aave REN", + "address": "0xcc12abe4ff81c9378d670de1b57f8e0dd228d77a", + "token": { + "decimals": 18, + "symbol": "aREN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aREN.svg" + }, + "0x1c001d1c9e8c7b8dc717c714d30b31480ab360f5": { + "name": "GTX token contract", + "address": "0x1c001d1c9e8c7b8dc717c714d30b31480ab360f5", + "token": { + "decimals": 18, + "symbol": "GTX" + }, + "isSC": {} + }, + "0xbc391e78b0ea0d1db04890732742494e7fbfc118": { + "name": "VANA token contract", + "address": "0xbc391e78b0ea0d1db04890732742494e7fbfc118", + "token": { + "decimals": 18, + "symbol": "VANA" + }, + "isSC": {} + }, + "0xf8c76dbea329ec4fa987afc514f805b21b249d79": { + "name": "L token contract", + "address": "0xf8c76dbea329ec4fa987afc514f805b21b249d79", + "token": { + "decimals": 18, + "symbol": "L" + }, + "isSC": {} + }, + "0x272f97b7a56a387ae942350bbc7df5700f8a4576": { + "name": "ABAL token contract", + "address": "0x272f97b7a56a387ae942350bbc7df5700f8a4576", + "token": { + "decimals": 18, + "symbol": "ABAL" + }, + "isSC": {} + }, + "0x8526be2379e853d5cf02f9823bb9690e1a6ff9e2": { + "name": "HABIBI token contract", + "address": "0x8526be2379e853d5cf02f9823bb9690e1a6ff9e2", + "token": { + "decimals": 18, + "symbol": "HABIBI" + }, + "isSC": {} + }, + "0x89bd2e7e388fab44ae88bef4e1ad12b4f1e0911c": { + "name": "NUX token contract", + "address": "0x89bd2e7e388fab44ae88bef4e1ad12b4f1e0911c", + "token": { + "decimals": 18, + "symbol": "NUX" + }, + "isSC": {} + }, + "0x43e54c2e7b3e294de3a155785f52ab49d87b9922": { + "name": "ASDCRV token contract", + "address": "0x43e54c2e7b3e294de3a155785f52ab49d87b9922", + "token": { + "decimals": 18, + "symbol": "ASDCRV" + }, + "isSC": {} + }, + "0x3e70f6806171873d17d4bfc984a6f9d20f5a9018": { + "name": "COIN token contract", + "address": "0x3e70f6806171873d17d4bfc984a6f9d20f5a9018", + "token": { + "decimals": 18, + "symbol": "COIN" + }, + "isSC": {} + }, + "0x819c1a1568934ee59d9f3c8b9640908556c44140": { + "name": "HOBBES token contract", + "address": "0x819c1a1568934ee59d9f3c8b9640908556c44140", + "token": { + "decimals": 18, + "symbol": "HOBBES" + }, + "isSC": {} + }, + "0x05ec93c0365baaeabf7aeffb0972ea7ecdd39cf1": { + "name": "Aave BAT", + "address": "0x05ec93c0365baaeabf7aeffb0972ea7ecdd39cf1", + "token": { + "decimals": 18, + "symbol": "aBAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aBAT.svg" + }, + "0xce0e16a9996af71180c5967bd79885c544b50a55": { + "name": "PUMP token contract", + "address": "0xce0e16a9996af71180c5967bd79885c544b50a55", + "token": { + "decimals": 18, + "symbol": "PUMP" + }, + "isSC": {} + }, + "0x3db045814d0a29d831fe38055cb97a956ef7cafb": { + "name": "REMIT token contract", + "address": "0x3db045814d0a29d831fe38055cb97a956ef7cafb", + "token": { + "decimals": 18, + "symbol": "REMIT" + }, + "isSC": {} + }, + "0xb7446b185085e019f0008f1d338de26486a4db10": { + "name": "BULLMOON token contract", + "address": "0xb7446b185085e019f0008f1d338de26486a4db10", + "token": { + "decimals": 18, + "symbol": "BULLMOON" + }, + "isSC": {} + }, + "0x7a83ff237e7870d8d6c3485920ebe654d2841315": { + "name": "HIOD token contract", + "address": "0x7a83ff237e7870d8d6c3485920ebe654d2841315", + "token": { + "decimals": 18, + "symbol": "HIOD" + }, + "isSC": {} + }, + "0xd8684adc4664bc2a0c78ddc8657dc005e804af15": { + "name": "CCD token contract", + "address": "0xd8684adc4664bc2a0c78ddc8657dc005e804af15", + "token": { + "decimals": 18, + "symbol": "CCD" + }, + "isSC": {} + }, + "0x51a59a02ba906194285e81eb1f98ffa28e7cf4c9": { + "name": "PEPE token contract", + "address": "0x51a59a02ba906194285e81eb1f98ffa28e7cf4c9", + "token": { + "decimals": 9, + "symbol": "PEPE" + }, + "isSC": {} + }, + "0xc477d038d5420c6a9e0b031712f61c5120090de9": { + "name": "Boson Token", + "address": "0xc477d038d5420c6a9e0b031712f61c5120090de9", + "token": { + "decimals": 18, + "symbol": "BOSON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/boson.svg" + }, + "0xcfb65079138878b9dd29b99c151b286464f81276": { + "name": "BOBI token contract", + "address": "0xcfb65079138878b9dd29b99c151b286464f81276", + "token": { + "decimals": 18, + "symbol": "BOBI" + }, + "isSC": {} + }, + "0x61035ed28081c1acc38e399c416bfc08fd6e73a1": { + "name": "FROBOT token contract", + "address": "0x61035ed28081c1acc38e399c416bfc08fd6e73a1", + "token": { + "decimals": 9, + "symbol": "FROBOT" + }, + "isSC": {} + }, + "0x23feef978f2f8e9aeb26028d09b5d303b6c6a057": { + "name": "SACA token contract", + "address": "0x23feef978f2f8e9aeb26028d09b5d303b6c6a057", + "token": { + "decimals": 18, + "symbol": "SACA" + }, + "isSC": {} + }, + "0x697a79af2de4af9e9aa0d08905374556ad1353bb": { + "name": "NINA token contract", + "address": "0x697a79af2de4af9e9aa0d08905374556ad1353bb", + "token": { + "decimals": 18, + "symbol": "NINA" + }, + "isSC": {} + }, + "0x6286a9e6f7e745a6d884561d88f94542d6715698": { + "name": "TECH token contract", + "address": "0x6286a9e6f7e745a6d884561d88f94542d6715698", + "token": { + "decimals": 18, + "symbol": "TECH" + }, + "isSC": {} + }, + "0x8a3c710e41cd95799c535f22dbae371d7c858651": { + "name": "XLRT token contract", + "address": "0x8a3c710e41cd95799c535f22dbae371d7c858651", + "token": { + "decimals": 18, + "symbol": "XLRT" + }, + "isSC": {} + }, + "0xe1ba0fb44ccb0d11b80f92f4f8ed94ca3ff51d00": { + "name": "ABAT token contract", + "address": "0xe1ba0fb44ccb0d11b80f92f4f8ed94ca3ff51d00", + "token": { + "decimals": 18, + "symbol": "ABAT" + }, + "isSC": {} + }, + "0x5a8291d0f1836726aea75b979a92a47be1ff0cba": { + "name": "CRMT token contract", + "address": "0x5a8291d0f1836726aea75b979a92a47be1ff0cba", + "token": { + "decimals": 18, + "symbol": "CRMT" + }, + "isSC": {} + }, + "0x1782bb88ae0aa07031bc05bbe2bd4150c9da223a": { + "name": "CLICKART token contract", + "address": "0x1782bb88ae0aa07031bc05bbe2bd4150c9da223a", + "token": { + "decimals": 9, + "symbol": "CLICKART" + }, + "isSC": {} + }, + "0x328c4c80bc7aca0834db37e6600a6c49e12da4de": { + "name": "ASNX token contract", + "address": "0x328c4c80bc7aca0834db37e6600a6c49e12da4de", + "token": { + "decimals": 18, + "symbol": "ASNX" + }, + "isSC": {} + }, + "0xbfba57800bce200915499078289299c86af4a379": { + "name": "OBTC token contract", + "address": "0xbfba57800bce200915499078289299c86af4a379", + "token": { + "decimals": 18, + "symbol": "OBTC" + }, + "isSC": {} + }, + "0xebdb54e76bfec9ab4e06ccf6e484e4126f81befc": { + "name": "HON token contract", + "address": "0xebdb54e76bfec9ab4e06ccf6e484e4126f81befc", + "token": { + "decimals": 18, + "symbol": "HON" + }, + "isSC": {} + }, + "0x4efce4c758ddfb3911a1a1282a29ce0bdb16ef86": { + "name": " token contract", + "address": "0x4efce4c758ddfb3911a1a1282a29ce0bdb16ef86", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x70008f18fc58928dce982b0a69c2c21ff80dca54": { + "name": "X7R token contract", + "address": "0x70008f18fc58928dce982b0a69c2c21ff80dca54", + "token": { + "decimals": 18, + "symbol": "X7R" + }, + "isSC": {} + }, + "0x7a786dac1f315c8a0e9962172ad8ae0c04d9c9b6": { + "name": "MEMD token contract", + "address": "0x7a786dac1f315c8a0e9962172ad8ae0c04d9c9b6", + "token": { + "decimals": 18, + "symbol": "MEMD" + }, + "isSC": {} + }, + "0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a": { + "name": "VALOR token contract", + "address": "0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a", + "token": { + "decimals": 18, + "symbol": "VALOR" + }, + "isSC": {} + }, + "0xd230c2c30f6b406f63f2826064034b2002478d1b": { + "name": "FROGO token contract", + "address": "0xd230c2c30f6b406f63f2826064034b2002478d1b", + "token": { + "decimals": 18, + "symbol": "FROGO" + }, + "isSC": {} + }, + "0x8221022401843fecaab247c88dd9960071ce7058": { + "name": "SCRATCH token contract", + "address": "0x8221022401843fecaab247c88dd9960071ce7058", + "token": { + "decimals": 18, + "symbol": "SCRATCH" + }, + "isSC": {} + }, + "0xe2353069f71a27bbbe66eeabff05de109c7d5e19": { + "name": "SEED token contract", + "address": "0xe2353069f71a27bbbe66eeabff05de109c7d5e19", + "token": { + "decimals": 18, + "symbol": "SEED" + }, + "isSC": {} + }, + "0x48fb253446873234f2febbf9bdeaa72d9d387f94": { + "name": "VBNT token contract", + "address": "0x48fb253446873234f2febbf9bdeaa72d9d387f94", + "token": { + "decimals": 18, + "symbol": "VBNT" + }, + "isSC": {} + }, + "0xdfe691f37b6264a90ff507eb359c45d55037951c": { + "name": "KARMA token contract", + "address": "0xdfe691f37b6264a90ff507eb359c45d55037951c", + "token": { + "decimals": 4, + "symbol": "KARMA" + }, + "isSC": {} + }, + "0x3cbc780d2934d55a06069e837fabd3e6fc23dab0": { + "name": "DBX token contract", + "address": "0x3cbc780d2934d55a06069e837fabd3e6fc23dab0", + "token": { + "decimals": 18, + "symbol": "DBX" + }, + "isSC": {} + }, + "0xe308a6a13a74fae24f542a6c4c3d6fc2cd8e664a": { + "name": "ROME token contract", + "address": "0xe308a6a13a74fae24f542a6c4c3d6fc2cd8e664a", + "token": { + "decimals": 18, + "symbol": "ROME" + }, + "isSC": {} + }, + "0xa5e0b9118ce23dd1eec52cd93cf59e8ea3b3ff56": { + "name": "JUDAS token contract", + "address": "0xa5e0b9118ce23dd1eec52cd93cf59e8ea3b3ff56", + "token": { + "decimals": 18, + "symbol": "JUDAS" + }, + "isSC": {} + }, + "0x32a5fc22e20903e78171977359b500060b7316bf": { + "name": "PAG token contract", + "address": "0x32a5fc22e20903e78171977359b500060b7316bf", + "token": { + "decimals": 18, + "symbol": "PAG" + }, + "isSC": {} + }, + "0x20c36f062a31865bed8a5b1e512d9a1a20aa333a": { + "name": "DFD token contract", + "address": "0x20c36f062a31865bed8a5b1e512d9a1a20aa333a", + "token": { + "decimals": 18, + "symbol": "DFD" + }, + "isSC": {} + }, + "0x3294395e62f4eb6af3f1fcf89f5602d90fb3ef69": { + "name": "CELO token contract", + "address": "0x3294395e62f4eb6af3f1fcf89f5602d90fb3ef69", + "token": { + "decimals": 18, + "symbol": "CELO" + }, + "isSC": {} + }, + "0x1142866f451d9d5281c5c8349a332bd338e552a1": { + "name": "SILKROAD token contract", + "address": "0x1142866f451d9d5281c5c8349a332bd338e552a1", + "token": { + "decimals": 18, + "symbol": "SILKROAD" + }, + "isSC": {} + }, + "0xcda4e840411c00a614ad9205caec807c7458a0e3": { + "name": "UFI token contract", + "address": "0xcda4e840411c00a614ad9205caec807c7458a0e3", + "token": { + "decimals": 18, + "symbol": "UFI" + }, + "isSC": {} + }, + "0xbcbf09b4b83eb3893d58f0665d21460c04e39d8e": { + "name": "SLOCK token contract", + "address": "0xbcbf09b4b83eb3893d58f0665d21460c04e39d8e", + "token": { + "decimals": 18, + "symbol": "SLOCK" + }, + "isSC": {} + }, + "0x9afb950948c2370975fb91a441f36fdc02737cd4": { + "name": "HFIL token contract", + "address": "0x9afb950948c2370975fb91a441f36fdc02737cd4", + "token": { + "decimals": 18, + "symbol": "HFIL" + }, + "isSC": {} + }, + "0x4ad0b81f92b16624bbcf46fc0030cfbbf8d02376": { + "name": "UDAI token contract", + "address": "0x4ad0b81f92b16624bbcf46fc0030cfbbf8d02376", + "token": { + "decimals": 18, + "symbol": "UDAI" + }, + "isSC": {} + }, + "0xbf9e72eeb5adb8b558334c8672950b7a379d4266": { + "name": "CUBT token contract", + "address": "0xbf9e72eeb5adb8b558334c8672950b7a379d4266", + "token": { + "decimals": 18, + "symbol": "CUBT" + }, + "isSC": {} + }, + "0x32a7c02e79c4ea1008dd6564b35f131428673c41": { + "name": "CRUST", + "address": "0x32a7c02e79c4ea1008dd6564b35f131428673c41", + "token": { + "decimals": 18, + "symbol": "CRU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/crust.svg" + }, + "0xadd5e881984783dd432f80381fb52f45b53f3e70": { + "name": "VITE token contract", + "address": "0xadd5e881984783dd432f80381fb52f45b53f3e70", + "token": { + "decimals": 18, + "symbol": "VITE" + }, + "isSC": {} + }, + "0x93dfaf57d986b9ca77df9376c50878e013d9c7c8": { + "name": "RARE token contract", + "address": "0x93dfaf57d986b9ca77df9376c50878e013d9c7c8", + "token": { + "decimals": 18, + "symbol": "RARE" + }, + "isSC": {} + }, + "0xb48361032956d52f1ade21c73c273644f4ea24ca": { + "name": "MOONERIUM token contract", + "address": "0xb48361032956d52f1ade21c73c273644f4ea24ca", + "token": { + "decimals": 18, + "symbol": "MOONERIUM" + }, + "isSC": {} + }, + "0x4fabf135bcf8111671870d4399af739683198f96": { + "name": "XVC token contract", + "address": "0x4fabf135bcf8111671870d4399af739683198f96", + "token": { + "decimals": 18, + "symbol": "XVC" + }, + "isSC": {} + }, + "0xfe1b621235227bfa14ed81be2ba4e5e4447b52c0": { + "name": "ORT token contract", + "address": "0xfe1b621235227bfa14ed81be2ba4e5e4447b52c0", + "token": { + "decimals": 9, + "symbol": "ORT" + }, + "isSC": {} + }, + "0xd115a61a25c059c78cd34b97fab7ab25dfc84bc3": { + "name": "RAPTOR token contract", + "address": "0xd115a61a25c059c78cd34b97fab7ab25dfc84bc3", + "token": { + "decimals": 9, + "symbol": "RAPTOR" + }, + "isSC": {} + }, + "0xbed7d999f1d71ac70c263f64c7c7e009d691be2e": { + "name": "MYRC token contract", + "address": "0xbed7d999f1d71ac70c263f64c7c7e009d691be2e", + "token": { + "decimals": 18, + "symbol": "MYRC" + }, + "isSC": {} + }, + "0x6c3f90f043a72fa612cbac8115ee7e52bde6e490": { + "name": "3CRV token contract", + "address": "0x6c3f90f043a72fa612cbac8115ee7e52bde6e490", + "token": { + "decimals": 18, + "symbol": "3CRV" + }, + "isSC": {} + }, + "0x0e0989b1f9b8a38983c2ba8053269ca62ec9b195": { + "name": "POE token contract", + "address": "0x0e0989b1f9b8a38983c2ba8053269ca62ec9b195", + "token": { + "decimals": 8, + "symbol": "POE" + }, + "isSC": {} + }, + "0x15c1cab705b9ddb9ffeeea608ed8bafcdd4c0396": { + "name": "HXA token contract", + "address": "0x15c1cab705b9ddb9ffeeea608ed8bafcdd4c0396", + "token": { + "decimals": 18, + "symbol": "HXA" + }, + "isSC": {} + }, + "0x87931e7ad81914e7898d07c68f145fc0a553d8fb": { + "name": "WIZARD token contract", + "address": "0x87931e7ad81914e7898d07c68f145fc0a553d8fb", + "token": { + "decimals": 18, + "symbol": "WIZARD" + }, + "isSC": {} + }, + "0x87a92428bbc876d463c21c8e51b903f127d9a9f4": { + "name": "AUC token contract", + "address": "0x87a92428bbc876d463c21c8e51b903f127d9a9f4", + "token": { + "decimals": 18, + "symbol": "AUC" + }, + "isSC": {} + }, + "0x98e1f56b334438e3f0bde22d92f5bfd746e0631f": { + "name": "ILUM token contract", + "address": "0x98e1f56b334438e3f0bde22d92f5bfd746e0631f", + "token": { + "decimals": 18, + "symbol": "ILUM" + }, + "isSC": {} + }, + "0x9e18d5bab2fa94a6a95f509ecb38f8f68322abd3": { + "name": "OMIKAMI token contract", + "address": "0x9e18d5bab2fa94a6a95f509ecb38f8f68322abd3", + "token": { + "decimals": 9, + "symbol": "OMIKAMI" + }, + "isSC": {} + }, + "0x8d85b9553896bd8159e608cb958628e01ed10916": { + "name": "STONED token contract", + "address": "0x8d85b9553896bd8159e608cb958628e01ed10916", + "token": { + "decimals": 9, + "symbol": "STONED" + }, + "isSC": {} + }, + "0xe97db8503dd3e3eb0286aafc50327c598efdb578": { + "name": "JINKO token contract", + "address": "0xe97db8503dd3e3eb0286aafc50327c598efdb578", + "token": { + "decimals": 18, + "symbol": "JINKO" + }, + "isSC": {} + }, + "0x1456688345527be1f37e9e627da0837d6f08c925": { + "name": "USDP token contract", + "address": "0x1456688345527be1f37e9e627da0837d6f08c925", + "token": { + "decimals": 18, + "symbol": "USDP" + }, + "isSC": {} + }, + "0x83f5b9c25cc8fce0a7d4a1bda904bf13cfcdd9da": { + "name": "UDEGODS token contract", + "address": "0x83f5b9c25cc8fce0a7d4a1bda904bf13cfcdd9da", + "token": { + "decimals": 18, + "symbol": "UDEGODS" + }, + "isSC": {} + }, + "0x52b43e3aa47612a80114ac5549ff89c6a64d5f22": { + "name": "RAMBE token contract", + "address": "0x52b43e3aa47612a80114ac5549ff89c6a64d5f22", + "token": { + "decimals": 18, + "symbol": "RAMBE" + }, + "isSC": {} + }, + "0x1e971b5b21367888239f00da16f0a6b0effecb03": { + "name": "LEEROY token contract", + "address": "0x1e971b5b21367888239f00da16f0a6b0effecb03", + "token": { + "decimals": 18, + "symbol": "LEEROY" + }, + "isSC": {} + }, + "0x6d52dfefb16bb9cdc78bfca09061e44574886626": { + "name": "CPU token contract", + "address": "0x6d52dfefb16bb9cdc78bfca09061e44574886626", + "token": { + "decimals": 18, + "symbol": "CPU" + }, + "isSC": {} + }, + "0xc0a22849fa6122594e605aec943413734137daab": { + "name": "VAULT token contract", + "address": "0xc0a22849fa6122594e605aec943413734137daab", + "token": { + "decimals": 18, + "symbol": "VAULT" + }, + "isSC": {} + }, + "0xd87de4ccef2c2fe651bc4d130cb1a365248f21fa": { + "name": "LYFE token contract", + "address": "0xd87de4ccef2c2fe651bc4d130cb1a365248f21fa", + "token": { + "decimals": 18, + "symbol": "LYFE" + }, + "isSC": {} + }, + "0xe410fbd0977c8a2f276283425de488129f7faff9": { + "name": "SES token contract", + "address": "0xe410fbd0977c8a2f276283425de488129f7faff9", + "token": { + "decimals": 9, + "symbol": "SES" + }, + "isSC": {} + }, + "0x355a824bea1adc22733978a3748271e1bbb34130": { + "name": "NEPT token contract", + "address": "0x355a824bea1adc22733978a3748271e1bbb34130", + "token": { + "decimals": 18, + "symbol": "NEPT" + }, + "isSC": {} + }, + "0x29de856ee1e2b281c9f6dd3c670272e7c6ea63eb": { + "name": "GROGE token contract", + "address": "0x29de856ee1e2b281c9f6dd3c670272e7c6ea63eb", + "token": { + "decimals": 18, + "symbol": "GROGE" + }, + "isSC": {} + }, + "0xfcaf0e4498e78d65526a507360f755178b804ba8": { + "name": "SHIB token contract", + "address": "0xfcaf0e4498e78d65526a507360f755178b804ba8", + "token": { + "decimals": 18, + "symbol": "SHIB" + }, + "isSC": {} + }, + "0x3aada3e213abf8529606924d8d1c55cbdc70bf74": { + "name": "XMON token contract", + "address": "0x3aada3e213abf8529606924d8d1c55cbdc70bf74", + "token": { + "decimals": 18, + "symbol": "XMON" + }, + "isSC": {} + }, + "0x69cbaf6c147086c3c234385556f8a0c6488d3420": { + "name": "69420 token contract", + "address": "0x69cbaf6c147086c3c234385556f8a0c6488d3420", + "token": { + "decimals": 9, + "symbol": "69420" + }, + "isSC": {} + }, + "0x68c85b9f78f30a0df5ac5723e4e700037f185415": { + "name": "AWO token contract", + "address": "0x68c85b9f78f30a0df5ac5723e4e700037f185415", + "token": { + "decimals": 18, + "symbol": "AWO" + }, + "isSC": {} + }, + "0xa53f9dd70055113e13176e291eddb773f85b2650": { + "name": "ZEUS token contract", + "address": "0xa53f9dd70055113e13176e291eddb773f85b2650", + "token": { + "decimals": 18, + "symbol": "ZEUS" + }, + "isSC": {} + }, + "0xc0eb85285d83217cd7c891702bcbc0fc401e2d9d": { + "name": "HVN token contract", + "address": "0xc0eb85285d83217cd7c891702bcbc0fc401e2d9d", + "token": { + "decimals": 8, + "symbol": "HVN" + }, + "isSC": {} + }, + "0x5ac83bfbfcebb3397a40fd259dbe7a4be04237d3": { + "name": "LBT token contract", + "address": "0x5ac83bfbfcebb3397a40fd259dbe7a4be04237d3", + "token": { + "decimals": 18, + "symbol": "LBT" + }, + "isSC": {} + }, + "0xda0c94c73d127ee191955fb46bacd7ff999b2bcd": { + "name": "STANDARD token contract", + "address": "0xda0c94c73d127ee191955fb46bacd7ff999b2bcd", + "token": { + "decimals": 18, + "symbol": "STANDARD" + }, + "isSC": {} + }, + "0xf0655dcee37e5c0b70fffd70d85f88f8edf0aff6": { + "name": "UNIDX token contract", + "address": "0xf0655dcee37e5c0b70fffd70d85f88f8edf0aff6", + "token": { + "decimals": 18, + "symbol": "UNIDX" + }, + "isSC": {} + }, + "0x66f73d0fd4161cfad4302dc145ff994375c13475": { + "name": "DXGM token contract", + "address": "0x66f73d0fd4161cfad4302dc145ff994375c13475", + "token": { + "decimals": 18, + "symbol": "DXGM" + }, + "isSC": {} + }, + "0x85f6eb2bd5a062f5f8560be93fb7147e16c81472": { + "name": "FLY token contract", + "address": "0x85f6eb2bd5a062f5f8560be93fb7147e16c81472", + "token": { + "decimals": 4, + "symbol": "FLY" + }, + "isSC": {} + }, + "0x762fcf5183ae366c0629d0bcd30b40f331496d0f": { + "name": "DICE token contract", + "address": "0x762fcf5183ae366c0629d0bcd30b40f331496d0f", + "token": { + "decimals": 18, + "symbol": "DICE" + }, + "isSC": {} + }, + "0x42a501903afaa1086b5975773375c80e363f4063": { + "name": "CTK token contract", + "address": "0x42a501903afaa1086b5975773375c80e363f4063", + "token": { + "decimals": 8, + "symbol": "CTK" + }, + "isSC": {} + }, + "0x9aaf731799e824a74a4d3a14e6b00bcc28c327db": { + "name": "JAB token contract", + "address": "0x9aaf731799e824a74a4d3a14e6b00bcc28c327db", + "token": { + "decimals": 18, + "symbol": "JAB" + }, + "isSC": {} + }, + "0x7016c6f4dba9a9a48a47a2fe73a1b9271432d1d5": { + "name": "WFNB token contract", + "address": "0x7016c6f4dba9a9a48a47a2fe73a1b9271432d1d5", + "token": { + "decimals": 18, + "symbol": "WFNB" + }, + "isSC": {} + }, + "0x069f967be0ca21c7d793d8c343f71e597d9a49b3": { + "name": "HZM token contract", + "address": "0x069f967be0ca21c7d793d8c343f71e597d9a49b3", + "token": { + "decimals": 8, + "symbol": "HZM" + }, + "isSC": {} + }, + "0x9b81686140e85d28c2236c307dd49b422a663edf": { + "name": "FIRE token contract", + "address": "0x9b81686140e85d28c2236c307dd49b422a663edf", + "token": { + "decimals": 18, + "symbol": "FIRE" + }, + "isSC": {} + }, + "0x2008e3057bd734e10ad13c9eae45ff132abc1722": { + "name": "ZCO token contract", + "address": "0x2008e3057bd734e10ad13c9eae45ff132abc1722", + "token": { + "decimals": 8, + "symbol": "ZCO" + }, + "isSC": {} + }, + "0x446c9033e7516d820cc9a2ce2d0b7328b579406f": { + "name": "SOLVE token contract", + "address": "0x446c9033e7516d820cc9a2ce2d0b7328b579406f", + "token": { + "decimals": 8, + "symbol": "SOLVE" + }, + "isSC": {} + }, + "0xb16ada27e4bc05bc7b113d0b0fd4962fe1ce2813": { + "name": "RBET token contract", + "address": "0xb16ada27e4bc05bc7b113d0b0fd4962fe1ce2813", + "token": { + "decimals": 18, + "symbol": "RBET" + }, + "isSC": {} + }, + "0x997507cc49fbf0cd6ce5e1ee543218556fafdebc": { + "name": "BT token contract", + "address": "0x997507cc49fbf0cd6ce5e1ee543218556fafdebc", + "token": { + "decimals": 18, + "symbol": "BT" + }, + "isSC": {} + }, + "0x5c1d187ac11b9f7f8e974dde7bf5c69d3c6f6075": { + "name": "ETRA token contract", + "address": "0x5c1d187ac11b9f7f8e974dde7bf5c69d3c6f6075", + "token": { + "decimals": 9, + "symbol": "ETRA" + }, + "isSC": {} + }, + "0x1783d3979038d986f3959adf7dbfc527f42c4269": { + "name": "UB token contract", + "address": "0x1783d3979038d986f3959adf7dbfc527f42c4269", + "token": { + "decimals": 18, + "symbol": "UB" + }, + "isSC": {} + }, + "0xb2f79d891f11bc8e9805db135defc04ead8d780e": { + "name": "AIO token contract", + "address": "0xb2f79d891f11bc8e9805db135defc04ead8d780e", + "token": { + "decimals": 18, + "symbol": "AIO" + }, + "isSC": {} + }, + "0x8ff62c1b0868e1a8905eb0d0cbb04f20667dcf88": { + "name": "BTCR token contract", + "address": "0x8ff62c1b0868e1a8905eb0d0cbb04f20667dcf88", + "token": { + "decimals": 18, + "symbol": "BTCR" + }, + "isSC": {} + }, + "0x97808df7afb14134d37a91576bdb8b95dfcd2e92": { + "name": "FGATE token contract", + "address": "0x97808df7afb14134d37a91576bdb8b95dfcd2e92", + "token": { + "decimals": 18, + "symbol": "FGATE" + }, + "isSC": {} + }, + "0xf9ca9523e5b5a42c3018c62b084db8543478c400": { + "name": "LAKE token contract", + "address": "0xf9ca9523e5b5a42c3018c62b084db8543478c400", + "token": { + "decimals": 18, + "symbol": "LAKE" + }, + "isSC": {} + }, + "0x00b4651795193daca7e73b5ddd031dfde8ca5720": { + "name": "MAIL token contract", + "address": "0x00b4651795193daca7e73b5ddd031dfde8ca5720", + "token": { + "decimals": 18, + "symbol": "MAIL" + }, + "isSC": {} + }, + "0x94dc32f6f4268a4b99cdee7989c4e6818de317cf": { + "name": "BIONIC token contract", + "address": "0x94dc32f6f4268a4b99cdee7989c4e6818de317cf", + "token": { + "decimals": 18, + "symbol": "BIONIC" + }, + "isSC": {} + }, + "0x6dfd6668ee53b414b3b92dd5ed0b3c6e9facae04": { + "name": "BONEX token contract", + "address": "0x6dfd6668ee53b414b3b92dd5ed0b3c6e9facae04", + "token": { + "decimals": 18, + "symbol": "BONEX" + }, + "isSC": {} + }, + "0xcadc0acd4b445166f12d2c07eac6e2544fbe2eef": { + "name": "CADC token contract", + "address": "0xcadc0acd4b445166f12d2c07eac6e2544fbe2eef", + "token": { + "decimals": 18, + "symbol": "CADC" + }, + "isSC": {} + }, + "0xc434268603ca8854e0be1a3ff15cad73bd6ec49a": { + "name": "ZAPI token contract", + "address": "0xc434268603ca8854e0be1a3ff15cad73bd6ec49a", + "token": { + "decimals": 9, + "symbol": "ZAPI" + }, + "isSC": {} + }, + "0xb46ec1db4b766d32fbaf7c30aba1428bd470553e": { + "name": "ARENA token contract", + "address": "0xb46ec1db4b766d32fbaf7c30aba1428bd470553e", + "token": { + "decimals": 18, + "symbol": "ARENA" + }, + "isSC": {} + }, + "0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca": { + "name": "Open Simple Token", + "address": "0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca", + "token": { + "decimals": 18, + "symbol": "OST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/OST.svg" + }, + "0x238a1fcc2f65ed50c1e1797cf5857cba3e82a55b": { + "name": "MOETA token contract", + "address": "0x238a1fcc2f65ed50c1e1797cf5857cba3e82a55b", + "token": { + "decimals": 9, + "symbol": "MOETA" + }, + "isSC": {} + }, + "0x39b0e13a29c2a27ce88cebd21262a232b0633613": { + "name": "GGT token contract", + "address": "0x39b0e13a29c2a27ce88cebd21262a232b0633613", + "token": { + "decimals": 18, + "symbol": "GGT" + }, + "isSC": {} + }, + "0xdeadface8503399df4b083ef42fa8e02fd39dead": { + "name": "TRIBE token contract", + "address": "0xdeadface8503399df4b083ef42fa8e02fd39dead", + "token": { + "decimals": 18, + "symbol": "TRIBE" + }, + "isSC": {} + }, + "0x8f0f56472c3e5730b1ea2f444e7829288da261e6": { + "name": "RMAV token contract", + "address": "0x8f0f56472c3e5730b1ea2f444e7829288da261e6", + "token": { + "decimals": 18, + "symbol": "RMAV" + }, + "isSC": {} + }, + "0x8790f2fc7ca2e7db841307fb3f4e72a03baf7b47": { + "name": "SPILLWAYS token contract", + "address": "0x8790f2fc7ca2e7db841307fb3f4e72a03baf7b47", + "token": { + "decimals": 18, + "symbol": "SPILLWAYS" + }, + "isSC": {} + }, + "0x617ead3c59ded3ea1bb17881118cf310144b450f": { + "name": "TSC token contract", + "address": "0x617ead3c59ded3ea1bb17881118cf310144b450f", + "token": { + "decimals": 18, + "symbol": "TSC" + }, + "isSC": {} + }, + "0x64a77277e37d44957fe5815d6ff442ab8b16cc29": { + "name": "DAWGS token contract", + "address": "0x64a77277e37d44957fe5815d6ff442ab8b16cc29", + "token": { + "decimals": 9, + "symbol": "DAWGS" + }, + "isSC": {} + }, + "0x87d907568a0761ea45d2917e324557920668f224": { + "name": "GROK20 token contract", + "address": "0x87d907568a0761ea45d2917e324557920668f224", + "token": { + "decimals": 18, + "symbol": "GROK20" + }, + "isSC": {} + }, + "0x82967568a57625675b260ebab1294038c9accc6e": { + "name": "NOVA token contract", + "address": "0x82967568a57625675b260ebab1294038c9accc6e", + "token": { + "decimals": 18, + "symbol": "NOVA" + }, + "isSC": {} + }, + "0x876a87e17d76e1487186e00792985918abadca6b": { + "name": "MEMEFI token contract", + "address": "0x876a87e17d76e1487186e00792985918abadca6b", + "token": { + "decimals": 18, + "symbol": "MEMEFI" + }, + "isSC": {} + }, + "0xb13de094cc5cee6c4cc0a3737bf0290166d9ca5d": { + "name": "GMAT token contract", + "address": "0xb13de094cc5cee6c4cc0a3737bf0290166d9ca5d", + "token": { + "decimals": 18, + "symbol": "GMAT" + }, + "isSC": {} + }, + "0xf5ec1a08902ae0ae5323466c35ea49a37409e4ca": { + "name": "SUP token contract", + "address": "0xf5ec1a08902ae0ae5323466c35ea49a37409e4ca", + "token": { + "decimals": 18, + "symbol": "SUP" + }, + "isSC": {} + }, + "0x7ca4408137eb639570f8e647d9bd7b7e8717514a": { + "name": "ALPA token contract", + "address": "0x7ca4408137eb639570f8e647d9bd7b7e8717514a", + "token": { + "decimals": 18, + "symbol": "ALPA" + }, + "isSC": {} + }, + "0x3136ef851592acf49ca4c825131e364170fa32b3": { + "name": "COFI token contract", + "address": "0x3136ef851592acf49ca4c825131e364170fa32b3", + "token": { + "decimals": 18, + "symbol": "COFI" + }, + "isSC": {} + }, + "0xfba5aa703939238c4d03cacbbd126fd7107b2082": { + "name": "WSP token contract", + "address": "0xfba5aa703939238c4d03cacbbd126fd7107b2082", + "token": { + "decimals": 18, + "symbol": "WSP" + }, + "isSC": {} + }, + "0xc064f4f215b6a1e4e7f39bd8530c4de0fc43ee9d": { + "name": "LM token contract", + "address": "0xc064f4f215b6a1e4e7f39bd8530c4de0fc43ee9d", + "token": { + "decimals": 18, + "symbol": "LM" + }, + "isSC": {} + }, + "0xfa3118b34522580c35ae27f6cf52da1dbb756288": { + "name": "LET token contract", + "address": "0xfa3118b34522580c35ae27f6cf52da1dbb756288", + "token": { + "decimals": 6, + "symbol": "LET" + }, + "isSC": {} + }, + "0x9352ec6d3e8b54a96b6903a79635c1e2d298b101": { + "name": "BAD token contract", + "address": "0x9352ec6d3e8b54a96b6903a79635c1e2d298b101", + "token": { + "decimals": 9, + "symbol": "BAD" + }, + "isSC": {} + }, + "0xf96287ea71abb5c8c58961c7a3cd3982a505e264": { + "name": "STEM token contract", + "address": "0xf96287ea71abb5c8c58961c7a3cd3982a505e264", + "token": { + "decimals": 18, + "symbol": "STEM" + }, + "isSC": {} + }, + "0xbd2949f67dcdc549c6ebe98696449fa79d988a9f": { + "name": "EMTRG token contract", + "address": "0xbd2949f67dcdc549c6ebe98696449fa79d988a9f", + "token": { + "decimals": 18, + "symbol": "EMTRG" + }, + "isSC": {} + }, + "0xdef1ca1fb7fbcdc777520aa7f396b4e015f497ab": { + "name": "CoW Protocol Token", + "address": "0xdef1ca1fb7fbcdc777520aa7f396b4e015f497ab", + "token": { + "decimals": 18, + "symbol": "COW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/COW.svg" + }, + "0x0aa8a7d1fb4c64b3b1dcea9a7ade81c59c25b95b": { + "name": "ASTRA token contract", + "address": "0x0aa8a7d1fb4c64b3b1dcea9a7ade81c59c25b95b", + "token": { + "decimals": 18, + "symbol": "ASTRA" + }, + "isSC": {} + }, + "0x72fd1648f34ddb747acd00ae114e805c7b81422d": { + "name": "PEPEBEAST token contract", + "address": "0x72fd1648f34ddb747acd00ae114e805c7b81422d", + "token": { + "decimals": 9, + "symbol": "PEPEBEAST" + }, + "isSC": {} + }, + "0xbe042e9d09cb588331ff911c2b46fd833a3e5bd6": { + "name": "PEPE token contract", + "address": "0xbe042e9d09cb588331ff911c2b46fd833a3e5bd6", + "token": { + "decimals": 18, + "symbol": "PEPE" + }, + "isSC": {} + }, + "0xf0dc9fc0669f068e04ad79f7d70618d3f9aad439": { + "name": "OASIS token contract", + "address": "0xf0dc9fc0669f068e04ad79f7d70618d3f9aad439", + "token": { + "decimals": 18, + "symbol": "OASIS" + }, + "isSC": {} + }, + "0x8d96b4ab6c741a4c8679ae323a100d74f085ba8f": { + "name": "Bazaars", + "address": "0x8d96b4ab6c741a4c8679ae323a100d74f085ba8f", + "token": { + "decimals": 18, + "symbol": "BZR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BZR.svg" + }, + "0xe0a458bf4acf353cb45e211281a334bb1d837885": { + "name": "4CHAN token contract", + "address": "0xe0a458bf4acf353cb45e211281a334bb1d837885", + "token": { + "decimals": 9, + "symbol": "4CHAN" + }, + "isSC": {} + }, + "0xc7ff1e126cc81e816915ff48c940ed9d4e6d05d6": { + "name": "IJC token contract", + "address": "0xc7ff1e126cc81e816915ff48c940ed9d4e6d05d6", + "token": { + "decimals": 18, + "symbol": "IJC" + }, + "isSC": {} + }, + "0xc4d5545392f5fc57eba3af8981815669bb7e2a48": { + "name": "HDP token contract", + "address": "0xc4d5545392f5fc57eba3af8981815669bb7e2a48", + "token": { + "decimals": 4, + "symbol": "HDP" + }, + "isSC": {} + }, + "0x5bffe8ddff21ca52d8371b14a6c39d6ae3c5d2c7": { + "name": "HOLA token contract", + "address": "0x5bffe8ddff21ca52d8371b14a6c39d6ae3c5d2c7", + "token": { + "decimals": 18, + "symbol": "HOLA" + }, + "isSC": {} + }, + "0xad6eefb4f4a6ce3e2cd2049c3104f5ce5ed082f0": { + "name": "SIMPSON690 token contract", + "address": "0xad6eefb4f4a6ce3e2cd2049c3104f5ce5ed082f0", + "token": { + "decimals": 9, + "symbol": "SIMPSON690" + }, + "isSC": {} + }, + "0x6d3d490964205c8bc8ded39e48e88e8fde45b41f": { + "name": "GOOCH token contract", + "address": "0x6d3d490964205c8bc8ded39e48e88e8fde45b41f", + "token": { + "decimals": 18, + "symbol": "GOOCH" + }, + "isSC": {} + }, + "0x656c00e1bcd96f256f224ad9112ff426ef053733": { + "name": "EFI token contract", + "address": "0x656c00e1bcd96f256f224ad9112ff426ef053733", + "token": { + "decimals": 18, + "symbol": "EFI" + }, + "isSC": {} + }, + "0x55986c1dcbf2fa1f3402c5df256272621624821f": { + "name": "BANKBTC token contract", + "address": "0x55986c1dcbf2fa1f3402c5df256272621624821f", + "token": { + "decimals": 9, + "symbol": "BANKBTC" + }, + "isSC": {} + }, + "0x06e0feb0d74106c7ada8497754074d222ec6bcdf": { + "name": "BTB token contract", + "address": "0x06e0feb0d74106c7ada8497754074d222ec6bcdf", + "token": { + "decimals": 18, + "symbol": "BTB" + }, + "isSC": {} + }, + "0x3408636a7825e894ac5521ca55494f89f96df240": { + "name": "PYME token contract", + "address": "0x3408636a7825e894ac5521ca55494f89f96df240", + "token": { + "decimals": 18, + "symbol": "PYME" + }, + "isSC": {} + }, + "0x4d4f3715050571a447fffa2cd4cf091c7014ca5c": { + "name": "SUMMER token contract", + "address": "0x4d4f3715050571a447fffa2cd4cf091c7014ca5c", + "token": { + "decimals": 18, + "symbol": "SUMMER" + }, + "isSC": {} + }, + "0x7468d234a8db6f1085dbf4e403553bfed41df95c": { + "name": "IO token contract", + "address": "0x7468d234a8db6f1085dbf4e403553bfed41df95c", + "token": { + "decimals": 18, + "symbol": "IO" + }, + "isSC": {} + }, + "0xc7b4c17861357b8abb91f25581e7263e08dcb59c": { + "name": "ASNX token contract", + "address": "0xc7b4c17861357b8abb91f25581e7263e08dcb59c", + "token": { + "decimals": 18, + "symbol": "ASNX" + }, + "isSC": {} + }, + "0x10633216e7e8281e33c86f02bf8e565a635d9770": { + "name": "Dvision Network", + "address": "0x10633216e7e8281e33c86f02bf8e565a635d9770", + "token": { + "decimals": 18, + "symbol": "DVI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dvision.svg" + }, + "0x2b46578b7f06f2b373ad0e0c9b28f800dcc80bf3": { + "name": "ECHO token contract", + "address": "0x2b46578b7f06f2b373ad0e0c9b28f800dcc80bf3", + "token": { + "decimals": 9, + "symbol": "ECHO" + }, + "isSC": {} + }, + "0x9eac760d89805558d1a657b59bed313766e09e61": { + "name": "MEMBOT token contract", + "address": "0x9eac760d89805558d1a657b59bed313766e09e61", + "token": { + "decimals": 18, + "symbol": "MEMBOT" + }, + "isSC": {} + }, + "0x80122c6a83c8202ea365233363d3f4837d13e888": { + "name": "M87 token contract", + "address": "0x80122c6a83c8202ea365233363d3f4837d13e888", + "token": { + "decimals": 18, + "symbol": "M87" + }, + "isSC": {} + }, + "0xadbf092241f806ae43b0395bca9e0ec83155816b": { + "name": "LAB token contract", + "address": "0xadbf092241f806ae43b0395bca9e0ec83155816b", + "token": { + "decimals": 18, + "symbol": "LAB" + }, + "isSC": {} + }, + "0x3f9bec82c776c47405bcb38070d2395fd18f89d3": { + "name": "PHM token contract", + "address": "0x3f9bec82c776c47405bcb38070d2395fd18f89d3", + "token": { + "decimals": 18, + "symbol": "PHM" + }, + "isSC": {} + }, + "0xcd24181edaa0394e1d978d5011e36f67fe41a499": { + "name": "ORB token contract", + "address": "0xcd24181edaa0394e1d978d5011e36f67fe41a499", + "token": { + "decimals": 18, + "symbol": "ORB" + }, + "isSC": {} + }, + "0x69a95185ee2a045cdc4bcd1b1df10710395e4e23": { + "name": "$Poolz Finance", + "address": "0x69a95185ee2a045cdc4bcd1b1df10710395e4e23", + "token": { + "decimals": 18, + "symbol": "POOLZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Poolz.svg" + }, + "0xdaa7699352ac8709f3d2fd092226d3dd7da40474": { + "name": "OPCAT token contract", + "address": "0xdaa7699352ac8709f3d2fd092226d3dd7da40474", + "token": { + "decimals": 18, + "symbol": "OPCAT" + }, + "isSC": {} + }, + "0x5fbc2ffe91ac74e3e286bd7504b233f0e5291c69": { + "name": "EBET token contract", + "address": "0x5fbc2ffe91ac74e3e286bd7504b233f0e5291c69", + "token": { + "decimals": 8, + "symbol": "EBET" + }, + "isSC": {} + }, + "0x28fac5334c9f7262b3a3fe707e250e01053e07b5": { + "name": "IDLEUSDTSAFE token contract", + "address": "0x28fac5334c9f7262b3a3fe707e250e01053e07b5", + "token": { + "decimals": 18, + "symbol": "IDLEUSDTSAFE" + }, + "isSC": {} + }, + "0x79ca240990ec3f11381a8f80529828aad0628658": { + "name": "DVNCI token contract", + "address": "0x79ca240990ec3f11381a8f80529828aad0628658", + "token": { + "decimals": 9, + "symbol": "DVNCI" + }, + "isSC": {} + }, + "0x91368eef9ab8bdc727e4506897656abb87282003": { + "name": "NET token contract", + "address": "0x91368eef9ab8bdc727e4506897656abb87282003", + "token": { + "decimals": 9, + "symbol": "NET" + }, + "isSC": {} + }, + "0x583019ff0f430721ada9cfb4fac8f06ca104d0b4": { + "name": "ST-YETH token contract", + "address": "0x583019ff0f430721ada9cfb4fac8f06ca104d0b4", + "token": { + "decimals": 18, + "symbol": "ST-YETH" + }, + "isSC": {} + }, + "0x3a4c122243b53135e7f6bf5b4658092c3a3109ab": { + "name": "HUSTLE token contract", + "address": "0x3a4c122243b53135e7f6bf5b4658092c3a3109ab", + "token": { + "decimals": 18, + "symbol": "HUSTLE" + }, + "isSC": {} + }, + "0xc91b523a59acc63a64f61fc7bbfb4bfc82dd25f2": { + "name": "AI token contract", + "address": "0xc91b523a59acc63a64f61fc7bbfb4bfc82dd25f2", + "token": { + "decimals": 18, + "symbol": "AI" + }, + "isSC": {} + }, + "0xa15865d9de09cb96aaa3a9081b3dfc8481f07d33": { + "name": "POPE token contract", + "address": "0xa15865d9de09cb96aaa3a9081b3dfc8481f07d33", + "token": { + "decimals": 18, + "symbol": "POPE" + }, + "isSC": {} + }, + "0xa350da05405cc204e551c4eed19c3039646528d5": { + "name": "BSPT token contract", + "address": "0xa350da05405cc204e551c4eed19c3039646528d5", + "token": { + "decimals": 18, + "symbol": "BSPT" + }, + "isSC": {} + }, + "0xa6c0c097741d55ecd9a3a7def3a8253fd022ceb9": { + "name": "AVA token contract", + "address": "0xa6c0c097741d55ecd9a3a7def3a8253fd022ceb9", + "token": { + "decimals": 18, + "symbol": "AVA" + }, + "isSC": {} + }, + "0x1a963df363d01eebb2816b366d61c917f20e1ebe": { + "name": "MEMEME token contract", + "address": "0x1a963df363d01eebb2816b366d61c917f20e1ebe", + "token": { + "decimals": 18, + "symbol": "MEMEME" + }, + "isSC": {} + }, + "0xfbbe098ee65238e4d9f771404edddcbf89cd689b": { + "name": "TREE token contract", + "address": "0xfbbe098ee65238e4d9f771404edddcbf89cd689b", + "token": { + "decimals": 18, + "symbol": "TREE" + }, + "isSC": {} + }, + "0x7e9d8f07a64e363e97a648904a89fb4cd5fb94cd": { + "name": "FF token contract", + "address": "0x7e9d8f07a64e363e97a648904a89fb4cd5fb94cd", + "token": { + "decimals": 18, + "symbol": "FF" + }, + "isSC": {} + }, + "0x77777777772cf0455fb38ee0e75f38034dfa50de": { + "name": "XY token contract", + "address": "0x77777777772cf0455fb38ee0e75f38034dfa50de", + "token": { + "decimals": 18, + "symbol": "XY" + }, + "isSC": {} + }, + "0x4cce605ed955295432958d8951d0b176c10720d5": { + "name": "AUDD token contract", + "address": "0x4cce605ed955295432958d8951d0b176c10720d5", + "token": { + "decimals": 6, + "symbol": "AUDD" + }, + "isSC": {} + }, + "0xface851a4921ce59e912d19329929ce6da6eb0c7": { + "name": "CLINK token contract", + "address": "0xface851a4921ce59e912d19329929ce6da6eb0c7", + "token": { + "decimals": 8, + "symbol": "CLINK" + }, + "isSC": {} + }, + "0x5ea82c27efc7634f1c5ad20a3561c453433a2f3a": { + "name": "BTR token contract", + "address": "0x5ea82c27efc7634f1c5ad20a3561c453433a2f3a", + "token": { + "decimals": 18, + "symbol": "BTR" + }, + "isSC": {} + }, + "0xae9d553c85eef99c0ef9169f0d49ef33f5275f94": { + "name": "DS token contract", + "address": "0xae9d553c85eef99c0ef9169f0d49ef33f5275f94", + "token": { + "decimals": 9, + "symbol": "DS" + }, + "isSC": {} + }, + "0x13c4aa5c3f5bb1109c267e520a87c89684d3e73c": { + "name": "VERIFY token contract", + "address": "0x13c4aa5c3f5bb1109c267e520a87c89684d3e73c", + "token": { + "decimals": 9, + "symbol": "VERIFY" + }, + "isSC": {} + }, + "0xb31ef9e52d94d4120eb44fe1ddfde5b4654a6515": { + "name": "DOSE token contract", + "address": "0xb31ef9e52d94d4120eb44fe1ddfde5b4654a6515", + "token": { + "decimals": 18, + "symbol": "DOSE" + }, + "isSC": {} + }, + "0xb17d69c91135516b0256c67e8bd32cd238b56161": { + "name": "GRAVITAS token contract", + "address": "0xb17d69c91135516b0256c67e8bd32cd238b56161", + "token": { + "decimals": 9, + "symbol": "GRAVITAS" + }, + "isSC": {} + }, + "0xee9e5eff401ee921b138490d00ca8d1f13f67a72": { + "name": "AFIN token contract", + "address": "0xee9e5eff401ee921b138490d00ca8d1f13f67a72", + "token": { + "decimals": 8, + "symbol": "AFIN" + }, + "isSC": {} + }, + "0x8c6fa66c21ae3fc435790e451946a9ea82e6e523": { + "name": "FABRIC token contract", + "address": "0x8c6fa66c21ae3fc435790e451946a9ea82e6e523", + "token": { + "decimals": 18, + "symbol": "FABRIC" + }, + "isSC": {} + }, + "0x3bf954e809620bf2f1fcb667f1c7d2d2e94350d1": { + "name": "VIZ token contract", + "address": "0x3bf954e809620bf2f1fcb667f1c7d2d2e94350d1", + "token": { + "decimals": 9, + "symbol": "VIZ" + }, + "isSC": {} + }, + "0x7e5981c2e072f53a0323d3d80baca3e31fb1550c": { + "name": "JOVJOU token contract", + "address": "0x7e5981c2e072f53a0323d3d80baca3e31fb1550c", + "token": { + "decimals": 18, + "symbol": "JOVJOU" + }, + "isSC": {} + }, + "0xdb8ad3c6d7f9f364d59af9a62c3139cf5c6be88e": { + "name": "XNOVA token contract", + "address": "0xdb8ad3c6d7f9f364d59af9a62c3139cf5c6be88e", + "token": { + "decimals": 18, + "symbol": "XNOVA" + }, + "isSC": {} + }, + "0x6a6bfdd2174ade27258fe96b9afae3758dec14f2": { + "name": "SOLAR token contract", + "address": "0x6a6bfdd2174ade27258fe96b9afae3758dec14f2", + "token": { + "decimals": 18, + "symbol": "SOLAR" + }, + "isSC": {} + }, + "0x7f0c8b125040f707441cad9e5ed8a8408673b455": { + "name": "NEBO token contract", + "address": "0x7f0c8b125040f707441cad9e5ed8a8408673b455", + "token": { + "decimals": 18, + "symbol": "NEBO" + }, + "isSC": {} + }, + "0xc9f00080d96cea3ef92d2e2e563d4cd41fb5bb36": { + "name": "BLOX token contract", + "address": "0xc9f00080d96cea3ef92d2e2e563d4cd41fb5bb36", + "token": { + "decimals": 18, + "symbol": "BLOX" + }, + "isSC": {} + }, + "0x075b1bb99792c9e1041ba13afef80c91a1e70fb3": { + "name": "CRVRENWSBTC token contract", + "address": "0x075b1bb99792c9e1041ba13afef80c91a1e70fb3", + "token": { + "decimals": 18, + "symbol": "CRVRENWSBTC" + }, + "isSC": {} + }, + "0x6c22910c6f75f828b305e57c6a54855d8adeabf8": { + "name": "SATS token contract", + "address": "0x6c22910c6f75f828b305e57c6a54855d8adeabf8", + "token": { + "decimals": 9, + "symbol": "SATS" + }, + "isSC": {} + }, + "0xf2041be4ea84599818799eed882389a8a30d2226": { + "name": "NEURAL token contract", + "address": "0xf2041be4ea84599818799eed882389a8a30d2226", + "token": { + "decimals": 9, + "symbol": "NEURAL" + }, + "isSC": {} + }, + "0xe19f85c920b572ca48942315b06d6cac86585c87": { + "name": "PLEB token contract", + "address": "0xe19f85c920b572ca48942315b06d6cac86585c87", + "token": { + "decimals": 18, + "symbol": "PLEB" + }, + "isSC": {} + }, + "0x7a29fb472f0e62bce6127f125e8d5ad2a9fa3839": { + "name": "RBH token contract", + "address": "0x7a29fb472f0e62bce6127f125e8d5ad2a9fa3839", + "token": { + "decimals": 18, + "symbol": "RBH" + }, + "isSC": {} + }, + "0x509a38b7a1cc0dcd83aa9d06214663d9ec7c7f4a": { + "name": "Blocksquare Token", + "address": "0x509a38b7a1cc0dcd83aa9d06214663d9ec7c7f4a", + "token": { + "decimals": 18, + "symbol": "BST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BST.svg" + }, + "0x65ad6a2288b2dd23e466226397c8f5d1794e58fc": { + "name": "GFX token contract", + "address": "0x65ad6a2288b2dd23e466226397c8f5d1794e58fc", + "token": { + "decimals": 18, + "symbol": "GFX" + }, + "isSC": {} + }, + "0xdd2a36ae937bc134ea694d77fc7e2e36f5d86de0": { + "name": "WELD token contract", + "address": "0xdd2a36ae937bc134ea694d77fc7e2e36f5d86de0", + "token": { + "decimals": 18, + "symbol": "WELD" + }, + "isSC": {} + }, + "0x52a163f4cef6a42fa6b17e0f2a773fc149547c9c": { + "name": "BANGER token contract", + "address": "0x52a163f4cef6a42fa6b17e0f2a773fc149547c9c", + "token": { + "decimals": 18, + "symbol": "BANGER" + }, + "isSC": {} + }, + "0x6e3f7d6f0eab61f161551c60096aa559d2cf46cd": { + "name": "HIBA token contract", + "address": "0x6e3f7d6f0eab61f161551c60096aa559d2cf46cd", + "token": { + "decimals": 18, + "symbol": "HIBA" + }, + "isSC": {} + }, + "0xf2d754ea7626f35090cddf92893374bd1b2e5a39": { + "name": "BORK token contract", + "address": "0xf2d754ea7626f35090cddf92893374bd1b2e5a39", + "token": { + "decimals": 9, + "symbol": "BORK" + }, + "isSC": {} + }, + "0xaee433adebe0fbb88daa47ef0c1a513caa52ef02": { + "name": "TOON token contract", + "address": "0xaee433adebe0fbb88daa47ef0c1a513caa52ef02", + "token": { + "decimals": 18, + "symbol": "TOON" + }, + "isSC": {} + }, + "0x24da31e7bb182cb2cabfef1d88db19c2ae1f5572": { + "name": "SHIK token contract", + "address": "0x24da31e7bb182cb2cabfef1d88db19c2ae1f5572", + "token": { + "decimals": 18, + "symbol": "SHIK" + }, + "isSC": {} + }, + "0xd0f395aa1b49ad410b26f52348aebcff109940e8": { + "name": "LSHARE token contract", + "address": "0xd0f395aa1b49ad410b26f52348aebcff109940e8", + "token": { + "decimals": 18, + "symbol": "LSHARE" + }, + "isSC": {} + }, + "0x34bc13de8e5124a7c47d4b7ff7c5ade6ee34faba": { + "name": "DOJO token contract", + "address": "0x34bc13de8e5124a7c47d4b7ff7c5ade6ee34faba", + "token": { + "decimals": 18, + "symbol": "DOJO" + }, + "isSC": {} + }, + "0xc7c53760375530e5af29fded5e13989325299382": { + "name": "WPC token contract", + "address": "0xc7c53760375530e5af29fded5e13989325299382", + "token": { + "decimals": 9, + "symbol": "WPC" + }, + "isSC": {} + }, + "0xe9b076b476d8865cdf79d1cf7df420ee397a7f75": { + "name": "FUND token contract", + "address": "0xe9b076b476d8865cdf79d1cf7df420ee397a7f75", + "token": { + "decimals": 9, + "symbol": "FUND" + }, + "isSC": {} + }, + "0xf921ae2dac5fa128dc0f6168bf153ea0943d2d43": { + "name": "FIRE token contract", + "address": "0xf921ae2dac5fa128dc0f6168bf153ea0943d2d43", + "token": { + "decimals": 8, + "symbol": "FIRE" + }, + "isSC": {} + }, + "0x8e3fa615392688ddd9bf8f25d1f8dc744ac1a12c": { + "name": "GME token contract", + "address": "0x8e3fa615392688ddd9bf8f25d1f8dc744ac1a12c", + "token": { + "decimals": 9, + "symbol": "GME" + }, + "isSC": {} + }, + "0xb69753c06bb5c366be51e73bfc0cc2e3dc07e371": { + "name": "POOH token contract", + "address": "0xb69753c06bb5c366be51e73bfc0cc2e3dc07e371", + "token": { + "decimals": 18, + "symbol": "POOH" + }, + "isSC": {} + }, + "0x19a71179fd41c19f8dfb1f38343482bec0271e3c": { + "name": "SPEC token contract", + "address": "0x19a71179fd41c19f8dfb1f38343482bec0271e3c", + "token": { + "decimals": 18, + "symbol": "SPEC" + }, + "isSC": {} + }, + "0x356e17967206efb413b60ab0ba44e269063a26c9": { + "name": "OCISLY token contract", + "address": "0x356e17967206efb413b60ab0ba44e269063a26c9", + "token": { + "decimals": 9, + "symbol": "OCISLY" + }, + "isSC": {} + }, + "0x7105faa4a26ed1c67b8b2b41bec98f06ee21d105": { + "name": "X7105 token contract", + "address": "0x7105faa4a26ed1c67b8b2b41bec98f06ee21d105", + "token": { + "decimals": 18, + "symbol": "X7105" + }, + "isSC": {} + }, + "0x9047b76d7fb3d8bc3342616c56028430ebc74290": { + "name": "BISHOP token contract", + "address": "0x9047b76d7fb3d8bc3342616c56028430ebc74290", + "token": { + "decimals": 18, + "symbol": "BISHOP" + }, + "isSC": {} + }, + "0xd76050f75627e508fa14b84036fbf40b8cc549bd": { + "name": "SCRIV token contract", + "address": "0xd76050f75627e508fa14b84036fbf40b8cc549bd", + "token": { + "decimals": 8, + "symbol": "SCRIV" + }, + "isSC": {} + }, + "0xdc580d4dc6b702b72a3511ac1802fa700ad182bb": { + "name": "PUMPKIN token contract", + "address": "0xdc580d4dc6b702b72a3511ac1802fa700ad182bb", + "token": { + "decimals": 9, + "symbol": "PUMPKIN" + }, + "isSC": {} + }, + "0xde3ae6f3458db211d298da97fdcf13b6c1c8c87f": { + "name": "ANC token contract", + "address": "0xde3ae6f3458db211d298da97fdcf13b6c1c8c87f", + "token": { + "decimals": 9, + "symbol": "ANC" + }, + "isSC": {} + }, + "0x622dffcc4e83c64ba959530a5a5580687a57581b": { + "name": "AUTO token contract", + "address": "0x622dffcc4e83c64ba959530a5a5580687a57581b", + "token": { + "decimals": 18, + "symbol": "AUTO" + }, + "isSC": {} + }, + "0x5582a479f0c403e207d2578963ccef5d03ba636f": { + "name": "SALD token contract", + "address": "0x5582a479f0c403e207d2578963ccef5d03ba636f", + "token": { + "decimals": 18, + "symbol": "SALD" + }, + "isSC": {} + }, + "0xf51092fe93b4e9282f42c459f05d93d2d079549e": { + "name": "ROCI token contract", + "address": "0xf51092fe93b4e9282f42c459f05d93d2d079549e", + "token": { + "decimals": 18, + "symbol": "ROCI" + }, + "isSC": {} + }, + "0x69d57d410e72eb21fb83fa3dbf090ba07dbe0e76": { + "name": "CHANCE token contract", + "address": "0x69d57d410e72eb21fb83fa3dbf090ba07dbe0e76", + "token": { + "decimals": 18, + "symbol": "CHANCE" + }, + "isSC": {} + }, + "0x6f222e04f6c53cc688ffb0abe7206aac66a8ff98": { + "name": "ROKO token contract", + "address": "0x6f222e04f6c53cc688ffb0abe7206aac66a8ff98", + "token": { + "decimals": 18, + "symbol": "ROKO" + }, + "isSC": {} + }, + "0x6a445e9f40e0b97c92d0b8a3366cef1d67f700bf": { + "name": "FIDU token contract", + "address": "0x6a445e9f40e0b97c92d0b8a3366cef1d67f700bf", + "token": { + "decimals": 18, + "symbol": "FIDU" + }, + "isSC": {} + }, + "0x0000000005c6b7c1fd10915a05f034f90d524d6e": { + "name": "TRYC token contract", + "address": "0x0000000005c6b7c1fd10915a05f034f90d524d6e", + "token": { + "decimals": 6, + "symbol": "TRYC" + }, + "isSC": {} + }, + "0xa5ef74068d04ba0809b7379dd76af5ce34ab7c57": { + "name": "LUCHOW token contract", + "address": "0xa5ef74068d04ba0809b7379dd76af5ce34ab7c57", + "token": { + "decimals": 18, + "symbol": "LUCHOW" + }, + "isSC": {} + }, + "0x0a6c7d5b442ddf53d963581d87932f25743dd3a0": { + "name": "SHUB token contract", + "address": "0x0a6c7d5b442ddf53d963581d87932f25743dd3a0", + "token": { + "decimals": 18, + "symbol": "SHUB" + }, + "isSC": {} + }, + "0x24a6a37576377f63f194caa5f518a60f45b42921": { + "name": "BANK token contract", + "address": "0x24a6a37576377f63f194caa5f518a60f45b42921", + "token": { + "decimals": 18, + "symbol": "BANK" + }, + "isSC": {} + }, + "0xbbbbbbbb46a1da0f0c3f64522c275baa4c332636": { + "name": "ZKB token contract", + "address": "0xbbbbbbbb46a1da0f0c3f64522c275baa4c332636", + "token": { + "decimals": 18, + "symbol": "ZKB" + }, + "isSC": {} + }, + "0xf31120603a27a16314effc37a3f32a42028310af": { + "name": "FLACK token contract", + "address": "0xf31120603a27a16314effc37a3f32a42028310af", + "token": { + "decimals": 18, + "symbol": "FLACK" + }, + "isSC": {} + }, + "0x53011e93f21ec7a74cdfbb7e6548f1abce306833": { + "name": "LEXE token contract", + "address": "0x53011e93f21ec7a74cdfbb7e6548f1abce306833", + "token": { + "decimals": 18, + "symbol": "LEXE" + }, + "isSC": {} + }, + "0xe66b3aa360bb78468c00bebe163630269db3324f": { + "name": "MTO token contract", + "address": "0xe66b3aa360bb78468c00bebe163630269db3324f", + "token": { + "decimals": 18, + "symbol": "MTO" + }, + "isSC": {} + }, + "0x50bc2ecc0bfdf5666640048038c1aba7b7525683": { + "name": "CV token contract", + "address": "0x50bc2ecc0bfdf5666640048038c1aba7b7525683", + "token": { + "decimals": 18, + "symbol": "CV" + }, + "isSC": {} + }, + "0x138c2f1123cf3f82e4596d097c118eac6684940b": { + "name": "ALPHA token contract", + "address": "0x138c2f1123cf3f82e4596d097c118eac6684940b", + "token": { + "decimals": 18, + "symbol": "ALPHA" + }, + "isSC": {} + }, + "0x3f48cce3eabb02304f7cc16fd7a35f3a2df7be8e": { + "name": "TRUCK token contract", + "address": "0x3f48cce3eabb02304f7cc16fd7a35f3a2df7be8e", + "token": { + "decimals": 18, + "symbol": "TRUCK" + }, + "isSC": {} + }, + "0xd0e94bf2466979b81d738c34058d4a6559c4d8be": { + "name": "ARDVRK token contract", + "address": "0xd0e94bf2466979b81d738c34058d4a6559c4d8be", + "token": { + "decimals": 18, + "symbol": "ARDVRK" + }, + "isSC": {} + }, + "0x99cffb50aad37d17955253f3a4070556b5127a0b": { + "name": "MEGA token contract", + "address": "0x99cffb50aad37d17955253f3a4070556b5127a0b", + "token": { + "decimals": 18, + "symbol": "MEGA" + }, + "isSC": {} + }, + "0x29d578cec46b50fa5c88a99c6a4b70184c062953": { + "name": "EVER token contract", + "address": "0x29d578cec46b50fa5c88a99c6a4b70184c062953", + "token": { + "decimals": 9, + "symbol": "EVER" + }, + "isSC": {} + }, + "0xe51b8ab09008285a0380dd2680cd9dd5e13924d3": { + "name": "BSP token contract", + "address": "0xe51b8ab09008285a0380dd2680cd9dd5e13924d3", + "token": { + "decimals": 18, + "symbol": "BSP" + }, + "isSC": {} + }, + "0xfc979087305a826c2b2a0056cfaba50aad3e6439": { + "name": "DAFI token contract", + "address": "0xfc979087305a826c2b2a0056cfaba50aad3e6439", + "token": { + "decimals": 18, + "symbol": "DAFI" + }, + "isSC": {} + }, + "0x0aacfbec6a24756c20d41914f2caba817c0d8521": { + "name": "YAM token contract", + "address": "0x0aacfbec6a24756c20d41914f2caba817c0d8521", + "token": { + "decimals": 18, + "symbol": "YAM" + }, + "isSC": {} + }, + "0x9565c2036963697786705120fc59310f747bcfd0": { + "name": "PP token contract", + "address": "0x9565c2036963697786705120fc59310f747bcfd0", + "token": { + "decimals": 18, + "symbol": "PP" + }, + "isSC": {} + }, + "0xd69f306549e9d96f183b1aeca30b8f4353c2ecc3": { + "name": "MCHC token contract", + "address": "0xd69f306549e9d96f183b1aeca30b8f4353c2ecc3", + "token": { + "decimals": 18, + "symbol": "MCHC" + }, + "isSC": {} + }, + "0x4da9b813057d04baef4e5800e36083717b4a0341": { + "name": "ATUSD token contract", + "address": "0x4da9b813057d04baef4e5800e36083717b4a0341", + "token": { + "decimals": 18, + "symbol": "ATUSD" + }, + "isSC": {} + }, + "0x2de509bf0014ddf697b220be628213034d320ece": { + "name": "DBI token contract", + "address": "0x2de509bf0014ddf697b220be628213034d320ece", + "token": { + "decimals": 18, + "symbol": "DBI" + }, + "isSC": {} + }, + "0xacdbfcbd4d6d4e9fe72c3ba4280d728ab2ace30f": { + "name": "TWB token contract", + "address": "0xacdbfcbd4d6d4e9fe72c3ba4280d728ab2ace30f", + "token": { + "decimals": 18, + "symbol": "TWB" + }, + "isSC": {} + }, + "0x146d8d942048ad517479c9bab1788712af180fde": { + "name": "MIB token contract", + "address": "0x146d8d942048ad517479c9bab1788712af180fde", + "token": { + "decimals": 18, + "symbol": "MIB" + }, + "isSC": {} + }, + "0x53020f42f6da51b50cf6e23e45266ef223122376": { + "name": "SPOT token contract", + "address": "0x53020f42f6da51b50cf6e23e45266ef223122376", + "token": { + "decimals": 18, + "symbol": "SPOT" + }, + "isSC": {} + }, + "0x6d791ff76d2780f7c0403b8ad52de7b369a6154b": { + "name": "AFK token contract", + "address": "0x6d791ff76d2780f7c0403b8ad52de7b369a6154b", + "token": { + "decimals": 9, + "symbol": "AFK" + }, + "isSC": {} + }, + "0x74232704659ef37c08995e386a2e26cc27a8d7b1": { + "name": "STRK token contract", + "address": "0x74232704659ef37c08995e386a2e26cc27a8d7b1", + "token": { + "decimals": 18, + "symbol": "STRK" + }, + "isSC": {} + }, + "0x0af5855a348c58a8bbf65bcc7b9bbacd0e7e2238": { + "name": "UAC token contract", + "address": "0x0af5855a348c58a8bbf65bcc7b9bbacd0e7e2238", + "token": { + "decimals": 18, + "symbol": "UAC" + }, + "isSC": {} + }, + "0x8f1cece048cade6b8a05dfa2f90ee4025f4f2662": { + "name": "GFOX token contract", + "address": "0x8f1cece048cade6b8a05dfa2f90ee4025f4f2662", + "token": { + "decimals": 18, + "symbol": "GFOX" + }, + "isSC": {} + }, + "0xaf2ca40d3fc4459436d11b94d21fa4b8a89fb51d": { + "name": "GCOTI token contract", + "address": "0xaf2ca40d3fc4459436d11b94d21fa4b8a89fb51d", + "token": { + "decimals": 18, + "symbol": "GCOTI" + }, + "isSC": {} + }, + "0xf59257e961883636290411c11ec5ae622d19455e": { + "name": "FLOOR token contract", + "address": "0xf59257e961883636290411c11ec5ae622d19455e", + "token": { + "decimals": 9, + "symbol": "FLOOR" + }, + "isSC": {} + }, + "0x6ba75d640bebfe5da1197bb5a2aff3327789b5d3": { + "name": "VEUR token contract", + "address": "0x6ba75d640bebfe5da1197bb5a2aff3327789b5d3", + "token": { + "decimals": 18, + "symbol": "VEUR" + }, + "isSC": {} + }, + "0x62b9c7356a2dc64a1969e19c23e4f579f9810aa7": { + "name": "CVXCRV token contract", + "address": "0x62b9c7356a2dc64a1969e19c23e4f579f9810aa7", + "token": { + "decimals": 18, + "symbol": "CVXCRV" + }, + "isSC": {} + }, + "0x7714f320adca62b149df2579361afec729c5fe6a": { + "name": "TUP token contract", + "address": "0x7714f320adca62b149df2579361afec729c5fe6a", + "token": { + "decimals": 18, + "symbol": "TUP" + }, + "isSC": {} + }, + "0x20c64dee8fda5269a78f2d5bdba861ca1d83df7a": { + "name": "BHIGH token contract", + "address": "0x20c64dee8fda5269a78f2d5bdba861ca1d83df7a", + "token": { + "decimals": 18, + "symbol": "BHIGH" + }, + "isSC": {} + }, + "0x49e833337ece7afe375e44f4e3e8481029218e5c": { + "name": "VALUE token contract", + "address": "0x49e833337ece7afe375e44f4e3e8481029218e5c", + "token": { + "decimals": 18, + "symbol": "VALUE" + }, + "isSC": {} + }, + "0xd5930c307d7395ff807f2921f12c5eb82131a789": { + "name": "BOLT token contract", + "address": "0xd5930c307d7395ff807f2921f12c5eb82131a789", + "token": { + "decimals": 18, + "symbol": "BOLT" + }, + "isSC": {} + }, + "0x12272c264ca580d2190b16db14cea3815f52060c": { + "name": "GROKBOT token contract", + "address": "0x12272c264ca580d2190b16db14cea3815f52060c", + "token": { + "decimals": 18, + "symbol": "GROKBOT" + }, + "isSC": {} + }, + "0x48c87cdacb6bb6bf6e5cd85d8ee5c847084c7410": { + "name": "HAMS token contract", + "address": "0x48c87cdacb6bb6bf6e5cd85d8ee5c847084c7410", + "token": { + "decimals": 18, + "symbol": "HAMS" + }, + "isSC": {} + }, + "0xad78d154baec2e9b4e78182d02388981b5093f80": { + "name": "SOY token contract", + "address": "0xad78d154baec2e9b4e78182d02388981b5093f80", + "token": { + "decimals": 18, + "symbol": "SOY" + }, + "isSC": {} + }, + "0x57ca1f39b0757b8610617e90fa9b2980ccebfece": { + "name": "ORDIFI token contract", + "address": "0x57ca1f39b0757b8610617e90fa9b2980ccebfece", + "token": { + "decimals": 9, + "symbol": "ORDIFI" + }, + "isSC": {} + }, + "0x0b63128c40737b13647552e0c926bcfeccc35f93": { + "name": "WLITI token contract", + "address": "0x0b63128c40737b13647552e0c926bcfeccc35f93", + "token": { + "decimals": 18, + "symbol": "WLITI" + }, + "isSC": {} + }, + "0xf8ebf4849f1fa4faf0dff2106a173d3a6cb2eb3a": { + "name": "TROLL token contract", + "address": "0xf8ebf4849f1fa4faf0dff2106a173d3a6cb2eb3a", + "token": { + "decimals": 18, + "symbol": "TROLL" + }, + "isSC": {} + }, + "0x16cda4028e9e872a38acb903176719299beaed87": { + "name": "MARS4 token contract", + "address": "0x16cda4028e9e872a38acb903176719299beaed87", + "token": { + "decimals": 18, + "symbol": "MARS4" + }, + "isSC": {} + }, + "0x88303fed02b31db9c7a9eafb711da9ef4a03e5d3": { + "name": "ZIK token contract", + "address": "0x88303fed02b31db9c7a9eafb711da9ef4a03e5d3", + "token": { + "decimals": 18, + "symbol": "ZIK" + }, + "isSC": {} + }, + "0x544d230f0362f3843fda5caa99b94cb2b336e384": { + "name": "MAG token contract", + "address": "0x544d230f0362f3843fda5caa99b94cb2b336e384", + "token": { + "decimals": 9, + "symbol": "MAG" + }, + "isSC": {} + }, + "0xc6c9448a86882d73164a984fa52285ab51c823bc": { + "name": "RPILL token contract", + "address": "0xc6c9448a86882d73164a984fa52285ab51c823bc", + "token": { + "decimals": 18, + "symbol": "RPILL" + }, + "isSC": {} + }, + "0xfe2e637202056d30016725477c5da089ab0a043a": { + "name": "SETH2 token contract", + "address": "0xfe2e637202056d30016725477c5da089ab0a043a", + "token": { + "decimals": 18, + "symbol": "SETH2" + }, + "isSC": {} + }, + "0x642b62daebd3b46b03208a5e590a9d87a88fbdac": { + "name": "ALLIN token contract", + "address": "0x642b62daebd3b46b03208a5e590a9d87a88fbdac", + "token": { + "decimals": 9, + "symbol": "ALLIN" + }, + "isSC": {} + }, + "0x341c05c0e9b33c0e38d64de76516b2ce970bb3be": { + "name": "DSETH token contract", + "address": "0x341c05c0e9b33c0e38d64de76516b2ce970bb3be", + "token": { + "decimals": 18, + "symbol": "DSETH" + }, + "isSC": {} + }, + "0xf3b9569f82b18aef890de263b84189bd33ebe452": { + "name": "CAW token contract", + "address": "0xf3b9569f82b18aef890de263b84189bd33ebe452", + "token": { + "decimals": 18, + "symbol": "CAW" + }, + "isSC": {} + }, + "0x0f9f1044d1a30d08fb90c4ec0d3a066c8a8f7b20": { + "name": "CHIBI token contract", + "address": "0x0f9f1044d1a30d08fb90c4ec0d3a066c8a8f7b20", + "token": { + "decimals": 8, + "symbol": "CHIBI" + }, + "isSC": {} + }, + "0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3": { + "name": "FODL token contract", + "address": "0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3", + "token": { + "decimals": 18, + "symbol": "FODL" + }, + "isSC": {} + }, + "0xe04f47ff45576249bc5083dfdf987e03d0550113": { + "name": "SAMA token contract", + "address": "0xe04f47ff45576249bc5083dfdf987e03d0550113", + "token": { + "decimals": 18, + "symbol": "SAMA" + }, + "isSC": {} + }, + "0x9b00e6e8d787b13756eb919786c9745054db64f9": { + "name": "WSIENNA token contract", + "address": "0x9b00e6e8d787b13756eb919786c9745054db64f9", + "token": { + "decimals": 18, + "symbol": "WSIENNA" + }, + "isSC": {} + }, + "0x2388821b40f3ab780f09e97b42b7b577d37a6d5e": { + "name": "GROKX token contract", + "address": "0x2388821b40f3ab780f09e97b42b7b577d37a6d5e", + "token": { + "decimals": 18, + "symbol": "GROKX" + }, + "isSC": {} + }, + "0x3d658390460295fb963f54dc0899cfb1c30776df": { + "name": "COVAL token contract", + "address": "0x3d658390460295fb963f54dc0899cfb1c30776df", + "token": { + "decimals": 8, + "symbol": "COVAL" + }, + "isSC": {} + }, + "0xac3211a5025414af2866ff09c23fc18bc97e79b1": { + "name": "DOV token contract", + "address": "0xac3211a5025414af2866ff09c23fc18bc97e79b1", + "token": { + "decimals": 18, + "symbol": "DOV" + }, + "isSC": {} + }, + "0x4f5fa8f2d12e5eb780f6082dd656c565c48e0f24": { + "name": "GUM token contract", + "address": "0x4f5fa8f2d12e5eb780f6082dd656c565c48e0f24", + "token": { + "decimals": 18, + "symbol": "GUM" + }, + "isSC": {} + }, + "0xbba39fd2935d5769116ce38d46a71bde9cf03099": { + "name": "CHO token contract", + "address": "0xbba39fd2935d5769116ce38d46a71bde9cf03099", + "token": { + "decimals": 18, + "symbol": "CHO" + }, + "isSC": {} + }, + "0xa974bafd35033ef7c3903bb37d109e7f8920c668": { + "name": "CM token contract", + "address": "0xa974bafd35033ef7c3903bb37d109e7f8920c668", + "token": { + "decimals": 9, + "symbol": "CM" + }, + "isSC": {} + }, + "0x5d858bcd53e085920620549214a8b27ce2f04670": { + "name": "POP Network Token", + "address": "0x5d858bcd53e085920620549214a8b27ce2f04670", + "token": { + "decimals": 18, + "symbol": "POP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/POP.svg" + }, + "0x29c56e7cb9c840d2b2371b17e28bab44ad3c3ead": { + "name": "ESPRO token contract", + "address": "0x29c56e7cb9c840d2b2371b17e28bab44ad3c3ead", + "token": { + "decimals": 18, + "symbol": "ESPRO" + }, + "isSC": {} + }, + "0x89509aa1d14a8e1e5364ec4c3b041213bcdbe08d": { + "name": "ZURR token contract", + "address": "0x89509aa1d14a8e1e5364ec4c3b041213bcdbe08d", + "token": { + "decimals": 18, + "symbol": "ZURR" + }, + "isSC": {} + }, + "0x4161725d019690a3e0de50f6be67b07a86a9fae1": { + "name": "TPT token contract", + "address": "0x4161725d019690a3e0de50f6be67b07a86a9fae1", + "token": { + "decimals": 4, + "symbol": "TPT" + }, + "isSC": {} + }, + "0xbc8b7ff89eb2b73ecdd579f81424a3b582200808": { + "name": "CRVY token contract", + "address": "0xbc8b7ff89eb2b73ecdd579f81424a3b582200808", + "token": { + "decimals": 18, + "symbol": "CRVY" + }, + "isSC": {} + }, + "0xe5b826ca2ca02f09c1725e9bd98d9a8874c30532": { + "name": "ZEON Network", + "address": "0xe5b826ca2ca02f09c1725e9bd98d9a8874c30532", + "token": { + "decimals": 18, + "symbol": "ZEON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ZEON_logo.png" + }, + "0x5165d24277cd063f5ac44efd447b27025e888f37": { + "name": "Aave YFI", + "address": "0x5165d24277cd063f5ac44efd447b27025e888f37", + "token": { + "decimals": 18, + "symbol": "aYFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aYFI.svg" + }, + "0x280df82db83abb0a4c734bb02afc7985a1c8eaf2": { + "name": "EPETS token contract", + "address": "0x280df82db83abb0a4c734bb02afc7985a1c8eaf2", + "token": { + "decimals": 9, + "symbol": "EPETS" + }, + "isSC": {} + }, + "0x9f9913853f749b3fe6d6d4e16a1cc3c1656b6d51": { + "name": "BITT token contract", + "address": "0x9f9913853f749b3fe6d6d4e16a1cc3c1656b6d51", + "token": { + "decimals": 18, + "symbol": "BITT" + }, + "isSC": {} + }, + "0x66d4e39c355a911f6d19b3612785b63184a57c72": { + "name": "VARK token contract", + "address": "0x66d4e39c355a911f6d19b3612785b63184a57c72", + "token": { + "decimals": 18, + "symbol": "VARK" + }, + "isSC": {} + }, + "0x0038e74ff4dad34404e74b0cb96db8ca26efc24d": { + "name": "SODO token contract", + "address": "0x0038e74ff4dad34404e74b0cb96db8ca26efc24d", + "token": { + "decimals": 18, + "symbol": "SODO" + }, + "isSC": {} + }, + "0x9c4a4204b79dd291d6b6571c5be8bbcd0622f050": { + "name": "TCR token contract", + "address": "0x9c4a4204b79dd291d6b6571c5be8bbcd0622f050", + "token": { + "decimals": 18, + "symbol": "TCR" + }, + "isSC": {} + }, + "0x08037036451c768465369431da5c671ad9b37dbc": { + "name": "NFTS token contract", + "address": "0x08037036451c768465369431da5c671ad9b37dbc", + "token": { + "decimals": 18, + "symbol": "NFTS" + }, + "isSC": {} + }, + "0x42dae489f1ca3764aabe1907c22bc18776415fcd": { + "name": "VCT token contract", + "address": "0x42dae489f1ca3764aabe1907c22bc18776415fcd", + "token": { + "decimals": 18, + "symbol": "VCT" + }, + "isSC": {} + }, + "0xe020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf": { + "name": "ARCD token contract", + "address": "0xe020b01b6fbd83066aa2e8ee0ccd1eb8d9cc70bf", + "token": { + "decimals": 18, + "symbol": "ARCD" + }, + "isSC": {} + }, + "0x0d88ed6e74bbfd96b831231638b66c05571e824f": { + "name": "Aventus", + "address": "0x0d88ed6e74bbfd96b831231638b66c05571e824f", + "token": { + "decimals": 18, + "symbol": "AVT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aventus.svg" + }, + "0x238cefec182679c27a3035713416fa0a8198b302": { + "name": "GMEME token contract", + "address": "0x238cefec182679c27a3035713416fa0a8198b302", + "token": { + "decimals": 18, + "symbol": "GMEME" + }, + "isSC": {} + }, + "0xb9d7dddca9a4ac480991865efef82e01273f79c3": { + "name": "BLUSD token contract", + "address": "0xb9d7dddca9a4ac480991865efef82e01273f79c3", + "token": { + "decimals": 18, + "symbol": "BLUSD" + }, + "isSC": {} + }, + "0xf2051511b9b121394fa75b8f7d4e7424337af687": { + "name": "HAUS token contract", + "address": "0xf2051511b9b121394fa75b8f7d4e7424337af687", + "token": { + "decimals": 18, + "symbol": "HAUS" + }, + "isSC": {} + }, + "0x2d787d4f5005bd66ac910c2e821241625c406ed5": { + "name": "BERRY token contract", + "address": "0x2d787d4f5005bd66ac910c2e821241625c406ed5", + "token": { + "decimals": 18, + "symbol": "BERRY" + }, + "isSC": {} + }, + "0x861950d091704c80b2a0f69d4b3431f0aed7dc7a": { + "name": "MAGIC token contract", + "address": "0x861950d091704c80b2a0f69d4b3431f0aed7dc7a", + "token": { + "decimals": 18, + "symbol": "MAGIC" + }, + "isSC": {} + }, + "0xe7976c4efc60d9f4c200cc1bcef1a1e3b02c73e7": { + "name": "MAX token contract", + "address": "0xe7976c4efc60d9f4c200cc1bcef1a1e3b02c73e7", + "token": { + "decimals": 18, + "symbol": "MAX" + }, + "isSC": {} + }, + "0xa01199c61841fce3b3dafb83fefc1899715c8756": { + "name": "CIRUS token contract", + "address": "0xa01199c61841fce3b3dafb83fefc1899715c8756", + "token": { + "decimals": 18, + "symbol": "CIRUS" + }, + "isSC": {} + }, + "0xa0cf46eb152656c7090e769916eb44a138aaa406": { + "name": "SPH token contract", + "address": "0xa0cf46eb152656c7090e769916eb44a138aaa406", + "token": { + "decimals": 18, + "symbol": "SPH" + }, + "isSC": {} + }, + "0x5ca381bbfb58f0092df149bd3d243b08b9a8386e": { + "name": "MXC token contract", + "address": "0x5ca381bbfb58f0092df149bd3d243b08b9a8386e", + "token": { + "decimals": 18, + "symbol": "MXC" + }, + "isSC": {} + }, + "0x3ef3b555842cdaff0f4f0b79c9dd65096d60ba63": { + "name": "CPRC token contract", + "address": "0x3ef3b555842cdaff0f4f0b79c9dd65096d60ba63", + "token": { + "decimals": 18, + "symbol": "CPRC" + }, + "isSC": {} + }, + "0x621879c6239d8ab9b82712fb56e7be880ce0c6ee": { + "name": "OMNIX token contract", + "address": "0x621879c6239d8ab9b82712fb56e7be880ce0c6ee", + "token": { + "decimals": 18, + "symbol": "OMNIX" + }, + "isSC": {} + }, + "0x5d43b66da68706d39f6c97f7f1415615672b446b": { + "name": "ROG token contract", + "address": "0x5d43b66da68706d39f6c97f7f1415615672b446b", + "token": { + "decimals": 18, + "symbol": "ROG" + }, + "isSC": {} + }, + "0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a": { + "name": "Populous", + "address": "0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a", + "token": { + "decimals": 8, + "symbol": "PPT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ppt.svg" + }, + "0xfb782396c9b20e564a64896181c7ac8d8979d5f4": { + "name": "DIVER token contract", + "address": "0xfb782396c9b20e564a64896181c7ac8d8979d5f4", + "token": { + "decimals": 18, + "symbol": "DIVER" + }, + "isSC": {} + }, + "0x8530b66ca3ddf50e0447eae8ad7ea7d5e62762ed": { + "name": "METADOGE token contract", + "address": "0x8530b66ca3ddf50e0447eae8ad7ea7d5e62762ed", + "token": { + "decimals": 18, + "symbol": "METADOGE" + }, + "isSC": {} + }, + "0xb4039240e71535100be947116c778d5d98bd9f62": { + "name": "MSHIB token contract", + "address": "0xb4039240e71535100be947116c778d5d98bd9f62", + "token": { + "decimals": 18, + "symbol": "MSHIB" + }, + "isSC": {} + }, + "0x8013266cb5c9dd48be3ad7d1ce832874d64b3ce1": { + "name": "BOOP token contract", + "address": "0x8013266cb5c9dd48be3ad7d1ce832874d64b3ce1", + "token": { + "decimals": 18, + "symbol": "BOOP" + }, + "isSC": {} + }, + "0xe02f72be83855c9e400fd9cd9f83158abfc87053": { + "name": "CMBOT token contract", + "address": "0xe02f72be83855c9e400fd9cd9f83158abfc87053", + "token": { + "decimals": 8, + "symbol": "CMBOT" + }, + "isSC": {} + }, + "0x808632424440f6483d9be7509812b53ed0f00344": { + "name": "MECHA token contract", + "address": "0x808632424440f6483d9be7509812b53ed0f00344", + "token": { + "decimals": 18, + "symbol": "MECHA" + }, + "isSC": {} + }, + "0xa9d54f37ebb99f83b603cc95fc1a5f3907aaccfd": { + "name": "PIKA token contract", + "address": "0xa9d54f37ebb99f83b603cc95fc1a5f3907aaccfd", + "token": { + "decimals": 18, + "symbol": "PIKA" + }, + "isSC": {} + }, + "0xe4cfe9eaa8cdb0942a80b7bc68fd8ab0f6d44903": { + "name": "XEND token contract", + "address": "0xe4cfe9eaa8cdb0942a80b7bc68fd8ab0f6d44903", + "token": { + "decimals": 18, + "symbol": "XEND" + }, + "isSC": {} + }, + "0x511686014f39f487e5cdd5c37b4b37606b795ae3": { + "name": "LOYAL token contract", + "address": "0x511686014f39f487e5cdd5c37b4b37606b795ae3", + "token": { + "decimals": 18, + "symbol": "LOYAL" + }, + "isSC": {} + }, + "0x2a9bdcff37ab68b95a53435adfd8892e86084f93": { + "name": "AQT token contract", + "address": "0x2a9bdcff37ab68b95a53435adfd8892e86084f93", + "token": { + "decimals": 18, + "symbol": "AQT" + }, + "isSC": {} + }, + "0x87869a9789291a6cec99f3c3ef2ff71fceb12a8e": { + "name": "CMOS token contract", + "address": "0x87869a9789291a6cec99f3c3ef2ff71fceb12a8e", + "token": { + "decimals": 9, + "symbol": "CMOS" + }, + "isSC": {} + }, + "0x455ad1bc4e18fd4e369234b6e11d88acbc416758": { + "name": "BRCT token contract", + "address": "0x455ad1bc4e18fd4e369234b6e11d88acbc416758", + "token": { + "decimals": 18, + "symbol": "BRCT" + }, + "isSC": {} + }, + "0x80f0c1c49891dcfdd40b6e0f960f84e6042bcb6f": { + "name": "DXN token contract", + "address": "0x80f0c1c49891dcfdd40b6e0f960f84e6042bcb6f", + "token": { + "decimals": 18, + "symbol": "DXN" + }, + "isSC": {} + }, + "0x033e223870f766644f7f7a4b7dc2e91573707d06": { + "name": "ZIN token contract", + "address": "0x033e223870f766644f7f7a4b7dc2e91573707d06", + "token": { + "decimals": 18, + "symbol": "ZIN" + }, + "isSC": {} + }, + "0xb7cfe05915ef0c040c6dde2007c9ddab26259e04": { + "name": "MOLLY token contract", + "address": "0xb7cfe05915ef0c040c6dde2007c9ddab26259e04", + "token": { + "decimals": 18, + "symbol": "MOLLY" + }, + "isSC": {} + }, + "0x02e7ac540409d32c90bfb51114003a9e1ff0249c": { + "name": "JPG token contract", + "address": "0x02e7ac540409d32c90bfb51114003a9e1ff0249c", + "token": { + "decimals": 18, + "symbol": "JPG" + }, + "isSC": {} + }, + "0x7c95e7ad2b349dc2f82d0f1117a44b561fa2699a": { + "name": "GRACY token contract", + "address": "0x7c95e7ad2b349dc2f82d0f1117a44b561fa2699a", + "token": { + "decimals": 18, + "symbol": "GRACY" + }, + "isSC": {} + }, + "0xd075e95423c5c4ba1e122cae0f4cdfa19b82881b": { + "name": "WPE token contract", + "address": "0xd075e95423c5c4ba1e122cae0f4cdfa19b82881b", + "token": { + "decimals": 18, + "symbol": "WPE" + }, + "isSC": {} + }, + "0xd96e84ddbc7cbe1d73c55b6fe8c64f3a6550deea": { + "name": "GMAC token contract", + "address": "0xd96e84ddbc7cbe1d73c55b6fe8c64f3a6550deea", + "token": { + "decimals": 18, + "symbol": "GMAC" + }, + "isSC": {} + }, + "0xfd414e39155f91e94443a9fe97e856569d0f5eec": { + "name": "SERP token contract", + "address": "0xfd414e39155f91e94443a9fe97e856569d0f5eec", + "token": { + "decimals": 9, + "symbol": "SERP" + }, + "isSC": {} + }, + "0xd5d86fc8d5c0ea1ac1ac5dfab6e529c9967a45e9": { + "name": "WRLD token contract", + "address": "0xd5d86fc8d5c0ea1ac1ac5dfab6e529c9967a45e9", + "token": { + "decimals": 18, + "symbol": "WRLD" + }, + "isSC": {} + }, + "0xea60cd69f2b9fd6eb067bddbbf86a5bdeffbbc55": { + "name": "WECAN token contract", + "address": "0xea60cd69f2b9fd6eb067bddbbf86a5bdeffbbc55", + "token": { + "decimals": 18, + "symbol": "WECAN" + }, + "isSC": {} + }, + "0x01b23286ff60a543ec29366ae8d6b6274ca20541": { + "name": "BMP token contract", + "address": "0x01b23286ff60a543ec29366ae8d6b6274ca20541", + "token": { + "decimals": 18, + "symbol": "BMP" + }, + "isSC": {} + }, + "0x8727c112c712c4a03371ac87a74dd6ab104af768": { + "name": "Jetcoin Institute Token", + "address": "0x8727c112c712c4a03371ac87a74dd6ab104af768", + "token": { + "decimals": 18, + "symbol": "JET" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/JETCOIN28.png" + }, + "0x9d0b65a76274645b29e4cc41b8f23081fa09f4a3": { + "name": "LIME token contract", + "address": "0x9d0b65a76274645b29e4cc41b8f23081fa09f4a3", + "token": { + "decimals": 18, + "symbol": "LIME" + }, + "isSC": {} + }, + "0x95b4ef2869ebd94beb4eee400a99824bf5dc325b": { + "name": "CMKR token contract", + "address": "0x95b4ef2869ebd94beb4eee400a99824bf5dc325b", + "token": { + "decimals": 8, + "symbol": "CMKR" + }, + "isSC": {} + }, + "0xb8baa0e4287890a5f79863ab62b7f175cecbd433": { + "name": "Swerve DAO Token", + "address": "0xb8baa0e4287890a5f79863ab62b7f175cecbd433", + "token": { + "decimals": 18, + "symbol": "SWRV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/swrv.svg" + }, + "0x5c0590cde44569bf39ef79e859b367e39cb000f1": { + "name": "HIVALHALLA token contract", + "address": "0x5c0590cde44569bf39ef79e859b367e39cb000f1", + "token": { + "decimals": 18, + "symbol": "HIVALHALLA" + }, + "isSC": {} + }, + "0x3d806324b6df5af3c1a81acba14a8a62fe6d643f": { + "name": "SOLANA token contract", + "address": "0x3d806324b6df5af3c1a81acba14a8a62fe6d643f", + "token": { + "decimals": 18, + "symbol": "SOLANA" + }, + "isSC": {} + }, + "0xa704662ecb62be83f88ca1a3b5277a381cb32dce": { + "name": "BUZZ token contract", + "address": "0xa704662ecb62be83f88ca1a3b5277a381cb32dce", + "token": { + "decimals": 18, + "symbol": "BUZZ" + }, + "isSC": {} + }, + "0xfe6f2e70f30a0894d0aee79e11653275e89c7bd6": { + "name": "KEPE token contract", + "address": "0xfe6f2e70f30a0894d0aee79e11653275e89c7bd6", + "token": { + "decimals": 18, + "symbol": "KEPE" + }, + "isSC": {} + }, + "0x2c537e5624e4af88a7ae4060c022609376c8d0eb": { + "name": "TRYB token contract", + "address": "0x2c537e5624e4af88a7ae4060c022609376c8d0eb", + "token": { + "decimals": 6, + "symbol": "TRYB" + }, + "isSC": {} + }, + "0x99f618edcfedca1fcc8302e14daa84802114a8c5": { + "name": "DBNB token contract", + "address": "0x99f618edcfedca1fcc8302e14daa84802114a8c5", + "token": { + "decimals": 9, + "symbol": "DBNB" + }, + "isSC": {} + }, + "0x67d85a291fcdc862a78812a3c26d55e28ffb2701": { + "name": "ASX token contract", + "address": "0x67d85a291fcdc862a78812a3c26d55e28ffb2701", + "token": { + "decimals": 18, + "symbol": "ASX" + }, + "isSC": {} + }, + "0xb1191f691a355b43542bea9b8847bc73e7abb137": { + "name": "KIRO token contract", + "address": "0xb1191f691a355b43542bea9b8847bc73e7abb137", + "token": { + "decimals": 18, + "symbol": "KIRO" + }, + "isSC": {} + }, + "0x9a7703338730b82a803ba050df55f9b3959f3fb2": { + "name": "CHIKUN token contract", + "address": "0x9a7703338730b82a803ba050df55f9b3959f3fb2", + "token": { + "decimals": 9, + "symbol": "CHIKUN" + }, + "isSC": {} + }, + "0xbe9895146f7af43049ca1c1ae358b0541ea49704": { + "name": "CBETH token contract", + "address": "0xbe9895146f7af43049ca1c1ae358b0541ea49704", + "token": { + "decimals": 18, + "symbol": "CBETH" + }, + "isSC": {} + }, + "0x986ee2b944c42d017f52af21c4c69b84dbea35d8": { + "name": "BitMartToken", + "address": "0x986ee2b944c42d017f52af21c4c69b84dbea35d8", + "token": { + "decimals": 18, + "symbol": "BMX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bitmart.png" + }, + "0xba58444c8050ed9385b7417533a73644036d21eb": { + "name": "LOGT token contract", + "address": "0xba58444c8050ed9385b7417533a73644036d21eb", + "token": { + "decimals": 18, + "symbol": "LOGT" + }, + "isSC": {} + }, + "0x5362ca75aa3c0e714bc628296640c43dc5cb9ed6": { + "name": "HOSHI token contract", + "address": "0x5362ca75aa3c0e714bc628296640c43dc5cb9ed6", + "token": { + "decimals": 9, + "symbol": "HOSHI" + }, + "isSC": {} + }, + "0x72dd4b6bd852a3aa172be4d6c5a6dbec588cf131": { + "name": "NGC token contract", + "address": "0x72dd4b6bd852a3aa172be4d6c5a6dbec588cf131", + "token": { + "decimals": 18, + "symbol": "NGC" + }, + "isSC": {} + }, + "0x33c04bed4533e31f2afb8ac4a61a48eda38c4fa0": { + "name": "GORILLA token contract", + "address": "0x33c04bed4533e31f2afb8ac4a61a48eda38c4fa0", + "token": { + "decimals": 9, + "symbol": "GORILLA" + }, + "isSC": {} + }, + "0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713": { + "name": "COVER token contract", + "address": "0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713", + "token": { + "decimals": 18, + "symbol": "COVER" + }, + "isSC": {} + }, + "0x2920f7d6134f4669343e70122ca9b8f19ef8fa5d": { + "name": "MONO token contract", + "address": "0x2920f7d6134f4669343e70122ca9b8f19ef8fa5d", + "token": { + "decimals": 18, + "symbol": "MONO" + }, + "isSC": {} + }, + "0x4d2ee5dae46c86da2ff521f7657dad98834f97b8": { + "name": "PPBLZ token contract", + "address": "0x4d2ee5dae46c86da2ff521f7657dad98834f97b8", + "token": { + "decimals": 18, + "symbol": "PPBLZ" + }, + "isSC": {} + }, + "0xf282484234d905d7229a6c22a0e46bb4b0363ee0": { + "name": "RVS token contract", + "address": "0xf282484234d905d7229a6c22a0e46bb4b0363ee0", + "token": { + "decimals": 9, + "symbol": "RVS" + }, + "isSC": {} + }, + "0xa0dd6dd7775e93eb842db0aa142c9c581031ed3b": { + "name": "MND token contract", + "address": "0xa0dd6dd7775e93eb842db0aa142c9c581031ed3b", + "token": { + "decimals": 18, + "symbol": "MND" + }, + "isSC": {} + }, + "0x1fcdce58959f536621d76f5b7ffb955baa5a672f": { + "name": "FOR token contract", + "address": "0x1fcdce58959f536621d76f5b7ffb955baa5a672f", + "token": { + "decimals": 18, + "symbol": "FOR" + }, + "isSC": {} + }, + "0x28dee01d53fed0edf5f6e310bf8ef9311513ae40": { + "name": "BlitzPredict", + "address": "0x28dee01d53fed0edf5f6e310bf8ef9311513ae40", + "token": { + "decimals": 18, + "symbol": "XBP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/blitzpredict.svg" + }, + "0x19f8ed44aa2f5580d44ca6ed2a0e9bb33a08922d": { + "name": "X-MASS token contract", + "address": "0x19f8ed44aa2f5580d44ca6ed2a0e9bb33a08922d", + "token": { + "decimals": 18, + "symbol": "X-MASS" + }, + "isSC": {} + }, + "0x9be236ee350d18aaaf18619c5776d4096e94a0c7": { + "name": "RATIO token contract", + "address": "0x9be236ee350d18aaaf18619c5776d4096e94a0c7", + "token": { + "decimals": 18, + "symbol": "RATIO" + }, + "isSC": {} + }, + "0x61b57bdc01e3072fab3e9e2f3c7b88d482734e05": { + "name": "MZM token contract", + "address": "0x61b57bdc01e3072fab3e9e2f3c7b88d482734e05", + "token": { + "decimals": 18, + "symbol": "MZM" + }, + "isSC": {} + }, + "0x721a1b990699ee9d90b6327faad0a3e840ae8335": { + "name": "LOOT token contract", + "address": "0x721a1b990699ee9d90b6327faad0a3e840ae8335", + "token": { + "decimals": 18, + "symbol": "LOOT" + }, + "isSC": {} + }, + "0xca3ea3061d638e02113aa960340c98343b5acd62": { + "name": "BWT token contract", + "address": "0xca3ea3061d638e02113aa960340c98343b5acd62", + "token": { + "decimals": 18, + "symbol": "BWT" + }, + "isSC": {} + }, + "0xa1f830aa68b53fd3ee3bb86d7f8254e604740c8b": { + "name": "CHAINS token contract", + "address": "0xa1f830aa68b53fd3ee3bb86d7f8254e604740c8b", + "token": { + "decimals": 18, + "symbol": "CHAINS" + }, + "isSC": {} + }, + "0xa711bcc2b6f5c4fc3dfaccc2a01148765cbbab1c": { + "name": "GROK15 token contract", + "address": "0xa711bcc2b6f5c4fc3dfaccc2a01148765cbbab1c", + "token": { + "decimals": 9, + "symbol": "GROK15" + }, + "isSC": {} + }, + "0x99b600d0a4abdbc4a6796225a160bcf3d5ce2a89": { + "name": "SRM token contract", + "address": "0x99b600d0a4abdbc4a6796225a160bcf3d5ce2a89", + "token": { + "decimals": 18, + "symbol": "SRM" + }, + "isSC": {} + }, + "0x3adf095d04311d7bf05c838f0d3dc34a83d81ab6": { + "name": "SHILLD token contract", + "address": "0x3adf095d04311d7bf05c838f0d3dc34a83d81ab6", + "token": { + "decimals": 18, + "symbol": "SHILLD" + }, + "isSC": {} + }, + "0x83984d6142934bb535793a82adb0a46ef0f66b6d": { + "name": "REM token contract", + "address": "0x83984d6142934bb535793a82adb0a46ef0f66b6d", + "token": { + "decimals": 4, + "symbol": "REM" + }, + "isSC": {} + }, + "0x58fcaa970339a9b1f8c0a5b4f3fcd7af2ba3075e": { + "name": "POLAR token contract", + "address": "0x58fcaa970339a9b1f8c0a5b4f3fcd7af2ba3075e", + "token": { + "decimals": 18, + "symbol": "POLAR" + }, + "isSC": {} + }, + "0x624d520bab2e4ad83935fa503fb130614374e850": { + "name": "SSP token contract", + "address": "0x624d520bab2e4ad83935fa503fb130614374e850", + "token": { + "decimals": 4, + "symbol": "SSP" + }, + "isSC": {} + }, + "0xc7f950271d118a5bdf250dffc39128dcced8472c": { + "name": "ARCHIVE token contract", + "address": "0xc7f950271d118a5bdf250dffc39128dcced8472c", + "token": { + "decimals": 18, + "symbol": "ARCHIVE" + }, + "isSC": {} + }, + "0xf7ff660cbdcc5d0ba48988119144425974d88792": { + "name": "SCOPE token contract", + "address": "0xf7ff660cbdcc5d0ba48988119144425974d88792", + "token": { + "decimals": 9, + "symbol": "SCOPE" + }, + "isSC": {} + }, + "0x4df812f6064def1e5e029f1ca858777cc98d2d81": { + "name": "Xaurum", + "address": "0x4df812f6064def1e5e029f1ca858777cc98d2d81", + "token": { + "decimals": 8, + "symbol": "XAUR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/xaurum_logo.svg" + }, + "0x6f3cbe18e9381dec6026e6cb8166c13944fcfee1": { + "name": "FELIX token contract", + "address": "0x6f3cbe18e9381dec6026e6cb8166c13944fcfee1", + "token": { + "decimals": 9, + "symbol": "FELIX" + }, + "isSC": {} + }, + "0xcfcecfe2bd2fed07a9145222e8a7ad9cf1ccd22a": { + "name": "ADS token contract", + "address": "0xcfcecfe2bd2fed07a9145222e8a7ad9cf1ccd22a", + "token": { + "decimals": 11, + "symbol": "ADS" + }, + "isSC": {} + }, + "0x2370f9d504c7a6e775bf6e14b3f12846b594cd53": { + "name": "JPYC token contract", + "address": "0x2370f9d504c7a6e775bf6e14b3f12846b594cd53", + "token": { + "decimals": 18, + "symbol": "JPYC" + }, + "isSC": {} + }, + "0x9f83ed4fdf636e8b0562ac704267346712b44c36": { + "name": "UMFER token contract", + "address": "0x9f83ed4fdf636e8b0562ac704267346712b44c36", + "token": { + "decimals": 18, + "symbol": "UMFER" + }, + "isSC": {} + }, + "0xba745513acebcbb977497c569d4f7d340f2a936b": { + "name": "MFTU token contract", + "address": "0xba745513acebcbb977497c569d4f7d340f2a936b", + "token": { + "decimals": 18, + "symbol": "MFTU" + }, + "isSC": {} + }, + "0x92e52a1a235d9a103d970901066ce910aacefd37": { + "name": "UCASH token contract", + "address": "0x92e52a1a235d9a103d970901066ce910aacefd37", + "token": { + "decimals": 8, + "symbol": "UCASH" + }, + "isSC": {} + }, + "0xaada04204e9e1099daf67cf3d5d137e84e41cf41": { + "name": "PEEPO token contract", + "address": "0xaada04204e9e1099daf67cf3d5d137e84e41cf41", + "token": { + "decimals": 18, + "symbol": "PEEPO" + }, + "isSC": {} + }, + "0x865377367054516e17014ccded1e7d814edc9ce4": { + "name": "DOLA token contract", + "address": "0x865377367054516e17014ccded1e7d814edc9ce4", + "token": { + "decimals": 18, + "symbol": "DOLA" + }, + "isSC": {} + }, + "0x4de914f49f04c943dbde7e4f8017d08b51ad657c": { + "name": "ORACLE token contract", + "address": "0x4de914f49f04c943dbde7e4f8017d08b51ad657c", + "token": { + "decimals": 18, + "symbol": "ORACLE" + }, + "isSC": {} + }, + "0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009": { + "name": "SingularDTV", + "address": "0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009", + "token": { + "decimals": 0, + "symbol": "SNGLS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/singulardtv.svg" + }, + "0x9bf1d7d63dd7a4ce167cf4866388226eeefa702e": { + "name": "Ben Coin", + "address": "0x9bf1d7d63dd7a4ce167cf4866388226eeefa702e", + "token": { + "decimals": 18, + "symbol": "BEN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BEN.svg" + }, + "0xcdf7028ceab81fa0c6971208e83fa7872994bee5": { + "name": "T token contract", + "address": "0xcdf7028ceab81fa0c6971208e83fa7872994bee5", + "token": { + "decimals": 18, + "symbol": "T" + }, + "isSC": {} + }, + "0x333a4823466879eef910a04d473505da62142069": { + "name": "NATION token contract", + "address": "0x333a4823466879eef910a04d473505da62142069", + "token": { + "decimals": 18, + "symbol": "NATION" + }, + "isSC": {} + }, + "0xf16e81dce15b08f326220742020379b855b87df9": { + "name": "ICE token contract", + "address": "0xf16e81dce15b08f326220742020379b855b87df9", + "token": { + "decimals": 18, + "symbol": "ICE" + }, + "isSC": {} + }, + "0x17729f7ffddd4ed480cf4cfb1668ef90d1e6a24e": { + "name": "EVEX token contract", + "address": "0x17729f7ffddd4ed480cf4cfb1668ef90d1e6a24e", + "token": { + "decimals": 18, + "symbol": "EVEX" + }, + "isSC": {} + }, + "0x4e8de529fe22dee9266b029cdfc52142b82e0e2f": { + "name": "VEGS token contract", + "address": "0x4e8de529fe22dee9266b029cdfc52142b82e0e2f", + "token": { + "decimals": 0, + "symbol": "VEGS" + }, + "isSC": {} + }, + "0x0257ffd7ea2ebba4aaa090c7adbdd032a08c1f74": { + "name": "ZELIX token contract", + "address": "0x0257ffd7ea2ebba4aaa090c7adbdd032a08c1f74", + "token": { + "decimals": 18, + "symbol": "ZELIX" + }, + "isSC": {} + }, + "0x2f57430a6ceda85a67121757785877b4a71b8e6d": { + "name": "DFP2 token contract", + "address": "0x2f57430a6ceda85a67121757785877b4a71b8e6d", + "token": { + "decimals": 18, + "symbol": "DFP2" + }, + "isSC": {} + }, + "0x451fd37983d494bce294295f78a426832376b7df": { + "name": "XENO token contract", + "address": "0x451fd37983d494bce294295f78a426832376b7df", + "token": { + "decimals": 9, + "symbol": "XENO" + }, + "isSC": {} + }, + "0x73c9275c3a2dd84b5741fd59aebf102c91eb033f": { + "name": "BTRS token contract", + "address": "0x73c9275c3a2dd84b5741fd59aebf102c91eb033f", + "token": { + "decimals": 18, + "symbol": "BTRS" + }, + "isSC": {} + }, + "0x1892f6ff5fbe11c31158f8c6f6f6e33106c5b10e": { + "name": "MEGA token contract", + "address": "0x1892f6ff5fbe11c31158f8c6f6f6e33106c5b10e", + "token": { + "decimals": 18, + "symbol": "MEGA" + }, + "isSC": {} + }, + "0x08f40811c7d6c013744166f3d4cb1a9a92d3d54e": { + "name": "NVG token contract", + "address": "0x08f40811c7d6c013744166f3d4cb1a9a92d3d54e", + "token": { + "decimals": 18, + "symbol": "NVG" + }, + "isSC": {} + }, + "0x9d1a74967eca155782edf8e84782c74db33fc499": { + "name": "AICOM token contract", + "address": "0x9d1a74967eca155782edf8e84782c74db33fc499", + "token": { + "decimals": 9, + "symbol": "AICOM" + }, + "isSC": {} + }, + "0x4c612e3b15b96ff9a6faed838f8d07d479a8dd4c": { + "name": "ASDAI token contract", + "address": "0x4c612e3b15b96ff9a6faed838f8d07d479a8dd4c", + "token": { + "decimals": 18, + "symbol": "ASDAI" + }, + "isSC": {} + }, + "0xaf4dce16da2877f8c9e00544c93b62ac40631f16": { + "name": "MTH token contract", + "address": "0xaf4dce16da2877f8c9e00544c93b62ac40631f16", + "token": { + "decimals": 5, + "symbol": "MTH" + }, + "isSC": {} + }, + "0x36948a6809be82d3ba8de9f2be626101e2c9e473": { + "name": "BOLT token contract", + "address": "0x36948a6809be82d3ba8de9f2be626101e2c9e473", + "token": { + "decimals": 9, + "symbol": "BOLT" + }, + "isSC": {} + }, + "0x2610f0bfc21ef389fe4d03cfb7de9ac1e6c99d6e": { + "name": "SKYRIM token contract", + "address": "0x2610f0bfc21ef389fe4d03cfb7de9ac1e6c99d6e", + "token": { + "decimals": 18, + "symbol": "SKYRIM" + }, + "isSC": {} + }, + "0xdf7ff54aacacbff42dfe29dd6144a69b629f8c9e": { + "name": "Aave ZRX", + "address": "0xdf7ff54aacacbff42dfe29dd6144a69b629f8c9e", + "token": { + "decimals": 18, + "symbol": "aZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aZRX.svg" + }, + "0x3f5294df68f871241c4b18fcf78ebd8ac18ab654": { + "name": "STZ token contract", + "address": "0x3f5294df68f871241c4b18fcf78ebd8ac18ab654", + "token": { + "decimals": 18, + "symbol": "STZ" + }, + "isSC": {} + }, + "0x35f6b052c598d933d69a4eec4d04c73a191fe6c2": { + "name": "Aave SNX", + "address": "0x35f6b052c598d933d69a4eec4d04c73a191fe6c2", + "token": { + "decimals": 18, + "symbol": "aSNX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aSNX.svg" + }, + "0x616ef40d55c0d2c506f4d6873bda8090b79bf8fc": { + "name": "KTO token contract", + "address": "0x616ef40d55c0d2c506f4d6873bda8090b79bf8fc", + "token": { + "decimals": 9, + "symbol": "KTO" + }, + "isSC": {} + }, + "0xa700b4eb416be35b2911fd5dee80678ff64ff6c9": { + "name": "AAAVE token contract", + "address": "0xa700b4eb416be35b2911fd5dee80678ff64ff6c9", + "token": { + "decimals": 18, + "symbol": "AAAVE" + }, + "isSC": {} + }, + "0xf59ae934f6fe444afc309586cc60a84a0f89aaea": { + "name": "PDEX token contract", + "address": "0xf59ae934f6fe444afc309586cc60a84a0f89aaea", + "token": { + "decimals": 18, + "symbol": "PDEX" + }, + "isSC": {} + }, + "0x19af07b52e5faa0c2b1e11721c52aa23172fe2f5": { + "name": "MEMES token contract", + "address": "0x19af07b52e5faa0c2b1e11721c52aa23172fe2f5", + "token": { + "decimals": 9, + "symbol": "MEMES" + }, + "isSC": {} + }, + "0x23878914efe38d27c4d67ab83ed1b93a74d4086a": { + "name": "AUSDT token contract", + "address": "0x23878914efe38d27c4d67ab83ed1b93a74d4086a", + "token": { + "decimals": 6, + "symbol": "AUSDT" + }, + "isSC": {} + }, + "0x34f797e7190c131cf630524655a618b5bd8738e7": { + "name": "BACON token contract", + "address": "0x34f797e7190c131cf630524655a618b5bd8738e7", + "token": { + "decimals": 18, + "symbol": "BACON" + }, + "isSC": {} + }, + "0x4a8f5f96d5436e43112c2fbc6a9f70da9e4e16d4": { + "name": "INXT token contract", + "address": "0x4a8f5f96d5436e43112c2fbc6a9f70da9e4e16d4", + "token": { + "decimals": 8, + "symbol": "INXT" + }, + "isSC": {} + }, + "0x16f78145ad0b9af58747e9a97ebd99175378bd3d": { + "name": "GDO token contract", + "address": "0x16f78145ad0b9af58747e9a97ebd99175378bd3d", + "token": { + "decimals": 18, + "symbol": "GDO" + }, + "isSC": {} + }, + "0x5ee5bf7ae06d1be5997a1a72006fe6c607ec6de8": { + "name": "AWBTC token contract", + "address": "0x5ee5bf7ae06d1be5997a1a72006fe6c607ec6de8", + "token": { + "decimals": 8, + "symbol": "AWBTC" + }, + "isSC": {} + }, + "0xcf9fbffec9e0e5bbc62e79bf1965f5db76955661": { + "name": "MESH token contract", + "address": "0xcf9fbffec9e0e5bbc62e79bf1965f5db76955661", + "token": { + "decimals": 18, + "symbol": "MESH" + }, + "isSC": {} + }, + "0xbc194e6f748a222754c3e8b9946922c09e7d4e91": { + "name": "LEV token contract", + "address": "0xbc194e6f748a222754c3e8b9946922c09e7d4e91", + "token": { + "decimals": 18, + "symbol": "LEV" + }, + "isSC": {} + }, + "0x67cc621ab2d086a101cff3340df0a065ac75827c": { + "name": "FLOKI token contract", + "address": "0x67cc621ab2d086a101cff3340df0a065ac75827c", + "token": { + "decimals": 18, + "symbol": "FLOKI" + }, + "isSC": {} + }, + "0x668c50b1c7f46effbe3f242687071d7908aab00a": { + "name": "COSHI token contract", + "address": "0x668c50b1c7f46effbe3f242687071d7908aab00a", + "token": { + "decimals": 9, + "symbol": "COSHI" + }, + "isSC": {} + }, + "0x103bb3ebc6f61b3db2d6e01e54ef7d9899a2e16b": { + "name": "AEDY token contract", + "address": "0x103bb3ebc6f61b3db2d6e01e54ef7d9899a2e16b", + "token": { + "decimals": 18, + "symbol": "AEDY" + }, + "isSC": {} + }, + "0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41": { + "name": "Tixl", + "address": "0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41", + "token": { + "decimals": 18, + "symbol": "TXL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TXL.svg" + }, + "0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374": { + "name": "VERI token contract", + "address": "0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374", + "token": { + "decimals": 18, + "symbol": "VERI" + }, + "isSC": {} + }, + "0x56528c1df17fd5451451eb6efde297758bc8f9a1": { + "name": "AFS token contract", + "address": "0x56528c1df17fd5451451eb6efde297758bc8f9a1", + "token": { + "decimals": 0, + "symbol": "AFS" + }, + "isSC": {} + }, + "0x01e1d7cbd3bc0eb1030485f33708421011459459": { + "name": "TOAD token contract", + "address": "0x01e1d7cbd3bc0eb1030485f33708421011459459", + "token": { + "decimals": 18, + "symbol": "TOAD" + }, + "isSC": {} + }, + "0x2391b8147caef113787972abbdaf77f4bae0cf22": { + "name": "ARC token contract", + "address": "0x2391b8147caef113787972abbdaf77f4bae0cf22", + "token": { + "decimals": 18, + "symbol": "ARC" + }, + "isSC": {} + }, + "0x73b708e84837ffccde2933e3a1531fe61d5e80ef": { + "name": "BTE token contract", + "address": "0x73b708e84837ffccde2933e3a1531fe61d5e80ef", + "token": { + "decimals": 18, + "symbol": "BTE" + }, + "isSC": {} + }, + "0x2e95cea14dd384429eb3c4331b776c4cfbb6fcd9": { + "name": "THN token contract", + "address": "0x2e95cea14dd384429eb3c4331b776c4cfbb6fcd9", + "token": { + "decimals": 18, + "symbol": "THN" + }, + "isSC": {} + }, + "0x95cba664fa19d2c24b6d60b707dfa7879b51fd57": { + "name": "APEGPT token contract", + "address": "0x95cba664fa19d2c24b6d60b707dfa7879b51fd57", + "token": { + "decimals": 18, + "symbol": "APEGPT" + }, + "isSC": {} + }, + "0x5dfc78c4d073fd343bc6661668948178522a0de5": { + "name": "DERP token contract", + "address": "0x5dfc78c4d073fd343bc6661668948178522a0de5", + "token": { + "decimals": 18, + "symbol": "DERP" + }, + "isSC": {} + }, + "0x9d86b1b2554ec410eccffbf111a6994910111340": { + "name": "OPEN token contract", + "address": "0x9d86b1b2554ec410eccffbf111a6994910111340", + "token": { + "decimals": 8, + "symbol": "OPEN" + }, + "isSC": {} + }, + "0xadf86e75d8f0f57e0288d0970e7407eaa49b3cab": { + "name": "APOLLO token contract", + "address": "0xadf86e75d8f0f57e0288d0970e7407eaa49b3cab", + "token": { + "decimals": 9, + "symbol": "APOLLO" + }, + "isSC": {} + }, + "0x5f190f9082878ca141f858c1c90b4c59fe2782c5": { + "name": "KDOE token contract", + "address": "0x5f190f9082878ca141f858c1c90b4c59fe2782c5", + "token": { + "decimals": 18, + "symbol": "KDOE" + }, + "isSC": {} + }, + "0x2c022e58c5e3ee213f06f975fd8a0d3a6fe9ca1c": { + "name": "FINU token contract", + "address": "0x2c022e58c5e3ee213f06f975fd8a0d3a6fe9ca1c", + "token": { + "decimals": 18, + "symbol": "FINU" + }, + "isSC": {} + }, + "0xaa2d8c9a8bd0f7945143bfd509be3ff23dd78918": { + "name": "ATNT token contract", + "address": "0xaa2d8c9a8bd0f7945143bfd509be3ff23dd78918", + "token": { + "decimals": 3, + "symbol": "ATNT" + }, + "isSC": {} + }, + "0x74a85f68cd947d05585f76118e51b2ed1484a838": { + "name": "DVT token contract", + "address": "0x74a85f68cd947d05585f76118e51b2ed1484a838", + "token": { + "decimals": 18, + "symbol": "DVT" + }, + "isSC": {} + }, + "0x7bef710a5759d197ec0bf621c3df802c2d60d848": { + "name": "SHOPX", + "address": "0x7bef710a5759d197ec0bf621c3df802c2d60d848", + "token": { + "decimals": 18, + "symbol": "SHOPX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SHOPX.svg" + }, + "0x52d30b949bdbc63780e5a263cf436d4df983fe58": { + "name": "ZW token contract", + "address": "0x52d30b949bdbc63780e5a263cf436d4df983fe58", + "token": { + "decimals": 18, + "symbol": "ZW" + }, + "isSC": {} + }, + "0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8": { + "name": "EVX token contract", + "address": "0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8", + "token": { + "decimals": 4, + "symbol": "EVX" + }, + "isSC": {} + }, + "0xc014186cf1ba36032aaec7f96088f09eb3934347": { + "name": "WCX token contract", + "address": "0xc014186cf1ba36032aaec7f96088f09eb3934347", + "token": { + "decimals": 18, + "symbol": "WCX" + }, + "isSC": {} + }, + "0x04969cd041c0cafb6ac462bd65b536a5bdb3a670": { + "name": "WOMI token contract", + "address": "0x04969cd041c0cafb6ac462bd65b536a5bdb3a670", + "token": { + "decimals": 18, + "symbol": "WOMI" + }, + "isSC": {} + }, + "0xa735a3af76cc30791c61c10d585833829d36cbe0": { + "name": "IMGNAI token contract", + "address": "0xa735a3af76cc30791c61c10d585833829d36cbe0", + "token": { + "decimals": 9, + "symbol": "IMGNAI" + }, + "isSC": {} + }, + "0xf827f77422d6dff7b4e1bc87fec88606082b2199": { + "name": "MUSKX token contract", + "address": "0xf827f77422d6dff7b4e1bc87fec88606082b2199", + "token": { + "decimals": 18, + "symbol": "MUSKX" + }, + "isSC": {} + }, + "0xf2fdd9c25d7bc8002ce89716d1be484b2d976944": { + "name": "XPAY token contract", + "address": "0xf2fdd9c25d7bc8002ce89716d1be484b2d976944", + "token": { + "decimals": 18, + "symbol": "XPAY" + }, + "isSC": {} + }, + "0x25722cd432d02895d9be45f5deb60fc479c8781e": { + "name": "SPONGE token contract", + "address": "0x25722cd432d02895d9be45f5deb60fc479c8781e", + "token": { + "decimals": 18, + "symbol": "SPONGE" + }, + "isSC": {} + }, + "0x1e9d0bb190ac34492aa11b80d28c1c86487a341f": { + "name": "NEKO token contract", + "address": "0x1e9d0bb190ac34492aa11b80d28c1c86487a341f", + "token": { + "decimals": 18, + "symbol": "NEKO" + }, + "isSC": {} + }, + "0xf190dbd849e372ff824e631a1fdf199f38358bcf": { + "name": "BARA token contract", + "address": "0xf190dbd849e372ff824e631a1fdf199f38358bcf", + "token": { + "decimals": 18, + "symbol": "BARA" + }, + "isSC": {} + }, + "0xfc10cd3895f2c66d6639ec33ae6360d6cfca7d6d": { + "name": "YES token contract", + "address": "0xfc10cd3895f2c66d6639ec33ae6360d6cfca7d6d", + "token": { + "decimals": 18, + "symbol": "YES" + }, + "isSC": {} + }, + "0xf7790914dc335b20aa19d7c9c9171e14e278a134": { + "name": "EUR-C token contract", + "address": "0xf7790914dc335b20aa19d7c9c9171e14e278a134", + "token": { + "decimals": 18, + "symbol": "EUR-C" + }, + "isSC": {} + }, + "0xb551b43af192965f74e3dfaa476c890b403cad95": { + "name": "DATA token contract", + "address": "0xb551b43af192965f74e3dfaa476c890b403cad95", + "token": { + "decimals": 9, + "symbol": "DATA" + }, + "isSC": {} + }, + "0x901ea3606d567f9f1e964639d5cbb8659080be8a": { + "name": "CWT token contract", + "address": "0x901ea3606d567f9f1e964639d5cbb8659080be8a", + "token": { + "decimals": 18, + "symbol": "CWT" + }, + "isSC": {} + }, + "0x4c0f743928ca8fa7fb24ad89669c8a7838f34917": { + "name": "STACK token contract", + "address": "0x4c0f743928ca8fa7fb24ad89669c8a7838f34917", + "token": { + "decimals": 18, + "symbol": "STACK" + }, + "isSC": {} + }, + "0xd89310f4baedb33afb36d7cc45bb8847f4463060": { + "name": "MEMEX token contract", + "address": "0xd89310f4baedb33afb36d7cc45bb8847f4463060", + "token": { + "decimals": 18, + "symbol": "MEMEX" + }, + "isSC": {} + }, + "0x669db4c47f89f21554ebd825a744888725fd9491": { + "name": "HIPENGUINS token contract", + "address": "0x669db4c47f89f21554ebd825a744888725fd9491", + "token": { + "decimals": 18, + "symbol": "HIPENGUINS" + }, + "isSC": {} + }, + "0x2c540c3c7be7af98278dc6963e092cd450009d1f": { + "name": "SPARKO token contract", + "address": "0x2c540c3c7be7af98278dc6963e092cd450009d1f", + "token": { + "decimals": 18, + "symbol": "SPARKO" + }, + "isSC": {} + }, + "0x94d40b49f020bfebba1a80a0191eb3737b90e8d3": { + "name": "MNTE token contract", + "address": "0x94d40b49f020bfebba1a80a0191eb3737b90e8d3", + "token": { + "decimals": 18, + "symbol": "MNTE" + }, + "isSC": {} + }, + "0xbe428c3867f05dea2a89fc76a102b544eac7f772": { + "name": "CVT token contract", + "address": "0xbe428c3867f05dea2a89fc76a102b544eac7f772", + "token": { + "decimals": 18, + "symbol": "CVT" + }, + "isSC": {} + }, + "0xa3ad8c7ab6b731045b5b16e3fdf77975c71abe79": { + "name": "DINERO token contract", + "address": "0xa3ad8c7ab6b731045b5b16e3fdf77975c71abe79", + "token": { + "decimals": 18, + "symbol": "DINERO" + }, + "isSC": {} + }, + "0x4e58ea38f4915850fbe1577cd818a09ba673c8ee": { + "name": "OMNIA token contract", + "address": "0x4e58ea38f4915850fbe1577cd818a09ba673c8ee", + "token": { + "decimals": 18, + "symbol": "OMNIA" + }, + "isSC": {} + }, + "0x41c21693e60fc1a5dbb7c50e54e7a6016aa44c99": { + "name": "SIMP token contract", + "address": "0x41c21693e60fc1a5dbb7c50e54e7a6016aa44c99", + "token": { + "decimals": 18, + "symbol": "SIMP" + }, + "isSC": {} + }, + "0xed4e879087ebd0e8a77d66870012b5e0dffd0fa4": { + "name": "APX token contract", + "address": "0xed4e879087ebd0e8a77d66870012b5e0dffd0fa4", + "token": { + "decimals": 18, + "symbol": "APX" + }, + "isSC": {} + }, + "0xc6979ff406f6cd88908009a80fac0fa7cc1d4fbd": { + "name": "SOCIO token contract", + "address": "0xc6979ff406f6cd88908009a80fac0fa7cc1d4fbd", + "token": { + "decimals": 9, + "symbol": "SOCIO" + }, + "isSC": {} + }, + "0xa57ed6e54be8125bbe45d6ca330e45ebb71ef11e": { + "name": "PEPE token contract", + "address": "0xa57ed6e54be8125bbe45d6ca330e45ebb71ef11e", + "token": { + "decimals": 18, + "symbol": "PEPE" + }, + "isSC": {} + }, + "0x574d22e2555cac0ce71e44778f6de2e7487ae229": { + "name": "SOON token contract", + "address": "0x574d22e2555cac0ce71e44778f6de2e7487ae229", + "token": { + "decimals": 18, + "symbol": "SOON" + }, + "isSC": {} + }, + "0x5efcea234f7547de4569aad1215fa5d2adaced38": { + "name": "HONK token contract", + "address": "0x5efcea234f7547de4569aad1215fa5d2adaced38", + "token": { + "decimals": 18, + "symbol": "HONK" + }, + "isSC": {} + }, + "0x3ef389f264e07fff3106a3926f2a166d1393086f": { + "name": "SAO token contract", + "address": "0x3ef389f264e07fff3106a3926f2a166d1393086f", + "token": { + "decimals": 9, + "symbol": "SAO" + }, + "isSC": {} + }, + "0xb44b653f147569d88a684cbf6549e1968e8b2a1d": { + "name": "2DAI token contract", + "address": "0xb44b653f147569d88a684cbf6549e1968e8b2a1d", + "token": { + "decimals": 18, + "symbol": "2DAI" + }, + "isSC": {} + }, + "0x6ec8a24cabdc339a06a172f8223ea557055adaa5": { + "name": "GNX token contract", + "address": "0x6ec8a24cabdc339a06a172f8223ea557055adaa5", + "token": { + "decimals": 9, + "symbol": "GNX" + }, + "isSC": {} + }, + "0x6006fc2a849fedaba8330ce36f5133de01f96189": { + "name": "SHAKE token contract", + "address": "0x6006fc2a849fedaba8330ce36f5133de01f96189", + "token": { + "decimals": 18, + "symbol": "SHAKE" + }, + "isSC": {} + }, + "0x8a4584f0eefda8a9b459264dc7a0d62bba9b5484": { + "name": "BUSINESS token contract", + "address": "0x8a4584f0eefda8a9b459264dc7a0d62bba9b5484", + "token": { + "decimals": 18, + "symbol": "BUSINESS" + }, + "isSC": {} + }, + "0x344d6117ae0984f3afdd23e593f92d95a83dcd0e": { + "name": "TOILET token contract", + "address": "0x344d6117ae0984f3afdd23e593f92d95a83dcd0e", + "token": { + "decimals": 9, + "symbol": "TOILET" + }, + "isSC": {} + }, + "0xa589d8868607b8d79ee4288ce192796051263b64": { + "name": "TATE token contract", + "address": "0xa589d8868607b8d79ee4288ce192796051263b64", + "token": { + "decimals": 18, + "symbol": "TATE" + }, + "isSC": {} + }, + "0x327673ae6b33bd3d90f0096870059994f30dc8af": { + "name": "LMT token contract", + "address": "0x327673ae6b33bd3d90f0096870059994f30dc8af", + "token": { + "decimals": 18, + "symbol": "LMT" + }, + "isSC": {} + }, + "0x6f620ec89b8479e97a6985792d0c64f237566746": { + "name": "WPC token contract", + "address": "0x6f620ec89b8479e97a6985792d0c64f237566746", + "token": { + "decimals": 18, + "symbol": "WPC" + }, + "isSC": {} + }, + "0x01792e1548dc317bde6123fe92da1fe6d7311c3c": { + "name": "SPIRAL token contract", + "address": "0x01792e1548dc317bde6123fe92da1fe6d7311c3c", + "token": { + "decimals": 9, + "symbol": "SPIRAL" + }, + "isSC": {} + }, + "0xb622907fbff6cbf7c3ce355173251e3edb13a606": { + "name": "FRT token contract", + "address": "0xb622907fbff6cbf7c3ce355173251e3edb13a606", + "token": { + "decimals": 18, + "symbol": "FRT" + }, + "isSC": {} + }, + "0xe3944ab788a60ca266f1eec3c26925b95f6370ad": { + "name": "RAIN token contract", + "address": "0xe3944ab788a60ca266f1eec3c26925b95f6370ad", + "token": { + "decimals": 18, + "symbol": "RAIN" + }, + "isSC": {} + }, + "0x418d75f65a02b3d53b2418fb8e1fe493759c7605": { + "name": "BNB token contract", + "address": "0x418d75f65a02b3d53b2418fb8e1fe493759c7605", + "token": { + "decimals": 18, + "symbol": "BNB" + }, + "isSC": {} + }, + "0xc8c424b91d8ce0137bab4b832b7f7d154156ba6c": { + "name": "APM token contract", + "address": "0xc8c424b91d8ce0137bab4b832b7f7d154156ba6c", + "token": { + "decimals": 18, + "symbol": "APM" + }, + "isSC": {} + }, + "0x337dd23d05c27bff099d3604938bfc23a9b25820": { + "name": "MFC token contract", + "address": "0x337dd23d05c27bff099d3604938bfc23a9b25820", + "token": { + "decimals": 18, + "symbol": "MFC" + }, + "isSC": {} + }, + "0xcb129aa11ceaa00da1a92d12e26bb776ef3c3628": { + "name": "XPB token contract", + "address": "0xcb129aa11ceaa00da1a92d12e26bb776ef3c3628", + "token": { + "decimals": 18, + "symbol": "XPB" + }, + "isSC": {} + }, + "0xa7de087329bfcda5639247f96140f9dabe3deed1": { + "name": "STA token contract", + "address": "0xa7de087329bfcda5639247f96140f9dabe3deed1", + "token": { + "decimals": 18, + "symbol": "STA" + }, + "isSC": {} + }, + "0x3231cb76718cdef2155fc47b5286d82e6eda273f": { + "name": "Monerium EUR", + "address": "0x3231cb76718cdef2155fc47b5286d82e6eda273f", + "token": { + "decimals": 18, + "symbol": "EURe" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/EURe.svg" + }, + "0xde0220b69ce3e855a0124433a8e8d093f53a6be4": { + "name": "WHETH token contract", + "address": "0xde0220b69ce3e855a0124433a8e8d093f53a6be4", + "token": { + "decimals": 18, + "symbol": "WHETH" + }, + "isSC": {} + }, + "0xa49d7499271ae71cd8ab9ac515e6694c755d400c": { + "name": "MUTE token contract", + "address": "0xa49d7499271ae71cd8ab9ac515e6694c755d400c", + "token": { + "decimals": 18, + "symbol": "MUTE" + }, + "isSC": {} + }, + "0x423f4e6138e475d85cf7ea071ac92097ed631eea": { + "name": "PNDC token contract", + "address": "0x423f4e6138e475d85cf7ea071ac92097ed631eea", + "token": { + "decimals": 18, + "symbol": "PNDC" + }, + "isSC": {} + }, + "0xd721706581d97ecd202bbab5c71b5a85f0f78e69": { + "name": "DOGE1 token contract", + "address": "0xd721706581d97ecd202bbab5c71b5a85f0f78e69", + "token": { + "decimals": 9, + "symbol": "DOGE1" + }, + "isSC": {} + }, + "0xc4e30d504fe3b18423d82a34e7ebe529a56f89c2": { + "name": "WOJAK20 token contract", + "address": "0xc4e30d504fe3b18423d82a34e7ebe529a56f89c2", + "token": { + "decimals": 18, + "symbol": "WOJAK20" + }, + "isSC": {} + }, + "0x42e70913b53cfcc38b18ffbd124e8f65c706deaf": { + "name": "SALLY token contract", + "address": "0x42e70913b53cfcc38b18ffbd124e8f65c706deaf", + "token": { + "decimals": 9, + "symbol": "SALLY" + }, + "isSC": {} + }, + "0x9e5bd9d9fad182ff0a93ba8085b664bcab00fa68": { + "name": "DINGER token contract", + "address": "0x9e5bd9d9fad182ff0a93ba8085b664bcab00fa68", + "token": { + "decimals": 9, + "symbol": "DINGER" + }, + "isSC": {} + }, + "0x92098551e613dfdcd4d7c7b2c35615709e4e0397": { + "name": "ATAI token contract", + "address": "0x92098551e613dfdcd4d7c7b2c35615709e4e0397", + "token": { + "decimals": 18, + "symbol": "ATAI" + }, + "isSC": {} + }, + "0xef53462838000184f35f7d991452e5f25110b207": { + "name": "KFT token contract", + "address": "0xef53462838000184f35f7d991452e5f25110b207", + "token": { + "decimals": 18, + "symbol": "KFT" + }, + "isSC": {} + }, + "0x88a9a52f944315d5b4e917b9689e65445c401e83": { + "name": "FEAR token contract", + "address": "0x88a9a52f944315d5b4e917b9689e65445c401e83", + "token": { + "decimals": 18, + "symbol": "FEAR" + }, + "isSC": {} + }, + "0x6bc40d4099f9057b23af309c08d935b890d7adc0": { + "name": "SNAIL token contract", + "address": "0x6bc40d4099f9057b23af309c08d935b890d7adc0", + "token": { + "decimals": 18, + "symbol": "SNAIL" + }, + "isSC": {} + }, + "0xc67b12049c2d0cf6e476bc64c7f82fc6c63cffc5": { + "name": "GDT token contract", + "address": "0xc67b12049c2d0cf6e476bc64c7f82fc6c63cffc5", + "token": { + "decimals": 8, + "symbol": "GDT" + }, + "isSC": {} + }, + "0x6a969d379700b2e5ea4e684d273d63c1c050ba49": { + "name": "PAF token contract", + "address": "0x6a969d379700b2e5ea4e684d273d63c1c050ba49", + "token": { + "decimals": 18, + "symbol": "PAF" + }, + "isSC": {} + }, + "0x0f8c45b896784a1e408526b9300519ef8660209c": { + "name": "XMX token contract", + "address": "0x0f8c45b896784a1e408526b9300519ef8660209c", + "token": { + "decimals": 8, + "symbol": "XMX" + }, + "isSC": {} + }, + "0x02d3a27ac3f55d5d91fb0f52759842696a864217": { + "name": "IONX token contract", + "address": "0x02d3a27ac3f55d5d91fb0f52759842696a864217", + "token": { + "decimals": 18, + "symbol": "IONX" + }, + "isSC": {} + }, + "0x41d5d79431a913c4ae7d69a668ecdfe5ff9dfb68": { + "name": "INV token contract", + "address": "0x41d5d79431a913c4ae7d69a668ecdfe5ff9dfb68", + "token": { + "decimals": 18, + "symbol": "INV" + }, + "isSC": {} + }, + "0x20561172f791f915323241e885b4f7d5187c36e1": { + "name": "CAL token contract", + "address": "0x20561172f791f915323241e885b4f7d5187c36e1", + "token": { + "decimals": 18, + "symbol": "CAL" + }, + "isSC": {} + }, + "0x162433c934aa74ba147e05150b1206b2c922f71d": { + "name": "CRE token contract", + "address": "0x162433c934aa74ba147e05150b1206b2c922f71d", + "token": { + "decimals": 18, + "symbol": "CRE" + }, + "isSC": {} + }, + "0xd43be54c1aedf7ee4099104f2dae4ea88b18a249": { + "name": "TRAXX token contract", + "address": "0xd43be54c1aedf7ee4099104f2dae4ea88b18a249", + "token": { + "decimals": 18, + "symbol": "TRAXX" + }, + "isSC": {} + }, + "0x7c84e62859d0715eb77d1b1c4154ecd6abb21bec": { + "name": "SHPING token contract", + "address": "0x7c84e62859d0715eb77d1b1c4154ecd6abb21bec", + "token": { + "decimals": 18, + "symbol": "SHPING" + }, + "isSC": {} + }, + "0xeac32927cf2785cbe0d515298cab448538a8cdd7": { + "name": "SAI token contract", + "address": "0xeac32927cf2785cbe0d515298cab448538a8cdd7", + "token": { + "decimals": 9, + "symbol": "SAI" + }, + "isSC": {} + }, + "0xc5b3d3231001a776123194cf1290068e8b0c783b": { + "name": "LIT token contract", + "address": "0xc5b3d3231001a776123194cf1290068e8b0c783b", + "token": { + "decimals": 18, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xa64dfe8d86963151e6496bee513e366f6e42ed79": { + "name": "GOKU token contract", + "address": "0xa64dfe8d86963151e6496bee513e366f6e42ed79", + "token": { + "decimals": 9, + "symbol": "GOKU" + }, + "isSC": {} + }, + "0x60eb57d085c59932d5faa6c6026268a4386927d0": { + "name": "LOCG token contract", + "address": "0x60eb57d085c59932d5faa6c6026268a4386927d0", + "token": { + "decimals": 18, + "symbol": "LOCG" + }, + "isSC": {} + }, + "0x1e797ce986c3cff4472f7d38d5c4aba55dfefe40": { + "name": "BCDN token contract", + "address": "0x1e797ce986c3cff4472f7d38d5c4aba55dfefe40", + "token": { + "decimals": 15, + "symbol": "BCDN" + }, + "isSC": {} + }, + "0xe508364efad1f04572f052d76779d7407dcff3d9": { + "name": "BN token contract", + "address": "0xe508364efad1f04572f052d76779d7407dcff3d9", + "token": { + "decimals": 9, + "symbol": "BN" + }, + "isSC": {} + }, + "0x2223bf1d7c19ef7c06dab88938ec7b85952ccd89": { + "name": "KXA token contract", + "address": "0x2223bf1d7c19ef7c06dab88938ec7b85952ccd89", + "token": { + "decimals": 18, + "symbol": "KXA" + }, + "isSC": {} + }, + "0x044d078f1c86508e13328842cc75ac021b272958": { + "name": "PPC token contract", + "address": "0x044d078f1c86508e13328842cc75ac021b272958", + "token": { + "decimals": 6, + "symbol": "PPC" + }, + "isSC": {} + }, + "0x9d65ff81a3c488d585bbfb0bfe3c7707c7917f54": { + "name": "SSV token contract", + "address": "0x9d65ff81a3c488d585bbfb0bfe3c7707c7917f54", + "token": { + "decimals": 18, + "symbol": "SSV" + }, + "isSC": {} + }, + "0xa31b1767e09f842ecfd4bc471fe44f830e3891aa": { + "name": "ROOBEE", + "address": "0xa31b1767e09f842ecfd4bc471fe44f830e3891aa", + "token": { + "decimals": 18, + "symbol": "ROOBEE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ROOBEE.svg" + }, + "0x7cc97bf17c5adabe25f9d19d15a1ec8a1ad65f14": { + "name": "WOLVERINU token contract", + "address": "0x7cc97bf17c5adabe25f9d19d15a1ec8a1ad65f14", + "token": { + "decimals": 18, + "symbol": "WOLVERINU" + }, + "isSC": {} + }, + "0xb4622193ca7c7580ac0ecc09c3b7bd74aef0318d": { + "name": "CLOAK token contract", + "address": "0xb4622193ca7c7580ac0ecc09c3b7bd74aef0318d", + "token": { + "decimals": 18, + "symbol": "CLOAK" + }, + "isSC": {} + }, + "0x46e98ffe40e408ba6412beb670507e083c8b95ff": { + "name": "PRIMATE token contract", + "address": "0x46e98ffe40e408ba6412beb670507e083c8b95ff", + "token": { + "decimals": 18, + "symbol": "PRIMATE" + }, + "isSC": {} + }, + "0xcdb9d30a3ba48cdfcb0ecbe19317e6cf783672f1": { + "name": "MNDCC token contract", + "address": "0xcdb9d30a3ba48cdfcb0ecbe19317e6cf783672f1", + "token": { + "decimals": 18, + "symbol": "MNDCC" + }, + "isSC": {} + }, + "0x2602278ee1882889b946eb11dc0e810075650983": { + "name": "VADER token contract", + "address": "0x2602278ee1882889b946eb11dc0e810075650983", + "token": { + "decimals": 18, + "symbol": "VADER" + }, + "isSC": {} + }, + "0x9b4e2b4b13d125238aa0480dd42b4f6fc71b37cc": { + "name": "MT token contract", + "address": "0x9b4e2b4b13d125238aa0480dd42b4f6fc71b37cc", + "token": { + "decimals": 18, + "symbol": "MT" + }, + "isSC": {} + }, + "0x2c2f7e7c5604d162d75641256b80f1bf6f4dc796": { + "name": "PRARE token contract", + "address": "0x2c2f7e7c5604d162d75641256b80f1bf6f4dc796", + "token": { + "decimals": 18, + "symbol": "PRARE" + }, + "isSC": {} + }, + "0xe0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112": { + "name": "GS token contract", + "address": "0xe0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112", + "token": { + "decimals": 18, + "symbol": "GS" + }, + "isSC": {} + }, + "0x5732046a883704404f284ce41ffadd5b007fd668": { + "name": "Bluzelle Token", + "address": "0x5732046a883704404f284ce41ffadd5b007fd668", + "token": { + "decimals": 18, + "symbol": "BLZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Bluzelle.svg" + }, + "0x4448d67ea26a2eaf286bc1045005f4cf15aaba11": { + "name": "SJM token contract", + "address": "0x4448d67ea26a2eaf286bc1045005f4cf15aaba11", + "token": { + "decimals": 9, + "symbol": "SJM" + }, + "isSC": {} + }, + "0x2b81945875f892aff04af0a298d35fb2cf848c7b": { + "name": "WEB token contract", + "address": "0x2b81945875f892aff04af0a298d35fb2cf848c7b", + "token": { + "decimals": 9, + "symbol": "WEB" + }, + "isSC": {} + }, + "0xd6bd97a26232ba02172ff86b055d5d7be789335b": { + "name": "OMC token contract", + "address": "0xd6bd97a26232ba02172ff86b055d5d7be789335b", + "token": { + "decimals": 18, + "symbol": "OMC" + }, + "isSC": {} + }, + "0x4f81c790581b240a5c948afd173620ecc8c71c8d": { + "name": "XDG token contract", + "address": "0x4f81c790581b240a5c948afd173620ecc8c71c8d", + "token": { + "decimals": 18, + "symbol": "XDG" + }, + "isSC": {} + }, + "0x6431fa4b812a2dcc062a38cb55cc7d18135adead": { + "name": "RANKER token contract", + "address": "0x6431fa4b812a2dcc062a38cb55cc7d18135adead", + "token": { + "decimals": 18, + "symbol": "RANKER" + }, + "isSC": {} + }, + "0x6251e725cd45fb1af99354035a414a2c0890b929": { + "name": "MXT token contract", + "address": "0x6251e725cd45fb1af99354035a414a2c0890b929", + "token": { + "decimals": 18, + "symbol": "MXT" + }, + "isSC": {} + }, + "0x22b6c31c2beb8f2d0d5373146eed41ab9ede3caf": { + "name": "COC token contract", + "address": "0x22b6c31c2beb8f2d0d5373146eed41ab9ede3caf", + "token": { + "decimals": 8, + "symbol": "COC" + }, + "isSC": {} + }, + "0xfc4913214444af5c715cc9f7b52655e788a569ed": { + "name": "ICSA token contract", + "address": "0xfc4913214444af5c715cc9f7b52655e788a569ed", + "token": { + "decimals": 9, + "symbol": "ICSA" + }, + "isSC": {} + }, + "0x6d48206b97b164555c8fc7a40d59a7230e055166": { + "name": "SEND token contract", + "address": "0x6d48206b97b164555c8fc7a40d59a7230e055166", + "token": { + "decimals": 18, + "symbol": "SEND" + }, + "isSC": {} + }, + "0x7b37a55ffb30c11d95f943672ae98f28cfb7b087": { + "name": "FUFU token contract", + "address": "0x7b37a55ffb30c11d95f943672ae98f28cfb7b087", + "token": { + "decimals": 2, + "symbol": "FUFU" + }, + "isSC": {} + }, + "0x968cbe62c830a0ccf4381614662398505657a2a9": { + "name": "TPY token contract", + "address": "0x968cbe62c830a0ccf4381614662398505657a2a9", + "token": { + "decimals": 8, + "symbol": "TPY" + }, + "isSC": {} + }, + "0x09617f6fd6cf8a71278ec86e23bbab29c04353a7": { + "name": "ULT token contract", + "address": "0x09617f6fd6cf8a71278ec86e23bbab29c04353a7", + "token": { + "decimals": 18, + "symbol": "ULT" + }, + "isSC": {} + }, + "0x9b4a69de6ca0defdd02c0c4ce6cb84de5202944e": { + "name": "PROOF Platform", + "address": "0x9b4a69de6ca0defdd02c0c4ce6cb84de5202944e", + "token": { + "decimals": 9, + "symbol": "PROOF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/proof-platform.svg" + }, + "0x8ab98330473101309db94b625f9997366a518223": { + "name": "PTH token contract", + "address": "0x8ab98330473101309db94b625f9997366a518223", + "token": { + "decimals": 18, + "symbol": "PTH" + }, + "isSC": {} + }, + "0x4f4a556361b8b4869f97b8709ff47c1b057ea13b": { + "name": "TRUMP token contract", + "address": "0x4f4a556361b8b4869f97b8709ff47c1b057ea13b", + "token": { + "decimals": 9, + "symbol": "TRUMP" + }, + "isSC": {} + }, + "0xbb3a8fd6ec4bf0fdc6cd2739b1e41192d12b1873": { + "name": "OBI token contract", + "address": "0xbb3a8fd6ec4bf0fdc6cd2739b1e41192d12b1873", + "token": { + "decimals": 18, + "symbol": "OBI" + }, + "isSC": {} + }, + "0x0a8f4c4f23d72857745e26695dcd8dedf8e349b9": { + "name": "MARKS token contract", + "address": "0x0a8f4c4f23d72857745e26695dcd8dedf8e349b9", + "token": { + "decimals": 18, + "symbol": "MARKS" + }, + "isSC": {} + }, + "0x441c3c2f4a92f1b90f916811514ebddbbd3bff4f": { + "name": "LFG token contract", + "address": "0x441c3c2f4a92f1b90f916811514ebddbbd3bff4f", + "token": { + "decimals": 18, + "symbol": "LFG" + }, + "isSC": {} + }, + "0x892a6f9df0147e5f079b0993f486f9aca3c87881": { + "name": "XFUND token contract", + "address": "0x892a6f9df0147e5f079b0993f486f9aca3c87881", + "token": { + "decimals": 9, + "symbol": "XFUND" + }, + "isSC": {} + }, + "0x0ede75b5f548e0d37f494368f4fa4982b6d0630a": { + "name": "MEG token contract", + "address": "0x0ede75b5f548e0d37f494368f4fa4982b6d0630a", + "token": { + "decimals": 18, + "symbol": "MEG" + }, + "isSC": {} + }, + "0x332809a8bce4a589da992a4ae495f32fbf4089c6": { + "name": "BLH token contract", + "address": "0x332809a8bce4a589da992a4ae495f32fbf4089c6", + "token": { + "decimals": 9, + "symbol": "BLH" + }, + "isSC": {} + }, + "0x6bf765c43030387a983f429c1438e9d2025b7e12": { + "name": "PEPES token contract", + "address": "0x6bf765c43030387a983f429c1438e9d2025b7e12", + "token": { + "decimals": 18, + "symbol": "PEPES" + }, + "isSC": {} + }, + "0x8edc62648236c20e528adb675ad3f3047697186f": { + "name": "NFT token contract", + "address": "0x8edc62648236c20e528adb675ad3f3047697186f", + "token": { + "decimals": 18, + "symbol": "NFT" + }, + "isSC": {} + }, + "0xed03ed872159e199065401b6d0d487d78d9464aa": { + "name": "MXNT token contract", + "address": "0xed03ed872159e199065401b6d0d487d78d9464aa", + "token": { + "decimals": 6, + "symbol": "MXNT" + }, + "isSC": {} + }, + "0x235c8ee913d93c68d2902a8e0b5a643755705726": { + "name": "BAG token contract", + "address": "0x235c8ee913d93c68d2902a8e0b5a643755705726", + "token": { + "decimals": 18, + "symbol": "BAG" + }, + "isSC": {} + }, + "0x267eb2a9a13dc304a9deff4277abe850d0852c5f": { + "name": "TAI token contract", + "address": "0x267eb2a9a13dc304a9deff4277abe850d0852c5f", + "token": { + "decimals": 8, + "symbol": "TAI" + }, + "isSC": {} + }, + "0x910524678c0b1b23ffb9285a81f99c29c11cbaed": { + "name": "AZUKI token contract", + "address": "0x910524678c0b1b23ffb9285a81f99c29c11cbaed", + "token": { + "decimals": 18, + "symbol": "AZUKI" + }, + "isSC": {} + }, + "0x7721a4cb6190edb11d47f51c20968436eccdafb8": { + "name": "GUISE token contract", + "address": "0x7721a4cb6190edb11d47f51c20968436eccdafb8", + "token": { + "decimals": 18, + "symbol": "GUISE" + }, + "isSC": {} + }, + "0x54d1c019c53501f76361bb656542fec427bf13aa": { + "name": "P2P token contract", + "address": "0x54d1c019c53501f76361bb656542fec427bf13aa", + "token": { + "decimals": 18, + "symbol": "P2P" + }, + "isSC": {} + }, + "0x4332f8a38f14bd3d8d1553af27d7c7ac6c27278d": { + "name": "APEFI token contract", + "address": "0x4332f8a38f14bd3d8d1553af27d7c7ac6c27278d", + "token": { + "decimals": 18, + "symbol": "APEFI" + }, + "isSC": {} + }, + "0x8bbe1a2961b41340468d0548c2cd5b7dfa9b684c": { + "name": "HANDY token contract", + "address": "0x8bbe1a2961b41340468d0548c2cd5b7dfa9b684c", + "token": { + "decimals": 18, + "symbol": "HANDY" + }, + "isSC": {} + }, + "0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6": { + "name": "Dentacoin Token", + "address": "0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6", + "token": { + "decimals": 0, + "symbol": "DCN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dcn.svg" + }, + "0x2620638eda99f9e7e902ea24a285456ee9438861": { + "name": "CSM token contract", + "address": "0x2620638eda99f9e7e902ea24a285456ee9438861", + "token": { + "decimals": 18, + "symbol": "CSM" + }, + "isSC": {} + }, + "0x900db999074d9277c5da2a43f252d74366230da0": { + "name": "GIV token contract", + "address": "0x900db999074d9277c5da2a43f252d74366230da0", + "token": { + "decimals": 18, + "symbol": "GIV" + }, + "isSC": {} + }, + "0x51d29b072ff42c712e4185723a5a7974920995ed": { + "name": "CHT token contract", + "address": "0x51d29b072ff42c712e4185723a5a7974920995ed", + "token": { + "decimals": 18, + "symbol": "CHT" + }, + "isSC": {} + }, + "0x0adcfdfe9e88d28cc4c1daac9cc021067aff9b0c": { + "name": "TOTOFO token contract", + "address": "0x0adcfdfe9e88d28cc4c1daac9cc021067aff9b0c", + "token": { + "decimals": 18, + "symbol": "TOTOFO" + }, + "isSC": {} + }, + "0x6399c842dd2be3de30bf99bc7d1bbf6fa3650e70": { + "name": "PREMIA token contract", + "address": "0x6399c842dd2be3de30bf99bc7d1bbf6fa3650e70", + "token": { + "decimals": 18, + "symbol": "PREMIA" + }, + "isSC": {} + }, + "0x8189afbe7b0e81dae735ef027cd31371b3974feb": { + "name": "BEAN token contract", + "address": "0x8189afbe7b0e81dae735ef027cd31371b3974feb", + "token": { + "decimals": 18, + "symbol": "BEAN" + }, + "isSC": {} + }, + "0x6e8908cfa881c9f6f2c64d3436e7b80b1bf0093f": { + "name": "BIST token contract", + "address": "0x6e8908cfa881c9f6f2c64d3436e7b80b1bf0093f", + "token": { + "decimals": 18, + "symbol": "BIST" + }, + "isSC": {} + }, + "0x2a3bff78b79a009976eea096a51a948a3dc00e34": { + "name": "WILD token contract", + "address": "0x2a3bff78b79a009976eea096a51a948a3dc00e34", + "token": { + "decimals": 18, + "symbol": "WILD" + }, + "isSC": {} + }, + "0x4872208c83acbfd7f6dea5aa6ce6d5d7aed2ac1c": { + "name": "AIMAGE token contract", + "address": "0x4872208c83acbfd7f6dea5aa6ce6d5d7aed2ac1c", + "token": { + "decimals": 18, + "symbol": "AIMAGE" + }, + "isSC": {} + }, + "0x777e2ae845272a2f540ebf6a3d03734a5a8f618e": { + "name": "RYOSHI token contract", + "address": "0x777e2ae845272a2f540ebf6a3d03734a5a8f618e", + "token": { + "decimals": 18, + "symbol": "RYOSHI" + }, + "isSC": {} + }, + "0x3d0293f06daf4311b482564330d57c8db6c10893": { + "name": "YCO token contract", + "address": "0x3d0293f06daf4311b482564330d57c8db6c10893", + "token": { + "decimals": 8, + "symbol": "YCO" + }, + "isSC": {} + }, + "0xb5c23f694810a8a6a37fede38004150ee0dd3821": { + "name": "0XT token contract", + "address": "0xb5c23f694810a8a6a37fede38004150ee0dd3821", + "token": { + "decimals": 8, + "symbol": "0XT" + }, + "isSC": {} + }, + "0x99cf786dad3c68019f9919d153a3f1f949a18171": { + "name": "NIOCTIB token contract", + "address": "0x99cf786dad3c68019f9919d153a3f1f949a18171", + "token": { + "decimals": 9, + "symbol": "NIOCTIB" + }, + "isSC": {} + }, + "0xe0b9bcd54bf8a730ea5d3f1ffce0885e911a502c": { + "name": "ZUM token contract", + "address": "0xe0b9bcd54bf8a730ea5d3f1ffce0885e911a502c", + "token": { + "decimals": 8, + "symbol": "ZUM" + }, + "isSC": {} + }, + "0x7eaf9c89037e4814dc0d9952ac7f888c784548db": { + "name": "ROYA token contract", + "address": "0x7eaf9c89037e4814dc0d9952ac7f888c784548db", + "token": { + "decimals": 18, + "symbol": "ROYA" + }, + "isSC": {} + }, + "0xa50709b10c328772ea24a44b13c7e23c75561ecb": { + "name": "28 token contract", + "address": "0xa50709b10c328772ea24a44b13c7e23c75561ecb", + "token": { + "decimals": 18, + "symbol": "28" + }, + "isSC": {} + }, + "0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6": { + "name": "APXETH token contract", + "address": "0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6", + "token": { + "decimals": 18, + "symbol": "APXETH" + }, + "isSC": {} + }, + "0xf68415be72377611e95d59bc710ccbbbf94c4fa2": { + "name": "AI token contract", + "address": "0xf68415be72377611e95d59bc710ccbbbf94c4fa2", + "token": { + "decimals": 18, + "symbol": "AI" + }, + "isSC": {} + }, + "0xd7d05bda4bf5876ba1254b3eaaf8b47d2f5676eb": { + "name": "STA token contract", + "address": "0xd7d05bda4bf5876ba1254b3eaaf8b47d2f5676eb", + "token": { + "decimals": 18, + "symbol": "STA" + }, + "isSC": {} + }, + "0x0c21638d4bcb88568f88bc84a50e317715f8de8a": { + "name": "GDX token contract", + "address": "0x0c21638d4bcb88568f88bc84a50e317715f8de8a", + "token": { + "decimals": 18, + "symbol": "GDX" + }, + "isSC": {} + }, + "0xdf290b162a7d3e0a328cf198308d421954f08b94": { + "name": "BP token contract", + "address": "0xdf290b162a7d3e0a328cf198308d421954f08b94", + "token": { + "decimals": 18, + "symbol": "BP" + }, + "isSC": {} + }, + "0x39207d2e2feef178fbda8083914554c59d9f8c00": { + "name": "INUS token contract", + "address": "0x39207d2e2feef178fbda8083914554c59d9f8c00", + "token": { + "decimals": 18, + "symbol": "INUS" + }, + "isSC": {} + }, + "0xfa5b75a9e13df9775cf5b996a049d9cc07c15731": { + "name": "VCK token contract", + "address": "0xfa5b75a9e13df9775cf5b996a049d9cc07c15731", + "token": { + "decimals": 18, + "symbol": "VCK" + }, + "isSC": {} + }, + "0xc4ee0aa2d993ca7c9263ecfa26c6f7e13009d2b6": { + "name": "HOICHI token contract", + "address": "0xc4ee0aa2d993ca7c9263ecfa26c6f7e13009d2b6", + "token": { + "decimals": 18, + "symbol": "HOICHI" + }, + "isSC": {} + }, + "0x244b797d622d4dee8b188b03546acaabd0cf91a0": { + "name": "FOUR token contract", + "address": "0x244b797d622d4dee8b188b03546acaabd0cf91a0", + "token": { + "decimals": 18, + "symbol": "FOUR" + }, + "isSC": {} + }, + "0x37e83a94c6b1bdb816b59ac71dd02cf154d8111f": { + "name": "PHCR token contract", + "address": "0x37e83a94c6b1bdb816b59ac71dd02cf154d8111f", + "token": { + "decimals": 18, + "symbol": "PHCR" + }, + "isSC": {} + }, + "0x6595b8fd9c920c81500dca94e53cdc712513fb1f": { + "name": "OLY token contract", + "address": "0x6595b8fd9c920c81500dca94e53cdc712513fb1f", + "token": { + "decimals": 18, + "symbol": "OLY" + }, + "isSC": {} + }, + "0x9b83f827928abdf18cf1f7e67053572b9bceff3a": { + "name": "ARTEM token contract", + "address": "0x9b83f827928abdf18cf1f7e67053572b9bceff3a", + "token": { + "decimals": 18, + "symbol": "ARTEM" + }, + "isSC": {} + }, + "0x946551dd05c5abd7cc808927480225ce36d8c475": { + "name": "ONE token contract", + "address": "0x946551dd05c5abd7cc808927480225ce36d8c475", + "token": { + "decimals": 18, + "symbol": "ONE" + }, + "isSC": {} + }, + "0xdb8d6d3ac21e4efe3675bbb18514010ac9c5558f": { + "name": "EGRN token contract", + "address": "0xdb8d6d3ac21e4efe3675bbb18514010ac9c5558f", + "token": { + "decimals": 18, + "symbol": "EGRN" + }, + "isSC": {} + }, + "0x6953f27db0701e22616e701dba91acc2e4b6deca": { + "name": "STAR token contract", + "address": "0x6953f27db0701e22616e701dba91acc2e4b6deca", + "token": { + "decimals": 18, + "symbol": "STAR" + }, + "isSC": {} + }, + "0x52928c95c4c7e934e0efcfab08853a0e4558861d": { + "name": "HART token contract", + "address": "0x52928c95c4c7e934e0efcfab08853a0e4558861d", + "token": { + "decimals": 18, + "symbol": "HART" + }, + "isSC": {} + }, + "0x24d73bca2bd9c3a61e99dfc7cb86d3c379ebded7": { + "name": "MAI token contract", + "address": "0x24d73bca2bd9c3a61e99dfc7cb86d3c379ebded7", + "token": { + "decimals": 18, + "symbol": "MAI" + }, + "isSC": {} + }, + "0x9471d30d78a3c9f076ce206d14867a8d8be1efde": { + "name": "ZNX token contract", + "address": "0x9471d30d78a3c9f076ce206d14867a8d8be1efde", + "token": { + "decimals": 6, + "symbol": "ZNX" + }, + "isSC": {} + }, + "0x0364e6c6f4f9ad90f11a39e681bd6c0156b3efdb": { + "name": "BIMBO token contract", + "address": "0x0364e6c6f4f9ad90f11a39e681bd6c0156b3efdb", + "token": { + "decimals": 18, + "symbol": "BIMBO" + }, + "isSC": {} + }, + "0x1204f5309d746e914c67b4142a347066210c1ac6": { + "name": "EYE token contract", + "address": "0x1204f5309d746e914c67b4142a347066210c1ac6", + "token": { + "decimals": 18, + "symbol": "EYE" + }, + "isSC": {} + }, + "0x8716fc5da009d3a208f0178b637a50f4ef42400f": { + "name": "UGAS token contract", + "address": "0x8716fc5da009d3a208f0178b637a50f4ef42400f", + "token": { + "decimals": 18, + "symbol": "UGAS" + }, + "isSC": {} + }, + "0xf9c53268e9de692ae1b2ea5216e24e1c3ad7cb1e": { + "name": "IDO token contract", + "address": "0xf9c53268e9de692ae1b2ea5216e24e1c3ad7cb1e", + "token": { + "decimals": 18, + "symbol": "IDO" + }, + "isSC": {} + }, + "0xe5097d9baeafb89f9bcb78c9290d545db5f9e9cb": { + "name": "HBOT token contract", + "address": "0xe5097d9baeafb89f9bcb78c9290d545db5f9e9cb", + "token": { + "decimals": 18, + "symbol": "HBOT" + }, + "isSC": {} + }, + "0x17b61131183d29782239c831d7e8ef2dc9f2855d": { + "name": "BETS token contract", + "address": "0x17b61131183d29782239c831d7e8ef2dc9f2855d", + "token": { + "decimals": 9, + "symbol": "BETS" + }, + "isSC": {} + }, + "0x38cf6cea814aefd01027a0bbf8a78b7aa95a698e": { + "name": "BYPASS token contract", + "address": "0x38cf6cea814aefd01027a0bbf8a78b7aa95a698e", + "token": { + "decimals": 9, + "symbol": "BYPASS" + }, + "isSC": {} + }, + "0xd31e53966bf212e860d48a3a8651a23d09a7fdc3": { + "name": "DOGEAI token contract", + "address": "0xd31e53966bf212e860d48a3a8651a23d09a7fdc3", + "token": { + "decimals": 18, + "symbol": "DOGEAI" + }, + "isSC": {} + }, + "0x095797fd4297fb79883cc912a5ba6313b15c445d": { + "name": "GOLC token contract", + "address": "0x095797fd4297fb79883cc912a5ba6313b15c445d", + "token": { + "decimals": 18, + "symbol": "GOLC" + }, + "isSC": {} + }, + "0x4b7ffcb2b92fb4890f22f62a52fb7a180eab818e": { + "name": "DIVA token contract", + "address": "0x4b7ffcb2b92fb4890f22f62a52fb7a180eab818e", + "token": { + "decimals": 18, + "symbol": "DIVA" + }, + "isSC": {} + }, + "0x1da4858ad385cc377165a298cc2ce3fce0c5fd31": { + "name": "CCS token contract", + "address": "0x1da4858ad385cc377165a298cc2ce3fce0c5fd31", + "token": { + "decimals": 0, + "symbol": "CCS" + }, + "isSC": {} + }, + "0xe304283c3e60cefaf7ea514007cf4e8fdc3d869d": { + "name": "GEC token contract", + "address": "0xe304283c3e60cefaf7ea514007cf4e8fdc3d869d", + "token": { + "decimals": 18, + "symbol": "GEC" + }, + "isSC": {} + }, + "0xd939212f16560447ed82ce46ca40a63db62419b5": { + "name": "MYC token contract", + "address": "0xd939212f16560447ed82ce46ca40a63db62419b5", + "token": { + "decimals": 18, + "symbol": "MYC" + }, + "isSC": {} + }, + "0x269877f972622d3c293fca595c65cf34b7f527ce": { + "name": "FWB token contract", + "address": "0x269877f972622d3c293fca595c65cf34b7f527ce", + "token": { + "decimals": 18, + "symbol": "FWB" + }, + "isSC": {} + }, + "0xa364a9f85f61dc5e3118be282a23edc5e09f62ac": { + "name": "GZT token contract", + "address": "0xa364a9f85f61dc5e3118be282a23edc5e09f62ac", + "token": { + "decimals": 18, + "symbol": "GZT" + }, + "isSC": {} + }, + "0x2ab6bb8408ca3199b8fa6c92d5b455f820af03c4": { + "name": "TONE token contract", + "address": "0x2ab6bb8408ca3199b8fa6c92d5b455f820af03c4", + "token": { + "decimals": 18, + "symbol": "TONE" + }, + "isSC": {} + }, + "0xd4342a57ecf2fe7ffa37c33cb8f63b1500e575e6": { + "name": "APN token contract", + "address": "0xd4342a57ecf2fe7ffa37c33cb8f63b1500e575e6", + "token": { + "decimals": 18, + "symbol": "APN" + }, + "isSC": {} + }, + "0x01bf66becdcfd6d59a5ca18869f494fea086cdfd": { + "name": "USK token contract", + "address": "0x01bf66becdcfd6d59a5ca18869f494fea086cdfd", + "token": { + "decimals": 18, + "symbol": "USK" + }, + "isSC": {} + }, + "0xbb556b0ee2cbd89ed95ddea881477723a3aa8f8b": { + "name": "ALCA token contract", + "address": "0xbb556b0ee2cbd89ed95ddea881477723a3aa8f8b", + "token": { + "decimals": 18, + "symbol": "ALCA" + }, + "isSC": {} + }, + "0xd2c869382c7ac9f87ff73548d029d67c0f9dee31": { + "name": "WAGIEBOT token contract", + "address": "0xd2c869382c7ac9f87ff73548d029d67c0f9dee31", + "token": { + "decimals": 9, + "symbol": "WAGIEBOT" + }, + "isSC": {} + }, + "0x58fb30a61c218a3607e9273d52995a49ff2697ee": { + "name": "PINT token contract", + "address": "0x58fb30a61c218a3607e9273d52995a49ff2697ee", + "token": { + "decimals": 18, + "symbol": "PINT" + }, + "isSC": {} + }, + "0x04a020325024f130988782bd5276e53595e8d16e": { + "name": "HERB token contract", + "address": "0x04a020325024f130988782bd5276e53595e8d16e", + "token": { + "decimals": 8, + "symbol": "HERB" + }, + "isSC": {} + }, + "0x36c833eed0d376f75d1ff9dfdee260191336065e": { + "name": "GTCETH token contract", + "address": "0x36c833eed0d376f75d1ff9dfdee260191336065e", + "token": { + "decimals": 18, + "symbol": "GTCETH" + }, + "isSC": {} + }, + "0x5ee84583f67d5ecea5420dbb42b462896e7f8d06": { + "name": "PLSB token contract", + "address": "0x5ee84583f67d5ecea5420dbb42b462896e7f8d06", + "token": { + "decimals": 12, + "symbol": "PLSB" + }, + "isSC": {} + }, + "0x9f7fc686cfd64aa5ae15b351d03071e91533094b": { + "name": "TRACE token contract", + "address": "0x9f7fc686cfd64aa5ae15b351d03071e91533094b", + "token": { + "decimals": 18, + "symbol": "TRACE" + }, + "isSC": {} + }, + "0xc8168d5665f4418353728ac970713e09c0b7c20e": { + "name": "MONKE token contract", + "address": "0xc8168d5665f4418353728ac970713e09c0b7c20e", + "token": { + "decimals": 18, + "symbol": "MONKE" + }, + "isSC": {} + }, + "0x75430d0782a443bd4f1c92c69009599dea53a206": { + "name": "RICK token contract", + "address": "0x75430d0782a443bd4f1c92c69009599dea53a206", + "token": { + "decimals": 9, + "symbol": "RICK" + }, + "isSC": {} + }, + "0x70d0ff0d3b3f5e69220c09befc70606fa5f89293": { + "name": "HIUNDEAD token contract", + "address": "0x70d0ff0d3b3f5e69220c09befc70606fa5f89293", + "token": { + "decimals": 18, + "symbol": "HIUNDEAD" + }, + "isSC": {} + }, + "0x776280f68ad33c4d49e6846507b7dbaf7811c89f": { + "name": "ZETH token contract", + "address": "0x776280f68ad33c4d49e6846507b7dbaf7811c89f", + "token": { + "decimals": 18, + "symbol": "ZETH" + }, + "isSC": {} + }, + "0xf88baf18fab7e330fa0c4f83949e23f52fececce": { + "name": "GRAIN token contract", + "address": "0xf88baf18fab7e330fa0c4f83949e23f52fececce", + "token": { + "decimals": 18, + "symbol": "GRAIN" + }, + "isSC": {} + }, + "0x97872eafd79940c7b24f7bcc1eadb1457347adc9": { + "name": "STRP token contract", + "address": "0x97872eafd79940c7b24f7bcc1eadb1457347adc9", + "token": { + "decimals": 18, + "symbol": "STRP" + }, + "isSC": {} + }, + "0xbede1f59fa4412556fef69f1b9969f2003e3f8c1": { + "name": "MVRS token contract", + "address": "0xbede1f59fa4412556fef69f1b9969f2003e3f8c1", + "token": { + "decimals": 18, + "symbol": "MVRS" + }, + "isSC": {} + }, + "0xbd434a09191d401da3283a5545bb3515d033b8c4": { + "name": "GIX token contract", + "address": "0xbd434a09191d401da3283a5545bb3515d033b8c4", + "token": { + "decimals": 18, + "symbol": "GIX" + }, + "isSC": {} + }, + "0x5d3a4f62124498092ce665f865e0b38ff6f5fbea": { + "name": "IDEA token contract", + "address": "0x5d3a4f62124498092ce665f865e0b38ff6f5fbea", + "token": { + "decimals": 18, + "symbol": "IDEA" + }, + "isSC": {} + }, + "0x5891599664ed15c6e88041b4f5bc08594f026f0e": { + "name": "JPGC token contract", + "address": "0x5891599664ed15c6e88041b4f5bc08594f026f0e", + "token": { + "decimals": 18, + "symbol": "JPGC" + }, + "isSC": {} + }, + "0x213c53c96a01a89e6dcc5683cf16473203e17513": { + "name": "DSS token contract", + "address": "0x213c53c96a01a89e6dcc5683cf16473203e17513", + "token": { + "decimals": 18, + "symbol": "DSS" + }, + "isSC": {} + }, + "0x4c9edd5852cd905f086c759e8383e09bff1e68b3": { + "name": "USDE token contract", + "address": "0x4c9edd5852cd905f086c759e8383e09bff1e68b3", + "token": { + "decimals": 18, + "symbol": "USDE" + }, + "isSC": {} + }, + "0xc6cc3d07c705e39d11c7f60d8836c7c78d4ac5f1": { + "name": "OLEA token contract", + "address": "0xc6cc3d07c705e39d11c7f60d8836c7c78d4ac5f1", + "token": { + "decimals": 18, + "symbol": "OLEA" + }, + "isSC": {} + }, + "0x4b0181102a0112a2ef11abee5563bb4a3176c9d7": { + "name": "CSUSHI token contract", + "address": "0x4b0181102a0112a2ef11abee5563bb4a3176c9d7", + "token": { + "decimals": 8, + "symbol": "CSUSHI" + }, + "isSC": {} + }, + "0x8793fb615eb92822f482f88b3137b00aad4c00d2": { + "name": "REVOAI token contract", + "address": "0x8793fb615eb92822f482f88b3137b00aad4c00d2", + "token": { + "decimals": 9, + "symbol": "REVOAI" + }, + "isSC": {} + }, + "0xbf1aa3a0e1294b3b996533f5d648dec2e59bad05": { + "name": "FAT token contract", + "address": "0xbf1aa3a0e1294b3b996533f5d648dec2e59bad05", + "token": { + "decimals": 18, + "symbol": "FAT" + }, + "isSC": {} + }, + "0x0a3bb08b3a15a19b4de82f8acfc862606fb69a2d": { + "name": "IUSD token contract", + "address": "0x0a3bb08b3a15a19b4de82f8acfc862606fb69a2d", + "token": { + "decimals": 18, + "symbol": "IUSD" + }, + "isSC": {} + }, + "0x515d7e9d75e2b76db60f8a051cd890eba23286bc": { + "name": "GDAO token contract", + "address": "0x515d7e9d75e2b76db60f8a051cd890eba23286bc", + "token": { + "decimals": 18, + "symbol": "GDAO" + }, + "isSC": {} + }, + "0x6732efaf6f39926346bef8b821a04b6361c4f3e5": { + "name": "SAFETH token contract", + "address": "0x6732efaf6f39926346bef8b821a04b6361c4f3e5", + "token": { + "decimals": 18, + "symbol": "SAFETH" + }, + "isSC": {} + }, + "0x8ef32a03784c8fd63bbf027251b9620865bd54b6": { + "name": "BULLET token contract", + "address": "0x8ef32a03784c8fd63bbf027251b9620865bd54b6", + "token": { + "decimals": 8, + "symbol": "BULLET" + }, + "isSC": {} + }, + "0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c": { + "name": "Edgeless", + "address": "0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c", + "token": { + "decimals": 0, + "symbol": "EDG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/edg.svg" + }, + "0x1032abe2902a23ddcbab085c20e0e69c33ceb8fa": { + "name": "SNAKE token contract", + "address": "0x1032abe2902a23ddcbab085c20e0e69c33ceb8fa", + "token": { + "decimals": 18, + "symbol": "SNAKE" + }, + "isSC": {} + }, + "0xebcf2fbe20e7bbbd5232eb186b85c143d362074e": { + "name": "DREAM token contract", + "address": "0xebcf2fbe20e7bbbd5232eb186b85c143d362074e", + "token": { + "decimals": 18, + "symbol": "DREAM" + }, + "isSC": {} + }, + "0xa891cf72aeda692570928efe1a832342e9783cdc": { + "name": "IFEX token contract", + "address": "0xa891cf72aeda692570928efe1a832342e9783cdc", + "token": { + "decimals": 18, + "symbol": "IFEX" + }, + "isSC": {} + }, + "0x0fd3822072ad001aac1c90a09d9506f097f24458": { + "name": "NOA token contract", + "address": "0x0fd3822072ad001aac1c90a09d9506f097f24458", + "token": { + "decimals": 9, + "symbol": "NOA" + }, + "isSC": {} + }, + "0x93ad9b819c88d98b4c9641470a96e24769ae7922": { + "name": "KRX token contract", + "address": "0x93ad9b819c88d98b4c9641470a96e24769ae7922", + "token": { + "decimals": 9, + "symbol": "KRX" + }, + "isSC": {} + }, + "0xf278c1ca969095ffddded020290cf8b5c424ace2": { + "name": "RUFF token contract", + "address": "0xf278c1ca969095ffddded020290cf8b5c424ace2", + "token": { + "decimals": 18, + "symbol": "RUFF" + }, + "isSC": {} + }, + "0x69e8b9528cabda89fe846c67675b5d73d463a916": { + "name": "OPEN token contract", + "address": "0x69e8b9528cabda89fe846c67675b5d73d463a916", + "token": { + "decimals": 18, + "symbol": "OPEN" + }, + "isSC": {} + }, + "0x52d134c6db5889fad3542a09eaf7aa90c0fdf9e4": { + "name": "BIBTA token contract", + "address": "0x52d134c6db5889fad3542a09eaf7aa90c0fdf9e4", + "token": { + "decimals": 18, + "symbol": "BIBTA" + }, + "isSC": {} + }, + "0x96e61422b6a9ba0e068b6c5add4ffabc6a4aae27": { + "name": "IBEUR token contract", + "address": "0x96e61422b6a9ba0e068b6c5add4ffabc6a4aae27", + "token": { + "decimals": 18, + "symbol": "IBEUR" + }, + "isSC": {} + }, + "0x2e516ba5bf3b7ee47fb99b09eadb60bde80a82e0": { + "name": "EGGS token contract", + "address": "0x2e516ba5bf3b7ee47fb99b09eadb60bde80a82e0", + "token": { + "decimals": 18, + "symbol": "EGGS" + }, + "isSC": {} + }, + "0xdf347911910b6c9a4286ba8e2ee5ea4a39eb2134": { + "name": "Bob's Repair", + "address": "0xdf347911910b6c9a4286ba8e2ee5ea4a39eb2134", + "token": { + "decimals": 18, + "symbol": "BOB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bobsrepair.png" + }, + "0x26a604dffe3ddab3bee816097f81d3c4a2a4cf97": { + "name": "CORX token contract", + "address": "0x26a604dffe3ddab3bee816097f81d3c4a2a4cf97", + "token": { + "decimals": 8, + "symbol": "CORX" + }, + "isSC": {} + }, + "0x888cea2bbdd5d47a4032cf63668d7525c74af57a": { + "name": "POOF token contract", + "address": "0x888cea2bbdd5d47a4032cf63668d7525c74af57a", + "token": { + "decimals": 18, + "symbol": "POOF" + }, + "isSC": {} + }, + "0x2c95d751da37a5c1d9c5a7fd465c1d50f3d96160": { + "name": "WASSIE", + "address": "0x2c95d751da37a5c1d9c5a7fd465c1d50f3d96160", + "token": { + "decimals": 18, + "symbol": "WASSIE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wassie.svg" + }, + "0x9bf3be1e445d5d386f891a1eccc3245e5a3670a4": { + "name": "FACET token contract", + "address": "0x9bf3be1e445d5d386f891a1eccc3245e5a3670a4", + "token": { + "decimals": 9, + "symbol": "FACET" + }, + "isSC": {} + }, + "0x2516e7b3f76294e03c42aa4c5b5b4dce9c436fb8": { + "name": "ABAL token contract", + "address": "0x2516e7b3f76294e03c42aa4c5b5b4dce9c436fb8", + "token": { + "decimals": 18, + "symbol": "ABAL" + }, + "isSC": {} + }, + "0x8db253a1943dddf1af9bcf8706ac9a0ce939d922": { + "name": "UNB token contract", + "address": "0x8db253a1943dddf1af9bcf8706ac9a0ce939d922", + "token": { + "decimals": 18, + "symbol": "UNB" + }, + "isSC": {} + }, + "0x06874f973dc3c96dc22a10ef0d0609f877f335ea": { + "name": "STA token contract", + "address": "0x06874f973dc3c96dc22a10ef0d0609f877f335ea", + "token": { + "decimals": 18, + "symbol": "STA" + }, + "isSC": {} + }, + "0x9c0241e7538b35454735ae453423daf470a25b3a": { + "name": "UNITYBOT token contract", + "address": "0x9c0241e7538b35454735ae453423daf470a25b3a", + "token": { + "decimals": 9, + "symbol": "UNITYBOT" + }, + "isSC": {} + }, + "0x054f76beed60ab6dbeb23502178c52d6c5debe40": { + "name": "FIN token contract", + "address": "0x054f76beed60ab6dbeb23502178c52d6c5debe40", + "token": { + "decimals": 18, + "symbol": "FIN" + }, + "isSC": {} + }, + "0x90de74265a416e1393a450752175aed98fe11517": { + "name": "UDT token contract", + "address": "0x90de74265a416e1393a450752175aed98fe11517", + "token": { + "decimals": 18, + "symbol": "UDT" + }, + "isSC": {} + }, + "0xa4eb9c64ec359d093eac7b65f51ef933d6e5f7cd": { + "name": "STABLZ token contract", + "address": "0xa4eb9c64ec359d093eac7b65f51ef933d6e5f7cd", + "token": { + "decimals": 18, + "symbol": "STABLZ" + }, + "isSC": {} + }, + "0xe8e06a5613dc86d459bc8fb989e173bb8b256072": { + "name": "FEY token contract", + "address": "0xe8e06a5613dc86d459bc8fb989e173bb8b256072", + "token": { + "decimals": 18, + "symbol": "FEY" + }, + "isSC": {} + }, + "0x8185bc4757572da2a610f887561c32298f1a5748": { + "name": "ALN token contract", + "address": "0x8185bc4757572da2a610f887561c32298f1a5748", + "token": { + "decimals": 18, + "symbol": "ALN" + }, + "isSC": {} + }, + "0x7b95ec873268a6bfc6427e7a28e396db9d0ebc65": { + "name": "ACRV token contract", + "address": "0x7b95ec873268a6bfc6427e7a28e396db9d0ebc65", + "token": { + "decimals": 18, + "symbol": "ACRV" + }, + "isSC": {} + }, + "0x5f4361971667c8198706dec8c59cf7607e405c6e": { + "name": "FSC token contract", + "address": "0x5f4361971667c8198706dec8c59cf7607e405c6e", + "token": { + "decimals": 8, + "symbol": "FSC" + }, + "isSC": {} + }, + "0xbe92b510007bd3ec0adb3d1fca338dd631e98de7": { + "name": "DEGEN token contract", + "address": "0xbe92b510007bd3ec0adb3d1fca338dd631e98de7", + "token": { + "decimals": 18, + "symbol": "DEGEN" + }, + "isSC": {} + }, + "0xcb27e0b9530d5107302e3e0691dd0f64faf498b0": { + "name": "POW token contract", + "address": "0xcb27e0b9530d5107302e3e0691dd0f64faf498b0", + "token": { + "decimals": 18, + "symbol": "POW" + }, + "isSC": {} + }, + "0xf1f508c7c9f0d1b15a76fba564eef2d956220cf7": { + "name": "PPDEX token contract", + "address": "0xf1f508c7c9f0d1b15a76fba564eef2d956220cf7", + "token": { + "decimals": 18, + "symbol": "PPDEX" + }, + "isSC": {} + }, + "0xe7f58a92476056627f9fdb92286778abd83b285f": { + "name": "DWEB token contract", + "address": "0xe7f58a92476056627f9fdb92286778abd83b285f", + "token": { + "decimals": 18, + "symbol": "DWEB" + }, + "isSC": {} + }, + "0xcdd0d11de0225b528b3a20d6436392c8260969d0": { + "name": "ONIC token contract", + "address": "0xcdd0d11de0225b528b3a20d6436392c8260969d0", + "token": { + "decimals": 18, + "symbol": "ONIC" + }, + "isSC": {} + }, + "0xc98d64da73a6616c42117b582e832812e7b8d57f": { + "name": "RSS3 token contract", + "address": "0xc98d64da73a6616c42117b582e832812e7b8d57f", + "token": { + "decimals": 18, + "symbol": "RSS3" + }, + "isSC": {} + }, + "0x7e9e431a0b8c4d532c745b1043c7fa29a48d4fba": { + "name": "EOSDAC token contract", + "address": "0x7e9e431a0b8c4d532c745b1043c7fa29a48d4fba", + "token": { + "decimals": 18, + "symbol": "EOSDAC" + }, + "isSC": {} + }, + "0x4abb9cc67bd3da9eb966d1159a71a0e68bd15432": { + "name": "KEL token contract", + "address": "0x4abb9cc67bd3da9eb966d1159a71a0e68bd15432", + "token": { + "decimals": 18, + "symbol": "KEL" + }, + "isSC": {} + }, + "0x0ebe16fdda617619cb6b6755084914c3a17c70c1": { + "name": "GTRON token contract", + "address": "0x0ebe16fdda617619cb6b6755084914c3a17c70c1", + "token": { + "decimals": 9, + "symbol": "GTRON" + }, + "isSC": {} + }, + "0x43af0944b34ad466dcea7fc8f77aafc6a4ec70fa": { + "name": "RAVEN token contract", + "address": "0x43af0944b34ad466dcea7fc8f77aafc6a4ec70fa", + "token": { + "decimals": 18, + "symbol": "RAVEN" + }, + "isSC": {} + }, + "0x04e0af0af1b7f0023c6b12af5a94df59b0e8cf59": { + "name": "SETS token contract", + "address": "0x04e0af0af1b7f0023c6b12af5a94df59b0e8cf59", + "token": { + "decimals": 18, + "symbol": "SETS" + }, + "isSC": {} + }, + "0x3802c218221390025bceabbad5d8c59f40eb74b8": { + "name": "GETH token contract", + "address": "0x3802c218221390025bceabbad5d8c59f40eb74b8", + "token": { + "decimals": 18, + "symbol": "GETH" + }, + "isSC": {} + }, + "0x2a7e415c169ce3a580c6f374dc26f6aaad1eccfe": { + "name": "HACHI token contract", + "address": "0x2a7e415c169ce3a580c6f374dc26f6aaad1eccfe", + "token": { + "decimals": 18, + "symbol": "HACHI" + }, + "isSC": {} + }, + "0x7a771a90b8f2a10afd9a75b8e49d646d1139bb98": { + "name": "DEAL token contract", + "address": "0x7a771a90b8f2a10afd9a75b8e49d646d1139bb98", + "token": { + "decimals": 18, + "symbol": "DEAL" + }, + "isSC": {} + }, + "0x60f63b76e2fc1649e57a3489162732a90acf59fe": { + "name": "FLURRY token contract", + "address": "0x60f63b76e2fc1649e57a3489162732a90acf59fe", + "token": { + "decimals": 18, + "symbol": "FLURRY" + }, + "isSC": {} + }, + "0xed328e9c1179a30ddc1e7595e036aed8760c22af": { + "name": "MCADE token contract", + "address": "0xed328e9c1179a30ddc1e7595e036aed8760c22af", + "token": { + "decimals": 18, + "symbol": "MCADE" + }, + "isSC": {} + }, + "0x15f20f9dfdf96ccf6ac96653b7c0abfe4a9c9f0f": { + "name": "WSB token contract", + "address": "0x15f20f9dfdf96ccf6ac96653b7c0abfe4a9c9f0f", + "token": { + "decimals": 18, + "symbol": "WSB" + }, + "isSC": {} + }, + "0x03d1e72765545729a035e909edd9371a405f77fb": { + "name": "NABOX token contract", + "address": "0x03d1e72765545729a035e909edd9371a405f77fb", + "token": { + "decimals": 18, + "symbol": "NABOX" + }, + "isSC": {} + }, + "0xe477292f1b3268687a29376116b0ed27a9c76170": { + "name": "Herocoin", + "address": "0xe477292f1b3268687a29376116b0ed27a9c76170", + "token": { + "decimals": 18, + "symbol": "PLAY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/herocoin_logo.png" + }, + "0x189fc141854bfc6146777406d53fbc89f4e70407": { + "name": "CEJI token contract", + "address": "0x189fc141854bfc6146777406d53fbc89f4e70407", + "token": { + "decimals": 18, + "symbol": "CEJI" + }, + "isSC": {} + }, + "0x02b87cde9932ef36df3607ac1a8c24bdf23d988c": { + "name": "STONKS token contract", + "address": "0x02b87cde9932ef36df3607ac1a8c24bdf23d988c", + "token": { + "decimals": 18, + "symbol": "STONKS" + }, + "isSC": {} + }, + "0xea38eaa3c86c8f9b751533ba2e562deb9acded40": { + "name": "FUEL token contract", + "address": "0xea38eaa3c86c8f9b751533ba2e562deb9acded40", + "token": { + "decimals": 18, + "symbol": "FUEL" + }, + "isSC": {} + }, + "0xb1f136a74e18e4e2921febbf25820d1bb65b5647": { + "name": "HIPUNKS token contract", + "address": "0xb1f136a74e18e4e2921febbf25820d1bb65b5647", + "token": { + "decimals": 18, + "symbol": "HIPUNKS" + }, + "isSC": {} + }, + "0x2be1e42bf263aab47d27ba92e72c14823e101d7c": { + "name": "FFRAX token contract", + "address": "0x2be1e42bf263aab47d27ba92e72c14823e101d7c", + "token": { + "decimals": 18, + "symbol": "FFRAX" + }, + "isSC": {} + }, + "0xd0929d411954c47438dc1d871dd6081f5c5e149c": { + "name": "Refereum", + "address": "0xd0929d411954c47438dc1d871dd6081f5c5e149c", + "token": { + "decimals": 4, + "symbol": "RFR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rfr.svg" + }, + "0x217ddead61a42369a266f1fb754eb5d3ebadc88a": { + "name": "DON token contract", + "address": "0x217ddead61a42369a266f1fb754eb5d3ebadc88a", + "token": { + "decimals": 18, + "symbol": "DON" + }, + "isSC": {} + }, + "0x543ff227f64aa17ea132bf9886cab5db55dcaddf": { + "name": "DAOstack", + "address": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", + "token": { + "decimals": 18, + "symbol": "GEN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gen.svg" + }, + "0x2162f572b25f7358db9376ab58a947a4e45cede1": { + "name": "LBL token contract", + "address": "0x2162f572b25f7358db9376ab58a947a4e45cede1", + "token": { + "decimals": 18, + "symbol": "LBL" + }, + "isSC": {} + }, + "0xdf3ac4f479375802a821f7b7b46cd7eb5e4262cc": { + "name": "EUSD token contract", + "address": "0xdf3ac4f479375802a821f7b7b46cd7eb5e4262cc", + "token": { + "decimals": 18, + "symbol": "EUSD" + }, + "isSC": {} + }, + "0x730f8c56c709c5f5b4a6e91f98fa7a7c410e990d": { + "name": "ETHF token contract", + "address": "0x730f8c56c709c5f5b4a6e91f98fa7a7c410e990d", + "token": { + "decimals": 18, + "symbol": "ETHF" + }, + "isSC": {} + }, + "0xde2f7766c8bf14ca67193128535e5c7454f8387c": { + "name": "META token contract", + "address": "0xde2f7766c8bf14ca67193128535e5c7454f8387c", + "token": { + "decimals": 18, + "symbol": "META" + }, + "isSC": {} + }, + "0xe67f943af5eb6051ef56f05979cc30b732717fa6": { + "name": "WATT token contract", + "address": "0xe67f943af5eb6051ef56f05979cc30b732717fa6", + "token": { + "decimals": 4, + "symbol": "WATT" + }, + "isSC": {} + }, + "0x8eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0": { + "name": "POS32 token contract", + "address": "0x8eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0", + "token": { + "decimals": 18, + "symbol": "POS32" + }, + "isSC": {} + }, + "0x4fb721ef3bf99e0f2c193847afa296b9257d3c30": { + "name": "TOK token contract", + "address": "0x4fb721ef3bf99e0f2c193847afa296b9257d3c30", + "token": { + "decimals": 8, + "symbol": "TOK" + }, + "isSC": {} + }, + "0x42d6622dece394b54999fbd73d108123806f6a18": { + "name": "SPANK", + "address": "0x42d6622dece394b54999fbd73d108123806f6a18", + "token": { + "decimals": 18, + "symbol": "SPANK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/spank.svg" + }, + "0x74be64b45d394fa57816c1950e94dbb8d7a7b306": { + "name": "GINU token contract", + "address": "0x74be64b45d394fa57816c1950e94dbb8d7a7b306", + "token": { + "decimals": 9, + "symbol": "GINU" + }, + "isSC": {} + }, + "0x3ec8798b81485a254928b70cda1cf0a2bb0b74d7": { + "name": "GRO token contract", + "address": "0x3ec8798b81485a254928b70cda1cf0a2bb0b74d7", + "token": { + "decimals": 18, + "symbol": "GRO" + }, + "isSC": {} + }, + "0x252b9f56359901a0bde52d0675b1f1130d86f471": { + "name": "PANDO token contract", + "address": "0x252b9f56359901a0bde52d0675b1f1130d86f471", + "token": { + "decimals": 18, + "symbol": "PANDO" + }, + "isSC": {} + }, + "0xee06a81a695750e71a662b51066f2c74cf4478a0": { + "name": "DG token contract", + "address": "0xee06a81a695750e71a662b51066f2c74cf4478a0", + "token": { + "decimals": 18, + "symbol": "DG" + }, + "isSC": {} + }, + "0x8a8116a794744977941c7d3743517410969aacbb": { + "name": "SPUNK token contract", + "address": "0x8a8116a794744977941c7d3743517410969aacbb", + "token": { + "decimals": 9, + "symbol": "SPUNK" + }, + "isSC": {} + }, + "0x777172d858dc1599914a1c4c6c9fc48c99a60990": { + "name": "SOLID token contract", + "address": "0x777172d858dc1599914a1c4c6c9fc48c99a60990", + "token": { + "decimals": 18, + "symbol": "SOLID" + }, + "isSC": {} + }, + "0x082716b6734b31791407d7dd0e2a2c41260029b2": { + "name": "HICOOLCATS token contract", + "address": "0x082716b6734b31791407d7dd0e2a2c41260029b2", + "token": { + "decimals": 18, + "symbol": "HICOOLCATS" + }, + "isSC": {} + }, + "0x8fc9b6354e839ab1c8b31f4afa53607092b8c2e5": { + "name": "ECU token contract", + "address": "0x8fc9b6354e839ab1c8b31f4afa53607092b8c2e5", + "token": { + "decimals": 18, + "symbol": "ECU" + }, + "isSC": {} + }, + "0xa0e7626287bd02cbe3531c65148261bf0c0ed98b": { + "name": "SGT token contract", + "address": "0xa0e7626287bd02cbe3531c65148261bf0c0ed98b", + "token": { + "decimals": 18, + "symbol": "SGT" + }, + "isSC": {} + }, + "0xfc05987bd2be489accf0f509e44b0145d68240f7": { + "name": "ESS token contract", + "address": "0xfc05987bd2be489accf0f509e44b0145d68240f7", + "token": { + "decimals": 18, + "symbol": "ESS" + }, + "isSC": {} + }, + "0x02795795196f563fdafce8dd97fca4871ded51c3": { + "name": "WNZ token contract", + "address": "0x02795795196f563fdafce8dd97fca4871ded51c3", + "token": { + "decimals": 18, + "symbol": "WNZ" + }, + "isSC": {} + }, + "0x441761326490cacf7af299725b6292597ee822c2": { + "name": "UNFI token contract", + "address": "0x441761326490cacf7af299725b6292597ee822c2", + "token": { + "decimals": 18, + "symbol": "UNFI" + }, + "isSC": {} + }, + "0xb893a8049f250b57efa8c62d51527a22404d7c9a": { + "name": "USHIBA token contract", + "address": "0xb893a8049f250b57efa8c62d51527a22404d7c9a", + "token": { + "decimals": 9, + "symbol": "USHIBA" + }, + "isSC": {} + }, + "0xa1b0edf4460cc4d8bfaa18ed871bff15e5b57eb4": { + "name": "AAMMUNIBATWETH token contract", + "address": "0xa1b0edf4460cc4d8bfaa18ed871bff15e5b57eb4", + "token": { + "decimals": 18, + "symbol": "AAMMUNIBATWETH" + }, + "isSC": {} + }, + "0xa97cd1c5bcee878496fadb4edee081d05239051f": { + "name": "AICB token contract", + "address": "0xa97cd1c5bcee878496fadb4edee081d05239051f", + "token": { + "decimals": 18, + "symbol": "AICB" + }, + "isSC": {} + }, + "0x083d41d6dd21ee938f0c055ca4fb12268df0efac": { + "name": "GogolCoin", + "address": "0x083d41d6dd21ee938f0c055ca4fb12268df0efac", + "token": { + "decimals": 4, + "symbol": "GOL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gol.svg" + }, + "0x60a26c05c5372dcded66940d2b56076bce925152": { + "name": "SILVER token contract", + "address": "0x60a26c05c5372dcded66940d2b56076bce925152", + "token": { + "decimals": 9, + "symbol": "SILVER" + }, + "isSC": {} + }, + "0x7f4c5447af6a96d8eeaee1d932338cfc57890dbd": { + "name": "DAVE token contract", + "address": "0x7f4c5447af6a96d8eeaee1d932338cfc57890dbd", + "token": { + "decimals": 18, + "symbol": "DAVE" + }, + "isSC": {} + }, + "0x7c5b267ed81009aa7374b5ca7e5137da47045ba8": { + "name": "TKAI token contract", + "address": "0x7c5b267ed81009aa7374b5ca7e5137da47045ba8", + "token": { + "decimals": 18, + "symbol": "TKAI" + }, + "isSC": {} + }, + "0xc4cb5793bd58bad06bf51fb37717b86b02cbe8a4": { + "name": "CREDIT token contract", + "address": "0xc4cb5793bd58bad06bf51fb37717b86b02cbe8a4", + "token": { + "decimals": 18, + "symbol": "CREDIT" + }, + "isSC": {} + }, + "0x30dcba0405004cf124045793e1933c798af9e66a": { + "name": "YDF token contract", + "address": "0x30dcba0405004cf124045793e1933c798af9e66a", + "token": { + "decimals": 18, + "symbol": "YDF" + }, + "isSC": {} + }, + "0xa58a83361936471b50e2d1c7f99d422e6d73d397": { + "name": "XRISE token contract", + "address": "0xa58a83361936471b50e2d1c7f99d422e6d73d397", + "token": { + "decimals": 18, + "symbol": "XRISE" + }, + "isSC": {} + }, + "0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8": { + "name": "AWETH token contract", + "address": "0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8", + "token": { + "decimals": 18, + "symbol": "AWETH" + }, + "isSC": {} + }, + "0x58f7345b5295e43aa454911571f13be186655be9": { + "name": "GRLC token contract", + "address": "0x58f7345b5295e43aa454911571f13be186655be9", + "token": { + "decimals": 8, + "symbol": "GRLC" + }, + "isSC": {} + }, + "0x375abb85c329753b1ba849a601438ae77eec9893": { + "name": "PDT token contract", + "address": "0x375abb85c329753b1ba849a601438ae77eec9893", + "token": { + "decimals": 18, + "symbol": "PDT" + }, + "isSC": {} + }, + "0xc4136c364289cc5b42acae1442ea28c1e994aab5": { + "name": "FBOT token contract", + "address": "0xc4136c364289cc5b42acae1442ea28c1e994aab5", + "token": { + "decimals": 18, + "symbol": "FBOT" + }, + "isSC": {} + }, + "0xde075d9adbd0240b4462f124af926452ad0bac91": { + "name": "BBF token contract", + "address": "0xde075d9adbd0240b4462f124af926452ad0bac91", + "token": { + "decimals": 18, + "symbol": "BBF" + }, + "isSC": {} + }, + "0xceeb07dd26b36287b6d109f0b06d7e8202ce8c1d": { + "name": "GOTG token contract", + "address": "0xceeb07dd26b36287b6d109f0b06d7e8202ce8c1d", + "token": { + "decimals": 18, + "symbol": "GOTG" + }, + "isSC": {} + }, + "0x4aa41bc1649c9c3177ed16caaa11482295fc7441": { + "name": "XFIT token contract", + "address": "0x4aa41bc1649c9c3177ed16caaa11482295fc7441", + "token": { + "decimals": 18, + "symbol": "XFIT" + }, + "isSC": {} + }, + "0x77c6e4a580c0dce4e5c7a17d0bc077188a83a059": { + "name": "SWUSD token contract", + "address": "0x77c6e4a580c0dce4e5c7a17d0bc077188a83a059", + "token": { + "decimals": 18, + "symbol": "SWUSD" + }, + "isSC": {} + }, + "0xd8c0b13b551718b808fc97ead59499d5ef862775": { + "name": "MUSIC token contract", + "address": "0xd8c0b13b551718b808fc97ead59499d5ef862775", + "token": { + "decimals": 8, + "symbol": "MUSIC" + }, + "isSC": {} + }, + "0x4236f8aaf2b1f3a28420eb15b8e0ddf63201a95e": { + "name": "BMDA token contract", + "address": "0x4236f8aaf2b1f3a28420eb15b8e0ddf63201a95e", + "token": { + "decimals": 18, + "symbol": "BMDA" + }, + "isSC": {} + }, + "0x8dae6cb04688c62d939ed9b68d32bc62e49970b1": { + "name": "ACRV token contract", + "address": "0x8dae6cb04688c62d939ed9b68d32bc62e49970b1", + "token": { + "decimals": 18, + "symbol": "ACRV" + }, + "isSC": {} + }, + "0x84342e932797fc62814189f01f0fb05f52519708": { + "name": "NHT token contract", + "address": "0x84342e932797fc62814189f01f0fb05f52519708", + "token": { + "decimals": 18, + "symbol": "NHT" + }, + "isSC": {} + }, + "0xe1fc4455f62a6e89476f1072530c20cf1a0622da": { + "name": "PHTR token contract", + "address": "0xe1fc4455f62a6e89476f1072530c20cf1a0622da", + "token": { + "decimals": 18, + "symbol": "PHTR" + }, + "isSC": {} + }, + "0x5510d26c504b21ef22ca85b7125390bc23ca50e7": { + "name": "SIMPSON20 token contract", + "address": "0x5510d26c504b21ef22ca85b7125390bc23ca50e7", + "token": { + "decimals": 9, + "symbol": "SIMPSON20" + }, + "isSC": {} + }, + "0x13dbd5394c2c7e4bdb85b1838286faa66532a262": { + "name": "TZU token contract", + "address": "0x13dbd5394c2c7e4bdb85b1838286faa66532a262", + "token": { + "decimals": 18, + "symbol": "TZU" + }, + "isSC": {} + }, + "0x6cd079f296c10eb84a64239b893d4edfa2e1d779": { + "name": "PLSCX token contract", + "address": "0x6cd079f296c10eb84a64239b893d4edfa2e1d779", + "token": { + "decimals": 18, + "symbol": "PLSCX" + }, + "isSC": {} + }, + "0x0b5326da634f9270fb84481dd6f94d3dc2ca7096": { + "name": "ETHO token contract", + "address": "0x0b5326da634f9270fb84481dd6f94d3dc2ca7096", + "token": { + "decimals": 18, + "symbol": "ETHO" + }, + "isSC": {} + }, + "0x9f2b8d32dd418d5b41e740265929e5d3d5fb102b": { + "name": "ANONBOT token contract", + "address": "0x9f2b8d32dd418d5b41e740265929e5d3d5fb102b", + "token": { + "decimals": 18, + "symbol": "ANONBOT" + }, + "isSC": {} + }, + "0xedf6568618a00c6f0908bf7758a16f76b6e04af9": { + "name": "Arianee", + "address": "0xedf6568618a00c6f0908bf7758a16f76b6e04af9", + "token": { + "decimals": 18, + "symbol": "ARIA20" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aria20.svg" + }, + "0x9196e18bc349b1f64bc08784eae259525329a1ad": { + "name": "PUSSY token contract", + "address": "0x9196e18bc349b1f64bc08784eae259525329a1ad", + "token": { + "decimals": 18, + "symbol": "PUSSY" + }, + "isSC": {} + }, + "0xf1290473e210b2108a85237fbcd7b6eb42cc654f": { + "name": "HEDG token contract", + "address": "0xf1290473e210b2108a85237fbcd7b6eb42cc654f", + "token": { + "decimals": 18, + "symbol": "HEDG" + }, + "isSC": {} + }, + "0x74b988156925937bd4e082f0ed7429da8eaea8db": { + "name": "MEME token contract", + "address": "0x74b988156925937bd4e082f0ed7429da8eaea8db", + "token": { + "decimals": 18, + "symbol": "MEME" + }, + "isSC": {} + }, + "0x63f314c44d164d5be423199afbfbe129d72d3ea6": { + "name": "BATTLE token contract", + "address": "0x63f314c44d164d5be423199afbfbe129d72d3ea6", + "token": { + "decimals": 18, + "symbol": "BATTLE" + }, + "isSC": {} + }, + "0x1e4e46b7bf03ece908c88ff7cc4975560010893a": { + "name": "IOEN token contract", + "address": "0x1e4e46b7bf03ece908c88ff7cc4975560010893a", + "token": { + "decimals": 18, + "symbol": "IOEN" + }, + "isSC": {} + }, + "0x41dbecc1cdc5517c6f76f6a6e836adbee2754de3": { + "name": "MTN token contract", + "address": "0x41dbecc1cdc5517c6f76f6a6e836adbee2754de3", + "token": { + "decimals": 18, + "symbol": "MTN" + }, + "isSC": {} + }, + "0x5aef5bba19e6a1644805bd4f5c93c8557b87c62c": { + "name": "FAKEAI token contract", + "address": "0x5aef5bba19e6a1644805bd4f5c93c8557b87c62c", + "token": { + "decimals": 18, + "symbol": "FAKEAI" + }, + "isSC": {} + }, + "0xc86d054809623432210c107af2e3f619dcfbf652": { + "name": "UPP token contract", + "address": "0xc86d054809623432210c107af2e3f619dcfbf652", + "token": { + "decimals": 18, + "symbol": "UPP" + }, + "isSC": {} + }, + "0x669c01caf0edcad7c2b8dc771474ad937a7ca4af": { + "name": "WMINIMA token contract", + "address": "0x669c01caf0edcad7c2b8dc771474ad937a7ca4af", + "token": { + "decimals": 18, + "symbol": "WMINIMA" + }, + "isSC": {} + }, + "0x030ba81f1c18d280636f32af80b9aad02cf0854e": { + "name": "Aave WETH", + "address": "0x030ba81f1c18d280636f32af80b9aad02cf0854e", + "token": { + "decimals": 18, + "symbol": "aWETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aWETH.svg" + }, + "0x8f9b4525681f3ea6e43b8e0a57bfff86c0a1dd2e": { + "name": "ZBU token contract", + "address": "0x8f9b4525681f3ea6e43b8e0a57bfff86c0a1dd2e", + "token": { + "decimals": 18, + "symbol": "ZBU" + }, + "isSC": {} + }, + "0x5cac718a3ae330d361e39244bf9e67ab17514ce8": { + "name": "COT token contract", + "address": "0x5cac718a3ae330d361e39244bf9e67ab17514ce8", + "token": { + "decimals": 18, + "symbol": "COT" + }, + "isSC": {} + }, + "0xb4fbed161bebcb37afb1cb4a6f7ca18b977ccb25": { + "name": "DOGES token contract", + "address": "0xb4fbed161bebcb37afb1cb4a6f7ca18b977ccb25", + "token": { + "decimals": 18, + "symbol": "DOGES" + }, + "isSC": {} + }, + "0x359108ca299ca693502ef217e2109ad02aa4277c": { + "name": "UMAYC token contract", + "address": "0x359108ca299ca693502ef217e2109ad02aa4277c", + "token": { + "decimals": 18, + "symbol": "UMAYC" + }, + "isSC": {} + }, + "0xd64809f5f7d772d9112a6bd379de00a77188199e": { + "name": "LSILVER token contract", + "address": "0xd64809f5f7d772d9112a6bd379de00a77188199e", + "token": { + "decimals": 18, + "symbol": "LSILVER" + }, + "isSC": {} + }, + "0x1e2c4fb7ede391d116e6b41cd0608260e8801d59": { + "name": "BCSPX token contract", + "address": "0x1e2c4fb7ede391d116e6b41cd0608260e8801d59", + "token": { + "decimals": 18, + "symbol": "BCSPX" + }, + "isSC": {} + }, + "0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5": { + "name": "BCDT token contract", + "address": "0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5", + "token": { + "decimals": 18, + "symbol": "BCDT" + }, + "isSC": {} + }, + "0xc3681a720605bd6f8fe9a2fabff6a7cdecdc605d": { + "name": "NIHAO token contract", + "address": "0xc3681a720605bd6f8fe9a2fabff6a7cdecdc605d", + "token": { + "decimals": 18, + "symbol": "NIHAO" + }, + "isSC": {} + }, + "0xcae7f3aa6d456463bef0e5b508542b69d96f2904": { + "name": "INVECTAI token contract", + "address": "0xcae7f3aa6d456463bef0e5b508542b69d96f2904", + "token": { + "decimals": 8, + "symbol": "INVECTAI" + }, + "isSC": {} + }, + "0x6bfdb6f4e65ead27118592a41eb927cea6956198": { + "name": "FMC token contract", + "address": "0x6bfdb6f4e65ead27118592a41eb927cea6956198", + "token": { + "decimals": 18, + "symbol": "FMC" + }, + "isSC": {} + }, + "0xc56aa8032d2cda3e401171b7787205f6640837d9": { + "name": "ALP token contract", + "address": "0xc56aa8032d2cda3e401171b7787205f6640837d9", + "token": { + "decimals": 9, + "symbol": "ALP" + }, + "isSC": {} + }, + "0x0ec78ed49c2d27b315d462d43b5bab94d2c79bf8": { + "name": "MEOW token contract", + "address": "0x0ec78ed49c2d27b315d462d43b5bab94d2c79bf8", + "token": { + "decimals": 18, + "symbol": "MEOW" + }, + "isSC": {} + }, + "0x2dca19e944453e46d9130950ca135461b3bc0c30": { + "name": "EYES token contract", + "address": "0x2dca19e944453e46d9130950ca135461b3bc0c30", + "token": { + "decimals": 18, + "symbol": "EYES" + }, + "isSC": {} + }, + "0x4216663ddc7bd10eaf44609df4dd0f91cd2be7f2": { + "name": "MPEPE token contract", + "address": "0x4216663ddc7bd10eaf44609df4dd0f91cd2be7f2", + "token": { + "decimals": 18, + "symbol": "MPEPE" + }, + "isSC": {} + }, + "0xe0e51a3f1d9c65bba1326e4a0b1d99b737efc2c0": { + "name": "RMD token contract", + "address": "0xe0e51a3f1d9c65bba1326e4a0b1d99b737efc2c0", + "token": { + "decimals": 8, + "symbol": "RMD" + }, + "isSC": {} + }, + "0x04c154b66cb340f3ae24111cc767e0184ed00cc6": { + "name": "PXETH token contract", + "address": "0x04c154b66cb340f3ae24111cc767e0184ed00cc6", + "token": { + "decimals": 18, + "symbol": "PXETH" + }, + "isSC": {} + }, + "0x3c9d6c1c73b31c837832c72e04d3152f051fc1a9": { + "name": "BOR token contract", + "address": "0x3c9d6c1c73b31c837832c72e04d3152f051fc1a9", + "token": { + "decimals": 18, + "symbol": "BOR" + }, + "isSC": {} + }, + "0x0e5f00da8aaef196a719d045db89b5da8f371b32": { + "name": "CNTM token contract", + "address": "0x0e5f00da8aaef196a719d045db89b5da8f371b32", + "token": { + "decimals": 18, + "symbol": "CNTM" + }, + "isSC": {} + }, + "0x550775e17ed6767621a1aed580e6eb29ede981e9": { + "name": "AGN token contract", + "address": "0x550775e17ed6767621a1aed580e6eb29ede981e9", + "token": { + "decimals": 18, + "symbol": "AGN" + }, + "isSC": {} + }, + "0xff770e4c68e35db85c6e0e89a43750ec02bdb2ac": { + "name": "OBTC token contract", + "address": "0xff770e4c68e35db85c6e0e89a43750ec02bdb2ac", + "token": { + "decimals": 18, + "symbol": "OBTC" + }, + "isSC": {} + }, + "0x5d6310984776583f58d29e45340f14ad3e8bbb98": { + "name": "VIRAL token contract", + "address": "0x5d6310984776583f58d29e45340f14ad3e8bbb98", + "token": { + "decimals": 18, + "symbol": "VIRAL" + }, + "isSC": {} + }, + "0xaf8942831f3a096f708b8b31f191b8958cf176c5": { + "name": "NERF token contract", + "address": "0xaf8942831f3a096f708b8b31f191b8958cf176c5", + "token": { + "decimals": 18, + "symbol": "NERF" + }, + "isSC": {} + }, + "0xfc0b60e0df5dc9d4b72d957ca2d251cee308019a": { + "name": "SLG token contract", + "address": "0xfc0b60e0df5dc9d4b72d957ca2d251cee308019a", + "token": { + "decimals": 18, + "symbol": "SLG" + }, + "isSC": {} + }, + "0x456125cd98107ae0480ba566f1b716d48ba31453": { + "name": "CHAMP token contract", + "address": "0x456125cd98107ae0480ba566f1b716d48ba31453", + "token": { + "decimals": 18, + "symbol": "CHAMP" + }, + "isSC": {} + }, + "0x78132543d8e20d2417d8a07d9ae199d458a0d581": { + "name": "LINU token contract", + "address": "0x78132543d8e20d2417d8a07d9ae199d458a0d581", + "token": { + "decimals": 18, + "symbol": "LINU" + }, + "isSC": {} + }, + "0x569424c5ee13884a193773fdc5d1c5f79c443a51": { + "name": "PINE token contract", + "address": "0x569424c5ee13884a193773fdc5d1c5f79c443a51", + "token": { + "decimals": 18, + "symbol": "PINE" + }, + "isSC": {} + }, + "0x13b2f6928d7204328b0e8e4bcd0379aa06ea21fa": { + "name": "AAMMWBTC token contract", + "address": "0x13b2f6928d7204328b0e8e4bcd0379aa06ea21fa", + "token": { + "decimals": 8, + "symbol": "AAMMWBTC" + }, + "isSC": {} + }, + "0x7d8daff6d70cead12c6f077048552cf89130a2b1": { + "name": "ARX token contract", + "address": "0x7d8daff6d70cead12c6f077048552cf89130a2b1", + "token": { + "decimals": 18, + "symbol": "ARX" + }, + "isSC": {} + }, + "0x9be776559fed779cabd67042a7b8987aae592541": { + "name": "BULL token contract", + "address": "0x9be776559fed779cabd67042a7b8987aae592541", + "token": { + "decimals": 18, + "symbol": "BULL" + }, + "isSC": {} + }, + "0xee772cec929d8430b4fa7a01cd7fbd159a68aa83": { + "name": "SHANG token contract", + "address": "0xee772cec929d8430b4fa7a01cd7fbd159a68aa83", + "token": { + "decimals": 18, + "symbol": "SHANG" + }, + "isSC": {} + }, + "0x5dd0d493ea59d512efc13d5c1f9d325775192877": { + "name": "PUSUKE token contract", + "address": "0x5dd0d493ea59d512efc13d5c1f9d325775192877", + "token": { + "decimals": 18, + "symbol": "PUSUKE" + }, + "isSC": {} + }, + "0x875773784af8135ea0ef43b5a374aad105c5d39e": { + "name": "Idle DAO Token", + "address": "0x875773784af8135ea0ef43b5a374aad105c5d39e", + "token": { + "decimals": 18, + "symbol": "IDLE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/idle.svg" + }, + "0x96c645d3d3706f793ef52c19bbace441900ed47d": { + "name": "MPS token contract", + "address": "0x96c645d3d3706f793ef52c19bbace441900ed47d", + "token": { + "decimals": 0, + "symbol": "MPS" + }, + "isSC": {} + }, + "0xadc234a4e90e2045f353f5d4fcde66144d23b458": { + "name": "FUSDT token contract", + "address": "0xadc234a4e90e2045f353f5d4fcde66144d23b458", + "token": { + "decimals": 6, + "symbol": "FUSDT" + }, + "isSC": {} + }, + "0x5a035e3f1551a15230d0cde3357fb1bf89369261": { + "name": "WOOO token contract", + "address": "0x5a035e3f1551a15230d0cde3357fb1bf89369261", + "token": { + "decimals": 18, + "symbol": "WOOO" + }, + "isSC": {} + }, + "0x2af1df3ab0ab157e1e2ad8f88a7d04fbea0c7dc6": { + "name": "BED token contract", + "address": "0x2af1df3ab0ab157e1e2ad8f88a7d04fbea0c7dc6", + "token": { + "decimals": 18, + "symbol": "BED" + }, + "isSC": {} + }, + "0xd22a61e8503bea5842e5e0126ca9ffc4dd492084": { + "name": " token contract", + "address": "0xd22a61e8503bea5842e5e0126ca9ffc4dd492084", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x823e1b82ce1dc147bbdb25a203f046afab1ce918": { + "name": "COIL token contract", + "address": "0x823e1b82ce1dc147bbdb25a203f046afab1ce918", + "token": { + "decimals": 18, + "symbol": "COIL" + }, + "isSC": {} + }, + "0xc66cdac744916afb6811c71c277d88de90ce8d5b": { + "name": "MCD token contract", + "address": "0xc66cdac744916afb6811c71c277d88de90ce8d5b", + "token": { + "decimals": 18, + "symbol": "MCD" + }, + "isSC": {} + }, + "0x433fb346139e4eb5e513ae5fd77bd98614b153b1": { + "name": "UBEANZ token contract", + "address": "0x433fb346139e4eb5e513ae5fd77bd98614b153b1", + "token": { + "decimals": 18, + "symbol": "UBEANZ" + }, + "isSC": {} + }, + "0xb94acdf8662cd955f137e0c9c9fba535c87b57b4": { + "name": "LISA token contract", + "address": "0xb94acdf8662cd955f137e0c9c9fba535c87b57b4", + "token": { + "decimals": 18, + "symbol": "LISA" + }, + "isSC": {} + }, + "0xeb31ba344310bc4872c6188ff210d7341a301ea9": { + "name": "GUESS token contract", + "address": "0xeb31ba344310bc4872c6188ff210d7341a301ea9", + "token": { + "decimals": 9, + "symbol": "GUESS" + }, + "isSC": {} + }, + "0x28fda76721a8077a5de802ab0212849b8c38429e": { + "name": "ARV token contract", + "address": "0x28fda76721a8077a5de802ab0212849b8c38429e", + "token": { + "decimals": 18, + "symbol": "ARV" + }, + "isSC": {} + }, + "0xa07dcc1abfe20d29d87a32e2ba89876145dafb0a": { + "name": "UDOODLE token contract", + "address": "0xa07dcc1abfe20d29d87a32e2ba89876145dafb0a", + "token": { + "decimals": 18, + "symbol": "UDOODLE" + }, + "isSC": {} + }, + "0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c": { + "name": "AUSDC token contract", + "address": "0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c", + "token": { + "decimals": 6, + "symbol": "AUSDC" + }, + "isSC": {} + }, + "0x78223d31298107f3e310b09797b07967832046a6": { + "name": "RSFT token contract", + "address": "0x78223d31298107f3e310b09797b07967832046a6", + "token": { + "decimals": 18, + "symbol": "RSFT" + }, + "isSC": {} + }, + "0xa62894d5196bc44e4c3978400ad07e7b30352372": { + "name": "X token contract", + "address": "0xa62894d5196bc44e4c3978400ad07e7b30352372", + "token": { + "decimals": 9, + "symbol": "X" + }, + "isSC": {} + }, + "0x442bc47357919446eabc18c7211e57a13d983469": { + "name": "CHAT token contract", + "address": "0x442bc47357919446eabc18c7211e57a13d983469", + "token": { + "decimals": 18, + "symbol": "CHAT" + }, + "isSC": {} + }, + "0x7105e64bf67eca3ae9b123f0e5ca2b83b2ef2da0": { + "name": "X7DAO token contract", + "address": "0x7105e64bf67eca3ae9b123f0e5ca2b83b2ef2da0", + "token": { + "decimals": 18, + "symbol": "X7DAO" + }, + "isSC": {} + }, + "0xfed656555a88c86675d2bf01a3b7861c3f89d478": { + "name": "ALCZ token contract", + "address": "0xfed656555a88c86675d2bf01a3b7861c3f89d478", + "token": { + "decimals": 18, + "symbol": "ALCZ" + }, + "isSC": {} + }, + "0x501e8726d06cdef66f3e0cb67f54924cca1cc894": { + "name": "BRMV token contract", + "address": "0x501e8726d06cdef66f3e0cb67f54924cca1cc894", + "token": { + "decimals": 18, + "symbol": "BRMV" + }, + "isSC": {} + }, + "0xb7bda6a89e724f63572ce68fddc1a6d1d5d24bcf": { + "name": "OGZ token contract", + "address": "0xb7bda6a89e724f63572ce68fddc1a6d1d5d24bcf", + "token": { + "decimals": 18, + "symbol": "OGZ" + }, + "isSC": {} + }, + "0xe63684bcf2987892cefb4caa79bd21b34e98a291": { + "name": "KFC token contract", + "address": "0xe63684bcf2987892cefb4caa79bd21b34e98a291", + "token": { + "decimals": 18, + "symbol": "KFC" + }, + "isSC": {} + }, + "0xad161afae7db2a048b042bd68e11c38c9c042cc1": { + "name": "UNKMGS token contract", + "address": "0xad161afae7db2a048b042bd68e11c38c9c042cc1", + "token": { + "decimals": 18, + "symbol": "UNKMGS" + }, + "isSC": {} + }, + "0xbfc66d8cce39e668fd5d3c10fd1b1eabb82c27b7": { + "name": "OVO token contract", + "address": "0xbfc66d8cce39e668fd5d3c10fd1b1eabb82c27b7", + "token": { + "decimals": 18, + "symbol": "OVO" + }, + "isSC": {} + }, + "0x6293bbe52c3682057163172850002f18f993da6a": { + "name": "TRUTH token contract", + "address": "0x6293bbe52c3682057163172850002f18f993da6a", + "token": { + "decimals": 18, + "symbol": "TRUTH" + }, + "isSC": {} + }, + "0xa922a70569a7555518bf4ded5094661a965e23ca": { + "name": "MNB token contract", + "address": "0xa922a70569a7555518bf4ded5094661a965e23ca", + "token": { + "decimals": 8, + "symbol": "MNB" + }, + "isSC": {} + }, + "0xf519381791c03dd7666c142d4e49fd94d3536011": { + "name": "ASIA token contract", + "address": "0xf519381791c03dd7666c142d4e49fd94d3536011", + "token": { + "decimals": 18, + "symbol": "ASIA" + }, + "isSC": {} + }, + "0x265f542c1e78068f13d87c6fe0df54f3e9562a48": { + "name": "POP token contract", + "address": "0x265f542c1e78068f13d87c6fe0df54f3e9562a48", + "token": { + "decimals": 9, + "symbol": "POP" + }, + "isSC": {} + }, + "0x3f17f64f682019599ba51638f74e4b6c127fe725": { + "name": "REVIVE token contract", + "address": "0x3f17f64f682019599ba51638f74e4b6c127fe725", + "token": { + "decimals": 18, + "symbol": "REVIVE" + }, + "isSC": {} + }, + "0x580c8520deda0a441522aeae0f9f7a5f29629afa": { + "name": "DAWN token contract", + "address": "0x580c8520deda0a441522aeae0f9f7a5f29629afa", + "token": { + "decimals": 18, + "symbol": "DAWN" + }, + "isSC": {} + }, + "0xa41d2f8ee4f47d3b860a149765a7df8c3287b7f0": { + "name": "SYNC token contract", + "address": "0xa41d2f8ee4f47d3b860a149765a7df8c3287b7f0", + "token": { + "decimals": 9, + "symbol": "SYNC" + }, + "isSC": {} + }, + "0x6706e05f3bafdba97de268483bc3a54bf92a883c": { + "name": "HYPE token contract", + "address": "0x6706e05f3bafdba97de268483bc3a54bf92a883c", + "token": { + "decimals": 9, + "symbol": "HYPE" + }, + "isSC": {} + }, + "0x337af08bb6980ecb68389c5ed8876d08643abf8a": { + "name": "VACHI token contract", + "address": "0x337af08bb6980ecb68389c5ed8876d08643abf8a", + "token": { + "decimals": 18, + "symbol": "VACHI" + }, + "isSC": {} + }, + "0xedf978ee4beafbeefd7a0f55faa5a7c6c3cd467d": { + "name": "UCOOL token contract", + "address": "0xedf978ee4beafbeefd7a0f55faa5a7c6c3cd467d", + "token": { + "decimals": 18, + "symbol": "UCOOL" + }, + "isSC": {} + }, + "0x8666cb197af5103f7a3a0295b50efea47f3df78b": { + "name": "DUCKS token contract", + "address": "0x8666cb197af5103f7a3a0295b50efea47f3df78b", + "token": { + "decimals": 18, + "symbol": "DUCKS" + }, + "isSC": {} + }, + "0x5ad02305ba9a4985390170337582986e419f1a2c": { + "name": "CX token contract", + "address": "0x5ad02305ba9a4985390170337582986e419f1a2c", + "token": { + "decimals": 9, + "symbol": "CX" + }, + "isSC": {} + }, + "0xf32cfbaf4000e6820a95b3a3fcdbf27fb4efc9af": { + "name": "CASH token contract", + "address": "0xf32cfbaf4000e6820a95b3a3fcdbf27fb4efc9af", + "token": { + "decimals": 18, + "symbol": "CASH" + }, + "isSC": {} + }, + "0xc961da88bb5e8ee2ba7dfd4c62a875ef80f7202f": { + "name": "HARAM token contract", + "address": "0xc961da88bb5e8ee2ba7dfd4c62a875ef80f7202f", + "token": { + "decimals": 9, + "symbol": "HARAM" + }, + "isSC": {} + }, + "0x3a880652f47bfaa771908c07dd8673a787daed3a": { + "name": "DerivaDAO", + "address": "0x3a880652f47bfaa771908c07dd8673a787daed3a", + "token": { + "decimals": 18, + "symbol": "DDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DDX.svg" + }, + "0x8326bf664704966c984a3a46fa37d7a80a52dcf4": { + "name": "DOGU token contract", + "address": "0x8326bf664704966c984a3a46fa37d7a80a52dcf4", + "token": { + "decimals": 18, + "symbol": "DOGU" + }, + "isSC": {} + }, + "0xfed802a7e561d6324818358790b176a01d765f19": { + "name": "FED token contract", + "address": "0xfed802a7e561d6324818358790b176a01d765f19", + "token": { + "decimals": 18, + "symbol": "FED" + }, + "isSC": {} + }, + "0xb939da54f9748440a1b279d42be1296942732288": { + "name": "FONZY token contract", + "address": "0xb939da54f9748440a1b279d42be1296942732288", + "token": { + "decimals": 18, + "symbol": "FONZY" + }, + "isSC": {} + }, + "0x94be6962be41377d5beda8dfe1b100f3bf0eacf3": { + "name": "DORKL token contract", + "address": "0x94be6962be41377d5beda8dfe1b100f3bf0eacf3", + "token": { + "decimals": 18, + "symbol": "DORKL" + }, + "isSC": {} + }, + "0x62406995cafd18f57e7375e8e0060725acebce58": { + "name": "FIWT token contract", + "address": "0x62406995cafd18f57e7375e8e0060725acebce58", + "token": { + "decimals": 18, + "symbol": "FIWT" + }, + "isSC": {} + }, + "0xd32641191578ea9b208125ddd4ec5e7b84fcab4c": { + "name": "TMED token contract", + "address": "0xd32641191578ea9b208125ddd4ec5e7b84fcab4c", + "token": { + "decimals": 18, + "symbol": "TMED" + }, + "isSC": {} + }, + "0x70bef3bb2f001da2fddb207dae696cd9faff3f5d": { + "name": "NST token contract", + "address": "0x70bef3bb2f001da2fddb207dae696cd9faff3f5d", + "token": { + "decimals": 18, + "symbol": "NST" + }, + "isSC": {} + }, + "0x08d967bb0134f2d07f7cfb6e246680c53927dd30": { + "name": "MATH Token", + "address": "0x08d967bb0134f2d07f7cfb6e246680c53927dd30", + "token": { + "decimals": 18, + "symbol": "MATH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/math.svg" + }, + "0x9669890e48f330acd88b78d63e1a6b3482652cd9": { + "name": "BCNT token contract", + "address": "0x9669890e48f330acd88b78d63e1a6b3482652cd9", + "token": { + "decimals": 18, + "symbol": "BCNT" + }, + "isSC": {} + }, + "0x8798249c2e607446efb7ad49ec89dd1865ff4272": { + "name": "XSUSHI token contract", + "address": "0x8798249c2e607446efb7ad49ec89dd1865ff4272", + "token": { + "decimals": 18, + "symbol": "XSUSHI" + }, + "isSC": {} + }, + "0x0a63afff33b1ed0d209762578d328b90ea1e7a78": { + "name": "CAL token contract", + "address": "0x0a63afff33b1ed0d209762578d328b90ea1e7a78", + "token": { + "decimals": 9, + "symbol": "CAL" + }, + "isSC": {} + }, + "0xb9d4b6dc1e1ee3577cc442de015cc11f238b35ed": { + "name": "MAG token contract", + "address": "0xb9d4b6dc1e1ee3577cc442de015cc11f238b35ed", + "token": { + "decimals": 18, + "symbol": "MAG" + }, + "isSC": {} + }, + "0x5c559f3ee9a81da83e069c0093471cb05d84052a": { + "name": "BABYPEPE token contract", + "address": "0x5c559f3ee9a81da83e069c0093471cb05d84052a", + "token": { + "decimals": 18, + "symbol": "BABYPEPE" + }, + "isSC": {} + }, + "0x3b9be07d622accaed78f479bc0edabfd6397e320": { + "name": "LSS token contract", + "address": "0x3b9be07d622accaed78f479bc0edabfd6397e320", + "token": { + "decimals": 18, + "symbol": "LSS" + }, + "isSC": {} + }, + "0x741b0428efdf4372a8df6fb54b018db5e5ab7710": { + "name": "ARTX token contract", + "address": "0x741b0428efdf4372a8df6fb54b018db5e5ab7710", + "token": { + "decimals": 18, + "symbol": "ARTX" + }, + "isSC": {} + }, + "0x586a7cfe21e55ec0e24f0bfb118f77fe4ca87bab": { + "name": "CRYPTO token contract", + "address": "0x586a7cfe21e55ec0e24f0bfb118f77fe4ca87bab", + "token": { + "decimals": 18, + "symbol": "CRYPTO" + }, + "isSC": {} + }, + "0xab14f1262ea8d910756828cbe08e6cedfb66360d": { + "name": "TORO token contract", + "address": "0xab14f1262ea8d910756828cbe08e6cedfb66360d", + "token": { + "decimals": 18, + "symbol": "TORO" + }, + "isSC": {} + }, + "0x22b48e1f20043d1db5f2a11cbf1d520a4f20b198": { + "name": "XOT token contract", + "address": "0x22b48e1f20043d1db5f2a11cbf1d520a4f20b198", + "token": { + "decimals": 18, + "symbol": "XOT" + }, + "isSC": {} + }, + "0x0275e1001e293c46cfe158b3702aade0b99f88a5": { + "name": "Oiler", + "address": "0x0275e1001e293c46cfe158b3702aade0b99f88a5", + "token": { + "decimals": 18, + "symbol": "OIL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/oiler.svg" + }, + "0x69cd13d248830602a60b1f20ab11f5049385877d": { + "name": "BABYPEPE token contract", + "address": "0x69cd13d248830602a60b1f20ab11f5049385877d", + "token": { + "decimals": 18, + "symbol": "BABYPEPE" + }, + "isSC": {} + }, + "0x226bb599a12c826476e3a771454697ea52e9e220": { + "name": "PRO token contract", + "address": "0x226bb599a12c826476e3a771454697ea52e9e220", + "token": { + "decimals": 8, + "symbol": "PRO" + }, + "isSC": {} + }, + "0xcae3faa4b6cf660aef18474074949ba0948bc025": { + "name": "GEN token contract", + "address": "0xcae3faa4b6cf660aef18474074949ba0948bc025", + "token": { + "decimals": 18, + "symbol": "GEN" + }, + "isSC": {} + }, + "0x44f5909e97e1cbf5fbbdf0fc92fd83cde5d5c58a": { + "name": "ACRIA token contract", + "address": "0x44f5909e97e1cbf5fbbdf0fc92fd83cde5d5c58a", + "token": { + "decimals": 18, + "symbol": "ACRIA" + }, + "isSC": {} + }, + "0x7fd4d7737597e7b4ee22acbf8d94362343ae0a79": { + "name": "WMC token contract", + "address": "0x7fd4d7737597e7b4ee22acbf8d94362343ae0a79", + "token": { + "decimals": 2, + "symbol": "WMC" + }, + "isSC": {} + }, + "0xf552b656022c218c26dad43ad88881fc04116f76": { + "name": "MORK token contract", + "address": "0xf552b656022c218c26dad43ad88881fc04116f76", + "token": { + "decimals": 4, + "symbol": "MORK" + }, + "isSC": {} + }, + "0x5c147e74d63b1d31aa3fd78eb229b65161983b2b": { + "name": "WFLOW token contract", + "address": "0x5c147e74d63b1d31aa3fd78eb229b65161983b2b", + "token": { + "decimals": 18, + "symbol": "WFLOW" + }, + "isSC": {} + }, + "0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5": { + "name": "Hunt Token", + "address": "0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5", + "token": { + "decimals": 18, + "symbol": "HUNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hunt.png" + }, + "0x380bd08929d4ae51de22f708dccb6b4c534ab79a": { + "name": "TINFA token contract", + "address": "0x380bd08929d4ae51de22f708dccb6b4c534ab79a", + "token": { + "decimals": 18, + "symbol": "TINFA" + }, + "isSC": {} + }, + "0xb3cb8d5aeff0f4d1f432f353309f47b885e404e3": { + "name": "MEV token contract", + "address": "0xb3cb8d5aeff0f4d1f432f353309f47b885e404e3", + "token": { + "decimals": 18, + "symbol": "MEV" + }, + "isSC": {} + }, + "0x3893b9422cd5d70a81edeffe3d5a1c6a978310bb": { + "name": "Mithril", + "address": "0x3893b9422cd5d70a81edeffe3d5a1c6a978310bb", + "token": { + "decimals": 18, + "symbol": "MITH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mith.svg" + }, + "0x664c6e221c77313307467b121528ad563107bd01": { + "name": "TAXHAVENINU token contract", + "address": "0x664c6e221c77313307467b121528ad563107bd01", + "token": { + "decimals": 9, + "symbol": "TAXHAVENINU" + }, + "isSC": {} + }, + "0xbb4f3ad7a2cf75d8effc4f6d7bd21d95f06165ca": { + "name": "SHS token contract", + "address": "0xbb4f3ad7a2cf75d8effc4f6d7bd21d95f06165ca", + "token": { + "decimals": 18, + "symbol": "SHS" + }, + "isSC": {} + }, + "0x4da34f8264cb33a5c9f17081b9ef5ff6091116f4": { + "name": "Elyfi", + "address": "0x4da34f8264cb33a5c9f17081b9ef5ff6091116f4", + "token": { + "decimals": 18, + "symbol": "ELFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/elyfi.svg" + }, + "0xecbddf83687e9842837e08c5a650658f2260b376": { + "name": "CURVE token contract", + "address": "0xecbddf83687e9842837e08c5a650658f2260b376", + "token": { + "decimals": 9, + "symbol": "CURVE" + }, + "isSC": {} + }, + "0x6a36481af18289f80af4a1b21e4f6d323fabc712": { + "name": "PVPBOT token contract", + "address": "0x6a36481af18289f80af4a1b21e4f6d323fabc712", + "token": { + "decimals": 9, + "symbol": "PVPBOT" + }, + "isSC": {} + }, + "0x0414d8c87b271266a5864329fb4932bbe19c0c49": { + "name": "WSB token contract", + "address": "0x0414d8c87b271266a5864329fb4932bbe19c0c49", + "token": { + "decimals": 18, + "symbol": "WSB" + }, + "isSC": {} + }, + "0xaf05ce8a2cef336006e933c02fc89887f5b3c726": { + "name": "LMI token contract", + "address": "0xaf05ce8a2cef336006e933c02fc89887f5b3c726", + "token": { + "decimals": 18, + "symbol": "LMI" + }, + "isSC": {} + }, + "0x066798d9ef0833ccc719076dab77199ecbd178b0": { + "name": "SAKE token contract", + "address": "0x066798d9ef0833ccc719076dab77199ecbd178b0", + "token": { + "decimals": 18, + "symbol": "SAKE" + }, + "isSC": {} + }, + "0xf3e66b03d098d0482be9cb3d6999787231a93ed9": { + "name": "PROMPTIDE token contract", + "address": "0xf3e66b03d098d0482be9cb3d6999787231a93ed9", + "token": { + "decimals": 9, + "symbol": "PROMPTIDE" + }, + "isSC": {} + }, + "0x4db2c02831c9ac305ff9311eb661f80f1df61e07": { + "name": "ONEICHI token contract", + "address": "0x4db2c02831c9ac305ff9311eb661f80f1df61e07", + "token": { + "decimals": 18, + "symbol": "ONEICHI" + }, + "isSC": {} + }, + "0xf0edac27aa3e85e2d176f689b0025f90c154393a": { + "name": "LOVESNOOPY token contract", + "address": "0xf0edac27aa3e85e2d176f689b0025f90c154393a", + "token": { + "decimals": 18, + "symbol": "LOVESNOOPY" + }, + "isSC": {} + }, + "0x903bef1736cddf2a537176cf3c64579c3867a881": { + "name": "ICHI token contract", + "address": "0x903bef1736cddf2a537176cf3c64579c3867a881", + "token": { + "decimals": 9, + "symbol": "ICHI" + }, + "isSC": {} + }, + "0x1c9a2d6b33b4826757273d47ebee0e2dddcd978b": { + "name": "FFRAX token contract", + "address": "0x1c9a2d6b33b4826757273d47ebee0e2dddcd978b", + "token": { + "decimals": 8, + "symbol": "FFRAX" + }, + "isSC": {} + }, + "0x6e765d26388a17a6e86c49a8e41df3f58abcd337": { + "name": "Kangal", + "address": "0x6e765d26388a17a6e86c49a8e41df3f58abcd337", + "token": { + "decimals": 18, + "symbol": "KANGAL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kangal.svg" + }, + "0x419777d3e39aa9b00405724eace5ea57620c9062": { + "name": "PAW token contract", + "address": "0x419777d3e39aa9b00405724eace5ea57620c9062", + "token": { + "decimals": 18, + "symbol": "PAW" + }, + "isSC": {} + }, + "0x6213f40e00f4595aa038fa710e3f837b492d6757": { + "name": "THEPOND token contract", + "address": "0x6213f40e00f4595aa038fa710e3f837b492d6757", + "token": { + "decimals": 12, + "symbol": "THEPOND" + }, + "isSC": {} + }, + "0x1c95b093d6c236d3ef7c796fe33f9cc6b8606714": { + "name": "BOMB token contract", + "address": "0x1c95b093d6c236d3ef7c796fe33f9cc6b8606714", + "token": { + "decimals": 0, + "symbol": "BOMB" + }, + "isSC": {} + }, + "0x72b886d09c117654ab7da13a14d603001de0b777": { + "name": "XDEFI token contract", + "address": "0x72b886d09c117654ab7da13a14d603001de0b777", + "token": { + "decimals": 18, + "symbol": "XDEFI" + }, + "isSC": {} + }, + "0x198d7387fa97a73f05b8578cdeff8f2a1f34cd1f": { + "name": "WJAURA token contract", + "address": "0x198d7387fa97a73f05b8578cdeff8f2a1f34cd1f", + "token": { + "decimals": 18, + "symbol": "WJAURA" + }, + "isSC": {} + }, + "0xa1116930326d21fb917d5a27f1e9943a9595fb47": { + "name": "STKABPT token contract", + "address": "0xa1116930326d21fb917d5a27f1e9943a9595fb47", + "token": { + "decimals": 18, + "symbol": "STKABPT" + }, + "isSC": {} + }, + "0x3b7f247f21bf3a07088c2d3423f64233d4b069f7": { + "name": "DYNMT token contract", + "address": "0x3b7f247f21bf3a07088c2d3423f64233d4b069f7", + "token": { + "decimals": 2, + "symbol": "DYNMT" + }, + "isSC": {} + }, + "0x20d4db1946859e2adb0e5acc2eac58047ad41395": { + "name": "MOONEY token contract", + "address": "0x20d4db1946859e2adb0e5acc2eac58047ad41395", + "token": { + "decimals": 18, + "symbol": "MOONEY" + }, + "isSC": {} + }, + "0xb197a6fdd8ab825332edeba1ab5c4d1bf97fb9a8": { + "name": "SHIBDAO token contract", + "address": "0xb197a6fdd8ab825332edeba1ab5c4d1bf97fb9a8", + "token": { + "decimals": 18, + "symbol": "SHIBDAO" + }, + "isSC": {} + }, + "0xf45f6c8bb3d77ea762175b8f7ca4d251941649fa": { + "name": "LEMD token contract", + "address": "0xf45f6c8bb3d77ea762175b8f7ca4d251941649fa", + "token": { + "decimals": 18, + "symbol": "LEMD" + }, + "isSC": {} + }, + "0x62959c699a52ec647622c91e79ce73344e4099f5": { + "name": "DFA token contract", + "address": "0x62959c699a52ec647622c91e79ce73344e4099f5", + "token": { + "decimals": 18, + "symbol": "DFA" + }, + "isSC": {} + }, + "0xbf776e4fca664d791c4ee3a71e2722990e003283": { + "name": "SMTY token contract", + "address": "0xbf776e4fca664d791c4ee3a71e2722990e003283", + "token": { + "decimals": 18, + "symbol": "SMTY" + }, + "isSC": {} + }, + "0x0fcbc31c503b4a9ed90e87f8ff46c318a4a14260": { + "name": "QTF token contract", + "address": "0x0fcbc31c503b4a9ed90e87f8ff46c318a4a14260", + "token": { + "decimals": 8, + "symbol": "QTF" + }, + "isSC": {} + }, + "0x3f3052ccc6ab2337e3d63f5c695c4471a8637a32": { + "name": "OOF token contract", + "address": "0x3f3052ccc6ab2337e3d63f5c695c4471a8637a32", + "token": { + "decimals": 18, + "symbol": "OOF" + }, + "isSC": {} + }, + "0x101cc05f4a51c0319f570d5e146a8c625198e636": { + "name": "Aave TUSD", + "address": "0x101cc05f4a51c0319f570d5e146a8c625198e636", + "token": { + "decimals": 18, + "symbol": "aTUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aTUSD.svg" + }, + "0x990e081a7b7d3ccba26a2f49746a68cc4ff73280": { + "name": "KSC token contract", + "address": "0x990e081a7b7d3ccba26a2f49746a68cc4ff73280", + "token": { + "decimals": 18, + "symbol": "KSC" + }, + "isSC": {} + }, + "0xb63b606ac810a52cca15e44bb630fd42d8d1d83d": { + "name": "MCO token contract", + "address": "0xb63b606ac810a52cca15e44bb630fd42d8d1d83d", + "token": { + "decimals": 8, + "symbol": "MCO" + }, + "isSC": {} + }, + "0x5d285f735998f36631f678ff41fb56a10a4d0429": { + "name": "MIX token contract", + "address": "0x5d285f735998f36631f678ff41fb56a10a4d0429", + "token": { + "decimals": 18, + "symbol": "MIX" + }, + "isSC": {} + }, + "0x996229d0c6a485c7f4b52e092eaa907cb2def5c6": { + "name": "BHIG token contract", + "address": "0x996229d0c6a485c7f4b52e092eaa907cb2def5c6", + "token": { + "decimals": 18, + "symbol": "BHIG" + }, + "isSC": {} + }, + "0xaa2ce7ae64066175e0b90497ce7d9c190c315db4": { + "name": "SUTER token contract", + "address": "0xaa2ce7ae64066175e0b90497ce7d9c190c315db4", + "token": { + "decimals": 18, + "symbol": "SUTER" + }, + "isSC": {} + }, + "0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd": { + "name": "HAKKA token contract", + "address": "0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd", + "token": { + "decimals": 18, + "symbol": "HAKKA" + }, + "isSC": {} + }, + "0xf0c5831ec3da15f3696b4dad8b21c7ce2f007f28": { + "name": "AXIS token contract", + "address": "0xf0c5831ec3da15f3696b4dad8b21c7ce2f007f28", + "token": { + "decimals": 8, + "symbol": "AXIS" + }, + "isSC": {} + }, + "0x6b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611": { + "name": "Million", + "address": "0x6b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611", + "token": { + "decimals": 18, + "symbol": "MM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/million.svg" + }, + "0x1d96fd43ee07aa79f8fd003cbdf404fb5ce41ad2": { + "name": "QWLA token contract", + "address": "0x1d96fd43ee07aa79f8fd003cbdf404fb5ce41ad2", + "token": { + "decimals": 18, + "symbol": "QWLA" + }, + "isSC": {} + }, + "0xe02d1524e385d67613e2ee969c60395be9a89f92": { + "name": "1% token contract", + "address": "0xe02d1524e385d67613e2ee969c60395be9a89f92", + "token": { + "decimals": 18, + "symbol": "1%" + }, + "isSC": {} + }, + "0x9778ac3d5a2f916aa9abf1eb85c207d990ca2655": { + "name": "OGSM token contract", + "address": "0x9778ac3d5a2f916aa9abf1eb85c207d990ca2655", + "token": { + "decimals": 18, + "symbol": "OGSM" + }, + "isSC": {} + }, + "0xd945d2031b4c63c0e363304fb771f709b502dc0a": { + "name": "BMC token contract", + "address": "0xd945d2031b4c63c0e363304fb771f709b502dc0a", + "token": { + "decimals": 18, + "symbol": "BMC" + }, + "isSC": {} + }, + "0xed6bb4700abd545575f0642bb5ea8e0d3b24e9f3": { + "name": "DIFI token contract", + "address": "0xed6bb4700abd545575f0642bb5ea8e0d3b24e9f3", + "token": { + "decimals": 18, + "symbol": "DIFI" + }, + "isSC": {} + }, + "0xdd1ad9a21ce722c151a836373babe42c868ce9a4": { + "name": "Universal Basic Income", + "address": "0xdd1ad9a21ce722c151a836373babe42c868ce9a4", + "token": { + "decimals": 18, + "symbol": "UBI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ubi.svg" + }, + "0x46cca329970b33e1a007dd4ef0594a1cedb3e72a": { + "name": "YESP token contract", + "address": "0x46cca329970b33e1a007dd4ef0594a1cedb3e72a", + "token": { + "decimals": 18, + "symbol": "YESP" + }, + "isSC": {} + }, + "0xb40c535c8899f95e3b722df2f0619ebd28c4a4ea": { + "name": "KNDA token contract", + "address": "0xb40c535c8899f95e3b722df2f0619ebd28c4a4ea", + "token": { + "decimals": 18, + "symbol": "KNDA" + }, + "isSC": {} + }, + "0xcd17fa52528f37facb3028688e62ec82d9417581": { + "name": "MTRM token contract", + "address": "0xcd17fa52528f37facb3028688e62ec82d9417581", + "token": { + "decimals": 0, + "symbol": "MTRM" + }, + "isSC": {} + }, + "0x3b0b09f5b14f6d50e6672ae158f9d71893feca18": { + "name": "HIBAKC token contract", + "address": "0x3b0b09f5b14f6d50e6672ae158f9d71893feca18", + "token": { + "decimals": 18, + "symbol": "HIBAKC" + }, + "isSC": {} + }, + "0x19e2a43fbbc643c3b2d9667d858d49cad17bc2b5": { + "name": "BNS token contract", + "address": "0x19e2a43fbbc643c3b2d9667d858d49cad17bc2b5", + "token": { + "decimals": 8, + "symbol": "BNS" + }, + "isSC": {} + }, + "0xaa61d5dec73971cd4a026ef2820bb87b4a4ed8d6": { + "name": "CRE8R token contract", + "address": "0xaa61d5dec73971cd4a026ef2820bb87b4a4ed8d6", + "token": { + "decimals": 18, + "symbol": "CRE8R" + }, + "isSC": {} + }, + "0x0fd67b4ceb9b607ef206904ec73459c4880132c9": { + "name": "SHOE token contract", + "address": "0x0fd67b4ceb9b607ef206904ec73459c4880132c9", + "token": { + "decimals": 18, + "symbol": "SHOE" + }, + "isSC": {} + }, + "0xb06b8186cc008a79fd6722b1eefad07c14e97da0": { + "name": "SIGN token contract", + "address": "0xb06b8186cc008a79fd6722b1eefad07c14e97da0", + "token": { + "decimals": 18, + "symbol": "SIGN" + }, + "isSC": {} + }, + "0xc278041fdd8249fe4c1aad1193876857eea3d68c": { + "name": "IDLETUSDYIELD token contract", + "address": "0xc278041fdd8249fe4c1aad1193876857eea3d68c", + "token": { + "decimals": 18, + "symbol": "IDLETUSDYIELD" + }, + "isSC": {} + }, + "0x0a13a5929e5f0ff0eaba4bd9e9512c91fce40280": { + "name": "XAI token contract", + "address": "0x0a13a5929e5f0ff0eaba4bd9e9512c91fce40280", + "token": { + "decimals": 9, + "symbol": "XAI" + }, + "isSC": {} + }, + "0x72e203a17add19a3099137c9d7015fd3e2b7dba9": { + "name": "BCP token contract", + "address": "0x72e203a17add19a3099137c9d7015fd3e2b7dba9", + "token": { + "decimals": 18, + "symbol": "BCP" + }, + "isSC": {} + }, + "0x049715c70fdbdd2be4814f76a53dc3d6f4367756": { + "name": "NEZUKO token contract", + "address": "0x049715c70fdbdd2be4814f76a53dc3d6f4367756", + "token": { + "decimals": 18, + "symbol": "NEZUKO" + }, + "isSC": {} + }, + "0x076641af1b8f06b7f8c92587156143c109002cbe": { + "name": "SOP token contract", + "address": "0x076641af1b8f06b7f8c92587156143c109002cbe", + "token": { + "decimals": 18, + "symbol": "SOP" + }, + "isSC": {} + }, + "0xd81b71cbb89b2800cdb000aa277dc1491dc923c3": { + "name": "NMT token contract", + "address": "0xd81b71cbb89b2800cdb000aa277dc1491dc923c3", + "token": { + "decimals": 18, + "symbol": "NMT" + }, + "isSC": {} + }, + "0xde5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02": { + "name": "GERA token contract", + "address": "0xde5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02", + "token": { + "decimals": 18, + "symbol": "GERA" + }, + "isSC": {} + }, + "0x4e4bffaa8df6f0dc3e5600bbacf7da55f37134fc": { + "name": "BST token contract", + "address": "0x4e4bffaa8df6f0dc3e5600bbacf7da55f37134fc", + "token": { + "decimals": 18, + "symbol": "BST" + }, + "isSC": {} + }, + "0xc631120155621ee625835ec810b9885cdd764cd6": { + "name": "GLDX token contract", + "address": "0xc631120155621ee625835ec810b9885cdd764cd6", + "token": { + "decimals": 8, + "symbol": "GLDX" + }, + "isSC": {} + }, + "0x5cd8adec25af71f038c54bf580fc04d06b5f12ab": { + "name": "CCE token contract", + "address": "0x5cd8adec25af71f038c54bf580fc04d06b5f12ab", + "token": { + "decimals": 18, + "symbol": "CCE" + }, + "isSC": {} + }, + "0x0ad896863ce4cd84f10a9d30d4f509ceffd53c84": { + "name": "CLB token contract", + "address": "0x0ad896863ce4cd84f10a9d30d4f509ceffd53c84", + "token": { + "decimals": 18, + "symbol": "CLB" + }, + "isSC": {} + }, + "0x1a3cbda3853494acab67648ee59afeb7ec3e9334": { + "name": "COLT token contract", + "address": "0x1a3cbda3853494acab67648ee59afeb7ec3e9334", + "token": { + "decimals": 18, + "symbol": "COLT" + }, + "isSC": {} + }, + "0x0808e6c4400bde1d70db0d02170b67de05e07ef5": { + "name": "WLYX token contract", + "address": "0x0808e6c4400bde1d70db0d02170b67de05e07ef5", + "token": { + "decimals": 18, + "symbol": "WLYX" + }, + "isSC": {} + }, + "0xf55cd1e399e1cc3d95303048897a680be3313308": { + "name": "TRIO token contract", + "address": "0xf55cd1e399e1cc3d95303048897a680be3313308", + "token": { + "decimals": 8, + "symbol": "TRIO" + }, + "isSC": {} + }, + "0xbd713f15673b9861b6123840f6e0eba03d6aae51": { + "name": "EYEBOT token contract", + "address": "0xbd713f15673b9861b6123840f6e0eba03d6aae51", + "token": { + "decimals": 9, + "symbol": "EYEBOT" + }, + "isSC": {} + }, + "0xa1abecc1b3958da78259fa2793653fc48e976420": { + "name": "DOGGGO token contract", + "address": "0xa1abecc1b3958da78259fa2793653fc48e976420", + "token": { + "decimals": 18, + "symbol": "DOGGGO" + }, + "isSC": {} + }, + "0x6988a804c74fd04f37da1ea4781cea68c9c00f86": { + "name": "TRIBL token contract", + "address": "0x6988a804c74fd04f37da1ea4781cea68c9c00f86", + "token": { + "decimals": 18, + "symbol": "TRIBL" + }, + "isSC": {} + }, + "0x5dfe42eea70a3e6f93ee54ed9c321af07a85535c": { + "name": "UNION token contract", + "address": "0x5dfe42eea70a3e6f93ee54ed9c321af07a85535c", + "token": { + "decimals": 18, + "symbol": "UNION" + }, + "isSC": {} + }, + "0x5c2975269e74cb3a8514e5b800a1e66c694d4df8": { + "name": "HER token contract", + "address": "0x5c2975269e74cb3a8514e5b800a1e66c694d4df8", + "token": { + "decimals": 18, + "symbol": "HER" + }, + "isSC": {} + }, + "0x6e98e5401adcb0d76f4debfc3d794b3031f48790": { + "name": "AUR token contract", + "address": "0x6e98e5401adcb0d76f4debfc3d794b3031f48790", + "token": { + "decimals": 18, + "symbol": "AUR" + }, + "isSC": {} + }, + "0x3d371413dd5489f3a04c07c0c2ce369c20986ceb": { + "name": "YOUC token contract", + "address": "0x3d371413dd5489f3a04c07c0c2ce369c20986ceb", + "token": { + "decimals": 10, + "symbol": "YOUC" + }, + "isSC": {} + }, + "0x93b1e78a3e652cd2e71c4a767595b77282344932": { + "name": "BITO token contract", + "address": "0x93b1e78a3e652cd2e71c4a767595b77282344932", + "token": { + "decimals": 18, + "symbol": "BITO" + }, + "isSC": {} + }, + "0x34dce75a3d1910cc9d188aa5a75fb9addcae0fcc": { + "name": "XV token contract", + "address": "0x34dce75a3d1910cc9d188aa5a75fb9addcae0fcc", + "token": { + "decimals": 18, + "symbol": "XV" + }, + "isSC": {} + }, + "0x76960dccd5a1fe799f7c29be9f19ceb4627aeb2f": { + "name": "RED token contract", + "address": "0x76960dccd5a1fe799f7c29be9f19ceb4627aeb2f", + "token": { + "decimals": 18, + "symbol": "RED" + }, + "isSC": {} + }, + "0xa3e54198998d800703399f3bfa38be4e14045036": { + "name": "REVIVAL token contract", + "address": "0xa3e54198998d800703399f3bfa38be4e14045036", + "token": { + "decimals": 18, + "symbol": "REVIVAL" + }, + "isSC": {} + }, + "0x1fbd3df007eb8a7477a1eab2c63483dcc24effd6": { + "name": "SCA token contract", + "address": "0x1fbd3df007eb8a7477a1eab2c63483dcc24effd6", + "token": { + "decimals": 18, + "symbol": "SCA" + }, + "isSC": {} + }, + "0x32ea3dc70e2962334864a9665254d2433e4ddbfd": { + "name": "SPN token contract", + "address": "0x32ea3dc70e2962334864a9665254d2433e4ddbfd", + "token": { + "decimals": 18, + "symbol": "SPN" + }, + "isSC": {} + }, + "0xaed8077b25c88af2e711abdcc24ef9389b028876": { + "name": "POGEX token contract", + "address": "0xaed8077b25c88af2e711abdcc24ef9389b028876", + "token": { + "decimals": 18, + "symbol": "POGEX" + }, + "isSC": {} + }, + "0x992d339532a9c42f1b0e59a57e95f38da38c66f6": { + "name": "SOUL token contract", + "address": "0x992d339532a9c42f1b0e59a57e95f38da38c66f6", + "token": { + "decimals": 18, + "symbol": "SOUL" + }, + "isSC": {} + }, + "0xa43a7c62d56df036c187e1966c03e2799d8987ed": { + "name": "TRUMATIC token contract", + "address": "0xa43a7c62d56df036c187e1966c03e2799d8987ed", + "token": { + "decimals": 18, + "symbol": "TRUMATIC" + }, + "isSC": {} + }, + "0x0198f46f520f33cd4329bd4be380a25a90536cd5": { + "name": "PLA token contract", + "address": "0x0198f46f520f33cd4329bd4be380a25a90536cd5", + "token": { + "decimals": 18, + "symbol": "PLA" + }, + "isSC": {} + }, + "0xbd89b8d708809e7022135313683663911826977e": { + "name": "OME token contract", + "address": "0xbd89b8d708809e7022135313683663911826977e", + "token": { + "decimals": 18, + "symbol": "OME" + }, + "isSC": {} + }, + "0x8eedefe828a0f16c8fc80e46a87bc0f1de2d960c": { + "name": "DGMV token contract", + "address": "0x8eedefe828a0f16c8fc80e46a87bc0f1de2d960c", + "token": { + "decimals": 18, + "symbol": "DGMV" + }, + "isSC": {} + }, + "0xa9ad6830180f9c150349f2cecadd710586e35cb7": { + "name": "ETHS token contract", + "address": "0xa9ad6830180f9c150349f2cecadd710586e35cb7", + "token": { + "decimals": 18, + "symbol": "ETHS" + }, + "isSC": {} + }, + "0x42726d074bba68ccc15200442b72afa2d495a783": { + "name": "ISIKC token contract", + "address": "0x42726d074bba68ccc15200442b72afa2d495a783", + "token": { + "decimals": 4, + "symbol": "ISIKC" + }, + "isSC": {} + }, + "0xd49ff13661451313ca1553fd6954bd1d9b6e02b9": { + "name": "ELEC token contract", + "address": "0xd49ff13661451313ca1553fd6954bd1d9b6e02b9", + "token": { + "decimals": 18, + "symbol": "ELEC" + }, + "isSC": {} + }, + "0x34d6a0f5c2f5d0082141fe73d93b9dd00ca7ce11": { + "name": "GOLD token contract", + "address": "0x34d6a0f5c2f5d0082141fe73d93b9dd00ca7ce11", + "token": { + "decimals": 18, + "symbol": "GOLD" + }, + "isSC": {} + }, + "0xf8e9f10c22840b613cda05a0c5fdb59a4d6cd7ef": { + "name": "DOE token contract", + "address": "0xf8e9f10c22840b613cda05a0c5fdb59a4d6cd7ef", + "token": { + "decimals": 18, + "symbol": "DOE" + }, + "isSC": {} + }, + "0x686d1596e5632fe0471961e7977e8efe371b0b21": { + "name": "AZEE token contract", + "address": "0x686d1596e5632fe0471961e7977e8efe371b0b21", + "token": { + "decimals": 18, + "symbol": "AZEE" + }, + "isSC": {} + }, + "0x4a1d542b52a95ad01ddc70c2e7df0c7bbaadc56f": { + "name": "NIFT token contract", + "address": "0x4a1d542b52a95ad01ddc70c2e7df0c7bbaadc56f", + "token": { + "decimals": 18, + "symbol": "NIFT" + }, + "isSC": {} + }, + "0x7199b5a15c7fb79aa861780230adc65fff99ec73": { + "name": "0XANON token contract", + "address": "0x7199b5a15c7fb79aa861780230adc65fff99ec73", + "token": { + "decimals": 8, + "symbol": "0XANON" + }, + "isSC": {} + }, + "0xb8647e90c0645152fccf4d9abb6b59eb4aa99052": { + "name": "KEYFI token contract", + "address": "0xb8647e90c0645152fccf4d9abb6b59eb4aa99052", + "token": { + "decimals": 18, + "symbol": "KEYFI" + }, + "isSC": {} + }, + "0xbd3de9a069648c84d27d74d701c9fa3253098b15": { + "name": "EQX token contract", + "address": "0xbd3de9a069648c84d27d74d701c9fa3253098b15", + "token": { + "decimals": 18, + "symbol": "EQX" + }, + "isSC": {} + }, + "0x79c9e0410b6615e7ba9dd69614b0519325a2b047": { + "name": "HIFLUF token contract", + "address": "0x79c9e0410b6615e7ba9dd69614b0519325a2b047", + "token": { + "decimals": 18, + "symbol": "HIFLUF" + }, + "isSC": {} + }, + "0xaeba88c4df7e92af27fcaa7087c18dab4be9e607": { + "name": "TEAT token contract", + "address": "0xaeba88c4df7e92af27fcaa7087c18dab4be9e607", + "token": { + "decimals": 9, + "symbol": "TEAT" + }, + "isSC": {} + }, + "0x670b73820441b54c118ae4546aaee401d4dc7aa0": { + "name": "APP token contract", + "address": "0x670b73820441b54c118ae4546aaee401d4dc7aa0", + "token": { + "decimals": 9, + "symbol": "APP" + }, + "isSC": {} + }, + "0xa7fbd9254f10f8e20a31a593c9e8bc0d041e15f6": { + "name": "ORBN token contract", + "address": "0xa7fbd9254f10f8e20a31a593c9e8bc0d041e15f6", + "token": { + "decimals": 9, + "symbol": "ORBN" + }, + "isSC": {} + }, + "0x5552e5a89a70cb2ef5adbbc45a6be442fe7160ec": { + "name": "KAWA token contract", + "address": "0x5552e5a89a70cb2ef5adbbc45a6be442fe7160ec", + "token": { + "decimals": 9, + "symbol": "KAWA" + }, + "isSC": {} + }, + "0xe9da5e227e3fa4fc933b5f540be021e7ecc3fd81": { + "name": "GMFAM token contract", + "address": "0xe9da5e227e3fa4fc933b5f540be021e7ecc3fd81", + "token": { + "decimals": 18, + "symbol": "GMFAM" + }, + "isSC": {} + }, + "0xb19dd661f076998e3b0456935092a233e12c2280": { + "name": "UM token contract", + "address": "0xb19dd661f076998e3b0456935092a233e12c2280", + "token": { + "decimals": 18, + "symbol": "UM" + }, + "isSC": {} + }, + "0x875154c31b8858fdda9c7ccbed7ec15dc95943ae": { + "name": "CHOP token contract", + "address": "0x875154c31b8858fdda9c7ccbed7ec15dc95943ae", + "token": { + "decimals": 8, + "symbol": "CHOP" + }, + "isSC": {} + }, + "0xecc0f1f860a82ab3b442382d93853c02d6384389": { + "name": "AXIS token contract", + "address": "0xecc0f1f860a82ab3b442382d93853c02d6384389", + "token": { + "decimals": 18, + "symbol": "AXIS" + }, + "isSC": {} + }, + "0x71dc40668682a124231301414167e4cf7f55383c": { + "name": "MIMIR token contract", + "address": "0x71dc40668682a124231301414167e4cf7f55383c", + "token": { + "decimals": 18, + "symbol": "MIMIR" + }, + "isSC": {} + }, + "0xae54e48c2263e889399ad29bfff401feaf08fd57": { + "name": "DEI token contract", + "address": "0xae54e48c2263e889399ad29bfff401feaf08fd57", + "token": { + "decimals": 18, + "symbol": "DEI" + }, + "isSC": {} + }, + "0xe8663a64a96169ff4d95b4299e7ae9a76b905b31": { + "name": "RATING token contract", + "address": "0xe8663a64a96169ff4d95b4299e7ae9a76b905b31", + "token": { + "decimals": 8, + "symbol": "RATING" + }, + "isSC": {} + }, + "0x03f813f7d066c55e3512985186df3b4e6a08e0d6": { + "name": "SINU token contract", + "address": "0x03f813f7d066c55e3512985186df3b4e6a08e0d6", + "token": { + "decimals": 9, + "symbol": "SINU" + }, + "isSC": {} + }, + "0x11ebe21e9d7bf541a18e1e3ac94939018ce88f0b": { + "name": "PITCHFXS token contract", + "address": "0x11ebe21e9d7bf541a18e1e3ac94939018ce88f0b", + "token": { + "decimals": 18, + "symbol": "PITCHFXS" + }, + "isSC": {} + }, + "0x6c2adc2073994fb2ccc5032cc2906fa221e9b391": { + "name": "DPY token contract", + "address": "0x6c2adc2073994fb2ccc5032cc2906fa221e9b391", + "token": { + "decimals": 18, + "symbol": "DPY" + }, + "isSC": {} + }, + "0xb70eaf5d316192881aac8786c90b7907b83f02e8": { + "name": "RESET token contract", + "address": "0xb70eaf5d316192881aac8786c90b7907b83f02e8", + "token": { + "decimals": 18, + "symbol": "RESET" + }, + "isSC": {} + }, + "0x5e8c8a7243651db1384c0ddfdbe39761e8e7e51a": { + "name": "ALINK token contract", + "address": "0x5e8c8a7243651db1384c0ddfdbe39761e8e7e51a", + "token": { + "decimals": 18, + "symbol": "ALINK" + }, + "isSC": {} + }, + "0x41b25ff6431074959532db7435dadaca65a21d1c": { + "name": "CLAW token contract", + "address": "0x41b25ff6431074959532db7435dadaca65a21d1c", + "token": { + "decimals": 18, + "symbol": "CLAW" + }, + "isSC": {} + }, + "0x38b7bf4eecf3eb530b1529c9401fc37d2a71a912": { + "name": "CSMATIC token contract", + "address": "0x38b7bf4eecf3eb530b1529c9401fc37d2a71a912", + "token": { + "decimals": 18, + "symbol": "CSMATIC" + }, + "isSC": {} + }, + "0xdc7da87115d4464e8aac99920a533d401bf72a50": { + "name": "ICE token contract", + "address": "0xdc7da87115d4464e8aac99920a533d401bf72a50", + "token": { + "decimals": 18, + "symbol": "ICE" + }, + "isSC": {} + }, + "0x20e7125677311fca903a8897042b9983f22ea295": { + "name": "FWT token contract", + "address": "0x20e7125677311fca903a8897042b9983f22ea295", + "token": { + "decimals": 18, + "symbol": "FWT" + }, + "isSC": {} + }, + "0x4dbc96275a78de1bf92facb2c165c55de62adab1": { + "name": "ORBOT token contract", + "address": "0x4dbc96275a78de1bf92facb2c165c55de62adab1", + "token": { + "decimals": 18, + "symbol": "ORBOT" + }, + "isSC": {} + }, + "0x34df29dd880e9fe2cec0f85f7658b75606fb2870": { + "name": "NAVYSEAL token contract", + "address": "0x34df29dd880e9fe2cec0f85f7658b75606fb2870", + "token": { + "decimals": 9, + "symbol": "NAVYSEAL" + }, + "isSC": {} + }, + "0x3c72fca8523686fd9e5740b0826fa4bb376e0241": { + "name": "FIT token contract", + "address": "0x3c72fca8523686fd9e5740b0826fa4bb376e0241", + "token": { + "decimals": 18, + "symbol": "FIT" + }, + "isSC": {} + }, + "0x390e61f798267fe7aa9bbe61be8bb1776250d44c": { + "name": "T2T2 token contract", + "address": "0x390e61f798267fe7aa9bbe61be8bb1776250d44c", + "token": { + "decimals": 18, + "symbol": "T2T2" + }, + "isSC": {} + }, + "0x01e87d74b11f656a673a3e7c441425816213eb0c": { + "name": "HOTDOG token contract", + "address": "0x01e87d74b11f656a673a3e7c441425816213eb0c", + "token": { + "decimals": 18, + "symbol": "HOTDOG" + }, + "isSC": {} + }, + "0x6e0615a03ed9527a6013fcd5b556e36ef4dab1ff": { + "name": "HNB token contract", + "address": "0x6e0615a03ed9527a6013fcd5b556e36ef4dab1ff", + "token": { + "decimals": 18, + "symbol": "HNB" + }, + "isSC": {} + }, + "0xbddf903f43dc7d9801f3f0034ba306169074ef8e": { + "name": "AGB token contract", + "address": "0xbddf903f43dc7d9801f3f0034ba306169074ef8e", + "token": { + "decimals": 18, + "symbol": "AGB" + }, + "isSC": {} + }, + "0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656": { + "name": "Aave WBTC", + "address": "0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656", + "token": { + "decimals": 8, + "symbol": "aWBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aWBTC.svg" + }, + "0xc0ec8caec55f37d47fbfa595727418868a21fd48": { + "name": "EGC token contract", + "address": "0xc0ec8caec55f37d47fbfa595727418868a21fd48", + "token": { + "decimals": 8, + "symbol": "EGC" + }, + "isSC": {} + }, + "0x3a82d3111ab5faf39d847d46023d9090261a658f": { + "name": "TYC token contract", + "address": "0x3a82d3111ab5faf39d847d46023d9090261a658f", + "token": { + "decimals": 18, + "symbol": "TYC" + }, + "isSC": {} + }, + "0xa9fbcc25435ad713a9468d8c89dd7baae8914e3a": { + "name": "PROPHET token contract", + "address": "0xa9fbcc25435ad713a9468d8c89dd7baae8914e3a", + "token": { + "decimals": 18, + "symbol": "PROPHET" + }, + "isSC": {} + }, + "0x0107c4aaa31940ef88760acb1f32424ca8d8bd80": { + "name": "AUTH token contract", + "address": "0x0107c4aaa31940ef88760acb1f32424ca8d8bd80", + "token": { + "decimals": 8, + "symbol": "AUTH" + }, + "isSC": {} + }, + "0xe362a9415d8c332a78ba6734620f1afc19099bbc": { + "name": "SEND token contract", + "address": "0xe362a9415d8c332a78ba6734620f1afc19099bbc", + "token": { + "decimals": 18, + "symbol": "SEND" + }, + "isSC": {} + }, + "0xbd7e92cf6f857be8541fca6abfb72aef8e16c307": { + "name": "PRO token contract", + "address": "0xbd7e92cf6f857be8541fca6abfb72aef8e16c307", + "token": { + "decimals": 18, + "symbol": "PRO" + }, + "isSC": {} + }, + "0x03475e14de25908ed484eb99ad38d68cb6399807": { + "name": "BLUE token contract", + "address": "0x03475e14de25908ed484eb99ad38d68cb6399807", + "token": { + "decimals": 9, + "symbol": "BLUE" + }, + "isSC": {} + }, + "0xcb50350ab555ed5d56265e096288536e8cac41eb": { + "name": "COCO token contract", + "address": "0xcb50350ab555ed5d56265e096288536e8cac41eb", + "token": { + "decimals": 18, + "symbol": "COCO" + }, + "isSC": {} + }, + "0xe9fa21e671bcfb04e6868784b89c19d5aa2424ea": { + "name": "ECTE token contract", + "address": "0xe9fa21e671bcfb04e6868784b89c19d5aa2424ea", + "token": { + "decimals": 18, + "symbol": "ECTE" + }, + "isSC": {} + }, + "0xb37ea37de1075b7d2f6b64e768917b174639a59c": { + "name": "AGGRX token contract", + "address": "0xb37ea37de1075b7d2f6b64e768917b174639a59c", + "token": { + "decimals": 9, + "symbol": "AGGRX" + }, + "isSC": {} + }, + "0xa361718326c15715591c299427c62086f69923d9": { + "name": "Aave BUSD", + "address": "0xa361718326c15715591c299427c62086f69923d9", + "token": { + "decimals": 18, + "symbol": "aBUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aBUSD.svg" + }, + "0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a": { + "name": "BAC token contract", + "address": "0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a", + "token": { + "decimals": 18, + "symbol": "BAC" + }, + "isSC": {} + }, + "0xacf8d5e515ed005655dfefa09c22673a37a7cdee": { + "name": "FNF token contract", + "address": "0xacf8d5e515ed005655dfefa09c22673a37a7cdee", + "token": { + "decimals": 18, + "symbol": "FNF" + }, + "isSC": {} + }, + "0xbe00734799a67a62af2819825580318ac1b1e4ec": { + "name": "ORD token contract", + "address": "0xbe00734799a67a62af2819825580318ac1b1e4ec", + "token": { + "decimals": 18, + "symbol": "ORD" + }, + "isSC": {} + }, + "0xf1102d6d2a531124fa043d18a06c394a81aaa866": { + "name": "SHIBC token contract", + "address": "0xf1102d6d2a531124fa043d18a06c394a81aaa866", + "token": { + "decimals": 18, + "symbol": "SHIBC" + }, + "isSC": {} + }, + "0x60c24407d01782c2175d32fe7c8921ed732371d1": { + "name": "LEMO token contract", + "address": "0x60c24407d01782c2175d32fe7c8921ed732371d1", + "token": { + "decimals": 18, + "symbol": "LEMO" + }, + "isSC": {} + }, + "0x5713c26280647adad2f25bb54376943ecaa9d8e3": { + "name": "XMAS token contract", + "address": "0x5713c26280647adad2f25bb54376943ecaa9d8e3", + "token": { + "decimals": 9, + "symbol": "XMAS" + }, + "isSC": {} + }, + "0xefd113cea2f656fe7899a25a06243a6e40406e08": { + "name": "THE9 token contract", + "address": "0xefd113cea2f656fe7899a25a06243a6e40406e08", + "token": { + "decimals": 18, + "symbol": "THE9" + }, + "isSC": {} + }, + "0xe77f82f288a6a7eb4ac295a86fccb1f6d240499b": { + "name": "PLANB token contract", + "address": "0xe77f82f288a6a7eb4ac295a86fccb1f6d240499b", + "token": { + "decimals": 18, + "symbol": "PLANB" + }, + "isSC": {} + }, + "0x9e10f61749c4952c320412a6b26901605ff6da1d": { + "name": "THEOS token contract", + "address": "0x9e10f61749c4952c320412a6b26901605ff6da1d", + "token": { + "decimals": 18, + "symbol": "THEOS" + }, + "isSC": {} + }, + "0x83249c6794bca5a77eb8c0af9f1a86e055459cea": { + "name": "GIGA token contract", + "address": "0x83249c6794bca5a77eb8c0af9f1a86e055459cea", + "token": { + "decimals": 9, + "symbol": "GIGA" + }, + "isSC": {} + }, + "0x0ba74fb26ca523f2dc22fa4318581cc2452eaba1": { + "name": "BOG token contract", + "address": "0x0ba74fb26ca523f2dc22fa4318581cc2452eaba1", + "token": { + "decimals": 18, + "symbol": "BOG" + }, + "isSC": {} + }, + "0x66186008c1050627f979d464eabb258860563dbe": { + "name": "MDS token contract", + "address": "0x66186008c1050627f979d464eabb258860563dbe", + "token": { + "decimals": 18, + "symbol": "MDS" + }, + "isSC": {} + }, + "0x62a8c2818bd7034dc24cd22368c3e53e8eb47c18": { + "name": "INNIT token contract", + "address": "0x62a8c2818bd7034dc24cd22368c3e53e8eb47c18", + "token": { + "decimals": 18, + "symbol": "INNIT" + }, + "isSC": {} + }, + "0x26a37f5a0200ad622f6db7cd687c78b7049ee841": { + "name": "WTS token contract", + "address": "0x26a37f5a0200ad622f6db7cd687c78b7049ee841", + "token": { + "decimals": 18, + "symbol": "WTS" + }, + "isSC": {} + }, + "0x628ab8b061fea2af1239b68efa5e46135d186666": { + "name": "SILV token contract", + "address": "0x628ab8b061fea2af1239b68efa5e46135d186666", + "token": { + "decimals": 8, + "symbol": "SILV" + }, + "isSC": {} + }, + "0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4": { + "name": "Compound Collateral", + "address": "0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4", + "token": { + "decimals": 8, + "symbol": "cCOMP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-comp.svg" + }, + "0x72fc1c1c926bd26712f62e7485392cd405478f05": { + "name": "BARK token contract", + "address": "0x72fc1c1c926bd26712f62e7485392cd405478f05", + "token": { + "decimals": 9, + "symbol": "BARK" + }, + "isSC": {} + }, + "0x4bc3263eb5bb2ef7ad9ab6fb68be80e43b43801f": { + "name": "VETH token contract", + "address": "0x4bc3263eb5bb2ef7ad9ab6fb68be80e43b43801f", + "token": { + "decimals": 18, + "symbol": "VETH" + }, + "isSC": {} + }, + "0xa774ffb4af6b0a91331c084e1aebae6ad535e6f3": { + "name": "FLEXUSD token contract", + "address": "0xa774ffb4af6b0a91331c084e1aebae6ad535e6f3", + "token": { + "decimals": 18, + "symbol": "FLEXUSD" + }, + "isSC": {} + }, + "0x85516e8862ab543ea15972b7809256efec0696ea": { + "name": "ROCK token contract", + "address": "0x85516e8862ab543ea15972b7809256efec0696ea", + "token": { + "decimals": 18, + "symbol": "ROCK" + }, + "isSC": {} + }, + "0xba6b0dbb2ba8daa8f5d6817946393aef8d3a4487": { + "name": "HSF token contract", + "address": "0xba6b0dbb2ba8daa8f5d6817946393aef8d3a4487", + "token": { + "decimals": 18, + "symbol": "HSF" + }, + "isSC": {} + }, + "0x177ba0cac51bfc7ea24bad39d81dcefd59d74faa": { + "name": "KIF token contract", + "address": "0x177ba0cac51bfc7ea24bad39d81dcefd59d74faa", + "token": { + "decimals": 18, + "symbol": "KIF" + }, + "isSC": {} + }, + "0x8dfc8cc3201425669fae803e1eb125cddd4189ec": { + "name": "OKAGE token contract", + "address": "0x8dfc8cc3201425669fae803e1eb125cddd4189ec", + "token": { + "decimals": 18, + "symbol": "OKAGE" + }, + "isSC": {} + }, + "0x79650799e7899a802cb96c0bc33a6a8d4ce4936c": { + "name": "AIT token contract", + "address": "0x79650799e7899a802cb96c0bc33a6a8d4ce4936c", + "token": { + "decimals": 18, + "symbol": "AIT" + }, + "isSC": {} + }, + "0x562e12e1e792643d168c1fa01c1b7198a0f83c9f": { + "name": "BB token contract", + "address": "0x562e12e1e792643d168c1fa01c1b7198a0f83c9f", + "token": { + "decimals": 18, + "symbol": "BB" + }, + "isSC": {} + }, + "0xd433138d12beb9929ff6fd583dc83663eea6aaa5": { + "name": "BTR token contract", + "address": "0xd433138d12beb9929ff6fd583dc83663eea6aaa5", + "token": { + "decimals": 18, + "symbol": "BTR" + }, + "isSC": {} + }, + "0xf6f31b8afbf8e3f7fc8246bef26093f02838da98": { + "name": "UNIVERSE token contract", + "address": "0xf6f31b8afbf8e3f7fc8246bef26093f02838da98", + "token": { + "decimals": 18, + "symbol": "UNIVERSE" + }, + "isSC": {} + }, + "0x852e5427c86a3b46dd25e5fe027bb15f53c4bcb8": { + "name": "NIIFI token contract", + "address": "0x852e5427c86a3b46dd25e5fe027bb15f53c4bcb8", + "token": { + "decimals": 15, + "symbol": "NIIFI" + }, + "isSC": {} + }, + "0x0e13914f4fe838e96346ce42f588193eb17d92b6": { + "name": "LEMON token contract", + "address": "0x0e13914f4fe838e96346ce42f588193eb17d92b6", + "token": { + "decimals": 18, + "symbol": "LEMON" + }, + "isSC": {} + }, + "0x8bc2bcb1b1896291942c36f3cca3c1afa0aaa7fd": { + "name": "PACE token contract", + "address": "0x8bc2bcb1b1896291942c36f3cca3c1afa0aaa7fd", + "token": { + "decimals": 18, + "symbol": "PACE" + }, + "isSC": {} + }, + "0xc713e5e149d5d0715dcd1c156a020976e7e56b88": { + "name": "Aave MKR", + "address": "0xc713e5e149d5d0715dcd1c156a020976e7e56b88", + "token": { + "decimals": 18, + "symbol": "aMKR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aMKR.svg" + }, + "0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2": { + "name": "SWISE token contract", + "address": "0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2", + "token": { + "decimals": 18, + "symbol": "SWISE" + }, + "isSC": {} + }, + "0x996ca7e71c37d70132889e29d17d2e44427a03dc": { + "name": "PB token contract", + "address": "0x996ca7e71c37d70132889e29d17d2e44427a03dc", + "token": { + "decimals": 18, + "symbol": "PB" + }, + "isSC": {} + }, + "0x77d0cb0ab54f9e74b9405a5b3f60da06a78f1aad": { + "name": "WMLX token contract", + "address": "0x77d0cb0ab54f9e74b9405a5b3f60da06a78f1aad", + "token": { + "decimals": 0, + "symbol": "WMLX" + }, + "isSC": {} + }, + "0xc64500dd7b0f1794807e67802f8abbf5f8ffb054": { + "name": "LOCUS token contract", + "address": "0xc64500dd7b0f1794807e67802f8abbf5f8ffb054", + "token": { + "decimals": 18, + "symbol": "LOCUS" + }, + "isSC": {} + }, + "0x1410434b0346f5be678d0fb554e5c7ab620f8f4a": { + "name": "KAN token contract", + "address": "0x1410434b0346f5be678d0fb554e5c7ab620f8f4a", + "token": { + "decimals": 18, + "symbol": "KAN" + }, + "isSC": {} + }, + "0x671a912c10bba0cfa74cfc2d6fba9ba1ed9530b2": { + "name": "YVLINK token contract", + "address": "0x671a912c10bba0cfa74cfc2d6fba9ba1ed9530b2", + "token": { + "decimals": 18, + "symbol": "YVLINK" + }, + "isSC": {} + }, + "0x755be920943ea95e39ee2dc437b268917b580d6e": { + "name": "VVT token contract", + "address": "0x755be920943ea95e39ee2dc437b268917b580d6e", + "token": { + "decimals": 18, + "symbol": "VVT" + }, + "isSC": {} + }, + "0xaa19961b6b858d9f18a115f25aa1d98abc1fdba8": { + "name": "LCS token contract", + "address": "0xaa19961b6b858d9f18a115f25aa1d98abc1fdba8", + "token": { + "decimals": 18, + "symbol": "LCS" + }, + "isSC": {} + }, + "0x8640353cdc9778deab0df45d12fb3013deac079c": { + "name": "LIFE token contract", + "address": "0x8640353cdc9778deab0df45d12fb3013deac079c", + "token": { + "decimals": 18, + "symbol": "LIFE" + }, + "isSC": {} + }, + "0x4bb3205bf648b7f59ef90dee0f1b62f6116bc7ca": { + "name": "BYN token contract", + "address": "0x4bb3205bf648b7f59ef90dee0f1b62f6116bc7ca", + "token": { + "decimals": 18, + "symbol": "BYN" + }, + "isSC": {} + }, + "0x3a4cab3dcfab144fe7eb2b5a3e288cc03dc07659": { + "name": "FTG token contract", + "address": "0x3a4cab3dcfab144fe7eb2b5a3e288cc03dc07659", + "token": { + "decimals": 18, + "symbol": "FTG" + }, + "isSC": {} + }, + "0xcd74cf66c43e45abd5703f3642f73d0675d6aff7": { + "name": "EWC token contract", + "address": "0xcd74cf66c43e45abd5703f3642f73d0675d6aff7", + "token": { + "decimals": 18, + "symbol": "EWC" + }, + "isSC": {} + }, + "0x6a7ef4998eb9d0f706238756949f311a59e05745": { + "name": "KEN token contract", + "address": "0x6a7ef4998eb9d0f706238756949f311a59e05745", + "token": { + "decimals": 18, + "symbol": "KEN" + }, + "isSC": {} + }, + "0x86b4dbe5d203e634a12364c0e428fa242a3fba98": { + "name": "GBPT token contract", + "address": "0x86b4dbe5d203e634a12364c0e428fa242a3fba98", + "token": { + "decimals": 18, + "symbol": "GBPT" + }, + "isSC": {} + }, + "0x508df5aa4746be37b5b6a69684dfd8bdc322219d": { + "name": "CRF token contract", + "address": "0x508df5aa4746be37b5b6a69684dfd8bdc322219d", + "token": { + "decimals": 18, + "symbol": "CRF" + }, + "isSC": {} + }, + "0xea7cc765ebc94c4805e3bff28d7e4ae48d06468a": { + "name": "NearPad Token", + "address": "0xea7cc765ebc94c4805e3bff28d7e4ae48d06468a", + "token": { + "decimals": 18, + "symbol": "PAD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nearpad.svg" + }, + "0x6bc08509b36a98e829dffad49fde5e412645d0a3": { + "name": "WOOF token contract", + "address": "0x6bc08509b36a98e829dffad49fde5e412645d0a3", + "token": { + "decimals": 18, + "symbol": "WOOF" + }, + "isSC": {} + }, + "0x28cca76f6e8ec81e4550ecd761f899110b060e97": { + "name": "ARGO token contract", + "address": "0x28cca76f6e8ec81e4550ecd761f899110b060e97", + "token": { + "decimals": 18, + "symbol": "ARGO" + }, + "isSC": {} + }, + "0x04c618cdbc1d59142dfeb4b9864835a06983ec2d": { + "name": "JSM token contract", + "address": "0x04c618cdbc1d59142dfeb4b9864835a06983ec2d", + "token": { + "decimals": 18, + "symbol": "JSM" + }, + "isSC": {} + }, + "0xdbecdd726f6ad8e24afc78fe3cc8eb7b73c2d94d": { + "name": "CTLS token contract", + "address": "0xdbecdd726f6ad8e24afc78fe3cc8eb7b73c2d94d", + "token": { + "decimals": 18, + "symbol": "CTLS" + }, + "isSC": {} + }, + "0xb24cd494fae4c180a89975f1328eab2a7d5d8f11": { + "name": "CODE token contract", + "address": "0xb24cd494fae4c180a89975f1328eab2a7d5d8f11", + "token": { + "decimals": 18, + "symbol": "CODE" + }, + "isSC": {} + }, + "0xc690f7c7fcffa6a82b79fab7508c466fefdfc8c5": { + "name": "LYM token contract", + "address": "0xc690f7c7fcffa6a82b79fab7508c466fefdfc8c5", + "token": { + "decimals": 18, + "symbol": "LYM" + }, + "isSC": {} + }, + "0x4521c9ad6a3d4230803ab752ed238be11f8b342f": { + "name": "SANI token contract", + "address": "0x4521c9ad6a3d4230803ab752ed238be11f8b342f", + "token": { + "decimals": 18, + "symbol": "SANI" + }, + "isSC": {} + }, + "0x6a1d3d36e1be3da88a2268ebeb1a055758bdd9a9": { + "name": "RFKC token contract", + "address": "0x6a1d3d36e1be3da88a2268ebeb1a055758bdd9a9", + "token": { + "decimals": 18, + "symbol": "RFKC" + }, + "isSC": {} + }, + "0x0944d5848bd9f60a34ba92aea300d4286696eb76": { + "name": "PLT token contract", + "address": "0x0944d5848bd9f60a34ba92aea300d4286696eb76", + "token": { + "decimals": 18, + "symbol": "PLT" + }, + "isSC": {} + }, + "0x45080a6531d671ddff20db42f93792a489685e32": { + "name": "FVT token contract", + "address": "0x45080a6531d671ddff20db42f93792a489685e32", + "token": { + "decimals": 18, + "symbol": "FVT" + }, + "isSC": {} + }, + "0x2791bfd60d232150bff86b39b7146c0eaaa2ba81": { + "name": "BIFI token contract", + "address": "0x2791bfd60d232150bff86b39b7146c0eaaa2ba81", + "token": { + "decimals": 18, + "symbol": "BIFI" + }, + "isSC": {} + }, + "0x107c4504cd79c5d2696ea0030a8dd4e92601b82e": { + "name": "BLT token contract", + "address": "0x107c4504cd79c5d2696ea0030a8dd4e92601b82e", + "token": { + "decimals": 18, + "symbol": "BLT" + }, + "isSC": {} + }, + "0xd08623fb2a1f044025eec65886011cf5d0f06b01": { + "name": "LARRY token contract", + "address": "0xd08623fb2a1f044025eec65886011cf5d0f06b01", + "token": { + "decimals": 18, + "symbol": "LARRY" + }, + "isSC": {} + }, + "0x1123d17fcf93ed2b41440317503346a0fdfe3ed7": { + "name": "PMPY token contract", + "address": "0x1123d17fcf93ed2b41440317503346a0fdfe3ed7", + "token": { + "decimals": 18, + "symbol": "PMPY" + }, + "isSC": {} + }, + "0xf52cdcd458bf455aed77751743180ec4a595fd3f": { + "name": "IDLESUSDYIELD token contract", + "address": "0xf52cdcd458bf455aed77751743180ec4a595fd3f", + "token": { + "decimals": 18, + "symbol": "IDLESUSDYIELD" + }, + "isSC": {} + }, + "0x01597e397605bf280674bf292623460b4204c375": { + "name": "BENT token contract", + "address": "0x01597e397605bf280674bf292623460b4204c375", + "token": { + "decimals": 18, + "symbol": "BENT" + }, + "isSC": {} + }, + "0x9ae3e392cc18acc008024bc23c0c3130a10d64d9": { + "name": "EMZ token contract", + "address": "0x9ae3e392cc18acc008024bc23c0c3130a10d64d9", + "token": { + "decimals": 18, + "symbol": "EMZ" + }, + "isSC": {} + }, + "0xfd6c31bb6f05fc8db64f4b740ab758605c271fd8": { + "name": "CTCN token contract", + "address": "0xfd6c31bb6f05fc8db64f4b740ab758605c271fd8", + "token": { + "decimals": 18, + "symbol": "CTCN" + }, + "isSC": {} + }, + "0x718dab2c7bbd2d9503dc1ce1dbc215abc41a3545": { + "name": "XAIGROK token contract", + "address": "0x718dab2c7bbd2d9503dc1ce1dbc215abc41a3545", + "token": { + "decimals": 8, + "symbol": "XAIGROK" + }, + "isSC": {} + }, + "0xfdf7af616091a05b9cd3b5aedd3e88d4e8cd882e": { + "name": "NOTICKER token contract", + "address": "0xfdf7af616091a05b9cd3b5aedd3e88d4e8cd882e", + "token": { + "decimals": 8, + "symbol": "NOTICKER" + }, + "isSC": {} + }, + "0x7b9432881fff2a9527cfc2efb4d33fc0d7f8e861": { + "name": "CONTRAX token contract", + "address": "0x7b9432881fff2a9527cfc2efb4d33fc0d7f8e861", + "token": { + "decimals": 8, + "symbol": "CONTRAX" + }, + "isSC": {} + }, + "0xd8e2d95c8614f28169757cd6445a71c291dec5bf": { + "name": "GRUMPYCAT token contract", + "address": "0xd8e2d95c8614f28169757cd6445a71c291dec5bf", + "token": { + "decimals": 18, + "symbol": "GRUMPYCAT" + }, + "isSC": {} + }, + "0xd6caf5bd23cf057f5fccce295dcc50c01c198707": { + "name": "EVA token contract", + "address": "0xd6caf5bd23cf057f5fccce295dcc50c01c198707", + "token": { + "decimals": 18, + "symbol": "EVA" + }, + "isSC": {} + }, + "0x329cf160f30d21006bcd24b67eade561e54cde4c": { + "name": "CARE token contract", + "address": "0x329cf160f30d21006bcd24b67eade561e54cde4c", + "token": { + "decimals": 18, + "symbol": "CARE" + }, + "isSC": {} + }, + "0xc6956b78e036b87ba2ab9810bf081eb76eedd17a": { + "name": "H token contract", + "address": "0xc6956b78e036b87ba2ab9810bf081eb76eedd17a", + "token": { + "decimals": 18, + "symbol": "H" + }, + "isSC": {} + }, + "0xff8c479134a18918059493243943150776cf8cf2": { + "name": "RENQ token contract", + "address": "0xff8c479134a18918059493243943150776cf8cf2", + "token": { + "decimals": 18, + "symbol": "RENQ" + }, + "isSC": {} + }, + "0x0a7b89e66a1dc16633abdfd132bae05827d3bfa5": { + "name": "HIMOONBIRDS token contract", + "address": "0x0a7b89e66a1dc16633abdfd132bae05827d3bfa5", + "token": { + "decimals": 18, + "symbol": "HIMOONBIRDS" + }, + "isSC": {} + }, + "0xd836d22531d810f192ba6bd0ba3c28c35d4606c2": { + "name": "BONKBEST token contract", + "address": "0xd836d22531d810f192ba6bd0ba3c28c35d4606c2", + "token": { + "decimals": 9, + "symbol": "BONKBEST" + }, + "isSC": {} + }, + "0x106538cc16f938776c7c180186975bca23875287": { + "name": "BAS token contract", + "address": "0x106538cc16f938776c7c180186975bca23875287", + "token": { + "decimals": 18, + "symbol": "BAS" + }, + "isSC": {} + }, + "0x6230f552a1c825d02e1140ccc0d3f5eeec81ca84": { + "name": "FUSION token contract", + "address": "0x6230f552a1c825d02e1140ccc0d3f5eeec81ca84", + "token": { + "decimals": 9, + "symbol": "FUSION" + }, + "isSC": {} + }, + "0x5395df198fcbc9c13bec506004c9a8b6460a7712": { + "name": "BUBU token contract", + "address": "0x5395df198fcbc9c13bec506004c9a8b6460a7712", + "token": { + "decimals": 18, + "symbol": "BUBU" + }, + "isSC": {} + }, + "0xf203ca1769ca8e9e8fe1da9d147db68b6c919817": { + "name": "WNCG token contract", + "address": "0xf203ca1769ca8e9e8fe1da9d147db68b6c919817", + "token": { + "decimals": 18, + "symbol": "WNCG" + }, + "isSC": {} + }, + "0x6ef6610d24593805144d73b13d4405e00a4e4ac7": { + "name": "DIE token contract", + "address": "0x6ef6610d24593805144d73b13d4405e00a4e4ac7", + "token": { + "decimals": 18, + "symbol": "DIE" + }, + "isSC": {} + }, + "0x0d3bd40758df4f79aad316707fcb809cd4815ffe": { + "name": "21XRP token contract", + "address": "0x0d3bd40758df4f79aad316707fcb809cd4815ffe", + "token": { + "decimals": 6, + "symbol": "21XRP" + }, + "isSC": {} + }, + "0xa58a4f5c4bb043d2cc1e170613b74e767c94189b": { + "name": "UTU token contract", + "address": "0xa58a4f5c4bb043d2cc1e170613b74e767c94189b", + "token": { + "decimals": 18, + "symbol": "UTU" + }, + "isSC": {} + }, + "0xe46a1d19962ea120765d3139c588ffd617be04a8": { + "name": "EETH token contract", + "address": "0xe46a1d19962ea120765d3139c588ffd617be04a8", + "token": { + "decimals": 18, + "symbol": "EETH" + }, + "isSC": {} + }, + "0x4fee21439f2b95b72da2f9f901b3956f27fe91d5": { + "name": "FROG token contract", + "address": "0x4fee21439f2b95b72da2f9f901b3956f27fe91d5", + "token": { + "decimals": 18, + "symbol": "FROG" + }, + "isSC": {} + }, + "0x5eca7b975e34567d9460fa613013a7a6993ad185": { + "name": "BS token contract", + "address": "0x5eca7b975e34567d9460fa613013a7a6993ad185", + "token": { + "decimals": 18, + "symbol": "BS" + }, + "isSC": {} + }, + "0x2f9411088cef82fd9fb904eb8092f28eb485c8f6": { + "name": "ATH token contract", + "address": "0x2f9411088cef82fd9fb904eb8092f28eb485c8f6", + "token": { + "decimals": 18, + "symbol": "ATH" + }, + "isSC": {} + }, + "0x21f15966e07a10554c364b988e91dab01d32794a": { + "name": "SMT token contract", + "address": "0x21f15966e07a10554c364b988e91dab01d32794a", + "token": { + "decimals": 18, + "symbol": "SMT" + }, + "isSC": {} + }, + "0x2781246fe707bb15cee3e5ea354e2154a2877b16": { + "name": "Elysia", + "address": "0x2781246fe707bb15cee3e5ea354e2154a2877b16", + "token": { + "decimals": 18, + "symbol": "EL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/el.svg" + }, + "0xe87e15b9c7d989474cb6d8c56b3db4efad5b21e8": { + "name": "HOKK token contract", + "address": "0xe87e15b9c7d989474cb6d8c56b3db4efad5b21e8", + "token": { + "decimals": 18, + "symbol": "HOKK" + }, + "isSC": {} + }, + "0x32d5b155e82c87c491ea14b59477ddd0957e242c": { + "name": "XFER token contract", + "address": "0x32d5b155e82c87c491ea14b59477ddd0957e242c", + "token": { + "decimals": 18, + "symbol": "XFER" + }, + "isSC": {} + }, + "0xeabb8996ea1662cad2f7fb715127852cd3262ae9": { + "name": "CNFI token contract", + "address": "0xeabb8996ea1662cad2f7fb715127852cd3262ae9", + "token": { + "decimals": 18, + "symbol": "CNFI" + }, + "isSC": {} + }, + "0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74": { + "name": "Walton Token", + "address": "0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74", + "token": { + "decimals": 18, + "symbol": "WTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wtc.svg" + }, + "0x6781a0f84c7e9e846dcb84a9a5bd49333067b104": { + "name": "ZAP TOKEN", + "address": "0x6781a0f84c7e9e846dcb84a9a5bd49333067b104", + "token": { + "decimals": 18, + "symbol": "ZAP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zapicon.svg" + }, + "0x28cb7e841ee97947a86b06fa4090c8451f64c0be": { + "name": "YF Link", + "address": "0x28cb7e841ee97947a86b06fa4090c8451f64c0be", + "token": { + "decimals": 18, + "symbol": "YFL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/YFL.svg" + }, + "0x2b9a49417f9c9c8dd18ef5bb37c20637441ad67a": { + "name": "GREG token contract", + "address": "0x2b9a49417f9c9c8dd18ef5bb37c20637441ad67a", + "token": { + "decimals": 9, + "symbol": "GREG" + }, + "isSC": {} + }, + "0x59276455177429ae2af1cc62b77ae31b34ec3890": { + "name": "STRDY token contract", + "address": "0x59276455177429ae2af1cc62b77ae31b34ec3890", + "token": { + "decimals": 18, + "symbol": "STRDY" + }, + "isSC": {} + }, + "0xf0acf8949e705e0ebb6cb42c2164b0b986454223": { + "name": "BRTR token contract", + "address": "0xf0acf8949e705e0ebb6cb42c2164b0b986454223", + "token": { + "decimals": 8, + "symbol": "BRTR" + }, + "isSC": {} + }, + "0xb5fe099475d3030dde498c3bb6f3854f762a48ad": { + "name": "FNK token contract", + "address": "0xb5fe099475d3030dde498c3bb6f3854f762a48ad", + "token": { + "decimals": 18, + "symbol": "FNK" + }, + "isSC": {} + }, + "0x8c4e7f814d40f8929f9112c5d09016f923d34472": { + "name": "XLAB token contract", + "address": "0x8c4e7f814d40f8929f9112c5d09016f923d34472", + "token": { + "decimals": 18, + "symbol": "XLAB" + }, + "isSC": {} + }, + "0x2365a4890ed8965e564b7e2d27c38ba67fec4c6f": { + "name": "AAMMUNIWBTCUSDC token contract", + "address": "0x2365a4890ed8965e564b7e2d27c38ba67fec4c6f", + "token": { + "decimals": 18, + "symbol": "AAMMUNIWBTCUSDC" + }, + "isSC": {} + }, + "0x922e2708462c7a3d014d8344f7c4d92b27ecf332": { + "name": "NEURONI token contract", + "address": "0x922e2708462c7a3d014d8344f7c4d92b27ecf332", + "token": { + "decimals": 18, + "symbol": "NEURONI" + }, + "isSC": {} + }, + "0x3a707d56d538e85b783e8ce12b346e7fb6511f90": { + "name": "IETHV token contract", + "address": "0x3a707d56d538e85b783e8ce12b346e7fb6511f90", + "token": { + "decimals": 18, + "symbol": "IETHV" + }, + "isSC": {} + }, + "0xa8b61cff52564758a204f841e636265bebc8db9b": { + "name": "YIELD token contract", + "address": "0xa8b61cff52564758a204f841e636265bebc8db9b", + "token": { + "decimals": 18, + "symbol": "YIELD" + }, + "isSC": {} + }, + "0x5516ac1aaca7bb2fd5b7bdde1549ef1ea242953d": { + "name": "DETF token contract", + "address": "0x5516ac1aaca7bb2fd5b7bdde1549ef1ea242953d", + "token": { + "decimals": 18, + "symbol": "DETF" + }, + "isSC": {} + }, + "0xc28e27870558cf22add83540d2126da2e4b464c2": { + "name": "SASHIMI token contract", + "address": "0xc28e27870558cf22add83540d2126da2e4b464c2", + "token": { + "decimals": 18, + "symbol": "SASHIMI" + }, + "isSC": {} + }, + "0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e": { + "name": "HAY token contract", + "address": "0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e", + "token": { + "decimals": 18, + "symbol": "HAY" + }, + "isSC": {} + }, + "0x285db79fa7e0e89e822786f48a7c98c6c1dc1c7d": { + "name": "MIC token contract", + "address": "0x285db79fa7e0e89e822786f48a7c98c6c1dc1c7d", + "token": { + "decimals": 18, + "symbol": "MIC" + }, + "isSC": {} + }, + "0x03806ce5ef69bd9780edfb04c29da1f23db96294": { + "name": "TSL token contract", + "address": "0x03806ce5ef69bd9780edfb04c29da1f23db96294", + "token": { + "decimals": 18, + "symbol": "TSL" + }, + "isSC": {} + }, + "0xed3d4e446a96dc3b181b64b75c3c70da41dc3cbe": { + "name": "Vodra", + "address": "0xed3d4e446a96dc3b181b64b75c3c70da41dc3cbe", + "token": { + "decimals": 18, + "symbol": "VDR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Vodra.svg" + }, + "0x7240ac91f01233baaf8b064248e80feaa5912ba3": { + "name": "OctoFi", + "address": "0x7240ac91f01233baaf8b064248e80feaa5912ba3", + "token": { + "decimals": 18, + "symbol": "OCTO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/octo.svg" + }, + "0xe0c99ed6950ccb38347154abd06e10eba5a1f89a": { + "name": "BLUI token contract", + "address": "0xe0c99ed6950ccb38347154abd06e10eba5a1f89a", + "token": { + "decimals": 18, + "symbol": "BLUI" + }, + "isSC": {} + }, + "0x0d99482bb2c436b7183e7bd474cd65fa8711c8ec": { + "name": "NEPE token contract", + "address": "0x0d99482bb2c436b7183e7bd474cd65fa8711c8ec", + "token": { + "decimals": 18, + "symbol": "NEPE" + }, + "isSC": {} + }, + "0x4295c8556afee00264c0789dde2ddd2dba71acfe": { + "name": "BISC token contract", + "address": "0x4295c8556afee00264c0789dde2ddd2dba71acfe", + "token": { + "decimals": 18, + "symbol": "BISC" + }, + "isSC": {} + }, + "0x0d8ca4b20b115d4da5c13dc45dd582a5de3e78bf": { + "name": "GAI token contract", + "address": "0x0d8ca4b20b115d4da5c13dc45dd582a5de3e78bf", + "token": { + "decimals": 18, + "symbol": "GAI" + }, + "isSC": {} + }, + "0x321c2fe4446c7c963dc41dd58879af648838f98d": { + "name": "Cryptex Finance", + "address": "0x321c2fe4446c7c963dc41dd58879af648838f98d", + "token": { + "decimals": 18, + "symbol": "CTX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctx.svg" + }, + "0xc01b733b2ef479086b80949676a673346b531aa2": { + "name": "LEAGUE token contract", + "address": "0xc01b733b2ef479086b80949676a673346b531aa2", + "token": { + "decimals": 18, + "symbol": "LEAGUE" + }, + "isSC": {} + }, + "0xda4dd9586d27202a338843dd6b9824d267006783": { + "name": "ECT token contract", + "address": "0xda4dd9586d27202a338843dd6b9824d267006783", + "token": { + "decimals": 9, + "symbol": "ECT" + }, + "isSC": {} + }, + "0x613577bfea8ba6571f6b7a86716d04c80a3fbeb4": { + "name": "LNDRY token contract", + "address": "0x613577bfea8ba6571f6b7a86716d04c80a3fbeb4", + "token": { + "decimals": 18, + "symbol": "LNDRY" + }, + "isSC": {} + }, + "0xc5068471fe18eda3b362231d01ae30ba6a91ff0d": { + "name": "CUT token contract", + "address": "0xc5068471fe18eda3b362231d01ae30ba6a91ff0d", + "token": { + "decimals": 18, + "symbol": "CUT" + }, + "isSC": {} + }, + "0x159a1dfae19057de57dfffcbb3da1ae784678965": { + "name": "RFX token contract", + "address": "0x159a1dfae19057de57dfffcbb3da1ae784678965", + "token": { + "decimals": 8, + "symbol": "RFX" + }, + "isSC": {} + }, + "0xf293d23bf2cdc05411ca0eddd588eb1977e8dcd4": { + "name": "Sylo", + "address": "0xf293d23bf2cdc05411ca0eddd588eb1977e8dcd4", + "token": { + "decimals": 18, + "symbol": "SYLO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SYLO.svg" + }, + "0xb6c3dc857845a713d3531cea5ac546f6767992f4": { + "name": "ADCO token contract", + "address": "0xb6c3dc857845a713d3531cea5ac546f6767992f4", + "token": { + "decimals": 6, + "symbol": "ADCO" + }, + "isSC": {} + }, + "0xca9f9671765f8d1a7e19ae2639e01fff730f0d9b": { + "name": "JUSDC token contract", + "address": "0xca9f9671765f8d1a7e19ae2639e01fff730f0d9b", + "token": { + "decimals": 18, + "symbol": "JUSDC" + }, + "isSC": {} + }, + "0xd109b2a304587569c84308c55465cd9ff0317bfb": { + "name": "AAMMBPTBALWETH token contract", + "address": "0xd109b2a304587569c84308c55465cd9ff0317bfb", + "token": { + "decimals": 18, + "symbol": "AAMMBPTBALWETH" + }, + "isSC": {} + }, + "0x64323d606cfcb1b50998636a182334ad97637987": { + "name": "XPERP token contract", + "address": "0x64323d606cfcb1b50998636a182334ad97637987", + "token": { + "decimals": 18, + "symbol": "XPERP" + }, + "isSC": {} + }, + "0xbd9908b0cdd50386f92efcc8e1d71766c2782df0": { + "name": "RICE token contract", + "address": "0xbd9908b0cdd50386f92efcc8e1d71766c2782df0", + "token": { + "decimals": 18, + "symbol": "RICE" + }, + "isSC": {} + }, + "0x91be752d438d5f804345b5acb18de0c431ad470f": { + "name": "ETHETF token contract", + "address": "0x91be752d438d5f804345b5acb18de0c431ad470f", + "token": { + "decimals": 18, + "symbol": "ETHETF" + }, + "isSC": {} + }, + "0xdd16ec0f66e54d453e6756713e533355989040e4": { + "name": "TEN token contract", + "address": "0xdd16ec0f66e54d453e6756713e533355989040e4", + "token": { + "decimals": 18, + "symbol": "TEN" + }, + "isSC": {} + }, + "0x409c4d8cd5d2924b9bc5509230d16a61289c8153": { + "name": "TOS token contract", + "address": "0x409c4d8cd5d2924b9bc5509230d16a61289c8153", + "token": { + "decimals": 18, + "symbol": "TOS" + }, + "isSC": {} + }, + "0x043312456f73d8014d9b84f4337de54995cd2a5b": { + "name": "BONK20 token contract", + "address": "0x043312456f73d8014d9b84f4337de54995cd2a5b", + "token": { + "decimals": 9, + "symbol": "BONK20" + }, + "isSC": {} + }, + "0x65032604dab202aff9adf89300cdb4bd0d059f55": { + "name": "SOBA token contract", + "address": "0x65032604dab202aff9adf89300cdb4bd0d059f55", + "token": { + "decimals": 18, + "symbol": "SOBA" + }, + "isSC": {} + }, + "0x67f4c72a50f8df6487720261e188f2abe83f57d7": { + "name": "WPOKT token contract", + "address": "0x67f4c72a50f8df6487720261e188f2abe83f57d7", + "token": { + "decimals": 6, + "symbol": "WPOKT" + }, + "isSC": {} + }, + "0xd5dc24c9ef8a21e6d7caa603f9502e4a0dc7fe8a": { + "name": "RED token contract", + "address": "0xd5dc24c9ef8a21e6d7caa603f9502e4a0dc7fe8a", + "token": { + "decimals": 9, + "symbol": "RED" + }, + "isSC": {} + }, + "0x2654e753424a9f02df31cfbc6c5af14a87b6cab5": { + "name": "KEN token contract", + "address": "0x2654e753424a9f02df31cfbc6c5af14a87b6cab5", + "token": { + "decimals": 18, + "symbol": "KEN" + }, + "isSC": {} + }, + "0xcc7ab8d78dba187dc95bf3bb86e65e0c26d0041f": { + "name": "Spacelens", + "address": "0xcc7ab8d78dba187dc95bf3bb86e65e0c26d0041f", + "token": { + "decimals": 18, + "symbol": "SPACE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SPACE.svg" + }, + "0xe8ff5c9c75deb346acac493c463c8950be03dfba": { + "name": "VIBE token contract", + "address": "0xe8ff5c9c75deb346acac493c463c8950be03dfba", + "token": { + "decimals": 18, + "symbol": "VIBE" + }, + "isSC": {} + }, + "0x7b18e5d77622ba37173801f77745a0654df825ff": { + "name": "TX token contract", + "address": "0x7b18e5d77622ba37173801f77745a0654df825ff", + "token": { + "decimals": 18, + "symbol": "TX" + }, + "isSC": {} + }, + "0xfd8b9ba4845fb38c779317ec134b298c064937a2": { + "name": "9INCH token contract", + "address": "0xfd8b9ba4845fb38c779317ec134b298c064937a2", + "token": { + "decimals": 18, + "symbol": "9INCH" + }, + "isSC": {} + }, + "0x97c8321b9434db4110b1d75a551e561036ff2e6a": { + "name": "WAGER token contract", + "address": "0x97c8321b9434db4110b1d75a551e561036ff2e6a", + "token": { + "decimals": 18, + "symbol": "WAGER" + }, + "isSC": {} + }, + "0xd52aae39a2b5cc7812f7b9450ebb61dfef702b15": { + "name": "MAGE token contract", + "address": "0xd52aae39a2b5cc7812f7b9450ebb61dfef702b15", + "token": { + "decimals": 18, + "symbol": "MAGE" + }, + "isSC": {} + }, + "0x102203517ce35ac5cab9a2cda80df03f26c7419b": { + "name": "SMTX token contract", + "address": "0x102203517ce35ac5cab9a2cda80df03f26c7419b", + "token": { + "decimals": 18, + "symbol": "SMTX" + }, + "isSC": {} + }, + "0x876a76c80b32e5cfbb27fd840a1a530ef828ebec": { + "name": "ST token contract", + "address": "0x876a76c80b32e5cfbb27fd840a1a530ef828ebec", + "token": { + "decimals": 18, + "symbol": "ST" + }, + "isSC": {} + }, + "0x66861d5f0fbfb7b2711712fef2172c560d08d0ab": { + "name": "FUND token contract", + "address": "0x66861d5f0fbfb7b2711712fef2172c560d08d0ab", + "token": { + "decimals": 18, + "symbol": "FUND" + }, + "isSC": {} + }, + "0x52284158e02425290f6b627aeb5fff65edf058ad": { + "name": "FMB token contract", + "address": "0x52284158e02425290f6b627aeb5fff65edf058ad", + "token": { + "decimals": 18, + "symbol": "FMB" + }, + "isSC": {} + }, + "0x1f8a626883d7724dbd59ef51cbd4bf1cf2016d13": { + "name": "STAK token contract", + "address": "0x1f8a626883d7724dbd59ef51cbd4bf1cf2016d13", + "token": { + "decimals": 18, + "symbol": "STAK" + }, + "isSC": {} + }, + "0x4f27633e8b1cfd5e043c68cdcd81c0bbfdb1cf14": { + "name": "WHAT token contract", + "address": "0x4f27633e8b1cfd5e043c68cdcd81c0bbfdb1cf14", + "token": { + "decimals": 18, + "symbol": "WHAT" + }, + "isSC": {} + }, + "0x887168120cb89fb06f3e74dc4af20d67df0977f6": { + "name": "SKRT token contract", + "address": "0x887168120cb89fb06f3e74dc4af20d67df0977f6", + "token": { + "decimals": 18, + "symbol": "SKRT" + }, + "isSC": {} + }, + "0xe5867608b51a2c9c78b9587355cc093140a49b0a": { + "name": "SMS token contract", + "address": "0xe5867608b51a2c9c78b9587355cc093140a49b0a", + "token": { + "decimals": 3, + "symbol": "SMS" + }, + "isSC": {} + }, + "0x7690202e2c2297bcd03664e31116d1dffe7e3b73": { + "name": "BOXETH token contract", + "address": "0x7690202e2c2297bcd03664e31116d1dffe7e3b73", + "token": { + "decimals": 18, + "symbol": "BOXETH" + }, + "isSC": {} + }, + "0x36737b4ac153c762d6a767056e1af7b17573a6b9": { + "name": "GOLD token contract", + "address": "0x36737b4ac153c762d6a767056e1af7b17573a6b9", + "token": { + "decimals": 9, + "symbol": "GOLD" + }, + "isSC": {} + }, + "0x1c3d163219bb74f430411b95d66b72056f366ec1": { + "name": "ENO token contract", + "address": "0x1c3d163219bb74f430411b95d66b72056f366ec1", + "token": { + "decimals": 18, + "symbol": "ENO" + }, + "isSC": {} + }, + "0x558a64e0652c3a4b7fa1ff9a589425bf42c9179d": { + "name": "HOD token contract", + "address": "0x558a64e0652c3a4b7fa1ff9a589425bf42c9179d", + "token": { + "decimals": 18, + "symbol": "HOD" + }, + "isSC": {} + }, + "0xfe9a29ab92522d14fc65880d817214261d8479ae": { + "name": "SNOW token contract", + "address": "0xfe9a29ab92522d14fc65880d817214261d8479ae", + "token": { + "decimals": 18, + "symbol": "SNOW" + }, + "isSC": {} + }, + "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b": { + "name": "OSQTH token contract", + "address": "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", + "token": { + "decimals": 18, + "symbol": "OSQTH" + }, + "isSC": {} + }, + "0x46d473a0b3eeec9f55fade641bc576d5bc0b2246": { + "name": "SURF token contract", + "address": "0x46d473a0b3eeec9f55fade641bc576d5bc0b2246", + "token": { + "decimals": 18, + "symbol": "SURF" + }, + "isSC": {} + }, + "0x2047ab3072b52561596ce5e0131bdbb7c848538d": { + "name": "BORED token contract", + "address": "0x2047ab3072b52561596ce5e0131bdbb7c848538d", + "token": { + "decimals": 9, + "symbol": "BORED" + }, + "isSC": {} + }, + "0x178bf8fd04b47d2de3ef3f6b3d112106375ad584": { + "name": "UUSDT token contract", + "address": "0x178bf8fd04b47d2de3ef3f6b3d112106375ad584", + "token": { + "decimals": 6, + "symbol": "UUSDT" + }, + "isSC": {} + }, + "0x3d9a4d8ab4f5bd1d5d08ae3a95e8ed8bb4d7e3b9": { + "name": "STONKS token contract", + "address": "0x3d9a4d8ab4f5bd1d5d08ae3a95e8ed8bb4d7e3b9", + "token": { + "decimals": 18, + "symbol": "STONKS" + }, + "isSC": {} + }, + "0x1117ac6ad6cdf1a3bc543bad3b133724620522d5": { + "name": "MODA token contract", + "address": "0x1117ac6ad6cdf1a3bc543bad3b133724620522d5", + "token": { + "decimals": 18, + "symbol": "MODA" + }, + "isSC": {} + }, + "0xd1d92f1c5524d93ced7bf6f418c8bf8abf68ac66": { + "name": "BULL token contract", + "address": "0xd1d92f1c5524d93ced7bf6f418c8bf8abf68ac66", + "token": { + "decimals": 18, + "symbol": "BULL" + }, + "isSC": {} + }, + "0x1aa51bc7eb181ce48ce626bf62f8956fa9555136": { + "name": "PAW token contract", + "address": "0x1aa51bc7eb181ce48ce626bf62f8956fa9555136", + "token": { + "decimals": 18, + "symbol": "PAW" + }, + "isSC": {} + }, + "0x17a79792fe6fe5c95dfe95fe3fcee3caf4fe4cb7": { + "name": "AAMMUSDT token contract", + "address": "0x17a79792fe6fe5c95dfe95fe3fcee3caf4fe4cb7", + "token": { + "decimals": 6, + "symbol": "AAMMUSDT" + }, + "isSC": {} + }, + "0x5bb29c33c4a3c29f56f8aca40b4db91d8a5fe2c5": { + "name": "ONS token contract", + "address": "0x5bb29c33c4a3c29f56f8aca40b4db91d8a5fe2c5", + "token": { + "decimals": 18, + "symbol": "ONS" + }, + "isSC": {} + }, + "0x6ff1bfa14a57594a5874b37ff6ac5efbd9f9599a": { + "name": "TOTM token contract", + "address": "0x6ff1bfa14a57594a5874b37ff6ac5efbd9f9599a", + "token": { + "decimals": 18, + "symbol": "TOTM" + }, + "isSC": {} + }, + "0xaec7d1069e3a914a3eb50f0bfb1796751f2ce48a": { + "name": "S4F token contract", + "address": "0xaec7d1069e3a914a3eb50f0bfb1796751f2ce48a", + "token": { + "decimals": 18, + "symbol": "S4F" + }, + "isSC": {} + }, + "0x2adcbee886d23eff5adecc7767bf102e4a1ce151": { + "name": "VEDA token contract", + "address": "0x2adcbee886d23eff5adecc7767bf102e4a1ce151", + "token": { + "decimals": 0, + "symbol": "VEDA" + }, + "isSC": {} + }, + "0x426aedbed16726e3f220cb4fed4d4060b95cca46": { + "name": "BAHAMAS token contract", + "address": "0x426aedbed16726e3f220cb4fed4d4060b95cca46", + "token": { + "decimals": 18, + "symbol": "BAHAMAS" + }, + "isSC": {} + }, + "0x78d448a1d1fedaa3e916f467568e86081e0f4df5": { + "name": "MBET token contract", + "address": "0x78d448a1d1fedaa3e916f467568e86081e0f4df5", + "token": { + "decimals": 18, + "symbol": "MBET" + }, + "isSC": {} + }, + "0x59c6766de1dc50a9c9db86cb0461b5ce07408ab7": { + "name": "SPURDO token contract", + "address": "0x59c6766de1dc50a9c9db86cb0461b5ce07408ab7", + "token": { + "decimals": 8, + "symbol": "SPURDO" + }, + "isSC": {} + }, + "0x2f123cf3f37ce3328cc9b5b8415f9ec5109b45e7": { + "name": "BC3M token contract", + "address": "0x2f123cf3f37ce3328cc9b5b8415f9ec5109b45e7", + "token": { + "decimals": 18, + "symbol": "BC3M" + }, + "isSC": {} + }, + "0xeee0fe52299f2de8e2ed5111cd521ab67dcf0faf": { + "name": "QWAN token contract", + "address": "0xeee0fe52299f2de8e2ed5111cd521ab67dcf0faf", + "token": { + "decimals": 18, + "symbol": "QWAN" + }, + "isSC": {} + }, + "0xad996a45fd2373ed0b10efa4a8ecb9de445a4302": { + "name": "SHI token contract", + "address": "0xad996a45fd2373ed0b10efa4a8ecb9de445a4302", + "token": { + "decimals": 18, + "symbol": "SHI" + }, + "isSC": {} + }, + "0x4eea955f63d7e24ea7272651a29c7c70f7c2a9ae": { + "name": "EGP token contract", + "address": "0x4eea955f63d7e24ea7272651a29c7c70f7c2a9ae", + "token": { + "decimals": 18, + "symbol": "EGP" + }, + "isSC": {} + }, + "0xd084944d3c05cd115c09d072b9f44ba3e0e45921": { + "name": "Manifold Finance", + "address": "0xd084944d3c05cd115c09d072b9f44ba3e0e45921", + "token": { + "decimals": 18, + "symbol": "FOLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Manifold.svg" + }, + "0x4daeb4a06f70f4b1a5c329115731fe4b89c0b227": { + "name": "QUA token contract", + "address": "0x4daeb4a06f70f4b1a5c329115731fe4b89c0b227", + "token": { + "decimals": 18, + "symbol": "QUA" + }, + "isSC": {} + }, + "0x9dcd367e2afa8d6e5d6cf0306094e3eb7bbaaf4d": { + "name": "BROS token contract", + "address": "0x9dcd367e2afa8d6e5d6cf0306094e3eb7bbaaf4d", + "token": { + "decimals": 18, + "symbol": "BROS" + }, + "isSC": {} + }, + "0x794baab6b878467f93ef17e2f2851ce04e3e34c8": { + "name": "YIN token contract", + "address": "0x794baab6b878467f93ef17e2f2851ce04e3e34c8", + "token": { + "decimals": 18, + "symbol": "YIN" + }, + "isSC": {} + }, + "0x657b83a0336561c8f64389a6f5ade675c04b0c3b": { + "name": "PCNT token contract", + "address": "0x657b83a0336561c8f64389a6f5ade675c04b0c3b", + "token": { + "decimals": 18, + "symbol": "PCNT" + }, + "isSC": {} + }, + "0x5b685863494c33f344081f75e5430c260c224a32": { + "name": "CMCX token contract", + "address": "0x5b685863494c33f344081f75e5430c260c224a32", + "token": { + "decimals": 18, + "symbol": "CMCX" + }, + "isSC": {} + }, + "0x1ea48b9965bb5086f3b468e50ed93888a661fc17": { + "name": "MON token contract", + "address": "0x1ea48b9965bb5086f3b468e50ed93888a661fc17", + "token": { + "decimals": 18, + "symbol": "MON" + }, + "isSC": {} + }, + "0x0ec9f76202a7061eb9b3a7d6b59d36215a7e37da": { + "name": "BPT token contract", + "address": "0x0ec9f76202a7061eb9b3a7d6b59d36215a7e37da", + "token": { + "decimals": 18, + "symbol": "BPT" + }, + "isSC": {} + }, + "0x58002a6b6e659a16de9f02f529b10536e307b0d9": { + "name": "CHFT token contract", + "address": "0x58002a6b6e659a16de9f02f529b10536e307b0d9", + "token": { + "decimals": 18, + "symbol": "CHFT" + }, + "isSC": {} + }, + "0x5526f0cab9f260023e94cf01e353e70d2f45ed81": { + "name": "COCKS token contract", + "address": "0x5526f0cab9f260023e94cf01e353e70d2f45ed81", + "token": { + "decimals": 9, + "symbol": "COCKS" + }, + "isSC": {} + }, + "0x8f8ed076e61a27db72a5724ea0907a66fb0ddb32": { + "name": "GP token contract", + "address": "0x8f8ed076e61a27db72a5724ea0907a66fb0ddb32", + "token": { + "decimals": 18, + "symbol": "GP" + }, + "isSC": {} + }, + "0x19ac2659599fd01c853de846919544276ad26f50": { + "name": "COVN token contract", + "address": "0x19ac2659599fd01c853de846919544276ad26f50", + "token": { + "decimals": 18, + "symbol": "COVN" + }, + "isSC": {} + }, + "0x8d008cac1a5cb08ac962b1e34e977b79abeee88d": { + "name": "PEPEAI token contract", + "address": "0x8d008cac1a5cb08ac962b1e34e977b79abeee88d", + "token": { + "decimals": 18, + "symbol": "PEPEAI" + }, + "isSC": {} + }, + "0x0ea20e7ffb006d4cfe84df2f72d8c7bd89247db0": { + "name": "AAMMUNICRVWETH token contract", + "address": "0x0ea20e7ffb006d4cfe84df2f72d8c7bd89247db0", + "token": { + "decimals": 18, + "symbol": "AAMMUNICRVWETH" + }, + "isSC": {} + }, + "0x755582d6db18003e67eccaa7090421a775280a36": { + "name": "JEERGIRL token contract", + "address": "0x755582d6db18003e67eccaa7090421a775280a36", + "token": { + "decimals": 18, + "symbol": "JEERGIRL" + }, + "isSC": {} + }, + "0xeb2f5a4e1441df330670dc7b0cf4eac0f7ab5fa5": { + "name": "HIFRIENDS token contract", + "address": "0xeb2f5a4e1441df330670dc7b0cf4eac0f7ab5fa5", + "token": { + "decimals": 18, + "symbol": "HIFRIENDS" + }, + "isSC": {} + }, + "0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509": { + "name": "POWER token contract", + "address": "0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509", + "token": { + "decimals": 18, + "symbol": "POWER" + }, + "isSC": {} + }, + "0xb15a5aab2a65745314fcd0d7f5080bfa65bd7c03": { + "name": "TUPELO token contract", + "address": "0xb15a5aab2a65745314fcd0d7f5080bfa65bd7c03", + "token": { + "decimals": 9, + "symbol": "TUPELO" + }, + "isSC": {} + }, + "0x4cd0c43b0d53bc318cc5342b77eb6f124e47f526": { + "name": "FREE token contract", + "address": "0x4cd0c43b0d53bc318cc5342b77eb6f124e47f526", + "token": { + "decimals": 18, + "symbol": "FREE" + }, + "isSC": {} + }, + "0xed0439eacf4c4965ae4613d77a5c2efe10e5f183": { + "name": "SHROOM token contract", + "address": "0xed0439eacf4c4965ae4613d77a5c2efe10e5f183", + "token": { + "decimals": 18, + "symbol": "SHROOM" + }, + "isSC": {} + }, + "0x20a8cec5fffea65be7122bcab2ffe32ed4ebf03a": { + "name": "DNXC token contract", + "address": "0x20a8cec5fffea65be7122bcab2ffe32ed4ebf03a", + "token": { + "decimals": 18, + "symbol": "DNXC" + }, + "isSC": {} + }, + "0xa888d9616c2222788fa19f05f77221a290eef704": { + "name": "DARUMA token contract", + "address": "0xa888d9616c2222788fa19f05f77221a290eef704", + "token": { + "decimals": 9, + "symbol": "DARUMA" + }, + "isSC": {} + }, + "0x9303eabc860a743aabcc3a1629014cabcc3f8d36": { + "name": "AAMMUNIDAIWETH token contract", + "address": "0x9303eabc860a743aabcc3a1629014cabcc3f8d36", + "token": { + "decimals": 18, + "symbol": "AAMMUNIDAIWETH" + }, + "isSC": {} + }, + "0x38f679f8e8116cd5d6a700e442dfaa8e7b8697b5": { + "name": "NANDI token contract", + "address": "0x38f679f8e8116cd5d6a700e442dfaa8e7b8697b5", + "token": { + "decimals": 9, + "symbol": "NANDI" + }, + "isSC": {} + }, + "0x63e28547f0997e8ab265b24b7e5df302f3498ff3": { + "name": "UWOW token contract", + "address": "0x63e28547f0997e8ab265b24b7e5df302f3498ff3", + "token": { + "decimals": 18, + "symbol": "UWOW" + }, + "isSC": {} + }, + "0x8ed955a2b7d2c3a17a9d05daca95e01818f8c11e": { + "name": "APFC token contract", + "address": "0x8ed955a2b7d2c3a17a9d05daca95e01818f8c11e", + "token": { + "decimals": 18, + "symbol": "APFC" + }, + "isSC": {} + }, + "0x4743a7a193cdf202035e9bc6830a07f1607630c4": { + "name": "GUY token contract", + "address": "0x4743a7a193cdf202035e9bc6830a07f1607630c4", + "token": { + "decimals": 18, + "symbol": "GUY" + }, + "isSC": {} + }, + "0x93ef1ea305d11a9b2a3ebb9bb4fcc34695292e7d": { + "name": "QETH token contract", + "address": "0x93ef1ea305d11a9b2a3ebb9bb4fcc34695292e7d", + "token": { + "decimals": 18, + "symbol": "QETH" + }, + "isSC": {} + }, + "0x3d5fa1cf7d356474f72c8cb24f7a6117b40f8c40": { + "name": "SAINT token contract", + "address": "0x3d5fa1cf7d356474f72c8cb24f7a6117b40f8c40", + "token": { + "decimals": 18, + "symbol": "SAINT" + }, + "isSC": {} + }, + "0xc0ae17eb994fa828540ffa53776b3830233a1b02": { + "name": "ELT token contract", + "address": "0xc0ae17eb994fa828540ffa53776b3830233a1b02", + "token": { + "decimals": 18, + "symbol": "ELT" + }, + "isSC": {} + }, + "0x9d7107c8e30617cadc11f9692a19c82ae8bba938": { + "name": "ROO token contract", + "address": "0x9d7107c8e30617cadc11f9692a19c82ae8bba938", + "token": { + "decimals": 18, + "symbol": "ROO" + }, + "isSC": {} + }, + "0x848578e351d25b6ec0d486e42677891521c3d743": { + "name": "MOSOLID token contract", + "address": "0x848578e351d25b6ec0d486e42677891521c3d743", + "token": { + "decimals": 18, + "symbol": "MOSOLID" + }, + "isSC": {} + }, + "0xa5269a8e31b93ff27b887b56720a25f844db0529": { + "name": "MAUSDC token contract", + "address": "0xa5269a8e31b93ff27b887b56720a25f844db0529", + "token": { + "decimals": 18, + "symbol": "MAUSDC" + }, + "isSC": {} + }, + "0x940bdcb99a0ee5fb008a606778ae87ed9789f257": { + "name": "JFIN token contract", + "address": "0x940bdcb99a0ee5fb008a606778ae87ed9789f257", + "token": { + "decimals": 18, + "symbol": "JFIN" + }, + "isSC": {} + }, + "0x1a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1": { + "name": "COFI token contract", + "address": "0x1a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1", + "token": { + "decimals": 18, + "symbol": "COFI" + }, + "isSC": {} + }, + "0x84412819ae69b10250d0d54d58f454018f1c8a42": { + "name": "DUNG token contract", + "address": "0x84412819ae69b10250d0d54d58f454018f1c8a42", + "token": { + "decimals": 18, + "symbol": "DUNG" + }, + "isSC": {} + }, + "0x400b1d8a7dd8c471026b2c8cbe1062b27d120538": { + "name": "LIMEX token contract", + "address": "0x400b1d8a7dd8c471026b2c8cbe1062b27d120538", + "token": { + "decimals": 8, + "symbol": "LIMEX" + }, + "isSC": {} + }, + "0x7d8d7c26179b7a6aebbf66a91c38ed92d5b4996b": { + "name": "FUND token contract", + "address": "0x7d8d7c26179b7a6aebbf66a91c38ed92d5b4996b", + "token": { + "decimals": 18, + "symbol": "FUND" + }, + "isSC": {} + }, + "0xc5bcc8ba3f33ab0d64f3473e861bdc0685b19ef5": { + "name": "MECHA token contract", + "address": "0xc5bcc8ba3f33ab0d64f3473e861bdc0685b19ef5", + "token": { + "decimals": 18, + "symbol": "MECHA" + }, + "isSC": {} + }, + "0x76dbcba41e11784bfa95ce30e529fa533c3fa4ad": { + "name": "SMT token contract", + "address": "0x76dbcba41e11784bfa95ce30e529fa533c3fa4ad", + "token": { + "decimals": 18, + "symbol": "SMT" + }, + "isSC": {} + }, + "0x18c1074845c389907762a71242bfe271c9da2d9c": { + "name": "BULL token contract", + "address": "0x18c1074845c389907762a71242bfe271c9da2d9c", + "token": { + "decimals": 18, + "symbol": "BULL" + }, + "isSC": {} + }, + "0x82a77710495a35549d2add797412b4a4497d33ef": { + "name": "DOGZ token contract", + "address": "0x82a77710495a35549d2add797412b4a4497d33ef", + "token": { + "decimals": 18, + "symbol": "DOGZ" + }, + "isSC": {} + }, + "0x26f9111a358385dc46a832cf1a1a021ee72e58a1": { + "name": "ZOOK token contract", + "address": "0x26f9111a358385dc46a832cf1a1a021ee72e58a1", + "token": { + "decimals": 18, + "symbol": "ZOOK" + }, + "isSC": {} + }, + "0x0b319db00d07c8fadfaaef13c910141a5da0aa8f": { + "name": "FTUSD token contract", + "address": "0x0b319db00d07c8fadfaaef13c910141a5da0aa8f", + "token": { + "decimals": 18, + "symbol": "FTUSD" + }, + "isSC": {} + }, + "0xecbee2fae67709f718426ddc3bf770b26b95ed20": { + "name": "CLIPS token contract", + "address": "0xecbee2fae67709f718426ddc3bf770b26b95ed20", + "token": { + "decimals": 18, + "symbol": "CLIPS" + }, + "isSC": {} + }, + "0xf5d126077096e5b01bc30ffa5d9324d7202d7cb3": { + "name": "CHEW token contract", + "address": "0xf5d126077096e5b01bc30ffa5d9324d7202d7cb3", + "token": { + "decimals": 18, + "symbol": "CHEW" + }, + "isSC": {} + }, + "0x3392d8a60b77f8d3eaa4fb58f09d835bd31add29": { + "name": "INDI token contract", + "address": "0x3392d8a60b77f8d3eaa4fb58f09d835bd31add29", + "token": { + "decimals": 18, + "symbol": "INDI" + }, + "isSC": {} + }, + "0x0f17eeccc84739b9450c88de0429020e2dec05eb": { + "name": "OTACON token contract", + "address": "0x0f17eeccc84739b9450c88de0429020e2dec05eb", + "token": { + "decimals": 18, + "symbol": "OTACON" + }, + "isSC": {} + }, + "0xd139a81d8422bb2ee1f21ce0301e6e28e7696425": { + "name": "XS token contract", + "address": "0xd139a81d8422bb2ee1f21ce0301e6e28e7696425", + "token": { + "decimals": 18, + "symbol": "XS" + }, + "isSC": {} + }, + "0x9a0aba393aac4dfbff4333b06c407458002c6183": { + "name": "AC token contract", + "address": "0x9a0aba393aac4dfbff4333b06c407458002c6183", + "token": { + "decimals": 18, + "symbol": "AC" + }, + "isSC": {} + }, + "0x41a08648c3766f9f9d85598ff102a08f4ef84f84": { + "name": "ABPT token contract", + "address": "0x41a08648c3766f9f9d85598ff102a08f4ef84f84", + "token": { + "decimals": 18, + "symbol": "ABPT" + }, + "isSC": {} + }, + "0xd487892bb4c57edbe7ab401d9fe801c8fe6473f5": { + "name": "HVE2 token contract", + "address": "0xd487892bb4c57edbe7ab401d9fe801c8fe6473f5", + "token": { + "decimals": 18, + "symbol": "HVE2" + }, + "isSC": {} + }, + "0x35a18000230da775cac24873d00ff85bccded550": { + "name": "CUNI token contract", + "address": "0x35a18000230da775cac24873d00ff85bccded550", + "token": { + "decimals": 8, + "symbol": "CUNI" + }, + "isSC": {} + }, + "0x08f7be99ed83369541501d60f4e66f8e34c3f736": { + "name": "CKU token contract", + "address": "0x08f7be99ed83369541501d60f4e66f8e34c3f736", + "token": { + "decimals": 18, + "symbol": "CKU" + }, + "isSC": {} + }, + "0x4561de8e0c2bba725d38d266ef62426e62678d82": { + "name": "CONI token contract", + "address": "0x4561de8e0c2bba725d38d266ef62426e62678d82", + "token": { + "decimals": 18, + "symbol": "CONI" + }, + "isSC": {} + }, + "0xddcea43727558126c00eea772d660dfbe9c39613": { + "name": "GRIZZLY token contract", + "address": "0xddcea43727558126c00eea772d660dfbe9c39613", + "token": { + "decimals": 9, + "symbol": "GRIZZLY" + }, + "isSC": {} + }, + "0x7567d006f6be77e3d87aa831855cb4102e37b17d": { + "name": "THND token contract", + "address": "0x7567d006f6be77e3d87aa831855cb4102e37b17d", + "token": { + "decimals": 18, + "symbol": "THND" + }, + "isSC": {} + }, + "0xb5c578947de0fd71303f71f2c3d41767438bd0de": { + "name": "DEVT token contract", + "address": "0xb5c578947de0fd71303f71f2c3d41767438bd0de", + "token": { + "decimals": 18, + "symbol": "DEVT" + }, + "isSC": {} + }, + "0x24ccedebf841544c9e6a62af4e8c2fa6e5a46fde": { + "name": "BLUESPARROW token contract", + "address": "0x24ccedebf841544c9e6a62af4e8c2fa6e5a46fde", + "token": { + "decimals": 9, + "symbol": "BLUESPARROW" + }, + "isSC": {} + }, + "0x8387c2d1b0eea6b91b910aff66a7bd2710a5946a": { + "name": "FOMO token contract", + "address": "0x8387c2d1b0eea6b91b910aff66a7bd2710a5946a", + "token": { + "decimals": 18, + "symbol": "FOMO" + }, + "isSC": {} + }, + "0x7ab7d54f8cb054141142f04ba0b3d41ac4c4d61c": { + "name": "NOTHING token contract", + "address": "0x7ab7d54f8cb054141142f04ba0b3d41ac4c4d61c", + "token": { + "decimals": 18, + "symbol": "NOTHING" + }, + "isSC": {} + }, + "0x73a83269b9bbafc427e76be0a2c1a1db2a26f4c2": { + "name": "0NE token contract", + "address": "0x73a83269b9bbafc427e76be0a2c1a1db2a26f4c2", + "token": { + "decimals": 18, + "symbol": "0NE" + }, + "isSC": {} + }, + "0xd05d90a656fc375ac1478689d7bcd31098f2dd1f": { + "name": "FACTORY token contract", + "address": "0xd05d90a656fc375ac1478689d7bcd31098f2dd1f", + "token": { + "decimals": 18, + "symbol": "FACTORY" + }, + "isSC": {} + }, + "0x1650978997e5898db8eeffdb7c530bb223b71c79": { + "name": "FLASH token contract", + "address": "0x1650978997e5898db8eeffdb7c530bb223b71c79", + "token": { + "decimals": 9, + "symbol": "FLASH" + }, + "isSC": {} + }, + "0x0501b9188436e35bb10f35998c40adc079003866": { + "name": "AIAT token contract", + "address": "0x0501b9188436e35bb10f35998c40adc079003866", + "token": { + "decimals": 18, + "symbol": "AIAT" + }, + "isSC": {} + }, + "0xd7dcd9b99787c619b4d57979521258d1a7267ad7": { + "name": "EVRY token contract", + "address": "0xd7dcd9b99787c619b4d57979521258d1a7267ad7", + "token": { + "decimals": 18, + "symbol": "EVRY" + }, + "isSC": {} + }, + "0x697ef32b4a3f5a4c39de1cb7563f24ca7bfc5947": { + "name": "Insula Token", + "address": "0x697ef32b4a3f5a4c39de1cb7563f24ca7bfc5947", + "token": { + "decimals": 18, + "symbol": "ISLA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Insula.svg" + }, + "0xedbf98724a86f92baefac101082c366e96f1e9d9": { + "name": "BFT token contract", + "address": "0xedbf98724a86f92baefac101082c366e96f1e9d9", + "token": { + "decimals": 18, + "symbol": "BFT" + }, + "isSC": {} + }, + "0xbb126042235e6bd38b17744cb31a8bf4a206c045": { + "name": "FANC token contract", + "address": "0xbb126042235e6bd38b17744cb31a8bf4a206c045", + "token": { + "decimals": 18, + "symbol": "FANC" + }, + "isSC": {} + }, + "0xe08ef9206a8a7c9337cc6611b4f5226fdafc4772": { + "name": "MESSI token contract", + "address": "0xe08ef9206a8a7c9337cc6611b4f5226fdafc4772", + "token": { + "decimals": 9, + "symbol": "MESSI" + }, + "isSC": {} + }, + "0xb6a7a1d8f64fc6f984a6f3b52b7426f7b0abab5b": { + "name": "MAXCAT token contract", + "address": "0xb6a7a1d8f64fc6f984a6f3b52b7426f7b0abab5b", + "token": { + "decimals": 18, + "symbol": "MAXCAT" + }, + "isSC": {} + }, + "0x1a3a8cf347b2bf5890d3d6a1b981c4f4432c8661": { + "name": "FAC token contract", + "address": "0x1a3a8cf347b2bf5890d3d6a1b981c4f4432c8661", + "token": { + "decimals": 18, + "symbol": "FAC" + }, + "isSC": {} + }, + "0x0c93b616933b0cd03b201b29cd8a22681dd9e0d9": { + "name": "HGOLD token contract", + "address": "0x0c93b616933b0cd03b201b29cd8a22681dd9e0d9", + "token": { + "decimals": 8, + "symbol": "HGOLD" + }, + "isSC": {} + }, + "0xbee709aa42375ace642338f7f657ff859a19c9bc": { + "name": "MCT token contract", + "address": "0xbee709aa42375ace642338f7f657ff859a19c9bc", + "token": { + "decimals": 18, + "symbol": "MCT" + }, + "isSC": {} + }, + "0xb1a822ce8c799b0777ed1f260113819247e1bf26": { + "name": "FTX token contract", + "address": "0xb1a822ce8c799b0777ed1f260113819247e1bf26", + "token": { + "decimals": 18, + "symbol": "FTX" + }, + "isSC": {} + }, + "0x3c8d2fce49906e11e71cb16fa0ffeb2b16c29638": { + "name": "NFTL token contract", + "address": "0x3c8d2fce49906e11e71cb16fa0ffeb2b16c29638", + "token": { + "decimals": 18, + "symbol": "NFTL" + }, + "isSC": {} + }, + "0xef8e456967122db4c3c160314bde8d2602ad6199": { + "name": "WAGMI token contract", + "address": "0xef8e456967122db4c3c160314bde8d2602ad6199", + "token": { + "decimals": 9, + "symbol": "WAGMI" + }, + "isSC": {} + }, + "0x91bdf1eb4215bc1c6d9a6bd83ecfceeb17cd4343": { + "name": "RICHARD token contract", + "address": "0x91bdf1eb4215bc1c6d9a6bd83ecfceeb17cd4343", + "token": { + "decimals": 9, + "symbol": "RICHARD" + }, + "isSC": {} + }, + "0xf6043bea98b07f0bea7813aeb22d0cb70c91c0c4": { + "name": "MDAI token contract", + "address": "0xf6043bea98b07f0bea7813aeb22d0cb70c91c0c4", + "token": { + "decimals": 18, + "symbol": "MDAI" + }, + "isSC": {} + }, + "0x23894dc9da6c94ecb439911caf7d337746575a72": { + "name": "JAM token contract", + "address": "0x23894dc9da6c94ecb439911caf7d337746575a72", + "token": { + "decimals": 18, + "symbol": "JAM" + }, + "isSC": {} + }, + "0x5ebffc53c3b8a71120789a211f9b91c79c78d1e0": { + "name": "SOJU token contract", + "address": "0x5ebffc53c3b8a71120789a211f9b91c79c78d1e0", + "token": { + "decimals": 18, + "symbol": "SOJU" + }, + "isSC": {} + }, + "0xa52bffad02b1fe3f86a543a4e81962d3b3bb01a7": { + "name": "DUCKER token contract", + "address": "0xa52bffad02b1fe3f86a543a4e81962d3b3bb01a7", + "token": { + "decimals": 18, + "symbol": "DUCKER" + }, + "isSC": {} + }, + "0x7a73839bd0e5cded853cb01aa9773f8989381065": { + "name": "UBXN token contract", + "address": "0x7a73839bd0e5cded853cb01aa9773f8989381065", + "token": { + "decimals": 18, + "symbol": "UBXN" + }, + "isSC": {} + }, + "0x7f3141c4d6b047fb930991b450f1ed996a51cb26": { + "name": "X token contract", + "address": "0x7f3141c4d6b047fb930991b450f1ed996a51cb26", + "token": { + "decimals": 18, + "symbol": "X" + }, + "isSC": {} + }, + "0xbc544207ff1c5b2bc47a35f745010b603b97e99e": { + "name": "AI token contract", + "address": "0xbc544207ff1c5b2bc47a35f745010b603b97e99e", + "token": { + "decimals": 18, + "symbol": "AI" + }, + "isSC": {} + }, + "0x4a88ebf6f76b04f5e0e71a351a22e573f636affe": { + "name": "YOYO token contract", + "address": "0x4a88ebf6f76b04f5e0e71a351a22e573f636affe", + "token": { + "decimals": 18, + "symbol": "YOYO" + }, + "isSC": {} + }, + "0x048aa6e69d5117bd665af4128383a6982b8367b3": { + "name": "VXON token contract", + "address": "0x048aa6e69d5117bd665af4128383a6982b8367b3", + "token": { + "decimals": 4, + "symbol": "VXON" + }, + "isSC": {} + }, + "0x46d0dac0926fa16707042cadc23f1eb4141fe86b": { + "name": "SNM token contract", + "address": "0x46d0dac0926fa16707042cadc23f1eb4141fe86b", + "token": { + "decimals": 18, + "symbol": "SNM" + }, + "isSC": {} + }, + "0x505a84a03e382331a1be487b632cf357748b65d6": { + "name": "SHIBGF token contract", + "address": "0x505a84a03e382331a1be487b632cf357748b65d6", + "token": { + "decimals": 18, + "symbol": "SHIBGF" + }, + "isSC": {} + }, + "0x490bbbc2485e99989ba39b34802fafa58e26aba4": { + "name": "MAWETH token contract", + "address": "0x490bbbc2485e99989ba39b34802fafa58e26aba4", + "token": { + "decimals": 18, + "symbol": "MAWETH" + }, + "isSC": {} + }, + "0x0e6641e62baa87d77e01ab1c7e9d2f323f26942b": { + "name": "ASET token contract", + "address": "0x0e6641e62baa87d77e01ab1c7e9d2f323f26942b", + "token": { + "decimals": 18, + "symbol": "ASET" + }, + "isSC": {} + }, + "0xca4b70beccabce29efa5bc5c86311e5d38461842": { + "name": "SYBL token contract", + "address": "0xca4b70beccabce29efa5bc5c86311e5d38461842", + "token": { + "decimals": 18, + "symbol": "SYBL" + }, + "isSC": {} + }, + "0x049e9f5369358786a1ce6483d668d062cfe547ec": { + "name": "CHECKS token contract", + "address": "0x049e9f5369358786a1ce6483d668d062cfe547ec", + "token": { + "decimals": 18, + "symbol": "CHECKS" + }, + "isSC": {} + }, + "0x537edd52ebcb9f48ff2f8a28c51fcdb9d6a6e0d4": { + "name": "SDOG token contract", + "address": "0x537edd52ebcb9f48ff2f8a28c51fcdb9d6a6e0d4", + "token": { + "decimals": 18, + "symbol": "SDOG" + }, + "isSC": {} + }, + "0x1f17d72cbe65df609315df5c4f5f729efbd00ade": { + "name": "GYOSHI token contract", + "address": "0x1f17d72cbe65df609315df5c4f5f729efbd00ade", + "token": { + "decimals": 18, + "symbol": "GYOSHI" + }, + "isSC": {} + }, + "0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c": { + "name": "DZAR token contract", + "address": "0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c", + "token": { + "decimals": 6, + "symbol": "DZAR" + }, + "isSC": {} + }, + "0x0352557b007a4aae1511c114409b932f06f9e2f4": { + "name": "SRUNE token contract", + "address": "0x0352557b007a4aae1511c114409b932f06f9e2f4", + "token": { + "decimals": 18, + "symbol": "SRUNE" + }, + "isSC": {} + }, + "0xe4ab0be415e277d82c38625b72bd7dea232c2e7d": { + "name": "XRP20 token contract", + "address": "0xe4ab0be415e277d82c38625b72bd7dea232c2e7d", + "token": { + "decimals": 18, + "symbol": "XRP20" + }, + "isSC": {} + }, + "0x2b218683178d029bab6c9789b1073aa6c96e5176": { + "name": "BB-S-DAI token contract", + "address": "0x2b218683178d029bab6c9789b1073aa6c96e5176", + "token": { + "decimals": 18, + "symbol": "BB-S-DAI" + }, + "isSC": {} + }, + "0x9cdafb9fae77e7c1bd7cf28c389008ca8dacf48c": { + "name": "LIM token contract", + "address": "0x9cdafb9fae77e7c1bd7cf28c389008ca8dacf48c", + "token": { + "decimals": 18, + "symbol": "LIM" + }, + "isSC": {} + }, + "0x63f584fa56e60e4d0fe8802b27c7e6e3b33e007f": { + "name": "BOX token contract", + "address": "0x63f584fa56e60e4d0fe8802b27c7e6e3b33e007f", + "token": { + "decimals": 18, + "symbol": "BOX" + }, + "isSC": {} + }, + "0x9dc9d1c18060b45f3dc15fb8d6ab1895022c63b3": { + "name": "BBB token contract", + "address": "0x9dc9d1c18060b45f3dc15fb8d6ab1895022c63b3", + "token": { + "decimals": 18, + "symbol": "BBB" + }, + "isSC": {} + }, + "0x758b4684be769e92eefea93f60dda0181ea303ec": { + "name": "PHONON token contract", + "address": "0x758b4684be769e92eefea93f60dda0181ea303ec", + "token": { + "decimals": 18, + "symbol": "PHONON" + }, + "isSC": {} + }, + "0xd6d9f4385bff8670d66a708b258969913619a673": { + "name": "LEET token contract", + "address": "0xd6d9f4385bff8670d66a708b258969913619a673", + "token": { + "decimals": 9, + "symbol": "LEET" + }, + "isSC": {} + }, + "0xcc8e21f599995d1c8367054841b8af5024ddf01b": { + "name": "AG token contract", + "address": "0xcc8e21f599995d1c8367054841b8af5024ddf01b", + "token": { + "decimals": 18, + "symbol": "AG" + }, + "isSC": {} + }, + "0x4b0f027d0b694aae2761ed2d426295d4f949f5d0": { + "name": "POLL token contract", + "address": "0x4b0f027d0b694aae2761ed2d426295d4f949f5d0", + "token": { + "decimals": 18, + "symbol": "POLL" + }, + "isSC": {} + }, + "0xc53342fd7575f572b0ff4569e31941a5b821ac76": { + "name": "ETHV token contract", + "address": "0xc53342fd7575f572b0ff4569e31941a5b821ac76", + "token": { + "decimals": 18, + "symbol": "ETHV" + }, + "isSC": {} + }, + "0x803e102459e682f13760904408ad96dccee0c8d3": { + "name": "FINE20 token contract", + "address": "0x803e102459e682f13760904408ad96dccee0c8d3", + "token": { + "decimals": 9, + "symbol": "FINE20" + }, + "isSC": {} + }, + "0x51db5ad35c671a87207d88fc11d593ac0c8415bd": { + "name": "MDA token contract", + "address": "0x51db5ad35c671a87207d88fc11d593ac0c8415bd", + "token": { + "decimals": 18, + "symbol": "MDA" + }, + "isSC": {} + }, + "0xc40f23a3e9613e012944f7957edce97899fa920d": { + "name": "DHP token contract", + "address": "0xc40f23a3e9613e012944f7957edce97899fa920d", + "token": { + "decimals": 18, + "symbol": "DHP" + }, + "isSC": {} + }, + "0xe1a3864dbf62fb94834b108ff6bf439ce70183ac": { + "name": "VXDEFI token contract", + "address": "0xe1a3864dbf62fb94834b108ff6bf439ce70183ac", + "token": { + "decimals": 18, + "symbol": "VXDEFI" + }, + "isSC": {} + }, + "0xe75ad3aab14e4b0df8c5da4286608dabb21bd864": { + "name": "AAC token contract", + "address": "0xe75ad3aab14e4b0df8c5da4286608dabb21bd864", + "token": { + "decimals": 5, + "symbol": "AAC" + }, + "isSC": {} + }, + "0x1fc5ef0337aea85c5f9198853a6e3a579a7a6987": { + "name": "REAP token contract", + "address": "0x1fc5ef0337aea85c5f9198853a6e3a579a7a6987", + "token": { + "decimals": 18, + "symbol": "REAP" + }, + "isSC": {} + }, + "0x20cd2e7ec8f5d8b337fe46a4f565ccef1561b9a9": { + "name": "ESG token contract", + "address": "0x20cd2e7ec8f5d8b337fe46a4f565ccef1561b9a9", + "token": { + "decimals": 18, + "symbol": "ESG" + }, + "isSC": {} + }, + "0x5cb888182fbffdb62c08fb4b5a343914f00fdfee": { + "name": "BIPS token contract", + "address": "0x5cb888182fbffdb62c08fb4b5a343914f00fdfee", + "token": { + "decimals": 18, + "symbol": "BIPS" + }, + "isSC": {} + }, + "0xac0c8da4a4748d8d821a0973d00b157aa78c473d": { + "name": "YFO token contract", + "address": "0xac0c8da4a4748d8d821a0973d00b157aa78c473d", + "token": { + "decimals": 18, + "symbol": "YFO" + }, + "isSC": {} + }, + "0xdf49c9f599a0a9049d97cff34d0c30e468987389": { + "name": "SaTT", + "address": "0xdf49c9f599a0a9049d97cff34d0c30e468987389", + "token": { + "decimals": 18, + "symbol": "SATT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SaTT.svg" + }, + "0x4092678e4e78230f46a1534c0fbc8fa39780892b": { + "name": "OCN token contract", + "address": "0x4092678e4e78230f46a1534c0fbc8fa39780892b", + "token": { + "decimals": 18, + "symbol": "OCN" + }, + "isSC": {} + }, + "0x9d5963ba32e877871dff3e2e697283dc64066271": { + "name": "EDC token contract", + "address": "0x9d5963ba32e877871dff3e2e697283dc64066271", + "token": { + "decimals": 18, + "symbol": "EDC" + }, + "isSC": {} + }, + "0xeadc218ac4cb7895a5a56e6484646b48f841c45a": { + "name": "MFI token contract", + "address": "0xeadc218ac4cb7895a5a56e6484646b48f841c45a", + "token": { + "decimals": 18, + "symbol": "MFI" + }, + "isSC": {} + }, + "0x23a2164d482fd2fec9c2d0b66528d42fee7b8817": { + "name": "METAMEME token contract", + "address": "0x23a2164d482fd2fec9c2d0b66528d42fee7b8817", + "token": { + "decimals": 9, + "symbol": "METAMEME" + }, + "isSC": {} + }, + "0x0f5def84ced3e9e295dae28df96d0b846de92c1a": { + "name": "SDG token contract", + "address": "0x0f5def84ced3e9e295dae28df96d0b846de92c1a", + "token": { + "decimals": 18, + "symbol": "SDG" + }, + "isSC": {} + }, + "0xc19b6a4ac7c7cc24459f08984bbd09664af17bd1": { + "name": "SENSO token contract", + "address": "0xc19b6a4ac7c7cc24459f08984bbd09664af17bd1", + "token": { + "decimals": 0, + "symbol": "SENSO" + }, + "isSC": {} + }, + "0xfae4ee59cdd86e3be9e8b90b53aa866327d7c090": { + "name": "CPC token contract", + "address": "0xfae4ee59cdd86e3be9e8b90b53aa866327d7c090", + "token": { + "decimals": 18, + "symbol": "CPC" + }, + "isSC": {} + }, + "0xbcd657377d4086cc582b215294c3611b997ef1be": { + "name": "SNAKEBOT token contract", + "address": "0xbcd657377d4086cc582b215294c3611b997ef1be", + "token": { + "decimals": 9, + "symbol": "SNAKEBOT" + }, + "isSC": {} + }, + "0xb97048628db6b661d4c2aa833e95dbe1a905b280": { + "name": "PAY token contract", + "address": "0xb97048628db6b661d4c2aa833e95dbe1a905b280", + "token": { + "decimals": 18, + "symbol": "PAY" + }, + "isSC": {} + }, + "0xff931a7946d2fa11cf9123ef0dc6f6c7c6cb60c4": { + "name": "BABY token contract", + "address": "0xff931a7946d2fa11cf9123ef0dc6f6c7c6cb60c4", + "token": { + "decimals": 9, + "symbol": "BABY" + }, + "isSC": {} + }, + "0x53884b61963351c283118a8e1fc05ba464a11959": { + "name": "MNS token contract", + "address": "0x53884b61963351c283118a8e1fc05ba464a11959", + "token": { + "decimals": 18, + "symbol": "MNS" + }, + "isSC": {} + }, + "0x96eb50804d0ef2790f2e1a33670feff6040cf89d": { + "name": "SX token contract", + "address": "0x96eb50804d0ef2790f2e1a33670feff6040cf89d", + "token": { + "decimals": 18, + "symbol": "SX" + }, + "isSC": {} + }, + "0x5eaa69b29f99c84fe5de8200340b4e9b4ab38eac": { + "name": "RAZE token contract", + "address": "0x5eaa69b29f99c84fe5de8200340b4e9b4ab38eac", + "token": { + "decimals": 18, + "symbol": "RAZE" + }, + "isSC": {} + }, + "0x20945ca1df56d237fd40036d47e866c7dccd2114": { + "name": "NSURE token contract", + "address": "0x20945ca1df56d237fd40036d47e866c7dccd2114", + "token": { + "decimals": 18, + "symbol": "NSURE" + }, + "isSC": {} + }, + "0xa8b0f154a688c22142e361707df64277e0a0be66": { + "name": "RAK token contract", + "address": "0xa8b0f154a688c22142e361707df64277e0a0be66", + "token": { + "decimals": 18, + "symbol": "RAK" + }, + "isSC": {} + }, + "0x5aaefe84e0fb3dd1f0fcff6fa7468124986b91bd": { + "name": "EVED token contract", + "address": "0x5aaefe84e0fb3dd1f0fcff6fa7468124986b91bd", + "token": { + "decimals": 18, + "symbol": "EVED" + }, + "isSC": {} + }, + "0x3f5dd1a1538a4f9f82e543098f01f22480b0a3a8": { + "name": "DKUMA token contract", + "address": "0x3f5dd1a1538a4f9f82e543098f01f22480b0a3a8", + "token": { + "decimals": 18, + "symbol": "DKUMA" + }, + "isSC": {} + }, + "0x8a7b7b9b2f7d0c63f66171721339705a6188a7d5": { + "name": "EDOGE token contract", + "address": "0x8a7b7b9b2f7d0c63f66171721339705a6188a7d5", + "token": { + "decimals": 18, + "symbol": "EDOGE" + }, + "isSC": {} + }, + "0xd346e8ada104093adcf5f4186087e1ad309bb3b3": { + "name": "SHIBN token contract", + "address": "0xd346e8ada104093adcf5f4186087e1ad309bb3b3", + "token": { + "decimals": 18, + "symbol": "SHIBN" + }, + "isSC": {} + }, + "0x77607588222e01bf892a29abab45796a2047fc7b": { + "name": "UETH token contract", + "address": "0x77607588222e01bf892a29abab45796a2047fc7b", + "token": { + "decimals": 18, + "symbol": "UETH" + }, + "isSC": {} + }, + "0xe632ea2ef2cfd8fc4a2731c76f99078aef6a4b31": { + "name": "THX token contract", + "address": "0xe632ea2ef2cfd8fc4a2731c76f99078aef6a4b31", + "token": { + "decimals": 18, + "symbol": "THX" + }, + "isSC": {} + }, + "0x1a44e35d5451e0b78621a1b3e7a53dfaa306b1d0": { + "name": "B-BAOETH-ETH-BPT token contract", + "address": "0x1a44e35d5451e0b78621a1b3e7a53dfaa306b1d0", + "token": { + "decimals": 18, + "symbol": "B-BAOETH-ETH-BPT" + }, + "isSC": {} + }, + "0xccdae12162566e3f29fefa7bf7f5b24c644493b5": { + "name": "ICRETH token contract", + "address": "0xccdae12162566e3f29fefa7bf7f5b24c644493b5", + "token": { + "decimals": 18, + "symbol": "ICRETH" + }, + "isSC": {} + }, + "0x93eeb426782bd88fcd4b48d7b0368cf061044928": { + "name": "TRG token contract", + "address": "0x93eeb426782bd88fcd4b48d7b0368cf061044928", + "token": { + "decimals": 18, + "symbol": "TRG" + }, + "isSC": {} + }, + "0x051d7e5609917bd9b73f04bac0ded8dd46a74301": { + "name": "CRVWSBTC token contract", + "address": "0x051d7e5609917bd9b73f04bac0ded8dd46a74301", + "token": { + "decimals": 18, + "symbol": "CRVWSBTC" + }, + "isSC": {} + }, + "0x8ef47555856f6ce2e0cd7c36aef4fab317d2e2e2": { + "name": "PAYT token contract", + "address": "0x8ef47555856f6ce2e0cd7c36aef4fab317d2e2e2", + "token": { + "decimals": 18, + "symbol": "PAYT" + }, + "isSC": {} + }, + "0xe5597f0723eeaba1b26948e06f008bf0fc1e37e6": { + "name": "GM token contract", + "address": "0xe5597f0723eeaba1b26948e06f008bf0fc1e37e6", + "token": { + "decimals": 18, + "symbol": "GM" + }, + "isSC": {} + }, + "0x07c904d8c04323ef9fe6bf13aaeba05b62c54825": { + "name": "EEYOR token contract", + "address": "0x07c904d8c04323ef9fe6bf13aaeba05b62c54825", + "token": { + "decimals": 18, + "symbol": "EEYOR" + }, + "isSC": {} + }, + "0xdffa3a7f5b40789c7a437dbe7b31b47f9b08fe75": { + "name": "HOODIE token contract", + "address": "0xdffa3a7f5b40789c7a437dbe7b31b47f9b08fe75", + "token": { + "decimals": 18, + "symbol": "HOODIE" + }, + "isSC": {} + }, + "0xc4c75f2a0cb1a9acc33929512dc9733ea1fd6fde": { + "name": "MSI token contract", + "address": "0xc4c75f2a0cb1a9acc33929512dc9733ea1fd6fde", + "token": { + "decimals": 18, + "symbol": "MSI" + }, + "isSC": {} + }, + "0xd05292be8733c1b189820d042c9e2c3fbabb6966": { + "name": "KYD token contract", + "address": "0xd05292be8733c1b189820d042c9e2c3fbabb6966", + "token": { + "decimals": 9, + "symbol": "KYD" + }, + "isSC": {} + }, + "0x2a8d8fcb18d132d77373eb02b22d8e7d378f4437": { + "name": "THZ token contract", + "address": "0x2a8d8fcb18d132d77373eb02b22d8e7d378f4437", + "token": { + "decimals": 18, + "symbol": "THZ" + }, + "isSC": {} + }, + "0x6d4695f7e8d7f9615314a743335702d7eaba4575": { + "name": "LIQS token contract", + "address": "0x6d4695f7e8d7f9615314a743335702d7eaba4575", + "token": { + "decimals": 18, + "symbol": "LIQS" + }, + "isSC": {} + }, + "0x2960d71855a521c8414d29a27218efdb67c34180": { + "name": "LEAX token contract", + "address": "0x2960d71855a521c8414d29a27218efdb67c34180", + "token": { + "decimals": 18, + "symbol": "LEAX" + }, + "isSC": {} + }, + "0x9d9e399e5385e2b9a58d4f775a1e16441b571afb": { + "name": "METANO token contract", + "address": "0x9d9e399e5385e2b9a58d4f775a1e16441b571afb", + "token": { + "decimals": 18, + "symbol": "METANO" + }, + "isSC": {} + }, + "0x4eb5124d04227f1aab771a37e131e62f17c4ffdc": { + "name": "VOCARE token contract", + "address": "0x4eb5124d04227f1aab771a37e131e62f17c4ffdc", + "token": { + "decimals": 18, + "symbol": "VOCARE" + }, + "isSC": {} + }, + "0x32e6c34cd57087abbd59b5a4aecc4cb495924356": { + "name": "BitBase", + "address": "0x32e6c34cd57087abbd59b5a4aecc4cb495924356", + "token": { + "decimals": 18, + "symbol": "BTBS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BTBS.svg" + }, + "0x69d9905b2e5f6f5433212b7f3c954433f23c1572": { + "name": "OOKS token contract", + "address": "0x69d9905b2e5f6f5433212b7f3c954433f23c1572", + "token": { + "decimals": 18, + "symbol": "OOKS" + }, + "isSC": {} + }, + "0xa8262eb913fccea4c3f77fc95b8b4043b384cfbb": { + "name": "KGC token contract", + "address": "0xa8262eb913fccea4c3f77fc95b8b4043b384cfbb", + "token": { + "decimals": 18, + "symbol": "KGC" + }, + "isSC": {} + }, + "0xde0e9bd25dc63a629f40e1ec7959b57726e94d88": { + "name": "MEMES token contract", + "address": "0xde0e9bd25dc63a629f40e1ec7959b57726e94d88", + "token": { + "decimals": 18, + "symbol": "MEMES" + }, + "isSC": {} + }, + "0xc3dca8f61b275d1e88f3ea31b3e311c49f56b24b": { + "name": "NPICK token contract", + "address": "0xc3dca8f61b275d1e88f3ea31b3e311c49f56b24b", + "token": { + "decimals": 18, + "symbol": "NPICK" + }, + "isSC": {} + }, + "0x3625b55f653f8c7c884ac668696881df43631d44": { + "name": "ARTI token contract", + "address": "0x3625b55f653f8c7c884ac668696881df43631d44", + "token": { + "decimals": 8, + "symbol": "ARTI" + }, + "isSC": {} + }, + "0xb8cb60d07056d54df518785de9600bd4e6b2b53b": { + "name": "JVL token contract", + "address": "0xb8cb60d07056d54df518785de9600bd4e6b2b53b", + "token": { + "decimals": 18, + "symbol": "JVL" + }, + "isSC": {} + }, + "0x74b1af114274335598da72f5c6ed7b954a016eed": { + "name": "HIT token contract", + "address": "0x74b1af114274335598da72f5c6ed7b954a016eed", + "token": { + "decimals": 18, + "symbol": "HIT" + }, + "isSC": {} + }, + "0xd337382da15d12bb6e56498e91df64f86c8f1ea8": { + "name": "AEL token contract", + "address": "0xd337382da15d12bb6e56498e91df64f86c8f1ea8", + "token": { + "decimals": 18, + "symbol": "AEL" + }, + "isSC": {} + }, + "0xb6dc73987848ba6cb3ce297562723c1a78f85fce": { + "name": "BORZOI token contract", + "address": "0xb6dc73987848ba6cb3ce297562723c1a78f85fce", + "token": { + "decimals": 18, + "symbol": "BORZOI" + }, + "isSC": {} + }, + "0xb04dfdb8271ed2d5e13858562c44a77d3ceb9e57": { + "name": "BUP token contract", + "address": "0xb04dfdb8271ed2d5e13858562c44a77d3ceb9e57", + "token": { + "decimals": 18, + "symbol": "BUP" + }, + "isSC": {} + }, + "0xf2ddae89449b7d26309a5d54614b1fc99c608af5": { + "name": "ASTA token contract", + "address": "0xf2ddae89449b7d26309a5d54614b1fc99c608af5", + "token": { + "decimals": 18, + "symbol": "ASTA" + }, + "isSC": {} + }, + "0xdf121180af07cb906d970799627a430d2440c36d": { + "name": "PIGGY token contract", + "address": "0xdf121180af07cb906d970799627a430d2440c36d", + "token": { + "decimals": 18, + "symbol": "PIGGY" + }, + "isSC": {} + }, + "0x5c6ee304399dbdb9c8ef030ab642b10820db8f56": { + "name": "B-80BAL-20WETH token contract", + "address": "0x5c6ee304399dbdb9c8ef030ab642b10820db8f56", + "token": { + "decimals": 18, + "symbol": "B-80BAL-20WETH" + }, + "isSC": {} + }, + "0xe74be071f3b62f6a4ac23ca68e5e2a39797a3c30": { + "name": "RCG token contract", + "address": "0xe74be071f3b62f6a4ac23ca68e5e2a39797a3c30", + "token": { + "decimals": 18, + "symbol": "RCG" + }, + "isSC": {} + }, + "0xde6cec925d3e76e2cb94cf5805159244ba4cbb91": { + "name": "HERMES token contract", + "address": "0xde6cec925d3e76e2cb94cf5805159244ba4cbb91", + "token": { + "decimals": 18, + "symbol": "HERMES" + }, + "isSC": {} + }, + "0x70c4430f9d98b4184a4ef3e44ce10c320a8b7383": { + "name": "GYFI token contract", + "address": "0x70c4430f9d98b4184a4ef3e44ce10c320a8b7383", + "token": { + "decimals": 18, + "symbol": "GYFI" + }, + "isSC": {} + }, + "0x9cbf044bc535db4c93a9f11205a69631d9dcef26": { + "name": "BILLY token contract", + "address": "0x9cbf044bc535db4c93a9f11205a69631d9dcef26", + "token": { + "decimals": 18, + "symbol": "BILLY" + }, + "isSC": {} + }, + "0xa14ea0e11121e6e951e87c66afe460a00bcd6a16": { + "name": "IDLEDAISAFE token contract", + "address": "0xa14ea0e11121e6e951e87c66afe460a00bcd6a16", + "token": { + "decimals": 18, + "symbol": "IDLEDAISAFE" + }, + "isSC": {} + }, + "0xd1b624f07a4d9b3e3746e33cb58f42df079b5444": { + "name": "NKCLC token contract", + "address": "0xd1b624f07a4d9b3e3746e33cb58f42df079b5444", + "token": { + "decimals": 18, + "symbol": "NKCLC" + }, + "isSC": {} + }, + "0x666cbfaa3baa2faccfac8854fea1e5db140fb104": { + "name": "PLUMS token contract", + "address": "0x666cbfaa3baa2faccfac8854fea1e5db140fb104", + "token": { + "decimals": 18, + "symbol": "PLUMS" + }, + "isSC": {} + }, + "0x9783b81438c24848f85848f8df31845097341771": { + "name": "COLLAR token contract", + "address": "0x9783b81438c24848f85848f8df31845097341771", + "token": { + "decimals": 18, + "symbol": "COLLAR" + }, + "isSC": {} + }, + "0x3700adfd26d5bc062cb8b8a77e68fbd43f58ecab": { + "name": "HIDOODLES token contract", + "address": "0x3700adfd26d5bc062cb8b8a77e68fbd43f58ecab", + "token": { + "decimals": 18, + "symbol": "HIDOODLES" + }, + "isSC": {} + }, + "0xb8db81b84d30e2387de0ff330420a4aaa6688134": { + "name": "AAMMUNILINKWETH token contract", + "address": "0xb8db81b84d30e2387de0ff330420a4aaa6688134", + "token": { + "decimals": 18, + "symbol": "AAMMUNILINKWETH" + }, + "isSC": {} + }, + "0x604026696fdb3c6720ae3049c46d59ac604dea0a": { + "name": "XJP token contract", + "address": "0x604026696fdb3c6720ae3049c46d59ac604dea0a", + "token": { + "decimals": 18, + "symbol": "XJP" + }, + "isSC": {} + }, + "0x9b5161a41b58498eb9c5febf89d60714089d2253": { + "name": "MF1 token contract", + "address": "0x9b5161a41b58498eb9c5febf89d60714089d2253", + "token": { + "decimals": 18, + "symbol": "MF1" + }, + "isSC": {} + }, + "0xd2adc1c84443ad06f0017adca346bd9b6fc52cab": { + "name": "DFND token contract", + "address": "0xd2adc1c84443ad06f0017adca346bd9b6fc52cab", + "token": { + "decimals": 18, + "symbol": "DFND" + }, + "isSC": {} + }, + "0xd1cd47746b8e72359b28c1c84a4f6a19dc1a0ee5": { + "name": "SONIC token contract", + "address": "0xd1cd47746b8e72359b28c1c84a4f6a19dc1a0ee5", + "token": { + "decimals": 18, + "symbol": "SONIC" + }, + "isSC": {} + }, + "0xa13f0743951b4f6e3e3aa039f682e17279f52bc3": { + "name": "SENC token contract", + "address": "0xa13f0743951b4f6e3e3aa039f682e17279f52bc3", + "token": { + "decimals": 18, + "symbol": "SENC" + }, + "isSC": {} + }, + "0x910c4da718caf4ee38ce5c2490cddaeca689204e": { + "name": "WACO token contract", + "address": "0x910c4da718caf4ee38ce5c2490cddaeca689204e", + "token": { + "decimals": 18, + "symbol": "WACO" + }, + "isSC": {} + }, + "0x916c5de09cf63f6602d1e1793fb41f6437814a62": { + "name": "JACY token contract", + "address": "0x916c5de09cf63f6602d1e1793fb41f6437814a62", + "token": { + "decimals": 9, + "symbol": "JACY" + }, + "isSC": {} + }, + "0x130914e1b240a7f4c5d460b7d3a2fd3846b576fa": { + "name": "ANG token contract", + "address": "0x130914e1b240a7f4c5d460b7d3a2fd3846b576fa", + "token": { + "decimals": 18, + "symbol": "ANG" + }, + "isSC": {} + }, + "0x4e452b391a86c9240e98df7277ce0bea5be08e43": { + "name": "PAXU token contract", + "address": "0x4e452b391a86c9240e98df7277ce0bea5be08e43", + "token": { + "decimals": 18, + "symbol": "PAXU" + }, + "isSC": {} + }, + "0x3d3af44cf092a49280e316f09c8f20ecf97bc933": { + "name": "UCX token contract", + "address": "0x3d3af44cf092a49280e316f09c8f20ecf97bc933", + "token": { + "decimals": 18, + "symbol": "UCX" + }, + "isSC": {} + }, + "0xb4bd4628e6efb0cb521d9ec35050c75840320374": { + "name": "FRETH token contract", + "address": "0xb4bd4628e6efb0cb521d9ec35050c75840320374", + "token": { + "decimals": 18, + "symbol": "FRETH" + }, + "isSC": {} + }, + "0x6e109e9dd7fa1a58bc3eff667e8e41fc3cc07aef": { + "name": "CNHT token contract", + "address": "0x6e109e9dd7fa1a58bc3eff667e8e41fc3cc07aef", + "token": { + "decimals": 6, + "symbol": "CNHT" + }, + "isSC": {} + }, + "0x66580f80a00deafab4519dc33c35bf44d8a12b00": { + "name": "LQW token contract", + "address": "0x66580f80a00deafab4519dc33c35bf44d8a12b00", + "token": { + "decimals": 18, + "symbol": "LQW" + }, + "isSC": {} + }, + "0xb2fd1e0478dbf61772996bcce8a2f1151eeeda37": { + "name": "WPEPE token contract", + "address": "0xb2fd1e0478dbf61772996bcce8a2f1151eeeda37", + "token": { + "decimals": 18, + "symbol": "WPEPE" + }, + "isSC": {} + }, + "0xdf906f6fd89ce60c16baed3c96ceb08bca65ad82": { + "name": "TT token contract", + "address": "0xdf906f6fd89ce60c16baed3c96ceb08bca65ad82", + "token": { + "decimals": 18, + "symbol": "TT" + }, + "isSC": {} + }, + "0x4ece5c5cfb9b960a49aae739e15cdb6cfdcc5782": { + "name": "DBUY token contract", + "address": "0x4ece5c5cfb9b960a49aae739e15cdb6cfdcc5782", + "token": { + "decimals": 9, + "symbol": "DBUY" + }, + "isSC": {} + }, + "0x6247c86b016bc4d9ae141849c0a9eb38c004b742": { + "name": "HTL token contract", + "address": "0x6247c86b016bc4d9ae141849c0a9eb38c004b742", + "token": { + "decimals": 18, + "symbol": "HTL" + }, + "isSC": {} + }, + "0xe2f668f6166eda65620a01c4c116a5f6e5528614": { + "name": "GUSTA token contract", + "address": "0xe2f668f6166eda65620a01c4c116a5f6e5528614", + "token": { + "decimals": 18, + "symbol": "GUSTA" + }, + "isSC": {} + }, + "0xc71d8baaa436aa7e42da1f40bec48f11ab3c9e4a": { + "name": "IETH token contract", + "address": "0xc71d8baaa436aa7e42da1f40bec48f11ab3c9e4a", + "token": { + "decimals": 8, + "symbol": "IETH" + }, + "isSC": {} + }, + "0x5c59a5b139b0538cb106d775a022cad98dd14b5a": { + "name": "ORT token contract", + "address": "0x5c59a5b139b0538cb106d775a022cad98dd14b5a", + "token": { + "decimals": 18, + "symbol": "ORT" + }, + "isSC": {} + }, + "0xc3d222685f1acacddd4bf8ae566a288702252f0d": { + "name": "ROSO token contract", + "address": "0xc3d222685f1acacddd4bf8ae566a288702252f0d", + "token": { + "decimals": 18, + "symbol": "ROSO" + }, + "isSC": {} + }, + "0x0e4188bda0a92ff4fff62392211b076c0119198d": { + "name": "0XSPAI token contract", + "address": "0x0e4188bda0a92ff4fff62392211b076c0119198d", + "token": { + "decimals": 18, + "symbol": "0XSPAI" + }, + "isSC": {} + }, + "0xc0f1728d9513efc316d0e93a0758c992f88b0809": { + "name": "SWAT token contract", + "address": "0xc0f1728d9513efc316d0e93a0758c992f88b0809", + "token": { + "decimals": 8, + "symbol": "SWAT" + }, + "isSC": {} + }, + "0x2cc5c38ea9a58d360181852c9f5719b96407ed1e": { + "name": "MLORD token contract", + "address": "0x2cc5c38ea9a58d360181852c9f5719b96407ed1e", + "token": { + "decimals": 18, + "symbol": "MLORD" + }, + "isSC": {} + }, + "0x32c4adb9cf57f972bc375129de91c897b4f364f1": { + "name": "FLC token contract", + "address": "0x32c4adb9cf57f972bc375129de91c897b4f364f1", + "token": { + "decimals": 18, + "symbol": "FLC" + }, + "isSC": {} + }, + "0x492798fb464e77cb3cda62b9a2c3c65162db198e": { + "name": "AGG token contract", + "address": "0x492798fb464e77cb3cda62b9a2c3c65162db198e", + "token": { + "decimals": 18, + "symbol": "AGG" + }, + "isSC": {} + }, + "0xc6bdb96e29c38dc43f014eed44de4106a6a8eb5f": { + "name": "INUINU token contract", + "address": "0xc6bdb96e29c38dc43f014eed44de4106a6a8eb5f", + "token": { + "decimals": 18, + "symbol": "INUINU" + }, + "isSC": {} + }, + "0xbe1bea3f6e5f29648fdc88b1622785a1666246e7": { + "name": "BLOCK-0 token contract", + "address": "0xbe1bea3f6e5f29648fdc88b1622785a1666246e7", + "token": { + "decimals": 9, + "symbol": "BLOCK-0" + }, + "isSC": {} + }, + "0xff44b937788215eca197baaf9af69dbdc214aa04": { + "name": "ROCKI token contract", + "address": "0xff44b937788215eca197baaf9af69dbdc214aa04", + "token": { + "decimals": 18, + "symbol": "ROCKI" + }, + "isSC": {} + }, + "0xaac88e48767988119b84dea3fc93ceec012f3530": { + "name": "BXB token contract", + "address": "0xaac88e48767988119b84dea3fc93ceec012f3530", + "token": { + "decimals": 18, + "symbol": "BXB" + }, + "isSC": {} + }, + "0x0a693a301215aad39d83a32a5b5279f2d238851b": { + "name": "POG token contract", + "address": "0x0a693a301215aad39d83a32a5b5279f2d238851b", + "token": { + "decimals": 18, + "symbol": "POG" + }, + "isSC": {} + }, + "0x8a6d4c8735371ebaf8874fbd518b56edd66024eb": { + "name": "BLOCKS token contract", + "address": "0x8a6d4c8735371ebaf8874fbd518b56edd66024eb", + "token": { + "decimals": 18, + "symbol": "BLOCKS" + }, + "isSC": {} + }, + "0x84777600c51996b2ce92a514ff2583b7d7c2239b": { + "name": "RVUSD token contract", + "address": "0x84777600c51996b2ce92a514ff2583b7d7c2239b", + "token": { + "decimals": 18, + "symbol": "RVUSD" + }, + "isSC": {} + }, + "0x516e2758b044433371076a48127b8cfa7b0bdb43": { + "name": "SMUDGE token contract", + "address": "0x516e2758b044433371076a48127b8cfa7b0bdb43", + "token": { + "decimals": 18, + "symbol": "SMUDGE" + }, + "isSC": {} + }, + "0xd049206fb408a611e543791f2d8f102a8bc253dc": { + "name": "NAO token contract", + "address": "0xd049206fb408a611e543791f2d8f102a8bc253dc", + "token": { + "decimals": 18, + "symbol": "NAO" + }, + "isSC": {} + }, + "0x70d2b7c19352bb76e4409858ff5746e500f2b67c": { + "name": "UPI token contract", + "address": "0x70d2b7c19352bb76e4409858ff5746e500f2b67c", + "token": { + "decimals": 18, + "symbol": "UPI" + }, + "isSC": {} + }, + "0x2c9715d6d95443c3bdf29e473ad168ff6fa6627d": { + "name": "CRABS token contract", + "address": "0x2c9715d6d95443c3bdf29e473ad168ff6fa6627d", + "token": { + "decimals": 18, + "symbol": "CRABS" + }, + "isSC": {} + }, + "0x685fb6960ea7f7b24f02e17c8d893b8c33239d48": { + "name": "SAIKO token contract", + "address": "0x685fb6960ea7f7b24f02e17c8d893b8c33239d48", + "token": { + "decimals": 9, + "symbol": "SAIKO" + }, + "isSC": {} + }, + "0x86772b1409b61c639eaac9ba0acfbb6e238e5f83": { + "name": "NDX token contract", + "address": "0x86772b1409b61c639eaac9ba0acfbb6e238e5f83", + "token": { + "decimals": 18, + "symbol": "NDX" + }, + "isSC": {} + }, + "0x670ec8893da9c339d52fa70189756a92cafbe654": { + "name": "VOLDEMORT token contract", + "address": "0x670ec8893da9c339d52fa70189756a92cafbe654", + "token": { + "decimals": 18, + "symbol": "VOLDEMORT" + }, + "isSC": {} + }, + "0x7c5d5100b339fe7d995a893af6cb496b9474373c": { + "name": "LOON token contract", + "address": "0x7c5d5100b339fe7d995a893af6cb496b9474373c", + "token": { + "decimals": 18, + "symbol": "LOON" + }, + "isSC": {} + }, + "0x24bcec1afda63e622a97f17cff9a61ffcfd9b735": { + "name": "CRAB token contract", + "address": "0x24bcec1afda63e622a97f17cff9a61ffcfd9b735", + "token": { + "decimals": 18, + "symbol": "CRAB" + }, + "isSC": {} + }, + "0xfac0403a24229d7e2edd994d50f5940624cbeac2": { + "name": "THEO token contract", + "address": "0xfac0403a24229d7e2edd994d50f5940624cbeac2", + "token": { + "decimals": 9, + "symbol": "THEO" + }, + "isSC": {} + }, + "0xdfddf7a69716124bc346ba556d4b9f9e74c4a8bc": { + "name": "SCCN token contract", + "address": "0xdfddf7a69716124bc346ba556d4b9f9e74c4a8bc", + "token": { + "decimals": 18, + "symbol": "SCCN" + }, + "isSC": {} + }, + "0x26946ada5ecb57f3a1f91605050ce45c482c9eb1": { + "name": "BSOV token contract", + "address": "0x26946ada5ecb57f3a1f91605050ce45c482c9eb1", + "token": { + "decimals": 8, + "symbol": "BSOV" + }, + "isSC": {} + }, + "0xca5b0ae1d104030a9b8f879523508efd86c14483": { + "name": "BENJI token contract", + "address": "0xca5b0ae1d104030a9b8f879523508efd86c14483", + "token": { + "decimals": 18, + "symbol": "BENJI" + }, + "isSC": {} + }, + "0x39ea10e507720783c27edd5f96bf2d6e199579b8": { + "name": "HONR token contract", + "address": "0x39ea10e507720783c27edd5f96bf2d6e199579b8", + "token": { + "decimals": 18, + "symbol": "HONR" + }, + "isSC": {} + }, + "0x4dd672e77c795844fe3a464ef8ef0faae617c8fb": { + "name": "CON token contract", + "address": "0x4dd672e77c795844fe3a464ef8ef0faae617c8fb", + "token": { + "decimals": 18, + "symbol": "CON" + }, + "isSC": {} + }, + "0x8a6aca71a218301c7081d4e96d64292d3b275ce0": { + "name": "SFG token contract", + "address": "0x8a6aca71a218301c7081d4e96d64292d3b275ce0", + "token": { + "decimals": 18, + "symbol": "SFG" + }, + "isSC": {} + }, + "0x23d7ff057c696fee679c60cef61fee6614218f04": { + "name": "UNP token contract", + "address": "0x23d7ff057c696fee679c60cef61fee6614218f04", + "token": { + "decimals": 18, + "symbol": "UNP" + }, + "isSC": {} + }, + "0x40955d77f87123b71b145098358a60573ac7be96": { + "name": "DAISY token contract", + "address": "0x40955d77f87123b71b145098358a60573ac7be96", + "token": { + "decimals": 18, + "symbol": "DAISY" + }, + "isSC": {} + }, + "0xc8d1acd9ac1116f8450b375be2a3730f43e916d4": { + "name": "YOHO token contract", + "address": "0xc8d1acd9ac1116f8450b375be2a3730f43e916d4", + "token": { + "decimals": 18, + "symbol": "YOHO" + }, + "isSC": {} + }, + "0x97e19e2a5458294842036404e6a05571d8bc2fa3": { + "name": "G token contract", + "address": "0x97e19e2a5458294842036404e6a05571d8bc2fa3", + "token": { + "decimals": 18, + "symbol": "G" + }, + "isSC": {} + }, + "0x9ffc3bcde7b68c46a6dc34f0718009925c1867cb": { + "name": "HDOT token contract", + "address": "0x9ffc3bcde7b68c46a6dc34f0718009925c1867cb", + "token": { + "decimals": 18, + "symbol": "HDOT" + }, + "isSC": {} + }, + "0x570147337f1a2313fc35573f6a123ceb109eb901": { + "name": "0XF token contract", + "address": "0x570147337f1a2313fc35573f6a123ceb109eb901", + "token": { + "decimals": 9, + "symbol": "0XF" + }, + "isSC": {} + }, + "0x965d79f1a1016b574a62986e13ca8ab04dfdd15c": { + "name": "M2 token contract", + "address": "0x965d79f1a1016b574a62986e13ca8ab04dfdd15c", + "token": { + "decimals": 18, + "symbol": "M2" + }, + "isSC": {} + }, + "0x8acee0fcee91cedad1c5013f031762c814740587": { + "name": "SAUDIPEPE token contract", + "address": "0x8acee0fcee91cedad1c5013f031762c814740587", + "token": { + "decimals": 18, + "symbol": "SAUDIPEPE" + }, + "isSC": {} + }, + "0x3175df0976dfa876431c2e9ee6bc45b65d3473cc": { + "name": "CRVFRAX token contract", + "address": "0x3175df0976dfa876431c2e9ee6bc45b65d3473cc", + "token": { + "decimals": 18, + "symbol": "CRVFRAX" + }, + "isSC": {} + }, + "0x1f31dd60b84ea2a273cfc56876437e069ae80afd": { + "name": "SHINJI token contract", + "address": "0x1f31dd60b84ea2a273cfc56876437e069ae80afd", + "token": { + "decimals": 9, + "symbol": "SHINJI" + }, + "isSC": {} + }, + "0x3c4008eca800ec1283e4cf500e68d06bfabc00a8": { + "name": "HAO token contract", + "address": "0x3c4008eca800ec1283e4cf500e68d06bfabc00a8", + "token": { + "decimals": 18, + "symbol": "HAO" + }, + "isSC": {} + }, + "0x5d39957fc88566f14ae7e8ab8971d7c603f0ce5e": { + "name": "EYE token contract", + "address": "0x5d39957fc88566f14ae7e8ab8971d7c603f0ce5e", + "token": { + "decimals": 9, + "symbol": "EYE" + }, + "isSC": {} + }, + "0xa2c798f6456e4928f1e029c971007a09416a3db0": { + "name": "SOAPS token contract", + "address": "0xa2c798f6456e4928f1e029c971007a09416a3db0", + "token": { + "decimals": 9, + "symbol": "SOAPS" + }, + "isSC": {} + }, + "0x6d60a8dfb16d09f67d46fcd36a0cd310078257ca": { + "name": "CIX token contract", + "address": "0x6d60a8dfb16d09f67d46fcd36a0cd310078257ca", + "token": { + "decimals": 18, + "symbol": "CIX" + }, + "isSC": {} + }, + "0x5a0fcd6247f37154b6ab433ab72dc2ac7b3ebb8b": { + "name": "DPRK token contract", + "address": "0x5a0fcd6247f37154b6ab433ab72dc2ac7b3ebb8b", + "token": { + "decimals": 8, + "symbol": "DPRK" + }, + "isSC": {} + }, + "0xd26b94dbf1bbc840774b9d6ba7a0b9145d118589": { + "name": "TAU token contract", + "address": "0xd26b94dbf1bbc840774b9d6ba7a0b9145d118589", + "token": { + "decimals": 9, + "symbol": "TAU" + }, + "isSC": {} + }, + "0xe9f721e7419423f11863e83dbd710b5d6127b5b0": { + "name": "EPHIAT token contract", + "address": "0xe9f721e7419423f11863e83dbd710b5d6127b5b0", + "token": { + "decimals": 18, + "symbol": "EPHIAT" + }, + "isSC": {} + }, + "0x76af4cb74c8d4da51403d672a799e94b5958c230": { + "name": "GOOD token contract", + "address": "0x76af4cb74c8d4da51403d672a799e94b5958c230", + "token": { + "decimals": 9, + "symbol": "GOOD" + }, + "isSC": {} + }, + "0x5d5e244660ca05c42073c9a526616d99f2c99516": { + "name": "GTCOIN token contract", + "address": "0x5d5e244660ca05c42073c9a526616d99f2c99516", + "token": { + "decimals": 18, + "symbol": "GTCOIN" + }, + "isSC": {} + }, + "0x3632dc4d741bfa40dbf3b23b63dd3a25a3061de3": { + "name": "ENGAGE token contract", + "address": "0x3632dc4d741bfa40dbf3b23b63dd3a25a3061de3", + "token": { + "decimals": 18, + "symbol": "ENGAGE" + }, + "isSC": {} + }, + "0x1788430620960f9a70e3dc14202a3a35dde1a316": { + "name": "OAP token contract", + "address": "0x1788430620960f9a70e3dc14202a3a35dde1a316", + "token": { + "decimals": 18, + "symbol": "OAP" + }, + "isSC": {} + }, + "0xacbd826394189cf2623c6df98a18b41fc8ffc16d": { + "name": "N1 token contract", + "address": "0xacbd826394189cf2623c6df98a18b41fc8ffc16d", + "token": { + "decimals": 18, + "symbol": "N1" + }, + "isSC": {} + }, + "0xed1ddc491a2c8b1f7d6e8933580a47e124ea38db": { + "name": "IOC token contract", + "address": "0xed1ddc491a2c8b1f7d6e8933580a47e124ea38db", + "token": { + "decimals": 18, + "symbol": "IOC" + }, + "isSC": {} + }, + "0x048fe49be32adfc9ed68c37d32b5ec9df17b3603": { + "name": "Skrumble Network V2", + "address": "0x048fe49be32adfc9ed68c37d32b5ec9df17b3603", + "token": { + "decimals": 18, + "symbol": "SKM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/skm.svg" + }, + "0xc9d21e5a24110b67af31af464edfdc2dae5ec7d5": { + "name": "BTM token contract", + "address": "0xc9d21e5a24110b67af31af464edfdc2dae5ec7d5", + "token": { + "decimals": 18, + "symbol": "BTM" + }, + "isSC": {} + }, + "0x1f4cb968b76931c494ff92ed80ccb169ad641cb1": { + "name": "STF token contract", + "address": "0x1f4cb968b76931c494ff92ed80ccb169ad641cb1", + "token": { + "decimals": 18, + "symbol": "STF" + }, + "isSC": {} + }, + "0x3540dfcad7cf102a2e44aa0e2132fab1c89d7eae": { + "name": "SWAI token contract", + "address": "0x3540dfcad7cf102a2e44aa0e2132fab1c89d7eae", + "token": { + "decimals": 18, + "symbol": "SWAI" + }, + "isSC": {} + }, + "0x44c7272b212e033d71b694733c150ff8526c1a0e": { + "name": "CRM token contract", + "address": "0x44c7272b212e033d71b694733c150ff8526c1a0e", + "token": { + "decimals": 18, + "symbol": "CRM" + }, + "isSC": {} + }, + "0xe64b47931f28f89cc7a0c6965ecf89eadb4975f5": { + "name": "LUD token contract", + "address": "0xe64b47931f28f89cc7a0c6965ecf89eadb4975f5", + "token": { + "decimals": 18, + "symbol": "LUD" + }, + "isSC": {} + }, + "0xab846fb6c81370327e784ae7cbb6d6a6af6ff4bf": { + "name": "PAL token contract", + "address": "0xab846fb6c81370327e784ae7cbb6d6a6af6ff4bf", + "token": { + "decimals": 18, + "symbol": "PAL" + }, + "isSC": {} + }, + "0xdecade1c6bf2cd9fb89afad73e4a519c867adcf5": { + "name": "Experty Wisdom Token", + "address": "0xdecade1c6bf2cd9fb89afad73e4a519c867adcf5", + "token": { + "decimals": 18, + "symbol": "WIS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wisdom-token.svg" + }, + "0x09ce2b746c32528b7d864a1e3979bd97d2f095ab": { + "name": "DFL token contract", + "address": "0x09ce2b746c32528b7d864a1e3979bd97d2f095ab", + "token": { + "decimals": 18, + "symbol": "DFL" + }, + "isSC": {} + }, + "0x15f73a3ab443ee6ebf36c605c7868159ce5d028c": { + "name": "SST token contract", + "address": "0x15f73a3ab443ee6ebf36c605c7868159ce5d028c", + "token": { + "decimals": 9, + "symbol": "SST" + }, + "isSC": {} + }, + "0x13a0599c493cc502ed8c4dd26f22f5cedc248fc4": { + "name": "EMP token contract", + "address": "0x13a0599c493cc502ed8c4dd26f22f5cedc248fc4", + "token": { + "decimals": 18, + "symbol": "EMP" + }, + "isSC": {} + }, + "0xc6cd44f9630886a7492cea3d9860e0510933a600": { + "name": "CAP token contract", + "address": "0xc6cd44f9630886a7492cea3d9860e0510933a600", + "token": { + "decimals": 18, + "symbol": "CAP" + }, + "isSC": {} + }, + "0xdb298285fe4c5410b05390ca80e8fbe9de1f259b": { + "name": "FOREX token contract", + "address": "0xdb298285fe4c5410b05390ca80e8fbe9de1f259b", + "token": { + "decimals": 18, + "symbol": "FOREX" + }, + "isSC": {} + }, + "0x012e0e6342308b247f36ee500ecb14dc77a7a8c1": { + "name": "SKT token contract", + "address": "0x012e0e6342308b247f36ee500ecb14dc77a7a8c1", + "token": { + "decimals": 8, + "symbol": "SKT" + }, + "isSC": {} + }, + "0xc3071803b9d23460820b516673fd3cec0415d0ed": { + "name": "KUKU token contract", + "address": "0xc3071803b9d23460820b516673fd3cec0415d0ed", + "token": { + "decimals": 9, + "symbol": "KUKU" + }, + "isSC": {} + }, + "0x1a11ea9d61588d756d9f1014c3cf0d226aedd279": { + "name": "MILEI token contract", + "address": "0x1a11ea9d61588d756d9f1014c3cf0d226aedd279", + "token": { + "decimals": 18, + "symbol": "MILEI" + }, + "isSC": {} + }, + "0x88d50b466be55222019d71f9e8fae17f5f45fca1": { + "name": "CPT token contract", + "address": "0x88d50b466be55222019d71f9e8fae17f5f45fca1", + "token": { + "decimals": 8, + "symbol": "CPT" + }, + "isSC": {} + }, + "0x2f09757b222642c649f1f9d80798b0123fa18ba9": { + "name": "REFLEX token contract", + "address": "0x2f09757b222642c649f1f9d80798b0123fa18ba9", + "token": { + "decimals": 18, + "symbol": "REFLEX" + }, + "isSC": {} + }, + "0x8d137e3337eb1b58a222fef2b2cc7c423903d9cf": { + "name": "SQGL token contract", + "address": "0x8d137e3337eb1b58a222fef2b2cc7c423903d9cf", + "token": { + "decimals": 18, + "symbol": "SQGL" + }, + "isSC": {} + }, + "0x22987407fd1fc5a971e3fda3b3e74c88666cda91": { + "name": "SRT token contract", + "address": "0x22987407fd1fc5a971e3fda3b3e74c88666cda91", + "token": { + "decimals": 18, + "symbol": "SRT" + }, + "isSC": {} + }, + "0x8f828a0644f12fa352888e645a90333d30f6fd7d": { + "name": "RINIA token contract", + "address": "0x8f828a0644f12fa352888e645a90333d30f6fd7d", + "token": { + "decimals": 9, + "symbol": "RINIA" + }, + "isSC": {} + }, + "0x6d47a7be5d410910eef7ee2a3d34931f98f36812": { + "name": "I20 token contract", + "address": "0x6d47a7be5d410910eef7ee2a3d34931f98f36812", + "token": { + "decimals": 18, + "symbol": "I20" + }, + "isSC": {} + }, + "0xf1376bcef0f78459c0ed0ba5ddce976f1ddf51f4": { + "name": "UNIETH token contract", + "address": "0xf1376bcef0f78459c0ed0ba5ddce976f1ddf51f4", + "token": { + "decimals": 18, + "symbol": "UNIETH" + }, + "isSC": {} + }, + "0xf9d4daae1300cff251979722c4a3c45857973079": { + "name": "CASTLE token contract", + "address": "0xf9d4daae1300cff251979722c4a3c45857973079", + "token": { + "decimals": 18, + "symbol": "CASTLE" + }, + "isSC": {} + }, + "0xc0804a4eae02fdf7516f55a12990d282640a4961": { + "name": "OPL token contract", + "address": "0xc0804a4eae02fdf7516f55a12990d282640a4961", + "token": { + "decimals": 18, + "symbol": "OPL" + }, + "isSC": {} + }, + "0x47da5456bc2e1ce391b645ce80f2e97192e4976a": { + "name": "PLUG token contract", + "address": "0x47da5456bc2e1ce391b645ce80f2e97192e4976a", + "token": { + "decimals": 18, + "symbol": "PLUG" + }, + "isSC": {} + }, + "0xc1abb8c93be6811affc70675b0432926c4bfbb5d": { + "name": "UERII token contract", + "address": "0xc1abb8c93be6811affc70675b0432926c4bfbb5d", + "token": { + "decimals": 18, + "symbol": "UERII" + }, + "isSC": {} + }, + "0x9d7630adf7ab0b0cb00af747db76864df0ec82e4": { + "name": "GATE token contract", + "address": "0x9d7630adf7ab0b0cb00af747db76864df0ec82e4", + "token": { + "decimals": 18, + "symbol": "GATE" + }, + "isSC": {} + }, + "0x64c79c8c59a2be17c8d651f73e5ee7942eebdc9e": { + "name": "SCHRODINGE token contract", + "address": "0x64c79c8c59a2be17c8d651f73e5ee7942eebdc9e", + "token": { + "decimals": 18, + "symbol": "SCHRODINGE" + }, + "isSC": {} + }, + "0xc3eb2622190c57429aac3901808994443b64b466": { + "name": "ORO token contract", + "address": "0xc3eb2622190c57429aac3901808994443b64b466", + "token": { + "decimals": 18, + "symbol": "ORO" + }, + "isSC": {} + }, + "0x7968bc6a03017ea2de509aaa816f163db0f35148": { + "name": "HGET token contract", + "address": "0x7968bc6a03017ea2de509aaa816f163db0f35148", + "token": { + "decimals": 6, + "symbol": "HGET" + }, + "isSC": {} + }, + "0x7163436b8efffb469f6bb81cc908b1661d4795e6": { + "name": "Esco coin", + "address": "0x7163436b8efffb469f6bb81cc908b1661d4795e6", + "token": { + "decimals": 18, + "symbol": "ESCO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/escocoin.svg" + }, + "0x2822f6d1b2f41f93f33d937bc7d84a8dfa4f4c21": { + "name": "QQQ token contract", + "address": "0x2822f6d1b2f41f93f33d937bc7d84a8dfa4f4c21", + "token": { + "decimals": 18, + "symbol": "QQQ" + }, + "isSC": {} + }, + "0x434cb4fc4b952872967914d430878eee53ebd502": { + "name": "APCG token contract", + "address": "0x434cb4fc4b952872967914d430878eee53ebd502", + "token": { + "decimals": 18, + "symbol": "APCG" + }, + "isSC": {} + }, + "0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d": { + "name": "ADAI token contract", + "address": "0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d", + "token": { + "decimals": 18, + "symbol": "ADAI" + }, + "isSC": {} + }, + "0x64551fa4093c2d6c298cf1792740f884084a8f69": { + "name": "SPGBB token contract", + "address": "0x64551fa4093c2d6c298cf1792740f884084a8f69", + "token": { + "decimals": 18, + "symbol": "SPGBB" + }, + "isSC": {} + }, + "0x84c722e6f1363e8d5c6db3ea600bef9a006da824": { + "name": "MSB token contract", + "address": "0x84c722e6f1363e8d5c6db3ea600bef9a006da824", + "token": { + "decimals": 18, + "symbol": "MSB" + }, + "isSC": {} + }, + "0x2dd1b9410c73e16b60240e529e38e30425f00d4e": { + "name": "PACHA token contract", + "address": "0x2dd1b9410c73e16b60240e529e38e30425f00d4e", + "token": { + "decimals": 10, + "symbol": "PACHA" + }, + "isSC": {} + }, + "0x34bdf48a8f753de4822a6cfb1fee275f9b4d662e": { + "name": "BKC token contract", + "address": "0x34bdf48a8f753de4822a6cfb1fee275f9b4d662e", + "token": { + "decimals": 18, + "symbol": "BKC" + }, + "isSC": {} + }, + "0x795a7e7a0f6b84ee1f2bc9e70a74dbbb49cef9a3": { + "name": "INU token contract", + "address": "0x795a7e7a0f6b84ee1f2bc9e70a74dbbb49cef9a3", + "token": { + "decimals": 18, + "symbol": "INU" + }, + "isSC": {} + }, + "0x07ef9e82721ac16809d24dafbe1792ce01654db4": { + "name": "BNANA token contract", + "address": "0x07ef9e82721ac16809d24dafbe1792ce01654db4", + "token": { + "decimals": 18, + "symbol": "BNANA" + }, + "isSC": {} + }, + "0x425d105913a04f4f95311788195ba13c3e82c3b9": { + "name": "APOLLO token contract", + "address": "0x425d105913a04f4f95311788195ba13c3e82c3b9", + "token": { + "decimals": 9, + "symbol": "APOLLO" + }, + "isSC": {} + }, + "0xe7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd": { + "name": "NFTL token contract", + "address": "0xe7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd", + "token": { + "decimals": 18, + "symbol": "NFTL" + }, + "isSC": {} + }, + "0x275f5ad03be0fa221b4c6649b8aee09a42d9412a": { + "name": "MONA token contract", + "address": "0x275f5ad03be0fa221b4c6649b8aee09a42d9412a", + "token": { + "decimals": 18, + "symbol": "MONA" + }, + "isSC": {} + }, + "0x43d4a3cd90ddd2f8f4f693170c9c8098163502ad": { + "name": "D2D token contract", + "address": "0x43d4a3cd90ddd2f8f4f693170c9c8098163502ad", + "token": { + "decimals": 18, + "symbol": "D2D" + }, + "isSC": {} + }, + "0xa4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016": { + "name": "1MIL token contract", + "address": "0xa4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016", + "token": { + "decimals": 18, + "symbol": "1MIL" + }, + "isSC": {} + }, + "0x675ababd3a210566a5e213547523b740be80041a": { + "name": "ENT token contract", + "address": "0x675ababd3a210566a5e213547523b740be80041a", + "token": { + "decimals": 18, + "symbol": "ENT" + }, + "isSC": {} + }, + "0xffe510a92434a0df346c5e72a3494b043cf249eb": { + "name": "LBXC token contract", + "address": "0xffe510a92434a0df346c5e72a3494b043cf249eb", + "token": { + "decimals": 18, + "symbol": "LBXC" + }, + "isSC": {} + }, + "0x6570ffe19da7e2b425329b157d9109b87f18304b": { + "name": "UNM token contract", + "address": "0x6570ffe19da7e2b425329b157d9109b87f18304b", + "token": { + "decimals": 18, + "symbol": "UNM" + }, + "isSC": {} + }, + "0x1d6405138a335ce5fd7364086334efb3e4f28b59": { + "name": "CCX token contract", + "address": "0x1d6405138a335ce5fd7364086334efb3e4f28b59", + "token": { + "decimals": 18, + "symbol": "CCX" + }, + "isSC": {} + }, + "0xef952363c1d990a2fa58f8b379a9fa33bad1dfd1": { + "name": "LYNK token contract", + "address": "0xef952363c1d990a2fa58f8b379a9fa33bad1dfd1", + "token": { + "decimals": 8, + "symbol": "LYNK" + }, + "isSC": {} + }, + "0xe03b2642a5111ad0efc0cbce766498c2dd562ae9": { + "name": "BC token contract", + "address": "0xe03b2642a5111ad0efc0cbce766498c2dd562ae9", + "token": { + "decimals": 9, + "symbol": "BC" + }, + "isSC": {} + }, + "0x8423b76be8ef6ca7400a6b4c334d29c1d5d4572c": { + "name": "INU token contract", + "address": "0x8423b76be8ef6ca7400a6b4c334d29c1d5d4572c", + "token": { + "decimals": 8, + "symbol": "INU" + }, + "isSC": {} + }, + "0xa3a80559bbc1989654e6b8385f5001fa1333332f": { + "name": "RZR token contract", + "address": "0xa3a80559bbc1989654e6b8385f5001fa1333332f", + "token": { + "decimals": 18, + "symbol": "RZR" + }, + "isSC": {} + }, + "0x2942e3b38e33123965bfbc21e802be943a76bbc6": { + "name": "EHASH token contract", + "address": "0x2942e3b38e33123965bfbc21e802be943a76bbc6", + "token": { + "decimals": 18, + "symbol": "EHASH" + }, + "isSC": {} + }, + "0x8442e0e292186854bb6875b2a0fc1308b9ded793": { + "name": "PP token contract", + "address": "0x8442e0e292186854bb6875b2a0fc1308b9ded793", + "token": { + "decimals": 9, + "symbol": "PP" + }, + "isSC": {} + }, + "0x7aa2f174fbc4d0a17b34adfb9b3e1dc029b46d76": { + "name": "RADA token contract", + "address": "0x7aa2f174fbc4d0a17b34adfb9b3e1dc029b46d76", + "token": { + "decimals": 18, + "symbol": "RADA" + }, + "isSC": {} + }, + "0x987041fb536942bbc686ad7dbc7046d277881fee": { + "name": "FSNIPE token contract", + "address": "0x987041fb536942bbc686ad7dbc7046d277881fee", + "token": { + "decimals": 18, + "symbol": "FSNIPE" + }, + "isSC": {} + }, + "0x503cd987998824192578d0d7950148445667287c": { + "name": "FOG token contract", + "address": "0x503cd987998824192578d0d7950148445667287c", + "token": { + "decimals": 18, + "symbol": "FOG" + }, + "isSC": {} + }, + "0xd2d6158683aee4cc838067727209a0aaf4359de3": { + "name": "BNTY token contract", + "address": "0xd2d6158683aee4cc838067727209a0aaf4359de3", + "token": { + "decimals": 18, + "symbol": "BNTY" + }, + "isSC": {} + }, + "0x29ceddcf0da3c1d8068a7dfbd0fb06c2e438ff70": { + "name": "FREL token contract", + "address": "0x29ceddcf0da3c1d8068a7dfbd0fb06c2e438ff70", + "token": { + "decimals": 18, + "symbol": "FREL" + }, + "isSC": {} + }, + "0x38e491a71291cd43e8de63b7253e482622184894": { + "name": "AAMMUNISNXWETH token contract", + "address": "0x38e491a71291cd43e8de63b7253e482622184894", + "token": { + "decimals": 18, + "symbol": "AAMMUNISNXWETH" + }, + "isSC": {} + }, + "0xec681f28f4561c2a9534799aa38e0d36a83cf478": { + "name": "YVS token contract", + "address": "0xec681f28f4561c2a9534799aa38e0d36a83cf478", + "token": { + "decimals": 18, + "symbol": "YVS" + }, + "isSC": {} + }, + "0x4f14cdbd815b79e9624121f564f24685c6b1211b": { + "name": "ANFD token contract", + "address": "0x4f14cdbd815b79e9624121f564f24685c6b1211b", + "token": { + "decimals": 18, + "symbol": "ANFD" + }, + "isSC": {} + }, + "0x351caa9045d65107b9d311d922d15887cfd634e4": { + "name": "ARW token contract", + "address": "0x351caa9045d65107b9d311d922d15887cfd634e4", + "token": { + "decimals": 18, + "symbol": "ARW" + }, + "isSC": {} + }, + "0x77a90b04d64189d4d09508612c09219bc6816bdc": { + "name": "TOSHI token contract", + "address": "0x77a90b04d64189d4d09508612c09219bc6816bdc", + "token": { + "decimals": 9, + "symbol": "TOSHI" + }, + "isSC": {} + }, + "0x6628606c321faf52b7230a57b26c01b19aa68e82": { + "name": "BT token contract", + "address": "0x6628606c321faf52b7230a57b26c01b19aa68e82", + "token": { + "decimals": 18, + "symbol": "BT" + }, + "isSC": {} + }, + "0x343c6de13833bc7d9890eb6b1cd3fbebc730ebec": { + "name": "DACT token contract", + "address": "0x343c6de13833bc7d9890eb6b1cd3fbebc730ebec", + "token": { + "decimals": 9, + "symbol": "DACT" + }, + "isSC": {} + }, + "0xe65cdb6479bac1e22340e4e755fae7e509ecd06c": { + "name": "CAAVE token contract", + "address": "0xe65cdb6479bac1e22340e4e755fae7e509ecd06c", + "token": { + "decimals": 8, + "symbol": "CAAVE" + }, + "isSC": {} + }, + "0x1b8568fbb47708e9e9d31ff303254f748805bf21": { + "name": "SCX token contract", + "address": "0x1b8568fbb47708e9e9d31ff303254f748805bf21", + "token": { + "decimals": 18, + "symbol": "SCX" + }, + "isSC": {} + }, + "0x577fee283e776eec29c9e4d258431982780a38a8": { + "name": "PEPA token contract", + "address": "0x577fee283e776eec29c9e4d258431982780a38a8", + "token": { + "decimals": 9, + "symbol": "PEPA" + }, + "isSC": {} + }, + "0x358bd0d980e031e23eba9aa793926857703783bd": { + "name": "AAMMBPTWBTCWETH token contract", + "address": "0x358bd0d980e031e23eba9aa793926857703783bd", + "token": { + "decimals": 18, + "symbol": "AAMMBPTWBTCWETH" + }, + "isSC": {} + }, + "0x4a3fe75762017db0ed73a71c9a06db7768db5e66": { + "name": "YVCOMP token contract", + "address": "0x4a3fe75762017db0ed73a71c9a06db7768db5e66", + "token": { + "decimals": 18, + "symbol": "YVCOMP" + }, + "isSC": {} + }, + "0xda8263d8ce3f726233f8b5585bcb86a3120a58b6": { + "name": "DOGC token contract", + "address": "0xda8263d8ce3f726233f8b5585bcb86a3120a58b6", + "token": { + "decimals": 18, + "symbol": "DOGC" + }, + "isSC": {} + }, + "0x4e432a62733a7ee38ad2e16b3cc0731457ea5b55": { + "name": "QDT token contract", + "address": "0x4e432a62733a7ee38ad2e16b3cc0731457ea5b55", + "token": { + "decimals": 4, + "symbol": "QDT" + }, + "isSC": {} + }, + "0xd26a9c3437f7d121098c8c05c7413f5cc70bb070": { + "name": "AZUM token contract", + "address": "0xd26a9c3437f7d121098c8c05c7413f5cc70bb070", + "token": { + "decimals": 18, + "symbol": "AZUM" + }, + "isSC": {} + }, + "0x536381a8628dbcc8c70ac9a30a7258442eab4c92": { + "name": "Pantos Token ", + "address": "0x536381a8628dbcc8c70ac9a30a7258442eab4c92", + "token": { + "decimals": 8, + "symbol": "PAN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pan.svg" + }, + "0x7a41e0517a5eca4fdbc7fbeba4d4c47b9ff6dc63": { + "name": "ZSC token contract", + "address": "0x7a41e0517a5eca4fdbc7fbeba4d4c47b9ff6dc63", + "token": { + "decimals": 18, + "symbol": "ZSC" + }, + "isSC": {} + }, + "0xdf35988d795d90711e785b488bb2127692e6f956": { + "name": "BABYFLOKI token contract", + "address": "0xdf35988d795d90711e785b488bb2127692e6f956", + "token": { + "decimals": 9, + "symbol": "BABYFLOKI" + }, + "isSC": {} + }, + "0x16b0a1a87ae8af5c792fabc429c4fe248834842b": { + "name": "ALG token contract", + "address": "0x16b0a1a87ae8af5c792fabc429c4fe248834842b", + "token": { + "decimals": 18, + "symbol": "ALG" + }, + "isSC": {} + }, + "0xe45dfc26215312edc131e34ea9299fbca53275ca": { + "name": "REL token contract", + "address": "0xe45dfc26215312edc131e34ea9299fbca53275ca", + "token": { + "decimals": 18, + "symbol": "REL" + }, + "isSC": {} + }, + "0xc8d3dcb63c38607cb0c9d3f55e8ecce628a01c36": { + "name": "MATRIX token contract", + "address": "0xc8d3dcb63c38607cb0c9d3f55e8ecce628a01c36", + "token": { + "decimals": 18, + "symbol": "MATRIX" + }, + "isSC": {} + }, + "0x56de8bc61346321d4f2211e3ac3c0a7f00db9b76": { + "name": "RENA token contract", + "address": "0x56de8bc61346321d4f2211e3ac3c0a7f00db9b76", + "token": { + "decimals": 18, + "symbol": "RENA" + }, + "isSC": {} + }, + "0x525794473f7ab5715c81d06d10f52d11cc052804": { + "name": "TSHP token contract", + "address": "0x525794473f7ab5715c81d06d10f52d11cc052804", + "token": { + "decimals": 18, + "symbol": "TSHP" + }, + "isSC": {} + }, + "0x2904b9b16652d7d0408eccfa23a19d4a3358230f": { + "name": "PURE token contract", + "address": "0x2904b9b16652d7d0408eccfa23a19d4a3358230f", + "token": { + "decimals": 18, + "symbol": "PURE" + }, + "isSC": {} + }, + "0xf8ad7dfe656188a23e89da09506adf7ad9290d5d": { + "name": "BLY token contract", + "address": "0xf8ad7dfe656188a23e89da09506adf7ad9290d5d", + "token": { + "decimals": 18, + "symbol": "BLY" + }, + "isSC": {} + }, + "0x37f678ad6221a0fd71cda0eca19c8802f4cabf44": { + "name": "YUKKY token contract", + "address": "0x37f678ad6221a0fd71cda0eca19c8802f4cabf44", + "token": { + "decimals": 18, + "symbol": "YUKKY" + }, + "isSC": {} + }, + "0x01eeffcd9a10266ed00946121df097eed173b43d": { + "name": "XD token contract", + "address": "0x01eeffcd9a10266ed00946121df097eed173b43d", + "token": { + "decimals": 18, + "symbol": "XD" + }, + "isSC": {} + }, + "0x5579699a6e1da7d924d3bfde38a427be5fc93812": { + "name": "GODBOT token contract", + "address": "0x5579699a6e1da7d924d3bfde38a427be5fc93812", + "token": { + "decimals": 9, + "symbol": "GODBOT" + }, + "isSC": {} + }, + "0xf5717f5df41ea67ef67dfd3c1d02f9940bcf5d08": { + "name": "SNN token contract", + "address": "0xf5717f5df41ea67ef67dfd3c1d02f9940bcf5d08", + "token": { + "decimals": 3, + "symbol": "SNN" + }, + "isSC": {} + }, + "0x3209d14ff61766359e64aceff91877cec2ad968e": { + "name": "CUP token contract", + "address": "0x3209d14ff61766359e64aceff91877cec2ad968e", + "token": { + "decimals": 18, + "symbol": "CUP" + }, + "isSC": {} + }, + "0xf1e345ea7c33fd6c05f5512a780eb5839ee31674": { + "name": "TELE token contract", + "address": "0xf1e345ea7c33fd6c05f5512a780eb5839ee31674", + "token": { + "decimals": 18, + "symbol": "TELE" + }, + "isSC": {} + }, + "0x7cb683151a83c2b10a30cbb003cda9996228a2ba": { + "name": "IYKYK token contract", + "address": "0x7cb683151a83c2b10a30cbb003cda9996228a2ba", + "token": { + "decimals": 18, + "symbol": "IYKYK" + }, + "isSC": {} + }, + "0x6a8fee0e33cb65a7e8d21badca62e87639ef74b3": { + "name": "PDX token contract", + "address": "0x6a8fee0e33cb65a7e8d21badca62e87639ef74b3", + "token": { + "decimals": 18, + "symbol": "PDX" + }, + "isSC": {} + }, + "0x8f081eb884fd47b79536d28e2dd9d4886773f783": { + "name": "BECOIN token contract", + "address": "0x8f081eb884fd47b79536d28e2dd9d4886773f783", + "token": { + "decimals": 6, + "symbol": "BECOIN" + }, + "isSC": {} + }, + "0x87fdd1e031b356bdc1c55a3231cfe266552d8284": { + "name": "PBMC token contract", + "address": "0x87fdd1e031b356bdc1c55a3231cfe266552d8284", + "token": { + "decimals": 14, + "symbol": "PBMC" + }, + "isSC": {} + }, + "0x4ce4c025692b3142dbde1cd432ef55b9a8d18701": { + "name": "DCNT token contract", + "address": "0x4ce4c025692b3142dbde1cd432ef55b9a8d18701", + "token": { + "decimals": 9, + "symbol": "DCNT" + }, + "isSC": {} + }, + "0x3c37577f1de12046aea6975862559a50d8f50158": { + "name": "ETHC token contract", + "address": "0x3c37577f1de12046aea6975862559a50d8f50158", + "token": { + "decimals": 18, + "symbol": "ETHC" + }, + "isSC": {} + }, + "0x98e35f5599b57998900e5e0675721c90a5499327": { + "name": "BUDDY token contract", + "address": "0x98e35f5599b57998900e5e0675721c90a5499327", + "token": { + "decimals": 9, + "symbol": "BUDDY" + }, + "isSC": {} + }, + "0x65a8fba02f641a13bb7b01d5e1129b0521004f52": { + "name": "AMAS token contract", + "address": "0x65a8fba02f641a13bb7b01d5e1129b0521004f52", + "token": { + "decimals": 18, + "symbol": "AMAS" + }, + "isSC": {} + }, + "0xd54619e0b9899d74cc9b981354eb6b59732c43b1": { + "name": "GLR token contract", + "address": "0xd54619e0b9899d74cc9b981354eb6b59732c43b1", + "token": { + "decimals": 18, + "symbol": "GLR" + }, + "isSC": {} + }, + "0xc73c167e7a4ba109e4052f70d5466d0c312a344d": { + "name": "SANSHU token contract", + "address": "0xc73c167e7a4ba109e4052f70d5466d0c312a344d", + "token": { + "decimals": 9, + "symbol": "SANSHU" + }, + "isSC": {} + }, + "0xda30f261a962d5aae94c9ecd170544600d193766": { + "name": "ORBR token contract", + "address": "0xda30f261a962d5aae94c9ecd170544600d193766", + "token": { + "decimals": 18, + "symbol": "ORBR" + }, + "isSC": {} + }, + "0xd9dcd611bed2be9a4700c725a3810870b9bff094": { + "name": "PWR token contract", + "address": "0xd9dcd611bed2be9a4700c725a3810870b9bff094", + "token": { + "decimals": 18, + "symbol": "PWR" + }, + "isSC": {} + }, + "0xbd04ccc050058a6a422851fa6c0f92bb65eb06ca": { + "name": "PRTG token contract", + "address": "0xbd04ccc050058a6a422851fa6c0f92bb65eb06ca", + "token": { + "decimals": 18, + "symbol": "PRTG" + }, + "isSC": {} + }, + "0x0c943300d604c732117db2755873a0a0683ee7a9": { + "name": "PDF token contract", + "address": "0x0c943300d604c732117db2755873a0a0683ee7a9", + "token": { + "decimals": 18, + "symbol": "PDF" + }, + "isSC": {} + }, + "0x636d585f40a7a445da7403fcf92e03f89dc3ebd0": { + "name": "PEPEGPT token contract", + "address": "0x636d585f40a7a445da7403fcf92e03f89dc3ebd0", + "token": { + "decimals": 18, + "symbol": "PEPEGPT" + }, + "isSC": {} + }, + "0xd4d4b7b55b30fb096c30ad202e746d010b47dc30": { + "name": "ABC token contract", + "address": "0xd4d4b7b55b30fb096c30ad202e746d010b47dc30", + "token": { + "decimals": 18, + "symbol": "ABC" + }, + "isSC": {} + }, + "0xa6586e19ef681b1ac0ed3d46413d199a555dbb95": { + "name": "LETSGO token contract", + "address": "0xa6586e19ef681b1ac0ed3d46413d199a555dbb95", + "token": { + "decimals": 18, + "symbol": "LETSGO" + }, + "isSC": {} + }, + "0x60e683c6514edd5f758a55b6f393bebbafaa8d5e": { + "name": "PAGE token contract", + "address": "0x60e683c6514edd5f758a55b6f393bebbafaa8d5e", + "token": { + "decimals": 8, + "symbol": "PAGE" + }, + "isSC": {} + }, + "0xf9c5ce0c5fa29b487b7329bb92d8e473c386f82b": { + "name": "WBOT token contract", + "address": "0xf9c5ce0c5fa29b487b7329bb92d8e473c386f82b", + "token": { + "decimals": 9, + "symbol": "WBOT" + }, + "isSC": {} + }, + "0x89fb927240750c1b15d4743cd58440fc5f14a11c": { + "name": "ATT token contract", + "address": "0x89fb927240750c1b15d4743cd58440fc5f14a11c", + "token": { + "decimals": 18, + "symbol": "ATT" + }, + "isSC": {} + }, + "0x4dd28568d05f09b02220b09c2cb307bfd837cb95": { + "name": "PRINTS token contract", + "address": "0x4dd28568d05f09b02220b09c2cb307bfd837cb95", + "token": { + "decimals": 18, + "symbol": "PRINTS" + }, + "isSC": {} + }, + "0xf4cc8237fc85f54b64975142ec71a9554ecf4c61": { + "name": "VS token contract", + "address": "0xf4cc8237fc85f54b64975142ec71a9554ecf4c61", + "token": { + "decimals": 18, + "symbol": "VS" + }, + "isSC": {} + }, + "0x03042ae6fcfd53e3a0baa1fab5ce70e0cb74e6fb": { + "name": "TBC token contract", + "address": "0x03042ae6fcfd53e3a0baa1fab5ce70e0cb74e6fb", + "token": { + "decimals": 18, + "symbol": "TBC" + }, + "isSC": {} + }, + "0x9eec1a4814323a7396c938bc86aec46b97f1bd82": { + "name": "TOKU token contract", + "address": "0x9eec1a4814323a7396c938bc86aec46b97f1bd82", + "token": { + "decimals": 18, + "symbol": "TOKU" + }, + "isSC": {} + }, + "0xbe74a95d159e8e323b8c1a70f825efc85fed27c4": { + "name": "SG token contract", + "address": "0xbe74a95d159e8e323b8c1a70f825efc85fed27c4", + "token": { + "decimals": 18, + "symbol": "SG" + }, + "isSC": {} + }, + "0x9ed1439d328647bdb148c20316ea024c719a735b": { + "name": "LT token contract", + "address": "0x9ed1439d328647bdb148c20316ea024c719a735b", + "token": { + "decimals": 18, + "symbol": "LT" + }, + "isSC": {} + }, + "0xfb5453340c03db5ade474b27e68b6a9c6b2823eb": { + "name": "ROBOT token contract", + "address": "0xfb5453340c03db5ade474b27e68b6a9c6b2823eb", + "token": { + "decimals": 18, + "symbol": "ROBOT" + }, + "isSC": {} + }, + "0xac0968a3e2020ac8ca83e60ccf69081ebc6d3bc3": { + "name": "CIND token contract", + "address": "0xac0968a3e2020ac8ca83e60ccf69081ebc6d3bc3", + "token": { + "decimals": 18, + "symbol": "CIND" + }, + "isSC": {} + }, + "0x857d4d47a707cb4e409e14ac63b2e79114acd102": { + "name": "TITR token contract", + "address": "0x857d4d47a707cb4e409e14ac63b2e79114acd102", + "token": { + "decimals": 18, + "symbol": "TITR" + }, + "isSC": {} + }, + "0x4ce9975a510d9b02ecca7541bc94c5530c1b1929": { + "name": "ADAO token contract", + "address": "0x4ce9975a510d9b02ecca7541bc94c5530c1b1929", + "token": { + "decimals": 18, + "symbol": "ADAO" + }, + "isSC": {} + }, + "0xe1a70b24e109f7a8b39806c554e123efc6769e91": { + "name": "LSDAI token contract", + "address": "0xe1a70b24e109f7a8b39806c554e123efc6769e91", + "token": { + "decimals": 18, + "symbol": "LSDAI" + }, + "isSC": {} + }, + "0xefab7248d36585e2340e5d25f8a8d243e6e3193f": { + "name": "DACXI token contract", + "address": "0xefab7248d36585e2340e5d25f8a8d243e6e3193f", + "token": { + "decimals": 18, + "symbol": "DACXI" + }, + "isSC": {} + }, + "0xe59d2ff6995a926a574390824a657eed36801e55": { + "name": "AAMMUNIAAVEWETH token contract", + "address": "0xe59d2ff6995a926a574390824a657eed36801e55", + "token": { + "decimals": 18, + "symbol": "AAMMUNIAAVEWETH" + }, + "isSC": {} + }, + "0xed0889f7e1c7c7267407222be277e1f1ef4d4892": { + "name": "MEL token contract", + "address": "0xed0889f7e1c7c7267407222be277e1f1ef4d4892", + "token": { + "decimals": 18, + "symbol": "MEL" + }, + "isSC": {} + }, + "0xf8483e2d6560585c02d46bf7b3186bf154a96166": { + "name": "ICH token contract", + "address": "0xf8483e2d6560585c02d46bf7b3186bf154a96166", + "token": { + "decimals": 8, + "symbol": "ICH" + }, + "isSC": {} + }, + "0x16587cf43f044aba0165ffa00acf412631194e4b": { + "name": "SRC token contract", + "address": "0x16587cf43f044aba0165ffa00acf412631194e4b", + "token": { + "decimals": 18, + "symbol": "SRC" + }, + "isSC": {} + }, + "0xfb559ce67ff522ec0b9ba7f5dc9dc7ef6c139803": { + "name": "PROB token contract", + "address": "0xfb559ce67ff522ec0b9ba7f5dc9dc7ef6c139803", + "token": { + "decimals": 18, + "symbol": "PROB" + }, + "isSC": {} + }, + "0xfa4baa6951b6ee382e9ff9af2d523278b99ca6d0": { + "name": "HOUSE token contract", + "address": "0xfa4baa6951b6ee382e9ff9af2d523278b99ca6d0", + "token": { + "decimals": 18, + "symbol": "HOUSE" + }, + "isSC": {} + }, + "0xb2114e5420927932666a5c5bd1ac4e14d9ede32b": { + "name": "PIG20 token contract", + "address": "0xb2114e5420927932666a5c5bd1ac4e14d9ede32b", + "token": { + "decimals": 9, + "symbol": "PIG20" + }, + "isSC": {} + }, + "0xf028adee51533b1b47beaa890feb54a457f51e89": { + "name": "BMT token contract", + "address": "0xf028adee51533b1b47beaa890feb54a457f51e89", + "token": { + "decimals": 18, + "symbol": "BMT" + }, + "isSC": {} + }, + "0x032c3ec6d4c894844fd855874062a86592801cc9": { + "name": "CONVERGE token contract", + "address": "0x032c3ec6d4c894844fd855874062a86592801cc9", + "token": { + "decimals": 18, + "symbol": "CONVERGE" + }, + "isSC": {} + }, + "0xaa99199d1e9644b588796f3215089878440d58e0": { + "name": "ALPHR token contract", + "address": "0xaa99199d1e9644b588796f3215089878440d58e0", + "token": { + "decimals": 18, + "symbol": "ALPHR" + }, + "isSC": {} + }, + "0x9c0bd34bebc33a0e898554cfc91e8a84c728bf9f": { + "name": "PISS token contract", + "address": "0x9c0bd34bebc33a0e898554cfc91e8a84c728bf9f", + "token": { + "decimals": 18, + "symbol": "PISS" + }, + "isSC": {} + }, + "0x692accdd8b86692427e0aa4752ae917df01cc56f": { + "name": "SUNC token contract", + "address": "0x692accdd8b86692427e0aa4752ae917df01cc56f", + "token": { + "decimals": 18, + "symbol": "SUNC" + }, + "isSC": {} + }, + "0x3543638ed4a9006e4840b105944271bcea15605d": { + "name": "UUU token contract", + "address": "0x3543638ed4a9006e4840b105944271bcea15605d", + "token": { + "decimals": 18, + "symbol": "UUU" + }, + "isSC": {} + }, + "0xd779eea9936b4e323cddff2529eb6f13d0a4d66e": { + "name": "ENTR token contract", + "address": "0xd779eea9936b4e323cddff2529eb6f13d0a4d66e", + "token": { + "decimals": 18, + "symbol": "ENTR" + }, + "isSC": {} + }, + "0x15c65da8309153d4d0edb47041555f155d5e4933": { + "name": "PRF token contract", + "address": "0x15c65da8309153d4d0edb47041555f155d5e4933", + "token": { + "decimals": 18, + "symbol": "PRF" + }, + "isSC": {} + }, + "0x99c6e435ec259a7e8d65e1955c9423db624ba54c": { + "name": "FMT token contract", + "address": "0x99c6e435ec259a7e8d65e1955c9423db624ba54c", + "token": { + "decimals": 18, + "symbol": "FMT" + }, + "isSC": {} + }, + "0x6f8b23296394d20ec048fbdec8ebc0ca90f5c8f1": { + "name": "TUF token contract", + "address": "0x6f8b23296394d20ec048fbdec8ebc0ca90f5c8f1", + "token": { + "decimals": 18, + "symbol": "TUF" + }, + "isSC": {} + }, + "0x517abf1fcdbd76bc75b532683ada9113e313a128": { + "name": "DOKE token contract", + "address": "0x517abf1fcdbd76bc75b532683ada9113e313a128", + "token": { + "decimals": 9, + "symbol": "DOKE" + }, + "isSC": {} + }, + "0x6c3be406174349cfa4501654313d97e6a31072e1": { + "name": "CNNS token contract", + "address": "0x6c3be406174349cfa4501654313d97e6a31072e1", + "token": { + "decimals": 18, + "symbol": "CNNS" + }, + "isSC": {} + }, + "0x3cbb7f5d7499af626026e96a2f05df806f2200dc": { + "name": "PANDA token contract", + "address": "0x3cbb7f5d7499af626026e96a2f05df806f2200dc", + "token": { + "decimals": 18, + "symbol": "PANDA" + }, + "isSC": {} + }, + "0x8eb1779a32678452eb273a22d413207299904d90": { + "name": "POCHI token contract", + "address": "0x8eb1779a32678452eb273a22d413207299904d90", + "token": { + "decimals": 18, + "symbol": "POCHI" + }, + "isSC": {} + }, + "0x651e44d0df89055c00513d0efb9e8d1a0c843378": { + "name": "HAPPY token contract", + "address": "0x651e44d0df89055c00513d0efb9e8d1a0c843378", + "token": { + "decimals": 18, + "symbol": "HAPPY" + }, + "isSC": {} + }, + "0xfc4b8ed459e00e5400be803a9bb3954234fd50e3": { + "name": "AWBTC token contract", + "address": "0xfc4b8ed459e00e5400be803a9bb3954234fd50e3", + "token": { + "decimals": 8, + "symbol": "AWBTC" + }, + "isSC": {} + }, + "0x61f7fdaae910f3ed65fb1a3ab59354e38b06cf8e": { + "name": "BTCPEP token contract", + "address": "0x61f7fdaae910f3ed65fb1a3ab59354e38b06cf8e", + "token": { + "decimals": 18, + "symbol": "BTCPEP" + }, + "isSC": {} + }, + "0xc502002aeb1b9309fccb016adf50507987fc6c2b": { + "name": "GNFT token contract", + "address": "0xc502002aeb1b9309fccb016adf50507987fc6c2b", + "token": { + "decimals": 18, + "symbol": "GNFT" + }, + "isSC": {} + }, + "0x3af5ba94c29a8407785f5f6d90ef5d69a8eb2436": { + "name": "UWBTC token contract", + "address": "0x3af5ba94c29a8407785f5f6d90ef5d69a8eb2436", + "token": { + "decimals": 8, + "symbol": "UWBTC" + }, + "isSC": {} + }, + "0x2ecba91da63c29ea80fbe7b52632ca2d1f8e5be0": { + "name": "FERC token contract", + "address": "0x2ecba91da63c29ea80fbe7b52632ca2d1f8e5be0", + "token": { + "decimals": 18, + "symbol": "FERC" + }, + "isSC": {} + }, + "0x469084939d1c20fae3c73704fe963941c51be863": { + "name": "VIS token contract", + "address": "0x469084939d1c20fae3c73704fe963941c51be863", + "token": { + "decimals": 18, + "symbol": "VIS" + }, + "isSC": {} + }, + "0xbc8e35221904f61b4200ca44a08e4dac387ac83a": { + "name": "BERC token contract", + "address": "0xbc8e35221904f61b4200ca44a08e4dac387ac83a", + "token": { + "decimals": 18, + "symbol": "BERC" + }, + "isSC": {} + }, + "0xd2ce625515600b7799a5750a853ec8d2a44fbe27": { + "name": "SUGAR token contract", + "address": "0xd2ce625515600b7799a5750a853ec8d2a44fbe27", + "token": { + "decimals": 9, + "symbol": "SUGAR" + }, + "isSC": {} + }, + "0x6d1dc3928604b00180bb570bdae94b9698d33b79": { + "name": "UCT token contract", + "address": "0x6d1dc3928604b00180bb570bdae94b9698d33b79", + "token": { + "decimals": 18, + "symbol": "UCT" + }, + "isSC": {} + }, + "0x4d40ea8fab99544a64c6b7c2c98dd19d7bc170a7": { + "name": "XFBOT token contract", + "address": "0x4d40ea8fab99544a64c6b7c2c98dd19d7bc170a7", + "token": { + "decimals": 18, + "symbol": "XFBOT" + }, + "isSC": {} + }, + "0x866f8a50a64e68ca66e97e032c5da99538b3f942": { + "name": "EBSO token contract", + "address": "0x866f8a50a64e68ca66e97e032c5da99538b3f942", + "token": { + "decimals": 4, + "symbol": "EBSO" + }, + "isSC": {} + }, + "0x9d409a0a012cfba9b15f6d4b36ac57a46966ab9a": { + "name": "YVBOOST token contract", + "address": "0x9d409a0a012cfba9b15f6d4b36ac57a46966ab9a", + "token": { + "decimals": 18, + "symbol": "YVBOOST" + }, + "isSC": {} + }, + "0x9a0df129e798438a8ad995368bd82baa7eee8913": { + "name": "BEEP token contract", + "address": "0x9a0df129e798438a8ad995368bd82baa7eee8913", + "token": { + "decimals": 18, + "symbol": "BEEP" + }, + "isSC": {} + }, + "0x7533d63a2558965472398ef473908e1320520ae2": { + "name": "INTX token contract", + "address": "0x7533d63a2558965472398ef473908e1320520ae2", + "token": { + "decimals": 9, + "symbol": "INTX" + }, + "isSC": {} + }, + "0x40a9d39aa50871df092538c5999b107f34409061": { + "name": "IDAI token contract", + "address": "0x40a9d39aa50871df092538c5999b107f34409061", + "token": { + "decimals": 18, + "symbol": "IDAI" + }, + "isSC": {} + }, + "0x9c6666d5ff4b53b5eb3bd866664c15d0bfcecaa7": { + "name": "ZENI token contract", + "address": "0x9c6666d5ff4b53b5eb3bd866664c15d0bfcecaa7", + "token": { + "decimals": 18, + "symbol": "ZENI" + }, + "isSC": {} + }, + "0x7a5ce6abd131ea6b148a022cb76fc180ae3315a6": { + "name": "BALPHA token contract", + "address": "0x7a5ce6abd131ea6b148a022cb76fc180ae3315a6", + "token": { + "decimals": 18, + "symbol": "BALPHA" + }, + "isSC": {} + }, + "0x47e67ba66b0699500f18a53f94e2b9db3d47437e": { + "name": "PXG token contract", + "address": "0x47e67ba66b0699500f18a53f94e2b9db3d47437e", + "token": { + "decimals": 18, + "symbol": "PXG" + }, + "isSC": {} + }, + "0x67954768e721fad0f0f21e33e874497c73ed6a82": { + "name": "KEK token contract", + "address": "0x67954768e721fad0f0f21e33e874497c73ed6a82", + "token": { + "decimals": 18, + "symbol": "KEK" + }, + "isSC": {} + }, + "0x72a66e54b66892ae3bbe54df7bb7dd5ae927a6f9": { + "name": "CVAG token contract", + "address": "0x72a66e54b66892ae3bbe54df7bb7dd5ae927a6f9", + "token": { + "decimals": 18, + "symbol": "CVAG" + }, + "isSC": {} + }, + "0x4159862bcf6b4393a80550b1ed03dffa6f90533c": { + "name": "OHMI token contract", + "address": "0x4159862bcf6b4393a80550b1ed03dffa6f90533c", + "token": { + "decimals": 18, + "symbol": "OHMI" + }, + "isSC": {} + }, + "0x51395ade06eae126f590e7b06dc8f6baf511f13f": { + "name": "HISQUIGGLE token contract", + "address": "0x51395ade06eae126f590e7b06dc8f6baf511f13f", + "token": { + "decimals": 18, + "symbol": "HISQUIGGLE" + }, + "isSC": {} + }, + "0xe8438c23157de97bde8bedd2eeabc8e7e44de18a": { + "name": "LUNAT token contract", + "address": "0xe8438c23157de97bde8bedd2eeabc8e7e44de18a", + "token": { + "decimals": 9, + "symbol": "LUNAT" + }, + "isSC": {} + }, + "0x2fd61567c29e7adb4ca17e60e1f4a3fcfe68acb8": { + "name": "SYM token contract", + "address": "0x2fd61567c29e7adb4ca17e60e1f4a3fcfe68acb8", + "token": { + "decimals": 18, + "symbol": "SYM" + }, + "isSC": {} + }, + "0xb7c2fcd6d7922eddd2a7a9b0524074a60d5b472c": { + "name": "VST token contract", + "address": "0xb7c2fcd6d7922eddd2a7a9b0524074a60d5b472c", + "token": { + "decimals": 18, + "symbol": "VST" + }, + "isSC": {} + }, + "0x757da0e5c253082b0f2bd5105119f71817fe0911": { + "name": "VITO token contract", + "address": "0x757da0e5c253082b0f2bd5105119f71817fe0911", + "token": { + "decimals": 18, + "symbol": "VITO" + }, + "isSC": {} + }, + "0xb68d792329bbca81c2b823e9dbe066db53ef7b16": { + "name": "XCHAIN token contract", + "address": "0xb68d792329bbca81c2b823e9dbe066db53ef7b16", + "token": { + "decimals": 18, + "symbol": "XCHAIN" + }, + "isSC": {} + }, + "0x6aa40d02115090d40dc33c7c5f3cf05112fa4f83": { + "name": "PWRC token contract", + "address": "0x6aa40d02115090d40dc33c7c5f3cf05112fa4f83", + "token": { + "decimals": 18, + "symbol": "PWRC" + }, + "isSC": {} + }, + "0xb131f337c45d386ceec234e194b2663d5c3d9dcf": { + "name": "ICOM token contract", + "address": "0xb131f337c45d386ceec234e194b2663d5c3d9dcf", + "token": { + "decimals": 18, + "symbol": "ICOM" + }, + "isSC": {} + }, + "0xc525abf65169e6d443f698276761eb9ea7d921a4": { + "name": "BTX token contract", + "address": "0xc525abf65169e6d443f698276761eb9ea7d921a4", + "token": { + "decimals": 9, + "symbol": "BTX" + }, + "isSC": {} + }, + "0x39d30828a163713d91c4eadbba2c497a9139ec5c": { + "name": "HBDC token contract", + "address": "0x39d30828a163713d91c4eadbba2c497a9139ec5c", + "token": { + "decimals": 18, + "symbol": "HBDC" + }, + "isSC": {} + }, + "0xfa26384ddda8176c74db700bb0cda50c559e9977": { + "name": "XGF token contract", + "address": "0xfa26384ddda8176c74db700bb0cda50c559e9977", + "token": { + "decimals": 18, + "symbol": "XGF" + }, + "isSC": {} + }, + "0x00fc270c9cc13e878ab5363d00354bebf6f05c15": { + "name": "VNXLU token contract", + "address": "0x00fc270c9cc13e878ab5363d00354bebf6f05c15", + "token": { + "decimals": 18, + "symbol": "VNXLU" + }, + "isSC": {} + }, + "0x63a60c5469379149757cc3e58453202ebdb7e933": { + "name": "VS token contract", + "address": "0x63a60c5469379149757cc3e58453202ebdb7e933", + "token": { + "decimals": 18, + "symbol": "VS" + }, + "isSC": {} + }, + "0x35b08722aa26be119c1608029ccbc976ac5c1082": { + "name": "EM token contract", + "address": "0x35b08722aa26be119c1608029ccbc976ac5c1082", + "token": { + "decimals": 8, + "symbol": "EM" + }, + "isSC": {} + }, + "0x32fd949e1953b21b7a8232ef4259cd708b4e0847": { + "name": "HBT token contract", + "address": "0x32fd949e1953b21b7a8232ef4259cd708b4e0847", + "token": { + "decimals": 18, + "symbol": "HBT" + }, + "isSC": {} + }, + "0xcbee6459728019cb1f2bb971dde2ee3271bc7617": { + "name": "MRG token contract", + "address": "0xcbee6459728019cb1f2bb971dde2ee3271bc7617", + "token": { + "decimals": 18, + "symbol": "MRG" + }, + "isSC": {} + }, + "0x5c9c7554ab2b302a0a3e943377acb30e9a70f9f7": { + "name": "ADD token contract", + "address": "0x5c9c7554ab2b302a0a3e943377acb30e9a70f9f7", + "token": { + "decimals": 18, + "symbol": "ADD" + }, + "isSC": {} + }, + "0xf029fd6b5ed35c825dd02b7a02952c30002840e4": { + "name": "SIGIL token contract", + "address": "0xf029fd6b5ed35c825dd02b7a02952c30002840e4", + "token": { + "decimals": 18, + "symbol": "SIGIL" + }, + "isSC": {} + }, + "0xb683d83a532e2cb7dfa5275eed3698436371cc9f": { + "name": "BTU", + "address": "0xb683d83a532e2cb7dfa5275eed3698436371cc9f", + "token": { + "decimals": 18, + "symbol": "BTU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BTU.svg" + }, + "0xdfbc9050f5b01df53512dcc39b4f2b2bbacd517a": { + "name": "Jobchain", + "address": "0xdfbc9050f5b01df53512dcc39b4f2b2bbacd517a", + "token": { + "decimals": 8, + "symbol": "JOB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/job.svg" + }, + "0x37fc4b48ce93469dbea9918468993c735049642a": { + "name": "CBX token contract", + "address": "0x37fc4b48ce93469dbea9918468993c735049642a", + "token": { + "decimals": 18, + "symbol": "CBX" + }, + "isSC": {} + }, + "0x0abd596070be270f04eb446128b3dc04969e7d29": { + "name": "NEXUS token contract", + "address": "0x0abd596070be270f04eb446128b3dc04969e7d29", + "token": { + "decimals": 18, + "symbol": "NEXUS" + }, + "isSC": {} + }, + "0x39fbbabf11738317a448031930706cd3e612e1b9": { + "name": "Wrapped XRP", + "address": "0x39fbbabf11738317a448031930706cd3e612e1b9", + "token": { + "decimals": 18, + "symbol": "WXRP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WXRP.svg" + }, + "0xd15a1a2a3211b58113e45809f05934252e34e2f8": { + "name": "WZM token contract", + "address": "0xd15a1a2a3211b58113e45809f05934252e34e2f8", + "token": { + "decimals": 18, + "symbol": "WZM" + }, + "isSC": {} + }, + "0x370adc71f67f581158dc56f539df5f399128ddf9": { + "name": "AAMMUNIMKRWETH token contract", + "address": "0x370adc71f67f581158dc56f539df5f399128ddf9", + "token": { + "decimals": 18, + "symbol": "AAMMUNIMKRWETH" + }, + "isSC": {} + }, + "0x7a939bb714fd2a48ebeb1e495aa9aaa74ba9fa68": { + "name": "EVZ token contract", + "address": "0x7a939bb714fd2a48ebeb1e495aa9aaa74ba9fa68", + "token": { + "decimals": 18, + "symbol": "EVZ" + }, + "isSC": {} + }, + "0x37a15c92e67686aa268df03d4c881a76340907e8": { + "name": "PIXIU token contract", + "address": "0x37a15c92e67686aa268df03d4c881a76340907e8", + "token": { + "decimals": 0, + "symbol": "PIXIU" + }, + "isSC": {} + }, + "0x5abf88cf3444611d13f6d1b39f3f3ee8575c91a2": { + "name": "SAT token contract", + "address": "0x5abf88cf3444611d13f6d1b39f3f3ee8575c91a2", + "token": { + "decimals": 18, + "symbol": "SAT" + }, + "isSC": {} + }, + "0x4fd51cb87ffefdf1711112b5bd8ab682e54988ea": { + "name": "WPT token contract", + "address": "0x4fd51cb87ffefdf1711112b5bd8ab682e54988ea", + "token": { + "decimals": 18, + "symbol": "WPT" + }, + "isSC": {} + }, + "0x8e964e35a76103af4c7d7318e1b1a82c682ae296": { + "name": "FLZ token contract", + "address": "0x8e964e35a76103af4c7d7318e1b1a82c682ae296", + "token": { + "decimals": 18, + "symbol": "FLZ" + }, + "isSC": {} + }, + "0x004626a008b1acdc4c74ab51644093b155e59a23": { + "name": "Staked EURA", + "address": "0x004626a008b1acdc4c74ab51644093b155e59a23", + "token": { + "decimals": 18, + "symbol": "stEUR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stEUR.svg" + }, + "0xbea269038eb75bdab47a9c04d0f5c572d94b93d5": { + "name": "WFIO token contract", + "address": "0xbea269038eb75bdab47a9c04d0f5c572d94b93d5", + "token": { + "decimals": 9, + "symbol": "WFIO" + }, + "isSC": {} + }, + "0x634239cfa331df0291653139d1a6083b9cf705e3": { + "name": "DES token contract", + "address": "0x634239cfa331df0291653139d1a6083b9cf705e3", + "token": { + "decimals": 18, + "symbol": "DES" + }, + "isSC": {} + }, + "0x36880f14af2e85cae8e467827fa077d6bf12ea56": { + "name": "JARED token contract", + "address": "0x36880f14af2e85cae8e467827fa077d6bf12ea56", + "token": { + "decimals": 18, + "symbol": "JARED" + }, + "isSC": {} + }, + "0x18e2190303d6454deaa5ba5529ea0100f99723a3": { + "name": "TRIBOT token contract", + "address": "0x18e2190303d6454deaa5ba5529ea0100f99723a3", + "token": { + "decimals": 18, + "symbol": "TRIBOT" + }, + "isSC": {} + }, + "0x000000000000d0151e748d25b766e77efe2a6c83": { + "name": "XDEX token contract", + "address": "0x000000000000d0151e748d25b766e77efe2a6c83", + "token": { + "decimals": 18, + "symbol": "XDEX" + }, + "isSC": {} + }, + "0x464ebe77c293e473b48cfe96ddcf88fcf7bfdac0": { + "name": "KRL token contract", + "address": "0x464ebe77c293e473b48cfe96ddcf88fcf7bfdac0", + "token": { + "decimals": 18, + "symbol": "KRL" + }, + "isSC": {} + }, + "0x7102dc82ef61bfb0410b1b1bf8ea74575bf0a105": { + "name": "X7102 token contract", + "address": "0x7102dc82ef61bfb0410b1b1bf8ea74575bf0a105", + "token": { + "decimals": 18, + "symbol": "X7102" + }, + "isSC": {} + }, + "0x471a202f69d6e975da55e363dab1bdb2e86e0c0f": { + "name": "GEKE token contract", + "address": "0x471a202f69d6e975da55e363dab1bdb2e86e0c0f", + "token": { + "decimals": 18, + "symbol": "GEKE" + }, + "isSC": {} + }, + "0x7101a9392eac53b01e7c07ca3baca945a56ee105": { + "name": "X7101 token contract", + "address": "0x7101a9392eac53b01e7c07ca3baca945a56ee105", + "token": { + "decimals": 18, + "symbol": "X7101" + }, + "isSC": {} + }, + "0x944eee930933be5e23b690c8589021ec8619a301": { + "name": "MUNCH token contract", + "address": "0x944eee930933be5e23b690c8589021ec8619a301", + "token": { + "decimals": 9, + "symbol": "MUNCH" + }, + "isSC": {} + }, + "0x7103ebdbf1f89be2d53eff9b3cf996c9e775c105": { + "name": "X7103 token contract", + "address": "0x7103ebdbf1f89be2d53eff9b3cf996c9e775c105", + "token": { + "decimals": 18, + "symbol": "X7103" + }, + "isSC": {} + }, + "0xf07ebf00aa847bbb0057b92cb469747e2c7c8a4f": { + "name": "ECHOES token contract", + "address": "0xf07ebf00aa847bbb0057b92cb469747e2c7c8a4f", + "token": { + "decimals": 18, + "symbol": "ECHOES" + }, + "isSC": {} + }, + "0x66a3a58f812d0f433daaf1d96e14fd72d1d03d67": { + "name": "YAMA token contract", + "address": "0x66a3a58f812d0f433daaf1d96e14fd72d1d03d67", + "token": { + "decimals": 18, + "symbol": "YAMA" + }, + "isSC": {} + }, + "0xe6d2c3cb986db66818c14c7032db05d1d2a6ee74": { + "name": "FNB token contract", + "address": "0xe6d2c3cb986db66818c14c7032db05d1d2a6ee74", + "token": { + "decimals": 8, + "symbol": "FNB" + }, + "isSC": {} + }, + "0x5833dbb0749887174b254ba4a5df747ff523a905": { + "name": "XRUN token contract", + "address": "0x5833dbb0749887174b254ba4a5df747ff523a905", + "token": { + "decimals": 18, + "symbol": "XRUN" + }, + "isSC": {} + }, + "0xfcc5c47be19d06bf83eb04298b026f81069ff65b": { + "name": "YCRV token contract", + "address": "0xfcc5c47be19d06bf83eb04298b026f81069ff65b", + "token": { + "decimals": 18, + "symbol": "YCRV" + }, + "isSC": {} + }, + "0x3e452a416dae9f0bf4bf69fa0bf529c2b7c7360f": { + "name": "MIXQ token contract", + "address": "0x3e452a416dae9f0bf4bf69fa0bf529c2b7c7360f", + "token": { + "decimals": 9, + "symbol": "MIXQ" + }, + "isSC": {} + }, + "0xb30f5d11b94efbbfdeaa4de38edffceec0be6513": { + "name": "PIF token contract", + "address": "0xb30f5d11b94efbbfdeaa4de38edffceec0be6513", + "token": { + "decimals": 18, + "symbol": "PIF" + }, + "isSC": {} + }, + "0x410e731c2970dce3add351064acf5ce9e33fdbf0": { + "name": "ONIT token contract", + "address": "0x410e731c2970dce3add351064acf5ce9e33fdbf0", + "token": { + "decimals": 18, + "symbol": "ONIT" + }, + "isSC": {} + }, + "0x21d5678a62dfe63a47062469ebb2fac2817d8832": { + "name": "YLC token contract", + "address": "0x21d5678a62dfe63a47062469ebb2fac2817d8832", + "token": { + "decimals": 8, + "symbol": "YLC" + }, + "isSC": {} + }, + "0x8e30ea2329d95802fd804f4291220b0e2f579812": { + "name": "DVP token contract", + "address": "0x8e30ea2329d95802fd804f4291220b0e2f579812", + "token": { + "decimals": 18, + "symbol": "DVP" + }, + "isSC": {} + }, + "0xab2a7b5876d707e0126b3a75ef7781c77c8877ee": { + "name": "QUAD token contract", + "address": "0xab2a7b5876d707e0126b3a75ef7781c77c8877ee", + "token": { + "decimals": 18, + "symbol": "QUAD" + }, + "isSC": {} + }, + "0xaa602de53347579f86b996d2add74bb6f79462b2": { + "name": "ZMT token contract", + "address": "0xaa602de53347579f86b996d2add74bb6f79462b2", + "token": { + "decimals": 18, + "symbol": "ZMT" + }, + "isSC": {} + }, + "0xe857734840dc188b4283d5af14ab8685467ab87d": { + "name": "ESGC token contract", + "address": "0xe857734840dc188b4283d5af14ab8685467ab87d", + "token": { + "decimals": 18, + "symbol": "ESGC" + }, + "isSC": {} + }, + "0x356a5160f2b34bc8d88fb084745465ebbbed0174": { + "name": "INVI token contract", + "address": "0x356a5160f2b34bc8d88fb084745465ebbbed0174", + "token": { + "decimals": 13, + "symbol": "INVI" + }, + "isSC": {} + }, + "0xd31695a1d35e489252ce57b129fd4b1b05e6acac": { + "name": "TKP token contract", + "address": "0xd31695a1d35e489252ce57b129fd4b1b05e6acac", + "token": { + "decimals": 18, + "symbol": "TKP" + }, + "isSC": {} + }, + "0xcc6f15be8573cb8243c42d300565566d328213dd": { + "name": "OWN token contract", + "address": "0xcc6f15be8573cb8243c42d300565566d328213dd", + "token": { + "decimals": 18, + "symbol": "OWN" + }, + "isSC": {} + }, + "0x79be75ffc64dd58e66787e4eae470c8a1fd08ba4": { + "name": "AAMMDAI token contract", + "address": "0x79be75ffc64dd58e66787e4eae470c8a1fd08ba4", + "token": { + "decimals": 18, + "symbol": "AAMMDAI" + }, + "isSC": {} + }, + "0x4e12eb8e506ccd1427f6b8f7faa3e88fb698eb28": { + "name": "JACK token contract", + "address": "0x4e12eb8e506ccd1427f6b8f7faa3e88fb698eb28", + "token": { + "decimals": 18, + "symbol": "JACK" + }, + "isSC": {} + }, + "0x301c755ba0fca00b1923768fffb3df7f4e63af31": { + "name": "GDC token contract", + "address": "0x301c755ba0fca00b1923768fffb3df7f4e63af31", + "token": { + "decimals": 18, + "symbol": "GDC" + }, + "isSC": {} + }, + "0x7ae075546e8042dc263fa0eb6519ce0a04eabb93": { + "name": "METAL token contract", + "address": "0x7ae075546e8042dc263fa0eb6519ce0a04eabb93", + "token": { + "decimals": 9, + "symbol": "METAL" + }, + "isSC": {} + }, + "0x34950ff2b487d9e5282c5ab342d08a2f712eb79f": { + "name": "WOZX token contract", + "address": "0x34950ff2b487d9e5282c5ab342d08a2f712eb79f", + "token": { + "decimals": 18, + "symbol": "WOZX" + }, + "isSC": {} + }, + "0xff19138b039d938db46bdda0067dc4ba132ec71c": { + "name": "SNET token contract", + "address": "0xff19138b039d938db46bdda0067dc4ba132ec71c", + "token": { + "decimals": 8, + "symbol": "SNET" + }, + "isSC": {} + }, + "0x2e2364966267b5d7d2ce6cd9a9b5bd19d9c7c6a9": { + "name": "VOICE token contract", + "address": "0x2e2364966267b5d7d2ce6cd9a9b5bd19d9c7c6a9", + "token": { + "decimals": 18, + "symbol": "VOICE" + }, + "isSC": {} + }, + "0x8c130499d33097d4d000d3332e1672f75b431543": { + "name": "HOPPY token contract", + "address": "0x8c130499d33097d4d000d3332e1672f75b431543", + "token": { + "decimals": 8, + "symbol": "HOPPY" + }, + "isSC": {} + }, + "0xfb19075d77a0f111796fb259819830f4780f1429": { + "name": "FB token contract", + "address": "0xfb19075d77a0f111796fb259819830f4780f1429", + "token": { + "decimals": 6, + "symbol": "FB" + }, + "isSC": {} + }, + "0xe0151763455a8a021e64880c238ba1cff3787ff0": { + "name": "APED token contract", + "address": "0xe0151763455a8a021e64880c238ba1cff3787ff0", + "token": { + "decimals": 18, + "symbol": "APED" + }, + "isSC": {} + }, + "0x176bc22e1855cd5cf5a840081c6c5b92b55e2210": { + "name": "GBE token contract", + "address": "0x176bc22e1855cd5cf5a840081c6c5b92b55e2210", + "token": { + "decimals": 18, + "symbol": "GBE" + }, + "isSC": {} + }, + "0x69d29f1b0cc37d8d3b61583c99ad0ab926142069": { + "name": " token contract", + "address": "0x69d29f1b0cc37d8d3b61583c99ad0ab926142069", + "token": { + "decimals": 9, + "symbol": "" + }, + "isSC": {} + }, + "0xe5d2e173b120341face9e9970889c9fe64081ffd": { + "name": "BLU token contract", + "address": "0xe5d2e173b120341face9e9970889c9fe64081ffd", + "token": { + "decimals": 18, + "symbol": "BLU" + }, + "isSC": {} + }, + "0x00059ae69c1622a7542edc15e8d17b060fe307b6": { + "name": "AMON token contract", + "address": "0x00059ae69c1622a7542edc15e8d17b060fe307b6", + "token": { + "decimals": 18, + "symbol": "AMON" + }, + "isSC": {} + }, + "0x428dc22668e6f3468273634067e5545ed5417a3e": { + "name": "MQL token contract", + "address": "0x428dc22668e6f3468273634067e5545ed5417a3e", + "token": { + "decimals": 18, + "symbol": "MQL" + }, + "isSC": {} + }, + "0xc538143202f3b11382d8606aae90a96b042a19db": { + "name": "CNB token contract", + "address": "0xc538143202f3b11382d8606aae90a96b042a19db", + "token": { + "decimals": 18, + "symbol": "CNB" + }, + "isSC": {} + }, + "0x131157c6760f78f7ddf877c0019eba175ba4b6f6": { + "name": "BIGSB token contract", + "address": "0x131157c6760f78f7ddf877c0019eba175ba4b6f6", + "token": { + "decimals": 18, + "symbol": "BIGSB" + }, + "isSC": {} + }, + "0x3085154623f51b00dedfc6ceeb5197277a66b17b": { + "name": "NIFTY", + "address": "0x3085154623f51b00dedfc6ceeb5197277a66b17b", + "token": { + "decimals": 18, + "symbol": "NFTY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nfty.svg" + }, + "0xe3e24b4ea87935e15bbe99a24e9ace9998e4614d": { + "name": "AIDI token contract", + "address": "0xe3e24b4ea87935e15bbe99a24e9ace9998e4614d", + "token": { + "decimals": 18, + "symbol": "AIDI" + }, + "isSC": {} + }, + "0xbbbbbbb5aa847a2003fbc6b5c16df0bd1e725f61": { + "name": "BPRO token contract", + "address": "0xbbbbbbb5aa847a2003fbc6b5c16df0bd1e725f61", + "token": { + "decimals": 18, + "symbol": "BPRO" + }, + "isSC": {} + }, + "0x47481c1b44f2a1c0135c45aa402ce4f4dde4d30e": { + "name": "MPT token contract", + "address": "0x47481c1b44f2a1c0135c45aa402ce4f4dde4d30e", + "token": { + "decimals": 18, + "symbol": "MPT" + }, + "isSC": {} + }, + "0x035bfe6057e15ea692c0dfdcab3bb41a64dd2ad4": { + "name": "ULU token contract", + "address": "0x035bfe6057e15ea692c0dfdcab3bb41a64dd2ad4", + "token": { + "decimals": 18, + "symbol": "ULU" + }, + "isSC": {} + }, + "0x70efdc485a10210b056ef8e0a32993bc6529995e": { + "name": "BLZN token contract", + "address": "0x70efdc485a10210b056ef8e0a32993bc6529995e", + "token": { + "decimals": 18, + "symbol": "BLZN" + }, + "isSC": {} + }, + "0x70be04312f5f66d03708f0a1d6353b3e0f80ddbb": { + "name": "BBOT token contract", + "address": "0x70be04312f5f66d03708f0a1d6353b3e0f80ddbb", + "token": { + "decimals": 9, + "symbol": "BBOT" + }, + "isSC": {} + }, + "0x27778e14ce36d3b85e1effeb43816a17bbb7088a": { + "name": "LGOLD token contract", + "address": "0x27778e14ce36d3b85e1effeb43816a17bbb7088a", + "token": { + "decimals": 18, + "symbol": "LGOLD" + }, + "isSC": {} + }, + "0x7ae0d42f23c33338de15bfa89c7405c068d9dc0a": { + "name": "VERSE token contract", + "address": "0x7ae0d42f23c33338de15bfa89c7405c068d9dc0a", + "token": { + "decimals": 18, + "symbol": "VERSE" + }, + "isSC": {} + }, + "0x7220e92d418e2eb59d0c25d195fa004bfd3afc42": { + "name": "ADF token contract", + "address": "0x7220e92d418e2eb59d0c25d195fa004bfd3afc42", + "token": { + "decimals": 18, + "symbol": "ADF" + }, + "isSC": {} + }, + "0x3feb4fea5132695542f8ede5076ac43296d17c6d": { + "name": "BTC20 token contract", + "address": "0x3feb4fea5132695542f8ede5076ac43296d17c6d", + "token": { + "decimals": 8, + "symbol": "BTC20" + }, + "isSC": {} + }, + "0x575b57ca64d2de54fe78fae6d952251bbb6d251a": { + "name": "JACK token contract", + "address": "0x575b57ca64d2de54fe78fae6d952251bbb6d251a", + "token": { + "decimals": 18, + "symbol": "JACK" + }, + "isSC": {} + }, + "0x050d94685c6b0477e1fc555888af6e2bb8dfbda5": { + "name": "INU token contract", + "address": "0x050d94685c6b0477e1fc555888af6e2bb8dfbda5", + "token": { + "decimals": 18, + "symbol": "INU" + }, + "isSC": {} + }, + "0xa0d3707c569ff8c87fa923d3823ec5d81c98be78": { + "name": "IETHV2 token contract", + "address": "0xa0d3707c569ff8c87fa923d3823ec5d81c98be78", + "token": { + "decimals": 18, + "symbol": "IETHV2" + }, + "isSC": {} + }, + "0xc76d53f988820fe70e01eccb0248b312c2f1c7ca": { + "name": "INU token contract", + "address": "0xc76d53f988820fe70e01eccb0248b312c2f1c7ca", + "token": { + "decimals": 18, + "symbol": "INU" + }, + "isSC": {} + }, + "0xb113c6cf239f60d380359b762e95c13817275277": { + "name": "BMEX token contract", + "address": "0xb113c6cf239f60d380359b762e95c13817275277", + "token": { + "decimals": 6, + "symbol": "BMEX" + }, + "isSC": {} + }, + "0xb67beb26ebeb0dceec354ae0942256d03c01771b": { + "name": "DS token contract", + "address": "0xb67beb26ebeb0dceec354ae0942256d03c01771b", + "token": { + "decimals": 18, + "symbol": "DS" + }, + "isSC": {} + }, + "0x1fee5588cb1de19c70b6ad5399152d8c643fae7b": { + "name": "PHTK token contract", + "address": "0x1fee5588cb1de19c70b6ad5399152d8c643fae7b", + "token": { + "decimals": 18, + "symbol": "PHTK" + }, + "isSC": {} + }, + "0x56978e609f2cab06f77c5c8fd75166fcd8f09bd8": { + "name": "GENIE token contract", + "address": "0x56978e609f2cab06f77c5c8fd75166fcd8f09bd8", + "token": { + "decimals": 18, + "symbol": "GENIE" + }, + "isSC": {} + }, + "0xa6a840e50bcaa50da017b91a0d86b8b2d41156ee": { + "name": "EKO token contract", + "address": "0xa6a840e50bcaa50da017b91a0d86b8b2d41156ee", + "token": { + "decimals": 18, + "symbol": "EKO" + }, + "isSC": {} + }, + "0xe94b97b6b43639e238c851a7e693f50033efd75c": { + "name": "Rainbow Token", + "address": "0xe94b97b6b43639e238c851a7e693f50033efd75c", + "token": { + "decimals": 18, + "symbol": "RNBW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/halodao-rnbw.svg" + }, + "0x4ad434b8cdc3aa5ac97932d6bd18b5d313ab0f6f": { + "name": "EVERMOON token contract", + "address": "0x4ad434b8cdc3aa5ac97932d6bd18b5d313ab0f6f", + "token": { + "decimals": 18, + "symbol": "EVERMOON" + }, + "isSC": {} + }, + "0x4f311c430540db1d64e635eb55f969f1660b2016": { + "name": "PC token contract", + "address": "0x4f311c430540db1d64e635eb55f969f1660b2016", + "token": { + "decimals": 9, + "symbol": "PC" + }, + "isSC": {} + }, + "0x0981d9774a59a703db85f5eaa23672283ea31106": { + "name": "PEPINU token contract", + "address": "0x0981d9774a59a703db85f5eaa23672283ea31106", + "token": { + "decimals": 18, + "symbol": "PEPINU" + }, + "isSC": {} + }, + "0xc7a2572fa8fdb0f7e81d6d3c4e3ccf78fb0dc374": { + "name": "Bens Finale", + "address": "0xc7a2572fa8fdb0f7e81d6d3c4e3ccf78fb0dc374", + "token": { + "decimals": 18, + "symbol": "FINALE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BensFinale.svg" + }, + "0xd2b274cfbf9534f56b59ad0fb7e645e0354f4941": { + "name": "XDOGE token contract", + "address": "0xd2b274cfbf9534f56b59ad0fb7e645e0354f4941", + "token": { + "decimals": 8, + "symbol": "XDOGE" + }, + "isSC": {} + }, + "0x60bb16c4a931b1a0b8a7d945c651dd90f41d42cf": { + "name": "FBX token contract", + "address": "0x60bb16c4a931b1a0b8a7d945c651dd90f41d42cf", + "token": { + "decimals": 18, + "symbol": "FBX" + }, + "isSC": {} + }, + "0xc18c07a18198a6340cf4d94855fe5eb6dd33b46e": { + "name": "QLINDO token contract", + "address": "0xc18c07a18198a6340cf4d94855fe5eb6dd33b46e", + "token": { + "decimals": 0, + "symbol": "QLINDO" + }, + "isSC": {} + }, + "0x000000007a58f5f58e697e51ab0357bc9e260a04": { + "name": "CNV token contract", + "address": "0x000000007a58f5f58e697e51ab0357bc9e260a04", + "token": { + "decimals": 18, + "symbol": "CNV" + }, + "isSC": {} + }, + "0x661ab0ed68000491d98c796146bcf28c20d7c559": { + "name": "DOWS token contract", + "address": "0x661ab0ed68000491d98c796146bcf28c20d7c559", + "token": { + "decimals": 18, + "symbol": "DOWS" + }, + "isSC": {} + }, + "0x73c69d24ad28e2d43d03cbf35f79fe26ebde1011": { + "name": "ARCH token contract", + "address": "0x73c69d24ad28e2d43d03cbf35f79fe26ebde1011", + "token": { + "decimals": 18, + "symbol": "ARCH" + }, + "isSC": {} + }, + "0xdb2f2bcce3efa95eda95a233af45f3e0d4f00e2a": { + "name": "AGS token contract", + "address": "0xdb2f2bcce3efa95eda95a233af45f3e0d4f00e2a", + "token": { + "decimals": 8, + "symbol": "AGS" + }, + "isSC": {} + }, + "0x64df3aab3b21cc275bb76c4a581cf8b726478ee0": { + "name": "CRAMER token contract", + "address": "0x64df3aab3b21cc275bb76c4a581cf8b726478ee0", + "token": { + "decimals": 18, + "symbol": "CRAMER" + }, + "isSC": {} + }, + "0xfe60fba03048effb4acf3f0088ec2f53d779d3bb": { + "name": "3D3D token contract", + "address": "0xfe60fba03048effb4acf3f0088ec2f53d779d3bb", + "token": { + "decimals": 18, + "symbol": "3D3D" + }, + "isSC": {} + }, + "0xa8388b8334beb4840d65ed80f858b080dffd7e2b": { + "name": "SOP token contract", + "address": "0xa8388b8334beb4840d65ed80f858b080dffd7e2b", + "token": { + "decimals": 18, + "symbol": "SOP" + }, + "isSC": {} + }, + "0x01ff50f8b7f74e4f00580d9596cd3d0d6d6e326f": { + "name": "BFT token contract", + "address": "0x01ff50f8b7f74e4f00580d9596cd3d0d6d6e326f", + "token": { + "decimals": 18, + "symbol": "BFT" + }, + "isSC": {} + }, + "0x4674a4f24c5f63d53f22490fb3a08eaaad739ff8": { + "name": "BRKL token contract", + "address": "0x4674a4f24c5f63d53f22490fb3a08eaaad739ff8", + "token": { + "decimals": 18, + "symbol": "BRKL" + }, + "isSC": {} + }, + "0x12aef5c60c2c86c8ecd3079f22f285f326371340": { + "name": "HISAND33 token contract", + "address": "0x12aef5c60c2c86c8ecd3079f22f285f326371340", + "token": { + "decimals": 18, + "symbol": "HISAND33" + }, + "isSC": {} + }, + "0xaac41ec512808d64625576eddd580e7ea40ef8b2": { + "name": "GSWAP token contract", + "address": "0xaac41ec512808d64625576eddd580e7ea40ef8b2", + "token": { + "decimals": 18, + "symbol": "GSWAP" + }, + "isSC": {} + }, + "0x96362879529c15c484eabc861c435940e7af22bb": { + "name": "RPGMAI token contract", + "address": "0x96362879529c15c484eabc861c435940e7af22bb", + "token": { + "decimals": 18, + "symbol": "RPGMAI" + }, + "isSC": {} + }, + "0x94804dc4948184ffd7355f62ccbb221c9765886f": { + "name": "RAGE token contract", + "address": "0x94804dc4948184ffd7355f62ccbb221c9765886f", + "token": { + "decimals": 18, + "symbol": "RAGE" + }, + "isSC": {} + }, + "0x848896470d989f30503d8f883c331f63b73b66ea": { + "name": "MDI token contract", + "address": "0x848896470d989f30503d8f883c331f63b73b66ea", + "token": { + "decimals": 18, + "symbol": "MDI" + }, + "isSC": {} + }, + "0xffbf315f70e458e49229654dea4ce192d26f9b25": { + "name": "VOLT token contract", + "address": "0xffbf315f70e458e49229654dea4ce192d26f9b25", + "token": { + "decimals": 18, + "symbol": "VOLT" + }, + "isSC": {} + }, + "0x3fa729b4548becbad4eab6ef18413470e6d5324c": { + "name": "MOVE token contract", + "address": "0x3fa729b4548becbad4eab6ef18413470e6d5324c", + "token": { + "decimals": 18, + "symbol": "MOVE" + }, + "isSC": {} + }, + "0x27c57f84236780881be694a18e149bb5bb78c21f": { + "name": "LIQR token contract", + "address": "0x27c57f84236780881be694a18e149bb5bb78c21f", + "token": { + "decimals": 18, + "symbol": "LIQR" + }, + "isSC": {} + }, + "0x75459a499a79ccd7c5fae3201738f9e4677d69e4": { + "name": "PROME token contract", + "address": "0x75459a499a79ccd7c5fae3201738f9e4677d69e4", + "token": { + "decimals": 18, + "symbol": "PROME" + }, + "isSC": {} + }, + "0x7051faed0775f664a0286af4f75ef5ed74e02754": { + "name": "CHANGE token contract", + "address": "0x7051faed0775f664a0286af4f75ef5ed74e02754", + "token": { + "decimals": 18, + "symbol": "CHANGE" + }, + "isSC": {} + }, + "0xad1a5b8538a866ecd56ddd328b50ed57ced5d936": { + "name": "GENSLR token contract", + "address": "0xad1a5b8538a866ecd56ddd328b50ed57ced5d936", + "token": { + "decimals": 18, + "symbol": "GENSLR" + }, + "isSC": {} + }, + "0x082646b22a3960da69ef7a778c16dd6fb85dd999": { + "name": "FKPEPE token contract", + "address": "0x082646b22a3960da69ef7a778c16dd6fb85dd999", + "token": { + "decimals": 18, + "symbol": "FKPEPE" + }, + "isSC": {} + }, + "0xad8d0de33c43eefe104a279cdb6ae250c12e6214": { + "name": "NARUTO token contract", + "address": "0xad8d0de33c43eefe104a279cdb6ae250c12e6214", + "token": { + "decimals": 9, + "symbol": "NARUTO" + }, + "isSC": {} + }, + "0x17f8e6694080c07d7414c918dd9b9c32a2981ea1": { + "name": "ASC token contract", + "address": "0x17f8e6694080c07d7414c918dd9b9c32a2981ea1", + "token": { + "decimals": 18, + "symbol": "ASC" + }, + "isSC": {} + }, + "0xb8c55c80a1cb7394088a36c6b634dc2bf3c6fb67": { + "name": "PEPEDOGE token contract", + "address": "0xb8c55c80a1cb7394088a36c6b634dc2bf3c6fb67", + "token": { + "decimals": 18, + "symbol": "PEPEDOGE" + }, + "isSC": {} + }, + "0x9d7b68970d2be6dc93124477b4e2e1c9a6b180aa": { + "name": "DEDE token contract", + "address": "0x9d7b68970d2be6dc93124477b4e2e1c9a6b180aa", + "token": { + "decimals": 9, + "symbol": "DEDE" + }, + "isSC": {} + }, + "0xd971a3f840359ac4a23a9e75038934855e5ed8d5": { + "name": "OKEN token contract", + "address": "0xd971a3f840359ac4a23a9e75038934855e5ed8d5", + "token": { + "decimals": 9, + "symbol": "OKEN" + }, + "isSC": {} + }, + "0xbde4c4a9057595fa16d38e0bd7871ef119045a84": { + "name": "FRIEND token contract", + "address": "0xbde4c4a9057595fa16d38e0bd7871ef119045a84", + "token": { + "decimals": 18, + "symbol": "FRIEND" + }, + "isSC": {} + }, + "0xcb8a95e76a16b58c30b01e39dd6aad5949e5e802": { + "name": "TETRIS token contract", + "address": "0xcb8a95e76a16b58c30b01e39dd6aad5949e5e802", + "token": { + "decimals": 9, + "symbol": "TETRIS" + }, + "isSC": {} + }, + "0x9b355fee784768a7b9ac388c19e818e1c0a19b76": { + "name": "MWS token contract", + "address": "0x9b355fee784768a7b9ac388c19e818e1c0a19b76", + "token": { + "decimals": 18, + "symbol": "MWS" + }, + "isSC": {} + }, + "0xc383a3833a87009fd9597f8184979af5edfad019": { + "name": "IETH token contract", + "address": "0xc383a3833a87009fd9597f8184979af5edfad019", + "token": { + "decimals": 18, + "symbol": "IETH" + }, + "isSC": {} + }, + "0xb167b290d172eb33e221309592df0c042ab9dcdd": { + "name": "SONICBOT token contract", + "address": "0xb167b290d172eb33e221309592df0c042ab9dcdd", + "token": { + "decimals": 9, + "symbol": "SONICBOT" + }, + "isSC": {} + }, + "0x330528172778cc5196d5f6742886c72505e0613d": { + "name": "XBOT token contract", + "address": "0x330528172778cc5196d5f6742886c72505e0613d", + "token": { + "decimals": 18, + "symbol": "XBOT" + }, + "isSC": {} + }, + "0x9cb1aeafcc8a9406632c5b084246ea72f62d37b6": { + "name": "LBK token contract", + "address": "0x9cb1aeafcc8a9406632c5b084246ea72f62d37b6", + "token": { + "decimals": 8, + "symbol": "LBK" + }, + "isSC": {} + }, + "0xd85a6ae55a7f33b0ee113c234d2ee308edeaf7fd": { + "name": "CBK token contract", + "address": "0xd85a6ae55a7f33b0ee113c234d2ee308edeaf7fd", + "token": { + "decimals": 18, + "symbol": "CBK" + }, + "isSC": {} + }, + "0x69d47846bb7b884062fabc08a4a7deadcd98c45b": { + "name": "RUSHAI token contract", + "address": "0x69d47846bb7b884062fabc08a4a7deadcd98c45b", + "token": { + "decimals": 18, + "symbol": "RUSHAI" + }, + "isSC": {} + }, + "0xf3bf9b3ef3867d20a5ee51244f8b374b9d5e019e": { + "name": "EFOLIO token contract", + "address": "0xf3bf9b3ef3867d20a5ee51244f8b374b9d5e019e", + "token": { + "decimals": 18, + "symbol": "EFOLIO" + }, + "isSC": {} + }, + "0x92e187a03b6cd19cb6af293ba17f2745fd2357d5": { + "name": "DUCK token contract", + "address": "0x92e187a03b6cd19cb6af293ba17f2745fd2357d5", + "token": { + "decimals": 18, + "symbol": "DUCK" + }, + "isSC": {} + }, + "0xcfcffe432a48db53f59c301422d2edd77b2a88d7": { + "name": "TEXAN token contract", + "address": "0xcfcffe432a48db53f59c301422d2edd77b2a88d7", + "token": { + "decimals": 18, + "symbol": "TEXAN" + }, + "isSC": {} + }, + "0x249ca82617ec3dfb2589c4c17ab7ec9765350a18": { + "name": "Verse", + "address": "0x249ca82617ec3dfb2589c4c17ab7ec9765350a18", + "token": { + "decimals": 18, + "symbol": "VERSE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/VERSE.svg" + }, + "0x6c3ea9036406852006290770bedfcaba0e23a0e8": { + "name": "PayPal USD", + "address": "0x6c3ea9036406852006290770bedfcaba0e23a0e8", + "token": { + "decimals": 6, + "symbol": "PYUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pyusd.svg" + }, + "0x419e35e3515c2fdb652c898bf7a0b21fb20497dc": { + "name": "OFI token contract", + "address": "0x419e35e3515c2fdb652c898bf7a0b21fb20497dc", + "token": { + "decimals": 9, + "symbol": "OFI" + }, + "isSC": {} + }, + "0x3235b13708f178af6f110de7177ed5de10c1093d": { + "name": "MNFT token contract", + "address": "0x3235b13708f178af6f110de7177ed5de10c1093d", + "token": { + "decimals": 18, + "symbol": "MNFT" + }, + "isSC": {} + }, + "0x10bc518c32fbae5e38ecb50a612160571bd81e44": { + "name": "VRO token contract", + "address": "0x10bc518c32fbae5e38ecb50a612160571bd81e44", + "token": { + "decimals": 8, + "symbol": "VRO" + }, + "isSC": {} + }, + "0xac3e018457b222d93114458476f3e3416abbe38f": { + "name": "SFRXETH token contract", + "address": "0xac3e018457b222d93114458476f3e3416abbe38f", + "token": { + "decimals": 18, + "symbol": "SFRXETH" + }, + "isSC": {} + }, + "0x30f7c830e0c2f4bec871df809d73e27ef19eb151": { + "name": "UPPG token contract", + "address": "0x30f7c830e0c2f4bec871df809d73e27ef19eb151", + "token": { + "decimals": 18, + "symbol": "UPPG" + }, + "isSC": {} + }, + "0x62dc4817588d53a056cbbd18231d91ffccd34b2a": { + "name": "DeHive", + "address": "0x62dc4817588d53a056cbbd18231d91ffccd34b2a", + "token": { + "decimals": 18, + "symbol": "DHV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dehive.svg" + }, + "0x9b31bb425d8263fa1b8b9d090b83cf0c31665355": { + "name": "CPD token contract", + "address": "0x9b31bb425d8263fa1b8b9d090b83cf0c31665355", + "token": { + "decimals": 18, + "symbol": "CPD" + }, + "isSC": {} + }, + "0x81994b9607e06ab3d5cf3afff9a67374f05f27d7": { + "name": "FUSDT token contract", + "address": "0x81994b9607e06ab3d5cf3afff9a67374f05f27d7", + "token": { + "decimals": 8, + "symbol": "FUSDT" + }, + "isSC": {} + }, + "0x4e47951508fd4a4126f8ff9cf5e6fa3b7cc8e073": { + "name": "FLUID token contract", + "address": "0x4e47951508fd4a4126f8ff9cf5e6fa3b7cc8e073", + "token": { + "decimals": 18, + "symbol": "FLUID" + }, + "isSC": {} + }, + "0x4674672bcddda2ea5300f5207e1158185c944bc0": { + "name": "GXT token contract", + "address": "0x4674672bcddda2ea5300f5207e1158185c944bc0", + "token": { + "decimals": 18, + "symbol": "GXT" + }, + "isSC": {} + }, + "0x1559fa1b8f28238fd5d76d9f434ad86fd20d1559": { + "name": "EDEN token contract", + "address": "0x1559fa1b8f28238fd5d76d9f434ad86fd20d1559", + "token": { + "decimals": 18, + "symbol": "EDEN" + }, + "isSC": {} + }, + "0x0a44a7ccea34a7563ba1d45a5f757d0b02281124": { + "name": "BBL token contract", + "address": "0x0a44a7ccea34a7563ba1d45a5f757d0b02281124", + "token": { + "decimals": 18, + "symbol": "BBL" + }, + "isSC": {} + }, + "0x1341a2257fa7b770420ef70616f888056f90926c": { + "name": "ZOOT token contract", + "address": "0x1341a2257fa7b770420ef70616f888056f90926c", + "token": { + "decimals": 9, + "symbol": "ZOOT" + }, + "isSC": {} + }, + "0xc2544a32872a91f4a553b404c6950e89de901fdb": { + "name": "FPIS token contract", + "address": "0xc2544a32872a91f4a553b404c6950e89de901fdb", + "token": { + "decimals": 18, + "symbol": "FPIS" + }, + "isSC": {} + }, + "0x47879db9e657e644082071b48e2f33d80f369f02": { + "name": "XINU token contract", + "address": "0x47879db9e657e644082071b48e2f33d80f369f02", + "token": { + "decimals": 9, + "symbol": "XINU" + }, + "isSC": {} + }, + "0xa0ed3c520dc0632657ad2eaaf19e26c4fd431a84": { + "name": "HPO token contract", + "address": "0xa0ed3c520dc0632657ad2eaaf19e26c4fd431a84", + "token": { + "decimals": 18, + "symbol": "HPO" + }, + "isSC": {} + }, + "0x3a0b022f32b3191d44e5847da12dc0b63fb07c91": { + "name": "SPELLFIRE token contract", + "address": "0x3a0b022f32b3191d44e5847da12dc0b63fb07c91", + "token": { + "decimals": 18, + "symbol": "SPELLFIRE" + }, + "isSC": {} + }, + "0xd0cd466b34a24fcb2f87676278af2005ca8a78c4": { + "name": "POP token contract", + "address": "0xd0cd466b34a24fcb2f87676278af2005ca8a78c4", + "token": { + "decimals": 18, + "symbol": "POP" + }, + "isSC": {} + }, + "0x17be403329ced6df4fdb8278f039bc6ffd3d537f": { + "name": "EMMI token contract", + "address": "0x17be403329ced6df4fdb8278f039bc6ffd3d537f", + "token": { + "decimals": 18, + "symbol": "EMMI" + }, + "isSC": {} + }, + "0x5408245a4d7c685f59ce6d3b8b35916dd6c11a99": { + "name": "AZK token contract", + "address": "0x5408245a4d7c685f59ce6d3b8b35916dd6c11a99", + "token": { + "decimals": 18, + "symbol": "AZK" + }, + "isSC": {} + }, + "0xb17c88bda07d28b3838e0c1de6a30eafbcf52d85": { + "name": "SHFT token contract", + "address": "0xb17c88bda07d28b3838e0c1de6a30eafbcf52d85", + "token": { + "decimals": 18, + "symbol": "SHFT" + }, + "isSC": {} + }, + "0x11613b1f840bb5a40f8866d857e24da126b79d73": { + "name": "CAPP token contract", + "address": "0x11613b1f840bb5a40f8866d857e24da126b79d73", + "token": { + "decimals": 2, + "symbol": "CAPP" + }, + "isSC": {} + }, + "0xd01d133166820557db7138963bcd9009c54e4c33": { + "name": "CEX token contract", + "address": "0xd01d133166820557db7138963bcd9009c54e4c33", + "token": { + "decimals": 18, + "symbol": "CEX" + }, + "isSC": {} + }, + "0xcc9e0bd9438ca0056653d134de794abeaff8c676": { + "name": "LESLIE token contract", + "address": "0xcc9e0bd9438ca0056653d134de794abeaff8c676", + "token": { + "decimals": 9, + "symbol": "LESLIE" + }, + "isSC": {} + }, + "0x3e316791842a271ab1e138ff7408c015efd9c6be": { + "name": "VXAI token contract", + "address": "0x3e316791842a271ab1e138ff7408c015efd9c6be", + "token": { + "decimals": 18, + "symbol": "VXAI" + }, + "isSC": {} + }, + "0xc6e145421fd494b26dcf2bfeb1b02b7c5721978f": { + "name": "CPRX token contract", + "address": "0xc6e145421fd494b26dcf2bfeb1b02b7c5721978f", + "token": { + "decimals": 18, + "symbol": "CPRX" + }, + "isSC": {} + }, + "0x667210a731447f8b385e068205759be2311b86d4": { + "name": "ETF token contract", + "address": "0x667210a731447f8b385e068205759be2311b86d4", + "token": { + "decimals": 18, + "symbol": "ETF" + }, + "isSC": {} + }, + "0xc4f6e93aeddc11dc22268488465babcaf09399ac": { + "name": "HI token contract", + "address": "0xc4f6e93aeddc11dc22268488465babcaf09399ac", + "token": { + "decimals": 18, + "symbol": "HI" + }, + "isSC": {} + }, + "0x7ad16874759348f04b6b6119463d66c07ae54899": { + "name": "PIRB token contract", + "address": "0x7ad16874759348f04b6b6119463d66c07ae54899", + "token": { + "decimals": 18, + "symbol": "PIRB" + }, + "isSC": {} + }, + "0xf71a2079566c87e26bcd9766d140d5bfdeeae731": { + "name": "DOGE69 token contract", + "address": "0xf71a2079566c87e26bcd9766d140d5bfdeeae731", + "token": { + "decimals": 9, + "symbol": "DOGE69" + }, + "isSC": {} + }, + "0xd94a8f9caed25e63ecc90edfefaf3635ea1e182a": { + "name": "SCOMP token contract", + "address": "0xd94a8f9caed25e63ecc90edfefaf3635ea1e182a", + "token": { + "decimals": 18, + "symbol": "SCOMP" + }, + "isSC": {} + }, + "0xbc0e2969d23a084a0bb65a2b9a4242e7f9ea65b6": { + "name": "CLIPPY token contract", + "address": "0xbc0e2969d23a084a0bb65a2b9a4242e7f9ea65b6", + "token": { + "decimals": 18, + "symbol": "CLIPPY" + }, + "isSC": {} + }, + "0x5957c351946d45f74d1a6f034cd9b6ac6654e0d7": { + "name": "CR token contract", + "address": "0x5957c351946d45f74d1a6f034cd9b6ac6654e0d7", + "token": { + "decimals": 18, + "symbol": "CR" + }, + "isSC": {} + }, + "0xa16a609ff4e1a15b6ccb469e7a5dd14e89305283": { + "name": "SPUME token contract", + "address": "0xa16a609ff4e1a15b6ccb469e7a5dd14e89305283", + "token": { + "decimals": 18, + "symbol": "SPUME" + }, + "isSC": {} + }, + "0x547b2f82cecfab9c2b1d36fdda96ef9f58c63b8c": { + "name": "TXT token contract", + "address": "0x547b2f82cecfab9c2b1d36fdda96ef9f58c63b8c", + "token": { + "decimals": 18, + "symbol": "TXT" + }, + "isSC": {} + }, + "0x4c0bc0b3c734a573d28c627a96b95a1f1a7596fb": { + "name": "HUSBANT token contract", + "address": "0x4c0bc0b3c734a573d28c627a96b95a1f1a7596fb", + "token": { + "decimals": 8, + "symbol": "HUSBANT" + }, + "isSC": {} + }, + "0x3e362038fd3d08887d498944d489af7909619a9b": { + "name": "CHOW token contract", + "address": "0x3e362038fd3d08887d498944d489af7909619a9b", + "token": { + "decimals": 18, + "symbol": "CHOW" + }, + "isSC": {} + }, + "0xb58e26ac9cc14c0422c2b419b0ca555ee4dcb7cb": { + "name": "NIZA token contract", + "address": "0xb58e26ac9cc14c0422c2b419b0ca555ee4dcb7cb", + "token": { + "decimals": 9, + "symbol": "NIZA" + }, + "isSC": {} + }, + "0xc97d6c52f3add91fa1c5287a453d7444aecbca83": { + "name": "DZOO token contract", + "address": "0xc97d6c52f3add91fa1c5287a453d7444aecbca83", + "token": { + "decimals": 18, + "symbol": "DZOO" + }, + "isSC": {} + }, + "0x3af33bef05c2dcb3c7288b77fe1c8d2aeba4d789": { + "name": "Kromatika", + "address": "0x3af33bef05c2dcb3c7288b77fe1c8d2aeba4d789", + "token": { + "decimals": 18, + "symbol": "KROM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/krom.svg" + }, + "0x74d2d73b455540b037298c0e0925bc702aedbe4a": { + "name": "MEOW token contract", + "address": "0x74d2d73b455540b037298c0e0925bc702aedbe4a", + "token": { + "decimals": 9, + "symbol": "MEOW" + }, + "isSC": {} + }, + "0x185ece9bc75164f9fc0fbe44738e8dd1863f8464": { + "name": "UNDX token contract", + "address": "0x185ece9bc75164f9fc0fbe44738e8dd1863f8464", + "token": { + "decimals": 18, + "symbol": "UNDX" + }, + "isSC": {} + }, + "0xaaef88cea01475125522e117bfe45cf32044e238": { + "name": "GF token contract", + "address": "0xaaef88cea01475125522e117bfe45cf32044e238", + "token": { + "decimals": 18, + "symbol": "GF" + }, + "isSC": {} + }, + "0xb7b1570e26315baad369b8ea0a943b7f140db9eb": { + "name": "DPS token contract", + "address": "0xb7b1570e26315baad369b8ea0a943b7f140db9eb", + "token": { + "decimals": 9, + "symbol": "DPS" + }, + "isSC": {} + }, + "0x60867b79a68abecb78351b2dbb5fdec4282c5acb": { + "name": "VZZN token contract", + "address": "0x60867b79a68abecb78351b2dbb5fdec4282c5acb", + "token": { + "decimals": 9, + "symbol": "VZZN" + }, + "isSC": {} + }, + "0x4c45bbec2ff7810ef4a77ad7bd4757c446fe4155": { + "name": "JNGL token contract", + "address": "0x4c45bbec2ff7810ef4a77ad7bd4757c446fe4155", + "token": { + "decimals": 18, + "symbol": "JNGL" + }, + "isSC": {} + }, + "0xb49fa25978abf9a248b8212ab4b87277682301c0": { + "name": "SOFI token contract", + "address": "0xb49fa25978abf9a248b8212ab4b87277682301c0", + "token": { + "decimals": 18, + "symbol": "SOFI" + }, + "isSC": {} + }, + "0x06576eb3b212d605b797dc15523d9dc9f4f66db4": { + "name": "TCP token contract", + "address": "0x06576eb3b212d605b797dc15523d9dc9f4f66db4", + "token": { + "decimals": 18, + "symbol": "TCP" + }, + "isSC": {} + }, + "0xf79c22713f3912be20a324034a91b11e2958a37e": { + "name": "PBLUI token contract", + "address": "0xf79c22713f3912be20a324034a91b11e2958a37e", + "token": { + "decimals": 9, + "symbol": "PBLUI" + }, + "isSC": {} + }, + "0x0799de3f4e111b70e845edb7a8646d934a51e210": { + "name": "50CAL token contract", + "address": "0x0799de3f4e111b70e845edb7a8646d934a51e210", + "token": { + "decimals": 9, + "symbol": "50CAL" + }, + "isSC": {} + }, + "0x9abfc0f085c82ec1be31d30843965fcc63053ffe": { + "name": "Q token contract", + "address": "0x9abfc0f085c82ec1be31d30843965fcc63053ffe", + "token": { + "decimals": 9, + "symbol": "Q" + }, + "isSC": {} + }, + "0x97abee33cd075c58bfdd174e0885e08e8f03556f": { + "name": "SENT token contract", + "address": "0x97abee33cd075c58bfdd174e0885e08e8f03556f", + "token": { + "decimals": 18, + "symbol": "SENT" + }, + "isSC": {} + }, + "0x743494393d802ac25c39d7882b10d7fd08293686": { + "name": "GB token contract", + "address": "0x743494393d802ac25c39d7882b10d7fd08293686", + "token": { + "decimals": 18, + "symbol": "GB" + }, + "isSC": {} + }, + "0xa2762ba628b962f93498d8893b6e4346140fe96d": { + "name": "INT token contract", + "address": "0xa2762ba628b962f93498d8893b6e4346140fe96d", + "token": { + "decimals": 18, + "symbol": "INT" + }, + "isSC": {} + }, + "0x8f602ee5b1f8de67120c427717cbe2770f3cf320": { + "name": "STARRY token contract", + "address": "0x8f602ee5b1f8de67120c427717cbe2770f3cf320", + "token": { + "decimals": 18, + "symbol": "STARRY" + }, + "isSC": {} + }, + "0x7236a7ad67976ee07961ab26ed6f4cd23f7a9bd1": { + "name": "TXN token contract", + "address": "0x7236a7ad67976ee07961ab26ed6f4cd23f7a9bd1", + "token": { + "decimals": 18, + "symbol": "TXN" + }, + "isSC": {} + }, + "0x5c1a467e12150864ea15bd394dac3801c2ca3cb0": { + "name": "GAMMA token contract", + "address": "0x5c1a467e12150864ea15bd394dac3801c2ca3cb0", + "token": { + "decimals": 9, + "symbol": "GAMMA" + }, + "isSC": {} + }, + "0xdf2c7238198ad8b389666574f2d8bc411a4b7428": { + "name": "MFT token contract", + "address": "0xdf2c7238198ad8b389666574f2d8bc411a4b7428", + "token": { + "decimals": 18, + "symbol": "MFT" + }, + "isSC": {} + }, + "0x86efc496dca70bcfd92d19194290e8457a375773": { + "name": "UBSN token contract", + "address": "0x86efc496dca70bcfd92d19194290e8457a375773", + "token": { + "decimals": 0, + "symbol": "UBSN" + }, + "isSC": {} + }, + "0x3f2d4708f75de6fb60b687fed326697634774deb": { + "name": "NEOBOT token contract", + "address": "0x3f2d4708f75de6fb60b687fed326697634774deb", + "token": { + "decimals": 18, + "symbol": "NEOBOT" + }, + "isSC": {} + }, + "0x0aa7efe4945db24d95ca6e117bba65ed326e291a": { + "name": "OJA token contract", + "address": "0x0aa7efe4945db24d95ca6e117bba65ed326e291a", + "token": { + "decimals": 18, + "symbol": "OJA" + }, + "isSC": {} + }, + "0x9cf0ed013e67db12ca3af8e7506fe401aa14dad6": { + "name": "SPECTRE token contract", + "address": "0x9cf0ed013e67db12ca3af8e7506fe401aa14dad6", + "token": { + "decimals": 18, + "symbol": "SPECTRE" + }, + "isSC": {} + }, + "0x6710c63432a2de02954fc0f851db07146a6c0312": { + "name": "MFG", + "address": "0x6710c63432a2de02954fc0f851db07146a6c0312", + "token": { + "decimals": 18, + "symbol": "MFG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mfg.svg" + }, + "0xebb4c56dd5490156ae94a96e11903a2d5ff81deb": { + "name": "GMBT token contract", + "address": "0xebb4c56dd5490156ae94a96e11903a2d5ff81deb", + "token": { + "decimals": 9, + "symbol": "GMBT" + }, + "isSC": {} + }, + "0xec505c81d6a7567b5bde804870b1038832fe6da1": { + "name": "CND token contract", + "address": "0xec505c81d6a7567b5bde804870b1038832fe6da1", + "token": { + "decimals": 18, + "symbol": "CND" + }, + "isSC": {} + }, + "0xf65b5c5104c4fafd4b709d9d60a185eae063276c": { + "name": "TRU token contract", + "address": "0xf65b5c5104c4fafd4b709d9d60a185eae063276c", + "token": { + "decimals": 18, + "symbol": "TRU" + }, + "isSC": {} + }, + "0x7c07f7abe10ce8e33dc6c5ad68fe033085256a84": { + "name": "ICETH token contract", + "address": "0x7c07f7abe10ce8e33dc6c5ad68fe033085256a84", + "token": { + "decimals": 18, + "symbol": "ICETH" + }, + "isSC": {} + }, + "0xc9b6a17ebb43491635f603a01f8bb3e4b5d22228": { + "name": "MAGA token contract", + "address": "0xc9b6a17ebb43491635f603a01f8bb3e4b5d22228", + "token": { + "decimals": 9, + "symbol": "MAGA" + }, + "isSC": {} + }, + "0x3a8d5bc8a8948b68dfc0ce9c14ac4150e083518c": { + "name": "PARA token contract", + "address": "0x3a8d5bc8a8948b68dfc0ce9c14ac4150e083518c", + "token": { + "decimals": 18, + "symbol": "PARA" + }, + "isSC": {} + }, + "0x81db1949d0e888557bc632f7c0f6698b1f8c9106": { + "name": "D/ACC token contract", + "address": "0x81db1949d0e888557bc632f7c0f6698b1f8c9106", + "token": { + "decimals": 9, + "symbol": "D/ACC" + }, + "isSC": {} + }, + "0x0590cc9232ebf68d81f6707a119898219342ecb9": { + "name": "BCAT token contract", + "address": "0x0590cc9232ebf68d81f6707a119898219342ecb9", + "token": { + "decimals": 9, + "symbol": "BCAT" + }, + "isSC": {} + }, + "0xf2ec4a773ef90c58d98ea734c0ebdb538519b988": { + "name": "DOGE20 token contract", + "address": "0xf2ec4a773ef90c58d98ea734c0ebdb538519b988", + "token": { + "decimals": 9, + "symbol": "DOGE20" + }, + "isSC": {} + }, + "0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81": { + "name": "MUSE token contract", + "address": "0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81", + "token": { + "decimals": 18, + "symbol": "MUSE" + }, + "isSC": {} + }, + "0x8eb94a06b4716093dbfe335cbdb098deb2dcde1b": { + "name": "SHIB05 token contract", + "address": "0x8eb94a06b4716093dbfe335cbdb098deb2dcde1b", + "token": { + "decimals": 18, + "symbol": "SHIB05" + }, + "isSC": {} + }, + "0x878fcc2bdcccff8c56812607b9a58f29b274c4f0": { + "name": "DERP token contract", + "address": "0x878fcc2bdcccff8c56812607b9a58f29b274c4f0", + "token": { + "decimals": 18, + "symbol": "DERP" + }, + "isSC": {} + }, + "0xcaa79bf8b1d00bf3d4f6dbec6221955871c04618": { + "name": "CROC token contract", + "address": "0xcaa79bf8b1d00bf3d4f6dbec6221955871c04618", + "token": { + "decimals": 18, + "symbol": "CROC" + }, + "isSC": {} + }, + "0x43a96962254855f16b925556f9e97be436a43448": { + "name": "HORD token contract", + "address": "0x43a96962254855f16b925556f9e97be436a43448", + "token": { + "decimals": 18, + "symbol": "HORD" + }, + "isSC": {} + }, + "0x03dde9e5bb31ee40a471476e2fccf75c67921062": { + "name": "EML token contract", + "address": "0x03dde9e5bb31ee40a471476e2fccf75c67921062", + "token": { + "decimals": 18, + "symbol": "EML" + }, + "isSC": {} + }, + "0x4c6ec08cf3fc987c6c4beb03184d335a2dfc4042": { + "name": "PAINT token contract", + "address": "0x4c6ec08cf3fc987c6c4beb03184d335a2dfc4042", + "token": { + "decimals": 18, + "symbol": "PAINT" + }, + "isSC": {} + }, + "0x02de007d412266a2e0fa9287c103474170f06560": { + "name": "EXD token contract", + "address": "0x02de007d412266a2e0fa9287c103474170f06560", + "token": { + "decimals": 18, + "symbol": "EXD" + }, + "isSC": {} + }, + "0x71dc640b99faaf03544bdbce87018c2ae8ebe849": { + "name": "OMNIA token contract", + "address": "0x71dc640b99faaf03544bdbce87018c2ae8ebe849", + "token": { + "decimals": 8, + "symbol": "OMNIA" + }, + "isSC": {} + }, + "0x374cb8c27130e2c9e04f44303f3c8351b9de61c1": { + "name": "BAO token contract", + "address": "0x374cb8c27130e2c9e04f44303f3c8351b9de61c1", + "token": { + "decimals": 18, + "symbol": "BAO" + }, + "isSC": {} + }, + "0x05bbe7240de66f6480c9aeda77c1376b13393f83": { + "name": "XNO token contract", + "address": "0x05bbe7240de66f6480c9aeda77c1376b13393f83", + "token": { + "decimals": 18, + "symbol": "XNO" + }, + "isSC": {} + }, + "0x785c34312dfa6b74f6f1829f79ade39042222168": { + "name": "BUMP token contract", + "address": "0x785c34312dfa6b74f6f1829f79ade39042222168", + "token": { + "decimals": 18, + "symbol": "BUMP" + }, + "isSC": {} + }, + "0x91dfbee3965baaee32784c2d546b7a0c62f268c9": { + "name": "BONDLY token contract", + "address": "0x91dfbee3965baaee32784c2d546b7a0c62f268c9", + "token": { + "decimals": 18, + "symbol": "BONDLY" + }, + "isSC": {} + }, + "0x9b110fda4e20db18ad7052f8468a455de7449eb6": { + "name": "RIA token contract", + "address": "0x9b110fda4e20db18ad7052f8468a455de7449eb6", + "token": { + "decimals": 18, + "symbol": "RIA" + }, + "isSC": {} + }, + "0xf31698ddad0d11160fe85c500397a470cd3d492e": { + "name": "WEXO token contract", + "address": "0xf31698ddad0d11160fe85c500397a470cd3d492e", + "token": { + "decimals": 18, + "symbol": "WEXO" + }, + "isSC": {} + }, + "0xb0ed33f79d89541dfdcb04a8f04bc2c6be025ecc": { + "name": "ZERO token contract", + "address": "0xb0ed33f79d89541dfdcb04a8f04bc2c6be025ecc", + "token": { + "decimals": 18, + "symbol": "ZERO" + }, + "isSC": {} + }, + "0xb1f66997a5760428d3a87d68b90bfe0ae64121cc": { + "name": "LUA token contract", + "address": "0xb1f66997a5760428d3a87d68b90bfe0ae64121cc", + "token": { + "decimals": 18, + "symbol": "LUA" + }, + "isSC": {} + }, + "0x00000000051b48047be6dc0ada6de5c3de86a588": { + "name": "BABYSHIB token contract", + "address": "0x00000000051b48047be6dc0ada6de5c3de86a588", + "token": { + "decimals": 18, + "symbol": "BABYSHIB" + }, + "isSC": {} + }, + "0xcb8d1260f9c92a3a545d409466280ffdd7af7042": { + "name": "NFT token contract", + "address": "0xcb8d1260f9c92a3a545d409466280ffdd7af7042", + "token": { + "decimals": 18, + "symbol": "NFT" + }, + "isSC": {} + }, + "0x081f67afa0ccf8c7b17540767bbe95df2ba8d97f": { + "name": "CET token contract", + "address": "0x081f67afa0ccf8c7b17540767bbe95df2ba8d97f", + "token": { + "decimals": 18, + "symbol": "CET" + }, + "isSC": {} + }, + "0xf89674f18309a2e97843c6e9b19c07c22caef6d5": { + "name": "GAMER token contract", + "address": "0xf89674f18309a2e97843c6e9b19c07c22caef6d5", + "token": { + "decimals": 9, + "symbol": "GAMER" + }, + "isSC": {} + }, + "0x72377f31e30a405282b522d588aebbea202b4f23": { + "name": "VRN token contract", + "address": "0x72377f31e30a405282b522d588aebbea202b4f23", + "token": { + "decimals": 18, + "symbol": "VRN" + }, + "isSC": {} + }, + "0xf9fbe825bfb2bf3e387af0dc18cac8d87f29dea8": { + "name": "RADAR token contract", + "address": "0xf9fbe825bfb2bf3e387af0dc18cac8d87f29dea8", + "token": { + "decimals": 18, + "symbol": "RADAR" + }, + "isSC": {} + }, + "0xe796d6ca1ceb1b022ece5296226bf784110031cd": { + "name": "BLES token contract", + "address": "0xe796d6ca1ceb1b022ece5296226bf784110031cd", + "token": { + "decimals": 18, + "symbol": "BLES" + }, + "isSC": {} + }, + "0x62199b909fb8b8cf870f97bef2ce6783493c4908": { + "name": "PBTC token contract", + "address": "0x62199b909fb8b8cf870f97bef2ce6783493c4908", + "token": { + "decimals": 18, + "symbol": "PBTC" + }, + "isSC": {} + }, + "0x695afdb42edff97af470a15920a66df81a234c0e": { + "name": "WMOXY token contract", + "address": "0x695afdb42edff97af470a15920a66df81a234c0e", + "token": { + "decimals": 18, + "symbol": "WMOXY" + }, + "isSC": {} + }, + "0x67f3086f7823eaf35f5aaadfb2e9b9c5b09578cf": { + "name": "INX token contract", + "address": "0x67f3086f7823eaf35f5aaadfb2e9b9c5b09578cf", + "token": { + "decimals": 18, + "symbol": "INX" + }, + "isSC": {} + }, + "0x38f9bb135ea88033f4377b9ea0fb5cfb773fec2f": { + "name": "ALPHA token contract", + "address": "0x38f9bb135ea88033f4377b9ea0fb5cfb773fec2f", + "token": { + "decimals": 18, + "symbol": "ALPHA" + }, + "isSC": {} + }, + "0x3ebb4a4e91ad83be51f8d596533818b246f4bee1": { + "name": "SATA token contract", + "address": "0x3ebb4a4e91ad83be51f8d596533818b246f4bee1", + "token": { + "decimals": 18, + "symbol": "SATA" + }, + "isSC": {} + }, + "0x2604fa406be957e542beb89e6754fcde6815e83f": { + "name": "Playkey Token", + "address": "0x2604fa406be957e542beb89e6754fcde6815e83f", + "token": { + "decimals": 18, + "symbol": "PKT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/playkey.svg" + }, + "0x20c3fa331a385b63ee39137e99d0cf2db142fce1": { + "name": "SHIL token contract", + "address": "0x20c3fa331a385b63ee39137e99d0cf2db142fce1", + "token": { + "decimals": 18, + "symbol": "SHIL" + }, + "isSC": {} + }, + "0xc3b36424c70e0e6aee3b91d1894c2e336447dbd3": { + "name": "TOKENWATCH token contract", + "address": "0xc3b36424c70e0e6aee3b91d1894c2e336447dbd3", + "token": { + "decimals": 18, + "symbol": "TOKENWATCH" + }, + "isSC": {} + }, + "0xba41ddf06b7ffd89d1267b5a93bfef2424eb2003": { + "name": "MYTH token contract", + "address": "0xba41ddf06b7ffd89d1267b5a93bfef2424eb2003", + "token": { + "decimals": 18, + "symbol": "MYTH" + }, + "isSC": {} + }, + "0x2bba3cf6de6058cc1b4457ce00deb359e2703d7f": { + "name": "HSC token contract", + "address": "0x2bba3cf6de6058cc1b4457ce00deb359e2703d7f", + "token": { + "decimals": 18, + "symbol": "HSC" + }, + "isSC": {} + }, + "0xf17a3fe536f8f7847f1385ec1bc967b2ca9cae8d": { + "name": "AMKT token contract", + "address": "0xf17a3fe536f8f7847f1385ec1bc967b2ca9cae8d", + "token": { + "decimals": 18, + "symbol": "AMKT" + }, + "isSC": {} + }, + "0x2890df158d76e584877a1d17a85fea3aeeb85aa6": { + "name": "FUMO token contract", + "address": "0x2890df158d76e584877a1d17a85fea3aeeb85aa6", + "token": { + "decimals": 18, + "symbol": "FUMO" + }, + "isSC": {} + }, + "0x505b5eda5e25a67e1c24a2bf1a527ed9eb88bf04": { + "name": "CWEB token contract", + "address": "0x505b5eda5e25a67e1c24a2bf1a527ed9eb88bf04", + "token": { + "decimals": 18, + "symbol": "CWEB" + }, + "isSC": {} + }, + "0xdc524e3c6910257744c1f93cf15e9f472b5bd236": { + "name": "WITCH token contract", + "address": "0xdc524e3c6910257744c1f93cf15e9f472b5bd236", + "token": { + "decimals": 18, + "symbol": "WITCH" + }, + "isSC": {} + }, + "0x295b42684f90c77da7ea46336001010f2791ec8c": { + "name": "XI token contract", + "address": "0x295b42684f90c77da7ea46336001010f2791ec8c", + "token": { + "decimals": 18, + "symbol": "XI" + }, + "isSC": {} + }, + "0xed40834a13129509a89be39a9be9c0e96a0ddd71": { + "name": "WARP token contract", + "address": "0xed40834a13129509a89be39a9be9c0e96a0ddd71", + "token": { + "decimals": 18, + "symbol": "WARP" + }, + "isSC": {} + }, + "0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724": { + "name": "VIB token contract", + "address": "0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724", + "token": { + "decimals": 18, + "symbol": "VIB" + }, + "isSC": {} + }, + "0xcfeaead4947f0705a14ec42ac3d44129e1ef3ed5": { + "name": "NOTE token contract", + "address": "0xcfeaead4947f0705a14ec42ac3d44129e1ef3ed5", + "token": { + "decimals": 8, + "symbol": "NOTE" + }, + "isSC": {} + }, + "0xe07c41e9cdf7e0a7800e4bbf90d414654fd6413d": { + "name": "CBDC token contract", + "address": "0xe07c41e9cdf7e0a7800e4bbf90d414654fd6413d", + "token": { + "decimals": 9, + "symbol": "CBDC" + }, + "isSC": {} + }, + "0x1c4853ec0d55e420002c5efabc7ed8e0ba7a4121": { + "name": "OKINAMI token contract", + "address": "0x1c4853ec0d55e420002c5efabc7ed8e0ba7a4121", + "token": { + "decimals": 9, + "symbol": "OKINAMI" + }, + "isSC": {} + }, + "0xa1a36d3537bbe375cc9694795f663ddc8d516db9": { + "name": "POLI token contract", + "address": "0xa1a36d3537bbe375cc9694795f663ddc8d516db9", + "token": { + "decimals": 18, + "symbol": "POLI" + }, + "isSC": {} + }, + "0xa1db57defd15be659cfbc612a13195adf5b237c6": { + "name": "MNC token contract", + "address": "0xa1db57defd15be659cfbc612a13195adf5b237c6", + "token": { + "decimals": 18, + "symbol": "MNC" + }, + "isSC": {} + }, + "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359": { + "name": "Sai Stablecoin v1.0", + "address": "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", + "token": { + "decimals": 18, + "symbol": "SAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sai.svg" + }, + "0x6c936d4ae98e6d2172db18c16c4b601c99918ee6": { + "name": "LIFE token contract", + "address": "0x6c936d4ae98e6d2172db18c16c4b601c99918ee6", + "token": { + "decimals": 18, + "symbol": "LIFE" + }, + "isSC": {} + }, + "0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26": { + "name": "MDT token contract", + "address": "0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26", + "token": { + "decimals": 18, + "symbol": "MDT" + }, + "isSC": {} + }, + "0xa23c1194d421f252b4e6d5edcc3205f7650a4ebe": { + "name": "LBP token contract", + "address": "0xa23c1194d421f252b4e6d5edcc3205f7650a4ebe", + "token": { + "decimals": 18, + "symbol": "LBP" + }, + "isSC": {} + }, + "0x23dc3f6859e122b25b2cd5f3cf2335310b0f2b77": { + "name": "DESME token contract", + "address": "0x23dc3f6859e122b25b2cd5f3cf2335310b0f2b77", + "token": { + "decimals": 5, + "symbol": "DESME" + }, + "isSC": {} + }, + "0x246908bff0b1ba6ecadcf57fb94f6ae2fcd43a77": { + "name": "DIVI token contract", + "address": "0x246908bff0b1ba6ecadcf57fb94f6ae2fcd43a77", + "token": { + "decimals": 8, + "symbol": "DIVI" + }, + "isSC": {} + }, + "0x4c05f1e65069a8c0694470720be77e50d2b212d6": { + "name": "0XFREE token contract", + "address": "0x4c05f1e65069a8c0694470720be77e50d2b212d6", + "token": { + "decimals": 9, + "symbol": "0XFREE" + }, + "isSC": {} + }, + "0xb53b9e28b98c47e87acfd5a85eeb44a0940ecb12": { + "name": "ORB token contract", + "address": "0xb53b9e28b98c47e87acfd5a85eeb44a0940ecb12", + "token": { + "decimals": 9, + "symbol": "ORB" + }, + "isSC": {} + }, + "0x20fcefa41045080764c48c2b9429e44c644e5dea": { + "name": "FOOX token contract", + "address": "0x20fcefa41045080764c48c2b9429e44c644e5dea", + "token": { + "decimals": 18, + "symbol": "FOOX" + }, + "isSC": {} + }, + "0x3be7bf1a5f23bd8336787d0289b70602f1940875": { + "name": "VIDT DAO", + "address": "0x3be7bf1a5f23bd8336787d0289b70602f1940875", + "token": { + "decimals": 18, + "symbol": "VIDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/VIDT.svg" + }, + "0x8bf30e9f44e5d068a9d0c20da22660997a532e33": { + "name": "GDAG token contract", + "address": "0x8bf30e9f44e5d068a9d0c20da22660997a532e33", + "token": { + "decimals": 18, + "symbol": "GDAG" + }, + "isSC": {} + }, + "0xa2b4c0af19cc16a6cfacce81f192b024d625817d": { + "name": "KISHU token contract", + "address": "0xa2b4c0af19cc16a6cfacce81f192b024d625817d", + "token": { + "decimals": 9, + "symbol": "KISHU" + }, + "isSC": {} + }, + "0x994a258c7dec633b5b15376f850d5ea701179e79": { + "name": "0XGAS token contract", + "address": "0x994a258c7dec633b5b15376f850d5ea701179e79", + "token": { + "decimals": 18, + "symbol": "0XGAS" + }, + "isSC": {} + }, + "0x23d894fb4a0f551f2f923fc85e09819d1f3894b2": { + "name": "ITX token contract", + "address": "0x23d894fb4a0f551f2f923fc85e09819d1f3894b2", + "token": { + "decimals": 18, + "symbol": "ITX" + }, + "isSC": {} + }, + "0xa67e9f021b9d208f7e3365b2a155e3c55b27de71": { + "name": "KLEE token contract", + "address": "0xa67e9f021b9d208f7e3365b2a155e3c55b27de71", + "token": { + "decimals": 9, + "symbol": "KLEE" + }, + "isSC": {} + }, + "0xc97232527b62efb0d8ed38cf3ea103a6cca4037e": { + "name": "LP-YCRV token contract", + "address": "0xc97232527b62efb0d8ed38cf3ea103a6cca4037e", + "token": { + "decimals": 18, + "symbol": "LP-YCRV" + }, + "isSC": {} + }, + "0x2f109021afe75b949429fe30523ee7c0d5b27207": { + "name": "OCC token contract", + "address": "0x2f109021afe75b949429fe30523ee7c0d5b27207", + "token": { + "decimals": 18, + "symbol": "OCC" + }, + "isSC": {} + }, + "0xb61ebb6bceb7635ecd7e59884ee2e2bcdfd810ba": { + "name": "XSHIB token contract", + "address": "0xb61ebb6bceb7635ecd7e59884ee2e2bcdfd810ba", + "token": { + "decimals": 9, + "symbol": "XSHIB" + }, + "isSC": {} + }, + "0x089729b0786c8803cff972c16e402f3344d079ea": { + "name": "BGPT token contract", + "address": "0x089729b0786c8803cff972c16e402f3344d079ea", + "token": { + "decimals": 18, + "symbol": "BGPT" + }, + "isSC": {} + }, + "0xebf2096e01455108badcbaf86ce30b6e5a72aa52": { + "name": "XIDR token contract", + "address": "0xebf2096e01455108badcbaf86ce30b6e5a72aa52", + "token": { + "decimals": 6, + "symbol": "XIDR" + }, + "isSC": {} + }, + "0xf995771a957c19319a7d8d58b4082b049420340f": { + "name": "BONKI token contract", + "address": "0xf995771a957c19319a7d8d58b4082b049420340f", + "token": { + "decimals": 9, + "symbol": "BONKI" + }, + "isSC": {} + }, + "0xeda8b016efa8b1161208cf041cd86972eee0f31e": { + "name": "IHT token contract", + "address": "0xeda8b016efa8b1161208cf041cd86972eee0f31e", + "token": { + "decimals": 18, + "symbol": "IHT" + }, + "isSC": {} + }, + "0xaa68fd12a3b0f7aea66fe8f7111ae3f8d9ac5058": { + "name": "TWEETY token contract", + "address": "0xaa68fd12a3b0f7aea66fe8f7111ae3f8d9ac5058", + "token": { + "decimals": 9, + "symbol": "TWEETY" + }, + "isSC": {} + }, + "0xa685406eff334b1368318d0325fc2cdc0e7086f1": { + "name": "PARTY token contract", + "address": "0xa685406eff334b1368318d0325fc2cdc0e7086f1", + "token": { + "decimals": 18, + "symbol": "PARTY" + }, + "isSC": {} + }, + "0xa71d0588eaf47f12b13cf8ec750430d21df04974": { + "name": "QOM token contract", + "address": "0xa71d0588eaf47f12b13cf8ec750430d21df04974", + "token": { + "decimals": 18, + "symbol": "QOM" + }, + "isSC": {} + }, + "0x7d51888c5abb7cdfa9cdd6a50673c7f8afaccd7f": { + "name": "DuckDAO Token", + "address": "0x7d51888c5abb7cdfa9cdd6a50673c7f8afaccd7f", + "token": { + "decimals": 18, + "symbol": "DD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/duckdao.svg" + }, + "0x2d3590fac07b91c9451e8d16c372ece9758f040f": { + "name": "RAT token contract", + "address": "0x2d3590fac07b91c9451e8d16c372ece9758f040f", + "token": { + "decimals": 18, + "symbol": "RAT" + }, + "isSC": {} + }, + "0x4fbb350052bca5417566f188eb2ebce5b19bc964": { + "name": "Rigo", + "address": "0x4fbb350052bca5417566f188eb2ebce5b19bc964", + "token": { + "decimals": 18, + "symbol": "GRG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/grg.svg" + }, + "0x00e679ba63b509182c349f5614f0a07cdd0ce0c5": { + "name": "DAMEX token contract", + "address": "0x00e679ba63b509182c349f5614f0a07cdd0ce0c5", + "token": { + "decimals": 18, + "symbol": "DAMEX" + }, + "isSC": {} + }, + "0xb504035a11e672e12a099f32b1672b9c4a78b22f": { + "name": "SAFEREUM token contract", + "address": "0xb504035a11e672e12a099f32b1672b9c4a78b22f", + "token": { + "decimals": 18, + "symbol": "SAFEREUM" + }, + "isSC": {} + }, + "0x8ed2fc62d6850eaadcb717465752dab591286839": { + "name": "ELY token contract", + "address": "0x8ed2fc62d6850eaadcb717465752dab591286839", + "token": { + "decimals": 18, + "symbol": "ELY" + }, + "isSC": {} + }, + "0x2653891204f463fb2a2f4f412564b19e955166ae": { + "name": "NGL token contract", + "address": "0x2653891204f463fb2a2f4f412564b19e955166ae", + "token": { + "decimals": 18, + "symbol": "NGL" + }, + "isSC": {} + }, + "0xa11bd36801d8fa4448f0ac4ea7a62e3634ce8c7c": { + "name": "ABR token contract", + "address": "0xa11bd36801d8fa4448f0ac4ea7a62e3634ce8c7c", + "token": { + "decimals": 18, + "symbol": "ABR" + }, + "isSC": {} + }, + "0xc1c146e09640fe9e5d670288cc43c6269949d9a1": { + "name": "ROBO token contract", + "address": "0xc1c146e09640fe9e5d670288cc43c6269949d9a1", + "token": { + "decimals": 18, + "symbol": "ROBO" + }, + "isSC": {} + }, + "0x2f141ce366a2462f02cea3d12cf93e4dca49e4fd": { + "name": "FREE token contract", + "address": "0x2f141ce366a2462f02cea3d12cf93e4dca49e4fd", + "token": { + "decimals": 18, + "symbol": "FREE" + }, + "isSC": {} + }, + "0x0a266778c113a8f0d3d7aeacd12b74a7da5037a0": { + "name": "OLAI token contract", + "address": "0x0a266778c113a8f0d3d7aeacd12b74a7da5037a0", + "token": { + "decimals": 9, + "symbol": "OLAI" + }, + "isSC": {} + }, + "0xfa99a87b14b02e2240c79240c5a20f945ca5ef76": { + "name": "GGTK token contract", + "address": "0xfa99a87b14b02e2240c79240c5a20f945ca5ef76", + "token": { + "decimals": 18, + "symbol": "GGTK" + }, + "isSC": {} + }, + "0x358aa737e033f34df7c54306960a38d09aabd523": { + "name": "Ares Token", + "address": "0x358aa737e033f34df7c54306960a38d09aabd523", + "token": { + "decimals": 18, + "symbol": "ARES" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ares.svg" + }, + "0x1e18821e69b9faa8e6e75dffe54e7e25754beda0": { + "name": "KIMCHI token contract", + "address": "0x1e18821e69b9faa8e6e75dffe54e7e25754beda0", + "token": { + "decimals": 18, + "symbol": "KIMCHI" + }, + "isSC": {} + }, + "0xab37e1358b639fd877f015027bb62d3ddaa7557e": { + "name": "LIEN token contract", + "address": "0xab37e1358b639fd877f015027bb62d3ddaa7557e", + "token": { + "decimals": 8, + "symbol": "LIEN" + }, + "isSC": {} + }, + "0x3a1311b8c404629e38f61d566cefefed083b9670": { + "name": "PINU token contract", + "address": "0x3a1311b8c404629e38f61d566cefefed083b9670", + "token": { + "decimals": 9, + "symbol": "PINU" + }, + "isSC": {} + }, + "0xe0ad1806fd3e7edf6ff52fdb822432e847411033": { + "name": "ONX token contract", + "address": "0xe0ad1806fd3e7edf6ff52fdb822432e847411033", + "token": { + "decimals": 18, + "symbol": "ONX" + }, + "isSC": {} + }, + "0x8e32b8a41f2e86a3ee198912ac8d756c84295b40": { + "name": "TTF token contract", + "address": "0x8e32b8a41f2e86a3ee198912ac8d756c84295b40", + "token": { + "decimals": 9, + "symbol": "TTF" + }, + "isSC": {} + }, + "0xe3f03cef497c81d2b28a2fae63ae84b373028718": { + "name": "MARVIN token contract", + "address": "0xe3f03cef497c81d2b28a2fae63ae84b373028718", + "token": { + "decimals": 9, + "symbol": "MARVIN" + }, + "isSC": {} + }, + "0x764104dc24dadff01150253a58c82337984b4319": { + "name": "HICLONEX token contract", + "address": "0x764104dc24dadff01150253a58c82337984b4319", + "token": { + "decimals": 18, + "symbol": "HICLONEX" + }, + "isSC": {} + }, + "0x69948cc03f478b95283f7dbf1ce764d0fc7ec54c": { + "name": "AREN token contract", + "address": "0x69948cc03f478b95283f7dbf1ce764d0fc7ec54c", + "token": { + "decimals": 18, + "symbol": "AREN" + }, + "isSC": {} + }, + "0x8a001303158670e284950565164933372807cd48": { + "name": "WFAI token contract", + "address": "0x8a001303158670e284950565164933372807cd48", + "token": { + "decimals": 18, + "symbol": "WFAI" + }, + "isSC": {} + }, + "0x40c3b81fb887016c0ad02436309c2b265d069a05": { + "name": "CTO token contract", + "address": "0x40c3b81fb887016c0ad02436309c2b265d069a05", + "token": { + "decimals": 18, + "symbol": "CTO" + }, + "isSC": {} + }, + "0xc813ea5e3b48bebeedb796ab42a30c5599b01740": { + "name": "NIOX token contract", + "address": "0xc813ea5e3b48bebeedb796ab42a30c5599b01740", + "token": { + "decimals": 4, + "symbol": "NIOX" + }, + "isSC": {} + }, + "0xf4172630a656a47ece8616e75791290446fa41a0": { + "name": "PEPPA token contract", + "address": "0xf4172630a656a47ece8616e75791290446fa41a0", + "token": { + "decimals": 2, + "symbol": "PEPPA" + }, + "isSC": {} + }, + "0x1063181dc986f76f7ea2dd109e16fc596d0f522a": { + "name": "CYBA token contract", + "address": "0x1063181dc986f76f7ea2dd109e16fc596d0f522a", + "token": { + "decimals": 9, + "symbol": "CYBA" + }, + "isSC": {} + }, + "0xdf801468a808a32656d2ed2d2d80b72a129739f4": { + "name": "CUBE token contract", + "address": "0xdf801468a808a32656d2ed2d2d80b72a129739f4", + "token": { + "decimals": 8, + "symbol": "CUBE" + }, + "isSC": {} + }, + "0x9040e237c3bf18347bb00957dc22167d0f2b999d": { + "name": "STND token contract", + "address": "0x9040e237c3bf18347bb00957dc22167d0f2b999d", + "token": { + "decimals": 18, + "symbol": "STND" + }, + "isSC": {} + }, + "0x5e21d1ee5cf0077b314c381720273ae82378d613": { + "name": "ETH token contract", + "address": "0x5e21d1ee5cf0077b314c381720273ae82378d613", + "token": { + "decimals": 18, + "symbol": "ETH" + }, + "isSC": {} + }, + "0x37fe0f067fa808ffbdd12891c0858532cfe7361d": { + "name": "CIV token contract", + "address": "0x37fe0f067fa808ffbdd12891c0858532cfe7361d", + "token": { + "decimals": 18, + "symbol": "CIV" + }, + "isSC": {} + }, + "0x6368e1e18c4c419ddfc608a0bed1ccb87b9250fc": { + "name": "XTP token contract", + "address": "0x6368e1e18c4c419ddfc608a0bed1ccb87b9250fc", + "token": { + "decimals": 18, + "symbol": "XTP" + }, + "isSC": {} + }, + "0x9c78ee466d6cb57a4d01fd887d2b5dfb2d46288f": { + "name": "MUST token contract", + "address": "0x9c78ee466d6cb57a4d01fd887d2b5dfb2d46288f", + "token": { + "decimals": 18, + "symbol": "MUST" + }, + "isSC": {} + }, + "0x6f80310ca7f2c654691d1383149fa1a57d8ab1f8": { + "name": "SILO token contract", + "address": "0x6f80310ca7f2c654691d1383149fa1a57d8ab1f8", + "token": { + "decimals": 18, + "symbol": "SILO" + }, + "isSC": {} + }, + "0xd076c4ba62c57b3fa10800bcfd8da66742110e0e": { + "name": "HVH token contract", + "address": "0xd076c4ba62c57b3fa10800bcfd8da66742110e0e", + "token": { + "decimals": 18, + "symbol": "HVH" + }, + "isSC": {} + }, + "0x2f8221e82e0d4669ad66eabf02a5baed43ea49e7": { + "name": "NEWS token contract", + "address": "0x2f8221e82e0d4669ad66eabf02a5baed43ea49e7", + "token": { + "decimals": 18, + "symbol": "NEWS" + }, + "isSC": {} + }, + "0xbd617a1359086e33ff339ea0b9c6de479a3f5943": { + "name": "IDE token contract", + "address": "0xbd617a1359086e33ff339ea0b9c6de479a3f5943", + "token": { + "decimals": 9, + "symbol": "IDE" + }, + "isSC": {} + }, + "0x10010078a54396f62c96df8532dc2b4847d47ed3": { + "name": "HND token contract", + "address": "0x10010078a54396f62c96df8532dc2b4847d47ed3", + "token": { + "decimals": 18, + "symbol": "HND" + }, + "isSC": {} + }, + "0x5e05f367a1923b2a886e2f2bc45c2278a0b9b448": { + "name": "BRCBOT token contract", + "address": "0x5e05f367a1923b2a886e2f2bc45c2278a0b9b448", + "token": { + "decimals": 9, + "symbol": "BRCBOT" + }, + "isSC": {} + }, + "0x80d186b4c786ea66592b2c52e2004ab10cfe4cf3": { + "name": "LYNX token contract", + "address": "0x80d186b4c786ea66592b2c52e2004ab10cfe4cf3", + "token": { + "decimals": 18, + "symbol": "LYNX" + }, + "isSC": {} + }, + "0x0de05f6447ab4d22c8827449ee4ba2d5c288379b": { + "name": "OOKI", + "address": "0x0de05f6447ab4d22c8827449ee4ba2d5c288379b", + "token": { + "decimals": 18, + "symbol": "OOKI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ooki.svg" + }, + "0x170dec83c7753aaad20c01a0016b5a2e143990d4": { + "name": "WIGGER token contract", + "address": "0x170dec83c7753aaad20c01a0016b5a2e143990d4", + "token": { + "decimals": 18, + "symbol": "WIGGER" + }, + "isSC": {} + }, + "0xd4c435f5b09f855c3317c8524cb1f586e42795fa": { + "name": "CND token contract", + "address": "0xd4c435f5b09f855c3317c8524cb1f586e42795fa", + "token": { + "decimals": 18, + "symbol": "CND" + }, + "isSC": {} + }, + "0x491e136ff7ff03e6ab097e54734697bb5802fc1c": { + "name": "KTN token contract", + "address": "0x491e136ff7ff03e6ab097e54734697bb5802fc1c", + "token": { + "decimals": 18, + "symbol": "KTN" + }, + "isSC": {} + }, + "0x9ee8c380e1926730ad89e91665ff27063b13c90a": { + "name": "CA token contract", + "address": "0x9ee8c380e1926730ad89e91665ff27063b13c90a", + "token": { + "decimals": 18, + "symbol": "CA" + }, + "isSC": {} + }, + "0x0a638f07acc6969abf392bb009f216d22adea36d": { + "name": "BKN token contract", + "address": "0x0a638f07acc6969abf392bb009f216d22adea36d", + "token": { + "decimals": 18, + "symbol": "BKN" + }, + "isSC": {} + }, + "0x59d9356e565ab3a36dd77763fc0d87feaf85508c": { + "name": "USDM token contract", + "address": "0x59d9356e565ab3a36dd77763fc0d87feaf85508c", + "token": { + "decimals": 18, + "symbol": "USDM" + }, + "isSC": {} + }, + "0x5dcd6272c3cbb250823f0b7e6c618bce11b21f90": { + "name": "PEAR token contract", + "address": "0x5dcd6272c3cbb250823f0b7e6c618bce11b21f90", + "token": { + "decimals": 18, + "symbol": "PEAR" + }, + "isSC": {} + }, + "0x099f8d9e004ce139c6f46572ea99c0db71889a78": { + "name": "UNICHAD token contract", + "address": "0x099f8d9e004ce139c6f46572ea99c0db71889a78", + "token": { + "decimals": 18, + "symbol": "UNICHAD" + }, + "isSC": {} + }, + "0xfbd5fd3f85e9f4c5e8b40eec9f8b8ab1caaa146b": { + "name": "TREAT token contract", + "address": "0xfbd5fd3f85e9f4c5e8b40eec9f8b8ab1caaa146b", + "token": { + "decimals": 18, + "symbol": "TREAT" + }, + "isSC": {} + }, + "0x73968b9a57c6e53d41345fd57a6e6ae27d6cdb2f": { + "name": "SDT token contract", + "address": "0x73968b9a57c6e53d41345fd57a6e6ae27d6cdb2f", + "token": { + "decimals": 18, + "symbol": "SDT" + }, + "isSC": {} + }, + "0xd5fa38027462691769b8a8ba6c444890103b5b94": { + "name": "DAWG token contract", + "address": "0xd5fa38027462691769b8a8ba6c444890103b5b94", + "token": { + "decimals": 9, + "symbol": "DAWG" + }, + "isSC": {} + }, + "0xa130e3a33a4d84b04c3918c4e5762223ae252f80": { + "name": "Swash Token", + "address": "0xa130e3a33a4d84b04c3918c4e5762223ae252f80", + "token": { + "decimals": 18, + "symbol": "SWASH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/swash.svg" + }, + "0x16cc8367055ae7e9157dbcb9d86fd6ce82522b31": { + "name": "VXL token contract", + "address": "0x16cc8367055ae7e9157dbcb9d86fd6ce82522b31", + "token": { + "decimals": 18, + "symbol": "VXL" + }, + "isSC": {} + }, + "0x95392f142af1c12f6e39897ff9b09c599666b50c": { + "name": "BLOOD token contract", + "address": "0x95392f142af1c12f6e39897ff9b09c599666b50c", + "token": { + "decimals": 18, + "symbol": "BLOOD" + }, + "isSC": {} + }, + "0x33caf58d14d7cd284cc2d7f2bc878d2d63c8956a": { + "name": "OPOE token contract", + "address": "0x33caf58d14d7cd284cc2d7f2bc878d2d63c8956a", + "token": { + "decimals": 8, + "symbol": "OPOE" + }, + "isSC": {} + }, + "0x54da724e13d64619a36e1ee6f4bf92d5a410da41": { + "name": "SOB token contract", + "address": "0x54da724e13d64619a36e1ee6f4bf92d5a410da41", + "token": { + "decimals": 9, + "symbol": "SOB" + }, + "isSC": {} + }, + "0x5bbe36152d3cd3eb7183a82470b39b29eedf068b": { + "name": "HETH token contract", + "address": "0x5bbe36152d3cd3eb7183a82470b39b29eedf068b", + "token": { + "decimals": 18, + "symbol": "HETH" + }, + "isSC": {} + }, + "0x7717f2828fe4dac8558d23ee4cdfed9544e9321f": { + "name": "OTX token contract", + "address": "0x7717f2828fe4dac8558d23ee4cdfed9544e9321f", + "token": { + "decimals": 18, + "symbol": "OTX" + }, + "isSC": {} + }, + "0x5f0bc16d50f72d10b719dbf6845de2e599eb5624": { + "name": "VENT token contract", + "address": "0x5f0bc16d50f72d10b719dbf6845de2e599eb5624", + "token": { + "decimals": 18, + "symbol": "VENT" + }, + "isSC": {} + }, + "0x220b71671b649c03714da9c621285943f3cbcdc6": { + "name": "DIS token contract", + "address": "0x220b71671b649c03714da9c621285943f3cbcdc6", + "token": { + "decimals": 18, + "symbol": "DIS" + }, + "isSC": {} + }, + "0xe9f84d418b008888a992ff8c6d22389c2c3504e0": { + "name": "BASE token contract", + "address": "0xe9f84d418b008888a992ff8c6d22389c2c3504e0", + "token": { + "decimals": 8, + "symbol": "BASE" + }, + "isSC": {} + }, + "0xda7c0810ce6f8329786160bb3d1734cf6661ca6e": { + "name": "JAY token contract", + "address": "0xda7c0810ce6f8329786160bb3d1734cf6661ca6e", + "token": { + "decimals": 18, + "symbol": "JAY" + }, + "isSC": {} + }, + "0x0335a7610d817aeca1bebbefbd392ecc2ed587b8": { + "name": "NITRO token contract", + "address": "0x0335a7610d817aeca1bebbefbd392ecc2ed587b8", + "token": { + "decimals": 18, + "symbol": "NITRO" + }, + "isSC": {} + }, + "0x38d9eb07a7b8df7d86f440a4a5c4a4c1a27e1a08": { + "name": "BLXM token contract", + "address": "0x38d9eb07a7b8df7d86f440a4a5c4a4c1a27e1a08", + "token": { + "decimals": 18, + "symbol": "BLXM" + }, + "isSC": {} + }, + "0xaa0c5b3567fd1bac8a2a11eb16c3f81a49eea90f": { + "name": "MMAI token contract", + "address": "0xaa0c5b3567fd1bac8a2a11eb16c3f81a49eea90f", + "token": { + "decimals": 7, + "symbol": "MMAI" + }, + "isSC": {} + }, + "0x602f65bb8b8098ad804e99db6760fd36208cd967": { + "name": "MOPS token contract", + "address": "0x602f65bb8b8098ad804e99db6760fd36208cd967", + "token": { + "decimals": 18, + "symbol": "MOPS" + }, + "isSC": {} + }, + "0x7e877b99897d514da01bd1d177e693ec639961af": { + "name": "OGGY token contract", + "address": "0x7e877b99897d514da01bd1d177e693ec639961af", + "token": { + "decimals": 9, + "symbol": "OGGY" + }, + "isSC": {} + }, + "0x6d10e0194400a04600881057787eb9e9c063dca0": { + "name": "PRTN token contract", + "address": "0x6d10e0194400a04600881057787eb9e9c063dca0", + "token": { + "decimals": 18, + "symbol": "PRTN" + }, + "isSC": {} + }, + "0x675bbc7514013e2073db7a919f6e4cbef576de37": { + "name": "CLS token contract", + "address": "0x675bbc7514013e2073db7a919f6e4cbef576de37", + "token": { + "decimals": 18, + "symbol": "CLS" + }, + "isSC": {} + }, + "0x1e610de0d7acfa1d820024948a91d96c5c9ce6b9": { + "name": "UBAYC token contract", + "address": "0x1e610de0d7acfa1d820024948a91d96c5c9ce6b9", + "token": { + "decimals": 18, + "symbol": "UBAYC" + }, + "isSC": {} + }, + "0xdc349913d53b446485e98b76800b6254f43df695": { + "name": "BEZOGE token contract", + "address": "0xdc349913d53b446485e98b76800b6254f43df695", + "token": { + "decimals": 9, + "symbol": "BEZOGE" + }, + "isSC": {} + }, + "0xab93df617f51e1e415b5b4f8111f122d6b48e55c": { + "name": "DETO token contract", + "address": "0xab93df617f51e1e415b5b4f8111f122d6b48e55c", + "token": { + "decimals": 18, + "symbol": "DETO" + }, + "isSC": {} + }, + "0x998ffe1e43facffb941dc337dd0468d52ba5b48a": { + "name": "Rupiah Token", + "address": "0x998ffe1e43facffb941dc337dd0468d52ba5b48a", + "token": { + "decimals": 2, + "symbol": "IDRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/idrt.svg" + }, + "0xac1419ee74f203c6b9daa3635ad7169b7ebb5c1a": { + "name": "NEBULA token contract", + "address": "0xac1419ee74f203c6b9daa3635ad7169b7ebb5c1a", + "token": { + "decimals": 9, + "symbol": "NEBULA" + }, + "isSC": {} + }, + "0x9994e35db50125e0df82e4c2dde62496ce330999": { + "name": "MORPHO token contract", + "address": "0x9994e35db50125e0df82e4c2dde62496ce330999", + "token": { + "decimals": 18, + "symbol": "MORPHO" + }, + "isSC": {} + }, + "0x67c5870b4a41d4ebef24d2456547a03f1f3e094b": { + "name": "G token contract", + "address": "0x67c5870b4a41d4ebef24d2456547a03f1f3e094b", + "token": { + "decimals": 2, + "symbol": "G" + }, + "isSC": {} + }, + "0x98585dfc8d9e7d48f0b1ae47ce33332cf4237d96": { + "name": "NEWO token contract", + "address": "0x98585dfc8d9e7d48f0b1ae47ce33332cf4237d96", + "token": { + "decimals": 18, + "symbol": "NEWO" + }, + "isSC": {} + }, + "0x0f5c78f152152dda52a2ea45b0a8c10733010748": { + "name": "XOX token contract", + "address": "0x0f5c78f152152dda52a2ea45b0a8c10733010748", + "token": { + "decimals": 18, + "symbol": "XOX" + }, + "isSC": {} + }, + "0x0176b898e92e814c06cc379e508ceb571f70bd40": { + "name": "TIP token contract", + "address": "0x0176b898e92e814c06cc379e508ceb571f70bd40", + "token": { + "decimals": 18, + "symbol": "TIP" + }, + "isSC": {} + }, + "0x1cc30e2eac975416060ec6fe682041408420d414": { + "name": "KOL token contract", + "address": "0x1cc30e2eac975416060ec6fe682041408420d414", + "token": { + "decimals": 18, + "symbol": "KOL" + }, + "isSC": {} + }, + "0x2d94aa3e47d9d5024503ca8491fce9a2fb4da198": { + "name": "BANK token contract", + "address": "0x2d94aa3e47d9d5024503ca8491fce9a2fb4da198", + "token": { + "decimals": 18, + "symbol": "BANK" + }, + "isSC": {} + }, + "0x5d56b6581d2e7e7574adce2dc593f499a53d7505": { + "name": "MACHINA token contract", + "address": "0x5d56b6581d2e7e7574adce2dc593f499a53d7505", + "token": { + "decimals": 18, + "symbol": "MACHINA" + }, + "isSC": {} + }, + "0x1936c91190e901b7dd55229a574ae22b58ff498a": { + "name": "MEVFREE token contract", + "address": "0x1936c91190e901b7dd55229a574ae22b58ff498a", + "token": { + "decimals": 18, + "symbol": "MEVFREE" + }, + "isSC": {} + }, + "0x9f8ae89b695fd1773175ccb9106a90ce868acab0": { + "name": "ALT token contract", + "address": "0x9f8ae89b695fd1773175ccb9106a90ce868acab0", + "token": { + "decimals": 18, + "symbol": "ALT" + }, + "isSC": {} + }, + "0x556bb0b27e855e6f2cebb47174495b9bbeb97ff1": { + "name": "CTRL token contract", + "address": "0x556bb0b27e855e6f2cebb47174495b9bbeb97ff1", + "token": { + "decimals": 18, + "symbol": "CTRL" + }, + "isSC": {} + }, + "0x9138c8779a0ac8a84d69617d5715bd8afa23c650": { + "name": "FLRBRG token contract", + "address": "0x9138c8779a0ac8a84d69617d5715bd8afa23c650", + "token": { + "decimals": 18, + "symbol": "FLRBRG" + }, + "isSC": {} + }, + "0x3e2324342bf5b8a1dca42915f0489497203d640e": { + "name": "BARL token contract", + "address": "0x3e2324342bf5b8a1dca42915f0489497203d640e", + "token": { + "decimals": 18, + "symbol": "BARL" + }, + "isSC": {} + }, + "0x1ef846ce0da79d8d4e111bf8c5117cd1209a0478": { + "name": "ETHINU token contract", + "address": "0x1ef846ce0da79d8d4e111bf8c5117cd1209a0478", + "token": { + "decimals": 8, + "symbol": "ETHINU" + }, + "isSC": {} + }, + "0xc770eefad204b5180df6a14ee197d99d808ee52d": { + "name": "FOX token contract", + "address": "0xc770eefad204b5180df6a14ee197d99d808ee52d", + "token": { + "decimals": 18, + "symbol": "FOX" + }, + "isSC": {} + }, + "0x4551d8ec1257092cd42b85824c45f944083c7885": { + "name": "CXM token contract", + "address": "0x4551d8ec1257092cd42b85824c45f944083c7885", + "token": { + "decimals": 18, + "symbol": "CXM" + }, + "isSC": {} + }, + "0x08d0222a206d1aee59a9b66969c04fd1e8a0f864": { + "name": "MOMOV2 token contract", + "address": "0x08d0222a206d1aee59a9b66969c04fd1e8a0f864", + "token": { + "decimals": 18, + "symbol": "MOMOV2" + }, + "isSC": {} + }, + "0x5bb15141bb6def6d2bafeed8ff84bf889c0c573b": { + "name": "LVM token contract", + "address": "0x5bb15141bb6def6d2bafeed8ff84bf889c0c573b", + "token": { + "decimals": 18, + "symbol": "LVM" + }, + "isSC": {} + }, + "0xc47ef9b19c3e29317a50f5fbe594eba361dada4a": { + "name": "EDLC token contract", + "address": "0xc47ef9b19c3e29317a50f5fbe594eba361dada4a", + "token": { + "decimals": 6, + "symbol": "EDLC" + }, + "isSC": {} + }, + "0x6c862f803ff42a97d4a483ab761256ad8c90f4f8": { + "name": "XLS token contract", + "address": "0x6c862f803ff42a97d4a483ab761256ad8c90f4f8", + "token": { + "decimals": 18, + "symbol": "XLS" + }, + "isSC": {} + }, + "0x57f12fe6a4e5fe819eec699fadf9db2d06606bb4": { + "name": "NPM token contract", + "address": "0x57f12fe6a4e5fe819eec699fadf9db2d06606bb4", + "token": { + "decimals": 18, + "symbol": "NPM" + }, + "isSC": {} + }, + "0xc5fdf3569af74f3b3e97e46a187a626352d2d508": { + "name": "ZINU token contract", + "address": "0xc5fdf3569af74f3b3e97e46a187a626352d2d508", + "token": { + "decimals": 9, + "symbol": "ZINU" + }, + "isSC": {} + }, + "0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6": { + "name": "RCN token contract", + "address": "0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6", + "token": { + "decimals": 18, + "symbol": "RCN" + }, + "isSC": {} + }, + "0xf92d62ed69242d655e685c96b98f32f1409c3262": { + "name": "A4M token contract", + "address": "0xf92d62ed69242d655e685c96b98f32f1409c3262", + "token": { + "decimals": 9, + "symbol": "A4M" + }, + "isSC": {} + }, + "0x0d86eb9f43c57f6ff3bc9e23d8f9d82503f0e84b": { + "name": "MAXI token contract", + "address": "0x0d86eb9f43c57f6ff3bc9e23d8f9d82503f0e84b", + "token": { + "decimals": 8, + "symbol": "MAXI" + }, + "isSC": {} + }, + "0x9360c489056b64d5003bf22f4f31458e31cc8028": { + "name": "BANK token contract", + "address": "0x9360c489056b64d5003bf22f4f31458e31cc8028", + "token": { + "decimals": 18, + "symbol": "BANK" + }, + "isSC": {} + }, + "0xf680429328caaacabee69b7a9fdb21a71419c063": { + "name": "BFLY token contract", + "address": "0xf680429328caaacabee69b7a9fdb21a71419c063", + "token": { + "decimals": 18, + "symbol": "BFLY" + }, + "isSC": {} + }, + "0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc": { + "name": "HOP token contract", + "address": "0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc", + "token": { + "decimals": 18, + "symbol": "HOP" + }, + "isSC": {} + }, + "0x48c276e8d03813224bb1e55f953adb6d02fd3e02": { + "name": "KUMA token contract", + "address": "0x48c276e8d03813224bb1e55f953adb6d02fd3e02", + "token": { + "decimals": 18, + "symbol": "KUMA" + }, + "isSC": {} + }, + "0x45e412e1878080815d6d51d47b83d17869433459": { + "name": "CTO token contract", + "address": "0x45e412e1878080815d6d51d47b83d17869433459", + "token": { + "decimals": 18, + "symbol": "CTO" + }, + "isSC": {} + }, + "0x6468e79a80c0eab0f9a2b574c8d5bc374af59414": { + "name": "EXRD token contract", + "address": "0x6468e79a80c0eab0f9a2b574c8d5bc374af59414", + "token": { + "decimals": 18, + "symbol": "EXRD" + }, + "isSC": {} + }, + "0x4efe8665e564bf454ccf5c90ee16817f7485d5cf": { + "name": "BDT token contract", + "address": "0x4efe8665e564bf454ccf5c90ee16817f7485d5cf", + "token": { + "decimals": 18, + "symbol": "BDT" + }, + "isSC": {} + }, + "0x0ff5a8451a839f5f0bb3562689d9a44089738d11": { + "name": "RDPX token contract", + "address": "0x0ff5a8451a839f5f0bb3562689d9a44089738d11", + "token": { + "decimals": 18, + "symbol": "RDPX" + }, + "isSC": {} + }, + "0xffe203b59393593965842439ce1e7d7c78109b46": { + "name": "DOGE-1 token contract", + "address": "0xffe203b59393593965842439ce1e7d7c78109b46", + "token": { + "decimals": 18, + "symbol": "DOGE-1" + }, + "isSC": {} + }, + "0x02e7f808990638e9e67e1f00313037ede2362361": { + "name": "KIBSHI token contract", + "address": "0x02e7f808990638e9e67e1f00313037ede2362361", + "token": { + "decimals": 18, + "symbol": "KIBSHI" + }, + "isSC": {} + }, + "0x9f891b5ecbd89dd8a5ee4d1d80efc3fe78b306cb": { + "name": "SONIK token contract", + "address": "0x9f891b5ecbd89dd8a5ee4d1d80efc3fe78b306cb", + "token": { + "decimals": 18, + "symbol": "SONIK" + }, + "isSC": {} + }, + "0xfb5c6815ca3ac72ce9f5006869ae67f18bf77006": { + "name": "pSTAKE Finance", + "address": "0xfb5c6815ca3ac72ce9f5006869ae67f18bf77006", + "token": { + "decimals": 18, + "symbol": "PSTAKE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pstake.svg" + }, + "0x4cc19356f2d37338b9802aa8e8fc58b0373296e7": { + "name": "Selfkey", + "address": "0x4cc19356f2d37338b9802aa8e8fc58b0373296e7", + "token": { + "decimals": 18, + "symbol": "KEY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/KEY.svg" + }, + "0xf538296e7dd856af7044deec949489e2f25705bc": { + "name": "MILK token contract", + "address": "0xf538296e7dd856af7044deec949489e2f25705bc", + "token": { + "decimals": 18, + "symbol": "MILK" + }, + "isSC": {} + }, + "0x701c244b988a513c945973defa05de933b23fe1d": { + "name": "OAX token contract", + "address": "0x701c244b988a513c945973defa05de933b23fe1d", + "token": { + "decimals": 18, + "symbol": "OAX" + }, + "isSC": {} + }, + "0x108a850856db3f85d0269a2693d896b394c80325": { + "name": "TGT token contract", + "address": "0x108a850856db3f85d0269a2693d896b394c80325", + "token": { + "decimals": 18, + "symbol": "TGT" + }, + "isSC": {} + }, + "0xd23b160e4a0db09ca35a79948e04cf6eafb5283a": { + "name": "BLEND token contract", + "address": "0xd23b160e4a0db09ca35a79948e04cf6eafb5283a", + "token": { + "decimals": 18, + "symbol": "BLEND" + }, + "isSC": {} + }, + "0x0af55d5ff28a3269d69b98680fd034f115dd53ac": { + "name": "BSL token contract", + "address": "0x0af55d5ff28a3269d69b98680fd034f115dd53ac", + "token": { + "decimals": 8, + "symbol": "BSL" + }, + "isSC": {} + }, + "0x24e89bdf2f65326b94e36978a7edeac63623dafa": { + "name": "TKING token contract", + "address": "0x24e89bdf2f65326b94e36978a7edeac63623dafa", + "token": { + "decimals": 18, + "symbol": "TKING" + }, + "isSC": {} + }, + "0x6b9f031d718dded0d681c20cb754f97b3bb81b78": { + "name": "GEEQ token contract", + "address": "0x6b9f031d718dded0d681c20cb754f97b3bb81b78", + "token": { + "decimals": 18, + "symbol": "GEEQ" + }, + "isSC": {} + }, + "0xcedefe438860d2789da6419b3a19cece2a41038d": { + "name": "LHINU token contract", + "address": "0xcedefe438860d2789da6419b3a19cece2a41038d", + "token": { + "decimals": 18, + "symbol": "LHINU" + }, + "isSC": {} + }, + "0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0": { + "name": "The 4th Pillar Token", + "address": "0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0", + "token": { + "decimals": 18, + "symbol": "FOUR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/four.svg" + }, + "0xf7413489c474ca4399eee604716c72879eea3615": { + "name": "APYS token contract", + "address": "0xf7413489c474ca4399eee604716c72879eea3615", + "token": { + "decimals": 18, + "symbol": "APYS" + }, + "isSC": {} + }, + "0xf0939011a9bb95c3b791f0cb546377ed2693a574": { + "name": "ZERO token contract", + "address": "0xf0939011a9bb95c3b791f0cb546377ed2693a574", + "token": { + "decimals": 18, + "symbol": "ZERO" + }, + "isSC": {} + }, + "0xdcc97d2c1048e8f3f2fc58ace9024ab8b350e4b1": { + "name": "BEN token contract", + "address": "0xdcc97d2c1048e8f3f2fc58ace9024ab8b350e4b1", + "token": { + "decimals": 18, + "symbol": "BEN" + }, + "isSC": {} + }, + "0x205ed31c867bf715e4182137af95afe9177cd8e7": { + "name": "DEFY token contract", + "address": "0x205ed31c867bf715e4182137af95afe9177cd8e7", + "token": { + "decimals": 18, + "symbol": "DEFY" + }, + "isSC": {} + }, + "0x5319e86f0e41a06e49eb37046b8c11d78bcad68c": { + "name": "ZLW token contract", + "address": "0x5319e86f0e41a06e49eb37046b8c11d78bcad68c", + "token": { + "decimals": 18, + "symbol": "ZLW" + }, + "isSC": {} + }, + "0xf009f5531de69067435e32c4b9d36077f4c4a673": { + "name": "UNV token contract", + "address": "0xf009f5531de69067435e32c4b9d36077f4c4a673", + "token": { + "decimals": 18, + "symbol": "UNV" + }, + "isSC": {} + }, + "0x6f91d21de4e40b3b80636b6b3ba425b636b798cf": { + "name": "WSB token contract", + "address": "0x6f91d21de4e40b3b80636b6b3ba425b636b798cf", + "token": { + "decimals": 9, + "symbol": "WSB" + }, + "isSC": {} + }, + "0x9b3a8159e119eb09822115ae08ee1526849e1116": { + "name": "MMA token contract", + "address": "0x9b3a8159e119eb09822115ae08ee1526849e1116", + "token": { + "decimals": 9, + "symbol": "MMA" + }, + "isSC": {} + }, + "0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb": { + "name": "Synth sETH", + "address": "0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb", + "token": { + "decimals": 18, + "symbol": "SETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/synthetix_seth.svg" + }, + "0x6e9730ecffbed43fd876a264c982e254ef05a0de": { + "name": "NORD token contract", + "address": "0x6e9730ecffbed43fd876a264c982e254ef05a0de", + "token": { + "decimals": 18, + "symbol": "NORD" + }, + "isSC": {} + }, + "0xdddddd4301a082e62e84e43f474f044423921918": { + "name": "DVF token contract", + "address": "0xdddddd4301a082e62e84e43f474f044423921918", + "token": { + "decimals": 18, + "symbol": "DVF" + }, + "isSC": {} + }, + "0xe76c6c83af64e4c60245d8c7de953df673a7a33d": { + "name": "RAIL token contract", + "address": "0xe76c6c83af64e4c60245d8c7de953df673a7a33d", + "token": { + "decimals": 18, + "symbol": "RAIL" + }, + "isSC": {} + }, + "0x2596825a84888e8f24b747df29e11b5dd03c81d7": { + "name": "FTRB token contract", + "address": "0x2596825a84888e8f24b747df29e11b5dd03c81d7", + "token": { + "decimals": 18, + "symbol": "FTRB" + }, + "isSC": {} + }, + "0xc12d099be31567add4e4e4d0d45691c3f58f5663": { + "name": "Auctus", + "address": "0xc12d099be31567add4e4e4d0d45691c3f58f5663", + "token": { + "decimals": 18, + "symbol": "AUC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/auc.svg" + }, + "0x0f71b8de197a1c84d31de0f1fa7926c365f052b3": { + "name": "ARCONA token contract", + "address": "0x0f71b8de197a1c84d31de0f1fa7926c365f052b3", + "token": { + "decimals": 18, + "symbol": "ARCONA" + }, + "isSC": {} + }, + "0xda396b2ea32996f471e4434f2d7b8c3abc352c62": { + "name": "BETS token contract", + "address": "0xda396b2ea32996f471e4434f2d7b8c3abc352c62", + "token": { + "decimals": 18, + "symbol": "BETS" + }, + "isSC": {} + }, + "0xc5bddf9843308380375a611c18b50fb9341f502a": { + "name": "YVE-crvdao token contract", + "address": "0xc5bddf9843308380375a611c18b50fb9341f502a", + "token": { + "decimals": 18, + "symbol": "YVE-crvdao" + }, + "isSC": {} + }, + "0xf3ff80d631f7eec2c90180a3cddb3b95e87e2612": { + "name": "COCO token contract", + "address": "0xf3ff80d631f7eec2c90180a3cddb3b95e87e2612", + "token": { + "decimals": 18, + "symbol": "COCO" + }, + "isSC": {} + }, + "0x64a5b80089c0fb4858a8c2ca9c2988a484539fd8": { + "name": "PRINT token contract", + "address": "0x64a5b80089c0fb4858a8c2ca9c2988a484539fd8", + "token": { + "decimals": 18, + "symbol": "PRINT" + }, + "isSC": {} + }, + "0x3cb48aeb3d1abadc23d2d8a6894b3a68338381c2": { + "name": "PALAI token contract", + "address": "0x3cb48aeb3d1abadc23d2d8a6894b3a68338381c2", + "token": { + "decimals": 9, + "symbol": "PALAI" + }, + "isSC": {} + }, + "0xbf5495efe5db9ce00f80364c8b423567e58d2110": { + "name": "EZETH token contract", + "address": "0xbf5495efe5db9ce00f80364c8b423567e58d2110", + "token": { + "decimals": 18, + "symbol": "EZETH" + }, + "isSC": {} + }, + "0x5dc60c4d5e75d22588fa17ffeb90a63e535efce0": { + "name": "dKargo", + "address": "0x5dc60c4d5e75d22588fa17ffeb90a63e535efce0", + "token": { + "decimals": 18, + "symbol": "DKA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DKA.svg" + }, + "0xa2085073878152ac3090ea13d1e41bd69e60dc99": { + "name": "ELG token contract", + "address": "0xa2085073878152ac3090ea13d1e41bd69e60dc99", + "token": { + "decimals": 18, + "symbol": "ELG" + }, + "isSC": {} + }, + "0x03042482d64577a7bdb282260e2ea4c8a89c064b": { + "name": "CNTR token contract", + "address": "0x03042482d64577a7bdb282260e2ea4c8a89c064b", + "token": { + "decimals": 18, + "symbol": "CNTR" + }, + "isSC": {} + }, + "0x4ec1b60b96193a64acae44778e51f7bff2007831": { + "name": "EDGE token contract", + "address": "0x4ec1b60b96193a64acae44778e51f7bff2007831", + "token": { + "decimals": 18, + "symbol": "EDGE" + }, + "isSC": {} + }, + "0xc36b4311b21fc0c2ead46f1ea6ce97c9c4d98d3d": { + "name": "CRE8 token contract", + "address": "0xc36b4311b21fc0c2ead46f1ea6ce97c9c4d98d3d", + "token": { + "decimals": 18, + "symbol": "CRE8" + }, + "isSC": {} + }, + "0xf043809056ac2492c4aae6317705f751082c0db1": { + "name": "ELONGATE token contract", + "address": "0xf043809056ac2492c4aae6317705f751082c0db1", + "token": { + "decimals": 18, + "symbol": "ELONGATE" + }, + "isSC": {} + }, + "0xdb25f211ab05b1c97d595516f45794528a807ad8": { + "name": "STASIS EURS Token", + "address": "0xdb25f211ab05b1c97d595516f45794528a807ad8", + "token": { + "decimals": 2, + "symbol": "EURS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stasis-eurs.svg" + }, + "0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9": { + "name": "DONUT token contract", + "address": "0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9", + "token": { + "decimals": 18, + "symbol": "DONUT" + }, + "isSC": {} + }, + "0x53340a1ef3a0ddeba1d94bbd1e2ff55936f0ea60": { + "name": "BARK token contract", + "address": "0x53340a1ef3a0ddeba1d94bbd1e2ff55936f0ea60", + "token": { + "decimals": 18, + "symbol": "BARK" + }, + "isSC": {} + }, + "0xe73cec024b30a7195af80d13f3b6917d80af11d8": { + "name": "GOAT token contract", + "address": "0xe73cec024b30a7195af80d13f3b6917d80af11d8", + "token": { + "decimals": 9, + "symbol": "GOAT" + }, + "isSC": {} + }, + "0x259ce0cb3581995d40cbb03fd4badeaaba1edaff": { + "name": "SXS token contract", + "address": "0x259ce0cb3581995d40cbb03fd4badeaaba1edaff", + "token": { + "decimals": 18, + "symbol": "SXS" + }, + "isSC": {} + }, + "0x83e9f223e1edb3486f876ee888d76bfba26c475a": { + "name": "GUILD token contract", + "address": "0x83e9f223e1edb3486f876ee888d76bfba26c475a", + "token": { + "decimals": 18, + "symbol": "GUILD" + }, + "isSC": {} + }, + "0x793786e2dd4cc492ed366a94b88a3ff9ba5e7546": { + "name": "AXIAV3 token contract", + "address": "0x793786e2dd4cc492ed366a94b88a3ff9ba5e7546", + "token": { + "decimals": 18, + "symbol": "AXIAV3" + }, + "isSC": {} + }, + "0xd528cf2e081f72908e086f8800977df826b5a483": { + "name": "PBX token contract", + "address": "0xd528cf2e081f72908e086f8800977df826b5a483", + "token": { + "decimals": 18, + "symbol": "PBX" + }, + "isSC": {} + }, + "0x618679df9efcd19694bb1daa8d00718eacfa2883": { + "name": "XYZ token contract", + "address": "0x618679df9efcd19694bb1daa8d00718eacfa2883", + "token": { + "decimals": 18, + "symbol": "XYZ" + }, + "isSC": {} + }, + "0xa88842ae47dbe87116cf7001dddd1b246fcd8262": { + "name": "HIENS3 token contract", + "address": "0xa88842ae47dbe87116cf7001dddd1b246fcd8262", + "token": { + "decimals": 18, + "symbol": "HIENS3" + }, + "isSC": {} + }, + "0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3": { + "name": "HXRO token contract", + "address": "0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3", + "token": { + "decimals": 18, + "symbol": "HXRO" + }, + "isSC": {} + }, + "0xcaeaf8381d4b20b43afa42061d6f80319a8881f6": { + "name": "R34P token contract", + "address": "0xcaeaf8381d4b20b43afa42061d6f80319a8881f6", + "token": { + "decimals": 8, + "symbol": "R34P" + }, + "isSC": {} + }, + "0xbb1ee07d6c7baeb702949904080eb61f5d5e7732": { + "name": "DINU token contract", + "address": "0xbb1ee07d6c7baeb702949904080eb61f5d5e7732", + "token": { + "decimals": 18, + "symbol": "DINU" + }, + "isSC": {} + }, + "0x31fdd1c6607f47c14a2821f599211c67ac20fa96": { + "name": "BUY token contract", + "address": "0x31fdd1c6607f47c14a2821f599211c67ac20fa96", + "token": { + "decimals": 18, + "symbol": "BUY" + }, + "isSC": {} + }, + "0x7c3ed93b03e67c1fa240395b28e38c4386321b58": { + "name": "WALLY token contract", + "address": "0x7c3ed93b03e67c1fa240395b28e38c4386321b58", + "token": { + "decimals": 9, + "symbol": "WALLY" + }, + "isSC": {} + }, + "0x487d62468282bd04ddf976631c23128a425555ee": { + "name": "UPCX", + "address": "0x487d62468282bd04ddf976631c23128a425555ee", + "token": { + "decimals": 5, + "symbol": "UPC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/UPC.svg" + }, + "0xe86df1970055e9caee93dae9b7d5fd71595d0e18": { + "name": "BTC20 token contract", + "address": "0xe86df1970055e9caee93dae9b7d5fd71595d0e18", + "token": { + "decimals": 18, + "symbol": "BTC20" + }, + "isSC": {} + }, + "0x98ce7f261e425ad0ca667e60675938dcffc1571a": { + "name": "MANE token contract", + "address": "0x98ce7f261e425ad0ca667e60675938dcffc1571a", + "token": { + "decimals": 18, + "symbol": "MANE" + }, + "isSC": {} + }, + "0x4ebe70cb942d5af0a18b9126762637e7098ff5fd": { + "name": "G token contract", + "address": "0x4ebe70cb942d5af0a18b9126762637e7098ff5fd", + "token": { + "decimals": 9, + "symbol": "G" + }, + "isSC": {} + }, + "0x56d811088235f11c8920698a204a5010a788f4b3": { + "name": "bZx Protocol Token (BZRX)", + "address": "0x56d811088235f11c8920698a204a5010a788f4b3", + "token": { + "decimals": 18, + "symbol": "BZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_bzrx.svg" + }, + "0x8c6bf16c273636523c29db7db04396143770f6a0": { + "name": "AAA token contract", + "address": "0x8c6bf16c273636523c29db7db04396143770f6a0", + "token": { + "decimals": 18, + "symbol": "AAA" + }, + "isSC": {} + }, + "0x93999d3fcab15cc052cf96b739580fc11e015944": { + "name": "NGS token contract", + "address": "0x93999d3fcab15cc052cf96b739580fc11e015944", + "token": { + "decimals": 18, + "symbol": "NGS" + }, + "isSC": {} + }, + "0x0642026e7f0b6ccac5925b4e7fa61384250e1701": { + "name": "H2O token contract", + "address": "0x0642026e7f0b6ccac5925b4e7fa61384250e1701", + "token": { + "decimals": 18, + "symbol": "H2O" + }, + "isSC": {} + }, + "0x850aab69f0e0171a9a49db8be3e71351c8247df4": { + "name": "KONO token contract", + "address": "0x850aab69f0e0171a9a49db8be3e71351c8247df4", + "token": { + "decimals": 18, + "symbol": "KONO" + }, + "isSC": {} + }, + "0xfbe878ced08132bd8396988671b450793c44bc12": { + "name": "FOXT token contract", + "address": "0xfbe878ced08132bd8396988671b450793c44bc12", + "token": { + "decimals": 18, + "symbol": "FOXT" + }, + "isSC": {} + }, + "0x7e6f60e237c34307d516ef80218c2b04bccbca40": { + "name": "TRACKR token contract", + "address": "0x7e6f60e237c34307d516ef80218c2b04bccbca40", + "token": { + "decimals": 18, + "symbol": "TRACKR" + }, + "isSC": {} + }, + "0x00a7ec2f2b451cb0233e8adbf4c9a951027c2b02": { + "name": "HIENS4 token contract", + "address": "0x00a7ec2f2b451cb0233e8adbf4c9a951027c2b02", + "token": { + "decimals": 18, + "symbol": "HIENS4" + }, + "isSC": {} + }, + "0x9f52c8ecbee10e00d9faaac5ee9ba0ff6550f511": { + "name": "SIPHER token contract", + "address": "0x9f52c8ecbee10e00d9faaac5ee9ba0ff6550f511", + "token": { + "decimals": 18, + "symbol": "SIPHER" + }, + "isSC": {} + }, + "0x104f3152d8ebfc3f679392977356962ff36566ac": { + "name": "PORTX token contract", + "address": "0x104f3152d8ebfc3f679392977356962ff36566ac", + "token": { + "decimals": 18, + "symbol": "PORTX" + }, + "isSC": {} + }, + "0xb90b2a35c65dbc466b04240097ca756ad2005295": { + "name": "BOBO token contract", + "address": "0xb90b2a35c65dbc466b04240097ca756ad2005295", + "token": { + "decimals": 18, + "symbol": "BOBO" + }, + "isSC": {} + }, + "0x6226e00bcac68b0fe55583b90a1d727c14fab77f": { + "name": "MTV token contract", + "address": "0x6226e00bcac68b0fe55583b90a1d727c14fab77f", + "token": { + "decimals": 18, + "symbol": "MTV" + }, + "isSC": {} + }, + "0x68ffb43026cedc070bfc01b2203d90cab62ccf30": { + "name": "TUSHI token contract", + "address": "0x68ffb43026cedc070bfc01b2203d90cab62ccf30", + "token": { + "decimals": 18, + "symbol": "TUSHI" + }, + "isSC": {} + }, + "0x77e06c9eccf2e797fd462a92b6d7642ef85b0a44": { + "name": "WTAO token contract", + "address": "0x77e06c9eccf2e797fd462a92b6d7642ef85b0a44", + "token": { + "decimals": 9, + "symbol": "WTAO" + }, + "isSC": {} + }, + "0x86eab36585eddb7a949a0b4771ba733d942a8aa7": { + "name": "REDDIT token contract", + "address": "0x86eab36585eddb7a949a0b4771ba733d942a8aa7", + "token": { + "decimals": 9, + "symbol": "REDDIT" + }, + "isSC": {} + }, + "0x0cba60ca5ef4d42f92a5070a8fedd13be93e2861": { + "name": "THE token contract", + "address": "0x0cba60ca5ef4d42f92a5070a8fedd13be93e2861", + "token": { + "decimals": 18, + "symbol": "THE" + }, + "isSC": {} + }, + "0xd77401a76d6cdb7ac3bb031bf25dec07615509e7": { + "name": "METRO token contract", + "address": "0xd77401a76d6cdb7ac3bb031bf25dec07615509e7", + "token": { + "decimals": 18, + "symbol": "METRO" + }, + "isSC": {} + }, + "0x76c81e322fe678f9391029d571453fad9bc9e73e": { + "name": "EDFI token contract", + "address": "0x76c81e322fe678f9391029d571453fad9bc9e73e", + "token": { + "decimals": 18, + "symbol": "EDFI" + }, + "isSC": {} + }, + "0x619e398858a3110df4d89056a15a40338a01e65f": { + "name": "GARBAGE token contract", + "address": "0x619e398858a3110df4d89056a15a40338a01e65f", + "token": { + "decimals": 18, + "symbol": "GARBAGE" + }, + "isSC": {} + }, + "0x43ab765ee05075d78ad8aa79dcb1978ca3079258": { + "name": "POW token contract", + "address": "0x43ab765ee05075d78ad8aa79dcb1978ca3079258", + "token": { + "decimals": 18, + "symbol": "POW" + }, + "isSC": {} + }, + "0xc3960227e41c3f54e9b399ce216149dea5315c34": { + "name": "CZ token contract", + "address": "0xc3960227e41c3f54e9b399ce216149dea5315c34", + "token": { + "decimals": 9, + "symbol": "CZ" + }, + "isSC": {} + }, + "0x188e817b02e635d482ae4d81e25dda98a97c4a42": { + "name": "LITH token contract", + "address": "0x188e817b02e635d482ae4d81e25dda98a97c4a42", + "token": { + "decimals": 18, + "symbol": "LITH" + }, + "isSC": {} + }, + "0x9ce84f6a69986a83d92c324df10bc8e64771030f": { + "name": "CHEX token contract", + "address": "0x9ce84f6a69986a83d92c324df10bc8e64771030f", + "token": { + "decimals": 18, + "symbol": "CHEX" + }, + "isSC": {} + }, + "0xf70ce9ee486106882d3dc43ddbd84e0fa71ac2a5": { + "name": "DUCKER token contract", + "address": "0xf70ce9ee486106882d3dc43ddbd84e0fa71ac2a5", + "token": { + "decimals": 18, + "symbol": "DUCKER" + }, + "isSC": {} + }, + "0xc3d2b3e23855001508e460a6dbe9f9e3116201af": { + "name": "MARS token contract", + "address": "0xc3d2b3e23855001508e460a6dbe9f9e3116201af", + "token": { + "decimals": 9, + "symbol": "MARS" + }, + "isSC": {} + }, + "0x3a8cccb969a61532d1e6005e2ce12c200caece87": { + "name": "TITAN token contract", + "address": "0x3a8cccb969a61532d1e6005e2ce12c200caece87", + "token": { + "decimals": 18, + "symbol": "TITAN" + }, + "isSC": {} + }, + "0xbe9f61555f50dd6167f2772e9cf7519790d96624": { + "name": "SX token contract", + "address": "0xbe9f61555f50dd6167f2772e9cf7519790d96624", + "token": { + "decimals": 18, + "symbol": "SX" + }, + "isSC": {} + }, + "0x5d929aa919e489505ccaad8a199619c6dca0c2de": { + "name": "BAAS token contract", + "address": "0x5d929aa919e489505ccaad8a199619c6dca0c2de", + "token": { + "decimals": 18, + "symbol": "BAAS" + }, + "isSC": {} + }, + "0xf56842af3b56fd72d17cb103f92d027bba912e89": { + "name": "BAMBOO token contract", + "address": "0xf56842af3b56fd72d17cb103f92d027bba912e89", + "token": { + "decimals": 18, + "symbol": "BAMBOO" + }, + "isSC": {} + }, + "0xad5fe5b0b8ec8ff4565204990e4405b2da117d8e": { + "name": "TRXC token contract", + "address": "0xad5fe5b0b8ec8ff4565204990e4405b2da117d8e", + "token": { + "decimals": 0, + "symbol": "TRXC" + }, + "isSC": {} + }, + "0x144805be43c48ef85435c94e0da4cb4efb1ab4f3": { + "name": "MBX token contract", + "address": "0x144805be43c48ef85435c94e0da4cb4efb1ab4f3", + "token": { + "decimals": 18, + "symbol": "MBX" + }, + "isSC": {} + }, + "0x8c6778023c3d4fd79ddd14810079f64c39e9e43d": { + "name": "0XAISWAP token contract", + "address": "0x8c6778023c3d4fd79ddd14810079f64c39e9e43d", + "token": { + "decimals": 18, + "symbol": "0XAISWAP" + }, + "isSC": {} + }, + "0x8355dbe8b0e275abad27eb843f3eaf3fc855e525": { + "name": "WOOL token contract", + "address": "0x8355dbe8b0e275abad27eb843f3eaf3fc855e525", + "token": { + "decimals": 18, + "symbol": "WOOL" + }, + "isSC": {} + }, + "0x29fa1fee0f4f0ab0e36ef7ab8d7a35439ec6be75": { + "name": "DVT token contract", + "address": "0x29fa1fee0f4f0ab0e36ef7ab8d7a35439ec6be75", + "token": { + "decimals": 18, + "symbol": "DVT" + }, + "isSC": {} + }, + "0x6e605c269e0c92e70beeb85486f1fc550f9380bd": { + "name": "CATT token contract", + "address": "0x6e605c269e0c92e70beeb85486f1fc550f9380bd", + "token": { + "decimals": 18, + "symbol": "CATT" + }, + "isSC": {} + }, + "0x6b89b97169a797d94f057f4a0b01e2ca303155e4": { + "name": "CHAD token contract", + "address": "0x6b89b97169a797d94f057f4a0b01e2ca303155e4", + "token": { + "decimals": 18, + "symbol": "CHAD" + }, + "isSC": {} + }, + "0x23ddbd36547d43627afa9b42d4e9fb0515f48b09": { + "name": "HIBEANZ token contract", + "address": "0x23ddbd36547d43627afa9b42d4e9fb0515f48b09", + "token": { + "decimals": 18, + "symbol": "HIBEANZ" + }, + "isSC": {} + }, + "0xd7c9f0e536dc865ae858b0c0453fe76d13c3beac": { + "name": "XAI token contract", + "address": "0xd7c9f0e536dc865ae858b0c0453fe76d13c3beac", + "token": { + "decimals": 18, + "symbol": "XAI" + }, + "isSC": {} + }, + "0xa06bc25b5805d5f8d82847d191cb4af5a3e873e0": { + "name": "Aave LINK", + "address": "0xa06bc25b5805d5f8d82847d191cb4af5a3e873e0", + "token": { + "decimals": 18, + "symbol": "aLINK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aLINK.svg" + }, + "0xff742d05420b6aca4481f635ad8341f81a6300c2": { + "name": "ASD token contract", + "address": "0xff742d05420b6aca4481f635ad8341f81a6300c2", + "token": { + "decimals": 18, + "symbol": "ASD" + }, + "isSC": {} + }, + "0x72953a5c32413614d24c29c84a66ae4b59581bbf": { + "name": "CLEV token contract", + "address": "0x72953a5c32413614d24c29c84a66ae4b59581bbf", + "token": { + "decimals": 18, + "symbol": "CLEV" + }, + "isSC": {} + }, + "0x5150956e082c748ca837a5dfa0a7c10ca4697f9c": { + "name": "Zeedex", + "address": "0x5150956e082c748ca837a5dfa0a7c10ca4697f9c", + "token": { + "decimals": 18, + "symbol": "ZDEX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zdex.svg" + }, + "0x0557e0d15aec0b9026dd17aa874fdf7d182a2ceb": { + "name": "CFXQ token contract", + "address": "0x0557e0d15aec0b9026dd17aa874fdf7d182a2ceb", + "token": { + "decimals": 6, + "symbol": "CFXQ" + }, + "isSC": {} + }, + "0x3b867a9e61311b9f5003899be72540494ede854f": { + "name": "ATB token contract", + "address": "0x3b867a9e61311b9f5003899be72540494ede854f", + "token": { + "decimals": 18, + "symbol": "ATB" + }, + "isSC": {} + }, + "0x0a6e481cb5f2d976b2edac4f67dcc824ccdae4af": { + "name": "AUDI token contract", + "address": "0x0a6e481cb5f2d976b2edac4f67dcc824ccdae4af", + "token": { + "decimals": 9, + "symbol": "AUDI" + }, + "isSC": {} + }, + "0x1a7a8bd9106f2b8d977e08582dc7d24c723ab0db": { + "name": "AppCoins", + "address": "0x1a7a8bd9106f2b8d977e08582dc7d24c723ab0db", + "token": { + "decimals": 18, + "symbol": "APPC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/appc.svg" + }, + "0xe469699f617bfd0fbffcd575970d34c2cecffa9f": { + "name": "VUZZ token contract", + "address": "0xe469699f617bfd0fbffcd575970d34c2cecffa9f", + "token": { + "decimals": 9, + "symbol": "VUZZ" + }, + "isSC": {} + }, + "0x005d1123878fc55fbd56b54c73963b234a64af3c": { + "name": "KIBA token contract", + "address": "0x005d1123878fc55fbd56b54c73963b234a64af3c", + "token": { + "decimals": 18, + "symbol": "KIBA" + }, + "isSC": {} + }, + "0x155ff1a85f440ee0a382ea949f24ce4e0b751c65": { + "name": "EYE token contract", + "address": "0x155ff1a85f440ee0a382ea949f24ce4e0b751c65", + "token": { + "decimals": 18, + "symbol": "EYE" + }, + "isSC": {} + }, + "0xde5ed76e7c05ec5e4572cfc88d1acea165109e44": { + "name": "DEUS token contract", + "address": "0xde5ed76e7c05ec5e4572cfc88d1acea165109e44", + "token": { + "decimals": 18, + "symbol": "DEUS" + }, + "isSC": {} + }, + "0xfb130d93e49dca13264344966a611dc79a456bc5": { + "name": "DOGEGF token contract", + "address": "0xfb130d93e49dca13264344966a611dc79a456bc5", + "token": { + "decimals": 18, + "symbol": "DOGEGF" + }, + "isSC": {} + }, + "0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4": { + "name": "SORA Validator", + "address": "0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4", + "token": { + "decimals": 18, + "symbol": "VAL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sora-val.svg" + }, + "0x9f94b198ce85c19a846c2b1a4d523f40a747a850": { + "name": "HAVOC token contract", + "address": "0x9f94b198ce85c19a846c2b1a4d523f40a747a850", + "token": { + "decimals": 9, + "symbol": "HAVOC" + }, + "isSC": {} + }, + "0x4554cc10898f92d45378b98d6d6c2dd54c687fb2": { + "name": "JBX token contract", + "address": "0x4554cc10898f92d45378b98d6d6c2dd54c687fb2", + "token": { + "decimals": 18, + "symbol": "JBX" + }, + "isSC": {} + }, + "0x081a4c60fbc381dc861bae6629c93d835d5f9a89": { + "name": "MODS token contract", + "address": "0x081a4c60fbc381dc861bae6629c93d835d5f9a89", + "token": { + "decimals": 18, + "symbol": "MODS" + }, + "isSC": {} + }, + "0x147faf8de9d8d8daae129b187f0d02d819126750": { + "name": "GEO token contract", + "address": "0x147faf8de9d8d8daae129b187f0d02d819126750", + "token": { + "decimals": 18, + "symbol": "GEO" + }, + "isSC": {} + }, + "0x93c9175e26f57d2888c7df8b470c9eea5c0b0a93": { + "name": "BCUBE token contract", + "address": "0x93c9175e26f57d2888c7df8b470c9eea5c0b0a93", + "token": { + "decimals": 18, + "symbol": "BCUBE" + }, + "isSC": {} + }, + "0xc58f53a8adff2fb4eb16ed56635772075e2ee123": { + "name": "AAMMUNIWBTCWETH token contract", + "address": "0xc58f53a8adff2fb4eb16ed56635772075e2ee123", + "token": { + "decimals": 18, + "symbol": "AAMMUNIWBTCWETH" + }, + "isSC": {} + }, + "0xde7d85157d9714eadf595045cc12ca4a5f3e2adb": { + "name": "STPT token contract", + "address": "0xde7d85157d9714eadf595045cc12ca4a5f3e2adb", + "token": { + "decimals": 18, + "symbol": "STPT" + }, + "isSC": {} + }, + "0x841fb148863454a3b3570f515414759be9091465": { + "name": "SHIH token contract", + "address": "0x841fb148863454a3b3570f515414759be9091465", + "token": { + "decimals": 18, + "symbol": "SHIH" + }, + "isSC": {} + }, + "0xdbdb4d16eda451d0503b854cf79d55697f90c8df": { + "name": "ALCX token contract", + "address": "0xdbdb4d16eda451d0503b854cf79d55697f90c8df", + "token": { + "decimals": 18, + "symbol": "ALCX" + }, + "isSC": {} + }, + "0x1bbf25e71ec48b84d773809b4ba55b6f4be946fb": { + "name": "VOW token contract", + "address": "0x1bbf25e71ec48b84d773809b4ba55b6f4be946fb", + "token": { + "decimals": 18, + "symbol": "VOW" + }, + "isSC": {} + }, + "0x4e241a9ec66832a16bceaeb9156e524487f061d7": { + "name": "ETF Rocks", + "address": "0x4e241a9ec66832a16bceaeb9156e524487f061d7", + "token": { + "decimals": 18, + "symbol": "ETF" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/etf.svg" + }, + "0xd8b90d2e680ea535eacce1b025c998b347892f68": { + "name": "SHIELD token contract", + "address": "0xd8b90d2e680ea535eacce1b025c998b347892f68", + "token": { + "decimals": 18, + "symbol": "SHIELD" + }, + "isSC": {} + }, + "0x56694577564fdd577a0abb20fe95c1e2756c2a11": { + "name": "ASW token contract", + "address": "0x56694577564fdd577a0abb20fe95c1e2756c2a11", + "token": { + "decimals": 18, + "symbol": "ASW" + }, + "isSC": {} + }, + "0xba50933c268f567bdc86e1ac131be072c6b0b71a": { + "name": "ARPA token contract", + "address": "0xba50933c268f567bdc86e1ac131be072c6b0b71a", + "token": { + "decimals": 18, + "symbol": "ARPA" + }, + "isSC": {} + }, + "0xf7498c98789957f4ee53b3e37ff5b7ef8a6cfc7b": { + "name": "0XDEV token contract", + "address": "0xf7498c98789957f4ee53b3e37ff5b7ef8a6cfc7b", + "token": { + "decimals": 18, + "symbol": "0XDEV" + }, + "isSC": {} + }, + "0x1864ce27e9f7517047933caae530674e8c70b8a7": { + "name": "PIB token contract", + "address": "0x1864ce27e9f7517047933caae530674e8c70b8a7", + "token": { + "decimals": 18, + "symbol": "PIB" + }, + "isSC": {} + }, + "0xb84f00b5ab187bc795d61389ac2418d4e7c77bb0": { + "name": "BALANCE token contract", + "address": "0xb84f00b5ab187bc795d61389ac2418d4e7c77bb0", + "token": { + "decimals": 18, + "symbol": "BALANCE" + }, + "isSC": {} + }, + "0x00aba6fe5557de1a1d565658cbddddf7c710a1eb": { + "name": "EZ token contract", + "address": "0x00aba6fe5557de1a1d565658cbddddf7c710a1eb", + "token": { + "decimals": 18, + "symbol": "EZ" + }, + "isSC": {} + }, + "0x73374ea518de7addd4c2b624c0e8b113955ee041": { + "name": "JGN token contract", + "address": "0x73374ea518de7addd4c2b624c0e8b113955ee041", + "token": { + "decimals": 18, + "symbol": "JGN" + }, + "isSC": {} + }, + "0xa9e8acf069c58aec8825542845fd754e41a9489a": { + "name": "PEPECOIN token contract", + "address": "0xa9e8acf069c58aec8825542845fd754e41a9489a", + "token": { + "decimals": 18, + "symbol": "PEPECOIN" + }, + "isSC": {} + }, + "0x474021845c4643113458ea4414bdb7fb74a01a77": { + "name": "UNO token contract", + "address": "0x474021845c4643113458ea4414bdb7fb74a01a77", + "token": { + "decimals": 18, + "symbol": "UNO" + }, + "isSC": {} + }, + "0x7449c93abe66457e83b3799bcf1a99e92d58a93b": { + "name": "CYMI token contract", + "address": "0x7449c93abe66457e83b3799bcf1a99e92d58a93b", + "token": { + "decimals": 18, + "symbol": "CYMI" + }, + "isSC": {} + }, + "0xe6602b34d8510b033e000975b3322537c7172441": { + "name": "FRR token contract", + "address": "0xe6602b34d8510b033e000975b3322537c7172441", + "token": { + "decimals": 18, + "symbol": "FRR" + }, + "isSC": {} + }, + "0x8a9c67fee641579deba04928c4bc45f66e26343a": { + "name": "JRT token contract", + "address": "0x8a9c67fee641579deba04928c4bc45f66e26343a", + "token": { + "decimals": 18, + "symbol": "JRT" + }, + "isSC": {} + }, + "0x23da77203eead71e72d7326654c431ef563567a4": { + "name": "APB token contract", + "address": "0x23da77203eead71e72d7326654c431ef563567a4", + "token": { + "decimals": 18, + "symbol": "APB" + }, + "isSC": {} + }, + "0x7b7983967409fce461ea8bbdf9ed37631b1d59c9": { + "name": "KPOP token contract", + "address": "0x7b7983967409fce461ea8bbdf9ed37631b1d59c9", + "token": { + "decimals": 18, + "symbol": "KPOP" + }, + "isSC": {} + }, + "0xd7c1eb0fe4a30d3b2a846c04aa6300888f087a5f": { + "name": "POINTS token contract", + "address": "0xd7c1eb0fe4a30d3b2a846c04aa6300888f087a5f", + "token": { + "decimals": 18, + "symbol": "POINTS" + }, + "isSC": {} + }, + "0x3f57c35633cb29834bb7577ba8052eab90f52a02": { + "name": "DFNDR token contract", + "address": "0x3f57c35633cb29834bb7577ba8052eab90f52a02", + "token": { + "decimals": 18, + "symbol": "DFNDR" + }, + "isSC": {} + }, + "0x6a6aa13393b7d1100c00a57c76c39e8b6c835041": { + "name": "OPENAIERC token contract", + "address": "0x6a6aa13393b7d1100c00a57c76c39e8b6c835041", + "token": { + "decimals": 9, + "symbol": "OPENAIERC" + }, + "isSC": {} + }, + "0xba93ef534094f8b7001ece2691168140965341ab": { + "name": "LOTT token contract", + "address": "0xba93ef534094f8b7001ece2691168140965341ab", + "token": { + "decimals": 18, + "symbol": "LOTT" + }, + "isSC": {} + }, + "0xba3335588d9403515223f109edc4eb7269a9ab5d": { + "name": "Gearbox", + "address": "0xba3335588d9403515223f109edc4eb7269a9ab5d", + "token": { + "decimals": 18, + "symbol": "GEAR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gear.svg" + }, + "0xd7394087e1dbbe477fe4f1cf373b9ac9459565ff": { + "name": "RET token contract", + "address": "0xd7394087e1dbbe477fe4f1cf373b9ac9459565ff", + "token": { + "decimals": 8, + "symbol": "RET" + }, + "isSC": {} + }, + "0xd39a2cecba2657e125ba6a5c98ad2f6b6d7e83fd": { + "name": "LUXO token contract", + "address": "0xd39a2cecba2657e125ba6a5c98ad2f6b6d7e83fd", + "token": { + "decimals": 18, + "symbol": "LUXO" + }, + "isSC": {} + }, + "0x3da434f76226b9489ed4277eb6fdccdf03ff190e": { + "name": "ZION token contract", + "address": "0x3da434f76226b9489ed4277eb6fdccdf03ff190e", + "token": { + "decimals": 18, + "symbol": "ZION" + }, + "isSC": {} + }, + "0x99ea4db9ee77acd40b119bd1dc4e33e1c070b80d": { + "name": "Quantstamp", + "address": "0x99ea4db9ee77acd40b119bd1dc4e33e1c070b80d", + "token": { + "decimals": 18, + "symbol": "QSP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/qsp.svg" + }, + "0x3f14920c99beb920afa163031c4e47a3e03b3e4a": { + "name": "SEND token contract", + "address": "0x3f14920c99beb920afa163031c4e47a3e03b3e4a", + "token": { + "decimals": 0, + "symbol": "SEND" + }, + "isSC": {} + }, + "0xba25b2281214300e4e649fead9a6d6acd25f1c0a": { + "name": "TREE token contract", + "address": "0xba25b2281214300e4e649fead9a6d6acd25f1c0a", + "token": { + "decimals": 18, + "symbol": "TREE" + }, + "isSC": {} + }, + "0x30b593f8c3ab37615359b4e0e6df2e06d55bb55d": { + "name": "FXDX token contract", + "address": "0x30b593f8c3ab37615359b4e0e6df2e06d55bb55d", + "token": { + "decimals": 18, + "symbol": "FXDX" + }, + "isSC": {} + }, + "0x3a810ff7211b40c4fa76205a14efe161615d0385": { + "name": "AIN token contract", + "address": "0x3a810ff7211b40c4fa76205a14efe161615d0385", + "token": { + "decimals": 18, + "symbol": "AIN" + }, + "isSC": {} + }, + "0x370a366f402e2e41cdbbe54ecec12aae0cce1955": { + "name": "TOAD token contract", + "address": "0x370a366f402e2e41cdbbe54ecec12aae0cce1955", + "token": { + "decimals": 18, + "symbol": "TOAD" + }, + "isSC": {} + }, + "0xd2be3722b17b616c51ed9b8944a227d1ce579c24": { + "name": "DTUBE token contract", + "address": "0xd2be3722b17b616c51ed9b8944a227d1ce579c24", + "token": { + "decimals": 2, + "symbol": "DTUBE" + }, + "isSC": {} + }, + "0x9008064e6cf73e27a3aba4b10e69f855a4f8efcc": { + "name": "GEM token contract", + "address": "0x9008064e6cf73e27a3aba4b10e69f855a4f8efcc", + "token": { + "decimals": 18, + "symbol": "GEM" + }, + "isSC": {} + }, + "0xf6afc05fccea5a53f22a3e39ffee861e016bd9a0": { + "name": "WOLF token contract", + "address": "0xf6afc05fccea5a53f22a3e39ffee861e016bd9a0", + "token": { + "decimals": 18, + "symbol": "WOLF" + }, + "isSC": {} + }, + "0x53c8395465a84955c95159814461466053dedede": { + "name": "DeGate Token", + "address": "0x53c8395465a84955c95159814461466053dedede", + "token": { + "decimals": 18, + "symbol": "DG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DG.svg" + }, + "0x8b3870df408ff4d7c3a26df852d41034eda11d81": { + "name": "IOI token contract", + "address": "0x8b3870df408ff4d7c3a26df852d41034eda11d81", + "token": { + "decimals": 6, + "symbol": "IOI" + }, + "isSC": {} + }, + "0x8484e645a054586a6d6af60c0ee911d7b5180e64": { + "name": "DYOR token contract", + "address": "0x8484e645a054586a6d6af60c0ee911d7b5180e64", + "token": { + "decimals": 18, + "symbol": "DYOR" + }, + "isSC": {} + }, + "0x926ff6584b5905cc793cfb19bfc0ad6443671f47": { + "name": "PABLO token contract", + "address": "0x926ff6584b5905cc793cfb19bfc0ad6443671f47", + "token": { + "decimals": 18, + "symbol": "PABLO" + }, + "isSC": {} + }, + "0x519c1001d550c0a1dae7d1fc220f7d14c2a521bb": { + "name": "Polkaswap", + "address": "0x519c1001d550c0a1dae7d1fc220f7d14c2a521bb", + "token": { + "decimals": 18, + "symbol": "PSWAP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sora-pswap.svg" + }, + "0xe7c8537f92b4feefdc19bd6b4023dfe79400cb30": { + "name": "BONES token contract", + "address": "0xe7c8537f92b4feefdc19bd6b4023dfe79400cb30", + "token": { + "decimals": 18, + "symbol": "BONES" + }, + "isSC": {} + }, + "0x02d7a93829b365b7ad4c582dace1493aac50a290": { + "name": "CAT token contract", + "address": "0x02d7a93829b365b7ad4c582dace1493aac50a290", + "token": { + "decimals": 18, + "symbol": "CAT" + }, + "isSC": {} + }, + "0x0ab87046fbb341d058f17cbc4c1133f25a20a52f": { + "name": "Governance OHM", + "address": "0x0ab87046fbb341d058f17cbc4c1133f25a20a52f", + "token": { + "decimals": 18, + "symbol": "gOHM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gOHM.svg" + }, + "0x6adb2e268de2aa1abf6578e4a8119b960e02928f": { + "name": "SHIBDOGE token contract", + "address": "0x6adb2e268de2aa1abf6578e4a8119b960e02928f", + "token": { + "decimals": 9, + "symbol": "SHIBDOGE" + }, + "isSC": {} + }, + "0x62d3c05b9c3d916fbc111819bbd3cee52906c1ae": { + "name": "EGAME token contract", + "address": "0x62d3c05b9c3d916fbc111819bbd3cee52906c1ae", + "token": { + "decimals": 18, + "symbol": "EGAME" + }, + "isSC": {} + }, + "0x0954906da0bf32d5479e25f46056d22f08464cab": { + "name": "INDEX token contract", + "address": "0x0954906da0bf32d5479e25f46056d22f08464cab", + "token": { + "decimals": 18, + "symbol": "INDEX" + }, + "isSC": {} + }, + "0x9b0e1c344141fb361b842d397df07174e1cdb988": { + "name": "EMOTI token contract", + "address": "0x9b0e1c344141fb361b842d397df07174e1cdb988", + "token": { + "decimals": 9, + "symbol": "EMOTI" + }, + "isSC": {} + }, + "0x0cf0ee63788a0849fe5297f3407f701e122cc023": { + "name": "Streamr (old)", + "address": "0x0cf0ee63788a0849fe5297f3407f701e122cc023", + "token": { + "decimals": 18, + "symbol": "XDATA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/streamr_old.svg" + }, + "0xff836a5821e69066c87e268bc51b849fab94240c": { + "name": " token contract", + "address": "0xff836a5821e69066c87e268bc51b849fab94240c", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x3ea8ea4237344c9931214796d9417af1a1180770": { + "name": "FLX token contract", + "address": "0x3ea8ea4237344c9931214796d9417af1a1180770", + "token": { + "decimals": 18, + "symbol": "FLX" + }, + "isSC": {} + }, + "0xa88920b4a35f7d0e81bc586ce1875036fced9154": { + "name": "KBC token contract", + "address": "0xa88920b4a35f7d0e81bc586ce1875036fced9154", + "token": { + "decimals": 18, + "symbol": "KBC" + }, + "isSC": {} + }, + "0x4f640f2529ee0cf119a2881485845fa8e61a782a": { + "name": "ORE token contract", + "address": "0x4f640f2529ee0cf119a2881485845fa8e61a782a", + "token": { + "decimals": 18, + "symbol": "ORE" + }, + "isSC": {} + }, + "0xdfdb7f72c1f195c5951a234e8db9806eb0635346": { + "name": "NFD token contract", + "address": "0xdfdb7f72c1f195c5951a234e8db9806eb0635346", + "token": { + "decimals": 18, + "symbol": "NFD" + }, + "isSC": {} + }, + "0x1b19c19393e2d034d8ff31ff34c81252fcbbee92": { + "name": "OUSG token contract", + "address": "0x1b19c19393e2d034d8ff31ff34c81252fcbbee92", + "token": { + "decimals": 18, + "symbol": "OUSG" + }, + "isSC": {} + }, + "0xaac679720204aaa68b6c5000aa87d789a3ca0aa5": { + "name": "HBCH token contract", + "address": "0xaac679720204aaa68b6c5000aa87d789a3ca0aa5", + "token": { + "decimals": 18, + "symbol": "HBCH" + }, + "isSC": {} + }, + "0xad22f63404f7305e4713ccbd4f296f34770513f4": { + "name": "AWC token contract", + "address": "0xad22f63404f7305e4713ccbd4f296f34770513f4", + "token": { + "decimals": 8, + "symbol": "AWC" + }, + "isSC": {} + }, + "0xbfb2b6870501a6ff17121d676a0a45a38c9eed1e": { + "name": "TOAD token contract", + "address": "0xbfb2b6870501a6ff17121d676a0a45a38c9eed1e", + "token": { + "decimals": 9, + "symbol": "TOAD" + }, + "isSC": {} + }, + "0x34635280737b5bfe6c7dc2fc3065d60d66e78185": { + "name": "CVXPRISMA token contract", + "address": "0x34635280737b5bfe6c7dc2fc3065d60d66e78185", + "token": { + "decimals": 18, + "symbol": "CVXPRISMA" + }, + "isSC": {} + }, + "0xa8c08d8bb15a2d1a4d3b78def9c635ef1e340e16": { + "name": " token contract", + "address": "0xa8c08d8bb15a2d1a4d3b78def9c635ef1e340e16", + "token": { + "decimals": 18, + "symbol": "" + }, + "isSC": {} + }, + "0x5d843fa9495d23de997c394296ac7b4d721e841c": { + "name": "RELAY token contract", + "address": "0x5d843fa9495d23de997c394296ac7b4d721e841c", + "token": { + "decimals": 18, + "symbol": "RELAY" + }, + "isSC": {} + }, + "0x34f0915a5f15a66eba86f6a58be1a471fb7836a7": { + "name": "PLSD token contract", + "address": "0x34f0915a5f15a66eba86f6a58be1a471fb7836a7", + "token": { + "decimals": 12, + "symbol": "PLSD" + }, + "isSC": {} + }, + "0x5f474906637bdcda05f29c74653f6962bb0f8eda": { + "name": "DEFX token contract", + "address": "0x5f474906637bdcda05f29c74653f6962bb0f8eda", + "token": { + "decimals": 18, + "symbol": "DEFX" + }, + "isSC": {} + }, + "0x9343e24716659a3551eb10aff9472a2dcad5db2d": { + "name": "STFX token contract", + "address": "0x9343e24716659a3551eb10aff9472a2dcad5db2d", + "token": { + "decimals": 18, + "symbol": "STFX" + }, + "isSC": {} + }, + "0xc1f33e0cf7e40a67375007104b929e49a581bafe": { + "name": "SPOT token contract", + "address": "0xc1f33e0cf7e40a67375007104b929e49a581bafe", + "token": { + "decimals": 9, + "symbol": "SPOT" + }, + "isSC": {} + }, + "0xaedf386b755465871ff874e3e37af5976e247064": { + "name": "Fasttoken", + "address": "0xaedf386b755465871ff874e3e37af5976e247064", + "token": { + "decimals": 18, + "symbol": "FTN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ftn.svg" + }, + "0x8b12bd54ca9b2311960057c8f3c88013e79316e3": { + "name": "REACH token contract", + "address": "0x8b12bd54ca9b2311960057c8f3c88013e79316e3", + "token": { + "decimals": 18, + "symbol": "REACH" + }, + "isSC": {} + }, + "0x0d5639a1442730372e2a650a2900ba07937854f4": { + "name": "CHUB token contract", + "address": "0x0d5639a1442730372e2a650a2900ba07937854f4", + "token": { + "decimals": 18, + "symbol": "CHUB" + }, + "isSC": {} + }, + "0x71fc1f555a39e0b698653ab0b475488ec3c34d57": { + "name": "RAIN token contract", + "address": "0x71fc1f555a39e0b698653ab0b475488ec3c34d57", + "token": { + "decimals": 18, + "symbol": "RAIN" + }, + "isSC": {} + }, + "0xb56a1f3310578f23120182fb2e58c087efe6e147": { + "name": "ACYC token contract", + "address": "0xb56a1f3310578f23120182fb2e58c087efe6e147", + "token": { + "decimals": 18, + "symbol": "ACYC" + }, + "isSC": {} + }, + "0x490bd60a5d3e1207fba9b699017561434cc8c675": { + "name": "BUGS token contract", + "address": "0x490bd60a5d3e1207fba9b699017561434cc8c675", + "token": { + "decimals": 18, + "symbol": "BUGS" + }, + "isSC": {} + }, + "0x61107a409fffe1965126aa456af679719695c69c": { + "name": "UMI token contract", + "address": "0x61107a409fffe1965126aa456af679719695c69c", + "token": { + "decimals": 18, + "symbol": "UMI" + }, + "isSC": {} + }, + "0x65ef703f5594d2573eb71aaf55bc0cb548492df4": { + "name": "MULTI token contract", + "address": "0x65ef703f5594d2573eb71aaf55bc0cb548492df4", + "token": { + "decimals": 18, + "symbol": "MULTI" + }, + "isSC": {} + }, + "0x76fca1adb104770b38581b64d55e67fa5a0f3966": { + "name": "ZKT token contract", + "address": "0x76fca1adb104770b38581b64d55e67fa5a0f3966", + "token": { + "decimals": 9, + "symbol": "ZKT" + }, + "isSC": {} + }, + "0xe80c0cd204d654cebe8dd64a4857cab6be8345a3": { + "name": "JPEG token contract", + "address": "0xe80c0cd204d654cebe8dd64a4857cab6be8345a3", + "token": { + "decimals": 18, + "symbol": "JPEG" + }, + "isSC": {} + }, + "0xad5fdc8c3c18d50315331fca7f66efe5033f6c4c": { + "name": "CRAZY token contract", + "address": "0xad5fdc8c3c18d50315331fca7f66efe5033f6c4c", + "token": { + "decimals": 18, + "symbol": "CRAZY" + }, + "isSC": {} + }, + "0xcefde37817da4fc51ddc24e3820ad316784ee04b": { + "name": "SONA token contract", + "address": "0xcefde37817da4fc51ddc24e3820ad316784ee04b", + "token": { + "decimals": 18, + "symbol": "SONA" + }, + "isSC": {} + }, + "0x191557728e4d8caa4ac94f86af842148c0fa8f7e": { + "name": "ECO token contract", + "address": "0x191557728e4d8caa4ac94f86af842148c0fa8f7e", + "token": { + "decimals": 8, + "symbol": "ECO" + }, + "isSC": {} + }, + "0xf56408077487cb879c992909c5b5c66d68c02eb4": { + "name": "RIOT token contract", + "address": "0xf56408077487cb879c992909c5b5c66d68c02eb4", + "token": { + "decimals": 18, + "symbol": "RIOT" + }, + "isSC": {} + }, + "0x4db57d585fa82ca32d25086ddc069d899f08d455": { + "name": "ENOCH token contract", + "address": "0x4db57d585fa82ca32d25086ddc069d899f08d455", + "token": { + "decimals": 18, + "symbol": "ENOCH" + }, + "isSC": {} + }, + "0xfac77a24e52b463ba9857d6b758ba41ae20e31ff": { + "name": "LSD token contract", + "address": "0xfac77a24e52b463ba9857d6b758ba41ae20e31ff", + "token": { + "decimals": 18, + "symbol": "LSD" + }, + "isSC": {} + }, + "0x2c642cd3bed9b4e4eeec493611779f13efb502f1": { + "name": "C21 token contract", + "address": "0x2c642cd3bed9b4e4eeec493611779f13efb502f1", + "token": { + "decimals": 18, + "symbol": "C21" + }, + "isSC": {} + }, + "0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c": { + "name": "SPX token contract", + "address": "0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c", + "token": { + "decimals": 8, + "symbol": "SPX" + }, + "isSC": {} + }, + "0xf5581dfefd8fb0e4aec526be659cfab1f8c781da": { + "name": "HOPR token contract", + "address": "0xf5581dfefd8fb0e4aec526be659cfab1f8c781da", + "token": { + "decimals": 18, + "symbol": "HOPR" + }, + "isSC": {} + }, + "0x614da3b37b6f66f7ce69b4bbbcf9a55ce6168707": { + "name": "MMX token contract", + "address": "0x614da3b37b6f66f7ce69b4bbbcf9a55ce6168707", + "token": { + "decimals": 18, + "symbol": "MMX" + }, + "isSC": {} + }, + "0xed9f6aa6532869576211fd6367e3c328810fbeb3": { + "name": "GPTPLUS token contract", + "address": "0xed9f6aa6532869576211fd6367e3c328810fbeb3", + "token": { + "decimals": 18, + "symbol": "GPTPLUS" + }, + "isSC": {} + }, + "0xac5b038058bcd0424c9c252c6487c25f032e5ddc": { + "name": "AIEPK token contract", + "address": "0xac5b038058bcd0424c9c252c6487c25f032e5ddc", + "token": { + "decimals": 18, + "symbol": "AIEPK" + }, + "isSC": {} + }, + "0x0c5cb676e38d6973837b9496f6524835208145a2": { + "name": "KABO token contract", + "address": "0x0c5cb676e38d6973837b9496f6524835208145a2", + "token": { + "decimals": 18, + "symbol": "KABO" + }, + "isSC": {} + }, + "0x600d601d8b9eb5de5ac90fefc68d0d08801bfd3f": { + "name": "ELMT token contract", + "address": "0x600d601d8b9eb5de5ac90fefc68d0d08801bfd3f", + "token": { + "decimals": 8, + "symbol": "ELMT" + }, + "isSC": {} + }, + "0xca30c93b02514f86d5c86a6e375e3a330b435fb5": { + "name": "BIB01 token contract", + "address": "0xca30c93b02514f86d5c86a6e375e3a330b435fb5", + "token": { + "decimals": 18, + "symbol": "BIB01" + }, + "isSC": {} + }, + "0xe60779cc1b2c1d0580611c526a8df0e3f870ec48": { + "name": "USH token contract", + "address": "0xe60779cc1b2c1d0580611c526a8df0e3f870ec48", + "token": { + "decimals": 18, + "symbol": "USH" + }, + "isSC": {} + }, + "0x39b46b212bdf15b42b166779b9d1787a68b9d0c3": { + "name": "DYP token contract", + "address": "0x39b46b212bdf15b42b166779b9d1787a68b9d0c3", + "token": { + "decimals": 18, + "symbol": "DYP" + }, + "isSC": {} + }, + "0xd7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f": { + "name": "B2M token contract", + "address": "0xd7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f", + "token": { + "decimals": 18, + "symbol": "B2M" + }, + "isSC": {} + }, + "0xed1273928ba97eed7b49e82c2f39d512d7591112": { + "name": "NERD token contract", + "address": "0xed1273928ba97eed7b49e82c2f39d512d7591112", + "token": { + "decimals": 18, + "symbol": "NERD" + }, + "isSC": {} + }, + "0x31adda225642a8f4d7e90d4152be6661ab22a5a2": { + "name": "HYPR token contract", + "address": "0x31adda225642a8f4d7e90d4152be6661ab22a5a2", + "token": { + "decimals": 18, + "symbol": "HYPR" + }, + "isSC": {} + }, + "0x7cda79830faf07ed696fe220566116951ced36a7": { + "name": "MAYP token contract", + "address": "0x7cda79830faf07ed696fe220566116951ced36a7", + "token": { + "decimals": 18, + "symbol": "MAYP" + }, + "isSC": {} + }, + "0xe69d699cbcd79cb1b55f82cf36bf1a2836053562": { + "name": "DROP token contract", + "address": "0xe69d699cbcd79cb1b55f82cf36bf1a2836053562", + "token": { + "decimals": 18, + "symbol": "DROP" + }, + "isSC": {} + }, + "0x4b1d0b9f081468d780ca1d5d79132b64301085d1": { + "name": "LMR token contract", + "address": "0x4b1d0b9f081468d780ca1d5d79132b64301085d1", + "token": { + "decimals": 8, + "symbol": "LMR" + }, + "isSC": {} + }, + "0xccf4429db6322d5c611ee964527d42e5d685dd6a": { + "name": "CWBTC token contract", + "address": "0xccf4429db6322d5c611ee964527d42e5d685dd6a", + "token": { + "decimals": 8, + "symbol": "CWBTC" + }, + "isSC": {} + }, + "0x464fdb8affc9bac185a7393fd4298137866dcfb8": { + "name": "REALM token contract", + "address": "0x464fdb8affc9bac185a7393fd4298137866dcfb8", + "token": { + "decimals": 18, + "symbol": "REALM" + }, + "isSC": {} + }, + "0x6b985d38b1fc891bb57bff59573626b1896d4aa1": { + "name": "FIDO token contract", + "address": "0x6b985d38b1fc891bb57bff59573626b1896d4aa1", + "token": { + "decimals": 9, + "symbol": "FIDO" + }, + "isSC": {} + }, + "0x77fba179c79de5b7653f68b5039af940ada60ce0": { + "name": "FORTH token contract", + "address": "0x77fba179c79de5b7653f68b5039af940ada60ce0", + "token": { + "decimals": 18, + "symbol": "FORTH" + }, + "isSC": {} + }, + "0xfb7b4564402e5500db5bb6d63ae671302777c75a": { + "name": "DEXT token contract", + "address": "0xfb7b4564402e5500db5bb6d63ae671302777c75a", + "token": { + "decimals": 18, + "symbol": "DEXT" + }, + "isSC": {} + }, + "0xf058501585023d040ea9493134ed72c083553eed": { + "name": "DMX token contract", + "address": "0xf058501585023d040ea9493134ed72c083553eed", + "token": { + "decimals": 18, + "symbol": "DMX" + }, + "isSC": {} + }, + "0xca1207647ff814039530d7d35df0e1dd2e91fa84": { + "name": "dHEDGE DAO Token", + "address": "0xca1207647ff814039530d7d35df0e1dd2e91fa84", + "token": { + "decimals": 18, + "symbol": "DHT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DHT.svg" + }, + "0xfc1c93a2507975e98b9d0e9260ded61a00152bf1": { + "name": "NAVI token contract", + "address": "0xfc1c93a2507975e98b9d0e9260ded61a00152bf1", + "token": { + "decimals": 18, + "symbol": "NAVI" + }, + "isSC": {} + }, + "0x679badc551626e01b23ceecefbc9b877ea18fc46": { + "name": "CCO token contract", + "address": "0x679badc551626e01b23ceecefbc9b877ea18fc46", + "token": { + "decimals": 18, + "symbol": "CCO" + }, + "isSC": {} + }, + "0xcffcfdada28ab44d5440301470dcd410e75c4765": { + "name": "PRF token contract", + "address": "0xcffcfdada28ab44d5440301470dcd410e75c4765", + "token": { + "decimals": 18, + "symbol": "PRF" + }, + "isSC": {} + }, + "0x5d65d971895edc438f465c17db6992698a52318d": { + "name": "NAS token contract", + "address": "0x5d65d971895edc438f465c17db6992698a52318d", + "token": { + "decimals": 18, + "symbol": "NAS" + }, + "isSC": {} + }, + "0x4104b135dbc9609fc1a9490e61369036497660c8": { + "name": "APW token contract", + "address": "0x4104b135dbc9609fc1a9490e61369036497660c8", + "token": { + "decimals": 18, + "symbol": "APW" + }, + "isSC": {} + }, + "0xaa4e3edb11afa93c41db59842b29de64b72e355b": { + "name": "MFI token contract", + "address": "0xaa4e3edb11afa93c41db59842b29de64b72e355b", + "token": { + "decimals": 18, + "symbol": "MFI" + }, + "isSC": {} + }, + "0x6ff2241756549b5816a177659e766eaf14b34429": { + "name": "AQTIS token contract", + "address": "0x6ff2241756549b5816a177659e766eaf14b34429", + "token": { + "decimals": 18, + "symbol": "AQTIS" + }, + "isSC": {} + }, + "0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6": { + "name": "Synth sBTC", + "address": "0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6", + "token": { + "decimals": 18, + "symbol": "SBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/synthetix_sbtc.svg" + }, + "0x1735db6ab5baa19ea55d0adceed7bcdc008b3136": { + "name": "URQA token contract", + "address": "0x1735db6ab5baa19ea55d0adceed7bcdc008b3136", + "token": { + "decimals": 18, + "symbol": "URQA" + }, + "isSC": {} + }, + "0xd015422879a1308ba557510345e944b912b9ab73": { + "name": "TRUMP token contract", + "address": "0xd015422879a1308ba557510345e944b912b9ab73", + "token": { + "decimals": 18, + "symbol": "TRUMP" + }, + "isSC": {} + }, + "0x3005003bda885dee7c74182e5fe336e9e3df87bb": { + "name": "XD token contract", + "address": "0x3005003bda885dee7c74182e5fe336e9e3df87bb", + "token": { + "decimals": 18, + "symbol": "XD" + }, + "isSC": {} + }, + "0xd9fcd98c322942075a5c3860693e9f4f03aae07b": { + "name": "Euler", + "address": "0xd9fcd98c322942075a5c3860693e9f4f03aae07b", + "token": { + "decimals": 18, + "symbol": "EUL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eul.svg" + }, + "0xa95c5ebb86e0de73b4fb8c47a45b792cfea28c23": { + "name": "SDL token contract", + "address": "0xa95c5ebb86e0de73b4fb8c47a45b792cfea28c23", + "token": { + "decimals": 18, + "symbol": "SDL" + }, + "isSC": {} + }, + "0x54012cdf4119de84218f7eb90eeb87e25ae6ebd7": { + "name": "LUFFY token contract", + "address": "0x54012cdf4119de84218f7eb90eeb87e25ae6ebd7", + "token": { + "decimals": 9, + "symbol": "LUFFY" + }, + "isSC": {} + }, + "0xc55c2175e90a46602fd42e931f62b3acc1a013ca": { + "name": "STARS token contract", + "address": "0xc55c2175e90a46602fd42e931f62b3acc1a013ca", + "token": { + "decimals": 18, + "symbol": "STARS" + }, + "isSC": {} + }, + "0x96a5399d07896f757bd4c6ef56461f58db951862": { + "name": "DRAGONX token contract", + "address": "0x96a5399d07896f757bd4c6ef56461f58db951862", + "token": { + "decimals": 18, + "symbol": "DRAGONX" + }, + "isSC": {} + }, + "0x723cbfc05e2cfcc71d3d89e770d32801a5eef5ab": { + "name": "BTCP token contract", + "address": "0x723cbfc05e2cfcc71d3d89e770d32801a5eef5ab", + "token": { + "decimals": 8, + "symbol": "BTCP" + }, + "isSC": {} + }, + "0x4c6e2c495b974b8d4220e370f23c7e0e1da9b644": { + "name": "SMILEY token contract", + "address": "0x4c6e2c495b974b8d4220e370f23c7e0e1da9b644", + "token": { + "decimals": 9, + "symbol": "SMILEY" + }, + "isSC": {} + }, + "0x6b0956258ff7bd7645aa35369b55b61b8e6d6140": { + "name": "LUCKY token contract", + "address": "0x6b0956258ff7bd7645aa35369b55b61b8e6d6140", + "token": { + "decimals": 8, + "symbol": "LUCKY" + }, + "isSC": {} + }, + "0x111111517e4929d3dcbdfa7cce55d30d4b6bc4d6": { + "name": "ICHI token contract", + "address": "0x111111517e4929d3dcbdfa7cce55d30d4b6bc4d6", + "token": { + "decimals": 18, + "symbol": "ICHI" + }, + "isSC": {} + }, + "0xc36ad98e62598ae24d4487d8012209f687c30d45": { + "name": "ASAP token contract", + "address": "0xc36ad98e62598ae24d4487d8012209f687c30d45", + "token": { + "decimals": 18, + "symbol": "ASAP" + }, + "isSC": {} + }, + "0xf831938caf837cd505de196bbb408d81a06376ab": { + "name": "JEFF token contract", + "address": "0xf831938caf837cd505de196bbb408d81a06376ab", + "token": { + "decimals": 18, + "symbol": "JEFF" + }, + "isSC": {} + }, + "0x88aa4a6c5050b9a1b2aa7e34d0582025ca6ab745": { + "name": "DXP token contract", + "address": "0x88aa4a6c5050b9a1b2aa7e34d0582025ca6ab745", + "token": { + "decimals": 18, + "symbol": "DXP" + }, + "isSC": {} + }, + "0x3eb9c7ee5f72e51f61e832137719fe8d1e53a2ce": { + "name": "DMIND token contract", + "address": "0x3eb9c7ee5f72e51f61e832137719fe8d1e53a2ce", + "token": { + "decimals": 9, + "symbol": "DMIND" + }, + "isSC": {} + }, + "0x6b1a8f210ec6b7b6643cea3583fb0c079f367898": { + "name": "BXX token contract", + "address": "0x6b1a8f210ec6b7b6643cea3583fb0c079f367898", + "token": { + "decimals": 18, + "symbol": "BXX" + }, + "isSC": {} + }, + "0x8dbd1331b1de57835b24657ed21d0691e2e7362a": { + "name": "SENT token contract", + "address": "0x8dbd1331b1de57835b24657ed21d0691e2e7362a", + "token": { + "decimals": 18, + "symbol": "SENT" + }, + "isSC": {} + }, + "0x8b227d72570d3ead66014bca8305cbef7f90d1ee": { + "name": "LIZA token contract", + "address": "0x8b227d72570d3ead66014bca8305cbef7f90d1ee", + "token": { + "decimals": 18, + "symbol": "LIZA" + }, + "isSC": {} + }, + "0xa338b5a4bbd8053994bb6c55d770fc2447d66b88": { + "name": "EAG token contract", + "address": "0xa338b5a4bbd8053994bb6c55d770fc2447d66b88", + "token": { + "decimals": 18, + "symbol": "EAG" + }, + "isSC": {} + }, + "0xc91a71a1ffa3d8b22ba615ba1b9c01b2bbbf55ad": { + "name": "ZZ token contract", + "address": "0xc91a71a1ffa3d8b22ba615ba1b9c01b2bbbf55ad", + "token": { + "decimals": 18, + "symbol": "ZZ" + }, + "isSC": {} + }, + "0x0b498ff89709d3838a063f1dfa463091f9801c2b": { + "name": "BTC2X-FLI token contract", + "address": "0x0b498ff89709d3838a063f1dfa463091f9801c2b", + "token": { + "decimals": 18, + "symbol": "BTC2X-FLI" + }, + "isSC": {} + }, + "0x273b8e7adddcb4de101416300fcd3688c0612a27": { + "name": "RAIT token contract", + "address": "0x273b8e7adddcb4de101416300fcd3688c0612a27", + "token": { + "decimals": 18, + "symbol": "RAIT" + }, + "isSC": {} + }, + "0xe7ae6d0c56cacaf007b7e4d312f9af686a9e9a04": { + "name": "Vabble", + "address": "0xe7ae6d0c56cacaf007b7e4d312f9af686a9e9a04", + "token": { + "decimals": 18, + "symbol": "VAB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/VAB.svg" + }, + "0x798d1be841a82a273720ce31c822c61a67a601c3": { + "name": "DIGG token contract", + "address": "0x798d1be841a82a273720ce31c822c61a67a601c3", + "token": { + "decimals": 9, + "symbol": "DIGG" + }, + "isSC": {} + }, + "0x923b83c26b3809d960ff80332ed00aa46d7ed375": { + "name": "CTR token contract", + "address": "0x923b83c26b3809d960ff80332ed00aa46d7ed375", + "token": { + "decimals": 18, + "symbol": "CTR" + }, + "isSC": {} + }, + "0x6b32022693210cd2cfc466b9ac0085de8fc34ea6": { + "name": "DECI token contract", + "address": "0x6b32022693210cd2cfc466b9ac0085de8fc34ea6", + "token": { + "decimals": 8, + "symbol": "DECI" + }, + "isSC": {} + }, + "0xb6ed7644c69416d67b522e20bc294a9a9b405b31": { + "name": "0xBitcoin Token", + "address": "0xb6ed7644c69416d67b522e20bc294a9a9b405b31", + "token": { + "decimals": 8, + "symbol": "0xBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/0xbitcoin.svg" + }, + "0xde4ee8057785a7e8e800db58f9784845a5c2cbd6": { + "name": "DEXE token contract", + "address": "0xde4ee8057785a7e8e800db58f9784845a5c2cbd6", + "token": { + "decimals": 18, + "symbol": "DEXE" + }, + "isSC": {} + }, + "0xa41f142b6eb2b164f8164cae0716892ce02f311f": { + "name": "AVG token contract", + "address": "0xa41f142b6eb2b164f8164cae0716892ce02f311f", + "token": { + "decimals": 18, + "symbol": "AVG" + }, + "isSC": {} + }, + "0xfdb15e5e6799be72798b1ccfaecbf186bf73a0c4": { + "name": "NTX token contract", + "address": "0xfdb15e5e6799be72798b1ccfaecbf186bf73a0c4", + "token": { + "decimals": 8, + "symbol": "NTX" + }, + "isSC": {} + }, + "0x1abaea1f7c830bd89acc67ec4af516284b1bc33c": { + "name": "EURC", + "address": "0x1abaea1f7c830bd89acc67ec4af516284b1bc33c", + "token": { + "decimals": 6, + "symbol": "EURC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eurc.svg" + }, + "0xa1f410f13b6007fca76833ee7eb58478d47bc5ef": { + "name": "RJV token contract", + "address": "0xa1f410f13b6007fca76833ee7eb58478d47bc5ef", + "token": { + "decimals": 6, + "symbol": "RJV" + }, + "isSC": {} + }, + "0x391e86e2c002c70dee155eaceb88f7a3c38f5976": { + "name": "AAMMUNIUSDCWETH token contract", + "address": "0x391e86e2c002c70dee155eaceb88f7a3c38f5976", + "token": { + "decimals": 18, + "symbol": "AAMMUNIUSDCWETH" + }, + "isSC": {} + }, + "0x227c7df69d3ed1ae7574a1a7685fded90292eb48": { + "name": "MILADY token contract", + "address": "0x227c7df69d3ed1ae7574a1a7685fded90292eb48", + "token": { + "decimals": 18, + "symbol": "MILADY" + }, + "isSC": {} + }, + "0xec363faa5c4dd0e51f3d9b5d0101263760e7cdeb": { + "name": "IWBTC token contract", + "address": "0xec363faa5c4dd0e51f3d9b5d0101263760e7cdeb", + "token": { + "decimals": 8, + "symbol": "IWBTC" + }, + "isSC": {} + }, + "0xd1ba9bac957322d6e8c07a160a3a8da11a0d2867": { + "name": "HMT token contract", + "address": "0xd1ba9bac957322d6e8c07a160a3a8da11a0d2867", + "token": { + "decimals": 18, + "symbol": "HMT" + }, + "isSC": {} + }, + "0xc05d14442a510de4d3d71a3d316585aa0ce32b50": { + "name": "LINA token contract", + "address": "0xc05d14442a510de4d3d71a3d316585aa0ce32b50", + "token": { + "decimals": 18, + "symbol": "LINA" + }, + "isSC": {} + }, + "0xfd0205066521550d7d7ab19da8f72bb004b4c341": { + "name": "LIT token contract", + "address": "0xfd0205066521550d7d7ab19da8f72bb004b4c341", + "token": { + "decimals": 18, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xb9098d3669a78e9afe8b94a97290407400d9da31": { + "name": "PRTC token contract", + "address": "0xb9098d3669a78e9afe8b94a97290407400d9da31", + "token": { + "decimals": 18, + "symbol": "PRTC" + }, + "isSC": {} + }, + "0xa19f5264f7d7be11c451c093d8f92592820bea86": { + "name": "BYTES token contract", + "address": "0xa19f5264f7d7be11c451c093d8f92592820bea86", + "token": { + "decimals": 18, + "symbol": "BYTES" + }, + "isSC": {} + }, + "0x4fc15c91a9c4a9efb404174464687e8e128730c2": { + "name": "STAT", + "address": "0x4fc15c91a9c4a9efb404174464687e8e128730c2", + "token": { + "decimals": 18, + "symbol": "STAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/STAT.svg" + }, + "0xda16cf041e2780618c49dbae5d734b89a6bac9b3": { + "name": "BSGG token contract", + "address": "0xda16cf041e2780618c49dbae5d734b89a6bac9b3", + "token": { + "decimals": 18, + "symbol": "BSGG" + }, + "isSC": {} + }, + "0x0d505c03d30e65f6e9b4ef88855a47a89e4b7676": { + "name": "ZOOMER token contract", + "address": "0x0d505c03d30e65f6e9b4ef88855a47a89e4b7676", + "token": { + "decimals": 18, + "symbol": "ZOOMER" + }, + "isSC": {} + }, + "0x37dba54fdc402aff647ce06c66972f5d662c326d": { + "name": "MELON token contract", + "address": "0x37dba54fdc402aff647ce06c66972f5d662c326d", + "token": { + "decimals": 18, + "symbol": "MELON" + }, + "isSC": {} + }, + "0x595832f8fc6bf59c85c527fec3740a1b7a361269": { + "name": "PowerLedger", + "address": "0x595832f8fc6bf59c85c527fec3740a1b7a361269", + "token": { + "decimals": 6, + "symbol": "POWR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/powr.svg" + }, + "0x44709a920fccf795fbc57baa433cc3dd53c44dbe": { + "name": "RADAR token contract", + "address": "0x44709a920fccf795fbc57baa433cc3dd53c44dbe", + "token": { + "decimals": 18, + "symbol": "RADAR" + }, + "isSC": {} + }, + "0xa2881f7f441267042f9778ffa0d4f834693426be": { + "name": "HUSL token contract", + "address": "0xa2881f7f441267042f9778ffa0d4f834693426be", + "token": { + "decimals": 18, + "symbol": "HUSL" + }, + "isSC": {} + }, + "0x64a60493d888728cf42616e034a0dfeae38efcf0": { + "name": "OLT token contract", + "address": "0x64a60493d888728cf42616e034a0dfeae38efcf0", + "token": { + "decimals": 18, + "symbol": "OLT" + }, + "isSC": {} + }, + "0xf1ca9cb74685755965c7458528a36934df52a3ef": { + "name": "AVINOC token contract", + "address": "0xf1ca9cb74685755965c7458528a36934df52a3ef", + "token": { + "decimals": 18, + "symbol": "AVINOC" + }, + "isSC": {} + }, + "0x799ebfabe77a6e34311eeee9825190b9ece32824": { + "name": "BTRST token contract", + "address": "0x799ebfabe77a6e34311eeee9825190b9ece32824", + "token": { + "decimals": 18, + "symbol": "BTRST" + }, + "isSC": {} + }, + "0xcd6926193308d3b371fdd6a6219067e550000000": { + "name": "NEST token contract", + "address": "0xcd6926193308d3b371fdd6a6219067e550000000", + "token": { + "decimals": 18, + "symbol": "NEST" + }, + "isSC": {} + }, + "0x5eed99d066a8caf10f3e4327c1b3d8b673485eed": { + "name": "SEED", + "address": "0x5eed99d066a8caf10f3e4327c1b3d8b673485eed", + "token": { + "decimals": 18, + "symbol": "SEED" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SEED.svg" + }, + "0xd47bdf574b4f76210ed503e0efe81b58aa061f3d": { + "name": "TRVL token contract", + "address": "0xd47bdf574b4f76210ed503e0efe81b58aa061f3d", + "token": { + "decimals": 18, + "symbol": "TRVL" + }, + "isSC": {} + }, + "0xf5aed4f6a1ad00f39dd21febb6f400ea020030c2": { + "name": "HBOT token contract", + "address": "0xf5aed4f6a1ad00f39dd21febb6f400ea020030c2", + "token": { + "decimals": 18, + "symbol": "HBOT" + }, + "isSC": {} + }, + "0x2c8ea636345a231e4b1a28f6eeb2072ed909c406": { + "name": "MEMELON token contract", + "address": "0x2c8ea636345a231e4b1a28f6eeb2072ed909c406", + "token": { + "decimals": 18, + "symbol": "MEMELON" + }, + "isSC": {} + }, + "0xf81421fc15300c5a8cca9afe12f5cbad502fa756": { + "name": "CRDC token contract", + "address": "0xf81421fc15300c5a8cca9afe12f5cbad502fa756", + "token": { + "decimals": 18, + "symbol": "CRDC" + }, + "isSC": {} + }, + "0x888888888889c00c67689029d7856aac1065ec11": { + "name": "OPIUM token contract", + "address": "0x888888888889c00c67689029d7856aac1065ec11", + "token": { + "decimals": 18, + "symbol": "OPIUM" + }, + "isSC": {} + }, + "0xddd6a0ecc3c6f6c102e5ea3d8af7b801d1a77ac8": { + "name": "UNIX token contract", + "address": "0xddd6a0ecc3c6f6c102e5ea3d8af7b801d1a77ac8", + "token": { + "decimals": 18, + "symbol": "UNIX" + }, + "isSC": {} + }, + "0xb045f7f363fe4949954811b113bd56d208c67b23": { + "name": "SILK token contract", + "address": "0xb045f7f363fe4949954811b113bd56d208c67b23", + "token": { + "decimals": 8, + "symbol": "SILK" + }, + "isSC": {} + }, + "0x3001f57f8308b189eb412a64322aad5ef9951290": { + "name": "GEC token contract", + "address": "0x3001f57f8308b189eb412a64322aad5ef9951290", + "token": { + "decimals": 18, + "symbol": "GEC" + }, + "isSC": {} + }, + "0x12c51b8f1b8a98c70fe6ae45c158a78931423e4c": { + "name": "XCEPT token contract", + "address": "0x12c51b8f1b8a98c70fe6ae45c158a78931423e4c", + "token": { + "decimals": 18, + "symbol": "XCEPT" + }, + "isSC": {} + }, + "0xa0bed124a09ac2bd941b10349d8d224fe3c955eb": { + "name": "DEPAY token contract", + "address": "0xa0bed124a09ac2bd941b10349d8d224fe3c955eb", + "token": { + "decimals": 18, + "symbol": "DEPAY" + }, + "isSC": {} + }, + "0x1e241521f4767853b376c2fe795a222a07d588ee": { + "name": "UNIT token contract", + "address": "0x1e241521f4767853b376c2fe795a222a07d588ee", + "token": { + "decimals": 18, + "symbol": "UNIT" + }, + "isSC": {} + }, + "0xc9fe6e1c76210be83dc1b5b20ec7fd010b0b1d15": { + "name": "FRIN token contract", + "address": "0xc9fe6e1c76210be83dc1b5b20ec7fd010b0b1d15", + "token": { + "decimals": 18, + "symbol": "FRIN" + }, + "isSC": {} + }, + "0xa89b728708be04f57c7a33c6f790b6f077298e26": { + "name": "BART token contract", + "address": "0xa89b728708be04f57c7a33c6f790b6f077298e26", + "token": { + "decimals": 18, + "symbol": "BART" + }, + "isSC": {} + }, + "0x32353a6c91143bfd6c7d363b546e62a9a2489a20": { + "name": "AGLD token contract", + "address": "0x32353a6c91143bfd6c7d363b546e62a9a2489a20", + "token": { + "decimals": 18, + "symbol": "AGLD" + }, + "isSC": {} + }, + "0xedadeb5faa413e6c8623461849dfd0b7c3790c32": { + "name": "OBOT token contract", + "address": "0xedadeb5faa413e6c8623461849dfd0b7c3790c32", + "token": { + "decimals": 18, + "symbol": "OBOT" + }, + "isSC": {} + }, + "0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f": { + "name": "GHO Token", + "address": "0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f", + "token": { + "decimals": 18, + "symbol": "GHO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/GHO.svg" + }, + "0xab85fc558d722a2b7c040ffb77db676bd9e7d322": { + "name": "MOROS token contract", + "address": "0xab85fc558d722a2b7c040ffb77db676bd9e7d322", + "token": { + "decimals": 18, + "symbol": "MOROS" + }, + "isSC": {} + }, + "0xb1f1f47061a7be15c69f378cb3f69423bd58f2f8": { + "name": "FLASH token contract", + "address": "0xb1f1f47061a7be15c69f378cb3f69423bd58f2f8", + "token": { + "decimals": 18, + "symbol": "FLASH" + }, + "isSC": {} + }, + "0x4b5f49487ea7b3609b1ad05459be420548789f1f": { + "name": "LEVER token contract", + "address": "0x4b5f49487ea7b3609b1ad05459be420548789f1f", + "token": { + "decimals": 18, + "symbol": "LEVER" + }, + "isSC": {} + }, + "0x056c1d42fb1326f57da7f19ebb7dda4673f1ff55": { + "name": "GAINS token contract", + "address": "0x056c1d42fb1326f57da7f19ebb7dda4673f1ff55", + "token": { + "decimals": 18, + "symbol": "GAINS" + }, + "isSC": {} + }, + "0xf5eda6c581f4373b07ce111baf8d1c4fc21cbaa1": { + "name": "GTT token contract", + "address": "0xf5eda6c581f4373b07ce111baf8d1c4fc21cbaa1", + "token": { + "decimals": 18, + "symbol": "GTT" + }, + "isSC": {} + }, + "0xaaca86b876ca011844b5798eca7a67591a9743c8": { + "name": "BIOS token contract", + "address": "0xaaca86b876ca011844b5798eca7a67591a9743c8", + "token": { + "decimals": 18, + "symbol": "BIOS" + }, + "isSC": {} + }, + "0x50b275a15e4f5004aa96f972a30e6a9c718b203f": { + "name": "WSTOR token contract", + "address": "0x50b275a15e4f5004aa96f972a30e6a9c718b203f", + "token": { + "decimals": 18, + "symbol": "WSTOR" + }, + "isSC": {} + }, + "0xeb9e3c6cda17c8755a4e8a1cc944afb7fc7d7905": { + "name": "MATCH token contract", + "address": "0xeb9e3c6cda17c8755a4e8a1cc944afb7fc7d7905", + "token": { + "decimals": 18, + "symbol": "MATCH" + }, + "isSC": {} + }, + "0x8365332d4baf69bc24ca2401b90c3853ab9f818e": { + "name": "WOLF token contract", + "address": "0x8365332d4baf69bc24ca2401b90c3853ab9f818e", + "token": { + "decimals": 18, + "symbol": "WOLF" + }, + "isSC": {} + }, + "0x1e2f15302b90edde696593607b6bd444b64e8f02": { + "name": "SHIRYO-INU token contract", + "address": "0x1e2f15302b90edde696593607b6bd444b64e8f02", + "token": { + "decimals": 9, + "symbol": "SHIRYO-INU" + }, + "isSC": {} + }, + "0xfc226294dafb6e69905b3e7635b575d0508a42c5": { + "name": "0XB token contract", + "address": "0xfc226294dafb6e69905b3e7635b575d0508a42c5", + "token": { + "decimals": 18, + "symbol": "0XB" + }, + "isSC": {} + }, + "0xd2960d83c53085b5631f4d0be4916806e40ef1f3": { + "name": "OOFP token contract", + "address": "0xd2960d83c53085b5631f4d0be4916806e40ef1f3", + "token": { + "decimals": 18, + "symbol": "OOFP" + }, + "isSC": {} + }, + "0x4e4990e997e1df3f6b39ff49384e2e7e99bc55fe": { + "name": "SAUDIBONK token contract", + "address": "0x4e4990e997e1df3f6b39ff49384e2e7e99bc55fe", + "token": { + "decimals": 18, + "symbol": "SAUDIBONK" + }, + "isSC": {} + }, + "0xcbe771323587ea16dacb6016e269d7f08a7acc4e": { + "name": "SPO token contract", + "address": "0xcbe771323587ea16dacb6016e269d7f08a7acc4e", + "token": { + "decimals": 18, + "symbol": "SPO" + }, + "isSC": {} + }, + "0xdc0327d50e6c73db2f8117760592c8bbf1cdcf38": { + "name": "STRNGR token contract", + "address": "0xdc0327d50e6c73db2f8117760592c8bbf1cdcf38", + "token": { + "decimals": 18, + "symbol": "STRNGR" + }, + "isSC": {} + }, + "0x230f5ed78a45452f726365b8ad1d6866f5faa68f": { + "name": "COF token contract", + "address": "0x230f5ed78a45452f726365b8ad1d6866f5faa68f", + "token": { + "decimals": 9, + "symbol": "COF" + }, + "isSC": {} + }, + "0x7866e48c74cbfb8183cd1a929cd9b95a7a5cb4f4": { + "name": "KIT token contract", + "address": "0x7866e48c74cbfb8183cd1a929cd9b95a7a5cb4f4", + "token": { + "decimals": 18, + "symbol": "KIT" + }, + "isSC": {} + }, + "0x4cf89ca06ad997bc732dc876ed2a7f26a9e7f361": { + "name": "Mysterium", + "address": "0x4cf89ca06ad997bc732dc876ed2a7f26a9e7f361", + "token": { + "decimals": 18, + "symbol": "MYST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MYST.svg" + }, + "0x948c70dc6169bfb10028fdbe96cbc72e9562b2ac": { + "name": "XP token contract", + "address": "0x948c70dc6169bfb10028fdbe96cbc72e9562b2ac", + "token": { + "decimals": 18, + "symbol": "XP" + }, + "isSC": {} + }, + "0xee3c722d177559f73288cec91fa3e4bbfd8c27fc": { + "name": "HHGTTG token contract", + "address": "0xee3c722d177559f73288cec91fa3e4bbfd8c27fc", + "token": { + "decimals": 9, + "symbol": "HHGTTG" + }, + "isSC": {} + }, + "0xc881255e4d639b42e326158c7b8ccb7f33459261": { + "name": "AMMX token contract", + "address": "0xc881255e4d639b42e326158c7b8ccb7f33459261", + "token": { + "decimals": 18, + "symbol": "AMMX" + }, + "isSC": {} + }, + "0x3a4f40631a4f906c2bad353ed06de7a5d3fcb430": { + "name": "PlayDapp Token", + "address": "0x3a4f40631a4f906c2bad353ed06de7a5d3fcb430", + "token": { + "decimals": 18, + "symbol": "PLA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/playdapp.svg" + }, + "0x13c4b558f6663329c13c838cc0b5b796f7fc0531": { + "name": "HRZN token contract", + "address": "0x13c4b558f6663329c13c838cc0b5b796f7fc0531", + "token": { + "decimals": 18, + "symbol": "HRZN" + }, + "isSC": {} + }, + "0x4f08705fb8f33affc231ed66e626b40e84a71870": { + "name": "FLUT token contract", + "address": "0x4f08705fb8f33affc231ed66e626b40e84a71870", + "token": { + "decimals": 11, + "symbol": "FLUT" + }, + "isSC": {} + }, + "0xb4fc1fc74effa5dc15a031eb8159302cfa4f1288": { + "name": "OZK token contract", + "address": "0xb4fc1fc74effa5dc15a031eb8159302cfa4f1288", + "token": { + "decimals": 9, + "symbol": "OZK" + }, + "isSC": {} + }, + "0xdf4ef6ee483953fe3b84abd08c6a060445c01170": { + "name": "WACME token contract", + "address": "0xdf4ef6ee483953fe3b84abd08c6a060445c01170", + "token": { + "decimals": 8, + "symbol": "WACME" + }, + "isSC": {} + }, + "0x9db0fb0aebe6a925b7838d16e3993a3976a64aab": { + "name": "BAM token contract", + "address": "0x9db0fb0aebe6a925b7838d16e3993a3976a64aab", + "token": { + "decimals": 18, + "symbol": "BAM" + }, + "isSC": {} + }, + "0x27054b13b1b798b345b591a4d22e6562d47ea75a": { + "name": "AirSwap Token", + "address": "0x27054b13b1b798b345b591a4d22e6562d47ea75a", + "token": { + "decimals": 4, + "symbol": "AST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/AirSwapLogo.svg" + }, + "0x35bd01fc9d6d5d81ca9e055db88dc49aa2c699a8": { + "name": "FWB Pro", + "address": "0x35bd01fc9d6d5d81ca9e055db88dc49aa2c699a8", + "token": { + "decimals": 18, + "symbol": "FWB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/FWB.svg" + }, + "0x99fe3b1391503a1bc1788051347a1324bff41452": { + "name": "SX token contract", + "address": "0x99fe3b1391503a1bc1788051347a1324bff41452", + "token": { + "decimals": 18, + "symbol": "SX" + }, + "isSC": {} + }, + "0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d": { + "name": "Aeternity", + "address": "0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d", + "token": { + "decimals": 18, + "symbol": "AE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aeternity.svg" + }, + "0x63f88a2298a5c4aee3c216aa6d926b184a4b2437": { + "name": "GAME Credits", + "address": "0x63f88a2298a5c4aee3c216aa6d926b184a4b2437", + "token": { + "decimals": 18, + "symbol": "GAME" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/GAMECreditsLogo.svg" + }, + "0xcb0d82f4dfa503c9e3b8abc7a3caa01175b2da39": { + "name": "AX token contract", + "address": "0xcb0d82f4dfa503c9e3b8abc7a3caa01175b2da39", + "token": { + "decimals": 18, + "symbol": "AX" + }, + "isSC": {} + }, + "0x6f3277ad0782a7da3eb676b85a8346a100bf9c1c": { + "name": "DOGPAD token contract", + "address": "0x6f3277ad0782a7da3eb676b85a8346a100bf9c1c", + "token": { + "decimals": 18, + "symbol": "DOGPAD" + }, + "isSC": {} + }, + "0x009178997aff09a67d4caccfeb897fb79d036214": { + "name": "1SOL token contract", + "address": "0x009178997aff09a67d4caccfeb897fb79d036214", + "token": { + "decimals": 18, + "symbol": "1SOL" + }, + "isSC": {} + }, + "0x3ed3b47dd13ec9a98b44e6204a523e766b225811": { + "name": "Aave USDT", + "address": "0x3ed3b47dd13ec9a98b44e6204a523e766b225811", + "token": { + "decimals": 6, + "symbol": "aUSDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/aUSDT.svg" + }, + "0xe0bd989ec7417374a1c0d9d4fb8b692d1a9e27eb": { + "name": "BWL token contract", + "address": "0xe0bd989ec7417374a1c0d9d4fb8b692d1a9e27eb", + "token": { + "decimals": 10, + "symbol": "BWL" + }, + "isSC": {} + }, + "0x208bcf9cd1d694d1d3c630362e517940e3724d80": { + "name": "ORACLE token contract", + "address": "0x208bcf9cd1d694d1d3c630362e517940e3724d80", + "token": { + "decimals": 9, + "symbol": "ORACLE" + }, + "isSC": {} + }, + "0x3267c5b73cc15e253b1a90c01366b17d560bc6fb": { + "name": "RON token contract", + "address": "0x3267c5b73cc15e253b1a90c01366b17d560bc6fb", + "token": { + "decimals": 9, + "symbol": "RON" + }, + "isSC": {} + }, + "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee": { + "name": "Wrapped eETH", + "address": "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee", + "token": { + "decimals": 18, + "symbol": "weETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/weeth.svg" + }, + "0x35fa164735182de50811e8e2e824cfb9b6118ac2": { + "name": "ether.fi Staked ETH", + "address": "0x35fa164735182de50811e8e2e824cfb9b6118ac2", + "token": { + "decimals": 18, + "symbol": "eETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eeth.svg" + }, + "0xbeab712832112bd7664226db7cd025b153d3af55": { + "name": "BRIGHT token contract", + "address": "0xbeab712832112bd7664226db7cd025b153d3af55", + "token": { + "decimals": 18, + "symbol": "BRIGHT" + }, + "isSC": {} + }, + "0x8971f9fd7196e5cee2c1032b50f656855af7dd26": { + "name": "Lambda", + "address": "0x8971f9fd7196e5cee2c1032b50f656855af7dd26", + "token": { + "decimals": 18, + "symbol": "LAMB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LAMB.svg" + }, + "0x0000000de40dfa9b17854cbc7869d80f9f98d823": { + "name": "DLTA token contract", + "address": "0x0000000de40dfa9b17854cbc7869d80f9f98d823", + "token": { + "decimals": 18, + "symbol": "DLTA" + }, + "isSC": {} + }, + "0xd2e5decc08a80be6538f89f9ab8ff296e2f724df": { + "name": "STIMA token contract", + "address": "0xd2e5decc08a80be6538f89f9ab8ff296e2f724df", + "token": { + "decimals": 6, + "symbol": "STIMA" + }, + "isSC": {} + }, + "0xe46091dce9c67691bcf22768bbee0bc9e20d4beb": { + "name": "WSBC token contract", + "address": "0xe46091dce9c67691bcf22768bbee0bc9e20d4beb", + "token": { + "decimals": 9, + "symbol": "WSBC" + }, + "isSC": {} + }, + "0x1afb69dbc9f54d08dab1bd3436f8da1af819e647": { + "name": "MELOS token contract", + "address": "0x1afb69dbc9f54d08dab1bd3436f8da1af819e647", + "token": { + "decimals": 18, + "symbol": "MELOS" + }, + "isSC": {} + }, + "0x59e9261255644c411afdd00bd89162d09d862e38": { + "name": "ETHA token contract", + "address": "0x59e9261255644c411afdd00bd89162d09d862e38", + "token": { + "decimals": 18, + "symbol": "ETHA" + }, + "isSC": {} + }, + "0x0ebb614204e47c09b6c3feb9aaecad8ee060e23e": { + "name": "CPAY token contract", + "address": "0x0ebb614204e47c09b6c3feb9aaecad8ee060e23e", + "token": { + "decimals": 0, + "symbol": "CPAY" + }, + "isSC": {} + }, + "0x4ee438be38f8682abb089f2bfea48851c5e71eaf": { + "name": "YAE token contract", + "address": "0x4ee438be38f8682abb089f2bfea48851c5e71eaf", + "token": { + "decimals": 18, + "symbol": "YAE" + }, + "isSC": {} + }, + "0xb76cf92076adbf1d9c39294fa8e7a67579fde357": { + "name": "ARPL token contract", + "address": "0xb76cf92076adbf1d9c39294fa8e7a67579fde357", + "token": { + "decimals": 18, + "symbol": "ARPL" + }, + "isSC": {} + }, + "0xb755506531786c8ac63b756bab1ac387bacb0c04": { + "name": "ZARP token contract", + "address": "0xb755506531786c8ac63b756bab1ac387bacb0c04", + "token": { + "decimals": 18, + "symbol": "ZARP" + }, + "isSC": {} + }, + "0x3540abe4f288b280a0740ad5121aec337c404d15": { + "name": "TPRO token contract", + "address": "0x3540abe4f288b280a0740ad5121aec337c404d15", + "token": { + "decimals": 18, + "symbol": "TPRO" + }, + "isSC": {} + }, + "0xe2cfbbedbce1bd59b1b799c44282e6396d692b84": { + "name": "DEXIO token contract", + "address": "0xe2cfbbedbce1bd59b1b799c44282e6396d692b84", + "token": { + "decimals": 18, + "symbol": "DEXIO" + }, + "isSC": {} + }, + "0x61b34a012646cd7357f58ee9c0160c6d0021fa41": { + "name": "ELO token contract", + "address": "0x61b34a012646cd7357f58ee9c0160c6d0021fa41", + "token": { + "decimals": 18, + "symbol": "ELO" + }, + "isSC": {} + }, + "0x3d2b66bc4f9d6388bd2d97b95b565be1686aefb3": { + "name": "LAMBO token contract", + "address": "0x3d2b66bc4f9d6388bd2d97b95b565be1686aefb3", + "token": { + "decimals": 18, + "symbol": "LAMBO" + }, + "isSC": {} + }, + "0xf3dcbc6d72a4e1892f7917b7c43b74131df8480e": { + "name": "BDP token contract", + "address": "0xf3dcbc6d72a4e1892f7917b7c43b74131df8480e", + "token": { + "decimals": 18, + "symbol": "BDP" + }, + "isSC": {} + }, + "0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0": { + "name": "Loom Token", + "address": "0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0", + "token": { + "decimals": 18, + "symbol": "LOOM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/loom.svg" + }, + "0xd0a6053f087e87a25dc60701ba6e663b1a548e85": { + "name": "LRDS token contract", + "address": "0xd0a6053f087e87a25dc60701ba6e663b1a548e85", + "token": { + "decimals": 18, + "symbol": "LRDS" + }, + "isSC": {} + }, + "0x1b6e9c73bee68102d9dd4a2627f97bff4183ab0a": { + "name": "OLE token contract", + "address": "0x1b6e9c73bee68102d9dd4a2627f97bff4183ab0a", + "token": { + "decimals": 18, + "symbol": "OLE" + }, + "isSC": {} + }, + "0xb14ebf566511b9e6002bb286016ab2497b9b9c9d": { + "name": "HID token contract", + "address": "0xb14ebf566511b9e6002bb286016ab2497b9b9c9d", + "token": { + "decimals": 18, + "symbol": "HID" + }, + "isSC": {} + }, + "0x9fc8f0ca1668e87294941b7f627e9c15ea06b459": { + "name": "PNL token contract", + "address": "0x9fc8f0ca1668e87294941b7f627e9c15ea06b459", + "token": { + "decimals": 18, + "symbol": "PNL" + }, + "isSC": {} + }, + "0x0316eb71485b0ab14103307bf65a021042c6d380": { + "name": "HBTC token contract", + "address": "0x0316eb71485b0ab14103307bf65a021042c6d380", + "token": { + "decimals": 18, + "symbol": "HBTC" + }, + "isSC": {} + }, + "0xe66747a101bff2dba3697199dcce5b743b454759": { + "name": "GT token contract", + "address": "0xe66747a101bff2dba3697199dcce5b743b454759", + "token": { + "decimals": 18, + "symbol": "GT" + }, + "isSC": {} + }, + "0x24edded3f03abb2e9d047464294133378bddb596": { + "name": "SECT token contract", + "address": "0x24edded3f03abb2e9d047464294133378bddb596", + "token": { + "decimals": 18, + "symbol": "SECT" + }, + "isSC": {} + }, + "0x909e34d3f6124c324ac83dcca84b74398a6fa173": { + "name": "$ZKP Token", + "address": "0x909e34d3f6124c324ac83dcca84b74398a6fa173", + "token": { + "decimals": 18, + "symbol": "$ZKP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ZKP.svg" + }, + "0x723696965f47b990dff00064fcaca95f0ee01123": { + "name": "ARBOT token contract", + "address": "0x723696965f47b990dff00064fcaca95f0ee01123", + "token": { + "decimals": 18, + "symbol": "ARBOT" + }, + "isSC": {} + }, + "0xc744df3419a8c9bd4d6b9852a503eb1c5308a326": { + "name": "RED token contract", + "address": "0xc744df3419a8c9bd4d6b9852a503eb1c5308a326", + "token": { + "decimals": 18, + "symbol": "RED" + }, + "isSC": {} + }, + "0x6afcff9189e8ed3fcc1cffa184feb1276f6a82a5": { + "name": "PETS token contract", + "address": "0x6afcff9189e8ed3fcc1cffa184feb1276f6a82a5", + "token": { + "decimals": 18, + "symbol": "PETS" + }, + "isSC": {} + }, + "0x38cf11283de05cf1823b7804bc75068bd6296957": { + "name": "MBOT token contract", + "address": "0x38cf11283de05cf1823b7804bc75068bd6296957", + "token": { + "decimals": 18, + "symbol": "MBOT" + }, + "isSC": {} + }, + "0x7ae1d57b58fa6411f32948314badd83583ee0e8c": { + "name": "PAPER token contract", + "address": "0x7ae1d57b58fa6411f32948314badd83583ee0e8c", + "token": { + "decimals": 18, + "symbol": "PAPER" + }, + "isSC": {} + }, + "0xd6a5ab46ead26f49b03bbb1f9eb1ad5c1767974a": { + "name": "EMON token contract", + "address": "0xd6a5ab46ead26f49b03bbb1f9eb1ad5c1767974a", + "token": { + "decimals": 18, + "symbol": "EMON" + }, + "isSC": {} + }, + "0xbc6e06778708177a18210181b073da747c88490a": { + "name": "SYNR token contract", + "address": "0xbc6e06778708177a18210181b073da747c88490a", + "token": { + "decimals": 18, + "symbol": "SYNR" + }, + "isSC": {} + }, + "0x765f0c16d1ddc279295c1a7c24b0883f62d33f75": { + "name": "DTX token contract", + "address": "0x765f0c16d1ddc279295c1a7c24b0883f62d33f75", + "token": { + "decimals": 18, + "symbol": "DTX" + }, + "isSC": {} + }, + "0x027bf54126482b66b0f26a680f03029db3de37aa": { + "name": "DVDOGE token contract", + "address": "0x027bf54126482b66b0f26a680f03029db3de37aa", + "token": { + "decimals": 18, + "symbol": "DVDOGE" + }, + "isSC": {} + }, + "0x3e34eabf5858a126cb583107e643080cee20ca64": { + "name": "LINQ token contract", + "address": "0x3e34eabf5858a126cb583107e643080cee20ca64", + "token": { + "decimals": 18, + "symbol": "LINQ" + }, + "isSC": {} + }, + "0x79d4f0232a66c4c91b89c76362016a1707cfbf4f": { + "name": "VCHF token contract", + "address": "0x79d4f0232a66c4c91b89c76362016a1707cfbf4f", + "token": { + "decimals": 18, + "symbol": "VCHF" + }, + "isSC": {} + }, + "0x8929e9dbd2785e3ba16175e596cdd61520fee0d1": { + "name": "ALTD token contract", + "address": "0x8929e9dbd2785e3ba16175e596cdd61520fee0d1", + "token": { + "decimals": 18, + "symbol": "ALTD" + }, + "isSC": {} + }, + "0x00281dfce4cfd72c0b6fda2aaaf077258743f9e8": { + "name": "NRFB token contract", + "address": "0x00281dfce4cfd72c0b6fda2aaaf077258743f9e8", + "token": { + "decimals": 0, + "symbol": "NRFB" + }, + "isSC": {} + }, + "0x9f4909cc95fb870bf48c128c1fdbb5f482797632": { + "name": "GZLR token contract", + "address": "0x9f4909cc95fb870bf48c128c1fdbb5f482797632", + "token": { + "decimals": 18, + "symbol": "GZLR" + }, + "isSC": {} + }, + "0x5e8422345238f34275888049021821e8e08caa1f": { + "name": "FRXETH token contract", + "address": "0x5e8422345238f34275888049021821e8e08caa1f", + "token": { + "decimals": 18, + "symbol": "FRXETH" + }, + "isSC": {} + }, + "0xa44e5137293e855b1b7bc7e2c6f8cd796ffcb037": { + "name": "DVPN token contract", + "address": "0xa44e5137293e855b1b7bc7e2c6f8cd796ffcb037", + "token": { + "decimals": 8, + "symbol": "DVPN" + }, + "isSC": {} + }, + "0x302cae5dcf8f051d0177043c3438020b89b33218": { + "name": "BOOST token contract", + "address": "0x302cae5dcf8f051d0177043c3438020b89b33218", + "token": { + "decimals": 18, + "symbol": "BOOST" + }, + "isSC": {} + }, + "0xccccb68e1a848cbdb5b60a974e07aae143ed40c3": { + "name": "TOPIA token contract", + "address": "0xccccb68e1a848cbdb5b60a974e07aae143ed40c3", + "token": { + "decimals": 18, + "symbol": "TOPIA" + }, + "isSC": {} + }, + "0xee3200f94a1a2345e6cc486032a5df1d50cb621c": { + "name": "CX token contract", + "address": "0xee3200f94a1a2345e6cc486032a5df1d50cb621c", + "token": { + "decimals": 18, + "symbol": "CX" + }, + "isSC": {} + }, + "0xf5b339d3912d5c72e16440b63a9c1df6024de93c": { + "name": "BABYGROK token contract", + "address": "0xf5b339d3912d5c72e16440b63a9c1df6024de93c", + "token": { + "decimals": 9, + "symbol": "BABYGROK" + }, + "isSC": {} + }, + "0x77f9cf0bd8c500cffdf420e72343893aecc2ec0b": { + "name": "LAIKA token contract", + "address": "0x77f9cf0bd8c500cffdf420e72343893aecc2ec0b", + "token": { + "decimals": 18, + "symbol": "LAIKA" + }, + "isSC": {} + }, + "0x55a380d134d722006a5ce2d510562e1239d225b1": { + "name": "MARVIN token contract", + "address": "0x55a380d134d722006a5ce2d510562e1239d225b1", + "token": { + "decimals": 18, + "symbol": "MARVIN" + }, + "isSC": {} + }, + "0xd7f0cc50ad69408ae58be033f4f85d2367c2e468": { + "name": "VERA token contract", + "address": "0xd7f0cc50ad69408ae58be033f4f85d2367c2e468", + "token": { + "decimals": 18, + "symbol": "VERA" + }, + "isSC": {} + }, + "0x14da7b27b2e0fedefe0a664118b0c9bc68e2e9af": { + "name": "BCUG token contract", + "address": "0x14da7b27b2e0fedefe0a664118b0c9bc68e2e9af", + "token": { + "decimals": 18, + "symbol": "BCUG" + }, + "isSC": {} + }, + "0xb48fe88717c1a6020cc256a7d6f0e4a285bc9660": { + "name": "SCOM token contract", + "address": "0xb48fe88717c1a6020cc256a7d6f0e4a285bc9660", + "token": { + "decimals": 18, + "symbol": "SCOM" + }, + "isSC": {} + }, + "0x76e222b07c53d28b89b0bac18602810fc22b49a8": { + "name": "JOE token contract", + "address": "0x76e222b07c53d28b89b0bac18602810fc22b49a8", + "token": { + "decimals": 18, + "symbol": "JOE" + }, + "isSC": {} + }, + "0x727f064a78dc734d33eec18d5370aef32ffd46e4": { + "name": "ORION token contract", + "address": "0x727f064a78dc734d33eec18d5370aef32ffd46e4", + "token": { + "decimals": 18, + "symbol": "ORION" + }, + "isSC": {} + }, + "0x982b50e55394641ca975a0eec630b120b671391a": { + "name": "ECOTERRA token contract", + "address": "0x982b50e55394641ca975a0eec630b120b671391a", + "token": { + "decimals": 9, + "symbol": "ECOTERRA" + }, + "isSC": {} + }, + "0x0e6fa9c050c8a707e7f56a2b3695665e4f9eac9b": { + "name": "RBIF token contract", + "address": "0x0e6fa9c050c8a707e7f56a2b3695665e4f9eac9b", + "token": { + "decimals": 9, + "symbol": "RBIF" + }, + "isSC": {} + }, + "0xa876f27f13a9eb6e621202cefdd5afc4a90e6457": { + "name": "IC token contract", + "address": "0xa876f27f13a9eb6e621202cefdd5afc4a90e6457", + "token": { + "decimals": 9, + "symbol": "IC" + }, + "isSC": {} + }, + "0x078c4adf3fee52eb77f6018d9805dfc69e911d39": { + "name": "GLORY token contract", + "address": "0x078c4adf3fee52eb77f6018d9805dfc69e911d39", + "token": { + "decimals": 18, + "symbol": "GLORY" + }, + "isSC": {} + }, + "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0": { + "name": "Wrapped liquid staked Ether 2.0", + "address": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "token": { + "decimals": 18, + "symbol": "wstETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wstETH.svg" + }, + "0x4dd942baa75810a3c1e876e79d5cd35e09c97a76": { + "name": "D2T token contract", + "address": "0x4dd942baa75810a3c1e876e79d5cd35e09c97a76", + "token": { + "decimals": 18, + "symbol": "D2T" + }, + "isSC": {} + }, + "0x1f16d41f9b3db03b462bdd6c92245ee708d1c103": { + "name": "RPG token contract", + "address": "0x1f16d41f9b3db03b462bdd6c92245ee708d1c103", + "token": { + "decimals": 18, + "symbol": "RPG" + }, + "isSC": {} + }, + "0xf4134146af2d511dd5ea8cdb1c4ac88c57d60404": { + "name": "SNC token contract", + "address": "0xf4134146af2d511dd5ea8cdb1c4ac88c57d60404", + "token": { + "decimals": 18, + "symbol": "SNC" + }, + "isSC": {} + }, + "0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4": { + "name": "Enigma", + "address": "0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4", + "token": { + "decimals": 8, + "symbol": "ENG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/enigma.svg" + }, + "0x017e9db34fc69af0dc7c7b4b33511226971cddc7": { + "name": "OCD token contract", + "address": "0x017e9db34fc69af0dc7c7b4b33511226971cddc7", + "token": { + "decimals": 18, + "symbol": "OCD" + }, + "isSC": {} + }, + "0x8db1d28ee0d822367af8d220c0dc7cb6fe9dc442": { + "name": "ETHPAD token contract", + "address": "0x8db1d28ee0d822367af8d220c0dc7cb6fe9dc442", + "token": { + "decimals": 18, + "symbol": "ETHPAD" + }, + "isSC": {} + }, + "0x5e27e384acbba20982f991893b9970aaf3f43181": { + "name": "TYRION token contract", + "address": "0x5e27e384acbba20982f991893b9970aaf3f43181", + "token": { + "decimals": 18, + "symbol": "TYRION" + }, + "isSC": {} + }, + "0xb6ee9668771a79be7967ee29a63d4184f8097143": { + "name": "CXO token contract", + "address": "0xb6ee9668771a79be7967ee29a63d4184f8097143", + "token": { + "decimals": 18, + "symbol": "CXO" + }, + "isSC": {} + }, + "0xe973e453977195422b48e1852a207b7ee9c913c7": { + "name": "AD token contract", + "address": "0xe973e453977195422b48e1852a207b7ee9c913c7", + "token": { + "decimals": 18, + "symbol": "AD" + }, + "isSC": {} + }, + "0x5f18ea482ad5cc6bc65803817c99f477043dce85": { + "name": "AGI token contract", + "address": "0x5f18ea482ad5cc6bc65803817c99f477043dce85", + "token": { + "decimals": 18, + "symbol": "AGI" + }, + "isSC": {} + }, + "0x2e9d63788249371f1dfc918a52f8d799f4a38c94": { + "name": "TOKE token contract", + "address": "0x2e9d63788249371f1dfc918a52f8d799f4a38c94", + "token": { + "decimals": 18, + "symbol": "TOKE" + }, + "isSC": {} + }, + "0x761a3557184cbc07b7493da0661c41177b2f97fa": { + "name": "GROW token contract", + "address": "0x761a3557184cbc07b7493da0661c41177b2f97fa", + "token": { + "decimals": 18, + "symbol": "GROW" + }, + "isSC": {} + }, + "0x5888641e3e6cbea6d84ba81edb217bd691d3be38": { + "name": "BOBO token contract", + "address": "0x5888641e3e6cbea6d84ba81edb217bd691d3be38", + "token": { + "decimals": 9, + "symbol": "BOBO" + }, + "isSC": {} + }, + "0xe084d3069a9b6d1b2d09d21ffad4a03d1b6496da": { + "name": "PUSHD token contract", + "address": "0xe084d3069a9b6d1b2d09d21ffad4a03d1b6496da", + "token": { + "decimals": 18, + "symbol": "PUSHD" + }, + "isSC": {} + }, + "0xfeff7b68bc540826da22b296c82a4b8b6b845f41": { + "name": "UEFN token contract", + "address": "0xfeff7b68bc540826da22b296c82a4b8b6b845f41", + "token": { + "decimals": 18, + "symbol": "UEFN" + }, + "isSC": {} + }, + "0xd0d56273290d339aaf1417d9bfa1bb8cfe8a0933": { + "name": "FOOM token contract", + "address": "0xd0d56273290d339aaf1417d9bfa1bb8cfe8a0933", + "token": { + "decimals": 18, + "symbol": "FOOM" + }, + "isSC": {} + }, + "0xb794ad95317f75c44090f64955954c3849315ffe": { + "name": "RIBBIT token contract", + "address": "0xb794ad95317f75c44090f64955954c3849315ffe", + "token": { + "decimals": 18, + "symbol": "RIBBIT" + }, + "isSC": {} + }, + "0x744d70fdbe2ba4cf95131626614a1763df805b9e": { + "name": "Status Network Token", + "address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e", + "token": { + "decimals": 18, + "symbol": "SNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/snt.svg" + }, + "0xb244b3574a5627849fca2057e3854340def63071": { + "name": "VEIL token contract", + "address": "0xb244b3574a5627849fca2057e3854340def63071", + "token": { + "decimals": 18, + "symbol": "VEIL" + }, + "isSC": {} + }, + "0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa": { + "name": "Orbs", + "address": "0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa", + "token": { + "decimals": 18, + "symbol": "ORBS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/orbs.svg" + }, + "0xeca82185adce47f39c684352b0439f030f860318": { + "name": "Perlin", + "address": "0xeca82185adce47f39c684352b0439f030f860318", + "token": { + "decimals": 18, + "symbol": "PERL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PERL.svg" + }, + "0x310c8f00b9de3c31ab95ea68feb6c877538f7947": { + "name": "UNDEAD token contract", + "address": "0x310c8f00b9de3c31ab95ea68feb6c877538f7947", + "token": { + "decimals": 18, + "symbol": "UNDEAD" + }, + "isSC": {} + }, + "0x06a00715e6f92210af9d7680b584931faf71a833": { + "name": "XNL token contract", + "address": "0x06a00715e6f92210af9d7680b584931faf71a833", + "token": { + "decimals": 18, + "symbol": "XNL" + }, + "isSC": {} + }, + "0xb5f1457d6fba1956fb8d31b0b7caca14bde0be4b": { + "name": "STILT token contract", + "address": "0xb5f1457d6fba1956fb8d31b0b7caca14bde0be4b", + "token": { + "decimals": 9, + "symbol": "STILT" + }, + "isSC": {} + }, + "0x8578530205cecbe5db83f7f29ecfeec860c297c2": { + "name": "AOG token contract", + "address": "0x8578530205cecbe5db83f7f29ecfeec860c297c2", + "token": { + "decimals": 18, + "symbol": "AOG" + }, + "isSC": {} + }, + "0xbded8a4dc74a940eab68703167db89b1712b68ea": { + "name": "KMN token contract", + "address": "0xbded8a4dc74a940eab68703167db89b1712b68ea", + "token": { + "decimals": 9, + "symbol": "KMN" + }, + "isSC": {} + }, + "0x9078deb4736b7e2181beb8db276dfbfa7f21f821": { + "name": "MONKGG token contract", + "address": "0x9078deb4736b7e2181beb8db276dfbfa7f21f821", + "token": { + "decimals": 18, + "symbol": "MONKGG" + }, + "isSC": {} + }, + "0x0ebe30595a44e5288c24161ddfc1e9fa08e33a0c": { + "name": "NYAN token contract", + "address": "0x0ebe30595a44e5288c24161ddfc1e9fa08e33a0c", + "token": { + "decimals": 18, + "symbol": "NYAN" + }, + "isSC": {} + }, + "0x3ce1848f4ace979d31f7ed1921ee0b2689fce5a5": { + "name": "OMNI token contract", + "address": "0x3ce1848f4ace979d31f7ed1921ee0b2689fce5a5", + "token": { + "decimals": 18, + "symbol": "OMNI" + }, + "isSC": {} + }, + "0x6fa5e1c43b5a466cbd1cae7993b67c982400d481": { + "name": "COINBT token contract", + "address": "0x6fa5e1c43b5a466cbd1cae7993b67c982400d481", + "token": { + "decimals": 18, + "symbol": "COINBT" + }, + "isSC": {} + }, + "0x9b2b931d6ab97b6a887b2c5d8529537e6fe73ebe": { + "name": "ALLIN token contract", + "address": "0x9b2b931d6ab97b6a887b2c5d8529537e6fe73ebe", + "token": { + "decimals": 9, + "symbol": "ALLIN" + }, + "isSC": {} + }, + "0x2f5fa8adf5f09a5f9de05b65fe82a404913f02c4": { + "name": "TROLL20 token contract", + "address": "0x2f5fa8adf5f09a5f9de05b65fe82a404913f02c4", + "token": { + "decimals": 18, + "symbol": "TROLL20" + }, + "isSC": {} + }, + "0xf7970499814654cd13cb7b6e7634a12a7a8a9abc": { + "name": "TOM token contract", + "address": "0xf7970499814654cd13cb7b6e7634a12a7a8a9abc", + "token": { + "decimals": 18, + "symbol": "TOM" + }, + "isSC": {} + }, + "0x508626d9a29d13eba26f843a2bd7bf7b00a45be5": { + "name": "KALE token contract", + "address": "0x508626d9a29d13eba26f843a2bd7bf7b00a45be5", + "token": { + "decimals": 18, + "symbol": "KALE" + }, + "isSC": {} + }, + "0x8e6cd950ad6ba651f6dd608dc70e5886b1aa6b24": { + "name": "STARL token contract", + "address": "0x8e6cd950ad6ba651f6dd608dc70e5886b1aa6b24", + "token": { + "decimals": 18, + "symbol": "STARL" + }, + "isSC": {} + }, + "0xade6fdaba1643e4d1eef68da7170f234470938c6": { + "name": "HARAMBE token contract", + "address": "0xade6fdaba1643e4d1eef68da7170f234470938c6", + "token": { + "decimals": 18, + "symbol": "HARAMBE" + }, + "isSC": {} + }, + "0x88800092ff476844f74dc2fc427974bbee2794ae": { + "name": "WALLET token contract", + "address": "0x88800092ff476844f74dc2fc427974bbee2794ae", + "token": { + "decimals": 18, + "symbol": "WALLET" + }, + "isSC": {} + }, + "0x79126d32a86e6663f3aaac4527732d0701c1ae6c": { + "name": "DMT token contract", + "address": "0x79126d32a86e6663f3aaac4527732d0701c1ae6c", + "token": { + "decimals": 18, + "symbol": "DMT" + }, + "isSC": {} + }, + "0xc4c346edc55504574cceb00aa1091d22404a4bc3": { + "name": "MEZZ token contract", + "address": "0xc4c346edc55504574cceb00aa1091d22404a4bc3", + "token": { + "decimals": 18, + "symbol": "MEZZ" + }, + "isSC": {} + }, + "0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664": { + "name": "QKC token contract", + "address": "0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664", + "token": { + "decimals": 18, + "symbol": "QKC" + }, + "isSC": {} + }, + "0x0b6f3ea2814f3fff804ba5d5c237aebbc364fba9": { + "name": "UNA token contract", + "address": "0x0b6f3ea2814f3fff804ba5d5c237aebbc364fba9", + "token": { + "decimals": 18, + "symbol": "UNA" + }, + "isSC": {} + }, + "0xa40640458fbc27b6eefedea1e9c9e17d4cee7a21": { + "name": "AEUR token contract", + "address": "0xa40640458fbc27b6eefedea1e9c9e17d4cee7a21", + "token": { + "decimals": 18, + "symbol": "AEUR" + }, + "isSC": {} + }, + "0x03049b395147713ae53c0617093675b4b86dde78": { + "name": "PSPS token contract", + "address": "0x03049b395147713ae53c0617093675b4b86dde78", + "token": { + "decimals": 18, + "symbol": "PSPS" + }, + "isSC": {} + }, + "0x09970aec766b6f3223aca9111555e99dc50ff13a": { + "name": "LEVL token contract", + "address": "0x09970aec766b6f3223aca9111555e99dc50ff13a", + "token": { + "decimals": 18, + "symbol": "LEVL" + }, + "isSC": {} + }, + "0x40803cea2b2a32bda1be61d3604af6a814e70976": { + "name": "SPOOL token contract", + "address": "0x40803cea2b2a32bda1be61d3604af6a814e70976", + "token": { + "decimals": 18, + "symbol": "SPOOL" + }, + "isSC": {} + }, + "0x6c28aef8977c9b773996d0e8376d2ee379446f2f": { + "name": "QUICK token contract", + "address": "0x6c28aef8977c9b773996d0e8376d2ee379446f2f", + "token": { + "decimals": 18, + "symbol": "QUICK" + }, + "isSC": {} + }, + "0xe138fda441fc31b36171122397a8a11d6cd2c479": { + "name": "GTC token contract", + "address": "0xe138fda441fc31b36171122397a8a11d6cd2c479", + "token": { + "decimals": 0, + "symbol": "GTC" + }, + "isSC": {} + }, + "0xcef46305d096fa876dd23048bf80f9345282e3fc": { + "name": "CBU token contract", + "address": "0xcef46305d096fa876dd23048bf80f9345282e3fc", + "token": { + "decimals": 0, + "symbol": "CBU" + }, + "isSC": {} + }, + "0xc52fafdc900cb92ae01e6e4f8979af7f436e2eb2": { + "name": "SEXY token contract", + "address": "0xc52fafdc900cb92ae01e6e4f8979af7f436e2eb2", + "token": { + "decimals": 18, + "symbol": "SEXY" + }, + "isSC": {} + }, + "0x2b896c7f060ae441b76bbe47cddca934ba60f37f": { + "name": "BLF token contract", + "address": "0x2b896c7f060ae441b76bbe47cddca934ba60f37f", + "token": { + "decimals": 18, + "symbol": "BLF" + }, + "isSC": {} + }, + "0xd502f487e1841fdc805130e13eae80c61186bc98": { + "name": "ITGR token contract", + "address": "0xd502f487e1841fdc805130e13eae80c61186bc98", + "token": { + "decimals": 18, + "symbol": "ITGR" + }, + "isSC": {} + }, + "0x618e75ac90b12c6049ba3b27f5d5f8651b0037f6": { + "name": "QASH token contract", + "address": "0x618e75ac90b12c6049ba3b27f5d5f8651b0037f6", + "token": { + "decimals": 6, + "symbol": "QASH" + }, + "isSC": {} + }, + "0x4f8b986ecffe7bed5dbeb2b49310fb00ca85a539": { + "name": "REKT token contract", + "address": "0x4f8b986ecffe7bed5dbeb2b49310fb00ca85a539", + "token": { + "decimals": 18, + "symbol": "REKT" + }, + "isSC": {} + }, + "0xc47b0443f8608943c596168504bb6d4a062e0edc": { + "name": "LCSN token contract", + "address": "0xc47b0443f8608943c596168504bb6d4a062e0edc", + "token": { + "decimals": 18, + "symbol": "LCSN" + }, + "isSC": {} + }, + "0x435998003ccb7abeaa392494c89f7799fe241db5": { + "name": "INTERN token contract", + "address": "0x435998003ccb7abeaa392494c89f7799fe241db5", + "token": { + "decimals": 18, + "symbol": "INTERN" + }, + "isSC": {} + }, + "0xe9a95d175a5f4c9369f3b74222402eb1b837693b": { + "name": "NOW token contract", + "address": "0xe9a95d175a5f4c9369f3b74222402eb1b837693b", + "token": { + "decimals": 8, + "symbol": "NOW" + }, + "isSC": {} + }, + "0x80286b475969e032bdfb85639fed4d4f30ea9526": { + "name": "FREECZ token contract", + "address": "0x80286b475969e032bdfb85639fed4d4f30ea9526", + "token": { + "decimals": 18, + "symbol": "FREECZ" + }, + "isSC": {} + }, + "0x6af53c6ec427525f7240e211941223288a0e7c66": { + "name": "WARPED token contract", + "address": "0x6af53c6ec427525f7240e211941223288a0e7c66", + "token": { + "decimals": 18, + "symbol": "WARPED" + }, + "isSC": {} + }, + "0xa100eafdef0099700933538ee795cfad5505b689": { + "name": "UCAPTAINZ token contract", + "address": "0xa100eafdef0099700933538ee795cfad5505b689", + "token": { + "decimals": 18, + "symbol": "UCAPTAINZ" + }, + "isSC": {} + }, + "0x01d33fd36ec67c6ada32cf36b31e88ee190b1839": { + "name": "BRZ token contract", + "address": "0x01d33fd36ec67c6ada32cf36b31e88ee190b1839", + "token": { + "decimals": 18, + "symbol": "BRZ" + }, + "isSC": {} + }, + "0xa4be4cdc552891a6702e1ae9645ef445179a4463": { + "name": "FON token contract", + "address": "0xa4be4cdc552891a6702e1ae9645ef445179a4463", + "token": { + "decimals": 18, + "symbol": "FON" + }, + "isSC": {} + }, + "0xef6344de1fcfc5f48c30234c16c1389e8cdc572c": { + "name": "DNA token contract", + "address": "0xef6344de1fcfc5f48c30234c16c1389e8cdc572c", + "token": { + "decimals": 18, + "symbol": "DNA" + }, + "isSC": {} + }, + "0x198065e69a86cb8a9154b333aad8efe7a3c256f8": { + "name": "KOY token contract", + "address": "0x198065e69a86cb8a9154b333aad8efe7a3c256f8", + "token": { + "decimals": 18, + "symbol": "KOY" + }, + "isSC": {} + }, + "0x47b9f01b16e9c9cb99191dca68c9cc5bf6403957": { + "name": "ONSTON token contract", + "address": "0x47b9f01b16e9c9cb99191dca68c9cc5bf6403957", + "token": { + "decimals": 18, + "symbol": "ONSTON" + }, + "isSC": {} + }, + "0x1bf7fd22709733ccd7c45ab27dd02c7ec8e50078": { + "name": "QTCON token contract", + "address": "0x1bf7fd22709733ccd7c45ab27dd02c7ec8e50078", + "token": { + "decimals": 18, + "symbol": "QTCON" + }, + "isSC": {} + }, + "0xd068c7c941fbbd2300cb2f1841858c2643722dc7": { + "name": "DEGAI token contract", + "address": "0xd068c7c941fbbd2300cb2f1841858c2643722dc7", + "token": { + "decimals": 18, + "symbol": "DEGAI" + }, + "isSC": {} + }, + "0xf25304e75026e6a35fedca3b0889ae5c4d3c55d8": { + "name": "VRD token contract", + "address": "0xf25304e75026e6a35fedca3b0889ae5c4d3c55d8", + "token": { + "decimals": 18, + "symbol": "VRD" + }, + "isSC": {} + }, + "0x15f74458ae0bfdaa1a96ca1aa779d715cc1eefe4": { + "name": "GRAI token contract", + "address": "0x15f74458ae0bfdaa1a96ca1aa779d715cc1eefe4", + "token": { + "decimals": 18, + "symbol": "GRAI" + }, + "isSC": {} + }, + "0xa59ea1b2d012619a8b9ce16431894cf0be516a73": { + "name": "FTF token contract", + "address": "0xa59ea1b2d012619a8b9ce16431894cf0be516a73", + "token": { + "decimals": 9, + "symbol": "FTF" + }, + "isSC": {} + }, + "0xea7b7dc089c9a4a916b5a7a37617f59fd54e37e4": { + "name": "HYPC token contract", + "address": "0xea7b7dc089c9a4a916b5a7a37617f59fd54e37e4", + "token": { + "decimals": 6, + "symbol": "HYPC" + }, + "isSC": {} + }, + "0x2be5e8c109e2197d077d13a82daead6a9b3433c5": { + "name": "Tokamak Network Token", + "address": "0x2be5e8c109e2197d077d13a82daead6a9b3433c5", + "token": { + "decimals": 18, + "symbol": "TON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TON.svg" + }, + "0xc28e931814725bbeb9e670676fabbcb694fe7df2": { + "name": "EQUAD token contract", + "address": "0xc28e931814725bbeb9e670676fabbcb694fe7df2", + "token": { + "decimals": 18, + "symbol": "EQUAD" + }, + "isSC": {} + }, + "0xe516d78d784c77d479977be58905b3f2b1111126": { + "name": "Bitspawn", + "address": "0xe516d78d784c77d479977be58905b3f2b1111126", + "token": { + "decimals": 18, + "symbol": "SPWN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/spwn.svg" + }, + "0x294559fa758c88d639fd085751e463fee7806eab": { + "name": "METAL token contract", + "address": "0x294559fa758c88d639fd085751e463fee7806eab", + "token": { + "decimals": 18, + "symbol": "METAL" + }, + "isSC": {} + }, + "0xa20f77b7ad5a88badc48800c56507b7274c06fdc": { + "name": "CHER token contract", + "address": "0xa20f77b7ad5a88badc48800c56507b7274c06fdc", + "token": { + "decimals": 18, + "symbol": "CHER" + }, + "isSC": {} + }, + "0x4057db5bd9f67a566aa10e5587b1a964affc6a16": { + "name": "TFBX token contract", + "address": "0x4057db5bd9f67a566aa10e5587b1a964affc6a16", + "token": { + "decimals": 18, + "symbol": "TFBX" + }, + "isSC": {} + }, + "0xda9fdab21bc4a5811134a6e0ba6ca06624e67c07": { + "name": "QUIDD token contract", + "address": "0xda9fdab21bc4a5811134a6e0ba6ca06624e67c07", + "token": { + "decimals": 18, + "symbol": "QUIDD" + }, + "isSC": {} + }, + "0x559b7bfc48a5274754b08819f75c5f27af53d53b": { + "name": "QI token contract", + "address": "0x559b7bfc48a5274754b08819f75c5f27af53d53b", + "token": { + "decimals": 18, + "symbol": "QI" + }, + "isSC": {} + }, + "0x60927b83ddd2096f38f22a8a2d84cf863402d1a1": { + "name": "MIND token contract", + "address": "0x60927b83ddd2096f38f22a8a2d84cf863402d1a1", + "token": { + "decimals": 18, + "symbol": "MIND" + }, + "isSC": {} + }, + "0xba8a621b4a54e61c442f5ec623687e2a942225ef": { + "name": "QUARTZ token contract", + "address": "0xba8a621b4a54e61c442f5ec623687e2a942225ef", + "token": { + "decimals": 18, + "symbol": "QUARTZ" + }, + "isSC": {} + }, + "0x426fc8be95573230f6e6bc4af91873f0c67b21b4": { + "name": "BPLC token contract", + "address": "0x426fc8be95573230f6e6bc4af91873f0c67b21b4", + "token": { + "decimals": 18, + "symbol": "BPLC" + }, + "isSC": {} + }, + "0xe73d2faeeb9dec890c905b707b574627d5302cb3": { + "name": "DRADAR token contract", + "address": "0xe73d2faeeb9dec890c905b707b574627d5302cb3", + "token": { + "decimals": 9, + "symbol": "DRADAR" + }, + "isSC": {} + }, + "0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098": { + "name": "Santiment", + "address": "0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098", + "token": { + "decimals": 18, + "symbol": "SAN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/santiment.svg" + }, + "0x95efd1fe6099f65a7ed524def487483221094947": { + "name": "CBM token contract", + "address": "0x95efd1fe6099f65a7ed524def487483221094947", + "token": { + "decimals": 18, + "symbol": "CBM" + }, + "isSC": {} + }, + "0x5fa3418d828e5cd3c61a66e0fc7fa4a35dadf960": { + "name": "AVATLY token contract", + "address": "0x5fa3418d828e5cd3c61a66e0fc7fa4a35dadf960", + "token": { + "decimals": 18, + "symbol": "AVATLY" + }, + "isSC": {} + }, + "0x9b5c38cc2d1ba05ed87c8f8a2418475bacb20073": { + "name": "SBIO token contract", + "address": "0x9b5c38cc2d1ba05ed87c8f8a2418475bacb20073", + "token": { + "decimals": 18, + "symbol": "SBIO" + }, + "isSC": {} + }, + "0x9ce115f0341ae5dabc8b477b74e83db2018a6f42": { + "name": "HAIR token contract", + "address": "0x9ce115f0341ae5dabc8b477b74e83db2018a6f42", + "token": { + "decimals": 18, + "symbol": "HAIR" + }, + "isSC": {} + }, + "0x3330bfb7332ca23cd071631837dc289b09c33333": { + "name": "RBC token contract", + "address": "0x3330bfb7332ca23cd071631837dc289b09c33333", + "token": { + "decimals": 18, + "symbol": "RBC" + }, + "isSC": {} + }, + "0xb48eb8368c9c6e9b0734de1ef4ceb9f484b80b9c": { + "name": "VMPX token contract", + "address": "0xb48eb8368c9c6e9b0734de1ef4ceb9f484b80b9c", + "token": { + "decimals": 18, + "symbol": "VMPX" + }, + "isSC": {} + }, + "0x9695e0114e12c0d3a3636fab5a18e6b737529023": { + "name": "DFYN token contract", + "address": "0x9695e0114e12c0d3a3636fab5a18e6b737529023", + "token": { + "decimals": 18, + "symbol": "DFYN" + }, + "isSC": {} + }, + "0x71eeba415a523f5c952cc2f06361d5443545ad28": { + "name": "XDAO token contract", + "address": "0x71eeba415a523f5c952cc2f06361d5443545ad28", + "token": { + "decimals": 18, + "symbol": "XDAO" + }, + "isSC": {} + }, + "0x8260328d0c405d9ca061d80199102ddc9089e43c": { + "name": "DOJO token contract", + "address": "0x8260328d0c405d9ca061d80199102ddc9089e43c", + "token": { + "decimals": 9, + "symbol": "DOJO" + }, + "isSC": {} + }, + "0xd794dd1cada4cf79c9eebaab8327a1b0507ef7d4": { + "name": "HYVE token contract", + "address": "0xd794dd1cada4cf79c9eebaab8327a1b0507ef7d4", + "token": { + "decimals": 18, + "symbol": "HYVE" + }, + "isSC": {} + }, + "0x1c2884c71629c7d4e378ec95d03bfaf9f6fa5afe": { + "name": "BUNDL token contract", + "address": "0x1c2884c71629c7d4e378ec95d03bfaf9f6fa5afe", + "token": { + "decimals": 18, + "symbol": "BUNDL" + }, + "isSC": {} + }, + "0x4297394c20800e8a38a619a243e9bbe7681ff24e": { + "name": "HOTCROSS token contract", + "address": "0x4297394c20800e8a38a619a243e9bbe7681ff24e", + "token": { + "decimals": 18, + "symbol": "HOTCROSS" + }, + "isSC": {} + }, + "0xb1a30851e3f7d841b231b086479608e17198363a": { + "name": "HMR token contract", + "address": "0xb1a30851e3f7d841b231b086479608e17198363a", + "token": { + "decimals": 18, + "symbol": "HMR" + }, + "isSC": {} + }, + "0xa487bf43cf3b10dffc97a9a744cbb7036965d3b9": { + "name": "DERI token contract", + "address": "0xa487bf43cf3b10dffc97a9a744cbb7036965d3b9", + "token": { + "decimals": 18, + "symbol": "DERI" + }, + "isSC": {} + }, + "0x1376a81fe3ee7d0e431f1ac24286b00f3ccf44e7": { + "name": "WELLE token contract", + "address": "0x1376a81fe3ee7d0e431f1ac24286b00f3ccf44e7", + "token": { + "decimals": 18, + "symbol": "WELLE" + }, + "isSC": {} + }, + "0xf34b1db61aca1a371fe97bad2606c9f534fb9d7d": { + "name": "RBIS token contract", + "address": "0xf34b1db61aca1a371fe97bad2606c9f534fb9d7d", + "token": { + "decimals": 18, + "symbol": "RBIS" + }, + "isSC": {} + }, + "0xfe38fd8d710b0ad367f60cb9fc4de5e7ba95633b": { + "name": "LENA token contract", + "address": "0xfe38fd8d710b0ad367f60cb9fc4de5e7ba95633b", + "token": { + "decimals": 18, + "symbol": "LENA" + }, + "isSC": {} + }, + "0x159cdaf78be31e730d9e1330adfcfbb79a5fdb95": { + "name": "MTE token contract", + "address": "0x159cdaf78be31e730d9e1330adfcfbb79a5fdb95", + "token": { + "decimals": 18, + "symbol": "MTE" + }, + "isSC": {} + }, + "0x1a3496c18d558bd9c6c8f609e1b129f67ab08163": { + "name": "DEP token contract", + "address": "0x1a3496c18d558bd9c6c8f609e1b129f67ab08163", + "token": { + "decimals": 18, + "symbol": "DEP" + }, + "isSC": {} + }, + "0x320ed4c7243e35a00f9ca30a1ae60929d15eae37": { + "name": "BLOX token contract", + "address": "0x320ed4c7243e35a00f9ca30a1ae60929d15eae37", + "token": { + "decimals": 18, + "symbol": "BLOX" + }, + "isSC": {} + }, + "0xd0b3a986fff305854a7238a8e099cce1ced01a3d": { + "name": "NOVA token contract", + "address": "0xd0b3a986fff305854a7238a8e099cce1ced01a3d", + "token": { + "decimals": 18, + "symbol": "NOVA" + }, + "isSC": {} + }, + "0x5c99a6c14f8dc0c2c3655c64a2cef68ff9f771ba": { + "name": "LARRY token contract", + "address": "0x5c99a6c14f8dc0c2c3655c64a2cef68ff9f771ba", + "token": { + "decimals": 18, + "symbol": "LARRY" + }, + "isSC": {} + }, + "0x8a3d77e9d6968b780564936d15b09805827c21fa": { + "name": "UCO token contract", + "address": "0x8a3d77e9d6968b780564936d15b09805827c21fa", + "token": { + "decimals": 18, + "symbol": "UCO" + }, + "isSC": {} + }, + "0xcb2b9b5b136dc29feb0548dff315021b9b6c2ba0": { + "name": "GIGA token contract", + "address": "0xcb2b9b5b136dc29feb0548dff315021b9b6c2ba0", + "token": { + "decimals": 18, + "symbol": "GIGA" + }, + "isSC": {} + }, + "0xb186035490c8602ead853ec98be05e3461521ab2": { + "name": "PACK token contract", + "address": "0xb186035490c8602ead853ec98be05e3461521ab2", + "token": { + "decimals": 18, + "symbol": "PACK" + }, + "isSC": {} + }, + "0x4591dbff62656e7859afe5e45f6f47d3669fbb28": { + "name": "MKUSD token contract", + "address": "0x4591dbff62656e7859afe5e45f6f47d3669fbb28", + "token": { + "decimals": 18, + "symbol": "MKUSD" + }, + "isSC": {} + }, + "0xa3cb87080e68ad54d00573983d935fa85d168fde": { + "name": "IBIT token contract", + "address": "0xa3cb87080e68ad54d00573983d935fa85d168fde", + "token": { + "decimals": 8, + "symbol": "IBIT" + }, + "isSC": {} + }, + "0xaf75d880b3128981d1fed3292fc02e3fb37acd53": { + "name": "TRUTH token contract", + "address": "0xaf75d880b3128981d1fed3292fc02e3fb37acd53", + "token": { + "decimals": 9, + "symbol": "TRUTH" + }, + "isSC": {} + }, + "0xb2dbf14d0b47ed3ba02bdb7c954e05a72deb7544": { + "name": "MOFI token contract", + "address": "0xb2dbf14d0b47ed3ba02bdb7c954e05a72deb7544", + "token": { + "decimals": 18, + "symbol": "MOFI" + }, + "isSC": {} + }, + "0x201332bd45c8628d814f870bfb584b385a7c351e": { + "name": "ASTRA token contract", + "address": "0x201332bd45c8628d814f870bfb584b385a7c351e", + "token": { + "decimals": 18, + "symbol": "ASTRA" + }, + "isSC": {} + }, + "0x2af72850c504ddd3c1876c66a914caee7ff8a46a": { + "name": "WHL token contract", + "address": "0x2af72850c504ddd3c1876c66a914caee7ff8a46a", + "token": { + "decimals": 18, + "symbol": "WHL" + }, + "isSC": {} + }, + "0xf433089366899d83a9f26a773d59ec7ecf30355e": { + "name": "Metal", + "address": "0xf433089366899d83a9f26a773d59ec7ecf30355e", + "token": { + "decimals": 8, + "symbol": "MTL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mtl.svg" + }, + "0x0a58153a0cd1cfaea94ce1f7fdc5d7e679eca936": { + "name": "IM token contract", + "address": "0x0a58153a0cd1cfaea94ce1f7fdc5d7e679eca936", + "token": { + "decimals": 18, + "symbol": "IM" + }, + "isSC": {} + }, + "0x2c623d3cc9a2cc158951b8093cb94e80cf56deea": { + "name": "NEX token contract", + "address": "0x2c623d3cc9a2cc158951b8093cb94e80cf56deea", + "token": { + "decimals": 18, + "symbol": "NEX" + }, + "isSC": {} + }, + "0x5c1ac4e697a2814812a284509e1f1b8aa34a25f3": { + "name": "AXT token contract", + "address": "0x5c1ac4e697a2814812a284509e1f1b8aa34a25f3", + "token": { + "decimals": 18, + "symbol": "AXT" + }, + "isSC": {} + }, + "0xca7013ba4bf76bcdc3ffc71735896682644f47c2": { + "name": "DGN token contract", + "address": "0xca7013ba4bf76bcdc3ffc71735896682644f47c2", + "token": { + "decimals": 18, + "symbol": "DGN" + }, + "isSC": {} + }, + "0x471d113059324321749e097705197a2b44a070fc": { + "name": "KNG token contract", + "address": "0x471d113059324321749e097705197a2b44a070fc", + "token": { + "decimals": 18, + "symbol": "KNG" + }, + "isSC": {} + }, + "0x2ef52ed7de8c5ce03a4ef0efbe9b7450f2d7edc9": { + "name": "REV token contract", + "address": "0x2ef52ed7de8c5ce03a4ef0efbe9b7450f2d7edc9", + "token": { + "decimals": 6, + "symbol": "REV" + }, + "isSC": {} + }, + "0xeaf61fc150cd5c3bea75744e830d916e60ea5a9f": { + "name": "TYPE token contract", + "address": "0xeaf61fc150cd5c3bea75744e830d916e60ea5a9f", + "token": { + "decimals": 4, + "symbol": "TYPE" + }, + "isSC": {} + }, + "0x3250577e12b9469915c1fa3a71c22817ca44c4d9": { + "name": "SOC token contract", + "address": "0x3250577e12b9469915c1fa3a71c22817ca44c4d9", + "token": { + "decimals": 18, + "symbol": "SOC" + }, + "isSC": {} + }, + "0xbbb32f99e6f2cb29337eebaa43c5069386de6e6c": { + "name": "PT token contract", + "address": "0xbbb32f99e6f2cb29337eebaa43c5069386de6e6c", + "token": { + "decimals": 18, + "symbol": "PT" + }, + "isSC": {} + }, + "0x68749665ff8d2d112fa859aa293f07a622782f38": { + "name": "XAUT token contract", + "address": "0x68749665ff8d2d112fa859aa293f07a622782f38", + "token": { + "decimals": 6, + "symbol": "XAUT" + }, + "isSC": {} + }, + "0xb83c27805aaca5c7082eb45c868d955cf04c337f": { + "name": "TIGER token contract", + "address": "0xb83c27805aaca5c7082eb45c868d955cf04c337f", + "token": { + "decimals": 18, + "symbol": "TIGER" + }, + "isSC": {} + }, + "0x3d382228c54736d831fac2748f4734d9177c7332": { + "name": "ANV token contract", + "address": "0x3d382228c54736d831fac2748f4734d9177c7332", + "token": { + "decimals": 18, + "symbol": "ANV" + }, + "isSC": {} + }, + "0x9ad37205d608b8b219e6a2573f922094cec5c200": { + "name": "IZI token contract", + "address": "0x9ad37205d608b8b219e6a2573f922094cec5c200", + "token": { + "decimals": 18, + "symbol": "IZI" + }, + "isSC": {} + }, + "0x565d3902d6a5a2d5ce28ff427423e88933334dd2": { + "name": "ADULT token contract", + "address": "0x565d3902d6a5a2d5ce28ff427423e88933334dd2", + "token": { + "decimals": 18, + "symbol": "ADULT" + }, + "isSC": {} + }, + "0xbbc7f7a6aadac103769c66cbc69ab720f7f9eae3": { + "name": "INX Token", + "address": "0xbbc7f7a6aadac103769c66cbc69ab720f7f9eae3", + "token": { + "decimals": 18, + "symbol": "INX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/INX.svg" + }, + "0x04815313e9329e8905a77251a1781cfa7934259a": { + "name": "HOOD token contract", + "address": "0x04815313e9329e8905a77251a1781cfa7934259a", + "token": { + "decimals": 18, + "symbol": "HOOD" + }, + "isSC": {} + }, + "0xd16fd95d949f996e3808eeea0e3881c59e76ef1e": { + "name": "PARA token contract", + "address": "0xd16fd95d949f996e3808eeea0e3881c59e76ef1e", + "token": { + "decimals": 18, + "symbol": "PARA" + }, + "isSC": {} + }, + "0xbcd4b7de6fde81025f74426d43165a5b0d790fdd": { + "name": "SPDR token contract", + "address": "0xbcd4b7de6fde81025f74426d43165a5b0d790fdd", + "token": { + "decimals": 18, + "symbol": "SPDR" + }, + "isSC": {} + }, + "0x2a85556a6701a02e75bc4de8ec340c6de1b29f72": { + "name": "TOKA token contract", + "address": "0x2a85556a6701a02e75bc4de8ec340c6de1b29f72", + "token": { + "decimals": 18, + "symbol": "TOKA" + }, + "isSC": {} + }, + "0x91af0fbb28aba7e31403cb457106ce79397fd4e6": { + "name": "Aergo", + "address": "0x91af0fbb28aba7e31403cb457106ce79397fd4e6", + "token": { + "decimals": 18, + "symbol": "AERGO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Aergo.svg" + }, + "0x4da0c48376c277cdbd7fc6fdc6936dee3e4adf75": { + "name": "EPIK token contract", + "address": "0x4da0c48376c277cdbd7fc6fdc6936dee3e4adf75", + "token": { + "decimals": 18, + "symbol": "EPIK" + }, + "isSC": {} + }, + "0xd291e7a03283640fdc51b121ac401383a46cc623": { + "name": "RGT token contract", + "address": "0xd291e7a03283640fdc51b121ac401383a46cc623", + "token": { + "decimals": 18, + "symbol": "RGT" + }, + "isSC": {} + }, + "0x597981eac8a293054a1826c7b60cbf92972a36c1": { + "name": "CC token contract", + "address": "0x597981eac8a293054a1826c7b60cbf92972a36c1", + "token": { + "decimals": 9, + "symbol": "CC" + }, + "isSC": {} + }, + "0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8": { + "name": "TNT token contract", + "address": "0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8", + "token": { + "decimals": 8, + "symbol": "TNT" + }, + "isSC": {} + }, + "0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec": { + "name": "Polymath", + "address": "0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec", + "token": { + "decimals": 18, + "symbol": "POLY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/poly.svg" + }, + "0xfc82bb4ba86045af6f327323a46e80412b91b27d": { + "name": "PROM token contract", + "address": "0xfc82bb4ba86045af6f327323a46e80412b91b27d", + "token": { + "decimals": 18, + "symbol": "PROM" + }, + "isSC": {} + }, + "0x44108f0223a3c3028f5fe7aec7f9bb2e66bef82f": { + "name": "ACX token contract", + "address": "0x44108f0223a3c3028f5fe7aec7f9bb2e66bef82f", + "token": { + "decimals": 18, + "symbol": "ACX" + }, + "isSC": {} + }, + "0x4463e6a3ded0dbe3f6e15bc8420dfc55e5fea830": { + "name": "TXA token contract", + "address": "0x4463e6a3ded0dbe3f6e15bc8420dfc55e5fea830", + "token": { + "decimals": 18, + "symbol": "TXA" + }, + "isSC": {} + }, + "0x365accfca291e7d3914637abf1f7635db165bb09": { + "name": "FXN token contract", + "address": "0x365accfca291e7d3914637abf1f7635db165bb09", + "token": { + "decimals": 18, + "symbol": "FXN" + }, + "isSC": {} + }, + "0x72e5390edb7727e3d4e3436451dadaff675dbcc0": { + "name": "HANU token contract", + "address": "0x72e5390edb7727e3d4e3436451dadaff675dbcc0", + "token": { + "decimals": 12, + "symbol": "HANU" + }, + "isSC": {} + }, + "0x7815bda662050d84718b988735218cffd32f75ea": { + "name": "YEL token contract", + "address": "0x7815bda662050d84718b988735218cffd32f75ea", + "token": { + "decimals": 18, + "symbol": "YEL" + }, + "isSC": {} + }, + "0x5b060754b27844dbc3578382886828be224b804f": { + "name": "LOONG token contract", + "address": "0x5b060754b27844dbc3578382886828be224b804f", + "token": { + "decimals": 18, + "symbol": "LOONG" + }, + "isSC": {} + }, + "0xff75ced57419bcaebe5f05254983b013b0646ef5": { + "name": "COOK token contract", + "address": "0xff75ced57419bcaebe5f05254983b013b0646ef5", + "token": { + "decimals": 18, + "symbol": "COOK" + }, + "isSC": {} + }, + "0x551d0501cd5df92663c3d12c3201c9d70ba79998": { + "name": "YOBASE token contract", + "address": "0x551d0501cd5df92663c3d12c3201c9d70ba79998", + "token": { + "decimals": 18, + "symbol": "YOBASE" + }, + "isSC": {} + }, + "0xd1f17b7a6bff962659ed608bcd6d318bb5fbb249": { + "name": "ZUZALU token contract", + "address": "0xd1f17b7a6bff962659ed608bcd6d318bb5fbb249", + "token": { + "decimals": 18, + "symbol": "ZUZALU" + }, + "isSC": {} + }, + "0xe1bda0c3bfa2be7f740f0119b6a34f057bd58eba": { + "name": "WNK token contract", + "address": "0xe1bda0c3bfa2be7f740f0119b6a34f057bd58eba", + "token": { + "decimals": 18, + "symbol": "WNK" + }, + "isSC": {} + }, + "0xb19189fb36c816f3e0f16065057b07b790998fdc": { + "name": "SER token contract", + "address": "0xb19189fb36c816f3e0f16065057b07b790998fdc", + "token": { + "decimals": 18, + "symbol": "SER" + }, + "isSC": {} + }, + "0x2df7d0e4903029717c949cad204075a3d75c8806": { + "name": "SWEET token contract", + "address": "0x2df7d0e4903029717c949cad204075a3d75c8806", + "token": { + "decimals": 9, + "symbol": "SWEET" + }, + "isSC": {} + }, + "0x24249b5a869a445c9b0ce269a08d73c618df9d21": { + "name": "ETHEREUM token contract", + "address": "0x24249b5a869a445c9b0ce269a08d73c618df9d21", + "token": { + "decimals": 8, + "symbol": "ETHEREUM" + }, + "isSC": {} + }, + "0xc14b4d4ca66f40f352d7a50fd230ef8b2fb3b8d4": { + "name": "TOOLS token contract", + "address": "0xc14b4d4ca66f40f352d7a50fd230ef8b2fb3b8d4", + "token": { + "decimals": 18, + "symbol": "TOOLS" + }, + "isSC": {} + }, + "0xf6650117017ffd48b725b4ec5a00b414097108a7": { + "name": "XIDO token contract", + "address": "0xf6650117017ffd48b725b4ec5a00b414097108a7", + "token": { + "decimals": 18, + "symbol": "XIDO" + }, + "isSC": {} + }, + "0xedb171c18ce90b633db442f2a6f72874093b49ef": { + "name": "WAMPL token contract", + "address": "0xedb171c18ce90b633db442f2a6f72874093b49ef", + "token": { + "decimals": 18, + "symbol": "WAMPL" + }, + "isSC": {} + }, + "0x6a6b457becae7ef1cf9f22510d136c4aac0fc6d2": { + "name": "MOLLY token contract", + "address": "0x6a6b457becae7ef1cf9f22510d136c4aac0fc6d2", + "token": { + "decimals": 18, + "symbol": "MOLLY" + }, + "isSC": {} + }, + "0xd4126f195a8de772eeffa61a4ab6dd43462f4e39": { + "name": "HIKARI token contract", + "address": "0xd4126f195a8de772eeffa61a4ab6dd43462f4e39", + "token": { + "decimals": 18, + "symbol": "HIKARI" + }, + "isSC": {} + }, + "0x9f5e508182e1cbd23ea5ef65d1d6c342beb7d6d3": { + "name": "JONES token contract", + "address": "0x9f5e508182e1cbd23ea5ef65d1d6c342beb7d6d3", + "token": { + "decimals": 9, + "symbol": "JONES" + }, + "isSC": {} + }, + "0x0c572544a4ee47904d54aaa6a970af96b6f00e1b": { + "name": "WAS token contract", + "address": "0x0c572544a4ee47904d54aaa6a970af96b6f00e1b", + "token": { + "decimals": 18, + "symbol": "WAS" + }, + "isSC": {} + }, + "0x4824a7b64e3966b0133f4f4ffb1b9d6beb75fff7": { + "name": "TCT token contract", + "address": "0x4824a7b64e3966b0133f4f4ffb1b9d6beb75fff7", + "token": { + "decimals": 18, + "symbol": "TCT" + }, + "isSC": {} + }, + "0x2565ae0385659badcada1031db704442e1b69982": { + "name": "ASM token contract", + "address": "0x2565ae0385659badcada1031db704442e1b69982", + "token": { + "decimals": 18, + "symbol": "ASM" + }, + "isSC": {} + }, + "0x15b543e986b8c34074dfc9901136d9355a537e7e": { + "name": "STC token contract", + "address": "0x15b543e986b8c34074dfc9901136d9355a537e7e", + "token": { + "decimals": 18, + "symbol": "STC" + }, + "isSC": {} + }, + "0xfd09911130e6930bf87f2b0554c44f400bd80d3e": { + "name": "ETHIX token contract", + "address": "0xfd09911130e6930bf87f2b0554c44f400bd80d3e", + "token": { + "decimals": 18, + "symbol": "ETHIX" + }, + "isSC": {} + }, + "0x7995ab36bb307afa6a683c24a25d90dc1ea83566": { + "name": "HIT token contract", + "address": "0x7995ab36bb307afa6a683c24a25d90dc1ea83566", + "token": { + "decimals": 6, + "symbol": "HIT" + }, + "isSC": {} + }, + "0x9e46a38f5daabe8683e10793b06749eef7d733d1": { + "name": "PolySwarm Nectar", + "address": "0x9e46a38f5daabe8683e10793b06749eef7d733d1", + "token": { + "decimals": 18, + "symbol": "NCT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/polyswarm_nectar.svg" + }, + "0x112b08621e27e10773ec95d250604a041f36c582": { + "name": "KAS token contract", + "address": "0x112b08621e27e10773ec95d250604a041f36c582", + "token": { + "decimals": 8, + "symbol": "KAS" + }, + "isSC": {} + }, + "0xafe53eea0cfe20198328890b69107d5fd8159a77": { + "name": "X token contract", + "address": "0xafe53eea0cfe20198328890b69107d5fd8159a77", + "token": { + "decimals": 9, + "symbol": "X" + }, + "isSC": {} + }, + "0xc229c69eb3bb51828d0caa3509a05a51083898dd": { + "name": "PTU token contract", + "address": "0xc229c69eb3bb51828d0caa3509a05a51083898dd", + "token": { + "decimals": 18, + "symbol": "PTU" + }, + "isSC": {} + }, + "0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3": { + "name": "NPXS token contract", + "address": "0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3", + "token": { + "decimals": 18, + "symbol": "NPXS" + }, + "isSC": {} + }, + "0x6307b25a665efc992ec1c1bc403c38f3ddd7c661": { + "name": "GCR token contract", + "address": "0x6307b25a665efc992ec1c1bc403c38f3ddd7c661", + "token": { + "decimals": 4, + "symbol": "GCR" + }, + "isSC": {} + }, + "0x485d17a6f1b8780392d53d64751824253011a260": { + "name": "TIME token contract", + "address": "0x485d17a6f1b8780392d53d64751824253011a260", + "token": { + "decimals": 8, + "symbol": "TIME" + }, + "isSC": {} + }, + "0xaf1eeb83c364ad9ffeb5f97f223c1705d4810033": { + "name": "MARK token contract", + "address": "0xaf1eeb83c364ad9ffeb5f97f223c1705d4810033", + "token": { + "decimals": 9, + "symbol": "MARK" + }, + "isSC": {} + }, + "0x9b9647431632af44be02ddd22477ed94d14aacaa": { + "name": "KOK token contract", + "address": "0x9b9647431632af44be02ddd22477ed94d14aacaa", + "token": { + "decimals": 18, + "symbol": "KOK" + }, + "isSC": {} + }, + "0xfc5e4ed56153b57aa8ef769eba3e79e58e19be93": { + "name": "SOLAV token contract", + "address": "0xfc5e4ed56153b57aa8ef769eba3e79e58e19be93", + "token": { + "decimals": 18, + "symbol": "SOLAV" + }, + "isSC": {} + }, + "0xf5b5efc906513b4344ebabcf47a04901f99f09f3": { + "name": "UBX token contract", + "address": "0xf5b5efc906513b4344ebabcf47a04901f99f09f3", + "token": { + "decimals": 0, + "symbol": "UBX" + }, + "isSC": {} + }, + "0x73484a262730d1d422610729e828346f9b2ff480": { + "name": "BRCP token contract", + "address": "0x73484a262730d1d422610729e828346f9b2ff480", + "token": { + "decimals": 18, + "symbol": "BRCP" + }, + "isSC": {} + }, + "0x76952fc1087fdae2e6aa4e5a1cec9e1117a60b00": { + "name": "NYBC token contract", + "address": "0x76952fc1087fdae2e6aa4e5a1cec9e1117a60b00", + "token": { + "decimals": 18, + "symbol": "NYBC" + }, + "isSC": {} + }, + "0x0763fdccf1ae541a5961815c0872a8c5bc6de4d7": { + "name": "SUKU token contract", + "address": "0x0763fdccf1ae541a5961815c0872a8c5bc6de4d7", + "token": { + "decimals": 18, + "symbol": "SUKU" + }, + "isSC": {} + }, + "0x8e870d67f660d95d5be530380d0ec0bd388289e1": { + "name": "Pax Dollar", + "address": "0x8e870d67f660d95d5be530380d0ec0bd388289e1", + "token": { + "decimals": 18, + "symbol": "USDP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usdp.svg" + }, + "0x888888435fde8e7d4c54cab67f206e4199454c60": { + "name": "DFX token contract", + "address": "0x888888435fde8e7d4c54cab67f206e4199454c60", + "token": { + "decimals": 18, + "symbol": "DFX" + }, + "isSC": {} + }, + "0x244748587f145c0571e92e85429d711d1b4cc43a": { + "name": "CHOO token contract", + "address": "0x244748587f145c0571e92e85429d711d1b4cc43a", + "token": { + "decimals": 18, + "symbol": "CHOO" + }, + "isSC": {} + }, + "0xbcd4d5ac29e06e4973a1ddcd782cd035d04bc0b7": { + "name": "QKNTL token contract", + "address": "0xbcd4d5ac29e06e4973a1ddcd782cd035d04bc0b7", + "token": { + "decimals": 18, + "symbol": "QKNTL" + }, + "isSC": {} + }, + "0xf03a7eb46d01d9ecaa104558c732cf82f6b6b645": { + "name": "MATICX token contract", + "address": "0xf03a7eb46d01d9ecaa104558c732cf82f6b6b645", + "token": { + "decimals": 18, + "symbol": "MATICX" + }, + "isSC": {} + }, + "0x05079687d35b93538cbd59fe5596380cae9054a9": { + "name": "BTSG token contract", + "address": "0x05079687d35b93538cbd59fe5596380cae9054a9", + "token": { + "decimals": 18, + "symbol": "BTSG" + }, + "isSC": {} + }, + "0xaa8330fb2b4d5d07abfe7a72262752a8505c6b37": { + "name": "POLC token contract", + "address": "0xaa8330fb2b4d5d07abfe7a72262752a8505c6b37", + "token": { + "decimals": 18, + "symbol": "POLC" + }, + "isSC": {} + }, + "0x41e5560054824ea6b0732e656e3ad64e20e94e45": { + "name": "CVC token contract", + "address": "0x41e5560054824ea6b0732e656e3ad64e20e94e45", + "token": { + "decimals": 8, + "symbol": "CVC" + }, + "isSC": {} + }, + "0x006bea43baa3f7a6f765f14f10a1a1b08334ef45": { + "name": "STX token contract", + "address": "0x006bea43baa3f7a6f765f14f10a1a1b08334ef45", + "token": { + "decimals": 18, + "symbol": "STX" + }, + "isSC": {} + }, + "0x6d614686550b9e1c1df4b2cd8f91c9d4df66c810": { + "name": "SKEB token contract", + "address": "0x6d614686550b9e1c1df4b2cd8f91c9d4df66c810", + "token": { + "decimals": 18, + "symbol": "SKEB" + }, + "isSC": {} + }, + "0x31c8eacbffdd875c74b94b077895bd78cf1e64a3": { + "name": "RAD token contract", + "address": "0x31c8eacbffdd875c74b94b077895bd78cf1e64a3", + "token": { + "decimals": 18, + "symbol": "RAD" + }, + "isSC": {} + }, + "0xddf7fd345d54ff4b40079579d4c4670415dbfd0a": { + "name": "SG token contract", + "address": "0xddf7fd345d54ff4b40079579d4c4670415dbfd0a", + "token": { + "decimals": 18, + "symbol": "SG" + }, + "isSC": {} + }, + "0xec67005c4e498ec7f55e092bd1d35cbc47c91892": { + "name": "Enzyme Finance", + "address": "0xec67005c4e498ec7f55e092bd1d35cbc47c91892", + "token": { + "decimals": 18, + "symbol": "MLN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mln.svg" + }, + "0x90b7e285ab6cf4e3a2487669dba3e339db8a3320": { + "name": "DUCKIES token contract", + "address": "0x90b7e285ab6cf4e3a2487669dba3e339db8a3320", + "token": { + "decimals": 8, + "symbol": "DUCKIES" + }, + "isSC": {} + }, + "0x912529007bc0d2a5464a6a211ebfe217dfb75dff": { + "name": "CAD token contract", + "address": "0x912529007bc0d2a5464a6a211ebfe217dfb75dff", + "token": { + "decimals": 18, + "symbol": "CAD" + }, + "isSC": {} + }, + "0x4af8aa621df6dd3e2d653188a357fc2b35c6a037": { + "name": "SELF token contract", + "address": "0x4af8aa621df6dd3e2d653188a357fc2b35c6a037", + "token": { + "decimals": 18, + "symbol": "SELF" + }, + "isSC": {} + }, + "0x414ac1853329b3704df0caf7749cd296c7f3b750": { + "name": "PCT token contract", + "address": "0x414ac1853329b3704df0caf7749cd296c7f3b750", + "token": { + "decimals": 18, + "symbol": "PCT" + }, + "isSC": {} + }, + "0x77774a06271d6a305caccdbc06f847def05c7777": { + "name": "GW token contract", + "address": "0x77774a06271d6a305caccdbc06f847def05c7777", + "token": { + "decimals": 18, + "symbol": "GW" + }, + "isSC": {} + }, + "0x50d5118fb90d572b9d42ba65e0addc4900867809": { + "name": "OSEAN token contract", + "address": "0x50d5118fb90d572b9d42ba65e0addc4900867809", + "token": { + "decimals": 18, + "symbol": "OSEAN" + }, + "isSC": {} + }, + "0x01824357d7d7eaf4677bc17786abd26cbdec9ad7": { + "name": "FORWARD token contract", + "address": "0x01824357d7d7eaf4677bc17786abd26cbdec9ad7", + "token": { + "decimals": 18, + "symbol": "FORWARD" + }, + "isSC": {} + }, + "0xe5acbb03d73267c03349c76ead672ee4d941f499": { + "name": "BEAM token contract", + "address": "0xe5acbb03d73267c03349c76ead672ee4d941f499", + "token": { + "decimals": 8, + "symbol": "BEAM" + }, + "isSC": {} + }, + "0xcb19b6b4971bd4206bab176c75b1efe3e28ee5a8": { + "name": "SEN token contract", + "address": "0xcb19b6b4971bd4206bab176c75b1efe3e28ee5a8", + "token": { + "decimals": 18, + "symbol": "SEN" + }, + "isSC": {} + }, + "0x5052fa4a2a147eaaa4c0242e9cc54a10a4f42070": { + "name": "HANEP token contract", + "address": "0x5052fa4a2a147eaaa4c0242e9cc54a10a4f42070", + "token": { + "decimals": 18, + "symbol": "HANEP" + }, + "isSC": {} + }, + "0x0000000000300dd8b0230efcfef136ecdf6abcde": { + "name": "DGNX token contract", + "address": "0x0000000000300dd8b0230efcfef136ecdf6abcde", + "token": { + "decimals": 18, + "symbol": "DGNX" + }, + "isSC": {} + }, + "0xe0dcb3e02798d1c6a9650fe1381015ec34705153": { + "name": "MATCH token contract", + "address": "0xe0dcb3e02798d1c6a9650fe1381015ec34705153", + "token": { + "decimals": 18, + "symbol": "MATCH" + }, + "isSC": {} + }, + "0x92cc36d66e9d739d50673d1f27929a371fb83a67": { + "name": "WAGMI token contract", + "address": "0x92cc36d66e9d739d50673d1f27929a371fb83a67", + "token": { + "decimals": 18, + "symbol": "WAGMI" + }, + "isSC": {} + }, + "0xf1264873436a0771e440e2b28072fafcc5eebd01": { + "name": "KNS token contract", + "address": "0xf1264873436a0771e440e2b28072fafcc5eebd01", + "token": { + "decimals": 18, + "symbol": "KNS" + }, + "isSC": {} + }, + "0x27eb7aa2cce204012f7d9cd4d49baa746ec5ab63": { + "name": "GGTKN token contract", + "address": "0x27eb7aa2cce204012f7d9cd4d49baa746ec5ab63", + "token": { + "decimals": 18, + "symbol": "GGTKN" + }, + "isSC": {} + }, + "0x174c47d6a4e548ed2b7d369dc0ffb2e60a6ac0f8": { + "name": "AMU token contract", + "address": "0x174c47d6a4e548ed2b7d369dc0ffb2e60a6ac0f8", + "token": { + "decimals": 9, + "symbol": "AMU" + }, + "isSC": {} + }, + "0x2c2d8a078b33bf7782a16acce2c5ba6653a90d5f": { + "name": "L3USD token contract", + "address": "0x2c2d8a078b33bf7782a16acce2c5ba6653a90d5f", + "token": { + "decimals": 18, + "symbol": "L3USD" + }, + "isSC": {} + }, + "0x872952d3c1caf944852c5adda65633f1ef218a26": { + "name": "LQDX token contract", + "address": "0x872952d3c1caf944852c5adda65633f1ef218a26", + "token": { + "decimals": 18, + "symbol": "LQDX" + }, + "isSC": {} + }, + "0xd3cc9d8f3689b83c91b7b59cab4946b063eb894a": { + "name": "XVS token contract", + "address": "0xd3cc9d8f3689b83c91b7b59cab4946b063eb894a", + "token": { + "decimals": 18, + "symbol": "XVS" + }, + "isSC": {} + }, + "0x95987b0cdc7f65d989a30b3b7132a38388c548eb": { + "name": "PURSE token contract", + "address": "0x95987b0cdc7f65d989a30b3b7132a38388c548eb", + "token": { + "decimals": 18, + "symbol": "PURSE" + }, + "isSC": {} + }, + "0x39162d9f64c0f9d64d14eac3b6d5a15d3d569eea": { + "name": "AMA token contract", + "address": "0x39162d9f64c0f9d64d14eac3b6d5a15d3d569eea", + "token": { + "decimals": 18, + "symbol": "AMA" + }, + "isSC": {} + }, + "0x79f05c263055ba20ee0e814acd117c20caa10e0c": { + "name": "ICE token contract", + "address": "0x79f05c263055ba20ee0e814acd117c20caa10e0c", + "token": { + "decimals": 18, + "symbol": "ICE" + }, + "isSC": {} + }, + "0xd3ac016b1b8c80eeadde4d186a9138c9324e4189": { + "name": "OK token contract", + "address": "0xd3ac016b1b8c80eeadde4d186a9138c9324e4189", + "token": { + "decimals": 18, + "symbol": "OK" + }, + "isSC": {} + }, + "0xbbcb0356bb9e6b3faa5cbf9e5f36185d53403ac9": { + "name": "BCOIN token contract", + "address": "0xbbcb0356bb9e6b3faa5cbf9e5f36185d53403ac9", + "token": { + "decimals": 18, + "symbol": "BCOIN" + }, + "isSC": {} + }, + "0x2cb5d9fd89d48c516f11904117c57e3934f39524": { + "name": "CUTE token contract", + "address": "0x2cb5d9fd89d48c516f11904117c57e3934f39524", + "token": { + "decimals": 18, + "symbol": "CUTE" + }, + "isSC": {} + }, + "0x9424fde68418b71ea1d3de95547ef67f4dc8f573": { + "name": "BZAI token contract", + "address": "0x9424fde68418b71ea1d3de95547ef67f4dc8f573", + "token": { + "decimals": 18, + "symbol": "BZAI" + }, + "isSC": {} + }, + "0x75cb71325a44fb102a742626b723054acb7e1394": { + "name": "ANI token contract", + "address": "0x75cb71325a44fb102a742626b723054acb7e1394", + "token": { + "decimals": 18, + "symbol": "ANI" + }, + "isSC": {} + }, + "0xe20b9e246db5a0d21bf9209e4858bc9a3ff7a034": { + "name": "WBAN token contract", + "address": "0xe20b9e246db5a0d21bf9209e4858bc9a3ff7a034", + "token": { + "decimals": 18, + "symbol": "WBAN" + }, + "isSC": {} + }, + "0xbb6cf73a00f480d0951ba979a7606857cdde626b": { + "name": "ARIX token contract", + "address": "0xbb6cf73a00f480d0951ba979a7606857cdde626b", + "token": { + "decimals": 18, + "symbol": "ARIX" + }, + "isSC": {} + }, + "0x30b47e13ccee15d6fa7a80994c94bb9b4a4bb973": { + "name": "SCRATS token contract", + "address": "0x30b47e13ccee15d6fa7a80994c94bb9b4a4bb973", + "token": { + "decimals": 18, + "symbol": "SCRATS" + }, + "isSC": {} + }, + "0x830eb1204380e9c44434db8700257025358707c6": { + "name": "GOB token contract", + "address": "0x830eb1204380e9c44434db8700257025358707c6", + "token": { + "decimals": 18, + "symbol": "GOB" + }, + "isSC": {} + }, + "0x0a77ef9bf662d62fbf9ba4cf861eaa83f9cc4fec": { + "name": "XWG token contract", + "address": "0x0a77ef9bf662d62fbf9ba4cf861eaa83f9cc4fec", + "token": { + "decimals": 18, + "symbol": "XWG" + }, + "isSC": {} + }, + "0xe35009059cb55ded065027e9832a2c564aff7512": { + "name": "SCAI token contract", + "address": "0xe35009059cb55ded065027e9832a2c564aff7512", + "token": { + "decimals": 18, + "symbol": "SCAI" + }, + "isSC": {} + }, + "0x137ddb47ee24eaa998a535ab00378d6bfa84f893": { + "name": "RDNT token contract", + "address": "0x137ddb47ee24eaa998a535ab00378d6bfa84f893", + "token": { + "decimals": 18, + "symbol": "RDNT" + }, + "isSC": {} + }, + "0xaf6a1125d4cc55a4110dc63cd2ff6e005afb8676": { + "name": "PUNK token contract", + "address": "0xaf6a1125d4cc55a4110dc63cd2ff6e005afb8676", + "token": { + "decimals": 18, + "symbol": "PUNK" + }, + "isSC": {} + }, + "0xa10bf0aba0c7953f279c4cb8192d3b5de5ea56e8": { + "name": "TAROT token contract", + "address": "0xa10bf0aba0c7953f279c4cb8192d3b5de5ea56e8", + "token": { + "decimals": 18, + "symbol": "TAROT" + }, + "isSC": {} + }, + "0xf97e2a78f1f3d1fd438ff7cc3bb7de01e5945b83": { + "name": "RIDE token contract", + "address": "0xf97e2a78f1f3d1fd438ff7cc3bb7de01e5945b83", + "token": { + "decimals": 18, + "symbol": "RIDE" + }, + "isSC": {} + }, + "0x9d3d07439069c9bbc8d626397cf98cb343ac0a72": { + "name": "TMNG token contract", + "address": "0x9d3d07439069c9bbc8d626397cf98cb343ac0a72", + "token": { + "decimals": 18, + "symbol": "TMNG" + }, + "isSC": {} + }, + "0xc60d6662027f5797cf873bfe80bcf048e30fc35e": { + "name": "XST token contract", + "address": "0xc60d6662027f5797cf873bfe80bcf048e30fc35e", + "token": { + "decimals": 18, + "symbol": "XST" + }, + "isSC": {} + }, + "0x2f11eeee0bf21e7661a22dbbbb9068f4ad191b86": { + "name": "BNIU token contract", + "address": "0x2f11eeee0bf21e7661a22dbbbb9068f4ad191b86", + "token": { + "decimals": 18, + "symbol": "BNIU" + }, + "isSC": {} + }, + "0x37613d64258c0fe09d5e53eecb091da5b8fa8707": { + "name": "PIP token contract", + "address": "0x37613d64258c0fe09d5e53eecb091da5b8fa8707", + "token": { + "decimals": 18, + "symbol": "PIP" + }, + "isSC": {} + }, + "0x9fd22a17b4a96da3f83797d122172c450381fb88": { + "name": "JEFE token contract", + "address": "0x9fd22a17b4a96da3f83797d122172c450381fb88", + "token": { + "decimals": 9, + "symbol": "JEFE" + }, + "isSC": {} + }, + "0xf68d4d917592f3a62417ace42592f15296cc33a0": { + "name": "CHB token contract", + "address": "0xf68d4d917592f3a62417ace42592f15296cc33a0", + "token": { + "decimals": 8, + "symbol": "CHB" + }, + "isSC": {} + }, + "0xbf628dfd72cf51752574a970c91f42591b173a77": { + "name": "X-AI token contract", + "address": "0xbf628dfd72cf51752574a970c91f42591b173a77", + "token": { + "decimals": 18, + "symbol": "X-AI" + }, + "isSC": {} + }, + "0xa48f322f8b3edff967629af79e027628b9dd1298": { + "name": "DUSD token contract", + "address": "0xa48f322f8b3edff967629af79e027628b9dd1298", + "token": { + "decimals": 18, + "symbol": "DUSD" + }, + "isSC": {} + }, + "0x59f4f336bf3d0c49dbfba4a74ebd2a6ace40539a": { + "name": "CAT token contract", + "address": "0x59f4f336bf3d0c49dbfba4a74ebd2a6ace40539a", + "token": { + "decimals": 9, + "symbol": "CAT" + }, + "isSC": {} + }, + "0x5e7f20e72c21f6d0bf0a2814fd4164176401cf8e": { + "name": "DEO token contract", + "address": "0x5e7f20e72c21f6d0bf0a2814fd4164176401cf8e", + "token": { + "decimals": 18, + "symbol": "DEO" + }, + "isSC": {} + }, + "0x20b3b07e9c0e37815e2892ab09496559f57c3603": { + "name": "USDV token contract", + "address": "0x20b3b07e9c0e37815e2892ab09496559f57c3603", + "token": { + "decimals": 18, + "symbol": "USDV" + }, + "isSC": {} + }, + "0x9bd69bc59118ce0fbce9b03551a765a779bd25cf": { + "name": "ZKE token contract", + "address": "0x9bd69bc59118ce0fbce9b03551a765a779bd25cf", + "token": { + "decimals": 18, + "symbol": "ZKE" + }, + "isSC": {} + }, + "0x4190818ffeb4c7349fa59eeb08eb6e7ab70d9aa7": { + "name": "LFI token contract", + "address": "0x4190818ffeb4c7349fa59eeb08eb6e7ab70d9aa7", + "token": { + "decimals": 8, + "symbol": "LFI" + }, + "isSC": {} + }, + "0xc819617f360f6347d222f260e9f4987ca1d0f879": { + "name": "ICLICK token contract", + "address": "0xc819617f360f6347d222f260e9f4987ca1d0f879", + "token": { + "decimals": 18, + "symbol": "ICLICK" + }, + "isSC": {} + }, + "0x7df4122d3eae29fc8fb6be58d9177e8e560be4fb": { + "name": "XCCX token contract", + "address": "0x7df4122d3eae29fc8fb6be58d9177e8e560be4fb", + "token": { + "decimals": 6, + "symbol": "XCCX" + }, + "isSC": {} + }, + "0x000000e29fa2bd3e5c215ffc71aa66b29c9769a2": { + "name": "ETE token contract", + "address": "0x000000e29fa2bd3e5c215ffc71aa66b29c9769a2", + "token": { + "decimals": 18, + "symbol": "ETE" + }, + "isSC": {} + }, + "0x00000000ba2ca30042001abc545871380f570b1f": { + "name": "ATF token contract", + "address": "0x00000000ba2ca30042001abc545871380f570b1f", + "token": { + "decimals": 18, + "symbol": "ATF" + }, + "isSC": {} + }, + "0x96543ef8d2c75c26387c1a319ae69c0bee6f3fe7": { + "name": "KUJI token contract", + "address": "0x96543ef8d2c75c26387c1a319ae69c0bee6f3fe7", + "token": { + "decimals": 6, + "symbol": "KUJI" + }, + "isSC": {} + }, + "0x1b3c515f58857e141a966b33182f2f3feecc10e9": { + "name": "USK token contract", + "address": "0x1b3c515f58857e141a966b33182f2f3feecc10e9", + "token": { + "decimals": 6, + "symbol": "USK" + }, + "isSC": {} + }, + "0x772722b55cdc2a086abd064267a17855eb15e8b3": { + "name": "MINTME token contract", + "address": "0x772722b55cdc2a086abd064267a17855eb15e8b3", + "token": { + "decimals": 18, + "symbol": "MINTME" + }, + "isSC": {} + }, + "0xb5b29320d2dde5ba5bafa1ebcd270052070483ec": { + "name": "YIELDETH token contract", + "address": "0xb5b29320d2dde5ba5bafa1ebcd270052070483ec", + "token": { + "decimals": 18, + "symbol": "YIELDETH" + }, + "isSC": {} + }, + "0xb399511642fe1666c6a07f83483e6e4feaed9a00": { + "name": "EUROS token contract", + "address": "0xb399511642fe1666c6a07f83483e6e4feaed9a00", + "token": { + "decimals": 18, + "symbol": "EUROS" + }, + "isSC": {} + }, + "0x580e933d90091b9ce380740e3a4a39c67eb85b4c": { + "name": "GSWIFT token contract", + "address": "0x580e933d90091b9ce380740e3a4a39c67eb85b4c", + "token": { + "decimals": 18, + "symbol": "GSWIFT" + }, + "isSC": {} + }, + "0x4e9e4ab99cfc14b852f552f5fb3aa68617825b6c": { + "name": "SLR token contract", + "address": "0x4e9e4ab99cfc14b852f552f5fb3aa68617825b6c", + "token": { + "decimals": 18, + "symbol": "SLR" + }, + "isSC": {} + }, + "0x8c223a82e07fecb49d602150d7c2b3a4c9630310": { + "name": "NFTE token contract", + "address": "0x8c223a82e07fecb49d602150d7c2b3a4c9630310", + "token": { + "decimals": 18, + "symbol": "NFTE" + }, + "isSC": {} + }, + "0x3a856d4effa670c54585a5d523e96513e148e95d": { + "name": "TRIAS token contract", + "address": "0x3a856d4effa670c54585a5d523e96513e148e95d", + "token": { + "decimals": 18, + "symbol": "TRIAS" + }, + "isSC": {} + }, + "0xb2ee0adbe0ef1281025d0676511bb1df14600f4d": { + "name": "FORE token contract", + "address": "0xb2ee0adbe0ef1281025d0676511bb1df14600f4d", + "token": { + "decimals": 18, + "symbol": "FORE" + }, + "isSC": {} + }, + "0xa4335da338ec4c07c391fc1a9bf75f306adadc08": { + "name": "EUSD token contract", + "address": "0xa4335da338ec4c07c391fc1a9bf75f306adadc08", + "token": { + "decimals": 18, + "symbol": "EUSD" + }, + "isSC": {} + }, + "0xc03b43d492d904406db2d7d57e67c7e8234ba752": { + "name": "WUSDR token contract", + "address": "0xc03b43d492d904406db2d7d57e67c7e8234ba752", + "token": { + "decimals": 9, + "symbol": "WUSDR" + }, + "isSC": {} + }, + "0xcc503242b574bc01145da7e2a743b43fb395ec91": { + "name": "ROVI token contract", + "address": "0xcc503242b574bc01145da7e2a743b43fb395ec91", + "token": { + "decimals": 18, + "symbol": "ROVI" + }, + "isSC": {} + }, + "0x2512c545a0117353e4e9acddff860342640d3cf6": { + "name": "WHEE token contract", + "address": "0x2512c545a0117353e4e9acddff860342640d3cf6", + "token": { + "decimals": 18, + "symbol": "WHEE" + }, + "isSC": {} + }, + "0x1f3f677ecc58f6a1f9e2cf410df4776a8546b5de": { + "name": "VNDC token contract", + "address": "0x1f3f677ecc58f6a1f9e2cf410df4776a8546b5de", + "token": { + "decimals": 0, + "symbol": "VNDC" + }, + "isSC": {} + }, + "0xf05897cfe3ce9bbbfe0751cbe6b1b2c686848dcb": { + "name": "CATE token contract", + "address": "0xf05897cfe3ce9bbbfe0751cbe6b1b2c686848dcb", + "token": { + "decimals": 9, + "symbol": "CATE" + }, + "isSC": {} + }, + "0xb2492e97a68a6e4b9e9a11b99f6c42e5accd38c7": { + "name": "VEXT token contract", + "address": "0xb2492e97a68a6e4b9e9a11b99f6c42e5accd38c7", + "token": { + "decimals": 18, + "symbol": "VEXT" + }, + "isSC": {} + }, + "0xdd1b6b259986571a85da82a84f461e1c212591c0": { + "name": "BLAZEX token contract", + "address": "0xdd1b6b259986571a85da82a84f461e1c212591c0", + "token": { + "decimals": 9, + "symbol": "BLAZEX" + }, + "isSC": {} + }, + "0x73fbd93bfda83b111ddc092aa3a4ca77fd30d380": { + "name": "SOPH token contract", + "address": "0x73fbd93bfda83b111ddc092aa3a4ca77fd30d380", + "token": { + "decimals": 18, + "symbol": "SOPH" + }, + "isSC": {} + }, + "0xf2b2f7b47715256ce4ea43363a867fdce9353e3a": { + "name": "BRISE token contract", + "address": "0xf2b2f7b47715256ce4ea43363a867fdce9353e3a", + "token": { + "decimals": 9, + "symbol": "BRISE" + }, + "isSC": {} + }, + "0x8f006d1e1d9dc6c98996f50a4c810f17a47fbf19": { + "name": "NSFW token contract", + "address": "0x8f006d1e1d9dc6c98996f50a4c810f17a47fbf19", + "token": { + "decimals": 18, + "symbol": "NSFW" + }, + "isSC": {} + }, + "0xd20523b39faf1d6e9023a4d6085f87b7b0de7926": { + "name": "OATH token contract", + "address": "0xd20523b39faf1d6e9023a4d6085f87b7b0de7926", + "token": { + "decimals": 18, + "symbol": "OATH" + }, + "isSC": {} + }, + "0x25931894a86d47441213199621f1f2994e1c39aa": { + "name": "CGPT token contract", + "address": "0x25931894a86d47441213199621f1f2994e1c39aa", + "token": { + "decimals": 18, + "symbol": "CGPT" + }, + "isSC": {} + }, + "0x152649ea73beab28c5b49b26eb48f7ead6d4c898": { + "name": "CAKE token contract", + "address": "0x152649ea73beab28c5b49b26eb48f7ead6d4c898", + "token": { + "decimals": 18, + "symbol": "CAKE" + }, + "isSC": {} + }, + "0x4eea762311be76f9071aa01058c047ad12a017a1": { + "name": "GBURN token contract", + "address": "0x4eea762311be76f9071aa01058c047ad12a017a1", + "token": { + "decimals": 18, + "symbol": "GBURN" + }, + "isSC": {} + }, + "0x39d5313c3750140e5042887413ba8aa6145a9bd2": { + "name": "EMP token contract", + "address": "0x39d5313c3750140e5042887413ba8aa6145a9bd2", + "token": { + "decimals": 18, + "symbol": "EMP" + }, + "isSC": {} + }, + "0x6b66ccd1340c479b07b390d326eadcbb84e726ba": { + "name": "SEAM token contract", + "address": "0x6b66ccd1340c479b07b390d326eadcbb84e726ba", + "token": { + "decimals": 18, + "symbol": "SEAM" + }, + "isSC": {} + }, + "0x0b925ed163218f6662a35e0f0371ac234f9e9371": { + "name": "AWSTETH token contract", + "address": "0x0b925ed163218f6662a35e0f0371ac234f9e9371", + "token": { + "decimals": 18, + "symbol": "AWSTETH" + }, + "isSC": {} + }, + "0x3fe6a295459fae07df8a0cecc36f37160fe86aa9": { + "name": "ALUSD token contract", + "address": "0x3fe6a295459fae07df8a0cecc36f37160fe86aa9", + "token": { + "decimals": 18, + "symbol": "ALUSD" + }, + "isSC": {} + }, + "0x582d872a1b094fc48f5de31d3b73f2d9be47def1": { + "name": "TON token contract", + "address": "0x582d872a1b094fc48f5de31d3b73f2d9be47def1", + "token": { + "decimals": 9, + "symbol": "TON" + }, + "isSC": {} + }, + "0xade6057fcafa57d6d51ffa341c64ce4814995995": { + "name": "BZPR1 token contract", + "address": "0xade6057fcafa57d6d51ffa341c64ce4814995995", + "token": { + "decimals": 18, + "symbol": "BZPR1" + }, + "isSC": {} + }, + "0xd711d7d893de57dc13ff465763218770bd42db1d": { + "name": "EGBP token contract", + "address": "0xd711d7d893de57dc13ff465763218770bd42db1d", + "token": { + "decimals": 18, + "symbol": "EGBP" + }, + "isSC": {} + }, + "0xb55ee890426341fe45ee6dc788d2d93d25b59063": { + "name": "LOVE token contract", + "address": "0xb55ee890426341fe45ee6dc788d2d93d25b59063", + "token": { + "decimals": 18, + "symbol": "LOVE" + }, + "isSC": {} + }, + "0x31e4efe290973ebe91b3a875a7994f650942d28f": { + "name": "SHRAP token contract", + "address": "0x31e4efe290973ebe91b3a875a7994f650942d28f", + "token": { + "decimals": 18, + "symbol": "SHRAP" + }, + "isSC": {} + }, + "0x31a2e08f4232329e4eddb025c0275f43c9cd56d7": { + "name": "LUSD token contract", + "address": "0x31a2e08f4232329e4eddb025c0275f43c9cd56d7", + "token": { + "decimals": 18, + "symbol": "LUSD" + }, + "isSC": {} + }, + "0x735fa792e731a2e8f83f32eb539841b7b72e6d8f": { + "name": "EEUR token contract", + "address": "0x735fa792e731a2e8f83f32eb539841b7b72e6d8f", + "token": { + "decimals": 18, + "symbol": "EEUR" + }, + "isSC": {} + }, + "0x6b431b8a964bfcf28191b07c91189ff4403957d0": { + "name": "CORGIAI token contract", + "address": "0x6b431b8a964bfcf28191b07c91189ff4403957d0", + "token": { + "decimals": 18, + "symbol": "CORGIAI" + }, + "isSC": {} + }, + "0xe939f011a3d8fc0aa874c97e8156053a903d7176": { + "name": "DOLZ token contract", + "address": "0xe939f011a3d8fc0aa874c97e8156053a903d7176", + "token": { + "decimals": 18, + "symbol": "DOLZ" + }, + "isSC": {} + }, + "0x75d86078625d1e2f612de2627d34c7bc411c18b8": { + "name": "AGII token contract", + "address": "0x75d86078625d1e2f612de2627d34c7bc411c18b8", + "token": { + "decimals": 18, + "symbol": "AGII" + }, + "isSC": {} + }, + "0xe6828d65bf5023ae1851d90d8783cc821ba7eee1": { + "name": "ABOND token contract", + "address": "0xe6828d65bf5023ae1851d90d8783cc821ba7eee1", + "token": { + "decimals": 18, + "symbol": "ABOND" + }, + "isSC": {} + }, + "0xa2c2c937333165d4c5f2dc5f31a43e1239fecfeb": { + "name": "HERA token contract", + "address": "0xa2c2c937333165d4c5f2dc5f31a43e1239fecfeb", + "token": { + "decimals": 18, + "symbol": "HERA" + }, + "isSC": {} + }, + "0x1f7e5118521b550bb1a9b435727c003eb033fc51": { + "name": "AGLA token contract", + "address": "0x1f7e5118521b550bb1a9b435727c003eb033fc51", + "token": { + "decimals": 18, + "symbol": "AGLA" + }, + "isSC": {} + }, + "0xbf27b3163c25113be5439d56f8acf2209ef3e5bd": { + "name": "HOS token contract", + "address": "0xbf27b3163c25113be5439d56f8acf2209ef3e5bd", + "token": { + "decimals": 18, + "symbol": "HOS" + }, + "isSC": {} + }, + "0x8b9f7e9586633ca4abffb1f746da8daed7849cb2": { + "name": "CREMAT token contract", + "address": "0x8b9f7e9586633ca4abffb1f746da8daed7849cb2", + "token": { + "decimals": 18, + "symbol": "CREMAT" + }, + "isSC": {} + }, + "0x388d819724dd6d71760a38f00dc01d310d879771": { + "name": "JM token contract", + "address": "0x388d819724dd6d71760a38f00dc01d310d879771", + "token": { + "decimals": 8, + "symbol": "JM" + }, + "isSC": {} + }, + "0x4b19c70da4c6fa4baa0660825e889d2f7eabc279": { + "name": "GMM token contract", + "address": "0x4b19c70da4c6fa4baa0660825e889d2f7eabc279", + "token": { + "decimals": 18, + "symbol": "GMM" + }, + "isSC": {} + }, + "0xdad33e12e61dc2f2692f2c12e6303b5ade7277ba": { + "name": "BREWLABS token contract", + "address": "0xdad33e12e61dc2f2692f2c12e6303b5ade7277ba", + "token": { + "decimals": 9, + "symbol": "BREWLABS" + }, + "isSC": {} + }, + "0x87da7bbd398d6610ded42617e34069d0083ff8ab": { + "name": "MIND token contract", + "address": "0x87da7bbd398d6610ded42617e34069d0083ff8ab", + "token": { + "decimals": 18, + "symbol": "MIND" + }, + "isSC": {} + }, + "0x186d0ba3dfc3386c464eecd96a61fbb1e2da00bf": { + "name": "TRAVA token contract", + "address": "0x186d0ba3dfc3386c464eecd96a61fbb1e2da00bf", + "token": { + "decimals": 18, + "symbol": "TRAVA" + }, + "isSC": {} + }, + "0x333000333b26ee30214b4af6419d9ab07a450400": { + "name": "MELD token contract", + "address": "0x333000333b26ee30214b4af6419d9ab07a450400", + "token": { + "decimals": 18, + "symbol": "MELD" + }, + "isSC": {} + }, + "0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b": { + "name": "Cronos", + "address": "0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b", + "token": { + "decimals": 8, + "symbol": "CRO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/cro.svg" + }, + "0x7cfea0dd176651e7b5a1ced9c4faf8ee295315fd": { + "name": "PRNT token contract", + "address": "0x7cfea0dd176651e7b5a1ced9c4faf8ee295315fd", + "token": { + "decimals": 18, + "symbol": "PRNT" + }, + "isSC": {} + }, + "0xf33893de6eb6ae9a67442e066ae9abd228f5290c": { + "name": "GRV token contract", + "address": "0xf33893de6eb6ae9a67442e066ae9abd228f5290c", + "token": { + "decimals": 8, + "symbol": "GRV" + }, + "isSC": {} + }, + "0x5b8650cd999b23cf39ab12e3213fbc8709c7f5cb": { + "name": "MAZI token contract", + "address": "0x5b8650cd999b23cf39ab12e3213fbc8709c7f5cb", + "token": { + "decimals": 18, + "symbol": "MAZI" + }, + "isSC": {} + }, + "0x9ed7e4b1bff939ad473da5e7a218c771d1569456": { + "name": "REUNI token contract", + "address": "0x9ed7e4b1bff939ad473da5e7a218c771d1569456", + "token": { + "decimals": 6, + "symbol": "REUNI" + }, + "isSC": {} + }, + "0x91a69021b0baef3445e51726458a0ce601471846": { + "name": "ERN token contract", + "address": "0x91a69021b0baef3445e51726458a0ce601471846", + "token": { + "decimals": 18, + "symbol": "ERN" + }, + "isSC": {} + }, + "0x9776191f4ebbba7f358c1663bf82c0a0906c77fa": { + "name": "PHX token contract", + "address": "0x9776191f4ebbba7f358c1663bf82c0a0906c77fa", + "token": { + "decimals": 18, + "symbol": "PHX" + }, + "isSC": {} + }, + "0x9d1089802ee608ba84c5c98211afe5f37f96b36c": { + "name": "FUSDC token contract", + "address": "0x9d1089802ee608ba84c5c98211afe5f37f96b36c", + "token": { + "decimals": 6, + "symbol": "FUSDC" + }, + "isSC": {} + }, + "0xa75e7928d3de682e3f44da60c26f33117c4e6c5c": { + "name": "PEL token contract", + "address": "0xa75e7928d3de682e3f44da60c26f33117c4e6c5c", + "token": { + "decimals": 18, + "symbol": "PEL" + }, + "isSC": {} + }, + "0x15a3081b541e8dad25c4a5e0c4c4b4e8d105b2e8": { + "name": "POV token contract", + "address": "0x15a3081b541e8dad25c4a5e0c4c4b4e8d105b2e8", + "token": { + "decimals": 18, + "symbol": "POV" + }, + "isSC": {} + }, + "0x1bd55090b8878630e57fae6ebd11fd61d16dfc9f": { + "name": "ALT token contract", + "address": "0x1bd55090b8878630e57fae6ebd11fd61d16dfc9f", + "token": { + "decimals": 18, + "symbol": "ALT" + }, + "isSC": {} + }, + "0x0ae38f7e10a43b5b2fb064b42a2f4514cba909ef": { + "name": "UNSHETH token contract", + "address": "0x0ae38f7e10a43b5b2fb064b42a2f4514cba909ef", + "token": { + "decimals": 18, + "symbol": "UNSHETH" + }, + "isSC": {} + }, + "0x490e3f4af13e1616ec97a8c6600c1061a8d0253e": { + "name": "TRR token contract", + "address": "0x490e3f4af13e1616ec97a8c6600c1061a8d0253e", + "token": { + "decimals": 18, + "symbol": "TRR" + }, + "isSC": {} + }, + "0x849a226f327b89e3133d9930d927f9eb9346f8c9": { + "name": "CGU token contract", + "address": "0x849a226f327b89e3133d9930d927f9eb9346f8c9", + "token": { + "decimals": 8, + "symbol": "CGU" + }, + "isSC": {} + }, + "0x3c917054e03485808137eb306eafa8da0ab695cd": { + "name": "ORB token contract", + "address": "0x3c917054e03485808137eb306eafa8da0ab695cd", + "token": { + "decimals": 18, + "symbol": "ORB" + }, + "isSC": {} + }, + "0xb8c77482e45f1f44de1745f52c74426c631bdd52": { + "name": "Binance Coin", + "address": "0xb8c77482e45f1f44de1745f52c74426c631bdd52", + "token": { + "decimals": 18, + "symbol": "BNB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bnb.svg" + }, + "0xa670d7237398238de01267472c6f13e5b8010fd1": { + "name": "SOMM token contract", + "address": "0xa670d7237398238de01267472c6f13e5b8010fd1", + "token": { + "decimals": 6, + "symbol": "SOMM" + }, + "isSC": {} + }, + "0xffa188493c15dfaf2c206c97d8633377847b6a52": { + "name": "WEFI token contract", + "address": "0xffa188493c15dfaf2c206c97d8633377847b6a52", + "token": { + "decimals": 18, + "symbol": "WEFI" + }, + "isSC": {} + }, + "0xd8fa690304d2b2824d918c0c7376e2823704557a": { + "name": "SQUIDGROW token contract", + "address": "0xd8fa690304d2b2824d918c0c7376e2823704557a", + "token": { + "decimals": 9, + "symbol": "SQUIDGROW" + }, + "isSC": {} + }, + "0x395e925834996e558bdec77cd648435d620afb5b": { + "name": "TFT token contract", + "address": "0x395e925834996e558bdec77cd648435d620afb5b", + "token": { + "decimals": 7, + "symbol": "TFT" + }, + "isSC": {} + }, + "0x8db4beaccd1698892821a9a0dc367792c0cb9940": { + "name": "4TOKEN token contract", + "address": "0x8db4beaccd1698892821a9a0dc367792c0cb9940", + "token": { + "decimals": 18, + "symbol": "4TOKEN" + }, + "isSC": {} + }, + "0x26aad156ba8efa501b32b42ffcdc8413f90e9c99": { + "name": "EDU token contract", + "address": "0x26aad156ba8efa501b32b42ffcdc8413f90e9c99", + "token": { + "decimals": 18, + "symbol": "EDU" + }, + "isSC": {} + }, + "0xf823fd9ac0abb8d779076a41daa049844299f6ed": { + "name": "SQUID token contract", + "address": "0xf823fd9ac0abb8d779076a41daa049844299f6ed", + "token": { + "decimals": 18, + "symbol": "SQUID" + }, + "isSC": {} + }, + "0x837d904a3799c0769079be9ecbaddf1abd4ccd6e": { + "name": "TAROT token contract", + "address": "0x837d904a3799c0769079be9ecbaddf1abd4ccd6e", + "token": { + "decimals": 18, + "symbol": "TAROT" + }, + "isSC": {} + }, + "0xdcfa8c46ec015d4bf13d6be492cb7a8eb4580899": { + "name": "PACT token contract", + "address": "0xdcfa8c46ec015d4bf13d6be492cb7a8eb4580899", + "token": { + "decimals": 18, + "symbol": "PACT" + }, + "isSC": {} + }, + "0x4184aa04215e5d716dd4c213fed519acadc68f92": { + "name": "ONUS token contract", + "address": "0x4184aa04215e5d716dd4c213fed519acadc68f92", + "token": { + "decimals": 18, + "symbol": "ONUS" + }, + "isSC": {} + }, + "0xb012be90957d70d9a070918027655f998c123a88": { + "name": "HMX token contract", + "address": "0xb012be90957d70d9a070918027655f998c123a88", + "token": { + "decimals": 18, + "symbol": "HMX" + }, + "isSC": {} + }, + "0x0b7f0e51cd1739d6c96982d55ad8fa634dd43a9c": { + "name": "DMT token contract", + "address": "0x0b7f0e51cd1739d6c96982d55ad8fa634dd43a9c", + "token": { + "decimals": 18, + "symbol": "DMT" + }, + "isSC": {} + }, + "0xcdb37a4fbc2da5b78aa4e41a432792f9533e85cc": { + "name": "CDT token contract", + "address": "0xcdb37a4fbc2da5b78aa4e41a432792f9533e85cc", + "token": { + "decimals": 18, + "symbol": "CDT" + }, + "isSC": {} + }, + "0x0a5e677a6a24b2f1a2bf4f3bffc443231d2fdec8": { + "name": "USX token contract", + "address": "0x0a5e677a6a24b2f1a2bf4f3bffc443231d2fdec8", + "token": { + "decimals": 18, + "symbol": "USX" + }, + "isSC": {} + }, + "0x4c584cd339bdde73b7f5210486dd8bbeee3fde6d": { + "name": "SHIBELON token contract", + "address": "0x4c584cd339bdde73b7f5210486dd8bbeee3fde6d", + "token": { + "decimals": 9, + "symbol": "SHIBELON" + }, + "isSC": {} + }, + "0xa64d5d1eb67748226d84812b45711453f1118c32": { + "name": "CINU token contract", + "address": "0xa64d5d1eb67748226d84812b45711453f1118c32", + "token": { + "decimals": 9, + "symbol": "CINU" + }, + "isSC": {} + }, + "0x075067a4b236f68f123fc0553f4560311937491d": { + "name": "CATPAY token contract", + "address": "0x075067a4b236f68f123fc0553f4560311937491d", + "token": { + "decimals": 9, + "symbol": "CATPAY" + }, + "isSC": {} + }, + "0xf3e07812ebc8604fddb0aa35ff79a03f48f48948": { + "name": "JART token contract", + "address": "0xf3e07812ebc8604fddb0aa35ff79a03f48f48948", + "token": { + "decimals": 18, + "symbol": "JART" + }, + "isSC": {} + }, + "0xbccd27062ae1a2bea5731c904b96edfb163aba21": { + "name": "DOGS token contract", + "address": "0xbccd27062ae1a2bea5731c904b96edfb163aba21", + "token": { + "decimals": 9, + "symbol": "DOGS" + }, + "isSC": {} + }, + "0x9f90b457dea25ef802e38d470dda7343691d8fe1": { + "name": "CIOTX token contract", + "address": "0x9f90b457dea25ef802e38d470dda7343691d8fe1", + "token": { + "decimals": 18, + "symbol": "CIOTX" + }, + "isSC": {} + }, + "0xe28027c99c7746ffb56b0113e5d9708ac86fae8f": { + "name": "KING token contract", + "address": "0xe28027c99c7746ffb56b0113e5d9708ac86fae8f", + "token": { + "decimals": 9, + "symbol": "KING" + }, + "isSC": {} + }, + "0x0d229c3ff2d76e4b88ca4f9d3d3353f4545ec53f": { + "name": "SHINU token contract", + "address": "0x0d229c3ff2d76e4b88ca4f9d3d3353f4545ec53f", + "token": { + "decimals": 18, + "symbol": "SHINU" + }, + "isSC": {} + }, + "0xbe03e60757f21f4b6fc8f16676ad9d5b1002e512": { + "name": "RST token contract", + "address": "0xbe03e60757f21f4b6fc8f16676ad9d5b1002e512", + "token": { + "decimals": 18, + "symbol": "RST" + }, + "isSC": {} + }, + "0x5bdc32663ec75e85ff4abc2cae7ae8b606a2cfca": { + "name": "CP token contract", + "address": "0x5bdc32663ec75e85ff4abc2cae7ae8b606a2cfca", + "token": { + "decimals": 18, + "symbol": "CP" + }, + "isSC": {} + }, + "0x25ec98773d7b4ced4cafab96a2a1c0945f145e10": { + "name": "STUSDT token contract", + "address": "0x25ec98773d7b4ced4cafab96a2a1c0945f145e10", + "token": { + "decimals": 18, + "symbol": "STUSDT" + }, + "isSC": {} + }, + "0x188fb5f5ae5bbe4154d5778f2bbb2fb985c94d25": { + "name": "OBX token contract", + "address": "0x188fb5f5ae5bbe4154d5778f2bbb2fb985c94d25", + "token": { + "decimals": 18, + "symbol": "OBX" + }, + "isSC": {} + }, + "0x263b6b028f3e4ed8c4329eb2b5f409ee38d97296": { + "name": "WMT token contract", + "address": "0x263b6b028f3e4ed8c4329eb2b5f409ee38d97296", + "token": { + "decimals": 6, + "symbol": "WMT" + }, + "isSC": {} + }, + "0xc0b314a8c08637685fc3dafc477b92028c540cfb": { + "name": "WOM token contract", + "address": "0xc0b314a8c08637685fc3dafc477b92028c540cfb", + "token": { + "decimals": 18, + "symbol": "WOM" + }, + "isSC": {} + }, + "0x5fab9761d60419c9eeebe3915a8fa1ed7e8d2e1b": { + "name": "DIMO token contract", + "address": "0x5fab9761d60419c9eeebe3915a8fa1ed7e8d2e1b", + "token": { + "decimals": 18, + "symbol": "DIMO" + }, + "isSC": {} + }, + "0x672f4fa517894496b8a958b4b3fca068ce513a39": { + "name": "DCK token contract", + "address": "0x672f4fa517894496b8a958b4b3fca068ce513a39", + "token": { + "decimals": 18, + "symbol": "DCK" + }, + "isSC": {} + }, + "0x2dff88a56767223a5529ea5960da7a3f5f766406": { + "name": "ID token contract", + "address": "0x2dff88a56767223a5529ea5960da7a3f5f766406", + "token": { + "decimals": 18, + "symbol": "ID" + }, + "isSC": {} + }, + "0x6731827cb6879a2091ce3ab3423f7bf20539b579": { + "name": "MPWR token contract", + "address": "0x6731827cb6879a2091ce3ab3423f7bf20539b579", + "token": { + "decimals": 18, + "symbol": "MPWR" + }, + "isSC": {} + }, + "0xb50721bcf8d664c30412cfbc6cf7a15145234ad1": { + "name": "Arbitrum", + "address": "0xb50721bcf8d664c30412cfbc6cf7a15145234ad1", + "token": { + "decimals": 18, + "symbol": "ARB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Arb.svg" + }, + "0x77f2be773ca0887ba2b3ef8344c8cf13c98d8ca7": { + "name": "FYT token contract", + "address": "0x77f2be773ca0887ba2b3ef8344c8cf13c98d8ca7", + "token": { + "decimals": 18, + "symbol": "FYT" + }, + "isSC": {} + }, + "0xa89bf95c5f15a847c8eb8d348cd7fed719ad7d80": { + "name": "AI token contract", + "address": "0xa89bf95c5f15a847c8eb8d348cd7fed719ad7d80", + "token": { + "decimals": 18, + "symbol": "AI" + }, + "isSC": {} + }, + "0x1c98b54d673c026c8286badca3e840aaf72931a3": { + "name": "STSW token contract", + "address": "0x1c98b54d673c026c8286badca3e840aaf72931a3", + "token": { + "decimals": 6, + "symbol": "STSW" + }, + "isSC": {} + }, + "0x1151cb3d861920e07a38e03eead12c32178567f6": { + "name": "BONK token contract", + "address": "0x1151cb3d861920e07a38e03eead12c32178567f6", + "token": { + "decimals": 5, + "symbol": "BONK" + }, + "isSC": {} + }, + "0x510975eda48a97e0ca228dd04d1217292487bea6": { + "name": "GXE token contract", + "address": "0x510975eda48a97e0ca228dd04d1217292487bea6", + "token": { + "decimals": 18, + "symbol": "GXE" + }, + "isSC": {} + }, + "0xb2cabf797bc907b049e4ccb5b84d13be3a8cfc21": { + "name": "ACRE token contract", + "address": "0xb2cabf797bc907b049e4ccb5b84d13be3a8cfc21", + "token": { + "decimals": 18, + "symbol": "ACRE" + }, + "isSC": {} + }, + "0x4e15361fd6b4bb609fa63c81a2be19d873717870": { + "name": "Fantom", + "address": "0x4e15361fd6b4bb609fa63c81a2be19d873717870", + "token": { + "decimals": 18, + "symbol": "FTM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ftm.svg" + }, + "0x56c03b8c4fa80ba37f5a7b60caaaef749bb5b220": { + "name": "CANTO token contract", + "address": "0x56c03b8c4fa80ba37f5a7b60caaaef749bb5b220", + "token": { + "decimals": 18, + "symbol": "CANTO" + }, + "isSC": {} + }, + "0xc9c4fd7579133701fa2769b6955e7e56bb386db1": { + "name": "BRG token contract", + "address": "0xc9c4fd7579133701fa2769b6955e7e56bb386db1", + "token": { + "decimals": 18, + "symbol": "BRG" + }, + "isSC": {} + }, + "0xd1420af453fd7bf940573431d416cace7ff8280c": { + "name": "AGOV token contract", + "address": "0xd1420af453fd7bf940573431d416cace7ff8280c", + "token": { + "decimals": 18, + "symbol": "AGOV" + }, + "isSC": {} + }, + "0xb4a3b0faf0ab53df58001804dda5bfc6a3d59008": { + "name": "SPA token contract", + "address": "0xb4a3b0faf0ab53df58001804dda5bfc6a3d59008", + "token": { + "decimals": 18, + "symbol": "SPA" + }, + "isSC": {} + }, + "0x969786c4a8884013d1c9ff18dcca2aedbbbfaa8f": { + "name": "LFG token contract", + "address": "0x969786c4a8884013d1c9ff18dcca2aedbbbfaa8f", + "token": { + "decimals": 18, + "symbol": "LFG" + }, + "isSC": {} + }, + "0xb9d27bc093ed0a3b7c18366266704cfe5e7af77b": { + "name": "CBY token contract", + "address": "0xb9d27bc093ed0a3b7c18366266704cfe5e7af77b", + "token": { + "decimals": 18, + "symbol": "CBY" + }, + "isSC": {} + }, + "0x977b6fc5de62598b08c85ac8cf2b745874e8b78c": { + "name": "ACBETH token contract", + "address": "0x977b6fc5de62598b08c85ac8cf2b745874e8b78c", + "token": { + "decimals": 18, + "symbol": "ACBETH" + }, + "isSC": {} + }, + "0x92df60c51c710a1b1c20e42d85e221f3a1bfc7f2": { + "name": "BANANA token contract", + "address": "0x92df60c51c710a1b1c20e42d85e221f3a1bfc7f2", + "token": { + "decimals": 18, + "symbol": "BANANA" + }, + "isSC": {} + }, + "0x2aeabde1ab736c59e9a19bed67681869eef39526": { + "name": "DOVU token contract", + "address": "0x2aeabde1ab736c59e9a19bed67681869eef39526", + "token": { + "decimals": 8, + "symbol": "DOVU" + }, + "isSC": {} + }, + "0xff9c1f21c621696c4f91cf781ec31bd913ee2c26": { + "name": "COM token contract", + "address": "0xff9c1f21c621696c4f91cf781ec31bd913ee2c26", + "token": { + "decimals": 18, + "symbol": "COM" + }, + "isSC": {} + }, + "0xe2dc070524a6e305ddb64d8513dc444b6a1ec845": { + "name": "NEX token contract", + "address": "0xe2dc070524a6e305ddb64d8513dc444b6a1ec845", + "token": { + "decimals": 8, + "symbol": "NEX" + }, + "isSC": {} + }, + "0x0f3adc247e91c3c50bc08721355a41037e89bc20": { + "name": "ANC token contract", + "address": "0x0f3adc247e91c3c50bc08721355a41037e89bc20", + "token": { + "decimals": 18, + "symbol": "ANC" + }, + "isSC": {} + }, + "0x965697b4ef02f0de01384d0d4f9f782b1670c163": { + "name": "OXY token contract", + "address": "0x965697b4ef02f0de01384d0d4f9f782b1670c163", + "token": { + "decimals": 6, + "symbol": "OXY" + }, + "isSC": {} + }, + "0x499568c250ab2a42292261d6121525d70691894b": { + "name": "KRW token contract", + "address": "0x499568c250ab2a42292261d6121525d70691894b", + "token": { + "decimals": 18, + "symbol": "KRW" + }, + "isSC": {} + }, + "0x06ddb3a8bc0abc14f85e974cf1a93a6f8d4909d9": { + "name": "8PAY token contract", + "address": "0x06ddb3a8bc0abc14f85e974cf1a93a6f8d4909d9", + "token": { + "decimals": 18, + "symbol": "8PAY" + }, + "isSC": {} + }, + "0x6dc02164d75651758ac74435806093e421b64605": { + "name": "WCHI token contract", + "address": "0x6dc02164d75651758ac74435806093e421b64605", + "token": { + "decimals": 8, + "symbol": "WCHI" + }, + "isSC": {} + }, + "0xfb62ae373aca027177d1c18ee0862817f9080d08": { + "name": "DPET token contract", + "address": "0xfb62ae373aca027177d1c18ee0862817f9080d08", + "token": { + "decimals": 18, + "symbol": "DPET" + }, + "isSC": {} + }, + "0x3079f61704e9efa2bcf1db412f735d8d4cfa26f4": { + "name": "HAPPY token contract", + "address": "0x3079f61704e9efa2bcf1db412f735d8d4cfa26f4", + "token": { + "decimals": 18, + "symbol": "HAPPY" + }, + "isSC": {} + }, + "0xee1cea7665ba7aa97e982edeaecb26b59a04d035": { + "name": "ORAO token contract", + "address": "0xee1cea7665ba7aa97e982edeaecb26b59a04d035", + "token": { + "decimals": 18, + "symbol": "ORAO" + }, + "isSC": {} + }, + "0x7b4328c127b85369d9f82ca0503b000d09cf9180": { + "name": "DC token contract", + "address": "0x7b4328c127b85369d9f82ca0503b000d09cf9180", + "token": { + "decimals": 18, + "symbol": "DC" + }, + "isSC": {} + }, + "0x05fb86775fd5c16290f1e838f5caaa7342bd9a63": { + "name": "HAI token contract", + "address": "0x05fb86775fd5c16290f1e838f5caaa7342bd9a63", + "token": { + "decimals": 8, + "symbol": "HAI" + }, + "isSC": {} + }, + "0xa771b49064da011df051052848477f18dba1d2ac": { + "name": "HNS token contract", + "address": "0xa771b49064da011df051052848477f18dba1d2ac", + "token": { + "decimals": 6, + "symbol": "HNS" + }, + "isSC": {} + }, + "0x45fdb1b92a649fb6a64ef1511d3ba5bf60044838": { + "name": "USDS token contract", + "address": "0x45fdb1b92a649fb6a64ef1511d3ba5bf60044838", + "token": { + "decimals": 18, + "symbol": "USDS" + }, + "isSC": {} + }, + "0x8bcd06492416a749c9369009b3429861b7f27f6e": { + "name": "BLKC token contract", + "address": "0x8bcd06492416a749c9369009b3429861b7f27f6e", + "token": { + "decimals": 8, + "symbol": "BLKC" + }, + "isSC": {} + }, + "0xae12c5930881c53715b369cec7606b70d8eb229f": { + "name": "C98 token contract", + "address": "0xae12c5930881c53715b369cec7606b70d8eb229f", + "token": { + "decimals": 18, + "symbol": "C98" + }, + "isSC": {} + }, + "0x396ec402b42066864c406d1ac3bc86b575003ed8": { + "name": "BUY token contract", + "address": "0x396ec402b42066864c406d1ac3bc86b575003ed8", + "token": { + "decimals": 2, + "symbol": "BUY" + }, + "isSC": {} + }, + "0x180dae91d6d56235453a892d2e56a3e40ba81df8": { + "name": "DOJO token contract", + "address": "0x180dae91d6d56235453a892d2e56a3e40ba81df8", + "token": { + "decimals": 18, + "symbol": "DOJO" + }, + "isSC": {} + }, + "0x8287c7b963b405b7b8d467db9d79eec40625b13a": { + "name": "SWINGBY token contract", + "address": "0x8287c7b963b405b7b8d467db9d79eec40625b13a", + "token": { + "decimals": 18, + "symbol": "SWINGBY" + }, + "isSC": {} + }, + "0x1d7ca62f6af49ec66f6680b8606e634e55ef22c1": { + "name": "START token contract", + "address": "0x1d7ca62f6af49ec66f6680b8606e634e55ef22c1", + "token": { + "decimals": 18, + "symbol": "START" + }, + "isSC": {} + }, + "0x6c7b97c7e09e790d161769a52f155125fac6d5a1": { + "name": "ANGEL token contract", + "address": "0x6c7b97c7e09e790d161769a52f155125fac6d5a1", + "token": { + "decimals": 18, + "symbol": "ANGEL" + }, + "isSC": {} + }, + "0x31f69de127c8a0ff10819c0955490a4ae46fcc2a": { + "name": "GBYTE token contract", + "address": "0x31f69de127c8a0ff10819c0955490a4ae46fcc2a", + "token": { + "decimals": 18, + "symbol": "GBYTE" + }, + "isSC": {} + }, + "0x8848812bd31aeee33313c10a840ffc3169078c5b": { + "name": "CRFI token contract", + "address": "0x8848812bd31aeee33313c10a840ffc3169078c5b", + "token": { + "decimals": 18, + "symbol": "CRFI" + }, + "isSC": {} + }, + "0x667fd83e24ca1d935d36717d305d54fa0cac991c": { + "name": "AGS token contract", + "address": "0x667fd83e24ca1d935d36717d305d54fa0cac991c", + "token": { + "decimals": 18, + "symbol": "AGS" + }, + "isSC": {} + }, + "0x9393fdc77090f31c7db989390d43f454b1a6e7f3": { + "name": "DEC token contract", + "address": "0x9393fdc77090f31c7db989390d43f454b1a6e7f3", + "token": { + "decimals": 3, + "symbol": "DEC" + }, + "isSC": {} + }, + "0x8861cff2366c1128fd699b68304ad99a0764ef9a": { + "name": "CYC token contract", + "address": "0x8861cff2366c1128fd699b68304ad99a0764ef9a", + "token": { + "decimals": 18, + "symbol": "CYC" + }, + "isSC": {} + }, + "0xdb726152680ece3c9291f1016f1d36f3995f6941": { + "name": "MEDIA token contract", + "address": "0xdb726152680ece3c9291f1016f1d36f3995f6941", + "token": { + "decimals": 6, + "symbol": "MEDIA" + }, + "isSC": {} + }, + "0x34965f73cfa05bf8d8af37cb4af64fa950605ea8": { + "name": "COW token contract", + "address": "0x34965f73cfa05bf8d8af37cb4af64fa950605ea8", + "token": { + "decimals": 18, + "symbol": "COW" + }, + "isSC": {} + }, + "0x9ac07635ddbde5db18648c360defb00f5f22537e": { + "name": "MOCA token contract", + "address": "0x9ac07635ddbde5db18648c360defb00f5f22537e", + "token": { + "decimals": 18, + "symbol": "MOCA" + }, + "isSC": {} + }, + "0x7645ddfeeceda57e41f92679c4acd83c56a81d14": { + "name": "FLUX token contract", + "address": "0x7645ddfeeceda57e41f92679c4acd83c56a81d14", + "token": { + "decimals": 18, + "symbol": "FLUX" + }, + "isSC": {} + }, + "0xf99d58e463a2e07e5692127302c20a191861b4d6": { + "name": "ANY token contract", + "address": "0xf99d58e463a2e07e5692127302c20a191861b4d6", + "token": { + "decimals": 18, + "symbol": "ANY" + }, + "isSC": {} + }, + "0x9fda7ceec4c18008096c2fe2b85f05dc300f94d0": { + "name": "GAJ token contract", + "address": "0x9fda7ceec4c18008096c2fe2b85f05dc300f94d0", + "token": { + "decimals": 18, + "symbol": "GAJ" + }, + "isSC": {} + }, + "0xe0b0c16038845bed3fcf70304d3e167df81ce225": { + "name": "CSWAP token contract", + "address": "0xe0b0c16038845bed3fcf70304d3e167df81ce225", + "token": { + "decimals": 18, + "symbol": "CSWAP" + }, + "isSC": {} + }, + "0x939b462ee3311f8926c047d2b576c389092b1649": { + "name": "DAPP token contract", + "address": "0x939b462ee3311f8926c047d2b576c389092b1649", + "token": { + "decimals": 4, + "symbol": "DAPP" + }, + "isSC": {} + }, + "0xef3a930e1ffffacd2fc13434ac81bd278b0ecc8d": { + "name": "FIS token contract", + "address": "0xef3a930e1ffffacd2fc13434ac81bd278b0ecc8d", + "token": { + "decimals": 18, + "symbol": "FIS" + }, + "isSC": {} + }, + "0x154e35c2b0024b3e079c5c5e4fc31c979c189ccb": { + "name": "RAID token contract", + "address": "0x154e35c2b0024b3e079c5c5e4fc31c979c189ccb", + "token": { + "decimals": 18, + "symbol": "RAID" + }, + "isSC": {} + }, + "0x9d79d5b61de59d882ce90125b18f74af650acb93": { + "name": "NSBT token contract", + "address": "0x9d79d5b61de59d882ce90125b18f74af650acb93", + "token": { + "decimals": 6, + "symbol": "NSBT" + }, + "isSC": {} + }, + "0x3405a1bd46b85c5c029483fbecf2f3e611026e45": { + "name": "bios token contract", + "address": "0x3405a1bd46b85c5c029483fbecf2f3e611026e45", + "token": { + "decimals": 18, + "symbol": "bios" + }, + "isSC": {} + }, + "0x12bb890508c125661e03b09ec06e404bc9289040": { + "name": "RACA token contract", + "address": "0x12bb890508c125661e03b09ec06e404bc9289040", + "token": { + "decimals": 18, + "symbol": "RACA" + }, + "isSC": {} + }, + "0xca1262e77fb25c0a4112cfc9bad3ff54f617f2e6": { + "name": "WJXN token contract", + "address": "0xca1262e77fb25c0a4112cfc9bad3ff54f617f2e6", + "token": { + "decimals": 0, + "symbol": "WJXN" + }, + "isSC": {} + }, + "0x968f6f898a6df937fc1859b323ac2f14643e3fed": { + "name": "Numerico", + "address": "0x968f6f898a6df937fc1859b323ac2f14643e3fed", + "token": { + "decimals": 18, + "symbol": "NWC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NWC.svg" + }, + "0xfbc4f3f645c4003a2e4f4e9b51077d2daa9a9341": { + "name": "ZEDXION token contract", + "address": "0xfbc4f3f645c4003a2e4f4e9b51077d2daa9a9341", + "token": { + "decimals": 18, + "symbol": "ZEDXION" + }, + "isSC": {} + }, + "0xdb85f6685950e285b1e611037bebe5b34e2b7d78": { + "name": "ZANO token contract", + "address": "0xdb85f6685950e285b1e611037bebe5b34e2b7d78", + "token": { + "decimals": 18, + "symbol": "ZANO" + }, + "isSC": {} + }, + "0xf6719e1a8fcbb1b9c290019e37e004966a8916c9": { + "name": "PGEN token contract", + "address": "0xf6719e1a8fcbb1b9c290019e37e004966a8916c9", + "token": { + "decimals": 18, + "symbol": "PGEN" + }, + "isSC": {} + }, + "0x2fd8bc03d9e827f77fac20b5130ee98b7f80149d": { + "name": "CRB token contract", + "address": "0x2fd8bc03d9e827f77fac20b5130ee98b7f80149d", + "token": { + "decimals": 8, + "symbol": "CRB" + }, + "isSC": {} + }, + "0x65e6b60ea01668634d68d0513fe814679f925bad": { + "name": "PIXEL token contract", + "address": "0x65e6b60ea01668634d68d0513fe814679f925bad", + "token": { + "decimals": 18, + "symbol": "PIXEL" + }, + "isSC": {} + }, + "0x081131434f93063751813c619ecca9c4dc7862a3": { + "name": "DAR token contract", + "address": "0x081131434f93063751813c619ecca9c4dc7862a3", + "token": { + "decimals": 6, + "symbol": "DAR" + }, + "isSC": {} + }, + "0xac57de9c1a09fec648e93eb98875b212db0d460b": { + "name": "BABYDOGE token contract", + "address": "0xac57de9c1a09fec648e93eb98875b212db0d460b", + "token": { + "decimals": 9, + "symbol": "BABYDOGE" + }, + "isSC": {} + }, + "0x55af5865807b196bd0197e0902746f31fbccfa58": { + "name": "BOO token contract", + "address": "0x55af5865807b196bd0197e0902746f31fbccfa58", + "token": { + "decimals": 18, + "symbol": "BOO" + }, + "isSC": {} + }, + "0x9fb83c0635de2e815fd1c21b3a292277540c2e8d": { + "name": "BUSD token contract", + "address": "0x9fb83c0635de2e815fd1c21b3a292277540c2e8d", + "token": { + "decimals": 18, + "symbol": "BUSD" + }, + "isSC": {} + }, + "0x0343131c0257ac21ea5a8dc83841f071efd9285c": { + "name": "ZENITH token contract", + "address": "0x0343131c0257ac21ea5a8dc83841f071efd9285c", + "token": { + "decimals": 18, + "symbol": "ZENITH" + }, + "isSC": {} + }, + "0xd8c1232fcd219286e341271385bd70601503b3d7": { + "name": "DOGIRA token contract", + "address": "0xd8c1232fcd219286e341271385bd70601503b3d7", + "token": { + "decimals": 9, + "symbol": "DOGIRA" + }, + "isSC": {} + }, + "0xb6dd77fd132dcaa10f1858734e838a0fa7431580": { + "name": "FCP token contract", + "address": "0xb6dd77fd132dcaa10f1858734e838a0fa7431580", + "token": { + "decimals": 18, + "symbol": "FCP" + }, + "isSC": {} + }, + "0x93e32efafd24973d45f363a76d73ccb9edf59986": { + "name": "BTL token contract", + "address": "0x93e32efafd24973d45f363a76d73ccb9edf59986", + "token": { + "decimals": 6, + "symbol": "BTL" + }, + "isSC": {} + }, + "0x42baf1f659d765c65ade5bb7e08eb2c680360d9d": { + "name": "COPI token contract", + "address": "0x42baf1f659d765c65ade5bb7e08eb2c680360d9d", + "token": { + "decimals": 18, + "symbol": "COPI" + }, + "isSC": {} + }, + "0xe1590a6fa0cff9c960181cb77d8a873601772f64": { + "name": "WSB token contract", + "address": "0xe1590a6fa0cff9c960181cb77d8a873601772f64", + "token": { + "decimals": 18, + "symbol": "WSB" + }, + "isSC": {} + }, + "0xdf09a216fac5adc3e640db418c0b956076509503": { + "name": "PKN token contract", + "address": "0xdf09a216fac5adc3e640db418c0b956076509503", + "token": { + "decimals": 18, + "symbol": "PKN" + }, + "isSC": {} + }, + "0x45c2f8c9b4c0bdc76200448cc26c48ab6ffef83f": { + "name": "DOMI token contract", + "address": "0x45c2f8c9b4c0bdc76200448cc26c48ab6ffef83f", + "token": { + "decimals": 18, + "symbol": "DOMI" + }, + "isSC": {} + }, + "0xa87135285ae208e22068acdbff64b11ec73eaa5a": { + "name": "LUNR token contract", + "address": "0xa87135285ae208e22068acdbff64b11ec73eaa5a", + "token": { + "decimals": 4, + "symbol": "LUNR" + }, + "isSC": {} + }, + "0x965b85d4674f64422c4898c8f8083187f02b32c0": { + "name": "SFIL token contract", + "address": "0x965b85d4674f64422c4898c8f8083187f02b32c0", + "token": { + "decimals": 8, + "symbol": "SFIL" + }, + "isSC": {} + }, + "0xa47c8bf37f92abed4a126bda807a7b7498661acd": { + "name": "UST Token - Shuttle", + "address": "0xa47c8bf37f92abed4a126bda807a7b7498661acd", + "token": { + "decimals": 18, + "symbol": "USTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ustc.svg" + }, + "0xaad483f97f13c6a20b9d05d07c397ce85c42c393": { + "name": "WOOP token contract", + "address": "0xaad483f97f13c6a20b9d05d07c397ce85c42c393", + "token": { + "decimals": 18, + "symbol": "WOOP" + }, + "isSC": {} + }, + "0xbd100d061e120b2c67a24453cf6368e63f1be056": { + "name": "IDYP token contract", + "address": "0xbd100d061e120b2c67a24453cf6368e63f1be056", + "token": { + "decimals": 18, + "symbol": "IDYP" + }, + "isSC": {} + }, + "0x77a1f4e744d810239f465043e35d067ca33de259": { + "name": "VST token contract", + "address": "0x77a1f4e744d810239f465043e35d067ca33de259", + "token": { + "decimals": 18, + "symbol": "VST" + }, + "isSC": {} + }, + "0x7118057ff0f4fd0994fb9d2d94de8231d5cca79e": { + "name": "SOURCE token contract", + "address": "0x7118057ff0f4fd0994fb9d2d94de8231d5cca79e", + "token": { + "decimals": 18, + "symbol": "SOURCE" + }, + "isSC": {} + }, + "0x9ab70e92319f0b9127df78868fd3655fb9f1e322": { + "name": "WWY token contract", + "address": "0x9ab70e92319f0b9127df78868fd3655fb9f1e322", + "token": { + "decimals": 18, + "symbol": "WWY" + }, + "isSC": {} + }, + "0x25b24b3c47918b7962b3e49c4f468367f73cc0e0": { + "name": "AXL token contract", + "address": "0x25b24b3c47918b7962b3e49c4f468367f73cc0e0", + "token": { + "decimals": 18, + "symbol": "AXL" + }, + "isSC": {} + }, + "0xa693b19d2931d498c5b318df961919bb4aee87a5": { + "name": "UST Token", + "address": "0xa693b19d2931d498c5b318df961919bb4aee87a5", + "token": { + "decimals": 6, + "symbol": "UST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/UST.svg" + }, + "0x7c9f4c87d911613fe9ca58b579f737911aad2d43": { + "name": "MATICPO token contract", + "address": "0x7c9f4c87d911613fe9ca58b579f737911aad2d43", + "token": { + "decimals": 18, + "symbol": "MATICPO" + }, + "isSC": {} + }, + "0x845e2e8b42dced7dedcdba9bde32c9e338224f97": { + "name": "SATOZ token contract", + "address": "0x845e2e8b42dced7dedcdba9bde32c9e338224f97", + "token": { + "decimals": 8, + "symbol": "SATOZ" + }, + "isSC": {} + }, + "0x85f138bfee4ef8e540890cfb48f620571d67eda3": { + "name": "AVAX token contract", + "address": "0x85f138bfee4ef8e540890cfb48f620571d67eda3", + "token": { + "decimals": 18, + "symbol": "AVAX" + }, + "isSC": {} + }, + "0x566957ef80f9fd5526cd2bef8be67035c0b81130": { + "name": "USDCPO token contract", + "address": "0x566957ef80f9fd5526cd2bef8be67035c0b81130", + "token": { + "decimals": 6, + "symbol": "USDCPO" + }, + "isSC": {} + }, + "0x2f75113b13d136f861d212fa9b572f2c79ac81c4": { + "name": "EKTA token contract", + "address": "0x2f75113b13d136f861d212fa9b572f2c79ac81c4", + "token": { + "decimals": 18, + "symbol": "EKTA" + }, + "isSC": {} + }, + "0xc669928185dbce49d2230cc9b0979be6dc797957": { + "name": "BTT token contract", + "address": "0xc669928185dbce49d2230cc9b0979be6dc797957", + "token": { + "decimals": 18, + "symbol": "BTT" + }, + "isSC": {} + }, + "0xcc8fa225d80b9c7d42f96e9570156c65d6caaa25": { + "name": "Smooth Love Potion", + "address": "0xcc8fa225d80b9c7d42f96e9570156c65d6caaa25", + "token": { + "decimals": 0, + "symbol": "SLP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SLP.svg" + }, + "0xc4bb7277a74678f053259cb1f96140347efbfd46": { + "name": "COC token contract", + "address": "0xc4bb7277a74678f053259cb1f96140347efbfd46", + "token": { + "decimals": 18, + "symbol": "COC" + }, + "isSC": {} + }, + "0x9b17baadf0f21f03e35249e0e59723f34994f806": { + "name": "GEM token contract", + "address": "0x9b17baadf0f21f03e35249e0e59723f34994f806", + "token": { + "decimals": 18, + "symbol": "GEM" + }, + "isSC": {} + }, + "0xee9801669c6138e84bd50deb500827b776777d28": { + "name": "O3 token contract", + "address": "0xee9801669c6138e84bd50deb500827b776777d28", + "token": { + "decimals": 18, + "symbol": "O3" + }, + "isSC": {} + }, + "0x7825e833d495f3d1c28872415a4aee339d26ac88": { + "name": "WTLOS token contract", + "address": "0x7825e833d495f3d1c28872415a4aee339d26ac88", + "token": { + "decimals": 18, + "symbol": "WTLOS" + }, + "isSC": {} + }, + "0x2217e5921b7edfb4bb193a6228459974010d2198": { + "name": "QMALL token contract", + "address": "0x2217e5921b7edfb4bb193a6228459974010d2198", + "token": { + "decimals": 18, + "symbol": "QMALL" + }, + "isSC": {} + }, + "0xd3c51de3e6dd9b53d7f37699afb3ee3bf9b9b3f4": { + "name": "MCONTENT token contract", + "address": "0xd3c51de3e6dd9b53d7f37699afb3ee3bf9b9b3f4", + "token": { + "decimals": 6, + "symbol": "MCONTENT" + }, + "isSC": {} + }, + "0x1f36fb2d91d9951cf58ae4c1956c0b77e224f1e9": { + "name": "VCG token contract", + "address": "0x1f36fb2d91d9951cf58ae4c1956c0b77e224f1e9", + "token": { + "decimals": 18, + "symbol": "VCG" + }, + "isSC": {} + }, + "0xe580074a10360404af3abfe2d524d5806d993ea3": { + "name": "PAY token contract", + "address": "0xe580074a10360404af3abfe2d524d5806d993ea3", + "token": { + "decimals": 18, + "symbol": "PAY" + }, + "isSC": {} + }, + "0x22c5543d1a35178cb03b33f929a959145e538532": { + "name": "WAL token contract", + "address": "0x22c5543d1a35178cb03b33f929a959145e538532", + "token": { + "decimals": 18, + "symbol": "WAL" + }, + "isSC": {} + }, + "0x20d60c6eb195868d4643f2c9b0809e4de6cc003d": { + "name": "PLY token contract", + "address": "0x20d60c6eb195868d4643f2c9b0809e4de6cc003d", + "token": { + "decimals": 6, + "symbol": "PLY" + }, + "isSC": {} + }, + "0x809e130e10e787139c54e1d12d3d1971b7a675bf": { + "name": "MTD token contract", + "address": "0x809e130e10e787139c54e1d12d3d1971b7a675bf", + "token": { + "decimals": 18, + "symbol": "MTD" + }, + "isSC": {} + }, + "0x1ab43204a195a0fd37edec621482afd3792ef90b": { + "name": "PLY token contract", + "address": "0x1ab43204a195a0fd37edec621482afd3792ef90b", + "token": { + "decimals": 18, + "symbol": "PLY" + }, + "isSC": {} + }, + "0xf655c8567e0f213e6c634cd2a68d992152161dc6": { + "name": "IBEX token contract", + "address": "0xf655c8567e0f213e6c634cd2a68d992152161dc6", + "token": { + "decimals": 18, + "symbol": "IBEX" + }, + "isSC": {} + }, + "0x19193f450086d0442157b852081976d41657ad56": { + "name": "NNT token contract", + "address": "0x19193f450086d0442157b852081976d41657ad56", + "token": { + "decimals": 18, + "symbol": "NNT" + }, + "isSC": {} + }, + "0xc17c30e98541188614df99239cabd40280810ca3": { + "name": "RISE token contract", + "address": "0xc17c30e98541188614df99239cabd40280810ca3", + "token": { + "decimals": 18, + "symbol": "RISE" + }, + "isSC": {} + }, + "0x32462ba310e447ef34ff0d15bce8613aa8c4a244": { + "name": "DHN token contract", + "address": "0x32462ba310e447ef34ff0d15bce8613aa8c4a244", + "token": { + "decimals": 18, + "symbol": "DHN" + }, + "isSC": {} + }, + "0x198d14f2ad9ce69e76ea330b374de4957c3f850a": { + "name": "NFT token contract", + "address": "0x198d14f2ad9ce69e76ea330b374de4957c3f850a", + "token": { + "decimals": 6, + "symbol": "NFT" + }, + "isSC": {} + }, + "0x16b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd": { + "name": "SMBR token contract", + "address": "0x16b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd", + "token": { + "decimals": 9, + "symbol": "SMBR" + }, + "isSC": {} + }, + "0x446f2a8a39cc730ef378be759a3c57f1a3fe824c": { + "name": "NBT token contract", + "address": "0x446f2a8a39cc730ef378be759a3c57f1a3fe824c", + "token": { + "decimals": 18, + "symbol": "NBT" + }, + "isSC": {} + }, + "0x420a24c9c65bd44c48bfb1cc8d6cd1ea8b1ac840": { + "name": "JMPT token contract", + "address": "0x420a24c9c65bd44c48bfb1cc8d6cd1ea8b1ac840", + "token": { + "decimals": 18, + "symbol": "JMPT" + }, + "isSC": {} + }, + "0x4550003152f12014558e5ce025707e4dd841100f": { + "name": "KZEN token contract", + "address": "0x4550003152f12014558e5ce025707e4dd841100f", + "token": { + "decimals": 18, + "symbol": "KZEN" + }, + "isSC": {} + }, + "0x0c10bf8fcb7bf5412187a595ab97a3609160b5c6": { + "name": "Decentralized USD", + "address": "0x0c10bf8fcb7bf5412187a595ab97a3609160b5c6", + "token": { + "decimals": 18, + "symbol": "USDD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/USDD.svg" + }, + "0xb5be7557fe8f69a2b5707d25fa0aee80dfda512e": { + "name": "PS1 token contract", + "address": "0xb5be7557fe8f69a2b5707d25fa0aee80dfda512e", + "token": { + "decimals": 18, + "symbol": "PS1" + }, + "isSC": {} + }, + "0xf6e06b54855eff198a2d9a8686113665499a6134": { + "name": "CELT token contract", + "address": "0xf6e06b54855eff198a2d9a8686113665499a6134", + "token": { + "decimals": 18, + "symbol": "CELT" + }, + "isSC": {} + }, + "0x9767203e89dcd34851240b3919d4900d3e5069f1": { + "name": "A4 token contract", + "address": "0x9767203e89dcd34851240b3919d4900d3e5069f1", + "token": { + "decimals": 6, + "symbol": "A4" + }, + "isSC": {} + }, + "0x70bc0dc6414eb8974bc70685f798838a87d8cce4": { + "name": "CHRP token contract", + "address": "0x70bc0dc6414eb8974bc70685f798838a87d8cce4", + "token": { + "decimals": 18, + "symbol": "CHRP" + }, + "isSC": {} + }, + "0xbc0899e527007f1b8ced694508fcb7a2b9a46f53": { + "name": "BSKT token contract", + "address": "0xbc0899e527007f1b8ced694508fcb7a2b9a46f53", + "token": { + "decimals": 18, + "symbol": "BSKT" + }, + "isSC": {} + }, + "0xb92ba0a6a843379499770de82aa936d6ba0fd8ca": { + "name": "YOU token contract", + "address": "0xb92ba0a6a843379499770de82aa936d6ba0fd8ca", + "token": { + "decimals": 18, + "symbol": "YOU" + }, + "isSC": {} + }, + "0xd3c325848d7c6e29b574cb0789998b2ff901f17e": { + "name": "1ART token contract", + "address": "0xd3c325848d7c6e29b574cb0789998b2ff901f17e", + "token": { + "decimals": 18, + "symbol": "1ART" + }, + "isSC": {} + }, + "0x6c249b6f6492864d914361308601a7abb32e68f8": { + "name": "DUA token contract", + "address": "0x6c249b6f6492864d914361308601a7abb32e68f8", + "token": { + "decimals": 18, + "symbol": "DUA" + }, + "isSC": {} + }, + "0xaef420fd77477d9dc8b46d704d44dd09d6c27866": { + "name": "CGV token contract", + "address": "0xaef420fd77477d9dc8b46d704d44dd09d6c27866", + "token": { + "decimals": 6, + "symbol": "CGV" + }, + "isSC": {} + }, + "0x50327c6c5a14dcade707abad2e27eb517df87ab5": { + "name": "WTRX token contract", + "address": "0x50327c6c5a14dcade707abad2e27eb517df87ab5", + "token": { + "decimals": 6, + "symbol": "WTRX" + }, + "isSC": {} + }, + "0x983d8edb44ca96c0595f3c456ebdd47855911f34": { + "name": "WAR token contract", + "address": "0x983d8edb44ca96c0595f3c456ebdd47855911f34", + "token": { + "decimals": 18, + "symbol": "WAR" + }, + "isSC": {} + }, + "0x967fb0d760ed3ce53afe2f0a071674cccae73550": { + "name": "XETA token contract", + "address": "0x967fb0d760ed3ce53afe2f0a071674cccae73550", + "token": { + "decimals": 18, + "symbol": "XETA" + }, + "isSC": {} + }, + "0xdd13dedecebda566322195bc4451d672a148752c": { + "name": "PRIMAL token contract", + "address": "0xdd13dedecebda566322195bc4451d672a148752c", + "token": { + "decimals": 18, + "symbol": "PRIMAL" + }, + "isSC": {} + }, + "0x560363bda52bc6a44ca6c8c9b4a5fadbda32fa60": { + "name": "SFUND token contract", + "address": "0x560363bda52bc6a44ca6c8c9b4a5fadbda32fa60", + "token": { + "decimals": 18, + "symbol": "SFUND" + }, + "isSC": {} + }, + "0x69c2fcae7e30b429166bd616a322e32bec036bcf": { + "name": "MURATIAI token contract", + "address": "0x69c2fcae7e30b429166bd616a322e32bec036bcf", + "token": { + "decimals": 18, + "symbol": "MURATIAI" + }, + "isSC": {} + }, + "0xae788f80f2756a86aa2f410c651f2af83639b95b": { + "name": "MV token contract", + "address": "0xae788f80f2756a86aa2f410c651f2af83639b95b", + "token": { + "decimals": 18, + "symbol": "MV" + }, + "isSC": {} + }, + "0x1416946162b1c2c871a73b07e932d2fb6c932069": { + "name": "Energi", + "address": "0x1416946162b1c2c871a73b07e932d2fb6c932069", + "token": { + "decimals": 18, + "symbol": "NRG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/energi.svg" + }, + "0xb990d93c308a31c737aa91839e8ba8eaf4017d7a": { + "name": "PIRATE token contract", + "address": "0xb990d93c308a31c737aa91839e8ba8eaf4017d7a", + "token": { + "decimals": 8, + "symbol": "PIRATE" + }, + "isSC": {} + }, + "0x5f1f11a3dd7a0c39da1baa3c7b8585b52a77f435": { + "name": "ASAN token contract", + "address": "0x5f1f11a3dd7a0c39da1baa3c7b8585b52a77f435", + "token": { + "decimals": 18, + "symbol": "ASAN" + }, + "isSC": {} + }, + "0x9b25889c493ae6df34ceef1ecb10d77c1ba73318": { + "name": "MEAN token contract", + "address": "0x9b25889c493ae6df34ceef1ecb10d77c1ba73318", + "token": { + "decimals": 6, + "symbol": "MEAN" + }, + "isSC": {} + }, + "0xf3a3023e6dede84ad88a656a3269f2a36e83c9a9": { + "name": "SHARBI token contract", + "address": "0xf3a3023e6dede84ad88a656a3269f2a36e83c9a9", + "token": { + "decimals": 9, + "symbol": "SHARBI" + }, + "isSC": {} + }, + "0x9f826324bb9bdcf7e7eb274bedc417bd45d74f39": { + "name": "MILKAI token contract", + "address": "0x9f826324bb9bdcf7e7eb274bedc417bd45d74f39", + "token": { + "decimals": 8, + "symbol": "MILKAI" + }, + "isSC": {} + }, + "0x83d6c8c06ac276465e4c92e7ac8c23740f435140": { + "name": "HMX token contract", + "address": "0x83d6c8c06ac276465e4c92e7ac8c23740f435140", + "token": { + "decimals": 18, + "symbol": "HMX" + }, + "isSC": {} + }, + "0x5b52bfb8062ce664d74bbcd4cd6dc7df53fd7233": { + "name": "ZENIQ token contract", + "address": "0x5b52bfb8062ce664d74bbcd4cd6dc7df53fd7233", + "token": { + "decimals": 18, + "symbol": "ZENIQ" + }, + "isSC": {} + }, + "0x9348e94a447bf8b2ec11f374d3f055fd47d936df": { + "name": "FLAG token contract", + "address": "0x9348e94a447bf8b2ec11f374d3f055fd47d936df", + "token": { + "decimals": 18, + "symbol": "FLAG" + }, + "isSC": {} + }, + "0xc3589f56b6869824804a5ea29f2c9886af1b0fce": { + "name": "HNY token contract", + "address": "0xc3589f56b6869824804a5ea29f2c9886af1b0fce", + "token": { + "decimals": 18, + "symbol": "HNY" + }, + "isSC": {} + }, + "0xdb0170e2d0c1cc1b2e7a90313d9b9afa4f250289": { + "name": "ADAPAD token contract", + "address": "0xdb0170e2d0c1cc1b2e7a90313d9b9afa4f250289", + "token": { + "decimals": 18, + "symbol": "ADAPAD" + }, + "isSC": {} + }, + "0x43044f861ec040db59a7e324c40507addb673142": { + "name": "CAP token contract", + "address": "0x43044f861ec040db59a7e324c40507addb673142", + "token": { + "decimals": 18, + "symbol": "CAP" + }, + "isSC": {} + }, + "0xc2708a3a4ba7f64bddc1a49f92f941bc77cad23a": { + "name": "EGG token contract", + "address": "0xc2708a3a4ba7f64bddc1a49f92f941bc77cad23a", + "token": { + "decimals": 18, + "symbol": "EGG" + }, + "isSC": {} + }, + "0x8bbf1dccbedd5c70d8e793d432fb56b848dd1698": { + "name": "APEIN token contract", + "address": "0x8bbf1dccbedd5c70d8e793d432fb56b848dd1698", + "token": { + "decimals": 18, + "symbol": "APEIN" + }, + "isSC": {} + }, + "0xb8e3bb633f7276cc17735d86154e0ad5ec9928c0": { + "name": "VLXPAD token contract", + "address": "0xb8e3bb633f7276cc17735d86154e0ad5ec9928c0", + "token": { + "decimals": 18, + "symbol": "VLXPAD" + }, + "isSC": {} + }, + "0x16ba8efe847ebdfef99d399902ec29397d403c30": { + "name": "OH token contract", + "address": "0x16ba8efe847ebdfef99d399902ec29397d403c30", + "token": { + "decimals": 18, + "symbol": "OH" + }, + "isSC": {} + }, + "0xd373576a9e738f37dc6882328358ff69c4caf4c6": { + "name": "ZAM token contract", + "address": "0xd373576a9e738f37dc6882328358ff69c4caf4c6", + "token": { + "decimals": 18, + "symbol": "ZAM" + }, + "isSC": {} + }, + "0xe57425f1598f9b0d6219706b77f4b3da573a3695": { + "name": "BTCBR token contract", + "address": "0xe57425f1598f9b0d6219706b77f4b3da573a3695", + "token": { + "decimals": 18, + "symbol": "BTCBR" + }, + "isSC": {} + }, + "0xd2ba23de8a19316a638dc1e7a9adda1d74233368": { + "name": "QuickSwap", + "address": "0xd2ba23de8a19316a638dc1e7a9adda1d74233368", + "token": { + "decimals": 18, + "symbol": "QUICK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/QS.svg" + }, + "0xfceb206e1a80527908521121358b5e26caabaa75": { + "name": "MAIN token contract", + "address": "0xfceb206e1a80527908521121358b5e26caabaa75", + "token": { + "decimals": 18, + "symbol": "MAIN" + }, + "isSC": {} + }, + "0x614d7f40701132e25fe6fc17801fbd34212d2eda": { + "name": "BLAST token contract", + "address": "0x614d7f40701132e25fe6fc17801fbd34212d2eda", + "token": { + "decimals": 9, + "symbol": "BLAST" + }, + "isSC": {} + }, + "0x8fc8f8269ebca376d046ce292dc7eac40c8d358a": { + "name": "DFI token contract", + "address": "0x8fc8f8269ebca376d046ce292dc7eac40c8d358a", + "token": { + "decimals": 8, + "symbol": "DFI" + }, + "isSC": {} + }, + "0x7a5d3a9dcd33cb8d527f7b5f96eb4fef43d55636": { + "name": "RADIO token contract", + "address": "0x7a5d3a9dcd33cb8d527f7b5f96eb4fef43d55636", + "token": { + "decimals": 18, + "symbol": "RADIO" + }, + "isSC": {} + }, + "0x26dcfbfa8bc267b250432c01c982eaf81cc5480c": { + "name": "ANKRMATIC token contract", + "address": "0x26dcfbfa8bc267b250432c01c982eaf81cc5480c", + "token": { + "decimals": 18, + "symbol": "ANKRMATIC" + }, + "isSC": {} + }, + "0xafcdd4f666c84fed1d8bd825aa762e3714f652c9": { + "name": "VINU token contract", + "address": "0xafcdd4f666c84fed1d8bd825aa762e3714f652c9", + "token": { + "decimals": 18, + "symbol": "VINU" + }, + "isSC": {} + }, + "0x9e6b19874e97fe8e8cad77f2c0ab5e7a693e5dbf": { + "name": "ISHND token contract", + "address": "0x9e6b19874e97fe8e8cad77f2c0ab5e7a693e5dbf", + "token": { + "decimals": 18, + "symbol": "ISHND" + }, + "isSC": {} + }, + "0x5f018e73c185ab23647c82bd039e762813877f0e": { + "name": "SHACK token contract", + "address": "0x5f018e73c185ab23647c82bd039e762813877f0e", + "token": { + "decimals": 18, + "symbol": "SHACK" + }, + "isSC": {} + }, + "0x40fed5691e547885cabd7a2990de719dcc8497fc": { + "name": "SHA token contract", + "address": "0x40fed5691e547885cabd7a2990de719dcc8497fc", + "token": { + "decimals": 18, + "symbol": "SHA" + }, + "isSC": {} + }, + "0x18a1ea69a50a85752b7bc204a2c45a95ce6e429d": { + "name": "SPICE token contract", + "address": "0x18a1ea69a50a85752b7bc204a2c45a95ce6e429d", + "token": { + "decimals": 18, + "symbol": "SPICE" + }, + "isSC": {} + }, + "0x57d579f483854c62fef850b8a5332b0d8424b7e2": { + "name": "OPENX token contract", + "address": "0x57d579f483854c62fef850b8a5332b0d8424b7e2", + "token": { + "decimals": 18, + "symbol": "OPENX" + }, + "isSC": {} + }, + "0x80cd73badb406ea36b9a7cdeb8df06aefa7e12d9": { + "name": "SLEEPEE token contract", + "address": "0x80cd73badb406ea36b9a7cdeb8df06aefa7e12d9", + "token": { + "decimals": 18, + "symbol": "SLEEPEE" + }, + "isSC": {} + }, + "0x93581991f68dbae1ea105233b67f7fa0d6bdee7b": { + "name": "EVMOS token contract", + "address": "0x93581991f68dbae1ea105233b67f7fa0d6bdee7b", + "token": { + "decimals": 18, + "symbol": "EVMOS" + }, + "isSC": {} + }, + "0x4c3a8eceb656ec63eae80a4ebd565e4887db6160": { + "name": "SOKU token contract", + "address": "0x4c3a8eceb656ec63eae80a4ebd565e4887db6160", + "token": { + "decimals": 18, + "symbol": "SOKU" + }, + "isSC": {} + }, + "0x88536c9b2c4701b8db824e6a16829d5b5eb84440": { + "name": "USV token contract", + "address": "0x88536c9b2c4701b8db824e6a16829d5b5eb84440", + "token": { + "decimals": 9, + "symbol": "USV" + }, + "isSC": {} + }, + "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee": { + "name": "ELK token contract", + "address": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", + "token": { + "decimals": 18, + "symbol": "ELK" + }, + "isSC": {} + }, + "0x2e7b0d4f9b2eaf782ed3d160e3a0a4b1a7930ada": { + "name": "CERES token contract", + "address": "0x2e7b0d4f9b2eaf782ed3d160e3a0a4b1a7930ada", + "token": { + "decimals": 18, + "symbol": "CERES" + }, + "isSC": {} + }, + "0x4e568ab95f029e8df1e39b30c9d6d076eaa15945": { + "name": "FLY token contract", + "address": "0x4e568ab95f029e8df1e39b30c9d6d076eaa15945", + "token": { + "decimals": 18, + "symbol": "FLY" + }, + "isSC": {} + }, + "0xc72633f995e98ac3bb8a89e6a9c4af335c3d6e44": { + "name": "OSEA token contract", + "address": "0xc72633f995e98ac3bb8a89e6a9c4af335c3d6e44", + "token": { + "decimals": 18, + "symbol": "OSEA" + }, + "isSC": {} + }, + "0x2b867efd2de4ad2b583ca0cb3df9c4040ef4d329": { + "name": "LBLOCK token contract", + "address": "0x2b867efd2de4ad2b583ca0cb3df9c4040ef4d329", + "token": { + "decimals": 9, + "symbol": "LBLOCK" + }, + "isSC": {} + }, + "0xe3c408bd53c31c085a1746af401a4042954ff740": { + "name": "GMT token contract", + "address": "0xe3c408bd53c31c085a1746af401a4042954ff740", + "token": { + "decimals": 8, + "symbol": "GMT" + }, + "isSC": {} + }, + "0x2c4f1df9c7de0c59778936c9b145ff56813f3295": { + "name": "MNTL token contract", + "address": "0x2c4f1df9c7de0c59778936c9b145ff56813f3295", + "token": { + "decimals": 6, + "symbol": "MNTL" + }, + "isSC": {} + }, + "0x57b59f981730c6257df57cf6f0d98283749a9eeb": { + "name": "BUILD token contract", + "address": "0x57b59f981730c6257df57cf6f0d98283749a9eeb", + "token": { + "decimals": 18, + "symbol": "BUILD" + }, + "isSC": {} + }, + "0xde16ce60804a881e9f8c4ebb3824646edecd478d": { + "name": "MagicCraft", + "address": "0xde16ce60804a881e9f8c4ebb3824646edecd478d", + "token": { + "decimals": 9, + "symbol": "MCRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/magiccraft.svg" + }, + "0x839e71613f9aa06e5701cf6de63e303616b0dde3": { + "name": "VVS token contract", + "address": "0x839e71613f9aa06e5701cf6de63e303616b0dde3", + "token": { + "decimals": 18, + "symbol": "VVS" + }, + "isSC": {} + }, + "0x8616e8ea83f048ab9a5ec513c9412dd2993bce3f": { + "name": "FXUSD token contract", + "address": "0x8616e8ea83f048ab9a5ec513c9412dd2993bce3f", + "token": { + "decimals": 18, + "symbol": "FXUSD" + }, + "isSC": {} + }, + "0x256d1fce1b1221e8398f65f9b36033ce50b2d497": { + "name": "WALV token contract", + "address": "0x256d1fce1b1221e8398f65f9b36033ce50b2d497", + "token": { + "decimals": 18, + "symbol": "WALV" + }, + "isSC": {} + }, + "0xb28f803a8772e6584a65ab6dfc535ae6fef8a0b2": { + "name": "LFI token contract", + "address": "0xb28f803a8772e6584a65ab6dfc535ae6fef8a0b2", + "token": { + "decimals": 18, + "symbol": "LFI" + }, + "isSC": {} + }, + "0xc285b7e09a4584d027e5bc36571785b515898246": { + "name": "CUSD token contract", + "address": "0xc285b7e09a4584d027e5bc36571785b515898246", + "token": { + "decimals": 18, + "symbol": "CUSD" + }, + "isSC": {} + }, + "0x2f32b39023da7d6a6486a85d12b346eb9c2a0d19": { + "name": "FER token contract", + "address": "0x2f32b39023da7d6a6486a85d12b346eb9c2a0d19", + "token": { + "decimals": 18, + "symbol": "FER" + }, + "isSC": {} + }, + "0xaeeb517e65501bcd72399d639a5d993661efeb68": { + "name": "INTD token contract", + "address": "0xaeeb517e65501bcd72399d639a5d993661efeb68", + "token": { + "decimals": 18, + "symbol": "INTD" + }, + "isSC": {} + }, + "0x8d6cebd76f18e1558d4db88138e2defb3909fad6": { + "name": "MIMATIC token contract", + "address": "0x8d6cebd76f18e1558d4db88138e2defb3909fad6", + "token": { + "decimals": 18, + "symbol": "MIMATIC" + }, + "isSC": {} + }, + "0x97bbbc5d96875fb78d2f14b7ff8d7a3a74106f17": { + "name": "ASTRAFER token contract", + "address": "0x97bbbc5d96875fb78d2f14b7ff8d7a3a74106f17", + "token": { + "decimals": 18, + "symbol": "ASTRAFER" + }, + "isSC": {} + }, + "0xb0b195aefa3650a6908f15cdac7d92f8a5791b0b": { + "name": "BOB token contract", + "address": "0xb0b195aefa3650a6908f15cdac7d92f8a5791b0b", + "token": { + "decimals": 18, + "symbol": "BOB" + }, + "isSC": {} + }, + "0xa719cb79af39a9c10eda2755e0938bce35e9de24": { + "name": "SEAN token contract", + "address": "0xa719cb79af39a9c10eda2755e0938bce35e9de24", + "token": { + "decimals": 18, + "symbol": "SEAN" + }, + "isSC": {} + }, + "0x3b79a28264fc52c7b4cea90558aa0b162f7faf57": { + "name": "WMEMO token contract", + "address": "0x3b79a28264fc52c7b4cea90558aa0b162f7faf57", + "token": { + "decimals": 18, + "symbol": "WMEMO" + }, + "isSC": {} + }, + "0x19b22dbadc298c359a1d1b59e35f352a2b40e33c": { + "name": "TXPT token contract", + "address": "0x19b22dbadc298c359a1d1b59e35f352a2b40e33c", + "token": { + "decimals": 18, + "symbol": "TXPT" + }, + "isSC": {} + }, + "0xe4a6f23fb9e00fca037aa0ea0a6954de0a6c53bf": { + "name": "TXAU token contract", + "address": "0xe4a6f23fb9e00fca037aa0ea0a6954de0a6c53bf", + "token": { + "decimals": 18, + "symbol": "TXAU" + }, + "isSC": {} + }, + "0x34abce75d2f8f33940c721dca0f562617787bff3": { + "name": "TXAG token contract", + "address": "0x34abce75d2f8f33940c721dca0f562617787bff3", + "token": { + "decimals": 18, + "symbol": "TXAG" + }, + "isSC": {} + }, + "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619": { + "name": "WETH token contract", + "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "isSC": {} + }, + "0x2791bca1f2de4661ed88a30c99a7a9449aa84174": { + "name": "USDC.e token contract", + "address": "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", + "token": { + "decimals": 6, + "symbol": "USDC.e" + }, + "isSC": {} + }, + "0xc2132d05d31c914a87c6611c10748aeb04b58e8f": { + "name": "USDT token contract", + "address": "0xc2132d05d31c914a87c6611c10748aeb04b58e8f", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063": { + "name": "DAI token contract", + "address": "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39": { + "name": "LINK token contract", + "address": "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {} + }, + "0xd6df932a45c0f255f85145f286ea0b292b21c90b": { + "name": "AAVE token contract", + "address": "0xd6df932a45c0f255f85145f286ea0b292b21c90b", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0x8cc8538d60901d19692f5ba22684732bc28f54a3": { + "name": "ETH token contract", + "address": "0x8cc8538d60901d19692f5ba22684732bc28f54a3", + "token": { + "decimals": 18, + "symbol": "ETH" + }, + "isSC": {} + }, + "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359": { + "name": "USDC token contract", + "address": "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x84000b263080bc37d1dd73a29d92794a6cf1564e": { + "name": "DAI token contract", + "address": "0x84000b263080bc37d1dd73a29d92794a6cf1564e", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6": { + "name": "WBTC token contract", + "address": "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6", + "token": { + "decimals": 8, + "symbol": "WBTC" + }, + "isSC": {} + }, + "0xb33eaad8d922b1083446dc23f610c2567fb5180f": { + "name": "UNI token contract", + "address": "0xb33eaad8d922b1083446dc23f610c2567fb5180f", + "token": { + "decimals": 18, + "symbol": "UNI" + }, + "isSC": {} + }, + "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a": { + "name": "SUSHI token contract", + "address": "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {} + }, + "0x831753dd7087cac61ab5644b308642cc1c33dc13": { + "name": "QUICK token contract", + "address": "0x831753dd7087cac61ab5644b308642cc1c33dc13", + "token": { + "decimals": 18, + "symbol": "QUICK" + }, + "isSC": {} + }, + "0xb5c064f955d8e7f38fe0460c556a72987494ee17": { + "name": "QUICK token contract", + "address": "0xb5c064f955d8e7f38fe0460c556a72987494ee17", + "token": { + "decimals": 18, + "symbol": "QUICK" + }, + "isSC": {} + }, + "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7": { + "name": "GHST token contract", + "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", + "token": { + "decimals": 18, + "symbol": "GHST" + }, + "isSC": {} + }, + "0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32": { + "name": "TEL token contract", + "address": "0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32", + "token": { + "decimals": 2, + "symbol": "TEL" + }, + "isSC": {} + }, + "0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3": { + "name": "BAL token contract", + "address": "0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3", + "token": { + "decimals": 18, + "symbol": "BAL" + }, + "isSC": {} + }, + "0x6ddb31002abc64e1479fc439692f7ea061e78165": { + "name": "COMBO token contract", + "address": "0x6ddb31002abc64e1479fc439692f7ea061e78165", + "token": { + "decimals": 18, + "symbol": "COMBO" + }, + "isSC": {} + }, + "0xdab529f40e671a1d4bf91361c21bf9f0c9712ab7": { + "name": "BUSD token contract", + "address": "0xdab529f40e671a1d4bf91361c21bf9f0c9712ab7", + "token": { + "decimals": 18, + "symbol": "BUSD" + }, + "isSC": {} + }, + "0xf6a09deadf5a10aa7822d95e3228b2315de8f6fa": { + "name": "MM token contract", + "address": "0xf6a09deadf5a10aa7822d95e3228b2315de8f6fa", + "token": { + "decimals": 8, + "symbol": "MM" + }, + "isSC": {} + }, + "0x70c006878a5a50ed185ac4c87d837633923de296": { + "name": "REVV token contract", + "address": "0x70c006878a5a50ed185ac4c87d837633923de296", + "token": { + "decimals": 18, + "symbol": "REVV" + }, + "isSC": {} + }, + "0xc6c855ad634dcdad23e64da71ba85b8c51e5ad7c": { + "name": "ICE token contract", + "address": "0xc6c855ad634dcdad23e64da71ba85b8c51e5ad7c", + "token": { + "decimals": 18, + "symbol": "ICE" + }, + "isSC": {} + }, + "0x8d1566569d5b695d44a9a234540f68d393cdc40d": { + "name": "GAME token contract", + "address": "0x8d1566569d5b695d44a9a234540f68d393cdc40d", + "token": { + "decimals": 18, + "symbol": "GAME" + }, + "isSC": {} + }, + "0x59b5654a17ac44f3068b3882f298881433bb07ef": { + "name": "CHP token contract", + "address": "0x59b5654a17ac44f3068b3882f298881433bb07ef", + "token": { + "decimals": 18, + "symbol": "CHP" + }, + "isSC": {} + }, + "0x955ce23f20217a6aa205620b40ede4c9e83d325f": { + "name": "DMR token contract", + "address": "0x955ce23f20217a6aa205620b40ede4c9e83d325f", + "token": { + "decimals": 18, + "symbol": "DMR" + }, + "isSC": {} + }, + "0x086373fad3447f7f86252fb59d56107e9e0faafa": { + "name": "YUP token contract", + "address": "0x086373fad3447f7f86252fb59d56107e9e0faafa", + "token": { + "decimals": 18, + "symbol": "YUP" + }, + "isSC": {} + }, + "0x7c28f627ea3aec8b882b51eb1935f66e5b875714": { + "name": "PAINT token contract", + "address": "0x7c28f627ea3aec8b882b51eb1935f66e5b875714", + "token": { + "decimals": 18, + "symbol": "PAINT" + }, + "isSC": {} + }, + "0xba3cb8329d442e6f9eb70fafe1e214251df3d275": { + "name": "SWASH token contract", + "address": "0xba3cb8329d442e6f9eb70fafe1e214251df3d275", + "token": { + "decimals": 18, + "symbol": "SWASH" + }, + "isSC": {} + }, + "0xa78da5d9f0c488c51b9712434f0498cbb7bff23d": { + "name": "ANGEL token contract", + "address": "0xa78da5d9f0c488c51b9712434f0498cbb7bff23d", + "token": { + "decimals": 18, + "symbol": "ANGEL" + }, + "isSC": {} + }, + "0x11928cfcbc0398b9206c6d57ff7d8201555d6773": { + "name": "EXS token contract", + "address": "0x11928cfcbc0398b9206c6d57ff7d8201555d6773", + "token": { + "decimals": 18, + "symbol": "EXS" + }, + "isSC": {} + }, + "0x0bd820ad2d7ab7305b5c9538ba824c9b9beb0561": { + "name": "ROYA token contract", + "address": "0x0bd820ad2d7ab7305b5c9538ba824c9b9beb0561", + "token": { + "decimals": 18, + "symbol": "ROYA" + }, + "isSC": {} + }, + "0xadf72d32e511ee00c6e0ff5d62cd5c7c40a6adea": { + "name": "PRUF token contract", + "address": "0xadf72d32e511ee00c6e0ff5d62cd5c7c40a6adea", + "token": { + "decimals": 18, + "symbol": "PRUF" + }, + "isSC": {} + }, + "0xbcd2c5c78000504efbc1ce6489dfcac71835406a": { + "name": "WEB3 token contract", + "address": "0xbcd2c5c78000504efbc1ce6489dfcac71835406a", + "token": { + "decimals": 18, + "symbol": "WEB3" + }, + "isSC": {} + }, + "0xf7e78d9c4c74df889a83c8c8d6d05bf70ff75876": { + "name": "UDT token contract", + "address": "0xf7e78d9c4c74df889a83c8c8d6d05bf70ff75876", + "token": { + "decimals": 18, + "symbol": "UDT" + }, + "isSC": {} + }, + "0xb4a055786ee8b9c9a09156bb185eba7b91540ee5": { + "name": "AFN token contract", + "address": "0xb4a055786ee8b9c9a09156bb185eba7b91540ee5", + "token": { + "decimals": 18, + "symbol": "AFN" + }, + "isSC": {} + }, + "0xd4b42287f1ee04af246ad792153c39d62733f826": { + "name": "UCTC token contract", + "address": "0xd4b42287f1ee04af246ad792153c39d62733f826", + "token": { + "decimals": 18, + "symbol": "UCTC" + }, + "isSC": {} + }, + "0xfd5962484be2c3574d70131bf5d452ccc7c69f67": { + "name": "UCT token contract", + "address": "0xfd5962484be2c3574d70131bf5d452ccc7c69f67", + "token": { + "decimals": 18, + "symbol": "UCT" + }, + "isSC": {} + }, + "0xb9638272ad6998708de56bbc0a290a1de534a578": { + "name": "IQ token contract", + "address": "0xb9638272ad6998708de56bbc0a290a1de534a578", + "token": { + "decimals": 18, + "symbol": "IQ" + }, + "isSC": {} + }, + "0x692ac1e363ae34b6b489148152b12e2785a3d8d6": { + "name": "TRADE token contract", + "address": "0x692ac1e363ae34b6b489148152b12e2785a3d8d6", + "token": { + "decimals": 18, + "symbol": "TRADE" + }, + "isSC": {} + }, + "0x6804b07d883d0169c05233332ccf17aa956424c5": { + "name": "FLEATO token contract", + "address": "0x6804b07d883d0169c05233332ccf17aa956424c5", + "token": { + "decimals": 18, + "symbol": "FLEATO" + }, + "isSC": {} + }, + "0x891254dbb6112cf938d16c1880540b8469df6c0e": { + "name": "EFI token contract", + "address": "0x891254dbb6112cf938d16c1880540b8469df6c0e", + "token": { + "decimals": 18, + "symbol": "EFI" + }, + "isSC": {} + }, + "0xa6b37fc85d870711c56fbcb8afe2f8db049ae774": { + "name": "PLR token contract", + "address": "0xa6b37fc85d870711c56fbcb8afe2f8db049ae774", + "token": { + "decimals": 18, + "symbol": "PLR" + }, + "isSC": {} + }, + "0xeaf631ac57f3cdddd261770dd47f85066131a156": { + "name": "EQZ token contract", + "address": "0xeaf631ac57f3cdddd261770dd47f85066131a156", + "token": { + "decimals": 18, + "symbol": "EQZ" + }, + "isSC": {} + }, + "0xf4c83080e80ae530d6f8180572cbbf1ac9d5d435": { + "name": "BLANK token contract", + "address": "0xf4c83080e80ae530d6f8180572cbbf1ac9d5d435", + "token": { + "decimals": 18, + "symbol": "BLANK" + }, + "isSC": {} + }, + "0x7348565f0a5077252d310392c3cecd8db87a7704": { + "name": "CRT token contract", + "address": "0x7348565f0a5077252d310392c3cecd8db87a7704", + "token": { + "decimals": 18, + "symbol": "CRT" + }, + "isSC": {} + }, + "0xfdc26cda2d2440d0e83cd1dee8e8be48405806dc": { + "name": "BTU token contract", + "address": "0xfdc26cda2d2440d0e83cd1dee8e8be48405806dc", + "token": { + "decimals": 18, + "symbol": "BTU" + }, + "isSC": {} + }, + "0x77f0f7d657f362c4b703417b800b83b989a288a2": { + "name": "TRIPS token contract", + "address": "0x77f0f7d657f362c4b703417b800b83b989a288a2", + "token": { + "decimals": 18, + "symbol": "TRIPS" + }, + "isSC": {} + }, + "0x52ede6bba83b7b4ba1d738df0df713d6a2036b71": { + "name": "0xMR token contract", + "address": "0x52ede6bba83b7b4ba1d738df0df713d6a2036b71", + "token": { + "decimals": 18, + "symbol": "0xMR" + }, + "isSC": {} + }, + "0x1e289178612f5b6d32f692e312dcf783c74b2162": { + "name": "ISP token contract", + "address": "0x1e289178612f5b6d32f692e312dcf783c74b2162", + "token": { + "decimals": 18, + "symbol": "ISP" + }, + "isSC": {} + }, + "0xf6db73d0495fe4648d494046ccbdc5625f2740f0": { + "name": "GIST token contract", + "address": "0xf6db73d0495fe4648d494046ccbdc5625f2740f0", + "token": { + "decimals": 18, + "symbol": "GIST" + }, + "isSC": {} + }, + "0x614389eaae0a6821dc49062d56bda3d9d45fa2ff": { + "name": "ORBS token contract", + "address": "0x614389eaae0a6821dc49062d56bda3d9d45fa2ff", + "token": { + "decimals": 18, + "symbol": "ORBS" + }, + "isSC": {} + }, + "0x8a0e8b4b0903929f47c3ea30973940d4a9702067": { + "name": "INSUR token contract", + "address": "0x8a0e8b4b0903929f47c3ea30973940d4a9702067", + "token": { + "decimals": 18, + "symbol": "INSUR" + }, + "isSC": {} + }, + "0xee9a352f6aac4af1a5b9f467f6a93e0ffbe9dd35": { + "name": "MASQ token contract", + "address": "0xee9a352f6aac4af1a5b9f467f6a93e0ffbe9dd35", + "token": { + "decimals": 18, + "symbol": "MASQ" + }, + "isSC": {} + }, + "0xe8a05e85883f9663b18a38d7aa89853deaba56e3": { + "name": "VOLT token contract", + "address": "0xe8a05e85883f9663b18a38d7aa89853deaba56e3", + "token": { + "decimals": 18, + "symbol": "VOLT" + }, + "isSC": {} + }, + "0x1d5278cbd93ff50260fddc93282e2e67ca3317c9": { + "name": "PIN token contract", + "address": "0x1d5278cbd93ff50260fddc93282e2e67ca3317c9", + "token": { + "decimals": 18, + "symbol": "PIN" + }, + "isSC": {} + }, + "0x5423063af146f5abf88eb490486e6b53fa135ec9": { + "name": "CNDL token contract", + "address": "0x5423063af146f5abf88eb490486e6b53fa135ec9", + "token": { + "decimals": 18, + "symbol": "CNDL" + }, + "isSC": {} + }, + "0x2bc07124d8dac638e290f401046ad584546bc47b": { + "name": "TOWER token contract", + "address": "0x2bc07124d8dac638e290f401046ad584546bc47b", + "token": { + "decimals": 18, + "symbol": "TOWER" + }, + "isSC": {} + }, + "0x6aca77cf3bab0c4e8210a09b57b07854a995289a": { + "name": "MEED token contract", + "address": "0x6aca77cf3bab0c4e8210a09b57b07854a995289a", + "token": { + "decimals": 18, + "symbol": "MEED" + }, + "isSC": {} + }, + "0xf88332547c680f755481bf489d890426248bb275": { + "name": "SURE token contract", + "address": "0xf88332547c680f755481bf489d890426248bb275", + "token": { + "decimals": 18, + "symbol": "SURE" + }, + "isSC": {} + }, + "0x366a39a2f73de32df17cc9bdd027aa054f6ba9cb": { + "name": "DRINK token contract", + "address": "0x366a39a2f73de32df17cc9bdd027aa054f6ba9cb", + "token": { + "decimals": 18, + "symbol": "DRINK" + }, + "isSC": {} + }, + "0xe79feaaa457ad7899357e8e2065a3267ac9ee601": { + "name": "WCHI token contract", + "address": "0xe79feaaa457ad7899357e8e2065a3267ac9ee601", + "token": { + "decimals": 8, + "symbol": "WCHI" + }, + "isSC": {} + }, + "0x9611452965b63cfea2c9774e5386ab6d4f0abf16": { + "name": "IND token contract", + "address": "0x9611452965b63cfea2c9774e5386ab6d4f0abf16", + "token": { + "decimals": 18, + "symbol": "IND" + }, + "isSC": {} + }, + "0x03a68f78107d102d26353e5476733b067950bab6": { + "name": "GER token contract", + "address": "0x03a68f78107d102d26353e5476733b067950bab6", + "token": { + "decimals": 2, + "symbol": "GER" + }, + "isSC": {} + }, + "0x11a819beb0aa3327e39f52f90d65cc9bca499f33": { + "name": "SCA token contract", + "address": "0x11a819beb0aa3327e39f52f90d65cc9bca499f33", + "token": { + "decimals": 18, + "symbol": "SCA" + }, + "isSC": {} + }, + "0xd87958d9cc146abe382ee20d1ef278321e61ade9": { + "name": "MEGA token contract", + "address": "0xd87958d9cc146abe382ee20d1ef278321e61ade9", + "token": { + "decimals": 18, + "symbol": "MEGA" + }, + "isSC": {} + }, + "0x2ce13e4199443fdfff531abb30c9b6594446bbc7": { + "name": "RVF token contract", + "address": "0x2ce13e4199443fdfff531abb30c9b6594446bbc7", + "token": { + "decimals": 18, + "symbol": "RVF" + }, + "isSC": {} + }, + "0x4455ef8b4b4a007a93daa12de63a47eeac700d9d": { + "name": "KNIGHT token contract", + "address": "0x4455ef8b4b4a007a93daa12de63a47eeac700d9d", + "token": { + "decimals": 18, + "symbol": "KNIGHT" + }, + "isSC": {} + }, + "0xf9a4bbaa7fa1dd2352f1a47d6d3fcff259a6d05f": { + "name": "LEPA token contract", + "address": "0xf9a4bbaa7fa1dd2352f1a47d6d3fcff259a6d05f", + "token": { + "decimals": 18, + "symbol": "LEPA" + }, + "isSC": {} + }, + "0x42f6bdcfd82547e89f1069bf375aa60e6c6c063d": { + "name": "CIV token contract", + "address": "0x42f6bdcfd82547e89f1069bf375aa60e6c6c063d", + "token": { + "decimals": 18, + "symbol": "CIV" + }, + "isSC": {} + }, + "0x521cddc0cba84f14c69c1e99249f781aa73ee0bc": { + "name": "MOVE token contract", + "address": "0x521cddc0cba84f14c69c1e99249f781aa73ee0bc", + "token": { + "decimals": 18, + "symbol": "MOVE" + }, + "isSC": {} + }, + "0xccbe9b810d6574701d324fd6dbe0a1b68f9d5bf7": { + "name": "STACK token contract", + "address": "0xccbe9b810d6574701d324fd6dbe0a1b68f9d5bf7", + "token": { + "decimals": 18, + "symbol": "STACK" + }, + "isSC": {} + }, + "0x92a33f4017eca323f00424a36b3c52598035fc16": { + "name": "NOIIRE token contract", + "address": "0x92a33f4017eca323f00424a36b3c52598035fc16", + "token": { + "decimals": 18, + "symbol": "NOIIRE" + }, + "isSC": {} + }, + "0x51738017dc69f23deb5db8de97685cf3b7001e79": { + "name": "VAI token contract", + "address": "0x51738017dc69f23deb5db8de97685cf3b7001e79", + "token": { + "decimals": 18, + "symbol": "VAI" + }, + "isSC": {} + }, + "0xb92d60d0ecbef38dee6a125181825567fccd9dc7": { + "name": "ADB token contract", + "address": "0xb92d60d0ecbef38dee6a125181825567fccd9dc7", + "token": { + "decimals": 18, + "symbol": "ADB" + }, + "isSC": {} + }, + "0x9b9026901999e612bc396bb285e8fbe3dcc7b78e": { + "name": "SV2X token contract", + "address": "0x9b9026901999e612bc396bb285e8fbe3dcc7b78e", + "token": { + "decimals": 18, + "symbol": "SV2X" + }, + "isSC": {} + }, + "0x0d98eae620491d8f6836a39ac45e54b286fdd2d7": { + "name": "SPROCKET token contract", + "address": "0x0d98eae620491d8f6836a39ac45e54b286fdd2d7", + "token": { + "decimals": 18, + "symbol": "SPROCKET" + }, + "isSC": {} + }, + "0x546c825f0109353ab4315139e82674f0d86e39d8": { + "name": "UCD token contract", + "address": "0x546c825f0109353ab4315139e82674f0d86e39d8", + "token": { + "decimals": 18, + "symbol": "UCD" + }, + "isSC": {} + }, + "0x76b0ef26d41d55201a7d8c3437c21caef9857149": { + "name": "CLIK token contract", + "address": "0x76b0ef26d41d55201a7d8c3437c21caef9857149", + "token": { + "decimals": 18, + "symbol": "CLIK" + }, + "isSC": {} + }, + "0x41a7e62e231bad6026b82952c78fab6e61d96958": { + "name": "LC token contract", + "address": "0x41a7e62e231bad6026b82952c78fab6e61d96958", + "token": { + "decimals": 18, + "symbol": "LC" + }, + "isSC": {} + }, + "0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1": { + "name": "FORT token contract", + "address": "0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1", + "token": { + "decimals": 18, + "symbol": "FORT" + }, + "isSC": {} + }, + "0x2710ed3f5d44268dcb89f549050718aa237c8a47": { + "name": "MEMO token contract", + "address": "0x2710ed3f5d44268dcb89f549050718aa237c8a47", + "token": { + "decimals": 18, + "symbol": "MEMO" + }, + "isSC": {} + }, + "0x2c63b97ec0976e76098371f4300e7fe89f087a02": { + "name": "VNT token contract", + "address": "0x2c63b97ec0976e76098371f4300e7fe89f087a02", + "token": { + "decimals": 18, + "symbol": "VNT" + }, + "isSC": {} + }, + "0x9720d05952cd56893fc5982aaec4508d46a589cb": { + "name": "KEVIN token contract", + "address": "0x9720d05952cd56893fc5982aaec4508d46a589cb", + "token": { + "decimals": 9, + "symbol": "KEVIN" + }, + "isSC": {} + }, + "0x0a436cfe3190c141c5e910fc217e3b27d44042f3": { + "name": "HDRN token contract", + "address": "0x0a436cfe3190c141c5e910fc217e3b27d44042f3", + "token": { + "decimals": 9, + "symbol": "HDRN" + }, + "isSC": {} + }, + "0x4bf6daa0f3b2f8b338836b29f17b9e7ff0e68b53": { + "name": "MINX token contract", + "address": "0x4bf6daa0f3b2f8b338836b29f17b9e7ff0e68b53", + "token": { + "decimals": 6, + "symbol": "MINX" + }, + "isSC": {} + }, + "0xb22ecdfe16bef29ce48a63cde0add3e8b536d122": { + "name": "THUG token contract", + "address": "0xb22ecdfe16bef29ce48a63cde0add3e8b536d122", + "token": { + "decimals": 18, + "symbol": "THUG" + }, + "isSC": {} + }, + "0x91f0484f9b65dc5187e414dae5ed37ea7a4b8af4": { + "name": "CRST token contract", + "address": "0x91f0484f9b65dc5187e414dae5ed37ea7a4b8af4", + "token": { + "decimals": 18, + "symbol": "CRST" + }, + "isSC": {} + }, + "0x9cd42aed7d44ee801c827a8e5dcf41df534e9e82": { + "name": "OMI token contract", + "address": "0x9cd42aed7d44ee801c827a8e5dcf41df534e9e82", + "token": { + "decimals": 18, + "symbol": "OMI" + }, + "isSC": {} + }, + "0x4c9f66b2806538cf00ef596e09fb05bcb0d17dc8": { + "name": "MNTO token contract", + "address": "0x4c9f66b2806538cf00ef596e09fb05bcb0d17dc8", + "token": { + "decimals": 18, + "symbol": "MNTO" + }, + "isSC": {} + }, + "0xa95b410743e8c2f7b64f1373d3ca2b3454864a94": { + "name": "$SLIVER token contract", + "address": "0xa95b410743e8c2f7b64f1373d3ca2b3454864a94", + "token": { + "decimals": 18, + "symbol": "$SLIVER" + }, + "isSC": {} + }, + "0x9a06db14d639796b25a6cec6a1bf614fd98815ec": { + "name": "$ZKP token contract", + "address": "0x9a06db14d639796b25a6cec6a1bf614fd98815ec", + "token": { + "decimals": 18, + "symbol": "$ZKP" + }, + "isSC": {} + }, + "0xbc91347e80886453f3f8bbd6d7ac07c122d87735": { + "name": "BANANA token contract", + "address": "0xbc91347e80886453f3f8bbd6d7ac07c122d87735", + "token": { + "decimals": 18, + "symbol": "BANANA" + }, + "isSC": {} + }, + "0xecd3c4f21dceebc8f308af7c3a7f1a4265bb52e9": { + "name": "MBUC token contract", + "address": "0xecd3c4f21dceebc8f308af7c3a7f1a4265bb52e9", + "token": { + "decimals": 18, + "symbol": "MBUC" + }, + "isSC": {} + }, + "0xf0af7795765273aebfd8a908460b728bdc3fc937": { + "name": "AKV token contract", + "address": "0xf0af7795765273aebfd8a908460b728bdc3fc937", + "token": { + "decimals": 18, + "symbol": "AKV" + }, + "isSC": {} + }, + "0xabffedaf784dc40a4c1947f9d5ddb3afe2075353": { + "name": "BRIX token contract", + "address": "0xabffedaf784dc40a4c1947f9d5ddb3afe2075353", + "token": { + "decimals": 18, + "symbol": "BRIX" + }, + "isSC": {} + }, + "0x7dc06244536fc5a86123034ee6d9204e436a3e91": { + "name": "CTRO token contract", + "address": "0x7dc06244536fc5a86123034ee6d9204e436a3e91", + "token": { + "decimals": 10, + "symbol": "CTRO" + }, + "isSC": {} + }, + "0x124e383a31f871a91b923bbcdbf3b0fae625c691": { + "name": "TIQ token contract", + "address": "0x124e383a31f871a91b923bbcdbf3b0fae625c691", + "token": { + "decimals": 18, + "symbol": "TIQ" + }, + "isSC": {} + }, + "0x4b2dc203d164702d6e453ab2abeccbcae95ee36b": { + "name": "ASLT token contract", + "address": "0x4b2dc203d164702d6e453ab2abeccbcae95ee36b", + "token": { + "decimals": 18, + "symbol": "ASLT" + }, + "isSC": {} + }, + "0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4": { + "name": "stMATIC token contract", + "address": "0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4", + "token": { + "decimals": 18, + "symbol": "stMATIC" + }, + "isSC": {} + }, + "0x158dbdd4820f95698442eac7cd4f70d08f39b3c6": { + "name": "MAD token contract", + "address": "0x158dbdd4820f95698442eac7cd4f70d08f39b3c6", + "token": { + "decimals": 18, + "symbol": "MAD" + }, + "isSC": {} + }, + "0x288e8ad3d61e6f931290a5df1ae31f16b8274770": { + "name": "BANX token contract", + "address": "0x288e8ad3d61e6f931290a5df1ae31f16b8274770", + "token": { + "decimals": 18, + "symbol": "BANX" + }, + "isSC": {} + }, + "0x8ca608e14934c1e986429d0d3644b8ba3a3e279c": { + "name": "XFL token contract", + "address": "0x8ca608e14934c1e986429d0d3644b8ba3a3e279c", + "token": { + "decimals": 18, + "symbol": "XFL" + }, + "isSC": {} + }, + "0x73a79f01c3365b6b50101b47860f428a8c3cebff": { + "name": "CBD token contract", + "address": "0x73a79f01c3365b6b50101b47860f428a8c3cebff", + "token": { + "decimals": 18, + "symbol": "CBD" + }, + "isSC": {} + }, + "0xcfeda1807147dbbcb1808e2518edde0142f419f5": { + "name": "BABYCOIN token contract", + "address": "0xcfeda1807147dbbcb1808e2518edde0142f419f5", + "token": { + "decimals": 18, + "symbol": "BABYCOIN" + }, + "isSC": {} + }, + "0x4ede9608a5d6154cb349f472063f6f0a95f9afc1": { + "name": "SHI token contract", + "address": "0x4ede9608a5d6154cb349f472063f6f0a95f9afc1", + "token": { + "decimals": 18, + "symbol": "SHI" + }, + "isSC": {} + }, + "0xaddffb740019ddf9318699e9fd1be138a311f584": { + "name": "DEM token contract", + "address": "0xaddffb740019ddf9318699e9fd1be138a311f584", + "token": { + "decimals": 18, + "symbol": "DEM" + }, + "isSC": {} + }, + "0x4f6b7ffb1427d6312305e23aebce6fc2994d8f91": { + "name": "PITCH token contract", + "address": "0x4f6b7ffb1427d6312305e23aebce6fc2994d8f91", + "token": { + "decimals": 9, + "symbol": "PITCH" + }, + "isSC": {} + }, + "0xe2a1257ac6f49b767fce903686fcbd7713af4a5d": { + "name": "EZX token contract", + "address": "0xe2a1257ac6f49b767fce903686fcbd7713af4a5d", + "token": { + "decimals": 18, + "symbol": "EZX" + }, + "isSC": {} + }, + "0xdc185ade9a3362f9203191f136499ffe512527c1": { + "name": "CASK token contract", + "address": "0xdc185ade9a3362f9203191f136499ffe512527c1", + "token": { + "decimals": 18, + "symbol": "CASK" + }, + "isSC": {} + }, + "0x9fdc23fe295104ac55fef09363c56451d0e37cfa": { + "name": "rkl token contract", + "address": "0x9fdc23fe295104ac55fef09363c56451d0e37cfa", + "token": { + "decimals": 18, + "symbol": "rkl" + }, + "isSC": {} + }, + "0xff93b30c021beedab0f6e28a7a08bddd155b15a4": { + "name": "DOGPIX token contract", + "address": "0xff93b30c021beedab0f6e28a7a08bddd155b15a4", + "token": { + "decimals": 18, + "symbol": "DOGPIX" + }, + "isSC": {} + }, + "0x74ac7664abb1c8fa152d41bb60e311a663a41c7e": { + "name": "MOONEY token contract", + "address": "0x74ac7664abb1c8fa152d41bb60e311a663a41c7e", + "token": { + "decimals": 18, + "symbol": "MOONEY" + }, + "isSC": {} + }, + "0xc2fbfab885b9c98ad51edf3b03e2510ff97471b0": { + "name": "ORBR token contract", + "address": "0xc2fbfab885b9c98ad51edf3b03e2510ff97471b0", + "token": { + "decimals": 18, + "symbol": "ORBR" + }, + "isSC": {} + }, + "0x6735d8de3b8f81a08727a1860cc9a68e8ed93b96": { + "name": "BYTES token contract", + "address": "0x6735d8de3b8f81a08727a1860cc9a68e8ed93b96", + "token": { + "decimals": 18, + "symbol": "BYTES" + }, + "isSC": {} + }, + "0x32e10b5ae57c9eec97bf5e67e243bf29993c9e71": { + "name": "TOE token contract", + "address": "0x32e10b5ae57c9eec97bf5e67e243bf29993c9e71", + "token": { + "decimals": 18, + "symbol": "TOE" + }, + "isSC": {} + }, + "0x7f36c54da31b2dd355caffec0249f26da41e3fcd": { + "name": "ENO token contract", + "address": "0x7f36c54da31b2dd355caffec0249f26da41e3fcd", + "token": { + "decimals": 18, + "symbol": "ENO" + }, + "isSC": {} + }, + "0x500ad628a390cd4ce8a062f07f68f63e9ef30362": { + "name": "STRIP token contract", + "address": "0x500ad628a390cd4ce8a062f07f68f63e9ef30362", + "token": { + "decimals": 18, + "symbol": "STRIP" + }, + "isSC": {} + }, + "0x74c96c05d87c86cd640de3eeb7b073811006b991": { + "name": "EGGT token contract", + "address": "0x74c96c05d87c86cd640de3eeb7b073811006b991", + "token": { + "decimals": 18, + "symbol": "EGGT" + }, + "isSC": {} + }, + "0x0a307bd521701f9d70fb29bfa9e2e36dc998dadb": { + "name": "CNW token contract", + "address": "0x0a307bd521701f9d70fb29bfa9e2e36dc998dadb", + "token": { + "decimals": 6, + "symbol": "CNW" + }, + "isSC": {} + }, + "0x4535e52cdf3ab787b379b7b72b5990767e6747e4": { + "name": "MYT token contract", + "address": "0x4535e52cdf3ab787b379b7b72b5990767e6747e4", + "token": { + "decimals": 18, + "symbol": "MYT" + }, + "isSC": {} + }, + "0x36f514bfb1dec83910c8c46752ad2987b7c72c5b": { + "name": "AA_idleDAIYield token contract", + "address": "0x36f514bfb1dec83910c8c46752ad2987b7c72c5b", + "token": { + "decimals": 18, + "symbol": "AA_idleDAIYield" + }, + "isSC": {} + }, + "0x8db0b3ee49348be4e6f3eaab952de2aa7106f7ec": { + "name": "BB_idleDAIYield token contract", + "address": "0x8db0b3ee49348be4e6f3eaab952de2aa7106f7ec", + "token": { + "decimals": 18, + "symbol": "BB_idleDAIYield" + }, + "isSC": {} + }, + "0x2857686536f58dd835dbf43c9f549676296ef336": { + "name": "SOLACE token contract", + "address": "0x2857686536f58dd835dbf43c9f549676296ef336", + "token": { + "decimals": 18, + "symbol": "SOLACE" + }, + "isSC": {} + }, + "0x8da41a3bc942b19a44d6bdf0e30f058df3ab8ba9": { + "name": "DATAPHORA token contract", + "address": "0x8da41a3bc942b19a44d6bdf0e30f058df3ab8ba9", + "token": { + "decimals": 18, + "symbol": "DATAPHORA" + }, + "isSC": {} + }, + "0x6cb02c92611f001f605c891fbfde7d1a26de54b9": { + "name": "VITA token contract", + "address": "0x6cb02c92611f001f605c891fbfde7d1a26de54b9", + "token": { + "decimals": 18, + "symbol": "VITA" + }, + "isSC": {} + }, + "0xebbe09afdab74872dbc975d7bda1ddf5595e4c8a": { + "name": "CUBT token contract", + "address": "0xebbe09afdab74872dbc975d7bda1ddf5595e4c8a", + "token": { + "decimals": 18, + "symbol": "CUBT" + }, + "isSC": {} + }, + "0xe1cc4db580022b0185a0208d5830e5b64fa14b86": { + "name": "MDC token contract", + "address": "0xe1cc4db580022b0185a0208d5830e5b64fa14b86", + "token": { + "decimals": 18, + "symbol": "MDC" + }, + "isSC": {} + }, + "0x5e2cfc52d1c9166202226fbb0b26b8dc16a8c4e0": { + "name": "LORC token contract", + "address": "0x5e2cfc52d1c9166202226fbb0b26b8dc16a8c4e0", + "token": { + "decimals": 18, + "symbol": "LORC" + }, + "isSC": {} + }, + "0x7df231024f80ca7f63032c25b6232b1cc655df77": { + "name": "iNTRO token contract", + "address": "0x7df231024f80ca7f63032c25b6232b1cc655df77", + "token": { + "decimals": 8, + "symbol": "iNTRO" + }, + "isSC": {} + }, + "0xe81e0a387d2585fbc5353f56a57afd20331ef12d": { + "name": "CCC token contract", + "address": "0xe81e0a387d2585fbc5353f56a57afd20331ef12d", + "token": { + "decimals": 18, + "symbol": "CCC" + }, + "isSC": {} + }, + "0x4a14ac36667b574b08443a15093e417db909d7a3": { + "name": "FWEB3 token contract", + "address": "0x4a14ac36667b574b08443a15093e417db909d7a3", + "token": { + "decimals": 18, + "symbol": "FWEB3" + }, + "isSC": {} + }, + "0x8a23d240763057432ce048a43f9a3a1b2cc22404": { + "name": "CDAO token contract", + "address": "0x8a23d240763057432ce048a43f9a3a1b2cc22404", + "token": { + "decimals": 18, + "symbol": "CDAO" + }, + "isSC": {} + }, + "0x14af1f2f02dccb1e43402339099a05a5e363b83c": { + "name": "KROM token contract", + "address": "0x14af1f2f02dccb1e43402339099a05a5e363b83c", + "token": { + "decimals": 18, + "symbol": "KROM" + }, + "isSC": {} + }, + "0x322584098ea29e2127a81322b417ebba356d8f22": { + "name": "PHTK token contract", + "address": "0x322584098ea29e2127a81322b417ebba356d8f22", + "token": { + "decimals": 18, + "symbol": "PHTK" + }, + "isSC": {} + }, + "0x11c3eba9851d245221e00e9a8e73e6f1439325d3": { + "name": "BRD token contract", + "address": "0x11c3eba9851d245221e00e9a8e73e6f1439325d3", + "token": { + "decimals": 18, + "symbol": "BRD" + }, + "isSC": {} + }, + "0x9dbdc7b58b4dfcc73daf45fc386b266262d11c41": { + "name": "BOBL token contract", + "address": "0x9dbdc7b58b4dfcc73daf45fc386b266262d11c41", + "token": { + "decimals": 18, + "symbol": "BOBL" + }, + "isSC": {} + }, + "0x357e1bfb47911528965bb9c6916eeea622d4bb27": { + "name": "CCX token contract", + "address": "0x357e1bfb47911528965bb9c6916eeea622d4bb27", + "token": { + "decimals": 18, + "symbol": "CCX" + }, + "isSC": {} + }, + "0x7b9c2d37fc0b45a5ec022d2023f18685fda832e7": { + "name": "CENT token contract", + "address": "0x7b9c2d37fc0b45a5ec022d2023f18685fda832e7", + "token": { + "decimals": 18, + "symbol": "CENT" + }, + "isSC": {} + }, + "0xaa3622e6c36a95ce8a8d3a66c166ac916a88d9c1": { + "name": "GUMP token contract", + "address": "0xaa3622e6c36a95ce8a8d3a66c166ac916a88d9c1", + "token": { + "decimals": 0, + "symbol": "GUMP" + }, + "isSC": {} + }, + "0x5530aa1823573af28b6315d7e75138573eabf6e4": { + "name": "VUFI token contract", + "address": "0x5530aa1823573af28b6315d7e75138573eabf6e4", + "token": { + "decimals": 18, + "symbol": "VUFI" + }, + "isSC": {} + }, + "0xe6bd67b9e9c1171583d5e13edaaec6d93b05ce96": { + "name": "SYNR token contract", + "address": "0xe6bd67b9e9c1171583d5e13edaaec6d93b05ce96", + "token": { + "decimals": 18, + "symbol": "SYNR" + }, + "isSC": {} + }, + "0x2c763b519ece33bb2c57e63c40e09465dbe7637b": { + "name": "BIZN token contract", + "address": "0x2c763b519ece33bb2c57e63c40e09465dbe7637b", + "token": { + "decimals": 18, + "symbol": "BIZN" + }, + "isSC": {} + }, + "0x2b160eea11604f81d5adbbd2dcfe5b6cd983652b": { + "name": "MWAT token contract", + "address": "0x2b160eea11604f81d5adbbd2dcfe5b6cd983652b", + "token": { + "decimals": 18, + "symbol": "MWAT" + }, + "isSC": {} + }, + "0x3df5d4d3926d55df9c10683bf0b0bde7a2dc3851": { + "name": "BAE token contract", + "address": "0x3df5d4d3926d55df9c10683bf0b0bde7a2dc3851", + "token": { + "decimals": 18, + "symbol": "BAE" + }, + "isSC": {} + }, + "0xe31c6667537bbc819b1fd7017ed6703cfa8f1871": { + "name": "KOL token contract", + "address": "0xe31c6667537bbc819b1fd7017ed6703cfa8f1871", + "token": { + "decimals": 18, + "symbol": "KOL" + }, + "isSC": {} + }, + "0xec97734ed00d65d05d10316d1641c09d1daab96f": { + "name": "TODL token contract", + "address": "0xec97734ed00d65d05d10316d1641c09d1daab96f", + "token": { + "decimals": 18, + "symbol": "TODL" + }, + "isSC": {} + }, + "0xaef23cee6c50930bae8b4843c9b35c4c293e8906": { + "name": "WXRP token contract", + "address": "0xaef23cee6c50930bae8b4843c9b35c4c293e8906", + "token": { + "decimals": 18, + "symbol": "WXRP" + }, + "isSC": {} + }, + "0xcbb975186a8d742561319ecf0e04a6eabeb1853c": { + "name": "Test137 token contract", + "address": "0xcbb975186a8d742561319ecf0e04a6eabeb1853c", + "token": { + "decimals": 18, + "symbol": "Test137" + }, + "isSC": {} + }, + "0x7d3daeb4ccd6cf0bf95c6420cac6d10438bd5116": { + "name": "ZMT token contract", + "address": "0x7d3daeb4ccd6cf0bf95c6420cac6d10438bd5116", + "token": { + "decimals": 18, + "symbol": "ZMT" + }, + "isSC": {} + }, + "0x36778b659267e74d35dda15a51a5296b3fdaf7a7": { + "name": "CHARGE token contract", + "address": "0x36778b659267e74d35dda15a51a5296b3fdaf7a7", + "token": { + "decimals": 18, + "symbol": "CHARGE" + }, + "isSC": {} + }, + "0x91c89a94567980f0e9723b487b0bed586ee96aa7": { + "name": "BICO token contract", + "address": "0x91c89a94567980f0e9723b487b0bed586ee96aa7", + "token": { + "decimals": 18, + "symbol": "BICO" + }, + "isSC": {} + }, + "0x97116250d81a937e41b70cee60a817705dd7960a": { + "name": "BUN token contract", + "address": "0x97116250d81a937e41b70cee60a817705dd7960a", + "token": { + "decimals": 18, + "symbol": "BUN" + }, + "isSC": {} + }, + "0x3f3190628aaeea6c329559b37e60c6ab471e0a6a": { + "name": "TWR.BRNZ token contract", + "address": "0x3f3190628aaeea6c329559b37e60c6ab471e0a6a", + "token": { + "decimals": 18, + "symbol": "TWR.BRNZ" + }, + "isSC": {} + }, + "0xaa3fbde8b65130bad47a987cfb2dd27e1d9ed75e": { + "name": "TWR.SLVR token contract", + "address": "0xaa3fbde8b65130bad47a987cfb2dd27e1d9ed75e", + "token": { + "decimals": 18, + "symbol": "TWR.SLVR" + }, + "isSC": {} + }, + "0xb58869e737191b4b062dcb1b67c9f92d623c3006": { + "name": "TWR.GOLD token contract", + "address": "0xb58869e737191b4b062dcb1b67c9f92d623c3006", + "token": { + "decimals": 18, + "symbol": "TWR.GOLD" + }, + "isSC": {} + }, + "0x7cb810ecbfd6125e65f451cfbd8ae657dffdd6b4": { + "name": "SOFI token contract", + "address": "0x7cb810ecbfd6125e65f451cfbd8ae657dffdd6b4", + "token": { + "decimals": 18, + "symbol": "SOFI" + }, + "isSC": {} + }, + "0x40dc7491cb56ff50a9913f7228feae802db99920": { + "name": "XLVI token contract", + "address": "0x40dc7491cb56ff50a9913f7228feae802db99920", + "token": { + "decimals": 2, + "symbol": "XLVI" + }, + "isSC": {} + }, + "0x2492e3626b7136be7afb67483a87d716925a61e5": { + "name": "PRE token contract", + "address": "0x2492e3626b7136be7afb67483a87d716925a61e5", + "token": { + "decimals": 18, + "symbol": "PRE" + }, + "isSC": {} + }, + "0x7d369731e3d7f86417aa86ef4be26e309080bd2f": { + "name": "KPT token contract", + "address": "0x7d369731e3d7f86417aa86ef4be26e309080bd2f", + "token": { + "decimals": 18, + "symbol": "KPT" + }, + "isSC": {} + }, + "0xcb016f83d242771a8cda42f9e391f18b93b6ae63": { + "name": "FWB token contract", + "address": "0xcb016f83d242771a8cda42f9e391f18b93b6ae63", + "token": { + "decimals": 18, + "symbol": "FWB" + }, + "isSC": {} + }, + "0x784641e51c300120a8d15bfdb3b45375d4352748": { + "name": "WIVA token contract", + "address": "0x784641e51c300120a8d15bfdb3b45375d4352748", + "token": { + "decimals": 18, + "symbol": "WIVA" + }, + "isSC": {} + }, + "0xc3d8222c2f1223df5db3a0ee845eafc3f67e76a3": { + "name": "LOOKS token contract", + "address": "0xc3d8222c2f1223df5db3a0ee845eafc3f67e76a3", + "token": { + "decimals": 18, + "symbol": "LOOKS" + }, + "isSC": {} + }, + "0x594c984e3318e91313f881b021a0c4203ff5e59f": { + "name": "CHR token contract", + "address": "0x594c984e3318e91313f881b021a0c4203ff5e59f", + "token": { + "decimals": 6, + "symbol": "CHR" + }, + "isSC": {} + }, + "0x58171d74fc6526df600214ca18dc2ee4895c6f7b": { + "name": "GAUF token contract", + "address": "0x58171d74fc6526df600214ca18dc2ee4895c6f7b", + "token": { + "decimals": 18, + "symbol": "GAUF" + }, + "isSC": {} + }, + "0x53cf566cf80e1a26bfc16d055c866a72fdcbaee7": { + "name": "BTST token contract", + "address": "0x53cf566cf80e1a26bfc16d055c866a72fdcbaee7", + "token": { + "decimals": 18, + "symbol": "BTST" + }, + "isSC": {} + }, + "0x4a63428963e18cc2411f43d49826ed09d1bfa0da": { + "name": "WHachiko token contract", + "address": "0x4a63428963e18cc2411f43d49826ed09d1bfa0da", + "token": { + "decimals": 18, + "symbol": "WHachiko" + }, + "isSC": {} + }, + "0x6220d3d80020a4023eb29a9f9e206100f7bb581e": { + "name": "cvxCRV token contract", + "address": "0x6220d3d80020a4023eb29a9f9e206100f7bb581e", + "token": { + "decimals": 18, + "symbol": "cvxCRV" + }, + "isSC": {} + }, + "0x9620330926467ed3279ffcfba8327c24625732ea": { + "name": "GAMMA token contract", + "address": "0x9620330926467ed3279ffcfba8327c24625732ea", + "token": { + "decimals": 18, + "symbol": "GAMMA" + }, + "isSC": {} + }, + "0x22593803b4c628d8ee2537ac0ffb996ca104ad25": { + "name": "FLP token contract", + "address": "0x22593803b4c628d8ee2537ac0ffb996ca104ad25", + "token": { + "decimals": 18, + "symbol": "FLP" + }, + "isSC": {} + }, + "0x0f6d1c52ba0bb9e68601632a74d9f4d07afb555f": { + "name": "FLX token contract", + "address": "0x0f6d1c52ba0bb9e68601632a74d9f4d07afb555f", + "token": { + "decimals": 18, + "symbol": "FLX" + }, + "isSC": {} + }, + "0x26f5fb1e6c8a65b3a873ff0a213fa16eff5a7828": { + "name": "DDX token contract", + "address": "0x26f5fb1e6c8a65b3a873ff0a213fa16eff5a7828", + "token": { + "decimals": 18, + "symbol": "DDX" + }, + "isSC": {} + }, + "0xed49826b1a5a147b612ad16e27f3961d3cdce218": { + "name": "Inuyasha token contract", + "address": "0xed49826b1a5a147b612ad16e27f3961d3cdce218", + "token": { + "decimals": 18, + "symbol": "Inuyasha" + }, + "isSC": {} + }, + "0x6c6fcdec44990079baac5c3062e8f0dac5c4ba8e": { + "name": "GZLR token contract", + "address": "0x6c6fcdec44990079baac5c3062e8f0dac5c4ba8e", + "token": { + "decimals": 18, + "symbol": "GZLR" + }, + "isSC": {} + }, + "0x84cf3e9f5ec08a77bbc4c437eaea411b44673cfc": { + "name": "BONESHARDS token contract", + "address": "0x84cf3e9f5ec08a77bbc4c437eaea411b44673cfc", + "token": { + "decimals": 18, + "symbol": "BONESHARDS" + }, + "isSC": {} + }, + "0xee55dd8d0ccbe835b8ef163590c9afeaace5978b": { + "name": "TEMPLE token contract", + "address": "0xee55dd8d0ccbe835b8ef163590c9afeaace5978b", + "token": { + "decimals": 18, + "symbol": "TEMPLE" + }, + "isSC": {} + }, + "0xecc4176b90613ed78185f01bd1e42c5640c4f09d": { + "name": "ANML token contract", + "address": "0xecc4176b90613ed78185f01bd1e42c5640c4f09d", + "token": { + "decimals": 18, + "symbol": "ANML" + }, + "isSC": {} + }, + "0xcc0ef74ae3ef3d2c0139558ba2bdafab98ade3ed": { + "name": "HPT token contract", + "address": "0xcc0ef74ae3ef3d2c0139558ba2bdafab98ade3ed", + "token": { + "decimals": 18, + "symbol": "HPT" + }, + "isSC": {} + }, + "0xec24c04868da7abba292c2ba46fe77788a3f5f74": { + "name": "OOG token contract", + "address": "0xec24c04868da7abba292c2ba46fe77788a3f5f74", + "token": { + "decimals": 18, + "symbol": "OOG" + }, + "isSC": {} + }, + "0xb72a91ac402eec1977a6b2bd02d3f0aa1a261b93": { + "name": "WCS token contract", + "address": "0xb72a91ac402eec1977a6b2bd02d3f0aa1a261b93", + "token": { + "decimals": 0, + "symbol": "WCS" + }, + "isSC": {} + }, + "0x134257dd9a557b8083c4a196b4a259bbbd1146a6": { + "name": "BET token contract", + "address": "0x134257dd9a557b8083c4a196b4a259bbbd1146a6", + "token": { + "decimals": 4, + "symbol": "BET" + }, + "isSC": {} + }, + "0x58001cc1a9e17a20935079ab40b1b8f4fc19efd1": { + "name": "PUSH token contract", + "address": "0x58001cc1a9e17a20935079ab40b1b8f4fc19efd1", + "token": { + "decimals": 18, + "symbol": "PUSH" + }, + "isSC": {} + }, + "0x19fcab6c824570c82a3508ee0b520686cde62fcc": { + "name": "GFEE token contract", + "address": "0x19fcab6c824570c82a3508ee0b520686cde62fcc", + "token": { + "decimals": 18, + "symbol": "GFEE" + }, + "isSC": {} + }, + "0xfd2e95937a9a1b4a87b8c47fd3e9acc123314c0e": { + "name": "NIS token contract", + "address": "0xfd2e95937a9a1b4a87b8c47fd3e9acc123314c0e", + "token": { + "decimals": 8, + "symbol": "NIS" + }, + "isSC": {} + }, + "0xe145524abf229cce1d536623d32bf4794bb02a61": { + "name": "cvxFXS token contract", + "address": "0xe145524abf229cce1d536623d32bf4794bb02a61", + "token": { + "decimals": 18, + "symbol": "cvxFXS" + }, + "isSC": {} + }, + "0x01a8d35b2fd85dd2e73760d4e6300f1bdd47a118": { + "name": "GRTFUL token contract", + "address": "0x01a8d35b2fd85dd2e73760d4e6300f1bdd47a118", + "token": { + "decimals": 18, + "symbol": "GRTFUL" + }, + "isSC": {} + }, + "0xc3f56d567e7663e8932e65d85ae4be7eb5575ca7": { + "name": "FTRB token contract", + "address": "0xc3f56d567e7663e8932e65d85ae4be7eb5575ca7", + "token": { + "decimals": 18, + "symbol": "FTRB" + }, + "isSC": {} + }, + "0x025a1405e9f917313a4e17fd365d0611cccf43e1": { + "name": "DPX token contract", + "address": "0x025a1405e9f917313a4e17fd365d0611cccf43e1", + "token": { + "decimals": 18, + "symbol": "DPX" + }, + "isSC": {} + }, + "0xe1708abde4847b4929b70547e5197f1ba1db2250": { + "name": "TOKE token contract", + "address": "0xe1708abde4847b4929b70547e5197f1ba1db2250", + "token": { + "decimals": 18, + "symbol": "TOKE" + }, + "isSC": {} + }, + "0xd281af594cbb99e8469f3591d57a0c72eb725bdb": { + "name": "MNFT token contract", + "address": "0xd281af594cbb99e8469f3591d57a0c72eb725bdb", + "token": { + "decimals": 18, + "symbol": "MNFT" + }, + "isSC": {} + }, + "0x2cbf640e8f0301e86392ecf8009a034178ef2415": { + "name": "PUP token contract", + "address": "0x2cbf640e8f0301e86392ecf8009a034178ef2415", + "token": { + "decimals": 18, + "symbol": "PUP" + }, + "isSC": {} + }, + "0xa5577d1cec2583058a6bd6d5deac44797c205701": { + "name": "WDEV token contract", + "address": "0xa5577d1cec2583058a6bd6d5deac44797c205701", + "token": { + "decimals": 18, + "symbol": "WDEV" + }, + "isSC": {} + }, + "0xe465128cd5316c4a08e879c32cc89d8f794c02e4": { + "name": "ROAG token contract", + "address": "0xe465128cd5316c4a08e879c32cc89d8f794c02e4", + "token": { + "decimals": 18, + "symbol": "ROAG" + }, + "isSC": {} + }, + "0xd813b1500db50c755a37850ab29ca7a6ce24b25b": { + "name": "SWEE token contract", + "address": "0xd813b1500db50c755a37850ab29ca7a6ce24b25b", + "token": { + "decimals": 18, + "symbol": "SWEE" + }, + "isSC": {} + }, + "0x0fdfee86a85cf73c1eced1e2f8d8a358c5c7127d": { + "name": "GAM token contract", + "address": "0x0fdfee86a85cf73c1eced1e2f8d8a358c5c7127d", + "token": { + "decimals": 18, + "symbol": "GAM" + }, + "isSC": {} + }, + "0xa68c10cb0bf5c45f223a9db23ffc1f5614388287": { + "name": "AQU token contract", + "address": "0xa68c10cb0bf5c45f223a9db23ffc1f5614388287", + "token": { + "decimals": 18, + "symbol": "AQU" + }, + "isSC": {} + }, + "0xa810289daa9235aff550fbacc68703c2ffc3cd80": { + "name": "ENK token contract", + "address": "0xa810289daa9235aff550fbacc68703c2ffc3cd80", + "token": { + "decimals": 18, + "symbol": "ENK" + }, + "isSC": {} + }, + "0x3c7681320cc5d558480a8ff2f19a01c312535364": { + "name": "wxBTRFLY token contract", + "address": "0x3c7681320cc5d558480a8ff2f19a01c312535364", + "token": { + "decimals": 18, + "symbol": "wxBTRFLY" + }, + "isSC": {} + }, + "0x2eca05abf0adf9f208e973d4682503fb6ae8f942": { + "name": "SIPHER token contract", + "address": "0x2eca05abf0adf9f208e973d4682503fb6ae8f942", + "token": { + "decimals": 18, + "symbol": "SIPHER" + }, + "isSC": {} + }, + "0x2d027e55b85429e9f205930a8aff6d8e6c8c3021": { + "name": "RAYS token contract", + "address": "0x2d027e55b85429e9f205930a8aff6d8e6c8c3021", + "token": { + "decimals": 18, + "symbol": "RAYS" + }, + "isSC": {} + }, + "0x9300169b33a02f968e5c2a00607e0ece26248752": { + "name": "ERC20 token contract", + "address": "0x9300169b33a02f968e5c2a00607e0ece26248752", + "token": { + "decimals": 18, + "symbol": "ERC20" + }, + "isSC": {} + }, + "0x90b9597bbfdcbc86253d27d6b9a13079c5155f9f": { + "name": "ECX token contract", + "address": "0x90b9597bbfdcbc86253d27d6b9a13079c5155f9f", + "token": { + "decimals": 18, + "symbol": "ECX" + }, + "isSC": {} + }, + "0x0c560bf15acccca2892053589b1805b5ef18a21f": { + "name": "BPRO token contract", + "address": "0x0c560bf15acccca2892053589b1805b5ef18a21f", + "token": { + "decimals": 18, + "symbol": "BPRO" + }, + "isSC": {} + }, + "0x0784d958ee09ff8e876a82d3c6e798912c0f0a11": { + "name": "ARKES token contract", + "address": "0x0784d958ee09ff8e876a82d3c6e798912c0f0a11", + "token": { + "decimals": 18, + "symbol": "ARKES" + }, + "isSC": {} + }, + "0x77a3840f78e4685afaf9c416b36e6eae6122567b": { + "name": "xFUND token contract", + "address": "0x77a3840f78e4685afaf9c416b36e6eae6122567b", + "token": { + "decimals": 9, + "symbol": "xFUND" + }, + "isSC": {} + }, + "0x5ccfefd833ed1f648d227b32ff96f045a0d2fa8d": { + "name": "FSCC token contract", + "address": "0x5ccfefd833ed1f648d227b32ff96f045a0d2fa8d", + "token": { + "decimals": 8, + "symbol": "FSCC" + }, + "isSC": {} + }, + "0x6094a3ced47335b068efba7789ea578af1434947": { + "name": "LIZ token contract", + "address": "0x6094a3ced47335b068efba7789ea578af1434947", + "token": { + "decimals": 18, + "symbol": "LIZ" + }, + "isSC": {} + }, + "0xe854d408482319bae8e3e3965c2eee9135e936c2": { + "name": "DEPO token contract", + "address": "0xe854d408482319bae8e3e3965c2eee9135e936c2", + "token": { + "decimals": 18, + "symbol": "DEPO" + }, + "isSC": {} + }, + "0xbe69e683c56c2816d3eeec1183c882dd73ea5914": { + "name": "DAC token contract", + "address": "0xbe69e683c56c2816d3eeec1183c882dd73ea5914", + "token": { + "decimals": 18, + "symbol": "DAC" + }, + "isSC": {} + }, + "0x5cf6e36dcf6e6132e251ca0f5590bb7c8055bb3d": { + "name": "HyFi token contract", + "address": "0x5cf6e36dcf6e6132e251ca0f5590bb7c8055bb3d", + "token": { + "decimals": 18, + "symbol": "HyFi" + }, + "isSC": {} + }, + "0xc712f8e6ffd1b6a40eb8735c8d2db2a55612268c": { + "name": "LGB token contract", + "address": "0xc712f8e6ffd1b6a40eb8735c8d2db2a55612268c", + "token": { + "decimals": 18, + "symbol": "LGB" + }, + "isSC": {} + }, + "0x178745ca4ba60b22e25cf92df47f177a7db7b4f8": { + "name": "CXD token contract", + "address": "0x178745ca4ba60b22e25cf92df47f177a7db7b4f8", + "token": { + "decimals": 18, + "symbol": "CXD" + }, + "isSC": {} + }, + "0x9cd44af7fb46a946484ebe377bb2712eabb610ad": { + "name": "ZENX token contract", + "address": "0x9cd44af7fb46a946484ebe377bb2712eabb610ad", + "token": { + "decimals": 18, + "symbol": "ZENX" + }, + "isSC": {} + }, + "0xa33aaa07853038943ef2c32cde73a094cf993ee0": { + "name": "YGN token contract", + "address": "0xa33aaa07853038943ef2c32cde73a094cf993ee0", + "token": { + "decimals": 18, + "symbol": "YGN" + }, + "isSC": {} + }, + "0x7a9568ae827cd28bf8365fd51baa2dbcd7d3f465": { + "name": "GAS token contract", + "address": "0x7a9568ae827cd28bf8365fd51baa2dbcd7d3f465", + "token": { + "decimals": 18, + "symbol": "GAS" + }, + "isSC": {} + }, + "0xc8aaee7f1deac631259b8bf2c65e71207cc53b0c": { + "name": "DOM token contract", + "address": "0xc8aaee7f1deac631259b8bf2c65e71207cc53b0c", + "token": { + "decimals": 18, + "symbol": "DOM" + }, + "isSC": {} + }, + "0x2b4fa97b84698dc1540d13d33754757bac3c8115": { + "name": "PDAO token contract", + "address": "0x2b4fa97b84698dc1540d13d33754757bac3c8115", + "token": { + "decimals": 18, + "symbol": "PDAO" + }, + "isSC": {} + }, + "0x60ff7b0744d5981d8a3dfb8b84716f381652508d": { + "name": "ANME token contract", + "address": "0x60ff7b0744d5981d8a3dfb8b84716f381652508d", + "token": { + "decimals": 18, + "symbol": "ANME" + }, + "isSC": {} + }, + "0x58743aabed5bb772845d1a779f7ea592ac744023": { + "name": "bHOME token contract", + "address": "0x58743aabed5bb772845d1a779f7ea592ac744023", + "token": { + "decimals": 6, + "symbol": "bHOME" + }, + "isSC": {} + }, + "0x7fb27ee135db455de5ab1ccec66a24cbc82e712d": { + "name": "GMI token contract", + "address": "0x7fb27ee135db455de5ab1ccec66a24cbc82e712d", + "token": { + "decimals": 18, + "symbol": "GMI" + }, + "isSC": {} + }, + "0x33044d2c29686795228b89b11d2d34727b8df9bc": { + "name": "PLSH token contract", + "address": "0x33044d2c29686795228b89b11d2d34727b8df9bc", + "token": { + "decimals": 18, + "symbol": "PLSH" + }, + "isSC": {} + }, + "0x74ba6a10978f643a84c0b37fcb599081079811cb": { + "name": "DCASH token contract", + "address": "0x74ba6a10978f643a84c0b37fcb599081079811cb", + "token": { + "decimals": 10, + "symbol": "DCASH" + }, + "isSC": {} + }, + "0xc4b00de48c795666c2b0ad0ed4b9ac7e22fd10e1": { + "name": "VENICE token contract", + "address": "0xc4b00de48c795666c2b0ad0ed4b9ac7e22fd10e1", + "token": { + "decimals": 18, + "symbol": "VENICE" + }, + "isSC": {} + }, + "0x2c9d233914f46b88e9ae08326fa60e40ea3faa12": { + "name": "SPH token contract", + "address": "0x2c9d233914f46b88e9ae08326fa60e40ea3faa12", + "token": { + "decimals": 18, + "symbol": "SPH" + }, + "isSC": {} + }, + "0x7d29968f96d475186a479e4be99b43b8b8a20dbc": { + "name": "LTR token contract", + "address": "0x7d29968f96d475186a479e4be99b43b8b8a20dbc", + "token": { + "decimals": 18, + "symbol": "LTR" + }, + "isSC": {} + }, + "0x0ae1daf8329923cce587e994df500a8f1dd5fc6f": { + "name": "XPOP token contract", + "address": "0x0ae1daf8329923cce587e994df500a8f1dd5fc6f", + "token": { + "decimals": 18, + "symbol": "XPOP" + }, + "isSC": {} + }, + "0xe20d2df5041f8ed06976846470f727295cdd4d23": { + "name": "BIOS token contract", + "address": "0xe20d2df5041f8ed06976846470f727295cdd4d23", + "token": { + "decimals": 18, + "symbol": "BIOS" + }, + "isSC": {} + }, + "0xf0c3c4ac63be272a94712bccc39490a159cd0d7c": { + "name": "SRC token contract", + "address": "0xf0c3c4ac63be272a94712bccc39490a159cd0d7c", + "token": { + "decimals": 18, + "symbol": "SRC" + }, + "isSC": {} + }, + "0x3f5b2063e500492463589b17f9ea9cf2af9771cf": { + "name": "NMSIS token contract", + "address": "0x3f5b2063e500492463589b17f9ea9cf2af9771cf", + "token": { + "decimals": 18, + "symbol": "NMSIS" + }, + "isSC": {} + }, + "0xfa8cf47d8bc10f6f7272f2b9b0ed042e8b8e120d": { + "name": "MPTY token contract", + "address": "0xfa8cf47d8bc10f6f7272f2b9b0ed042e8b8e120d", + "token": { + "decimals": 18, + "symbol": "MPTY" + }, + "isSC": {} + }, + "0x42b171dee4a4a4c918eb53e438346df47b07c6f2": { + "name": "MOI token contract", + "address": "0x42b171dee4a4a4c918eb53e438346df47b07c6f2", + "token": { + "decimals": 18, + "symbol": "MOI" + }, + "isSC": {} + }, + "0x18428bb593f8a1ec3fb80418e4844439b03f5001": { + "name": "SENATE token contract", + "address": "0x18428bb593f8a1ec3fb80418e4844439b03f5001", + "token": { + "decimals": 18, + "symbol": "SENATE" + }, + "isSC": {} + }, + "0x13e5f8e18376d51203156a47a809254c717cf9b7": { + "name": "VADER token contract", + "address": "0x13e5f8e18376d51203156a47a809254c717cf9b7", + "token": { + "decimals": 18, + "symbol": "VADER" + }, + "isSC": {} + }, + "0x4fafad147c8cd0e52f83830484d164e960bdc6c3": { + "name": "QWLA token contract", + "address": "0x4fafad147c8cd0e52f83830484d164e960bdc6c3", + "token": { + "decimals": 18, + "symbol": "QWLA" + }, + "isSC": {} + }, + "0x7e4413ed294a9fb86d6534edbcc46355a83c1ef7": { + "name": "ASY token contract", + "address": "0x7e4413ed294a9fb86d6534edbcc46355a83c1ef7", + "token": { + "decimals": 18, + "symbol": "ASY" + }, + "isSC": {} + }, + "0x8c059898ca6274750b6bf1cf38f2848347c490cc": { + "name": "SOS token contract", + "address": "0x8c059898ca6274750b6bf1cf38f2848347c490cc", + "token": { + "decimals": 18, + "symbol": "SOS" + }, + "isSC": {} + }, + "0x86589a8fa4945657a41ed013633ff26ca9a26a2b": { + "name": "PCOIN token contract", + "address": "0x86589a8fa4945657a41ed013633ff26ca9a26a2b", + "token": { + "decimals": 18, + "symbol": "PCOIN" + }, + "isSC": {} + }, + "0x94576423d85b47575bba515a1f328a265e6318e6": { + "name": "LEEDO token contract", + "address": "0x94576423d85b47575bba515a1f328a265e6318e6", + "token": { + "decimals": 18, + "symbol": "LEEDO" + }, + "isSC": {} + }, + "0x40eebe8541ac5a232e5897226aa3491677bfa9dd": { + "name": "uETH token contract", + "address": "0x40eebe8541ac5a232e5897226aa3491677bfa9dd", + "token": { + "decimals": 18, + "symbol": "uETH" + }, + "isSC": {} + }, + "0x0142666baa520bc49b32ad44c505421346c69164": { + "name": "BLYS token contract", + "address": "0x0142666baa520bc49b32ad44c505421346c69164", + "token": { + "decimals": 18, + "symbol": "BLYS" + }, + "isSC": {} + }, + "0x0e7252706393470ffb0629da2caa39fc9340f2d4": { + "name": "DOGEGF token contract", + "address": "0x0e7252706393470ffb0629da2caa39fc9340f2d4", + "token": { + "decimals": 18, + "symbol": "DOGEGF" + }, + "isSC": {} + }, + "0x9d0be2730a8af6061f058ce2c951d52e4f886f18": { + "name": "TRZ token contract", + "address": "0x9d0be2730a8af6061f058ce2c951d52e4f886f18", + "token": { + "decimals": 18, + "symbol": "TRZ" + }, + "isSC": {} + }, + "0x6d54d243f144e16b6489a295f100146e11286ec0": { + "name": "renDGB token contract", + "address": "0x6d54d243f144e16b6489a295f100146e11286ec0", + "token": { + "decimals": 8, + "symbol": "renDGB" + }, + "isSC": {} + }, + "0x2fc711518aae7c87d7002566c5d43b0e5d2b1932": { + "name": "SCLP token contract", + "address": "0x2fc711518aae7c87d7002566c5d43b0e5d2b1932", + "token": { + "decimals": 18, + "symbol": "SCLP" + }, + "isSC": {} + }, + "0xc4d6d290bf5f28278fe30f5e28b0a482eac330f0": { + "name": "AMAS token contract", + "address": "0xc4d6d290bf5f28278fe30f5e28b0a482eac330f0", + "token": { + "decimals": 18, + "symbol": "AMAS" + }, + "isSC": {} + }, + "0x2ea3e8f750cbc55c293e6008e8b5a654ebbd0600": { + "name": "TNO token contract", + "address": "0x2ea3e8f750cbc55c293e6008e8b5a654ebbd0600", + "token": { + "decimals": 8, + "symbol": "TNO" + }, + "isSC": {} + }, + "0x78c192f6b1260d53d7ff871d267364f334897f08": { + "name": "MNDCC token contract", + "address": "0x78c192f6b1260d53d7ff871d267364f334897f08", + "token": { + "decimals": 18, + "symbol": "MNDCC" + }, + "isSC": {} + }, + "0xb9abdd78a153b8b59d09dfc196254718145f3a20": { + "name": "RTH token contract", + "address": "0xb9abdd78a153b8b59d09dfc196254718145f3a20", + "token": { + "decimals": 18, + "symbol": "RTH" + }, + "isSC": {} + }, + "0x6484117fbdc339c99c973bde96650039f3469c09": { + "name": "Chase token contract", + "address": "0x6484117fbdc339c99c973bde96650039f3469c09", + "token": { + "decimals": 6, + "symbol": "Chase" + }, + "isSC": {} + }, + "0x538d47d142f6993038a667e9d6210d3735749b36": { + "name": "BURP token contract", + "address": "0x538d47d142f6993038a667e9d6210d3735749b36", + "token": { + "decimals": 18, + "symbol": "BURP" + }, + "isSC": {} + }, + "0x80387ff8b58c82fbaf385a3380d4627234763659": { + "name": "NOID token contract", + "address": "0x80387ff8b58c82fbaf385a3380d4627234763659", + "token": { + "decimals": 18, + "symbol": "NOID" + }, + "isSC": {} + }, + "0x42d61d766b85431666b39b89c43011f24451bff6": { + "name": "PSP token contract", + "address": "0x42d61d766b85431666b39b89c43011f24451bff6", + "token": { + "decimals": 18, + "symbol": "PSP" + }, + "isSC": {} + }, + "0x0a2a95978ce57395dbf33696d34e222e1eacde4e": { + "name": "TPSC token contract", + "address": "0x0a2a95978ce57395dbf33696d34e222e1eacde4e", + "token": { + "decimals": 18, + "symbol": "TPSC" + }, + "isSC": {} + }, + "0x8338bd2dbcc83f1f0190be068779aca296380209": { + "name": "OPT token contract", + "address": "0x8338bd2dbcc83f1f0190be068779aca296380209", + "token": { + "decimals": 18, + "symbol": "OPT" + }, + "isSC": {} + }, + "0xb044d04c406952c0927579e153c49c222ef2c870": { + "name": "MAGE token contract", + "address": "0xb044d04c406952c0927579e153c49c222ef2c870", + "token": { + "decimals": 18, + "symbol": "MAGE" + }, + "isSC": {} + }, + "0xd10bccdd789fa11239d903fea93db2c8c92cfbe7": { + "name": "GP token contract", + "address": "0xd10bccdd789fa11239d903fea93db2c8c92cfbe7", + "token": { + "decimals": 18, + "symbol": "GP" + }, + "isSC": {} + }, + "0x96f57e3f4f1e11b8c5fdc98ab45f5843ab66821f": { + "name": "ISLAND token contract", + "address": "0x96f57e3f4f1e11b8c5fdc98ab45f5843ab66821f", + "token": { + "decimals": 18, + "symbol": "ISLAND" + }, + "isSC": {} + }, + "0xca69c315b644a45a35b25fe23fbaf6620599a063": { + "name": "wWH token contract", + "address": "0xca69c315b644a45a35b25fe23fbaf6620599a063", + "token": { + "decimals": 18, + "symbol": "wWH" + }, + "isSC": {} + }, + "0xdeba42d0a9da63697eaf745b2863393e02505a3a": { + "name": "wFM token contract", + "address": "0xdeba42d0a9da63697eaf745b2863393e02505a3a", + "token": { + "decimals": 18, + "symbol": "wFM" + }, + "isSC": {} + }, + "0xe631dabef60c37a37d70d3b4f812871df663226f": { + "name": "SMT token contract", + "address": "0xe631dabef60c37a37d70d3b4f812871df663226f", + "token": { + "decimals": 18, + "symbol": "SMT" + }, + "isSC": {} + }, + "0x5a98291b9a7643448f5366fe4a4918f7cb566912": { + "name": "MBM token contract", + "address": "0x5a98291b9a7643448f5366fe4a4918f7cb566912", + "token": { + "decimals": 18, + "symbol": "MBM" + }, + "isSC": {} + }, + "0xbf59a84274f57c6ab3a5f3ad4864de0df3faff4e": { + "name": "KTO token contract", + "address": "0xbf59a84274f57c6ab3a5f3ad4864de0df3faff4e", + "token": { + "decimals": 9, + "symbol": "KTO" + }, + "isSC": {} + }, + "0xae29ac47a9e3b0a52840e547adf74b912999f7fc": { + "name": "EVE token contract", + "address": "0xae29ac47a9e3b0a52840e547adf74b912999f7fc", + "token": { + "decimals": 18, + "symbol": "EVE" + }, + "isSC": {} + }, + "0x7bfc8637b8fdb2b13291639ba65c25a22a9e59f0": { + "name": "S4S token contract", + "address": "0x7bfc8637b8fdb2b13291639ba65c25a22a9e59f0", + "token": { + "decimals": 18, + "symbol": "S4S" + }, + "isSC": {} + }, + "0xdcc1f05c5ad40972ce9fbaf2841cbede6f933b07": { + "name": "MYCE token contract", + "address": "0xdcc1f05c5ad40972ce9fbaf2841cbede6f933b07", + "token": { + "decimals": 18, + "symbol": "MYCE" + }, + "isSC": {} + }, + "0x6e8a8726639d12935b3219892155520bdc57366b": { + "name": "GNOME token contract", + "address": "0x6e8a8726639d12935b3219892155520bdc57366b", + "token": { + "decimals": 18, + "symbol": "GNOME" + }, + "isSC": {} + }, + "0x34667ed7c36cbbbf2d5d5c5c8d6eb76a094edb9f": { + "name": "GENE token contract", + "address": "0x34667ed7c36cbbbf2d5d5c5c8d6eb76a094edb9f", + "token": { + "decimals": 18, + "symbol": "GENE" + }, + "isSC": {} + }, + "0x695fc8b80f344411f34bdbcb4e621aa69ada384b": { + "name": "NITRO token contract", + "address": "0x695fc8b80f344411f34bdbcb4e621aa69ada384b", + "token": { + "decimals": 18, + "symbol": "NITRO" + }, + "isSC": {} + }, + "0xaf28b7702e239e7ed107b6e036851f56e0415188": { + "name": "PLAN token contract", + "address": "0xaf28b7702e239e7ed107b6e036851f56e0415188", + "token": { + "decimals": 18, + "symbol": "PLAN" + }, + "isSC": {} + }, + "0xa35816ad75206102812363541dfb9c88e8bb1a8f": { + "name": "DAN2 token contract", + "address": "0xa35816ad75206102812363541dfb9c88e8bb1a8f", + "token": { + "decimals": 6, + "symbol": "DAN2" + }, + "isSC": {} + }, + "0xbe6159775a9050e5c4cbf81718390818702bf801": { + "name": "GIL token contract", + "address": "0xbe6159775a9050e5c4cbf81718390818702bf801", + "token": { + "decimals": 18, + "symbol": "GIL" + }, + "isSC": {} + }, + "0xe411d55fb9d8d9d2a0b4161f08adf768b23a584b": { + "name": "PYLNT token contract", + "address": "0xe411d55fb9d8d9d2a0b4161f08adf768b23a584b", + "token": { + "decimals": 18, + "symbol": "PYLNT" + }, + "isSC": {} + }, + "0xd71951630e7afb497ee6f9d9b4510a8614869a59": { + "name": "WURST token contract", + "address": "0xd71951630e7afb497ee6f9d9b4510a8614869a59", + "token": { + "decimals": 18, + "symbol": "WURST" + }, + "isSC": {} + }, + "0x1b042246d67c44a745dc8bad735c84059a1fa0a7": { + "name": "METW token contract", + "address": "0x1b042246d67c44a745dc8bad735c84059a1fa0a7", + "token": { + "decimals": 18, + "symbol": "METW" + }, + "isSC": {} + }, + "0xa3c322ad15218fbfaed26ba7f616249f7705d945": { + "name": "MV token contract", + "address": "0xa3c322ad15218fbfaed26ba7f616249f7705d945", + "token": { + "decimals": 18, + "symbol": "MV" + }, + "isSC": {} + }, + "0x514267d21bcb99b43657ef4ed80b26e18ca9e8f0": { + "name": "NFTK token contract", + "address": "0x514267d21bcb99b43657ef4ed80b26e18ca9e8f0", + "token": { + "decimals": 18, + "symbol": "NFTK" + }, + "isSC": {} + }, + "0xa8fc7cd1ea3a65574368faddb4b1190aa3fd6560": { + "name": "VERI token contract", + "address": "0xa8fc7cd1ea3a65574368faddb4b1190aa3fd6560", + "token": { + "decimals": 18, + "symbol": "VERI" + }, + "isSC": {} + }, + "0x6c3ec80fae6f067cc5f0222efd957101b626291e": { + "name": "TDAO token contract", + "address": "0x6c3ec80fae6f067cc5f0222efd957101b626291e", + "token": { + "decimals": 18, + "symbol": "TDAO" + }, + "isSC": {} + }, + "0xf0533e7ef9d9aa5d5554be649e60315e528ce3a7": { + "name": "VUFIS token contract", + "address": "0xf0533e7ef9d9aa5d5554be649e60315e528ce3a7", + "token": { + "decimals": 18, + "symbol": "VUFIS" + }, + "isSC": {} + }, + "0x345df42b1e4963d70909e09935b9a1f7ef832114": { + "name": "BAGZ token contract", + "address": "0x345df42b1e4963d70909e09935b9a1f7ef832114", + "token": { + "decimals": 0, + "symbol": "BAGZ" + }, + "isSC": {} + }, + "0x2f911f789d9d599b34d403a2cfc0c5b3f7e8ce7a": { + "name": "GeM token contract", + "address": "0x2f911f789d9d599b34d403a2cfc0c5b3f7e8ce7a", + "token": { + "decimals": 18, + "symbol": "GeM" + }, + "isSC": {} + }, + "0x8d520c8e66091cfd6743fe37fbe3a09505616c4b": { + "name": "COT token contract", + "address": "0x8d520c8e66091cfd6743fe37fbe3a09505616c4b", + "token": { + "decimals": 18, + "symbol": "COT" + }, + "isSC": {} + }, + "0xd9ce16ac93b783e069353a57220bf0e9c5315daf": { + "name": "PAWR token contract", + "address": "0xd9ce16ac93b783e069353a57220bf0e9c5315daf", + "token": { + "decimals": 18, + "symbol": "PAWR" + }, + "isSC": {} + }, + "0x293b3b56ccf37fce9bd4d8a3e276ff6c24bc72b4": { + "name": "BDG token contract", + "address": "0x293b3b56ccf37fce9bd4d8a3e276ff6c24bc72b4", + "token": { + "decimals": 18, + "symbol": "BDG" + }, + "isSC": {} + }, + "0xc54a5024b6c5e565772729b783021f60a8f9139c": { + "name": "SMOKE token contract", + "address": "0xc54a5024b6c5e565772729b783021f60a8f9139c", + "token": { + "decimals": 18, + "symbol": "SMOKE" + }, + "isSC": {} + }, + "0xe50c778924604b2aa3e66fb5c2d378d5fc15fcd5": { + "name": "ENFTI token contract", + "address": "0xe50c778924604b2aa3e66fb5c2d378d5fc15fcd5", + "token": { + "decimals": 18, + "symbol": "ENFTI" + }, + "isSC": {} + }, + "0x778949e707a0eb6c32ca20b1f9e0db9685d18024": { + "name": "GSG token contract", + "address": "0x778949e707a0eb6c32ca20b1f9e0db9685d18024", + "token": { + "decimals": 18, + "symbol": "GSG" + }, + "isSC": {} + }, + "0x8839e639f210b80ffea73aedf51baed8dac04499": { + "name": "DWEB token contract", + "address": "0x8839e639f210b80ffea73aedf51baed8dac04499", + "token": { + "decimals": 18, + "symbol": "DWEB" + }, + "isSC": {} + }, + "0x1f435c17d7ff631218827f9ba43a696650a9d512": { + "name": "LMLT token contract", + "address": "0x1f435c17d7ff631218827f9ba43a696650a9d512", + "token": { + "decimals": 18, + "symbol": "LMLT" + }, + "isSC": {} + }, + "0x194dd5b6b7225c9d2f2e2b2af7a4ffc8e77fd479": { + "name": "DHP token contract", + "address": "0x194dd5b6b7225c9d2f2e2b2af7a4ffc8e77fd479", + "token": { + "decimals": 18, + "symbol": "DHP" + }, + "isSC": {} + }, + "0x510379859d138d1854e925c7472674f4a827296a": { + "name": "ROTTS token contract", + "address": "0x510379859d138d1854e925c7472674f4a827296a", + "token": { + "decimals": 9, + "symbol": "ROTTS" + }, + "isSC": {} + }, + "0x83000597e8420ad7e9edd410b2883df1b83823cf": { + "name": "P125 token contract", + "address": "0x83000597e8420ad7e9edd410b2883df1b83823cf", + "token": { + "decimals": 18, + "symbol": "P125" + }, + "isSC": {} + }, + "0xbcc4a4dc490500161a4d91bc1cce5929224ec385": { + "name": "SHIBLONMOON token contract", + "address": "0xbcc4a4dc490500161a4d91bc1cce5929224ec385", + "token": { + "decimals": 18, + "symbol": "SHIBLONMOON" + }, + "isSC": {} + }, + "0xcd150b1f528f326f5194c012f32eb30135c7c2c9": { + "name": "OOKI token contract", + "address": "0xcd150b1f528f326f5194c012f32eb30135c7c2c9", + "token": { + "decimals": 18, + "symbol": "OOKI" + }, + "isSC": {} + }, + "0xaa7dbd1598251f856c12f63557a4c4397c253cea": { + "name": "MCO2 token contract", + "address": "0xaa7dbd1598251f856c12f63557a4c4397c253cea", + "token": { + "decimals": 18, + "symbol": "MCO2" + }, + "isSC": {} + }, + "0xac05696a96fbf947200876abb8e71b9e18ef3d6a": { + "name": "EL69 token contract", + "address": "0xac05696a96fbf947200876abb8e71b9e18ef3d6a", + "token": { + "decimals": 18, + "symbol": "EL69" + }, + "isSC": {} + }, + "0xcdcb83ff608e7decb66ff597da9d438f8896bdb1": { + "name": "TCS token contract", + "address": "0xcdcb83ff608e7decb66ff597da9d438f8896bdb1", + "token": { + "decimals": 9, + "symbol": "TCS" + }, + "isSC": {} + }, + "0x91c5a5488c0decde1eacd8a4f10e0942fb925067": { + "name": "AUDT token contract", + "address": "0x91c5a5488c0decde1eacd8a4f10e0942fb925067", + "token": { + "decimals": 18, + "symbol": "AUDT" + }, + "isSC": {} + }, + "0xda9f97b9de8509938c65db0f0cb0ff9ea425e9a0": { + "name": "KRILL token contract", + "address": "0xda9f97b9de8509938c65db0f0cb0ff9ea425e9a0", + "token": { + "decimals": 18, + "symbol": "KRILL" + }, + "isSC": {} + }, + "0x01d35cbc2070a3b76693ce2b6364eae24eb88591": { + "name": "PGEN token contract", + "address": "0x01d35cbc2070a3b76693ce2b6364eae24eb88591", + "token": { + "decimals": 18, + "symbol": "PGEN" + }, + "isSC": {} + }, + "0xae36df61954a67c88ea8e0b8a9b0af378abb013b": { + "name": "Sunder token contract", + "address": "0xae36df61954a67c88ea8e0b8a9b0af378abb013b", + "token": { + "decimals": 18, + "symbol": "Sunder" + }, + "isSC": {} + }, + "0xf95c5f961cf676ae927dff05342a0741b99e3564": { + "name": "NGL token contract", + "address": "0xf95c5f961cf676ae927dff05342a0741b99e3564", + "token": { + "decimals": 18, + "symbol": "NGL" + }, + "isSC": {} + }, + "0xe79378aaf2386452960a365fb8d720ac888c9614": { + "name": "SOUL token contract", + "address": "0xe79378aaf2386452960a365fb8d720ac888c9614", + "token": { + "decimals": 8, + "symbol": "SOUL" + }, + "isSC": {} + }, + "0x56a25375e6930114fe0b428df5ccdc753db99898": { + "name": "FORS token contract", + "address": "0x56a25375e6930114fe0b428df5ccdc753db99898", + "token": { + "decimals": 18, + "symbol": "FORS" + }, + "isSC": {} + }, + "0x5b3dcb07244dccbd22a42080ae8b35e7a7593ed3": { + "name": "$ token contract", + "address": "0x5b3dcb07244dccbd22a42080ae8b35e7a7593ed3", + "token": { + "decimals": 18, + "symbol": "$" + }, + "isSC": {} + }, + "0x9a0e65942615de1eb5f5dd0ccb89090719231410": { + "name": "XD token contract", + "address": "0x9a0e65942615de1eb5f5dd0ccb89090719231410", + "token": { + "decimals": 18, + "symbol": "XD" + }, + "isSC": {} + }, + "0x136b7098a3fe98cbb8eb00f5cfed393e96e317e3": { + "name": "AGLT token contract", + "address": "0x136b7098a3fe98cbb8eb00f5cfed393e96e317e3", + "token": { + "decimals": 18, + "symbol": "AGLT" + }, + "isSC": {} + }, + "0x8c4476dfec8e7eedf2de3e9e9461b7c14c828d46": { + "name": "UNIX token contract", + "address": "0x8c4476dfec8e7eedf2de3e9e9461b7c14c828d46", + "token": { + "decimals": 18, + "symbol": "UNIX" + }, + "isSC": {} + }, + "0x5314ba045a459f63906aa7c76d9f337dcb7d6995": { + "name": "FODL token contract", + "address": "0x5314ba045a459f63906aa7c76d9f337dcb7d6995", + "token": { + "decimals": 18, + "symbol": "FODL" + }, + "isSC": {} + }, + "0x05323017c00874198cf1b0832922074beea0db83": { + "name": "MONO token contract", + "address": "0x05323017c00874198cf1b0832922074beea0db83", + "token": { + "decimals": 18, + "symbol": "MONO" + }, + "isSC": {} + }, + "0x0b80bfcfd006c446af4157b87aa7d7f13c8f549a": { + "name": "KOROMARU token contract", + "address": "0x0b80bfcfd006c446af4157b87aa7d7f13c8f549a", + "token": { + "decimals": 9, + "symbol": "KOROMARU" + }, + "isSC": {} + }, + "0x1f7826d9562f42e745823bdbb690902e00d995f6": { + "name": "BLUEMEL token contract", + "address": "0x1f7826d9562f42e745823bdbb690902e00d995f6", + "token": { + "decimals": 18, + "symbol": "BLUEMEL" + }, + "isSC": {} + }, + "0x60e6895184448f3e8ef509d083e3cc3ac31f82fd": { + "name": "KTX token contract", + "address": "0x60e6895184448f3e8ef509d083e3cc3ac31f82fd", + "token": { + "decimals": 18, + "symbol": "KTX" + }, + "isSC": {} + }, + "0x2596a8b90d39eb89d5668ca5b6dee54e9ae3d4c0": { + "name": "TAT2 token contract", + "address": "0x2596a8b90d39eb89d5668ca5b6dee54e9ae3d4c0", + "token": { + "decimals": 18, + "symbol": "TAT2" + }, + "isSC": {} + }, + "0x2e0f9a07d0ef445db402d1c656ea6b71af81cb65": { + "name": "SATA token contract", + "address": "0x2e0f9a07d0ef445db402d1c656ea6b71af81cb65", + "token": { + "decimals": 18, + "symbol": "SATA" + }, + "isSC": {} + }, + "0xacd4e2d936be9b16c01848a3742a34b3d5a5bdfa": { + "name": "$MECHA token contract", + "address": "0xacd4e2d936be9b16c01848a3742a34b3d5a5bdfa", + "token": { + "decimals": 18, + "symbol": "$MECHA" + }, + "isSC": {} + }, + "0x5a7aaddd5f1d343fa4248c3e2a02d8a18626b9d0": { + "name": "xDRINK token contract", + "address": "0x5a7aaddd5f1d343fa4248c3e2a02d8a18626b9d0", + "token": { + "decimals": 18, + "symbol": "xDRINK" + }, + "isSC": {} + }, + "0x900f717ea076e1e7a484ad9dd2db81ceec60ebf1": { + "name": "ANGLE token contract", + "address": "0x900f717ea076e1e7a484ad9dd2db81ceec60ebf1", + "token": { + "decimals": 18, + "symbol": "ANGLE" + }, + "isSC": {} + }, + "0xe0b52e49357fd4daf2c15e02058dce6bc0057db4": { + "name": "agEUR token contract", + "address": "0xe0b52e49357fd4daf2c15e02058dce6bc0057db4", + "token": { + "decimals": 18, + "symbol": "agEUR" + }, + "isSC": {} + }, + "0xc6480da81151b2277761024599e8db2ad4c388c8": { + "name": "xDG token contract", + "address": "0xc6480da81151b2277761024599e8db2ad4c388c8", + "token": { + "decimals": 18, + "symbol": "xDG" + }, + "isSC": {} + }, + "0x5b03ac408938c97e50db3bc5675d182606a01377": { + "name": "DODI token contract", + "address": "0x5b03ac408938c97e50db3bc5675d182606a01377", + "token": { + "decimals": 18, + "symbol": "DODI" + }, + "isSC": {} + }, + "0xef938b6da8576a896f6e0321ef80996f4890f9c4": { + "name": "DG token contract", + "address": "0xef938b6da8576a896f6e0321ef80996f4890f9c4", + "token": { + "decimals": 18, + "symbol": "DG" + }, + "isSC": {} + }, + "0xb915894b10e0c30b8a9c8bf2a0c521961bb18593": { + "name": "AWA token contract", + "address": "0xb915894b10e0c30b8a9c8bf2a0c521961bb18593", + "token": { + "decimals": 18, + "symbol": "AWA" + }, + "isSC": {} + }, + "0xa4f40bd861431186aa0648b9c57af0313d2d2f57": { + "name": "HUB token contract", + "address": "0xa4f40bd861431186aa0648b9c57af0313d2d2f57", + "token": { + "decimals": 18, + "symbol": "HUB" + }, + "isSC": {} + }, + "0x184bc6a6040f139027e9659dc2b87bfcfde4a39e": { + "name": "SHINJA token contract", + "address": "0x184bc6a6040f139027e9659dc2b87bfcfde4a39e", + "token": { + "decimals": 9, + "symbol": "SHINJA" + }, + "isSC": {} + }, + "0xe499140a7362927bb23889c4d60a6b9b3347f8ca": { + "name": "MCC token contract", + "address": "0xe499140a7362927bb23889c4d60a6b9b3347f8ca", + "token": { + "decimals": 9, + "symbol": "MCC" + }, + "isSC": {} + }, + "0x822c03792acd5274237b031ec8e48456f48e1211": { + "name": "WDW token contract", + "address": "0x822c03792acd5274237b031ec8e48456f48e1211", + "token": { + "decimals": 18, + "symbol": "WDW" + }, + "isSC": {} + }, + "0x1b0cc1a5d296fda5971d582dbb87b07fb120b92c": { + "name": "R4S token contract", + "address": "0x1b0cc1a5d296fda5971d582dbb87b07fb120b92c", + "token": { + "decimals": 18, + "symbol": "R4S" + }, + "isSC": {} + }, + "0xd53cb20f90187636bba1b08b4f96a018a141de63": { + "name": "XGMTS token contract", + "address": "0xd53cb20f90187636bba1b08b4f96a018a141de63", + "token": { + "decimals": 18, + "symbol": "XGMTS" + }, + "isSC": {} + }, + "0xc226374dd015445084a2b4c348bde4affd950ad9": { + "name": "SS17 token contract", + "address": "0xc226374dd015445084a2b4c348bde4affd950ad9", + "token": { + "decimals": 18, + "symbol": "SS17" + }, + "isSC": {} + }, + "0xaef7e3da2bb3438d8540a6abe27095ea89f3b3b0": { + "name": "SS16 token contract", + "address": "0xaef7e3da2bb3438d8540a6abe27095ea89f3b3b0", + "token": { + "decimals": 18, + "symbol": "SS16" + }, + "isSC": {} + }, + "0x9634af3af2f392505369fcfe56691790cea345b4": { + "name": "MAX token contract", + "address": "0x9634af3af2f392505369fcfe56691790cea345b4", + "token": { + "decimals": 18, + "symbol": "MAX" + }, + "isSC": {} + }, + "0x3afe98235d680e8d7a52e1458a59d60f45f935c0": { + "name": "BBG token contract", + "address": "0x3afe98235d680e8d7a52e1458a59d60f45f935c0", + "token": { + "decimals": 18, + "symbol": "BBG" + }, + "isSC": {} + }, + "0x2694e54166a1aa849131781273cd3bf214309642": { + "name": "VMC token contract", + "address": "0x2694e54166a1aa849131781273cd3bf214309642", + "token": { + "decimals": 18, + "symbol": "VMC" + }, + "isSC": {} + }, + "0xd4945a3d0de9923035521687d4bf18cc9b0c7c2a": { + "name": "LUXY token contract", + "address": "0xd4945a3d0de9923035521687d4bf18cc9b0c7c2a", + "token": { + "decimals": 18, + "symbol": "LUXY" + }, + "isSC": {} + }, + "0x481791e5c37cf831ed03742c7c5b5cffa83a27d4": { + "name": "GLUM token contract", + "address": "0x481791e5c37cf831ed03742c7c5b5cffa83a27d4", + "token": { + "decimals": 8, + "symbol": "GLUM" + }, + "isSC": {} + }, + "0xadf2f2ed91755ea3f4bcc9107a494879f633ae7c": { + "name": "REQ token contract", + "address": "0xadf2f2ed91755ea3f4bcc9107a494879f633ae7c", + "token": { + "decimals": 18, + "symbol": "REQ" + }, + "isSC": {} + }, + "0x8449d85fc7989ad7f34f8da986f512aea9e6920e": { + "name": "LUFFY token contract", + "address": "0x8449d85fc7989ad7f34f8da986f512aea9e6920e", + "token": { + "decimals": 9, + "symbol": "LUFFY" + }, + "isSC": {} + }, + "0x67561239d0fd07a37b5621ae7c2b2f1413491033": { + "name": "PRTN token contract", + "address": "0x67561239d0fd07a37b5621ae7c2b2f1413491033", + "token": { + "decimals": 18, + "symbol": "PRTN" + }, + "isSC": {} + }, + "0xe24c8e7c61d4545eb69f13dc9b1f40cff679ba07": { + "name": "UBA token contract", + "address": "0xe24c8e7c61d4545eb69f13dc9b1f40cff679ba07", + "token": { + "decimals": 18, + "symbol": "UBA" + }, + "isSC": {} + }, + "0x059eb35959b5ad5a37ce9198726cab84824fd690": { + "name": "IBY token contract", + "address": "0x059eb35959b5ad5a37ce9198726cab84824fd690", + "token": { + "decimals": 18, + "symbol": "IBY" + }, + "isSC": {} + }, + "0x641675a002021f645117287c92a20059b6a347f9": { + "name": "LTX token contract", + "address": "0x641675a002021f645117287c92a20059b6a347f9", + "token": { + "decimals": 8, + "symbol": "LTX" + }, + "isSC": {} + }, + "0xa67c1cc2adf4969667980811b65a456d204d7ce5": { + "name": "VERSE token contract", + "address": "0xa67c1cc2adf4969667980811b65a456d204d7ce5", + "token": { + "decimals": 18, + "symbol": "VERSE" + }, + "isSC": {} + }, + "0x5ba499a413e6afcafc7a79a73aace4bd94a8a33a": { + "name": "AIDI token contract", + "address": "0x5ba499a413e6afcafc7a79a73aace4bd94a8a33a", + "token": { + "decimals": 9, + "symbol": "AIDI" + }, + "isSC": {} + }, + "0x3fc98379bb51bbefdfb882be2bb928d118a1990a": { + "name": "TLBC token contract", + "address": "0x3fc98379bb51bbefdfb882be2bb928d118a1990a", + "token": { + "decimals": 2, + "symbol": "TLBC" + }, + "isSC": {} + }, + "0xd4744644449c47fe07b110b53ab0c5415b2ec346": { + "name": "TLB token contract", + "address": "0xd4744644449c47fe07b110b53ab0c5415b2ec346", + "token": { + "decimals": 8, + "symbol": "TLB" + }, + "isSC": {} + }, + "0x1c483c609fa8bb24a27d97752876a9fb9fbdb749": { + "name": "REFRACT token contract", + "address": "0x1c483c609fa8bb24a27d97752876a9fb9fbdb749", + "token": { + "decimals": 18, + "symbol": "REFRACT" + }, + "isSC": {} + }, + "0x80ae3b3847e4e8bd27a389f7686486cac9c3f3e8": { + "name": "SARCO token contract", + "address": "0x80ae3b3847e4e8bd27a389f7686486cac9c3f3e8", + "token": { + "decimals": 18, + "symbol": "SARCO" + }, + "isSC": {} + }, + "0xef205f99bd869e74b16050199d54327a0ecd343d": { + "name": "FOLO token contract", + "address": "0xef205f99bd869e74b16050199d54327a0ecd343d", + "token": { + "decimals": 18, + "symbol": "FOLO" + }, + "isSC": {} + }, + "0x353bb01c07e5dca9819bf7b004c2a3465d29851f": { + "name": "SHAMAN token contract", + "address": "0x353bb01c07e5dca9819bf7b004c2a3465d29851f", + "token": { + "decimals": 9, + "symbol": "SHAMAN" + }, + "isSC": {} + }, + "0x83cc0e81467ed905dff9b3621f570d01906acbd5": { + "name": "HOKAGE token contract", + "address": "0x83cc0e81467ed905dff9b3621f570d01906acbd5", + "token": { + "decimals": 9, + "symbol": "HOKAGE" + }, + "isSC": {} + }, + "0x303b2d090e5ae3a9aafae3551f2ff3837820c296": { + "name": "EDOGE token contract", + "address": "0x303b2d090e5ae3a9aafae3551f2ff3837820c296", + "token": { + "decimals": 18, + "symbol": "EDOGE" + }, + "isSC": {} + }, + "0x439207292e5452f82abed7d5b74089e2b46c85c5": { + "name": "EDGE token contract", + "address": "0x439207292e5452f82abed7d5b74089e2b46c85c5", + "token": { + "decimals": 18, + "symbol": "EDGE" + }, + "isSC": {} + }, + "0xb08adf932641b1e99250150ff3287f45b30685f0": { + "name": "SFSHLD token contract", + "address": "0xb08adf932641b1e99250150ff3287f45b30685f0", + "token": { + "decimals": 9, + "symbol": "SFSHLD" + }, + "isSC": {} + }, + "0x1214d61f3daa45af4a5f301075c58fbe57c8e6d7": { + "name": "DTT token contract", + "address": "0x1214d61f3daa45af4a5f301075c58fbe57c8e6d7", + "token": { + "decimals": 18, + "symbol": "DTT" + }, + "isSC": {} + }, + "0x51b5619f5180e333d18b6310c8d540aea43a0371": { + "name": "VHC token contract", + "address": "0x51b5619f5180e333d18b6310c8d540aea43a0371", + "token": { + "decimals": 18, + "symbol": "VHC" + }, + "isSC": {} + }, + "0xafbabaa1591d1afa0f62935e95265cb937c2facf": { + "name": "IGRY token contract", + "address": "0xafbabaa1591d1afa0f62935e95265cb937c2facf", + "token": { + "decimals": 18, + "symbol": "IGRY" + }, + "isSC": {} + }, + "0x7582a64734f40c1eaa23144fc43ca1a748723527": { + "name": "SAITAMA token contract", + "address": "0x7582a64734f40c1eaa23144fc43ca1a748723527", + "token": { + "decimals": 9, + "symbol": "SAITAMA" + }, + "isSC": {} + }, + "0x522a3bd54d5d6a9cc67592e31cc1a745630daf50": { + "name": "aUST token contract", + "address": "0x522a3bd54d5d6a9cc67592e31cc1a745630daf50", + "token": { + "decimals": 18, + "symbol": "aUST" + }, + "isSC": {} + }, + "0xd49e6e4ea56eb71e45809ff208eafd053653d95c": { + "name": "PICIPO token contract", + "address": "0xd49e6e4ea56eb71e45809ff208eafd053653d95c", + "token": { + "decimals": 18, + "symbol": "PICIPO" + }, + "isSC": {} + }, + "0x9582b02d5ac3eb6940ae02e6d4ab220c3ca9d317": { + "name": "ZUG token contract", + "address": "0x9582b02d5ac3eb6940ae02e6d4ab220c3ca9d317", + "token": { + "decimals": 18, + "symbol": "ZUG" + }, + "isSC": {} + }, + "0xc79745bf7c00d7d78cf7a3713c798faee8f7dc45": { + "name": "TKING token contract", + "address": "0xc79745bf7c00d7d78cf7a3713c798faee8f7dc45", + "token": { + "decimals": 18, + "symbol": "TKING" + }, + "isSC": {} + }, + "0xeaecc18198a475c921b24b8a6c1c1f0f5f3f7ea0": { + "name": "SEED token contract", + "address": "0xeaecc18198a475c921b24b8a6c1c1f0f5f3f7ea0", + "token": { + "decimals": 18, + "symbol": "SEED" + }, + "isSC": {} + }, + "0xd5fa77a860fea9cff31da91bbf9e0faea9538290": { + "name": "COLLAR token contract", + "address": "0xd5fa77a860fea9cff31da91bbf9e0faea9538290", + "token": { + "decimals": 18, + "symbol": "COLLAR" + }, + "isSC": {} + }, + "0xa06657b69bd9462a468ad6533b4b819caee8b29e": { + "name": "CANDI token contract", + "address": "0xa06657b69bd9462a468ad6533b4b819caee8b29e", + "token": { + "decimals": 18, + "symbol": "CANDI" + }, + "isSC": {} + }, + "0x10c5a602c7661e916a863b3bd164796d6cdd3d72": { + "name": "SOM token contract", + "address": "0x10c5a602c7661e916a863b3bd164796d6cdd3d72", + "token": { + "decimals": 9, + "symbol": "SOM" + }, + "isSC": {} + }, + "0xbf979592fb6b57b4293d0d7eed0e093478a5c890": { + "name": "ZINU token contract", + "address": "0xbf979592fb6b57b4293d0d7eed0e093478a5c890", + "token": { + "decimals": 9, + "symbol": "ZINU" + }, + "isSC": {} + }, + "0x5cfdf4cca482d419da979c10b70039c28f2a1f08": { + "name": "JAX token contract", + "address": "0x5cfdf4cca482d419da979c10b70039c28f2a1f08", + "token": { + "decimals": 18, + "symbol": "JAX" + }, + "isSC": {} + }, + "0x07fcd81bf6156e49c64f0ba70f962a9f5111d39d": { + "name": "BCVT token contract", + "address": "0x07fcd81bf6156e49c64f0ba70f962a9f5111d39d", + "token": { + "decimals": 18, + "symbol": "BCVT" + }, + "isSC": {} + }, + "0x83ce0b442ec51cfa62310aa1789210cfe2c5556e": { + "name": "AXC token contract", + "address": "0x83ce0b442ec51cfa62310aa1789210cfe2c5556e", + "token": { + "decimals": 18, + "symbol": "AXC" + }, + "isSC": {} + }, + "0xbb812fd66b98a38f2bf6a22759462f0993c1dbbe": { + "name": "Shiryo-Inu token contract", + "address": "0xbb812fd66b98a38f2bf6a22759462f0993c1dbbe", + "token": { + "decimals": 9, + "symbol": "Shiryo-Inu" + }, + "isSC": {} + }, + "0x07d496919669c88ccec363c55df98d494fd4d796": { + "name": "DOE token contract", + "address": "0x07d496919669c88ccec363c55df98d494fd4d796", + "token": { + "decimals": 18, + "symbol": "DOE" + }, + "isSC": {} + }, + "0xcbea86af7581594d85d44469429bc6a273f9b562": { + "name": "kitty token contract", + "address": "0xcbea86af7581594d85d44469429bc6a273f9b562", + "token": { + "decimals": 9, + "symbol": "kitty" + }, + "isSC": {} + }, + "0xbd7a5cf51d22930b8b3df6d834f9bcef90ee7c4f": { + "name": "ENS token contract", + "address": "0xbd7a5cf51d22930b8b3df6d834f9bcef90ee7c4f", + "token": { + "decimals": 18, + "symbol": "ENS" + }, + "isSC": {} + }, + "0xb8218785cb4d14dbdd94bf314f361542579b4815": { + "name": "$HRIMP token contract", + "address": "0xb8218785cb4d14dbdd94bf314f361542579b4815", + "token": { + "decimals": 18, + "symbol": "$HRIMP" + }, + "isSC": {} + }, + "0x6041551eca4fdcb55e3fb91fe8d9f460c4ddeca7": { + "name": "SGE token contract", + "address": "0x6041551eca4fdcb55e3fb91fe8d9f460c4ddeca7", + "token": { + "decimals": 9, + "symbol": "SGE" + }, + "isSC": {} + }, + "0x31168476a4a722f639c2edb69281e0b2585eefcf": { + "name": "ac2c11ea token contract", + "address": "0x31168476a4a722f639c2edb69281e0b2585eefcf", + "token": { + "decimals": 18, + "symbol": "ac2c11ea" + }, + "isSC": {} + }, + "0x4fb19d9cc639c556db433e7cb63722ceb2289af0": { + "name": "NBC token contract", + "address": "0x4fb19d9cc639c556db433e7cb63722ceb2289af0", + "token": { + "decimals": 18, + "symbol": "NBC" + }, + "isSC": {} + }, + "0x2ca402536721db44286564dc0dd807aeab60cec5": { + "name": "FNK token contract", + "address": "0x2ca402536721db44286564dc0dd807aeab60cec5", + "token": { + "decimals": 18, + "symbol": "FNK" + }, + "isSC": {} + }, + "0x73bee5d745da8b0c39437df8eaf64ce0589a6575": { + "name": "KIBA token contract", + "address": "0x73bee5d745da8b0c39437df8eaf64ce0589a6575", + "token": { + "decimals": 9, + "symbol": "KIBA" + }, + "isSC": {} + }, + "0xf88fc6b493eda7650e4bcf7a290e8d108f677cfe": { + "name": "GODS token contract", + "address": "0xf88fc6b493eda7650e4bcf7a290e8d108f677cfe", + "token": { + "decimals": 18, + "symbol": "GODS" + }, + "isSC": {} + }, + "0xe8b6f80454b9c2e6905fe2b1bd5db5223657fa21": { + "name": "STARL token contract", + "address": "0xe8b6f80454b9c2e6905fe2b1bd5db5223657fa21", + "token": { + "decimals": 18, + "symbol": "STARL" + }, + "isSC": {} + }, + "0x350c8db3e569d4445dd81ad0f1c628f7f6e0187f": { + "name": "NOLLY token contract", + "address": "0x350c8db3e569d4445dd81ad0f1c628f7f6e0187f", + "token": { + "decimals": 18, + "symbol": "NOLLY" + }, + "isSC": {} + }, + "0xfd75cd593aace53731f240f32ec4756a957b3344": { + "name": "LITH token contract", + "address": "0xfd75cd593aace53731f240f32ec4756a957b3344", + "token": { + "decimals": 18, + "symbol": "LITH" + }, + "isSC": {} + }, + "0x24705371be6ee97e5780646fb60b8396058c1798": { + "name": "DOBE token contract", + "address": "0x24705371be6ee97e5780646fb60b8396058c1798", + "token": { + "decimals": 18, + "symbol": "DOBE" + }, + "isSC": {} + }, + "0xd882b0ac8ccc38c88eb1486b6ce8486f102fe3ac": { + "name": "SPWN token contract", + "address": "0xd882b0ac8ccc38c88eb1486b6ce8486f102fe3ac", + "token": { + "decimals": 18, + "symbol": "SPWN" + }, + "isSC": {} + }, + "0xe64acf4ec1dc9a112ab705ad927ccb17427aefb5": { + "name": "KICK token contract", + "address": "0xe64acf4ec1dc9a112ab705ad927ccb17427aefb5", + "token": { + "decimals": 10, + "symbol": "KICK" + }, + "isSC": {} + }, + "0xe439273659b86e33716bcf7ad22408b541df50b1": { + "name": "BSL token contract", + "address": "0xe439273659b86e33716bcf7ad22408b541df50b1", + "token": { + "decimals": 8, + "symbol": "BSL" + }, + "isSC": {} + }, + "0x276c9cbaa4bdf57d7109a41e67bd09699536fa3d": { + "name": "CUBE token contract", + "address": "0x276c9cbaa4bdf57d7109a41e67bd09699536fa3d", + "token": { + "decimals": 8, + "symbol": "CUBE" + }, + "isSC": {} + }, + "0xb8e89dcd3025b05784cc5daea3108b697ffb6697": { + "name": "dEth token contract", + "address": "0xb8e89dcd3025b05784cc5daea3108b697ffb6697", + "token": { + "decimals": 18, + "symbol": "dEth" + }, + "isSC": {} + }, + "0xfba8a25156c33fecbe84f57c2d45c1d50f5afcd0": { + "name": "VNTW token contract", + "address": "0xfba8a25156c33fecbe84f57c2d45c1d50f5afcd0", + "token": { + "decimals": 18, + "symbol": "VNTW" + }, + "isSC": {} + }, + "0x700b9de93e2fd5455cb91c474dad6cfea6598f64": { + "name": "MDF token contract", + "address": "0x700b9de93e2fd5455cb91c474dad6cfea6598f64", + "token": { + "decimals": 18, + "symbol": "MDF" + }, + "isSC": {} + }, + "0xfa46daf9909e116dbc40fe1cc95fc0bb1f452abe": { + "name": "ILV token contract", + "address": "0xfa46daf9909e116dbc40fe1cc95fc0bb1f452abe", + "token": { + "decimals": 18, + "symbol": "ILV" + }, + "isSC": {} + }, + "0x3c6d9c9296f8a87be0cb639167e152d46c831087": { + "name": "BlueSparrow token contract", + "address": "0x3c6d9c9296f8a87be0cb639167e152d46c831087", + "token": { + "decimals": 9, + "symbol": "BlueSparrow" + }, + "isSC": {} + }, + "0xef101840250783b6f1004510333c7a6f37b1452a": { + "name": "KCAL token contract", + "address": "0xef101840250783b6f1004510333c7a6f37b1452a", + "token": { + "decimals": 10, + "symbol": "KCAL" + }, + "isSC": {} + }, + "0x95f3b277b5a688f78ab0047bd298f09fb263e089": { + "name": "BLAST token contract", + "address": "0x95f3b277b5a688f78ab0047bd298f09fb263e089", + "token": { + "decimals": 9, + "symbol": "BLAST" + }, + "isSC": {} + }, + "0x0a5926027d407222f8fe20f24cb16e103f617046": { + "name": "NFD token contract", + "address": "0x0a5926027d407222f8fe20f24cb16e103f617046", + "token": { + "decimals": 18, + "symbol": "NFD" + }, + "isSC": {} + }, + "0x422361e0e97cbfd5f95d5a50f50598a6fc4d8ce6": { + "name": "AVA token contract", + "address": "0x422361e0e97cbfd5f95d5a50f50598a6fc4d8ce6", + "token": { + "decimals": 18, + "symbol": "AVA" + }, + "isSC": {} + }, + "0xc3c604f1943b8c619c5d65cd11a876e9c8edcf10": { + "name": "MGH token contract", + "address": "0xc3c604f1943b8c619c5d65cd11a876e9c8edcf10", + "token": { + "decimals": 18, + "symbol": "MGH" + }, + "isSC": {} + }, + "0xb6ff0eaac1b4b415a5175803f16896b09b2db175": { + "name": "GSWAP token contract", + "address": "0xb6ff0eaac1b4b415a5175803f16896b09b2db175", + "token": { + "decimals": 18, + "symbol": "GSWAP" + }, + "isSC": {} + }, + "0x7e6663d14f058880fad199bcb745a81c46407809": { + "name": "DOD token contract", + "address": "0x7e6663d14f058880fad199bcb745a81c46407809", + "token": { + "decimals": 18, + "symbol": "DOD" + }, + "isSC": {} + }, + "0x2934b36ca9a4b31e633c5be670c8c8b28b6aa015": { + "name": "THX token contract", + "address": "0x2934b36ca9a4b31e633c5be670c8c8b28b6aa015", + "token": { + "decimals": 18, + "symbol": "THX" + }, + "isSC": {} + }, + "0xc5b57e9a1e7914fda753a88f24e5703e617ee50c": { + "name": "POP token contract", + "address": "0xc5b57e9a1e7914fda753a88f24e5703e617ee50c", + "token": { + "decimals": 18, + "symbol": "POP" + }, + "isSC": {} + }, + "0x12b54baa8ffcfd6679ccf1ae618ca3006cfcc2ac": { + "name": "CHLI token contract", + "address": "0x12b54baa8ffcfd6679ccf1ae618ca3006cfcc2ac", + "token": { + "decimals": 18, + "symbol": "CHLI" + }, + "isSC": {} + }, + "0x298018eeec6d4a38aa33ab73bf4954b9d1af68fc": { + "name": "PINU token contract", + "address": "0x298018eeec6d4a38aa33ab73bf4954b9d1af68fc", + "token": { + "decimals": 9, + "symbol": "PINU" + }, + "isSC": {} + }, + "0x0e857076ea922630c844a047f4bb7342f2ed59e2": { + "name": "Mononoke-Inu token contract", + "address": "0x0e857076ea922630c844a047f4bb7342f2ed59e2", + "token": { + "decimals": 9, + "symbol": "Mononoke-Inu" + }, + "isSC": {} + }, + "0xfaf25c39ea29c3aa4a0bfbdbcf2dd99845192695": { + "name": "WKGR token contract", + "address": "0xfaf25c39ea29c3aa4a0bfbdbcf2dd99845192695", + "token": { + "decimals": 18, + "symbol": "WKGR" + }, + "isSC": {} + }, + "0x700481409de3f632f61a2ac9bfd76138357714da": { + "name": "GOL token contract", + "address": "0x700481409de3f632f61a2ac9bfd76138357714da", + "token": { + "decimals": 8, + "symbol": "GOL" + }, + "isSC": {} + }, + "0x1b89c7e4c0967e7052144b446fa6cd4ac94abd2b": { + "name": "THIS token contract", + "address": "0x1b89c7e4c0967e7052144b446fa6cd4ac94abd2b", + "token": { + "decimals": 18, + "symbol": "THIS" + }, + "isSC": {} + }, + "0xa91fe5a535967f52d3abebdffb3b306d964ace13": { + "name": "QUARTZ token contract", + "address": "0xa91fe5a535967f52d3abebdffb3b306d964ace13", + "token": { + "decimals": 18, + "symbol": "QUARTZ" + }, + "isSC": {} + }, + "0xca8c6dea40a6de9be3b4c73a1aefaafdb4754f73": { + "name": "PIXA token contract", + "address": "0xca8c6dea40a6de9be3b4c73a1aefaafdb4754f73", + "token": { + "decimals": 0, + "symbol": "PIXA" + }, + "isSC": {} + }, + "0x6bd9da80d6a7aa03d739353096df36ec18738c99": { + "name": "sUKH token contract", + "address": "0x6bd9da80d6a7aa03d739353096df36ec18738c99", + "token": { + "decimals": 18, + "symbol": "sUKH" + }, + "isSC": {} + }, + "0xef3943736181f259a4e94d9d6d8658996fb9f785": { + "name": "bUKH token contract", + "address": "0xef3943736181f259a4e94d9d6d8658996fb9f785", + "token": { + "decimals": 18, + "symbol": "bUKH" + }, + "isSC": {} + }, + "0x4df071fb2d145be595b767f997c91818694a6ce1": { + "name": "MRCH token contract", + "address": "0x4df071fb2d145be595b767f997c91818694a6ce1", + "token": { + "decimals": 18, + "symbol": "MRCH" + }, + "isSC": {} + }, + "0xfb57dc345cb5e155b0437a71b5e28557b557488a": { + "name": "HLN token contract", + "address": "0xfb57dc345cb5e155b0437a71b5e28557b557488a", + "token": { + "decimals": 18, + "symbol": "HLN" + }, + "isSC": {} + }, + "0x76b032370987e91c515d1b96ebd04de059bec534": { + "name": "NXT token contract", + "address": "0x76b032370987e91c515d1b96ebd04de059bec534", + "token": { + "decimals": 18, + "symbol": "NXT" + }, + "isSC": {} + }, + "0xada94b6c6d263807070ab7378fca3dfa45ec8e4c": { + "name": "SESAME token contract", + "address": "0xada94b6c6d263807070ab7378fca3dfa45ec8e4c", + "token": { + "decimals": 18, + "symbol": "SESAME" + }, + "isSC": {} + }, + "0x50bcbc40306230713239ae1bddd5eefeeaa273dc": { + "name": "ASIA token contract", + "address": "0x50bcbc40306230713239ae1bddd5eefeeaa273dc", + "token": { + "decimals": 18, + "symbol": "ASIA" + }, + "isSC": {} + }, + "0x955afb81880f439a2db194f051afed078fb2ec2e": { + "name": "BSOV token contract", + "address": "0x955afb81880f439a2db194f051afed078fb2ec2e", + "token": { + "decimals": 8, + "symbol": "BSOV" + }, + "isSC": {} + }, + "0xf41df3b8084f1bcbf8d72c8366392170e7a0cffd": { + "name": "NMS token contract", + "address": "0xf41df3b8084f1bcbf8d72c8366392170e7a0cffd", + "token": { + "decimals": 18, + "symbol": "NMS" + }, + "isSC": {} + }, + "0x8676815789211e799a6dc86d02748adf9cf86836": { + "name": "TRIBE token contract", + "address": "0x8676815789211e799a6dc86d02748adf9cf86836", + "token": { + "decimals": 18, + "symbol": "TRIBE" + }, + "isSC": {} + }, + "0xf4bf1b42181198c1c2e12e24e3e57c8d70b89411": { + "name": "TANKS token contract", + "address": "0xf4bf1b42181198c1c2e12e24e3e57c8d70b89411", + "token": { + "decimals": 18, + "symbol": "TANKS" + }, + "isSC": {} + }, + "0x4c2c04e6f0ec30ebd60b2ffbe11814c3d59910f7": { + "name": "NGN token contract", + "address": "0x4c2c04e6f0ec30ebd60b2ffbe11814c3d59910f7", + "token": { + "decimals": 10, + "symbol": "NGN" + }, + "isSC": {} + }, + "0x3beeff1b01122f11149b11604a2bc4f9e33d77af": { + "name": "UNQT token contract", + "address": "0x3beeff1b01122f11149b11604a2bc4f9e33d77af", + "token": { + "decimals": 18, + "symbol": "UNQT" + }, + "isSC": {} + }, + "0xa707734bd310883e133e0ca23f6c166aeb2a1a7a": { + "name": "MORK token contract", + "address": "0xa707734bd310883e133e0ca23f6c166aeb2a1a7a", + "token": { + "decimals": 4, + "symbol": "MORK" + }, + "isSC": {} + }, + "0x97c415d4c8ea982aaabcbb65506d37fa6631c351": { + "name": "UNCL token contract", + "address": "0x97c415d4c8ea982aaabcbb65506d37fa6631c351", + "token": { + "decimals": 18, + "symbol": "UNCL" + }, + "isSC": {} + }, + "0x05be4f635b558e791b68b500fd9210f60e4f3db8": { + "name": "AGAIN token contract", + "address": "0x05be4f635b558e791b68b500fd9210f60e4f3db8", + "token": { + "decimals": 18, + "symbol": "AGAIN" + }, + "isSC": {} + }, + "0x522250b17adcaece287e9da25dc1ddad742213c0": { + "name": "LIKE token contract", + "address": "0x522250b17adcaece287e9da25dc1ddad742213c0", + "token": { + "decimals": 9, + "symbol": "LIKE" + }, + "isSC": {} + }, + "0x32515ffdc3a84cfbf9ad4db14ef8f0a535c7afd6": { + "name": "BAKED token contract", + "address": "0x32515ffdc3a84cfbf9ad4db14ef8f0a535c7afd6", + "token": { + "decimals": 18, + "symbol": "BAKED" + }, + "isSC": {} + }, + "0xe99e95ec6dcae4c85806f13cdf1351ae0fef55be": { + "name": "Sandalwood token contract", + "address": "0xe99e95ec6dcae4c85806f13cdf1351ae0fef55be", + "token": { + "decimals": 18, + "symbol": "Sandalwood" + }, + "isSC": {} + }, + "0x983c0083127b9b65000e918b10d65a0f5d7500f5": { + "name": "BLOCKS token contract", + "address": "0x983c0083127b9b65000e918b10d65a0f5d7500f5", + "token": { + "decimals": 18, + "symbol": "BLOCKS" + }, + "isSC": {} + }, + "0x51869836681bce74a514625c856afb697a013797": { + "name": "GENESIS token contract", + "address": "0x51869836681bce74a514625c856afb697a013797", + "token": { + "decimals": 18, + "symbol": "GENESIS" + }, + "isSC": {} + }, + "0x7bdf330f423ea880ff95fc41a280fd5ecfd3d09f": { + "name": "EURT token contract", + "address": "0x7bdf330f423ea880ff95fc41a280fd5ecfd3d09f", + "token": { + "decimals": 6, + "symbol": "EURT" + }, + "isSC": {} + }, + "0xeafe31cd9e8e01c8f0073a2c974f728fb80e9dce": { + "name": "NZDS token contract", + "address": "0xeafe31cd9e8e01c8f0073a2c974f728fb80e9dce", + "token": { + "decimals": 6, + "symbol": "NZDS" + }, + "isSC": {} + }, + "0xe97a60f5d34da4f68bc1f1b9ce2c19ec1a33e928": { + "name": "HGH token contract", + "address": "0xe97a60f5d34da4f68bc1f1b9ce2c19ec1a33e928", + "token": { + "decimals": 18, + "symbol": "HGH" + }, + "isSC": {} + }, + "0x079202ad852ccc46d8e73815f10ff055049d3916": { + "name": "CRE8R token contract", + "address": "0x079202ad852ccc46d8e73815f10ff055049d3916", + "token": { + "decimals": 18, + "symbol": "CRE8R" + }, + "isSC": {} + }, + "0x4cb9050ea02395a8941715ceeffe0cdf60c59f07": { + "name": "WSB token contract", + "address": "0x4cb9050ea02395a8941715ceeffe0cdf60c59f07", + "token": { + "decimals": 18, + "symbol": "WSB" + }, + "isSC": {} + }, + "0x7621ee0ce0f686b88dd70551b05f90dd3c04d6e9": { + "name": "vCASH token contract", + "address": "0x7621ee0ce0f686b88dd70551b05f90dd3c04d6e9", + "token": { + "decimals": 18, + "symbol": "vCASH" + }, + "isSC": {} + }, + "0x8e8f8df6dce311a011a5b09788dda689a82d9f37": { + "name": "RUSH token contract", + "address": "0x8e8f8df6dce311a011a5b09788dda689a82d9f37", + "token": { + "decimals": 8, + "symbol": "RUSH" + }, + "isSC": {} + }, + "0x71a6e3d6a6629f700d1a4d79d326e2a3f74edd5f": { + "name": "EJS token contract", + "address": "0x71a6e3d6a6629f700d1a4d79d326e2a3f74edd5f", + "token": { + "decimals": 18, + "symbol": "EJS" + }, + "isSC": {} + }, + "0x6393c0a63712601e3dda577dc5bfaf0189e89169": { + "name": "$BANANA token contract", + "address": "0x6393c0a63712601e3dda577dc5bfaf0189e89169", + "token": { + "decimals": 0, + "symbol": "$BANANA" + }, + "isSC": {} + }, + "0x1659ffb2d40dfb1671ac226a0d9dcc95a774521a": { + "name": "DLYCOP token contract", + "address": "0x1659ffb2d40dfb1671ac226a0d9dcc95a774521a", + "token": { + "decimals": 18, + "symbol": "DLYCOP" + }, + "isSC": {} + }, + "0x6811079e3c63ed96eb005384d7e7ec8810e3d521": { + "name": "xSUSHI token contract", + "address": "0x6811079e3c63ed96eb005384d7e7ec8810e3d521", + "token": { + "decimals": 18, + "symbol": "xSUSHI" + }, + "isSC": {} + }, + "0xa8f0634f1ab83bc31e4ce33905db29e36958c5cc": { + "name": "FOL token contract", + "address": "0xa8f0634f1ab83bc31e4ce33905db29e36958c5cc", + "token": { + "decimals": 18, + "symbol": "FOL" + }, + "isSC": {} + }, + "0x7dc47cfb674beb5827283f6140f635680a5ce992": { + "name": "BOLLY token contract", + "address": "0x7dc47cfb674beb5827283f6140f635680a5ce992", + "token": { + "decimals": 18, + "symbol": "BOLLY" + }, + "isSC": {} + }, + "0x26373ec913876c9e6d38494dde458cb8649cb30c": { + "name": "OJA token contract", + "address": "0x26373ec913876c9e6d38494dde458cb8649cb30c", + "token": { + "decimals": 18, + "symbol": "OJA" + }, + "isSC": {} + }, + "0x432cdbc749fd96aa35e1dc27765b23fdcc8f5cf1": { + "name": "NIFTSY token contract", + "address": "0x432cdbc749fd96aa35e1dc27765b23fdcc8f5cf1", + "token": { + "decimals": 18, + "symbol": "NIFTSY" + }, + "isSC": {} + }, + "0xd9c774a5bb7fde18c3e03a59c40d7c77d0b90910": { + "name": "DEXM token contract", + "address": "0xd9c774a5bb7fde18c3e03a59c40d7c77d0b90910", + "token": { + "decimals": 18, + "symbol": "DEXM" + }, + "isSC": {} + }, + "0x28acca4ed2f6186c3d93e20e29e6e6a9af656341": { + "name": "ERP token contract", + "address": "0x28acca4ed2f6186c3d93e20e29e6e6a9af656341", + "token": { + "decimals": 18, + "symbol": "ERP" + }, + "isSC": {} + }, + "0x4e6a6ce59ca7aa0cbc52dbd81ab2dea89d7eccf2": { + "name": "NXN token contract", + "address": "0x4e6a6ce59ca7aa0cbc52dbd81ab2dea89d7eccf2", + "token": { + "decimals": 18, + "symbol": "NXN" + }, + "isSC": {} + }, + "0xf932a6f93432517192c71db155be3d9c7402fbba": { + "name": "MBZ token contract", + "address": "0xf932a6f93432517192c71db155be3d9c7402fbba", + "token": { + "decimals": 8, + "symbol": "MBZ" + }, + "isSC": {} + }, + "0xc748b2a084f8efc47e086ccddd9b7e67aeb571bf": { + "name": "HMT token contract", + "address": "0xc748b2a084f8efc47e086ccddd9b7e67aeb571bf", + "token": { + "decimals": 18, + "symbol": "HMT" + }, + "isSC": {} + }, + "0x8c48ac62f1ecd20ec72f0b1a9a3bc33eb4b93828": { + "name": "EBOX token contract", + "address": "0x8c48ac62f1ecd20ec72f0b1a9a3bc33eb4b93828", + "token": { + "decimals": 18, + "symbol": "EBOX" + }, + "isSC": {} + }, + "0x3522898a74959a16c43f59055392b2fce48727d0": { + "name": "OBOT token contract", + "address": "0x3522898a74959a16c43f59055392b2fce48727d0", + "token": { + "decimals": 18, + "symbol": "OBOT" + }, + "isSC": {} + }, + "0xe4e8056a49e35dbde67384bedcee310b9693d4d6": { + "name": "50MM token contract", + "address": "0xe4e8056a49e35dbde67384bedcee310b9693d4d6", + "token": { + "decimals": 18, + "symbol": "50MM" + }, + "isSC": {} + }, + "0x13607b1ca022368c81f2f2709b181ee8e0f42dd6": { + "name": "PECO token contract", + "address": "0x13607b1ca022368c81f2f2709b181ee8e0f42dd6", + "token": { + "decimals": 18, + "symbol": "PECO" + }, + "isSC": {} + }, + "0xcf9f8bbfb65ba5f7491e61e542c72f00ff4dacc4": { + "name": "$MAID token contract", + "address": "0xcf9f8bbfb65ba5f7491e61e542c72f00ff4dacc4", + "token": { + "decimals": 18, + "symbol": "$MAID" + }, + "isSC": {} + }, + "0xb31bac3b0ff9f588fd07b00859555f7970950015": { + "name": "$KING token contract", + "address": "0xb31bac3b0ff9f588fd07b00859555f7970950015", + "token": { + "decimals": 18, + "symbol": "$KING" + }, + "isSC": {} + }, + "0x3be6601208c404a022612d06bfc8db5c88c8217c": { + "name": "MOE token contract", + "address": "0x3be6601208c404a022612d06bfc8db5c88c8217c", + "token": { + "decimals": 18, + "symbol": "MOE" + }, + "isSC": {} + }, + "0xd1e3f2fe09d92e47868f6feb653344932bcf5091": { + "name": "GABA token contract", + "address": "0xd1e3f2fe09d92e47868f6feb653344932bcf5091", + "token": { + "decimals": 5, + "symbol": "GABA" + }, + "isSC": {} + }, + "0xcb8bcdb991b45bf5d78000a0b5c0a6686ce43790": { + "name": "WEIRD token contract", + "address": "0xcb8bcdb991b45bf5d78000a0b5c0a6686ce43790", + "token": { + "decimals": 18, + "symbol": "WEIRD" + }, + "isSC": {} + }, + "0xc6bdb9dd7f33ff11efdd3a84b2c1c99b8cc93052": { + "name": "JUNO token contract", + "address": "0xc6bdb9dd7f33ff11efdd3a84b2c1c99b8cc93052", + "token": { + "decimals": 6, + "symbol": "JUNO" + }, + "isSC": {} + }, + "0xbcae3a93bfa5258fedb78758d45e03e3c2bda3e8": { + "name": "BCNA token contract", + "address": "0xbcae3a93bfa5258fedb78758d45e03e3c2bda3e8", + "token": { + "decimals": 6, + "symbol": "BCNA" + }, + "isSC": {} + }, + "0x2d27e0e31f86bd8889300e5d8148ba7b231cf1c1": { + "name": "EEUR token contract", + "address": "0x2d27e0e31f86bd8889300e5d8148ba7b231cf1c1", + "token": { + "decimals": 6, + "symbol": "EEUR" + }, + "isSC": {} + }, + "0x4305ff9f3714c8befe7854d401c4c2e395662db4": { + "name": "TICK token contract", + "address": "0x4305ff9f3714c8befe7854d401c4c2e395662db4", + "token": { + "decimals": 6, + "symbol": "TICK" + }, + "isSC": {} + }, + "0xc54ff1b09ab25b01275cd1093c2ba311a18c00eb": { + "name": "NGM token contract", + "address": "0xc54ff1b09ab25b01275cd1093c2ba311a18c00eb", + "token": { + "decimals": 6, + "symbol": "NGM" + }, + "isSC": {} + }, + "0x4a8d681bf9fc7a32d8284b6f2d869eb1cb14a7f0": { + "name": "IXO token contract", + "address": "0x4a8d681bf9fc7a32d8284b6f2d869eb1cb14a7f0", + "token": { + "decimals": 6, + "symbol": "IXO" + }, + "isSC": {} + }, + "0x799a88f32ebb23aa9ef440a7a1cb37653af74422": { + "name": "CTK token contract", + "address": "0x799a88f32ebb23aa9ef440a7a1cb37653af74422", + "token": { + "decimals": 6, + "symbol": "CTK" + }, + "isSC": {} + }, + "0x6ec60377b874782408ea493becccce39347a911a": { + "name": "IOV token contract", + "address": "0x6ec60377b874782408ea493becccce39347a911a", + "token": { + "decimals": 6, + "symbol": "IOV" + }, + "isSC": {} + }, + "0xd6cc9119650b5591dc44a761754afc83f259ab41": { + "name": "PARK token contract", + "address": "0xd6cc9119650b5591dc44a761754afc83f259ab41", + "token": { + "decimals": 18, + "symbol": "PARK" + }, + "isSC": {} + }, + "0x99cd301508ac0020aa2d5e4572f846590c5ab3ad": { + "name": "ANY token contract", + "address": "0x99cd301508ac0020aa2d5e4572f846590c5ab3ad", + "token": { + "decimals": 18, + "symbol": "ANY" + }, + "isSC": {} + }, + "0x0af5dee6678869201924930d924a435f6e4839c9": { + "name": "pKLIMA token contract", + "address": "0x0af5dee6678869201924930d924a435f6e4839c9", + "token": { + "decimals": 18, + "symbol": "pKLIMA" + }, + "isSC": {} + }, + "0xb6b5cdf74606181a1b05bfc0b9f17fc2a64b0cd5": { + "name": "WFAIR token contract", + "address": "0xb6b5cdf74606181a1b05bfc0b9f17fc2a64b0cd5", + "token": { + "decimals": 18, + "symbol": "WFAIR" + }, + "isSC": {} + }, + "0x3f3713030d836a0e1b774f1428c1f1f2148dab64": { + "name": "ALK token contract", + "address": "0x3f3713030d836a0e1b774f1428c1f1f2148dab64", + "token": { + "decimals": 18, + "symbol": "ALK" + }, + "isSC": {} + }, + "0x8135532bc7765818efecf49a295fea4262121e36": { + "name": "DIREWOLF token contract", + "address": "0x8135532bc7765818efecf49a295fea4262121e36", + "token": { + "decimals": 2, + "symbol": "DIREWOLF" + }, + "isSC": {} + }, + "0xccbba38e41d5428fd82cf42efe5385aef6f80826": { + "name": "CQTF token contract", + "address": "0xccbba38e41d5428fd82cf42efe5385aef6f80826", + "token": { + "decimals": 18, + "symbol": "CQTF" + }, + "isSC": {} + }, + "0xd52f6ca48882be8fbaa98ce390db18e1dbe1062d": { + "name": "ORE token contract", + "address": "0xd52f6ca48882be8fbaa98ce390db18e1dbe1062d", + "token": { + "decimals": 18, + "symbol": "ORE" + }, + "isSC": {} + }, + "0x5973ac9378d0d3e982a37cc43d480d455c19ae8a": { + "name": "FUSD token contract", + "address": "0x5973ac9378d0d3e982a37cc43d480d455c19ae8a", + "token": { + "decimals": 18, + "symbol": "FUSD" + }, + "isSC": {} + }, + "0x842e4b170021ce14c9c1b7859f3452a63b4f6841": { + "name": "WITCH token contract", + "address": "0x842e4b170021ce14c9c1b7859f3452a63b4f6841", + "token": { + "decimals": 18, + "symbol": "WITCH" + }, + "isSC": {} + }, + "0x0cc013a6971faf2ec8beee2cd6adcca6f801a29c": { + "name": "QRX token contract", + "address": "0x0cc013a6971faf2ec8beee2cd6adcca6f801a29c", + "token": { + "decimals": 18, + "symbol": "QRX" + }, + "isSC": {} + }, + "0xba19a5b5029aea6fe018742e6efc5a204a58c14d": { + "name": "INO token contract", + "address": "0xba19a5b5029aea6fe018742e6efc5a204a58c14d", + "token": { + "decimals": 0, + "symbol": "INO" + }, + "isSC": {} + }, + "0xd8a805447b1ce5bae810f029df5536a57f71b91c": { + "name": "ADCO token contract", + "address": "0xd8a805447b1ce5bae810f029df5536a57f71b91c", + "token": { + "decimals": 18, + "symbol": "ADCO" + }, + "isSC": {} + }, + "0x701fd77f1b00547be745957ddf1cc92f9d088b6b": { + "name": "POZ token contract", + "address": "0x701fd77f1b00547be745957ddf1cc92f9d088b6b", + "token": { + "decimals": 18, + "symbol": "POZ" + }, + "isSC": {} + }, + "0xe93c4431494b45115ea656274ea75b987f541b17": { + "name": "ORBTM token contract", + "address": "0xe93c4431494b45115ea656274ea75b987f541b17", + "token": { + "decimals": 18, + "symbol": "ORBTM" + }, + "isSC": {} + }, + "0xcbea63b905d62bad6506e2c47b1ea00c56d8f93d": { + "name": "ARTM token contract", + "address": "0xcbea63b905d62bad6506e2c47b1ea00c56d8f93d", + "token": { + "decimals": 18, + "symbol": "ARTM" + }, + "isSC": {} + }, + "0x486ffaf06a681bf22b5209e9ffce722662a60e8c": { + "name": "FLY token contract", + "address": "0x486ffaf06a681bf22b5209e9ffce722662a60e8c", + "token": { + "decimals": 18, + "symbol": "FLY" + }, + "isSC": {} + }, + "0xe51e88dd08499762b8e4eb3a9f3da9b8e79608c3": { + "name": "SKRT token contract", + "address": "0xe51e88dd08499762b8e4eb3a9f3da9b8e79608c3", + "token": { + "decimals": 18, + "symbol": "SKRT" + }, + "isSC": {} + }, + "0x5362daf94a6bd0e9078ac3070f575861f12a2e77": { + "name": "ESS token contract", + "address": "0x5362daf94a6bd0e9078ac3070f575861f12a2e77", + "token": { + "decimals": 18, + "symbol": "ESS" + }, + "isSC": {} + }, + "0x777211c3c0b03d9ff2aaa288a016b1a3b64ddb8c": { + "name": "DSU token contract", + "address": "0x777211c3c0b03d9ff2aaa288a016b1a3b64ddb8c", + "token": { + "decimals": 18, + "symbol": "DSU" + }, + "isSC": {} + }, + "0x2e8faf0f7918c4914e890716e22a74e675115d52": { + "name": "GDC token contract", + "address": "0x2e8faf0f7918c4914e890716e22a74e675115d52", + "token": { + "decimals": 18, + "symbol": "GDC" + }, + "isSC": {} + }, + "0xb83a45bbb5699ae47b39c32b20a145b28b446fca": { + "name": "ELIOT token contract", + "address": "0xb83a45bbb5699ae47b39c32b20a145b28b446fca", + "token": { + "decimals": 18, + "symbol": "ELIOT" + }, + "isSC": {} + }, + "0x3ee21b6d44a3879eef12084423b4c7a9a286d00d": { + "name": "GOJ token contract", + "address": "0x3ee21b6d44a3879eef12084423b4c7a9a286d00d", + "token": { + "decimals": 10, + "symbol": "GOJ" + }, + "isSC": {} + }, + "0x424eb54e29868e15e44fda6bd17f55d1ac5ecfb5": { + "name": "MIA token contract", + "address": "0x424eb54e29868e15e44fda6bd17f55d1ac5ecfb5", + "token": { + "decimals": 10, + "symbol": "MIA" + }, + "isSC": {} + }, + "0x8ac24ae89cd33ba285a65d3a7039de3b23c9f83e": { + "name": "FTP token contract", + "address": "0x8ac24ae89cd33ba285a65d3a7039de3b23c9f83e", + "token": { + "decimals": 18, + "symbol": "FTP" + }, + "isSC": {} + }, + "0xa6be18a7870d464c97c76a457d965cb74be0db3f": { + "name": "GTS token contract", + "address": "0xa6be18a7870d464c97c76a457d965cb74be0db3f", + "token": { + "decimals": 18, + "symbol": "GTS" + }, + "isSC": {} + }, + "0x3c205c8b3e02421da82064646788c82f7bd753b9": { + "name": "UFI token contract", + "address": "0x3c205c8b3e02421da82064646788c82f7bd753b9", + "token": { + "decimals": 18, + "symbol": "UFI" + }, + "isSC": {} + }, + "0x3c720206bfacb2d16fa3ac0ed87d2048dbc401fc": { + "name": "UCO token contract", + "address": "0x3c720206bfacb2d16fa3ac0ed87d2048dbc401fc", + "token": { + "decimals": 18, + "symbol": "UCO" + }, + "isSC": {} + }, + "0x2c1084a041b976b96b769d1c250562864317c1aa": { + "name": "BLTV token contract", + "address": "0x2c1084a041b976b96b769d1c250562864317c1aa", + "token": { + "decimals": 18, + "symbol": "BLTV" + }, + "isSC": {} + }, + "0xaee0ffb690b37449b7f1c49b199e1e3ec6084490": { + "name": "AWG token contract", + "address": "0xaee0ffb690b37449b7f1c49b199e1e3ec6084490", + "token": { + "decimals": 18, + "symbol": "AWG" + }, + "isSC": {} + }, + "0x6db9dd7342e9ae835ed498d141a85970813f1e9c": { + "name": "XMAN token contract", + "address": "0x6db9dd7342e9ae835ed498d141a85970813f1e9c", + "token": { + "decimals": 18, + "symbol": "XMAN" + }, + "isSC": {} + }, + "0x362d55939b3b914bdae5992f7e80fa03d4df2b15": { + "name": "WEB4 token contract", + "address": "0x362d55939b3b914bdae5992f7e80fa03d4df2b15", + "token": { + "decimals": 18, + "symbol": "WEB4" + }, + "isSC": {} + }, + "0x4d53d5cf63ed51dda047b363f3a6f62677d37613": { + "name": "RNB token contract", + "address": "0x4d53d5cf63ed51dda047b363f3a6f62677d37613", + "token": { + "decimals": 18, + "symbol": "RNB" + }, + "isSC": {} + }, + "0x5decd638e9e6c7b3533ef40788094b5e6231826a": { + "name": "VXV token contract", + "address": "0x5decd638e9e6c7b3533ef40788094b5e6231826a", + "token": { + "decimals": 18, + "symbol": "VXV" + }, + "isSC": {} + }, + "0x8b1f836491903743fe51acd13f2cc8ab95b270f6": { + "name": "ACY token contract", + "address": "0x8b1f836491903743fe51acd13f2cc8ab95b270f6", + "token": { + "decimals": 18, + "symbol": "ACY" + }, + "isSC": {} + }, + "0xf4487f1ff4f7e38c640aea91d7bb47aea98c09a7": { + "name": "STRONG token contract", + "address": "0xf4487f1ff4f7e38c640aea91d7bb47aea98c09a7", + "token": { + "decimals": 18, + "symbol": "STRONG" + }, + "isSC": {} + }, + "0xfa49101d56734af877aa312a6a40f634d4e3729d": { + "name": "OHM token contract", + "address": "0xfa49101d56734af877aa312a6a40f634d4e3729d", + "token": { + "decimals": 9, + "symbol": "OHM" + }, + "isSC": {} + }, + "0xd9cc6bc0569c22a16d804b46e6774611a93dd90b": { + "name": "HUE token contract", + "address": "0xd9cc6bc0569c22a16d804b46e6774611a93dd90b", + "token": { + "decimals": 4, + "symbol": "HUE" + }, + "isSC": {} + }, + "0x383180a2f52c8f2c67a5a10e2f0752276274e442": { + "name": "CHIZ token contract", + "address": "0x383180a2f52c8f2c67a5a10e2f0752276274e442", + "token": { + "decimals": 18, + "symbol": "CHIZ" + }, + "isSC": {} + }, + "0x8527abef4ede978af2b753543f8864ec85fd55c6": { + "name": "GIAN token contract", + "address": "0x8527abef4ede978af2b753543f8864ec85fd55c6", + "token": { + "decimals": 18, + "symbol": "GIAN" + }, + "isSC": {} + }, + "0xd50ec6360f560a59926216eafb98395ac430c9fd": { + "name": "alKLIMA token contract", + "address": "0xd50ec6360f560a59926216eafb98395ac430c9fd", + "token": { + "decimals": 18, + "symbol": "alKLIMA" + }, + "isSC": {} + }, + "0x49b1be61a8ca3f9a9f178d6550e41e00d9162159": { + "name": "GGTK token contract", + "address": "0x49b1be61a8ca3f9a9f178d6550e41e00d9162159", + "token": { + "decimals": 18, + "symbol": "GGTK" + }, + "isSC": {} + }, + "0xd871b40646e1a6dbded6290b6b696459a69c68a0": { + "name": "cUSDC token contract", + "address": "0xd871b40646e1a6dbded6290b6b696459a69c68a0", + "token": { + "decimals": 8, + "symbol": "cUSDC" + }, + "isSC": {} + }, + "0x25b3a129907b675e19ce6dd3f2a6db50023ecf80": { + "name": "FIRST token contract", + "address": "0x25b3a129907b675e19ce6dd3f2a6db50023ecf80", + "token": { + "decimals": 4, + "symbol": "FIRST" + }, + "isSC": {} + }, + "0x56a0efefc9f1fbb54fbd25629ac2aa764f1b56f7": { + "name": "AWX token contract", + "address": "0x56a0efefc9f1fbb54fbd25629ac2aa764f1b56f7", + "token": { + "decimals": 18, + "symbol": "AWX" + }, + "isSC": {} + }, + "0x23274cd85642068b22ebf61ff64402cf4252c7f5": { + "name": "DOGIRA token contract", + "address": "0x23274cd85642068b22ebf61ff64402cf4252c7f5", + "token": { + "decimals": 9, + "symbol": "DOGIRA" + }, + "isSC": {} + }, + "0xc9b7bc25aaa5d2a26e508eb0cb0b3af08a4ca6f8": { + "name": "FastArgmag20L1S token contract", + "address": "0xc9b7bc25aaa5d2a26e508eb0cb0b3af08a4ca6f8", + "token": { + "decimals": 18, + "symbol": "FastArgmag20L1S" + }, + "isSC": {} + }, + "0x7fb7ddb3a3ec90e1c7a3e58ff6670da82f73c1cf": { + "name": "VEMP token contract", + "address": "0x7fb7ddb3a3ec90e1c7a3e58ff6670da82f73c1cf", + "token": { + "decimals": 18, + "symbol": "VEMP" + }, + "isSC": {} + }, + "0x120ca63f5f79b6760324b1dde6bea4c7f01fba0e": { + "name": "RVP token contract", + "address": "0x120ca63f5f79b6760324b1dde6bea4c7f01fba0e", + "token": { + "decimals": 18, + "symbol": "RVP" + }, + "isSC": {} + }, + "0x1fb39c88df91c9fdb83d0e8761c8d2d2a4ab5335": { + "name": "Argmag20L1Sym token contract", + "address": "0x1fb39c88df91c9fdb83d0e8761c8d2d2a4ab5335", + "token": { + "decimals": 18, + "symbol": "Argmag20L1Sym" + }, + "isSC": {} + }, + "0xbd3859443377e0882dc58812e1f7c9ee057b64be": { + "name": "BCUG token contract", + "address": "0xbd3859443377e0882dc58812e1f7c9ee057b64be", + "token": { + "decimals": 18, + "symbol": "BCUG" + }, + "isSC": {} + }, + "0x834dfb4df4425bdec02f2a1cafdf0cc39c3c0a59": { + "name": "LGCY token contract", + "address": "0x834dfb4df4425bdec02f2a1cafdf0cc39c3c0a59", + "token": { + "decimals": 18, + "symbol": "LGCY" + }, + "isSC": {} + }, + "0xeb4a74e9882273b7d9d985098d7b7c7512001c31": { + "name": "LEFT token contract", + "address": "0xeb4a74e9882273b7d9d985098d7b7c7512001c31", + "token": { + "decimals": 4, + "symbol": "LEFT" + }, + "isSC": {} + }, + "0xdb982a636807b3acd9fd28a99410b68c2159fb32": { + "name": "THEOS token contract", + "address": "0xdb982a636807b3acd9fd28a99410b68c2159fb32", + "token": { + "decimals": 18, + "symbol": "THEOS" + }, + "isSC": {} + }, + "0x3b1a0c9252ee7403093ff55b4a5886d49a3d837a": { + "name": "UM token contract", + "address": "0x3b1a0c9252ee7403093ff55b4a5886d49a3d837a", + "token": { + "decimals": 18, + "symbol": "UM" + }, + "isSC": {} + }, + "0xeb935614447185eeea0abc756ff2ddc99fbb9047": { + "name": "aKLIMA token contract", + "address": "0xeb935614447185eeea0abc756ff2ddc99fbb9047", + "token": { + "decimals": 18, + "symbol": "aKLIMA" + }, + "isSC": {} + }, + "0x36b77a184be8ee56f5e81c56727b20647a42e28e": { + "name": "QNT token contract", + "address": "0x36b77a184be8ee56f5e81c56727b20647a42e28e", + "token": { + "decimals": 18, + "symbol": "QNT" + }, + "isSC": {} + }, + "0x7467afa7c48132e8f8c90a919fc2eba041207195": { + "name": "AQR token contract", + "address": "0x7467afa7c48132e8f8c90a919fc2eba041207195", + "token": { + "decimals": 18, + "symbol": "AQR" + }, + "isSC": {} + }, + "0xe99ef864cc6035a68e6eb4a813fbc6c034277cac": { + "name": "SINU token contract", + "address": "0xe99ef864cc6035a68e6eb4a813fbc6c034277cac", + "token": { + "decimals": 18, + "symbol": "SINU" + }, + "isSC": {} + }, + "0x8b0180f2101c8260d49339abfee87927412494b4": { + "name": "NTT token contract", + "address": "0x8b0180f2101c8260d49339abfee87927412494b4", + "token": { + "decimals": 18, + "symbol": "NTT" + }, + "isSC": {} + }, + "0xe1e516ed179e8f448f5ebd5eca4f2a892368b78b": { + "name": "RPC token contract", + "address": "0xe1e516ed179e8f448f5ebd5eca4f2a892368b78b", + "token": { + "decimals": 18, + "symbol": "RPC" + }, + "isSC": {} + }, + "0xb070d0166a4ce2d47d8af1178847886aa240895d": { + "name": "DEFIT token contract", + "address": "0xb070d0166a4ce2d47d8af1178847886aa240895d", + "token": { + "decimals": 18, + "symbol": "DEFIT" + }, + "isSC": {} + }, + "0xf8d7195eeb28c7449f7ef8557ff9a4da86da0c64": { + "name": "i7 token contract", + "address": "0xf8d7195eeb28c7449f7ef8557ff9a4da86da0c64", + "token": { + "decimals": 18, + "symbol": "i7" + }, + "isSC": {} + }, + "0x62a872d9977db171d9e213a5dc2b782e72ca0033": { + "name": "NEUY token contract", + "address": "0x62a872d9977db171d9e213a5dc2b782e72ca0033", + "token": { + "decimals": 18, + "symbol": "NEUY" + }, + "isSC": {} + }, + "0x36ff415d0bcedf976d60e85c72e01d19230fbd29": { + "name": "HOBO token contract", + "address": "0x36ff415d0bcedf976d60e85c72e01d19230fbd29", + "token": { + "decimals": 8, + "symbol": "HOBO" + }, + "isSC": {} + }, + "0xb89fb010b3a409929e5e4a99f7cd0beec18e0bc4": { + "name": "SOTU token contract", + "address": "0xb89fb010b3a409929e5e4a99f7cd0beec18e0bc4", + "token": { + "decimals": 18, + "symbol": "SOTU" + }, + "isSC": {} + }, + "0xd8f9a909649ba317175a4f2f5416958af64a0bfc": { + "name": "TSHY token contract", + "address": "0xd8f9a909649ba317175a4f2f5416958af64a0bfc", + "token": { + "decimals": 18, + "symbol": "TSHY" + }, + "isSC": {} + }, + "0x2db0db271a10661e7090b6758350e18f6798a49d": { + "name": "MOT token contract", + "address": "0x2db0db271a10661e7090b6758350e18f6798a49d", + "token": { + "decimals": 18, + "symbol": "MOT" + }, + "isSC": {} + }, + "0x21ce5251d47aa72d2d1dc849b1bcce14d2467d1b": { + "name": "UNIC token contract", + "address": "0x21ce5251d47aa72d2d1dc849b1bcce14d2467d1b", + "token": { + "decimals": 18, + "symbol": "UNIC" + }, + "isSC": {} + }, + "0x229f692ada2f4405789d5aeeac832877e4c0750e": { + "name": "AWW token contract", + "address": "0x229f692ada2f4405789d5aeeac832877e4c0750e", + "token": { + "decimals": 18, + "symbol": "AWW" + }, + "isSC": {} + }, + "0x23db3a5df58eb5eb74b79ff1c64cf200b07de5ee": { + "name": "EMOT token contract", + "address": "0x23db3a5df58eb5eb74b79ff1c64cf200b07de5ee", + "token": { + "decimals": 18, + "symbol": "EMOT" + }, + "isSC": {} + }, + "0x908435624fc23130fda2d07b10c91ca2b6a57aba": { + "name": "PUN token contract", + "address": "0x908435624fc23130fda2d07b10c91ca2b6a57aba", + "token": { + "decimals": 18, + "symbol": "PUN" + }, + "isSC": {} + }, + "0xe0b4af6c2e9cb2e43dfe5a357a00ced16da4547b": { + "name": "CPC token contract", + "address": "0xe0b4af6c2e9cb2e43dfe5a357a00ced16da4547b", + "token": { + "decimals": 8, + "symbol": "CPC" + }, + "isSC": {} + }, + "0x8c7f28bd18ee3bbe766b2036c9e8a8357b07caca": { + "name": "CHLITEST token contract", + "address": "0x8c7f28bd18ee3bbe766b2036c9e8a8357b07caca", + "token": { + "decimals": 18, + "symbol": "CHLITEST" + }, + "isSC": {} + }, + "0x57a0e527611bcd7e466407a621ce02bf923c0d15": { + "name": "RADI token contract", + "address": "0x57a0e527611bcd7e466407a621ce02bf923c0d15", + "token": { + "decimals": 18, + "symbol": "RADI" + }, + "isSC": {} + }, + "0x5c1a50c4cd26ad2a3a156c2f4b1a8826e7f3a4e0": { + "name": "BITEPT token contract", + "address": "0x5c1a50c4cd26ad2a3a156c2f4b1a8826e7f3a4e0", + "token": { + "decimals": 18, + "symbol": "BITEPT" + }, + "isSC": {} + }, + "0x3ece64186c05f47e41657ccbf3f9419f76505377": { + "name": "FLOKII token contract", + "address": "0x3ece64186c05f47e41657ccbf3f9419f76505377", + "token": { + "decimals": 9, + "symbol": "FLOKII" + }, + "isSC": {} + }, + "0x9e416f2fce870b8edd91fc23c9280a77f4c4a928": { + "name": "HOAP token contract", + "address": "0x9e416f2fce870b8edd91fc23c9280a77f4c4a928", + "token": { + "decimals": 18, + "symbol": "HOAP" + }, + "isSC": {} + }, + "0x3dc6052a693e4a2fc28eb2ea12fe0cfd3bd221d1": { + "name": "IRIS token contract", + "address": "0x3dc6052a693e4a2fc28eb2ea12fe0cfd3bd221d1", + "token": { + "decimals": 6, + "symbol": "IRIS" + }, + "isSC": {} + }, + "0xb3b9c016ad1e9f7efdae451b04ef696e05658b32": { + "name": "XPRT token contract", + "address": "0xb3b9c016ad1e9f7efdae451b04ef696e05658b32", + "token": { + "decimals": 6, + "symbol": "XPRT" + }, + "isSC": {} + }, + "0x8bdc1239840d4a0db234f2e7d65df83164d18e49": { + "name": "HARD token contract", + "address": "0x8bdc1239840d4a0db234f2e7d65df83164d18e49", + "token": { + "decimals": 6, + "symbol": "HARD" + }, + "isSC": {} + }, + "0x8c7a56f2f2fd97da0f5b4fade180fa8dc3fbea8d": { + "name": "OSMO token contract", + "address": "0x8c7a56f2f2fd97da0f5b4fade180fa8dc3fbea8d", + "token": { + "decimals": 6, + "symbol": "OSMO" + }, + "isSC": {} + }, + "0xec482de9569a5ea3dd9779039b79e53f15791fde": { + "name": "REGEN token contract", + "address": "0xec482de9569a5ea3dd9779039b79e53f15791fde", + "token": { + "decimals": 6, + "symbol": "REGEN" + }, + "isSC": {} + }, + "0x68b741416153bbf5cb4faee0aa447f918fe5c322": { + "name": "ION token contract", + "address": "0x68b741416153bbf5cb4faee0aa447f918fe5c322", + "token": { + "decimals": 6, + "symbol": "ION" + }, + "isSC": {} + }, + "0x87d32f2c0a3d6d091772890c81e321026454a125": { + "name": "KAVA token contract", + "address": "0x87d32f2c0a3d6d091772890c81e321026454a125", + "token": { + "decimals": 6, + "symbol": "KAVA" + }, + "isSC": {} + }, + "0x65885a2aa8888d2891246b9d811b0a8e15d75d48": { + "name": "PLBT token contract", + "address": "0x65885a2aa8888d2891246b9d811b0a8e15d75d48", + "token": { + "decimals": 6, + "symbol": "PLBT" + }, + "isSC": {} + }, + "0x602c6690a6cb2d2fce95ad50fe81d731df0ad6ed": { + "name": "10SET token contract", + "address": "0x602c6690a6cb2d2fce95ad50fe81d731df0ad6ed", + "token": { + "decimals": 18, + "symbol": "10SET" + }, + "isSC": {} + }, + "0xc73594aa7593182a516331e712fea2d8c49ff8dd": { + "name": "C3 token contract", + "address": "0xc73594aa7593182a516331e712fea2d8c49ff8dd", + "token": { + "decimals": 18, + "symbol": "C3" + }, + "isSC": {} + }, + "0x99ab67c6d0b9bf4201cd9aad66f84f5f524e0018": { + "name": "GERO token contract", + "address": "0x99ab67c6d0b9bf4201cd9aad66f84f5f524e0018", + "token": { + "decimals": 18, + "symbol": "GERO" + }, + "isSC": {} + }, + "0x70b7b259001c1af1583fc466c27f49105f38fbfd": { + "name": "ZKS token contract", + "address": "0x70b7b259001c1af1583fc466c27f49105f38fbfd", + "token": { + "decimals": 18, + "symbol": "ZKS" + }, + "isSC": {} + }, + "0x96febbc05bb00f83bb5a3f20dd97940454ec3b7d": { + "name": "ZERO token contract", + "address": "0x96febbc05bb00f83bb5a3f20dd97940454ec3b7d", + "token": { + "decimals": 18, + "symbol": "ZERO" + }, + "isSC": {} + }, + "0x2b642b8289780ca28ec283f2ab1932436d82ac02": { + "name": "Skey token contract", + "address": "0x2b642b8289780ca28ec283f2ab1932436d82ac02", + "token": { + "decimals": 8, + "symbol": "Skey" + }, + "isSC": {} + }, + "0x709a4b6217584188ddb93c82f5d716d969acce1c": { + "name": "HANU token contract", + "address": "0x709a4b6217584188ddb93c82f5d716d969acce1c", + "token": { + "decimals": 12, + "symbol": "HANU" + }, + "isSC": {} + }, + "0xac51c4c48dc3116487ed4bc16542e27b5694da1b": { + "name": "ATOM token contract", + "address": "0xac51c4c48dc3116487ed4bc16542e27b5694da1b", + "token": { + "decimals": 6, + "symbol": "ATOM" + }, + "isSC": {} + }, + "0x3674ffe94d5a306dda2cdcdc0d735561e4e79bc8": { + "name": "wLITI token contract", + "address": "0x3674ffe94d5a306dda2cdcdc0d735561e4e79bc8", + "token": { + "decimals": 18, + "symbol": "wLITI" + }, + "isSC": {} + }, + "0x4a2b3c1527cf704d959390c0063fcf2a9e2bd9c1": { + "name": "XEND token contract", + "address": "0x4a2b3c1527cf704d959390c0063fcf2a9e2bd9c1", + "token": { + "decimals": 18, + "symbol": "XEND" + }, + "isSC": {} + }, + "0xcb816bedd44d1d04870d4a171a2cd93903356960": { + "name": "ANDY token contract", + "address": "0xcb816bedd44d1d04870d4a171a2cd93903356960", + "token": { + "decimals": 18, + "symbol": "ANDY" + }, + "isSC": {} + }, + "0x4d7d6e43ed36298bfe287711a48c1018d87f272c": { + "name": "DOG token contract", + "address": "0x4d7d6e43ed36298bfe287711a48c1018d87f272c", + "token": { + "decimals": 18, + "symbol": "DOG" + }, + "isSC": {} + }, + "0x48cbc913de09317df2365e6827df50da083701d5": { + "name": "FOUR token contract", + "address": "0x48cbc913de09317df2365e6827df50da083701d5", + "token": { + "decimals": 18, + "symbol": "FOUR" + }, + "isSC": {} + }, + "0xd778bef166d19548799e5f4a5d6354b22883563d": { + "name": "USDP token contract", + "address": "0xd778bef166d19548799e5f4a5d6354b22883563d", + "token": { + "decimals": 18, + "symbol": "USDP" + }, + "isSC": {} + }, + "0x1441729568ab2a9871677edfeb13fbfcc7157a26": { + "name": "PRXY token contract", + "address": "0x1441729568ab2a9871677edfeb13fbfcc7157a26", + "token": { + "decimals": 18, + "symbol": "PRXY" + }, + "isSC": {} + }, + "0x9661c0614a80319c8be0ff360079902350ad547d": { + "name": "WOWS token contract", + "address": "0x9661c0614a80319c8be0ff360079902350ad547d", + "token": { + "decimals": 18, + "symbol": "WOWS" + }, + "isSC": {} + }, + "0x6b3c5075c01771d6e083d150212b3653030d4da4": { + "name": "CHAOS token contract", + "address": "0x6b3c5075c01771d6e083d150212b3653030d4da4", + "token": { + "decimals": 18, + "symbol": "CHAOS" + }, + "isSC": {} + }, + "0xf5499d8714e55dcf4e84c861ca1c8358e7e69cba": { + "name": "SVET token contract", + "address": "0xf5499d8714e55dcf4e84c861ca1c8358e7e69cba", + "token": { + "decimals": 18, + "symbol": "SVET" + }, + "isSC": {} + }, + "0xd116d8ea4de1225d3f903fda43493e93eb4b1d54": { + "name": "VENT token contract", + "address": "0xd116d8ea4de1225d3f903fda43493e93eb4b1d54", + "token": { + "decimals": 18, + "symbol": "VENT" + }, + "isSC": {} + }, + "0x4b6d775b7ea8e66499cb80777e65b895474f5c86": { + "name": "WSATT token contract", + "address": "0x4b6d775b7ea8e66499cb80777e65b895474f5c86", + "token": { + "decimals": 18, + "symbol": "WSATT" + }, + "isSC": {} + }, + "0xff52775de813d060aa5854657055fb19b3a3dda5": { + "name": "Staked IMX token contract", + "address": "0xff52775de813d060aa5854657055fb19b3a3dda5", + "token": { + "decimals": 18, + "symbol": "Staked IMX" + }, + "isSC": {} + }, + "0xbbc8ccc5d47e9effc15f0c71a4e0ee8046546385": { + "name": "MILE token contract", + "address": "0xbbc8ccc5d47e9effc15f0c71a4e0ee8046546385", + "token": { + "decimals": 18, + "symbol": "MILE" + }, + "isSC": {} + }, + "0xe1c42be9699ff4e11674819c1885d43bd92e9d15": { + "name": "XTM token contract", + "address": "0xe1c42be9699ff4e11674819c1885d43bd92e9d15", + "token": { + "decimals": 18, + "symbol": "XTM" + }, + "isSC": {} + }, + "0x87847703d4bb4fcd42db887ffdcb94496e77e3ab": { + "name": "HID token contract", + "address": "0x87847703d4bb4fcd42db887ffdcb94496e77e3ab", + "token": { + "decimals": 18, + "symbol": "HID" + }, + "isSC": {} + }, + "0x66147c74abf6323a22c33e039dc761c07df05878": { + "name": "DORA token contract", + "address": "0x66147c74abf6323a22c33e039dc761c07df05878", + "token": { + "decimals": 18, + "symbol": "DORA" + }, + "isSC": {} + }, + "0xf244e91a46a9cdd48da295ca5d0b27894f8032b1": { + "name": "UART token contract", + "address": "0xf244e91a46a9cdd48da295ca5d0b27894f8032b1", + "token": { + "decimals": 12, + "symbol": "UART" + }, + "isSC": {} + }, + "0x4e0dd84d8d5cbd7753407d82824a344ce380fcde": { + "name": "DUGG token contract", + "address": "0x4e0dd84d8d5cbd7753407d82824a344ce380fcde", + "token": { + "decimals": 18, + "symbol": "DUGG" + }, + "isSC": {} + }, + "0x6fb54ffe60386ac33b722be13d2549dd87bf63af": { + "name": "POLI token contract", + "address": "0x6fb54ffe60386ac33b722be13d2549dd87bf63af", + "token": { + "decimals": 18, + "symbol": "POLI" + }, + "isSC": {} + }, + "0x42f2fcb9a26ac8cdd3e96e51b89134c3d4dc509f": { + "name": "LVJ token contract", + "address": "0x42f2fcb9a26ac8cdd3e96e51b89134c3d4dc509f", + "token": { + "decimals": 18, + "symbol": "LVJ" + }, + "isSC": {} + }, + "0x689f8e5913c158ffb5ac5aeb83b3c875f5d20309": { + "name": "SNK token contract", + "address": "0x689f8e5913c158ffb5ac5aeb83b3c875f5d20309", + "token": { + "decimals": 18, + "symbol": "SNK" + }, + "isSC": {} + }, + "0xdc92de2cdbe69fea9b1e4939d934f7f5195bb1c9": { + "name": "PSLIP token contract", + "address": "0xdc92de2cdbe69fea9b1e4939d934f7f5195bb1c9", + "token": { + "decimals": 18, + "symbol": "PSLIP" + }, + "isSC": {} + }, + "0x6a6bd53d677f8632631662c48bd47b1d4d6524ee": { + "name": "AGLD token contract", + "address": "0x6a6bd53d677f8632631662c48bd47b1d4d6524ee", + "token": { + "decimals": 18, + "symbol": "AGLD" + }, + "isSC": {} + }, + "0x06a0462e6b25793f306828c20033a7db6e926394": { + "name": "IPV6 token contract", + "address": "0x06a0462e6b25793f306828c20033a7db6e926394", + "token": { + "decimals": 18, + "symbol": "IPV6" + }, + "isSC": {} + }, + "0x3da47ba3528fdca867b94496027c65d504eef8e6": { + "name": "iWETH token contract", + "address": "0x3da47ba3528fdca867b94496027c65d504eef8e6", + "token": { + "decimals": 18, + "symbol": "iWETH" + }, + "isSC": {} + }, + "0x9cee70895726b0ea14e6019c961daf32222a7c2f": { + "name": "PAGE token contract", + "address": "0x9cee70895726b0ea14e6019c961daf32222a7c2f", + "token": { + "decimals": 8, + "symbol": "PAGE" + }, + "isSC": {} + }, + "0xe46f5128b933e5a6f907fe73ece80059c222db0a": { + "name": "MOOV token contract", + "address": "0xe46f5128b933e5a6f907fe73ece80059c222db0a", + "token": { + "decimals": 18, + "symbol": "MOOV" + }, + "isSC": {} + }, + "0x15e5c5c8cefa0aafebef55b1a43db5d2c9a4b6ae": { + "name": "MCF token contract", + "address": "0x15e5c5c8cefa0aafebef55b1a43db5d2c9a4b6ae", + "token": { + "decimals": 10, + "symbol": "MCF" + }, + "isSC": {} + }, + "0x29198a281fe6ed6a49abe32a5d6864adccd7e89e": { + "name": "DOGZ token contract", + "address": "0x29198a281fe6ed6a49abe32a5d6864adccd7e89e", + "token": { + "decimals": 18, + "symbol": "DOGZ" + }, + "isSC": {} + }, + "0x0ef2603cd156e1934e19d0b07cd64f415e1e7940": { + "name": "PIGX token contract", + "address": "0x0ef2603cd156e1934e19d0b07cd64f415e1e7940", + "token": { + "decimals": 18, + "symbol": "PIGX" + }, + "isSC": {} + }, + "0x83a3b215b256df3f2bc97dd0fe1fe32af0d66d19": { + "name": "ZUSD token contract", + "address": "0x83a3b215b256df3f2bc97dd0fe1fe32af0d66d19", + "token": { + "decimals": 6, + "symbol": "ZUSD" + }, + "isSC": {} + }, + "0x482bc619ee7662759cdc0685b4e78f464da39c73": { + "name": "GYEN token contract", + "address": "0x482bc619ee7662759cdc0685b4e78f464da39c73", + "token": { + "decimals": 6, + "symbol": "GYEN" + }, + "isSC": {} + }, + "0x95a54b74a4891a7f41f7f72f3713e1764eefcd4b": { + "name": "IDH token contract", + "address": "0x95a54b74a4891a7f41f7f72f3713e1764eefcd4b", + "token": { + "decimals": 6, + "symbol": "IDH" + }, + "isSC": {} + }, + "0xdf6843eeaec6213625bc85e6e2c3aea0782a9748": { + "name": "KFT token contract", + "address": "0xdf6843eeaec6213625bc85e6e2c3aea0782a9748", + "token": { + "decimals": 18, + "symbol": "KFT" + }, + "isSC": {} + }, + "0xe454034b75bb9d017f21228e61b9ddbc889623c0": { + "name": "MDSIM token contract", + "address": "0xe454034b75bb9d017f21228e61b9ddbc889623c0", + "token": { + "decimals": 18, + "symbol": "MDSIM" + }, + "isSC": {} + }, + "0x3f717919def69f81d17b80839bf8af35697ccbfa": { + "name": "DTX token contract", + "address": "0x3f717919def69f81d17b80839bf8af35697ccbfa", + "token": { + "decimals": 18, + "symbol": "DTX" + }, + "isSC": {} + }, + "0xfd0cbddec28a93bb86b9db4a62258f5ef25fefde": { + "name": "BITT token contract", + "address": "0xfd0cbddec28a93bb86b9db4a62258f5ef25fefde", + "token": { + "decimals": 18, + "symbol": "BITT" + }, + "isSC": {} + }, + "0x53d76f967de13e7f95e90196438dce695ecfa957": { + "name": "SHN token contract", + "address": "0x53d76f967de13e7f95e90196438dce695ecfa957", + "token": { + "decimals": 18, + "symbol": "SHN" + }, + "isSC": {} + }, + "0x0d6ae2a429df13e44a07cd2969e085e4833f64a0": { + "name": "PBR token contract", + "address": "0x0d6ae2a429df13e44a07cd2969e085e4833f64a0", + "token": { + "decimals": 18, + "symbol": "PBR" + }, + "isSC": {} + }, + "0x3b82319ef9e45c16621cc6f6b588324f5719a882": { + "name": "TknERC721Sym token contract", + "address": "0x3b82319ef9e45c16621cc6f6b588324f5719a882", + "token": { + "decimals": 18, + "symbol": "TknERC721Sym" + }, + "isSC": {} + }, + "0x2df2dc62cc1dfac66867524942e83439d558d8b9": { + "name": "ERD token contract", + "address": "0x2df2dc62cc1dfac66867524942e83439d558d8b9", + "token": { + "decimals": 2, + "symbol": "ERD" + }, + "isSC": {} + }, + "0x91a4635f620766145c099e15889bd2766906a559": { + "name": "CELR token contract", + "address": "0x91a4635f620766145c099e15889bd2766906a559", + "token": { + "decimals": 18, + "symbol": "CELR" + }, + "isSC": {} + }, + "0xe9993763e0b7f7d915a62a5f22a6e151f91d98a8": { + "name": "TORG token contract", + "address": "0xe9993763e0b7f7d915a62a5f22a6e151f91d98a8", + "token": { + "decimals": 18, + "symbol": "TORG" + }, + "isSC": {} + }, + "0x57194feaca970a4e98a19c365fe144fb54f657db": { + "name": "UFO token contract", + "address": "0x57194feaca970a4e98a19c365fe144fb54f657db", + "token": { + "decimals": 18, + "symbol": "UFO" + }, + "isSC": {} + }, + "0xf0ae1efde60bab0a830673747138f12367858e8d": { + "name": "FLOAT token contract", + "address": "0xf0ae1efde60bab0a830673747138f12367858e8d", + "token": { + "decimals": 18, + "symbol": "FLOAT" + }, + "isSC": {} + }, + "0x1a6872038b633bc9ebd2ea36df3f81eacd9b8823": { + "name": "WNAV token contract", + "address": "0x1a6872038b633bc9ebd2ea36df3f81eacd9b8823", + "token": { + "decimals": 8, + "symbol": "WNAV" + }, + "isSC": {} + }, + "0xeeedf2960cdda52cf2a5b3477b171b9f8b13d700": { + "name": "DEAD token contract", + "address": "0xeeedf2960cdda52cf2a5b3477b171b9f8b13d700", + "token": { + "decimals": 18, + "symbol": "DEAD" + }, + "isSC": {} + }, + "0x0769c9a377a285dbcb5a66326fa90ae330e5f6d3": { + "name": "VRA token contract", + "address": "0x0769c9a377a285dbcb5a66326fa90ae330e5f6d3", + "token": { + "decimals": 18, + "symbol": "VRA" + }, + "isSC": {} + }, + "0x4f2b262ac2d30e88371ddf45690f0c10e9c7807e": { + "name": "DOP token contract", + "address": "0x4f2b262ac2d30e88371ddf45690f0c10e9c7807e", + "token": { + "decimals": 18, + "symbol": "DOP" + }, + "isSC": {} + }, + "0xcc12201e4b21b2ad0071b729f2dcc2f1e95977c5": { + "name": "NMT token contract", + "address": "0xcc12201e4b21b2ad0071b729f2dcc2f1e95977c5", + "token": { + "decimals": 18, + "symbol": "NMT" + }, + "isSC": {} + }, + "0x9f28e2455f9ffcfac9ebd6084853417362bc5dbb": { + "name": "rMATIC token contract", + "address": "0x9f28e2455f9ffcfac9ebd6084853417362bc5dbb", + "token": { + "decimals": 18, + "symbol": "rMATIC" + }, + "isSC": {} + }, + "0x540eba0ab20e9d77998f9a26e75079317703d76d": { + "name": "ROBOT token contract", + "address": "0x540eba0ab20e9d77998f9a26e75079317703d76d", + "token": { + "decimals": 18, + "symbol": "ROBOT" + }, + "isSC": {} + }, + "0x4b9d66b1d0343eb2f16ebc427270718b7e010f78": { + "name": "MIGUEL token contract", + "address": "0x4b9d66b1d0343eb2f16ebc427270718b7e010f78", + "token": { + "decimals": 18, + "symbol": "MIGUEL" + }, + "isSC": {} + }, + "0x0b6643f87c37280f5006808ad4766c34fbf0996c": { + "name": "PLEXUS token contract", + "address": "0x0b6643f87c37280f5006808ad4766c34fbf0996c", + "token": { + "decimals": 18, + "symbol": "PLEXUS" + }, + "isSC": {} + }, + "0xba4c54ea2d66b904c82847a7d2357d22b857e812": { + "name": "UGT token contract", + "address": "0xba4c54ea2d66b904c82847a7d2357d22b857e812", + "token": { + "decimals": 18, + "symbol": "UGT" + }, + "isSC": {} + }, + "0x82617aa52dddf5ed9bb7b370ed777b3182a30fd1": { + "name": "YGG token contract", + "address": "0x82617aa52dddf5ed9bb7b370ed777b3182a30fd1", + "token": { + "decimals": 18, + "symbol": "YGG" + }, + "isSC": {} + }, + "0xfc574229a88292a0dcfd957ad31b360495403723": { + "name": "SPANK token contract", + "address": "0xfc574229a88292a0dcfd957ad31b360495403723", + "token": { + "decimals": 18, + "symbol": "SPANK" + }, + "isSC": {} + }, + "0xd290c81dc2f51cf8eedc8c5feafe35e9003a0475": { + "name": "IDEA token contract", + "address": "0xd290c81dc2f51cf8eedc8c5feafe35e9003a0475", + "token": { + "decimals": 18, + "symbol": "IDEA" + }, + "isSC": {} + }, + "0x1b9d40715e757bdb9bdec3215b898e46d8a3b71a": { + "name": "Metis token contract", + "address": "0x1b9d40715e757bdb9bdec3215b898e46d8a3b71a", + "token": { + "decimals": 18, + "symbol": "Metis" + }, + "isSC": {} + }, + "0xb6027769f15bde8cfb29f3b14de2e5622405aa4c": { + "name": "COU token contract", + "address": "0xb6027769f15bde8cfb29f3b14de2e5622405aa4c", + "token": { + "decimals": 18, + "symbol": "COU" + }, + "isSC": {} + }, + "0x0df0f72ee0e5c9b7ca761ecec42754992b2da5bf": { + "name": "ATA token contract", + "address": "0x0df0f72ee0e5c9b7ca761ecec42754992b2da5bf", + "token": { + "decimals": 18, + "symbol": "ATA" + }, + "isSC": {} + }, + "0x50858d870faf55da2fd90fb6df7c34b5648305c6": { + "name": "ALICE token contract", + "address": "0x50858d870faf55da2fd90fb6df7c34b5648305c6", + "token": { + "decimals": 6, + "symbol": "ALICE" + }, + "isSC": {} + }, + "0x93b0ff1c8828f6eb039d345ff681ed735086d925": { + "name": "CQT token contract", + "address": "0x93b0ff1c8828f6eb039d345ff681ed735086d925", + "token": { + "decimals": 18, + "symbol": "CQT" + }, + "isSC": {} + }, + "0x6d470424afaf9cc6476ce8a5d709b7b35f7cc790": { + "name": "WINR token contract", + "address": "0x6d470424afaf9cc6476ce8a5d709b7b35f7cc790", + "token": { + "decimals": 18, + "symbol": "WINR" + }, + "isSC": {} + }, + "0x1d47e931f82bb9f8d967f0cc3288268449835806": { + "name": "PENDLE token contract", + "address": "0x1d47e931f82bb9f8d967f0cc3288268449835806", + "token": { + "decimals": 18, + "symbol": "PENDLE" + }, + "isSC": {} + }, + "0x2fab6278bdfaeb333e4fcf99053349f4111246e5": { + "name": "SINS token contract", + "address": "0x2fab6278bdfaeb333e4fcf99053349f4111246e5", + "token": { + "decimals": 18, + "symbol": "SINS" + }, + "isSC": {} + }, + "0x3f9b2df1e7f28e046f32ac97f6bdc2e1eee5cb6a": { + "name": "FRDMX token contract", + "address": "0x3f9b2df1e7f28e046f32ac97f6bdc2e1eee5cb6a", + "token": { + "decimals": 18, + "symbol": "FRDMX" + }, + "isSC": {} + }, + "0x098eabed893edba2b7a1855130f1b1fb181f132c": { + "name": "TIP token contract", + "address": "0x098eabed893edba2b7a1855130f1b1fb181f132c", + "token": { + "decimals": 18, + "symbol": "TIP" + }, + "isSC": {} + }, + "0x0cfbbb89fd58f6b49b7bf5665397ddc84003d47c": { + "name": "WHEYV2 token contract", + "address": "0x0cfbbb89fd58f6b49b7bf5665397ddc84003d47c", + "token": { + "decimals": 18, + "symbol": "WHEYV2" + }, + "isSC": {} + }, + "0xaa5ed3c460c38eb71fba089b853d0a91c0e71dd5": { + "name": "DVD token contract", + "address": "0xaa5ed3c460c38eb71fba089b853d0a91c0e71dd5", + "token": { + "decimals": 18, + "symbol": "DVD" + }, + "isSC": {} + }, + "0x6562ba24d787dbb6739786a3df06553018ec029f": { + "name": "BURN token contract", + "address": "0x6562ba24d787dbb6739786a3df06553018ec029f", + "token": { + "decimals": 18, + "symbol": "BURN" + }, + "isSC": {} + }, + "0x3915905289344fedb847d4799d5422f74209aba9": { + "name": "ETHPA token contract", + "address": "0x3915905289344fedb847d4799d5422f74209aba9", + "token": { + "decimals": 18, + "symbol": "ETHPA" + }, + "isSC": {} + }, + "0x30dc1ebcba423368c7dfc0b2a5192890c7d7ce5b": { + "name": "GATOR token contract", + "address": "0x30dc1ebcba423368c7dfc0b2a5192890c7d7ce5b", + "token": { + "decimals": 18, + "symbol": "GATOR" + }, + "isSC": {} + }, + "0xde08ff1df4cb0befcf85e3802490caeef10af60b": { + "name": "BTCRSIAPY token contract", + "address": "0xde08ff1df4cb0befcf85e3802490caeef10af60b", + "token": { + "decimals": 18, + "symbol": "BTCRSIAPY" + }, + "isSC": {} + }, + "0x134d934bc4c05c11e19b03342e5e01abc4c5f27c": { + "name": "CHADLINK token contract", + "address": "0x134d934bc4c05c11e19b03342e5e01abc4c5f27c", + "token": { + "decimals": 18, + "symbol": "CHADLINK" + }, + "isSC": {} + }, + "0x61c147570165c53cf5e60a0b5e6a9e8791619eb9": { + "name": "BURNING DAO token contract", + "address": "0x61c147570165c53cf5e60a0b5e6a9e8791619eb9", + "token": { + "decimals": 18, + "symbol": "BURNING DAO" + }, + "isSC": {} + }, + "0x0d7fb73c39411210088bb76c0e0db36816e7a951": { + "name": "MEOW token contract", + "address": "0x0d7fb73c39411210088bb76c0e0db36816e7a951", + "token": { + "decimals": 18, + "symbol": "MEOW" + }, + "isSC": {} + }, + "0xa7b98d63a137bf402b4570799ac4cad0bb1c4b1c": { + "name": "TRAC token contract", + "address": "0xa7b98d63a137bf402b4570799ac4cad0bb1c4b1c", + "token": { + "decimals": 18, + "symbol": "TRAC" + }, + "isSC": {} + }, + "0xaaf165e75b4c9370d22b971af08c630e76bfa70c": { + "name": "wOMI token contract", + "address": "0xaaf165e75b4c9370d22b971af08c630e76bfa70c", + "token": { + "decimals": 18, + "symbol": "wOMI" + }, + "isSC": {} + }, + "0x770a1864921bafb324810a2362f7def4afeb1d53": { + "name": "CFF token contract", + "address": "0x770a1864921bafb324810a2362f7def4afeb1d53", + "token": { + "decimals": 4, + "symbol": "CFF" + }, + "isSC": {} + }, + "0xf6a38ce301700e28e0d0a3b021bae6d4fa1b5d1b": { + "name": "BSJ token contract", + "address": "0xf6a38ce301700e28e0d0a3b021bae6d4fa1b5d1b", + "token": { + "decimals": 18, + "symbol": "BSJ" + }, + "isSC": {} + }, + "0xcdb3c70cd25fd15307d84c4f9d37d5c043b33fb2": { + "name": "SPELL token contract", + "address": "0xcdb3c70cd25fd15307d84c4f9d37d5c043b33fb2", + "token": { + "decimals": 18, + "symbol": "SPELL" + }, + "isSC": {} + }, + "0x211f4e76fcb811ed2b310a232a24b3445d95e3bc": { + "name": "MATRIX token contract", + "address": "0x211f4e76fcb811ed2b310a232a24b3445d95e3bc", + "token": { + "decimals": 18, + "symbol": "MATRIX" + }, + "isSC": {} + }, + "0xa88bebd0df613eaca1d8109a803736645a502961": { + "name": "BDP token contract", + "address": "0xa88bebd0df613eaca1d8109a803736645a502961", + "token": { + "decimals": 18, + "symbol": "BDP" + }, + "isSC": {} + }, + "0x8a06bf3faa72f7dcf796608d4fd54abb83461ec3": { + "name": "IHT token contract", + "address": "0x8a06bf3faa72f7dcf796608d4fd54abb83461ec3", + "token": { + "decimals": 18, + "symbol": "IHT" + }, + "isSC": {} + }, + "0xafbb5e3873de55db4f2708a08a90677c7a685a6e": { + "name": "TTV token contract", + "address": "0xafbb5e3873de55db4f2708a08a90677c7a685a6e", + "token": { + "decimals": 18, + "symbol": "TTV" + }, + "isSC": {} + }, + "0xc2b6200a9ced47b12f95587f3e1e2640893a26d6": { + "name": "XWIN token contract", + "address": "0xc2b6200a9ced47b12f95587f3e1e2640893a26d6", + "token": { + "decimals": 18, + "symbol": "XWIN" + }, + "isSC": {} + }, + "0xa01749c95b876148c47a6f1ffb7ea88c8e72903c": { + "name": "NOAHP token contract", + "address": "0xa01749c95b876148c47a6f1ffb7ea88c8e72903c", + "token": { + "decimals": 18, + "symbol": "NOAHP" + }, + "isSC": {} + }, + "0x3adda29b608418cc63385138f990a754901291e8": { + "name": "BRLC token contract", + "address": "0x3adda29b608418cc63385138f990a754901291e8", + "token": { + "decimals": 6, + "symbol": "BRLC" + }, + "isSC": {} + }, + "0x35bb0db8210a2a6a333ef81af92e9ebe4aadc456": { + "name": "COOK token contract", + "address": "0x35bb0db8210a2a6a333ef81af92e9ebe4aadc456", + "token": { + "decimals": 18, + "symbol": "COOK" + }, + "isSC": {} + }, + "0xd74ce620ddf70e7c143af75519712e8eada541f3": { + "name": "AMONG token contract", + "address": "0xd74ce620ddf70e7c143af75519712e8eada541f3", + "token": { + "decimals": 18, + "symbol": "AMONG" + }, + "isSC": {} + }, + "0x69377cc6f2929bd19039e88a54103fbc10bc4fa9": { + "name": "PENG4815 token contract", + "address": "0x69377cc6f2929bd19039e88a54103fbc10bc4fa9", + "token": { + "decimals": 18, + "symbol": "PENG4815" + }, + "isSC": {} + }, + "0x7f556fcb59a27b3e0046e3ea400a425a6ad2040d": { + "name": "CROWD token contract", + "address": "0x7f556fcb59a27b3e0046e3ea400a425a6ad2040d", + "token": { + "decimals": 18, + "symbol": "CROWD" + }, + "isSC": {} + }, + "0x72b9f88e822cf08b031c2206612b025a82fb303c": { + "name": "DBD token contract", + "address": "0x72b9f88e822cf08b031c2206612b025a82fb303c", + "token": { + "decimals": 18, + "symbol": "DBD" + }, + "isSC": {} + }, + "0xbed23818d193b3573cfe651792ed6ad484dcc629": { + "name": "TARA token contract", + "address": "0xbed23818d193b3573cfe651792ed6ad484dcc629", + "token": { + "decimals": 18, + "symbol": "TARA" + }, + "isSC": {} + }, + "0xce6bf09e5c7a3e65b84f88dcc6475c88d38ba5ef": { + "name": "OPCT token contract", + "address": "0xce6bf09e5c7a3e65b84f88dcc6475c88d38ba5ef", + "token": { + "decimals": 18, + "symbol": "OPCT" + }, + "isSC": {} + }, + "0xf9137cf627878a1c7e2b0eeb1e91e64bbdbcfd27": { + "name": "SATT token contract", + "address": "0xf9137cf627878a1c7e2b0eeb1e91e64bbdbcfd27", + "token": { + "decimals": 18, + "symbol": "SATT" + }, + "isSC": {} + }, + "0xa09e1bf2205cdb1fbf57023258f3e731c5311b4d": { + "name": "CHART token contract", + "address": "0xa09e1bf2205cdb1fbf57023258f3e731c5311b4d", + "token": { + "decimals": 18, + "symbol": "CHART" + }, + "isSC": {} + }, + "0x2a82437475a60bebd53e33997636fade77604fc2": { + "name": "CIRUS token contract", + "address": "0x2a82437475a60bebd53e33997636fade77604fc2", + "token": { + "decimals": 18, + "symbol": "CIRUS" + }, + "isSC": {} + }, + "0x96f99063ecf25b72cef4ed1473438aa623d27b82": { + "name": "ETHMNY token contract", + "address": "0x96f99063ecf25b72cef4ed1473438aa623d27b82", + "token": { + "decimals": 2, + "symbol": "ETHMNY" + }, + "isSC": {} + }, + "0x566be1ae21a925896a7d267a80ffca5501653f14": { + "name": "PRESAIL token contract", + "address": "0x566be1ae21a925896a7d267a80ffca5501653f14", + "token": { + "decimals": 18, + "symbol": "PRESAIL" + }, + "isSC": {} + }, + "0x755df36e63e6452fab42db97490cd09f3958a8d7": { + "name": "ZOOBY token contract", + "address": "0x755df36e63e6452fab42db97490cd09f3958a8d7", + "token": { + "decimals": 18, + "symbol": "ZOOBY" + }, + "isSC": {} + }, + "0xfe457497a2a71bce1eb93ea9e6a685057dd93dee": { + "name": "BNSD token contract", + "address": "0xfe457497a2a71bce1eb93ea9e6a685057dd93dee", + "token": { + "decimals": 18, + "symbol": "BNSD" + }, + "isSC": {} + }, + "0x350bf84b899e3a7abc9048f28d25eaebde8e9916": { + "name": "BNS token contract", + "address": "0x350bf84b899e3a7abc9048f28d25eaebde8e9916", + "token": { + "decimals": 8, + "symbol": "BNS" + }, + "isSC": {} + }, + "0x6a3e4008af5dcfc416e1b17130783daee13ab694": { + "name": "iUSDT token contract", + "address": "0x6a3e4008af5dcfc416e1b17130783daee13ab694", + "token": { + "decimals": 6, + "symbol": "iUSDT" + }, + "isSC": {} + }, + "0xe749ea14a2d18e361ed092ebefba64d77a8b4eac": { + "name": "DGTX token contract", + "address": "0xe749ea14a2d18e361ed092ebefba64d77a8b4eac", + "token": { + "decimals": 18, + "symbol": "DGTX" + }, + "isSC": {} + }, + "0x468041079d9d99c87f5a17b44be6d6a529b5f597": { + "name": "CLV token contract", + "address": "0x468041079d9d99c87f5a17b44be6d6a529b5f597", + "token": { + "decimals": 6, + "symbol": "CLV" + }, + "isSC": {} + }, + "0x3ae490db48d74b1bc626400135d4616377d0109f": { + "name": "ALPHA token contract", + "address": "0x3ae490db48d74b1bc626400135d4616377d0109f", + "token": { + "decimals": 18, + "symbol": "ALPHA" + }, + "isSC": {} + }, + "0x574b21e8f0322acc3c9c31f4d291fd363867fbee": { + "name": "OSINA token contract", + "address": "0x574b21e8f0322acc3c9c31f4d291fd363867fbee", + "token": { + "decimals": 4, + "symbol": "OSINA" + }, + "isSC": {} + }, + "0x228a22bf6da9353abbe37a31cf85c02dfc432456": { + "name": "AFTR token contract", + "address": "0x228a22bf6da9353abbe37a31cf85c02dfc432456", + "token": { + "decimals": 8, + "symbol": "AFTR" + }, + "isSC": {} + }, + "0x4257ea7637c355f81616050cbb6a9b709fd72683": { + "name": "CVX token contract", + "address": "0x4257ea7637c355f81616050cbb6a9b709fd72683", + "token": { + "decimals": 18, + "symbol": "CVX" + }, + "isSC": {} + }, + "0x4c3bf0a3de9524af68327d1d2558a3b70d17d42a": { + "name": "DYDX token contract", + "address": "0x4c3bf0a3de9524af68327d1d2558a3b70d17d42a", + "token": { + "decimals": 18, + "symbol": "DYDX" + }, + "isSC": {} + }, + "0xfe31a87c001c7b0fcdf4c480621222d4fe793364": { + "name": "TOSHI token contract", + "address": "0xfe31a87c001c7b0fcdf4c480621222d4fe793364", + "token": { + "decimals": 18, + "symbol": "TOSHI" + }, + "isSC": {} + }, + "0x8cb96e95c714e0996e6d299f617f518d965e352e": { + "name": "GTF token contract", + "address": "0x8cb96e95c714e0996e6d299f617f518d965e352e", + "token": { + "decimals": 8, + "symbol": "GTF" + }, + "isSC": {} + }, + "0xa55870278d6389ec5b524553d03c04f5677c061e": { + "name": "XCAD token contract", + "address": "0xa55870278d6389ec5b524553d03c04f5677c061e", + "token": { + "decimals": 18, + "symbol": "XCAD" + }, + "isSC": {} + }, + "0x85bd0db4f1b8bae55a6dc741d332b18bfb26a13e": { + "name": "XYR token contract", + "address": "0x85bd0db4f1b8bae55a6dc741d332b18bfb26a13e", + "token": { + "decimals": 18, + "symbol": "XYR" + }, + "isSC": {} + }, + "0x2651b9c63290e543902da4eb63c34029382ff552": { + "name": "ORO token contract", + "address": "0x2651b9c63290e543902da4eb63c34029382ff552", + "token": { + "decimals": 18, + "symbol": "ORO" + }, + "isSC": {} + }, + "0x5ab64daaaa458d8f2019c0a3f2275fdc27e498d1": { + "name": "ZONE token contract", + "address": "0x5ab64daaaa458d8f2019c0a3f2275fdc27e498d1", + "token": { + "decimals": 18, + "symbol": "ZONE" + }, + "isSC": {} + }, + "0xc1e2ca002e03207f933d358dbdecbad108c4191a": { + "name": "ODDZ token contract", + "address": "0xc1e2ca002e03207f933d358dbdecbad108c4191a", + "token": { + "decimals": 18, + "symbol": "ODDZ" + }, + "isSC": {} + }, + "0x89606fa5d084eda5e9949f7b8f750c65c609eb46": { + "name": "ECR token contract", + "address": "0x89606fa5d084eda5e9949f7b8f750c65c609eb46", + "token": { + "decimals": 18, + "symbol": "ECR" + }, + "isSC": {} + }, + "0xa1d6cd1a37f82813ac9852cd7e96f909cbccea06": { + "name": "ECAT token contract", + "address": "0xa1d6cd1a37f82813ac9852cd7e96f909cbccea06", + "token": { + "decimals": 18, + "symbol": "ECAT" + }, + "isSC": {} + }, + "0x8cd9524406e9571ef524dbe8dfacc7743fa72507": { + "name": "WIPC token contract", + "address": "0x8cd9524406e9571ef524dbe8dfacc7743fa72507", + "token": { + "decimals": 18, + "symbol": "WIPC" + }, + "isSC": {} + }, + "0x8df74088b3aecfd0cb97bcfd053b173782f01e3a": { + "name": "KWIK token contract", + "address": "0x8df74088b3aecfd0cb97bcfd053b173782f01e3a", + "token": { + "decimals": 18, + "symbol": "KWIK" + }, + "isSC": {} + }, + "0x7dadd73f6ae9e4ce0ba50d8818ebd8a7ec578b11": { + "name": "ED token contract", + "address": "0x7dadd73f6ae9e4ce0ba50d8818ebd8a7ec578b11", + "token": { + "decimals": 8, + "symbol": "ED" + }, + "isSC": {} + }, + "0x82f735270cfccbcbcea08141f93ed1816b779874": { + "name": "HHK token contract", + "address": "0x82f735270cfccbcbcea08141f93ed1816b779874", + "token": { + "decimals": 18, + "symbol": "HHK" + }, + "isSC": {} + }, + "0xb233c90a0ebe7e19c30db979b602803715cdb398": { + "name": "GODL token contract", + "address": "0xb233c90a0ebe7e19c30db979b602803715cdb398", + "token": { + "decimals": 18, + "symbol": "GODL" + }, + "isSC": {} + }, + "0x3b737a181f7d2532cf49864f8050b3465a310593": { + "name": "HOTCROSS token contract", + "address": "0x3b737a181f7d2532cf49864f8050b3465a310593", + "token": { + "decimals": 18, + "symbol": "HOTCROSS" + }, + "isSC": {} + }, + "0x381caf412b45dac0f62fbeec89de306d3eabe384": { + "name": "VEST token contract", + "address": "0x381caf412b45dac0f62fbeec89de306d3eabe384", + "token": { + "decimals": 18, + "symbol": "VEST" + }, + "isSC": {} + }, + "0x9cb74c8032b007466865f060ad2c46145d45553d": { + "name": "IDEX token contract", + "address": "0x9cb74c8032b007466865f060ad2c46145d45553d", + "token": { + "decimals": 18, + "symbol": "IDEX" + }, + "isSC": {} + }, + "0xe4f0eefc8b184d9afdd5cfb6e4281ec27b6f3095": { + "name": "STN5 token contract", + "address": "0xe4f0eefc8b184d9afdd5cfb6e4281ec27b6f3095", + "token": { + "decimals": 18, + "symbol": "STN5" + }, + "isSC": {} + }, + "0xeeda694439c6fb56cbaa011cc849650b7273285b": { + "name": "BED token contract", + "address": "0xeeda694439c6fb56cbaa011cc849650b7273285b", + "token": { + "decimals": 18, + "symbol": "BED" + }, + "isSC": {} + }, + "0x01ae14b9643a720dc3181abfa05e65c528b5a30f": { + "name": "SWC token contract", + "address": "0x01ae14b9643a720dc3181abfa05e65c528b5a30f", + "token": { + "decimals": 18, + "symbol": "SWC" + }, + "isSC": {} + }, + "0x167f8c8a1af9a4c851c8e541ba0f9939d395ccf1": { + "name": "WASABI token contract", + "address": "0x167f8c8a1af9a4c851c8e541ba0f9939d395ccf1", + "token": { + "decimals": 18, + "symbol": "WASABI" + }, + "isSC": {} + }, + "0xa83d20e7b0e5c3483bbf65091c3591ceb7f75d97": { + "name": "rising token contract", + "address": "0xa83d20e7b0e5c3483bbf65091c3591ceb7f75d97", + "token": { + "decimals": 18, + "symbol": "rising" + }, + "isSC": {} + }, + "0xee800b277a96b0f490a1a732e1d6395fad960a26": { + "name": "ARPA token contract", + "address": "0xee800b277a96b0f490a1a732e1d6395fad960a26", + "token": { + "decimals": 18, + "symbol": "ARPA" + }, + "isSC": {} + }, + "0x2d61f243d1a4c16640c3961100f50222679ec89e": { + "name": "Nsure token contract", + "address": "0x2d61f243d1a4c16640c3961100f50222679ec89e", + "token": { + "decimals": 18, + "symbol": "Nsure" + }, + "isSC": {} + }, + "0xe7789178ddc4edb3b038115b1826c66640c57ecc": { + "name": "BCDT token contract", + "address": "0xe7789178ddc4edb3b038115b1826c66640c57ecc", + "token": { + "decimals": 18, + "symbol": "BCDT" + }, + "isSC": {} + }, + "0xef6b7e511c18b5fc0099e680f17ae5c3b7601d26": { + "name": "TIN token contract", + "address": "0xef6b7e511c18b5fc0099e680f17ae5c3b7601d26", + "token": { + "decimals": 8, + "symbol": "TIN" + }, + "isSC": {} + }, + "0x2b8504ab5efc246d0ec5ec7e74565683227497de": { + "name": "ANT token contract", + "address": "0x2b8504ab5efc246d0ec5ec7e74565683227497de", + "token": { + "decimals": 18, + "symbol": "ANT" + }, + "isSC": {} + }, + "0xe69fa47dfe3aa7f5e5f5642110901f917513459b": { + "name": "DRGN token contract", + "address": "0xe69fa47dfe3aa7f5e5f5642110901f917513459b", + "token": { + "decimals": 18, + "symbol": "DRGN" + }, + "isSC": {} + }, + "0x7f4e5fc5d43d1eb91447011ac83957f673e31e9a": { + "name": "CND token contract", + "address": "0x7f4e5fc5d43d1eb91447011ac83957f673e31e9a", + "token": { + "decimals": 18, + "symbol": "CND" + }, + "isSC": {} + }, + "0xb7403edaa4ff25fd05e5b8ee83dee53f15c4db39": { + "name": "UNO token contract", + "address": "0xb7403edaa4ff25fd05e5b8ee83dee53f15c4db39", + "token": { + "decimals": 18, + "symbol": "UNO" + }, + "isSC": {} + }, + "0xee619a5bc09d6fac8eb05b1031e5b3379f92f29e": { + "name": "BLACK token contract", + "address": "0xee619a5bc09d6fac8eb05b1031e5b3379f92f29e", + "token": { + "decimals": 18, + "symbol": "BLACK" + }, + "isSC": {} + }, + "0x9d5565da88e596730522cbc5a918d2a89dbc16d9": { + "name": "OOE token contract", + "address": "0x9d5565da88e596730522cbc5a918d2a89dbc16d9", + "token": { + "decimals": 18, + "symbol": "OOE" + }, + "isSC": {} + }, + "0xc4d094e246b69bb1f2eedde1e5026beba532248e": { + "name": "WXT token contract", + "address": "0xc4d094e246b69bb1f2eedde1e5026beba532248e", + "token": { + "decimals": 18, + "symbol": "WXT" + }, + "isSC": {} + }, + "0xbfa05e530f42999aafc5f15f98afdf0667e312bc": { + "name": "GS token contract", + "address": "0xbfa05e530f42999aafc5f15f98afdf0667e312bc", + "token": { + "decimals": 18, + "symbol": "GS" + }, + "isSC": {} + }, + "0xa052efcdd44f02073b1fdc42bf06017a0234ae03": { + "name": "POOLZ token contract", + "address": "0xa052efcdd44f02073b1fdc42bf06017a0234ae03", + "token": { + "decimals": 18, + "symbol": "POOLZ" + }, + "isSC": {} + }, + "0x76b1575482bcaa7815964ed6759fe4bc4b0eb8b2": { + "name": "BDI token contract", + "address": "0x76b1575482bcaa7815964ed6759fe4bc4b0eb8b2", + "token": { + "decimals": 18, + "symbol": "BDI" + }, + "isSC": {} + }, + "0xae8948bc6b4ec35ffe7decc6beb205ea6d077b57": { + "name": "SHEESHA token contract", + "address": "0xae8948bc6b4ec35ffe7decc6beb205ea6d077b57", + "token": { + "decimals": 18, + "symbol": "SHEESHA" + }, + "isSC": {} + }, + "0x99ac53c1ab08baa7c83f444ebf442d0fcbb09db6": { + "name": "GFX token contract", + "address": "0x99ac53c1ab08baa7c83f444ebf442d0fcbb09db6", + "token": { + "decimals": 18, + "symbol": "GFX" + }, + "isSC": {} + }, + "0x708cca2f9eded49918865fd45442ef733155cacb": { + "name": "COVER token contract", + "address": "0x708cca2f9eded49918865fd45442ef733155cacb", + "token": { + "decimals": 18, + "symbol": "COVER" + }, + "isSC": {} + }, + "0xc3c7d422809852031b44ab29eec9f1eff2a58756": { + "name": "LDO token contract", + "address": "0xc3c7d422809852031b44ab29eec9f1eff2a58756", + "token": { + "decimals": 18, + "symbol": "LDO" + }, + "isSC": {} + }, + "0xd4e3f03095a252323506dd589810dc78cea0a923": { + "name": "BASE token contract", + "address": "0xd4e3f03095a252323506dd589810dc78cea0a923", + "token": { + "decimals": 9, + "symbol": "BASE" + }, + "isSC": {} + }, + "0xe4bf2864ebec7b7fdf6eeca9bacae7cdfdaffe78": { + "name": "DODO token contract", + "address": "0xe4bf2864ebec7b7fdf6eeca9bacae7cdfdaffe78", + "token": { + "decimals": 18, + "symbol": "DODO" + }, + "isSC": {} + }, + "0x0cdf14b01692c57fd8d066a053b3a0fa0aa2fc11": { + "name": "FRM token contract", + "address": "0x0cdf14b01692c57fd8d066a053b3a0fa0aa2fc11", + "token": { + "decimals": 6, + "symbol": "FRM" + }, + "isSC": {} + }, + "0x2b34c0efb7eeb5bed0a7253581db085171dacb71": { + "name": "DUCK token contract", + "address": "0x2b34c0efb7eeb5bed0a7253581db085171dacb71", + "token": { + "decimals": 18, + "symbol": "DUCK" + }, + "isSC": {} + }, + "0xd72357daca2cf11a5f155b9ff7880e595a3f5792": { + "name": "STORJ token contract", + "address": "0xd72357daca2cf11a5f155b9ff7880e595a3f5792", + "token": { + "decimals": 8, + "symbol": "STORJ" + }, + "isSC": {} + }, + "0x8f94400cdef837f388100cfe56d7ebb8a3a3fb44": { + "name": "OKB token contract", + "address": "0x8f94400cdef837f388100cfe56d7ebb8a3a3fb44", + "token": { + "decimals": 18, + "symbol": "OKB" + }, + "isSC": {} + }, + "0x627c50aa6a384933d6354448f70476d3bd02fcc8": { + "name": "renBCH token contract", + "address": "0x627c50aa6a384933d6354448f70476d3bd02fcc8", + "token": { + "decimals": 8, + "symbol": "renBCH" + }, + "isSC": {} + }, + "0x6f0cad28165121ab60d3d5504a702e77d644e367": { + "name": "renZEC token contract", + "address": "0x6f0cad28165121ab60d3d5504a702e77d644e367", + "token": { + "decimals": 8, + "symbol": "renZEC" + }, + "isSC": {} + }, + "0x31042a4e66eda0d12143ffc8cc1552d611da4cba": { + "name": "MITx token contract", + "address": "0x31042a4e66eda0d12143ffc8cc1552d611da4cba", + "token": { + "decimals": 18, + "symbol": "MITx" + }, + "isSC": {} + }, + "0xd6d8ffc109a3ee48b0c1163a062ead5fcc83416e": { + "name": "ASSY token contract", + "address": "0xd6d8ffc109a3ee48b0c1163a062ead5fcc83416e", + "token": { + "decimals": 18, + "symbol": "ASSY" + }, + "isSC": {} + }, + "0xf3681947a43f180ea68a8b949f5e7a18df946a09": { + "name": "DOWS token contract", + "address": "0xf3681947a43f180ea68a8b949f5e7a18df946a09", + "token": { + "decimals": 18, + "symbol": "DOWS" + }, + "isSC": {} + }, + "0x688ab7562301b3b58b67beb614986b51ad3698eb": { + "name": "AMPL token contract", + "address": "0x688ab7562301b3b58b67beb614986b51ad3698eb", + "token": { + "decimals": 9, + "symbol": "AMPL" + }, + "isSC": {} + }, + "0xf862e6a988d0b7b7bf2f87b8e28454fafc5a4237": { + "name": "YFFI token contract", + "address": "0xf862e6a988d0b7b7bf2f87b8e28454fafc5a4237", + "token": { + "decimals": 18, + "symbol": "YFFI" + }, + "isSC": {} + }, + "0x0a5e1de30e943421ed9faaec815125b6bdf9383e": { + "name": "DDIM token contract", + "address": "0x0a5e1de30e943421ed9faaec815125b6bdf9383e", + "token": { + "decimals": 18, + "symbol": "DDIM" + }, + "isSC": {} + }, + "0x5b77bca482bd3e7958b1103d123888efccdaf803": { + "name": "TRU token contract", + "address": "0x5b77bca482bd3e7958b1103d123888efccdaf803", + "token": { + "decimals": 8, + "symbol": "TRU" + }, + "isSC": {} + }, + "0xf6a0277582919ea0a78078f54cd11a4bccfd6ac7": { + "name": "BTMX token contract", + "address": "0xf6a0277582919ea0a78078f54cd11a4bccfd6ac7", + "token": { + "decimals": 18, + "symbol": "BTMX" + }, + "isSC": {} + }, + "0x163e9c8df744b38fe1975fbed2eb3d9005c6655f": { + "name": "PAY token contract", + "address": "0x163e9c8df744b38fe1975fbed2eb3d9005c6655f", + "token": { + "decimals": 18, + "symbol": "PAY" + }, + "isSC": {} + }, + "0xb121fcd122daaa153bb8a102754127b2682645cb": { + "name": "PERL token contract", + "address": "0xb121fcd122daaa153bb8a102754127b2682645cb", + "token": { + "decimals": 18, + "symbol": "PERL" + }, + "isSC": {} + }, + "0x62059c1f748cd663798cee1b31e86ce28ba73ec2": { + "name": "cZRX token contract", + "address": "0x62059c1f748cd663798cee1b31e86ce28ba73ec2", + "token": { + "decimals": 8, + "symbol": "cZRX" + }, + "isSC": {} + }, + "0xd98defac38214426ef58cf7996de8b373933f902": { + "name": "TKN token contract", + "address": "0xd98defac38214426ef58cf7996de8b373933f902", + "token": { + "decimals": 8, + "symbol": "TKN" + }, + "isSC": {} + }, + "0x66efb7cc647e0efab02eba4316a2d2941193f6b3": { + "name": "LOOM token contract", + "address": "0x66efb7cc647e0efab02eba4316a2d2941193f6b3", + "token": { + "decimals": 18, + "symbol": "LOOM" + }, + "isSC": {} + }, + "0xb09c87726059f2a3d6b795cc7252a225292a53e1": { + "name": "USDS token contract", + "address": "0xb09c87726059f2a3d6b795cc7252a225292a53e1", + "token": { + "decimals": 6, + "symbol": "USDS" + }, + "isSC": {} + }, + "0x8d42ecce45f4b30ff2435bd19a983f7616add16e": { + "name": "NPXS token contract", + "address": "0x8d42ecce45f4b30ff2435bd19a983f7616add16e", + "token": { + "decimals": 18, + "symbol": "NPXS" + }, + "isSC": {} + }, + "0x0ee392ba5ef1354c9bd75a98044667d307c0e773": { + "name": "ORN token contract", + "address": "0x0ee392ba5ef1354c9bd75a98044667d307c0e773", + "token": { + "decimals": 8, + "symbol": "ORN" + }, + "isSC": {} + }, + "0x0ffc26bedf1eb59b27479f0b79d95f61dcfb200c": { + "name": "APYS token contract", + "address": "0x0ffc26bedf1eb59b27479f0b79d95f61dcfb200c", + "token": { + "decimals": 18, + "symbol": "APYS" + }, + "isSC": {} + }, + "0x993f2cafe9dbe525243f4a78bebc69dac8d36000": { + "name": "DIA token contract", + "address": "0x993f2cafe9dbe525243f4a78bebc69dac8d36000", + "token": { + "decimals": 18, + "symbol": "DIA" + }, + "isSC": {} + }, + "0x3ea044a788ff278d4150ce1741c888ffed6ce44f": { + "name": "GEEQ token contract", + "address": "0x3ea044a788ff278d4150ce1741c888ffed6ce44f", + "token": { + "decimals": 18, + "symbol": "GEEQ" + }, + "isSC": {} + }, + "0xb37dc3620b3ed0d09bbd43bcb9cef277a6a0f49b": { + "name": "SRN token contract", + "address": "0xb37dc3620b3ed0d09bbd43bcb9cef277a6a0f49b", + "token": { + "decimals": 18, + "symbol": "SRN" + }, + "isSC": {} + }, + "0xfc192e1943289d6731ae72850da167f4c194ab91": { + "name": "POA20 token contract", + "address": "0xfc192e1943289d6731ae72850da167f4c194ab91", + "token": { + "decimals": 18, + "symbol": "POA20" + }, + "isSC": {} + }, + "0x53c1ab7a25f1a44921de8bf479f5528845fc1254": { + "name": "sETH token contract", + "address": "0x53c1ab7a25f1a44921de8bf479f5528845fc1254", + "token": { + "decimals": 18, + "symbol": "sETH" + }, + "isSC": {} + }, + "0x6fe9c1631b37a2b438cfd3d67409e15503ddd535": { + "name": "cDAI token contract", + "address": "0x6fe9c1631b37a2b438cfd3d67409e15503ddd535", + "token": { + "decimals": 8, + "symbol": "cDAI" + }, + "isSC": {} + }, + "0xed29195ecd25da21e8942884c5faebafd4e07dab": { + "name": "DGX token contract", + "address": "0xed29195ecd25da21e8942884c5faebafd4e07dab", + "token": { + "decimals": 9, + "symbol": "DGX" + }, + "isSC": {} + }, + "0x9aacb53af37fe363e462a72bc30f35a4d20f285f": { + "name": "VIDT token contract", + "address": "0x9aacb53af37fe363e462a72bc30f35a4d20f285f", + "token": { + "decimals": 18, + "symbol": "VIDT" + }, + "isSC": {} + }, + "0x66dc5a08091d1968e08c16aa5b27bac8398b02be": { + "name": "CVC token contract", + "address": "0x66dc5a08091d1968e08c16aa5b27bac8398b02be", + "token": { + "decimals": 8, + "symbol": "CVC" + }, + "isSC": {} + }, + "0xfdca275366efac9204d2d8d3d7a9428ca947307b": { + "name": "XDCE token contract", + "address": "0xfdca275366efac9204d2d8d3d7a9428ca947307b", + "token": { + "decimals": 18, + "symbol": "XDCE" + }, + "isSC": {} + }, + "0x2c14c84d08b35a8135f57338816f5fcbeac08d35": { + "name": "FUN token contract", + "address": "0x2c14c84d08b35a8135f57338816f5fcbeac08d35", + "token": { + "decimals": 8, + "symbol": "FUN" + }, + "isSC": {} + }, + "0x4fb71290ac171e1d144f7221d882becac7196eb5": { + "name": "TRYB token contract", + "address": "0x4fb71290ac171e1d144f7221d882becac7196eb5", + "token": { + "decimals": 6, + "symbol": "TRYB" + }, + "isSC": {} + }, + "0x04bea9fce76943e90520489ccab84e84c0198e29": { + "name": "AST token contract", + "address": "0x04bea9fce76943e90520489ccab84e84c0198e29", + "token": { + "decimals": 4, + "symbol": "AST" + }, + "isSC": {} + }, + "0xff835562c761205659939b64583dd381a6aa4d92": { + "name": "DEXT token contract", + "address": "0xff835562c761205659939b64583dd381a6aa4d92", + "token": { + "decimals": 18, + "symbol": "DEXT" + }, + "isSC": {} + }, + "0xe1444fa4b5c530e46b79a47ba1a8dfe252b8a1c0": { + "name": "RSV token contract", + "address": "0xe1444fa4b5c530e46b79a47ba1a8dfe252b8a1c0", + "token": { + "decimals": 18, + "symbol": "RSV" + }, + "isSC": {} + }, + "0x6563c1244820cfbd6ca8820fbdf0f2847363f733": { + "name": "REPv2 token contract", + "address": "0x6563c1244820cfbd6ca8820fbdf0f2847363f733", + "token": { + "decimals": 18, + "symbol": "REPv2" + }, + "isSC": {} + }, + "0x0bf519071b02f22c17e7ed5f4002ee1911f46729": { + "name": "NMR token contract", + "address": "0x0bf519071b02f22c17e7ed5f4002ee1911f46729", + "token": { + "decimals": 18, + "symbol": "NMR" + }, + "isSC": {} + }, + "0x0c2ea0623e1c19bfb984dce137404671a95f3478": { + "name": "uDOO token contract", + "address": "0x0c2ea0623e1c19bfb984dce137404671a95f3478", + "token": { + "decimals": 18, + "symbol": "uDOO" + }, + "isSC": {} + }, + "0x9c81077ffdd65b7e3833dd576aa94bf4b49b00f0": { + "name": "XIO token contract", + "address": "0x9c81077ffdd65b7e3833dd576aa94bf4b49b00f0", + "token": { + "decimals": 18, + "symbol": "XIO" + }, + "isSC": {} + }, + "0x3b9db434f08003a89554cdb43b3e0b1f8734bde7": { + "name": "RGT token contract", + "address": "0x3b9db434f08003a89554cdb43b3e0b1f8734bde7", + "token": { + "decimals": 18, + "symbol": "RGT" + }, + "isSC": {} + }, + "0x4ded021c6f02db04c9e9a97b898d36348094b9b8": { + "name": "MOC token contract", + "address": "0x4ded021c6f02db04c9e9a97b898d36348094b9b8", + "token": { + "decimals": 18, + "symbol": "MOC" + }, + "isSC": {} + }, + "0x0597a52b14b0dca2158665d6961572e371ff5678": { + "name": "DOS token contract", + "address": "0x0597a52b14b0dca2158665d6961572e371ff5678", + "token": { + "decimals": 18, + "symbol": "DOS" + }, + "isSC": {} + }, + "0x347accafda7f8c5bdec57fa34a5b663cbd1aeca7": { + "name": "MATH token contract", + "address": "0x347accafda7f8c5bdec57fa34a5b663cbd1aeca7", + "token": { + "decimals": 18, + "symbol": "MATH" + }, + "isSC": {} + }, + "0x77266e2b73adb5605d9877fe3d86b217efa5cb49": { + "name": "1UP token contract", + "address": "0x77266e2b73adb5605d9877fe3d86b217efa5cb49", + "token": { + "decimals": 18, + "symbol": "1UP" + }, + "isSC": {} + }, + "0xa9ade7b8c8252b1e17cafa53bf46ff1319f8532d": { + "name": "LID token contract", + "address": "0xa9ade7b8c8252b1e17cafa53bf46ff1319f8532d", + "token": { + "decimals": 18, + "symbol": "LID" + }, + "isSC": {} + }, + "0x6b3d5099c4827a3fc7c858865c1cea15c3fe58ee": { + "name": "BTC++ token contract", + "address": "0x6b3d5099c4827a3fc7c858865c1cea15c3fe58ee", + "token": { + "decimals": 18, + "symbol": "BTC++" + }, + "isSC": {} + }, + "0xb36e3391b22a970d31a9b620ae1a414c6c256d2a": { + "name": "STX token contract", + "address": "0xb36e3391b22a970d31a9b620ae1a414c6c256d2a", + "token": { + "decimals": 18, + "symbol": "STX" + }, + "isSC": {} + }, + "0xb2b613b771e5a5dda496733b4024d34f309cc03d": { + "name": "NXM token contract", + "address": "0xb2b613b771e5a5dda496733b4024d34f309cc03d", + "token": { + "decimals": 18, + "symbol": "NXM" + }, + "isSC": {} + }, + "0x61b3c650154f9525dad3c1010de959fc6e2218f3": { + "name": "cUSDT token contract", + "address": "0x61b3c650154f9525dad3c1010de959fc6e2218f3", + "token": { + "decimals": 8, + "symbol": "cUSDT" + }, + "isSC": {} + }, + "0x90bb6feb70a9a43cfaaa615f856ba309fd759a90": { + "name": "wCFG token contract", + "address": "0x90bb6feb70a9a43cfaaa615f856ba309fd759a90", + "token": { + "decimals": 18, + "symbol": "wCFG" + }, + "isSC": {} + }, + "0x60e68d032deb4c238c2ba580ec0f22516ebcbc13": { + "name": "ANC token contract", + "address": "0x60e68d032deb4c238c2ba580ec0f22516ebcbc13", + "token": { + "decimals": 18, + "symbol": "ANC" + }, + "isSC": {} + }, + "0x1c5ccca2cb59145a4b25f452660cba6436ddce9b": { + "name": "MIR token contract", + "address": "0x1c5ccca2cb59145a4b25f452660cba6436ddce9b", + "token": { + "decimals": 18, + "symbol": "MIR" + }, + "isSC": {} + }, + "0x7e4e3923005ac2942745480d96751ca9dec5c9b6": { + "name": "mAAPL token contract", + "address": "0x7e4e3923005ac2942745480d96751ca9dec5c9b6", + "token": { + "decimals": 18, + "symbol": "mAAPL" + }, + "isSC": {} + }, + "0x41970f24b738aa21152fdf05d65a688a9a3c63c7": { + "name": "mGOOGL token contract", + "address": "0x41970f24b738aa21152fdf05d65a688a9a3c63c7", + "token": { + "decimals": 18, + "symbol": "mGOOGL" + }, + "isSC": {} + }, + "0xb261387f5188c81ddd543e2a75c89309ab1bfd2c": { + "name": "mNFLX token contract", + "address": "0xb261387f5188c81ddd543e2a75c89309ab1bfd2c", + "token": { + "decimals": 18, + "symbol": "mNFLX" + }, + "isSC": {} + }, + "0x20269a36538fbd3f33f1688919776e2220455567": { + "name": "mQQQ token contract", + "address": "0x20269a36538fbd3f33f1688919776e2220455567", + "token": { + "decimals": 18, + "symbol": "mQQQ" + }, + "isSC": {} + }, + "0x5c7d670637cbac5cd71ddf3df7decee2a46dbfe2": { + "name": "mTWTR token contract", + "address": "0x5c7d670637cbac5cd71ddf3df7decee2a46dbfe2", + "token": { + "decimals": 18, + "symbol": "mTWTR" + }, + "isSC": {} + }, + "0xc4483afed7159af6b7d2ef41a18bc82f5081c063": { + "name": "mMSFT token contract", + "address": "0xc4483afed7159af6b7d2ef41a18bc82f5081c063", + "token": { + "decimals": 18, + "symbol": "mMSFT" + }, + "isSC": {} + }, + "0xc46e5f28f1a7adeac72b0d2bc0c710df865776f1": { + "name": "mAMZN token contract", + "address": "0xc46e5f28f1a7adeac72b0d2bc0c710df865776f1", + "token": { + "decimals": 18, + "symbol": "mAMZN" + }, + "isSC": {} + }, + "0x0959cad1298a204277c1b5c00f62d9f2cb0b6756": { + "name": "mBABA token contract", + "address": "0x0959cad1298a204277c1b5c00f62d9f2cb0b6756", + "token": { + "decimals": 18, + "symbol": "mBABA" + }, + "isSC": {} + }, + "0xb38b63cbccd3239d72ab133771382bbbcf4bed02": { + "name": "mIAU token contract", + "address": "0xb38b63cbccd3239d72ab133771382bbbcf4bed02", + "token": { + "decimals": 18, + "symbol": "mIAU" + }, + "isSC": {} + }, + "0xe861920768da0310b125c27a44adda11532ab838": { + "name": "mUSO token contract", + "address": "0xe861920768da0310b125c27a44adda11532ab838", + "token": { + "decimals": 18, + "symbol": "mUSO" + }, + "isSC": {} + }, + "0xcdb3ff438d8fbc7b09a70311178ec68ef4eaff00": { + "name": "mFB token contract", + "address": "0xcdb3ff438d8fbc7b09a70311178ec68ef4eaff00", + "token": { + "decimals": 18, + "symbol": "mFB" + }, + "isSC": {} + }, + "0x14c36a063414ee9bfa9ef2bd0e1fdfae690512be": { + "name": "mCOIN token contract", + "address": "0x14c36a063414ee9bfa9ef2bd0e1fdfae690512be", + "token": { + "decimals": 18, + "symbol": "mCOIN" + }, + "isSC": {} + }, + "0x02c46650701dd6b83dcec3472fc3fd69ea1a5ab7": { + "name": "DVF token contract", + "address": "0x02c46650701dd6b83dcec3472fc3fd69ea1a5ab7", + "token": { + "decimals": 18, + "symbol": "DVF" + }, + "isSC": {} + }, + "0x2e02d3c4b81498177783584b842821864245ce50": { + "name": "RAKU token contract", + "address": "0x2e02d3c4b81498177783584b842821864245ce50", + "token": { + "decimals": 18, + "symbol": "RAKU" + }, + "isSC": {} + }, + "0x655bd74cd109ebdd0b030eb4609b9214028f7729": { + "name": "OUSD token contract", + "address": "0x655bd74cd109ebdd0b030eb4609b9214028f7729", + "token": { + "decimals": 18, + "symbol": "OUSD" + }, + "isSC": {} + }, + "0x89b1f5db1797f82af33ded6e6b50623a83ae84fa": { + "name": "iBTCV token contract", + "address": "0x89b1f5db1797f82af33ded6e6b50623a83ae84fa", + "token": { + "decimals": 18, + "symbol": "iBTCV" + }, + "isSC": {} + }, + "0xe52f979590067637120004d188771b4ae48807ee": { + "name": "BTCV token contract", + "address": "0xe52f979590067637120004d188771b4ae48807ee", + "token": { + "decimals": 18, + "symbol": "BTCV" + }, + "isSC": {} + }, + "0x39cdbd331c94d781d4b50802346152549689b1e5": { + "name": "iETHV token contract", + "address": "0x39cdbd331c94d781d4b50802346152549689b1e5", + "token": { + "decimals": 18, + "symbol": "iETHV" + }, + "isSC": {} + }, + "0x3dbd2a88627566306ae9f5f5fb466b498535af21": { + "name": "ETHV token contract", + "address": "0x3dbd2a88627566306ae9f5f5fb466b498535af21", + "token": { + "decimals": 18, + "symbol": "ETHV" + }, + "isSC": {} + }, + "0x542af0d2ec7f5a92f9caddadd4e33b75d15f800c": { + "name": "RSD token contract", + "address": "0x542af0d2ec7f5a92f9caddadd4e33b75d15f800c", + "token": { + "decimals": 18, + "symbol": "RSD" + }, + "isSC": {} + }, + "0x921cfe00bdc605c452412079b315ead661983b10": { + "name": "BTBS token contract", + "address": "0x921cfe00bdc605c452412079b315ead661983b10", + "token": { + "decimals": 18, + "symbol": "BTBS" + }, + "isSC": {} + }, + "0x7767ba7fb74082e02b821c341f9565ce6440fb26": { + "name": "ROX token contract", + "address": "0x7767ba7fb74082e02b821c341f9565ce6440fb26", + "token": { + "decimals": 18, + "symbol": "ROX" + }, + "isSC": {} + }, + "0xcbef7a4b4385db4747362b900b6f6f8051b152c0": { + "name": "INF token contract", + "address": "0xcbef7a4b4385db4747362b900b6f6f8051b152c0", + "token": { + "decimals": 18, + "symbol": "INF" + }, + "isSC": {} + }, + "0x3b7377f91f9682335c6d959e91b107d313c397cc": { + "name": "HAPPY token contract", + "address": "0x3b7377f91f9682335c6d959e91b107d313c397cc", + "token": { + "decimals": 18, + "symbol": "HAPPY" + }, + "isSC": {} + }, + "0x5dc70fae21c9e21d47e1be6cb01bbeb0c4d12ca3": { + "name": "CE token contract", + "address": "0x5dc70fae21c9e21d47e1be6cb01bbeb0c4d12ca3", + "token": { + "decimals": 18, + "symbol": "CE" + }, + "isSC": {} + }, + "0x1dce4a8b459a50f450ee91fb5e6c86d161aa22f8": { + "name": "UOS token contract", + "address": "0x1dce4a8b459a50f450ee91fb5e6c86d161aa22f8", + "token": { + "decimals": 4, + "symbol": "UOS" + }, + "isSC": {} + }, + "0x7e4c577ca35913af564ee2a24d882a4946ec492b": { + "name": "MOONED token contract", + "address": "0x7e4c577ca35913af564ee2a24d882a4946ec492b", + "token": { + "decimals": 18, + "symbol": "MOONED" + }, + "isSC": {} + }, + "0xa9f37d84c856fda3812ad0519dad44fa0a3fe207": { + "name": "MLN token contract", + "address": "0xa9f37d84c856fda3812ad0519dad44fa0a3fe207", + "token": { + "decimals": 18, + "symbol": "MLN" + }, + "isSC": {} + }, + "0x1c0a798b5a5273a9e54028eb1524fd337b24145f": { + "name": "lowb token contract", + "address": "0x1c0a798b5a5273a9e54028eb1524fd337b24145f", + "token": { + "decimals": 18, + "symbol": "lowb" + }, + "isSC": {} + }, + "0xed558bb8881163afdc9f3bdba5f43fd527c39af8": { + "name": "$JUMP token contract", + "address": "0xed558bb8881163afdc9f3bdba5f43fd527c39af8", + "token": { + "decimals": 18, + "symbol": "$JUMP" + }, + "isSC": {} + }, + "0x839d8cc21f51dddcb635064f8d11166e6d0053c5": { + "name": "DGT token contract", + "address": "0x839d8cc21f51dddcb635064f8d11166e6d0053c5", + "token": { + "decimals": 18, + "symbol": "DGT" + }, + "isSC": {} + }, + "0xea9d32bf641ee72ba1f301512891fbc96d39e6b2": { + "name": "SAUNA token contract", + "address": "0xea9d32bf641ee72ba1f301512891fbc96d39e6b2", + "token": { + "decimals": 18, + "symbol": "SAUNA" + }, + "isSC": {} + }, + "0x9ff32e82c4c80499266ca26776c535458b758369": { + "name": "CODE token contract", + "address": "0x9ff32e82c4c80499266ca26776c535458b758369", + "token": { + "decimals": 18, + "symbol": "CODE" + }, + "isSC": {} + }, + "0x82ea80b9e021e8cb4a2b20e1be60fe2ca04c9621": { + "name": "MATCH token contract", + "address": "0x82ea80b9e021e8cb4a2b20e1be60fe2ca04c9621", + "token": { + "decimals": 18, + "symbol": "MATCH" + }, + "isSC": {} + }, + "0x54a02fd4aefc77aa97cd3d30322f3e7a7d875a27": { + "name": "cPHX token contract", + "address": "0x54a02fd4aefc77aa97cd3d30322f3e7a7d875a27", + "token": { + "decimals": 18, + "symbol": "cPHX" + }, + "isSC": {} + }, + "0xaa9654becca45b5bdfa5ac646c939c62b527d394": { + "name": "DINO token contract", + "address": "0xaa9654becca45b5bdfa5ac646c939c62b527d394", + "token": { + "decimals": 18, + "symbol": "DINO" + }, + "isSC": {} + }, + "0x8f6a1c0c10b72c1218270c81b0d5740aae71f91d": { + "name": "BOWIE token contract", + "address": "0x8f6a1c0c10b72c1218270c81b0d5740aae71f91d", + "token": { + "decimals": 9, + "symbol": "BOWIE" + }, + "isSC": {} + }, + "0x268c4a88208b5b22993d1e56d5fc039a28d1a18c": { + "name": "MARVIN token contract", + "address": "0x268c4a88208b5b22993d1e56d5fc039a28d1a18c", + "token": { + "decimals": 18, + "symbol": "MARVIN" + }, + "isSC": {} + }, + "0xe7c83848ad3d46b002e6f0dfa135aefc16d8a30f": { + "name": "$CATNORRIS token contract", + "address": "0xe7c83848ad3d46b002e6f0dfa135aefc16d8a30f", + "token": { + "decimals": 9, + "symbol": "$CATNORRIS" + }, + "isSC": {} + }, + "0xb8dd82e944354b7bf9e9e0744ba5ff786581d372": { + "name": "CID token contract", + "address": "0xb8dd82e944354b7bf9e9e0744ba5ff786581d372", + "token": { + "decimals": 18, + "symbol": "CID" + }, + "isSC": {} + }, + "0x2cf15c001a2a5da76bf213d17763e5c856ae3632": { + "name": "TAR token contract", + "address": "0x2cf15c001a2a5da76bf213d17763e5c856ae3632", + "token": { + "decimals": 8, + "symbol": "TAR" + }, + "isSC": {} + }, + "0xdd5e426362ef1b524d156335901be65f4573ff8e": { + "name": "CHUA token contract", + "address": "0xdd5e426362ef1b524d156335901be65f4573ff8e", + "token": { + "decimals": 18, + "symbol": "CHUA" + }, + "isSC": {} + }, + "0x1ddd49df0097700479d89b361384acfaf21f9621": { + "name": "YUAN token contract", + "address": "0x1ddd49df0097700479d89b361384acfaf21f9621", + "token": { + "decimals": 9, + "symbol": "YUAN" + }, + "isSC": {} + }, + "0xb9784e05c7af6068fc82a80730a599fe17ca2adf": { + "name": "MEL token contract", + "address": "0xb9784e05c7af6068fc82a80730a599fe17ca2adf", + "token": { + "decimals": 18, + "symbol": "MEL" + }, + "isSC": {} + }, + "0xc87dc7474db6cdb9d37cc38a227dcd7b12289f22": { + "name": "VNDC token contract", + "address": "0xc87dc7474db6cdb9d37cc38a227dcd7b12289f22", + "token": { + "decimals": 0, + "symbol": "VNDC" + }, + "isSC": {} + }, + "0x598e49f01befeb1753737934a5b11fea9119c796": { + "name": "ADS token contract", + "address": "0x598e49f01befeb1753737934a5b11fea9119c796", + "token": { + "decimals": 11, + "symbol": "ADS" + }, + "isSC": {} + }, + "0x24f8a7bb3190039b4cf0f96cd72e2ea3a2d82256": { + "name": "EDGT token contract", + "address": "0x24f8a7bb3190039b4cf0f96cd72e2ea3a2d82256", + "token": { + "decimals": 18, + "symbol": "EDGT" + }, + "isSC": {} + }, + "0x0921fe2ad25266df4c078c051f7ad1c2298e89fc": { + "name": "ITF token contract", + "address": "0x0921fe2ad25266df4c078c051f7ad1c2298e89fc", + "token": { + "decimals": 18, + "symbol": "ITF" + }, + "isSC": {} + }, + "0x1997fc07b67e7962cddd6e4db84e3c7315bf4eb0": { + "name": "OT-cDAI-29DEC2022 token contract", + "address": "0x1997fc07b67e7962cddd6e4db84e3c7315bf4eb0", + "token": { + "decimals": 8, + "symbol": "OT-cDAI-29DEC2022" + }, + "isSC": {} + }, + "0x778ba5c85c48c695228af7e4ce3e8ea96a50870c": { + "name": "OT-aUSDC-29DEC2022 token contract", + "address": "0x778ba5c85c48c695228af7e4ce3e8ea96a50870c", + "token": { + "decimals": 6, + "symbol": "OT-aUSDC-29DEC2022" + }, + "isSC": {} + }, + "0xb91c05cf30a973a58295c8db9248d0911cf091e5": { + "name": "VALOU token contract", + "address": "0xb91c05cf30a973a58295c8db9248d0911cf091e5", + "token": { + "decimals": 0, + "symbol": "VALOU" + }, + "isSC": {} + }, + "0xa0715b961daabafcb7a8a2bc1146541a21aa56c1": { + "name": "VIQYY token contract", + "address": "0xa0715b961daabafcb7a8a2bc1146541a21aa56c1", + "token": { + "decimals": 18, + "symbol": "VIQYY" + }, + "isSC": {} + }, + "0xf4426f20e0956e91b75217a0f6b0e747213dac75": { + "name": "GIX token contract", + "address": "0xf4426f20e0956e91b75217a0f6b0e747213dac75", + "token": { + "decimals": 18, + "symbol": "GIX" + }, + "isSC": {} + }, + "0xf11de26883eb2ebf9877a01703ddc1eb619094e6": { + "name": "TSX token contract", + "address": "0xf11de26883eb2ebf9877a01703ddc1eb619094e6", + "token": { + "decimals": 18, + "symbol": "TSX" + }, + "isSC": {} + }, + "0xdc0e17eae3b9651875030244b971fa0223a1764f": { + "name": "PERI token contract", + "address": "0xdc0e17eae3b9651875030244b971fa0223a1764f", + "token": { + "decimals": 18, + "symbol": "PERI" + }, + "isSC": {} + }, + "0x59e991b37b35ac2187113dfdb5d60d2e887eeec1": { + "name": "SDAO token contract", + "address": "0x59e991b37b35ac2187113dfdb5d60d2e887eeec1", + "token": { + "decimals": 18, + "symbol": "SDAO" + }, + "isSC": {} + }, + "0x21364671fd823bbda8ba1f40a24171decbdb3d54": { + "name": "TREATS token contract", + "address": "0x21364671fd823bbda8ba1f40a24171decbdb3d54", + "token": { + "decimals": 18, + "symbol": "TREATS" + }, + "isSC": {} + }, + "0x76d431ccc4a1696996c4f282284e8998f7315ed8": { + "name": "aDAO token contract", + "address": "0x76d431ccc4a1696996c4f282284e8998f7315ed8", + "token": { + "decimals": 18, + "symbol": "aDAO" + }, + "isSC": {} + }, + "0xa2ca40dbe72028d3ac78b5250a8cb8c404e7fb8c": { + "name": "FEAR token contract", + "address": "0xa2ca40dbe72028d3ac78b5250a8cb8c404e7fb8c", + "token": { + "decimals": 18, + "symbol": "FEAR" + }, + "isSC": {} + }, + "0x69bde563680f580a2da5b5d4e202eca4fdf35664": { + "name": "LOVE token contract", + "address": "0x69bde563680f580a2da5b5d4e202eca4fdf35664", + "token": { + "decimals": 18, + "symbol": "LOVE" + }, + "isSC": {} + }, + "0x0335defc8a1977b99488e0b5f5c6bc3d44facdd4": { + "name": "ATTR token contract", + "address": "0x0335defc8a1977b99488e0b5f5c6bc3d44facdd4", + "token": { + "decimals": 18, + "symbol": "ATTR" + }, + "isSC": {} + }, + "0x2f3cce940815daace6d8f773a1a4f8c6cb22ae00": { + "name": "ZEUZ token contract", + "address": "0x2f3cce940815daace6d8f773a1a4f8c6cb22ae00", + "token": { + "decimals": 18, + "symbol": "ZEUZ" + }, + "isSC": {} + }, + "0x2f81e176471cc57fdc76f7d332fb4511bf2bebdd": { + "name": "RAD token contract", + "address": "0x2f81e176471cc57fdc76f7d332fb4511bf2bebdd", + "token": { + "decimals": 18, + "symbol": "RAD" + }, + "isSC": {} + }, + "0x0e2a70c08e884ea76116fccdc8b8be559162f08e": { + "name": "CFO token contract", + "address": "0x0e2a70c08e884ea76116fccdc8b8be559162f08e", + "token": { + "decimals": 6, + "symbol": "CFO" + }, + "isSC": {} + }, + "0xa15a8e5743d15ba1b2fd857c4e1937dbf1727bd6": { + "name": "USDT-LP token contract", + "address": "0xa15a8e5743d15ba1b2fd857c4e1937dbf1727bd6", + "token": { + "decimals": 18, + "symbol": "USDT-LP" + }, + "isSC": {} + }, + "0x892fc8d2b2d6252cdd91ed29ae08d89c03c5e0b2": { + "name": "BabyFloki token contract", + "address": "0x892fc8d2b2d6252cdd91ed29ae08d89c03c5e0b2", + "token": { + "decimals": 9, + "symbol": "BabyFloki" + }, + "isSC": {} + }, + "0x690e822b6f26ac835432b05908a8c0d7c9db76e9": { + "name": "WAIFU token contract", + "address": "0x690e822b6f26ac835432b05908a8c0d7c9db76e9", + "token": { + "decimals": 18, + "symbol": "WAIFU" + }, + "isSC": {} + }, + "0x8454498ce328d7d3fc35b743301f52de67eb9fdc": { + "name": "KROY token contract", + "address": "0x8454498ce328d7d3fc35b743301f52de67eb9fdc", + "token": { + "decimals": 18, + "symbol": "KROY" + }, + "isSC": {} + }, + "0x28c388fb1f4fa9f9eb445f0579666849ee5eeb42": { + "name": "BEL token contract", + "address": "0x28c388fb1f4fa9f9eb445f0579666849ee5eeb42", + "token": { + "decimals": 18, + "symbol": "BEL" + }, + "isSC": {} + }, + "0x89c296be2f904f3e99a6125815b4b78f5388d2dd": { + "name": "RCN token contract", + "address": "0x89c296be2f904f3e99a6125815b4b78f5388d2dd", + "token": { + "decimals": 18, + "symbol": "RCN" + }, + "isSC": {} + }, + "0xadac33f543267c4d59a8c299cf804c303bc3e4ac": { + "name": "MIMO token contract", + "address": "0xadac33f543267c4d59a8c299cf804c303bc3e4ac", + "token": { + "decimals": 18, + "symbol": "MIMO" + }, + "isSC": {} + }, + "0x883ec81b5dbcb9bceafe0c101893487c88b167bf": { + "name": "INDI token contract", + "address": "0x883ec81b5dbcb9bceafe0c101893487c88b167bf", + "token": { + "decimals": 18, + "symbol": "INDI" + }, + "isSC": {} + }, + "0xc7bdabde06cd7a873d8f3db47c42ab6146403b05": { + "name": "PANTHER token contract", + "address": "0xc7bdabde06cd7a873d8f3db47c42ab6146403b05", + "token": { + "decimals": 18, + "symbol": "PANTHER" + }, + "isSC": {} + }, + "0x8da74b5450576998a5bc499cb80ae3fe66ebb023": { + "name": "GT token contract", + "address": "0x8da74b5450576998a5bc499cb80ae3fe66ebb023", + "token": { + "decimals": 18, + "symbol": "GT" + }, + "isSC": {} + }, + "0x5b4d05223a14aeb6160f8400dcbbdd0a84af60f7": { + "name": "HOKK token contract", + "address": "0x5b4d05223a14aeb6160f8400dcbbdd0a84af60f7", + "token": { + "decimals": 9, + "symbol": "HOKK" + }, + "isSC": {} + }, + "0xd68468a1c2255ff4b13279752d68b5915bd84860": { + "name": "TESINU token contract", + "address": "0xd68468a1c2255ff4b13279752d68b5915bd84860", + "token": { + "decimals": 9, + "symbol": "TESINU" + }, + "isSC": {} + }, + "0x08912aa55d5eb104107c929cd4f48840d287613e": { + "name": "dcaps token contract", + "address": "0x08912aa55d5eb104107c929cd4f48840d287613e", + "token": { + "decimals": 9, + "symbol": "dcaps" + }, + "isSC": {} + }, + "0x7df29b5e0f2c7895f4b4fa4a20e759f8abc1ba91": { + "name": "uBTC token contract", + "address": "0x7df29b5e0f2c7895f4b4fa4a20e759f8abc1ba91", + "token": { + "decimals": 18, + "symbol": "uBTC" + }, + "isSC": {} + }, + "0xe6a823862ee153168c772cf494e9dff77140c696": { + "name": "BBL token contract", + "address": "0xe6a823862ee153168c772cf494e9dff77140c696", + "token": { + "decimals": 18, + "symbol": "BBL" + }, + "isSC": {} + }, + "0xd2a2a353d28e4833faffc882f6649c9c884a7d8f": { + "name": "ESW token contract", + "address": "0xd2a2a353d28e4833faffc882f6649c9c884a7d8f", + "token": { + "decimals": 18, + "symbol": "ESW" + }, + "isSC": {} + }, + "0x2b9e7ccdf0f4e5b24757c1e1a80e311e34cb10c7": { + "name": "MASK token contract", + "address": "0x2b9e7ccdf0f4e5b24757c1e1a80e311e34cb10c7", + "token": { + "decimals": 18, + "symbol": "MASK" + }, + "isSC": {} + }, + "0x9c6bfedc14b5c23e3900889436edca7805170f01": { + "name": "PHX token contract", + "address": "0x9c6bfedc14b5c23e3900889436edca7805170f01", + "token": { + "decimals": 18, + "symbol": "PHX" + }, + "isSC": {} + }, + "0x01b317bc5ed573faa112ef64dd029f407cecb155": { + "name": "IONX token contract", + "address": "0x01b317bc5ed573faa112ef64dd029f407cecb155", + "token": { + "decimals": 18, + "symbol": "IONX" + }, + "isSC": {} + }, + "0x648a372552725ee4abfc8e8f3006d80124d63b44": { + "name": "RUN token contract", + "address": "0x648a372552725ee4abfc8e8f3006d80124d63b44", + "token": { + "decimals": 18, + "symbol": "RUN" + }, + "isSC": {} + }, + "0x14b5ed5dc05e9f7d35104d035719bd65a7ee93e0": { + "name": "1PLCO2 token contract", + "address": "0x14b5ed5dc05e9f7d35104d035719bd65a7ee93e0", + "token": { + "decimals": 18, + "symbol": "1PLCO2" + }, + "isSC": {} + }, + "0xf00ece8edf75db1ad4c8640ea44537fccdf6e7a4": { + "name": "OKNA token contract", + "address": "0xf00ece8edf75db1ad4c8640ea44537fccdf6e7a4", + "token": { + "decimals": 18, + "symbol": "OKNA" + }, + "isSC": {} + }, + "0xf81b4bec6ca8f9fe7be01ca734f55b2b6e03a7a0": { + "name": "sUSD token contract", + "address": "0xf81b4bec6ca8f9fe7be01ca734f55b2b6e03a7a0", + "token": { + "decimals": 18, + "symbol": "sUSD" + }, + "isSC": {} + }, + "0xe368e30c2b0f58ef216e12073141e07a875fba6d": { + "name": "HKMT token contract", + "address": "0xe368e30c2b0f58ef216e12073141e07a875fba6d", + "token": { + "decimals": 6, + "symbol": "HKMT" + }, + "isSC": {} + }, + "0x428ac1de3fc08c0f3a47745c964f7d677716981f": { + "name": "IBZ token contract", + "address": "0x428ac1de3fc08c0f3a47745c964f7d677716981f", + "token": { + "decimals": 18, + "symbol": "IBZ" + }, + "isSC": {} + }, + "0xa3e6ac447c6a65e738adbda36034b54e2bc9603b": { + "name": "URUS token contract", + "address": "0xa3e6ac447c6a65e738adbda36034b54e2bc9603b", + "token": { + "decimals": 18, + "symbol": "URUS" + }, + "isSC": {} + }, + "0x941f59f9577451530ee38287e5f146bd42cda258": { + "name": "SHUSKY token contract", + "address": "0x941f59f9577451530ee38287e5f146bd42cda258", + "token": { + "decimals": 9, + "symbol": "SHUSKY" + }, + "isSC": {} + }, + "0x141b8b6834fb2d24f9205ad262326dbc699defa4": { + "name": "SHIBA token contract", + "address": "0x141b8b6834fb2d24f9205ad262326dbc699defa4", + "token": { + "decimals": 18, + "symbol": "SHIBA" + }, + "isSC": {} + }, + "0x14f2af758c62aa1de8c9e48e1de363826b087453": { + "name": "MOONPUG token contract", + "address": "0x14f2af758c62aa1de8c9e48e1de363826b087453", + "token": { + "decimals": 9, + "symbol": "MOONPUG" + }, + "isSC": {} + }, + "0x95894e4286bf4618edd3824dd5b38a082a431953": { + "name": "GOLDENPINE token contract", + "address": "0x95894e4286bf4618edd3824dd5b38a082a431953", + "token": { + "decimals": 18, + "symbol": "GOLDENPINE" + }, + "isSC": {} + }, + "0x137e8f56bb8b4da5720e912db15d45b01ac3c3ad": { + "name": "SHIVA token contract", + "address": "0x137e8f56bb8b4da5720e912db15d45b01ac3c3ad", + "token": { + "decimals": 18, + "symbol": "SHIVA" + }, + "isSC": {} + }, + "0xceb082ab7c63d68476797223a84f49e0284e9b29": { + "name": "BROT token contract", + "address": "0xceb082ab7c63d68476797223a84f49e0284e9b29", + "token": { + "decimals": 18, + "symbol": "BROT" + }, + "isSC": {} + }, + "0xa73eacb2955ff636f8fe16f6be35fc11d8d61f9e": { + "name": "TRSH token contract", + "address": "0xa73eacb2955ff636f8fe16f6be35fc11d8d61f9e", + "token": { + "decimals": 18, + "symbol": "TRSH" + }, + "isSC": {} + }, + "0x9ca6a77c8b38159fd2da9bd25bc3e259c33f5e39": { + "name": "SPORK token contract", + "address": "0x9ca6a77c8b38159fd2da9bd25bc3e259c33f5e39", + "token": { + "decimals": 18, + "symbol": "SPORK" + }, + "isSC": {} + }, + "0x3066818837c5e6ed6601bd5a91b0762877a6b731": { + "name": "UMA token contract", + "address": "0x3066818837c5e6ed6601bd5a91b0762877a6b731", + "token": { + "decimals": 18, + "symbol": "UMA" + }, + "isSC": {} + }, + "0x98f39821b479eb32f0659734a3ca0bb717a4dd4a": { + "name": "CULTURE token contract", + "address": "0x98f39821b479eb32f0659734a3ca0bb717a4dd4a", + "token": { + "decimals": 18, + "symbol": "CULTURE" + }, + "isSC": {} + }, + "0xe7ea6564f85cc4f98d8b20a6888b877b3362d6ab": { + "name": "USKITA token contract", + "address": "0xe7ea6564f85cc4f98d8b20a6888b877b3362d6ab", + "token": { + "decimals": 9, + "symbol": "USKITA" + }, + "isSC": {} + }, + "0x20583a26a27a81c0c5387521a6ff443e6806be75": { + "name": "FOGE token contract", + "address": "0x20583a26a27a81c0c5387521a6ff443e6806be75", + "token": { + "decimals": 9, + "symbol": "FOGE" + }, + "isSC": {} + }, + "0xa65d74f1f047596b2dafedfdfa327ccbd499aa9e": { + "name": "TREKS token contract", + "address": "0xa65d74f1f047596b2dafedfdfa327ccbd499aa9e", + "token": { + "decimals": 18, + "symbol": "TREKS" + }, + "isSC": {} + }, + "0xb3fb97019e9f69d0fd2e76fbd113ec6960a5389a": { + "name": "CC token contract", + "address": "0xb3fb97019e9f69d0fd2e76fbd113ec6960a5389a", + "token": { + "decimals": 18, + "symbol": "CC" + }, + "isSC": {} + }, + "0x27ca65acd4397a6ade56ac2a5d63587c14a46f0f": { + "name": "xFORCE token contract", + "address": "0x27ca65acd4397a6ade56ac2a5d63587c14a46f0f", + "token": { + "decimals": 18, + "symbol": "xFORCE" + }, + "isSC": {} + }, + "0x0f44c5cd9cf957ce0c7dea558a765e81e8378b37": { + "name": "JSHIBA token contract", + "address": "0x0f44c5cd9cf957ce0c7dea558a765e81e8378b37", + "token": { + "decimals": 9, + "symbol": "JSHIBA" + }, + "isSC": {} + }, + "0x7cef6ed1e07079e174601d39066ad0856cb47988": { + "name": "FREE token contract", + "address": "0x7cef6ed1e07079e174601d39066ad0856cb47988", + "token": { + "decimals": 18, + "symbol": "FREE" + }, + "isSC": {} + }, + "0x9737399fab00754fdc8bee48fcb0697ce85c7de5": { + "name": "BLO token contract", + "address": "0x9737399fab00754fdc8bee48fcb0697ce85c7de5", + "token": { + "decimals": 18, + "symbol": "BLO" + }, + "isSC": {} + }, + "0xb45d03f97357f7c5018c0235830ab802e29dbd0d": { + "name": "PKAT token contract", + "address": "0xb45d03f97357f7c5018c0235830ab802e29dbd0d", + "token": { + "decimals": 18, + "symbol": "PKAT" + }, + "isSC": {} + }, + "0x2efd9dab50cf55c8a9fdb7a24dd2034dcaa1ec29": { + "name": "MYOBU token contract", + "address": "0x2efd9dab50cf55c8a9fdb7a24dd2034dcaa1ec29", + "token": { + "decimals": 9, + "symbol": "MYOBU" + }, + "isSC": {} + }, + "0xa947239adc5d53aa03e5f661a2e16d7b009fc5a6": { + "name": "RAZE token contract", + "address": "0xa947239adc5d53aa03e5f661a2e16d7b009fc5a6", + "token": { + "decimals": 18, + "symbol": "RAZE" + }, + "isSC": {} + }, + "0x897f86e22a5f5782c439118d68338f4fc420e59c": { + "name": "imBTC token contract", + "address": "0x897f86e22a5f5782c439118d68338f4fc420e59c", + "token": { + "decimals": 8, + "symbol": "imBTC" + }, + "isSC": {} + }, + "0xedd6ca8a4202d4a36611e2fff109648c4863ae19": { + "name": "MAHA token contract", + "address": "0xedd6ca8a4202d4a36611e2fff109648c4863ae19", + "token": { + "decimals": 18, + "symbol": "MAHA" + }, + "isSC": {} + }, + "0x07280d3143311b012ad268a74f2aa791713952ea": { + "name": "YLDY token contract", + "address": "0x07280d3143311b012ad268a74f2aa791713952ea", + "token": { + "decimals": 18, + "symbol": "YLDY" + }, + "isSC": {} + }, + "0x1b2a3c1417c69da16bb9193268d0aabfe54b3b39": { + "name": "ROSN token contract", + "address": "0x1b2a3c1417c69da16bb9193268d0aabfe54b3b39", + "token": { + "decimals": 18, + "symbol": "ROSN" + }, + "isSC": {} + }, + "0x444dbcb15ea0d706c04dab615374a11759e07a25": { + "name": "AROMA token contract", + "address": "0x444dbcb15ea0d706c04dab615374a11759e07a25", + "token": { + "decimals": 18, + "symbol": "AROMA" + }, + "isSC": {} + }, + "0xeb9069218e171c62cefaaca1581efea3e9d57a31": { + "name": "wCCX token contract", + "address": "0xeb9069218e171c62cefaaca1581efea3e9d57a31", + "token": { + "decimals": 6, + "symbol": "wCCX" + }, + "isSC": {} + }, + "0xa94880d3a4b39746e90cdb57f8de3732c984de14": { + "name": "UCASH token contract", + "address": "0xa94880d3a4b39746e90cdb57f8de3732c984de14", + "token": { + "decimals": 8, + "symbol": "UCASH" + }, + "isSC": {} + }, + "0x916dc64c5bca5da97a354bbd3998771a26545e09": { + "name": "SPDR token contract", + "address": "0x916dc64c5bca5da97a354bbd3998771a26545e09", + "token": { + "decimals": 18, + "symbol": "SPDR" + }, + "isSC": {} + }, + "0xb5cedf3a2ad0aad7cf43f6cf4cb9fbe01130d684": { + "name": "BRB token contract", + "address": "0xb5cedf3a2ad0aad7cf43f6cf4cb9fbe01130d684", + "token": { + "decimals": 8, + "symbol": "BRB" + }, + "isSC": {} + }, + "0x438b28c5aa5f00a817b7def7ce2fb3d5d1970974": { + "name": "BLZ token contract", + "address": "0x438b28c5aa5f00a817b7def7ce2fb3d5d1970974", + "token": { + "decimals": 18, + "symbol": "BLZ" + }, + "isSC": {} + }, + "0xa8fcee762642f156b5d757b6fabc36e06b6d4a1a": { + "name": "ALN token contract", + "address": "0xa8fcee762642f156b5d757b6fabc36e06b6d4a1a", + "token": { + "decimals": 18, + "symbol": "ALN" + }, + "isSC": {} + }, + "0x546b4c391520e6652897c65153074088bfc0a909": { + "name": "FOR token contract", + "address": "0x546b4c391520e6652897c65153074088bfc0a909", + "token": { + "decimals": 18, + "symbol": "FOR" + }, + "isSC": {} + }, + "0x3d1d2afd191b165d140e3e8329e634665ffb0e5e": { + "name": "DERI token contract", + "address": "0x3d1d2afd191b165d140e3e8329e634665ffb0e5e", + "token": { + "decimals": 18, + "symbol": "DERI" + }, + "isSC": {} + }, + "0x8dfe9e53f920d43c2d59133804aff6540b4e05ff": { + "name": "GNAR token contract", + "address": "0x8dfe9e53f920d43c2d59133804aff6540b4e05ff", + "token": { + "decimals": 18, + "symbol": "GNAR" + }, + "isSC": {} + }, + "0xc48f61a288a08f1b80c2edd74652e1276b6a168c": { + "name": "GYSR token contract", + "address": "0xc48f61a288a08f1b80c2edd74652e1276b6a168c", + "token": { + "decimals": 18, + "symbol": "GYSR" + }, + "isSC": {} + }, + "0x7a51028299ae19b4c56bf8d66b42fd53e42f43ab": { + "name": "PAIRX token contract", + "address": "0x7a51028299ae19b4c56bf8d66b42fd53e42f43ab", + "token": { + "decimals": 18, + "symbol": "PAIRX" + }, + "isSC": {} + }, + "0x03678f2c2c762dc63c2bb738c3a837d366eda560": { + "name": "XCASH token contract", + "address": "0x03678f2c2c762dc63c2bb738c3a837d366eda560", + "token": { + "decimals": 18, + "symbol": "XCASH" + }, + "isSC": {} + }, + "0x65dfa90171e1bd9060209405026c4e1f4a8e58df": { + "name": "OIL token contract", + "address": "0x65dfa90171e1bd9060209405026c4e1f4a8e58df", + "token": { + "decimals": 18, + "symbol": "OIL" + }, + "isSC": {} + }, + "0x0a6cb35d3c309578ab3ae19c06af9a77a045f18b": { + "name": "REILLY token contract", + "address": "0x0a6cb35d3c309578ab3ae19c06af9a77a045f18b", + "token": { + "decimals": 18, + "symbol": "REILLY" + }, + "isSC": {} + }, + "0x432167928d23c378b316b78dfa378baa4a84f25a": { + "name": "DOLLAR token contract", + "address": "0x432167928d23c378b316b78dfa378baa4a84f25a", + "token": { + "decimals": 18, + "symbol": "DOLLAR" + }, + "isSC": {} + }, + "0x61fe6d0ee83a5614822be14599ee99c621190a60": { + "name": "PENNY token contract", + "address": "0x61fe6d0ee83a5614822be14599ee99c621190a60", + "token": { + "decimals": 18, + "symbol": "PENNY" + }, + "isSC": {} + }, + "0xa5f7ea46ebdc3f192c19e900012b3c4a2d6e11a0": { + "name": "SVB token contract", + "address": "0xa5f7ea46ebdc3f192c19e900012b3c4a2d6e11a0", + "token": { + "decimals": 18, + "symbol": "SVB" + }, + "isSC": {} + }, + "0x9656cfbbddc777f15341f4bd1733f5eec6b5feb4": { + "name": "SPACEFUNK token contract", + "address": "0x9656cfbbddc777f15341f4bd1733f5eec6b5feb4", + "token": { + "decimals": 18, + "symbol": "SPACEFUNK" + }, + "isSC": {} + }, + "0x7717f1efa5e36205527a2374603004968abb480a": { + "name": "BABY token contract", + "address": "0x7717f1efa5e36205527a2374603004968abb480a", + "token": { + "decimals": 18, + "symbol": "BABY" + }, + "isSC": {} + }, + "0xb4ca879d4ac2eee3ae0f42488106f2b242cd0462": { + "name": "FRIENDS token contract", + "address": "0xb4ca879d4ac2eee3ae0f42488106f2b242cd0462", + "token": { + "decimals": 18, + "symbol": "FRIENDS" + }, + "isSC": {} + }, + "0x01288e04435bfcd4718ff203d6ed18146c17cd4b": { + "name": "MIM token contract", + "address": "0x01288e04435bfcd4718ff203d6ed18146c17cd4b", + "token": { + "decimals": 18, + "symbol": "MIM" + }, + "isSC": {} + }, + "0x6002410dda2fb88b4d0dc3c1d562f7761191ea80": { + "name": "WORK token contract", + "address": "0x6002410dda2fb88b4d0dc3c1d562f7761191ea80", + "token": { + "decimals": 18, + "symbol": "WORK" + }, + "isSC": {} + }, + "0xbde7eef06fa6cb25883268207eed61b29c9b9fc6": { + "name": "LUNAR token contract", + "address": "0xbde7eef06fa6cb25883268207eed61b29c9b9fc6", + "token": { + "decimals": 18, + "symbol": "LUNAR" + }, + "isSC": {} + }, + "0xa7305ae84519ff8be02484cda45834c4e7d13dd6": { + "name": "UFARM token contract", + "address": "0xa7305ae84519ff8be02484cda45834c4e7d13dd6", + "token": { + "decimals": 18, + "symbol": "UFARM" + }, + "isSC": {} + }, + "0x73f56124a34e0214067b7e5f42a132b3ea072014": { + "name": "GMRX token contract", + "address": "0x73f56124a34e0214067b7e5f42a132b3ea072014", + "token": { + "decimals": 18, + "symbol": "GMRX" + }, + "isSC": {} + }, + "0x77777fdfaac9fabcdb0851ef574b84c2b7777777": { + "name": "RMN token contract", + "address": "0x77777fdfaac9fabcdb0851ef574b84c2b7777777", + "token": { + "decimals": 18, + "symbol": "RMN" + }, + "isSC": {} + }, + "0x0d202214527e82231867cc045308c1c1ee7a1056": { + "name": "HADO token contract", + "address": "0x0d202214527e82231867cc045308c1c1ee7a1056", + "token": { + "decimals": 18, + "symbol": "HADO" + }, + "isSC": {} + }, + "0xb6dd51d3852a174d4dbe045e77df2ed84942ae6f": { + "name": "DETO token contract", + "address": "0xb6dd51d3852a174d4dbe045e77df2ed84942ae6f", + "token": { + "decimals": 18, + "symbol": "DETO" + }, + "isSC": {} + }, + "0x46d3ec8ce3ec767414f16fe12176de23e3e5b46a": { + "name": "SXC token contract", + "address": "0x46d3ec8ce3ec767414f16fe12176de23e3e5b46a", + "token": { + "decimals": 18, + "symbol": "SXC" + }, + "isSC": {} + }, + "0x75eb9fd8608e2ff9418821062398e4f4b8d53644": { + "name": "AGVE token contract", + "address": "0x75eb9fd8608e2ff9418821062398e4f4b8d53644", + "token": { + "decimals": 18, + "symbol": "AGVE" + }, + "isSC": {} + }, + "0x5d146d8b1dacb1ebba5cb005ae1059da8a1fbf57": { + "name": "CADC token contract", + "address": "0x5d146d8b1dacb1ebba5cb005ae1059da8a1fbf57", + "token": { + "decimals": 18, + "symbol": "CADC" + }, + "isSC": {} + }, + "0x769434dca303597c8fc4997bf3dab233e961eda2": { + "name": "XSGD token contract", + "address": "0x769434dca303597c8fc4997bf3dab233e961eda2", + "token": { + "decimals": 6, + "symbol": "XSGD" + }, + "isSC": {} + }, + "0x04f3c4cf2e806da6df31e80e8a5d121f98edd61d": { + "name": "CREAM token contract", + "address": "0x04f3c4cf2e806da6df31e80e8a5d121f98edd61d", + "token": { + "decimals": 18, + "symbol": "CREAM" + }, + "isSC": {} + }, + "0xa5d447757dac8c5faab1858b13da4af701adf4bb": { + "name": "wRBT token contract", + "address": "0xa5d447757dac8c5faab1858b13da4af701adf4bb", + "token": { + "decimals": 18, + "symbol": "wRBT" + }, + "isSC": {} + }, + "0x474ba20088174612427cf8440ac5712e98652ad2": { + "name": "MINTY token contract", + "address": "0x474ba20088174612427cf8440ac5712e98652ad2", + "token": { + "decimals": 18, + "symbol": "MINTY" + }, + "isSC": {} + }, + "0xeb7f7955730a7dba1427a6567950eb4a98dfcbdf": { + "name": "WLEV token contract", + "address": "0xeb7f7955730a7dba1427a6567950eb4a98dfcbdf", + "token": { + "decimals": 18, + "symbol": "WLEV" + }, + "isSC": {} + }, + "0xfad65eb62a97ff5ed91b23afd039956aaca6e93b": { + "name": "HT token contract", + "address": "0xfad65eb62a97ff5ed91b23afd039956aaca6e93b", + "token": { + "decimals": 18, + "symbol": "HT" + }, + "isSC": {} + }, + "0x0378566d2979adcfb80316b2491757c99a44ed45": { + "name": "xDNA token contract", + "address": "0x0378566d2979adcfb80316b2491757c99a44ed45", + "token": { + "decimals": 18, + "symbol": "xDNA" + }, + "isSC": {} + }, + "0xe2aff5409f0a5d66879f6905dfc832cbdb59919f": { + "name": "BBSC token contract", + "address": "0xe2aff5409f0a5d66879f6905dfc832cbdb59919f", + "token": { + "decimals": 18, + "symbol": "BBSC" + }, + "isSC": {} + }, + "0x2088c47fc0c78356c622f79dba4cbe1ccfa84a91": { + "name": "HUSD token contract", + "address": "0x2088c47fc0c78356c622f79dba4cbe1ccfa84a91", + "token": { + "decimals": 8, + "symbol": "HUSD" + }, + "isSC": {} + }, + "0xc95f5d57c482a9ee5bed594e065ac0a2a81aaf6c": { + "name": "---------- token contract", + "address": "0xc95f5d57c482a9ee5bed594e065ac0a2a81aaf6c", + "token": { + "decimals": 18, + "symbol": "----------" + }, + "isSC": {} + }, + "0x541f3ded0b7b6dcd5ac1f44ad2f2fd99ba8e667d": { + "name": "PIZZA token contract", + "address": "0x541f3ded0b7b6dcd5ac1f44ad2f2fd99ba8e667d", + "token": { + "decimals": 18, + "symbol": "PIZZA" + }, + "isSC": {} + }, + "0xae64d44aa6bd7536005e663c48197d9631d4b3eb": { + "name": "UBX token contract", + "address": "0xae64d44aa6bd7536005e663c48197d9631d4b3eb", + "token": { + "decimals": 0, + "symbol": "UBX" + }, + "isSC": {} + }, + "0x0191297c4bf40b31031152c06fe804ba5af5fec1": { + "name": "ZUM token contract", + "address": "0x0191297c4bf40b31031152c06fe804ba5af5fec1", + "token": { + "decimals": 8, + "symbol": "ZUM" + }, + "isSC": {} + }, + "0xef8480105b325d4bb7df87fc9a665cf9bfc3807b": { + "name": "EPAY token contract", + "address": "0xef8480105b325d4bb7df87fc9a665cf9bfc3807b", + "token": { + "decimals": 18, + "symbol": "EPAY" + }, + "isSC": {} + }, + "0xf391f574c63d9b8764b7a1f56d6383762e07b75b": { + "name": "FEG token contract", + "address": "0xf391f574c63d9b8764b7a1f56d6383762e07b75b", + "token": { + "decimals": 9, + "symbol": "FEG" + }, + "isSC": {} + }, + "0x7c254df221993a8a2e703c3351c528f05e329595": { + "name": "NEWINU token contract", + "address": "0x7c254df221993a8a2e703c3351c528f05e329595", + "token": { + "decimals": 9, + "symbol": "NEWINU" + }, + "isSC": {} + }, + "0xf50d05a1402d0adafa880d36050736f9f6ee7dee": { + "name": "INST token contract", + "address": "0xf50d05a1402d0adafa880d36050736f9f6ee7dee", + "token": { + "decimals": 18, + "symbol": "INST" + }, + "isSC": {} + }, + "0x4287f07cbe6954f9f0decd91d0705c926d8d03a4": { + "name": "TRACE token contract", + "address": "0x4287f07cbe6954f9f0decd91d0705c926d8d03a4", + "token": { + "decimals": 18, + "symbol": "TRACE" + }, + "isSC": {} + }, + "0x4837c6adb831cc3c0a5b3992bd8ae16549c9b672": { + "name": "DES token contract", + "address": "0x4837c6adb831cc3c0a5b3992bd8ae16549c9b672", + "token": { + "decimals": 18, + "symbol": "DES" + }, + "isSC": {} + }, + "0x656010c92127623ad59991b392f9b9cf1d5b4c7a": { + "name": "FIGHT token contract", + "address": "0x656010c92127623ad59991b392f9b9cf1d5b4c7a", + "token": { + "decimals": 18, + "symbol": "FIGHT" + }, + "isSC": {} + }, + "0x77777777740ccbda196b7d0b83dbfd6c00bad7e4": { + "name": "RMNT token contract", + "address": "0x77777777740ccbda196b7d0b83dbfd6c00bad7e4", + "token": { + "decimals": 18, + "symbol": "RMNT" + }, + "isSC": {} + }, + "0x7bc429a2fa7d71c4693424fdcab5a2521b9fd343": { + "name": "MFI token contract", + "address": "0x7bc429a2fa7d71c4693424fdcab5a2521b9fd343", + "token": { + "decimals": 18, + "symbol": "MFI" + }, + "isSC": {} + }, + "0x652879fc10c16b56a00568879a91dddabf45b211": { + "name": "DOGG token contract", + "address": "0x652879fc10c16b56a00568879a91dddabf45b211", + "token": { + "decimals": 18, + "symbol": "DOGG" + }, + "isSC": {} + }, + "0x5e12f36bf1739a3a740d5916a8b22b0f5275f717": { + "name": "PIE token contract", + "address": "0x5e12f36bf1739a3a740d5916a8b22b0f5275f717", + "token": { + "decimals": 18, + "symbol": "PIE" + }, + "isSC": {} + }, + "0x45a5df3109fa4723c745cea20548a66796870f01": { + "name": "YEED token contract", + "address": "0x45a5df3109fa4723c745cea20548a66796870f01", + "token": { + "decimals": 18, + "symbol": "YEED" + }, + "isSC": {} + }, + "0xbe624349c80576f6b5714bfb6df0b5be526719f6": { + "name": "ETHM token contract", + "address": "0xbe624349c80576f6b5714bfb6df0b5be526719f6", + "token": { + "decimals": 18, + "symbol": "ETHM" + }, + "isSC": {} + }, + "0x7c922aa6820b206c938d92522bb2d5ba1bc4dc17": { + "name": "CenX token contract", + "address": "0x7c922aa6820b206c938d92522bb2d5ba1bc4dc17", + "token": { + "decimals": 18, + "symbol": "CenX" + }, + "isSC": {} + }, + "0xdc3b7cb4fec9542cc518161b8c0b9a7969302c5e": { + "name": "MILF token contract", + "address": "0xdc3b7cb4fec9542cc518161b8c0b9a7969302c5e", + "token": { + "decimals": 18, + "symbol": "MILF" + }, + "isSC": {} + }, + "0x0a86db0ad46c1201aa73d07497a5dbaa5b9ed2c4": { + "name": "XNOCT token contract", + "address": "0x0a86db0ad46c1201aa73d07497a5dbaa5b9ed2c4", + "token": { + "decimals": 18, + "symbol": "XNOCT" + }, + "isSC": {} + }, + "0x1ce4a2c355f0dcc24e32a9af19f1836d6f4f98ae": { + "name": "CPD token contract", + "address": "0x1ce4a2c355f0dcc24e32a9af19f1836d6f4f98ae", + "token": { + "decimals": 18, + "symbol": "CPD" + }, + "isSC": {} + }, + "0x32efca87e441a654b00640d9578df8ad28c2df72": { + "name": "CAT token contract", + "address": "0x32efca87e441a654b00640d9578df8ad28c2df72", + "token": { + "decimals": 18, + "symbol": "CAT" + }, + "isSC": {} + }, + "0x669ddc70273084ea30e6cd4f28ca6e2c70735065": { + "name": "AGAc token contract", + "address": "0x669ddc70273084ea30e6cd4f28ca6e2c70735065", + "token": { + "decimals": 18, + "symbol": "AGAc" + }, + "isSC": {} + }, + "0x54371579945270deb92a9f6f1a4e33bb2a7090c5": { + "name": "EXM token contract", + "address": "0x54371579945270deb92a9f6f1a4e33bb2a7090c5", + "token": { + "decimals": 8, + "symbol": "EXM" + }, + "isSC": {} + }, + "0xfa1171334cb3a0f0a91e8ca6765f10e9638d1cbf": { + "name": "FSN token contract", + "address": "0xfa1171334cb3a0f0a91e8ca6765f10e9638d1cbf", + "token": { + "decimals": 18, + "symbol": "FSN" + }, + "isSC": {} + }, + "0xcd7ecb53e78564c09e024beeac51f611ad92c618": { + "name": "PANDA token contract", + "address": "0xcd7ecb53e78564c09e024beeac51f611ad92c618", + "token": { + "decimals": 18, + "symbol": "PANDA" + }, + "isSC": {} + }, + "0x1ac417f1dd23504aac2076d854581f03196403fd": { + "name": "EDR token contract", + "address": "0x1ac417f1dd23504aac2076d854581f03196403fd", + "token": { + "decimals": 18, + "symbol": "EDR" + }, + "isSC": {} + }, + "0x5357de35cf517e6cecd91b269ea551caee4d171c": { + "name": "SKITS token contract", + "address": "0x5357de35cf517e6cecd91b269ea551caee4d171c", + "token": { + "decimals": 18, + "symbol": "SKITS" + }, + "isSC": {} + }, + "0xd1e6354fb05bf72a8909266203dab80947dceccf": { + "name": "CNT token contract", + "address": "0xd1e6354fb05bf72a8909266203dab80947dceccf", + "token": { + "decimals": 18, + "symbol": "CNT" + }, + "isSC": {} + }, + "0xcb059c5573646047d6d88dddb87b745c18161d3b": { + "name": "POLY token contract", + "address": "0xcb059c5573646047d6d88dddb87b745c18161d3b", + "token": { + "decimals": 18, + "symbol": "POLY" + }, + "isSC": {} + }, + "0x196de3b89083adcad83fe49a308de24a96194731": { + "name": "SMI token contract", + "address": "0x196de3b89083adcad83fe49a308de24a96194731", + "token": { + "decimals": 8, + "symbol": "SMI" + }, + "isSC": {} + }, + "0x28f4f063c2405922d8792b04ff24983d6ee7a4b4": { + "name": "VUSD token contract", + "address": "0x28f4f063c2405922d8792b04ff24983d6ee7a4b4", + "token": { + "decimals": 18, + "symbol": "VUSD" + }, + "isSC": {} + }, + "0x3ba4c387f786bfee076a58914f5bd38d668b42c3": { + "name": "BNB token contract", + "address": "0x3ba4c387f786bfee076a58914f5bd38d668b42c3", + "token": { + "decimals": 18, + "symbol": "BNB" + }, + "isSC": {} + }, + "0x6681fe034ae21917fac759b087684de5335efd3a": { + "name": "SISMO token contract", + "address": "0x6681fe034ae21917fac759b087684de5335efd3a", + "token": { + "decimals": 18, + "symbol": "SISMO" + }, + "isSC": {} + }, + "0x10bc8bf16308f63f1b4852b2522f22bfd59d4392": { + "name": "TRISM token contract", + "address": "0x10bc8bf16308f63f1b4852b2522f22bfd59d4392", + "token": { + "decimals": 18, + "symbol": "TRISM" + }, + "isSC": {} + }, + "0xa6e99049d3dc5fa94292c86e67742d7cd2ebe561": { + "name": "ALAN token contract", + "address": "0xa6e99049d3dc5fa94292c86e67742d7cd2ebe561", + "token": { + "decimals": 18, + "symbol": "ALAN" + }, + "isSC": {} + }, + "0xebd0e6b73a0e0d231da8c91bdd60c09c9c0875c3": { + "name": "BGC token contract", + "address": "0xebd0e6b73a0e0d231da8c91bdd60c09c9c0875c3", + "token": { + "decimals": 0, + "symbol": "BGC" + }, + "isSC": {} + }, + "0x6f7362ad5656beb11d94f4e608f2045e2fad9dc2": { + "name": "MOONS token contract", + "address": "0x6f7362ad5656beb11d94f4e608f2045e2fad9dc2", + "token": { + "decimals": 18, + "symbol": "MOONS" + }, + "isSC": {} + }, + "0x594f9d6f09a17f9caf2dc3c8705a487433412f69": { + "name": "FLAP token contract", + "address": "0x594f9d6f09a17f9caf2dc3c8705a487433412f69", + "token": { + "decimals": 18, + "symbol": "FLAP" + }, + "isSC": {} + }, + "0x53f8036e43b2ef39cfcd0c5f26c1257a85d5a3b2": { + "name": "CBK token contract", + "address": "0x53f8036e43b2ef39cfcd0c5f26c1257a85d5a3b2", + "token": { + "decimals": 18, + "symbol": "CBK" + }, + "isSC": {} + }, + "0x37b5f741371abf2207d236b6309d7d2015bd64e9": { + "name": "OCTT token contract", + "address": "0x37b5f741371abf2207d236b6309d7d2015bd64e9", + "token": { + "decimals": 18, + "symbol": "OCTT" + }, + "isSC": {} + }, + "0xd2507e7b5794179380673870d88b22f94da6abe0": { + "name": "XYO token contract", + "address": "0xd2507e7b5794179380673870d88b22f94da6abe0", + "token": { + "decimals": 18, + "symbol": "XYO" + }, + "isSC": {} + }, + "0x55cebfa4504124272d4d5464479e8878d822a8a1": { + "name": "DGVC token contract", + "address": "0x55cebfa4504124272d4d5464479e8878d822a8a1", + "token": { + "decimals": 18, + "symbol": "DGVC" + }, + "isSC": {} + }, + "0x90c98ee97b8bf9a3f8dc402eacc7bb41028a5d93": { + "name": "KATANA token contract", + "address": "0x90c98ee97b8bf9a3f8dc402eacc7bb41028a5d93", + "token": { + "decimals": 18, + "symbol": "KATANA" + }, + "isSC": {} + }, + "0xd9b452421913d014eaed2588ac57e941a1078c18": { + "name": "CO2 token contract", + "address": "0xd9b452421913d014eaed2588ac57e941a1078c18", + "token": { + "decimals": 18, + "symbol": "CO2" + }, + "isSC": {} + }, + "0xdb95f9188479575f3f718a245eca1b3bf74567ec": { + "name": "GTC token contract", + "address": "0xdb95f9188479575f3f718a245eca1b3bf74567ec", + "token": { + "decimals": 18, + "symbol": "GTC" + }, + "isSC": {} + }, + "0x9880e3dda13c8e7d4804691a45160102d31f6060": { + "name": "OXT token contract", + "address": "0x9880e3dda13c8e7d4804691a45160102d31f6060", + "token": { + "decimals": 18, + "symbol": "OXT" + }, + "isSC": {} + }, + "0x7392b03a2b8441a108c253f49bdfacd40853cc02": { + "name": "OSM token contract", + "address": "0x7392b03a2b8441a108c253f49bdfacd40853cc02", + "token": { + "decimals": 18, + "symbol": "OSM" + }, + "isSC": {} + }, + "0xd6c23852b94fede6ab571e4b4cfdb745b49dc9eb": { + "name": "renBTC token contract", + "address": "0xd6c23852b94fede6ab571e4b4cfdb745b49dc9eb", + "token": { + "decimals": 8, + "symbol": "renBTC" + }, + "isSC": {} + }, + "0xbf6ff49ffd3d104302ef0ab0f10f5a84324c091c": { + "name": "NFTFY token contract", + "address": "0xbf6ff49ffd3d104302ef0ab0f10f5a84324c091c", + "token": { + "decimals": 18, + "symbol": "NFTFY" + }, + "isSC": {} + }, + "0x2f3d902bac71430dedf5307e9041382df911b1af": { + "name": "eMax token contract", + "address": "0x2f3d902bac71430dedf5307e9041382df911b1af", + "token": { + "decimals": 18, + "symbol": "eMax" + }, + "isSC": {} + }, + "0x48d3a72230e65380f63a05ee41a7be31773c44b4": { + "name": "FRY token contract", + "address": "0x48d3a72230e65380f63a05ee41a7be31773c44b4", + "token": { + "decimals": 18, + "symbol": "FRY" + }, + "isSC": {} + }, + "0x0833e165255e21a9e81f2d4d6bd10c43973c6526": { + "name": "CPTE token contract", + "address": "0x0833e165255e21a9e81f2d4d6bd10c43973c6526", + "token": { + "decimals": 18, + "symbol": "CPTE" + }, + "isSC": {} + }, + "0xe898695409ef54080518ecc568c6ce618e7818e1": { + "name": "XASB token contract", + "address": "0xe898695409ef54080518ecc568c6ce618e7818e1", + "token": { + "decimals": 18, + "symbol": "XASB" + }, + "isSC": {} + }, + "0xb6be3449c6a4b8ab082733f715788d94e78d60ff": { + "name": "NIF token contract", + "address": "0xb6be3449c6a4b8ab082733f715788d94e78d60ff", + "token": { + "decimals": 18, + "symbol": "NIF" + }, + "isSC": {} + }, + "0xa053517276ae28d46b09da0023dfcb6e1fc8e13f": { + "name": "PT token contract", + "address": "0xa053517276ae28d46b09da0023dfcb6e1fc8e13f", + "token": { + "decimals": 18, + "symbol": "PT" + }, + "isSC": {} + }, + "0x078f0cd6ec0bed408e9244eece9fac05bb4052a7": { + "name": "MLT token contract", + "address": "0x078f0cd6ec0bed408e9244eece9fac05bb4052a7", + "token": { + "decimals": 18, + "symbol": "MLT" + }, + "isSC": {} + }, + "0x779b299ea455d35a44fe9bac48648be22c08dea2": { + "name": "STC token contract", + "address": "0x779b299ea455d35a44fe9bac48648be22c08dea2", + "token": { + "decimals": 18, + "symbol": "STC" + }, + "isSC": {} + }, + "0x7583feddbcefa813dc18259940f76a02710a8905": { + "name": "FET token contract", + "address": "0x7583feddbcefa813dc18259940f76a02710a8905", + "token": { + "decimals": 18, + "symbol": "FET" + }, + "isSC": {} + }, + "0xabeb34c52292c5f3ee96396e02d8a77c8a903a4f": { + "name": "UNIQ token contract", + "address": "0xabeb34c52292c5f3ee96396e02d8a77c8a903a4f", + "token": { + "decimals": 18, + "symbol": "UNIQ" + }, + "isSC": {} + }, + "0xea9306bbe5fee6d501282b34e9db2c25415662dd": { + "name": "RPP token contract", + "address": "0xea9306bbe5fee6d501282b34e9db2c25415662dd", + "token": { + "decimals": 18, + "symbol": "RPP" + }, + "isSC": {} + }, + "0x96d161cbf38facced333851a9cef20936dda88f4": { + "name": "pUSDC token contract", + "address": "0x96d161cbf38facced333851a9cef20936dda88f4", + "token": { + "decimals": 6, + "symbol": "pUSDC" + }, + "isSC": {} + }, + "0x18c4315847cf73d5028c8a98ead16e862450e618": { + "name": "pDAI token contract", + "address": "0x18c4315847cf73d5028c8a98ead16e862450e618", + "token": { + "decimals": 18, + "symbol": "pDAI" + }, + "isSC": {} + }, + "0xf9774f6d13f96b0b7f8c35e86755e1337ecebc3c": { + "name": "HPAY token contract", + "address": "0xf9774f6d13f96b0b7f8c35e86755e1337ecebc3c", + "token": { + "decimals": 18, + "symbol": "HPAY" + }, + "isSC": {} + }, + "0x0f4044f4475b7ec4bde170146ad02a9cd3ad4853": { + "name": "FCAT token contract", + "address": "0x0f4044f4475b7ec4bde170146ad02a9cd3ad4853", + "token": { + "decimals": 18, + "symbol": "FCAT" + }, + "isSC": {} + }, + "0xe19958a47432e839932541859b639a8fb4f11232": { + "name": "EWIT token contract", + "address": "0xe19958a47432e839932541859b639a8fb4f11232", + "token": { + "decimals": 9, + "symbol": "EWIT" + }, + "isSC": {} + }, + "0x4ff0b68abc2b9e4e1401e9b691dba7d66b264ac8": { + "name": "RIOT token contract", + "address": "0x4ff0b68abc2b9e4e1401e9b691dba7d66b264ac8", + "token": { + "decimals": 18, + "symbol": "RIOT" + }, + "isSC": {} + }, + "0x4237302a7db5dfd04d1fff5fd93a6f09bde8f08c": { + "name": "EVO token contract", + "address": "0x4237302a7db5dfd04d1fff5fd93a6f09bde8f08c", + "token": { + "decimals": 18, + "symbol": "EVO" + }, + "isSC": {} + }, + "0x73580a2416a57f1c4b6391dba688a9e4f7dbece0": { + "name": "POND token contract", + "address": "0x73580a2416a57f1c4b6391dba688a9e4f7dbece0", + "token": { + "decimals": 18, + "symbol": "POND" + }, + "isSC": {} + }, + "0xaba7d7454175d549a21a6318831fde7f5046c303": { + "name": "kiMATIC token contract", + "address": "0xaba7d7454175d549a21a6318831fde7f5046c303", + "token": { + "decimals": 18, + "symbol": "kiMATIC" + }, + "isSC": {} + }, + "0x6863bd30c9e313b264657b107352ba246f8af8e0": { + "name": "BPT token contract", + "address": "0x6863bd30c9e313b264657b107352ba246f8af8e0", + "token": { + "decimals": 18, + "symbol": "BPT" + }, + "isSC": {} + }, + "0x11cc08d7831f50a1359ff5f30e4cb7d309272e48": { + "name": "jack token contract", + "address": "0x11cc08d7831f50a1359ff5f30e4cb7d309272e48", + "token": { + "decimals": 0, + "symbol": "jack" + }, + "isSC": {} + }, + "0x147ee2488d2ede60b2443b22b245f6b4825f020f": { + "name": "MUTE token contract", + "address": "0x147ee2488d2ede60b2443b22b245f6b4825f020f", + "token": { + "decimals": 18, + "symbol": "MUTE" + }, + "isSC": {} + }, + "0x54cfe73f2c7d0c4b62ab869b473f5512dc0944d2": { + "name": "BZRX token contract", + "address": "0x54cfe73f2c7d0c4b62ab869b473f5512dc0944d2", + "token": { + "decimals": 18, + "symbol": "BZRX" + }, + "isSC": {} + }, + "0xeee92219b7c4dc9b8aa31da1c071bc4932e6ce99": { + "name": "SAK3 token contract", + "address": "0xeee92219b7c4dc9b8aa31da1c071bc4932e6ce99", + "token": { + "decimals": 18, + "symbol": "SAK3" + }, + "isSC": {} + }, + "0xf137d1744f050de7a610db728e1cdd77c2aaa755": { + "name": "KLEE token contract", + "address": "0xf137d1744f050de7a610db728e1cdd77c2aaa755", + "token": { + "decimals": 9, + "symbol": "KLEE" + }, + "isSC": {} + }, + "0x91ca694d2b293f70fe722fba7d8a5259188959c3": { + "name": "MFT token contract", + "address": "0x91ca694d2b293f70fe722fba7d8a5259188959c3", + "token": { + "decimals": 18, + "symbol": "MFT" + }, + "isSC": {} + }, + "0x54585aac4353ac2b30022797915ef81d152d5223": { + "name": "SI token contract", + "address": "0x54585aac4353ac2b30022797915ef81d152d5223", + "token": { + "decimals": 18, + "symbol": "SI" + }, + "isSC": {} + }, + "0x7d3fa4bad8220d927a23f29aa70866ea97bbf313": { + "name": "SAMOZ token contract", + "address": "0x7d3fa4bad8220d927a23f29aa70866ea97bbf313", + "token": { + "decimals": 18, + "symbol": "SAMOZ" + }, + "isSC": {} + }, + "0x3a35e98cc7390a15d458bb85f9a12823e2ef25ed": { + "name": "PENKY token contract", + "address": "0x3a35e98cc7390a15d458bb85f9a12823e2ef25ed", + "token": { + "decimals": 18, + "symbol": "PENKY" + }, + "isSC": {} + }, + "0xc844e334cc96435e71869fb2f7ad26961a010821": { + "name": "PTERIA token contract", + "address": "0xc844e334cc96435e71869fb2f7ad26961a010821", + "token": { + "decimals": 18, + "symbol": "PTERIA" + }, + "isSC": {} + }, + "0xce899f26928a2b21c6a2fddd393ef37c61dba918": { + "name": "MOCA token contract", + "address": "0xce899f26928a2b21c6a2fddd393ef37c61dba918", + "token": { + "decimals": 18, + "symbol": "MOCA" + }, + "isSC": {} + }, + "0x9aceb6f749396d1930abc9e263efc449e5e82c13": { + "name": "FFF token contract", + "address": "0x9aceb6f749396d1930abc9e263efc449e5e82c13", + "token": { + "decimals": 18, + "symbol": "FFF" + }, + "isSC": {} + }, + "0x698619687dcc9dbe01739d15dfa47e04b0d22443": { + "name": "ZOOT token contract", + "address": "0x698619687dcc9dbe01739d15dfa47e04b0d22443", + "token": { + "decimals": 9, + "symbol": "ZOOT" + }, + "isSC": {} + }, + "0xfd66114337ec9c1021f774af01f81c56148d938b": { + "name": "HNZO token contract", + "address": "0xfd66114337ec9c1021f774af01f81c56148d938b", + "token": { + "decimals": 9, + "symbol": "HNZO" + }, + "isSC": {} + }, + "0x5b0c10270ae2ee3dc1003bb1e5cb63e93306131c": { + "name": "RTRD token contract", + "address": "0x5b0c10270ae2ee3dc1003bb1e5cb63e93306131c", + "token": { + "decimals": 18, + "symbol": "RTRD" + }, + "isSC": {} + }, + "0xad5dc12e88c6534eea8cfe2265851d9d4a1472ad": { + "name": "FSW token contract", + "address": "0xad5dc12e88c6534eea8cfe2265851d9d4a1472ad", + "token": { + "decimals": 18, + "symbol": "FSW" + }, + "isSC": {} + }, + "0xb0f61c597bbcc29f3f38396b01f9c0f0c2e8bff0": { + "name": "ELAND token contract", + "address": "0xb0f61c597bbcc29f3f38396b01f9c0f0c2e8bff0", + "token": { + "decimals": 18, + "symbol": "ELAND" + }, + "isSC": {} + }, + "0x2fbb41b5bb01cbfa1cf14473b136666a08db4adf": { + "name": "vETH2 token contract", + "address": "0x2fbb41b5bb01cbfa1cf14473b136666a08db4adf", + "token": { + "decimals": 18, + "symbol": "vETH2" + }, + "isSC": {} + }, + "0x6362bd3bd1a217bbf6afa810eaa63f2d55620e2e": { + "name": "DHV token contract", + "address": "0x6362bd3bd1a217bbf6afa810eaa63f2d55620e2e", + "token": { + "decimals": 18, + "symbol": "DHV" + }, + "isSC": {} + }, + "0xa16eba3b7562fc92597579a80fe53a92dcab7122": { + "name": "mBTM token contract", + "address": "0xa16eba3b7562fc92597579a80fe53a92dcab7122", + "token": { + "decimals": 8, + "symbol": "mBTM" + }, + "isSC": {} + }, + "0x6e94662b2f78df1f014dafa7464bded57f1481b2": { + "name": "KOJI token contract", + "address": "0x6e94662b2f78df1f014dafa7464bded57f1481b2", + "token": { + "decimals": 18, + "symbol": "KOJI" + }, + "isSC": {} + }, + "0xf2ae0038696774d65e67892c9d301c5f2cbbda58": { + "name": "CXO token contract", + "address": "0xf2ae0038696774d65e67892c9d301c5f2cbbda58", + "token": { + "decimals": 18, + "symbol": "CXO" + }, + "isSC": {} + }, + "0x8a95d35df832f03e99ed8ee86e9d5f6dd2641e81": { + "name": "XPL token contract", + "address": "0x8a95d35df832f03e99ed8ee86e9d5f6dd2641e81", + "token": { + "decimals": 18, + "symbol": "XPL" + }, + "isSC": {} + }, + "0x9f1aeb72d5f38f2852b2a0f610bfb0391a6a9ab4": { + "name": "METRIC token contract", + "address": "0x9f1aeb72d5f38f2852b2a0f610bfb0391a6a9ab4", + "token": { + "decimals": 18, + "symbol": "METRIC" + }, + "isSC": {} + }, + "0xc5946f0c9b521f72658b658fc1260d04ea7fbe73": { + "name": "BTSG token contract", + "address": "0xc5946f0c9b521f72658b658fc1260d04ea7fbe73", + "token": { + "decimals": 18, + "symbol": "BTSG" + }, + "isSC": {} + }, + "0x6f57ec3c983a04c9bf9958c9e908c39a3cd0870d": { + "name": "AMIS token contract", + "address": "0x6f57ec3c983a04c9bf9958c9e908c39a3cd0870d", + "token": { + "decimals": 9, + "symbol": "AMIS" + }, + "isSC": {} + }, + "0x35b937583f04a24963eb685f728a542240f28dd8": { + "name": "SFI token contract", + "address": "0x35b937583f04a24963eb685f728a542240f28dd8", + "token": { + "decimals": 18, + "symbol": "SFI" + }, + "isSC": {} + }, + "0xe4ef793a4bfe292d7eb229df804fab5bdc2c51e8": { + "name": "NTVRK token contract", + "address": "0xe4ef793a4bfe292d7eb229df804fab5bdc2c51e8", + "token": { + "decimals": 18, + "symbol": "NTVRK" + }, + "isSC": {} + }, + "0xf4310adb83694bc4808e0c5ca8f7027c6127921d": { + "name": "ORAI token contract", + "address": "0xf4310adb83694bc4808e0c5ca8f7027c6127921d", + "token": { + "decimals": 18, + "symbol": "ORAI" + }, + "isSC": {} + }, + "0x15c310f7af0f5379d84dfba2fbf41b127023c784": { + "name": "ARCH token contract", + "address": "0x15c310f7af0f5379d84dfba2fbf41b127023c784", + "token": { + "decimals": 18, + "symbol": "ARCH" + }, + "isSC": {} + }, + "0x464f540ef8c72bbbec620dfb12fcb55d1989d861": { + "name": "BIRD token contract", + "address": "0x464f540ef8c72bbbec620dfb12fcb55d1989d861", + "token": { + "decimals": 18, + "symbol": "BIRD" + }, + "isSC": {} + }, + "0xf501dd45a1198c2e1b5aef5314a68b9006d842e0": { + "name": "MTA token contract", + "address": "0xf501dd45a1198c2e1b5aef5314a68b9006d842e0", + "token": { + "decimals": 18, + "symbol": "MTA" + }, + "isSC": {} + }, + "0x60098a09fe0436ea7099f0444f05a36beb71cb09": { + "name": "ALBT token contract", + "address": "0x60098a09fe0436ea7099f0444f05a36beb71cb09", + "token": { + "decimals": 18, + "symbol": "ALBT" + }, + "isSC": {} + }, + "0xb54e928297f1bf5740ff345811443de0f6fcd48b": { + "name": "HEGIC token contract", + "address": "0xb54e928297f1bf5740ff345811443de0f6fcd48b", + "token": { + "decimals": 18, + "symbol": "HEGIC" + }, + "isSC": {} + }, + "0xf92501c8213da1d6c74a76372ccc720dc8818407": { + "name": "ROOK token contract", + "address": "0xf92501c8213da1d6c74a76372ccc720dc8818407", + "token": { + "decimals": 18, + "symbol": "ROOK" + }, + "isSC": {} + }, + "0xada58df0f643d959c2a47c9d4d4c1a4defe3f11c": { + "name": "CRO token contract", + "address": "0xada58df0f643d959c2a47c9d4d4c1a4defe3f11c", + "token": { + "decimals": 8, + "symbol": "CRO" + }, + "isSC": {} + }, + "0x054c42b6414747f5263b4a86f21b1afad00326bf": { + "name": "VGX token contract", + "address": "0x054c42b6414747f5263b4a86f21b1afad00326bf", + "token": { + "decimals": 8, + "symbol": "VGX" + }, + "isSC": {} + }, + "0x6bf2eb299e51fc5df30dec81d9445dde70e3f185": { + "name": "SRM token contract", + "address": "0x6bf2eb299e51fc5df30dec81d9445dde70e3f185", + "token": { + "decimals": 6, + "symbol": "SRM" + }, + "isSC": {} + }, + "0x3dee6ceb3f1e0061793510d21f2ccde2941cb612": { + "name": "PHA token contract", + "address": "0x3dee6ceb3f1e0061793510d21f2ccde2941cb612", + "token": { + "decimals": 18, + "symbol": "PHA" + }, + "isSC": {} + }, + "0x89ef0900b0a6b5548ab2ff58ef588f9433b5fcf5": { + "name": "CRBN token contract", + "address": "0x89ef0900b0a6b5548ab2ff58ef588f9433b5fcf5", + "token": { + "decimals": 18, + "symbol": "CRBN" + }, + "isSC": {} + }, + "0x7c68ad908d4da363c2379d2d58e718093b9bf970": { + "name": "COLL token contract", + "address": "0x7c68ad908d4da363c2379d2d58e718093b9bf970", + "token": { + "decimals": 18, + "symbol": "COLL" + }, + "isSC": {} + }, + "0x8ab2fec94d17ae69fb90e7c773f2c85ed1802c01": { + "name": "LQTY token contract", + "address": "0x8ab2fec94d17ae69fb90e7c773f2c85ed1802c01", + "token": { + "decimals": 18, + "symbol": "LQTY" + }, + "isSC": {} + }, + "0x08158a6b5d4018340387d1a302f882e98a8bc5b4": { + "name": "PPAY token contract", + "address": "0x08158a6b5d4018340387d1a302f882e98a8bc5b4", + "token": { + "decimals": 18, + "symbol": "PPAY" + }, + "isSC": {} + }, + "0x00a49a868d3fb149483a69045e1ed01e8c812ff0": { + "name": "SOLVE token contract", + "address": "0x00a49a868d3fb149483a69045e1ed01e8c812ff0", + "token": { + "decimals": 8, + "symbol": "SOLVE" + }, + "isSC": {} + }, + "0xe9124da8d008774283467b2d618624d287de0339": { + "name": "POG token contract", + "address": "0xe9124da8d008774283467b2d618624d287de0339", + "token": { + "decimals": 2, + "symbol": "POG" + }, + "isSC": {} + }, + "0x3c5d1617c30ba71972add4b0c9a6b9848f2afeed": { + "name": "DAO1 token contract", + "address": "0x3c5d1617c30ba71972add4b0c9a6b9848f2afeed", + "token": { + "decimals": 18, + "symbol": "DAO1" + }, + "isSC": {} + }, + "0x914034f0ff781c430aa9594851cc95806fd19dc6": { + "name": "SSGT token contract", + "address": "0x914034f0ff781c430aa9594851cc95806fd19dc6", + "token": { + "decimals": 18, + "symbol": "SSGT" + }, + "isSC": {} + }, + "0x6b0a55d19af4f16f98965a5b85a308383d8be55f": { + "name": "VALUE token contract", + "address": "0x6b0a55d19af4f16f98965a5b85a308383d8be55f", + "token": { + "decimals": 18, + "symbol": "VALUE" + }, + "isSC": {} + }, + "0xdc87ed1b972d42c5b218503a542d438b7fc65b7b": { + "name": "SPOR token contract", + "address": "0xdc87ed1b972d42c5b218503a542d438b7fc65b7b", + "token": { + "decimals": 18, + "symbol": "SPOR" + }, + "isSC": {} + }, + "0x09450784a86a083041f5773836dca457531ea00b": { + "name": "TACO token contract", + "address": "0x09450784a86a083041f5773836dca457531ea00b", + "token": { + "decimals": 18, + "symbol": "TACO" + }, + "isSC": {} + }, + "0x722eb54cd20d13938df8e792a5849a2391c8463f": { + "name": "RUNE token contract", + "address": "0x722eb54cd20d13938df8e792a5849a2391c8463f", + "token": { + "decimals": 18, + "symbol": "RUNE" + }, + "isSC": {} + }, + "0x990f860968714c2d16e91ec0cd9709a94264cf64": { + "name": "DOUGH token contract", + "address": "0x990f860968714c2d16e91ec0cd9709a94264cf64", + "token": { + "decimals": 18, + "symbol": "DOUGH" + }, + "isSC": {} + }, + "0x2242973e0d9cacada96372a9e23c96f15776b96b": { + "name": "TSCA token contract", + "address": "0x2242973e0d9cacada96372a9e23c96f15776b96b", + "token": { + "decimals": 18, + "symbol": "TSCA" + }, + "isSC": {} + }, + "0xd3f0cd30a2d3aefb180d23f3f38aa1c4e0b1c98a": { + "name": "YPIE token contract", + "address": "0xd3f0cd30a2d3aefb180d23f3f38aa1c4e0b1c98a", + "token": { + "decimals": 18, + "symbol": "YPIE" + }, + "isSC": {} + }, + "0xe90777bd6c84bf4762565ed83bc5784cc9faf8c4": { + "name": "DEFI+L token contract", + "address": "0xe90777bd6c84bf4762565ed83bc5784cc9faf8c4", + "token": { + "decimals": 18, + "symbol": "DEFI+L" + }, + "isSC": {} + }, + "0x986d3ea4089488f77469697c50517ee12f36e1bc": { + "name": "DEFI+S token contract", + "address": "0x986d3ea4089488f77469697c50517ee12f36e1bc", + "token": { + "decimals": 18, + "symbol": "DEFI+S" + }, + "isSC": {} + }, + "0x5b6ab5078bd2bbf1a215fffba16a94b7df7f639d": { + "name": "DEFI++ token contract", + "address": "0x5b6ab5078bd2bbf1a215fffba16a94b7df7f639d", + "token": { + "decimals": 18, + "symbol": "DEFI++" + }, + "isSC": {} + }, + "0x72bba3aa59a1ccb1591d7cddb714d8e4d5597e96": { + "name": "COMFI token contract", + "address": "0x72bba3aa59a1ccb1591d7cddb714d8e4d5597e96", + "token": { + "decimals": 18, + "symbol": "COMFI" + }, + "isSC": {} + }, + "0xff4b04163e530d763010171358e7e1f70c1abbd1": { + "name": "COOS token contract", + "address": "0xff4b04163e530d763010171358e7e1f70c1abbd1", + "token": { + "decimals": 18, + "symbol": "COOS" + }, + "isSC": {} + }, + "0x9bd0463b12b432afbdd6b79ae2032267676ce948": { + "name": "MTHD token contract", + "address": "0x9bd0463b12b432afbdd6b79ae2032267676ce948", + "token": { + "decimals": 18, + "symbol": "MTHD" + }, + "isSC": {} + }, + "0x121ef177a0489271b4339bc29ee64609b47d43c4": { + "name": "pBTC token contract", + "address": "0x121ef177a0489271b4339bc29ee64609b47d43c4", + "token": { + "decimals": 18, + "symbol": "pBTC" + }, + "isSC": {} + }, + "0x65c2c7095bfdc8460d7302b6a95c66cd5d8b2cff": { + "name": "NFT token contract", + "address": "0x65c2c7095bfdc8460d7302b6a95c66cd5d8b2cff", + "token": { + "decimals": 18, + "symbol": "NFT" + }, + "isSC": {} + }, + "0xbe34506683c842dea90244333f9e8312672f1106": { + "name": "ECHO token contract", + "address": "0xbe34506683c842dea90244333f9e8312672f1106", + "token": { + "decimals": 18, + "symbol": "ECHO" + }, + "isSC": {} + }, + "0x8bb30e0e67b11b978a5040144c410e1ccddcba30": { + "name": "ZCN token contract", + "address": "0x8bb30e0e67b11b978a5040144c410e1ccddcba30", + "token": { + "decimals": 10, + "symbol": "ZCN" + }, + "isSC": {} + }, + "0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf": { + "name": "GLM token contract", + "address": "0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf", + "token": { + "decimals": 18, + "symbol": "GLM" + }, + "isSC": {} + }, + "0x3b538469d94cda1387c473f408c833c2208bced7": { + "name": "MUTT token contract", + "address": "0x3b538469d94cda1387c473f408c833c2208bced7", + "token": { + "decimals": 18, + "symbol": "MUTT" + }, + "isSC": {} + }, + "0x664a31f4985f1ef31d90d73e3da7ed880a052195": { + "name": "LINA token contract", + "address": "0x664a31f4985f1ef31d90d73e3da7ed880a052195", + "token": { + "decimals": 18, + "symbol": "LINA" + }, + "isSC": {} + }, + "0x30de46509dbc3a491128f97be0aaf70dc7ff33cb": { + "name": "XZAR token contract", + "address": "0x30de46509dbc3a491128f97be0aaf70dc7ff33cb", + "token": { + "decimals": 18, + "symbol": "XZAR" + }, + "isSC": {} + }, + "0x0f38db64e04bcd5373dcdf941fd909d8436f4fdb": { + "name": "TNG token contract", + "address": "0x0f38db64e04bcd5373dcdf941fd909d8436f4fdb", + "token": { + "decimals": 8, + "symbol": "TNG" + }, + "isSC": {} + }, + "0xf30355ba14b2d3b31597ec71a4542f57e902cb80": { + "name": "OCC token contract", + "address": "0xf30355ba14b2d3b31597ec71a4542f57e902cb80", + "token": { + "decimals": 18, + "symbol": "OCC" + }, + "isSC": {} + }, + "0xe329456b762a3888bbaff6880036931d1399a417": { + "name": "LTI token contract", + "address": "0xe329456b762a3888bbaff6880036931d1399a417", + "token": { + "decimals": 18, + "symbol": "LTI" + }, + "isSC": {} + }, + "0x400784930560ab531bd840eb00f52e9cf66bdf98": { + "name": "DEXTF token contract", + "address": "0x400784930560ab531bd840eb00f52e9cf66bdf98", + "token": { + "decimals": 18, + "symbol": "DEXTF" + }, + "isSC": {} + }, + "0xf2c1b3b6eb00a3fe46478fc2e7a5e04997feba22": { + "name": "vVSP token contract", + "address": "0xf2c1b3b6eb00a3fe46478fc2e7a5e04997feba22", + "token": { + "decimals": 18, + "symbol": "vVSP" + }, + "isSC": {} + }, + "0x385e2000681d5979ae4e5171b94b5d5813d6253f": { + "name": "DV token contract", + "address": "0x385e2000681d5979ae4e5171b94b5d5813d6253f", + "token": { + "decimals": 18, + "symbol": "DV" + }, + "isSC": {} + }, + "0x09c5a4bca808bd1ba2b8e6b3aaf7442046b4ca5b": { + "name": "VSP token contract", + "address": "0x09c5a4bca808bd1ba2b8e6b3aaf7442046b4ca5b", + "token": { + "decimals": 18, + "symbol": "VSP" + }, + "isSC": {} + }, + "0x0a438d3b374bb68a1efd8e70acdf22c995310cf7": { + "name": "ANAL token contract", + "address": "0x0a438d3b374bb68a1efd8e70acdf22c995310cf7", + "token": { + "decimals": 18, + "symbol": "ANAL" + }, + "isSC": {} + }, + "0x6b8f374e899e20cd1c97300a4a87ed07e4b8b9f9": { + "name": "LYON token contract", + "address": "0x6b8f374e899e20cd1c97300a4a87ed07e4b8b9f9", + "token": { + "decimals": 2, + "symbol": "LYON" + }, + "isSC": {} + }, + "0x6c0ab120dbd11ba701aff6748568311668f63fe0": { + "name": "APW token contract", + "address": "0x6c0ab120dbd11ba701aff6748568311668f63fe0", + "token": { + "decimals": 18, + "symbol": "APW" + }, + "isSC": {} + }, + "0xf86302c0716098ef5b3d358099683904f449ffb8": { + "name": "ZCX token contract", + "address": "0xf86302c0716098ef5b3d358099683904f449ffb8", + "token": { + "decimals": 18, + "symbol": "ZCX" + }, + "isSC": {} + }, + "0xa28f6797f9be95a6ae2b59bbe94498725dc091a9": { + "name": "ZARP token contract", + "address": "0xa28f6797f9be95a6ae2b59bbe94498725dc091a9", + "token": { + "decimals": 2, + "symbol": "ZARP" + }, + "isSC": {} + }, + "0x8fe2526045e6658cd60c3ecbd92f6d33e73a1d1b": { + "name": "bXIOT token contract", + "address": "0x8fe2526045e6658cd60c3ecbd92f6d33e73a1d1b", + "token": { + "decimals": 6, + "symbol": "bXIOT" + }, + "isSC": {} + }, + "0xfa72b07ade2af7d41413850a1e8d5578b3490988": { + "name": "REGI token contract", + "address": "0xfa72b07ade2af7d41413850a1e8d5578b3490988", + "token": { + "decimals": 18, + "symbol": "REGI" + }, + "isSC": {} + }, + "0xa3590a0e0c9963d048a9f43cf1ee506fb27d9129": { + "name": "HORD token contract", + "address": "0xa3590a0e0c9963d048a9f43cf1ee506fb27d9129", + "token": { + "decimals": 18, + "symbol": "HORD" + }, + "isSC": {} + }, + "0x93c2c75a674700e9ed7a46cf220ec140aea09fad": { + "name": "PDEX token contract", + "address": "0x93c2c75a674700e9ed7a46cf220ec140aea09fad", + "token": { + "decimals": 18, + "symbol": "PDEX" + }, + "isSC": {} + }, + "0xcae54386449c0a7ce2d680982e3d08250dc3ec3b": { + "name": "WSDOGE token contract", + "address": "0xcae54386449c0a7ce2d680982e3d08250dc3ec3b", + "token": { + "decimals": 9, + "symbol": "WSDOGE" + }, + "isSC": {} + }, + "0x76cd98a81b80f9373463b70cffff9c4b4fd92062": { + "name": "CYC token contract", + "address": "0x76cd98a81b80f9373463b70cffff9c4b4fd92062", + "token": { + "decimals": 18, + "symbol": "CYC" + }, + "isSC": {} + }, + "0xf6372cdb9c1d3674e83842e3800f2a62ac9f3c66": { + "name": "IOTX token contract", + "address": "0xf6372cdb9c1d3674e83842e3800f2a62ac9f3c66", + "token": { + "decimals": 18, + "symbol": "IOTX" + }, + "isSC": {} + }, + "0x40077808b346681c7032cdf6a2920ab9980eab91": { + "name": "DogeDao token contract", + "address": "0x40077808b346681c7032cdf6a2920ab9980eab91", + "token": { + "decimals": 18, + "symbol": "DogeDao" + }, + "isSC": {} + }, + "0x4e92f6f10496f3fcb790cc6969cc15b87c8f9199": { + "name": "PNODE token contract", + "address": "0x4e92f6f10496f3fcb790cc6969cc15b87c8f9199", + "token": { + "decimals": 18, + "symbol": "PNODE" + }, + "isSC": {} + }, + "0x19334a0e0a6089d4014f82e9077ec1a27e27bfa1": { + "name": "SHIBCO token contract", + "address": "0x19334a0e0a6089d4014f82e9077ec1a27e27bfa1", + "token": { + "decimals": 9, + "symbol": "SHIBCO" + }, + "isSC": {} + }, + "0xd1c9704bb651d334e9a600dbc056504cc773479f": { + "name": "CLS token contract", + "address": "0xd1c9704bb651d334e9a600dbc056504cc773479f", + "token": { + "decimals": 18, + "symbol": "CLS" + }, + "isSC": {} + }, + "0x4eac4c4e9050464067d673102f8e24b2fcceb350": { + "name": "ibBTC token contract", + "address": "0x4eac4c4e9050464067d673102f8e24b2fcceb350", + "token": { + "decimals": 18, + "symbol": "ibBTC" + }, + "isSC": {} + }, + "0x00d5149cdf7cec8725bf50073c51c4fa58ecca12": { + "name": "POWER token contract", + "address": "0x00d5149cdf7cec8725bf50073c51c4fa58ecca12", + "token": { + "decimals": 18, + "symbol": "POWER" + }, + "isSC": {} + }, + "0x431351dbfe3e03be7842e411c6627acb0763c5fc": { + "name": "SAFEEARTH token contract", + "address": "0x431351dbfe3e03be7842e411c6627acb0763c5fc", + "token": { + "decimals": 9, + "symbol": "SAFEEARTH" + }, + "isSC": {} + }, + "0x2b76f9e7becc7b4381eeb1894385045b1aa7fbab": { + "name": "CNJ token contract", + "address": "0x2b76f9e7becc7b4381eeb1894385045b1aa7fbab", + "token": { + "decimals": 18, + "symbol": "CNJ" + }, + "isSC": {} + }, + "0xc1fe55e82a992f870f68ba208617486bee7ad0fc": { + "name": "DON token contract", + "address": "0xc1fe55e82a992f870f68ba208617486bee7ad0fc", + "token": { + "decimals": 18, + "symbol": "DON" + }, + "isSC": {} + }, + "0x33e09c93c7515bc346bf49d4e4bd0c7be63f814d": { + "name": "buidl token contract", + "address": "0x33e09c93c7515bc346bf49d4e4bd0c7be63f814d", + "token": { + "decimals": 18, + "symbol": "buidl" + }, + "isSC": {} + }, + "0xd93c61d4418d77a537b6b57478c108e193362f0c": { + "name": "mBONK token contract", + "address": "0xd93c61d4418d77a537b6b57478c108e193362f0c", + "token": { + "decimals": 18, + "symbol": "mBONK" + }, + "isSC": {} + }, + "0x2ab4f9ac80f33071211729e45cfc346c1f8446d5": { + "name": "CGG token contract", + "address": "0x2ab4f9ac80f33071211729e45cfc346c1f8446d5", + "token": { + "decimals": 18, + "symbol": "CGG" + }, + "isSC": {} + }, + "0x0361bdeab89df6bbcc52c43589fabba5143d19dd": { + "name": "dTOP token contract", + "address": "0x0361bdeab89df6bbcc52c43589fabba5143d19dd", + "token": { + "decimals": 18, + "symbol": "dTOP" + }, + "isSC": {} + }, + "0xbe662058e00849c3eef2ac9664f37fefdf2cdbfe": { + "name": "RLC token contract", + "address": "0xbe662058e00849c3eef2ac9664f37fefdf2cdbfe", + "token": { + "decimals": 9, + "symbol": "RLC" + }, + "isSC": {} + }, + "0xd0660cd418a64a1d44e9214ad8e459324d8157f1": { + "name": "WOOFY token contract", + "address": "0xd0660cd418a64a1d44e9214ad8e459324d8157f1", + "token": { + "decimals": 12, + "symbol": "WOOFY" + }, + "isSC": {} + }, + "0x46a5d492788f8afdfc743ab7d7bd13f996249ed5": { + "name": "STAK token contract", + "address": "0x46a5d492788f8afdfc743ab7d7bd13f996249ed5", + "token": { + "decimals": 18, + "symbol": "STAK" + }, + "isSC": {} + }, + "0xfd81cfcd9c525b0a4c83cdc37fd23f7e233cde45": { + "name": "STARS token contract", + "address": "0xfd81cfcd9c525b0a4c83cdc37fd23f7e233cde45", + "token": { + "decimals": 18, + "symbol": "STARS" + }, + "isSC": {} + }, + "0x8c208bc2a808a088a78398fed8f2640cab0b6edb": { + "name": "CTX token contract", + "address": "0x8c208bc2a808a088a78398fed8f2640cab0b6edb", + "token": { + "decimals": 18, + "symbol": "CTX" + }, + "isSC": {} + }, + "0x67bcde6a52be923d3223fcae927ab16b352768bb": { + "name": "TCAP token contract", + "address": "0x67bcde6a52be923d3223fcae927ab16b352768bb", + "token": { + "decimals": 18, + "symbol": "TCAP" + }, + "isSC": {} + }, + "0xd0252fb67606ed74d0cacd17b2eb38446e4466c9": { + "name": "ARGO token contract", + "address": "0xd0252fb67606ed74d0cacd17b2eb38446e4466c9", + "token": { + "decimals": 18, + "symbol": "ARGO" + }, + "isSC": {} + }, + "0xa3860f969075045d82de85b06bb665f93c4bae32": { + "name": "SUPERBID token contract", + "address": "0xa3860f969075045d82de85b06bb665f93c4bae32", + "token": { + "decimals": 18, + "symbol": "SUPERBID" + }, + "isSC": {} + }, + "0x3c1d58c24d9a33bba6d90e31e3aa828af33f4f58": { + "name": "FUCK token contract", + "address": "0x3c1d58c24d9a33bba6d90e31e3aa828af33f4f58", + "token": { + "decimals": 4, + "symbol": "FUCK" + }, + "isSC": {} + }, + "0xa96d47c621a8316d4f9539e3b38180c7067e84ca": { + "name": "AWS token contract", + "address": "0xa96d47c621a8316d4f9539e3b38180c7067e84ca", + "token": { + "decimals": 18, + "symbol": "AWS" + }, + "isSC": {} + }, + "0xe0339c80ffde91f3e20494df88d4206d86024cdf": { + "name": "ELON token contract", + "address": "0xe0339c80ffde91f3e20494df88d4206d86024cdf", + "token": { + "decimals": 18, + "symbol": "ELON" + }, + "isSC": {} + }, + "0x308ba429a913d952275090fc35dea9c36a511b5a": { + "name": "WXTZ token contract", + "address": "0x308ba429a913d952275090fc35dea9c36a511b5a", + "token": { + "decimals": 18, + "symbol": "WXTZ" + }, + "isSC": {} + }, + "0xb2db9d30caa8a46e7a99b3cec2e014f9488071ec": { + "name": "WLTC token contract", + "address": "0xb2db9d30caa8a46e7a99b3cec2e014f9488071ec", + "token": { + "decimals": 18, + "symbol": "WLTC" + }, + "isSC": {} + }, + "0xede1b77c0ccc45bfa949636757cd2ca7ef30137f": { + "name": "WFIL token contract", + "address": "0xede1b77c0ccc45bfa949636757cd2ca7ef30137f", + "token": { + "decimals": 18, + "symbol": "WFIL" + }, + "isSC": {} + }, + "0x4f38008d9e2b6f1374199b29d6610021f70f174b": { + "name": "WZEC token contract", + "address": "0x4f38008d9e2b6f1374199b29d6610021f70f174b", + "token": { + "decimals": 18, + "symbol": "WZEC" + }, + "isSC": {} + }, + "0xce59e5c0f130da0796509a0d32f44b0a6c81b9de": { + "name": "LABRA token contract", + "address": "0xce59e5c0f130da0796509a0d32f44b0a6c81b9de", + "token": { + "decimals": 9, + "symbol": "LABRA" + }, + "isSC": {} + }, + "0x258b34a8f350c833d5308ceb3f7f586c54afe973": { + "name": "LIQUID token contract", + "address": "0x258b34a8f350c833d5308ceb3f7f586c54afe973", + "token": { + "decimals": 18, + "symbol": "LIQUID" + }, + "isSC": {} + }, + "0xff7ef642b070cf63602e46a2ed63adf893e95437": { + "name": "PETRON token contract", + "address": "0xff7ef642b070cf63602e46a2ed63adf893e95437", + "token": { + "decimals": 18, + "symbol": "PETRON" + }, + "isSC": {} + }, + "0x5ca2ea050a3552addaa88466f0aa088bcc0dc2fb": { + "name": "JEJUDOGE token contract", + "address": "0x5ca2ea050a3552addaa88466f0aa088bcc0dc2fb", + "token": { + "decimals": 18, + "symbol": "JEJUDOGE" + }, + "isSC": {} + }, + "0xf18ac368001b0ddc80aa6a8374deb49e868efdb8": { + "name": "INV token contract", + "address": "0xf18ac368001b0ddc80aa6a8374deb49e868efdb8", + "token": { + "decimals": 18, + "symbol": "INV" + }, + "isSC": {} + }, + "0xf629712180bef6f4c569b704e03d0acbe276eb6d": { + "name": "WSTA token contract", + "address": "0xf629712180bef6f4c569b704e03d0acbe276eb6d", + "token": { + "decimals": 18, + "symbol": "WSTA" + }, + "isSC": {} + }, + "0xc518edfb9667214be3559b86e73777d1c4789163": { + "name": "SANSHU token contract", + "address": "0xc518edfb9667214be3559b86e73777d1c4789163", + "token": { + "decimals": 9, + "symbol": "SANSHU" + }, + "isSC": {} + }, + "0xb8cb8a7f4c2885c03e57e973c74827909fdc2032": { + "name": "YFII token contract", + "address": "0xb8cb8a7f4c2885c03e57e973c74827909fdc2032", + "token": { + "decimals": 18, + "symbol": "YFII" + }, + "isSC": {} + }, + "0xd07a7fac2857901e4bec0d89bbdae764723aab86": { + "name": "USDK token contract", + "address": "0xd07a7fac2857901e4bec0d89bbdae764723aab86", + "token": { + "decimals": 18, + "symbol": "USDK" + }, + "isSC": {} + }, + "0x6f3b3286fd86d8b47ec737ceb3d0d354cc657b3e": { + "name": "PAX token contract", + "address": "0x6f3b3286fd86d8b47ec737ceb3d0d354cc657b3e", + "token": { + "decimals": 18, + "symbol": "PAX" + }, + "isSC": {} + }, + "0xc8a94a3d3d2dabc3c1caffffdca6a7543c3e3e65": { + "name": "GUSD token contract", + "address": "0xc8a94a3d3d2dabc3c1caffffdca6a7543c3e3e65", + "token": { + "decimals": 2, + "symbol": "GUSD" + }, + "isSC": {} + }, + "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756": { + "name": "TUSD token contract", + "address": "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756", + "token": { + "decimals": 18, + "symbol": "TUSD" + }, + "isSC": {} + }, + "0x5559edb74751a0ede9dea4dc23aee72cca6be3d5": { + "name": "ZRX token contract", + "address": "0x5559edb74751a0ede9dea4dc23aee72cca6be3d5", + "token": { + "decimals": 18, + "symbol": "ZRX" + }, + "isSC": {} + }, + "0x66d70309d37eaea53b22a1a3fa280327b2c610c6": { + "name": "THREE token contract", + "address": "0x66d70309d37eaea53b22a1a3fa280327b2c610c6", + "token": { + "decimals": 18, + "symbol": "THREE" + }, + "isSC": {} + }, + "0x79b9a1c21ecf6a22a6d722a5bfb437ef776e87cd": { + "name": "PUSSY token contract", + "address": "0x79b9a1c21ecf6a22a6d722a5bfb437ef776e87cd", + "token": { + "decimals": 18, + "symbol": "PUSSY" + }, + "isSC": {} + }, + "0x4b54bc363f5f9c6e0fcd82eac6919ae213464cc6": { + "name": "BTC2x-FLI token contract", + "address": "0x4b54bc363f5f9c6e0fcd82eac6919ae213464cc6", + "token": { + "decimals": 18, + "symbol": "BTC2x-FLI" + }, + "isSC": {} + }, + "0x68e311445fa668107f1dcd13758788643b3af240": { + "name": "8=D token contract", + "address": "0x68e311445fa668107f1dcd13758788643b3af240", + "token": { + "decimals": 18, + "symbol": "8=D" + }, + "isSC": {} + }, + "0xf1c1a3c2481a3a8a3f173a9ab5ade275292a6fa3": { + "name": "VEE token contract", + "address": "0xf1c1a3c2481a3a8a3f173a9ab5ade275292a6fa3", + "token": { + "decimals": 18, + "symbol": "VEE" + }, + "isSC": {} + }, + "0x5b3455590ec7f5a25119885ed62afba9bc2e5d65": { + "name": "LIF token contract", + "address": "0x5b3455590ec7f5a25119885ed62afba9bc2e5d65", + "token": { + "decimals": 18, + "symbol": "LIF" + }, + "isSC": {} + }, + "0x69f240ed3456a098f2d0d898566597e7551a7c81": { + "name": "SENPAI token contract", + "address": "0x69f240ed3456a098f2d0d898566597e7551a7c81", + "token": { + "decimals": 18, + "symbol": "SENPAI" + }, + "isSC": {} + }, + "0x65a05db8322701724c197af82c9cae41195b0aa8": { + "name": "FOX token contract", + "address": "0x65a05db8322701724c197af82c9cae41195b0aa8", + "token": { + "decimals": 18, + "symbol": "FOX" + }, + "isSC": {} + }, + "0xa486c6bc102f409180ccb8a94ba045d39f8fc7cb": { + "name": "NEX token contract", + "address": "0xa486c6bc102f409180ccb8a94ba045d39f8fc7cb", + "token": { + "decimals": 8, + "symbol": "NEX" + }, + "isSC": {} + }, + "0x9d8a8d15a45fb10060f1d642fb97aa28f5cdede2": { + "name": "DOGEN token contract", + "address": "0x9d8a8d15a45fb10060f1d642fb97aa28f5cdede2", + "token": { + "decimals": 18, + "symbol": "DOGEN" + }, + "isSC": {} + }, + "0x26361cfc497021ecc366ec11cafa27290f3c055c": { + "name": "CORGI token contract", + "address": "0x26361cfc497021ecc366ec11cafa27290f3c055c", + "token": { + "decimals": 10, + "symbol": "CORGI" + }, + "isSC": {} + }, + "0x06d02e9d62a13fc76bb229373fb3bbbd1101d2fc": { + "name": "LEO token contract", + "address": "0x06d02e9d62a13fc76bb229373fb3bbbd1101d2fc", + "token": { + "decimals": 18, + "symbol": "LEO" + }, + "isSC": {} + }, + "0xd62355546a93bfb0e891e905ff40b3b26ff5f2b1": { + "name": "KIMCHI token contract", + "address": "0xd62355546a93bfb0e891e905ff40b3b26ff5f2b1", + "token": { + "decimals": 18, + "symbol": "KIMCHI" + }, + "isSC": {} + }, + "0xd762d38220751f84ae5dc3fb67c8d971c08a638a": { + "name": "SLX token contract", + "address": "0xd762d38220751f84ae5dc3fb67c8d971c08a638a", + "token": { + "decimals": 0, + "symbol": "SLX" + }, + "isSC": {} + }, + "0x98113e216578359b8c0eb3a9fddd64285e91120a": { + "name": "GDAO token contract", + "address": "0x98113e216578359b8c0eb3a9fddd64285e91120a", + "token": { + "decimals": 18, + "symbol": "GDAO" + }, + "isSC": {} + }, + "0x46ca31e0439dbf5d0d9c0338be4912dd35d45a51": { + "name": "MUSKETS token contract", + "address": "0x46ca31e0439dbf5d0d9c0338be4912dd35d45a51", + "token": { + "decimals": 18, + "symbol": "MUSKETS" + }, + "isSC": {} + }, + "0xda6f726e2088f129d3ecb2257206adf7d8537ba5": { + "name": "NCR token contract", + "address": "0xda6f726e2088f129d3ecb2257206adf7d8537ba5", + "token": { + "decimals": 18, + "symbol": "NCR" + }, + "isSC": {} + }, + "0xf872ff474c01c4178dadeb941089a130aa1eed93": { + "name": "POP! token contract", + "address": "0xf872ff474c01c4178dadeb941089a130aa1eed93", + "token": { + "decimals": 18, + "symbol": "POP!" + }, + "isSC": {} + }, + "0xfd39c9bb69cc3bd57959284acf855ae65d06f8cf": { + "name": "TRUtru token contract", + "address": "0xfd39c9bb69cc3bd57959284acf855ae65d06f8cf", + "token": { + "decimals": 18, + "symbol": "TRUtru" + }, + "isSC": {} + }, + "0x4ba47b10ea8f544f8969ba61df3e5be67692a122": { + "name": "iFUND token contract", + "address": "0x4ba47b10ea8f544f8969ba61df3e5be67692a122", + "token": { + "decimals": 18, + "symbol": "iFUND" + }, + "isSC": {} + }, + "0xe8b3d257202a9dfe00ec396b8a8a45fced1f5798": { + "name": "idleUSDC token contract", + "address": "0xe8b3d257202a9dfe00ec396b8a8a45fced1f5798", + "token": { + "decimals": 18, + "symbol": "idleUSDC" + }, + "isSC": {} + }, + "0x17d342b29f054030a455b4191f977c3b0aa62fd9": { + "name": "KNG token contract", + "address": "0x17d342b29f054030a455b4191f977c3b0aa62fd9", + "token": { + "decimals": 18, + "symbol": "KNG" + }, + "isSC": {} + }, + "0xf1bd521984b4b46176ef4e77f3de01b9fbbe5191": { + "name": "CARDS token contract", + "address": "0xf1bd521984b4b46176ef4e77f3de01b9fbbe5191", + "token": { + "decimals": 18, + "symbol": "CARDS" + }, + "isSC": {} + }, + "0x92c59f1cc9a322670cca29594e4d994d48bdfd36": { + "name": "PHNX token contract", + "address": "0x92c59f1cc9a322670cca29594e4d994d48bdfd36", + "token": { + "decimals": 18, + "symbol": "PHNX" + }, + "isSC": {} + }, + "0xc25351811983818c9fe6d8c580531819c8ade90f": { + "name": "IDLE token contract", + "address": "0xc25351811983818c9fe6d8c580531819c8ade90f", + "token": { + "decimals": 18, + "symbol": "IDLE" + }, + "isSC": {} + }, + "0x5e765e58a4d15262123a8db42a31c8ba99ae48ab": { + "name": "BSIT token contract", + "address": "0x5e765e58a4d15262123a8db42a31c8ba99ae48ab", + "token": { + "decimals": 4, + "symbol": "BSIT" + }, + "isSC": {} + }, + "0xb382c1cfa622795a534e5bd56fac93d59bac8b0d": { + "name": "KIRO token contract", + "address": "0xb382c1cfa622795a534e5bd56fac93d59bac8b0d", + "token": { + "decimals": 18, + "symbol": "KIRO" + }, + "isSC": {} + }, + "0xe5d6364efcdcb90ed92cf6f776dd0b6165168a7e": { + "name": "FLDX token contract", + "address": "0xe5d6364efcdcb90ed92cf6f776dd0b6165168a7e", + "token": { + "decimals": 16, + "symbol": "FLDX" + }, + "isSC": {} + }, + "0xf50c6e2b720dab4ea87e0050856a511e3e3ceb8d": { + "name": "ONS token contract", + "address": "0xf50c6e2b720dab4ea87e0050856a511e3e3ceb8d", + "token": { + "decimals": 18, + "symbol": "ONS" + }, + "isSC": {} + }, + "0x101a023270368c0d50bffb62780f4afd4ea79c35": { + "name": "ANKR token contract", + "address": "0x101a023270368c0d50bffb62780f4afd4ea79c35", + "token": { + "decimals": 18, + "symbol": "ANKR" + }, + "isSC": {} + }, + "0xdb725f82818de83e99f1dac22a9b5b51d3d04dd4": { + "name": "GET token contract", + "address": "0xdb725f82818de83e99f1dac22a9b5b51d3d04dd4", + "token": { + "decimals": 18, + "symbol": "GET" + }, + "isSC": {} + }, + "0x9b0162d3b3b4e73fe7dbb10b141e03539199a8f2": { + "name": "QUO token contract", + "address": "0x9b0162d3b3b4e73fe7dbb10b141e03539199a8f2", + "token": { + "decimals": 18, + "symbol": "QUO" + }, + "isSC": {} + }, + "0x9a37814d1ec68ca5f8aab205f628869f3926ce3e": { + "name": "LAYER token contract", + "address": "0x9a37814d1ec68ca5f8aab205f628869f3926ce3e", + "token": { + "decimals": 18, + "symbol": "LAYER" + }, + "isSC": {} + }, + "0x8ba941b64901e306667a287a370f145d98811096": { + "name": "CTI token contract", + "address": "0x8ba941b64901e306667a287a370f145d98811096", + "token": { + "decimals": 18, + "symbol": "CTI" + }, + "isSC": {} + }, + "0x692597b009d13c4049a947cab2239b7d6517875f": { + "name": "UST token contract", + "address": "0x692597b009d13c4049a947cab2239b7d6517875f", + "token": { + "decimals": 18, + "symbol": "UST" + }, + "isSC": {} + }, + "0x7ec26842f195c852fa843bb9f6d8b583a274a157": { + "name": "ENJ token contract", + "address": "0x7ec26842f195c852fa843bb9f6d8b583a274a157", + "token": { + "decimals": 18, + "symbol": "ENJ" + }, + "isSC": {} + }, + "0xc8f190b18579ea425d89fb8e84774335715795cb": { + "name": "DFF token contract", + "address": "0xc8f190b18579ea425d89fb8e84774335715795cb", + "token": { + "decimals": 8, + "symbol": "DFF" + }, + "isSC": {} + }, + "0x977777c5d1208742343bb1f4cab182e56d624f1f": { + "name": "NBU token contract", + "address": "0x977777c5d1208742343bb1f4cab182e56d624f1f", + "token": { + "decimals": 18, + "symbol": "NBU" + }, + "isSC": {} + }, + "0x68de9750059aed98c9a200ee661a5316b5c7f941": { + "name": "GNBU token contract", + "address": "0x68de9750059aed98c9a200ee661a5316b5c7f941", + "token": { + "decimals": 18, + "symbol": "GNBU" + }, + "isSC": {} + }, + "0x5ecba59dacc1adc5bdea35f38a732823fc3de977": { + "name": "FORTH token contract", + "address": "0x5ecba59dacc1adc5bdea35f38a732823fc3de977", + "token": { + "decimals": 18, + "symbol": "FORTH" + }, + "isSC": {} + }, + "0x6f8a06447ff6fcf75d803135a7de15ce88c1d4ec": { + "name": "SHIB token contract", + "address": "0x6f8a06447ff6fcf75d803135a7de15ce88c1d4ec", + "token": { + "decimals": 18, + "symbol": "SHIB" + }, + "isSC": {} + }, + "0x498e0a753840075c4925442d4d8863eee49d61e2": { + "name": "Solid token contract", + "address": "0x498e0a753840075c4925442d4d8863eee49d61e2", + "token": { + "decimals": 18, + "symbol": "Solid" + }, + "isSC": {} + }, + "0xdee1ebd2a9f6fe069a045601ebee7c42572abd5f": { + "name": "WAIF token contract", + "address": "0xdee1ebd2a9f6fe069a045601ebee7c42572abd5f", + "token": { + "decimals": 18, + "symbol": "WAIF" + }, + "isSC": {} + }, + "0x957d1ad5214468332c5e6c00305a25116f9a46bb": { + "name": "NOIA token contract", + "address": "0x957d1ad5214468332c5e6c00305a25116f9a46bb", + "token": { + "decimals": 18, + "symbol": "NOIA" + }, + "isSC": {} + }, + "0x11b4ce411bc617e636cf1109de9f3ca977d4a00d": { + "name": "RCC token contract", + "address": "0x11b4ce411bc617e636cf1109de9f3ca977d4a00d", + "token": { + "decimals": 18, + "symbol": "RCC" + }, + "isSC": {} + }, + "0x6127bb5a1b847ff57bf7b9469c4db6e310466214": { + "name": "SAKE token contract", + "address": "0x6127bb5a1b847ff57bf7b9469c4db6e310466214", + "token": { + "decimals": 18, + "symbol": "SAKE" + }, + "isSC": {} + }, + "0x0539f01d9ed66c3133a0b0fab83f4fa69b3608e8": { + "name": "wNXM token contract", + "address": "0x0539f01d9ed66c3133a0b0fab83f4fa69b3608e8", + "token": { + "decimals": 18, + "symbol": "wNXM" + }, + "isSC": {} + }, + "0x0aab8dc887d34f00d50e19aee48371a941390d14": { + "name": "POWR token contract", + "address": "0x0aab8dc887d34f00d50e19aee48371a941390d14", + "token": { + "decimals": 6, + "symbol": "POWR" + }, + "isSC": {} + }, + "0xa219a63c170d0bcde994886d53878f86c5126106": { + "name": "cBSN token contract", + "address": "0xa219a63c170d0bcde994886d53878f86c5126106", + "token": { + "decimals": 18, + "symbol": "cBSN" + }, + "isSC": {} + }, + "0xf0e7beedc882a66c151d03b594503317b8472336": { + "name": "NUG token contract", + "address": "0xf0e7beedc882a66c151d03b594503317b8472336", + "token": { + "decimals": 18, + "symbol": "NUG" + }, + "isSC": {} + }, + "0x032b3217241fe53ffadb334a9d06aacd2a9153d9": { + "name": "BND token contract", + "address": "0x032b3217241fe53ffadb334a9d06aacd2a9153d9", + "token": { + "decimals": 18, + "symbol": "BND" + }, + "isSC": {} + }, + "0x7120441ad773a6704d13dac8d8ccfe94da9afc9b": { + "name": "DEX token contract", + "address": "0x7120441ad773a6704d13dac8d8ccfe94da9afc9b", + "token": { + "decimals": 18, + "symbol": "DEX" + }, + "isSC": {} + }, + "0x5f084f3ee7ea09e4c01cee3cdf1b5620a3344fd0": { + "name": "KIF token contract", + "address": "0x5f084f3ee7ea09e4c01cee3cdf1b5620a3344fd0", + "token": { + "decimals": 18, + "symbol": "KIF" + }, + "isSC": {} + }, + "0xa3d595823beede02cc755ab4e22ad009a70cb590": { + "name": "KISHU token contract", + "address": "0xa3d595823beede02cc755ab4e22ad009a70cb590", + "token": { + "decimals": 9, + "symbol": "KISHU" + }, + "isSC": {} + }, + "0x34c1b299a74588d6abdc1b85a53345a48428a521": { + "name": "EZ token contract", + "address": "0x34c1b299a74588d6abdc1b85a53345a48428a521", + "token": { + "decimals": 18, + "symbol": "EZ" + }, + "isSC": {} + }, + "0xd8a2b5ed27d57d003962032ea78f3738ff5617a8": { + "name": "AKRO token contract", + "address": "0xd8a2b5ed27d57d003962032ea78f3738ff5617a8", + "token": { + "decimals": 18, + "symbol": "AKRO" + }, + "isSC": {} + }, + "0xfe712251173a2cd5f5be2b46bb528328ea3565e1": { + "name": "MVI token contract", + "address": "0xfe712251173a2cd5f5be2b46bb528328ea3565e1", + "token": { + "decimals": 18, + "symbol": "MVI" + }, + "isSC": {} + }, + "0xfbd8a3b908e764dbcd51e27992464b4432a1132b": { + "name": "INDEX token contract", + "address": "0xfbd8a3b908e764dbcd51e27992464b4432a1132b", + "token": { + "decimals": 18, + "symbol": "INDEX" + }, + "isSC": {} + }, + "0x96963189dc1dfbe8de4b1bb03c603adefcd3e59d": { + "name": "LTO token contract", + "address": "0x96963189dc1dfbe8de4b1bb03c603adefcd3e59d", + "token": { + "decimals": 8, + "symbol": "LTO" + }, + "isSC": {} + }, + "0x66d7fdcc7403f18cae9b0e2e8385649d2acbc12a": { + "name": "ETH2x-FLI token contract", + "address": "0x66d7fdcc7403f18cae9b0e2e8385649d2acbc12a", + "token": { + "decimals": 18, + "symbol": "ETH2x-FLI" + }, + "isSC": {} + }, + "0x3962f4a0a0051dcce0be73a7e09cef5756736712": { + "name": "LPT token contract", + "address": "0x3962f4a0a0051dcce0be73a7e09cef5756736712", + "token": { + "decimals": 18, + "symbol": "LPT" + }, + "isSC": {} + }, + "0x835273d47a2a4cc84693639f8d890af1caea611d": { + "name": "NDX token contract", + "address": "0x835273d47a2a4cc84693639f8d890af1caea611d", + "token": { + "decimals": 18, + "symbol": "NDX" + }, + "isSC": {} + }, + "0x2f9679f1db7e1a3ffd659e1880339e18b482f17a": { + "name": "ZORA token contract", + "address": "0x2f9679f1db7e1a3ffd659e1880339e18b482f17a", + "token": { + "decimals": 9, + "symbol": "ZORA" + }, + "isSC": {} + }, + "0xde799636af0d8d65a17aaa83b66cbbe9b185eb01": { + "name": "XIV token contract", + "address": "0xde799636af0d8d65a17aaa83b66cbbe9b185eb01", + "token": { + "decimals": 18, + "symbol": "XIV" + }, + "isSC": {} + }, + "0xfb0e4a608657c09e0fe048d8bb54431eb7fb58d0": { + "name": "acBTC token contract", + "address": "0xfb0e4a608657c09e0fe048d8bb54431eb7fb58d0", + "token": { + "decimals": 18, + "symbol": "acBTC" + }, + "isSC": {} + }, + "0x6d1b94027453c457e90c28e83154b02718bd48b2": { + "name": "AC token contract", + "address": "0x6d1b94027453c457e90c28e83154b02718bd48b2", + "token": { + "decimals": 18, + "symbol": "AC" + }, + "isSC": {} + }, + "0xe5703ad34d2b5bcb5c1feeb64d4b7572b857d6c0": { + "name": "GST token contract", + "address": "0xe5703ad34d2b5bcb5c1feeb64d4b7572b857d6c0", + "token": { + "decimals": 18, + "symbol": "GST" + }, + "isSC": {} + }, + "0x0bac8f2819527c562b1bdd5b9c8e24be7dbd6cae": { + "name": "Time token contract", + "address": "0x0bac8f2819527c562b1bdd5b9c8e24be7dbd6cae", + "token": { + "decimals": 18, + "symbol": "Time" + }, + "isSC": {} + }, + "0x4bb0a0cef106b0376a9320be1cf9bce2d9fc075e": { + "name": "PTC token contract", + "address": "0x4bb0a0cef106b0376a9320be1cf9bce2d9fc075e", + "token": { + "decimals": 18, + "symbol": "PTC" + }, + "isSC": {} + }, + "0x84e1670f61347cdaed56dcc736fb990fbb47ddc1": { + "name": "LRC token contract", + "address": "0x84e1670f61347cdaed56dcc736fb990fbb47ddc1", + "token": { + "decimals": 18, + "symbol": "LRC" + }, + "isSC": {} + }, + "0x43df9c0a1156c96cea98737b511ac89d0e2a1f46": { + "name": "GOVI token contract", + "address": "0x43df9c0a1156c96cea98737b511ac89d0e2a1f46", + "token": { + "decimals": 18, + "symbol": "GOVI" + }, + "isSC": {} + }, + "0xdf2d3db12254b062b96424f27f44649321901499": { + "name": "DRaCula token contract", + "address": "0xdf2d3db12254b062b96424f27f44649321901499", + "token": { + "decimals": 18, + "symbol": "DRaCula" + }, + "isSC": {} + }, + "0x52c57f0ea393bb213445f47c48c5f34e419061c7": { + "name": "mTSLA token contract", + "address": "0x52c57f0ea393bb213445f47c48c5f34e419061c7", + "token": { + "decimals": 18, + "symbol": "mTSLA" + }, + "isSC": {} + }, + "0xa9e0cde4be86f5df7e2888753e5f663a41220469": { + "name": "BRIBE token contract", + "address": "0xa9e0cde4be86f5df7e2888753e5f663a41220469", + "token": { + "decimals": 18, + "symbol": "BRIBE" + }, + "isSC": {} + }, + "0x4985e0b13554fb521840e893574d3848c10fcc6f": { + "name": "NCT token contract", + "address": "0x4985e0b13554fb521840e893574d3848c10fcc6f", + "token": { + "decimals": 18, + "symbol": "NCT" + }, + "isSC": {} + }, + "0x6046b4d4e5ccc4ad4aabf655b557d8fd19b631d9": { + "name": "INFC token contract", + "address": "0x6046b4d4e5ccc4ad4aabf655b557d8fd19b631d9", + "token": { + "decimals": 2, + "symbol": "INFC" + }, + "isSC": {} + }, + "0xbbbe128568222623d21299f019a978c8587b33dc": { + "name": "SWISE token contract", + "address": "0xbbbe128568222623d21299f019a978c8587b33dc", + "token": { + "decimals": 18, + "symbol": "SWISE" + }, + "isSC": {} + }, + "0x030a6b1da67963fc22265d8c6686d1878d581b6b": { + "name": "PASS token contract", + "address": "0x030a6b1da67963fc22265d8c6686d1878d581b6b", + "token": { + "decimals": 6, + "symbol": "PASS" + }, + "isSC": {} + }, + "0x9b90e9dc868a3c769dbb1d43f925cc954327f666": { + "name": "CELO token contract", + "address": "0x9b90e9dc868a3c769dbb1d43f925cc954327f666", + "token": { + "decimals": 18, + "symbol": "CELO" + }, + "isSC": {} + }, + "0x23001f892c0c82b79303edc9b9033cd190bb21c7": { + "name": "LUSD token contract", + "address": "0x23001f892c0c82b79303edc9b9033cd190bb21c7", + "token": { + "decimals": 18, + "symbol": "LUSD" + }, + "isSC": {} + }, + "0xffb6eff3e73db35b3efcf2bcd160fc517c5df9ec": { + "name": "uDOKI token contract", + "address": "0xffb6eff3e73db35b3efcf2bcd160fc517c5df9ec", + "token": { + "decimals": 18, + "symbol": "uDOKI" + }, + "isSC": {} + }, + "0xf0059cc2b3e980065a906940fbce5f9db7ae40a7": { + "name": "ULT token contract", + "address": "0xf0059cc2b3e980065a906940fbce5f9db7ae40a7", + "token": { + "decimals": 18, + "symbol": "ULT" + }, + "isSC": {} + }, + "0x1631244689ec1fecbdd22fb5916e920dfc9b8d30": { + "name": "OVR token contract", + "address": "0x1631244689ec1fecbdd22fb5916e920dfc9b8d30", + "token": { + "decimals": 18, + "symbol": "OVR" + }, + "isSC": {} + }, + "0x4d8181f051e617642e233be09cea71cc3308ffd4": { + "name": "DIGI token contract", + "address": "0x4d8181f051e617642e233be09cea71cc3308ffd4", + "token": { + "decimals": 18, + "symbol": "DIGI" + }, + "isSC": {} + }, + "0x7e6afec8cf917976d11fe65a34d3c17289fe3ae0": { + "name": "Pikachu token contract", + "address": "0x7e6afec8cf917976d11fe65a34d3c17289fe3ae0", + "token": { + "decimals": 18, + "symbol": "Pikachu" + }, + "isSC": {} + }, + "0x11602a402281974a70c2b4824d58ebede967e2be": { + "name": "BYN token contract", + "address": "0x11602a402281974a70c2b4824d58ebede967e2be", + "token": { + "decimals": 18, + "symbol": "BYN" + }, + "isSC": {} + }, + "0x9e7deba360c77949bb75d16dc81b2393c15005eb": { + "name": "LPOOL token contract", + "address": "0x9e7deba360c77949bb75d16dc81b2393c15005eb", + "token": { + "decimals": 18, + "symbol": "LPOOL" + }, + "isSC": {} + }, + "0x80a017a2b089b642743d863ceeb6da1fe0191adc": { + "name": "GRMLN token contract", + "address": "0x80a017a2b089b642743d863ceeb6da1fe0191adc", + "token": { + "decimals": 18, + "symbol": "GRMLN" + }, + "isSC": {} + }, + "0xd8324ae24af9b499cb75fb0bad8e0094c10cac58": { + "name": "INEX token contract", + "address": "0xd8324ae24af9b499cb75fb0bad8e0094c10cac58", + "token": { + "decimals": 8, + "symbol": "INEX" + }, + "isSC": {} + }, + "0x217ca87921b066728febc2d093fe9a6503450c47": { + "name": "myfi token contract", + "address": "0x217ca87921b066728febc2d093fe9a6503450c47", + "token": { + "decimals": 18, + "symbol": "myfi" + }, + "isSC": {} + }, + "0x222cc013116d43a8b6befa84aaf7c11cbc073496": { + "name": "ELD token contract", + "address": "0x222cc013116d43a8b6befa84aaf7c11cbc073496", + "token": { + "decimals": 18, + "symbol": "ELD" + }, + "isSC": {} + }, + "0x9f9003c25d475ca76d925bfad0c568d8b3720353": { + "name": "ZPR token contract", + "address": "0x9f9003c25d475ca76d925bfad0c568d8b3720353", + "token": { + "decimals": 18, + "symbol": "ZPR" + }, + "isSC": {} + }, + "0x868547eb48e0ed2fd3db52db9818ab9496ea4ef1": { + "name": "NANJ token contract", + "address": "0x868547eb48e0ed2fd3db52db9818ab9496ea4ef1", + "token": { + "decimals": 8, + "symbol": "NANJ" + }, + "isSC": {} + }, + "0x4b64399ca6609ebb5cb649eaa50387c2d9fe20eb": { + "name": "CHAI token contract", + "address": "0x4b64399ca6609ebb5cb649eaa50387c2d9fe20eb", + "token": { + "decimals": 18, + "symbol": "CHAI" + }, + "isSC": {} + }, + "0xb6d5d0e2bad865750bc2cb21bbae636c3bad6581": { + "name": "LSV token contract", + "address": "0xb6d5d0e2bad865750bc2cb21bbae636c3bad6581", + "token": { + "decimals": 18, + "symbol": "LSV" + }, + "isSC": {} + }, + "0x41d36d3bd6297fe288e31c75de8b7453de9daf90": { + "name": "SIFI token contract", + "address": "0x41d36d3bd6297fe288e31c75de8b7453de9daf90", + "token": { + "decimals": 9, + "symbol": "SIFI" + }, + "isSC": {} + }, + "0xc96a4a6b780af3a6383962ea0ac96dd3c40532d4": { + "name": "BTSE token contract", + "address": "0xc96a4a6b780af3a6383962ea0ac96dd3c40532d4", + "token": { + "decimals": 8, + "symbol": "BTSE" + }, + "isSC": {} + }, + "0xa3d8885825a843f040eb64a6a846b687cd07f072": { + "name": "SHUNG token contract", + "address": "0xa3d8885825a843f040eb64a6a846b687cd07f072", + "token": { + "decimals": 18, + "symbol": "SHUNG" + }, + "isSC": {} + }, + "0xdd0fdc648a9dbc9be5a735fe4561893a13399da2": { + "name": "PGF7T token contract", + "address": "0xdd0fdc648a9dbc9be5a735fe4561893a13399da2", + "token": { + "decimals": 18, + "symbol": "PGF7T" + }, + "isSC": {} + }, + "0x34cba1561424b192f263883ba2b8ccbbc12bb13f": { + "name": "MOAR token contract", + "address": "0x34cba1561424b192f263883ba2b8ccbbc12bb13f", + "token": { + "decimals": 18, + "symbol": "MOAR" + }, + "isSC": {} + }, + "0x7c4a54f5d20b4023d6746f1f765f4dfe7c39a7e6": { + "name": "renDOGE token contract", + "address": "0x7c4a54f5d20b4023d6746f1f765f4dfe7c39a7e6", + "token": { + "decimals": 8, + "symbol": "renDOGE" + }, + "isSC": {} + }, + "0x220ed61d1f1cc754cb71978585d69e07be576315": { + "name": "LADZ token contract", + "address": "0x220ed61d1f1cc754cb71978585d69e07be576315", + "token": { + "decimals": 4, + "symbol": "LADZ" + }, + "isSC": {} + }, + "0xfe6a2342f7c5d234e8496df12c468be17e0c181f": { + "name": "ISLA token contract", + "address": "0xfe6a2342f7c5d234e8496df12c468be17e0c181f", + "token": { + "decimals": 18, + "symbol": "ISLA" + }, + "isSC": {} + }, + "0xad93e067e149f0a5ecd12d8ea83b05581dd6374c": { + "name": "PNK token contract", + "address": "0xad93e067e149f0a5ecd12d8ea83b05581dd6374c", + "token": { + "decimals": 18, + "symbol": "PNK" + }, + "isSC": {} + }, + "0x652e36ecfa0e4f7e435f6d38688d68a3be65639c": { + "name": "mWBTC token contract", + "address": "0x652e36ecfa0e4f7e435f6d38688d68a3be65639c", + "token": { + "decimals": 8, + "symbol": "mWBTC" + }, + "isSC": {} + }, + "0x9cc0ff2db430cbc95752b25487059046d507780c": { + "name": "mZRX token contract", + "address": "0x9cc0ff2db430cbc95752b25487059046d507780c", + "token": { + "decimals": 18, + "symbol": "mZRX" + }, + "isSC": {} + }, + "0x6aaf0cd9e0339dc385f566eb2d2bd83c756e7d63": { + "name": "malUSD token contract", + "address": "0x6aaf0cd9e0339dc385f566eb2d2bd83c756e7d63", + "token": { + "decimals": 18, + "symbol": "malUSD" + }, + "isSC": {} + }, + "0x2bb8ff0b289f1670415713b75331cc927d0c5cea": { + "name": "mALCX token contract", + "address": "0x2bb8ff0b289f1670415713b75331cc927d0c5cea", + "token": { + "decimals": 18, + "symbol": "mALCX" + }, + "isSC": {} + }, + "0x44a57de864dd580c3a1fe44cfa8e39e25170c156": { + "name": "mLINK token contract", + "address": "0x44a57de864dd580c3a1fe44cfa8e39e25170c156", + "token": { + "decimals": 18, + "symbol": "mLINK" + }, + "isSC": {} + }, + "0x65e4fc43404569998e7cb8e74e785943581f758f": { + "name": "mUNI token contract", + "address": "0x65e4fc43404569998e7cb8e74e785943581f758f", + "token": { + "decimals": 18, + "symbol": "mUNI" + }, + "isSC": {} + }, + "0x6998f006c8b5bd288dcb8e00c0060927d517aa58": { + "name": "mUSDC token contract", + "address": "0x6998f006c8b5bd288dcb8e00c0060927d517aa58", + "token": { + "decimals": 6, + "symbol": "mUSDC" + }, + "isSC": {} + }, + "0x6baf56f2768434592c2fcce2dc04235366e5a088": { + "name": "mDAI token contract", + "address": "0x6baf56f2768434592c2fcce2dc04235366e5a088", + "token": { + "decimals": 18, + "symbol": "mDAI" + }, + "isSC": {} + }, + "0x6e5bcf069213676e4e3c75aeb60eaab0c41ff1ce": { + "name": "m3Crv token contract", + "address": "0x6e5bcf069213676e4e3c75aeb60eaab0c41ff1ce", + "token": { + "decimals": 18, + "symbol": "m3Crv" + }, + "isSC": {} + }, + "0xdc0f3c12df89593357985491bdacc5fd789ca4b2": { + "name": "mWETH token contract", + "address": "0xdc0f3c12df89593357985491bdacc5fd789ca4b2", + "token": { + "decimals": 18, + "symbol": "mWETH" + }, + "isSC": {} + }, + "0xf89250e83fa2f33058385c98c7c44e723b040359": { + "name": "GARD token contract", + "address": "0xf89250e83fa2f33058385c98c7c44e723b040359", + "token": { + "decimals": 18, + "symbol": "GARD" + }, + "isSC": {} + }, + "0x2e789b197a1874ca6384082090e0ebed30f16e1a": { + "name": "BS1 token contract", + "address": "0x2e789b197a1874ca6384082090e0ebed30f16e1a", + "token": { + "decimals": 18, + "symbol": "BS1" + }, + "isSC": {} + }, + "0xae07b360cf41c8971f6c544620a6ed428ff3a661": { + "name": "GEO token contract", + "address": "0xae07b360cf41c8971f6c544620a6ed428ff3a661", + "token": { + "decimals": 18, + "symbol": "GEO" + }, + "isSC": {} + }, + "0xfe7ff8b5dfba93a9eab7aee447c3c72990052d93": { + "name": "UBI token contract", + "address": "0xfe7ff8b5dfba93a9eab7aee447c3c72990052d93", + "token": { + "decimals": 18, + "symbol": "UBI" + }, + "isSC": {} + }, + "0x733726968ae55dc58c26dbdc193fea256a704ba4": { + "name": "GRUMPY token contract", + "address": "0x733726968ae55dc58c26dbdc193fea256a704ba4", + "token": { + "decimals": 9, + "symbol": "GRUMPY" + }, + "isSC": {} + }, + "0x3d6c5c1a66e7b43342fca37827b7faf3bd074dd3": { + "name": "YSEC token contract", + "address": "0x3d6c5c1a66e7b43342fca37827b7faf3bd074dd3", + "token": { + "decimals": 18, + "symbol": "YSEC" + }, + "isSC": {} + }, + "0xd132d531367d5907d0844988a71b9fad32d14368": { + "name": "LUDUS token contract", + "address": "0xd132d531367d5907d0844988a71b9fad32d14368", + "token": { + "decimals": 18, + "symbol": "LUDUS" + }, + "isSC": {} + }, + "0x41b3966b4ff7b427969ddf5da3627d6aeae9a48e": { + "name": "NEXO token contract", + "address": "0x41b3966b4ff7b427969ddf5da3627d6aeae9a48e", + "token": { + "decimals": 18, + "symbol": "NEXO" + }, + "isSC": {} + }, + "0x08bba6abe87e2a8c226a1c6c0d0e9cae758f82ec": { + "name": "ETHIX token contract", + "address": "0x08bba6abe87e2a8c226a1c6c0d0e9cae758f82ec", + "token": { + "decimals": 18, + "symbol": "ETHIX" + }, + "isSC": {} + }, + "0x609255414ff5289f87c99baf9737a4ec85a18643": { + "name": "SONG token contract", + "address": "0x609255414ff5289f87c99baf9737a4ec85a18643", + "token": { + "decimals": 18, + "symbol": "SONG" + }, + "isSC": {} + }, + "0xe64106154816a252da7728e35a0060f15d66cb34": { + "name": "INXT token contract", + "address": "0xe64106154816a252da7728e35a0060f15d66cb34", + "token": { + "decimals": 8, + "symbol": "INXT" + }, + "isSC": {} + }, + "0x1b599beb7b1f50807dd58fd7e8ffcf073b435e71": { + "name": "BLES token contract", + "address": "0x1b599beb7b1f50807dd58fd7e8ffcf073b435e71", + "token": { + "decimals": 18, + "symbol": "BLES" + }, + "isSC": {} + }, + "0x87b078cf94b188efb9d2208cae47a66ea7fea09a": { + "name": "ALCH token contract", + "address": "0x87b078cf94b188efb9d2208cae47a66ea7fea09a", + "token": { + "decimals": 18, + "symbol": "ALCH" + }, + "isSC": {} + }, + "0x103308793661879166464cd0d0370ac3b8a2a1cb": { + "name": "YOP token contract", + "address": "0x103308793661879166464cd0d0370ac3b8a2a1cb", + "token": { + "decimals": 8, + "symbol": "YOP" + }, + "isSC": {} + }, + "0x9c1c23e60b72bc88a043bf64afdb16a02540ae8f": { + "name": "Ring token contract", + "address": "0x9c1c23e60b72bc88a043bf64afdb16a02540ae8f", + "token": { + "decimals": 18, + "symbol": "Ring" + }, + "isSC": {} + }, + "0x09e1943dd2a4e82032773594f50cf54453000b97": { + "name": "GALA token contract", + "address": "0x09e1943dd2a4e82032773594f50cf54453000b97", + "token": { + "decimals": 8, + "symbol": "GALA" + }, + "isSC": {} + }, + "0x7205705771547cf79201111b4bd8aaf29467b9ec": { + "name": "RPL token contract", + "address": "0x7205705771547cf79201111b4bd8aaf29467b9ec", + "token": { + "decimals": 18, + "symbol": "RPL" + }, + "isSC": {} + }, + "0x0c5ebed5cb5bd838bdc43e1583d9d054f3d7be6c": { + "name": "VGTG token contract", + "address": "0x0c5ebed5cb5bd838bdc43e1583d9d054f3d7be6c", + "token": { + "decimals": 18, + "symbol": "VGTG" + }, + "isSC": {} + }, + "0xdf00c50a3dae240860f57b77508203b8d9593283": { + "name": "ICE token contract", + "address": "0xdf00c50a3dae240860f57b77508203b8d9593283", + "token": { + "decimals": 18, + "symbol": "ICE" + }, + "isSC": {} + }, + "0x164fbef6729c86b0fd719789d2f985afa15a4430": { + "name": "MORA token contract", + "address": "0x164fbef6729c86b0fd719789d2f985afa15a4430", + "token": { + "decimals": 18, + "symbol": "MORA" + }, + "isSC": {} + }, + "0x6f83ffedfd8774d09329d92bf3647654ee171dfa": { + "name": "LKR token contract", + "address": "0x6f83ffedfd8774d09329d92bf3647654ee171dfa", + "token": { + "decimals": 18, + "symbol": "LKR" + }, + "isSC": {} + }, + "0xb3658a5493332e952fc86991c24c9c759d2d8cd0": { + "name": "LABS token contract", + "address": "0xb3658a5493332e952fc86991c24c9c759d2d8cd0", + "token": { + "decimals": 18, + "symbol": "LABS" + }, + "isSC": {} + }, + "0xeb94a5e2c643403e29fa1d7197e7e0708b09ad84": { + "name": "ONX token contract", + "address": "0xeb94a5e2c643403e29fa1d7197e7e0708b09ad84", + "token": { + "decimals": 18, + "symbol": "ONX" + }, + "isSC": {} + }, + "0xc7bd6b9a83c2e27a17026aa2dee03e0eac97ee50": { + "name": "KING token contract", + "address": "0xc7bd6b9a83c2e27a17026aa2dee03e0eac97ee50", + "token": { + "decimals": 18, + "symbol": "KING" + }, + "isSC": {} + }, + "0x1a5c71ddf3d71cbb0c0bc312ff712a52cbe29cd2": { + "name": "TAIYAKI token contract", + "address": "0x1a5c71ddf3d71cbb0c0bc312ff712a52cbe29cd2", + "token": { + "decimals": 18, + "symbol": "TAIYAKI" + }, + "isSC": {} + }, + "0x3c27f2d0744da4f96d9ab5f4212d8162c031dea9": { + "name": "DPR token contract", + "address": "0x3c27f2d0744da4f96d9ab5f4212d8162c031dea9", + "token": { + "decimals": 18, + "symbol": "DPR" + }, + "isSC": {} + }, + "0x22308317a4aa9e8196065e0b3647e582d44c4d7b": { + "name": "XTK token contract", + "address": "0x22308317a4aa9e8196065e0b3647e582d44c4d7b", + "token": { + "decimals": 18, + "symbol": "XTK" + }, + "isSC": {} + }, + "0x7e85e6b00a8e9c757f2fef60d047b6f787c66a1e": { + "name": "LPL token contract", + "address": "0x7e85e6b00a8e9c757f2fef60d047b6f787c66a1e", + "token": { + "decimals": 18, + "symbol": "LPL" + }, + "isSC": {} + }, + "0x8c92e38eca8210f4fcbf17f0951b198dd7668292": { + "name": "DHT token contract", + "address": "0x8c92e38eca8210f4fcbf17f0951b198dd7668292", + "token": { + "decimals": 18, + "symbol": "DHT" + }, + "isSC": {} + }, + "0xf4cbd4a7143e221eb983d292c0d13275f12c8172": { + "name": "MEE token contract", + "address": "0xf4cbd4a7143e221eb983d292c0d13275f12c8172", + "token": { + "decimals": 18, + "symbol": "MEE" + }, + "isSC": {} + }, + "0x66e16d50c07a01bb473ec794349d45aa1a0e5dc2": { + "name": "FOAM token contract", + "address": "0x66e16d50c07a01bb473ec794349d45aa1a0e5dc2", + "token": { + "decimals": 18, + "symbol": "FOAM" + }, + "isSC": {} + }, + "0xf2ced5f137e27f68e6a01cc6c4198729e200e457": { + "name": "COC token contract", + "address": "0xf2ced5f137e27f68e6a01cc6c4198729e200e457", + "token": { + "decimals": 8, + "symbol": "COC" + }, + "isSC": {} + }, + "0x3fc8bd9b0d8054cbdc174c4ed4b41a95d3c6a427": { + "name": "AAPX token contract", + "address": "0x3fc8bd9b0d8054cbdc174c4ed4b41a95d3c6a427", + "token": { + "decimals": 18, + "symbol": "AAPX" + }, + "isSC": {} + }, + "0xdd24e07c3c840ae6435e7c9f98e6ee6ce168d788": { + "name": "UBXT token contract", + "address": "0xdd24e07c3c840ae6435e7c9f98e6ee6ce168d788", + "token": { + "decimals": 18, + "symbol": "UBXT" + }, + "isSC": {} + }, + "0xbbba073c31bf03b8acf7c28ef0738decf3695683": { + "name": "SAND token contract", + "address": "0xbbba073c31bf03b8acf7c28ef0738decf3695683", + "token": { + "decimals": 18, + "symbol": "SAND" + }, + "isSC": {} + }, + "0xe21b9bda4ecef9e4652bc5c6863f731c2151ef28": { + "name": "KTON token contract", + "address": "0xe21b9bda4ecef9e4652bc5c6863f731c2151ef28", + "token": { + "decimals": 18, + "symbol": "KTON" + }, + "isSC": {} + }, + "0x2fe8733dcb25bfbba79292294347415417510067": { + "name": "XED token contract", + "address": "0x2fe8733dcb25bfbba79292294347415417510067", + "token": { + "decimals": 18, + "symbol": "XED" + }, + "isSC": {} + }, + "0x7dd51d62ca7c94664111eee95b38dffda14d582d": { + "name": "UNL token contract", + "address": "0x7dd51d62ca7c94664111eee95b38dffda14d582d", + "token": { + "decimals": 18, + "symbol": "UNL" + }, + "isSC": {} + }, + "0xe38eb5a707d9a09757246dc37df11b35e47ba782": { + "name": "SOGE token contract", + "address": "0xe38eb5a707d9a09757246dc37df11b35e47ba782", + "token": { + "decimals": 18, + "symbol": "SOGE" + }, + "isSC": {} + }, + "0x0e622e0e97b88824c655a0443e69416c3233a522": { + "name": "RUB token contract", + "address": "0x0e622e0e97b88824c655a0443e69416c3233a522", + "token": { + "decimals": 18, + "symbol": "RUB" + }, + "isSC": {} + }, + "0x408a67a0a01281cfb96dd18ebbfdddec9cb028b7": { + "name": "ZPUMP token contract", + "address": "0x408a67a0a01281cfb96dd18ebbfdddec9cb028b7", + "token": { + "decimals": 9, + "symbol": "ZPUMP" + }, + "isSC": {} + }, + "0x37ff2a6cf0e8061cbd9a00919690f1b0a46ee674": { + "name": "FROGE token contract", + "address": "0x37ff2a6cf0e8061cbd9a00919690f1b0a46ee674", + "token": { + "decimals": 9, + "symbol": "FROGE" + }, + "isSC": {} + }, + "0x221afac78d2725d090499b973bb42fc93cca2ef5": { + "name": "AXN token contract", + "address": "0x221afac78d2725d090499b973bb42fc93cca2ef5", + "token": { + "decimals": 18, + "symbol": "AXN" + }, + "isSC": {} + }, + "0x2c7a7358e60f2d145fac48c71950a2c523636075": { + "name": "KTN token contract", + "address": "0x2c7a7358e60f2d145fac48c71950a2c523636075", + "token": { + "decimals": 18, + "symbol": "KTN" + }, + "isSC": {} + }, + "0x7f2841a5c7e69e921897fbfbce95caea34634a35": { + "name": "WAR token contract", + "address": "0x7f2841a5c7e69e921897fbfbce95caea34634a35", + "token": { + "decimals": 18, + "symbol": "WAR" + }, + "isSC": {} + }, + "0xcf32822ff397ef82425153a9dcb726e5ff61dca7": { + "name": "GMEE token contract", + "address": "0xcf32822ff397ef82425153a9dcb726e5ff61dca7", + "token": { + "decimals": 18, + "symbol": "GMEE" + }, + "isSC": {} + }, + "0x37c6656cd3882a422d87bd15ac547c5515c0df1c": { + "name": "BAB token contract", + "address": "0x37c6656cd3882a422d87bd15ac547c5515c0df1c", + "token": { + "decimals": 18, + "symbol": "BAB" + }, + "isSC": {} + }, + "0xcde5e3d90631cacb842fa86f62dd0fc08a3ce43d": { + "name": "BAC token contract", + "address": "0xcde5e3d90631cacb842fa86f62dd0fc08a3ce43d", + "token": { + "decimals": 18, + "symbol": "BAC" + }, + "isSC": {} + }, + "0x83a6da342099835bcaa9c219dd76a5033c837de5": { + "name": "BASv2 token contract", + "address": "0x83a6da342099835bcaa9c219dd76a5033c837de5", + "token": { + "decimals": 18, + "symbol": "BASv2" + }, + "isSC": {} + }, + "0xa6d996afdbc613a5c5fc92bbaefbc7b827419e8f": { + "name": "CEHH token contract", + "address": "0xa6d996afdbc613a5c5fc92bbaefbc7b827419e8f", + "token": { + "decimals": 0, + "symbol": "CEHH" + }, + "isSC": {} + }, + "0x365ae1c67b3efa55c624c9705ad1df2072d3d254": { + "name": "Che token contract", + "address": "0x365ae1c67b3efa55c624c9705ad1df2072d3d254", + "token": { + "decimals": 18, + "symbol": "Che" + }, + "isSC": {} + }, + "0xe947283361d0d47c870c0898d7a5578310e1db37": { + "name": "HL token contract", + "address": "0xe947283361d0d47c870c0898d7a5578310e1db37", + "token": { + "decimals": 18, + "symbol": "HL" + }, + "isSC": {} + }, + "0xe63e303460e078c2deaf9cd3cb46eca0c8cb1b59": { + "name": "PNS token contract", + "address": "0xe63e303460e078c2deaf9cd3cb46eca0c8cb1b59", + "token": { + "decimals": 2, + "symbol": "PNS" + }, + "isSC": {} + }, + "0x1656484c36cef1b24cd49457470abce90c480d29": { + "name": "YYB token contract", + "address": "0x1656484c36cef1b24cd49457470abce90c480d29", + "token": { + "decimals": 18, + "symbol": "YYB" + }, + "isSC": {} + }, + "0x223097da39cb07fa133d70cd820f27867b4452c3": { + "name": "YJM token contract", + "address": "0x223097da39cb07fa133d70cd820f27867b4452c3", + "token": { + "decimals": 18, + "symbol": "YJM" + }, + "isSC": {} + }, + "0xebbb74174d1a22729b9a9cddb28c18ca07be0314": { + "name": "IgnisLite token contract", + "address": "0xebbb74174d1a22729b9a9cddb28c18ca07be0314", + "token": { + "decimals": 18, + "symbol": "IgnisLite" + }, + "isSC": {} + }, + "0x24274de25578f97984f66be0cc0762138757c935": { + "name": "DAPP token contract", + "address": "0x24274de25578f97984f66be0cc0762138757c935", + "token": { + "decimals": 18, + "symbol": "DAPP" + }, + "isSC": {} + }, + "0x1b815d120b3ef02039ee11dc2d33de7aa4a8c603": { + "name": "WOO token contract", + "address": "0x1b815d120b3ef02039ee11dc2d33de7aa4a8c603", + "token": { + "decimals": 18, + "symbol": "WOO" + }, + "isSC": {} + }, + "0xf9f8d3bcad8958ffef131bab376cffac0d16551b": { + "name": "oLTC token contract", + "address": "0xf9f8d3bcad8958ffef131bab376cffac0d16551b", + "token": { + "decimals": 18, + "symbol": "oLTC" + }, + "isSC": {} + }, + "0x90fb380ddebaf872cc1f8d8e8c604ff2f4697c19": { + "name": "oBTC token contract", + "address": "0x90fb380ddebaf872cc1f8d8e8c604ff2f4697c19", + "token": { + "decimals": 18, + "symbol": "oBTC" + }, + "isSC": {} + }, + "0x2e4b0fb46a46c90cb410fe676f24e466753b469f": { + "name": "UMBR token contract", + "address": "0x2e4b0fb46a46c90cb410fe676f24e466753b469f", + "token": { + "decimals": 18, + "symbol": "UMBR" + }, + "isSC": {} + }, + "0x1e2231db2dbedd0fac3eb70608d402e80f244c6d": { + "name": "ZIL token contract", + "address": "0x1e2231db2dbedd0fac3eb70608d402e80f244c6d", + "token": { + "decimals": 12, + "symbol": "ZIL" + }, + "isSC": {} + }, + "0x179a16d33e4c08dd773b002f475ca36ce22fa169": { + "name": "SBI token contract", + "address": "0x179a16d33e4c08dd773b002f475ca36ce22fa169", + "token": { + "decimals": 18, + "symbol": "SBI" + }, + "isSC": {} + }, + "0xa5c09ba00f342f61f637e1a88f1bd7ebacf5be48": { + "name": "CORN token contract", + "address": "0xa5c09ba00f342f61f637e1a88f1bd7ebacf5be48", + "token": { + "decimals": 18, + "symbol": "CORN" + }, + "isSC": {} + }, + "0xad230ec33ccf849c2bbd8d26c1706db07b24db95": { + "name": "LAND token contract", + "address": "0xad230ec33ccf849c2bbd8d26c1706db07b24db95", + "token": { + "decimals": 18, + "symbol": "LAND" + }, + "isSC": {} + }, + "0x642f7511a68c57fae8ac0caa618673a66166e4c7": { + "name": "XRGE token contract", + "address": "0x642f7511a68c57fae8ac0caa618673a66166e4c7", + "token": { + "decimals": 18, + "symbol": "XRGE" + }, + "isSC": {} + }, + "0xe2341718c6c0cbfa8e6686102dd8fbf4047a9e9b": { + "name": "AIOZ token contract", + "address": "0xe2341718c6c0cbfa8e6686102dd8fbf4047a9e9b", + "token": { + "decimals": 18, + "symbol": "AIOZ" + }, + "isSC": {} + }, + "0x4349d5464203f1da44513c1feab502839e69dbf8": { + "name": "WQT token contract", + "address": "0x4349d5464203f1da44513c1feab502839e69dbf8", + "token": { + "decimals": 18, + "symbol": "WQT" + }, + "isSC": {} + }, + "0x7886a4ebdda9f1861d6a081cd794b3e79c375011": { + "name": "SHOPX token contract", + "address": "0x7886a4ebdda9f1861d6a081cd794b3e79c375011", + "token": { + "decimals": 18, + "symbol": "SHOPX" + }, + "isSC": {} + }, + "0x5095cc6511b70e287bc525aa57afbc60eb73ac47": { + "name": "eRSDL token contract", + "address": "0x5095cc6511b70e287bc525aa57afbc60eb73ac47", + "token": { + "decimals": 18, + "symbol": "eRSDL" + }, + "isSC": {} + }, + "0x32ef6dcb27ae8697e217fe3594d665535b176721": { + "name": "KAI token contract", + "address": "0x32ef6dcb27ae8697e217fe3594d665535b176721", + "token": { + "decimals": 18, + "symbol": "KAI" + }, + "isSC": {} + }, + "0xf689e85988d3a7921e852867ce49f53388985e6d": { + "name": "MoFi token contract", + "address": "0xf689e85988d3a7921e852867ce49f53388985e6d", + "token": { + "decimals": 18, + "symbol": "MoFi" + }, + "isSC": {} + }, + "0x638df98ad8069a15569da5a6b01181804c47e34c": { + "name": "DAFI token contract", + "address": "0x638df98ad8069a15569da5a6b01181804c47e34c", + "token": { + "decimals": 18, + "symbol": "DAFI" + }, + "isSC": {} + }, + "0x3a4bed49ab592a227bae8f41efd0d38e6e06d96c": { + "name": "CARD token contract", + "address": "0x3a4bed49ab592a227bae8f41efd0d38e6e06d96c", + "token": { + "decimals": 18, + "symbol": "CARD" + }, + "isSC": {} + }, + "0x9ccdf331f97449a84d100918e1e233b097a3e13f": { + "name": "KYL token contract", + "address": "0x9ccdf331f97449a84d100918e1e233b097a3e13f", + "token": { + "decimals": 18, + "symbol": "KYL" + }, + "isSC": {} + }, + "0x7075cab6bcca06613e2d071bd918d1a0241379e2": { + "name": "GFARM2 token contract", + "address": "0x7075cab6bcca06613e2d071bd918d1a0241379e2", + "token": { + "decimals": 18, + "symbol": "GFARM2" + }, + "isSC": {} + }, + "0xc58158c14d4757ef36ce25e493758f2fceedec5d": { + "name": "D11 token contract", + "address": "0xc58158c14d4757ef36ce25e493758f2fceedec5d", + "token": { + "decimals": 18, + "symbol": "D11" + }, + "isSC": {} + }, + "0xc059a4777279e30c5238da786384700cd14d8f47": { + "name": "CHONK token contract", + "address": "0xc059a4777279e30c5238da786384700cd14d8f47", + "token": { + "decimals": 18, + "symbol": "CHONK" + }, + "isSC": {} + }, + "0x95bbe8fbd32088bc13e67b05c7e783ad6ca854d8": { + "name": "CONV token contract", + "address": "0x95bbe8fbd32088bc13e67b05c7e783ad6ca854d8", + "token": { + "decimals": 18, + "symbol": "CONV" + }, + "isSC": {} + }, + "0x04ae4ae7f9af802de5a2da9561948f6f24d4b043": { + "name": "BTT token contract", + "address": "0x04ae4ae7f9af802de5a2da9561948f6f24d4b043", + "token": { + "decimals": 18, + "symbol": "BTT" + }, + "isSC": {} + }, + "0x8f6196901a4a153d8ee8f3fa779a042f6092d908": { + "name": "SALE token contract", + "address": "0x8f6196901a4a153d8ee8f3fa779a042f6092d908", + "token": { + "decimals": 18, + "symbol": "SALE" + }, + "isSC": {} + }, + "0x6181dedd5d6aa117716cc385a0184c709b1263f3": { + "name": "wMBX token contract", + "address": "0x6181dedd5d6aa117716cc385a0184c709b1263f3", + "token": { + "decimals": 18, + "symbol": "wMBX" + }, + "isSC": {} + }, + "0xc81278a52ad0e1485b7c3cdf79079220ddd68b7d": { + "name": "BAO token contract", + "address": "0xc81278a52ad0e1485b7c3cdf79079220ddd68b7d", + "token": { + "decimals": 18, + "symbol": "BAO" + }, + "isSC": {} + }, + "0xbd18f2909a2b55637007fa273069febe9dab8664": { + "name": "WG0 token contract", + "address": "0xbd18f2909a2b55637007fa273069febe9dab8664", + "token": { + "decimals": 18, + "symbol": "WG0" + }, + "isSC": {} + }, + "0x6b4e056b0a2c7d967728b0d0329a61b746b04cd8": { + "name": "EPAN token contract", + "address": "0x6b4e056b0a2c7d967728b0d0329a61b746b04cd8", + "token": { + "decimals": 18, + "symbol": "EPAN" + }, + "isSC": {} + }, + "0x1109c91f24f1e485f7c04d286c12b7f709e89a16": { + "name": "POLVEN token contract", + "address": "0x1109c91f24f1e485f7c04d286c12b7f709e89a16", + "token": { + "decimals": 18, + "symbol": "POLVEN" + }, + "isSC": {} + }, + "0xfdc99999c4139f953a3af41de986687275bd4f4b": { + "name": "SOAR token contract", + "address": "0xfdc99999c4139f953a3af41de986687275bd4f4b", + "token": { + "decimals": 9, + "symbol": "SOAR" + }, + "isSC": {} + }, + "0xdd418748fecfc870b7322b1d11402814f5ee55ab": { + "name": "SGT token contract", + "address": "0xdd418748fecfc870b7322b1d11402814f5ee55ab", + "token": { + "decimals": 18, + "symbol": "SGT" + }, + "isSC": {} + }, + "0x0cfc9a713a5c17bc8a5ff0379467f6558bacd0e0": { + "name": "GLQ token contract", + "address": "0x0cfc9a713a5c17bc8a5ff0379467f6558bacd0e0", + "token": { + "decimals": 18, + "symbol": "GLQ" + }, + "isSC": {} + }, + "0xdece9bd4a6f4caba2f71a8af6cbf0952758f8b36": { + "name": "rETH2 token contract", + "address": "0xdece9bd4a6f4caba2f71a8af6cbf0952758f8b36", + "token": { + "decimals": 18, + "symbol": "rETH2" + }, + "isSC": {} + }, + "0xfd08e84075c8b46faaa5629edd044effd0a597ac": { + "name": "sETH2 token contract", + "address": "0xfd08e84075c8b46faaa5629edd044effd0a597ac", + "token": { + "decimals": 18, + "symbol": "sETH2" + }, + "isSC": {} + }, + "0xc4ec74f50dd4a9ae7268898b3292decef8eda226": { + "name": "KGR token contract", + "address": "0xc4ec74f50dd4a9ae7268898b3292decef8eda226", + "token": { + "decimals": 18, + "symbol": "KGR" + }, + "isSC": {} + }, + "0x40ccd55b789fdee8d434915dc2aa6bd938506a92": { + "name": "RAGE token contract", + "address": "0x40ccd55b789fdee8d434915dc2aa6bd938506a92", + "token": { + "decimals": 18, + "symbol": "RAGE" + }, + "isSC": {} + }, + "0xe8388f307caa9c338955465f0ae2aa4c3e023dd8": { + "name": "xHDX token contract", + "address": "0xe8388f307caa9c338955465f0ae2aa4c3e023dd8", + "token": { + "decimals": 12, + "symbol": "xHDX" + }, + "isSC": {} + }, + "0xa79e0bfc579c709819f4a0e95d4597f03093b011": { + "name": "STR token contract", + "address": "0xa79e0bfc579c709819f4a0e95d4597f03093b011", + "token": { + "decimals": 18, + "symbol": "STR" + }, + "isSC": {} + }, + "0x0ab8b5304c07bb29514dad43adba7a44c67b0506": { + "name": "SANTA token contract", + "address": "0x0ab8b5304c07bb29514dad43adba7a44c67b0506", + "token": { + "decimals": 0, + "symbol": "SANTA" + }, + "isSC": {} + }, + "0x7dc0cb65ec6019330a6841e9c274f2ee57a6ca6c": { + "name": "PLU token contract", + "address": "0x7dc0cb65ec6019330a6841e9c274f2ee57a6ca6c", + "token": { + "decimals": 18, + "symbol": "PLU" + }, + "isSC": {} + }, + "0x5de4005155933c0e1612ce808f12b4cd8daabc82": { + "name": "ARMOR token contract", + "address": "0x5de4005155933c0e1612ce808f12b4cd8daabc82", + "token": { + "decimals": 18, + "symbol": "ARMOR" + }, + "isSC": {} + }, + "0xf7d9e281c5cb4c6796284c5b663b3593d2037af2": { + "name": "NFTP token contract", + "address": "0xf7d9e281c5cb4c6796284c5b663b3593d2037af2", + "token": { + "decimals": 18, + "symbol": "NFTP" + }, + "isSC": {} + }, + "0x1489f4f7e3a80a0ad9fa23c39d2e8af818204ce9": { + "name": "VBTC token contract", + "address": "0x1489f4f7e3a80a0ad9fa23c39d2e8af818204ce9", + "token": { + "decimals": 18, + "symbol": "VBTC" + }, + "isSC": {} + }, + "0xa3ed22eee92a3872709823a6970069e12a4540eb": { + "name": "FRONT token contract", + "address": "0xa3ed22eee92a3872709823a6970069e12a4540eb", + "token": { + "decimals": 18, + "symbol": "FRONT" + }, + "isSC": {} + }, + "0xb3b681dee0435ecc0a508e40b02b3c9068d618cd": { + "name": "YAM token contract", + "address": "0xb3b681dee0435ecc0a508e40b02b3c9068d618cd", + "token": { + "decimals": 18, + "symbol": "YAM" + }, + "isSC": {} + }, + "0x6374fce99cf93a8f07728c4adf2991b0f5e50f45": { + "name": "NIL token contract", + "address": "0x6374fce99cf93a8f07728c4adf2991b0f5e50f45", + "token": { + "decimals": 9, + "symbol": "NIL" + }, + "isSC": {} + }, + "0x175bdc4e52eecb675b86fc4c9a3ea3f80adbb610": { + "name": "HXN token contract", + "address": "0x175bdc4e52eecb675b86fc4c9a3ea3f80adbb610", + "token": { + "decimals": 18, + "symbol": "HXN" + }, + "isSC": {} + }, + "0xd921f8318cfd786bab1ea7492673f053c518ac04": { + "name": "xSDT token contract", + "address": "0xd921f8318cfd786bab1ea7492673f053c518ac04", + "token": { + "decimals": 18, + "symbol": "xSDT" + }, + "isSC": {} + }, + "0xb8e5b39689f886f8c34d3e5ac09f513a282d486d": { + "name": "FGH token contract", + "address": "0xb8e5b39689f886f8c34d3e5ac09f513a282d486d", + "token": { + "decimals": 18, + "symbol": "FGH" + }, + "isSC": {} + }, + "0x055dc5c3b7c386f2daefec554bb42831fb4107be": { + "name": "PREMIA token contract", + "address": "0x055dc5c3b7c386f2daefec554bb42831fb4107be", + "token": { + "decimals": 18, + "symbol": "PREMIA" + }, + "isSC": {} + }, + "0xe8a51d0dd1b4525189dda2187f90ddf0932b5482": { + "name": "LCX token contract", + "address": "0xe8a51d0dd1b4525189dda2187f90ddf0932b5482", + "token": { + "decimals": 18, + "symbol": "LCX" + }, + "isSC": {} + }, + "0x9ecf85badebd3ecf6ef79db44bb59519cbd21d82": { + "name": "KONG token contract", + "address": "0x9ecf85badebd3ecf6ef79db44bb59519cbd21d82", + "token": { + "decimals": 9, + "symbol": "KONG" + }, + "isSC": {} + }, + "0x56b1c1e028c2e0a8852906e1ee7730ed67a3d9bb": { + "name": "eXRD token contract", + "address": "0x56b1c1e028c2e0a8852906e1ee7730ed67a3d9bb", + "token": { + "decimals": 18, + "symbol": "eXRD" + }, + "isSC": {} + }, + "0xb77e62709e39ad1cbeebe77cf493745aec0f453a": { + "name": "WISE token contract", + "address": "0xb77e62709e39ad1cbeebe77cf493745aec0f453a", + "token": { + "decimals": 18, + "symbol": "WISE" + }, + "isSC": {} + }, + "0xbe5cf150e1ff59ca7f2499eaa13bfc40aae70e78": { + "name": "GLCH token contract", + "address": "0xbe5cf150e1ff59ca7f2499eaa13bfc40aae70e78", + "token": { + "decimals": 18, + "symbol": "GLCH" + }, + "isSC": {} + }, + "0xcbb2da0127042546ceff56da69faf3f2ba6d1c51": { + "name": "MBC token contract", + "address": "0xcbb2da0127042546ceff56da69faf3f2ba6d1c51", + "token": { + "decimals": 18, + "symbol": "MBC" + }, + "isSC": {} + }, + "0x554f074d9ccda8f483d1812d4874cbebd682644e": { + "name": "$ANRX token contract", + "address": "0x554f074d9ccda8f483d1812d4874cbebd682644e", + "token": { + "decimals": 18, + "symbol": "$ANRX" + }, + "isSC": {} + }, + "0x8b62011d9e73922ac5ef6d30a82588cb33f98055": { + "name": "FGP token contract", + "address": "0x8b62011d9e73922ac5ef6d30a82588cb33f98055", + "token": { + "decimals": 18, + "symbol": "FGP" + }, + "isSC": {} + }, + "0x5df1a47e05b4caba0ed3df13662642f05314764d": { + "name": "UMX token contract", + "address": "0x5df1a47e05b4caba0ed3df13662642f05314764d", + "token": { + "decimals": 18, + "symbol": "UMX" + }, + "isSC": {} + }, + "0x33c9f7c0afe2722cb9e426360c261fb755b4483d": { + "name": "SNOW token contract", + "address": "0x33c9f7c0afe2722cb9e426360c261fb755b4483d", + "token": { + "decimals": 18, + "symbol": "SNOW" + }, + "isSC": {} + }, + "0xa7051c5a22d963b81d71c2ba64d46a877fbc1821": { + "name": "EROWAN token contract", + "address": "0xa7051c5a22d963b81d71c2ba64d46a877fbc1821", + "token": { + "decimals": 18, + "symbol": "EROWAN" + }, + "isSC": {} + }, + "0x60ac2e84078ce30cbc68e3d7b18bcf613271ce6b": { + "name": "ALOHA token contract", + "address": "0x60ac2e84078ce30cbc68e3d7b18bcf613271ce6b", + "token": { + "decimals": 18, + "symbol": "ALOHA" + }, + "isSC": {} + }, + "0x3d32a7dc8b0c62a73639bf0d4fe8d229a2431ec8": { + "name": "PKF token contract", + "address": "0x3d32a7dc8b0c62a73639bf0d4fe8d229a2431ec8", + "token": { + "decimals": 18, + "symbol": "PKF" + }, + "isSC": {} + }, + "0x8a4001fd666be272605c56bb956d11a46200db81": { + "name": "GREEN token contract", + "address": "0x8a4001fd666be272605c56bb956d11a46200db81", + "token": { + "decimals": 8, + "symbol": "GREEN" + }, + "isSC": {} + }, + "0x03bb597efd7bb986222afda80858f05a3bc4a2e9": { + "name": "KEY token contract", + "address": "0x03bb597efd7bb986222afda80858f05a3bc4a2e9", + "token": { + "decimals": 0, + "symbol": "KEY" + }, + "isSC": {} + }, + "0xe8f157e041df3b28151b667364e9c90789da7923": { + "name": "OPIUM token contract", + "address": "0xe8f157e041df3b28151b667364e9c90789da7923", + "token": { + "decimals": 18, + "symbol": "OPIUM" + }, + "isSC": {} + }, + "0x41b3fc2302c8aac4c84c552f770419091ef52435": { + "name": "MAXX token contract", + "address": "0x41b3fc2302c8aac4c84c552f770419091ef52435", + "token": { + "decimals": 18, + "symbol": "MAXX" + }, + "isSC": {} + }, + "0xb257de22059cd200e34139d27ce0e415e173ce49": { + "name": "ICH token contract", + "address": "0xb257de22059cd200e34139d27ce0e415e173ce49", + "token": { + "decimals": 18, + "symbol": "ICH" + }, + "isSC": {} + }, + "0x4d0def42cf57d6f27cd4983042a55dce1c9f853c": { + "name": "KIT token contract", + "address": "0x4d0def42cf57d6f27cd4983042a55dce1c9f853c", + "token": { + "decimals": 18, + "symbol": "KIT" + }, + "isSC": {} + }, + "0xb090b6310970dd028a007981a24c1a492568a816": { + "name": "VISR token contract", + "address": "0xb090b6310970dd028a007981a24c1a492568a816", + "token": { + "decimals": 18, + "symbol": "VISR" + }, + "isSC": {} + }, + "0x1d545d7ff917e08d7bf26320343b16bdf51fdbb6": { + "name": "CELL token contract", + "address": "0x1d545d7ff917e08d7bf26320343b16bdf51fdbb6", + "token": { + "decimals": 18, + "symbol": "CELL" + }, + "isSC": {} + }, + "0xdfeeb5661ef760a1c565caf07a50aca182eafcee": { + "name": "MUA token contract", + "address": "0xdfeeb5661ef760a1c565caf07a50aca182eafcee", + "token": { + "decimals": 18, + "symbol": "MUA" + }, + "isSC": {} + }, + "0x95c300e7740d2a88a44124b424bfc1cb2f9c3b89": { + "name": "ALCX token contract", + "address": "0x95c300e7740d2a88a44124b424bfc1cb2f9c3b89", + "token": { + "decimals": 18, + "symbol": "ALCX" + }, + "isSC": {} + }, + "0x7e7ff932fab08a0af569f93ce65e7b8b23698ad8": { + "name": "Yf-DAI token contract", + "address": "0x7e7ff932fab08a0af569f93ce65e7b8b23698ad8", + "token": { + "decimals": 18, + "symbol": "Yf-DAI" + }, + "isSC": {} + }, + "0x9c49ba0212bb5db371e66b59d1565b7c06e4894e": { + "name": "CC10 token contract", + "address": "0x9c49ba0212bb5db371e66b59d1565b7c06e4894e", + "token": { + "decimals": 18, + "symbol": "CC10" + }, + "isSC": {} + }, + "0x8ca5ed20346c5d8a21a849d59c64f0884a532882": { + "name": "OFT token contract", + "address": "0x8ca5ed20346c5d8a21a849d59c64f0884a532882", + "token": { + "decimals": 18, + "symbol": "OFT" + }, + "isSC": {} + }, + "0x0e50bea95fe001a370a4f1c220c49aedcb982dec": { + "name": "ERN token contract", + "address": "0x0e50bea95fe001a370a4f1c220c49aedcb982dec", + "token": { + "decimals": 18, + "symbol": "ERN" + }, + "isSC": {} + }, + "0x19782d3dc4701ceeedcd90f0993f0a9126ed89d0": { + "name": "REN token contract", + "address": "0x19782d3dc4701ceeedcd90f0993f0a9126ed89d0", + "token": { + "decimals": 18, + "symbol": "REN" + }, + "isSC": {} + }, + "0x0c51f415cf478f8d08c246a6c6ee180c5dc3a012": { + "name": "HOT token contract", + "address": "0x0c51f415cf478f8d08c246a6c6ee180c5dc3a012", + "token": { + "decimals": 18, + "symbol": "HOT" + }, + "isSC": {} + }, + "0xfa15611aa3775fbfe1375fb56cd3027f5d3dd2db": { + "name": "ADD token contract", + "address": "0xfa15611aa3775fbfe1375fb56cd3027f5d3dd2db", + "token": { + "decimals": 18, + "symbol": "ADD" + }, + "isSC": {} + }, + "0xf35a85c493c49f19bcc176e718865b148958a130": { + "name": "CBL token contract", + "address": "0xf35a85c493c49f19bcc176e718865b148958a130", + "token": { + "decimals": 18, + "symbol": "CBL" + }, + "isSC": {} + }, + "0x885b6e6dbb84148f98c806800bc19c9a9db4cfeb": { + "name": "MTV token contract", + "address": "0x885b6e6dbb84148f98c806800bc19c9a9db4cfeb", + "token": { + "decimals": 18, + "symbol": "MTV" + }, + "isSC": {} + }, + "0x157b28e46f301c596668a4b85c59f710f9c4bbaa": { + "name": "WWGR token contract", + "address": "0x157b28e46f301c596668a4b85c59f710f9c4bbaa", + "token": { + "decimals": 8, + "symbol": "WWGR" + }, + "isSC": {} + }, + "0xf1938ce12400f9a761084e7a80d37e732a4da056": { + "name": "CHZ token contract", + "address": "0xf1938ce12400f9a761084e7a80d37e732a4da056", + "token": { + "decimals": 18, + "symbol": "CHZ" + }, + "isSC": {} + }, + "0xfb65ef42f7c8a70ff73f627db6e9ba2aff1f20fa": { + "name": "NDR token contract", + "address": "0xfb65ef42f7c8a70ff73f627db6e9ba2aff1f20fa", + "token": { + "decimals": 18, + "symbol": "NDR" + }, + "isSC": {} + }, + "0x6968105460f67c3bf751be7c15f92f5286fd0ce5": { + "name": "MONA token contract", + "address": "0x6968105460f67c3bf751be7c15f92f5286fd0ce5", + "token": { + "decimals": 18, + "symbol": "MONA" + }, + "isSC": {} + }, + "0x0e0ffc562d72316b783e887bbaae1fd794adb530": { + "name": "DOV token contract", + "address": "0x0e0ffc562d72316b783e887bbaae1fd794adb530", + "token": { + "decimals": 18, + "symbol": "DOV" + }, + "isSC": {} + }, + "0x55bcbeab7b9dadadb0b2e97c354357c58a052d88": { + "name": "USDV token contract", + "address": "0x55bcbeab7b9dadadb0b2e97c354357c58a052d88", + "token": { + "decimals": 18, + "symbol": "USDV" + }, + "isSC": {} + }, + "0xd893dde7346cc0ab46dc7ea468aeb69d9bf087c5": { + "name": "HAKKA token contract", + "address": "0xd893dde7346cc0ab46dc7ea468aeb69d9bf087c5", + "token": { + "decimals": 18, + "symbol": "HAKKA" + }, + "isSC": {} + }, + "0xe111178a87a3bff0c8d18decba5798827539ae99": { + "name": "EURS token contract", + "address": "0xe111178a87a3bff0c8d18decba5798827539ae99", + "token": { + "decimals": 2, + "symbol": "EURS" + }, + "isSC": {} + }, + "0xe212f92e5af85268b33d2aa587b51f49c3b945be": { + "name": "sdcrvRenWSBTC token contract", + "address": "0xe212f92e5af85268b33d2aa587b51f49c3b945be", + "token": { + "decimals": 18, + "symbol": "sdcrvRenWSBTC" + }, + "isSC": {} + }, + "0xfbdb45075fb73ca4cc8b83fd6fdb4f9b696b1ba1": { + "name": "sdeursCRV token contract", + "address": "0xfbdb45075fb73ca4cc8b83fd6fdb4f9b696b1ba1", + "token": { + "decimals": 18, + "symbol": "sdeursCRV" + }, + "isSC": {} + }, + "0x87f0bfee4435ce2b8643b221d0c1cad21f5328b4": { + "name": "sd3Crv token contract", + "address": "0x87f0bfee4435ce2b8643b221d0c1cad21f5328b4", + "token": { + "decimals": 18, + "symbol": "sd3Crv" + }, + "isSC": {} + }, + "0x07cc1cc3628cc1615120df781ef9fc8ec2feae09": { + "name": "BEPRO token contract", + "address": "0x07cc1cc3628cc1615120df781ef9fc8ec2feae09", + "token": { + "decimals": 18, + "symbol": "BEPRO" + }, + "isSC": {} + }, + "0x7dd3d9e1868a7da87509a601e7dbbf938c819a32": { + "name": "VOX token contract", + "address": "0x7dd3d9e1868a7da87509a601e7dbbf938c819a32", + "token": { + "decimals": 18, + "symbol": "VOX" + }, + "isSC": {} + }, + "0xf6f85b3f9fd581c2ee717c404f7684486f057f95": { + "name": "NORD token contract", + "address": "0xf6f85b3f9fd581c2ee717c404f7684486f057f95", + "token": { + "decimals": 18, + "symbol": "NORD" + }, + "isSC": {} + }, + "0x9613282539b6d0e3cb1edc843a43da7768ac3838": { + "name": "veCRV token contract", + "address": "0x9613282539b6d0e3cb1edc843a43da7768ac3838", + "token": { + "decimals": 18, + "symbol": "veCRV" + }, + "isSC": {} + }, + "0x268ad27c28601d28b79c792c14e95bd2b7a030f8": { + "name": "JULIEN token contract", + "address": "0x268ad27c28601d28b79c792c14e95bd2b7a030f8", + "token": { + "decimals": 4, + "symbol": "JULIEN" + }, + "isSC": {} + }, + "0xdd539b42daddc0ca55fb3ac2260240e61414d92b": { + "name": "HOGE token contract", + "address": "0xdd539b42daddc0ca55fb3ac2260240e61414d92b", + "token": { + "decimals": 9, + "symbol": "HOGE" + }, + "isSC": {} + }, + "0x8a2870fb69a90000d6439b7adfb01d4ba383a415": { + "name": "DEGEN token contract", + "address": "0x8a2870fb69a90000d6439b7adfb01d4ba383a415", + "token": { + "decimals": 18, + "symbol": "DEGEN" + }, + "isSC": {} + }, + "0x6f7c932e7684666c9fd1d44527765433e01ff61d": { + "name": "MKR token contract", + "address": "0x6f7c932e7684666c9fd1d44527765433e01ff61d", + "token": { + "decimals": 18, + "symbol": "MKR" + }, + "isSC": {} + }, + "0x106035dedca635d75d6ff05f98f25916829edb77": { + "name": "NPX token contract", + "address": "0x106035dedca635d75d6ff05f98f25916829edb77", + "token": { + "decimals": 2, + "symbol": "NPX" + }, + "isSC": {} + }, + "0x361a5a4993493ce00f61c32d4ecca5512b82ce90": { + "name": "SDT token contract", + "address": "0x361a5a4993493ce00f61c32d4ecca5512b82ce90", + "token": { + "decimals": 18, + "symbol": "SDT" + }, + "isSC": {} + }, + "0xdb3b3b147a030f032633f6c4bebf9a2fb5a882b5": { + "name": "EASY token contract", + "address": "0xdb3b3b147a030f032633f6c4bebf9a2fb5a882b5", + "token": { + "decimals": 18, + "symbol": "EASY" + }, + "isSC": {} + }, + "0xfe9ca7cf13e33b23af63fea696f4aae1b7a65585": { + "name": "VIDYA token contract", + "address": "0xfe9ca7cf13e33b23af63fea696f4aae1b7a65585", + "token": { + "decimals": 18, + "symbol": "VIDYA" + }, + "isSC": {} + }, + "0x2d0b6b0c7468c7cfb716e9cf0ff24f45a239a3a0": { + "name": "BTL token contract", + "address": "0x2d0b6b0c7468c7cfb716e9cf0ff24f45a239a3a0", + "token": { + "decimals": 18, + "symbol": "BTL" + }, + "isSC": {} + }, + "0x13654478010268c8c729e8078313c3d0acc21819": { + "name": "CRED token contract", + "address": "0x13654478010268c8c729e8078313c3d0acc21819", + "token": { + "decimals": 18, + "symbol": "CRED" + }, + "isSC": {} + }, + "0x26f10028c105501678531a19fe025b93ae055a9f": { + "name": "COIN token contract", + "address": "0x26f10028c105501678531a19fe025b93ae055a9f", + "token": { + "decimals": 18, + "symbol": "COIN" + }, + "isSC": {} + }, + "0x2b88ad57897a8b496595925f43048301c37615da": { + "name": "PICKLE token contract", + "address": "0x2b88ad57897a8b496595925f43048301c37615da", + "token": { + "decimals": 18, + "symbol": "PICKLE" + }, + "isSC": {} + }, + "0x61299774020da444af134c82fa83e3810b309991": { + "name": "RNDR token contract", + "address": "0x61299774020da444af134c82fa83e3810b309991", + "token": { + "decimals": 18, + "symbol": "RNDR" + }, + "isSC": {} + }, + "0xebf9b87583c284f0a1b7af72371f84d2a7567285": { + "name": "CRTS token contract", + "address": "0xebf9b87583c284f0a1b7af72371f84d2a7567285", + "token": { + "decimals": 9, + "symbol": "CRTS" + }, + "isSC": {} + }, + "0x172370d5cd63279efa6d502dab29171933a610af": { + "name": "CRV token contract", + "address": "0x172370d5cd63279efa6d502dab29171933a610af", + "token": { + "decimals": 18, + "symbol": "CRV" + }, + "isSC": {} + }, + "0x23fe1ee2f536427b7e8ac02fb037a7f867037fe8": { + "name": "TORN token contract", + "address": "0x23fe1ee2f536427b7e8ac02fb037a7f867037fe8", + "token": { + "decimals": 18, + "symbol": "TORN" + }, + "isSC": {} + }, + "0x7827f070d3f0dcae72ac6a9e1953459d50a426a7": { + "name": "FOTO token contract", + "address": "0x7827f070d3f0dcae72ac6a9e1953459d50a426a7", + "token": { + "decimals": 18, + "symbol": "FOTO" + }, + "isSC": {} + }, + "0xeb5c9e515629b725d3588a55e2a43964dcfde8ca": { + "name": "STAKE token contract", + "address": "0xeb5c9e515629b725d3588a55e2a43964dcfde8ca", + "token": { + "decimals": 18, + "symbol": "STAKE" + }, + "isSC": {} + }, + "0x263534a4fe3cb249df46810718b7b612a30ebbff": { + "name": "PERP token contract", + "address": "0x263534a4fe3cb249df46810718b7b612a30ebbff", + "token": { + "decimals": 18, + "symbol": "PERP" + }, + "isSC": {} + }, + "0x7b9fd890072508f66978e1cb9d4f802dcc2c4fdf": { + "name": "MAPS token contract", + "address": "0x7b9fd890072508f66978e1cb9d4f802dcc2c4fdf", + "token": { + "decimals": 6, + "symbol": "MAPS" + }, + "isSC": {} + }, + "0x1379e8886a944d2d9d440b3d88df536aea08d9f3": { + "name": "MYST token contract", + "address": "0x1379e8886a944d2d9d440b3d88df536aea08d9f3", + "token": { + "decimals": 18, + "symbol": "MYST" + }, + "isSC": {} + }, + "0x6f934b45fc6043527d73c7c99313dd838e723db7": { + "name": "FCL token contract", + "address": "0x6f934b45fc6043527d73c7c99313dd838e723db7", + "token": { + "decimals": 18, + "symbol": "FCL" + }, + "isSC": {} + }, + "0x2ecf35111dc4894f43feab1683a9845cd1b4e0c4": { + "name": "URANIUM token contract", + "address": "0x2ecf35111dc4894f43feab1683a9845cd1b4e0c4", + "token": { + "decimals": 18, + "symbol": "URANIUM" + }, + "isSC": {} + }, + "0xc91c06db0f7bffba61e2a5645cc15686f0a8c828": { + "name": "RAZOR token contract", + "address": "0xc91c06db0f7bffba61e2a5645cc15686f0a8c828", + "token": { + "decimals": 18, + "symbol": "RAZOR" + }, + "isSC": {} + }, + "0x24212089b9d90b4d06ef10bd80ca14ec9356d98f": { + "name": "ANTS token contract", + "address": "0x24212089b9d90b4d06ef10bd80ca14ec9356d98f", + "token": { + "decimals": 18, + "symbol": "ANTS" + }, + "isSC": {} + }, + "0xb565cf70613ca464d68427106af80c67a8e4b801": { + "name": "YVS token contract", + "address": "0xb565cf70613ca464d68427106af80c67a8e4b801", + "token": { + "decimals": 18, + "symbol": "YVS" + }, + "isSC": {} + }, + "0x6ccbf3627b2c83afef05bf2f035e7f7b210fe30d": { + "name": "HOPR token contract", + "address": "0x6ccbf3627b2c83afef05bf2f035e7f7b210fe30d", + "token": { + "decimals": 18, + "symbol": "HOPR" + }, + "isSC": {} + }, + "0x10635bf5c17f5e4c0ed9012aef7c12f96a57a4dd": { + "name": "TAP token contract", + "address": "0x10635bf5c17f5e4c0ed9012aef7c12f96a57a4dd", + "token": { + "decimals": 18, + "symbol": "TAP" + }, + "isSC": {} + }, + "0x4e8dc2149eac3f3def36b1c281ea466338249371": { + "name": "INJ token contract", + "address": "0x4e8dc2149eac3f3def36b1c281ea466338249371", + "token": { + "decimals": 18, + "symbol": "INJ" + }, + "isSC": {} + }, + "0xfdde616084427f0a231d0664a985e1f820e34693": { + "name": "bDIGG token contract", + "address": "0xfdde616084427f0a231d0664a985e1f820e34693", + "token": { + "decimals": 18, + "symbol": "bDIGG" + }, + "isSC": {} + }, + "0x12255b2dadc7e18fd34353daa161974cc917c8dd": { + "name": "DIGG token contract", + "address": "0x12255b2dadc7e18fd34353daa161974cc917c8dd", + "token": { + "decimals": 9, + "symbol": "DIGG" + }, + "isSC": {} + }, + "0x2628d301b161db70e3dbbac88d9d900ca426ff02": { + "name": "bBADGER token contract", + "address": "0x2628d301b161db70e3dbbac88d9d900ca426ff02", + "token": { + "decimals": 18, + "symbol": "bBADGER" + }, + "isSC": {} + }, + "0x1fcbe5937b0cc2adf69772d228fa4205acf4d9b2": { + "name": "BADGER token contract", + "address": "0x1fcbe5937b0cc2adf69772d228fa4205acf4d9b2", + "token": { + "decimals": 18, + "symbol": "BADGER" + }, + "isSC": {} + }, + "0xb46e0ae620efd98516f49bb00263317096c114b2": { + "name": "THETA token contract", + "address": "0xb46e0ae620efd98516f49bb00263317096c114b2", + "token": { + "decimals": 18, + "symbol": "THETA" + }, + "isSC": {} + }, + "0x6ee244034336f0135dcef9a5755d03a9f51dd114": { + "name": "TXL token contract", + "address": "0x6ee244034336f0135dcef9a5755d03a9f51dd114", + "token": { + "decimals": 18, + "symbol": "TXL" + }, + "isSC": {} + }, + "0xdd4959cd915ae74dcd3f51e11e40fe112ac7aa69": { + "name": "RFOX token contract", + "address": "0xdd4959cd915ae74dcd3f51e11e40fe112ac7aa69", + "token": { + "decimals": 18, + "symbol": "RFOX" + }, + "isSC": {} + }, + "0x43e4b063f96c33f0433863a927f5bad34bb4b03d": { + "name": "EWTB token contract", + "address": "0x43e4b063f96c33f0433863a927f5bad34bb4b03d", + "token": { + "decimals": 18, + "symbol": "EWTB" + }, + "isSC": {} + }, + "0xd0ee109352c6116db0f17f4aa8519cdbfc7e7887": { + "name": "DEP token contract", + "address": "0xd0ee109352c6116db0f17f4aa8519cdbfc7e7887", + "token": { + "decimals": 18, + "symbol": "DEP" + }, + "isSC": {} + }, + "0x25f5ea9bd2ff7f4fe7cad29a271eb484acbf19f8": { + "name": "SCOOP token contract", + "address": "0x25f5ea9bd2ff7f4fe7cad29a271eb484acbf19f8", + "token": { + "decimals": 6, + "symbol": "SCOOP" + }, + "isSC": {} + }, + "0xf84bd51eab957c2e7b7d646a3427c5a50848281d": { + "name": "AGAr token contract", + "address": "0xf84bd51eab957c2e7b7d646a3427c5a50848281d", + "token": { + "decimals": 8, + "symbol": "AGAr" + }, + "isSC": {} + }, + "0x25788a1a171ec66da6502f9975a15b609ff54cf6": { + "name": "POOL token contract", + "address": "0x25788a1a171ec66da6502f9975a15b609ff54cf6", + "token": { + "decimals": 18, + "symbol": "POOL" + }, + "isSC": {} + }, + "0xa8b1e0764f85f53dfe21760e8afe5446d82606ac": { + "name": "BAND token contract", + "address": "0xa8b1e0764f85f53dfe21760e8afe5446d82606ac", + "token": { + "decimals": 18, + "symbol": "BAND" + }, + "isSC": {} + }, + "0xc9c1c1c20b3658f8787cc2fd702267791f224ce1": { + "name": "FTM token contract", + "address": "0xc9c1c1c20b3658f8787cc2fd702267791f224ce1", + "token": { + "decimals": 18, + "symbol": "FTM" + }, + "isSC": {} + }, + "0xa63beffd33ab3a2efd92a39a7d2361cee14ceba8": { + "name": "OGN token contract", + "address": "0xa63beffd33ab3a2efd92a39a7d2361cee14ceba8", + "token": { + "decimals": 18, + "symbol": "OGN" + }, + "isSC": {} + }, + "0x2052344ceace7f140da3e819c7729fef72f97851": { + "name": "1MT token contract", + "address": "0x2052344ceace7f140da3e819c7729fef72f97851", + "token": { + "decimals": 7, + "symbol": "1MT" + }, + "isSC": {} + }, + "0x454e1ec2f58ee542b75d2ab713ed53cd33ba4308": { + "name": "300 token contract", + "address": "0x454e1ec2f58ee542b75d2ab713ed53cd33ba4308", + "token": { + "decimals": 7, + "symbol": "300" + }, + "isSC": {} + }, + "0x49fc111e5ddd5580f48d6fdc4314540cb3a5cc4b": { + "name": "1337 token contract", + "address": "0x49fc111e5ddd5580f48d6fdc4314540cb3a5cc4b", + "token": { + "decimals": 4, + "symbol": "1337" + }, + "isSC": {} + }, + "0xb9585ec9d4c97ad9ded7250bb9a199fe8eed0eca": { + "name": "WHALE token contract", + "address": "0xb9585ec9d4c97ad9ded7250bb9a199fe8eed0eca", + "token": { + "decimals": 4, + "symbol": "WHALE" + }, + "isSC": {} + }, + "0x0f933ae2ffb1ee8b7385647eb6a5610f31d5b56f": { + "name": "ATCx token contract", + "address": "0x0f933ae2ffb1ee8b7385647eb6a5610f31d5b56f", + "token": { + "decimals": 4, + "symbol": "ATCx" + }, + "isSC": {} + }, + "0xe3322702bedaaed36cddab233360b939775ae5f1": { + "name": "TRB token contract", + "address": "0xe3322702bedaaed36cddab233360b939775ae5f1", + "token": { + "decimals": 18, + "symbol": "TRB" + }, + "isSC": {} + }, + "0x94c18174840f80d49d59dc3a1742af0b884a8184": { + "name": "SWAM token contract", + "address": "0x94c18174840f80d49d59dc3a1742af0b884a8184", + "token": { + "decimals": 18, + "symbol": "SWAM" + }, + "isSC": {} + }, + "0xaf24765f631c8830b5528b57002241ee7eef1c14": { + "name": "IOI token contract", + "address": "0xaf24765f631c8830b5528b57002241ee7eef1c14", + "token": { + "decimals": 6, + "symbol": "IOI" + }, + "isSC": {} + }, + "0xff898089e368ecc47fc37fd0d905fbcf0d70e820": { + "name": "B20 token contract", + "address": "0xff898089e368ecc47fc37fd0d905fbcf0d70e820", + "token": { + "decimals": 18, + "symbol": "B20" + }, + "isSC": {} + }, + "0x1b630a1f5838d142f4e91cc4163cd41f5139b166": { + "name": "USDN token contract", + "address": "0x1b630a1f5838d142f4e91cc4163cd41f5139b166", + "token": { + "decimals": 18, + "symbol": "USDN" + }, + "isSC": {} + }, + "0x9c72573a47b0d81ef6048c320bf5563e1606a04c": { + "name": "AMMO token contract", + "address": "0x9c72573a47b0d81ef6048c320bf5563e1606a04c", + "token": { + "decimals": 18, + "symbol": "AMMO" + }, + "isSC": {} + }, + "0x38332d8671961ae13d0bde040d536eb336495eea": { + "name": "RTK token contract", + "address": "0x38332d8671961ae13d0bde040d536eb336495eea", + "token": { + "decimals": 18, + "symbol": "RTK" + }, + "isSC": {} + }, + "0xfcf1e2fc0a398925ddb09222842b376e3a7d573b": { + "name": "ACPT token contract", + "address": "0xfcf1e2fc0a398925ddb09222842b376e3a7d573b", + "token": { + "decimals": 18, + "symbol": "ACPT" + }, + "isSC": {} + }, + "0x392f5c034b5423569a09bb172f408acb62a1be7a": { + "name": "VTX token contract", + "address": "0x392f5c034b5423569a09bb172f408acb62a1be7a", + "token": { + "decimals": 18, + "symbol": "VTX" + }, + "isSC": {} + }, + "0x9ec5abd7a442b8325f529dab25019674d0ba983d": { + "name": "XFT token contract", + "address": "0x9ec5abd7a442b8325f529dab25019674d0ba983d", + "token": { + "decimals": 18, + "symbol": "XFT" + }, + "isSC": {} + }, + "0xfed16c746cb5bfed009730f9e3e6a673006105c7": { + "name": "DRC token contract", + "address": "0xfed16c746cb5bfed009730f9e3e6a673006105c7", + "token": { + "decimals": 0, + "symbol": "DRC" + }, + "isSC": {} + }, + "0x553d3d295e0f695b9228246232edf400ed3560b5": { + "name": "PAXG token contract", + "address": "0x553d3d295e0f695b9228246232edf400ed3560b5", + "token": { + "decimals": 18, + "symbol": "PAXG" + }, + "isSC": {} + }, + "0x5ffd62d3c3ee2e81c00a7b9079fb248e7df024a8": { + "name": "GNO token contract", + "address": "0x5ffd62d3c3ee2e81c00a7b9079fb248e7df024a8", + "token": { + "decimals": 18, + "symbol": "GNO" + }, + "isSC": {} + }, + "0x50b728d8d964fd00c2d0aad81718b71311fef68a": { + "name": "SNX token contract", + "address": "0x50b728d8d964fd00c2d0aad81718b71311fef68a", + "token": { + "decimals": 18, + "symbol": "SNX" + }, + "isSC": {} + }, + "0xe47dbe919c8ab0c1a1c1e97a1eefc2b946253924": { + "name": "CORE token contract", + "address": "0xe47dbe919c8ab0c1a1c1e97a1eefc2b946253924", + "token": { + "decimals": 18, + "symbol": "CORE" + }, + "isSC": {} + }, + "0x314338767151e6ed23db8a41c6f6943c1958ee56": { + "name": "DEC token contract", + "address": "0x314338767151e6ed23db8a41c6f6943c1958ee56", + "token": { + "decimals": 18, + "symbol": "DEC" + }, + "isSC": {} + }, + "0xaf9444bc9d6117121aa108fc6c45835be60e7d07": { + "name": "AAH token contract", + "address": "0xaf9444bc9d6117121aa108fc6c45835be60e7d07", + "token": { + "decimals": 18, + "symbol": "AAH" + }, + "isSC": {} + }, + "0x421e0acea8cd9d4aa2bcedb407726b6a4bffb664": { + "name": "DoTxUNI-V2 token contract", + "address": "0x421e0acea8cd9d4aa2bcedb407726b6a4bffb664", + "token": { + "decimals": 18, + "symbol": "DoTxUNI-V2" + }, + "isSC": {} + }, + "0x422e0cba8e57acc799fc14dadf2b72dfba281c5f": { + "name": "FBIRD token contract", + "address": "0x422e0cba8e57acc799fc14dadf2b72dfba281c5f", + "token": { + "decimals": 18, + "symbol": "FBIRD" + }, + "isSC": {} + }, + "0x8dc302e2141da59c934d900886dbf1518fd92cd4": { + "name": "POLS token contract", + "address": "0x8dc302e2141da59c934d900886dbf1518fd92cd4", + "token": { + "decimals": 18, + "symbol": "POLS" + }, + "isSC": {} + }, + "0xa0e390e9cea0d0e8cd40048ced9fa9ea10d71639": { + "name": "DSLA token contract", + "address": "0xa0e390e9cea0d0e8cd40048ced9fa9ea10d71639", + "token": { + "decimals": 18, + "symbol": "DSLA" + }, + "isSC": {} + }, + "0xc26d47d5c33ac71ac5cf9f776d63ba292a4f7842": { + "name": "BNT token contract", + "address": "0xc26d47d5c33ac71ac5cf9f776d63ba292a4f7842", + "token": { + "decimals": 18, + "symbol": "BNT" + }, + "isSC": {} + }, + "0x7b38c0d5dfc91d0a3fef2f8dab3be404c1f61fa4": { + "name": "RSR token contract", + "address": "0x7b38c0d5dfc91d0a3fef2f8dab3be404c1f61fa4", + "token": { + "decimals": 18, + "symbol": "RSR" + }, + "isSC": {} + }, + "0xe7f960685aba7327ada3b161ea252703c87be0bf": { + "name": "BLUE token contract", + "address": "0xe7f960685aba7327ada3b161ea252703c87be0bf", + "token": { + "decimals": 8, + "symbol": "BLUE" + }, + "isSC": {} + }, + "0x45c27821e80f8789b60fd8b600c73815d34dda6c": { + "name": "API3 token contract", + "address": "0x45c27821e80f8789b60fd8b600c73815d34dda6c", + "token": { + "decimals": 18, + "symbol": "API3" + }, + "isSC": {} + }, + "0x8346ab8d5ea7a9db0209aed2d1806afa0e2c4c21": { + "name": "MOD token contract", + "address": "0x8346ab8d5ea7a9db0209aed2d1806afa0e2c4c21", + "token": { + "decimals": 18, + "symbol": "MOD" + }, + "isSC": {} + }, + "0x42435f467d33e5c4146a4e8893976ef12bbce762": { + "name": "DEFI5 token contract", + "address": "0x42435f467d33e5c4146a4e8893976ef12bbce762", + "token": { + "decimals": 18, + "symbol": "DEFI5" + }, + "isSC": {} + }, + "0x780053837ce2ceead2a90d9151aa21fc89ed49c2": { + "name": "RARI token contract", + "address": "0x780053837ce2ceead2a90d9151aa21fc89ed49c2", + "token": { + "decimals": 18, + "symbol": "RARI" + }, + "isSC": {} + }, + "0x29a13af916fe709b10029b578c94759675c9e91e": { + "name": "ROOM token contract", + "address": "0x29a13af916fe709b10029b578c94759675c9e91e", + "token": { + "decimals": 18, + "symbol": "ROOM" + }, + "isSC": {} + }, + "0x5eb8d998371971d01954205c7afe90a7af6a95ac": { + "name": "AUDIO token contract", + "address": "0x5eb8d998371971d01954205c7afe90a7af6a95ac", + "token": { + "decimals": 18, + "symbol": "AUDIO" + }, + "isSC": {} + }, + "0xa1428174f516f527fafdd146b883bb4428682737": { + "name": "SUPER token contract", + "address": "0xa1428174f516f527fafdd146b883bb4428682737", + "token": { + "decimals": 18, + "symbol": "SUPER" + }, + "isSC": {} + }, + "0xdae89da41a96956e9e70320ac9c0dd077070d3a5": { + "name": "CNTR token contract", + "address": "0xdae89da41a96956e9e70320ac9c0dd077070d3a5", + "token": { + "decimals": 18, + "symbol": "CNTR" + }, + "isSC": {} + }, + "0xecf8f2fa183b1c4d2a269bf98a54fce86c812d3e": { + "name": "CFi token contract", + "address": "0xecf8f2fa183b1c4d2a269bf98a54fce86c812d3e", + "token": { + "decimals": 18, + "symbol": "CFi" + }, + "isSC": {} + }, + "0x50a4a434247089848991dd8f09b889d4e2870ab6": { + "name": "TBTC token contract", + "address": "0x50a4a434247089848991dd8f09b889d4e2870ab6", + "token": { + "decimals": 18, + "symbol": "TBTC" + }, + "isSC": {} + }, + "0x42f37a1296b2981f7c3caced84c5096b2eb0c72c": { + "name": "KEEP token contract", + "address": "0x42f37a1296b2981f7c3caced84c5096b2eb0c72c", + "token": { + "decimals": 18, + "symbol": "KEEP" + }, + "isSC": {} + }, + "0x87c830b6d732c3209db97f61b379f359570d6a49": { + "name": "SPCY token contract", + "address": "0x87c830b6d732c3209db97f61b379f359570d6a49", + "token": { + "decimals": 18, + "symbol": "SPCY" + }, + "isSC": {} + }, + "0xb75bbd79985a8092b05224f62d7fed25924b075d": { + "name": "DAM token contract", + "address": "0xb75bbd79985a8092b05224f62d7fed25924b075d", + "token": { + "decimals": 18, + "symbol": "DAM" + }, + "isSC": {} + }, + "0xe117837c0c8a53765cb6b4a16ebc84b3a71dd0bd": { + "name": "ZEFU token contract", + "address": "0xe117837c0c8a53765cb6b4a16ebc84b3a71dd0bd", + "token": { + "decimals": 18, + "symbol": "ZEFU" + }, + "isSC": {} + }, + "0x00e5646f60ac6fb446f621d146b6e1886f002905": { + "name": "RAI token contract", + "address": "0x00e5646f60ac6fb446f621d146b6e1886f002905", + "token": { + "decimals": 18, + "symbol": "RAI" + }, + "isSC": {} + }, + "0x24834bbec7e39ef42f4a75eaf8e5b6486d3f0e57": { + "name": "LUNA token contract", + "address": "0x24834bbec7e39ef42f4a75eaf8e5b6486d3f0e57", + "token": { + "decimals": 18, + "symbol": "LUNA" + }, + "isSC": {} + }, + "0xfc42e9996973ac2e0ff1055762e78cfaf0061188": { + "name": "PTF token contract", + "address": "0xfc42e9996973ac2e0ff1055762e78cfaf0061188", + "token": { + "decimals": 18, + "symbol": "PTF" + }, + "isSC": {} + }, + "0xe82808eaa78339b06a691fd92e1be79671cad8d3": { + "name": "PLOT token contract", + "address": "0xe82808eaa78339b06a691fd92e1be79671cad8d3", + "token": { + "decimals": 18, + "symbol": "PLOT" + }, + "isSC": {} + }, + "0x434b5acf47e2883fc83d326d69f32965945c1f3d": { + "name": "ROCKS token contract", + "address": "0x434b5acf47e2883fc83d326d69f32965945c1f3d", + "token": { + "decimals": 18, + "symbol": "ROCKS" + }, + "isSC": {} + }, + "0x5fe2b58c013d7601147dcdd68c143a77499f5531": { + "name": "GRT token contract", + "address": "0x5fe2b58c013d7601147dcdd68c143a77499f5531", + "token": { + "decimals": 18, + "symbol": "GRT" + }, + "isSC": {} + }, + "0x62414d03084eeb269e18c970a21f45d2967f0170": { + "name": "OMG token contract", + "address": "0x62414d03084eeb269e18c970a21f45d2967f0170", + "token": { + "decimals": 18, + "symbol": "OMG" + }, + "isSC": {} + }, + "0x1a47e3316282d57df146f87c58a1fb4b26992bbf": { + "name": "BMI token contract", + "address": "0x1a47e3316282d57df146f87c58a1fb4b26992bbf", + "token": { + "decimals": 18, + "symbol": "BMI" + }, + "isSC": {} + }, + "0xecae5e66d7f2bae250dff839216a01c2702adffd": { + "name": "XOR token contract", + "address": "0xecae5e66d7f2bae250dff839216a01c2702adffd", + "token": { + "decimals": 18, + "symbol": "XOR" + }, + "isSC": {} + }, + "0x4fdce518fe527439fe76883e6b51a1c522b61b7c": { + "name": "COR token contract", + "address": "0x4fdce518fe527439fe76883e6b51a1c522b61b7c", + "token": { + "decimals": 18, + "symbol": "COR" + }, + "isSC": {} + }, + "0x0f92d459b20d21f6bf9e02056ea9165d3f78ba62": { + "name": "CUM token contract", + "address": "0x0f92d459b20d21f6bf9e02056ea9165d3f78ba62", + "token": { + "decimals": 18, + "symbol": "CUM" + }, + "isSC": {} + }, + "0x6abb753c1893194de4a83c6e8b4eadfc105fd5f5": { + "name": "SXP token contract", + "address": "0x6abb753c1893194de4a83c6e8b4eadfc105fd5f5", + "token": { + "decimals": 18, + "symbol": "SXP" + }, + "isSC": {} + }, + "0x7cdc0421469398e0f3aa8890693d86c840ac8931": { + "name": "AZUKI token contract", + "address": "0x7cdc0421469398e0f3aa8890693d86c840ac8931", + "token": { + "decimals": 18, + "symbol": "AZUKI" + }, + "isSC": {} + }, + "0x7fbc10850cae055b27039af31bd258430e714c62": { + "name": "UBT token contract", + "address": "0x7fbc10850cae055b27039af31bd258430e714c62", + "token": { + "decimals": 8, + "symbol": "UBT" + }, + "isSC": {} + }, + "0x46f48fbdedaa6f5500993bede9539ef85f4bee8e": { + "name": "ARIA20 token contract", + "address": "0x46f48fbdedaa6f5500993bede9539ef85f4bee8e", + "token": { + "decimals": 18, + "symbol": "ARIA20" + }, + "isSC": {} + }, + "0x85955046df4668e1dd369d2de9f3aeb98dd2a369": { + "name": "DPI token contract", + "address": "0x85955046df4668e1dd369d2de9f3aeb98dd2a369", + "token": { + "decimals": 18, + "symbol": "DPI" + }, + "isSC": {} + }, + "0xaecebfcf604ad245eaf0d5bd68459c3a7a6399c2": { + "name": "RAMP token contract", + "address": "0xaecebfcf604ad245eaf0d5bd68459c3a7a6399c2", + "token": { + "decimals": 18, + "symbol": "RAMP" + }, + "isSC": {} + }, + "0x5b0a0cd03e9df1829e00128ebe277cc3247da346": { + "name": "BFLY token contract", + "address": "0x5b0a0cd03e9df1829e00128ebe277cc3247da346", + "token": { + "decimals": 18, + "symbol": "BFLY" + }, + "isSC": {} + }, + "0x67ce67ec4fcd4aca0fcb738dd080b2a21ff69d75": { + "name": "CHSB token contract", + "address": "0x67ce67ec4fcd4aca0fcb738dd080b2a21ff69d75", + "token": { + "decimals": 8, + "symbol": "CHSB" + }, + "isSC": {} + }, + "0xa38735c2be496a0c2d4fe32c7459c1d391501035": { + "name": "TRND token contract", + "address": "0xa38735c2be496a0c2d4fe32c7459c1d391501035", + "token": { + "decimals": 18, + "symbol": "TRND" + }, + "isSC": {} + }, + "0xbb6c356bdc5c258cb4e39c112d68fb6a9a9f6e26": { + "name": "TME token contract", + "address": "0xbb6c356bdc5c258cb4e39c112d68fb6a9a9f6e26", + "token": { + "decimals": 18, + "symbol": "TME" + }, + "isSC": {} + }, + "0x5667dcc0ab74d1b1355c3b2061893399331b57e2": { + "name": "TVK token contract", + "address": "0x5667dcc0ab74d1b1355c3b2061893399331b57e2", + "token": { + "decimals": 18, + "symbol": "TVK" + }, + "isSC": {} + }, + "0xdfe5bed8d271a4cd89cd2066839b2b0ec934a6e8": { + "name": "myFTHR token contract", + "address": "0xdfe5bed8d271a4cd89cd2066839b2b0ec934a6e8", + "token": { + "decimals": 4, + "symbol": "myFTHR" + }, + "isSC": {} + }, + "0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f": { + "name": "1INCH token contract", + "address": "0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f", + "token": { + "decimals": 18, + "symbol": "1INCH" + }, + "isSC": {} + }, + "0xc8c511fe3edba60bc1049a88060468c2ea2d6358": { + "name": "STEEL token contract", + "address": "0xc8c511fe3edba60bc1049a88060468c2ea2d6358", + "token": { + "decimals": 0, + "symbol": "STEEL" + }, + "isSC": {} + }, + "0xbe319a08ebe5da37c5a8ce8a0d8463ff6750e53b": { + "name": "ARDU token contract", + "address": "0xbe319a08ebe5da37c5a8ce8a0d8463ff6750e53b", + "token": { + "decimals": 18, + "symbol": "ARDU" + }, + "isSC": {} + }, + "0x5b4cf2c120a9702225814e18543ee658c5f8631e": { + "name": "UFT token contract", + "address": "0x5b4cf2c120a9702225814e18543ee658c5f8631e", + "token": { + "decimals": 18, + "symbol": "UFT" + }, + "isSC": {} + }, + "0x349f96f489ed4e73e6c118ed2d568343c9ee7cec": { + "name": "OMCH token contract", + "address": "0x349f96f489ed4e73e6c118ed2d568343c9ee7cec", + "token": { + "decimals": 18, + "symbol": "OMCH" + }, + "isSC": {} + }, + "0xd55fce7cdab84d84f2ef3f99816d765a2a94a509": { + "name": "CHAIN token contract", + "address": "0xd55fce7cdab84d84f2ef3f99816d765a2a94a509", + "token": { + "decimals": 18, + "symbol": "CHAIN" + }, + "isSC": {} + }, + "0xc3cffdaf8f3fdf07da6d5e3a89b8723d5e385ff8": { + "name": "RBC token contract", + "address": "0xc3cffdaf8f3fdf07da6d5e3a89b8723d5e385ff8", + "token": { + "decimals": 18, + "symbol": "RBC" + }, + "isSC": {} + }, + "0x068180071617528606371c31892ecbf2b70ac1d2": { + "name": "SPI token contract", + "address": "0x068180071617528606371c31892ecbf2b70ac1d2", + "token": { + "decimals": 18, + "symbol": "SPI" + }, + "isSC": {} + }, + "0x1e42edbe5376e717c1b22904c59e406426e8173f": { + "name": "SURF token contract", + "address": "0x1e42edbe5376e717c1b22904c59e406426e8173f", + "token": { + "decimals": 18, + "symbol": "SURF" + }, + "isSC": {} + }, + "0xfd6cf3a1fcb42371fd7e69633d31303868b8171a": { + "name": "OMNIUNIT token contract", + "address": "0xfd6cf3a1fcb42371fd7e69633d31303868b8171a", + "token": { + "decimals": 18, + "symbol": "OMNIUNIT" + }, + "isSC": {} + }, + "0x5c7f7fe4766fe8f0fa9b41e2e4194d939488ff1c": { + "name": "DOKI token contract", + "address": "0x5c7f7fe4766fe8f0fa9b41e2e4194d939488ff1c", + "token": { + "decimals": 18, + "symbol": "DOKI" + }, + "isSC": {} + }, + "0x033d942a6b495c4071083f4cde1f17e986fe856c": { + "name": "AGA token contract", + "address": "0x033d942a6b495c4071083f4cde1f17e986fe856c", + "token": { + "decimals": 4, + "symbol": "AGA" + }, + "isSC": {} + }, + "0x13405cc33ffae0a9f91febb66b6b85a9c54da13a": { + "name": "DOGEFI token contract", + "address": "0x13405cc33ffae0a9f91febb66b6b85a9c54da13a", + "token": { + "decimals": 18, + "symbol": "DOGEFI" + }, + "isSC": {} + }, + "0x5e648d09170c346dd27df9db332591e4faa6a844": { + "name": "SYNC token contract", + "address": "0x5e648d09170c346dd27df9db332591e4faa6a844", + "token": { + "decimals": 18, + "symbol": "SYNC" + }, + "isSC": {} + }, + "0x418839451873b0e69e628f95dc39a877a9715196": { + "name": "NFTX token contract", + "address": "0x418839451873b0e69e628f95dc39a877a9715196", + "token": { + "decimals": 18, + "symbol": "NFTX" + }, + "isSC": {} + }, + "0x147697003255510f6431a44443e67b227109832e": { + "name": "RFuel token contract", + "address": "0x147697003255510f6431a44443e67b227109832e", + "token": { + "decimals": 18, + "symbol": "RFuel" + }, + "isSC": {} + }, + "0xcbab27b2d5b468eea509bd430100922341bc3f1a": { + "name": "WPR token contract", + "address": "0xcbab27b2d5b468eea509bd430100922341bc3f1a", + "token": { + "decimals": 18, + "symbol": "WPR" + }, + "isSC": {} + }, + "0x2727ab1c2d22170abc9b595177b2d5c6e1ab7b7b": { + "name": "CTSI token contract", + "address": "0x2727ab1c2d22170abc9b595177b2d5c6e1ab7b7b", + "token": { + "decimals": 18, + "symbol": "CTSI" + }, + "isSC": {} + }, + "0x8f3dc8321cba3abe08fb29055a0a10dc79223252": { + "name": "N3RDz token contract", + "address": "0x8f3dc8321cba3abe08fb29055a0a10dc79223252", + "token": { + "decimals": 18, + "symbol": "N3RDz" + }, + "isSC": {} + }, + "0xc73a8f11ec303ed81000ac5eae94bf2d65b67dd6": { + "name": "SERGS token contract", + "address": "0xc73a8f11ec303ed81000ac5eae94bf2d65b67dd6", + "token": { + "decimals": 18, + "symbol": "SERGS" + }, + "isSC": {} + }, + "0x596ebe76e2db4470966ea395b0d063ac6197a8c5": { + "name": "JRT token contract", + "address": "0x596ebe76e2db4470966ea395b0d063ac6197a8c5", + "token": { + "decimals": 18, + "symbol": "JRT" + }, + "isSC": {} + }, + "0x81c88f5cff4fd506df906cb32f8b02218701b0c7": { + "name": "LOAD token contract", + "address": "0x81c88f5cff4fd506df906cb32f8b02218701b0c7", + "token": { + "decimals": 8, + "symbol": "LOAD" + }, + "isSC": {} + }, + "0xe86e8beb7340659dddce61727e500e3a5ad75a90": { + "name": "ZUT token contract", + "address": "0xe86e8beb7340659dddce61727e500e3a5ad75a90", + "token": { + "decimals": 18, + "symbol": "ZUT" + }, + "isSC": {} + }, + "0x13607aa9b2ffdd8340f4628049bd35c02a68fa05": { + "name": "PPBLZ token contract", + "address": "0x13607aa9b2ffdd8340f4628049bd35c02a68fa05", + "token": { + "decimals": 18, + "symbol": "PPBLZ" + }, + "isSC": {} + }, + "0x0f40d69ff494a9e74b1f20a89eff299b2a05918f": { + "name": "BNTY token contract", + "address": "0x0f40d69ff494a9e74b1f20a89eff299b2a05918f", + "token": { + "decimals": 18, + "symbol": "BNTY" + }, + "isSC": {} + }, + "0x29b9c200b27683fea3512911dafaf0afd60da4e3": { + "name": "BCM token contract", + "address": "0x29b9c200b27683fea3512911dafaf0afd60da4e3", + "token": { + "decimals": 18, + "symbol": "BCM" + }, + "isSC": {} + }, + "0x9bd3b7c3dcc24708cbf122523546ee5c6caefce8": { + "name": "YELD token contract", + "address": "0x9bd3b7c3dcc24708cbf122523546ee5c6caefce8", + "token": { + "decimals": 18, + "symbol": "YELD" + }, + "isSC": {} + }, + "0x3e121107f6f22da4911079845a470757af4e1a1b": { + "name": "FXS token contract", + "address": "0x3e121107f6f22da4911079845a470757af4e1a1b", + "token": { + "decimals": 18, + "symbol": "FXS" + }, + "isSC": {} + }, + "0x24627609f3b7a01fc5a99d71067d4a28778d2b7a": { + "name": "SPIRIT token contract", + "address": "0x24627609f3b7a01fc5a99d71067d4a28778d2b7a", + "token": { + "decimals": 15, + "symbol": "SPIRIT" + }, + "isSC": {} + }, + "0xa383abd0fe30fa2b781c0b454bfcc0475c6c8844": { + "name": "REEF token contract", + "address": "0xa383abd0fe30fa2b781c0b454bfcc0475c6c8844", + "token": { + "decimals": 18, + "symbol": "REEF" + }, + "isSC": {} + }, + "0x3ef402af15eeb3c80b4441e60913f31a5c41e077": { + "name": "DoTx token contract", + "address": "0x3ef402af15eeb3c80b4441e60913f31a5c41e077", + "token": { + "decimals": 18, + "symbol": "DoTx" + }, + "isSC": {} + }, + "0x104592a158490a9228070e0a8e5343b499e125d0": { + "name": "FRAX token contract", + "address": "0x104592a158490a9228070e0a8e5343b499e125d0", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {} + }, + "0x2f128a29f2b070a68d92777ebbc0b1e8b1d5bcd0": { + "name": "LOG token contract", + "address": "0x2f128a29f2b070a68d92777ebbc0b1e8b1d5bcd0", + "token": { + "decimals": 18, + "symbol": "LOG" + }, + "isSC": {} + }, + "0x9377eeb7419486fd4d485671d50baa4bf77c2222": { + "name": "PRQ token contract", + "address": "0x9377eeb7419486fd4d485671d50baa4bf77c2222", + "token": { + "decimals": 18, + "symbol": "PRQ" + }, + "isSC": {} + }, + "0x902742e3c5169657b1028977371cdf2c1608f67a": { + "name": "HYDRO token contract", + "address": "0x902742e3c5169657b1028977371cdf2c1608f67a", + "token": { + "decimals": 18, + "symbol": "HYDRO" + }, + "isSC": {} + }, + "0x21389a523b3a9f39bb3a4065572994455faf59e8": { + "name": "ROT token contract", + "address": "0x21389a523b3a9f39bb3a4065572994455faf59e8", + "token": { + "decimals": 18, + "symbol": "ROT" + }, + "isSC": {} + }, + "0xd6c914bb2fca4bcb6644d01c4cf690c34a166e13": { + "name": "ViFi token contract", + "address": "0xd6c914bb2fca4bcb6644d01c4cf690c34a166e13", + "token": { + "decimals": 18, + "symbol": "ViFi" + }, + "isSC": {} + }, + "0xb140665dde25c644c6b418e417c930de8a8a6ac9": { + "name": "ATRI token contract", + "address": "0xb140665dde25c644c6b418e417c930de8a8a6ac9", + "token": { + "decimals": 0, + "symbol": "ATRI" + }, + "isSC": {} + }, + "0x6c222361b1407c196f740c1bffc17d1770bfd55c": { + "name": "CORDBRIDGE token contract", + "address": "0x6c222361b1407c196f740c1bffc17d1770bfd55c", + "token": { + "decimals": 18, + "symbol": "CORDBRIDGE" + }, + "isSC": {} + }, + "0x083bdf826f6a7419d3cef30b9e338316224c8e8b": { + "name": "DAOfi token contract", + "address": "0x083bdf826f6a7419d3cef30b9e338316224c8e8b", + "token": { + "decimals": 18, + "symbol": "DAOfi" + }, + "isSC": {} + }, + "0x4016489b230980fd43511e28e7fb91ed795c90c5": { + "name": "KARMA token contract", + "address": "0x4016489b230980fd43511e28e7fb91ed795c90c5", + "token": { + "decimals": 4, + "symbol": "KARMA" + }, + "isSC": {} + }, + "0xd617a689f1b8d3b27d51cf7789f18bd43d8c1706": { + "name": "KOIN token contract", + "address": "0xd617a689f1b8d3b27d51cf7789f18bd43d8c1706", + "token": { + "decimals": 8, + "symbol": "KOIN" + }, + "isSC": {} + }, + "0x048c83a1176a1d3d12cb8c305179d360b1e4c958": { + "name": "DAO token contract", + "address": "0x048c83a1176a1d3d12cb8c305179d360b1e4c958", + "token": { + "decimals": 18, + "symbol": "DAO" + }, + "isSC": {} + }, + "0xb272b6d99858b0efb079946942006727fe105201": { + "name": "XPb token contract", + "address": "0xb272b6d99858b0efb079946942006727fe105201", + "token": { + "decimals": 18, + "symbol": "XPb" + }, + "isSC": {} + }, + "0x53aec293212e3b792563bc16f1be26956adb12e9": { + "name": "KP3R token contract", + "address": "0x53aec293212e3b792563bc16f1be26956adb12e9", + "token": { + "decimals": 18, + "symbol": "KP3R" + }, + "isSC": {} + }, + "0x088c9b7fc7d1e8f36028996236c9993bdf25ac3e": { + "name": "FUEGO token contract", + "address": "0x088c9b7fc7d1e8f36028996236c9993bdf25ac3e", + "token": { + "decimals": 18, + "symbol": "FUEGO" + }, + "isSC": {} + }, + "0xf2b5a8c37278bcdd50727d5ca879f8e5a4642e2e": { + "name": "MEME token contract", + "address": "0xf2b5a8c37278bcdd50727d5ca879f8e5a4642e2e", + "token": { + "decimals": 8, + "symbol": "MEME" + }, + "isSC": {} + }, + "0xb371248dd0f9e4061ccf8850e9223ca48aa7ca4b": { + "name": "HNY token contract", + "address": "0xb371248dd0f9e4061ccf8850e9223ca48aa7ca4b", + "token": { + "decimals": 18, + "symbol": "HNY" + }, + "isSC": {} + }, + "0xaf95c20c60b49ad88024d8e77858900d9f2c98bc": { + "name": "ETM token contract", + "address": "0xaf95c20c60b49ad88024d8e77858900d9f2c98bc", + "token": { + "decimals": 18, + "symbol": "ETM" + }, + "isSC": {} + }, + "0xde4e5b3672c4077b69216b77d99d8ec35ec6c31a": { + "name": "DONUT token contract", + "address": "0xde4e5b3672c4077b69216b77d99d8ec35ec6c31a", + "token": { + "decimals": 18, + "symbol": "DONUT" + }, + "isSC": {} + }, + "0xee7666aacaefaa6efeef62ea40176d3eb21953b9": { + "name": "MCHC token contract", + "address": "0xee7666aacaefaa6efeef62ea40176d3eb21953b9", + "token": { + "decimals": 18, + "symbol": "MCHC" + }, + "isSC": {} + }, + "0x6ae7dfc73e0dde2aa99ac063dcf7e8a63265108c": { + "name": "JPYC token contract", + "address": "0x6ae7dfc73e0dde2aa99ac063dcf7e8a63265108c", + "token": { + "decimals": 18, + "symbol": "JPYC" + }, + "isSC": {} + }, + "0x24f82ae063f165d621b2aec10714eb989c51938a": { + "name": "PIXEL token contract", + "address": "0x24f82ae063f165d621b2aec10714eb989c51938a", + "token": { + "decimals": 4, + "symbol": "PIXEL" + }, + "isSC": {} + }, + "0x034b2090b579228482520c589dbd397c53fc51cc": { + "name": "VISION token contract", + "address": "0x034b2090b579228482520c589dbd397c53fc51cc", + "token": { + "decimals": 18, + "symbol": "VISION" + }, + "isSC": {} + }, + "0x8e600198218aeaeb6a4b4f84771df8b38930ddce": { + "name": "MNE token contract", + "address": "0x8e600198218aeaeb6a4b4f84771df8b38930ddce", + "token": { + "decimals": 8, + "symbol": "MNE" + }, + "isSC": {} + }, + "0xcd0d64c971af8b477042130c5e6cd2a6f7842869": { + "name": "BZN token contract", + "address": "0xcd0d64c971af8b477042130c5e6cd2a6f7842869", + "token": { + "decimals": 18, + "symbol": "BZN" + }, + "isSC": {} + }, + "0x0621d647cecbfb64b79e44302c1933cb4f27054d": { + "name": "AMP token contract", + "address": "0x0621d647cecbfb64b79e44302c1933cb4f27054d", + "token": { + "decimals": 18, + "symbol": "AMP" + }, + "isSC": {} + }, + "0xd85d1e945766fea5eda9103f918bd915fbca63e6": { + "name": "CEL token contract", + "address": "0xd85d1e945766fea5eda9103f918bd915fbca63e6", + "token": { + "decimals": 4, + "symbol": "CEL" + }, + "isSC": {} + }, + "0x840195888db4d6a99ed9f73fcd3b225bb3cb1a79": { + "name": "SX token contract", + "address": "0x840195888db4d6a99ed9f73fcd3b225bb3cb1a79", + "token": { + "decimals": 18, + "symbol": "SX" + }, + "isSC": {} + }, + "0x03247a4368a280bec8133300cd930a3a61d604f6": { + "name": "RBAL token contract", + "address": "0x03247a4368a280bec8133300cd930a3a61d604f6", + "token": { + "decimals": 18, + "symbol": "RBAL" + }, + "isSC": {} + }, + "0xbe32718f77aa63d95658ddd8ef472039c71eb704": { + "name": "CHERRY token contract", + "address": "0xbe32718f77aa63d95658ddd8ef472039c71eb704", + "token": { + "decimals": 4, + "symbol": "CHERRY" + }, + "isSC": {} + }, + "0x01fa5b3a5d77bcf705dd505bbcbb34bce310e7fe": { + "name": "AXI token contract", + "address": "0x01fa5b3a5d77bcf705dd505bbcbb34bce310e7fe", + "token": { + "decimals": 18, + "symbol": "AXI" + }, + "isSC": {} + }, + "0x80e3e8f5d06cbef73c12e6bdc2f63563fe57f866": { + "name": "DEFLCT token contract", + "address": "0x80e3e8f5d06cbef73c12e6bdc2f63563fe57f866", + "token": { + "decimals": 9, + "symbol": "DEFLCT" + }, + "isSC": {} + }, + "0xe951e4c7b0b91447c1a0a46bfb46630682a3f229": { + "name": "DEV token contract", + "address": "0xe951e4c7b0b91447c1a0a46bfb46630682a3f229", + "token": { + "decimals": 8, + "symbol": "DEV" + }, + "isSC": {} + }, + "0x043a3aa319b563ac25d4e342d32bffb51298db7b": { + "name": "SWG token contract", + "address": "0x043a3aa319b563ac25d4e342d32bffb51298db7b", + "token": { + "decimals": 18, + "symbol": "SWG" + }, + "isSC": {} + }, + "0xe0011abab503659c48a07d44561a7ef077b1ad56": { + "name": "SPRING token contract", + "address": "0xe0011abab503659c48a07d44561a7ef077b1ad56", + "token": { + "decimals": 18, + "symbol": "SPRING" + }, + "isSC": {} + }, + "0x07738eb4ce8932ca961c815cb12c9d4ab5bd0da4": { + "name": "ELET token contract", + "address": "0x07738eb4ce8932ca961c815cb12c9d4ab5bd0da4", + "token": { + "decimals": 18, + "symbol": "ELET" + }, + "isSC": {} + }, + "0xe2d460a2f928cbc4cf3268f8d95dbd89c21202c4": { + "name": "THERA token contract", + "address": "0xe2d460a2f928cbc4cf3268f8d95dbd89c21202c4", + "token": { + "decimals": 18, + "symbol": "THERA" + }, + "isSC": {} + }, + "0x127984b5e6d5c59f81dacc9f1c8b3bdc8494572e": { + "name": "PPDEX token contract", + "address": "0x127984b5e6d5c59f81dacc9f1c8b3bdc8494572e", + "token": { + "decimals": 18, + "symbol": "PPDEX" + }, + "isSC": {} + }, + "0x28e96ffe75cdcc97044585b866bd02bd79c12dc0": { + "name": "JUICE token contract", + "address": "0x28e96ffe75cdcc97044585b866bd02bd79c12dc0", + "token": { + "decimals": 6, + "symbol": "JUICE" + }, + "isSC": {} + }, + "0x7b276a55987e3020026bb098f15e968313bd1af2": { + "name": "XKO token contract", + "address": "0x7b276a55987e3020026bb098f15e968313bd1af2", + "token": { + "decimals": 18, + "symbol": "XKO" + }, + "isSC": {} + }, + "0x1f71bc1f88f09ece59e844dea4fcc4fa73934117": { + "name": "DCB token contract", + "address": "0x1f71bc1f88f09ece59e844dea4fcc4fa73934117", + "token": { + "decimals": 18, + "symbol": "DCB" + }, + "isSC": {} + }, + "0x12919a30447ff59947740507362a05b8bea9a6e7": { + "name": "SDARK token contract", + "address": "0x12919a30447ff59947740507362a05b8bea9a6e7", + "token": { + "decimals": 18, + "symbol": "SDARK" + }, + "isSC": {} + }, + "0x2a93172c8dccbfbc60a39d56183b7279a2f647b4": { + "name": "$DG token contract", + "address": "0x2a93172c8dccbfbc60a39d56183b7279a2f647b4", + "token": { + "decimals": 18, + "symbol": "$DG" + }, + "isSC": {} + }, + "0xb6509cbd9e2d1cec787a7357eb1578b86a0c702d": { + "name": "DRK token contract", + "address": "0xb6509cbd9e2d1cec787a7357eb1578b86a0c702d", + "token": { + "decimals": 18, + "symbol": "DRK" + }, + "isSC": {} + }, + "0xad684e79ce4b6d464f2ff7c3fd51646892e24b96": { + "name": "NIOX token contract", + "address": "0xad684e79ce4b6d464f2ff7c3fd51646892e24b96", + "token": { + "decimals": 4, + "symbol": "NIOX" + }, + "isSC": {} + }, + "0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c": { + "name": "HEX token contract", + "address": "0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c", + "token": { + "decimals": 8, + "symbol": "HEX" + }, + "isSC": {} + }, + "0x066028738ce85aa1946b9d05b1d0f06f3d0fdb7a": { + "name": "pDARK token contract", + "address": "0x066028738ce85aa1946b9d05b1d0f06f3d0fdb7a", + "token": { + "decimals": 18, + "symbol": "pDARK" + }, + "isSC": {} + }, + "0x7ff2fc33e161e3b1c6511b934f0209d304267857": { + "name": "OPU token contract", + "address": "0x7ff2fc33e161e3b1c6511b934f0209d304267857", + "token": { + "decimals": 18, + "symbol": "OPU" + }, + "isSC": {} + }, + "0x1683767b3e3a40a61d9faa94cf86e5788f0a834a": { + "name": "BRND token contract", + "address": "0x1683767b3e3a40a61d9faa94cf86e5788f0a834a", + "token": { + "decimals": 18, + "symbol": "BRND" + }, + "isSC": {} + }, + "0x52af6aa779f36a53de44ae1969756a506b2577b5": { + "name": "ERNE token contract", + "address": "0x52af6aa779f36a53de44ae1969756a506b2577b5", + "token": { + "decimals": 18, + "symbol": "ERNE" + }, + "isSC": {} + }, + "0x7d836da4dd2afda1d09992980569e22597f09981": { + "name": "FDZ token contract", + "address": "0x7d836da4dd2afda1d09992980569e22597f09981", + "token": { + "decimals": 18, + "symbol": "FDZ" + }, + "isSC": {} + }, + "0xcf46c5bf01deae14a272f89a7b6c9e96a48f5546": { + "name": "MCB token contract", + "address": "0xcf46c5bf01deae14a272f89a7b6c9e96a48f5546", + "token": { + "decimals": 18, + "symbol": "MCB" + }, + "isSC": {} + }, + "0xc10aacff41af60bfcfaba3a03099c4aedb113e15": { + "name": "GFT token contract", + "address": "0xc10aacff41af60bfcfaba3a03099c4aedb113e15", + "token": { + "decimals": 0, + "symbol": "GFT" + }, + "isSC": {} + }, + "0x462d8d82c2b2d2ddabf7f8a93928de09d47a5807": { + "name": "BzB token contract", + "address": "0x462d8d82c2b2d2ddabf7f8a93928de09d47a5807", + "token": { + "decimals": 18, + "symbol": "BzB" + }, + "isSC": {} + }, + "0x5a2fdf906ada9353ebe496fa5d351b39f8908d19": { + "name": "ORB token contract", + "address": "0x5a2fdf906ada9353ebe496fa5d351b39f8908d19", + "token": { + "decimals": 2, + "symbol": "ORB" + }, + "isSC": {} + }, + "0xe6fc6c7cb6d2c31b359a49a33ef08ab87f4de7ce": { + "name": "IGG token contract", + "address": "0xe6fc6c7cb6d2c31b359a49a33ef08ab87f4de7ce", + "token": { + "decimals": 6, + "symbol": "IGG" + }, + "isSC": {} + }, + "0x3f99009295dedd768f7284afe07cdfed70c3e3ac": { + "name": "DARK token contract", + "address": "0x3f99009295dedd768f7284afe07cdfed70c3e3ac", + "token": { + "decimals": 18, + "symbol": "DARK" + }, + "isSC": {} + }, + "0xc576e8bb0017affc2cb245609e304e57401ee78a": { + "name": "TBUX token contract", + "address": "0xc576e8bb0017affc2cb245609e304e57401ee78a", + "token": { + "decimals": 18, + "symbol": "TBUX" + }, + "isSC": {} + }, + "0x3cd92be3be24daf6d03c46863f868f82d74905ba": { + "name": "SPN token contract", + "address": "0x3cd92be3be24daf6d03c46863f868f82d74905ba", + "token": { + "decimals": 6, + "symbol": "SPN" + }, + "isSC": {} + }, + "0x578360adf0bbb2f10ec9cec7ef89ef495511ed5f": { + "name": "KIWI token contract", + "address": "0x578360adf0bbb2f10ec9cec7ef89ef495511ed5f", + "token": { + "decimals": 8, + "symbol": "KIWI" + }, + "isSC": {} + }, + "0x71b821aa52a49f32eed535fca6eb5aa130085978": { + "name": "0xBTC token contract", + "address": "0x71b821aa52a49f32eed535fca6eb5aa130085978", + "token": { + "decimals": 8, + "symbol": "0xBTC" + }, + "isSC": {} + }, + "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4": { + "name": "MANA token contract", + "address": "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4", + "token": { + "decimals": 18, + "symbol": "MANA" + }, + "isSC": {} + }, + "0xda537104d6a5edd53c6fbba9a898708e465260b6": { + "name": "YFI token contract", + "address": "0xda537104d6a5edd53c6fbba9a898708e465260b6", + "token": { + "decimals": 18, + "symbol": "YFI" + }, + "isSC": {} + }, + "0x313d009888329c9d1cf4f75ca3f32566335bd604": { + "name": "LEND token contract", + "address": "0x313d009888329c9d1cf4f75ca3f32566335bd604", + "token": { + "decimals": 18, + "symbol": "LEND" + }, + "isSC": {} + }, + "0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c": { + "name": "COMP token contract", + "address": "0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c", + "token": { + "decimals": 18, + "symbol": "COMP" + }, + "isSC": {} + }, + "0xeffdcb49c2d0ef813764b709ca3c6fe71f230e3e": { + "name": "DERC20 token contract", + "address": "0xeffdcb49c2d0ef813764b709ca3c6fe71f230e3e", + "token": { + "decimals": 18, + "symbol": "DERC20" + }, + "isSC": {} + }, + "0x5adf17a97ef5db18ad4cfc4b3f05128b922e0a58": { + "name": "ETHS token contract", + "address": "0x5adf17a97ef5db18ad4cfc4b3f05128b922e0a58", + "token": { + "decimals": 18, + "symbol": "ETHS" + }, + "isSC": {} + }, + "0x81a9d2eced101479fad8c9663f4a997fbe5c83ca": { + "name": "BTZC token contract", + "address": "0x81a9d2eced101479fad8c9663f4a997fbe5c83ca", + "token": { + "decimals": 6, + "symbol": "BTZC" + }, + "isSC": {} + }, + "0x02daefc2e8aad089d094579499508398e3057966": { + "name": "SHIP20T5 token contract", + "address": "0x02daefc2e8aad089d094579499508398e3057966", + "token": { + "decimals": 18, + "symbol": "SHIP20T5" + }, + "isSC": {} + }, + "0x30810b6e871f333ea6935b21871cde070921bc38": { + "name": "O4A token contract", + "address": "0x30810b6e871f333ea6935b21871cde070921bc38", + "token": { + "decimals": 36, + "symbol": "O4A" + }, + "isSC": {} + }, + "0xa554e5a79caebfeae867c66a56a951338f748c8a": { + "name": "CAST token contract", + "address": "0xa554e5a79caebfeae867c66a56a951338f748c8a", + "token": { + "decimals": 8, + "symbol": "CAST" + }, + "isSC": {} + }, + "0x62a3c5d6346a842d24053d871ebe908a78cb46ab": { + "name": "EVEM token contract", + "address": "0x62a3c5d6346a842d24053d871ebe908a78cb46ab", + "token": { + "decimals": 18, + "symbol": "EVEM" + }, + "isSC": {} + }, + "0x5d1245ad0e4f118186042040bb092aba59be4167": { + "name": "WSTOR token contract", + "address": "0x5d1245ad0e4f118186042040bb092aba59be4167", + "token": { + "decimals": 12, + "symbol": "WSTOR" + }, + "isSC": {} + }, + "0x1b9f699c6cb0aa6079f326a11d3c960680eab5d9": { + "name": "WGMI token contract", + "address": "0x1b9f699c6cb0aa6079f326a11d3c960680eab5d9", + "token": { + "decimals": 18, + "symbol": "WGMI" + }, + "isSC": {} + }, + "0xcd966b72cff52dc349089b6b6f5865b5743b4e08": { + "name": "TOMI token contract", + "address": "0xcd966b72cff52dc349089b6b6f5865b5743b4e08", + "token": { + "decimals": 18, + "symbol": "TOMI" + }, + "isSC": {} + }, + "0x6dc1ed4402a9db4956e077876e72d3ac7ba7f47f": { + "name": "ONE token contract", + "address": "0x6dc1ed4402a9db4956e077876e72d3ac7ba7f47f", + "token": { + "decimals": 18, + "symbol": "ONE" + }, + "isSC": {} + }, + "0xd668c5e8a4a837ca95be5e3a8d5bd62f5985390d": { + "name": "XDATA token contract", + "address": "0xd668c5e8a4a837ca95be5e3a8d5bd62f5985390d", + "token": { + "decimals": 18, + "symbol": "XDATA" + }, + "isSC": {} + }, + "0xc7031408c7978da9aca03308cd104cb54e7a2eb3": { + "name": "FEI token contract", + "address": "0xc7031408c7978da9aca03308cd104cb54e7a2eb3", + "token": { + "decimals": 18, + "symbol": "FEI" + }, + "isSC": {} + }, + "0x4c6b65fe93fc9daf413498b88195fafff36dd960": { + "name": "stETH token contract", + "address": "0x4c6b65fe93fc9daf413498b88195fafff36dd960", + "token": { + "decimals": 18, + "symbol": "stETH" + }, + "isSC": {} + }, + "0xb41ec2c036f8a42da384dde6ada79884f8b84b26": { + "name": "TIDAL token contract", + "address": "0xb41ec2c036f8a42da384dde6ada79884f8b84b26", + "token": { + "decimals": 18, + "symbol": "TIDAL" + }, + "isSC": {} + }, + "0x3ebeb3f48f3a16b6a1e1e19b82c09bc8aae5d983": { + "name": "DC token contract", + "address": "0x3ebeb3f48f3a16b6a1e1e19b82c09bc8aae5d983", + "token": { + "decimals": 18, + "symbol": "DC" + }, + "isSC": {} + }, + "0x9fa22bda93a0ecef300928c0358003b63647c5d8": { + "name": "wCUSD token contract", + "address": "0x9fa22bda93a0ecef300928c0358003b63647c5d8", + "token": { + "decimals": 18, + "symbol": "wCUSD" + }, + "isSC": {} + }, + "0x049f12f5a27132d06de128d48a914f6d82d33d23": { + "name": "JulD token contract", + "address": "0x049f12f5a27132d06de128d48a914f6d82d33d23", + "token": { + "decimals": 18, + "symbol": "JulD" + }, + "isSC": {} + }, + "0x03bc3f7affbe592e3f3502cf818aafb93b12334c": { + "name": "JUL token contract", + "address": "0x03bc3f7affbe592e3f3502cf818aafb93b12334c", + "token": { + "decimals": 18, + "symbol": "JUL" + }, + "isSC": {} + }, + "0x057097bd91aa32aa10f5a42ba49637480963dc31": { + "name": "onETH token contract", + "address": "0x057097bd91aa32aa10f5a42ba49637480963dc31", + "token": { + "decimals": 18, + "symbol": "onETH" + }, + "isSC": {} + }, + "0xdab625853c2b35d0a9c6bd8e5a097a664ef4ccfb": { + "name": "eQUAD token contract", + "address": "0xdab625853c2b35d0a9c6bd8e5a097a664ef4ccfb", + "token": { + "decimals": 18, + "symbol": "eQUAD" + }, + "isSC": {} + }, + "0x741b18e6db7a7dc3e686171b99387edc8dac1e32": { + "name": "UFR token contract", + "address": "0x741b18e6db7a7dc3e686171b99387edc8dac1e32", + "token": { + "decimals": 18, + "symbol": "UFR" + }, + "isSC": {} + }, + "0xc8ed802a2cb6240b05b8c310137086bf4bc11b55": { + "name": "PMON token contract", + "address": "0xc8ed802a2cb6240b05b8c310137086bf4bc11b55", + "token": { + "decimals": 18, + "symbol": "PMON" + }, + "isSC": {} + }, + "0xd7671bdce849eabef4da313ccc80e689151ee811": { + "name": "BID token contract", + "address": "0xd7671bdce849eabef4da313ccc80e689151ee811", + "token": { + "decimals": 18, + "symbol": "BID" + }, + "isSC": {} + }, + "0x67480287cb3715d1d9429b38772c71d6e94c16da": { + "name": "UNN token contract", + "address": "0x67480287cb3715d1d9429b38772c71d6e94c16da", + "token": { + "decimals": 18, + "symbol": "UNN" + }, + "isSC": {} + }, + "0x82dcf1df86ada26b2dcd9ba6334cedb8c2448e9e": { + "name": "ALEPH token contract", + "address": "0x82dcf1df86ada26b2dcd9ba6334cedb8c2448e9e", + "token": { + "decimals": 18, + "symbol": "ALEPH" + }, + "isSC": {} + }, + "0xe9949106f0777e7a2e36df891d59583ac94dc896": { + "name": "PAN token contract", + "address": "0xe9949106f0777e7a2e36df891d59583ac94dc896", + "token": { + "decimals": 18, + "symbol": "PAN" + }, + "isSC": {} + }, + "0x3c711f725272b05336b44c5c9dccb9fe2ff42ef4": { + "name": "CHML token contract", + "address": "0x3c711f725272b05336b44c5c9dccb9fe2ff42ef4", + "token": { + "decimals": 18, + "symbol": "CHML" + }, + "isSC": {} + }, + "0x530d954549f3efa00799784bc7fe0c3fed76da19": { + "name": "CVP token contract", + "address": "0x530d954549f3efa00799784bc7fe0c3fed76da19", + "token": { + "decimals": 18, + "symbol": "CVP" + }, + "isSC": {} + }, + "0xd4c1e34187edc72fb6ebf3c4011dee50cabf89c2": { + "name": "EASYX token contract", + "address": "0xd4c1e34187edc72fb6ebf3c4011dee50cabf89c2", + "token": { + "decimals": 18, + "symbol": "EASYX" + }, + "isSC": {} + }, + "0x167ef3603c0b1d52be9a96e3af01aa33097a6ce9": { + "name": "DUST token contract", + "address": "0x167ef3603c0b1d52be9a96e3af01aa33097a6ce9", + "token": { + "decimals": 18, + "symbol": "DUST" + }, + "isSC": {} + }, + "0xc75ea0c71023c14952f3c7b9101ecbbaa14aa27a": { + "name": "NFTI token contract", + "address": "0xc75ea0c71023c14952f3c7b9101ecbbaa14aa27a", + "token": { + "decimals": 18, + "symbol": "NFTI" + }, + "isSC": {} + }, + "0x142107a65d5c29c35129100bf386ba54f67a8668": { + "name": "DFX token contract", + "address": "0x142107a65d5c29c35129100bf386ba54f67a8668", + "token": { + "decimals": 18, + "symbol": "DFX" + }, + "isSC": {} + }, + "0x4ed92a1de77ee2638a2a42be48dd4720b3a2734a": { + "name": "AMPT token contract", + "address": "0x4ed92a1de77ee2638a2a42be48dd4720b3a2734a", + "token": { + "decimals": 18, + "symbol": "AMPT" + }, + "isSC": {} + }, + "0x1b8acaac11250634028cf1735ca958fd46aaf320": { + "name": "WTF token contract", + "address": "0x1b8acaac11250634028cf1735ca958fd46aaf320", + "token": { + "decimals": 18, + "symbol": "WTF" + }, + "isSC": {} + }, + "0x4c1705a7ddaa68fe187363487898705e040dd77e": { + "name": "WILD token contract", + "address": "0x4c1705a7ddaa68fe187363487898705e040dd77e", + "token": { + "decimals": 18, + "symbol": "WILD" + }, + "isSC": {} + }, + "0x672255e73e9fcb8d8971b6e2622057baa84b5afe": { + "name": "PLAY token contract", + "address": "0x672255e73e9fcb8d8971b6e2622057baa84b5afe", + "token": { + "decimals": 18, + "symbol": "PLAY" + }, + "isSC": {} + }, + "0xa4b2b20b2c73c7046ed19ac6bff5e5285c58f20a": { + "name": "BOBA token contract", + "address": "0xa4b2b20b2c73c7046ed19ac6bff5e5285c58f20a", + "token": { + "decimals": 18, + "symbol": "BOBA" + }, + "isSC": {} + }, + "0x0266f4f08d82372cf0fcbccc0ff74309089c74d1": { + "name": "rETH token contract", + "address": "0x0266f4f08d82372cf0fcbccc0ff74309089c74d1", + "token": { + "decimals": 18, + "symbol": "rETH" + }, + "isSC": {} + }, + "0x72928d5436ff65e57f72d5566dcd3baedc649a88": { + "name": "HDAO token contract", + "address": "0x72928d5436ff65e57f72d5566dcd3baedc649a88", + "token": { + "decimals": 18, + "symbol": "HDAO" + }, + "isSC": {} + }, + "0x183070c90b34a63292cc908ce1b263cb56d49a7f": { + "name": "IMX token contract", + "address": "0x183070c90b34a63292cc908ce1b263cb56d49a7f", + "token": { + "decimals": 18, + "symbol": "IMX" + }, + "isSC": {} + }, + "0xd61143652af94f570c7d9429356662dd859ca6ec": { + "name": "FINT token contract", + "address": "0xd61143652af94f570c7d9429356662dd859ca6ec", + "token": { + "decimals": 18, + "symbol": "FINT" + }, + "isSC": {} + }, + "0x3a9a81d576d83ff21f26f325066054540720fc34": { + "name": "DATA token contract", + "address": "0x3a9a81d576d83ff21f26f325066054540720fc34", + "token": { + "decimals": 18, + "symbol": "DATA" + }, + "isSC": {} + }, + "0x1d607faa0a51518a7728580c238d912747e71f7a": { + "name": "DATA token contract", + "address": "0x1d607faa0a51518a7728580c238d912747e71f7a", + "token": { + "decimals": 18, + "symbol": "DATA" + }, + "isSC": {} + }, + "0xfc2e967bf55f545d656de5c40618c1ae80eb6edf": { + "name": "BANK token contract", + "address": "0xfc2e967bf55f545d656de5c40618c1ae80eb6edf", + "token": { + "decimals": 18, + "symbol": "BANK" + }, + "isSC": {} + }, + "0x82ffdfd1d8699e8886a4e77cefa9dd9710a7fefd": { + "name": "PRO token contract", + "address": "0x82ffdfd1d8699e8886a4e77cefa9dd9710a7fefd", + "token": { + "decimals": 8, + "symbol": "PRO" + }, + "isSC": {} + }, + "0xe15c40cae674a35dcd0108e66383e6f483533b82": { + "name": "BONE token contract", + "address": "0xe15c40cae674a35dcd0108e66383e6f483533b82", + "token": { + "decimals": 18, + "symbol": "BONE" + }, + "isSC": {} + }, + "0x3c59798620e5fec0ae6df1a19c6454094572ab92": { + "name": "MNW token contract", + "address": "0x3c59798620e5fec0ae6df1a19c6454094572ab92", + "token": { + "decimals": 18, + "symbol": "MNW" + }, + "isSC": {} + }, + "0xd0e9c8f5fae381459cf07ec506c1d2896e8b5df6": { + "name": "IOEN token contract", + "address": "0xd0e9c8f5fae381459cf07ec506c1d2896e8b5df6", + "token": { + "decimals": 18, + "symbol": "IOEN" + }, + "isSC": {} + }, + "0x6a284bf3e568aea2c28010f061a85e107efdb6b6": { + "name": "TAG token contract", + "address": "0x6a284bf3e568aea2c28010f061a85e107efdb6b6", + "token": { + "decimals": 18, + "symbol": "TAG" + }, + "isSC": {} + }, + "0x0c7304fbaf2a320a1c50c46fe03752722f729946": { + "name": "SLP token contract", + "address": "0x0c7304fbaf2a320a1c50c46fe03752722f729946", + "token": { + "decimals": 0, + "symbol": "SLP" + }, + "isSC": {} + }, + "0x5bc90f0d5fa1b716fb5edfda885a44bfc41b5594": { + "name": "BCP token contract", + "address": "0x5bc90f0d5fa1b716fb5edfda885a44bfc41b5594", + "token": { + "decimals": 8, + "symbol": "BCP" + }, + "isSC": {} + }, + "0x280724409b288de06c6d66c05965d3d456e2283a": { + "name": "BITE token contract", + "address": "0x280724409b288de06c6d66c05965d3d456e2283a", + "token": { + "decimals": 18, + "symbol": "BITE" + }, + "isSC": {} + }, + "0xffb89d7637cf4860884ed48b57ae5562bf64e10f": { + "name": "PIKA token contract", + "address": "0xffb89d7637cf4860884ed48b57ae5562bf64e10f", + "token": { + "decimals": 18, + "symbol": "PIKA" + }, + "isSC": {} + }, + "0xe088651125864a2fdfe806257a9a7e75b53812ba": { + "name": "rATOM token contract", + "address": "0xe088651125864a2fdfe806257a9a7e75b53812ba", + "token": { + "decimals": 18, + "symbol": "rATOM" + }, + "isSC": {} + }, + "0x5736df66b4f8401d639ffa915a46b4c548c09ac1": { + "name": "rETH token contract", + "address": "0x5736df66b4f8401d639ffa915a46b4c548c09ac1", + "token": { + "decimals": 18, + "symbol": "rETH" + }, + "isSC": {} + }, + "0xa6f7645ed967faf708a614a2fca8d4790138586f": { + "name": "MNY token contract", + "address": "0xa6f7645ed967faf708a614a2fca8d4790138586f", + "token": { + "decimals": 18, + "symbol": "MNY" + }, + "isSC": {} + }, + "0xa3983552d08ab820002a38baf51c5f3777c0d287": { + "name": "rFIS token contract", + "address": "0xa3983552d08ab820002a38baf51c5f3777c0d287", + "token": { + "decimals": 18, + "symbol": "rFIS" + }, + "isSC": {} + }, + "0x64ca1571d1476b7a21c5aaf9f1a750a193a103c0": { + "name": "BONDLY token contract", + "address": "0x64ca1571d1476b7a21c5aaf9f1a750a193a103c0", + "token": { + "decimals": 18, + "symbol": "BONDLY" + }, + "isSC": {} + }, + "0x08be454de533509e8832b257116c5506e55b0b64": { + "name": "STND token contract", + "address": "0x08be454de533509e8832b257116c5506e55b0b64", + "token": { + "decimals": 18, + "symbol": "STND" + }, + "isSC": {} + }, + "0xf1a4015ae4d16ff64e41535fe973a1796c0203d6": { + "name": "WILD token contract", + "address": "0xf1a4015ae4d16ff64e41535fe973a1796c0203d6", + "token": { + "decimals": 18, + "symbol": "WILD" + }, + "isSC": {} + }, + "0xda6f81c2426131337b0cf73768b94c2004390b0e": { + "name": "LMAO token contract", + "address": "0xda6f81c2426131337b0cf73768b94c2004390b0e", + "token": { + "decimals": 18, + "symbol": "LMAO" + }, + "isSC": {} + }, + "0x79ddc6ca9b76aa14dcfbd02bf75db588f5486df8": { + "name": "Titan token contract", + "address": "0x79ddc6ca9b76aa14dcfbd02bf75db588f5486df8", + "token": { + "decimals": 18, + "symbol": "Titan" + }, + "isSC": {} + }, + "0x7a7b94f18ef6ad056cda648588181cda84800f94": { + "name": "FIS token contract", + "address": "0x7a7b94f18ef6ad056cda648588181cda84800f94", + "token": { + "decimals": 18, + "symbol": "FIS" + }, + "isSC": {} + }, + "0xeaef6caf6d5894edb2d4ea7ec11ec4ab655f1cbf": { + "name": "PAID token contract", + "address": "0xeaef6caf6d5894edb2d4ea7ec11ec4ab655f1cbf", + "token": { + "decimals": 18, + "symbol": "PAID" + }, + "isSC": {} + }, + "0x324b28d6565f784d596422b0f2e5ab6e9cfa1dc7": { + "name": "KNC token contract", + "address": "0x324b28d6565f784d596422b0f2e5ab6e9cfa1dc7", + "token": { + "decimals": 18, + "symbol": "KNC" + }, + "isSC": {} + }, + "0xfa2328d170d9476feafe1a6180abdb61a13a9494": { + "name": "UNC token contract", + "address": "0xfa2328d170d9476feafe1a6180abdb61a13a9494", + "token": { + "decimals": 18, + "symbol": "UNC" + }, + "isSC": {} + }, + "0xdb7cb471dd0b49b29cab4a1c14d070f27216a0ab": { + "name": "BANK token contract", + "address": "0xdb7cb471dd0b49b29cab4a1c14d070f27216a0ab", + "token": { + "decimals": 18, + "symbol": "BANK" + }, + "isSC": {} + }, + "0xd7a2dc75ea2057b3949f9e1dbdf3480203dbe26a": { + "name": "NFTI token contract", + "address": "0xd7a2dc75ea2057b3949f9e1dbdf3480203dbe26a", + "token": { + "decimals": 18, + "symbol": "NFTI" + }, + "isSC": {} + }, + "0xc20dde5a129b01b5a16d315fb18bdbd21a59a4a6": { + "name": "Bone token contract", + "address": "0xc20dde5a129b01b5a16d315fb18bdbd21a59a4a6", + "token": { + "decimals": 18, + "symbol": "Bone" + }, + "isSC": {} + }, + "0x61bdd9c7d4df4bf47a4508c0c8245505f2af5b7b": { + "name": "AXS token contract", + "address": "0x61bdd9c7d4df4bf47a4508c0c8245505f2af5b7b", + "token": { + "decimals": 18, + "symbol": "AXS" + }, + "isSC": {} + }, + "0x190eb8a183d22a4bdf278c6791b152228857c033": { + "name": "AGIX token contract", + "address": "0x190eb8a183d22a4bdf278c6791b152228857c033", + "token": { + "decimals": 8, + "symbol": "AGIX" + }, + "isSC": {} + }, + "0x7b367a058f370c0057762280547d0b974cf3ac10": { + "name": "PAR token contract", + "address": "0x7b367a058f370c0057762280547d0b974cf3ac10", + "token": { + "decimals": 18, + "symbol": "PAR" + }, + "isSC": {} + }, + "0xfb8a07e99450d1dc566da18a8f0e630addefdd3e": { + "name": "STN token contract", + "address": "0xfb8a07e99450d1dc566da18a8f0e630addefdd3e", + "token": { + "decimals": 18, + "symbol": "STN" + }, + "isSC": {} + }, + "0x60c4f9718b445df881e6c00921afb2a8de4b1873": { + "name": "FORCE token contract", + "address": "0x60c4f9718b445df881e6c00921afb2a8de4b1873", + "token": { + "decimals": 18, + "symbol": "FORCE" + }, + "isSC": {} + }, + "0x60bb3d364b765c497c8ce50ae0ae3f0882c5bd05": { + "name": "IMX token contract", + "address": "0x60bb3d364b765c497c8ce50ae0ae3f0882c5bd05", + "token": { + "decimals": 18, + "symbol": "IMX" + }, + "isSC": {} + }, + "0xe7804d91dfcde7f776c90043e03eaa6df87e6395": { + "name": "DFX token contract", + "address": "0xe7804d91dfcde7f776c90043e03eaa6df87e6395", + "token": { + "decimals": 18, + "symbol": "DFX" + }, + "isSC": {} + }, + "0x5a8adda3140d961cd069cbb7b400d7834dd558ac": { + "name": "oDOGE token contract", + "address": "0x5a8adda3140d961cd069cbb7b400d7834dd558ac", + "token": { + "decimals": 18, + "symbol": "oDOGE" + }, + "isSC": {} + }, + "0xff88434e29d1e2333ad6baa08d358b436196da6b": { + "name": "BORING token contract", + "address": "0xff88434e29d1e2333ad6baa08d358b436196da6b", + "token": { + "decimals": 18, + "symbol": "BORING" + }, + "isSC": {} + }, + "0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c": { + "name": "KNC token contract", + "address": "0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c", + "token": { + "decimals": 18, + "symbol": "KNC" + }, + "isSC": {} + }, + "0x8765f05adce126d70bcdf1b0a48db573316662eb": { + "name": "PLA token contract", + "address": "0x8765f05adce126d70bcdf1b0a48db573316662eb", + "token": { + "decimals": 18, + "symbol": "PLA" + }, + "isSC": {} + }, + "0x654f82124a885af03d2da6b53c004343920ae189": { + "name": "MPH token contract", + "address": "0x654f82124a885af03d2da6b53c004343920ae189", + "token": { + "decimals": 18, + "symbol": "MPH" + }, + "isSC": {} + }, + "0xe6e320b7bb22018d6ca1f4d8cea1365ef5d25ced": { + "name": "LIT token contract", + "address": "0xe6e320b7bb22018d6ca1f4d8cea1365ef5d25ced", + "token": { + "decimals": 18, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xad356bf748b9c320a5ddd4baaffa3f323eeb5546": { + "name": "B21 token contract", + "address": "0xad356bf748b9c320a5ddd4baaffa3f323eeb5546", + "token": { + "decimals": 18, + "symbol": "B21" + }, + "isSC": {} + }, + "0x76e3f52ad78c367f23cfa08febf122053ee4f781": { + "name": "BCP token contract", + "address": "0x76e3f52ad78c367f23cfa08febf122053ee4f781", + "token": { + "decimals": 18, + "symbol": "BCP" + }, + "isSC": {} + }, + "0x6a9d92f366f01b1980c4e75f0d9fa54db658105d": { + "name": "aDAI token contract", + "address": "0x6a9d92f366f01b1980c4e75f0d9fa54db658105d", + "token": { + "decimals": 18, + "symbol": "aDAI" + }, + "isSC": {} + }, + "0x329434fe066ac71d5fb93489f955a6959658097b": { + "name": "aDAI token contract", + "address": "0x329434fe066ac71d5fb93489f955a6959658097b", + "token": { + "decimals": 18, + "symbol": "aDAI" + }, + "isSC": {} + }, + "0x7a46e5c2a19e371f23416fdf5930255589b95d3f": { + "name": "LIT token contract", + "address": "0x7a46e5c2a19e371f23416fdf5930255589b95d3f", + "token": { + "decimals": 2, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xdf4d2226c810976c582a8111d831fa5fc543f7e5": { + "name": "FORCE token contract", + "address": "0xdf4d2226c810976c582a8111d831fa5fc543f7e5", + "token": { + "decimals": 18, + "symbol": "FORCE" + }, + "isSC": {} + }, + "0xeba044af66a6d959c12e91fccd74ea1c3ca07578": { + "name": "MPH token contract", + "address": "0xeba044af66a6d959c12e91fccd74ea1c3ca07578", + "token": { + "decimals": 18, + "symbol": "MPH" + }, + "isSC": {} + }, + "0x032f85b8fbf8540a92b986d953e4c3a61c76d39e": { + "name": "TCP token contract", + "address": "0x032f85b8fbf8540a92b986d953e4c3a61c76d39e", + "token": { + "decimals": 18, + "symbol": "TCP" + }, + "isSC": {} + }, + "0x1002068d890ac351143bc5ae70711175e75f1ea8": { + "name": "MUNCH token contract", + "address": "0x1002068d890ac351143bc5ae70711175e75f1ea8", + "token": { + "decimals": 9, + "symbol": "MUNCH" + }, + "isSC": {} + }, + "0x73e86097021714509d3f193dfd0bbbc57b3cdcc6": { + "name": "idleUSDCSafe token contract", + "address": "0x73e86097021714509d3f193dfd0bbbc57b3cdcc6", + "token": { + "decimals": 18, + "symbol": "idleUSDCSafe" + }, + "isSC": {} + }, + "0xc168e40227e4ebd8c1cae80f7a55a4f0e6d66c97": { + "name": "DFYN token contract", + "address": "0xc168e40227e4ebd8c1cae80f7a55a4f0e6d66c97", + "token": { + "decimals": 18, + "symbol": "DFYN" + }, + "isSC": {} + }, + "0xb6f10be9201fb110b3aa275267a234e84ade8e95": { + "name": "ONG token contract", + "address": "0xb6f10be9201fb110b3aa275267a234e84ade8e95", + "token": { + "decimals": 18, + "symbol": "ONG" + }, + "isSC": {} + }, + "0xc4e82ba0fe6763cbe5e9cbca0ba7cbd6f91c6018": { + "name": "aETHc token contract", + "address": "0xc4e82ba0fe6763cbe5e9cbca0ba7cbd6f91c6018", + "token": { + "decimals": 18, + "symbol": "aETHc" + }, + "isSC": {} + }, + "0xa041544fe2be56cce31ebb69102b965e06aace80": { + "name": "BOND token contract", + "address": "0xa041544fe2be56cce31ebb69102b965e06aace80", + "token": { + "decimals": 18, + "symbol": "BOND" + }, + "isSC": {} + }, + "0x9e01e0a928588ae6e669b8d1f0f1fa4ab976f617": { + "name": "SHO token contract", + "address": "0x9e01e0a928588ae6e669b8d1f0f1fa4ab976f617", + "token": { + "decimals": 18, + "symbol": "SHO" + }, + "isSC": {} + }, + "0xf89887862538ce8efbdbadd5d483ae4a09dd9688": { + "name": "$TRDL token contract", + "address": "0xf89887862538ce8efbdbadd5d483ae4a09dd9688", + "token": { + "decimals": 18, + "symbol": "$TRDL" + }, + "isSC": {} + }, + "0xdd24aa9166dcdf0b37d0fca17d6ea87748771dcc": { + "name": "PLAY token contract", + "address": "0xdd24aa9166dcdf0b37d0fca17d6ea87748771dcc", + "token": { + "decimals": 18, + "symbol": "PLAY" + }, + "isSC": {} + }, + "0x7d8c139d5bfbafdfd1d2d0284e7fc862babe4137": { + "name": "BOR token contract", + "address": "0x7d8c139d5bfbafdfd1d2d0284e7fc862babe4137", + "token": { + "decimals": 18, + "symbol": "BOR" + }, + "isSC": {} + }, + "0xb718412ef9c238c3a90079f21b57808ff8c18f1c": { + "name": "YLD token contract", + "address": "0xb718412ef9c238c3a90079f21b57808ff8c18f1c", + "token": { + "decimals": 18, + "symbol": "YLD" + }, + "isSC": {} + }, + "0xd9e658caed24fb0486e92f0f1702f77a712790da": { + "name": "Ù¨ token contract", + "address": "0xd9e658caed24fb0486e92f0f1702f77a712790da", + "token": { + "decimals": 0, + "symbol": "Ù¨" + }, + "isSC": {} + }, + "0x266af96fece1c3dd4b8a0a6de9ae7a3bd5408ee9": { + "name": "YGY token contract", + "address": "0x266af96fece1c3dd4b8a0a6de9ae7a3bd5408ee9", + "token": { + "decimals": 6, + "symbol": "YGY" + }, + "isSC": {} + }, + "0x9eecd634c7a934f752af0eb90dda9ecc262f199f": { + "name": "UNCX token contract", + "address": "0x9eecd634c7a934f752af0eb90dda9ecc262f199f", + "token": { + "decimals": 18, + "symbol": "UNCX" + }, + "isSC": {} + }, + "0xa69d14d6369e414a32a5c7e729b7afbafd285965": { + "name": "GCR token contract", + "address": "0xa69d14d6369e414a32a5c7e729b7afbafd285965", + "token": { + "decimals": 4, + "symbol": "GCR" + }, + "isSC": {} + }, + "0x918c749a09fa539e1dc8019f875fab9eb1ebc6a3": { + "name": "FTX Token token contract", + "address": "0x918c749a09fa539e1dc8019f875fab9eb1ebc6a3", + "token": { + "decimals": 18, + "symbol": "FTX Token" + }, + "isSC": {} + }, + "0x4cebdbcb286101a17d3ea1f7fe7bbded2b2053dd": { + "name": "YLD token contract", + "address": "0x4cebdbcb286101a17d3ea1f7fe7bbded2b2053dd", + "token": { + "decimals": 18, + "symbol": "YLD" + }, + "isSC": {} + }, + "0x2808edb7398b25e0f6c41cd98fd114d924008c87": { + "name": "FLUX token contract", + "address": "0x2808edb7398b25e0f6c41cd98fd114d924008c87", + "token": { + "decimals": 18, + "symbol": "FLUX" + }, + "isSC": {} + }, + "0x3cef98bb43d732e2f285ee605a8158cde967d219": { + "name": "BAT token contract", + "address": "0x3cef98bb43d732e2f285ee605a8158cde967d219", + "token": { + "decimals": 18, + "symbol": "BAT" + }, + "isSC": {} + }, + "0xab0b2ddb9c7e440fac8e140a89c0dbcbf2d7bbff": { + "name": "iFARM token contract", + "address": "0xab0b2ddb9c7e440fac8e140a89c0dbcbf2d7bbff", + "token": { + "decimals": 18, + "symbol": "iFARM" + }, + "isSC": {} + }, + "0xa8e198fc5c68264b185619a96748f855720494c0": { + "name": "LIT token contract", + "address": "0xa8e198fc5c68264b185619a96748f855720494c0", + "token": { + "decimals": 18, + "symbol": "LIT" + }, + "isSC": {} + }, + "0xc30dd0cce2e683aa68c87c280e73beb3dec9b3ba": { + "name": "wCELO token contract", + "address": "0xc30dd0cce2e683aa68c87c280e73beb3dec9b3ba", + "token": { + "decimals": 18, + "symbol": "wCELO" + }, + "isSC": {} + }, + "0x232eab56c4fb3f84c6fb0a50c087c74b7b43c6ad": { + "name": "ZUZ token contract", + "address": "0x232eab56c4fb3f84c6fb0a50c087c74b7b43c6ad", + "token": { + "decimals": 18, + "symbol": "ZUZ" + }, + "isSC": {} + }, + "0x176f5ab638cf4ff3b6239ba609c3fadaa46ef5b0": { + "name": "FARM token contract", + "address": "0x176f5ab638cf4ff3b6239ba609c3fadaa46ef5b0", + "token": { + "decimals": 18, + "symbol": "FARM" + }, + "isSC": {} + }, + "0xc3ec80343d2bae2f8e680fdadde7c17e71e114ea": { + "name": "OM token contract", + "address": "0xc3ec80343d2bae2f8e680fdadde7c17e71e114ea", + "token": { + "decimals": 18, + "symbol": "OM" + }, + "isSC": {} + }, + "0xf153eff70dc0bf3b085134928daeea248d9b30d0": { + "name": "xMARK token contract", + "address": "0xf153eff70dc0bf3b085134928daeea248d9b30d0", + "token": { + "decimals": 9, + "symbol": "xMARK" + }, + "isSC": {} + }, + "0x48e3883233461c2ef4cb3fcf419d6db07fb86cea": { + "name": "SENT token contract", + "address": "0x48e3883233461c2ef4cb3fcf419d6db07fb86cea", + "token": { + "decimals": 8, + "symbol": "SENT" + }, + "isSC": {} + }, + "0xfeff6c1643d38b13a198cfe1d76505701c380af0": { + "name": "DIP token contract", + "address": "0xfeff6c1643d38b13a198cfe1d76505701c380af0", + "token": { + "decimals": 18, + "symbol": "DIP" + }, + "isSC": {} + }, + "0x282d8efce846a88b159800bd4130ad77443fa1a1": { + "name": "OCEAN token contract", + "address": "0x282d8efce846a88b159800bd4130ad77443fa1a1", + "token": { + "decimals": 18, + "symbol": "OCEAN" + }, + "isSC": {} + }, + "0x3809dcdd5dde24b37abe64a5a339784c3323c44f": { + "name": "SWAP token contract", + "address": "0x3809dcdd5dde24b37abe64a5a339784c3323c44f", + "token": { + "decimals": 18, + "symbol": "SWAP" + }, + "isSC": {} + }, + "0xf521d590fb1e0b432fd0e020cdbd6c6397d652c2": { + "name": "PAR token contract", + "address": "0xf521d590fb1e0b432fd0e020cdbd6c6397d652c2", + "token": { + "decimals": 18, + "symbol": "PAR" + }, + "isSC": {} + }, + "0xd28449bb9bb659725accad52947677cce3719fd7": { + "name": "DMT token contract", + "address": "0xd28449bb9bb659725accad52947677cce3719fd7", + "token": { + "decimals": 18, + "symbol": "DMT" + }, + "isSC": {} + }, + "0x72d6066f486bd0052eefb9114b66ae40e0a6031a": { + "name": "BWRX token contract", + "address": "0x72d6066f486bd0052eefb9114b66ae40e0a6031a", + "token": { + "decimals": 8, + "symbol": "BWRX" + }, + "isSC": {} + }, + "0x556f501cf8a43216df5bc9cc57eb04d4ffaa9e6d": { + "name": "DUST token contract", + "address": "0x556f501cf8a43216df5bc9cc57eb04d4ffaa9e6d", + "token": { + "decimals": 8, + "symbol": "DUST" + }, + "isSC": {} + }, + "0x7df5638222bbe24cce39f726c3b61cc03610622a": { + "name": "LDN token contract", + "address": "0x7df5638222bbe24cce39f726c3b61cc03610622a", + "token": { + "decimals": 18, + "symbol": "LDN" + }, + "isSC": {} + }, + "0x08c15fa26e519a78a666d19ce5c646d55047e0a3": { + "name": "DF token contract", + "address": "0x08c15fa26e519a78a666d19ce5c646d55047e0a3", + "token": { + "decimals": 18, + "symbol": "DF" + }, + "isSC": {} + }, + "0x1bd5048e0b85c410dd039aa9c05069a9d82488b8": { + "name": "ORC token contract", + "address": "0x1bd5048e0b85c410dd039aa9c05069a9d82488b8", + "token": { + "decimals": 18, + "symbol": "ORC" + }, + "isSC": {} + }, + "0x7ed6390f38d554b8518ef30b925b46972e768af8": { + "name": "csMATIC token contract", + "address": "0x7ed6390f38d554b8518ef30b925b46972e768af8", + "token": { + "decimals": 18, + "symbol": "csMATIC" + }, + "isSC": {} + }, + "0x692c44990e4f408ba0917f5c78a83160c1557237": { + "name": "THALES token contract", + "address": "0x692c44990e4f408ba0917f5c78a83160c1557237", + "token": { + "decimals": 18, + "symbol": "THALES" + }, + "isSC": {} + }, + "0x2ae0e530ca7857b0e40078c43ba7158ce424838a": { + "name": "OGUC token contract", + "address": "0x2ae0e530ca7857b0e40078c43ba7158ce424838a", + "token": { + "decimals": 18, + "symbol": "OGUC" + }, + "isSC": {} + }, + "0x44acd96620b708162af4a90524f29a6839675533": { + "name": "TCGC token contract", + "address": "0x44acd96620b708162af4a90524f29a6839675533", + "token": { + "decimals": 18, + "symbol": "TCGC" + }, + "isSC": {} + }, + "0x9d7313e23c29e6d314a160a3ff345a2f7ab0f3f5": { + "name": "UNITY token contract", + "address": "0x9d7313e23c29e6d314a160a3ff345a2f7ab0f3f5", + "token": { + "decimals": 18, + "symbol": "UNITY" + }, + "isSC": {} + }, + "0x716ceb4dc674fb91c4198c50b837f11f6ef75df0": { + "name": "RFWSTETH token contract", + "address": "0x716ceb4dc674fb91c4198c50b837f11f6ef75df0", + "token": { + "decimals": 18, + "symbol": "RFWSTETH" + }, + "isSC": {} + }, + "0xc99fd38d967944d7c3578afc4451920404c238d1": { + "name": "SHRD token contract", + "address": "0xc99fd38d967944d7c3578afc4451920404c238d1", + "token": { + "decimals": 18, + "symbol": "SHRD" + }, + "isSC": {} + }, + "0xfa68fb4628dff1028cfec22b4162fccd0d45efb6": { + "name": "MaticX token contract", + "address": "0xfa68fb4628dff1028cfec22b4162fccd0d45efb6", + "token": { + "decimals": 18, + "symbol": "MaticX" + }, + "isSC": {} + }, + "0xe57eac8b4666032cfa16b626ffe99403a40b64d3": { + "name": "ANX token contract", + "address": "0xe57eac8b4666032cfa16b626ffe99403a40b64d3", + "token": { + "decimals": 18, + "symbol": "ANX" + }, + "isSC": {} + }, + "0x4ec203dd0699fac6adaf483cdd2519bc05d2c573": { + "name": "CBK token contract", + "address": "0x4ec203dd0699fac6adaf483cdd2519bc05d2c573", + "token": { + "decimals": 18, + "symbol": "CBK" + }, + "isSC": {} + }, + "0xb7b31a6bc18e48888545ce79e83e06003be70930": { + "name": "APE token contract", + "address": "0xb7b31a6bc18e48888545ce79e83e06003be70930", + "token": { + "decimals": 18, + "symbol": "APE" + }, + "isSC": {} + }, + "0xf328b73b6c685831f238c30a23fc19140cb4d8fc": { + "name": "ACX token contract", + "address": "0xf328b73b6c685831f238c30a23fc19140cb4d8fc", + "token": { + "decimals": 18, + "symbol": "ACX" + }, + "isSC": {} + }, + "0xd0258a3fd00f38aa8090dfee343f10a9d4d30d3f": { + "name": "VOXEL token contract", + "address": "0xd0258a3fd00f38aa8090dfee343f10a9d4d30d3f", + "token": { + "decimals": 6, + "symbol": "VOXEL" + }, + "isSC": {} + }, + "0xbc2b48bc930ddc4e5cfb2e87a45c379aab3aac5c": { + "name": "DOLA token contract", + "address": "0xbc2b48bc930ddc4e5cfb2e87a45c379aab3aac5c", + "token": { + "decimals": 18, + "symbol": "DOLA" + }, + "isSC": {} + }, + "0xb763f1177e9b2fb66fbe0d50372e3e2575c043e5": { + "name": "KNOT token contract", + "address": "0xb763f1177e9b2fb66fbe0d50372e3e2575c043e5", + "token": { + "decimals": 18, + "symbol": "KNOT" + }, + "isSC": {} + }, + "0x623a1350f6b749575f92ea54d0f745f9f07d3665": { + "name": "Serum token contract", + "address": "0x623a1350f6b749575f92ea54d0f745f9f07d3665", + "token": { + "decimals": 0, + "symbol": "Serum" + }, + "isSC": {} + }, + "0x91e7e32c710661c44ae44d10aa86135d91c3ed65": { + "name": "wPPC token contract", + "address": "0x91e7e32c710661c44ae44d10aa86135d91c3ed65", + "token": { + "decimals": 6, + "symbol": "wPPC" + }, + "isSC": {} + }, + "0xaa404804ba583c025fa64c9a276a6127ceb355c6": { + "name": "CPR token contract", + "address": "0xaa404804ba583c025fa64c9a276a6127ceb355c6", + "token": { + "decimals": 2, + "symbol": "CPR" + }, + "isSC": {} + }, + "0xc27158bb8e08899d38765752f91d7d778e16ab8e": { + "name": "KAP token contract", + "address": "0xc27158bb8e08899d38765752f91d7d778e16ab8e", + "token": { + "decimals": 18, + "symbol": "KAP" + }, + "isSC": {} + }, + "0xc4df120d75604307dcb604fde2ad3b8a8b7c6faa": { + "name": "GIV token contract", + "address": "0xc4df120d75604307dcb604fde2ad3b8a8b7c6faa", + "token": { + "decimals": 18, + "symbol": "GIV" + }, + "isSC": {} + }, + "0x996f19d4b1ce6d5ad72ceaaa53152ceb1b187fd0": { + "name": "POLK token contract", + "address": "0x996f19d4b1ce6d5ad72ceaaa53152ceb1b187fd0", + "token": { + "decimals": 18, + "symbol": "POLK" + }, + "isSC": {} + }, + "0xd872b7ffca41a67eda85b04a9185c6b270006b58": { + "name": "TAKI token contract", + "address": "0xd872b7ffca41a67eda85b04a9185c6b270006b58", + "token": { + "decimals": 9, + "symbol": "TAKI" + }, + "isSC": {} + }, + "0xc1381c17d29a22df5c3015c3d83ebd90abd0e6b3": { + "name": "TruMATIC token contract", + "address": "0xc1381c17d29a22df5c3015c3d83ebd90abd0e6b3", + "token": { + "decimals": 18, + "symbol": "TruMATIC" + }, + "isSC": {} + }, + "0xfe4e02555ef9f74d19c7f536d229661eb3a727c2": { + "name": "TruMATIC token contract", + "address": "0xfe4e02555ef9f74d19c7f536d229661eb3a727c2", + "token": { + "decimals": 18, + "symbol": "TruMATIC" + }, + "isSC": {} + }, + "0xca2443391dd5b73dc0264af8fa71f312d9784c43": { + "name": "TruMATIC token contract", + "address": "0xca2443391dd5b73dc0264af8fa71f312d9784c43", + "token": { + "decimals": 18, + "symbol": "TruMATIC" + }, + "isSC": {} + }, + "0x6949804b60dd9dcea43fd8d10ccdc640b55f9f7f": { + "name": "BREED token contract", + "address": "0x6949804b60dd9dcea43fd8d10ccdc640b55f9f7f", + "token": { + "decimals": 18, + "symbol": "BREED" + }, + "isSC": {} + }, + "0x0f09e11501b01b3e9dc77d96db752d1a2ac84b20": { + "name": "NOGS token contract", + "address": "0x0f09e11501b01b3e9dc77d96db752d1a2ac84b20", + "token": { + "decimals": 18, + "symbol": "NOGS" + }, + "isSC": {} + }, + "0x58c7b2828e7f2b2caa0cc7feef242fa3196d03df": { + "name": "A3A token contract", + "address": "0x58c7b2828e7f2b2caa0cc7feef242fa3196d03df", + "token": { + "decimals": 18, + "symbol": "A3A" + }, + "isSC": {} + }, + "0xc708d6f2153933daa50b2d0758955be0a93a8fec": { + "name": "VERSE token contract", + "address": "0xc708d6f2153933daa50b2d0758955be0a93a8fec", + "token": { + "decimals": 18, + "symbol": "VERSE" + }, + "isSC": {} + }, + "0x32dc2dd3c2be453a369625e6fe0e438aed814919": { + "name": "KEY token contract", + "address": "0x32dc2dd3c2be453a369625e6fe0e438aed814919", + "token": { + "decimals": 18, + "symbol": "KEY" + }, + "isSC": {} + }, + "0x1b396cf90504686b7ede2760eebb053d30d1f389": { + "name": "RLTM token contract", + "address": "0x1b396cf90504686b7ede2760eebb053d30d1f389", + "token": { + "decimals": 18, + "symbol": "RLTM" + }, + "isSC": {} + }, + "0xfef5d947472e72efbb2e388c730b7428406f2f95": { + "name": "OLAS token contract", + "address": "0xfef5d947472e72efbb2e388c730b7428406f2f95", + "token": { + "decimals": 18, + "symbol": "OLAS" + }, + "isSC": {} + }, + "0x96fc3568d36b236121ef3dd3edeb31ca8d08bfb0": { + "name": "KEYFI token contract", + "address": "0x96fc3568d36b236121ef3dd3edeb31ca8d08bfb0", + "token": { + "decimals": 18, + "symbol": "KEYFI" + }, + "isSC": {} + }, + "0xe74b3e6232e6b02ece8ede707a3a32ae3525b44f": { + "name": "fxTETU token contract", + "address": "0xe74b3e6232e6b02ece8ede707a3a32ae3525b44f", + "token": { + "decimals": 18, + "symbol": "fxTETU" + }, + "isSC": {} + }, + "0x0ed7e52944161450477ee417de9cd3a859b14fd0": { + "name": "Cake-BNB LP token contract", + "address": "0x0ed7e52944161450477ee417de9cd3a859b14fd0", + "token": { + "decimals": 18, + "symbol": "Cake-BNB LP" + }, + "isSC": {} + }, + "0x58f876857a02d6762e0101bb5c46a8c1ed44dc16": { + "name": "BNB-BUSD LP token contract", + "address": "0x58f876857a02d6762e0101bb5c46a8c1ed44dc16", + "token": { + "decimals": 18, + "symbol": "BNB-BUSD LP" + }, + "isSC": {} + }, + "0x28415ff2c35b65b9e5c7de82126b4015ab9d031f": { + "name": "ADA-BNB LP token contract", + "address": "0x28415ff2c35b65b9e5c7de82126b4015ab9d031f", + "token": { + "decimals": 18, + "symbol": "ADA-BNB LP" + }, + "isSC": {} + }, + "0xdd5bad8f8b360d76d12fda230f8baf42fe0022cf": { + "name": "DOT-BNB LP token contract", + "address": "0xdd5bad8f8b360d76d12fda230f8baf42fe0022cf", + "token": { + "decimals": 18, + "symbol": "DOT-BNB LP" + }, + "isSC": {} + }, + "0x824eb9fadfb377394430d2744fa7c42916de3ece": { + "name": "BNB-LINK LP token contract", + "address": "0x824eb9fadfb377394430d2744fa7c42916de3ece", + "token": { + "decimals": 18, + "symbol": "BNB-LINK LP" + }, + "isSC": {} + }, + "0x7efaef62fddcca950418312c6c91aef321375a00": { + "name": "USDT-BUSD LP token contract", + "address": "0x7efaef62fddcca950418312c6c91aef321375a00", + "token": { + "decimals": 18, + "symbol": "USDT-BUSD LP" + }, + "isSC": {} + }, + "0x3dcb1787a95d2ea0eb7d00887704eebf0d79bb13": { + "name": "TWT-BNB LP token contract", + "address": "0x3dcb1787a95d2ea0eb7d00887704eebf0d79bb13", + "token": { + "decimals": 18, + "symbol": "TWT-BNB LP" + }, + "isSC": {} + }, + "0x7eb5d86fd78f3852a3e0e064f2842d45a3db6ea2": { + "name": "BNB-XVS LP token contract", + "address": "0x7eb5d86fd78f3852a3e0e064f2842d45a3db6ea2", + "token": { + "decimals": 18, + "symbol": "BNB-XVS LP" + }, + "isSC": {} + }, + "0x74e4716e431f45807dcf19f284c7aa99f18a4fbc": { + "name": "ETH-BNB LP token contract", + "address": "0x74e4716e431f45807dcf19f284c7aa99f18a4fbc", + "token": { + "decimals": 18, + "symbol": "ETH-BNB LP" + }, + "isSC": {} + }, + "0x61eb789d75a95caa3ff50ed7e47b96c132fec082": { + "name": "BTCB-BNB LP token contract", + "address": "0x61eb789d75a95caa3ff50ed7e47b96c132fec082", + "token": { + "decimals": 18, + "symbol": "BTCB-BNB LP" + }, + "isSC": {} + }, + "0xacf47cbeaab5c8a6ee99263cfe43995f89fb3206": { + "name": "ALPHA-BNB LP token contract", + "address": "0xacf47cbeaab5c8a6ee99263cfe43995f89fb3206", + "token": { + "decimals": 18, + "symbol": "ALPHA-BNB LP" + }, + "isSC": {} + }, + "0x16b9a82891338f9ba80e2d6970fdda79d1eb0dae": { + "name": "USDT-BNB LP token contract", + "address": "0x16b9a82891338f9ba80e2d6970fdda79d1eb0dae", + "token": { + "decimals": 18, + "symbol": "USDT-BNB LP" + }, + "isSC": {} + }, + "0x03f18135c44c64ebfdcbad8297fe5bdafdbbdd86": { + "name": "XRP-BNB LP token contract", + "address": "0x03f18135c44c64ebfdcbad8297fe5bdafdbbdd86", + "token": { + "decimals": 18, + "symbol": "XRP-BNB LP" + }, + "isSC": {} + }, + "0x014608e87af97a054c9a49f81e1473076d51d9a3": { + "name": "BNB-UNI LP token contract", + "address": "0x014608e87af97a054c9a49f81e1473076d51d9a3", + "token": { + "decimals": 18, + "symbol": "BNB-UNI LP" + }, + "isSC": {} + }, + "0x1bdcebca3b93af70b58c41272aea2231754b23ca": { + "name": "INJ-BNB LP token contract", + "address": "0x1bdcebca3b93af70b58c41272aea2231754b23ca", + "token": { + "decimals": 18, + "symbol": "INJ-BNB LP" + }, + "isSC": {} + }, + "0xd8e2f8b6db204c405543953ef6359912fe3a88d6": { + "name": "SXP-BNB LP token contract", + "address": "0xd8e2f8b6db204c405543953ef6359912fe3a88d6", + "token": { + "decimals": 18, + "symbol": "SXP-BNB LP" + }, + "isSC": {} + }, + "0x133ee93fe93320e1182923e1a640912ede17c90c": { + "name": "VAI-BUSD LP token contract", + "address": "0x133ee93fe93320e1182923e1a640912ede17c90c", + "token": { + "decimals": 18, + "symbol": "VAI-BUSD LP" + }, + "isSC": {} + }, + "0x66fdb2eccfb58cf098eaa419e5efde841368e489": { + "name": "DAI-BUSD LP token contract", + "address": "0x66fdb2eccfb58cf098eaa419e5efde841368e489", + "token": { + "decimals": 18, + "symbol": "DAI-BUSD LP" + }, + "isSC": {} + }, + "0x2354ef4df11afacb85a5c7f98b624072eccddbb1": { + "name": "USDC-BUSD LP token contract", + "address": "0x2354ef4df11afacb85a5c7f98b624072eccddbb1", + "token": { + "decimals": 18, + "symbol": "USDC-BUSD LP" + }, + "isSC": {} + }, + "0x71b01ebddd797c8e9e0b003ea2f4fd207fbf46cc": { + "name": "LTC-BNB LP token contract", + "address": "0x71b01ebddd797c8e9e0b003ea2f4fd207fbf46cc", + "token": { + "decimals": 18, + "symbol": "LTC-BNB LP" + }, + "isSC": {} + }, + "0xb2678c414ebc63c9cc6d1a0fc45f43e249b50fde": { + "name": "BTCST-BNB LP token contract", + "address": "0xb2678c414ebc63c9cc6d1a0fc45f43e249b50fde", + "token": { + "decimals": 18, + "symbol": "BTCST-BNB LP" + }, + "isSC": {} + }, + "0x05faf555522fa3f93959f86b41a3808666093210": { + "name": "UST-BUSD LP token contract", + "address": "0x05faf555522fa3f93959f86b41a3808666093210", + "token": { + "decimals": 18, + "symbol": "UST-BUSD LP" + }, + "isSC": {} + }, + "0xc5768c5371568cf1114cddd52caed163a42626ed": { + "name": "LINA-BUSD LP token contract", + "address": "0xc5768c5371568cf1114cddd52caed163a42626ed", + "token": { + "decimals": 18, + "symbol": "LINA-BUSD LP" + }, + "isSC": {} + }, + "0x942b294e59a8c47a0f7f20df105b082710f7c305": { + "name": "BNB-SFP LP token contract", + "address": "0x942b294e59a8c47a0f7f20df105b082710f7c305", + "token": { + "decimals": 18, + "symbol": "BNB-SFP LP" + }, + "isSC": {} + }, + "0x16afc4f2ad82986bbe2a4525601f8199ab9c832d": { + "name": "ETH-SUSHI LP token contract", + "address": "0x16afc4f2ad82986bbe2a4525601f8199ab9c832d", + "token": { + "decimals": 18, + "symbol": "ETH-SUSHI LP" + }, + "isSC": {} + }, + "0xc13aa76aac067c86ae38028019f414d731b3d86a": { + "name": "IOTX-BUSD LP token contract", + "address": "0xc13aa76aac067c86ae38028019f414d731b3d86a", + "token": { + "decimals": 18, + "symbol": "IOTX-BUSD LP" + }, + "isSC": {} + }, + "0xe834bf723f5bdff34a5d1129f3c31ea4787bc76a": { + "name": "RAMP-BUSD LP token contract", + "address": "0xe834bf723f5bdff34a5d1129f3c31ea4787bc76a", + "token": { + "decimals": 18, + "symbol": "RAMP-BUSD LP" + }, + "isSC": {} + }, + "0xf3bc6fc080ffcc30d93df48bfa2aa14b869554bb": { + "name": "BNB-BELT LP token contract", + "address": "0xf3bc6fc080ffcc30d93df48bfa2aa14b869554bb", + "token": { + "decimals": 18, + "symbol": "BNB-BELT LP" + }, + "isSC": {} + }, + "0xcad7019d6d84a3294b0494aef02e73bd0f2572eb": { + "name": "ALICE-BNB LP token contract", + "address": "0xcad7019d6d84a3294b0494aef02e73bd0f2572eb", + "token": { + "decimals": 18, + "symbol": "ALICE-BNB LP" + }, + "isSC": {} + }, + "0x3f1a9f3d9aad8bd339ed4853f345d2ef89fbfe0c": { + "name": "BNB-BIFI LP token contract", + "address": "0x3f1a9f3d9aad8bd339ed4853f345d2ef89fbfe0c", + "token": { + "decimals": 18, + "symbol": "BNB-BIFI LP" + }, + "isSC": {} + }, + "0xffd4b200d3c77a0b691b5562d804b3bd54294e6e": { + "name": "TKO-BNB LP token contract", + "address": "0xffd4b200d3c77a0b691b5562d804b3bd54294e6e", + "token": { + "decimals": 18, + "symbol": "TKO-BNB LP" + }, + "isSC": {} + }, + "0xdde420cbb3794ebd8ffc3ac69f9c78e5d1411870": { + "name": "EPS-BNB LP token contract", + "address": "0xdde420cbb3794ebd8ffc3ac69f9c78e5d1411870", + "token": { + "decimals": 18, + "symbol": "EPS-BNB LP" + }, + "isSC": {} + }, + "0xe6b421a4408c82381b226ab5b6f8c4b639044359": { + "name": "TLM-BNB LP token contract", + "address": "0xe6b421a4408c82381b226ab5b6f8c4b639044359", + "token": { + "decimals": 18, + "symbol": "TLM-BNB LP" + }, + "isSC": {} + }, + "0x7752e1fa9f3a2e860856458517008558deb989e3": { + "name": "ALPACA-BUSD LP token contract", + "address": "0x7752e1fa9f3a2e860856458517008558deb989e3", + "token": { + "decimals": 18, + "symbol": "ALPACA-BUSD LP" + }, + "isSC": {} + }, + "0xf45cd219aef8618a92baa7ad848364a158a24f33": { + "name": "BTCB-BUSD LP token contract", + "address": "0xf45cd219aef8618a92baa7ad848364a158a24f33", + "token": { + "decimals": 18, + "symbol": "BTCB-BUSD LP" + }, + "isSC": {} + }, + "0xac109c8025f272414fd9e2faa805a583708a017f": { + "name": "DOGE-BNB LP token contract", + "address": "0xac109c8025f272414fd9e2faa805a583708a017f", + "token": { + "decimals": 18, + "symbol": "DOGE-BNB LP" + }, + "isSC": {} + }, + "0xf23bad605e94de0e3b60c9718a43a94a5af43915": { + "name": "HOTCROSS-BNB LP token contract", + "address": "0xf23bad605e94de0e3b60c9718a43a94a5af43915", + "token": { + "decimals": 18, + "symbol": "HOTCROSS-BNB LP" + }, + "isSC": {} + }, + "0x804678fa97d91b974ec2af3c843270886528a9e6": { + "name": "Cake-BUSD LP token contract", + "address": "0x804678fa97d91b974ec2af3c843270886528a9e6", + "token": { + "decimals": 18, + "symbol": "Cake-BUSD LP" + }, + "isSC": {} + }, + "0x6045931e511ef7e53a4a817f971e0ca28c758809": { + "name": "BUSD-CHR LP token contract", + "address": "0x6045931e511ef7e53a4a817f971e0ca28c758809", + "token": { + "decimals": 18, + "symbol": "BUSD-CHR LP" + }, + "isSC": {} + }, + "0x2e28b9b74d6d99d4697e913b82b41ef1cac51c6c": { + "name": "TUSD-BUSD LP token contract", + "address": "0x2e28b9b74d6d99d4697e913b82b41ef1cac51c6c", + "token": { + "decimals": 18, + "symbol": "TUSD-BUSD LP" + }, + "isSC": {} + }, + "0x8fa59693458289914db0097f5f366d771b7a7c3f": { + "name": "MBOX-BNB LP token contract", + "address": "0x8fa59693458289914db0097f5f366d771b7a7c3f", + "token": { + "decimals": 18, + "symbol": "MBOX-BNB LP" + }, + "isSC": {} + }, + "0xd171b26e4484402de70e3ea256be5a2630d7e88d": { + "name": "ETH-BTCB LP token contract", + "address": "0xd171b26e4484402de70e3ea256be5a2630d7e88d", + "token": { + "decimals": 18, + "symbol": "ETH-BTCB LP" + }, + "isSC": {} + }, + "0xea26b78255df2bbc31c1ebf60010d78670185bd0": { + "name": "ETH-USDC LP token contract", + "address": "0xea26b78255df2bbc31c1ebf60010d78670185bd0", + "token": { + "decimals": 18, + "symbol": "ETH-USDC LP" + }, + "isSC": {} + }, + "0x89ee0491ce55d2f7472a97602a95426216167189": { + "name": "WOO-BNB LP token contract", + "address": "0x89ee0491ce55d2f7472a97602a95426216167189", + "token": { + "decimals": 18, + "symbol": "WOO-BNB LP" + }, + "isSC": {} + }, + "0xba01662e978de7d67f8ffc937726215eb8995d17": { + "name": "BSCPAD-BNB LP token contract", + "address": "0xba01662e978de7d67f8ffc937726215eb8995d17", + "token": { + "decimals": 18, + "symbol": "BSCPAD-BNB LP" + }, + "isSC": {} + }, + "0xa39af17ce4a8eb807e076805da1e2b8ea7d0755b": { + "name": "Cake-USDT LP token contract", + "address": "0xa39af17ce4a8eb807e076805da1e2b8ea7d0755b", + "token": { + "decimals": 18, + "symbol": "Cake-USDT LP" + }, + "isSC": {} + }, + "0xec6557348085aa57c72514d67070dc863c0a5a8c": { + "name": "USDT-USDC LP token contract", + "address": "0xec6557348085aa57c72514d67070dc863c0a5a8c", + "token": { + "decimals": 18, + "symbol": "USDT-USDC LP" + }, + "isSC": {} + }, + "0x89ebf9cd99864f6e51bd7a578965922029cab977": { + "name": "DVI-BNB LP token contract", + "address": "0x89ebf9cd99864f6e51bd7a578965922029cab977", + "token": { + "decimals": 18, + "symbol": "DVI-BNB LP" + }, + "isSC": {} + }, + "0x9d2296e2fe3cdbf2eb3e3e2ca8811bafa42eedff": { + "name": "ONE-BNB LP token contract", + "address": "0x9d2296e2fe3cdbf2eb3e3e2ca8811bafa42eedff", + "token": { + "decimals": 18, + "symbol": "ONE-BNB LP" + }, + "isSC": {} + }, + "0x1472976e0b97f5b2fc93f1fff14e2b5c4447b64f": { + "name": "CHESS-USDC LP token contract", + "address": "0x1472976e0b97f5b2fc93f1fff14e2b5c4447b64f", + "token": { + "decimals": 18, + "symbol": "CHESS-USDC LP" + }, + "isSC": {} + }, + "0xc2d00de94795e60fb76bc37d899170996cbda436": { + "name": "AXS-BNB LP token contract", + "address": "0xc2d00de94795e60fb76bc37d899170996cbda436", + "token": { + "decimals": 18, + "symbol": "AXS-BNB LP" + }, + "isSC": {} + }, + "0x92247860a03f48d5c6425c7ca35cdcfcb1013aa1": { + "name": "C98-BNB LP token contract", + "address": "0x92247860a03f48d5c6425c7ca35cdcfcb1013aa1", + "token": { + "decimals": 18, + "symbol": "C98-BNB LP" + }, + "isSC": {} + }, + "0xfdfde3af740a22648b9dd66d05698e5095940850": { + "name": "SPS-BNB LP token contract", + "address": "0xfdfde3af740a22648b9dd66d05698e5095940850", + "token": { + "decimals": 18, + "symbol": "SPS-BNB LP" + }, + "isSC": {} + }, + "0x6a445ceb72c8b1751755386c3990055ff92e14a0": { + "name": "WIN-BUSD LP token contract", + "address": "0x6a445ceb72c8b1751755386c3990055ff92e14a0", + "token": { + "decimals": 18, + "symbol": "WIN-BUSD LP" + }, + "isSC": {} + }, + "0xb5d108578be3750209d1b3a8f45ffee8c5a75146": { + "name": "TRX-BUSD LP token contract", + "address": "0xb5d108578be3750209d1b3a8f45ffee8c5a75146", + "token": { + "decimals": 18, + "symbol": "TRX-BUSD LP" + }, + "isSC": {} + }, + "0x59fac9e98479fc9979ae2a0c7422af50bcbb9b26": { + "name": "rUSD-BUSD LP token contract", + "address": "0x59fac9e98479fc9979ae2a0c7422af50bcbb9b26", + "token": { + "decimals": 18, + "symbol": "rUSD-BUSD LP" + }, + "isSC": {} + }, + "0x2bf2deb40639201c9a94c9e33b4852d9aea5fd2d": { + "name": "BP-BNB LP token contract", + "address": "0x2bf2deb40639201c9a94c9e33b4852d9aea5fd2d", + "token": { + "decimals": 18, + "symbol": "BP-BNB LP" + }, + "isSC": {} + }, + "0x74fa517715c4ec65ef01d55ad5335f90dce7cc87": { + "name": "SFUND-BNB LP token contract", + "address": "0x74fa517715c4ec65ef01d55ad5335f90dce7cc87", + "token": { + "decimals": 18, + "symbol": "SFUND-BNB LP" + }, + "isSC": {} + }, + "0x0ecc84c9629317a494f12bc56aa2522475bf32e8": { + "name": "NFT-BNB LP token contract", + "address": "0x0ecc84c9629317a494f12bc56aa2522475bf32e8", + "token": { + "decimals": 18, + "symbol": "NFT-BNB LP" + }, + "isSC": {} + }, + "0x88a02d94f437799f06f8c256ff07aa397e6d0016": { + "name": "BNB-BETA LP token contract", + "address": "0x88a02d94f437799f06f8c256ff07aa397e6d0016", + "token": { + "decimals": 18, + "symbol": "BNB-BETA LP" + }, + "isSC": {} + }, + "0x11c0b2bb4fbb430825d07507a9e24e4c32f7704d": { + "name": "LAZIO-BNB LP token contract", + "address": "0x11c0b2bb4fbb430825d07507a9e24e4c32f7704d", + "token": { + "decimals": 18, + "symbol": "LAZIO-BNB LP" + }, + "isSC": {} + }, + "0x365c3f921b2915a480308d0b1c04aef7b99c2876": { + "name": "DKT-BNB LP token contract", + "address": "0x365c3f921b2915a480308d0b1c04aef7b99c2876", + "token": { + "decimals": 18, + "symbol": "DKT-BNB LP" + }, + "isSC": {} + }, + "0x6db23b5360c9d2859fdcbf41c56494e7b8573649": { + "name": "FINA-BUSD LP token contract", + "address": "0x6db23b5360c9d2859fdcbf41c56494e7b8573649", + "token": { + "decimals": 18, + "symbol": "FINA-BUSD LP" + }, + "isSC": {} + }, + "0x062f88e2b4896e823ac78ac314468c29eec4186d": { + "name": "DAR-BNB LP token contract", + "address": "0x062f88e2b4896e823ac78ac314468c29eec4186d", + "token": { + "decimals": 18, + "symbol": "DAR-BNB LP" + }, + "isSC": {} + }, + "0x936928146a21afccd30dfa84824a780572b1630b": { + "name": "XWG-USDC LP token contract", + "address": "0x936928146a21afccd30dfa84824a780572b1630b", + "token": { + "decimals": 18, + "symbol": "XWG-USDC LP" + }, + "isSC": {} + }, + "0x0a292e96abb35297786a38fdd67dc4f82689e670": { + "name": "PORTO-BNB LP token contract", + "address": "0x0a292e96abb35297786a38fdd67dc4f82689e670", + "token": { + "decimals": 18, + "symbol": "PORTO-BNB LP" + }, + "isSC": {} + }, + "0xf924e642f05acc57fc3b14990c2b1a137683b201": { + "name": "QI-BNB LP token contract", + "address": "0xf924e642f05acc57fc3b14990c2b1a137683b201", + "token": { + "decimals": 18, + "symbol": "QI-BNB LP" + }, + "isSC": {} + }, + "0x06043b346450bbcfde066ebc39fdc264fdffed74": { + "name": "SANTOS-BNB LP token contract", + "address": "0x06043b346450bbcfde066ebc39fdc264fdffed74", + "token": { + "decimals": 18, + "symbol": "SANTOS-BNB LP" + }, + "isSC": {} + }, + "0x71e6de81381efe0aa98f56b3b43eb3727d640715": { + "name": "IDIA-BUSD LP token contract", + "address": "0x71e6de81381efe0aa98f56b3b43eb3727d640715", + "token": { + "decimals": 18, + "symbol": "IDIA-BUSD LP" + }, + "isSC": {} + }, + "0x486697ae24469cb1122f537924aa46e705b142aa": { + "name": "THG-BNB LP token contract", + "address": "0x486697ae24469cb1122f537924aa46e705b142aa", + "token": { + "decimals": 18, + "symbol": "THG-BNB LP" + }, + "isSC": {} + }, + "0x141e9558f66cc21c93628400cca7d830c15c2c24": { + "name": "BNB-DPT LP token contract", + "address": "0x141e9558f66cc21c93628400cca7d830c15c2c24", + "token": { + "decimals": 18, + "symbol": "BNB-DPT LP" + }, + "isSC": {} + }, + "0xe98ac95a1db2fcaaa9c7d4ba7ecfce4877ca2bea": { + "name": "HIGH-BUSD LP token contract", + "address": "0xe98ac95a1db2fcaaa9c7d4ba7ecfce4877ca2bea", + "token": { + "decimals": 18, + "symbol": "HIGH-BUSD LP" + }, + "isSC": {} + }, + "0x2ae94a6c768d59f5ddc25bd7f12c7cbe1d51dc04": { + "name": "WOOP-BNB LP token contract", + "address": "0x2ae94a6c768d59f5ddc25bd7f12c7cbe1d51dc04", + "token": { + "decimals": 18, + "symbol": "WOOP-BNB LP" + }, + "isSC": {} + }, + "0x88c9bf5e334e2591c6a866d5e20683e31226be3d": { + "name": "AOG-BUSD LP token contract", + "address": "0x88c9bf5e334e2591c6a866d5e20683e31226be3d", + "token": { + "decimals": 18, + "symbol": "AOG-BUSD LP" + }, + "isSC": {} + }, + "0x2eebe0c34da9ba65521e98cbaa7d97496d05f489": { + "name": "BCOIN-BNB LP token contract", + "address": "0x2eebe0c34da9ba65521e98cbaa7d97496d05f489", + "token": { + "decimals": 18, + "symbol": "BCOIN-BNB LP" + }, + "isSC": {} + }, + "0xa0ee789a8f581cb92dd9742ed0b5d54a0916976c": { + "name": "APX-BUSD LP token contract", + "address": "0xa0ee789a8f581cb92dd9742ed0b5d54a0916976c", + "token": { + "decimals": 18, + "symbol": "APX-BUSD LP" + }, + "isSC": {} + }, + "0x1ce76390dd210b9c9ae28373fdf79714206ecb73": { + "name": "BNB-Froyo LP token contract", + "address": "0x1ce76390dd210b9c9ae28373fdf79714206ecb73", + "token": { + "decimals": 18, + "symbol": "BNB-Froyo LP" + }, + "isSC": {} + }, + "0x6483f166b9e4310a165a55fea04f867499aded06": { + "name": "FUSE-BNB LP token contract", + "address": "0x6483f166b9e4310a165a55fea04f867499aded06", + "token": { + "decimals": 18, + "symbol": "FUSE-BNB LP" + }, + "isSC": {} + }, + "0x70531b39e2bb4d8da59e2ce41a98eba2990f8497": { + "name": "ERTHA-BNB LP token contract", + "address": "0x70531b39e2bb4d8da59e2ce41a98eba2990f8497", + "token": { + "decimals": 18, + "symbol": "ERTHA-BNB LP" + }, + "isSC": {} + }, + "0x8e744ec2795c8b836689d1b4ebe1489204357dac": { + "name": "RACA-BUSD LP token contract", + "address": "0x8e744ec2795c8b836689d1b4ebe1489204357dac", + "token": { + "decimals": 18, + "symbol": "RACA-BUSD LP" + }, + "isSC": {} + }, + "0x28bdb16b623176426305a70d8b475be73aca71f3": { + "name": "USDT-ACH LP token contract", + "address": "0x28bdb16b623176426305a70d8b475be73aca71f3", + "token": { + "decimals": 18, + "symbol": "USDT-ACH LP" + }, + "isSC": {} + }, + "0xb7e73daee6a6ca37a21f8e4bfba4da448dfe4d92": { + "name": "BTT-BUSD LP token contract", + "address": "0xb7e73daee6a6ca37a21f8e4bfba4da448dfe4d92", + "token": { + "decimals": 18, + "symbol": "BTT-BUSD LP" + }, + "isSC": {} + }, + "0x53a63ac301d6410915385294527f947aff616599": { + "name": "ERA-BNB LP token contract", + "address": "0x53a63ac301d6410915385294527f947aff616599", + "token": { + "decimals": 18, + "symbol": "ERA-BNB LP" + }, + "isSC": {} + }, + "0x007ec643c7cc33a70c083fc305c283dd009c8b94": { + "name": "GMT-USDC LP token contract", + "address": "0x007ec643c7cc33a70c083fc305c283dd009c8b94", + "token": { + "decimals": 18, + "symbol": "GMT-USDC LP" + }, + "isSC": {} + }, + "0xbdf0aa1d1985caa357a6ac6661d838da8691c569": { + "name": "Cake-DUET LP token contract", + "address": "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", + "token": { + "decimals": 18, + "symbol": "Cake-DUET LP" + }, + "isSC": {} + }, + "0x8ca3ff14a52b080c54a6d1a405eeca02959d39fe": { + "name": "BSW-BNB LP token contract", + "address": "0x8ca3ff14a52b080c54a6d1a405eeca02959d39fe", + "token": { + "decimals": 18, + "symbol": "BSW-BNB LP" + }, + "isSC": {} + }, + "0x1ccc3cc95c8148477afd18a552f03835be9d182a": { + "name": "Cake-Froyo LP token contract", + "address": "0x1ccc3cc95c8148477afd18a552f03835be9d182a", + "token": { + "decimals": 18, + "symbol": "Cake-Froyo LP" + }, + "isSC": {} + }, + "0x58d4b61983ca0afe6e352e90719f403e24e016f4": { + "name": "GMI-BNB LP token contract", + "address": "0x58d4b61983ca0afe6e352e90719f403e24e016f4", + "token": { + "decimals": 18, + "symbol": "GMI-BNB LP" + }, + "isSC": {} + }, + "0x5ca96e8bde0bc587dac9e02422fd205b1102daa4": { + "name": "PEX-BNB LP token contract", + "address": "0x5ca96e8bde0bc587dac9e02422fd205b1102daa4", + "token": { + "decimals": 18, + "symbol": "PEX-BNB LP" + }, + "isSC": {} + }, + "0x0d5b9a0f4315a4bce36d1ea7d6b6d3123167afaa": { + "name": "TINC-BNB LP token contract", + "address": "0x0d5b9a0f4315a4bce36d1ea7d6b6d3123167afaa", + "token": { + "decimals": 18, + "symbol": "TINC-BNB LP" + }, + "isSC": {} + }, + "0x046a9b3a9b743340ee2bc4c6ddd35543e237c6c2": { + "name": "CEEK-BNB LP token contract", + "address": "0x046a9b3a9b743340ee2bc4c6ddd35543e237c6c2", + "token": { + "decimals": 18, + "symbol": "CEEK-BNB LP" + }, + "isSC": {} + }, + "0x008604a38cd589680f7b8f085dc2d5b4f81151db": { + "name": "HAPPY-BNB LP token contract", + "address": "0x008604a38cd589680f7b8f085dc2d5b4f81151db", + "token": { + "decimals": 18, + "symbol": "HAPPY-BNB LP" + }, + "isSC": {} + }, + "0xee456d906a38e10680c9d157fff143390e9681ba": { + "name": "WZRD-BUSD LP token contract", + "address": "0xee456d906a38e10680c9d157fff143390e9681ba", + "token": { + "decimals": 18, + "symbol": "WZRD-BUSD LP" + }, + "isSC": {} + }, + "0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c": { + "name": "ADX-LOYALTY token contract", + "address": "0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c", + "token": { + "decimals": 18, + "symbol": "ADX-LOYALTY" + }, + "isSC": {} + }, + "0xfe39e6a32acd2af7955cb3d406ba2b55c901f247": { + "name": "ZT token contract", + "address": "0xfe39e6a32acd2af7955cb3d406ba2b55c901f247", + "token": { + "decimals": 18, + "symbol": "ZT" + }, + "isSC": {} + }, + "0x15d4c048f83bd7e37d49ea4c83a07267ec4203da": { + "name": "Gala", + "address": "0x15d4c048f83bd7e37d49ea4c83a07267ec4203da", + "token": { + "decimals": 8, + "symbol": "GALA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gala.svg" + }, + "0xef40b859d21e4d566a3d713e756197c021bffaaa": { + "name": "NFT token contract", + "address": "0xef40b859d21e4d566a3d713e756197c021bffaaa", + "token": { + "decimals": 6, + "symbol": "NFT" + }, + "isSC": {} + }, + "0x3db6ba6ab6f95efed1a6e794cad492faaabf294d": { + "name": "LTO Network Token (old)", + "address": "0x3db6ba6ab6f95efed1a6e794cad492faaabf294d", + "token": { + "decimals": 8, + "symbol": "LTOOLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LTO.svg" + }, + "0x8762db106b2c2a0bccb3a80d1ed41273552616e8": { + "name": "RSR token contract", + "address": "0x8762db106b2c2a0bccb3a80d1ed41273552616e8", + "token": { + "decimals": 18, + "symbol": "RSR" + }, + "isSC": {} + }, + "0x9534ad65fb398e27ac8f4251dae1780b989d136e": { + "name": "PYR token contract", + "address": "0x9534ad65fb398e27ac8f4251dae1780b989d136e", + "token": { + "decimals": 18, + "symbol": "PYR" + }, + "isSC": {} + }, + "0x3a3a65aab0dd2a17e3f1947ba16138cd37d08c04": { + "name": "AETH token contract", + "address": "0x3a3a65aab0dd2a17e3f1947ba16138cd37d08c04", + "token": { + "decimals": 18, + "symbol": "AETH" + }, + "isSC": {} + }, + "0xa649325aa7c5093d12d6f98eb4378deae68ce23f": { + "name": "BNB token contract", + "address": "0xa649325aa7c5093d12d6f98eb4378deae68ce23f", + "token": { + "decimals": 18, + "symbol": "BNB" + }, + "isSC": {} + }, + "0xc6d54d2f624bc83815b49d9c2203b1330b841ca0": { + "name": "SAND token contract", + "address": "0xc6d54d2f624bc83815b49d9c2203b1330b841ca0", + "token": { + "decimals": 18, + "symbol": "SAND" + }, + "isSC": {} + }, + "0x45c32fa6df82ead1e2ef74d17b76547eddfaff89": { + "name": "FRAX token contract", + "address": "0x45c32fa6df82ead1e2ef74d17b76547eddfaff89", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {} + }, + "0xd8ca34fd379d9ca3c6ee3b3905678320f5b45195": { + "name": "GOHM token contract", + "address": "0xd8ca34fd379d9ca3c6ee3b3905678320f5b45195", + "token": { + "decimals": 18, + "symbol": "GOHM" + }, + "isSC": {} + }, + "0x4e78011ce80ee02d2c3e649fb657e45898257815": { + "name": "KLIMA token contract", + "address": "0x4e78011ce80ee02d2c3e649fb657e45898257815", + "token": { + "decimals": 9, + "symbol": "KLIMA" + }, + "isSC": {} + }, + "0x8a953cfe442c5e8855cc6c61b1293fa648bae472": { + "name": "POLYDOGE token contract", + "address": "0x8a953cfe442c5e8855cc6c61b1293fa648bae472", + "token": { + "decimals": 18, + "symbol": "POLYDOGE" + }, + "isSC": {} + }, + "0x22e3f02f86bc8ea0d73718a2ae8851854e62adc5": { + "name": "FLAME token contract", + "address": "0x22e3f02f86bc8ea0d73718a2ae8851854e62adc5", + "token": { + "decimals": 18, + "symbol": "FLAME" + }, + "isSC": {} + }, + "0x7f426f6dc648e50464a0392e60e1bb465a67e9cf": { + "name": "AUTO token contract", + "address": "0x7f426f6dc648e50464a0392e60e1bb465a67e9cf", + "token": { + "decimals": 18, + "symbol": "AUTO" + }, + "isSC": {} + }, + "0xf8f9efc0db77d8881500bb06ff5d6abc3070e695": { + "name": "SYN token contract", + "address": "0xf8f9efc0db77d8881500bb06ff5d6abc3070e695", + "token": { + "decimals": 18, + "symbol": "SYN" + }, + "isSC": {} + }, + "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4": { + "name": "AMWMATIC token contract", + "address": "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4", + "token": { + "decimals": 18, + "symbol": "AMWMATIC" + }, + "isSC": {} + }, + "0x60d55f02a771d515e077c9c2403a1ef324885cec": { + "name": "AMUSDT token contract", + "address": "0x60d55f02a771d515e077c9c2403a1ef324885cec", + "token": { + "decimals": 6, + "symbol": "AMUSDT" + }, + "isSC": {} + }, + "0x1a13f4ca1d028320a707d99520abfefca3998b7f": { + "name": "AMUSDC token contract", + "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f", + "token": { + "decimals": 6, + "symbol": "AMUSDC" + }, + "isSC": {} + }, + "0x5c2ed810328349100a66b82b78a1791b101c9d61": { + "name": "AMWBTC token contract", + "address": "0x5c2ed810328349100a66b82b78a1791b101c9d61", + "token": { + "decimals": 8, + "symbol": "AMWBTC" + }, + "isSC": {} + }, + "0x1d2a0e5ec8e5bbdca5cb219e649b565d8e5c3360": { + "name": "AMAAVE token contract", + "address": "0x1d2a0e5ec8e5bbdca5cb219e649b565d8e5c3360", + "token": { + "decimals": 18, + "symbol": "AMAAVE" + }, + "isSC": {} + }, + "0x28424507fefb6f7f8e9d3860f56504e4e5f5f390": { + "name": "AMWETH token contract", + "address": "0x28424507fefb6f7f8e9d3860f56504e4e5f5f390", + "token": { + "decimals": 18, + "symbol": "AMWETH" + }, + "isSC": {} + }, + "0x6bff4fb161347ad7de4a625ae5aa3a1ca7077819": { + "name": "ADX token contract", + "address": "0x6bff4fb161347ad7de4a625ae5aa3a1ca7077819", + "token": { + "decimals": 18, + "symbol": "ADX" + }, + "isSC": {} + }, + "0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "name": "BUSD token contract", + "address": "0xe9e7cea3dedca5984780bafc599bd69add087d56", + "token": { + "decimals": 18, + "symbol": "BUSD" + }, + "isSC": {} + }, + "0xba96731324de188ebc1ed87ca74544ddebc07d7f": { + "name": "TITANO token contract", + "address": "0xba96731324de188ebc1ed87ca74544ddebc07d7f", + "token": { + "decimals": 18, + "symbol": "TITANO" + }, + "isSC": {} + }, + "0xcc42724c6683b7e57334c4e856f4c9965ed682bd": { + "name": "MATIC token contract", + "address": "0xcc42724c6683b7e57334c4e856f4c9965ed682bd", + "token": { + "decimals": 18, + "symbol": "MATIC" + }, + "isSC": {} + }, + "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "name": "USDC token contract", + "address": "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd": { + "name": "LINK token contract", + "address": "0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {} + }, + "0x0eb3a705fc54725037cc9e008bdede697f62f335": { + "name": "ATOM token contract", + "address": "0x0eb3a705fc54725037cc9e008bdede697f62f335", + "token": { + "decimals": 18, + "symbol": "ATOM" + }, + "isSC": {} + }, + "0xad29abb318791d579433d831ed122afeaf29dcfe": { + "name": "FTM token contract", + "address": "0xad29abb318791d579433d831ed122afeaf29dcfe", + "token": { + "decimals": 18, + "symbol": "FTM" + }, + "isSC": {} + }, + "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c": { + "name": "WBNB token contract", + "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "token": { + "decimals": 18, + "symbol": "WBNB" + }, + "isSC": {} + }, + "0x947950bcc74888a40ffa2593c5798f11fc9124c4": { + "name": "SUSHI token contract", + "address": "0x947950bcc74888a40ffa2593c5798f11fc9124c4", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {} + }, + "0xbf5140a22578168fd562dccf235e5d43a02ce9b1": { + "name": "UNI token contract", + "address": "0xbf5140a22578168fd562dccf235e5d43a02ce9b1", + "token": { + "decimals": 18, + "symbol": "UNI" + }, + "isSC": {} + }, + "0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3": { + "name": "DAI token contract", + "address": "0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x8595f9da7b868b1822194faed312235e43007b49": { + "name": "BTT token contract", + "address": "0x8595f9da7b868b1822194faed312235e43007b49", + "token": { + "decimals": 18, + "symbol": "BTT" + }, + "isSC": {} + }, + "0x3910db0600ea925f63c36ddb1351ab6e2c6eb102": { + "name": "SPARTA token contract", + "address": "0x3910db0600ea925f63c36ddb1351ab6e2c6eb102", + "token": { + "decimals": 18, + "symbol": "SPARTA" + }, + "isSC": {} + }, + "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82": { + "name": "CAKE token contract", + "address": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", + "token": { + "decimals": 18, + "symbol": "CAKE" + }, + "isSC": {} + }, + "0x857b222fc79e1cbbf8ca5f78cb133d1b7cf34bbd": { + "name": "LTO token contract", + "address": "0x857b222fc79e1cbbf8ca5f78cb133d1b7cf34bbd", + "token": { + "decimals": 18, + "symbol": "LTO" + }, + "isSC": {} + }, + "0x47bead2563dcbf3bf2c9407fea4dc236faba485a": { + "name": "SXP token contract", + "address": "0x47bead2563dcbf3bf2c9407fea4dc236faba485a", + "token": { + "decimals": 18, + "symbol": "SXP" + }, + "isSC": {} + }, + "0x3203c9e46ca618c8c1ce5dc67e7e9d75f5da2377": { + "name": "MBOX token contract", + "address": "0x3203c9e46ca618c8c1ce5dc67e7e9d75f5da2377", + "token": { + "decimals": 18, + "symbol": "MBOX" + }, + "isSC": {} + }, + "0xaec945e04baf28b135fa7c640f624f8d90f1c3a6": { + "name": "C98 token contract", + "address": "0xaec945e04baf28b135fa7c640f624f8d90f1c3a6", + "token": { + "decimals": 18, + "symbol": "C98" + }, + "isSC": {} + }, + "0x928e55dab735aa8260af3cedada18b5f70c72f1b": { + "name": "FRONT token contract", + "address": "0x928e55dab735aa8260af3cedada18b5f70c72f1b", + "token": { + "decimals": 18, + "symbol": "FRONT" + }, + "isSC": {} + }, + "0x90c97f71e18723b0cf0dfa30ee176ab653e89f40": { + "name": "FRAX token contract", + "address": "0x90c97f71e18723b0cf0dfa30ee176ab653e89f40", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {} + }, + "0x6679eb24f59dfe111864aec72b443d1da666b360": { + "name": "ARV token contract", + "address": "0x6679eb24f59dfe111864aec72b443d1da666b360", + "token": { + "decimals": 8, + "symbol": "ARV" + }, + "isSC": {} + }, + "0x00e1656e45f18ec6747f5a8496fd39b50b38396d": { + "name": "BCOIN token contract", + "address": "0x00e1656e45f18ec6747f5a8496fd39b50b38396d", + "token": { + "decimals": 18, + "symbol": "BCOIN" + }, + "isSC": {} + }, + "0x965f527d9159dce6288a2219db51fc6eef120dd1": { + "name": "BSW token contract", + "address": "0x965f527d9159dce6288a2219db51fc6eef120dd1", + "token": { + "decimals": 18, + "symbol": "BSW" + }, + "isSC": {} + }, + "0xd41fdb03ba84762dd66a0af1a6c8540ff1ba5dfb": { + "name": "SFP token contract", + "address": "0xd41fdb03ba84762dd66a0af1a6c8540ff1ba5dfb", + "token": { + "decimals": 18, + "symbol": "SFP" + }, + "isSC": {} + }, + "0xe02df9e3e622debdd69fb838bb799e3f168902c5": { + "name": "BAKE token contract", + "address": "0xe02df9e3e622debdd69fb838bb799e3f168902c5", + "token": { + "decimals": 18, + "symbol": "BAKE" + }, + "isSC": {} + }, + "0x8b303d5bbfbbf46f1a4d9741e491e06986894e18": { + "name": "WOOP token contract", + "address": "0x8b303d5bbfbbf46f1a4d9741e491e06986894e18", + "token": { + "decimals": 18, + "symbol": "WOOP" + }, + "isSC": {} + }, + "0xa2b726b1145a4773f68593cf171187d8ebe4d495": { + "name": "INJ token contract", + "address": "0xa2b726b1145a4773f68593cf171187d8ebe4d495", + "token": { + "decimals": 18, + "symbol": "INJ" + }, + "isSC": {} + }, + "0x728c5bac3c3e370e372fc4671f9ef6916b814d8b": { + "name": "UNFI token contract", + "address": "0x728c5bac3c3e370e372fc4671f9ef6916b814d8b", + "token": { + "decimals": 18, + "symbol": "UNFI" + }, + "isSC": {} + }, + "0x935a544bf5816e3a7c13db2efe3009ffda0acda2": { + "name": "BLZ token contract", + "address": "0x935a544bf5816e3a7c13db2efe3009ffda0acda2", + "token": { + "decimals": 18, + "symbol": "BLZ" + }, + "isSC": {} + }, + "0xd40bedb44c081d2935eeba6ef5a3c8a31a1bbe13": { + "name": "HERO token contract", + "address": "0xd40bedb44c081d2935eeba6ef5a3c8a31a1bbe13", + "token": { + "decimals": 18, + "symbol": "HERO" + }, + "isSC": {} + }, + "0xae9269f27437f0fcbc232d39ec814844a51d6b8f": { + "name": "BURGER token contract", + "address": "0xae9269f27437f0fcbc232d39ec814844a51d6b8f", + "token": { + "decimals": 18, + "symbol": "BURGER" + }, + "isSC": {} + }, + "0xed8c8aa8299c10f067496bb66f8cc7fb338a3405": { + "name": "PROS token contract", + "address": "0xed8c8aa8299c10f067496bb66f8cc7fb338a3405", + "token": { + "decimals": 18, + "symbol": "PROS" + }, + "isSC": {} + }, + "0x23396cf899ca06c4472205fc903bdb4de249d6fc": { + "name": "UST token contract", + "address": "0x23396cf899ca06c4472205fc903bdb4de249d6fc", + "token": { + "decimals": 18, + "symbol": "UST" + }, + "isSC": {} + }, + "0x7ad7242a99f21aa543f9650a56d141c57e4f6081": { + "name": "JADE token contract", + "address": "0x7ad7242a99f21aa543f9650a56d141c57e4f6081", + "token": { + "decimals": 9, + "symbol": "JADE" + }, + "isSC": {} + }, + "0x4b0f1812e5df2a09796481ff14017e6005508003": { + "name": "TWT token contract", + "address": "0x4b0f1812e5df2a09796481ff14017e6005508003", + "token": { + "decimals": 18, + "symbol": "TWT" + }, + "isSC": {} + }, + "0xc2a605a31bf67a5af81cf6e39af79a62d8462717": { + "name": "RPS token contract", + "address": "0xc2a605a31bf67a5af81cf6e39af79a62d8462717", + "token": { + "decimals": 18, + "symbol": "RPS" + }, + "isSC": {} + }, + "0x8850d2c68c632e3b258e612abaa8fada7e6958e5": { + "name": "PIG token contract", + "address": "0x8850d2c68c632e3b258e612abaa8fada7e6958e5", + "token": { + "decimals": 9, + "symbol": "PIG" + }, + "isSC": {} + }, + "0xdaacb0ab6fb34d24e8a67bfa14bf4d95d4c7af92": { + "name": "PNT token contract", + "address": "0xdaacb0ab6fb34d24e8a67bfa14bf4d95d4c7af92", + "token": { + "decimals": 18, + "symbol": "PNT" + }, + "isSC": {} + }, + "0x50332bdca94673f33401776365b66cc4e81ac81d": { + "name": "CCAR token contract", + "address": "0x50332bdca94673f33401776365b66cc4e81ac81d", + "token": { + "decimals": 18, + "symbol": "CCAR" + }, + "isSC": {} + }, + "0x3f515f0a8e93f2e2f891ceeb3db4e62e202d7110": { + "name": "VIDT token contract", + "address": "0x3f515f0a8e93f2e2f891ceeb3db4e62e202d7110", + "token": { + "decimals": 18, + "symbol": "VIDT" + }, + "isSC": {} + }, + "0x5649e392a1bac3e21672203589adf8f6c99f8db3": { + "name": "ZDC token contract", + "address": "0x5649e392a1bac3e21672203589adf8f6c99f8db3", + "token": { + "decimals": 18, + "symbol": "ZDC" + }, + "isSC": {} + }, + "0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63": { + "name": "XVS token contract", + "address": "0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63", + "token": { + "decimals": 18, + "symbol": "XVS" + }, + "isSC": {} + }, + "0x6b81ed499bfe7f4cb79c381892e5ce69c3c9a9df": { + "name": "CLCT token contract", + "address": "0x6b81ed499bfe7f4cb79c381892e5ce69c3c9a9df", + "token": { + "decimals": 18, + "symbol": "CLCT" + }, + "isSC": {} + }, + "0x9ba6a67a6f3b21705a46b380a1b97373a33da311": { + "name": "FEAR token contract", + "address": "0x9ba6a67a6f3b21705a46b380a1b97373a33da311", + "token": { + "decimals": 18, + "symbol": "FEAR" + }, + "isSC": {} + }, + "0x3fda9383a84c05ec8f7630fe10adf1fac13241cc": { + "name": "DEGO token contract", + "address": "0x3fda9383a84c05ec8f7630fe10adf1fac13241cc", + "token": { + "decimals": 18, + "symbol": "DEGO" + }, + "isSC": {} + }, + "0x0a3a21356793b49154fd3bbe91cbc2a16c0457f5": { + "name": "RFOX token contract", + "address": "0x0a3a21356793b49154fd3bbe91cbc2a16c0457f5", + "token": { + "decimals": 18, + "symbol": "RFOX" + }, + "isSC": {} + }, + "0x8443f091997f06a61670b735ed92734f5628692f": { + "name": "BEL token contract", + "address": "0x8443f091997f06a61670b735ed92734f5628692f", + "token": { + "decimals": 18, + "symbol": "BEL" + }, + "isSC": {} + }, + "0x477bc8d23c634c154061869478bce96be6045d12": { + "name": "SFUND token contract", + "address": "0x477bc8d23c634c154061869478bce96be6045d12", + "token": { + "decimals": 18, + "symbol": "SFUND" + }, + "isSC": {} + }, + "0xcd1faff6e578fa5cac469d2418c95671ba1a62fe": { + "name": "Torum Token", + "address": "0xcd1faff6e578fa5cac469d2418c95671ba1a62fe", + "token": { + "decimals": 18, + "symbol": "XTM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/torum.svg" + }, + "0x87230146e138d3f296a9a77e497a2a83012e9bc5": { + "name": "SQUID token contract", + "address": "0x87230146e138d3f296a9a77e497a2a83012e9bc5", + "token": { + "decimals": 18, + "symbol": "SQUID" + }, + "isSC": {} + }, + "0x41cf3e9534156405a133cda545af9ff0e586500a": { + "name": "GAMINGSHIBA token contract", + "address": "0x41cf3e9534156405a133cda545af9ff0e586500a", + "token": { + "decimals": 9, + "symbol": "GAMINGSHIBA" + }, + "isSC": {} + }, + "0x39ae8eefb05138f418bb27659c21632dc1ddab10": { + "name": "KAI token contract", + "address": "0x39ae8eefb05138f418bb27659c21632dc1ddab10", + "token": { + "decimals": 18, + "symbol": "KAI" + }, + "isSC": {} + }, + "0x431e0cd023a32532bf3969cddfc002c00e98429d": { + "name": "XCAD token contract", + "address": "0x431e0cd023a32532bf3969cddfc002c00e98429d", + "token": { + "decimals": 18, + "symbol": "XCAD" + }, + "isSC": {} + }, + "0x2963dcc52549573bbfbe355674724528532c0867": { + "name": "PEX token contract", + "address": "0x2963dcc52549573bbfbe355674724528532c0867", + "token": { + "decimals": 18, + "symbol": "PEX" + }, + "isSC": {} + }, + "0xa77346760341460b42c230ca6d21d4c8e743fa9c": { + "name": "PETS token contract", + "address": "0xa77346760341460b42c230ca6d21d4c8e743fa9c", + "token": { + "decimals": 18, + "symbol": "PETS" + }, + "isSC": {} + }, + "0x78650b139471520656b9e7aa7a5e9276814a38e9": { + "name": "BTCST token contract", + "address": "0x78650b139471520656b9e7aa7a5e9276814a38e9", + "token": { + "decimals": 17, + "symbol": "BTCST" + }, + "isSC": {} + }, + "0x5d0158a5c3ddf47d4ea4517d8db0d76aa2e87563": { + "name": "BONDLY token contract", + "address": "0x5d0158a5c3ddf47d4ea4517d8db0d76aa2e87563", + "token": { + "decimals": 18, + "symbol": "BONDLY" + }, + "isSC": {} + }, + "0xc3adbf524513863102df6784e1ab5652165c7912": { + "name": "SOUL token contract", + "address": "0xc3adbf524513863102df6784e1ab5652165c7912", + "token": { + "decimals": 8, + "symbol": "SOUL" + }, + "isSC": {} + }, + "0x8f0528ce5ef7b51152a59745befdd91d97091d2f": { + "name": "ALPACA token contract", + "address": "0x8f0528ce5ef7b51152a59745befdd91d97091d2f", + "token": { + "decimals": 18, + "symbol": "ALPACA" + }, + "isSC": {} + }, + "0xa0c8c80ed6b7f09f885e826386440b2349f0da7e": { + "name": "SSG token contract", + "address": "0xa0c8c80ed6b7f09f885e826386440b2349f0da7e", + "token": { + "decimals": 18, + "symbol": "SSG" + }, + "isSC": {} + }, + "0x039cb485212f996a9dbb85a9a75d898f94d38da6": { + "name": "DEXE token contract", + "address": "0x039cb485212f996a9dbb85a9a75d898f94d38da6", + "token": { + "decimals": 18, + "symbol": "DEXE" + }, + "isSC": {} + }, + "0xa64455a4553c9034236734faddaddbb64ace4cc7": { + "name": "SANTOS token contract", + "address": "0xa64455a4553c9034236734faddaddbb64ace4cc7", + "token": { + "decimals": 8, + "symbol": "SANTOS" + }, + "isSC": {} + }, + "0x0e37d70b51ffa2b98b4d34a5712c5291115464e3": { + "name": "IQ token contract", + "address": "0x0e37d70b51ffa2b98b4d34a5712c5291115464e3", + "token": { + "decimals": 18, + "symbol": "IQ" + }, + "isSC": {} + }, + "0x3c6dad0475d3a1696b359dc04c99fd401be134da": { + "name": "SAITO token contract", + "address": "0x3c6dad0475d3a1696b359dc04c99fd401be134da", + "token": { + "decimals": 18, + "symbol": "SAITO" + }, + "isSC": {} + }, + "0xa184088a740c695e156f91f5cc086a06bb78b827": { + "name": "AUTO token contract", + "address": "0xa184088a740c695e156f91f5cc086a06bb78b827", + "token": { + "decimals": 18, + "symbol": "AUTO" + }, + "isSC": {} + }, + "0x19e6bfc1a6e4b042fb20531244d47e252445df01": { + "name": "TEM token contract", + "address": "0x19e6bfc1a6e4b042fb20531244d47e252445df01", + "token": { + "decimals": 9, + "symbol": "TEM" + }, + "isSC": {} + }, + "0xdfe6891ce8e5a5c7cf54ffde406a6c2c54145f71": { + "name": "$CINU token contract", + "address": "0xdfe6891ce8e5a5c7cf54ffde406a6c2c54145f71", + "token": { + "decimals": 9, + "symbol": "$CINU" + }, + "isSC": {} + }, + "0x9029fdfae9a03135846381c7ce16595c3554e10a": { + "name": "OOE token contract", + "address": "0x9029fdfae9a03135846381c7ce16595c3554e10a", + "token": { + "decimals": 18, + "symbol": "OOE" + }, + "isSC": {} + }, + "0xfb6115445bff7b52feb98650c87f44907e58f802": { + "name": "AAVE token contract", + "address": "0xfb6115445bff7b52feb98650c87f44907e58f802", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0x55d398326f99059ff775485246999027b3197955": { + "name": "USDT token contract", + "address": "0x55d398326f99059ff775485246999027b3197955", + "token": { + "decimals": 18, + "symbol": "USDT" + }, + "isSC": {} + }, + "0xba2ae424d960c26247dd6c32edc70b295c744c43": { + "name": "DOGE token contract", + "address": "0xba2ae424d960c26247dd6c32edc70b295c744c43", + "token": { + "decimals": 8, + "symbol": "DOGE" + }, + "isSC": {} + }, + "0x19860ccb0a68fd4213ab9d8266f7bbf05a8dde98": { + "name": "BUSD token contract", + "address": "0x19860ccb0a68fd4213ab9d8266f7bbf05a8dde98", + "token": { + "decimals": 18, + "symbol": "BUSD" + }, + "isSC": {} + }, + "0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664": { + "name": "USDC token contract", + "address": "0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xc7198437980c041c805a1edcba50c1ce5db95118": { + "name": "USDT.e token contract", + "address": "0xc7198437980c041c805a1edcba50c1ce5db95118", + "token": { + "decimals": 6, + "symbol": "USDT.e" + }, + "isSC": {} + }, + "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7": { + "name": "USDT token contract", + "address": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0x264c1383ea520f73dd837f915ef3a732e204a493": { + "name": "BNB token contract", + "address": "0x264c1383ea520f73dd837f915ef3a732e204a493", + "token": { + "decimals": 18, + "symbol": "BNB" + }, + "isSC": {} + }, + "0x5947bb275c521040051d82396192181b413227a3": { + "name": "LINK token contract", + "address": "0x5947bb275c521040051d82396192181b413227a3", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {} + }, + "0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab": { + "name": "WETH token contract", + "address": "0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab", + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "isSC": {} + }, + "0x37b608519f91f70f2eeb0e5ed9af4061722e4f76": { + "name": "SUSHI token contract", + "address": "0x37b608519f91f70f2eeb0e5ed9af4061722e4f76", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {} + }, + "0x8ebaf22b6f053dffeaf46f4dd9efa95d89ba8580": { + "name": "UNI token contract", + "address": "0x8ebaf22b6f053dffeaf46f4dd9efa95d89ba8580", + "token": { + "decimals": 18, + "symbol": "UNI" + }, + "isSC": {} + }, + "0xd586e7f844cea2f87f50152665bcbc2c279d8d70": { + "name": "DAI token contract", + "address": "0xd586e7f844cea2f87f50152665bcbc2c279d8d70", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0xd501281565bf7789224523144fe5d98e8b28f267": { + "name": "1INCH token contract", + "address": "0xd501281565bf7789224523144fe5d98e8b28f267", + "token": { + "decimals": 18, + "symbol": "1INCH" + }, + "isSC": {} + }, + "0x8a0cac13c7da965a312f08ea4229c37869e85cb9": { + "name": "GRT token contract", + "address": "0x8a0cac13c7da965a312f08ea4229c37869e85cb9", + "token": { + "decimals": 18, + "symbol": "GRT" + }, + "isSC": {} + }, + "0x1c20e891bab6b1727d14da358fae2984ed9b59eb": { + "name": "TUSD token contract", + "address": "0x1c20e891bab6b1727d14da358fae2984ed9b59eb", + "token": { + "decimals": 18, + "symbol": "TUSD" + }, + "isSC": {} + }, + "0x88128fd4b259552a9a1d457f435a6527aab72d42": { + "name": "MKR token contract", + "address": "0x88128fd4b259552a9a1d457f435a6527aab72d42", + "token": { + "decimals": 18, + "symbol": "MKR" + }, + "isSC": {} + }, + "0xb54f16fb19478766a268f172c9480f8da1a7c9c3": { + "name": "TIME token contract", + "address": "0xb54f16fb19478766a268f172c9480f8da1a7c9c3", + "token": { + "decimals": 9, + "symbol": "TIME" + }, + "isSC": {} + }, + "0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64": { + "name": "FRAX token contract", + "address": "0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {} + }, + "0xed46443c18e38064523180fc364c6180b35803d3": { + "name": "CROWN token contract", + "address": "0xed46443c18e38064523180fc364c6180b35803d3", + "token": { + "decimals": 9, + "symbol": "CROWN" + }, + "isSC": {} + }, + "0xbd83010eb60f12112908774998f65761cf9f6f9a": { + "name": "BOO token contract", + "address": "0xbd83010eb60f12112908774998f65761cf9f6f9a", + "token": { + "decimals": 18, + "symbol": "BOO" + }, + "isSC": {} + }, + "0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd": { + "name": "JOE token contract", + "address": "0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd", + "token": { + "decimals": 18, + "symbol": "JOE" + }, + "isSC": {} + }, + "0xf2f7ce610a091b94d41d69f4ff1129434a82e2f0": { + "name": "GG token contract", + "address": "0xf2f7ce610a091b94d41d69f4ff1129434a82e2f0", + "token": { + "decimals": 9, + "symbol": "GG" + }, + "isSC": {} + }, + "0x8729438eb15e2c8b576fcc6aecda6a148776c0f5": { + "name": "QI token contract", + "address": "0x8729438eb15e2c8b576fcc6aecda6a148776c0f5", + "token": { + "decimals": 18, + "symbol": "QI" + }, + "isSC": {} + }, + "0xd1c3f94de7e5b45fa4edbba472491a9f4b166fc4": { + "name": "XAVA token contract", + "address": "0xd1c3f94de7e5b45fa4edbba472491a9f4b166fc4", + "token": { + "decimals": 18, + "symbol": "XAVA" + }, + "isSC": {} + }, + "0x321e7092a180bb43555132ec53aaa65a5bf84251": { + "name": "GOHM token contract", + "address": "0x321e7092a180bb43555132ec53aaa65a5bf84251", + "token": { + "decimals": 18, + "symbol": "GOHM" + }, + "isSC": {} + }, + "0x564a341df6c126f90cf3ecb92120fd7190acb401": { + "name": "TRYB token contract", + "address": "0x564a341df6c126f90cf3ecb92120fd7190acb401", + "token": { + "decimals": 6, + "symbol": "TRYB" + }, + "isSC": {} + }, + "0x214db107654ff987ad859f34125307783fc8e387": { + "name": "FXS token contract", + "address": "0x214db107654ff987ad859f34125307783fc8e387", + "token": { + "decimals": 18, + "symbol": "FXS" + }, + "isSC": {} + }, + "0x7d1232b90d3f809a54eeaeebc639c62df8a8942f": { + "name": "SB token contract", + "address": "0x7d1232b90d3f809a54eeaeebc639c62df8a8942f", + "token": { + "decimals": 9, + "symbol": "SB" + }, + "isSC": {} + }, + "0x70b33ebc5544c12691d055b49762d0f8365d99fe": { + "name": "PAPA token contract", + "address": "0x70b33ebc5544c12691d055b49762d0f8365d99fe", + "token": { + "decimals": 9, + "symbol": "PAPA" + }, + "isSC": {} + }, + "0xa32608e873f9ddef944b24798db69d80bbb4d1ed": { + "name": "CRA token contract", + "address": "0xa32608e873f9ddef944b24798db69d80bbb4d1ed", + "token": { + "decimals": 18, + "symbol": "CRA" + }, + "isSC": {} + }, + "0x8ae8be25c23833e0a01aa200403e826f611f9cd2": { + "name": "CRAFT token contract", + "address": "0x8ae8be25c23833e0a01aa200403e826f611f9cd2", + "token": { + "decimals": 18, + "symbol": "CRAFT" + }, + "isSC": {} + }, + "0x0ebd9537a25f56713e34c45b38f421a1e7191469": { + "name": "OOE token contract", + "address": "0x0ebd9537a25f56713e34c45b38f421a1e7191469", + "token": { + "decimals": 18, + "symbol": "OOE" + }, + "isSC": {} + }, + "0x1f1e7c893855525b303f99bdf5c3c05be09ca251": { + "name": "SYN token contract", + "address": "0x1f1e7c893855525b303f99bdf5c3c05be09ca251", + "token": { + "decimals": 18, + "symbol": "SYN" + }, + "isSC": {} + }, + "0xe896cdeaac9615145c0ca09c8cd5c25bced6384c": { + "name": "PEFI token contract", + "address": "0xe896cdeaac9615145c0ca09c8cd5c25bced6384c", + "token": { + "decimals": 18, + "symbol": "PEFI" + }, + "isSC": {} + }, + "0xb2a85c5ecea99187a977ac34303b80acbddfa208": { + "name": "ROCO token contract", + "address": "0xb2a85c5ecea99187a977ac34303b80acbddfa208", + "token": { + "decimals": 18, + "symbol": "ROCO" + }, + "isSC": {} + }, + "0x60781c2586d68229fde47564546784ab3faca982": { + "name": "PNG token contract", + "address": "0x60781c2586d68229fde47564546784ab3faca982", + "token": { + "decimals": 18, + "symbol": "PNG" + }, + "isSC": {} + }, + "0xc7b5d72c836e718cda8888eaf03707faef675079": { + "name": "SWAP token contract", + "address": "0xc7b5d72c836e718cda8888eaf03707faef675079", + "token": { + "decimals": 18, + "symbol": "SWAP" + }, + "isSC": {} + }, + "0xf693248f96fe03422fea95ac0afbbbc4a8fdd172": { + "name": "TUS token contract", + "address": "0xf693248f96fe03422fea95ac0afbbbc4a8fdd172", + "token": { + "decimals": 18, + "symbol": "TUS" + }, + "isSC": {} + }, + "0xd6070ae98b8069de6b494332d1a1a81b6179d960": { + "name": "BIFI token contract", + "address": "0xd6070ae98b8069de6b494332d1a1a81b6179d960", + "token": { + "decimals": 18, + "symbol": "BIFI" + }, + "isSC": {} + }, + "0xfb98b335551a418cd0737375a2ea0ded62ea213b": { + "name": "PENDLE token contract", + "address": "0xfb98b335551a418cd0737375a2ea0ded62ea213b", + "token": { + "decimals": 18, + "symbol": "PENDLE" + }, + "isSC": {} + }, + "0x7c08413cbf02202a1c13643db173f2694e0f73f0": { + "name": "MAXI token contract", + "address": "0x7c08413cbf02202a1c13643db173f2694e0f73f0", + "token": { + "decimals": 9, + "symbol": "MAXI" + }, + "isSC": {} + }, + "0x5684a087c739a2e845f4aaaabf4fbd261edc2be8": { + "name": "LF token contract", + "address": "0x5684a087c739a2e845f4aaaabf4fbd261edc2be8", + "token": { + "decimals": 9, + "symbol": "LF" + }, + "isSC": {} + }, + "0xb27c8941a7df8958a1778c0259f76d1f8b711c35": { + "name": "KLO token contract", + "address": "0xb27c8941a7df8958a1778c0259f76d1f8b711c35", + "token": { + "decimals": 18, + "symbol": "KLO" + }, + "isSC": {} + }, + "0x88a425b738682f58c0ff9fcf2cceb47a361ef4cf": { + "name": "TEMPO token contract", + "address": "0x88a425b738682f58c0ff9fcf2cceb47a361ef4cf", + "token": { + "decimals": 9, + "symbol": "TEMPO" + }, + "isSC": {} + }, + "0x846d50248baf8b7ceaa9d9b53bfd12d7d7fbb25a": { + "name": "VSO token contract", + "address": "0x846d50248baf8b7ceaa9d9b53bfd12d7d7fbb25a", + "token": { + "decimals": 18, + "symbol": "VSO" + }, + "isSC": {} + }, + "0x245c2591403e182e41d7a851eab53b01854844ce": { + "name": "MEAD token contract", + "address": "0x245c2591403e182e41d7a851eab53b01854844ce", + "token": { + "decimals": 8, + "symbol": "MEAD" + }, + "isSC": {} + }, + "0xf6d46849db378ae01d93732585bec2c4480d1fd5": { + "name": "FORT token contract", + "address": "0xf6d46849db378ae01d93732585bec2c4480d1fd5", + "token": { + "decimals": 9, + "symbol": "FORT" + }, + "isSC": {} + }, + "0xb80323c7aa915cb960b19b5cca1d88a2132f7bd1": { + "name": "NADO token contract", + "address": "0xb80323c7aa915cb960b19b5cca1d88a2132f7bd1", + "token": { + "decimals": 9, + "symbol": "NADO" + }, + "isSC": {} + }, + "0x4939b3313e73ae8546b90e53e998e82274afdbdb": { + "name": "CCC token contract", + "address": "0x4939b3313e73ae8546b90e53e998e82274afdbdb", + "token": { + "decimals": 9, + "symbol": "CCC" + }, + "isSC": {} + }, + "0x440abbf18c54b2782a4917b80a1746d3a2c2cce1": { + "name": "SHIBX token contract", + "address": "0x440abbf18c54b2782a4917b80a1746d3a2c2cce1", + "token": { + "decimals": 18, + "symbol": "SHIBX" + }, + "isSC": {} + }, + "0x9e3ca00f2d4a9e5d4f0add0900de5f15050812cf": { + "name": "NFTD token contract", + "address": "0x9e3ca00f2d4a9e5d4f0add0900de5f15050812cf", + "token": { + "decimals": 18, + "symbol": "NFTD" + }, + "isSC": {} + }, + "0x65378b697853568da9ff8eab60c13e1ee9f4a654": { + "name": "HUSKY token contract", + "address": "0x65378b697853568da9ff8eab60c13e1ee9f4a654", + "token": { + "decimals": 18, + "symbol": "HUSKY" + }, + "isSC": {} + }, + "0xf44fb887334fa17d2c5c0f970b5d320ab53ed557": { + "name": "START token contract", + "address": "0xf44fb887334fa17d2c5c0f970b5d320ab53ed557", + "token": { + "decimals": 18, + "symbol": "START" + }, + "isSC": {} + }, + "0x59414b3089ce2af0010e7523dea7e2b35d776ec7": { + "name": "YAK token contract", + "address": "0x59414b3089ce2af0010e7523dea7e2b35d776ec7", + "token": { + "decimals": 18, + "symbol": "YAK" + }, + "isSC": {} + }, + "0xa2776a53da0bf664ea34b8efa1c8ab4241a10968": { + "name": "BLIZZ token contract", + "address": "0xa2776a53da0bf664ea34b8efa1c8ab4241a10968", + "token": { + "decimals": 18, + "symbol": "BLIZZ" + }, + "isSC": {} + }, + "0xc38f41a296a4493ff429f1238e030924a1542e50": { + "name": "SNOB token contract", + "address": "0xc38f41a296a4493ff429f1238e030924a1542e50", + "token": { + "decimals": 18, + "symbol": "SNOB" + }, + "isSC": {} + }, + "0x87bade473ea0513d4aa7085484aeaa6cb6ebe7e3": { + "name": "MOR token contract", + "address": "0x87bade473ea0513d4aa7085484aeaa6cb6ebe7e3", + "token": { + "decimals": 18, + "symbol": "MOR" + }, + "isSC": {} + }, + "0x8cd309e14575203535ef120b5b0ab4dded0c2073": { + "name": "WSOHM token contract", + "address": "0x8cd309e14575203535ef120b5b0ab4dded0c2073", + "token": { + "decimals": 18, + "symbol": "WSOHM" + }, + "isSC": {} + }, + "0xe1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c": { + "name": "ELK token contract", + "address": "0xe1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c", + "token": { + "decimals": 18, + "symbol": "ELK" + }, + "isSC": {} + }, + "0x78ea17559b3d2cf85a7f9c2c704eda119db5e6de": { + "name": "AVE token contract", + "address": "0x78ea17559b3d2cf85a7f9c2c704eda119db5e6de", + "token": { + "decimals": 18, + "symbol": "AVE" + }, + "isSC": {} + }, + "0x8afa62fa8dde8888405c899d7da077a61a87eed3": { + "name": "LIBRE token contract", + "address": "0x8afa62fa8dde8888405c899d7da077a61a87eed3", + "token": { + "decimals": 18, + "symbol": "LIBRE" + }, + "isSC": {} + }, + "0x72699ba15cc734f8db874fa9652c8de12093f187": { + "name": "GRO token contract", + "address": "0x72699ba15cc734f8db874fa9652c8de12093f187", + "token": { + "decimals": 18, + "symbol": "GRO" + }, + "isSC": {} + }, + "0xdef1fac7bf08f173d286bbbdcbeeade695129840": { + "name": "Defi Factory Token", + "address": "0xdef1fac7bf08f173d286bbbdcbeeade695129840", + "token": { + "decimals": 18, + "symbol": "DEFT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DEFT.svg" + }, + "0xa384bc7cdc0a93e686da9e7b8c0807cd040f4e0b": { + "name": "WOW token contract", + "address": "0xa384bc7cdc0a93e686da9e7b8c0807cd040f4e0b", + "token": { + "decimals": 18, + "symbol": "WOW" + }, + "isSC": {} + }, + "0x47eb6f7525c1aa999fbc9ee92715f5231eb1241d": { + "name": "MELT token contract", + "address": "0x47eb6f7525c1aa999fbc9ee92715f5231eb1241d", + "token": { + "decimals": 18, + "symbol": "MELT" + }, + "isSC": {} + }, + "0xe0474c15bc7f8213ee5bfb42f9e68b2d6be2e136": { + "name": "VAL token contract", + "address": "0xe0474c15bc7f8213ee5bfb42f9e68b2d6be2e136", + "token": { + "decimals": 9, + "symbol": "VAL" + }, + "isSC": {} + }, + "0x346a59146b9b4a77100d369a3d18e8007a9f46a6": { + "name": "AVAI token contract", + "address": "0x346a59146b9b4a77100d369a3d18e8007a9f46a6", + "token": { + "decimals": 18, + "symbol": "AVAI" + }, + "isSC": {} + }, + "0xcf8419a615c57511807236751c0af38db4ba3351": { + "name": "AXIAL token contract", + "address": "0xcf8419a615c57511807236751c0af38db4ba3351", + "token": { + "decimals": 18, + "symbol": "AXIAL" + }, + "isSC": {} + }, + "0xb00f1ad977a949a3ccc389ca1d1282a2946963b0": { + "name": "BOOFI token contract", + "address": "0xb00f1ad977a949a3ccc389ca1d1282a2946963b0", + "token": { + "decimals": 18, + "symbol": "BOOFI" + }, + "isSC": {} + }, + "0x9eaac1b23d935365bd7b542fe22ceee2922f52dc": { + "name": "YFI token contract", + "address": "0x9eaac1b23d935365bd7b542fe22ceee2922f52dc", + "token": { + "decimals": 18, + "symbol": "YFI" + }, + "isSC": {} + }, + "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7": { + "name": "WAVAX token contract", + "address": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", + "token": { + "decimals": 18, + "symbol": "WAVAX" + }, + "isSC": {} + }, + "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e": { + "name": "USDC token contract", + "address": "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x420fca0121dc28039145009570975747295f2329": { + "name": "COQ token contract", + "address": "0x420fca0121dc28039145009570975747295f2329", + "token": { + "decimals": 18, + "symbol": "COQ" + }, + "isSC": {} + }, + "0x63a72806098bd3d9520cc43356dd78afe5d386d9": { + "name": "AAVE token contract", + "address": "0x63a72806098bd3d9520cc43356dd78afe5d386d9", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0x50b7545627a5162f82a992c33b87adc75187b218": { + "name": "WBTC.e token contract", + "address": "0x50b7545627a5162f82a992c33b87adc75187b218", + "token": { + "decimals": 8, + "symbol": "WBTC.e" + }, + "isSC": {} + }, + "0xfe6b19286885a4f7f55adad09c3cd1f906d2478f": { + "name": "SOL token contract", + "address": "0xfe6b19286885a4f7f55adad09c3cd1f906d2478f", + "token": { + "decimals": 9, + "symbol": "SOL" + }, + "isSC": {} + }, + "0x40df1ae6074c35047bff66675488aa2f9f6384f3": { + "name": "WMATIC token contract", + "address": "0x40df1ae6074c35047bff66675488aa2f9f6384f3", + "token": { + "decimals": 18, + "symbol": "WMATIC" + }, + "isSC": {} + }, + "0x049d68029688eabf473097a2fc38ef61633a3c7a": { + "name": "USDT token contract", + "address": "0x049d68029688eabf473097a2fc38ef61633a3c7a", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0x04068da6c83afcfa0e13ba15a6696662335d5b75": { + "name": "USDC token contract", + "address": "0x04068da6c83afcfa0e13ba15a6696662335d5b75", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8": { + "name": "LINK token contract", + "address": "0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {} + }, + "0x74b23882a30290451a17c44f4f05243b6b58c76d": { + "name": "WETH token contract", + "address": "0x74b23882a30290451a17c44f4f05243b6b58c76d", + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "isSC": {} + }, + "0x1e4f97b9f9f913c46f1632781732927b9019c68b": { + "name": "CRV token contract", + "address": "0x1e4f97b9f9f913c46f1632781732927b9019c68b", + "token": { + "decimals": 18, + "symbol": "CRV" + }, + "isSC": {} + }, + "0x6a07a792ab2965c72a5b8088d3a069a7ac3a993b": { + "name": "AAVE token contract", + "address": "0x6a07a792ab2965c72a5b8088d3a069a7ac3a993b", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0xae75a438b2e0cb8bb01ec1e1e376de11d44477cc": { + "name": "SUSHI token contract", + "address": "0xae75a438b2e0cb8bb01ec1e1e376de11d44477cc", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {} + }, + "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e": { + "name": "DAI token contract", + "address": "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0xdc301622e621166bd8e82f2ca0a26c13ad0be355": { + "name": "FRAX token contract", + "address": "0xdc301622e621166bd8e82f2ca0a26c13ad0be355", + "token": { + "decimals": 18, + "symbol": "FRAX" + }, + "isSC": {} + }, + "0xe2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9": { + "name": "UST token contract", + "address": "0xe2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9", + "token": { + "decimals": 18, + "symbol": "UST" + }, + "isSC": {} + }, + "0x91fa20244fb509e8289ca630e5db3e9166233fdc": { + "name": "GOHM token contract", + "address": "0x91fa20244fb509e8289ca630e5db3e9166233fdc", + "token": { + "decimals": 18, + "symbol": "GOHM" + }, + "isSC": {} + }, + "0xacc15dc74880c9944775448304b263d191c6077f": { + "name": "wglmr token contract", + "address": "0xacc15dc74880c9944775448304b263d191c6077f", + "token": { + "decimals": 18, + "symbol": "wglmr" + }, + "isSC": {} + }, + "0x0e358838ce72d5e61e0018a2ffac4bec5f4c88d2": { + "name": "stella token contract", + "address": "0x0e358838ce72d5e61e0018a2ffac4bec5f4c88d2", + "token": { + "decimals": 18, + "symbol": "stella" + }, + "isSC": {} + }, + "0xcd3b51d98478d53f4515a306be565c6eebef1d58": { + "name": "glint token contract", + "address": "0xcd3b51d98478d53f4515a306be565c6eebef1d58", + "token": { + "decimals": 18, + "symbol": "glint" + }, + "isSC": {} + }, + "0xe3e43888fa7803cdc7bea478ab327cf1a0dc11a7": { + "name": "flare token contract", + "address": "0xe3e43888fa7803cdc7bea478ab327cf1a0dc11a7", + "token": { + "decimals": 18, + "symbol": "flare" + }, + "isSC": {} + }, + "0x735abe48e8782948a37c7765ecb76b98cde97b0f": { + "name": "tho token contract", + "address": "0x735abe48e8782948a37c7765ecb76b98cde97b0f", + "token": { + "decimals": 18, + "symbol": "tho" + }, + "isSC": {} + }, + "0x4c4bf319237d98a30a929a96112effa8da3510eb": { + "name": "stho token contract", + "address": "0x4c4bf319237d98a30a929a96112effa8da3510eb", + "token": { + "decimals": 18, + "symbol": "stho" + }, + "isSC": {} + }, + "0x97513e975a7fa9072c72c92d8000b0db90b163c5": { + "name": "statik token contract", + "address": "0x97513e975a7fa9072c72c92d8000b0db90b163c5", + "token": { + "decimals": 18, + "symbol": "statik" + }, + "isSC": {} + }, + "0x19d2f0cf1fc41de2b8fd4a98065ab9284e05cf29": { + "name": "1beam token contract", + "address": "0x19d2f0cf1fc41de2b8fd4a98065ab9284e05cf29", + "token": { + "decimals": 18, + "symbol": "1beam" + }, + "isSC": {} + }, + "0x0db6729c03c85b0708166ca92801bcb5cac781fc": { + "name": "vesolar token contract", + "address": "0x0db6729c03c85b0708166ca92801bcb5cac781fc", + "token": { + "decimals": 18, + "symbol": "vesolar" + }, + "isSC": {} + }, + "0x8f552a71efe5eefc207bf75485b356a0b3f01ec9": { + "name": "madUSDC token contract", + "address": "0x8f552a71efe5eefc207bf75485b356a0b3f01ec9", + "token": { + "decimals": 18, + "symbol": "madUSDC" + }, + "isSC": {} + }, + "0x931715fee2d06333043d11f658c8ce934ac61d0c": { + "name": "USDC token contract", + "address": "0x931715fee2d06333043d11f658c8ce934ac61d0c", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b": { + "name": "USDC token contract", + "address": "0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x765277eebeca2e31912c9946eae1021199b39c61": { + "name": "DAI token contract", + "address": "0x765277eebeca2e31912c9946eae1021199b39c61", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x0cae51e1032e8461f4806e26332c030e34de3adb": { + "name": "mim token contract", + "address": "0x0cae51e1032e8461f4806e26332c030e34de3adb", + "token": { + "decimals": 18, + "symbol": "mim" + }, + "isSC": {} + }, + "0xf390830df829cf22c53c8840554b98eafc5dcbc2": { + "name": "SUSHI token contract", + "address": "0xf390830df829cf22c53c8840554b98eafc5dcbc2", + "token": { + "decimals": 18, + "symbol": "SUSHI" + }, + "isSC": {} + }, + "0xfd301ca82d007880e678bb750a771550c5104ff2": { + "name": "ankr token contract", + "address": "0xfd301ca82d007880e678bb750a771550c5104ff2", + "token": { + "decimals": 9, + "symbol": "ankr" + }, + "isSC": {} + }, + "0x9fb9a33956351cf4fa040f65a13b835a3c8764e3": { + "name": "multi token contract", + "address": "0x9fb9a33956351cf4fa040f65a13b835a3c8764e3", + "token": { + "decimals": 18, + "symbol": "multi" + }, + "isSC": {} + }, + "0x8e7cd893d8f371051a39aa65976bca22d7b02a60": { + "name": "roar token contract", + "address": "0x8e7cd893d8f371051a39aa65976bca22d7b02a60", + "token": { + "decimals": 18, + "symbol": "roar" + }, + "isSC": {} + }, + "0x2d28aa28fa1e5e6bf121cf688309bf3faaae3c70": { + "name": "idia token contract", + "address": "0x2d28aa28fa1e5e6bf121cf688309bf3faaae3c70", + "token": { + "decimals": 18, + "symbol": "idia" + }, + "isSC": {} + }, + "0x761cb807bfbf14a4f4ba980f29f43f009f6a18c0": { + "name": "md token contract", + "address": "0x761cb807bfbf14a4f4ba980f29f43f009f6a18c0", + "token": { + "decimals": 9, + "symbol": "md" + }, + "isSC": {} + }, + "0x0f47ba9d9bde3442b42175e51d6a367928a1173b": { + "name": "zlk token contract", + "address": "0x0f47ba9d9bde3442b42175e51d6a367928a1173b", + "token": { + "decimals": 18, + "symbol": "zlk" + }, + "isSC": {} + }, + "0x0d2faa2064129ecbfaccd45be33dea3bcd3f8863": { + "name": "mara token contract", + "address": "0x0d2faa2064129ecbfaccd45be33dea3bcd3f8863", + "token": { + "decimals": 18, + "symbol": "mara" + }, + "isSC": {} + }, + "0x4a436073552044d5f2f49b176853ad3ad473d9d6": { + "name": "rome token contract", + "address": "0x4a436073552044d5f2f49b176853ad3ad473d9d6", + "token": { + "decimals": 9, + "symbol": "rome" + }, + "isSC": {} + }, + "0xbb8d88bcd9749636bc4d2be22aac4bb3b01a58f1": { + "name": "mfam token contract", + "address": "0xbb8d88bcd9749636bc4d2be22aac4bb3b01a58f1", + "token": { + "decimals": 18, + "symbol": "mfam" + }, + "isSC": {} + }, + "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b": { + "name": "solar token contract", + "address": "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b", + "token": { + "decimals": 18, + "symbol": "solar" + }, + "isSC": {} + }, + "0x5c22ba65f65adffadfc0947382f2e7c286a0fe45": { + "name": "mscp token contract", + "address": "0x5c22ba65f65adffadfc0947382f2e7c286a0fe45", + "token": { + "decimals": 18, + "symbol": "mscp" + }, + "isSC": {} + }, + "0x900f1ec5819fa087d368877cd03b265bf1802667": { + "name": "imx token contract", + "address": "0x900f1ec5819fa087d368877cd03b265bf1802667", + "token": { + "decimals": 18, + "symbol": "imx" + }, + "isSC": {} + }, + "0xad7f1844696652dda7959a49063bffccafafefe7": { + "name": "relay token contract", + "address": "0xad7f1844696652dda7959a49063bffccafafefe7", + "token": { + "decimals": 18, + "symbol": "relay" + }, + "isSC": {} + }, + "0x9a92b5ebf1f6f6f7d93696fcd44e5cf75035a756": { + "name": "finn token contract", + "address": "0x9a92b5ebf1f6f6f7d93696fcd44e5cf75035a756", + "token": { + "decimals": 18, + "symbol": "finn" + }, + "isSC": {} + }, + "0xbecc61601c59d5afffe750d201ec98cdc70db796": { + "name": "oshare token contract", + "address": "0xbecc61601c59d5afffe750d201ec98cdc70db796", + "token": { + "decimals": 18, + "symbol": "oshare" + }, + "isSC": {} + }, + "0xb2c22a9fb4fc02eb9d1d337655ce079a04a526c7": { + "name": "spdr token contract", + "address": "0xb2c22a9fb4fc02eb9d1d337655ce079a04a526c7", + "token": { + "decimals": 18, + "symbol": "spdr" + }, + "isSC": {} + }, + "0x1e0f2a75be02c025bd84177765f89200c04337da": { + "name": "pets token contract", + "address": "0x1e0f2a75be02c025bd84177765f89200c04337da", + "token": { + "decimals": 18, + "symbol": "pets" + }, + "isSC": {} + }, + "0xc2b0435276139731d82ae2fa8928c9b9de0761c1": { + "name": "rkitty token contract", + "address": "0xc2b0435276139731d82ae2fa8928c9b9de0761c1", + "token": { + "decimals": 18, + "symbol": "rkitty" + }, + "isSC": {} + }, + "0x3b25bc1dc591d24d60560d0135d6750a561d4764": { + "name": "veth token contract", + "address": "0x3b25bc1dc591d24d60560d0135d6750a561d4764", + "token": { + "decimals": 18, + "symbol": "veth" + }, + "isSC": {} + }, + "0x9457c50d14381e36bb4bd7d63b57f260f16a19e7": { + "name": "apet token contract", + "address": "0x9457c50d14381e36bb4bd7d63b57f260f16a19e7", + "token": { + "decimals": 9, + "symbol": "apet" + }, + "isSC": {} + }, + "0x56cfe76545939afabc8bdba94192a96801d24d28": { + "name": "hydro token contract", + "address": "0x56cfe76545939afabc8bdba94192a96801d24d28", + "token": { + "decimals": 18, + "symbol": "hydro" + }, + "isSC": {} + }, + "0xdc151bc48a5f77288cde9ddbff2e32e6bcf4791f": { + "name": "h2o token contract", + "address": "0xdc151bc48a5f77288cde9ddbff2e32e6bcf4791f", + "token": { + "decimals": 18, + "symbol": "h2o" + }, + "isSC": {} + }, + "0xa8e472b1446e6d9fb97a9478e5bc13ff1815e730": { + "name": "ath token contract", + "address": "0xa8e472b1446e6d9fb97a9478e5bc13ff1815e730", + "token": { + "decimals": 18, + "symbol": "ath" + }, + "isSC": {} + }, + "0x5d4360f1be94bd6f182f09cfe5ef9832e65eb1ac": { + "name": "rivrdoge token contract", + "address": "0x5d4360f1be94bd6f182f09cfe5ef9832e65eb1ac", + "token": { + "decimals": 18, + "symbol": "rivrdoge" + }, + "isSC": {} + }, + "0xd5059d18a77b3fdfa524ef3dfc03fef63165c908": { + "name": "seeds token contract", + "address": "0xd5059d18a77b3fdfa524ef3dfc03fef63165c908", + "token": { + "decimals": 18, + "symbol": "seeds" + }, + "isSC": {} + }, + "0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d": { + "name": "USDC token contract", + "address": "0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x80a16016cc4a2e6a2caca8a4a498b1699ff0f844": { + "name": "DAI token contract", + "address": "0x80a16016cc4a2e6a2caca8a4a498b1699ff0f844", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x9c58bacc331c9aa871afd802db6379a98e80cedb": { + "name": "gno token contract", + "address": "0x9c58bacc331c9aa871afd802db6379a98e80cedb", + "token": { + "decimals": 18, + "symbol": "gno" + }, + "isSC": {} + }, + "0x256eb8a51f382650b2a1e946b8811953640ee47d": { + "name": "data token contract", + "address": "0x256eb8a51f382650b2a1e946b8811953640ee47d", + "token": { + "decimals": 18, + "symbol": "data" + }, + "isSC": {} + }, + "0xd057604a14982fe8d88c5fc25aac3267ea142a08": { + "name": "hopr token contract", + "address": "0xd057604a14982fe8d88c5fc25aac3267ea142a08", + "token": { + "decimals": 18, + "symbol": "hopr" + }, + "isSC": {} + }, + "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d": { + "name": "wxdai token contract", + "address": "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", + "token": { + "decimals": 18, + "symbol": "wxdai" + }, + "isSC": {} + }, + "0x83ff60e2f93f8edd0637ef669c69d5fb4f64ca8e": { + "name": "bright token contract", + "address": "0x83ff60e2f93f8edd0637ef669c69d5fb4f64ca8e", + "token": { + "decimals": 18, + "symbol": "bright" + }, + "isSC": {} + }, + "0x9fb1d52596c44603198fb0aee434fac3a679f702": { + "name": "jeur token contract", + "address": "0x9fb1d52596c44603198fb0aee434fac3a679f702", + "token": { + "decimals": 18, + "symbol": "jeur" + }, + "isSC": {} + }, + "0x84e2c67cbefae6b5148fca7d02b341b12ff4b5bb": { + "name": "swash token contract", + "address": "0x84e2c67cbefae6b5148fca7d02b341b12ff4b5bb", + "token": { + "decimals": 18, + "symbol": "swash" + }, + "isSC": {} + }, + "0x21a42669643f45bc0e086b8fc2ed70c23d67509d": { + "name": "fox token contract", + "address": "0x21a42669643f45bc0e086b8fc2ed70c23d67509d", + "token": { + "decimals": 18, + "symbol": "fox" + }, + "isSC": {} + }, + "0x177127622c4a00f3d409b75571e12cb3c8973d3c": { + "name": "cow token contract", + "address": "0x177127622c4a00f3d409b75571e12cb3c8973d3c", + "token": { + "decimals": 18, + "symbol": "cow" + }, + "isSC": {} + }, + "0xb90d6bec20993be5d72a5ab353343f7a0281f158": { + "name": "dxd token contract", + "address": "0xb90d6bec20993be5d72a5ab353343f7a0281f158", + "token": { + "decimals": 18, + "symbol": "dxd" + }, + "isSC": {} + }, + "0x2d5563da42b06fbbf9c67b7dc073cf6a7842239e": { + "name": "jchf token contract", + "address": "0x2d5563da42b06fbbf9c67b7dc073cf6a7842239e", + "token": { + "decimals": 18, + "symbol": "jchf" + }, + "isSC": {} + }, + "0x0116e28b43a358162b96f70b4de14c98a4465f25": { + "name": "uncx token contract", + "address": "0x0116e28b43a358162b96f70b4de14c98a4465f25", + "token": { + "decimals": 18, + "symbol": "uncx" + }, + "isSC": {} + }, + "0x71850b7e9ee3f13ab46d67167341e4bdc905eef9": { + "name": "hny token contract", + "address": "0x71850b7e9ee3f13ab46d67167341e4bdc905eef9", + "token": { + "decimals": 18, + "symbol": "hny" + }, + "isSC": {} + }, + "0x1698cd22278ef6e7c0df45a8dea72edbea9e42aa": { + "name": "levin token contract", + "address": "0x1698cd22278ef6e7c0df45a8dea72edbea9e42aa", + "token": { + "decimals": 18, + "symbol": "levin" + }, + "isSC": {} + }, + "0x4f4f9b8d5b4d0dc10506e5551b0513b61fd59e75": { + "name": "giv token contract", + "address": "0x4f4f9b8d5b4d0dc10506e5551b0513b61fd59e75", + "token": { + "decimals": 18, + "symbol": "giv" + }, + "isSC": {} + }, + "0xfa57aa7beed63d03aaf85ffd1753f5f6242588fb": { + "name": "mps token contract", + "address": "0xfa57aa7beed63d03aaf85ffd1753f5f6242588fb", + "token": { + "decimals": 0, + "symbol": "mps" + }, + "isSC": {} + }, + "0x3a97704a1b25f08aa230ae53b352e2e72ef52843": { + "name": "agve token contract", + "address": "0x3a97704a1b25f08aa230ae53b352e2e72ef52843", + "token": { + "decimals": 18, + "symbol": "agve" + }, + "isSC": {} + }, + "0x48b1b0d077b4919b65b4e4114806dd803901e1d9": { + "name": "dip token contract", + "address": "0x48b1b0d077b4919b65b4e4114806dd803901e1d9", + "token": { + "decimals": 18, + "symbol": "dip" + }, + "isSC": {} + }, + "0xb0c5f3100a4d9d9532a4cfd68c55f1ae8da987eb": { + "name": "haus token contract", + "address": "0xb0c5f3100a4d9d9532a4cfd68c55f1ae8da987eb", + "token": { + "decimals": 18, + "symbol": "haus" + }, + "isSC": {} + }, + "0x8c88ea1fd60462ef7004b9e288afcb4680a3c50c": { + "name": "0xmr token contract", + "address": "0x8c88ea1fd60462ef7004b9e288afcb4680a3c50c", + "token": { + "decimals": 18, + "symbol": "0xmr" + }, + "isSC": {} + }, + "0xec3f3e6d7907acda3a7431abd230196cda3fbb19": { + "name": "ethix token contract", + "address": "0xec3f3e6d7907acda3a7431abd230196cda3fbb19", + "token": { + "decimals": 18, + "symbol": "ethix" + }, + "isSC": {} + }, + "0x5df8339c5e282ee48c0c7ce8a7d01a73d38b3b27": { + "name": "tec token contract", + "address": "0x5df8339c5e282ee48c0c7ce8a7d01a73d38b3b27", + "token": { + "decimals": 18, + "symbol": "tec" + }, + "isSC": {} + }, + "0x63e62989d9eb2d37dfdb1f93a22f063635b07d51": { + "name": "miva token contract", + "address": "0x63e62989d9eb2d37dfdb1f93a22f063635b07d51", + "token": { + "decimals": 18, + "symbol": "miva" + }, + "isSC": {} + }, + "0x38fb649ad3d6ba1113be5f57b927053e97fc5bf7": { + "name": "xcomb token contract", + "address": "0x38fb649ad3d6ba1113be5f57b927053e97fc5bf7", + "token": { + "decimals": 18, + "symbol": "xcomb" + }, + "isSC": {} + }, + "0x2bf2ba13735160624a0feae98f6ac8f70885ea61": { + "name": "fraction token contract", + "address": "0x2bf2ba13735160624a0feae98f6ac8f70885ea61", + "token": { + "decimals": 18, + "symbol": "fraction" + }, + "isSC": {} + }, + "0xd3226b12e6188133b19ac0419f34b0ed5b10f069": { + "name": "esr token contract", + "address": "0xd3226b12e6188133b19ac0419f34b0ed5b10f069", + "token": { + "decimals": 18, + "symbol": "esr" + }, + "isSC": {} + }, + "0x479e32cdff5f216f93060700c711d1cc8e811a6b": { + "name": "trips token contract", + "address": "0x479e32cdff5f216f93060700c711d1cc8e811a6b", + "token": { + "decimals": 18, + "symbol": "trips" + }, + "isSC": {} + }, + "0xa4ef9da5ba71cc0d2e5e877a910a37ec43420445": { + "name": "sgno token contract", + "address": "0xa4ef9da5ba71cc0d2e5e877a910a37ec43420445", + "token": { + "decimals": 18, + "symbol": "sgno" + }, + "isSC": {} + }, + "0xddafbb505ad214d7b80b1f830fccc89b60fb7a83": { + "name": "USDC token contract", + "address": "0xddafbb505ad214d7b80b1f830fccc89b60fb7a83", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x44fa8e6f47987339850636f88629646662444217": { + "name": "DAI token contract", + "address": "0x44fa8e6f47987339850636f88629646662444217", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x6665d66afa48f527d86623723342cfa258cb8666": { + "name": "kudo token contract", + "address": "0x6665d66afa48f527d86623723342cfa258cb8666", + "token": { + "decimals": 18, + "symbol": "kudo" + }, + "isSC": {} + }, + "0x4a81704d8c16d9fb0d7f61b747d0b5a272badf14": { + "name": "kus token contract", + "address": "0x4a81704d8c16d9fb0d7f61b747d0b5a272badf14", + "token": { + "decimals": 18, + "symbol": "kus" + }, + "isSC": {} + }, + "0x4446fc4eb47f2f6586f9faab68b3498f86c07521": { + "name": "wkcs token contract", + "address": "0x4446fc4eb47f2f6586f9faab68b3498f86c07521", + "token": { + "decimals": 18, + "symbol": "wkcs" + }, + "isSC": {} + }, + "0x2ca48b4eea5a731c2b54e7c3944dbdb87c0cfb6f": { + "name": "mjt token contract", + "address": "0x2ca48b4eea5a731c2b54e7c3944dbdb87c0cfb6f", + "token": { + "decimals": 18, + "symbol": "mjt" + }, + "isSC": {} + }, + "0xd0f2e8cf77c1d3dcc4d2d03f99d959bb5ce496bf": { + "name": "cooha token contract", + "address": "0xd0f2e8cf77c1d3dcc4d2d03f99d959bb5ce496bf", + "token": { + "decimals": 18, + "symbol": "cooha" + }, + "isSC": {} + }, + "0x980a5afef3d17ad98635f6c5aebcbaeded3c3430": { + "name": "USDC token contract", + "address": "0x980a5afef3d17ad98635f6c5aebcbaeded3c3430", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xc9baa8cfdde8e328787e29b4b078abf2dadc2055": { + "name": "DAI token contract", + "address": "0xc9baa8cfdde8e328787e29b4b078abf2dadc2055", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x8bec47865ade3b172a928df8f990bc7f2a3b9f79": { + "name": "aurora token contract", + "address": "0x8bec47865ade3b172a928df8f990bc7f2a3b9f79", + "token": { + "decimals": 18, + "symbol": "aurora" + }, + "isSC": {} + }, + "0x7ca1c28663b76cfde424a9494555b94846205585": { + "name": "xnl token contract", + "address": "0x7ca1c28663b76cfde424a9494555b94846205585", + "token": { + "decimals": 18, + "symbol": "xnl" + }, + "isSC": {} + }, + "0xe301ed8c7630c9678c39e4e45193d1e7dfb914f7": { + "name": "dodo token contract", + "address": "0xe301ed8c7630c9678c39e4e45193d1e7dfb914f7", + "token": { + "decimals": 18, + "symbol": "dodo" + }, + "isSC": {} + }, + "0xea62791aa682d455614eaa2a12ba3d9a2fd197af": { + "name": "flx token contract", + "address": "0xea62791aa682d455614eaa2a12ba3d9a2fd197af", + "token": { + "decimals": 18, + "symbol": "flx" + }, + "isSC": {} + }, + "0x885f8cf6e45bdd3fdcdc644efdcd0ac93880c781": { + "name": "pad token contract", + "address": "0x885f8cf6e45bdd3fdcdc644efdcd0ac93880c781", + "token": { + "decimals": 18, + "symbol": "pad" + }, + "isSC": {} + }, + "0x291c8fceaca3342b29cc36171deb98106f712c66": { + "name": "pickle token contract", + "address": "0x291c8fceaca3342b29cc36171deb98106f712c66", + "token": { + "decimals": 18, + "symbol": "pickle" + }, + "isSC": {} + }, + "0x0fad0ed848a7a16526e8a7574e418b015dbf41b5": { + "name": "pad token contract", + "address": "0x0fad0ed848a7a16526e8a7574e418b015dbf41b5", + "token": { + "decimals": 18, + "symbol": "pad" + }, + "isSC": {} + }, + "0xfa94348467f64d5a457f75f8bc40495d33c65abb": { + "name": "tri token contract", + "address": "0xfa94348467f64d5a457f75f8bc40495d33c65abb", + "token": { + "decimals": 18, + "symbol": "tri" + }, + "isSC": {} + }, + "0x501ace9c35e60f03a2af4d484f49f9b1efde9f40": { + "name": "solace token contract", + "address": "0x501ace9c35e60f03a2af4d484f49f9b1efde9f40", + "token": { + "decimals": 18, + "symbol": "solace" + }, + "isSC": {} + }, + "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d": { + "name": "wnear token contract", + "address": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d", + "token": { + "decimals": 24, + "symbol": "wnear" + }, + "isSC": {} + }, + "0xc4bdd27c33ec7daa6fcfd8532ddb524bf4038096": { + "name": "luna token contract", + "address": "0xc4bdd27c33ec7daa6fcfd8532ddb524bf4038096", + "token": { + "decimals": 18, + "symbol": "luna" + }, + "isSC": {} + }, + "0x76c384c6b56e859e15e9e46bfa9d077ecc2d57e6": { + "name": "ashiba token contract", + "address": "0x76c384c6b56e859e15e9e46bfa9d077ecc2d57e6", + "token": { + "decimals": 18, + "symbol": "ashiba" + }, + "isSC": {} + }, + "0x12c87331f086c3c926248f964f8702c0842fd77f": { + "name": "brl token contract", + "address": "0x12c87331f086c3c926248f964f8702c0842fd77f", + "token": { + "decimals": 18, + "symbol": "brl" + }, + "isSC": {} + }, + "0xe9f226a228eb58d408fdb94c3ed5a18af6968fe1": { + "name": "empyr token contract", + "address": "0xe9f226a228eb58d408fdb94c3ed5a18af6968fe1", + "token": { + "decimals": 9, + "symbol": "empyr" + }, + "isSC": {} + }, + "0xa33c3b53694419824722c10d99ad7cb16ea62754": { + "name": "mecha token contract", + "address": "0xa33c3b53694419824722c10d99ad7cb16ea62754", + "token": { + "decimals": 18, + "symbol": "mecha" + }, + "isSC": {} + }, + "0x631edd14bb0b2505c91176feedc5f082d27dd5b8": { + "name": "plrs token contract", + "address": "0x631edd14bb0b2505c91176feedc5f082d27dd5b8", + "token": { + "decimals": 18, + "symbol": "plrs" + }, + "isSC": {} + }, + "0x9d6fc90b25976e40adad5a3edd08af9ed7a21729": { + "name": "spolar token contract", + "address": "0x9d6fc90b25976e40adad5a3edd08af9ed7a21729", + "token": { + "decimals": 18, + "symbol": "spolar" + }, + "isSC": {} + }, + "0xf0f3b9eee32b1f490a4b8720cf6f005d4ae9ea86": { + "name": "polar token contract", + "address": "0xf0f3b9eee32b1f490a4b8720cf6f005d4ae9ea86", + "token": { + "decimals": 18, + "symbol": "polar" + }, + "isSC": {} + }, + "0xdcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970": { + "name": "rose token contract", + "address": "0xdcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970", + "token": { + "decimals": 18, + "symbol": "rose" + }, + "isSC": {} + }, + "0x7faa64faf54750a2e3ee621166635feaf406ab22": { + "name": "wanna token contract", + "address": "0x7faa64faf54750a2e3ee621166635feaf406ab22", + "token": { + "decimals": 18, + "symbol": "wanna" + }, + "isSC": {} + }, + "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f": { + "name": "ply token contract", + "address": "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f", + "token": { + "decimals": 18, + "symbol": "ply" + }, + "isSC": {} + }, + "0xc21ff01229e982d7c8b8691163b0a3cb8f357453": { + "name": "meta token contract", + "address": "0xc21ff01229e982d7c8b8691163b0a3cb8f357453", + "token": { + "decimals": 24, + "symbol": "meta" + }, + "isSC": {} + }, + "0x07f9f7f963c5cd2bbffd30ccfb964be114332e30": { + "name": "stnear token contract", + "address": "0x07f9f7f963c5cd2bbffd30ccfb964be114332e30", + "token": { + "decimals": 24, + "symbol": "stnear" + }, + "isSC": {} + }, + "0x6d5bfd02b543e7d49f88fe78628a42ac815d46f2": { + "name": "slbz token contract", + "address": "0x6d5bfd02b543e7d49f88fe78628a42ac815d46f2", + "token": { + "decimals": 18, + "symbol": "slbz" + }, + "isSC": {} + }, + "0x4148d2ce7816f0ae378d98b40eb3a7211e1fcf0d": { + "name": "bbt token contract", + "address": "0x4148d2ce7816f0ae378d98b40eb3a7211e1fcf0d", + "token": { + "decimals": 18, + "symbol": "bbt" + }, + "isSC": {} + }, + "0x25e801eb75859ba4052c4ac4233cec0264eadf8c": { + "name": "lunar token contract", + "address": "0x25e801eb75859ba4052c4ac4233cec0264eadf8c", + "token": { + "decimals": 18, + "symbol": "lunar" + }, + "isSC": {} + }, + "0x984c2505a14da732d7271416356f535953610340": { + "name": "umint token contract", + "address": "0x984c2505a14da732d7271416356f535953610340", + "token": { + "decimals": 18, + "symbol": "umint" + }, + "isSC": {} + }, + "0xc2ac78ffddf39e5cd6d83bbd70c1d67517c467ef": { + "name": "gba token contract", + "address": "0xc2ac78ffddf39e5cd6d83bbd70c1d67517c467ef", + "token": { + "decimals": 18, + "symbol": "gba" + }, + "isSC": {} + }, + "0x68e401b61ea53889505cc1366710f733a60c2d41": { + "name": "shitzu token contract", + "address": "0x68e401b61ea53889505cc1366710f733a60c2d41", + "token": { + "decimals": 18, + "symbol": "shitzu" + }, + "isSC": {} + }, + "0xb12bfca5a55806aaf64e99521918a4bf0fc40802": { + "name": "USDC token contract", + "address": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xe3520349f477a5f6eb06107066048508498a291b": { + "name": "DAI token contract", + "address": "0xe3520349f477a5f6eb06107066048508498a291b", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x98936bde1cf1bff1e7a8012cee5e2583851f2067": { + "name": "ann token contract", + "address": "0x98936bde1cf1bff1e7a8012cee5e2583851f2067", + "token": { + "decimals": 18, + "symbol": "ann" + }, + "isSC": {} + }, + "0xadbd1231fb360047525bedf962581f3eee7b49fe": { + "name": "crona token contract", + "address": "0xadbd1231fb360047525bedf962581f3eee7b49fe", + "token": { + "decimals": 18, + "symbol": "crona" + }, + "isSC": {} + }, + "0xcbde0e17d14f49e10a10302a32d17ae88a7ecb8b": { + "name": "crystl token contract", + "address": "0xcbde0e17d14f49e10a10302a32d17ae88a7ecb8b", + "token": { + "decimals": 18, + "symbol": "crystl" + }, + "isSC": {} + }, + "0x4e60216965e37e54dc94a1d9e473211e9dbc35ba": { + "name": "ddl token contract", + "address": "0x4e60216965e37e54dc94a1d9e473211e9dbc35ba", + "token": { + "decimals": 18, + "symbol": "ddl" + }, + "isSC": {} + }, + "0x4a1f7d14d68b8d5c1604ad235f06e57054435ed9": { + "name": "doken token contract", + "address": "0x4a1f7d14d68b8d5c1604ad235f06e57054435ed9", + "token": { + "decimals": 18, + "symbol": "doken" + }, + "isSC": {} + }, + "0x6b66fcb66dba37f99876a15303b759c73fc54ed0": { + "name": "hibiki token contract", + "address": "0x6b66fcb66dba37f99876a15303b759c73fc54ed0", + "token": { + "decimals": 18, + "symbol": "hibiki" + }, + "isSC": {} + }, + "0xd62a9d7be4404675ab0e5cbd5dfce4aa6a15566e": { + "name": "kafe token contract", + "address": "0xd62a9d7be4404675ab0e5cbd5dfce4aa6a15566e", + "token": { + "decimals": 18, + "symbol": "kafe" + }, + "isSC": {} + }, + "0xabd380327fe66724ffda91a87c772fb8d00be488": { + "name": "liq token contract", + "address": "0xabd380327fe66724ffda91a87c772fb8d00be488", + "token": { + "decimals": 18, + "symbol": "liq" + }, + "isSC": {} + }, + "0x2d03bece6747adc00e1a131bba1469c15fd11e03": { + "name": "vvs token contract", + "address": "0x2d03bece6747adc00e1a131bba1469c15fd11e03", + "token": { + "decimals": 18, + "symbol": "vvs" + }, + "isSC": {} + }, + "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23": { + "name": "wcro token contract", + "address": "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", + "token": { + "decimals": 18, + "symbol": "wcro" + }, + "isSC": {} + }, + "0xa4434afeae0decb9820d906bf01b13291d00651a": { + "name": "agl token contract", + "address": "0xa4434afeae0decb9820d906bf01b13291d00651a", + "token": { + "decimals": 18, + "symbol": "agl" + }, + "isSC": {} + }, + "0xe243ccab9e66e6cf1215376980811ddf1eb7f689": { + "name": "crx token contract", + "address": "0xe243ccab9e66e6cf1215376980811ddf1eb7f689", + "token": { + "decimals": 18, + "symbol": "crx" + }, + "isSC": {} + }, + "0x7d30c36f845d1dee79f852abf3a8a402fadf3b53": { + "name": "moon token contract", + "address": "0x7d30c36f845d1dee79f852abf3a8a402fadf3b53", + "token": { + "decimals": 9, + "symbol": "moon" + }, + "isSC": {} + }, + "0xed34211cdd2cf76c3ccee162761a72d7b6601e2b": { + "name": "loot token contract", + "address": "0xed34211cdd2cf76c3ccee162761a72d7b6601e2b", + "token": { + "decimals": 18, + "symbol": "loot" + }, + "isSC": {} + }, + "0xd3cecbe5639d05aed446da11f08d495ca6bf359f": { + "name": "croblanc token contract", + "address": "0xd3cecbe5639d05aed446da11f08d495ca6bf359f", + "token": { + "decimals": 18, + "symbol": "croblanc" + }, + "isSC": {} + }, + "0xa0c3c184493f2fae7d2f2bd83f195a1c300fa353": { + "name": "croissant token contract", + "address": "0xa0c3c184493f2fae7d2f2bd83f195a1c300fa353", + "token": { + "decimals": 18, + "symbol": "croissant" + }, + "isSC": {} + }, + "0x065de42e28e42d90c2052a1b49e7f83806af0e1f": { + "name": "crk token contract", + "address": "0x065de42e28e42d90c2052a1b49e7f83806af0e1f", + "token": { + "decimals": 9, + "symbol": "crk" + }, + "isSC": {} + }, + "0x8174bac1453c3ac7caed909c20ceadeb5e1cda00": { + "name": "crn token contract", + "address": "0x8174bac1453c3ac7caed909c20ceadeb5e1cda00", + "token": { + "decimals": 18, + "symbol": "crn" + }, + "isSC": {} + }, + "0x3df064069ba2c8b395592e7834934dbc48bbb955": { + "name": "crono token contract", + "address": "0x3df064069ba2c8b395592e7834934dbc48bbb955", + "token": { + "decimals": 18, + "symbol": "crono" + }, + "isSC": {} + }, + "0xc9fde867a14376829ab759f4c4871f67e2d3e441": { + "name": "sphere token contract", + "address": "0xc9fde867a14376829ab759f4c4871f67e2d3e441", + "token": { + "decimals": 18, + "symbol": "sphere" + }, + "isSC": {} + }, + "0x6ef20ca7e493c52095e892dab78a7fd0e7e2a279": { + "name": "cross token contract", + "address": "0x6ef20ca7e493c52095e892dab78a7fd0e7e2a279", + "token": { + "decimals": 18, + "symbol": "cross" + }, + "isSC": {} + }, + "0x7b8ad6d7560facd1959cfb4b4163d7d297c4bfc0": { + "name": "crp token contract", + "address": "0x7b8ad6d7560facd1959cfb4b4163d7d297c4bfc0", + "token": { + "decimals": 18, + "symbol": "crp" + }, + "isSC": {} + }, + "0x83b2ac8642ae46fc2823bc959ffeb3c1742c48b5": { + "name": "dark token contract", + "address": "0x83b2ac8642ae46fc2823bc959ffeb3c1742c48b5", + "token": { + "decimals": 18, + "symbol": "dark" + }, + "isSC": {} + }, + "0x9d3bbb0e988d9fb2d55d07fe471be2266ad9c81c": { + "name": "sky token contract", + "address": "0x9d3bbb0e988d9fb2d55d07fe471be2266ad9c81c", + "token": { + "decimals": 18, + "symbol": "sky" + }, + "isSC": {} + }, + "0x0694c9bf930b7456712cede98be770e110212b38": { + "name": "sh33p token contract", + "address": "0x0694c9bf930b7456712cede98be770e110212b38", + "token": { + "decimals": 18, + "symbol": "sh33p" + }, + "isSC": {} + }, + "0xe0c41ff9a7032de445771e12c14868cbe061c993": { + "name": "dxp token contract", + "address": "0xe0c41ff9a7032de445771e12c14868cbe061c993", + "token": { + "decimals": 18, + "symbol": "dxp" + }, + "isSC": {} + }, + "0xcc57f84637b441127f2f74905b9d99821b47b20c": { + "name": "dna token contract", + "address": "0xcc57f84637b441127f2f74905b9d99821b47b20c", + "token": { + "decimals": 18, + "symbol": "dna" + }, + "isSC": {} + }, + "0x0e98dc462ff438b802fad0d68ff7f111a0674bb5": { + "name": "dshare token contract", + "address": "0x0e98dc462ff438b802fad0d68ff7f111a0674bb5", + "token": { + "decimals": 18, + "symbol": "dshare" + }, + "isSC": {} + }, + "0xfd71fc52d34ed1cfc8363e5528285b12b6b942c2": { + "name": "degg token contract", + "address": "0xfd71fc52d34ed1cfc8363e5528285b12b6b942c2", + "token": { + "decimals": 18, + "symbol": "degg" + }, + "isSC": {} + }, + "0x0edec4be261b22be6096ec4960247697891a2045": { + "name": "frens token contract", + "address": "0x0edec4be261b22be6096ec4960247697891a2045", + "token": { + "decimals": 9, + "symbol": "frens" + }, + "isSC": {} + }, + "0x046cb616d7a52173e4da9eff1bfd590550aa3228": { + "name": "gaur token contract", + "address": "0x046cb616d7a52173e4da9eff1bfd590550aa3228", + "token": { + "decimals": 18, + "symbol": "gaur" + }, + "isSC": {} + }, + "0x66ec6e9f61ac288f5ba661cd9a2dbe3abf9871c9": { + "name": "gshare token contract", + "address": "0x66ec6e9f61ac288f5ba661cd9a2dbe3abf9871c9", + "token": { + "decimals": 18, + "symbol": "gshare" + }, + "isSC": {} + }, + "0xefd450027bd0ee84afafbc75f5a80c367efbf651": { + "name": "lhrc token contract", + "address": "0xefd450027bd0ee84afafbc75f5a80c367efbf651", + "token": { + "decimals": 18, + "symbol": "lhrc" + }, + "isSC": {} + }, + "0x50c0c5bda591bc7e89a342a3ed672fb59b3c46a7": { + "name": "mmo token contract", + "address": "0x50c0c5bda591bc7e89a342a3ed672fb59b3c46a7", + "token": { + "decimals": 18, + "symbol": "mmo" + }, + "isSC": {} + }, + "0x10c9284e6094b71d3ce4e38b8bffc668199da677": { + "name": "mimas token contract", + "address": "0x10c9284e6094b71d3ce4e38b8bffc668199da677", + "token": { + "decimals": 18, + "symbol": "mimas" + }, + "isSC": {} + }, + "0x3a1138075bd97a33f23a87824b811146fa44288e": { + "name": "mino token contract", + "address": "0x3a1138075bd97a33f23a87824b811146fa44288e", + "token": { + "decimals": 9, + "symbol": "mino" + }, + "isSC": {} + }, + "0x97749c9b61f878a880dfe312d2594ae07aed7656": { + "name": "mmf token contract", + "address": "0x97749c9b61f878a880dfe312d2594ae07aed7656", + "token": { + "decimals": 18, + "symbol": "mmf" + }, + "isSC": {} + }, + "0xd465b6b4937d768075414d413e981af0b49349cc": { + "name": "betify token contract", + "address": "0xd465b6b4937d768075414d413e981af0b49349cc", + "token": { + "decimals": 9, + "symbol": "betify" + }, + "isSC": {} + }, + "0x55210c2a69b4c52a9d9289a257d54d35c4a2d2ec": { + "name": "bank token contract", + "address": "0x55210c2a69b4c52a9d9289a257d54d35c4a2d2ec", + "token": { + "decimals": 9, + "symbol": "bank" + }, + "isSC": {} + }, + "0x6e8bc577fb047a9cb847817ee3135a7d5d4eeed3": { + "name": "crocash token contract", + "address": "0x6e8bc577fb047a9cb847817ee3135a7d5d4eeed3", + "token": { + "decimals": 9, + "symbol": "crocash" + }, + "isSC": {} + }, + "0x5b5fe1238aca91c65683acd7f9d9bf922e271eaa": { + "name": "sus token contract", + "address": "0x5b5fe1238aca91c65683acd7f9d9bf922e271eaa", + "token": { + "decimals": 9, + "symbol": "sus" + }, + "isSC": {} + }, + "0xbdd4e5660839a088573191a9889a262c0efc0983": { + "name": "photon token contract", + "address": "0xbdd4e5660839a088573191a9889a262c0efc0983", + "token": { + "decimals": 18, + "symbol": "photon" + }, + "isSC": {} + }, + "0xde9e2addfd3bbadb67553cdb120c6c6593b180f9": { + "name": "rna token contract", + "address": "0xde9e2addfd3bbadb67553cdb120c6c6593b180f9", + "token": { + "decimals": 18, + "symbol": "rna" + }, + "isSC": {} + }, + "0x0827e67ba4e7626f515a023b28cc4e4462d2295f": { + "name": "rshare token contract", + "address": "0x0827e67ba4e7626f515a023b28cc4e4462d2295f", + "token": { + "decimals": 18, + "symbol": "rshare" + }, + "isSC": {} + }, + "0x654bac3ec77d6db497892478f854cf6e8245dca9": { + "name": "svn token contract", + "address": "0x654bac3ec77d6db497892478f854cf6e8245dca9", + "token": { + "decimals": 18, + "symbol": "svn" + }, + "isSC": {} + }, + "0x0804702a4e749d39a35fde73d1df0b1f1d6b8347": { + "name": "single token contract", + "address": "0x0804702a4e749d39a35fde73d1df0b1f1d6b8347", + "token": { + "decimals": 18, + "symbol": "single" + }, + "isSC": {} + }, + "0xdd73dea10abc2bff99c60882ec5b2b81bb1dc5b2": { + "name": "tonic token contract", + "address": "0xdd73dea10abc2bff99c60882ec5b2b81bb1dc5b2", + "token": { + "decimals": 18, + "symbol": "tonic" + }, + "isSC": {} + }, + "0x383627caec2ce3b36793c34b576b2e97beda0466": { + "name": "ago token contract", + "address": "0x383627caec2ce3b36793c34b576b2e97beda0466", + "token": { + "decimals": 18, + "symbol": "ago" + }, + "isSC": {} + }, + "0x74512be345aebffbbf91952d04c160b333a5d2a3": { + "name": "croeth token contract", + "address": "0x74512be345aebffbbf91952d04c160b333a5d2a3", + "token": { + "decimals": 9, + "symbol": "croeth" + }, + "isSC": {} + }, + "0x2a96a67c3bc9063991127d475d0cfcb0e86a2e5c": { + "name": "crolambos token contract", + "address": "0x2a96a67c3bc9063991127d475d0cfcb0e86a2e5c", + "token": { + "decimals": 9, + "symbol": "crolambos" + }, + "isSC": {} + }, + "0xe727240728c1a5f95437b8b50afdd0ea4ae5f0c8": { + "name": "ness token contract", + "address": "0xe727240728c1a5f95437b8b50afdd0ea4ae5f0c8", + "token": { + "decimals": 18, + "symbol": "ness" + }, + "isSC": {} + }, + "0x9885488cd6864df90eeba6c5d07b35f08ceb05e9": { + "name": "grve token contract", + "address": "0x9885488cd6864df90eeba6c5d07b35f08ceb05e9", + "token": { + "decimals": 18, + "symbol": "grve" + }, + "isSC": {} + }, + "0xb8df27c687c6af9afe845a2afad2d01e199f4878": { + "name": "metf token contract", + "address": "0xb8df27c687c6af9afe845a2afad2d01e199f4878", + "token": { + "decimals": 18, + "symbol": "metf" + }, + "isSC": {} + }, + "0xf8b9facb7b4410f5703eb29093302f2933d6e1aa": { + "name": "mshare token contract", + "address": "0xf8b9facb7b4410f5703eb29093302f2933d6e1aa", + "token": { + "decimals": 18, + "symbol": "mshare" + }, + "isSC": {} + }, + "0xdcc261c03cd2f33ebea404318cdc1d9f8b78e1ad": { + "name": "vshare token contract", + "address": "0xdcc261c03cd2f33ebea404318cdc1d9f8b78e1ad", + "token": { + "decimals": 18, + "symbol": "vshare" + }, + "isSC": {} + }, + "0x6582c738660bf0701f05b04dce3c4e5fcfcda47a": { + "name": "dusd token contract", + "address": "0x6582c738660bf0701f05b04dce3c4e5fcfcda47a", + "token": { + "decimals": 18, + "symbol": "dusd" + }, + "isSC": {} + }, + "0x00fe915a5209e74d5a88334cc2daa4541aec8278": { + "name": "goal token contract", + "address": "0x00fe915a5209e74d5a88334cc2daa4541aec8278", + "token": { + "decimals": 18, + "symbol": "goal" + }, + "isSC": {} + }, + "0x2c43d9f78e4132fbe40bebb8ec5f61377472b2c0": { + "name": "darkg token contract", + "address": "0x2c43d9f78e4132fbe40bebb8ec5f61377472b2c0", + "token": { + "decimals": 18, + "symbol": "darkg" + }, + "isSC": {} + }, + "0xa3089f1462426398eb586e07700ae08aba7324c4": { + "name": "horgi token contract", + "address": "0xa3089f1462426398eb586e07700ae08aba7324c4", + "token": { + "decimals": 18, + "symbol": "horgi" + }, + "isSC": {} + }, + "0x57d06bb1e3b60c875cd3a4445a53217f9b44d390": { + "name": "phnx token contract", + "address": "0x57d06bb1e3b60c875cd3a4445a53217f9b44d390", + "token": { + "decimals": 18, + "symbol": "phnx" + }, + "isSC": {} + }, + "0xc4a174ccb5fb54a6721e11e0ca961e42715023f9": { + "name": "croge token contract", + "address": "0xc4a174ccb5fb54a6721e11e0ca961e42715023f9", + "token": { + "decimals": 9, + "symbol": "croge" + }, + "isSC": {} + }, + "0x4c76a10a658d71adb6431765a0a3ca13b6e2d491": { + "name": "crotama token contract", + "address": "0x4c76a10a658d71adb6431765a0a3ca13b6e2d491", + "token": { + "decimals": 2, + "symbol": "crotama" + }, + "isSC": {} + }, + "0x49fb98f9b4a3183cd88e7a115144fdf00fa6fb95": { + "name": "lion token contract", + "address": "0x49fb98f9b4a3183cd88e7a115144fdf00fa6fb95", + "token": { + "decimals": 18, + "symbol": "lion" + }, + "isSC": {} + }, + "0x212331e1435a8df230715db4c02b2a3a0abf8c61": { + "name": "mad token contract", + "address": "0x212331e1435a8df230715db4c02b2a3a0abf8c61", + "token": { + "decimals": 18, + "symbol": "mad" + }, + "isSC": {} + }, + "0x19258a1df9e929d02b34621cf52797998ae1aa27": { + "name": "rlm token contract", + "address": "0x19258a1df9e929d02b34621cf52797998ae1aa27", + "token": { + "decimals": 18, + "symbol": "rlm" + }, + "isSC": {} + }, + "0xd6597aa36dd90d7fccbd7b8a228f2d5cdc88ead0": { + "name": "tiger token contract", + "address": "0xd6597aa36dd90d7fccbd7b8a228f2d5cdc88ead0", + "token": { + "decimals": 18, + "symbol": "tiger" + }, + "isSC": {} + }, + "0xc21223249ca28397b4b6541dffaecc539bff0c59": { + "name": "USDC token contract", + "address": "0xc21223249ca28397b4b6541dffaecc539bff0c59", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xf2001b145b43032aaf5ee2884e456ccd805f677d": { + "name": "DAI token contract", + "address": "0xf2001b145b43032aaf5ee2884e456ccd805f677d", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0xfe282af5f9eb59c30a3f78789eeffa704188bdd4": { + "name": "relay token contract", + "address": "0xfe282af5f9eb59c30a3f78789eeffa704188bdd4", + "token": { + "decimals": 18, + "symbol": "relay" + }, + "isSC": {} + }, + "0x88c37e0bc6a237e96bc4a82774a38bbc30eff3cf": { + "name": "hades token contract", + "address": "0x88c37e0bc6a237e96bc4a82774a38bbc30eff3cf", + "token": { + "decimals": 18, + "symbol": "hades" + }, + "isSC": {} + }, + "0x8ef6f05ada3e7c5baf7162846875ec0b4f369222": { + "name": "hecate token contract", + "address": "0x8ef6f05ada3e7c5baf7162846875ec0b4f369222", + "token": { + "decimals": 9, + "symbol": "hecate" + }, + "isSC": {} + }, + "0xefb15ef34f85632fd1d4c17fc130ccee3d3d48ae": { + "name": "hellshare token contract", + "address": "0xefb15ef34f85632fd1d4c17fc130ccee3d3d48ae", + "token": { + "decimals": 18, + "symbol": "hellshare" + }, + "isSC": {} + }, + "0xc19e380a0086264904018f1fb8ff3b6e970c30ea": { + "name": "lun token contract", + "address": "0xc19e380a0086264904018f1fb8ff3b6e970c30ea", + "token": { + "decimals": 18, + "symbol": "lun" + }, + "isSC": {} + }, + "0x72c232d56542ba082592dee7c77b1c6cfa758bcd": { + "name": "maia token contract", + "address": "0x72c232d56542ba082592dee7c77b1c6cfa758bcd", + "token": { + "decimals": 9, + "symbol": "maia" + }, + "isSC": {} + }, + "0x30ac7259a6718484b0ed67be39e04385a668749d": { + "name": "mrise token contract", + "address": "0x30ac7259a6718484b0ed67be39e04385a668749d", + "token": { + "decimals": 2, + "symbol": "mrise" + }, + "isSC": {} + }, + "0x6d8534326415ff9966b387615e576a109ac01ac1": { + "name": "minime token contract", + "address": "0x6d8534326415ff9966b387615e576a109ac01ac1", + "token": { + "decimals": 18, + "symbol": "minime" + }, + "isSC": {} + }, + "0x90fe084f877c65e1b577c7b2ea64b8d8dd1ab278": { + "name": "nett token contract", + "address": "0x90fe084f877c65e1b577c7b2ea64b8d8dd1ab278", + "token": { + "decimals": 18, + "symbol": "nett" + }, + "isSC": {} + }, + "0x28100159d8b2acc4e45ec7ebdb875265bb752385": { + "name": "oshare token contract", + "address": "0x28100159d8b2acc4e45ec7ebdb875265bb752385", + "token": { + "decimals": 18, + "symbol": "oshare" + }, + "isSC": {} + }, + "0x41607272ce6f2a42732ae382f00f8f9ce68d78f3": { + "name": "sea token contract", + "address": "0x41607272ce6f2a42732ae382f00f8f9ce68d78f3", + "token": { + "decimals": 18, + "symbol": "sea" + }, + "isSC": {} + }, + "0xb26f58f0b301a077cfa779c0b0f8281c7f936ac0": { + "name": "stars token contract", + "address": "0xb26f58f0b301a077cfa779c0b0f8281c7f936ac0", + "token": { + "decimals": 18, + "symbol": "stars" + }, + "isSC": {} + }, + "0x69fdb77064ec5c84fa2f21072973eb28441f43f3": { + "name": "tethys token contract", + "address": "0x69fdb77064ec5c84fa2f21072973eb28441f43f3", + "token": { + "decimals": 18, + "symbol": "tethys" + }, + "isSC": {} + }, + "0xde9e9e39eea8cecfe1eaca8e6a64c8eb9e7665cd": { + "name": "vefi token contract", + "address": "0xde9e9e39eea8cecfe1eaca8e6a64c8eb9e7665cd", + "token": { + "decimals": 18, + "symbol": "vefi" + }, + "isSC": {} + }, + "0x12e9a12dbb312c43b0160fdb479b753685747442": { + "name": "andro token contract", + "address": "0x12e9a12dbb312c43b0160fdb479b753685747442", + "token": { + "decimals": 18, + "symbol": "andro" + }, + "isSC": {} + }, + "0xb27bbeaaca2c00d6258c3118bab6b5b6975161c8": { + "name": "hermes token contract", + "address": "0xb27bbeaaca2c00d6258c3118bab6b5b6975161c8", + "token": { + "decimals": 18, + "symbol": "hermes" + }, + "isSC": {} + }, + "0x1b33020a1db9f1762f98635b9ac6fb4c36122649": { + "name": "psdn token contract", + "address": "0x1b33020a1db9f1762f98635b9ac6fb4c36122649", + "token": { + "decimals": 18, + "symbol": "psdn" + }, + "isSC": {} + }, + "0x1969ff7740e903cef7a9ad5213afee07f9e478af": { + "name": "argo token contract", + "address": "0x1969ff7740e903cef7a9ad5213afee07f9e478af", + "token": { + "decimals": 18, + "symbol": "argo" + }, + "isSC": {} + }, + "0x721532bc0da5ffaeb0a6a45fb24271e8098629a7": { + "name": "byte token contract", + "address": "0x721532bc0da5ffaeb0a6a45fb24271e8098629a7", + "token": { + "decimals": 18, + "symbol": "byte" + }, + "isSC": {} + }, + "0xfe540d6dbad8c68928778aaf2be828efa4b44fa2": { + "name": "aera token contract", + "address": "0xfe540d6dbad8c68928778aaf2be828efa4b44fa2", + "token": { + "decimals": 18, + "symbol": "aera" + }, + "isSC": {} + }, + "0x0ed0ca6872073e02cd3ae005baf04ba43be947fa": { + "name": "agora token contract", + "address": "0x0ed0ca6872073e02cd3ae005baf04ba43be947fa", + "token": { + "decimals": 18, + "symbol": "agora" + }, + "isSC": {} + }, + "0xaaaaedc8d708583f18c53d47c030359e2083aaaa": { + "name": "apollo token contract", + "address": "0xaaaaedc8d708583f18c53d47c030359e2083aaaa", + "token": { + "decimals": 5, + "symbol": "apollo" + }, + "isSC": {} + }, + "0x6f05709bc91bad933346f9e159f0d3fdbc2c9dce": { + "name": "hera token contract", + "address": "0x6f05709bc91bad933346f9e159f0d3fdbc2c9dce", + "token": { + "decimals": 18, + "symbol": "hera" + }, + "isSC": {} + }, + "0x1f5550a0f5f659e07506088a7919a88dff37218f": { + "name": "peak token contract", + "address": "0x1f5550a0f5f659e07506088a7919a88dff37218f", + "token": { + "decimals": 18, + "symbol": "peak" + }, + "isSC": {} + }, + "0x259ef6776648500d7f1a8aba3651e38b1121e65e": { + "name": "pro token contract", + "address": "0x259ef6776648500d7f1a8aba3651e38b1121e65e", + "token": { + "decimals": 18, + "symbol": "pro" + }, + "isSC": {} + }, + "0xea32a96608495e54156ae48931a7c20f0dcc1a21": { + "name": "m.USDC token contract", + "address": "0xea32a96608495e54156ae48931a7c20f0dcc1a21", + "token": { + "decimals": 6, + "symbol": "m.USDC" + }, + "isSC": {} + }, + "0x4c078361fc9bbb78df910800a991c7c3dd2f6ce0": { + "name": "m.DAI token contract", + "address": "0x4c078361fc9bbb78df910800a991c7c3dd2f6ce0", + "token": { + "decimals": 18, + "symbol": "m.DAI" + }, + "isSC": {} + }, + "0x4200000000000000000000000000000000000042": { + "name": "OP token contract", + "address": "0x4200000000000000000000000000000000000042", + "token": { + "decimals": 18, + "symbol": "OP" + }, + "isSC": {} + }, + "0x4200000000000000000000000000000000000006": { + "name": "WETH token contract", + "address": "0x4200000000000000000000000000000000000006", + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "isSC": {} + }, + "0x0b2c639c533813f4aa9d7837caf62653d097ff85": { + "name": "USDC token contract", + "address": "0x0b2c639c533813f4aa9d7837caf62653d097ff85", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x7f5c764cbc14f9669b88837ca1490cca17c31607": { + "name": "USDC.e token contract", + "address": "0x7f5c764cbc14f9669b88837ca1490cca17c31607", + "token": { + "decimals": 6, + "symbol": "USDC.e" + }, + "isSC": {} + }, + "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1": { + "name": "DAI token contract", + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x94b008aa00579c1307b0ef2c499ad98a8ce58e58": { + "name": "USDT token contract", + "address": "0x94b008aa00579c1307b0ef2c499ad98a8ce58e58", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0x920cf626a271321c151d027030d5d08af699456b": { + "name": "KWENTA token contract", + "address": "0x920cf626a271321c151d027030d5d08af699456b", + "token": { + "decimals": 18, + "symbol": "KWENTA" + }, + "isSC": {} + }, + "0x9bcef72be871e61ed4fbbc7630889bee758eb81d": { + "name": "rETH token contract", + "address": "0x9bcef72be871e61ed4fbbc7630889bee758eb81d", + "token": { + "decimals": 18, + "symbol": "rETH" + }, + "isSC": {} + }, + "0x76fb31fb4af56892a25e32cfc43de717950c9278": { + "name": "AAVE token contract", + "address": "0x76fb31fb4af56892a25e32cfc43de717950c9278", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8": { + "name": "USDC token contract", + "address": "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": { + "name": "USDT token contract", + "address": "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": { + "name": "WETH token contract", + "address": "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", + "token": { + "decimals": 18, + "symbol": "WETH" + }, + "isSC": {} + }, + "0x912ce59144191c1204e64559fe8253a0e49e6548": { + "name": "ARB token contract", + "address": "0x912ce59144191c1204e64559fe8253a0e49e6548", + "token": { + "decimals": 18, + "symbol": "ARB" + }, + "isSC": {} + }, + "0xba5ddd1f9d7f570dc94a51479a000e3bce967196": { + "name": "AAVE token contract", + "address": "0xba5ddd1f9d7f570dc94a51479a000e3bce967196", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {} + }, + "0x561877b6b3dd7651313794e5f2894b2f18be0766": { + "name": "MATIC token contract", + "address": "0x561877b6b3dd7651313794e5f2894b2f18be0766", + "token": { + "decimals": 18, + "symbol": "MATIC" + }, + "isSC": {} + }, + "0x2e9a6df78e42a30712c10a9dc4b1c8656f8f2879": { + "name": "MKR token contract", + "address": "0x2e9a6df78e42a30712c10a9dc4b1c8656f8f2879", + "token": { + "decimals": 18, + "symbol": "MKR" + }, + "isSC": {} + }, + "0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07": { + "name": "JOE token contract", + "address": "0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07", + "token": { + "decimals": 18, + "symbol": "JOE" + }, + "isSC": {} + }, + "0x95146881b86b3ee99e63705ec87afe29fcc044d9": { + "name": "VRTX token contract", + "address": "0x95146881b86b3ee99e63705ec87afe29fcc044d9", + "token": { + "decimals": 18, + "symbol": "VRTX" + }, + "isSC": {} + }, + "0x2bcc6d6cdbbdc0a4071e48bb3b969b06b3330c07": { + "name": "SOL token contract", + "address": "0x2bcc6d6cdbbdc0a4071e48bb3b969b06b3330c07", + "token": { + "decimals": 9, + "symbol": "SOL" + }, + "isSC": {} + }, + "0xaf88d065e77c8cc2239327c5edb3a432268e5831": { + "name": "USDC token contract", + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": { + "name": "WBTC token contract", + "address": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f", + "token": { + "decimals": 8, + "symbol": "WBTC" + }, + "isSC": {} + }, + "0x3b60ff35d3f7f62d636b067dd0dc0dfdad670e4e": { + "name": "LADYS token contract", + "address": "0x3b60ff35d3f7f62d636b067dd0dc0dfdad670e4e", + "token": { + "decimals": 18, + "symbol": "LADYS" + }, + "isSC": {} + }, + "0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0": { + "name": "UNI token contract", + "address": "0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0", + "token": { + "decimals": 18, + "symbol": "UNI" + }, + "isSC": {} + }, + "0xf97f4df75117a78c1a5a0dbb814af92458539fb4": { + "name": "LINK token contract", + "address": "0xf97f4df75117a78c1a5a0dbb814af92458539fb4", + "token": { + "decimals": 18, + "symbol": "LINK" + }, + "isSC": {} + }, + "0x382bb369d343125bfb2117af9c149795c6c65c50": { + "name": "USDC token contract", + "address": "0x382bb369d343125bfb2117af9c149795c6c65c50", + "token": { + "decimals": 18, + "symbol": "USDC" + }, + "isSC": {} + }, + "0xc946daf81b08146b1c7a8da2a851ddf2b3eaaf85": { + "name": "USDT token contract", + "address": "0xc946daf81b08146b1c7a8da2a851ddf2b3eaaf85", + "token": { + "decimals": 6, + "symbol": "USDT" + }, + "isSC": {} + }, + "0xef71ca2ee68f45b9ad6f72fbdb33d707b872315c": { + "name": "ETHK token contract", + "address": "0xef71ca2ee68f45b9ad6f72fbdb33d707b872315c", + "token": { + "decimals": 18, + "symbol": "ETHK" + }, + "isSC": {} + }, + "0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca": { + "name": "USDbC token contract", + "address": "0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca", + "token": { + "decimals": 6, + "symbol": "USDbC" + }, + "isSC": {} + }, + "0x50c5725949a6f0c72e6c4a641f24049a917db0cb": { + "name": "DAI token contract", + "address": "0x50c5725949a6f0c72e6c4a641f24049a917db0cb", + "token": { + "decimals": 18, + "symbol": "DAI" + }, + "isSC": {} + }, + "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": { + "name": "USDC token contract", + "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "token": { + "decimals": 6, + "symbol": "USDC" + }, + "isSC": {} + }, + "0x12652c6d93fdb6f4f37d48a8687783c782bb0d10": { + "address": "0x12652c6d93fdb6f4f37d48a8687783c782bb0d10", + "name": "Entangle", + "token": { + "decimals": 18, + "symbol": "NGL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NGL.svg" + }, + "0x4d0528598f916fd1d8dc80e5f54a8feedcfd4b18": { + "address": "0x4d0528598f916fd1d8dc80e5f54a8feedcfd4b18", + "name": "Atoshi", + "token": { + "decimals": 18, + "symbol": "ATOS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ATOS.svg" + }, + "0x011e128ec62840186f4a07e85e3ace28858c5606": { + "address": "0x011e128ec62840186f4a07e85e3ace28858c5606", + "name": "Valeria", + "token": { + "decimals": 18, + "symbol": "VAL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/val.svg" + }, + "0x8b385ca3592a5efc34e0c9fe663de56897f1751f": { + "address": "0x8b385ca3592a5efc34e0c9fe663de56897f1751f", + "name": "INFibit", + "token": { + "decimals": 18, + "symbol": "IBIT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/INFibit.svg" + }, + "0x99cfb8cba9c821b4a343c6a1fc630465c9708df5": { + "address": "0x99cfb8cba9c821b4a343c6a1fc630465c9708df5", + "name": "Pepe Inu", + "token": { + "decimals": 18, + "symbol": "$PEPEINU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PepeInu.svg" + }, + "0x665f77fba5975ab40ce61c90f28007fb5b09d7b1": { + "address": "0x665f77fba5975ab40ce61c90f28007fb5b09d7b1", + "name": "Genieswap", + "token": { + "decimals": 18, + "symbol": "GENIE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Genieswap.svg" + }, + "0x09e6d500d14d13e0528d2c0fff24e5fff68237b4": { + "address": "0x09e6d500d14d13e0528d2c0fff24e5fff68237b4", + "name": "Dohrnii", + "token": { + "decimals": 18, + "symbol": "DHN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dhn.svg" + }, + "0x9b6b9d2468e165a02fef69e61b6d3d6cbc0ac409": { + "address": "0x9b6b9d2468e165a02fef69e61b6d3d6cbc0ac409", + "name": "OASISLIFE", + "token": { + "decimals": 18, + "symbol": "OFE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/OFE.svg" + }, + "0xdf0162a6b3e9fdf0302c1e949739deeafafd8f89": { + "address": "0xdf0162a6b3e9fdf0302c1e949739deeafafd8f89", + "name": "METAOASIS", + "token": { + "decimals": 18, + "symbol": "MOA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MOA.svg" + }, + "0x4ad7a056191f4c9519facd6d75fa94ca26003ace": { + "address": "0x4ad7a056191f4c9519facd6d75fa94ca26003ace", + "name": "GoldPesa Option", + "token": { + "decimals": 18, + "symbol": "GPO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/GPO.svg" + }, + "0x85f17cf997934a597031b2e18a9ab6ebd4b9f6a4": { + "address": "0x85f17cf997934a597031b2e18a9ab6ebd4b9f6a4", + "name": "NEAR", + "token": { + "decimals": 24, + "symbol": "NEAR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NEAR.svg" + }, + "0xc211477cb4098ac22a98432781f5f26a1e07a4d4": { + "address": "0xc211477cb4098ac22a98432781f5f26a1e07a4d4", + "name": "CULTURED", + "token": { + "decimals": 18, + "symbol": "CULTURED" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CULTURED.svg" + }, + "0x86f2a193b116d1f9c53ed26d97f77cdc8bcf4c2b": { + "address": "0x86f2a193b116d1f9c53ed26d97f77cdc8bcf4c2b", + "name": "EHTAGA", + "token": { + "decimals": 18, + "symbol": "EHTAGA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/EHTAGA.svg" + }, + "0x54b79a15b2e2c55c736a66bb0a978fb840407ac8": { + "address": "0x54b79a15b2e2c55c736a66bb0a978fb840407ac8", + "name": "FEVER", + "token": { + "decimals": 18, + "symbol": "FEVER" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/FEVER.svg" + }, + "0x677c9fe4396d3d13a0f9013a8118eae386c843a5": { + "address": "0x677c9fe4396d3d13a0f9013a8118eae386c843a5", + "name": "IAM", + "token": { + "decimals": 18, + "symbol": "IAM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/IAM.svg" + }, + "0xf63c65e855020e4b74f0ad842d9537da0e6162ec": { + "address": "0xf63c65e855020e4b74f0ad842d9537da0e6162ec", + "name": "ISH", + "token": { + "decimals": 18, + "symbol": "ISH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ISH.svg" + }, + "0xc105fa46510f32c0444ccdb4e51065da95caa1b4": { + "address": "0xc105fa46510f32c0444ccdb4e51065da95caa1b4", + "name": "LITA", + "token": { + "decimals": 18, + "symbol": "LITA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LITA.svg" + }, + "0x5401f949cdfa3e5af32538167c0314230769209c": { + "address": "0x5401f949cdfa3e5af32538167c0314230769209c", + "name": "MAHCOIN", + "token": { + "decimals": 18, + "symbol": "MAHCOIN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MAHCOIN.svg" + }, + "0x711d2c47aff84b96ad0f36983b1c41be2c509e18": { + "address": "0x711d2c47aff84b96ad0f36983b1c41be2c509e18", + "name": "NIKITA", + "token": { + "decimals": 18, + "symbol": "NIKITA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NIKITA.svg" + }, + "0x3c44aec33993b6830e5c2a705ea879b9c9ba0f7c": { + "address": "0x3c44aec33993b6830e5c2a705ea879b9c9ba0f7c", + "name": "NYELA", + "token": { + "decimals": 18, + "symbol": "NYELA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NYELA.svg" + }, + "0xfa9096c99e687ea8e0064c23daacfe87cc99e4ba": { + "address": "0xfa9096c99e687ea8e0064c23daacfe87cc99e4ba", + "name": "RON", + "token": { + "decimals": 18, + "symbol": "RON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/RON.svg" + }, + "0x287a7c95ad00bbdd48599ad2919567fd09281f07": { + "address": "0x287a7c95ad00bbdd48599ad2919567fd09281f07", + "name": "STEELO", + "token": { + "decimals": 18, + "symbol": "STEELO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/STEELO.svg" + }, + "0x2ec3275f7ace4044e499823f511cd58250be8e3d": { + "address": "0x2ec3275f7ace4044e499823f511cd58250be8e3d", + "name": "Privilege", + "token": { + "decimals": 8, + "symbol": "PRVG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/prvg.svg" + }, + "0x65bb569faadd324a00883fde4c46346cc96d5c0a": { + "address": "0x65bb569faadd324a00883fde4c46346cc96d5c0a", + "name": "Provide", + "token": { + "decimals": 8, + "symbol": "PRVD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/prvd.svg" + }, + "0x5afe3855358e112b5647b952709e6165e1c1eeee": { + "address": "0x5afe3855358e112b5647b952709e6165e1c1eeee", + "name": "Safe Token", + "token": { + "decimals": 18, + "symbol": "SAFE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/safe-green-token.svg" + }, + "0x9c8ff314c9bc7f6e59a9d9225fb22946427edc03": { + "address": "0x9c8ff314c9bc7f6e59a9d9225fb22946427edc03", + "name": "Nouns", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nouns.svg" + }, + "0x08d7c0242953446436f34b4c78fe9da38c73668d": { + "address": "0x08d7c0242953446436f34b4c78fe9da38c73668d", + "name": "PROOF Collective", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/proof.svg" + }, + "0x23581767a106ae21c074b2276d25e5c3e136a68b": { + "address": "0x23581767a106ae21c074b2276d25e5c3e136a68b", + "name": "Moonbirds", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/moonbirds.svg" + }, + "0x60e4d786628fea6478f785a6d7e704777c86a7c6": { + "address": "0x60e4d786628fea6478f785a6d7e704777c86a7c6", + "name": "MutantApeYachtClub", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mayc.svg" + }, + "0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b": { + "address": "0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b", + "name": "CloneX", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/clonex.svg" + }, + "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e": { + "address": "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e", + "name": "Doodles", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/doodles.svg" + }, + "0xed5af388653567af2f388e6224dc7c4b3241c544": { + "address": "0xed5af388653567af2f388e6224dc7c4b3241c544", + "name": "Azuki", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/azuki.svg" + }, + "0xa3aee8bce55beea1951ef834b99f3ac60d1abeeb": { + "address": "0xa3aee8bce55beea1951ef834b99f3ac60d1abeeb", + "name": "VeeFriends", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/veefriends.svg" + }, + "0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258": { + "address": "0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258", + "name": "Otherdeed", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/otherdeed.svg" + }, + "0xd057b63f5e69cf1b929b356b579cba08d7688048": { + "address": "0xd057b63f5e69cf1b929b356b579cba08d7688048", + "name": "CoW Protocol Virtual Token", + "token": { + "decimals": 18, + "symbol": "vCOW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/vCOW.svg" + }, + "0x88d8da2a8d0fa5b1f4e38030ac486ade0afa2798": { + "address": "0x88d8da2a8d0fa5b1f4e38030ac486ade0afa2798", + "name": "Terrapass Coin", + "token": { + "decimals": 18, + "symbol": "TPSC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tpsc.svg" + }, + "0x26805021988f1a45dc708b5fb75fc75f21747d8c": { + "address": "0x26805021988f1a45dc708b5fb75fc75f21747d8c", + "name": "xGamma", + "token": { + "decimals": 18, + "symbol": "xGAMMA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/xGamma.svg" + }, + "0xc7d9c108d4e1dd1484d3e2568d7f74bfd763d356": { + "address": "0xc7d9c108d4e1dd1484d3e2568d7f74bfd763d356", + "name": "SORA Synthetic USD", + "token": { + "decimals": 18, + "symbol": "XSTUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sora-xstusd.svg" + }, + "0x3fa400483487a489ec9b1db29c4129063eec4654": { + "address": "0x3fa400483487a489ec9b1db29c4129063eec4654", + "name": "Cryptokek.com", + "token": { + "decimals": 18, + "symbol": "KEK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/cryptokek.svg" + }, + "0x9a0242b7a33dacbe40edb927834f96eb39f8fbcb": { + "address": "0x9a0242b7a33dacbe40edb927834f96eb39f8fbcb", + "name": "BABB", + "token": { + "decimals": 18, + "symbol": "BAX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bax.svg" + }, + "0x898bad2774eb97cf6b94605677f43b41871410b1": { + "address": "0x898bad2774eb97cf6b94605677f43b41871410b1", + "name": "vEth2", + "token": { + "decimals": 18, + "symbol": "vEth2" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/vEth2.svg" + }, + "0x16c52ceece2ed57dad87319d91b5e3637d50afa4": { + "address": "0x16c52ceece2ed57dad87319d91b5e3637d50afa4", + "name": "TCAP Token", + "token": { + "decimals": 18, + "symbol": "TCAP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tcap.svg" + }, + "0x47be779de87de6580d0548cde80710a93c502405": { + "address": "0x47be779de87de6580d0548cde80710a93c502405", + "name": "Rainbow Pool", + "token": { + "decimals": 18, + "symbol": "xRNBW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/halodao-xrnbw.svg" + }, + "0x84810bcf08744d5862b8181f12d17bfd57d3b078": { + "address": "0x84810bcf08744d5862b8181f12d17bfd57d3b078", + "name": "SharedStake", + "token": { + "decimals": 18, + "symbol": "SGT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sharedstake.svg" + }, + "0x75387e1287dd85482ab66102da9f6577e027f609": { + "address": "0x75387e1287dd85482ab66102da9f6577e027f609", + "name": "MindsyncAI", + "token": { + "decimals": 18, + "symbol": "MAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MAI.svg" + }, + "0x196f4727526ea7fb1e17b2071b3d8eaa38486988": { + "address": "0x196f4727526ea7fb1e17b2071b3d8eaa38486988", + "name": "Reserve", + "token": { + "decimals": 18, + "symbol": "RSV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rsv.svg" + }, + "0x252739487c1fa66eaeae7ced41d6358ab2a6bca9": { + "address": "0x252739487c1fa66eaeae7ced41d6358ab2a6bca9", + "name": "ArCoin", + "token": { + "decimals": 8, + "symbol": "RCOIN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ArCoin.svg" + }, + "0x8e3bcc334657560253b83f08331d85267316e08a": { + "address": "0x8e3bcc334657560253b83f08331d85267316e08a", + "name": "Rubic", + "token": { + "decimals": 18, + "symbol": "BRBC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/brbc.svg" + }, + "0xf25c91c87e0b1fd9b4064af0f427157aab0193a7": { + "address": "0xf25c91c87e0b1fd9b4064af0f427157aab0193a7", + "name": "BASIC Token", + "token": { + "decimals": 18, + "symbol": "BASIC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/basic.svg" + }, + "0xbcf9dbf8b14ed096b2ba08b7269356197fdd1b5d": { + "address": "0xbcf9dbf8b14ed096b2ba08b7269356197fdd1b5d", + "name": "Avaluse", + "token": { + "decimals": 18, + "symbol": "AVAL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/avaluse.svg" + }, + "0x9af4f26941677c706cfecf6d3379ff01bb85d5ab": { + "address": "0x9af4f26941677c706cfecf6d3379ff01bb85d5ab", + "name": "DomRaiderToken", + "token": { + "decimals": 8, + "symbol": "DRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/drt.svg" + }, + "0x06b179e292f080871825bed5d722162fd96b4c95": { + "address": "0x06b179e292f080871825bed5d722162fd96b4c95", + "name": "10x.gg", + "token": { + "decimals": 18, + "symbol": "XGG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/xgg.svg" + }, + "0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85": { + "address": "0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85", + "name": "DMScript", + "token": { + "decimals": 18, + "symbol": "DMST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dmst.svg" + }, + "0xbd31ea8212119f94a611fa969881cba3ea06fa3d": { + "address": "0xbd31ea8212119f94a611fa969881cba3ea06fa3d", + "name": "LUNA Token", + "token": { + "decimals": 6, + "symbol": "LUNA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Luna.svg" + }, + "0xcaaff72a8cbbfc5cf343ba4e26f65a257065bff1": { + "address": "0xcaaff72a8cbbfc5cf343ba4e26f65a257065bff1", + "name": "KRT Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "KRT-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/KRT.svg" + }, + "0x676ad1b33ae6423c6618c1aecf53baa29cf39ee5": { + "address": "0x676ad1b33ae6423c6618c1aecf53baa29cf39ee5", + "name": "SDT Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "SDT-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SDT.svg" + }, + "0x156b36ec68fdbf84a925230ba96cb1ca4c4bde45": { + "address": "0x156b36ec68fdbf84a925230ba96cb1ca4c4bde45", + "name": "MNT Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "MNT-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MNT.svg" + }, + "0xd36932143f6ebdedd872d5fb0651f4b72fd15a84": { + "address": "0xd36932143f6ebdedd872d5fb0651f4b72fd15a84", + "name": "Mirror AAPL Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mAAPL-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mAAPL.svg" + }, + "0x59a921db27dd6d4d974745b7ffc5c33932653442": { + "address": "0x59a921db27dd6d4d974745b7ffc5c33932653442", + "name": "Mirror GOOGL Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mGOGL-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mGOOGL.svg" + }, + "0x21ca39943e91d704678f5d00b6616650f066fd63": { + "address": "0x21ca39943e91d704678f5d00b6616650f066fd63", + "name": "Mirror TSLA Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mTSLA-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mTSLA.svg" + }, + "0xc8d674114bac90148d11d3c1d33c61835a0f9dcd": { + "address": "0xc8d674114bac90148d11d3c1d33c61835a0f9dcd", + "name": "Mirror NFLX Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mNFLX-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mNFLX.svg" + }, + "0x13b02c8de71680e71f0820c996e4be43c2f57d15": { + "address": "0x13b02c8de71680e71f0820c996e4be43c2f57d15", + "name": "Mirror QQQ Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mQQQ-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mQQQ.svg" + }, + "0xedb0414627e6f1e3f082de65cd4f9c693d78cca9": { + "address": "0xedb0414627e6f1e3f082de65cd4f9c693d78cca9", + "name": "Mirror TWTR Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mTWTR-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mTWTR.svg" + }, + "0x41bbedd7286daab5910a1f15d12cbda839852bd7": { + "address": "0x41bbedd7286daab5910a1f15d12cbda839852bd7", + "name": "Mirror MSFT Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mMSFT-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mMSFT.svg" + }, + "0x0cae9e4d663793c2a2a0b211c1cf4bbca2b9caa7": { + "address": "0x0cae9e4d663793c2a2a0b211c1cf4bbca2b9caa7", + "name": "Mirror AMZN Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mAMZN-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mAMZN.svg" + }, + "0x56aa298a19c93c6801fdde870fa63ef75cc0af72": { + "address": "0x56aa298a19c93c6801fdde870fa63ef75cc0af72", + "name": "Mirror BABA Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mBABA-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mBABA.svg" + }, + "0x1d350417d9787e000cc1b95d70e9536dcd91f373": { + "address": "0x1d350417d9787e000cc1b95d70e9536dcd91f373", + "name": "Mirror IAU Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mIAU-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mIAU.svg" + }, + "0x9d1555d8cb3c846bb4f7d5b1b1080872c3166676": { + "address": "0x9d1555d8cb3c846bb4f7d5b1b1080872c3166676", + "name": "Mirror SLV Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mSLV-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mSLV.svg" + }, + "0x31c63146a635eb7465e5853020b39713ac356991": { + "address": "0x31c63146a635eb7465e5853020b39713ac356991", + "name": "Mirror USO Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mUSO-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mUSO.svg" + }, + "0xf72fcd9dcf0190923fadd44811e240ef4533fc86": { + "address": "0xf72fcd9dcf0190923fadd44811e240ef4533fc86", + "name": "Mirror VIXY Token - Shuttle", + "token": { + "decimals": 18, + "symbol": "mVIXY-S" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mVIXY.svg" + }, + "0x947aeb02304391f8fbe5b25d7d98d649b57b1788": { + "address": "0x947aeb02304391f8fbe5b25d7d98d649b57b1788", + "name": "Mandala Exchange Token", + "token": { + "decimals": 18, + "symbol": "MDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/mandala.svg" + }, + "0xcdeee767bed58c5325f68500115d4b722b3724ee": { + "address": "0xcdeee767bed58c5325f68500115d4b722b3724ee", + "name": "Carbon", + "token": { + "decimals": 18, + "symbol": "CRBN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CRBN.svg" + }, + "0x7ba92741bf2a568abc6f1d3413c58c6e0244f8fd": { + "address": "0x7ba92741bf2a568abc6f1d3413c58c6e0244f8fd", + "name": "Monerium GBP", + "token": { + "decimals": 18, + "symbol": "GBPe" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/GBPe.svg" + }, + "0xbc5142e0cc5eb16b47c63b0f033d4c2480853a52": { + "address": "0xbc5142e0cc5eb16b47c63b0f033d4c2480853a52", + "name": "Monerium USD", + "token": { + "decimals": 18, + "symbol": "USDe" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/USDe.svg" + }, + "0xc642549743a93674cf38d6431f75d6443f88e3e2": { + "address": "0xc642549743a93674cf38d6431f75d6443f88e3e2", + "name": "Monerium ISK", + "token": { + "decimals": 18, + "symbol": "ISKe" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ISKe.svg" + }, + "0x44197a4c44d6a059297caf6be4f7e172bd56caaf": { + "address": "0x44197a4c44d6a059297caf6be4f7e172bd56caaf", + "name": "ELTCOIN", + "token": { + "decimals": 8, + "symbol": "ELT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ELTCOIN.svg" + }, + "0x44e2dec86b9f0e0266e9aa66e10323a2bd69cf9a": { + "address": "0x44e2dec86b9f0e0266e9aa66e10323a2bd69cf9a", + "name": "Attrace", + "token": { + "decimals": 18, + "symbol": "ATTR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/attr.svg" + }, + "0x4da27a545c0c5b758a6ba100e3a049001de870f5": { + "address": "0x4da27a545c0c5b758a6ba100e3a049001de870f5", + "name": "Staked Aave", + "token": { + "decimals": 18, + "symbol": "stAAVE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/stkAAVE.svg" + }, + "0xba9d4199fab4f26efe3551d490e3821486f135ba": { + "address": "0xba9d4199fab4f26efe3551d490e3821486f135ba", + "name": "SwissBorg", + "token": { + "decimals": 8, + "symbol": "CHSB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/chsb.svg" + }, + "0xb78b3320493a4efaa1028130c5ba26f0b6085ef8": { + "address": "0xb78b3320493a4efaa1028130c5ba26f0b6085ef8", + "name": "Dracula", + "token": { + "decimals": 18, + "symbol": "DRC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dracula.svg" + }, + "0x178c820f862b14f316509ec36b13123da19a6054": { + "address": "0x178c820f862b14f316509ec36b13123da19a6054", + "name": "Energy Web Token Bridged", + "token": { + "decimals": 18, + "symbol": "EWTB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ewtb.svg" + }, + "0x7865af71cf0b288b4e7f654f4f7851eb46a2b7f8": { + "address": "0x7865af71cf0b288b4e7f654f4f7851eb46a2b7f8", + "name": "Sentivate", + "token": { + "decimals": 18, + "symbol": "SNTVT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sentivate.svg" + }, + "0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e": { + "address": "0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e", + "name": "Metronome", + "token": { + "decimals": 18, + "symbol": "MET" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/metronome.svg" + }, + "0x49d716dfe60b37379010a75329ae09428f17118d": { + "address": "0x49d716dfe60b37379010a75329ae09428f17118d", + "name": "PoolTogether Dai", + "token": { + "decimals": 18, + "symbol": "PLDAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/pldai.svg" + }, + "0xfe6892654cbb05eb73d28dcc1ff938f59666fe9f": { + "address": "0xfe6892654cbb05eb73d28dcc1ff938f59666fe9f", + "name": "PoolTogether Sai", + "token": { + "decimals": 18, + "symbol": "PLSAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plsai.svg" + }, + "0xbd87447f48ad729c5c4b8bcb503e1395f62e8b98": { + "address": "0xbd87447f48ad729c5c4b8bcb503e1395f62e8b98", + "name": "PoolTogether USDC", + "token": { + "decimals": 6, + "symbol": "PLUSDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plusdc.svg" + }, + "0x0ada190c81b814548ddc2f6adc4a689ce7c1fe73": { + "address": "0x0ada190c81b814548ddc2f6adc4a689ce7c1fe73", + "name": "yAxis", + "token": { + "decimals": 18, + "symbol": "YAXIS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yaxis.svg" + }, + "0xb1dc9124c395c1e97773ab855d66e879f053a289": { + "address": "0xb1dc9124c395c1e97773ab855d66e879f053a289", + "name": "yAxis", + "token": { + "decimals": 18, + "symbol": "YAX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yaxis.svg" + }, + "0xef31cb88048416e301fee1ea13e7664b887ba7e8": { + "address": "0xef31cb88048416e301fee1ea13e7664b887ba7e8", + "name": "Staked yAxis", + "token": { + "decimals": 18, + "symbol": "sYAX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yaxis.svg" + }, + "0x75d1aa733920b14fc74c9f6e6fab7ac1ece8482e": { + "address": "0x75d1aa733920b14fc74c9f6e6fab7ac1ece8482e", + "name": "YFLink Staking Share", + "token": { + "decimals": 18, + "symbol": "yYFL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/YFL.svg" + }, + "0x7b760d06e401f85545f3b50c44bf5b05308b7b62": { + "address": "0x7b760d06e401f85545f3b50c44bf5b05308b7b62", + "name": "YFLink USD", + "token": { + "decimals": 18, + "symbol": "YFLUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/YFLUSD.svg" + }, + "0x8282df223ac402d04b2097d16f758af4f70e7db0": { + "address": "0x8282df223ac402d04b2097d16f758af4f70e7db0", + "name": "YFLink Synthetic", + "token": { + "decimals": 18, + "symbol": "sYFL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sYFL.svg" + }, + "0x008377eb0c62ce8e0ba3d7bb4a5638591f21588e": { + "address": "0x008377eb0c62ce8e0ba3d7bb4a5638591f21588e", + "name": "YFLink Bond", + "token": { + "decimals": 18, + "symbol": "bYFL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bYFL.svg" + }, + "0xea8b224edd3e342deb514c4176c2e72bcce6fff9": { + "address": "0xea8b224edd3e342deb514c4176c2e72bcce6fff9", + "name": "rSAI", + "token": { + "decimals": 18, + "symbol": "rSAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rsai.svg" + }, + "0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd": { + "address": "0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd", + "name": "GridPlus", + "token": { + "decimals": 12, + "symbol": "GRID" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/GridPlus.svg" + }, + "0x92a5b04d0ed5d94d7a193d1d334d3d16996f4e13": { + "address": "0x92a5b04d0ed5d94d7a193d1d334d3d16996f4e13", + "name": "Eristica", + "token": { + "decimals": 18, + "symbol": "ERT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Eristica.svg" + }, + "0x5f778ec4b31a506c1dfd8b06f131e9b451a61d39": { + "address": "0x5f778ec4b31a506c1dfd8b06f131e9b451a61d39", + "name": "UPX Token", + "token": { + "decimals": 18, + "symbol": "UPX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/UPX.svg" + }, + "0xb1cd6e4153b2a390cf00a6556b0fc1458c4a5533": { + "address": "0xb1cd6e4153b2a390cf00a6556b0fc1458c4a5533", + "name": "ETHBNT Liquidity Pool", + "token": { + "decimals": 18, + "symbol": "ETHBNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ETHBNT.svg" + }, + "0x16ea01acb4b0bca2000ee5473348b6937ee6f72f": { + "address": "0x16ea01acb4b0bca2000ee5473348b6937ee6f72f", + "name": "Enecuum", + "token": { + "decimals": 10, + "symbol": "ENQ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ENQ-logo.svg" + }, + "0x13cb85823f78cff38f0b0e90d3e975b8cb3aad64": { + "address": "0x13cb85823f78cff38f0b0e90d3e975b8cb3aad64", + "name": "REMIIT REMI Token", + "token": { + "decimals": 18, + "symbol": "REMI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/remi.svg" + }, + "0x93a7174dafd31d13400cd9fa01f4e5b5baa00d39": { + "address": "0x93a7174dafd31d13400cd9fa01f4e5b5baa00d39", + "name": "Shaka", + "token": { + "decimals": 18, + "symbol": "HAK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hak.svg" + }, + "0x4470bb87d77b963a013db939be332f927f2b992e": { + "address": "0x4470bb87d77b963a013db939be332f927f2b992e", + "name": "AdEx Legacy Token", + "token": { + "decimals": 4, + "symbol": "ADXL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/adex.svg" + }, + "0x1966d718a565566e8e202792658d7b5ff4ece469": { + "address": "0x1966d718a565566e8e202792658d7b5ff4ece469", + "name": "nDEX", + "token": { + "decimals": 18, + "symbol": "NDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nDEX.png" + }, + "0x150b0b96933b75ce27af8b92441f8fb683bf9739": { + "address": "0x150b0b96933b75ce27af8b92441f8fb683bf9739", + "name": "Dragonereum Gold", + "token": { + "decimals": 18, + "symbol": "GOLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gold.svg" + }, + "0x82f4ded9cec9b5750fbff5c2185aee35afc16587": { + "address": "0x82f4ded9cec9b5750fbff5c2185aee35afc16587", + "name": "DreamTeam Token", + "token": { + "decimals": 6, + "symbol": "DREAM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dream.svg" + }, + "0x01fa555c97d7958fa6f771f3bbd5ccd508f81e22": { + "address": "0x01fa555c97d7958fa6f771f3bbd5ccd508f81e22", + "name": "Civil Token", + "token": { + "decimals": 18, + "symbol": "CVL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CVL_token.svg" + }, + "0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190": { + "address": "0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190", + "name": "Dether", + "token": { + "decimals": 18, + "symbol": "DTH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dether.svg" + }, + "0x3f17dd476faf0a4855572f0b6ed5115d9bba22ad": { + "address": "0x3f17dd476faf0a4855572f0b6ed5115d9bba22ad", + "name": "Wibson", + "token": { + "decimals": 9, + "symbol": "WIB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wibson-logo.png" + }, + "0x6863be0e7cf7ce860a574760e9020d519a8bdc47": { + "address": "0x6863be0e7cf7ce860a574760e9020d519a8bdc47", + "name": "On.Live", + "token": { + "decimals": 18, + "symbol": "ONL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/onlive.svg" + }, + "0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc": { + "address": "0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc", + "name": "Pareto", + "token": { + "decimals": 18, + "symbol": "PARETO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ParetoLogo.png" + }, + "0x2e91e3e54c5788e9fdd6a181497fdcea1de1bcc1": { + "address": "0x2e91e3e54c5788e9fdd6a181497fdcea1de1bcc1", + "name": "Hercules", + "token": { + "decimals": 18, + "symbol": "HERC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/herc.png" + }, + "0x4d807509aece24c0fa5a102b6a3b059ec6e14392": { + "address": "0x4d807509aece24c0fa5a102b6a3b059ec6e14392", + "name": "Menlo One", + "token": { + "decimals": 18, + "symbol": "ONE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Menlo_One.png" + }, + "0x8d5682941ce456900b12d47ac06a88b47c764ce1": { + "address": "0x8d5682941ce456900b12d47ac06a88b47c764ce1", + "name": "RightMesh Token", + "token": { + "decimals": 18, + "symbol": "RMESH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Rmesh.png" + }, + "0xdde12a12a6f67156e0da672be05c374e1b0a3e57": { + "address": "0xdde12a12a6f67156e0da672be05c374e1b0a3e57", + "name": "JOYSO", + "token": { + "decimals": 6, + "symbol": "JOY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/JOY.png" + }, + "0x0d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4": { + "address": "0x0d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4", + "name": "JET8 Token", + "token": { + "decimals": 8, + "symbol": "J8T" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/J8T.svg" + }, + "0xbc86727e770de68b1060c91f6bb6945c73e10388": { + "address": "0xbc86727e770de68b1060c91f6bb6945c73e10388", + "name": "Ink Protocol", + "token": { + "decimals": 18, + "symbol": "XNK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ink_protocol.svg" + }, + "0xa95592dcffa3c080b4b40e459c5f5692f67db7f8": { + "address": "0xa95592dcffa3c080b4b40e459c5f5692f67db7f8", + "name": "ELY Token", + "token": { + "decimals": 18, + "symbol": "ELY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ely.png" + }, + "0xe1a178b681bd05964d3e3ed33ae731577d9d96dd": { + "address": "0xe1a178b681bd05964d3e3ed33ae731577d9d96dd", + "name": "BOX Token", + "token": { + "decimals": 18, + "symbol": "BOX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/box_token.png" + }, + "0x6aedbf8dff31437220df351950ba2a3362168d1b": { + "address": "0x6aedbf8dff31437220df351950ba2a3362168d1b", + "name": "Dragonglass", + "token": { + "decimals": 8, + "symbol": "DGS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dragonglass.svg" + }, + "0xd8e3fb3b08eba982f2754988d70d57edc0055ae6": { + "address": "0xd8e3fb3b08eba982f2754988d70d57edc0055ae6", + "name": "Zoracles", + "token": { + "decimals": 9, + "symbol": "ZORA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zora.svg" + }, + "0x0f513ffb4926ff82d7f60a05069047aca295c413": { + "address": "0x0f513ffb4926ff82d7f60a05069047aca295c413", + "name": "CrowdstartCoin", + "token": { + "decimals": 18, + "symbol": "XSC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/XSC_Logo.svg" + }, + "0x5bc7e5f0ab8b2e10d2d0a3f21739fce62459aef3": { + "address": "0x5bc7e5f0ab8b2e10d2d0a3f21739fce62459aef3", + "name": "Hut34 Entropy Token", + "token": { + "decimals": 18, + "symbol": "ENTRP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ENTRP.png" + }, + "0x946112efab61c3636cbd52de2e1392d7a75a6f01": { + "address": "0x946112efab61c3636cbd52de2e1392d7a75a6f01", + "name": "HYDRO TOKEN", + "token": { + "decimals": 18, + "symbol": "HYDRO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hydro.svg" + }, + "0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e": { + "address": "0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e", + "name": "Modum Token", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/modum.svg" + }, + "0x000c100050e98c91f9114fa5dd75ce6869bf4f53": { + "address": "0x000c100050e98c91f9114fa5dd75ce6869bf4f53", + "name": "CRYPTO10 Hedged", + "token": { + "decimals": 18, + "symbol": "C10" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/c10.svg" + }, + "0x26e75307fc0c021472feb8f727839531f112f317": { + "address": "0x26e75307fc0c021472feb8f727839531f112f317", + "name": "Crypto20", + "token": { + "decimals": 18, + "symbol": "C20" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/c20.svg" + }, + "0x06012c8cf97bead5deae237070f9587f8e7a266d": { + "address": "0x06012c8cf97bead5deae237070f9587f8e7a266d", + "name": "Crypto Kitties", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ck.svg" + }, + "0x4f4f0db4de903b88f2b1a2847971e231d54f8fd3": { + "address": "0x4f4f0db4de903b88f2b1a2847971e231d54f8fd3", + "name": "Geens Platform Token", + "token": { + "decimals": 8, + "symbol": "GEE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gee-icon.svg" + }, + "0xba2184520a1cc49a6159c57e61e1844e085615b6": { + "address": "0xba2184520a1cc49a6159c57e61e1844e085615b6", + "name": "HelloGold Token", + "token": { + "decimals": 8, + "symbol": "HGT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hgt.png" + }, + "0xba358b6f5b4c0215650444b8c30d870b55050d2d": { + "address": "0xba358b6f5b4c0215650444b8c30d870b55050d2d", + "name": "Hub Token", + "token": { + "decimals": 18, + "symbol": "HUB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hub.svg" + }, + "0xf8e386eda857484f5a12e4b5daa9984e06e73705": { + "address": "0xf8e386eda857484f5a12e4b5daa9984e06e73705", + "name": "Indorse Token", + "token": { + "decimals": 18, + "symbol": "IND" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/indorseLogo.jpg" + }, + "0xa54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970": { + "address": "0xa54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970", + "name": "NEVERDIE Coin", + "token": { + "decimals": 18, + "symbol": "NDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ndc.png" + }, + "0x1c4481750daa5ff521a2a7490d9981ed46465dbd": { + "address": "0x1c4481750daa5ff521a2a7490d9981ed46465dbd", + "name": "BlockMason Credit Protocol Token", + "token": { + "decimals": 18, + "symbol": "BCPT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bcpt.svg" + }, + "0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a": { + "address": "0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a", + "name": "Sapien Network Token", + "token": { + "decimals": 6, + "symbol": "SPN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/spn.svg" + }, + "0x71d01db8d6a2fbea7f8d434599c237980c234e4c": { + "address": "0x71d01db8d6a2fbea7f8d434599c237980c234e4c", + "name": "Gladius", + "token": { + "decimals": 8, + "symbol": "GLA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gladius.svg" + }, + "0xc741f06082aa47f93729070ad0dd95e223bda091": { + "address": "0xc741f06082aa47f93729070ad0dd95e223bda091", + "name": "LEDU Token", + "token": { + "decimals": 8, + "symbol": "LEDU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/edu.svg" + }, + "0x5c543e7ae0a1104f78406c340e9c64fd9fce5170": { + "address": "0x5c543e7ae0a1104f78406c340e9c64fd9fce5170", + "name": "vSlice", + "token": { + "decimals": 18, + "symbol": "VSL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/vslice.png" + }, + "0x1f41e42d0a9e3c0dd3ba15b527342783b43200a9": { + "address": "0x1f41e42d0a9e3c0dd3ba15b527342783b43200a9", + "name": "Blockchain Capital", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bcap.svg" + }, + "0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53": { + "address": "0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53", + "name": "Chronobank TIME", + "token": { + "decimals": 8, + "symbol": "TIME" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/chronobank.png" + }, + "0xf7b098298f7c69fc14610bf71d5e02c60792894c": { + "address": "0xf7b098298f7c69fc14610bf71d5e02c60792894c", + "name": "Guppy", + "token": { + "decimals": 3, + "symbol": "GUP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/guppy.png" + }, + "0xb9e7f8568e08d5659f5d29c4997173d84cdf2607": { + "address": "0xb9e7f8568e08d5659f5d29c4997173d84cdf2607", + "name": "Swarm City Token", + "token": { + "decimals": 18, + "symbol": "SWT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/swt.svg" + }, + "0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b": { + "address": "0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b", + "name": "Trustcoin", + "token": { + "decimals": 6, + "symbol": "TRST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/trst.svg" + }, + "0x960b236a07cf122663c4303350609a66a7b288c0": { + "address": "0x960b236a07cf122663c4303350609a66a7b288c0", + "name": "Aragon Network Token v1", + "token": { + "decimals": 18, + "symbol": "ANTv1" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/antv1.svg" + }, + "0x667088b212ce3d06a1b553a7221e1fd19000d9af": { + "address": "0x667088b212ce3d06a1b553a7221e1fd19000d9af", + "name": "WINGS", + "token": { + "decimals": 18, + "symbol": "WINGS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wings_logo.svg" + }, + "0x16484d73ac08d2355f466d448d2b79d2039f6ebb": { + "address": "0x16484d73ac08d2355f466d448d2b79d2039f6ebb", + "name": "FortKnoxster", + "token": { + "decimals": 18, + "symbol": "FKX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/FortKnoxster.svg" + }, + "0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7": { + "address": "0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7", + "name": "FirstBlood Token", + "token": { + "decimals": 18, + "symbol": "1ST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/1st.svg" + }, + "0x888666ca69e0f178ded6d75b5726cee99a87d698": { + "address": "0x888666ca69e0f178ded6d75b5726cee99a87d698", + "name": "ICONOMI", + "token": { + "decimals": 18, + "symbol": "ICN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/iconomi.png" + }, + "0x4d8fc1453a0f359e99c9675954e656d80d996fbf": { + "address": "0x4d8fc1453a0f359e99c9675954e656d80d996fbf", + "name": "BEE Token", + "token": { + "decimals": 18, + "symbol": "BEE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bee_token.svg" + }, + "0xb0866289e870d2efc282406cf4123df6e5bcb652": { + "address": "0xb0866289e870d2efc282406cf4123df6e5bcb652", + "name": "NoFakeCoin", + "token": { + "decimals": 18, + "symbol": "NFC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nfticon.png" + }, + "0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2": { + "address": "0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2", + "name": "renZEC", + "token": { + "decimals": 8, + "symbol": "renZEC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/renZEC.svg" + }, + "0x459086f2376525bdceba5bdda135e4e9d3fef5bf": { + "address": "0x459086f2376525bdceba5bdda135e4e9d3fef5bf", + "name": "renBCH", + "token": { + "decimals": 8, + "symbol": "renBCH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/renBCH.svg" + }, + "0xd5147bc8e386d91cc5dbe72099dac6c9b99276f5": { + "address": "0xd5147bc8e386d91cc5dbe72099dac6c9b99276f5", + "name": "renFIL", + "token": { + "decimals": 18, + "symbol": "renFIL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/renFIL.svg" + }, + "0xa74476443119a942de498590fe1f2454d7d4ac0d": { + "address": "0xa74476443119a942de498590fe1f2454d7d4ac0d", + "name": "Golem Network Token", + "token": { + "decimals": 18, + "symbol": "GNT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/golem.svg" + }, + "0x6888a16ea9792c15a4dcf2f6c623d055c8ede792": { + "address": "0x6888a16ea9792c15a4dcf2f6c623d055c8ede792", + "name": "Spectiv Signal Token", + "token": { + "decimals": 18, + "symbol": "SIG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/spectiv.svg" + }, + "0x9a642d6b3368ddc662ca244badf32cda716005bc": { + "address": "0x9a642d6b3368ddc662ca244badf32cda716005bc", + "name": "Qtum", + "token": { + "decimals": 18, + "symbol": "QTUM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/qtum.svg" + }, + "0x1d462414fe14cf489c7a21cac78509f4bf8cd7c0": { + "address": "0x1d462414fe14cf489c7a21cac78509f4bf8cd7c0", + "name": "CanYaCoin", + "token": { + "decimals": 6, + "symbol": "CAN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CanYa.svg" + }, + "0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244": { + "address": "0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244", + "name": "Rivetz", + "token": { + "decimals": 18, + "symbol": "RVT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rivetz.png" + }, + "0x056017c55ae7ae32d12aef7c679df83a85ca75ff": { + "address": "0x056017c55ae7ae32d12aef7c679df83a85ca75ff", + "name": "Project Wyvern Token", + "token": { + "decimals": 18, + "symbol": "WYV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wyvern-logo.svg" + }, + "0xfec0cf7fe078a500abf15f1284958f22049c2c7e": { + "address": "0xfec0cf7fe078a500abf15f1284958f22049c2c7e", + "name": "Maecenas ART Token", + "token": { + "decimals": 18, + "symbol": "ART" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/art.svg" + }, + "0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27": { + "address": "0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27", + "name": "Zilliqa", + "token": { + "decimals": 12, + "symbol": "ZIL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zilliqa.svg" + }, + "0xf03f8d65bafa598611c3495124093c56e8f638f0": { + "address": "0xf03f8d65bafa598611c3495124093c56e8f638f0", + "name": "Viewly", + "token": { + "decimals": 18, + "symbol": "VIEW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/viewly.svg" + }, + "0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9": { + "address": "0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9", + "name": "Compound Tether", + "token": { + "decimals": 8, + "symbol": "cUSDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ctoken-usdt.svg" + }, + "0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265": { + "address": "0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265", + "name": "NANJCOIN", + "token": { + "decimals": 8, + "symbol": "NANJ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/nanjcoin.svg" + }, + "0x6b01c3170ae1efebee1a3159172cb3f7a5ecf9e5": { + "address": "0x6b01c3170ae1efebee1a3159172cb3f7a5ecf9e5", + "name": "BOOTY", + "token": { + "decimals": 18, + "symbol": "BOOTY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/booty.png" + }, + "0x4a6058666cf1057eac3cd3a5a614620547559fc9": { + "address": "0x4a6058666cf1057eac3cd3a5a614620547559fc9", + "name": "Brickblock", + "token": { + "decimals": 18, + "symbol": "BBK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Brickblock.svg" + }, + "0x48ff53777f747cfb694101222a944de070c15d36": { + "address": "0x48ff53777f747cfb694101222a944de070c15d36", + "name": "Ether Kingdoms Token", + "token": { + "decimals": 7, + "symbol": "IMP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/IMP.svg" + }, + "0x02f61fd266da6e8b102d4121f5ce7b992640cf98": { + "address": "0x02f61fd266da6e8b102d4121f5ce7b992640cf98", + "name": "LikeCoin", + "token": { + "decimals": 18, + "symbol": "LIKE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/like.svg" + }, + "0xd850942ef8811f2a866692a623011bde52a462c1": { + "address": "0xd850942ef8811f2a866692a623011bde52a462c1", + "name": "VeChain", + "token": { + "decimals": 18, + "symbol": "VEN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ven.svg" + }, + "0xfa1a856cfa3409cfa145fa4e20eb270df3eb21ab": { + "address": "0xfa1a856cfa3409cfa145fa4e20eb270df3eb21ab", + "name": "IOST", + "token": { + "decimals": 18, + "symbol": "IOST" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/iost.png" + }, + "0x039b5649a59967e3e936d7471f9c3700100ee1ab": { + "address": "0x039b5649a59967e3e936d7471f9c3700100ee1ab", + "name": "Kucoin Shares", + "token": { + "decimals": 6, + "symbol": "KCS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kucoin.svg" + }, + "0xca2796f9f61dc7b238aab043971e49c6164df375": { + "address": "0xca2796f9f61dc7b238aab043971e49c6164df375", + "name": "YGGDRASH YEED Token", + "token": { + "decimals": 18, + "symbol": "YEED" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/yggdrash.svg" + }, + "0x03e3f0c25965f13dbbc58246738c183e27b26a56": { + "address": "0x03e3f0c25965f13dbbc58246738c183e27b26a56", + "name": "Disciplina Token", + "token": { + "decimals": 18, + "symbol": "DSCP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/disciplina.svg" + }, + "0xe814aee960a85208c3db542c53e7d4a6c8d5f60f": { + "address": "0xe814aee960a85208c3db542c53e7d4a6c8d5f60f", + "name": "Chronologic DAY Token", + "token": { + "decimals": 18, + "symbol": "DAY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DAY.png" + }, + "0x7e43581b19ab509bcf9397a2efd1ab10233f27de": { + "address": "0x7e43581b19ab509bcf9397a2efd1ab10233f27de", + "name": "PLATINUM", + "token": { + "decimals": 18, + "symbol": "PLAT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/plat.png" + }, + "0x00000000441378008ea67f4284a57932b1c000a5": { + "address": "0x00000000441378008ea67f4284a57932b1c000a5", + "name": "TrueGBP", + "token": { + "decimals": 18, + "symbol": "TGBP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TGBP.svg" + }, + "0x00006100f7090010005f1bd7ae6122c3c2cf0090": { + "address": "0x00006100f7090010005f1bd7ae6122c3c2cf0090", + "name": "TrueAUD", + "token": { + "decimals": 18, + "symbol": "TAUD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TAUD.svg" + }, + "0x00000100f2a2bd000715001920eb70d229700085": { + "address": "0x00000100f2a2bd000715001920eb70d229700085", + "name": "TrueCAD", + "token": { + "decimals": 18, + "symbol": "TCAD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TCAD.svg" + }, + "0x0000852600ceb001e08e00bc008be620d60031f2": { + "address": "0x0000852600ceb001e08e00bc008be620d60031f2", + "name": "TrueHKD", + "token": { + "decimals": 18, + "symbol": "THKD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/THKD.svg" + }, + "0x23ccc43365d9dd3882eab88f43d515208f832430": { + "address": "0x23ccc43365d9dd3882eab88f43d515208f832430", + "name": "MidasProtocol", + "token": { + "decimals": 18, + "symbol": "MAS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MAS.png" + }, + "0xc16b542ff490e01fcc0dc58a60e1efdc3e357ca6": { + "address": "0xc16b542ff490e01fcc0dc58a60e1efdc3e357ca6", + "name": "ICE ROCK MINING", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rock2.png" + }, + "0x6758b7d441a9739b98552b373703d8d3d14f9e62": { + "address": "0x6758b7d441a9739b98552b373703d8d3d14f9e62", + "name": "POA20 Token", + "token": { + "decimals": 18, + "symbol": "POA20" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/POA20.png" + }, + "0xfef4185594457050cc9c23980d301908fe057bb1": { + "address": "0xfef4185594457050cc9c23980d301908fe057bb1", + "name": "VIDT Datalink", + "token": { + "decimals": 18, + "symbol": "VIDT-OLD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/VIDT.svg" + }, + "0x7064aab39a0fcf7221c3396719d0917a65e35515": { + "address": "0x7064aab39a0fcf7221c3396719d0917a65e35515", + "name": "Cpollo", + "token": { + "decimals": 18, + "symbol": "CPLO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Cpollo.svg" + }, + "0xd8446236fa95b9b5f9fd0f8e7df1a944823c683d": { + "address": "0xd8446236fa95b9b5f9fd0f8e7df1a944823c683d", + "name": "NEEO", + "token": { + "decimals": 18, + "symbol": "NEEO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/neeo.png" + }, + "0xa823e6722006afe99e91c30ff5295052fe6b8e32": { + "address": "0xa823e6722006afe99e91c30ff5295052fe6b8e32", + "name": "Neumark", + "token": { + "decimals": 18, + "symbol": "NEU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/neu.svg" + }, + "0xf70a642bd387f94380ffb90451c2c81d4eb82cbc": { + "address": "0xf70a642bd387f94380ffb90451c2c81d4eb82cbc", + "name": "STAR", + "token": { + "decimals": 18, + "symbol": "STAR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/starbase.png" + }, + "0x39bb259f66e1c59d5abef88375979b4d20d98022": { + "address": "0x39bb259f66e1c59d5abef88375979b4d20d98022", + "name": "WAX Token", + "token": { + "decimals": 8, + "symbol": "WAX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/wax.svg" + }, + "0xfbeef911dc5821886e1dda71586d90ed28174b7d": { + "address": "0xfbeef911dc5821886e1dda71586d90ed28174b7d", + "name": "KnownOrigin", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/knownorigin.svg" + }, + "0x0c4576ca1c365868e162554af8e385dc3e7c66d9": { + "address": "0x0c4576ca1c365868e162554af8e385dc3e7c66d9", + "name": "Vote Escrowed Origin DeFi Governance", + "token": { + "decimals": 18, + "symbol": "veOGV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/veogv.svg" + }, + "0x2aea4add166ebf38b63d09a75de1a7b94aa24163": { + "address": "0x2aea4add166ebf38b63d09a75de1a7b94aa24163", + "name": "Kudos", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kudos.svg" + }, + "0x14c926f2290044b647e1bf2072e67b495eff1905": { + "address": "0x14c926f2290044b647e1bf2072e67b495eff1905", + "name": "Bethereum", + "token": { + "decimals": 18, + "symbol": "BETHER" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bether.jpg" + }, + "0xfef3884b603c33ef8ed4183346e093a173c94da6": { + "address": "0xfef3884b603c33ef8ed4183346e093a173c94da6", + "name": "Metamorph", + "token": { + "decimals": 18, + "symbol": "METM" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/metamorph.svg" + }, + "0xbb1f24c0c1554b9990222f036b0aad6ee4caec29": { + "address": "0xbb1f24c0c1554b9990222f036b0aad6ee4caec29", + "name": "CryptoSoul", + "token": { + "decimals": 18, + "symbol": "SOUL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SOUL.svg" + }, + "0xff0e5e014cf97e0615cb50f6f39da6388e2fae6e": { + "address": "0xff0e5e014cf97e0615cb50f6f39da6388e2fae6e", + "name": "Origo", + "token": { + "decimals": 18, + "symbol": "OGO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/origo.svg" + }, + "0x0cb8d0b37c7487b11d57f1f33defa2b1d3cfccfe": { + "address": "0x0cb8d0b37c7487b11d57f1f33defa2b1d3cfccfe", + "name": "DANKToken", + "token": { + "decimals": 18, + "symbol": "DANK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/dank-logo.svg" + }, + "0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f": { + "address": "0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f", + "name": "Su Squares", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Su-Squares.svg" + }, + "0xc8cac7672f4669685817cf332a33eb249f085475": { + "address": "0xc8cac7672f4669685817cf332a33eb249f085475", + "name": "LivenCoin", + "token": { + "decimals": 18, + "symbol": "LVN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/LVN.svg" + }, + "0x679131f591b4f369acb8cd8c51e68596806c3916": { + "address": "0x679131f591b4f369acb8cd8c51e68596806c3916", + "name": "Trustlines Network Token", + "token": { + "decimals": 18, + "symbol": "TLN" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/TLN128.png" + }, + "0x2e6539edc3b76f1e21b71d214527faba875f70f3": { + "address": "0x2e6539edc3b76f1e21b71d214527faba875f70f3", + "name": "Yearn Finance Dot", + "token": { + "decimals": 18, + "symbol": "YFDOT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/YFDOT.svg" + }, + "0xe48972fcd82a274411c01834e2f031d4377fa2c0": { + "address": "0xe48972fcd82a274411c01834e2f031d4377fa2c0", + "name": "TwoKeyEconomy", + "token": { + "decimals": 18, + "symbol": "2KEY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/2key.svg" + }, + "0xc7e43a1c8e118aa2965f5eabe0e718d83db7a63c": { + "address": "0xc7e43a1c8e118aa2965f5eabe0e718d83db7a63c", + "name": "ZCore Token", + "token": { + "decimals": 18, + "symbol": "ZCRT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/zcrt.svg" + }, + "0x2ecb13a8c458c379c4d9a7259e202de03c8f3d19": { + "address": "0x2ecb13a8c458c379c4d9a7259e202de03c8f3d19", + "name": "Block-Chain.com Token", + "token": { + "decimals": 18, + "symbol": "BC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/block-chain.svg" + }, + "0x7d85e23014f84e6e21d5663acd8751bef3562352": { + "address": "0x7d85e23014f84e6e21d5663acd8751bef3562352", + "name": "Axion Old", + "token": { + "decimals": 18, + "symbol": "AXNv1" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/obsolete.svg" + }, + "0x4612021c75809160be60db21fbc9d6add0b32def": { + "address": "0x4612021c75809160be60db21fbc9d6add0b32def", + "name": "BCP Coin", + "token": { + "decimals": 18, + "symbol": "BCP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BCP.svg" + }, + "0xe9e73e1ae76d17a16cc53e3e87a9a7da78834d37": { + "address": "0xe9e73e1ae76d17a16cc53e3e87a9a7da78834d37", + "name": "Camp", + "token": { + "decimals": 18, + "symbol": "CAMP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/Camp.svg" + }, + "0xeb269732ab75a6fd61ea60b06fe994cd32a83549": { + "address": "0xeb269732ab75a6fd61ea60b06fe994cd32a83549", + "name": "dForce USDx", + "token": { + "decimals": 18, + "symbol": "USDx" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/USDx.svg" + }, + "0x0bead9a1bcc1b84d06e3f2df67e3549fd55ab054": { + "address": "0x0bead9a1bcc1b84d06e3f2df67e3549fd55ab054", + "name": "EURxb", + "token": { + "decimals": 18, + "symbol": "EURxb" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eurxb.svg" + }, + "0xeb58343b36c7528f23caae63a150240241310049": { + "address": "0xeb58343b36c7528f23caae63a150240241310049", + "name": "NBU", + "token": { + "decimals": 18, + "symbol": "NBU" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/NBU.svg" + }, + "0x75739d5944534115d7c54ee8c73f186d793bae02": { + "address": "0x75739d5944534115d7c54ee8c73f186d793bae02", + "name": "Collective", + "token": { + "decimals": 18, + "symbol": "CO2" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CO2.svg" + }, + "0x9b99cca871be05119b2012fd4474731dd653febe": { + "address": "0x9b99cca871be05119b2012fd4474731dd653febe", + "name": "Antimatter", + "token": { + "decimals": 18, + "symbol": "MATTER" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/antimatter.svg" + }, + "0x6e1a19f235be7ed8e3369ef73b196c07257494de": { + "address": "0x6e1a19f235be7ed8e3369ef73b196c07257494de", + "name": "Wrapped Filecoin", + "token": { + "decimals": 18, + "symbol": "WFIL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WFIL.svg" + }, + "0x4a64515e5e1d1073e83f30cb97bed20400b66e10": { + "address": "0x4a64515e5e1d1073e83f30cb97bed20400b66e10", + "name": "Wrapped ZEC", + "token": { + "decimals": 18, + "symbol": "WZEC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WZEC.svg" + }, + "0xa3865e64121537b5b59b5e239db4acbe6f36aa74": { + "address": "0xa3865e64121537b5b59b5e239db4acbe6f36aa74", + "name": "Wrapped Tezos", + "token": { + "decimals": 18, + "symbol": "WXTZ" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WXTZ.svg" + }, + "0x53c4871322bb47e7a24136fce291a6dcc832a294": { + "address": "0x53c4871322bb47e7a24136fce291a6dcc832a294", + "name": "Wrapped Litecoin", + "token": { + "decimals": 18, + "symbol": "WLTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WLTC.svg" + }, + "0xad3e3fc59dff318beceaab7d00eb4f68b1ecf195": { + "address": "0xad3e3fc59dff318beceaab7d00eb4f68b1ecf195", + "name": "Wrapped Celo USD", + "token": { + "decimals": 18, + "symbol": "wCUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WCUSD.svg" + }, + "0x85d7bdfc9c3426b33a684241eeee70385bc42820": { + "address": "0x85d7bdfc9c3426b33a684241eeee70385bc42820", + "name": "Wrapped Kadena", + "token": { + "decimals": 18, + "symbol": "WKDA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WKDA.svg" + }, + "0xcc665390b03c5d324d8faf81c15ecee29a73bcb4": { + "address": "0xcc665390b03c5d324d8faf81c15ecee29a73bcb4", + "name": "ChainSwap.com Governance Token", + "token": { + "decimals": 18, + "symbol": "ASAP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/chainswap.svg" + }, + "0x182f4c4c97cd1c24e1df8fc4c053e5c47bf53bef": { + "address": "0x182f4c4c97cd1c24e1df8fc4c053e5c47bf53bef", + "name": "keyTango Token", + "token": { + "decimals": 18, + "symbol": "TANGO" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/keyTango.svg" + }, + "0xe4cc5a22b39ffb0a56d67f94f9300db20d786a5f": { + "address": "0xe4cc5a22b39ffb0a56d67f94f9300db20d786a5f", + "name": "unFederal eRSDL", + "token": { + "decimals": 8, + "symbol": "uneRSDL" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/uneRSDL.svg" + }, + "0x2dba05b51ef5a7de3e7c3327201ca2f8a25c2414": { + "address": "0x2dba05b51ef5a7de3e7c3327201ca2f8a25c2414", + "name": "unFederal DAI", + "token": { + "decimals": 8, + "symbol": "unDAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unDAI.svg" + }, + "0xfacece87e14b50eafc85c44c01702f5f485ca460": { + "address": "0xfacece87e14b50eafc85c44c01702f5f485ca460", + "name": "unFederal ETH", + "token": { + "decimals": 8, + "symbol": "unETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unETH.svg" + }, + "0x6b576972de33bebde3a703bff52a091e79f8c87a": { + "address": "0x6b576972de33bebde3a703bff52a091e79f8c87a", + "name": "unFederal USDC", + "token": { + "decimals": 8, + "symbol": "unUSDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unUSDC.svg" + }, + "0x6e2aa5bb90ac37d9006685afc651ef067e1c7b44": { + "address": "0x6e2aa5bb90ac37d9006685afc651ef067e1c7b44", + "name": "unFederal USDT", + "token": { + "decimals": 8, + "symbol": "unUSDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unUSDT.svg" + }, + "0x5d446fc8dbd10ebacfe9a427ab5402586af98cd4": { + "address": "0x5d446fc8dbd10ebacfe9a427ab5402586af98cd4", + "name": "unFederal WBTC", + "token": { + "decimals": 8, + "symbol": "unWBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unWBTC.svg" + }, + "0xd837eca6c91c67d98461a411ba2f00bda9960a9d": { + "address": "0xd837eca6c91c67d98461a411ba2f00bda9960a9d", + "name": "unFederal AAVE", + "token": { + "decimals": 8, + "symbol": "unAAVE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unAAVE.svg" + }, + "0x9e29ce9cd25f4141df6bb85b27ef6933a16a5824": { + "address": "0x9e29ce9cd25f4141df6bb85b27ef6933a16a5824", + "name": "unFederal YFI", + "token": { + "decimals": 8, + "symbol": "unYFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unYFI.svg" + }, + "0x031002d15b0d0cd7c9129d6f644446368deae391": { + "address": "0x031002d15b0d0cd7c9129d6f644446368deae391", + "name": "unFederal LINK", + "token": { + "decimals": 8, + "symbol": "unLINK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/unLINK.svg" + }, + "0xb8e2e2101ed11e9138803cd3e06e16dd19910647": { + "address": "0xb8e2e2101ed11e9138803cd3e06e16dd19910647", + "name": "ArdCoin", + "token": { + "decimals": 2, + "symbol": "ARDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ardcoin.svg" + }, + "0x50f5474724e0ee42d9a4e711ccfb275809fd6d4a": { + "address": "0x50f5474724e0ee42d9a4e711ccfb275809fd6d4a", + "name": "Sandbox's LANDs", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/SAND.svg" + }, + "0x46576e20ec5f25586a6fa2e0d6b6058354b72e72": { + "address": "0x46576e20ec5f25586a6fa2e0d6b6058354b72e72", + "name": "Cryptomind", + "token": { + "decimals": 8, + "symbol": "CR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/CR.svg" + }, + "0x5ab21ec0bfa0b29545230395e3adaca7d552c948": { + "address": "0x5ab21ec0bfa0b29545230395e3adaca7d552c948", + "name": "PUNKS Comic", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/punks-comic.svg" + }, + "0xb72b31907c1c95f3650b64b2469e08edacee5e8f": { + "address": "0xb72b31907c1c95f3650b64b2469e08edacee5e8f", + "name": "bZx Vesting Token (vBZRX)", + "token": { + "decimals": 18, + "symbol": "vBZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_vbzrx.svg" + }, + "0xb983e01458529665007ff7e0cddecdb74b967eb6": { + "address": "0xb983e01458529665007ff7e0cddecdb74b967eb6", + "name": "Fulcrum ETH iToken (iETH)", + "token": { + "decimals": 18, + "symbol": "iETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_ieth.svg" + }, + "0x32e4c68b3a4a813b710595aeba7f6b7604ab9c15": { + "address": "0x32e4c68b3a4a813b710595aeba7f6b7604ab9c15", + "name": "Fulcrum USDC iToken (iUSDC)", + "token": { + "decimals": 6, + "symbol": "iUSDC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iusdc.svg" + }, + "0x2ffa85f655752fb2acb210287c60b9ef335f5b6e": { + "address": "0x2ffa85f655752fb2acb210287c60b9ef335f5b6e", + "name": "Fulcrum WBTC iToken (iWBTC)", + "token": { + "decimals": 8, + "symbol": "iWBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_ibtc.svg" + }, + "0x687642347a9282be8fd809d8309910a3f984ac5a": { + "address": "0x687642347a9282be8fd809d8309910a3f984ac5a", + "name": "Fulcrum KNC iToken (iKNC)", + "token": { + "decimals": 18, + "symbol": "iKNC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iknc.svg" + }, + "0x463538705e7d22aa7f03ebf8ab09b067e1001b54": { + "address": "0x463538705e7d22aa7f03ebf8ab09b067e1001b54", + "name": "Fulcrum LINK iToken (iLINK)", + "token": { + "decimals": 18, + "symbol": "iLINK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_ilink.svg" + }, + "0x6b093998d36f2c7f0cc359441fbb24cc629d5ff0": { + "address": "0x6b093998d36f2c7f0cc359441fbb24cc629d5ff0", + "name": "Fulcrum DAI iToken (iDAI)", + "token": { + "decimals": 18, + "symbol": "iDAI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_idai.svg" + }, + "0x7e9997a38a439b2be7ed9c9c4628391d3e055d48": { + "address": "0x7e9997a38a439b2be7ed9c9c4628391d3e055d48", + "name": "Fulcrum USDT iToken (iUSDT)", + "token": { + "decimals": 6, + "symbol": "iUSDT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iusdt.svg" + }, + "0x9189c499727f88f8ecc7dc4eea22c828e6aac015": { + "address": "0x9189c499727f88f8ecc7dc4eea22c828e6aac015", + "name": "Fulcrum MKR iToken (iMKR)", + "token": { + "decimals": 18, + "symbol": "iMKR" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_imkr.svg" + }, + "0x18240bd9c07fa6156ce3f3f61921cc82b2619157": { + "address": "0x18240bd9c07fa6156ce3f3f61921cc82b2619157", + "name": "Fulcrum BZRX iToken (iBZRX)", + "token": { + "decimals": 18, + "symbol": "iBZRX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_ibzrx.svg" + }, + "0x7f3fe9d492a9a60aebb06d82cba23c6f32cad10b": { + "address": "0x7f3fe9d492a9a60aebb06d82cba23c6f32cad10b", + "name": "Fulcrum YFI iToken (iYFI)", + "token": { + "decimals": 18, + "symbol": "iYFI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iyfi.svg" + }, + "0x0a625fcec657053fe2d9fffdeb1dbb4e412cf8a8": { + "address": "0x0a625fcec657053fe2d9fffdeb1dbb4e412cf8a8", + "name": "Fulcrum UNI iToken (iUNI)", + "token": { + "decimals": 18, + "symbol": "iUNI" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iuni.svg" + }, + "0x0cae8d91e0b1b7bd00d906e990c3625b2c220db1": { + "address": "0x0cae8d91e0b1b7bd00d906e990c3625b2c220db1", + "name": "Fulcrum AAVE iToken (iAAVE)", + "token": { + "decimals": 18, + "symbol": "iAAVE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_iaave.svg" + }, + "0x3da0e01472dee3746b4d324a65d7edfaeca9aa4f": { + "address": "0x3da0e01472dee3746b4d324a65d7edfaeca9aa4f", + "name": "Fulcrum LRC iToken (iLRC)", + "token": { + "decimals": 18, + "symbol": "iLRC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_ilrc.svg" + }, + "0x6d29903bc2c4318b59b35d97ab98ab9ec08ed70d": { + "address": "0x6d29903bc2c4318b59b35d97ab98ab9ec08ed70d", + "name": "Fulcrum COMP iToken (iCOMP)", + "token": { + "decimals": 18, + "symbol": "iCOMP" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ic_token_icomp.svg" + }, + "0xb16e967ff83de3f1e9fceafbc2c28c1c5c56ef91": { + "address": "0xb16e967ff83de3f1e9fceafbc2c28c1c5c56ef91", + "name": "Polkadog", + "token": { + "decimals": 18, + "symbol": "PDOG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/polkadog.svg" + }, + "0x07c52c2537d84e532a9f15d32e152c8b94d2b232": { + "address": "0x07c52c2537d84e532a9f15d32e152c8b94d2b232", + "name": "ZkTube", + "token": { + "decimals": 18, + "symbol": "ZKT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ZKT.svg" + }, + "0x87c22615435998d69aca34889d03155b694a94fc": { + "address": "0x87c22615435998d69aca34889d03155b694a94fc", + "name": "DiemLibre", + "token": { + "decimals": 18, + "symbol": "DLB" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/DLB.svg" + }, + "0x9d38f670d15c14716be1f109a4f453e966a2b6d4": { + "address": "0x9d38f670d15c14716be1f109a4f453e966a2b6d4", + "name": "Quid Ika", + "token": { + "decimals": 9, + "symbol": "QUID" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/QuidIka.svg" + }, + "0xd3c625f54dec647db8780dbbe0e880ef21ba4329": { + "address": "0xd3c625f54dec647db8780dbbe0e880ef21ba4329", + "name": "HollaEx Token", + "token": { + "decimals": 18, + "symbol": "XHT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/xht.svg" + }, + "0x01e0e2e61f554ecaaec0cc933e739ad90f24a86d": { + "address": "0x01e0e2e61f554ecaaec0cc933e739ad90f24a86d", + "name": "GTON", + "token": { + "decimals": 18, + "symbol": "GTON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/gton.svg" + }, + "0xeff66b4a84c8a6b69b99eb1c5e39af8fc35d13db": { + "address": "0xeff66b4a84c8a6b69b99eb1c5e39af8fc35d13db", + "name": "sGTON", + "token": { + "decimals": 18, + "symbol": "sGTON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sgton.svg" + }, + "0xb8919522331c59f5c16bdfaa6a121a6e03a91f62": { + "address": "0xb8919522331c59f5c16bdfaa6a121a6e03a91f62", + "name": "Home", + "token": { + "decimals": 6, + "symbol": "HOME" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/home.svg" + }, + "0xa54d2ebfd977ad836203c85f18db2f0a0cf88854": { + "address": "0xa54d2ebfd977ad836203c85f18db2f0a0cf88854", + "name": "Bacon", + "token": { + "decimals": 18, + "symbol": "BACON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/bacon.svg" + }, + "0x317eb4ad9cfac6232f0046831322e895507bcbeb": { + "address": "0x317eb4ad9cfac6232f0046831322e895507bcbeb", + "name": "Tidex Token", + "token": { + "decimals": 18, + "symbol": "TDX" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/tidex.svg" + }, + "0x65514b352d1d4a17de97f95c7fab177c625bd6ff": { + "address": "0x65514b352d1d4a17de97f95c7fab177c625bd6ff", + "name": "KIBBLE Token", + "token": { + "decimals": 18, + "symbol": "KBLE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/kibble.svg" + }, + "0x6aa030a9710cad6e719a4ec0a85260eb3f4f86c1": { + "address": "0x6aa030a9710cad6e719a4ec0a85260eb3f4f86c1", + "name": "Real World Asset", + "token": { + "decimals": 18, + "symbol": "RWA" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/rwa.svg" + }, + "0x06325440d014e39736583c165c2963ba99faf14e": { + "address": "0x06325440d014e39736583c165c2963ba99faf14e", + "name": "Curve.fi", + "token": { + "decimals": 18, + "symbol": "steCRV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/steCRV.png" + }, + "0x09db87a538bd693e9d08544577d5ccfaa6373a48": { + "address": "0x09db87a538bd693e9d08544577d5ccfaa6373a48", + "name": "YieldNest Restaked ETH", + "token": { + "decimals": 18, + "symbol": "ynETH" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/ynETH.svg" + }, + "0xe8fc52b1bb3a40fd8889c0f8f75879676310ddf0": { + "address": "0xe8fc52b1bb3a40fd8889c0f8f75879676310ddf0", + "name": "Mystiko Token", + "token": { + "decimals": 18, + "symbol": "XZK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/XZK.svg" + }, + "0x16affa80c65fd7003d40b24edb96f77b38ddc96a": { + "address": "0x16affa80c65fd7003d40b24edb96f77b38ddc96a", + "name": "Mystiko Vote Token", + "token": { + "decimals": 18, + "symbol": "vXZK" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/vXZK.svg" + }, + "0xf5e11df1ebcf78b6b6d26e04ff19cd786a1e81dc": { + "address": "0xf5e11df1ebcf78b6b6d26e04ff19cd786a1e81dc", + "name": "BounceBit BTC", + "token": { + "decimals": 18, + "symbol": "BBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BBTC.svg" + }, + "0x77776b40c3d75cb07ce54dea4b2fd1d07f865222": { + "address": "0x77776b40c3d75cb07ce54dea4b2fd1d07f865222", + "name": "BounceBit USD", + "token": { + "decimals": 18, + "symbol": "BBUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BBUSD.svg" + }, + "0x764a726d9ced0433a8d7643335919deb03a9a935": { + "address": "0x764a726d9ced0433a8d7643335919deb03a9a935", + "name": "Pocket Network", + "token": { + "decimals": 6, + "symbol": "POKT" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/POKT.svg" + }, + "0xc4a11aaf6ea915ed7ac194161d2fc9384f15bff2": { + "address": "0xc4a11aaf6ea915ed7ac194161d2fc9384f15bff2", + "name": "Wrapped TON", + "token": { + "decimals": 27, + "symbol": "WTON" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/WTON.svg" + }, + "0xc11158c5da9db1d553ed28f0c2ba1cbedd42cfcb": { + "address": "0xc11158c5da9db1d553ed28f0c2ba1cbedd42cfcb", + "name": "Wrapped PAW", + "token": { + "decimals": 18, + "symbol": "wPAW" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/PAW.svg" + }, + "0x15700b564ca08d9439c58ca5053166e8317aa138": { + "address": "0x15700b564ca08d9439c58ca5053166e8317aa138", + "name": "Elixir deUSD", + "token": { + "decimals": 18, + "symbol": "deUSD" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/deUSD.svg" + }, + "0x6e79b51959cf968d87826592f46f819f92466615": { + "address": "0x6e79b51959cf968d87826592f46f819f92466615", + "name": "Hoppy", + "token": { + "decimals": 9, + "symbol": "HOPPY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/hoppy.svg" + }, + "0xce0042b868300000d44a59004da54a005ffdcf9f": { + "address": "0xce0042b868300000d44a59004da54a005ffdcf9f", + "name": "Contract Factory", + "isSC": {} + }, + "0x4116f14b6d462b32a1c10f98049e4b1765e34fa9": { + "address": "0x4116f14b6d462b32a1c10f98049e4b1765e34fa9", + "name": "Dotmoovs", + "token": { + "decimals": 18, + "symbol": "MOOV" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/MOOV.svg" + }, + "0x657e8c867d8b37dcc18fa4caead9c45eb088c642": { + "address": "0x657e8c867d8b37dcc18fa4caead9c45eb088c642", + "name": "ether.fi Staked BTC", + "token": { + "decimals": 8, + "symbol": "eBTC" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/eBTC.svg" + }, + "0xdc035d45d973e3ec169d2276ddab16f1e407384f": { + "address": "0xdc035d45d973e3ec169d2276ddab16f1e407384f", + "name": "Sky Dollar", + "token": { + "decimals": 18, + "symbol": "USDS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/usds-logo.svg" + }, + "0x56072c95faa701256059aa122697b133aded9279": { + "address": "0x56072c95faa701256059aa122697b133aded9279", + "name": "Sky Ecosystem", + "token": { + "decimals": 18, + "symbol": "SKY" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/sky-logo.svg" + }, + "0xa3931d71877c0e7a3148cb7eb4463524fec27fbd": { + "address": "0xa3931d71877c0e7a3148cb7eb4463524fec27fbd", + "name": "Savings USDS", + "token": { + "decimals": 18, + "symbol": "sUSDS" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/susds-logo.svg" + }, + "0x808688c820ab080a6ff1019f03e5ec227d9b522b": { + "address": "0x808688c820ab080a6ff1019f03e5ec227d9b522b", + "name": "BAG", + "token": { + "decimals": 18, + "symbol": "BAG" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/c5b611324607d87a5fc3315094087962acd45e09/images/BAG.svg" + }, + "0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8": { + "name": "Uniswap Router", + "address": "0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8", + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/uni.svg" + }, + "0xcf3045a03f83adfbcba1f19cb2cf4e19075f8668": { + "name": "Aave Wrapped Token gateway", + "address": "0xcf3045a03f83adfbcba1f19cb2cf4e19075f8668", + "token": { + "decimals": 18, + "symbol": "AAVE" + }, + "isSC": {}, + "logo": "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/AAVE.svg" + } + } +} diff --git a/dist/src/consts/intervals.d.ts b/dist/src/consts/intervals.d.ts new file mode 100644 index 000000000..29d9d5f15 --- /dev/null +++ b/dist/src/consts/intervals.d.ts @@ -0,0 +1,9 @@ +export declare const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000; +export declare const ACTIVITY_REFRESH_INTERVAL = 5000; +export declare const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000; +export declare const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000; +export declare const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000; +export declare const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000; +export declare const ACCOUNT_STATE_PENDING_INTERVAL = 8000; +export declare const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000; +//# sourceMappingURL=intervals.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/intervals.d.ts.map b/dist/src/consts/intervals.d.ts.map new file mode 100644 index 000000000..be2afc60c --- /dev/null +++ b/dist/src/consts/intervals.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"intervals.d.ts","sourceRoot":"","sources":["../../../src/consts/intervals.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qCAAqC,QAAQ,CAAA;AAC1D,eAAO,MAAM,yBAAyB,OAAO,CAAA;AAC7C,eAAO,MAAM,+CAA+C,SAAS,CAAA;AACrE,eAAO,MAAM,gDAAgD,SAAS,CAAA;AACtE,eAAO,MAAM,0CAA0C,QAAQ,CAAA;AAC/D,eAAO,MAAM,4CAA4C,SAAS,CAAA;AAClE,eAAO,MAAM,8BAA8B,OAAO,CAAA;AAClD,eAAO,MAAM,+BAA+B,SAAS,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/intervals.js b/dist/src/consts/intervals.js new file mode 100644 index 000000000..1cbefdc75 --- /dev/null +++ b/dist/src/consts/intervals.js @@ -0,0 +1,9 @@ +export const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000; // 1 minute +export const ACTIVITY_REFRESH_INTERVAL = 5000; // 5 seconds +export const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000; // 3 minutes +export const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000; // 10 minutes +export const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000; // 1 minute +export const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000; // 10 minutes +export const ACCOUNT_STATE_PENDING_INTERVAL = 8000; // 8 seconds +export const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000; // 5 minutes +//# sourceMappingURL=intervals.js.map \ No newline at end of file diff --git a/dist/src/consts/intervals.js.map b/dist/src/consts/intervals.js.map new file mode 100644 index 000000000..16b313a10 --- /dev/null +++ b/dist/src/consts/intervals.js.map @@ -0,0 +1 @@ +{"version":3,"file":"intervals.js","sourceRoot":"","sources":["../../../src/consts/intervals.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qCAAqC,GAAG,KAAK,CAAA,CAAC,WAAW;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAA,CAAC,YAAY;AAC1D,MAAM,CAAC,MAAM,+CAA+C,GAAG,MAAM,CAAA,CAAC,YAAY;AAClF,MAAM,CAAC,MAAM,gDAAgD,GAAG,MAAM,CAAA,CAAC,aAAa;AACpF,MAAM,CAAC,MAAM,0CAA0C,GAAG,KAAK,CAAA,CAAC,WAAW;AAC3E,MAAM,CAAC,MAAM,4CAA4C,GAAG,MAAM,CAAA,CAAC,aAAa;AAChF,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAA,CAAC,YAAY;AAC/D,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAA,CAAC,YAAY","sourcesContent":["export const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000 // 1 minute\nexport const ACTIVITY_REFRESH_INTERVAL = 5000 // 5 seconds\nexport const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000 // 3 minutes\nexport const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000 // 1 minute\nexport const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACCOUNT_STATE_PENDING_INTERVAL = 8000 // 8 seconds\nexport const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000 // 5 minutes\n"]} \ No newline at end of file diff --git a/dist/src/consts/networks.d.ts b/dist/src/consts/networks.d.ts new file mode 100644 index 000000000..2ac7616bb --- /dev/null +++ b/dist/src/consts/networks.d.ts @@ -0,0 +1,4 @@ +import { Network } from '../interfaces/network'; +declare const networks: Network[]; +export { networks }; +//# sourceMappingURL=networks.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/networks.d.ts.map b/dist/src/consts/networks.d.ts.map new file mode 100644 index 000000000..2f5abdb58 --- /dev/null +++ b/dist/src/consts/networks.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../../src/consts/networks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAG/C,QAAA,MAAM,QAAQ,EAAE,OAAO,EA6MtB,CAAA;AACD,OAAO,EAAE,QAAQ,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/networks.js b/dist/src/consts/networks.js index 3cad47c15..9e03103a9 100644 --- a/dist/src/consts/networks.js +++ b/dist/src/consts/networks.js @@ -1,56 +1,209 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.nativeTokens = exports.networks = void 0; -const deploy_1 = require("./deploy"); +import { BICONOMY, PIMLICO } from './bundlers'; const networks = [ { id: 'ethereum', name: 'Ethereum', nativeAssetSymbol: 'ETH', - rpcUrl: 'https://rpc.ankr.com/eth', + rpcUrls: ['https://invictus.ambire.com/ethereum'], + selectedRpcUrl: 'https://invictus.ambire.com/ethereum', rpcNoStateOverride: false, chainId: 1n, - erc4337: null + explorerUrl: 'https://etherscan.io', + erc4337: { enabled: false, hasPaymaster: true, hasBundlerSupport: true }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'ethereum', + nativeAssetId: 'ethereum', + hasSingleton: true, + features: [], + feeOptions: { is1559: true }, + predefined: true, + wrappedAddr: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', + disableEstimateGas: true, + allowForce4337: true }, { id: 'polygon', name: 'Polygon', - nativeAssetSymbol: 'MATIC', - rpcUrl: 'https://rpc.ankr.com/polygon', + nativeAssetSymbol: 'POL', + rpcUrls: ['https://invictus.ambire.com/polygon'], + selectedRpcUrl: 'https://invictus.ambire.com/polygon', rpcNoStateOverride: false, chainId: 137n, + explorerUrl: 'https://polygonscan.com', erc4337: { - enabled: true, - entryPointAddr: deploy_1.ERC_4337_ENTRYPOINT - } + enabled: false, + hasPaymaster: true, + hasBundlerSupport: true, + bundlers: [PIMLICO, BICONOMY], + defaultBundler: PIMLICO + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'polygon-pos', + nativeAssetId: 'matic-network', + hasSingleton: true, + features: [], + feeOptions: { is1559: false, feeIncrease: 10n }, + predefined: true, + wrappedAddr: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270', + oldNativeAssetSymbols: ['MATIC'], + disableEstimateGas: true, + allowForce4337: true }, { id: 'optimism', name: 'Optimism', nativeAssetSymbol: 'ETH', - rpcUrl: 'https://rpc.ankr.com/optimism', + rpcUrls: ['https://invictus.ambire.com/optimism'], + selectedRpcUrl: 'https://invictus.ambire.com/optimism', rpcNoStateOverride: false, chainId: 10n, + explorerUrl: 'https://optimistic.etherscan.io', + erc4337: { + enabled: true, + hasPaymaster: true, + hasBundlerSupport: true, + bundlers: [PIMLICO, BICONOMY], + defaultBundler: BICONOMY + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'optimistic-ethereum', + nativeAssetId: 'ethereum', + hasSingleton: true, + features: [], + feeOptions: { + is1559: true, + elasticityMultiplier: 6n, + baseFeeMaxChangeDenominator: 50n + }, + isOptimistic: true, + predefined: true, + disableEstimateGas: true, + wrappedAddr: '0x4200000000000000000000000000000000000006' + }, + { + id: 'avalanche', + name: 'Avalanche', + nativeAssetSymbol: 'AVAX', + rpcUrls: ['https://invictus.ambire.com/avalanche'], + selectedRpcUrl: 'https://invictus.ambire.com/avalanche', + rpcNoStateOverride: false, + chainId: 43114n, + explorerUrl: 'https://snowtrace.io', + erc4337: { + enabled: true, + hasPaymaster: true, + hasBundlerSupport: true + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'avalanche', + nativeAssetId: 'avalanche-2', + hasSingleton: true, + features: [], + feeOptions: { + is1559: true, + minBaseFee: 25000000000n // 25 gwei + }, + predefined: true, + disableEstimateGas: true, + wrappedAddr: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7' + }, + { + id: 'arbitrum', + name: 'Arbitrum', + nativeAssetSymbol: 'ETH', + rpcUrls: ['https://invictus.ambire.com/arbitrum'], + selectedRpcUrl: 'https://invictus.ambire.com/arbitrum', + rpcNoStateOverride: false, + chainId: 42161n, + explorerUrl: 'https://arbiscan.io', erc4337: { enabled: true, - entryPointAddr: deploy_1.ERC_4337_ENTRYPOINT - } + hasPaymaster: true, + hasBundlerSupport: true, + bundlers: [PIMLICO, BICONOMY], + defaultBundler: PIMLICO + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'arbitrum-one', + nativeAssetId: 'ethereum', + hasSingleton: true, + features: [], + feeOptions: { + is1559: true, + minBaseFee: 100000000n // 1 gwei + }, + predefined: true, + wrappedAddr: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1' + }, + { + id: 'base', + name: 'Base', + nativeAssetSymbol: 'ETH', + rpcUrls: ['https://invictus.ambire.com/base'], + selectedRpcUrl: 'https://invictus.ambire.com/base', + rpcNoStateOverride: false, + chainId: 8453n, + explorerUrl: 'https://basescan.org', + erc4337: { + enabled: true, + hasPaymaster: true, + hasBundlerSupport: true, + bundlers: [PIMLICO, BICONOMY], + defaultBundler: PIMLICO + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'base', + nativeAssetId: 'ethereum', + hasSingleton: true, + isOptimistic: true, + features: [], + feeOptions: { + is1559: true, + minBaseFeeEqualToLastBlock: true + }, + predefined: true, + disableEstimateGas: true, + wrappedAddr: '0x4200000000000000000000000000000000000006' + }, + { + id: 'scroll', + name: 'Scroll', + nativeAssetSymbol: 'ETH', + rpcUrls: ['https://invictus.ambire.com/scroll'], + selectedRpcUrl: 'https://invictus.ambire.com/scroll', + rpcNoStateOverride: false, + chainId: 534352n, + explorerUrl: 'https://scrollscan.com', + erc4337: { + enabled: false, + hasPaymaster: true, + hasBundlerSupport: true + }, + isSAEnabled: true, + areContractsDeployed: true, + hasRelayer: true, + platformId: 'scroll', + nativeAssetId: 'ethereum', + hasSingleton: true, + features: [], + feeOptions: { is1559: false }, + predefined: true, + disableEstimateGas: true, + wrappedAddr: '0x5300000000000000000000000000000000000004', + allowForce4337: true } - // This breaks the background service of the extension - // { - // id: 'hardhat', - // name: 'hardhat', - // nativeAssetSymbol: 'ETH', - // rpcUrl: '', - // rpcNoStateOverride: true, - // chainId: 31337n - // } ]; -exports.networks = networks; -const nativeTokens = { - ethereum: ['ETH', 18], - polygon: ['MATIC', 18], - fanthom: ['FTM', 18] -}; -exports.nativeTokens = nativeTokens; +export { networks }; //# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/consts/networks.js.map b/dist/src/consts/networks.js.map index 95cdf4483..40f111f27 100644 --- a/dist/src/consts/networks.js.map +++ b/dist/src/consts/networks.js.map @@ -1 +1 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/consts/networks.ts"],"names":[],"mappings":";;;AACA,qCAAkE;AAElE,MAAM,QAAQ,GAAwB;IACpC;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,IAAI;KACd;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;QACf,iBAAiB,EAAE,OAAO;QAC1B,MAAM,EAAE,8BAA8B;QACtC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,4BAAmB;YACnC,gBAAgB,EAAE,2BAAkB;SACrC;KACF;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,+BAA+B;QACvC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,4BAAmB;YACnC,gBAAgB,EAAE,2BAAkB;SACrC;KACF;IACD,sDAAsD;IACtD,IAAI;IACJ,mBAAmB;IACnB,qBAAqB;IACrB,8BAA8B;IAC9B,gBAAgB;IAChB,8BAA8B;IAC9B,oBAAoB;IACpB,IAAI;CACL,CAAA;AAOQ,4BAAQ;AALjB,MAAM,YAAY,GAA2C;IAC3D,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IACrB,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;CACrB,CAAA;AACkB,oCAAY"} \ No newline at end of file +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/consts/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network } from '../interfaces/network'\nimport { BICONOMY, PIMLICO } from './bundlers'\n\nconst networks: Network[] = [\n {\n id: 'ethereum',\n name: 'Ethereum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/ethereum'],\n selectedRpcUrl: 'https://invictus.ambire.com/ethereum',\n rpcNoStateOverride: false,\n chainId: 1n,\n explorerUrl: 'https://etherscan.io',\n erc4337: { enabled: false, hasPaymaster: true, hasBundlerSupport: true },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: true },\n predefined: true,\n wrappedAddr: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'polygon',\n name: 'Polygon',\n nativeAssetSymbol: 'POL',\n rpcUrls: ['https://invictus.ambire.com/polygon'],\n selectedRpcUrl: 'https://invictus.ambire.com/polygon',\n rpcNoStateOverride: false,\n chainId: 137n,\n explorerUrl: 'https://polygonscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'polygon-pos',\n nativeAssetId: 'matic-network',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false, feeIncrease: 10n },\n predefined: true,\n wrappedAddr: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n oldNativeAssetSymbols: ['MATIC'],\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'optimism',\n name: 'Optimism',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/optimism'],\n selectedRpcUrl: 'https://invictus.ambire.com/optimism',\n rpcNoStateOverride: false,\n chainId: 10n,\n explorerUrl: 'https://optimistic.etherscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: BICONOMY\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'optimistic-ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n elasticityMultiplier: 6n,\n baseFeeMaxChangeDenominator: 50n\n },\n isOptimistic: true,\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'avalanche',\n name: 'Avalanche',\n nativeAssetSymbol: 'AVAX',\n rpcUrls: ['https://invictus.ambire.com/avalanche'],\n selectedRpcUrl: 'https://invictus.ambire.com/avalanche',\n rpcNoStateOverride: false,\n chainId: 43114n,\n explorerUrl: 'https://snowtrace.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'avalanche',\n nativeAssetId: 'avalanche-2',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 25000000000n // 25 gwei\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'\n },\n {\n id: 'arbitrum',\n name: 'Arbitrum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/arbitrum'],\n selectedRpcUrl: 'https://invictus.ambire.com/arbitrum',\n rpcNoStateOverride: false,\n chainId: 42161n,\n explorerUrl: 'https://arbiscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'arbitrum-one',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 100000000n // 1 gwei\n },\n predefined: true,\n wrappedAddr: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'\n },\n {\n id: 'base',\n name: 'Base',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/base'],\n selectedRpcUrl: 'https://invictus.ambire.com/base',\n rpcNoStateOverride: false,\n chainId: 8453n,\n explorerUrl: 'https://basescan.org',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'base',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n isOptimistic: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFeeEqualToLastBlock: true\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'scroll',\n name: 'Scroll',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/scroll'],\n selectedRpcUrl: 'https://invictus.ambire.com/scroll',\n rpcNoStateOverride: false,\n chainId: 534352n,\n explorerUrl: 'https://scrollscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'scroll',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x5300000000000000000000000000000000000004',\n allowForce4337: true\n }\n]\nexport { networks }\n"]} \ No newline at end of file diff --git a/dist/src/consts/pinnedTokens.d.ts b/dist/src/consts/pinnedTokens.d.ts new file mode 100644 index 000000000..b607679d4 --- /dev/null +++ b/dist/src/consts/pinnedTokens.d.ts @@ -0,0 +1,3 @@ +import { PinnedTokens } from '../libs/portfolio/interfaces'; +export declare const PINNED_TOKENS: PinnedTokens; +//# sourceMappingURL=pinnedTokens.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/pinnedTokens.d.ts.map b/dist/src/consts/pinnedTokens.d.ts.map new file mode 100644 index 000000000..f4cdc38c6 --- /dev/null +++ b/dist/src/consts/pinnedTokens.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pinnedTokens.d.ts","sourceRoot":"","sources":["../../../src/consts/pinnedTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAO3D,eAAO,MAAM,aAAa,EAAE,YA6B3B,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/pinnedTokens.js b/dist/src/consts/pinnedTokens.js index 2f709f3f6..d936bcd56 100644 --- a/dist/src/consts/pinnedTokens.js +++ b/dist/src/consts/pinnedTokens.js @@ -1,12 +1,9 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PINNED_TOKENS = void 0; // Rules: // 1. Pinned gas tank tokens with the same address are shared between networks. This means // that if ETH is pinned on Ethereum and onGasTank is true, the same token shouldn't be // onGasTank on Optimism. // 2. Addresses must be checksummed. -exports.PINNED_TOKENS = [ +export const PINNED_TOKENS = [ // $ETH { networkId: 'ethereum', diff --git a/dist/src/consts/pinnedTokens.js.map b/dist/src/consts/pinnedTokens.js.map index 9e9bb8f25..59189c7a8 100644 --- a/dist/src/consts/pinnedTokens.js.map +++ b/dist/src/consts/pinnedTokens.js.map @@ -1 +1 @@ -{"version":3,"file":"pinnedTokens.js","sourceRoot":"","sources":["../../../src/consts/pinnedTokens.ts"],"names":[],"mappings":";;;AAEA,SAAS;AACT,0FAA0F;AAC1F,uFAAuF;AACvF,yBAAyB;AACzB,oCAAoC;AACvB,QAAA,aAAa,GAAiB;IACzC,OAAO;IACP;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,UAAU;IACV;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ;IACR;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;CACF,CAAA"} \ No newline at end of file +{"version":3,"file":"pinnedTokens.js","sourceRoot":"","sources":["../../../src/consts/pinnedTokens.ts"],"names":[],"mappings":"AAEA,SAAS;AACT,0FAA0F;AAC1F,uFAAuF;AACvF,yBAAyB;AACzB,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,OAAO;IACP;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,UAAU;IACV;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ;IACR;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;CACF,CAAA","sourcesContent":["import { PinnedTokens } from '../libs/portfolio/interfaces'\n\n// Rules:\n// 1. Pinned gas tank tokens with the same address are shared between networks. This means\n// that if ETH is pinned on Ethereum and onGasTank is true, the same token shouldn't be\n// onGasTank on Optimism.\n// 2. Addresses must be checksummed.\nexport const PINNED_TOKENS: PinnedTokens = [\n // $ETH\n {\n networkId: 'ethereum',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: false\n },\n // $WALLET\n {\n networkId: 'ethereum',\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n onGasTank: false\n },\n // $USDC\n {\n networkId: 'ethereum',\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n onGasTank: true\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.d.ts b/dist/src/consts/signAccountOp/errorHandling.d.ts new file mode 100644 index 000000000..35bae0b0c --- /dev/null +++ b/dist/src/consts/signAccountOp/errorHandling.d.ts @@ -0,0 +1,10 @@ +import { Warning } from '../../interfaces/signAccountOp'; +declare const ERRORS: { + eoaInsufficientFunds: string; +}; +declare const WARNINGS: { + [key: string]: Warning; +}; +declare const RETRY_TO_INIT_ACCOUNT_OP_MSG = "Please attempt to initiate the transaction again or contact Ambire support."; +export { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }; +//# sourceMappingURL=errorHandling.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.d.ts.map b/dist/src/consts/signAccountOp/errorHandling.d.ts.map new file mode 100644 index 000000000..d73627ab0 --- /dev/null +++ b/dist/src/consts/signAccountOp/errorHandling.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errorHandling.d.ts","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/errorHandling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAExD,QAAA,MAAM,MAAM;;CAEX,CAAA;AAED,QAAA,MAAM,QAAQ,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAcvC,CAAA;AAED,QAAA,MAAM,4BAA4B,gFAC6C,CAAA;AAE/E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.js b/dist/src/consts/signAccountOp/errorHandling.js new file mode 100644 index 000000000..16316277a --- /dev/null +++ b/dist/src/consts/signAccountOp/errorHandling.js @@ -0,0 +1,21 @@ +const ERRORS = { + eoaInsufficientFunds: 'Insufficient funds to cover the fee.' +}; +const WARNINGS = { + significantBalanceDecrease: { + id: 'significantBalanceDecrease', + title: 'Significant Account Balance Decrease', + text: 'The transaction you are about to sign will significantly decrease your account balance. Please review the transaction details carefully.', + promptBeforeSign: true, + displayBeforeSign: true + }, + feeTokenPriceUnavailable: { + id: 'feeTokenPriceUnavailable', + title: 'Unable to estimate the transaction fee in USD.', + promptBeforeSign: false, + displayBeforeSign: true + } +}; +const RETRY_TO_INIT_ACCOUNT_OP_MSG = 'Please attempt to initiate the transaction again or contact Ambire support.'; +export { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }; +//# sourceMappingURL=errorHandling.js.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.js.map b/dist/src/consts/signAccountOp/errorHandling.js.map new file mode 100644 index 000000000..f631fd712 --- /dev/null +++ b/dist/src/consts/signAccountOp/errorHandling.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/errorHandling.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG;IACb,oBAAoB,EAAE,sCAAsC;CAC7D,CAAA;AAED,MAAM,QAAQ,GAA+B;IAC3C,0BAA0B,EAAE;QAC1B,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,sCAAsC;QAC7C,IAAI,EAAE,0IAA0I;QAChJ,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;KACxB;IACD,wBAAwB,EAAE;QACxB,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,gDAAgD;QACvD,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,IAAI;KACxB;CACF,CAAA;AAED,MAAM,4BAA4B,GAChC,6EAA6E,CAAA;AAE/E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAA","sourcesContent":["import { Warning } from '../../interfaces/signAccountOp'\n\nconst ERRORS = {\n eoaInsufficientFunds: 'Insufficient funds to cover the fee.'\n}\n\nconst WARNINGS: { [key: string]: Warning } = {\n significantBalanceDecrease: {\n id: 'significantBalanceDecrease',\n title: 'Significant Account Balance Decrease',\n text: 'The transaction you are about to sign will significantly decrease your account balance. Please review the transaction details carefully.',\n promptBeforeSign: true,\n displayBeforeSign: true\n },\n feeTokenPriceUnavailable: {\n id: 'feeTokenPriceUnavailable',\n title: 'Unable to estimate the transaction fee in USD.',\n promptBeforeSign: false,\n displayBeforeSign: true\n }\n}\n\nconst RETRY_TO_INIT_ACCOUNT_OP_MSG =\n 'Please attempt to initiate the transaction again or contact Ambire support.'\n\nexport { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }\n"]} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.d.ts b/dist/src/consts/signAccountOp/gas.d.ts new file mode 100644 index 000000000..32987d58a --- /dev/null +++ b/dist/src/consts/signAccountOp/gas.d.ts @@ -0,0 +1,5 @@ +declare const SA_NATIVE_TRANSFER_GAS_USED = 12000n; +declare const SA_ERC20_TRANSFER_GAS_USED = 18000n; +declare const GAS_TANK_TRANSFER_GAS_USED = 5000n; +export { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }; +//# sourceMappingURL=gas.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.d.ts.map b/dist/src/consts/signAccountOp/gas.d.ts.map new file mode 100644 index 000000000..f82167b21 --- /dev/null +++ b/dist/src/consts/signAccountOp/gas.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/gas.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,2BAA2B,SAAS,CAAA;AAC1C,QAAA,MAAM,0BAA0B,SAAS,CAAA;AACzC,QAAA,MAAM,0BAA0B,QAAQ,CAAA;AAExC,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.js b/dist/src/consts/signAccountOp/gas.js new file mode 100644 index 000000000..ebb0cc510 --- /dev/null +++ b/dist/src/consts/signAccountOp/gas.js @@ -0,0 +1,5 @@ +const SA_NATIVE_TRANSFER_GAS_USED = 12000n; +const SA_ERC20_TRANSFER_GAS_USED = 18000n; +const GAS_TANK_TRANSFER_GAS_USED = 5000n; +export { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }; +//# sourceMappingURL=gas.js.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.js.map b/dist/src/consts/signAccountOp/gas.js.map new file mode 100644 index 000000000..2ceb4464a --- /dev/null +++ b/dist/src/consts/signAccountOp/gas.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/gas.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAC1C,MAAM,0BAA0B,GAAG,MAAM,CAAA;AACzC,MAAM,0BAA0B,GAAG,KAAK,CAAA;AAExC,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,CAAA","sourcesContent":["const SA_NATIVE_TRANSFER_GAS_USED = 12000n\nconst SA_ERC20_TRANSFER_GAS_USED = 18000n\nconst GAS_TANK_TRANSFER_GAS_USED = 5000n\n\nexport { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }\n"]} \ No newline at end of file diff --git a/dist/src/consts/signatures.d.ts b/dist/src/consts/signatures.d.ts new file mode 100644 index 000000000..365e256d4 --- /dev/null +++ b/dist/src/consts/signatures.d.ts @@ -0,0 +1,2 @@ +export declare const SPOOF_SIGTYPE = "03"; +//# sourceMappingURL=signatures.d.ts.map \ No newline at end of file diff --git a/dist/src/consts/signatures.d.ts.map b/dist/src/consts/signatures.d.ts.map new file mode 100644 index 000000000..ea72f9baa --- /dev/null +++ b/dist/src/consts/signatures.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"signatures.d.ts","sourceRoot":"","sources":["../../../src/consts/signatures.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,OAAO,CAAA"} \ No newline at end of file diff --git a/dist/src/consts/signatures.js b/dist/src/consts/signatures.js new file mode 100644 index 000000000..8c4a09a08 --- /dev/null +++ b/dist/src/consts/signatures.js @@ -0,0 +1,2 @@ +export const SPOOF_SIGTYPE = '03'; +//# sourceMappingURL=signatures.js.map \ No newline at end of file diff --git a/dist/src/consts/signatures.js.map b/dist/src/consts/signatures.js.map new file mode 100644 index 000000000..6bd3aaa86 --- /dev/null +++ b/dist/src/consts/signatures.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/consts/signatures.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA","sourcesContent":["export const SPOOF_SIGTYPE = '03'\n"]} \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.d.ts b/dist/src/controllers/accountAdder/accountAdder.d.ts new file mode 100644 index 000000000..389413838 --- /dev/null +++ b/dist/src/controllers/accountAdder/accountAdder.d.ts @@ -0,0 +1,106 @@ +import { HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'; +import { Account, AccountOnPage, SelectedAccountForImport } from '../../interfaces/account'; +import { Fetch } from '../../interfaces/fetch'; +import { KeyIterator } from '../../interfaces/keyIterator'; +import { ReadyToAddKeys } from '../../interfaces/keystore'; +import { Network, NetworkId } from '../../interfaces/network'; +import { AccountsController } from '../accounts/accounts'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { KeystoreController } from '../keystore/keystore'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +export declare const DEFAULT_PAGE = 1; +export declare const DEFAULT_PAGE_SIZE = 5; +/** + * Account Adder Controller + * is responsible for listing accounts that can be selected for adding, and for + * adding (creating) identity for the smart accounts (if needed) on the Relayer. + * It uses a KeyIterator interface allow iterating all the keys in a specific + * underlying store such as a hardware device or an object holding a seed. + */ +export declare class AccountAdderController extends EventEmitter { + #private; + hdPathTemplate?: HD_PATH_TEMPLATE_TYPE; + isInitialized: boolean; + isInitializedWithSavedSeed: boolean; + shouldSearchForLinkedAccounts: boolean; + shouldGetAccountsUsedOnNetworks: boolean; + page: number; + pageSize: number; + pageError: null | string; + selectedAccounts: SelectedAccountForImport[]; + readyToAddAccounts: Account[]; + readyToAddKeys: ReadyToAddKeys; + addAccountsStatus: 'LOADING' | 'SUCCESS' | 'INITIAL'; + accountsLoading: boolean; + linkedAccountsLoading: boolean; + networksWithAccountStateError: NetworkId[]; + constructor({ accounts, keystore, networks, providers, relayerUrl, fetch }: { + accounts: AccountsController; + keystore: KeystoreController; + networks: NetworksController; + providers: ProvidersController; + relayerUrl: string; + fetch: Fetch; + }); + get accountsOnPage(): AccountOnPage[]; + init({ keyIterator, page, pageSize, hdPathTemplate, shouldSearchForLinkedAccounts, shouldGetAccountsUsedOnNetworks }: { + keyIterator: KeyIterator | null; + page?: number; + pageSize?: number; + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; + shouldSearchForLinkedAccounts?: boolean; + shouldGetAccountsUsedOnNetworks?: boolean; + }): Promise; + get type(): string | undefined; + get subType(): "seed" | "private-key" | undefined; + reset(): void; + setHDPathTemplate({ hdPathTemplate }: { + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; + }): Promise; + selectAccount(_account: Account): void; + deselectAccount(account: Account): void; + /** + * For internal keys only! Returns the ready to be added internal (private) + * keys of the currently selected accounts. + */ + retrieveInternalKeysOfSelectedAccounts(): { + addr: string; + type: "internal"; + label: string; + privateKey: string; + dedicatedToOneSA: boolean; + meta: { + createdAt: number; + }; + }[]; + /** + * Prevents requesting the next page before the current one is fully loaded. + * This avoids race conditions where the user requests the next page before + * linked accounts are fully loaded, causing misleadingly failing `#verifyLinkedAccounts` checks. + */ + get isPageLocked(): boolean; + setPage({ page }: { + page: number; + }): Promise; + /** + * Triggers the process of adding accounts via the AccountAdder flow by + * creating identity for the smart accounts (if needed) on the Relayer. + * Then the `onAccountAdderSuccess` listener in the Main Controller gets + * triggered, which uses the `readyToAdd...` properties to further set + * the newly added accounts data (like preferences, keys and others) + */ + addAccounts(accounts?: SelectedAccountForImport[], readyToAddKeys?: ReadyToAddKeys): Promise; + createAndAddEmailAccount(selectedAccount: SelectedAccountForImport): Promise; + addExistingEmailAccounts(accounts: Account[]): Promise; + removeNetworkData(id: Network['id']): void; + toJSON(): this & { + accountsOnPage: AccountOnPage[]; + type: string | undefined; + subType: "seed" | "private-key" | undefined; + isPageLocked: boolean; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export default AccountAdderController; +//# sourceMappingURL=accountAdder.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.d.ts.map b/dist/src/controllers/accountAdder/accountAdder.d.ts.map new file mode 100644 index 000000000..fc84fede4 --- /dev/null +++ b/dist/src/controllers/accountAdder/accountAdder.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accountAdder.d.ts","sourceRoot":"","sources":["../../../../src/controllers/accountAdder/accountAdder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.js b/dist/src/controllers/accountAdder/accountAdder.js new file mode 100644 index 000000000..61312df23 --- /dev/null +++ b/dist/src/controllers/accountAdder/accountAdder.js @@ -0,0 +1,737 @@ +import { getCreate2Address, keccak256 } from 'ethers'; +import ExternalSignerError from '../../classes/ExternalSignerError'; +import { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'; +import { PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'; +import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; +import { dedicatedToOneSAPriv } from '../../interfaces/keystore'; +import { getAccountImportStatus, getBasicAccount, getDefaultAccountPreferences, getEmailAccount, getSmartAccount, isAmbireV1LinkedAccount, isDerivedForSmartAccountKeyOnly, isSmartAccount } from '../../libs/account/account'; +import { getAccountState } from '../../libs/accountState/accountState'; +import { relayerCall } from '../../libs/relayerCall/relayerCall'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export const DEFAULT_PAGE = 1; +export const DEFAULT_PAGE_SIZE = 5; +const DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS = true; +const DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true; +/** + * Account Adder Controller + * is responsible for listing accounts that can be selected for adding, and for + * adding (creating) identity for the smart accounts (if needed) on the Relayer. + * It uses a KeyIterator interface allow iterating all the keys in a specific + * underlying store such as a hardware device or an object holding a seed. + */ +export class AccountAdderController extends EventEmitter { + #callRelayer; + #accounts; + #keystore; + #networks; + #providers; + #keyIterator; + hdPathTemplate; + isInitialized = false; + isInitializedWithSavedSeed = false; + shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS; + shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS; + /* This is only the index of the current page */ + page = DEFAULT_PAGE; + /* The number of accounts to be displayed on a single page */ + pageSize = DEFAULT_PAGE_SIZE; + /* State to indicate the page requested fails to load (and the reason why) */ + pageError = null; + selectedAccounts = []; + // Accounts which identity is created on the Relayer (if needed), and are ready + // to be added to the user's account list by the Main Controller + readyToAddAccounts = []; + // The keys for the `readyToAddAccounts`, that are ready to be added to the + // user's keystore by the Main Controller + readyToAddKeys = { internal: [], external: [] }; + // Identity for the smart accounts must be created on the Relayer, this + // represents the status of the operation, needed managing UI state + addAccountsStatus = 'INITIAL'; + accountsLoading = false; + linkedAccountsLoading = false; + networksWithAccountStateError = []; + #derivedAccounts = []; + #linkedAccounts = []; + // This prevents the recalculation of getters that use accounts during the execution of addAccounts. + // Without this, the controller incorrectly identifies newly added accounts as those from a previous session, + // leading to unpredictable behavior on the AccountAdderScreen + #alreadyImportedAccountsOnControllerInit = []; + constructor({ accounts, keystore, networks, providers, relayerUrl, fetch }) { + super(); + this.#accounts = accounts; + this.#keystore = keystore; + this.#networks = networks; + this.#providers = providers; + this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + } + get accountsOnPage() { + const processedAccounts = this.#derivedAccounts + // The displayed (visible) accounts on page should not include the derived + // EOA (basic) accounts only used as smart account keys, they should not + // be visible nor importable (or selectable). + .filter((x) => !isDerivedForSmartAccountKeyOnly(x.index)) + .flatMap((derivedAccount) => { + const associatedLinkedAccounts = this.#linkedAccounts.filter((linkedAcc) => !isSmartAccount(derivedAccount.account) && + linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)); + const correspondingSmartAccount = this.#derivedAccounts.find((acc) => isSmartAccount(acc.account) && acc.slot === derivedAccount.slot); + let accountsToReturn = []; + if (!isSmartAccount(derivedAccount.account)) { + accountsToReturn.push(derivedAccount); + const duplicate = associatedLinkedAccounts.find((linkedAcc) => linkedAcc.account.addr === correspondingSmartAccount?.account?.addr); + // The derived smart account that matches the relayer's linked account + // should not be displayed as linked account. Use this cycle to mark it. + if (duplicate) + duplicate.isLinked = false; + if (!duplicate && correspondingSmartAccount) { + accountsToReturn.push(correspondingSmartAccount); + } + } + accountsToReturn = accountsToReturn.concat(associatedLinkedAccounts.map((linkedAcc) => ({ + ...linkedAcc, + slot: derivedAccount.slot, + index: derivedAccount.index + }))); + return accountsToReturn; + }); + const unprocessedLinkedAccounts = this.#linkedAccounts + .filter((linkedAcc) => !processedAccounts.find((processedAcc) => processedAcc?.account.addr === linkedAcc.account.addr)) + // Use `flatMap` instead of `map` in order to auto remove missing values. + // The `flatMap` has a built-in mechanism to flatten the array and remove + // null or undefined values (by returning empty array). + .flatMap((linkedAcc) => { + const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) => linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)); + // The `correspondingDerivedAccount` should always be found, except when + // something is wrong with the data we have stored on the Relayer. + // The this.#verifyLinkedAndDerivedAccounts() method should have + // already emitted an error in that case. Do not emit here, since + // this is a getter method (and emitting here is a no-go). + if (!correspondingDerivedAccount) + return []; + return [ + { + ...linkedAcc, + slot: correspondingDerivedAccount.slot, + index: correspondingDerivedAccount.index + } + ]; + }); + const mergedAccounts = [...processedAccounts, ...unprocessedLinkedAccounts]; + mergedAccounts.sort((a, b) => { + const prioritizeAccountType = (item) => { + if (!isSmartAccount(item.account)) + return -1; + if (item.isLinked) + return 1; + return 0; + }; + return prioritizeAccountType(a) - prioritizeAccountType(b) || a.slot - b.slot; + }); + return mergedAccounts.map((acc) => ({ + ...acc, + importStatus: getAccountImportStatus({ + account: acc.account, + alreadyImportedAccounts: this.#alreadyImportedAccountsOnControllerInit, + keys: this.#keystore.keys, + accountsOnPage: mergedAccounts, + keyIteratorType: this.#keyIterator?.type + }) + })); + } + async #isKeyIteratorInitializedWithTheSavedSeed() { + if (this.#keyIterator?.subType !== 'seed') + return false; + if (!this.#keystore.hasKeystoreSavedSeed) + return false; + const savedSeed = await this.#keystore.getSavedSeed(); + if (!savedSeed) + return false; + return !!this.#keyIterator?.isSeedMatching?.(savedSeed.seed); + } + async #getInitialHdPathTemplate(defaultHdPathTemplate) { + if (!this.isInitializedWithSavedSeed) + return defaultHdPathTemplate; + const savedSeed = await this.#keystore.getSavedSeed(); + return savedSeed.hdPathTemplate || defaultHdPathTemplate; + } + async init({ keyIterator, page, pageSize, hdPathTemplate, shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS, shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS }) { + this.#keyIterator = keyIterator; + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + this.page = page || DEFAULT_PAGE; + this.pageSize = pageSize || DEFAULT_PAGE_SIZE; + this.isInitializedWithSavedSeed = await this.#isKeyIteratorInitializedWithTheSavedSeed(); + this.hdPathTemplate = await this.#getInitialHdPathTemplate(hdPathTemplate); + this.isInitialized = true; + this.#alreadyImportedAccountsOnControllerInit = this.#accounts.accounts; + this.shouldSearchForLinkedAccounts = shouldSearchForLinkedAccounts; + this.shouldGetAccountsUsedOnNetworks = shouldGetAccountsUsedOnNetworks; + this.emitUpdate(); + } + get type() { + return this.#keyIterator?.type; + } + get subType() { + return this.#keyIterator?.subType; + } + reset() { + this.#keyIterator = null; + this.selectedAccounts = []; + this.page = DEFAULT_PAGE; + this.pageSize = DEFAULT_PAGE_SIZE; + this.hdPathTemplate = undefined; + this.shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS; + this.shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS; + this.addAccountsStatus = 'INITIAL'; + this.#derivedAccounts = []; + this.#linkedAccounts = []; + this.readyToAddAccounts = []; + this.networksWithAccountStateError = []; + this.readyToAddKeys = { internal: [], external: [] }; + this.isInitialized = false; + this.isInitializedWithSavedSeed = false; + this.emitUpdate(); + } + async setHDPathTemplate({ hdPathTemplate }) { + this.hdPathTemplate = hdPathTemplate; + // Reset the currently selected accounts, because for the keys of these + // accounts, as of v4.32.0, we don't store their hd path. When import + // completes, only the latest hd path of the controller is stored. + this.selectedAccounts = []; + await this.setPage({ page: DEFAULT_PAGE }); // takes the user back on the first page + } + #getAccountKeys(account, accountsOnPageWithThisAcc) { + // should never happen + if (accountsOnPageWithThisAcc.length === 0) { + console.error(`accountAdder: account ${account.addr} was not found in the accountsOnPage.`); + return []; + } + // Case 1: The account is a Basic account + const isBasicAcc = !isSmartAccount(account); + // The key of the Basic account is the basic account itself + if (isBasicAcc) + return accountsOnPageWithThisAcc; + // Case 2: The account is a Smart account, but not a linked one + const isSmartAccountAndNotLinked = isSmartAccount(account) && + accountsOnPageWithThisAcc.length === 1 && + accountsOnPageWithThisAcc[0].isLinked === false; + if (isSmartAccountAndNotLinked) { + // The key of the smart account is the Basic account on the same slot + // that is explicitly derived for a smart account key only. + const basicAccOnThisSlotDerivedForSmartAccKey = this.#derivedAccounts.find((a) => a.slot === accountsOnPageWithThisAcc[0].slot && + !isSmartAccount(a.account) && + isDerivedForSmartAccountKeyOnly(a.index)); + return basicAccOnThisSlotDerivedForSmartAccKey + ? [basicAccOnThisSlotDerivedForSmartAccKey] + : []; + } + // Case 3: The account is a Smart account and a linked one. For this case, + // there could exist multiple keys (basic accounts) found on different slots. + const basicAccOnEverySlotWhereThisAddrIsFound = accountsOnPageWithThisAcc + .map((a) => a.slot) + .flatMap((slot) => { + const basicAccOnThisSlot = this.#derivedAccounts.find((a) => a.slot === slot && + !isSmartAccount(a.account) && + // The key of the linked account is always the EOA (basic) account + // on the same slot that is not explicitly used for smart account keys only. + !isDerivedForSmartAccountKeyOnly(a.index)); + return basicAccOnThisSlot ? [basicAccOnThisSlot] : []; + }); + return basicAccOnEverySlotWhereThisAddrIsFound; + } + selectAccount(_account) { + if (!this.isInitialized) + return this.#throwNotInitialized(); + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + // Needed, because linked accounts could have multiple keys (basic accounts), + // and therefore - same linked account could be found on different slots. + const accountsOnPageWithThisAcc = this.accountsOnPage.filter((accOnPage) => accOnPage.account.addr === _account.addr); + const accountKeys = this.#getAccountKeys(_account, accountsOnPageWithThisAcc); + if (!accountKeys.length) + return this.emitError({ + level: 'major', + message: `Selecting ${_account.addr} account failed because the details for this account are missing. Please try again or contact support if the problem persists.`, + error: new Error(`Trying to select ${_account.addr} account, but this account was not found in the accountsOnPage or it's keys were not found.`) + }); + const nextSelectedAccount = { + account: _account, + // If the account has more than 1 key, it is for sure linked account, + // since Basic accounts have only 1 key and smart accounts with more than + // one key present should always be found as linked accounts anyways. + isLinked: accountKeys.length > 1, + accountKeys: accountKeys.map((a) => ({ + addr: a.account.addr, + slot: a.slot, + index: a.index + })) + }; + const accountExists = this.selectedAccounts.some((x) => x.account.addr === nextSelectedAccount.account.addr); + if (accountExists) { + // If the account exists, replace it with the new one, to make sure + // the latest data is used. We could add one more sub-step to skip this, + // if we do a deep comparison, but that would probably be an overkill. + this.selectedAccounts = this.selectedAccounts.map((x) => x.account.addr === nextSelectedAccount.account.addr ? nextSelectedAccount : x); + } + else { + this.selectedAccounts.push(nextSelectedAccount); + } + this.emitUpdate(); + } + deselectAccount(account) { + if (!this.isInitialized) + return this.#throwNotInitialized(); + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + const accIdx = this.selectedAccounts.findIndex((x) => x.account.addr === account.addr); + if (accIdx !== -1) { + this.selectedAccounts = this.selectedAccounts.filter((_, i) => i !== accIdx); + this.emitUpdate(); + } + else { + return this.emitError({ + level: 'major', + message: 'This account cannot be deselected. Please reload and try again.', + error: new Error('accountAdder: account not found. Cannot deselect.') + }); + } + } + /** + * For internal keys only! Returns the ready to be added internal (private) + * keys of the currently selected accounts. + */ + retrieveInternalKeysOfSelectedAccounts() { + if (!this.hdPathTemplate) { + this.#throwMissingHdPath(); + return []; + } + if (!this.#keyIterator?.retrieveInternalKeys) { + this.#throwMissingKeyIteratorRetrieveInternalKeysMethod(); + return []; + } + return this.#keyIterator?.retrieveInternalKeys(this.selectedAccounts, this.hdPathTemplate, this.#keystore.keys); + } + /** + * Prevents requesting the next page before the current one is fully loaded. + * This avoids race conditions where the user requests the next page before + * linked accounts are fully loaded, causing misleadingly failing `#verifyLinkedAccounts` checks. + */ + get isPageLocked() { + return this.accountsLoading || this.linkedAccountsLoading; + } + async setPage({ page = this.page }) { + if (!this.isInitialized) + return this.#throwNotInitialized(); + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + this.page = page; + this.pageError = null; + this.#derivedAccounts = []; + this.#linkedAccounts = []; + this.accountsLoading = true; + this.networksWithAccountStateError = []; + this.emitUpdate(); + if (page <= 0) { + this.pageError = `Unexpected page was requested (page ${page}). Please try again or contact support for help.`; + this.page = DEFAULT_PAGE; // fallback to the default (initial) page + this.emitUpdate(); + return; + } + try { + this.#derivedAccounts = await this.#deriveAccounts(); + if (this.#keyIterator?.type === 'internal' && this.#keyIterator?.subType === 'private-key') { + const accountsOnPageWithoutTheLinked = this.accountsOnPage.filter((acc) => !acc.isLinked); + const usedAccounts = accountsOnPageWithoutTheLinked.filter((acc) => acc.account.usedOnNetworks.length); + // If at least one account is used - preselect all accounts on the page + // (except the linked ones). Usually there are are two accounts + // (since the private key flow gas `pageSize` of 1) + if (usedAccounts.length) { + accountsOnPageWithoutTheLinked.forEach((acc) => this.selectAccount(acc.account)); + } + } + } + catch (e) { + const fallbackMessage = `Failed to retrieve accounts on page ${this.page}. Please try again or contact support for assistance. Error details: ${e?.message}.`; + this.pageError = e instanceof ExternalSignerError ? e.message : fallbackMessage; + } + this.accountsLoading = false; + this.emitUpdate(); + await this.#findAndSetLinkedAccounts({ + accounts: this.#derivedAccounts + .filter((acc) => + // Search for linked accounts to the basic (EOA) accounts only. + // Searching for linked accounts to another Ambire smart accounts + // is a feature that Ambire is yet to support. + !isSmartAccount(acc.account) && + // Skip searching for linked accounts to the derived EOA (basic) + // accounts that are used for smart account keys only. They are + // solely purposed to manage 1 particular (smart) account, + // not at all for linking. + !isDerivedForSmartAccountKeyOnly(acc.index)) + .map((acc) => acc.account) + }); + } + /** + * Triggers the process of adding accounts via the AccountAdder flow by + * creating identity for the smart accounts (if needed) on the Relayer. + * Then the `onAccountAdderSuccess` listener in the Main Controller gets + * triggered, which uses the `readyToAdd...` properties to further set + * the newly added accounts data (like preferences, keys and others) + */ + async addAccounts(accounts = [], readyToAddKeys = { internal: [], external: [] }) { + if (!this.isInitialized) + return this.#throwNotInitialized(); + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + if (!accounts.length) { + return this.emitError({ + level: 'minor', + message: 'Trying to add accounts, but no accounts are selected. Please select at least one account.', + error: new Error('accountAdder: requested method `addAccounts`, but the accounts param is empty') + }); + } + this.addAccountsStatus = 'LOADING'; + await this.forceEmitUpdate(); + let newlyCreatedAccounts = []; + const accountsToAddOnRelayer = accounts + // Identity only for the smart accounts must be created on the Relayer + .filter((x) => isSmartAccount(x.account)) + // Skip creating identity for Ambire v1 smart accounts + .filter((x) => !isAmbireV1LinkedAccount(x.account.creation?.factoryAddr)); + if (accountsToAddOnRelayer.length) { + const body = accountsToAddOnRelayer.map(({ account }) => ({ + addr: account.addr, + ...(account.email ? { email: account.email } : {}), + associatedKeys: account.initialPrivileges, + creation: { + factoryAddr: account.creation.factoryAddr, + salt: account.creation.salt, + baseIdentityAddr: PROXY_AMBIRE_ACCOUNT + } + })); + try { + const res = await this.#callRelayer('/v2/identity/create-multiple', 'POST', { + accounts: body + }); + if (!res.success) { + throw new Error(res?.message || 'No response received from the Ambire Relayer.'); + } + if (res.body) { + newlyCreatedAccounts = res.body + .filter((acc) => acc.status.created) + .map((acc) => acc.identity); + } + } + catch (e) { + this.emitError({ + level: 'major', + message: 'Error when adding accounts on the Ambire Relayer. Please try again later or contact support if the problem persists.', + error: new Error(e?.message) + }); + this.addAccountsStatus = 'INITIAL'; + await this.forceEmitUpdate(); + return; + } + } + this.readyToAddAccounts = [ + ...accounts.map((x, i) => { + const alreadyImportedAcc = this.#accounts.accounts.find((a) => a.addr === x.account.addr); + return { + ...x.account, + // Persist the already imported account preferences on purpose, otherwise, + // re-importing the same account via different key type(s) would reset them. + preferences: alreadyImportedAcc + ? alreadyImportedAcc.preferences + : getDefaultAccountPreferences(x.account.addr, this.#accounts.accounts, i), + newlyCreated: newlyCreatedAccounts.includes(x.account.addr) + }; + }) + ]; + this.readyToAddKeys = readyToAddKeys; + this.addAccountsStatus = 'SUCCESS'; + await this.forceEmitUpdate(); + // reset the addAccountsStatus in the next tick to ensure the FE receives the 'SUCCESS' state + this.addAccountsStatus = 'INITIAL'; + await this.forceEmitUpdate(); + } + async createAndAddEmailAccount(selectedAccount) { + const { account: { email }, accountKeys: [recoveryKey] } = selectedAccount; + if (!this.isInitialized) + return this.#throwNotInitialized(); + if (!this.#keyIterator) + return this.#throwMissingKeyIterator(); + const keyPublicAddress = (await this.#keyIterator.retrieve([{ from: 0, to: 1 }]))[0]; + const emailSmartAccount = await getEmailAccount({ + emailFrom: email, + secondaryKey: recoveryKey.addr + }, keyPublicAddress); + await this.addAccounts([{ ...selectedAccount, account: { ...emailSmartAccount, email } }]); + } + // updates the account adder state so the main ctrl receives the readyToAddAccounts + // that should be added to the storage of the app + async addExistingEmailAccounts(accounts) { + // There is no need to call the addAccounts method in order to add that + // account to the relayer because this func will be called only for accounts returned + // from relayer that only need to be stored in the storage of the app + this.readyToAddAccounts = accounts; + this.addAccountsStatus = 'SUCCESS'; + this.emitUpdate(); + } + removeNetworkData(id) { + this.networksWithAccountStateError = this.networksWithAccountStateError.filter((x) => x !== id); + this.emitUpdate(); + } + async #deriveAccounts() { + // Should never happen, because before the #deriveAccounts method gets + // called - there is a check if the #keyIterator exists. + if (!this.#keyIterator) { + console.error('accountAdder: missing keyIterator'); + return []; + } + const accounts = []; + const startIdx = (this.page - 1) * this.pageSize; + const endIdx = (this.page - 1) * this.pageSize + (this.pageSize - 1); + const indicesToRetrieve = [ + { from: startIdx, to: endIdx } // Indices for the basic (EOA) accounts + ]; + // Since v4.31.0, do not retrieve smart accounts for the private key + // type. That's because we can't use the common derivation offset + // (SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET), and deriving smart + // accounts out of the private key (with another approach - salt and + // extra entropy) was creating confusion. + const shouldRetrieveSmartAccountIndices = this.#keyIterator.type !== 'private-key'; + if (shouldRetrieveSmartAccountIndices) { + // Indices for the smart accounts. + indicesToRetrieve.push({ + from: startIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET, + to: endIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET + }); + } + // Combine the requests for all accounts in one call to the keyIterator. + // That's optimization primarily focused on hardware wallets, to reduce the + // number of calls to the hardware device. This is important, especially + // for Trezor, because it fires a confirmation popup for each call. + const combinedBasicAndSmartAccKeys = await this.#keyIterator.retrieve(indicesToRetrieve, this.hdPathTemplate); + const basicAccKeys = combinedBasicAndSmartAccKeys.slice(0, this.pageSize); + const smartAccKeys = combinedBasicAndSmartAccKeys.slice(this.pageSize, combinedBasicAndSmartAccKeys.length); + const smartAccountsPromises = []; + // Replace the parallel getKeys with foreach to prevent issues with Ledger, + // which can only handle one request at a time. + // eslint-disable-next-line no-restricted-syntax + for (const [index, smartAccKey] of smartAccKeys.entries()) { + const slot = startIdx + (index + 1); + // The derived EOA (basic) account which is the key for the smart account + const account = getBasicAccount(smartAccKey, this.#accounts.accounts); + const indexWithOffset = slot - 1 + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + accounts.push({ account, isLinked: false, slot, index: indexWithOffset }); + // Derive the Ambire (smart) account + smartAccountsPromises.push(getSmartAccount([{ addr: smartAccKey, hash: dedicatedToOneSAPriv }], this.#accounts.accounts) + .then((smartAccount) => { + return { account: smartAccount, isLinked: false, slot, index: slot - 1 }; + }) + // If the error isn't caught here and the promise is rejected, Promise.all + // will be rejected entirely. + .catch(() => { + // No need for emitting an error here, because a relevant error is already + // emitted in the method #getAccountsUsedOnNetworks + return null; + })); + } + const unfilteredSmartAccountsList = await Promise.all(smartAccountsPromises); + const smartAccounts = unfilteredSmartAccountsList.filter((x) => x !== null); + accounts.push(...smartAccounts); + // eslint-disable-next-line no-restricted-syntax + for (const [index, basicAccKey] of basicAccKeys.entries()) { + const slot = startIdx + (index + 1); + // The EOA (basic) account on this slot + const account = getBasicAccount(basicAccKey, this.#accounts.accounts); + accounts.push({ account, isLinked: false, slot, index: slot - 1 }); + } + const accountsWithNetworks = await this.#getAccountsUsedOnNetworks({ accounts }); + return accountsWithNetworks; + } + // inner func + // eslint-disable-next-line class-methods-use-this + async #getAccountsUsedOnNetworks({ accounts }) { + if (!this.shouldGetAccountsUsedOnNetworks) { + return accounts.map((a) => ({ ...a, account: { ...a.account, usedOnNetworks: [] } })); + } + const accountsObj = Object.fromEntries(accounts.map((a) => [a.account.addr, { ...a, account: { ...a.account, usedOnNetworks: [] } }])); + const networkLookup = {}; + this.#networks.networks.forEach((network) => { + networkLookup[network.id] = network; + }); + const promises = Object.keys(this.#providers.providers).map(async (providerKey) => { + const network = networkLookup[providerKey]; + if (network) { + const accountState = await getAccountState(this.#providers.providers[providerKey], network, accounts.map((acc) => acc.account)).catch(() => { + console.error('accountAdder: failed to get account state on ', providerKey); + if (this.networksWithAccountStateError.includes(providerKey)) + return; + this.networksWithAccountStateError.push(providerKey); + }); + if (!accountState) + return; + accountState.forEach((acc) => { + const isUsedOnThisNetwork = + // Known limitation: checks only the native token balance. If this + // account has any other tokens than native ones, this check will + // fail to detect that the account was used on this network. + acc.balance > BigInt(0) || + (acc.isEOA + ? acc.nonce > BigInt(0) + : // For smart accounts, check for 'isDeployed' instead because in + // the erc-4337 scenario many cases might be missed with checking + // the `acc.nonce`. For instance, `acc.nonce` could be 0, but user + // might be actively using the account. This is because in erc-4337, + // we use the entry point nonce. However, detecting the entry point + // nonce is also not okay, because for various cases we do not use + // sequential nonce - i.e., the entry point nonce could still be 0, + // but the account is deployed. So the 'isDeployed' check is the + // only reliable way to detect if account is used on network. + acc.isDeployed); + if (isUsedOnThisNetwork) { + accountsObj[acc.accountAddr].account.usedOnNetworks.push(network); + } + }); + } + }); + await Promise.all(promises); + const finalAccountsWithNetworksArray = Object.values(accountsObj); + // Preserve the original order of networks based on usedOnNetworks + const sortedAccountsWithNetworksArray = finalAccountsWithNetworksArray.sort((a, b) => { + const networkIdsA = a.account.usedOnNetworks.map((network) => network.id); + const networkIdsB = b.account.usedOnNetworks.map((network) => network.id); + const networkIndexA = this.#networks.networks.findIndex((network) => networkIdsA.includes(network.id)); + const networkIndexB = this.#networks.networks.findIndex((network) => networkIdsB.includes(network.id)); + return networkIndexA - networkIndexB; + }); + return sortedAccountsWithNetworksArray; + } + async #findAndSetLinkedAccounts({ accounts }) { + if (!this.shouldSearchForLinkedAccounts) + return; + if (accounts.length === 0) + return; + this.linkedAccountsLoading = true; + this.emitUpdate(); + const keys = accounts.map((acc) => `keys[]=${acc.addr}`).join('&'); + const url = `/v2/account-by-key/linked/accounts?${keys}`; + const { data } = await this.#callRelayer(url); + const linkedAccounts = Object.keys(data.accounts).flatMap((addr) => { + // In extremely rare cases, on the Relayer, the identity data could be + // missing in the identities table but could exist in the logs table. + // When this happens, the account data will be `null`. + const isIdentityDataMissing = !data.accounts[addr]; + if (isIdentityDataMissing) { + // Same error for both cases, because most prob + this.emitError({ + level: 'minor', + message: `The address ${addr} is not linked to an Ambire account. Please try again later or contact support if the problem persists.`, + error: new Error(`The address ${addr} is not linked to an Ambire account. This could be because the identity data is missing in the identities table but could exist in the logs table.`) + }); + return []; + } + const { factoryAddr, bytecode, salt, associatedKeys } = data.accounts[addr]; + // Checks whether the account.addr matches the addr generated from the + // factory. Should never happen, but could be a possible attack vector. + const isInvalidAddress = getCreate2Address(factoryAddr, salt, keccak256(bytecode)).toLowerCase() !== + addr.toLowerCase(); + if (isInvalidAddress) { + const message = `The address ${addr} can't be verified to be a smart account address.`; + this.emitError({ level: 'minor', message, error: new Error(message) }); + return []; + } + const existingAccount = this.#accounts.accounts.find((acc) => acc.addr === addr); + return [ + { + account: { + addr, + associatedKeys: Object.keys(associatedKeys), + initialPrivileges: data.accounts[addr].initialPrivilegesAddrs.map((address) => [ + address, + // this is a default privilege hex we add on account creation + '0x0000000000000000000000000000000000000000000000000000000000000001' + ]), + creation: { + factoryAddr, + bytecode, + salt + }, + preferences: { + label: existingAccount?.preferences.label || DEFAULT_ACCOUNT_LABEL, + pfp: existingAccount?.preferences?.pfp || addr + } + }, + isLinked: true + } + ]; + }); + const linkedAccountsWithNetworks = await this.#getAccountsUsedOnNetworks({ + accounts: linkedAccounts + }); + this.#linkedAccounts = linkedAccountsWithNetworks; + this.#verifyLinkedAccounts(); + this.linkedAccountsLoading = false; + this.emitUpdate(); + } + /** + * The corresponding derived account for the linked accounts should always be found, + * except when something is wrong with the data we have stored on the Relayer. + * Also, could be an attack vector. So indicate to the user that something is wrong. + */ + #verifyLinkedAccounts() { + this.#linkedAccounts.forEach((linkedAcc) => { + const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) => linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)); + // The `correspondingDerivedAccount` should always be found, + // except something is wrong with the data we have stored on the Relayer + if (!correspondingDerivedAccount) { + this.emitError({ + level: 'major', + message: `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}. Please start the process again. If the problem persists, contact support.`, + error: new Error(`Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}.`) + }); + } + }); + } + #throwNotInitialized() { + this.emitError({ + level: 'major', + message: 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.', + error: new Error('accountAdder: requested a method of the AccountAdder controller, but the controller was not initialized') + }); + } + #throwMissingKeyIterator() { + this.emitError({ + level: 'major', + message: 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.', + error: new Error('accountAdder: missing keyIterator') + }); + } + #throwMissingKeyIteratorRetrieveInternalKeysMethod() { + this.emitError({ + level: 'major', + message: 'Retrieving internal keys failed. Please try to start the process of selecting accounts again. If the problem persist, please contact support.', + error: new Error('accountAdder: missing retrieveInternalKeys method') + }); + } + #throwMissingHdPath() { + this.emitError({ + level: 'major', + message: 'The HD path template is missing. Please try to start the process of selecting accounts again. If the problem persist, please contact support.', + error: new Error('accountAdder: missing hdPathTemplate') + }); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + // includes the getter in the stringified instance + accountsOnPage: this.accountsOnPage, + type: this.type, + subType: this.subType, + isPageLocked: this.isPageLocked + }; + } +} +export default AccountAdderController; +//# sourceMappingURL=accountAdder.js.map \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.js.map b/dist/src/controllers/accountAdder/accountAdder.js.map new file mode 100644 index 000000000..25fdc47d4 --- /dev/null +++ b/dist/src/controllers/accountAdder/accountAdder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/controllers/accountAdder/accountAdder.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCreate2Address, keccak256 } from 'ethers'\n\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport {\n Account,\n AccountOnchainState,\n AccountOnPage,\n AccountWithNetworkMeta,\n DerivedAccount,\n DerivedAccountWithoutNetworkMeta,\n SelectedAccountForImport\n} from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { dedicatedToOneSAPriv, ReadyToAddKeys } from '../../interfaces/keystore'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport {\n getAccountImportStatus,\n getBasicAccount,\n getDefaultAccountPreferences,\n getEmailAccount,\n getSmartAccount,\n isAmbireV1LinkedAccount,\n isDerivedForSmartAccountKeyOnly,\n isSmartAccount\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_PAGE = 1\nexport const DEFAULT_PAGE_SIZE = 5\nconst DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS = true\nconst DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true\n\n/**\n * Account Adder Controller\n * is responsible for listing accounts that can be selected for adding, and for\n * adding (creating) identity for the smart accounts (if needed) on the Relayer.\n * It uses a KeyIterator interface allow iterating all the keys in a specific\n * underlying store such as a hardware device or an object holding a seed.\n */\nexport class AccountAdderController extends EventEmitter {\n #callRelayer: Function\n\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n #keyIterator?: KeyIterator | null\n\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n\n isInitialized: boolean = false\n\n isInitializedWithSavedSeed: boolean = false\n\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n /* This is only the index of the current page */\n page: number = DEFAULT_PAGE\n\n /* The number of accounts to be displayed on a single page */\n pageSize: number = DEFAULT_PAGE_SIZE\n\n /* State to indicate the page requested fails to load (and the reason why) */\n pageError: null | string = null\n\n selectedAccounts: SelectedAccountForImport[] = []\n\n // Accounts which identity is created on the Relayer (if needed), and are ready\n // to be added to the user's account list by the Main Controller\n readyToAddAccounts: Account[] = []\n\n // The keys for the `readyToAddAccounts`, that are ready to be added to the\n // user's keystore by the Main Controller\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n\n // Identity for the smart accounts must be created on the Relayer, this\n // represents the status of the operation, needed managing UI state\n addAccountsStatus: 'LOADING' | 'SUCCESS' | 'INITIAL' = 'INITIAL'\n\n accountsLoading: boolean = false\n\n linkedAccountsLoading: boolean = false\n\n networksWithAccountStateError: NetworkId[] = []\n\n #derivedAccounts: DerivedAccount[] = []\n\n #linkedAccounts: { account: AccountWithNetworkMeta; isLinked: boolean }[] = []\n\n // This prevents the recalculation of getters that use accounts during the execution of addAccounts.\n // Without this, the controller incorrectly identifies newly added accounts as those from a previous session,\n // leading to unpredictable behavior on the AccountAdderScreen\n #alreadyImportedAccountsOnControllerInit: Account[] = []\n\n constructor({\n accounts,\n keystore,\n networks,\n providers,\n relayerUrl,\n fetch\n }: {\n accounts: AccountsController\n keystore: KeystoreController\n networks: NetworksController\n providers: ProvidersController\n relayerUrl: string\n fetch: Fetch\n }) {\n super()\n this.#accounts = accounts\n this.#keystore = keystore\n this.#networks = networks\n this.#providers = providers\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n get accountsOnPage(): AccountOnPage[] {\n const processedAccounts = this.#derivedAccounts\n // The displayed (visible) accounts on page should not include the derived\n // EOA (basic) accounts only used as smart account keys, they should not\n // be visible nor importable (or selectable).\n .filter((x) => !isDerivedForSmartAccountKeyOnly(x.index))\n .flatMap((derivedAccount) => {\n const associatedLinkedAccounts = this.#linkedAccounts.filter(\n (linkedAcc) =>\n !isSmartAccount(derivedAccount.account) &&\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n const correspondingSmartAccount = this.#derivedAccounts.find(\n (acc) => isSmartAccount(acc.account) && acc.slot === derivedAccount.slot\n )\n\n let accountsToReturn: Omit[] = []\n\n if (!isSmartAccount(derivedAccount.account)) {\n accountsToReturn.push(derivedAccount)\n\n const duplicate = associatedLinkedAccounts.find(\n (linkedAcc) => linkedAcc.account.addr === correspondingSmartAccount?.account?.addr\n )\n\n // The derived smart account that matches the relayer's linked account\n // should not be displayed as linked account. Use this cycle to mark it.\n if (duplicate) duplicate.isLinked = false\n\n if (!duplicate && correspondingSmartAccount) {\n accountsToReturn.push(correspondingSmartAccount)\n }\n }\n\n accountsToReturn = accountsToReturn.concat(\n associatedLinkedAccounts.map((linkedAcc) => ({\n ...linkedAcc,\n slot: derivedAccount.slot,\n index: derivedAccount.index\n }))\n )\n\n return accountsToReturn\n })\n\n const unprocessedLinkedAccounts = this.#linkedAccounts\n .filter(\n (linkedAcc) =>\n !processedAccounts.find(\n (processedAcc) => processedAcc?.account.addr === linkedAcc.account.addr\n )\n )\n // Use `flatMap` instead of `map` in order to auto remove missing values.\n // The `flatMap` has a built-in mechanism to flatten the array and remove\n // null or undefined values (by returning empty array).\n .flatMap((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found, except when\n // something is wrong with the data we have stored on the Relayer.\n // The this.#verifyLinkedAndDerivedAccounts() method should have\n // already emitted an error in that case. Do not emit here, since\n // this is a getter method (and emitting here is a no-go).\n if (!correspondingDerivedAccount) return []\n\n return [\n {\n ...linkedAcc,\n slot: correspondingDerivedAccount.slot,\n index: correspondingDerivedAccount.index\n }\n ]\n })\n\n const mergedAccounts = [...processedAccounts, ...unprocessedLinkedAccounts]\n\n mergedAccounts.sort((a, b) => {\n const prioritizeAccountType = (item: any) => {\n if (!isSmartAccount(item.account)) return -1\n if (item.isLinked) return 1\n\n return 0\n }\n\n return prioritizeAccountType(a) - prioritizeAccountType(b) || a.slot - b.slot\n })\n\n return mergedAccounts.map((acc) => ({\n ...acc,\n importStatus: getAccountImportStatus({\n account: acc.account,\n alreadyImportedAccounts: this.#alreadyImportedAccountsOnControllerInit,\n keys: this.#keystore.keys,\n accountsOnPage: mergedAccounts,\n keyIteratorType: this.#keyIterator?.type\n })\n }))\n }\n\n async #isKeyIteratorInitializedWithTheSavedSeed() {\n if (this.#keyIterator?.subType !== 'seed') return false\n\n if (!this.#keystore.hasKeystoreSavedSeed) return false\n\n const savedSeed = await this.#keystore.getSavedSeed()\n if (!savedSeed) return false\n\n return !!this.#keyIterator?.isSeedMatching?.(savedSeed.seed)\n }\n\n async #getInitialHdPathTemplate(defaultHdPathTemplate: HD_PATH_TEMPLATE_TYPE) {\n if (!this.isInitializedWithSavedSeed) return defaultHdPathTemplate\n\n const savedSeed = await this.#keystore.getSavedSeed()\n return savedSeed.hdPathTemplate || defaultHdPathTemplate\n }\n\n async init({\n keyIterator,\n page,\n pageSize,\n hdPathTemplate,\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS,\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n }: {\n keyIterator: KeyIterator | null\n page?: number\n pageSize?: number\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n shouldSearchForLinkedAccounts?: boolean\n shouldGetAccountsUsedOnNetworks?: boolean\n }) {\n this.#keyIterator = keyIterator\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page || DEFAULT_PAGE\n this.pageSize = pageSize || DEFAULT_PAGE_SIZE\n this.isInitializedWithSavedSeed = await this.#isKeyIteratorInitializedWithTheSavedSeed()\n this.hdPathTemplate = await this.#getInitialHdPathTemplate(hdPathTemplate)\n this.isInitialized = true\n this.#alreadyImportedAccountsOnControllerInit = this.#accounts.accounts\n this.shouldSearchForLinkedAccounts = shouldSearchForLinkedAccounts\n this.shouldGetAccountsUsedOnNetworks = shouldGetAccountsUsedOnNetworks\n\n this.emitUpdate()\n }\n\n get type() {\n return this.#keyIterator?.type\n }\n\n get subType() {\n return this.#keyIterator?.subType\n }\n\n reset() {\n this.#keyIterator = null\n this.selectedAccounts = []\n this.page = DEFAULT_PAGE\n this.pageSize = DEFAULT_PAGE_SIZE\n this.hdPathTemplate = undefined\n this.shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n this.shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n this.addAccountsStatus = 'INITIAL'\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.readyToAddAccounts = []\n this.networksWithAccountStateError = []\n this.readyToAddKeys = { internal: [], external: [] }\n this.isInitialized = false\n this.isInitializedWithSavedSeed = false\n\n this.emitUpdate()\n }\n\n async setHDPathTemplate({ hdPathTemplate }: { hdPathTemplate: HD_PATH_TEMPLATE_TYPE }) {\n this.hdPathTemplate = hdPathTemplate\n\n // Reset the currently selected accounts, because for the keys of these\n // accounts, as of v4.32.0, we don't store their hd path. When import\n // completes, only the latest hd path of the controller is stored.\n this.selectedAccounts = []\n\n await this.setPage({ page: DEFAULT_PAGE }) // takes the user back on the first page\n }\n\n #getAccountKeys(account: Account, accountsOnPageWithThisAcc: AccountOnPage[]) {\n // should never happen\n if (accountsOnPageWithThisAcc.length === 0) {\n console.error(`accountAdder: account ${account.addr} was not found in the accountsOnPage.`)\n return []\n }\n\n // Case 1: The account is a Basic account\n const isBasicAcc = !isSmartAccount(account)\n // The key of the Basic account is the basic account itself\n if (isBasicAcc) return accountsOnPageWithThisAcc\n\n // Case 2: The account is a Smart account, but not a linked one\n const isSmartAccountAndNotLinked =\n isSmartAccount(account) &&\n accountsOnPageWithThisAcc.length === 1 &&\n accountsOnPageWithThisAcc[0].isLinked === false\n\n if (isSmartAccountAndNotLinked) {\n // The key of the smart account is the Basic account on the same slot\n // that is explicitly derived for a smart account key only.\n const basicAccOnThisSlotDerivedForSmartAccKey = this.#derivedAccounts.find(\n (a) =>\n a.slot === accountsOnPageWithThisAcc[0].slot &&\n !isSmartAccount(a.account) &&\n isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlotDerivedForSmartAccKey\n ? [basicAccOnThisSlotDerivedForSmartAccKey]\n : []\n }\n\n // Case 3: The account is a Smart account and a linked one. For this case,\n // there could exist multiple keys (basic accounts) found on different slots.\n const basicAccOnEverySlotWhereThisAddrIsFound = accountsOnPageWithThisAcc\n .map((a) => a.slot)\n .flatMap((slot) => {\n const basicAccOnThisSlot = this.#derivedAccounts.find(\n (a) =>\n a.slot === slot &&\n !isSmartAccount(a.account) &&\n // The key of the linked account is always the EOA (basic) account\n // on the same slot that is not explicitly used for smart account keys only.\n !isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlot ? [basicAccOnThisSlot] : []\n })\n\n return basicAccOnEverySlotWhereThisAddrIsFound\n }\n\n selectAccount(_account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n // Needed, because linked accounts could have multiple keys (basic accounts),\n // and therefore - same linked account could be found on different slots.\n const accountsOnPageWithThisAcc = this.accountsOnPage.filter(\n (accOnPage) => accOnPage.account.addr === _account.addr\n )\n const accountKeys = this.#getAccountKeys(_account, accountsOnPageWithThisAcc)\n if (!accountKeys.length)\n return this.emitError({\n level: 'major',\n message: `Selecting ${_account.addr} account failed because the details for this account are missing. Please try again or contact support if the problem persists.`,\n error: new Error(\n `Trying to select ${_account.addr} account, but this account was not found in the accountsOnPage or it's keys were not found.`\n )\n })\n\n const nextSelectedAccount = {\n account: _account,\n // If the account has more than 1 key, it is for sure linked account,\n // since Basic accounts have only 1 key and smart accounts with more than\n // one key present should always be found as linked accounts anyways.\n isLinked: accountKeys.length > 1,\n accountKeys: accountKeys.map((a) => ({\n addr: a.account.addr,\n slot: a.slot,\n index: a.index\n }))\n }\n\n const accountExists = this.selectedAccounts.some(\n (x) => x.account.addr === nextSelectedAccount.account.addr\n )\n if (accountExists) {\n // If the account exists, replace it with the new one, to make sure\n // the latest data is used. We could add one more sub-step to skip this,\n // if we do a deep comparison, but that would probably be an overkill.\n this.selectedAccounts = this.selectedAccounts.map((x) =>\n x.account.addr === nextSelectedAccount.account.addr ? nextSelectedAccount : x\n )\n } else {\n this.selectedAccounts.push(nextSelectedAccount)\n }\n\n this.emitUpdate()\n }\n\n deselectAccount(account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const accIdx = this.selectedAccounts.findIndex((x) => x.account.addr === account.addr)\n\n if (accIdx !== -1) {\n this.selectedAccounts = this.selectedAccounts.filter((_, i) => i !== accIdx)\n this.emitUpdate()\n } else {\n return this.emitError({\n level: 'major',\n message: 'This account cannot be deselected. Please reload and try again.',\n error: new Error('accountAdder: account not found. Cannot deselect.')\n })\n }\n }\n\n /**\n * For internal keys only! Returns the ready to be added internal (private)\n * keys of the currently selected accounts.\n */\n retrieveInternalKeysOfSelectedAccounts() {\n if (!this.hdPathTemplate) {\n this.#throwMissingHdPath()\n return []\n }\n\n if (!this.#keyIterator?.retrieveInternalKeys) {\n this.#throwMissingKeyIteratorRetrieveInternalKeysMethod()\n return []\n }\n\n return this.#keyIterator?.retrieveInternalKeys(\n this.selectedAccounts,\n this.hdPathTemplate,\n this.#keystore.keys\n )\n }\n\n /**\n * Prevents requesting the next page before the current one is fully loaded.\n * This avoids race conditions where the user requests the next page before\n * linked accounts are fully loaded, causing misleadingly failing `#verifyLinkedAccounts` checks.\n */\n get isPageLocked() {\n return this.accountsLoading || this.linkedAccountsLoading\n }\n\n async setPage({ page = this.page }: { page: number }): Promise {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page\n this.pageError = null\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.accountsLoading = true\n this.networksWithAccountStateError = []\n this.emitUpdate()\n\n if (page <= 0) {\n this.pageError = `Unexpected page was requested (page ${page}). Please try again or contact support for help.`\n this.page = DEFAULT_PAGE // fallback to the default (initial) page\n this.emitUpdate()\n return\n }\n\n try {\n this.#derivedAccounts = await this.#deriveAccounts()\n\n if (this.#keyIterator?.type === 'internal' && this.#keyIterator?.subType === 'private-key') {\n const accountsOnPageWithoutTheLinked = this.accountsOnPage.filter((acc) => !acc.isLinked)\n const usedAccounts = accountsOnPageWithoutTheLinked.filter(\n (acc) => acc.account.usedOnNetworks.length\n )\n\n // If at least one account is used - preselect all accounts on the page\n // (except the linked ones). Usually there are are two accounts\n // (since the private key flow gas `pageSize` of 1)\n if (usedAccounts.length) {\n accountsOnPageWithoutTheLinked.forEach((acc) => this.selectAccount(acc.account))\n }\n }\n } catch (e: any) {\n const fallbackMessage = `Failed to retrieve accounts on page ${this.page}. Please try again or contact support for assistance. Error details: ${e?.message}.`\n this.pageError = e instanceof ExternalSignerError ? e.message : fallbackMessage\n }\n this.accountsLoading = false\n this.emitUpdate()\n\n await this.#findAndSetLinkedAccounts({\n accounts: this.#derivedAccounts\n .filter(\n (acc) =>\n // Search for linked accounts to the basic (EOA) accounts only.\n // Searching for linked accounts to another Ambire smart accounts\n // is a feature that Ambire is yet to support.\n !isSmartAccount(acc.account) &&\n // Skip searching for linked accounts to the derived EOA (basic)\n // accounts that are used for smart account keys only. They are\n // solely purposed to manage 1 particular (smart) account,\n // not at all for linking.\n !isDerivedForSmartAccountKeyOnly(acc.index)\n )\n .map((acc) => acc.account)\n })\n }\n\n /**\n * Triggers the process of adding accounts via the AccountAdder flow by\n * creating identity for the smart accounts (if needed) on the Relayer.\n * Then the `onAccountAdderSuccess` listener in the Main Controller gets\n * triggered, which uses the `readyToAdd...` properties to further set\n * the newly added accounts data (like preferences, keys and others)\n */\n async addAccounts(\n accounts: SelectedAccountForImport[] = [],\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n ) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n if (!accounts.length) {\n return this.emitError({\n level: 'minor',\n message:\n 'Trying to add accounts, but no accounts are selected. Please select at least one account.',\n error: new Error(\n 'accountAdder: requested method `addAccounts`, but the accounts param is empty'\n )\n })\n }\n\n this.addAccountsStatus = 'LOADING'\n await this.forceEmitUpdate()\n\n let newlyCreatedAccounts: Account['addr'][] = []\n const accountsToAddOnRelayer: SelectedAccountForImport[] = accounts\n // Identity only for the smart accounts must be created on the Relayer\n .filter((x) => isSmartAccount(x.account))\n // Skip creating identity for Ambire v1 smart accounts\n .filter((x) => !isAmbireV1LinkedAccount(x.account.creation?.factoryAddr))\n\n if (accountsToAddOnRelayer.length) {\n const body = accountsToAddOnRelayer.map(({ account }: SelectedAccountForImport) => ({\n addr: account.addr,\n ...(account.email ? { email: account.email } : {}),\n associatedKeys: account.initialPrivileges,\n creation: {\n factoryAddr: account.creation!.factoryAddr,\n salt: account.creation!.salt,\n baseIdentityAddr: PROXY_AMBIRE_ACCOUNT\n }\n }))\n\n try {\n const res = await this.#callRelayer('/v2/identity/create-multiple', 'POST', {\n accounts: body\n })\n\n if (!res.success) {\n throw new Error(res?.message || 'No response received from the Ambire Relayer.')\n }\n\n type AccResType = {\n identity: string\n status: {\n created: boolean\n reason?: string\n }\n }\n\n type BodyType = AccResType[]\n if (res.body) {\n newlyCreatedAccounts = (res.body as BodyType)\n .filter((acc: AccResType) => acc.status.created)\n .map((acc: AccResType) => acc.identity)\n }\n } catch (e: any) {\n this.emitError({\n level: 'major',\n message:\n 'Error when adding accounts on the Ambire Relayer. Please try again later or contact support if the problem persists.',\n error: new Error(e?.message)\n })\n\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n return\n }\n }\n\n this.readyToAddAccounts = [\n ...accounts.map((x, i) => {\n const alreadyImportedAcc = this.#accounts.accounts.find((a) => a.addr === x.account.addr)\n\n return {\n ...x.account,\n // Persist the already imported account preferences on purpose, otherwise,\n // re-importing the same account via different key type(s) would reset them.\n preferences: alreadyImportedAcc\n ? alreadyImportedAcc.preferences\n : getDefaultAccountPreferences(x.account.addr, this.#accounts.accounts, i),\n newlyCreated: newlyCreatedAccounts.includes(x.account.addr)\n }\n })\n ]\n this.readyToAddKeys = readyToAddKeys\n this.addAccountsStatus = 'SUCCESS'\n await this.forceEmitUpdate()\n\n // reset the addAccountsStatus in the next tick to ensure the FE receives the 'SUCCESS' state\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n async createAndAddEmailAccount(selectedAccount: SelectedAccountForImport) {\n const {\n account: { email },\n accountKeys: [recoveryKey]\n } = selectedAccount\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const keyPublicAddress: string = (await this.#keyIterator.retrieve([{ from: 0, to: 1 }]))[0]\n\n const emailSmartAccount = await getEmailAccount(\n {\n emailFrom: email!,\n secondaryKey: recoveryKey.addr\n },\n keyPublicAddress\n )\n\n await this.addAccounts([{ ...selectedAccount, account: { ...emailSmartAccount, email } }])\n }\n\n // updates the account adder state so the main ctrl receives the readyToAddAccounts\n // that should be added to the storage of the app\n async addExistingEmailAccounts(accounts: Account[]) {\n // There is no need to call the addAccounts method in order to add that\n // account to the relayer because this func will be called only for accounts returned\n // from relayer that only need to be stored in the storage of the app\n this.readyToAddAccounts = accounts\n this.addAccountsStatus = 'SUCCESS'\n this.emitUpdate()\n }\n\n removeNetworkData(id: Network['id']) {\n this.networksWithAccountStateError = this.networksWithAccountStateError.filter((x) => x !== id)\n this.emitUpdate()\n }\n\n async #deriveAccounts(): Promise {\n // Should never happen, because before the #deriveAccounts method gets\n // called - there is a check if the #keyIterator exists.\n if (!this.#keyIterator) {\n console.error('accountAdder: missing keyIterator')\n return []\n }\n\n const accounts: DerivedAccountWithoutNetworkMeta[] = []\n\n const startIdx = (this.page - 1) * this.pageSize\n const endIdx = (this.page - 1) * this.pageSize + (this.pageSize - 1)\n\n const indicesToRetrieve = [\n { from: startIdx, to: endIdx } // Indices for the basic (EOA) accounts\n ]\n // Since v4.31.0, do not retrieve smart accounts for the private key\n // type. That's because we can't use the common derivation offset\n // (SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET), and deriving smart\n // accounts out of the private key (with another approach - salt and\n // extra entropy) was creating confusion.\n const shouldRetrieveSmartAccountIndices = this.#keyIterator.type !== 'private-key'\n if (shouldRetrieveSmartAccountIndices) {\n // Indices for the smart accounts.\n indicesToRetrieve.push({\n from: startIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET,\n to: endIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n })\n }\n // Combine the requests for all accounts in one call to the keyIterator.\n // That's optimization primarily focused on hardware wallets, to reduce the\n // number of calls to the hardware device. This is important, especially\n // for Trezor, because it fires a confirmation popup for each call.\n const combinedBasicAndSmartAccKeys = await this.#keyIterator.retrieve(\n indicesToRetrieve,\n this.hdPathTemplate\n )\n\n const basicAccKeys = combinedBasicAndSmartAccKeys.slice(0, this.pageSize)\n const smartAccKeys = combinedBasicAndSmartAccKeys.slice(\n this.pageSize,\n combinedBasicAndSmartAccKeys.length\n )\n\n const smartAccountsPromises: Promise[] = []\n // Replace the parallel getKeys with foreach to prevent issues with Ledger,\n // which can only handle one request at a time.\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, smartAccKey] of smartAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The derived EOA (basic) account which is the key for the smart account\n const account = getBasicAccount(smartAccKey, this.#accounts.accounts)\n const indexWithOffset = slot - 1 + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n accounts.push({ account, isLinked: false, slot, index: indexWithOffset })\n\n // Derive the Ambire (smart) account\n smartAccountsPromises.push(\n getSmartAccount(\n [{ addr: smartAccKey, hash: dedicatedToOneSAPriv }],\n this.#accounts.accounts\n )\n .then((smartAccount) => {\n return { account: smartAccount, isLinked: false, slot, index: slot - 1 }\n })\n // If the error isn't caught here and the promise is rejected, Promise.all\n // will be rejected entirely.\n .catch(() => {\n // No need for emitting an error here, because a relevant error is already\n // emitted in the method #getAccountsUsedOnNetworks\n return null\n })\n )\n }\n\n const unfilteredSmartAccountsList = await Promise.all(smartAccountsPromises)\n const smartAccounts = unfilteredSmartAccountsList.filter(\n (x) => x !== null\n ) as DerivedAccountWithoutNetworkMeta[]\n\n accounts.push(...smartAccounts)\n\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, basicAccKey] of basicAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The EOA (basic) account on this slot\n const account = getBasicAccount(basicAccKey, this.#accounts.accounts)\n accounts.push({ account, isLinked: false, slot, index: slot - 1 })\n }\n\n const accountsWithNetworks = await this.#getAccountsUsedOnNetworks({ accounts })\n\n return accountsWithNetworks\n }\n\n // inner func\n // eslint-disable-next-line class-methods-use-this\n async #getAccountsUsedOnNetworks({\n accounts\n }: {\n accounts: DerivedAccountWithoutNetworkMeta[]\n }): Promise {\n if (!this.shouldGetAccountsUsedOnNetworks) {\n return accounts.map((a) => ({ ...a, account: { ...a.account, usedOnNetworks: [] } }))\n }\n\n const accountsObj: { [key: Account['addr']]: DerivedAccount } = Object.fromEntries(\n accounts.map((a) => [a.account.addr, { ...a, account: { ...a.account, usedOnNetworks: [] } }])\n )\n\n const networkLookup: { [key: NetworkId]: Network } = {}\n this.#networks.networks.forEach((network) => {\n networkLookup[network.id] = network\n })\n\n const promises = Object.keys(this.#providers.providers).map(async (providerKey: NetworkId) => {\n const network = networkLookup[providerKey]\n if (network) {\n const accountState = await getAccountState(\n this.#providers.providers[providerKey],\n network,\n accounts.map((acc) => acc.account)\n ).catch(() => {\n console.error('accountAdder: failed to get account state on ', providerKey)\n if (this.networksWithAccountStateError.includes(providerKey)) return\n this.networksWithAccountStateError.push(providerKey)\n })\n\n if (!accountState) return\n\n accountState.forEach((acc: AccountOnchainState) => {\n const isUsedOnThisNetwork =\n // Known limitation: checks only the native token balance. If this\n // account has any other tokens than native ones, this check will\n // fail to detect that the account was used on this network.\n acc.balance > BigInt(0) ||\n (acc.isEOA\n ? acc.nonce > BigInt(0)\n : // For smart accounts, check for 'isDeployed' instead because in\n // the erc-4337 scenario many cases might be missed with checking\n // the `acc.nonce`. For instance, `acc.nonce` could be 0, but user\n // might be actively using the account. This is because in erc-4337,\n // we use the entry point nonce. However, detecting the entry point\n // nonce is also not okay, because for various cases we do not use\n // sequential nonce - i.e., the entry point nonce could still be 0,\n // but the account is deployed. So the 'isDeployed' check is the\n // only reliable way to detect if account is used on network.\n acc.isDeployed)\n if (isUsedOnThisNetwork) {\n accountsObj[acc.accountAddr].account.usedOnNetworks.push(network)\n }\n })\n }\n })\n\n await Promise.all(promises)\n\n const finalAccountsWithNetworksArray = Object.values(accountsObj)\n\n // Preserve the original order of networks based on usedOnNetworks\n const sortedAccountsWithNetworksArray = finalAccountsWithNetworksArray.sort((a, b) => {\n const networkIdsA = a.account.usedOnNetworks.map((network) => network.id)\n const networkIdsB = b.account.usedOnNetworks.map((network) => network.id)\n const networkIndexA = this.#networks.networks.findIndex((network) =>\n networkIdsA.includes(network.id)\n )\n const networkIndexB = this.#networks.networks.findIndex((network) =>\n networkIdsB.includes(network.id)\n )\n return networkIndexA - networkIndexB\n })\n\n return sortedAccountsWithNetworksArray\n }\n\n async #findAndSetLinkedAccounts({ accounts }: { accounts: Account[] }) {\n if (!this.shouldSearchForLinkedAccounts) return\n\n if (accounts.length === 0) return\n\n this.linkedAccountsLoading = true\n this.emitUpdate()\n\n const keys = accounts.map((acc) => `keys[]=${acc.addr}`).join('&')\n const url = `/v2/account-by-key/linked/accounts?${keys}`\n\n const { data } = await this.#callRelayer(url)\n const linkedAccounts: { account: Account; isLinked: boolean }[] = Object.keys(\n data.accounts\n ).flatMap((addr: string) => {\n // In extremely rare cases, on the Relayer, the identity data could be\n // missing in the identities table but could exist in the logs table.\n // When this happens, the account data will be `null`.\n const isIdentityDataMissing = !data.accounts[addr]\n if (isIdentityDataMissing) {\n // Same error for both cases, because most prob\n this.emitError({\n level: 'minor',\n message: `The address ${addr} is not linked to an Ambire account. Please try again later or contact support if the problem persists.`,\n error: new Error(\n `The address ${addr} is not linked to an Ambire account. This could be because the identity data is missing in the identities table but could exist in the logs table.`\n )\n })\n\n return []\n }\n\n const { factoryAddr, bytecode, salt, associatedKeys } = data.accounts[addr]\n // Checks whether the account.addr matches the addr generated from the\n // factory. Should never happen, but could be a possible attack vector.\n const isInvalidAddress =\n getCreate2Address(factoryAddr, salt, keccak256(bytecode)).toLowerCase() !==\n addr.toLowerCase()\n if (isInvalidAddress) {\n const message = `The address ${addr} can't be verified to be a smart account address.`\n this.emitError({ level: 'minor', message, error: new Error(message) })\n\n return []\n }\n\n const existingAccount = this.#accounts.accounts.find((acc) => acc.addr === addr)\n return [\n {\n account: {\n addr,\n associatedKeys: Object.keys(associatedKeys),\n initialPrivileges: data.accounts[addr].initialPrivilegesAddrs.map((address: string) => [\n address,\n // this is a default privilege hex we add on account creation\n '0x0000000000000000000000000000000000000000000000000000000000000001'\n ]),\n creation: {\n factoryAddr,\n bytecode,\n salt\n },\n preferences: {\n label: existingAccount?.preferences.label || DEFAULT_ACCOUNT_LABEL,\n pfp: existingAccount?.preferences?.pfp || addr\n }\n },\n isLinked: true\n }\n ]\n })\n\n const linkedAccountsWithNetworks = await this.#getAccountsUsedOnNetworks({\n accounts: linkedAccounts as any\n })\n\n this.#linkedAccounts = linkedAccountsWithNetworks\n this.#verifyLinkedAccounts()\n\n this.linkedAccountsLoading = false\n this.emitUpdate()\n }\n\n /**\n * The corresponding derived account for the linked accounts should always be found,\n * except when something is wrong with the data we have stored on the Relayer.\n * Also, could be an attack vector. So indicate to the user that something is wrong.\n */\n #verifyLinkedAccounts() {\n this.#linkedAccounts.forEach((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found,\n // except something is wrong with the data we have stored on the Relayer\n if (!correspondingDerivedAccount) {\n this.emitError({\n level: 'major',\n message: `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}. Please start the process again. If the problem persists, contact support.`,\n error: new Error(\n `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}.`\n )\n })\n }\n })\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error(\n 'accountAdder: requested a method of the AccountAdder controller, but the controller was not initialized'\n )\n })\n }\n\n #throwMissingKeyIterator() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error('accountAdder: missing keyIterator')\n })\n }\n\n #throwMissingKeyIteratorRetrieveInternalKeysMethod() {\n this.emitError({\n level: 'major',\n message:\n 'Retrieving internal keys failed. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing retrieveInternalKeys method')\n })\n }\n\n #throwMissingHdPath() {\n this.emitError({\n level: 'major',\n message:\n 'The HD path template is missing. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing hdPathTemplate')\n })\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n // includes the getter in the stringified instance\n accountsOnPage: this.accountsOnPage,\n type: this.type,\n subType: this.subType,\n isPageLocked: this.isPageLocked\n }\n }\n}\n\nexport default AccountAdderController\n"]} \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.d.ts b/dist/src/controllers/accounts/accounts.d.ts new file mode 100644 index 000000000..99a8bb8eb --- /dev/null +++ b/dist/src/controllers/accounts/accounts.d.ts @@ -0,0 +1,36 @@ +import { Account, AccountPreferences, AccountStates } from '../../interfaces/account'; +import { NetworkId } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +declare const STATUS_WRAPPED_METHODS: { + readonly selectAccount: "INITIAL"; + readonly updateAccountPreferences: "INITIAL"; +}; +export declare class AccountsController extends EventEmitter { + #private; + accounts: Account[]; + accountStates: AccountStates; + accountStatesLoadingState: { + [networkId: string]: boolean; + }; + statuses: Statuses; + initialLoadPromise: Promise; + constructor(storage: Storage, providers: ProvidersController, networks: NetworksController, onAddAccounts: (accounts: Account[]) => void, updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void, onAccountStateUpdate: () => void); + updateAccountStates(blockTag?: string | number, networks?: NetworkId[]): Promise; + updateAccountState(accountAddr: Account['addr'], blockTag?: 'pending' | 'latest', networks?: NetworkId[]): Promise; + addAccounts(accounts?: Account[]): Promise; + removeAccountData(address: Account['addr']): Promise; + updateAccountPreferences(accounts: { + addr: string; + preferences: AccountPreferences; + }[]): Promise; + get areAccountStatesLoading(): boolean; + toJSON(): this & { + areAccountStatesLoading: boolean; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=accounts.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.d.ts.map b/dist/src/controllers/accounts/accounts.d.ts.map new file mode 100644 index 000000000..46fb814e8 --- /dev/null +++ b/dist/src/controllers/accounts/accounts.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../src/controllers/accounts/accounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAMlD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,QAAA,MAAM,sBAAsB;;;CAGlB,CAAA;AAEV,qBAAa,kBAAmB,SAAQ,YAAY;;IAOlD,QAAQ,EAAE,OAAO,EAAE,CAAK;IAExB,aAAa,EAAE,aAAa,CAAK;IAEjC,yBAAyB,EAAE;QACzB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;KAC7B,CAAK;IAEN,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;IAShF,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAG/B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,EAC5C,uBAAuB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,EAC3E,oBAAoB,EAAE,MAAM,IAAI;IAuC5B,mBAAmB,CAAC,QAAQ,GAAE,MAAM,GAAG,MAAiB,EAAE,QAAQ,GAAE,SAAS,EAAO;IAIpF,kBAAkB,CACtB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAC5B,QAAQ,GAAE,SAAS,GAAG,QAAmB,EACzC,QAAQ,GAAE,SAAS,EAAO;IA8DtB,WAAW,CAAC,QAAQ,GAAE,OAAO,EAAO;IAyCpC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;IAQ1C,wBAAwB,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,kBAAkB,CAAA;KAAE,EAAE;IAsB5F,IAAI,uBAAuB,YAE1B;IAED,MAAM;;;;CAOP"} \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.js b/dist/src/controllers/accounts/accounts.js new file mode 100644 index 000000000..c84fc0b2b --- /dev/null +++ b/dist/src/controllers/accounts/accounts.js @@ -0,0 +1,168 @@ +import { getAddress, isAddress } from 'ethers'; +import { getUniqueAccountsArray, migrateAccountPreferencesToAccounts } from '../../libs/account/account'; +import { getAccountState } from '../../libs/accountState/accountState'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const STATUS_WRAPPED_METHODS = { + selectAccount: 'INITIAL', + updateAccountPreferences: 'INITIAL' +}; +export class AccountsController extends EventEmitter { + #storage; + #networks; + #providers; + accounts = []; + accountStates = {}; + accountStatesLoadingState = {}; + statuses = STATUS_WRAPPED_METHODS; + #onAddAccounts; + #updateProviderIsWorking; + #onAccountStateUpdate; + // Holds the initial load promise, so that one can wait until it completes + initialLoadPromise; + constructor(storage, providers, networks, onAddAccounts, updateProviderIsWorking, onAccountStateUpdate) { + super(); + this.#storage = storage; + this.#providers = providers; + this.#networks = networks; + this.#onAddAccounts = onAddAccounts; + this.#updateProviderIsWorking = updateProviderIsWorking; + this.#onAccountStateUpdate = onAccountStateUpdate; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.initialLoadPromise = this.#load(); + } + async #load() { + await this.#networks.initialLoadPromise; + await this.#providers.initialLoadPromise; + const [accounts, accountPreferences] = await Promise.all([ + this.#storage.get('accounts', []), + this.#storage.get('accountPreferences', undefined) + ]); + if (accountPreferences) { + this.accounts = getUniqueAccountsArray(migrateAccountPreferencesToAccounts(accountPreferences, accounts)); + await this.#storage.set('accounts', this.accounts); + await this.#storage.remove('accountPreferences'); + } + else { + this.accounts = getUniqueAccountsArray(accounts); + } + // Emit an update before updating account states as the first state update may take some time + this.emitUpdate(); + // Don't await this. Networks should update one by one + // NOTE: YOU MUST USE waitForAccountsCtrlFirstLoad IN TESTS + // TO ENSURE ACCOUNT STATE IS LOADED + this.#updateAccountStates(this.accounts); + } + async updateAccountStates(blockTag = 'latest', networks = []) { + await this.#updateAccountStates(this.accounts, blockTag, networks); + } + async updateAccountState(accountAddr, blockTag = 'latest', networks = []) { + const accountData = this.accounts.find((account) => account.addr === accountAddr); + if (!accountData) + return; + await this.#updateAccountStates([accountData], blockTag, networks); + } + async #updateAccountStates(accounts, blockTag = 'latest', updateOnlyNetworksWithIds = []) { + // if any, update the account state only for the passed networks; else - all + const updateOnlyPassedNetworks = updateOnlyNetworksWithIds.length; + const networksToUpdate = this.#networks.networks.filter((network) => { + if (this.accountStatesLoadingState[network.id]) + return false; + if (!updateOnlyPassedNetworks) + return true; + return updateOnlyNetworksWithIds.includes(network.id); + }); + networksToUpdate.forEach((network) => { + this.accountStatesLoadingState[network.id] = true; + }); + this.emitUpdate(); + await Promise.all(networksToUpdate.map(async (network) => { + try { + const networkAccountStates = await getAccountState(this.#providers.providers[network.id], network, accounts, blockTag); + this.#updateProviderIsWorking(network.id, true); + networkAccountStates.forEach((accountState) => { + const addr = accountState.accountAddr; + if (!this.accountStates[addr]) { + this.accountStates[addr] = {}; + } + this.accountStates[addr][network.id] = accountState; + }); + } + catch (err) { + console.error(`account state update error for ${network.name}: `, err); + this.#updateProviderIsWorking(network.id, false); + } + finally { + this.accountStatesLoadingState[network.id] = false; + } + this.emitUpdate(); + })); + this.#onAccountStateUpdate(); + } + async addAccounts(accounts = []) { + if (!accounts.length) + return; + // eslint-disable-next-line no-param-reassign + accounts = accounts.map((a) => ({ ...a, addr: getAddress(a.addr) })); + const alreadyAddedAddressSet = new Set(this.accounts.map((account) => account.addr)); + const newAccountsNotAddedYet = accounts.filter((acc) => !alreadyAddedAddressSet.has(acc.addr)); + const newAccountsAlreadyAdded = accounts.filter((acc) => alreadyAddedAddressSet.has(acc.addr)); + const nextAccounts = [ + ...this.accounts.map((acc) => ({ + ...acc, + // reset the `newlyCreated` state for all already added accounts + newlyCreated: false, + // reset the `newlyAdded` state for all accounts added on prev sessions + newlyAdded: false, + // Merge the existing and new associated keys for the account (if the + // account was already imported). This ensures up-to-date keys, + // considering changes post-import (associated keys of the smart + // accounts can change) or incomplete initial data (during the initial + // import, not all associated keys could have been fetched (for privacy). + associatedKeys: Array.from(new Set([ + ...acc.associatedKeys, + ...(newAccountsAlreadyAdded.find((x) => x.addr === acc.addr)?.associatedKeys || []) + ])) + })), + ...newAccountsNotAddedYet.map((a) => ({ ...a, newlyAdded: true })) + ]; + this.accounts = getUniqueAccountsArray(nextAccounts); + await this.#storage.set('accounts', this.accounts); + this.#onAddAccounts(accounts); + // update the state of new accounts. Otherwise, the user needs to restart his extension + this.#updateAccountStates(newAccountsNotAddedYet); + this.emitUpdate(); + } + async removeAccountData(address) { + this.accounts = this.accounts.filter((acc) => acc.addr !== address); + delete this.accountStates[address]; + this.#storage.set('accounts', this.accounts); + this.emitUpdate(); + } + async updateAccountPreferences(accounts) { + await this.withStatus('updateAccountPreferences', async () => this.#updateAccountPreferences(accounts), true); + } + async #updateAccountPreferences(accounts) { + this.accounts = this.accounts.map((acc) => { + const account = accounts.find((a) => a.addr === acc.addr); + if (!account) + return acc; + if (isAddress(account.preferences.pfp)) { + account.preferences.pfp = getAddress(account.preferences.pfp); + } + return { ...acc, preferences: account.preferences, newlyAdded: false }; + }); + await this.#storage.set('accounts', this.accounts); + this.emitUpdate(); + } + get areAccountStatesLoading() { + return Object.values(this.accountStatesLoadingState).some((isLoading) => isLoading); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + areAccountStatesLoading: this.areAccountStatesLoading + }; + } +} +//# sourceMappingURL=accounts.js.map \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.js.map b/dist/src/controllers/accounts/accounts.js.map new file mode 100644 index 000000000..51082ef86 --- /dev/null +++ b/dist/src/controllers/accounts/accounts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/controllers/accounts/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAK9C,OAAO,EACL,sBAAsB,EACtB,mCAAmC,EACpC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,YAA0B,MAAM,8BAA8B,CAAA;AAIrE,MAAM,sBAAsB,GAAG;IAC7B,aAAa,EAAE,SAAS;IACxB,wBAAwB,EAAE,SAAS;CAC3B,CAAA;AAEV,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAS;IAEjB,SAAS,CAAoB;IAE7B,UAAU,CAAqB;IAE/B,QAAQ,GAAc,EAAE,CAAA;IAExB,aAAa,GAAkB,EAAE,CAAA;IAEjC,yBAAyB,GAErB,EAAE,CAAA;IAEN,QAAQ,GAAkD,sBAAsB,CAAA;IAEhF,cAAc,CAA+B;IAE7C,wBAAwB,CAAoD;IAE5E,qBAAqB,CAAY;IAEjC,0EAA0E;IAC1E,kBAAkB,CAAe;IAEjC,YACE,OAAgB,EAChB,SAA8B,EAC9B,QAA4B,EAC5B,aAA4C,EAC5C,uBAA2E,EAC3E,oBAAgC;QAEhC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QACnC,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAA;QACvD,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAA;QAEjD,mEAAmE;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAA;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAA;QACxC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC;SACnD,CAAC,CAAA;QACF,IAAI,kBAAkB,EAAE;YACtB,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CACpC,mCAAmC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAClE,CAAA;YACD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;SACjD;aAAM;YACL,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;SACjD;QAED,6FAA6F;QAC7F,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,sDAAsD;QACtD,2DAA2D;QAC3D,oCAAoC;QACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAA4B,QAAQ,EAAE,WAAwB,EAAE;QACxF,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,WAA4B,EAC5B,WAAiC,QAAQ,EACzC,WAAwB,EAAE;QAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;QAEjF,IAAI,CAAC,WAAW;YAAE,OAAM;QAExB,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,QAAmB,EACnB,WAA4B,QAAQ,EACpC,4BAAyC,EAAE;QAE3C,4EAA4E;QAC5E,MAAM,wBAAwB,GAAG,yBAAyB,CAAC,MAAM,CAAA;QACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAClE,IAAI,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC5D,IAAI,CAAC,wBAAwB;gBAAE,OAAO,IAAI,CAAA;YAE1C,OAAO,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;QACnD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,MAAM,OAAO,CAAC,GAAG,CACf,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI;gBACF,MAAM,oBAAoB,GAAG,MAAM,eAAe,CAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EACrC,OAAO,EACP,QAAQ,EACR,QAAQ,CACT,CAAA;gBAED,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBAE/C,oBAAoB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;oBAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAA;oBAErC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;wBAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;qBAC9B;oBAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,YAAY,CAAA;gBACrD,CAAC,CAAC,CAAA;aACH;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,kCAAkC,OAAO,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAA;gBACtE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;aACjD;oBAAS;gBACR,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAA;aACnD;YACD,IAAI,CAAC,UAAU,EAAE,CAAA;QACnB,CAAC,CAAC,CACH,CAAA;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAsB,EAAE;QACxC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAM;QAC5B,6CAA6C;QAC7C,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACpE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9F,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAE9F,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,GAAG;gBACN,gEAAgE;gBAChE,YAAY,EAAE,KAAK;gBACnB,uEAAuE;gBACvE,UAAU,EAAE,KAAK;gBACjB,qEAAqE;gBACrE,+DAA+D;gBAC/D,gEAAgE;gBAChE,sEAAsE;gBACtE,yEAAyE;gBACzE,cAAc,EAAE,KAAK,CAAC,IAAI,CACxB,IAAI,GAAG,CAAC;oBACN,GAAG,GAAG,CAAC,cAAc;oBACrB,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC;iBACpF,CAAC,CACH;aACF,CAAC,CAAC;YACH,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;SACnE,CAAA;QAED,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAA;QACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAElD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QAE7B,uFAAuF;QACvF,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAA;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAwB;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAA;QAEnE,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,QAA6D;QAC1F,MAAM,IAAI,CAAC,UAAU,CACnB,0BAA0B,EAC1B,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EACpD,IAAI,CACL,CAAA;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,QAA6D;QAC3F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,IAAI,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAA;YACxB,IAAI,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;gBACtC,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;aAC9D;YACD,OAAO,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,IAAI,uBAAuB;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAA;IACrF,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;SACtD,CAAA;IACH,CAAC;CACF","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { Account, AccountPreferences, AccountStates } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getUniqueAccountsArray,\n migrateAccountPreferencesToAccounts\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n selectAccount: 'INITIAL',\n updateAccountPreferences: 'INITIAL'\n} as const\n\nexport class AccountsController extends EventEmitter {\n #storage: Storage\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n accounts: Account[] = []\n\n accountStates: AccountStates = {}\n\n accountStatesLoadingState: {\n [networkId: string]: boolean\n } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #onAddAccounts: (accounts: Account[]) => void\n\n #updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void\n\n #onAccountStateUpdate: () => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n providers: ProvidersController,\n networks: NetworksController,\n onAddAccounts: (accounts: Account[]) => void,\n updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void,\n onAccountStateUpdate: () => void\n ) {\n super()\n this.#storage = storage\n this.#providers = providers\n this.#networks = networks\n this.#onAddAccounts = onAddAccounts\n this.#updateProviderIsWorking = updateProviderIsWorking\n this.#onAccountStateUpdate = onAccountStateUpdate\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#providers.initialLoadPromise\n const [accounts, accountPreferences] = await Promise.all([\n this.#storage.get('accounts', []),\n this.#storage.get('accountPreferences', undefined)\n ])\n if (accountPreferences) {\n this.accounts = getUniqueAccountsArray(\n migrateAccountPreferencesToAccounts(accountPreferences, accounts)\n )\n await this.#storage.set('accounts', this.accounts)\n await this.#storage.remove('accountPreferences')\n } else {\n this.accounts = getUniqueAccountsArray(accounts)\n }\n\n // Emit an update before updating account states as the first state update may take some time\n this.emitUpdate()\n // Don't await this. Networks should update one by one\n // NOTE: YOU MUST USE waitForAccountsCtrlFirstLoad IN TESTS\n // TO ENSURE ACCOUNT STATE IS LOADED\n this.#updateAccountStates(this.accounts)\n }\n\n async updateAccountStates(blockTag: string | number = 'latest', networks: NetworkId[] = []) {\n await this.#updateAccountStates(this.accounts, blockTag, networks)\n }\n\n async updateAccountState(\n accountAddr: Account['addr'],\n blockTag: 'pending' | 'latest' = 'latest',\n networks: NetworkId[] = []\n ) {\n const accountData = this.accounts.find((account) => account.addr === accountAddr)\n\n if (!accountData) return\n\n await this.#updateAccountStates([accountData], blockTag, networks)\n }\n\n async #updateAccountStates(\n accounts: Account[],\n blockTag: string | number = 'latest',\n updateOnlyNetworksWithIds: NetworkId[] = []\n ) {\n // if any, update the account state only for the passed networks; else - all\n const updateOnlyPassedNetworks = updateOnlyNetworksWithIds.length\n const networksToUpdate = this.#networks.networks.filter((network) => {\n if (this.accountStatesLoadingState[network.id]) return false\n if (!updateOnlyPassedNetworks) return true\n\n return updateOnlyNetworksWithIds.includes(network.id)\n })\n\n networksToUpdate.forEach((network) => {\n this.accountStatesLoadingState[network.id] = true\n })\n this.emitUpdate()\n\n await Promise.all(\n networksToUpdate.map(async (network) => {\n try {\n const networkAccountStates = await getAccountState(\n this.#providers.providers[network.id],\n network,\n accounts,\n blockTag\n )\n\n this.#updateProviderIsWorking(network.id, true)\n\n networkAccountStates.forEach((accountState) => {\n const addr = accountState.accountAddr\n\n if (!this.accountStates[addr]) {\n this.accountStates[addr] = {}\n }\n\n this.accountStates[addr][network.id] = accountState\n })\n } catch (err) {\n console.error(`account state update error for ${network.name}: `, err)\n this.#updateProviderIsWorking(network.id, false)\n } finally {\n this.accountStatesLoadingState[network.id] = false\n }\n this.emitUpdate()\n })\n )\n\n this.#onAccountStateUpdate()\n }\n\n async addAccounts(accounts: Account[] = []) {\n if (!accounts.length) return\n // eslint-disable-next-line no-param-reassign\n accounts = accounts.map((a) => ({ ...a, addr: getAddress(a.addr) }))\n const alreadyAddedAddressSet = new Set(this.accounts.map((account) => account.addr))\n const newAccountsNotAddedYet = accounts.filter((acc) => !alreadyAddedAddressSet.has(acc.addr))\n const newAccountsAlreadyAdded = accounts.filter((acc) => alreadyAddedAddressSet.has(acc.addr))\n\n const nextAccounts = [\n ...this.accounts.map((acc) => ({\n ...acc,\n // reset the `newlyCreated` state for all already added accounts\n newlyCreated: false,\n // reset the `newlyAdded` state for all accounts added on prev sessions\n newlyAdded: false,\n // Merge the existing and new associated keys for the account (if the\n // account was already imported). This ensures up-to-date keys,\n // considering changes post-import (associated keys of the smart\n // accounts can change) or incomplete initial data (during the initial\n // import, not all associated keys could have been fetched (for privacy).\n associatedKeys: Array.from(\n new Set([\n ...acc.associatedKeys,\n ...(newAccountsAlreadyAdded.find((x) => x.addr === acc.addr)?.associatedKeys || [])\n ])\n )\n })),\n ...newAccountsNotAddedYet.map((a) => ({ ...a, newlyAdded: true }))\n ]\n\n this.accounts = getUniqueAccountsArray(nextAccounts)\n await this.#storage.set('accounts', this.accounts)\n\n this.#onAddAccounts(accounts)\n\n // update the state of new accounts. Otherwise, the user needs to restart his extension\n this.#updateAccountStates(newAccountsNotAddedYet)\n\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n this.accounts = this.accounts.filter((acc) => acc.addr !== address)\n\n delete this.accountStates[address]\n this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n async updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n await this.withStatus(\n 'updateAccountPreferences',\n async () => this.#updateAccountPreferences(accounts),\n true\n )\n }\n\n async #updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n this.accounts = this.accounts.map((acc) => {\n const account = accounts.find((a) => a.addr === acc.addr)\n if (!account) return acc\n if (isAddress(account.preferences.pfp)) {\n account.preferences.pfp = getAddress(account.preferences.pfp)\n }\n return { ...acc, preferences: account.preferences, newlyAdded: false }\n })\n\n await this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n get areAccountStatesLoading() {\n return Object.values(this.accountStatesLoadingState).some((isLoading) => isLoading)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n areAccountStatesLoading: this.areAccountStatesLoading\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.d.ts b/dist/src/controllers/actions/actions.d.ts new file mode 100644 index 000000000..16547e67d --- /dev/null +++ b/dist/src/controllers/actions/actions.d.ts @@ -0,0 +1,63 @@ +import { Account } from '../../interfaces/account'; +import { AccountOpAction, Action, BenzinAction, DappRequestAction, SignMessageAction, SwitchAccountAction } from '../../interfaces/actions'; +import { NotificationManager } from '../../interfaces/notification'; +import { WindowManager, WindowProps } from '../../interfaces/window'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +export type { SwitchAccountAction, Action, AccountOpAction, SignMessageAction, BenzinAction, DappRequestAction }; +export type ActionPosition = 'first' | 'last'; +export type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'; +/** + * The ActionsController is responsible for storing the converted userRequests + * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue + * For most userRequests, there is a corresponding action in the actionsQueue + * containing the details of the userRequest needed for displaying it to the user. + * However, some userRequests can be batched together, resulting in a single action created for multiple requests. + * + * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected, + * or until the user forcefully closes the window using the system close icon (X). + * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen. + */ +export declare class ActionsController extends EventEmitter { + #private; + actionWindow: { + windowProps: WindowProps; + openWindowPromise?: Promise; + focusWindowPromise?: Promise; + loaded: boolean; + pendingMessage: { + message: string; + options?: { + timeout?: number; + type?: 'error' | 'success' | 'info' | 'warning'; + sticky?: boolean; + }; + } | null; + }; + actionsQueue: Action[]; + currentAction: Action | null; + get visibleActionsQueue(): Action[]; + constructor({ selectedAccount, windowManager, notificationManager, onActionWindowClose }: { + selectedAccount: SelectedAccountController; + windowManager: WindowManager; + notificationManager: NotificationManager; + onActionWindowClose: () => void; + }); + addOrUpdateAction(newAction: Action, position?: ActionPosition, executionType?: ActionExecutionType): void; + removeAction(actionId: Action['id'], shouldOpenNextAction?: boolean): void; + setCurrentActionById(actionId: Action['id']): void; + setCurrentActionByIndex(actionIndex: number): void; + sendNewActionMessage(newAction: Action, type: 'queued' | 'updated'): void; + openActionWindow(): Promise; + focusActionWindow(): Promise; + closeActionWindow(): void; + setWindowLoaded(): void; + removeAccountData(address: Account['addr']): void; + get banners(): import("../../interfaces/banner").Banner[]; + toJSON(): this & { + visibleActionsQueue: Action[]; + banners: import("../../interfaces/banner").Banner[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=actions.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.d.ts.map b/dist/src/controllers/actions/actions.d.ts.map new file mode 100644 index 000000000..7ee5149e8 --- /dev/null +++ b/dist/src/controllers/actions/actions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EACL,eAAe,EACf,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAKpE,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAGvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAG9E,YAAY,EACV,mBAAmB,EACnB,MAAM,EACN,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EAClB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAA;AAE7C,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,8BAA8B,GAAG,oBAAoB,CAAA;AAEjG;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;;IAOjD,YAAY,EAAE;QACZ,WAAW,EAAE,WAAW,CAAA;QACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,EAAE,OAAO,CAAA;QACf,cAAc,EAAE;YACd,OAAO,EAAE,MAAM,CAAA;YACf,OAAO,CAAC,EAAE;gBACR,OAAO,CAAC,EAAE,MAAM,CAAA;gBAChB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;gBAC/C,MAAM,CAAC,EAAE,OAAO,CAAA;aACjB,CAAA;SACF,GAAG,IAAI,CAAA;KACT,CAIA;IAED,YAAY,EAAE,MAAM,EAAE,CAAK;IAE3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAInC,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAiBlC;gBAEW,EACV,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACpB,EAAE;QACD,eAAe,EAAE,yBAAyB,CAAA;QAC1C,aAAa,EAAE,aAAa,CAAA;QAC5B,mBAAmB,EAAE,mBAAmB,CAAA;QACxC,mBAAmB,EAAE,MAAM,IAAI,CAAA;KAChC;IAiDD,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,cAAuB,EACjC,aAAa,GAAE,mBAA0C;IA+C3D,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAE,OAAc;IA0BzE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;IAe3C,uBAAuB,CAAC,WAAW,EAAE,MAAM;IAe3C,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS;IAY5D,gBAAgB;IAkBhB,iBAAiB;IAiBvB,iBAAiB;IAKjB,eAAe;IAcf,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;IAqB1C,IAAI,OAAO,+CAEV;IAED,MAAM;;;;;CAQP"} \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.js b/dist/src/controllers/actions/actions.js new file mode 100644 index 000000000..57bfc6782 --- /dev/null +++ b/dist/src/controllers/actions/actions.js @@ -0,0 +1,271 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ +// eslint-disable-next-line import/no-cycle +import { messageOnNewAction } from '../../libs/actions/actions'; +import { getDappActionRequestsBanners } from '../../libs/banners/banners'; +import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'; +import EventEmitter from '../eventEmitter/eventEmitter'; +/** + * The ActionsController is responsible for storing the converted userRequests + * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue + * For most userRequests, there is a corresponding action in the actionsQueue + * containing the details of the userRequest needed for displaying it to the user. + * However, some userRequests can be batched together, resulting in a single action created for multiple requests. + * + * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected, + * or until the user forcefully closes the window using the system close icon (X). + * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen. + */ +export class ActionsController extends EventEmitter { + #selectedAccount; + #windowManager; + #notificationManager; + actionWindow = { + windowProps: null, + loaded: false, + pendingMessage: null + }; + actionsQueue = []; + currentAction = null; + #onActionWindowClose; + get visibleActionsQueue() { + return this.actionsQueue.filter((a) => { + if (a.type === 'accountOp') { + return a.accountOp.accountAddr === this.#selectedAccount.account?.addr; + } + if (a.type === 'signMessage') { + return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr; + } + if (a.type === 'benzin') { + return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr; + } + if (a.type === 'switchAccount') { + return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr; + } + return true; + }); + } + constructor({ selectedAccount, windowManager, notificationManager, onActionWindowClose }) { + super(); + this.#selectedAccount = selectedAccount; + this.#windowManager = windowManager; + this.#notificationManager = notificationManager; + this.#onActionWindowClose = onActionWindowClose; + this.#windowManager.event.on('windowRemoved', async (winId) => { + if (winId === this.actionWindow.windowProps?.id || + (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)) { + this.actionWindow.windowProps = null; + this.actionWindow.loaded = false; + this.actionWindow.pendingMessage = null; + this.currentAction = null; + this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp'); + if (this.visibleActionsQueue.length) { + await this.#notificationManager.create({ + title: this.actionsQueue.length > 1 + ? `${this.actionsQueue.length} transactions queued` + : 'Transaction queued', + message: 'Queued pending transactions are available on your Dashboard.' + }); + } + this.#onActionWindowClose(); + this.emitUpdate(); + } + }); + this.#windowManager.event.on('windowFocusChange', async (winId) => { + if (this.actionWindow.windowProps) { + if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) { + this.actionWindow.windowProps.focused = true; + this.emitUpdate(); + } + else if (this.actionWindow.windowProps.id !== winId && + this.actionWindow.windowProps.focused) { + this.actionWindow.windowProps.focused = false; + this.emitUpdate(); + } + } + }); + } + addOrUpdateAction(newAction, position = 'last', executionType = 'open-action-window') { + // remove the benzin action if a new actions is added + this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin'); + if (this.currentAction && this.currentAction.type === 'benzin') { + this.currentAction = null; + } + const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id); + if (actionIndex !== -1) { + this.actionsQueue[actionIndex] = newAction; + if (executionType !== 'queue') { + let currentAction = null; + if (executionType === 'open-action-window') { + this.sendNewActionMessage(newAction, 'updated'); + currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null; + } + else if (executionType === 'queue-but-open-action-window') { + this.sendNewActionMessage(newAction, 'queued'); + currentAction = this.currentAction || this.visibleActionsQueue[0] || null; + } + this.#setCurrentAction(currentAction); + } + else { + this.emitUpdate(); + } + return; + } + if (position === 'first') { + this.actionsQueue.unshift(newAction); + } + else { + this.actionsQueue.push(newAction); + } + if (executionType !== 'queue') { + let currentAction = null; + if (executionType === 'open-action-window') { + currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null; + } + else if (executionType === 'queue-but-open-action-window') { + this.sendNewActionMessage(newAction, 'queued'); + currentAction = this.currentAction || this.visibleActionsQueue[0] || null; + } + this.#setCurrentAction(currentAction); + } + else { + this.emitUpdate(); + } + } + removeAction(actionId, shouldOpenNextAction = true) { + this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId); + if (shouldOpenNextAction) { + this.#setCurrentAction(this.visibleActionsQueue[0] || null); + } + } + #setCurrentAction(nextAction) { + if (nextAction && nextAction.id === this.currentAction?.id) { + this.openActionWindow(); + this.emitUpdate(); + return; + } + this.currentAction = nextAction; + if (!this.currentAction) { + !!this.actionWindow.windowProps?.id && + this.#windowManager.remove(this.actionWindow.windowProps.id); + } + else { + this.openActionWindow(); + } + this.emitUpdate(); + } + setCurrentActionById(actionId) { + const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString()); + if (!action) { + const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + if (entryPointAction) + this.#setCurrentAction(entryPointAction); + return; + } + this.#setCurrentAction(action); + } + setCurrentActionByIndex(actionIndex) { + const action = this.visibleActionsQueue[actionIndex]; + if (!action) { + const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + if (entryPointAction) + this.#setCurrentAction(entryPointAction); + return; + } + this.#setCurrentAction(action); + } + sendNewActionMessage(newAction, type) { + if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') { + if (this.actionWindow.loaded) { + const message = messageOnNewAction(newAction, type); + if (message) + this.#windowManager.sendWindowToastMessage(message, { type: 'success' }); + } + else { + const message = messageOnNewAction(newAction, type); + if (message) + this.actionWindow.pendingMessage = { message, options: { type: 'success' } }; + } + } + } + async openActionWindow() { + await this.actionWindow.focusWindowPromise; + await this.actionWindow.openWindowPromise; + if (this.actionWindow.windowProps) { + this.focusActionWindow(); + } + else { + try { + this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => { + this.actionWindow.openWindowPromise = undefined; + }); + this.actionWindow.windowProps = await this.actionWindow.openWindowPromise; + this.emitUpdate(); + } + catch (err) { + console.error('Error opening action window:', err); + } + } + } + async focusActionWindow() { + await this.actionWindow.focusWindowPromise; + await this.actionWindow.openWindowPromise; + if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps) + return; + try { + this.actionWindow.focusWindowPromise = this.#windowManager + .focus(this.actionWindow.windowProps) + .finally(() => { + this.actionWindow.focusWindowPromise = undefined; + }); + this.emitUpdate(); + } + catch (err) { + console.error('Error focusing action window:', err); + } + } + closeActionWindow() { + if (!this.actionWindow.windowProps) + return; + this.#windowManager.remove(this.actionWindow.windowProps.id); + } + setWindowLoaded() { + if (!this.actionWindow.windowProps) + return; + this.actionWindow.loaded = true; + if (this.actionWindow.pendingMessage) { + this.#windowManager.sendWindowToastMessage(this.actionWindow.pendingMessage.message, this.actionWindow.pendingMessage.options); + this.actionWindow.pendingMessage = null; + } + this.emitUpdate(); + } + removeAccountData(address) { + this.actionsQueue = this.actionsQueue.filter((a) => { + if (a.type === 'accountOp') { + return a.accountOp.accountAddr !== address; + } + if (a.type === 'signMessage') { + return a.userRequest.meta.accountAddr !== address; + } + if (a.type === 'benzin') { + return a.userRequest.meta.accountAddr !== address; + } + if (a.type === 'switchAccount') { + return a.userRequest.meta.switchToAccountAddr !== address; + } + return true; + }); + this.emitUpdate(); + } + get banners() { + return getDappActionRequestsBanners(this.visibleActionsQueue); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + visibleActionsQueue: this.visibleActionsQueue, + banners: this.banners + }; + } +} +//# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.js.map b/dist/src/controllers/actions/actions.js.map new file mode 100644 index 000000000..c1536ec4e --- /dev/null +++ b/dist/src/controllers/actions/actions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { Account } from '../../interfaces/account'\nimport {\n AccountOpAction,\n Action,\n BenzinAction,\n DappRequestAction,\n SignMessageAction,\n SwitchAccountAction\n} from '../../interfaces/actions'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { WindowManager, WindowProps } from '../../interfaces/window'\n// eslint-disable-next-line import/no-cycle\nimport { messageOnNewAction } from '../../libs/actions/actions'\nimport { getDappActionRequestsBanners } from '../../libs/banners/banners'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n// Kind of inevitable, the AccountsController has SelectedAccountController, which has ActionsController\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\n// TODO: Temporarily. Refactor imports across the codebase to ref /interfaces/actions instead.\nexport type {\n SwitchAccountAction,\n Action,\n AccountOpAction,\n SignMessageAction,\n BenzinAction,\n DappRequestAction\n}\n\nexport type ActionPosition = 'first' | 'last'\n\nexport type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'\n\n/**\n * The ActionsController is responsible for storing the converted userRequests\n * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue\n * For most userRequests, there is a corresponding action in the actionsQueue\n * containing the details of the userRequest needed for displaying it to the user.\n * However, some userRequests can be batched together, resulting in a single action created for multiple requests.\n *\n * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected,\n * or until the user forcefully closes the window using the system close icon (X).\n * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen.\n */\nexport class ActionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n actionWindow: {\n windowProps: WindowProps\n openWindowPromise?: Promise\n focusWindowPromise?: Promise\n loaded: boolean\n pendingMessage: {\n message: string\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n } | null\n } = {\n windowProps: null,\n loaded: false,\n pendingMessage: null\n }\n\n actionsQueue: Action[] = []\n\n currentAction: Action | null = null\n\n #onActionWindowClose: () => void\n\n get visibleActionsQueue(): Action[] {\n return this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr\n }\n\n return true\n })\n }\n\n constructor({\n selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose\n }: {\n selectedAccount: SelectedAccountController\n windowManager: WindowManager\n notificationManager: NotificationManager\n onActionWindowClose: () => void\n }) {\n super()\n\n this.#selectedAccount = selectedAccount\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n this.#onActionWindowClose = onActionWindowClose\n\n this.#windowManager.event.on('windowRemoved', async (winId: number) => {\n if (\n winId === this.actionWindow.windowProps?.id ||\n (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)\n ) {\n this.actionWindow.windowProps = null\n this.actionWindow.loaded = false\n this.actionWindow.pendingMessage = null\n this.currentAction = null\n\n this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp')\n if (this.visibleActionsQueue.length) {\n await this.#notificationManager.create({\n title:\n this.actionsQueue.length > 1\n ? `${this.actionsQueue.length} transactions queued`\n : 'Transaction queued',\n message: 'Queued pending transactions are available on your Dashboard.'\n })\n }\n this.#onActionWindowClose()\n this.emitUpdate()\n }\n })\n\n this.#windowManager.event.on('windowFocusChange', async (winId: number) => {\n if (this.actionWindow.windowProps) {\n if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) {\n this.actionWindow.windowProps.focused = true\n this.emitUpdate()\n } else if (\n this.actionWindow.windowProps.id !== winId &&\n this.actionWindow.windowProps.focused\n ) {\n this.actionWindow.windowProps.focused = false\n this.emitUpdate()\n }\n }\n })\n }\n\n addOrUpdateAction(\n newAction: Action,\n position: ActionPosition = 'last',\n executionType: ActionExecutionType = 'open-action-window'\n ) {\n // remove the benzin action if a new actions is added\n this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin')\n if (this.currentAction && this.currentAction.type === 'benzin') {\n this.currentAction = null\n }\n\n const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id)\n if (actionIndex !== -1) {\n this.actionsQueue[actionIndex] = newAction\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n this.sendNewActionMessage(newAction, 'updated')\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n return\n }\n\n if (position === 'first') {\n this.actionsQueue.unshift(newAction)\n } else {\n this.actionsQueue.push(newAction)\n }\n\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n }\n\n removeAction(actionId: Action['id'], shouldOpenNextAction: boolean = true) {\n this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId)\n if (shouldOpenNextAction) {\n this.#setCurrentAction(this.visibleActionsQueue[0] || null)\n }\n }\n\n #setCurrentAction(nextAction: Action | null) {\n if (nextAction && nextAction.id === this.currentAction?.id) {\n this.openActionWindow()\n this.emitUpdate()\n return\n }\n\n this.currentAction = nextAction\n\n if (!this.currentAction) {\n !!this.actionWindow.windowProps?.id &&\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n } else {\n this.openActionWindow()\n }\n\n this.emitUpdate()\n }\n\n setCurrentActionById(actionId: Action['id']) {\n const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString())\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n setCurrentActionByIndex(actionIndex: number) {\n const action = this.visibleActionsQueue[actionIndex]\n\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n sendNewActionMessage(newAction: Action, type: 'queued' | 'updated') {\n if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') {\n if (this.actionWindow.loaded) {\n const message = messageOnNewAction(newAction, type)\n if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' })\n } else {\n const message = messageOnNewAction(newAction, type)\n if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }\n }\n }\n }\n\n async openActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (this.actionWindow.windowProps) {\n this.focusActionWindow()\n } else {\n try {\n this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => {\n this.actionWindow.openWindowPromise = undefined\n })\n this.actionWindow.windowProps = await this.actionWindow.openWindowPromise\n this.emitUpdate()\n } catch (err) {\n console.error('Error opening action window:', err)\n }\n }\n }\n\n async focusActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps)\n return\n try {\n this.actionWindow.focusWindowPromise = this.#windowManager\n .focus(this.actionWindow.windowProps)\n .finally(() => {\n this.actionWindow.focusWindowPromise = undefined\n })\n this.emitUpdate()\n } catch (err) {\n console.error('Error focusing action window:', err)\n }\n }\n\n closeActionWindow() {\n if (!this.actionWindow.windowProps) return\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n }\n\n setWindowLoaded() {\n if (!this.actionWindow.windowProps) return\n this.actionWindow.loaded = true\n\n if (this.actionWindow.pendingMessage) {\n this.#windowManager.sendWindowToastMessage(\n this.actionWindow.pendingMessage.message,\n this.actionWindow.pendingMessage.options\n )\n this.actionWindow.pendingMessage = null\n }\n this.emitUpdate()\n }\n\n removeAccountData(address: Account['addr']) {\n this.actionsQueue = this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr !== address\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== address\n }\n\n return true\n })\n\n this.emitUpdate()\n }\n\n get banners() {\n return getDappActionRequestsBanners(this.visibleActionsQueue)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n visibleActionsQueue: this.visibleActionsQueue,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.d.ts b/dist/src/controllers/activity/activity.d.ts new file mode 100644 index 000000000..3443acc17 --- /dev/null +++ b/dist/src/controllers/activity/activity.d.ts @@ -0,0 +1,129 @@ +import { Account, AccountId } from '../../interfaces/account'; +import { Banner } from '../../interfaces/banner'; +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import { Message } from '../../interfaces/userRequest'; +import { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'; +import { AccountsController } from '../accounts/accounts'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +export interface Pagination { + fromPage: number; + itemsPerPage: number; +} +interface PaginationResult { + items: T[]; + itemsTotal: number; + currentPage: number; + maxPages: number; +} +export interface SignedMessage extends Message { + dapp: { + name: string; + icon: string; + } | null; + timestamp: number; +} +interface AccountsOps extends PaginationResult { +} +interface MessagesToBeSigned extends PaginationResult { +} +export interface Filters { + account: string; + network?: string; +} +/** + * Activity Controller + * Manages signed AccountsOps and Messages in controller memory and browser storage. + * + * Raw, unfiltered data is stored in private properties `ActivityController.#accountsOps` and + * `ActivityController.#signedMessages`. + * + * Public methods and properties are exposed for retrieving data with filtering and pagination. + * + * To apply filters or pagination, call `filterAccountsOps()` or `filterSignedMessages()` with the + * required parameters. Filtered items are stored in `ActivityController.accountsOps` and + * `ActivityController.signedMessages` by session ID. + * + * Sessions ensure that each page manages its own filters and pagination independently. For example, + * filters in "Settings -> Transactions History" and "Dashboard -> Activity Tab" are isolated per session. + * + * After adding or removing an AccountOp or SignedMessage, call `syncFilteredAccountsOps()` or + * `syncFilteredSignedMessages()` to synchronize filtered data with the source data. + * + * The frontend is responsible for clearing filtered items for a session when a component unmounts + * by calling `resetAccountsOpsFilters()` or `resetSignedMessagesFilters()`. If not cleared, all + * sessions will be automatically removed when the browser is closed or the controller terminates. + * + * 💡 For performance, items per account and network are limited to 1000. + * Older items are trimmed, keeping the most recent ones. + */ +export declare class ActivityController extends EventEmitter { + #private; + accountsOps: { + [sessionId: string]: { + result: AccountsOps; + filters: Filters; + pagination: Pagination; + }; + }; + signedMessages: { + [sessionId: string]: { + result: MessagesToBeSigned; + filters: Filters; + pagination: Pagination; + }; + }; + constructor(storage: Storage, fetch: Fetch, callRelayer: Function, accounts: AccountsController, selectedAccount: SelectedAccountController, providers: ProvidersController, networks: NetworksController, onContractsDeployed: (network: Network) => Promise); + filterAccountsOps(sessionId: string, filters: Filters, pagination?: Pagination): Promise; + resetAccountsOpsFilters(sessionId: string): void; + private syncFilteredAccountsOps; + filterSignedMessages(sessionId: string, filters: Filters, pagination?: Pagination): Promise; + resetSignedMessagesFilters(sessionId: string): void; + private syncSignedMessages; + addAccountOp(accountOp: SubmittedAccountOp): Promise; + /** + * Update AccountsOps statuses (inner and public state, and storage) + * + * Here is the algorithm: + * 0. Once we broadcast an AccountOp, we are adding it to ActivityController via `addAccountOp`, + * and are setting its status to AccountOpStatus.BroadcastedButNotConfirmed. + * 1. Here, we firstly rely on `getTransactionReceipt` for determining the status (success or failure). + * 2. If we don't manage to determine its status, we are comparing AccountOp and Account nonce. + * If Account nonce is greater than AccountOp, then we know that AccountOp has past nonce (AccountOpStatus.UnknownButPastNonce). + */ + updateAccountsOpsStatuses(): Promise<{ + shouldEmitUpdate: boolean; + shouldUpdatePortfolio: boolean; + updatedAccountsOps: SubmittedAccountOp[]; + newestOpTimestamp: number; + }>; + addSignedMessage(signedMessage: SignedMessage, account: string): Promise; + removeAccountData(address: Account['addr']): Promise; + hideBanner({ addr, network, timestamp }: { + addr: string; + network: string; + timestamp: number; + }): Promise; + get broadcastedButNotConfirmed(): SubmittedAccountOp[]; + get banners(): Banner[]; + /** + * A not confirmed account op can actually be with a status of BroadcastButNotConfirmed + * and BroadcastButStuck. Typically, it becomes BroadcastButStuck if not confirmed + * in a 15 minutes interval after becoming BroadcastButNotConfirmed. We need two + * statuses to hide the banner of BroadcastButNotConfirmed from the dashboard. + */ + getNotConfirmedOpIfAny(accId: AccountId, networkId: Network['id']): SubmittedAccountOp | null; + getLastTxn(networkId: Network['id']): SubmittedAccountOp | null; + findMessage(account: string, filter: (item: SignedMessage) => boolean): Promise; + toJSON(): this & { + broadcastedButNotConfirmed: SubmittedAccountOp[]; + banners: Banner[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=activity.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.d.ts.map b/dist/src/controllers/activity/activity.d.ts.map new file mode 100644 index 000000000..894079c20 --- /dev/null +++ b/dist/src/controllers/activity/activity.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../../src/controllers/activity/activity.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.js b/dist/src/controllers/activity/activity.js new file mode 100644 index 000000000..9333307a6 --- /dev/null +++ b/dist/src/controllers/activity/activity.js @@ -0,0 +1,446 @@ +import { isSmartAccount } from '../../libs/account/account'; +import { AccountOpStatus } from '../../libs/accountOp/accountOp'; +import { fetchTxnId } from '../../libs/accountOp/submittedAccountOp'; +/* eslint-disable import/no-extraneous-dependencies */ +import { parseLogs } from '../../libs/userOperation/userOperation'; +import { getBenzinUrlParams } from '../../utils/benzin'; +import EventEmitter from '../eventEmitter/eventEmitter'; +// We are limiting items array to include no more than 1000 records, +// as we trim out the oldest ones (in the beginning of the items array). +// We do this to maintain optimal storage and performance. +const trim = (items, maxSize = 1000) => { + if (items.length > maxSize) { + // If the array size is greater than maxSize, remove the last (oldest) item + // newest items are added to the beginning of the array so oldest will be at the end (thats why we .pop()) + items.pop(); + } +}; +const paginate = (items, fromPage, itemsPerPage) => { + return { + items: items.slice(fromPage * itemsPerPage, fromPage * itemsPerPage + itemsPerPage), + itemsTotal: items.length, + currentPage: fromPage, + maxPages: Math.ceil(items.length / itemsPerPage) + }; +}; +/** + * Activity Controller + * Manages signed AccountsOps and Messages in controller memory and browser storage. + * + * Raw, unfiltered data is stored in private properties `ActivityController.#accountsOps` and + * `ActivityController.#signedMessages`. + * + * Public methods and properties are exposed for retrieving data with filtering and pagination. + * + * To apply filters or pagination, call `filterAccountsOps()` or `filterSignedMessages()` with the + * required parameters. Filtered items are stored in `ActivityController.accountsOps` and + * `ActivityController.signedMessages` by session ID. + * + * Sessions ensure that each page manages its own filters and pagination independently. For example, + * filters in "Settings -> Transactions History" and "Dashboard -> Activity Tab" are isolated per session. + * + * After adding or removing an AccountOp or SignedMessage, call `syncFilteredAccountsOps()` or + * `syncFilteredSignedMessages()` to synchronize filtered data with the source data. + * + * The frontend is responsible for clearing filtered items for a session when a component unmounts + * by calling `resetAccountsOpsFilters()` or `resetSignedMessagesFilters()`. If not cleared, all + * sessions will be automatically removed when the browser is closed or the controller terminates. + * + * 💡 For performance, items per account and network are limited to 1000. + * Older items are trimmed, keeping the most recent ones. + */ +export class ActivityController extends EventEmitter { + #storage; + #fetch; + #initialLoadPromise; + #accounts; + #selectedAccount; + #accountsOps = {}; + accountsOps = {}; + #signedMessages = {}; + signedMessages = {}; + #providers; + #networks; + #onContractsDeployed; + #rbfStatuses = [AccountOpStatus.BroadcastedButNotConfirmed, AccountOpStatus.BroadcastButStuck]; + #callRelayer; + constructor(storage, fetch, callRelayer, accounts, selectedAccount, providers, networks, onContractsDeployed) { + super(); + this.#storage = storage; + this.#fetch = fetch; + this.#callRelayer = callRelayer; + this.#accounts = accounts; + this.#selectedAccount = selectedAccount; + this.#providers = providers; + this.#networks = networks; + this.#onContractsDeployed = onContractsDeployed; + this.#initialLoadPromise = this.#load(); + } + async #load() { + await this.#accounts.initialLoadPromise; + await this.#selectedAccount.initialLoadPromise; + const [accountsOps, signedMessages] = await Promise.all([ + this.#storage.get('accountsOps', {}), + this.#storage.get('signedMessages', {}) + ]); + this.#accountsOps = accountsOps; + this.#signedMessages = signedMessages; + this.emitUpdate(); + } + async filterAccountsOps(sessionId, filters, pagination = { + fromPage: 0, + itemsPerPage: 10 + }) { + await this.#initialLoadPromise; + let filteredItems; + if (filters.network) { + filteredItems = this.#accountsOps[filters.account]?.[filters.network] || []; + } + else { + filteredItems = Object.values(this.#accountsOps[filters.account] || []).flat(); + // By default, #accountsOps are grouped by network and sorted in descending order. + // However, when the network filter is omitted, #accountsOps from different networks are mixed, + // requiring additional sorting to ensure they are also in descending order. + filteredItems.sort((a, b) => b.timestamp - a.timestamp); + } + const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage); + this.accountsOps[sessionId] = { + result, + filters, + pagination + }; + this.emitUpdate(); + } + // Reset filtered AccountsOps session. + // Example: when a FE component is being unmounted, we don't need anymore the filtered accounts ops and we + // free the memory calling this method. + resetAccountsOpsFilters(sessionId) { + delete this.accountsOps[sessionId]; + } + // Everytime we add/remove an AccOp, we should run this method in order to keep the filtered and internal accounts ops in sync. + async syncFilteredAccountsOps() { + const promises = Object.keys(this.accountsOps).map(async (sessionId) => { + await this.filterAccountsOps(sessionId, this.accountsOps[sessionId].filters, this.accountsOps[sessionId].pagination); + }); + await Promise.all(promises); + } + async filterSignedMessages(sessionId, filters, pagination = { + fromPage: 0, + itemsPerPage: 10 + }) { + await this.#initialLoadPromise; + const filteredItems = this.#signedMessages[filters.account] || []; + const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage); + this.signedMessages[sessionId] = { + result, + filters, + pagination + }; + this.emitUpdate(); + } + // Reset filtered Messages session. + // Example: when a FE component is being unmounted, we don't need anymore the filtered messages and we + // free the memory calling this method. + resetSignedMessagesFilters(sessionId) { + delete this.signedMessages[sessionId]; + } + // Everytime we add/remove a Message, we should run this method in order to keep the filtered and internal messages in sync. + async syncSignedMessages() { + const promises = Object.keys(this.signedMessages).map(async (sessionId) => { + await this.filterSignedMessages(sessionId, this.signedMessages[sessionId].filters, this.signedMessages[sessionId].pagination); + }); + await Promise.all(promises); + } + async addAccountOp(accountOp) { + await this.#initialLoadPromise; + const { accountAddr, networkId } = accountOp; + if (!this.#accountsOps[accountAddr]) + this.#accountsOps[accountAddr] = {}; + if (!this.#accountsOps[accountAddr][networkId]) + this.#accountsOps[accountAddr][networkId] = []; + // newest SubmittedAccountOp goes first in the list + this.#accountsOps[accountAddr][networkId].unshift({ ...accountOp }); + trim(this.#accountsOps[accountAddr][networkId]); + await this.syncFilteredAccountsOps(); + await this.#storage.set('accountsOps', this.#accountsOps); + this.emitUpdate(); + } + /** + * Update AccountsOps statuses (inner and public state, and storage) + * + * Here is the algorithm: + * 0. Once we broadcast an AccountOp, we are adding it to ActivityController via `addAccountOp`, + * and are setting its status to AccountOpStatus.BroadcastedButNotConfirmed. + * 1. Here, we firstly rely on `getTransactionReceipt` for determining the status (success or failure). + * 2. If we don't manage to determine its status, we are comparing AccountOp and Account nonce. + * If Account nonce is greater than AccountOp, then we know that AccountOp has past nonce (AccountOpStatus.UnknownButPastNonce). + */ + async updateAccountsOpsStatuses() { + await this.#initialLoadPromise; + if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr]) + return { + shouldEmitUpdate: false, + shouldUpdatePortfolio: false, + updatedAccountsOps: [], + newestOpTimestamp: 0 + }; + // This flag tracks the changes to AccountsOps statuses + // and optimizes the number of the emitted updates and storage/state updates. + let shouldEmitUpdate = false; + let shouldUpdatePortfolio = false; + const updatedAccountsOps = []; + // Use this flag to make the auto-refresh slower with the passege of time. + // implementation is in background.ts + let newestOpTimestamp = 0; + await Promise.all(Object.keys(this.#accountsOps[this.#selectedAccount.account.addr]).map(async (networkId) => { + const network = this.#networks.networks.find((x) => x.id === networkId); + if (!network) + return; + const provider = this.#providers.providers[network.id]; + const selectedAccount = this.#selectedAccount.account?.addr; + if (!selectedAccount) + return; + return Promise.all(this.#accountsOps[selectedAccount][networkId].map(async (accountOp, accountOpIndex) => { + // Don't update the current network account ops statuses, + // as the statuses are already updated in the previous calls. + if (accountOp.status !== AccountOpStatus.BroadcastedButNotConfirmed) + return; + shouldEmitUpdate = true; + if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) { + newestOpTimestamp = accountOp.timestamp; + } + const declareStuckIfQuaterPassed = (op) => { + const accountOpDate = new Date(op.timestamp); + accountOpDate.setMinutes(accountOpDate.getMinutes() + 15); + const aQuaterHasPassed = accountOpDate < new Date(); + if (aQuaterHasPassed) { + this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = + AccountOpStatus.BroadcastButStuck; + updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); + } + }; + const fetchTxnIdResult = await fetchTxnId(accountOp.identifiedBy, network, this.#fetch, this.#callRelayer, accountOp); + if (fetchTxnIdResult.status === 'rejected') { + this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = + AccountOpStatus.Rejected; + updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); + return; + } + if (fetchTxnIdResult.status === 'not_found') { + declareStuckIfQuaterPassed(accountOp); + return; + } + const txnId = fetchTxnIdResult.txnId; + this.#accountsOps[selectedAccount][networkId][accountOpIndex].txnId = txnId; + try { + const receipt = await provider.getTransactionReceipt(txnId); + if (receipt) { + // if this is an user op, we have to check the logs + let isSuccess; + if (accountOp.identifiedBy.type === 'UserOperation') { + const userOpEventLog = parseLogs(receipt.logs, accountOp.identifiedBy.identifier); + if (userOpEventLog) + isSuccess = userOpEventLog.success; + } + // if it's not an userOp or it is, but isSuccess was not found + if (isSuccess === undefined) + isSuccess = !!receipt.status; + this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = isSuccess + ? AccountOpStatus.Success + : AccountOpStatus.Failure; + updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); + if (receipt.status) { + shouldUpdatePortfolio = true; + } + if (accountOp.isSingletonDeploy && receipt.status) { + await this.#onContractsDeployed(network); + } + return; + } + // if there's no receipt, confirm there's a txn + // if there's no txn and 15 minutes have passed, declare it a failure + const txn = await provider.getTransaction(txnId); + if (txn) + return; + declareStuckIfQuaterPassed(accountOp); + } + catch { + this.emitError({ + level: 'silent', + message: `Failed to determine transaction status on ${accountOp.networkId} for ${accountOp.txnId}.`, + error: new Error(`activity: failed to get transaction receipt for ${accountOp.txnId}`) + }); + } + // if there are more than 1 txns with the same nonce and payer, + // we can conclude this one is replaced by fee + const sameNonceTxns = this.#accountsOps[selectedAccount][networkId].filter((accOp) => accOp.gasFeePayment && + accountOp.gasFeePayment && + accOp.gasFeePayment.paidBy === accountOp.gasFeePayment.paidBy && + accOp.nonce.toString() === accountOp.nonce.toString()); + const confirmedSameNonceTxns = sameNonceTxns.find((accOp) => accOp.status === AccountOpStatus.Success || accOp.status === AccountOpStatus.Failure); + if (sameNonceTxns.length > 1 && !!confirmedSameNonceTxns) { + this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = + AccountOpStatus.UnknownButPastNonce; + updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); + shouldUpdatePortfolio = true; + } + })); + })); + if (shouldEmitUpdate) { + await this.#storage.set('accountsOps', this.#accountsOps); + await this.syncFilteredAccountsOps(); + this.emitUpdate(); + } + return { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp }; + } + async addSignedMessage(signedMessage, account) { + await this.#initialLoadPromise; + if (!this.#signedMessages[account]) + this.#signedMessages[account] = []; + // newest SignedMessage goes first in the list + this.#signedMessages[account].unshift(signedMessage); + trim(this.#signedMessages[account]); + await this.syncSignedMessages(); + await this.#storage.set('signedMessages', this.#signedMessages); + this.emitUpdate(); + } + async removeAccountData(address) { + await this.#initialLoadPromise; + delete this.#accountsOps[address]; + delete this.#signedMessages[address]; + await this.syncFilteredAccountsOps(); + await this.syncSignedMessages(); + await this.#storage.set('accountsOps', this.#accountsOps); + await this.#storage.set('signedMessages', this.#signedMessages); + this.emitUpdate(); + } + async hideBanner({ addr, network, timestamp }) { + await this.#initialLoadPromise; + // shouldn't happen + if (!this.#accountsOps[addr]) + return; + if (!this.#accountsOps[addr][network]) + return; + // find the op we want to update + const op = this.#accountsOps[addr][network].find((accOp) => accOp.timestamp === timestamp); + if (!op) + return; + // update by reference + if (!op.flags) + op.flags = {}; + op.flags.hideActivityBanner = true; + await this.#storage.set('accountsOps', this.#accountsOps); + this.emitUpdate(); + } + #throwNotInitialized() { + this.emitError({ + level: 'major', + message: "Looks like your activity couldn't be processed. Retry, or contact support if issue persists.", + error: new Error('activity: controller not initialized') + }); + } + get broadcastedButNotConfirmed() { + if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr]) + return []; + return Object.values(this.#accountsOps[this.#selectedAccount.account.addr]) + .flat() + .filter((accountOp) => accountOp.status === AccountOpStatus.BroadcastedButNotConfirmed); + } + get banners() { + if (!this.#networks.isInitialized) + return []; + return (this.broadcastedButNotConfirmed + // do not show a banner for forcefully hidden banners + .filter((op) => !(op.flags && op.flags.hideActivityBanner)) + .map((accountOp) => { + const network = this.#networks.networks.find((x) => x.id === accountOp.networkId); + const url = `https://benzin.ambire.com/${getBenzinUrlParams({ + chainId: network.chainId, + txnId: accountOp.txnId, + identifiedBy: accountOp.identifiedBy + })}`; + return { + id: accountOp.txnId, + type: 'success', + category: 'pending-to-be-confirmed-acc-op', + title: 'Transaction successfully signed and sent!\nCheck it out on the block explorer!', + text: '', + actions: [ + { + label: 'Close', + actionName: 'hide-activity-banner', + meta: { + addr: accountOp.accountAddr, + network: accountOp.networkId, + timestamp: accountOp.timestamp, + isHideStyle: true + } + }, + { + label: 'Check', + actionName: 'open-external-url', + meta: { url } + } + ] + }; + })); + } + /** + * A not confirmed account op can actually be with a status of BroadcastButNotConfirmed + * and BroadcastButStuck. Typically, it becomes BroadcastButStuck if not confirmed + * in a 15 minutes interval after becoming BroadcastButNotConfirmed. We need two + * statuses to hide the banner of BroadcastButNotConfirmed from the dashboard. + */ + getNotConfirmedOpIfAny(accId, networkId) { + const acc = this.#accounts.accounts.find((oneA) => oneA.addr === accId); + if (!acc) + return null; + // if the broadcasting account is a smart account, it means relayer + // broadcast => it's in this.#accountsOps[acc.addr][networkId] + // disregard erc-4337 txns as they shouldn't have an RBF + const isSA = isSmartAccount(acc); + if (isSA) { + if (!this.#accountsOps[acc.addr] || !this.#accountsOps[acc.addr][networkId]) + return null; + if (!this.#rbfStatuses.includes(this.#accountsOps[acc.addr][networkId][0].status)) + return null; + return this.#accountsOps[acc.addr][networkId][0]; + } + // if the account is an EOA, we have to go through all the smart accounts + // to check whether the EOA has made a broadcast for them + const theEOAandSAaccounts = this.#accounts.accounts.filter((oneA) => isSmartAccount(oneA) || oneA.addr === accId); + const ops = []; + theEOAandSAaccounts.forEach((oneA) => { + if (!this.#accountsOps[oneA.addr] || !this.#accountsOps[oneA.addr][networkId]) + return; + const op = this.#accountsOps[oneA.addr][networkId].find((oneOp) => this.#rbfStatuses.includes(this.#accountsOps[oneA.addr][networkId][0].status) && + oneOp.gasFeePayment?.paidBy === oneA.addr); + if (!op) + return; + ops.push(op); + }); + return !ops.length ? null : ops.reduce((m, e) => (e.nonce > m.nonce ? e : m)); + } + getLastTxn(networkId) { + if (!this.#selectedAccount.account || + !this.#accountsOps[this.#selectedAccount.account.addr] || + !this.#accountsOps[this.#selectedAccount.account.addr][networkId]) + return null; + return this.#accountsOps[this.#selectedAccount.account.addr][networkId][0]; + } + async findMessage(account, filter) { + await this.#initialLoadPromise; + if (!this.#signedMessages[account]) + return null; + return this.#signedMessages[account].find(filter); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + broadcastedButNotConfirmed: this.broadcastedButNotConfirmed, + banners: this.banners // includes the getter in the stringified instance + }; + } +} +//# sourceMappingURL=activity.js.map \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.js.map b/dist/src/controllers/activity/activity.js.map new file mode 100644 index 000000000..89d0696d8 --- /dev/null +++ b/dist/src/controllers/activity/activity.js.map @@ -0,0 +1 @@ +{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/controllers/activity/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { fetchTxnId, SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\n/* eslint-disable import/no-extraneous-dependencies */\nimport { parseLogs } from '../../libs/userOperation/userOperation'\nimport { getBenzinUrlParams } from '../../utils/benzin'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport interface Pagination {\n fromPage: number\n itemsPerPage: number\n}\n\ninterface PaginationResult {\n items: T[]\n itemsTotal: number\n currentPage: number\n maxPages: number\n}\n\nexport interface SignedMessage extends Message {\n dapp: {\n name: string\n icon: string\n } | null\n timestamp: number\n}\n\ninterface AccountsOps extends PaginationResult {}\ninterface MessagesToBeSigned extends PaginationResult {}\n\nexport interface Filters {\n account: string\n network?: string\n}\n\ninterface InternalAccountsOps {\n // account => network => SubmittedAccountOp[]\n [key: string]: { [key: string]: SubmittedAccountOp[] }\n}\n\ninterface InternalSignedMessages {\n // account => Message[]\n [key: string]: SignedMessage[]\n}\n\n// We are limiting items array to include no more than 1000 records,\n// as we trim out the oldest ones (in the beginning of the items array).\n// We do this to maintain optimal storage and performance.\nconst trim = (items: T[], maxSize = 1000): void => {\n if (items.length > maxSize) {\n // If the array size is greater than maxSize, remove the last (oldest) item\n // newest items are added to the beginning of the array so oldest will be at the end (thats why we .pop())\n items.pop()\n }\n}\n\nconst paginate = (items: any[], fromPage: number, itemsPerPage: number) => {\n return {\n items: items.slice(fromPage * itemsPerPage, fromPage * itemsPerPage + itemsPerPage),\n itemsTotal: items.length,\n currentPage: fromPage, // zero/index based\n maxPages: Math.ceil(items.length / itemsPerPage)\n }\n}\n\n/**\n * Activity Controller\n * Manages signed AccountsOps and Messages in controller memory and browser storage.\n *\n * Raw, unfiltered data is stored in private properties `ActivityController.#accountsOps` and\n * `ActivityController.#signedMessages`.\n *\n * Public methods and properties are exposed for retrieving data with filtering and pagination.\n *\n * To apply filters or pagination, call `filterAccountsOps()` or `filterSignedMessages()` with the\n * required parameters. Filtered items are stored in `ActivityController.accountsOps` and\n * `ActivityController.signedMessages` by session ID.\n *\n * Sessions ensure that each page manages its own filters and pagination independently. For example,\n * filters in \"Settings -> Transactions History\" and \"Dashboard -> Activity Tab\" are isolated per session.\n *\n * After adding or removing an AccountOp or SignedMessage, call `syncFilteredAccountsOps()` or\n * `syncFilteredSignedMessages()` to synchronize filtered data with the source data.\n *\n * The frontend is responsible for clearing filtered items for a session when a component unmounts\n * by calling `resetAccountsOpsFilters()` or `resetSignedMessagesFilters()`. If not cleared, all\n * sessions will be automatically removed when the browser is closed or the controller terminates.\n *\n * 💡 For performance, items per account and network are limited to 1000.\n * Older items are trimmed, keeping the most recent ones.\n */\nexport class ActivityController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n #accountsOps: InternalAccountsOps = {}\n\n accountsOps: {\n [sessionId: string]: {\n result: AccountsOps\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #signedMessages: InternalSignedMessages = {}\n\n signedMessages: {\n [sessionId: string]: {\n result: MessagesToBeSigned\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #onContractsDeployed: (network: Network) => Promise\n\n #rbfStatuses = [AccountOpStatus.BroadcastedButNotConfirmed, AccountOpStatus.BroadcastButStuck]\n\n #callRelayer: Function\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n callRelayer: Function,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController,\n providers: ProvidersController,\n networks: NetworksController,\n onContractsDeployed: (network: Network) => Promise\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = callRelayer\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n this.#onContractsDeployed = onContractsDeployed\n this.#initialLoadPromise = this.#load()\n }\n\n async #load(): Promise {\n await this.#accounts.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n const [accountsOps, signedMessages] = await Promise.all([\n this.#storage.get('accountsOps', {}),\n this.#storage.get('signedMessages', {})\n ])\n\n this.#accountsOps = accountsOps\n this.#signedMessages = signedMessages\n\n this.emitUpdate()\n }\n\n async filterAccountsOps(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n let filteredItems\n\n if (filters.network) {\n filteredItems = this.#accountsOps[filters.account]?.[filters.network] || []\n } else {\n filteredItems = Object.values(this.#accountsOps[filters.account] || []).flat()\n // By default, #accountsOps are grouped by network and sorted in descending order.\n // However, when the network filter is omitted, #accountsOps from different networks are mixed,\n // requiring additional sorting to ensure they are also in descending order.\n filteredItems.sort((a, b) => b.timestamp - a.timestamp)\n }\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.accountsOps[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered AccountsOps session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered accounts ops and we\n // free the memory calling this method.\n resetAccountsOpsFilters(sessionId: string) {\n delete this.accountsOps[sessionId]\n }\n\n // Everytime we add/remove an AccOp, we should run this method in order to keep the filtered and internal accounts ops in sync.\n private async syncFilteredAccountsOps() {\n const promises = Object.keys(this.accountsOps).map(async (sessionId) => {\n await this.filterAccountsOps(\n sessionId,\n this.accountsOps[sessionId].filters,\n this.accountsOps[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async filterSignedMessages(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n const filteredItems = this.#signedMessages[filters.account] || []\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.signedMessages[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered Messages session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered messages and we\n // free the memory calling this method.\n resetSignedMessagesFilters(sessionId: string) {\n delete this.signedMessages[sessionId]\n }\n\n // Everytime we add/remove a Message, we should run this method in order to keep the filtered and internal messages in sync.\n private async syncSignedMessages() {\n const promises = Object.keys(this.signedMessages).map(async (sessionId) => {\n await this.filterSignedMessages(\n sessionId,\n this.signedMessages[sessionId].filters,\n this.signedMessages[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async addAccountOp(accountOp: SubmittedAccountOp) {\n await this.#initialLoadPromise\n\n const { accountAddr, networkId } = accountOp\n\n if (!this.#accountsOps[accountAddr]) this.#accountsOps[accountAddr] = {}\n if (!this.#accountsOps[accountAddr][networkId]) this.#accountsOps[accountAddr][networkId] = []\n\n // newest SubmittedAccountOp goes first in the list\n this.#accountsOps[accountAddr][networkId].unshift({ ...accountOp })\n trim(this.#accountsOps[accountAddr][networkId])\n\n await this.syncFilteredAccountsOps()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n this.emitUpdate()\n }\n\n /**\n * Update AccountsOps statuses (inner and public state, and storage)\n *\n * Here is the algorithm:\n * 0. Once we broadcast an AccountOp, we are adding it to ActivityController via `addAccountOp`,\n * and are setting its status to AccountOpStatus.BroadcastedButNotConfirmed.\n * 1. Here, we firstly rely on `getTransactionReceipt` for determining the status (success or failure).\n * 2. If we don't manage to determine its status, we are comparing AccountOp and Account nonce.\n * If Account nonce is greater than AccountOp, then we know that AccountOp has past nonce (AccountOpStatus.UnknownButPastNonce).\n */\n async updateAccountsOpsStatuses(): Promise<{\n shouldEmitUpdate: boolean\n shouldUpdatePortfolio: boolean\n updatedAccountsOps: SubmittedAccountOp[]\n newestOpTimestamp: number\n }> {\n await this.#initialLoadPromise\n\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return {\n shouldEmitUpdate: false,\n shouldUpdatePortfolio: false,\n updatedAccountsOps: [],\n newestOpTimestamp: 0\n }\n\n // This flag tracks the changes to AccountsOps statuses\n // and optimizes the number of the emitted updates and storage/state updates.\n let shouldEmitUpdate = false\n\n let shouldUpdatePortfolio = false\n const updatedAccountsOps: SubmittedAccountOp[] = []\n\n // Use this flag to make the auto-refresh slower with the passege of time.\n // implementation is in background.ts\n let newestOpTimestamp: number = 0\n\n await Promise.all(\n Object.keys(this.#accountsOps[this.#selectedAccount.account.addr]).map(async (networkId) => {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n if (!network) return\n const provider = this.#providers.providers[network.id]\n\n const selectedAccount = this.#selectedAccount.account?.addr\n\n if (!selectedAccount) return\n\n return Promise.all(\n this.#accountsOps[selectedAccount][networkId].map(async (accountOp, accountOpIndex) => {\n // Don't update the current network account ops statuses,\n // as the statuses are already updated in the previous calls.\n if (accountOp.status !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n shouldEmitUpdate = true\n\n if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) {\n newestOpTimestamp = accountOp.timestamp\n }\n\n const declareStuckIfQuaterPassed = (op: SubmittedAccountOp) => {\n const accountOpDate = new Date(op.timestamp)\n accountOpDate.setMinutes(accountOpDate.getMinutes() + 15)\n const aQuaterHasPassed = accountOpDate < new Date()\n if (aQuaterHasPassed) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.BroadcastButStuck\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n }\n }\n\n const fetchTxnIdResult = await fetchTxnId(\n accountOp.identifiedBy,\n network,\n this.#fetch,\n this.#callRelayer,\n accountOp\n )\n if (fetchTxnIdResult.status === 'rejected') {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.Rejected\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n return\n }\n if (fetchTxnIdResult.status === 'not_found') {\n declareStuckIfQuaterPassed(accountOp)\n return\n }\n\n const txnId = fetchTxnIdResult.txnId as string\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].txnId = txnId\n\n try {\n const receipt = await provider.getTransactionReceipt(txnId)\n if (receipt) {\n // if this is an user op, we have to check the logs\n let isSuccess: boolean | undefined\n if (accountOp.identifiedBy.type === 'UserOperation') {\n const userOpEventLog = parseLogs(receipt.logs, accountOp.identifiedBy.identifier)\n if (userOpEventLog) isSuccess = userOpEventLog.success\n }\n\n // if it's not an userOp or it is, but isSuccess was not found\n if (isSuccess === undefined) isSuccess = !!receipt.status\n\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = isSuccess\n ? AccountOpStatus.Success\n : AccountOpStatus.Failure\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n\n if (receipt.status) {\n shouldUpdatePortfolio = true\n }\n\n if (accountOp.isSingletonDeploy && receipt.status) {\n await this.#onContractsDeployed(network)\n }\n return\n }\n\n // if there's no receipt, confirm there's a txn\n // if there's no txn and 15 minutes have passed, declare it a failure\n const txn = await provider.getTransaction(txnId)\n if (txn) return\n declareStuckIfQuaterPassed(accountOp)\n } catch {\n this.emitError({\n level: 'silent',\n message: `Failed to determine transaction status on ${accountOp.networkId} for ${accountOp.txnId}.`,\n error: new Error(\n `activity: failed to get transaction receipt for ${accountOp.txnId}`\n )\n })\n }\n\n // if there are more than 1 txns with the same nonce and payer,\n // we can conclude this one is replaced by fee\n const sameNonceTxns = this.#accountsOps[selectedAccount][networkId].filter(\n (accOp) =>\n accOp.gasFeePayment &&\n accountOp.gasFeePayment &&\n accOp.gasFeePayment.paidBy === accountOp.gasFeePayment.paidBy &&\n accOp.nonce.toString() === accountOp.nonce.toString()\n )\n const confirmedSameNonceTxns = sameNonceTxns.find(\n (accOp) =>\n accOp.status === AccountOpStatus.Success || accOp.status === AccountOpStatus.Failure\n )\n if (sameNonceTxns.length > 1 && !!confirmedSameNonceTxns) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.UnknownButPastNonce\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n shouldUpdatePortfolio = true\n }\n })\n )\n })\n )\n\n if (shouldEmitUpdate) {\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.syncFilteredAccountsOps()\n this.emitUpdate()\n }\n\n return { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp }\n }\n\n async addSignedMessage(signedMessage: SignedMessage, account: string) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) this.#signedMessages[account] = []\n\n // newest SignedMessage goes first in the list\n this.#signedMessages[account].unshift(signedMessage)\n trim(this.#signedMessages[account])\n await this.syncSignedMessages()\n\n await this.#storage.set('signedMessages', this.#signedMessages)\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n await this.#initialLoadPromise\n\n delete this.#accountsOps[address]\n delete this.#signedMessages[address]\n\n await this.syncFilteredAccountsOps()\n await this.syncSignedMessages()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.#storage.set('signedMessages', this.#signedMessages)\n\n this.emitUpdate()\n }\n\n async hideBanner({\n addr,\n network,\n timestamp\n }: {\n addr: string\n network: string\n timestamp: number\n }) {\n await this.#initialLoadPromise\n\n // shouldn't happen\n if (!this.#accountsOps[addr]) return\n if (!this.#accountsOps[addr][network]) return\n\n // find the op we want to update\n const op = this.#accountsOps[addr][network].find((accOp) => accOp.timestamp === timestamp)\n if (!op) return\n\n // update by reference\n if (!op.flags) op.flags = {}\n op.flags.hideActivityBanner = true\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n\n this.emitUpdate()\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n \"Looks like your activity couldn't be processed. Retry, or contact support if issue persists.\",\n error: new Error('activity: controller not initialized')\n })\n }\n\n get broadcastedButNotConfirmed(): SubmittedAccountOp[] {\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return []\n\n return Object.values(this.#accountsOps[this.#selectedAccount.account.addr])\n .flat()\n .filter((accountOp) => accountOp.status === AccountOpStatus.BroadcastedButNotConfirmed)\n }\n\n get banners(): Banner[] {\n if (!this.#networks.isInitialized) return []\n return (\n this.broadcastedButNotConfirmed\n // do not show a banner for forcefully hidden banners\n .filter((op) => !(op.flags && op.flags.hideActivityBanner))\n .map((accountOp) => {\n const network = this.#networks.networks.find((x) => x.id === accountOp.networkId)!\n\n const url = `https://benzin.ambire.com/${getBenzinUrlParams({\n chainId: network.chainId,\n txnId: accountOp.txnId,\n identifiedBy: accountOp.identifiedBy\n })}`\n\n return {\n id: accountOp.txnId,\n type: 'success',\n category: 'pending-to-be-confirmed-acc-op',\n title: 'Transaction successfully signed and sent!\\nCheck it out on the block explorer!',\n text: '',\n actions: [\n {\n label: 'Close',\n actionName: 'hide-activity-banner',\n meta: {\n addr: accountOp.accountAddr,\n network: accountOp.networkId,\n timestamp: accountOp.timestamp,\n isHideStyle: true\n }\n },\n {\n label: 'Check',\n actionName: 'open-external-url',\n meta: { url }\n }\n ]\n } as Banner\n })\n )\n }\n\n /**\n * A not confirmed account op can actually be with a status of BroadcastButNotConfirmed\n * and BroadcastButStuck. Typically, it becomes BroadcastButStuck if not confirmed\n * in a 15 minutes interval after becoming BroadcastButNotConfirmed. We need two\n * statuses to hide the banner of BroadcastButNotConfirmed from the dashboard.\n */\n getNotConfirmedOpIfAny(accId: AccountId, networkId: Network['id']): SubmittedAccountOp | null {\n const acc = this.#accounts.accounts.find((oneA) => oneA.addr === accId)\n if (!acc) return null\n\n // if the broadcasting account is a smart account, it means relayer\n // broadcast => it's in this.#accountsOps[acc.addr][networkId]\n // disregard erc-4337 txns as they shouldn't have an RBF\n const isSA = isSmartAccount(acc)\n if (isSA) {\n if (!this.#accountsOps[acc.addr] || !this.#accountsOps[acc.addr][networkId]) return null\n if (!this.#rbfStatuses.includes(this.#accountsOps[acc.addr][networkId][0].status!))\n return null\n\n return this.#accountsOps[acc.addr][networkId][0]\n }\n\n // if the account is an EOA, we have to go through all the smart accounts\n // to check whether the EOA has made a broadcast for them\n const theEOAandSAaccounts = this.#accounts.accounts.filter(\n (oneA) => isSmartAccount(oneA) || oneA.addr === accId\n )\n const ops: SubmittedAccountOp[] = []\n theEOAandSAaccounts.forEach((oneA) => {\n if (!this.#accountsOps[oneA.addr] || !this.#accountsOps[oneA.addr][networkId]) return\n const op = this.#accountsOps[oneA.addr][networkId].find(\n (oneOp) =>\n this.#rbfStatuses.includes(this.#accountsOps[oneA.addr][networkId][0].status!) &&\n oneOp.gasFeePayment?.paidBy === oneA.addr\n )\n if (!op) return\n ops.push(op)\n })\n return !ops.length ? null : ops.reduce((m, e) => (e.nonce > m.nonce ? e : m))\n }\n\n getLastTxn(networkId: Network['id']): SubmittedAccountOp | null {\n if (\n !this.#selectedAccount.account ||\n !this.#accountsOps[this.#selectedAccount.account.addr] ||\n !this.#accountsOps[this.#selectedAccount.account.addr][networkId]\n )\n return null\n\n return this.#accountsOps[this.#selectedAccount.account.addr][networkId][0]\n }\n\n async findMessage(account: string, filter: (item: SignedMessage) => boolean) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) return null\n\n return this.#signedMessages[account].find(filter)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n broadcastedButNotConfirmed: this.broadcastedButNotConfirmed, // includes the getter in the stringified instance\n banners: this.banners // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.d.ts b/dist/src/controllers/addressBook/addressBook.d.ts new file mode 100644 index 000000000..e9d977727 --- /dev/null +++ b/dist/src/controllers/addressBook/addressBook.d.ts @@ -0,0 +1,39 @@ +import { Account } from '../../interfaces/account'; +import { Storage } from '../../interfaces/storage'; +import { AccountsController } from '../accounts/accounts'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +export type Contact = { + name: string; + address: Account['addr']; + isWalletAccount?: boolean; + createdAt?: number; + updatedAt?: number; +}; +export type Contacts = Array; +/** + * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book: + * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller. + * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one. + * Both types of contacts are combined and returned as a single array of contacts. + */ +export declare class AddressBookController extends EventEmitter { + #private; + constructor(storage: Storage, accounts: AccountsController, selectedAccount: SelectedAccountController); + get contacts(): (Contact | { + name: string; + address: string; + isWalletAccount: boolean; + })[]; + addContact(name: string, address: string): Promise; + renameManuallyAddedContact(address: string, newName: string): Promise; + removeManuallyAddedContact(address: string): Promise; + toJSON(): this & { + contacts: (Contact | { + name: string; + address: string; + isWalletAccount: boolean; + })[]; + }; +} +//# sourceMappingURL=addressBook.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.d.ts.map b/dist/src/controllers/addressBook/addressBook.d.ts.map new file mode 100644 index 000000000..0ea473d83 --- /dev/null +++ b/dist/src/controllers/addressBook/addressBook.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"addressBook.d.ts","sourceRoot":"","sources":["../../../../src/controllers/addressBook/addressBook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;AAErC;;;;;GAKG;AAEH,qBAAa,qBAAsB,SAAQ,YAAY;;gBAanD,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,EAAE,yBAAyB;IAoB5C,IAAI,QAAQ;;;;SAMX;IA8CK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IA0BxC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IA2B3D,0BAA0B,CAAC,OAAO,EAAE,MAAM;IAsBhD,MAAM;;;;;;;CAMP"} \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.js b/dist/src/controllers/addressBook/addressBook.js new file mode 100644 index 000000000..4801eef64 --- /dev/null +++ b/dist/src/controllers/addressBook/addressBook.js @@ -0,0 +1,135 @@ +import { getAddress } from 'ethers'; +import EventEmitter from '../eventEmitter/eventEmitter'; +/** + * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book: + * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller. + * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one. + * Both types of contacts are combined and returned as a single array of contacts. + */ +export class AddressBookController extends EventEmitter { + // Manually added contact (stored in storage) + #manuallyAddedContacts = []; + #storage; + #initialLoadPromise; + #accounts; + #selectedAccount; + constructor(storage, accounts, selectedAccount) { + super(); + this.#storage = storage; + this.#accounts = accounts; + this.#selectedAccount = selectedAccount; + this.#initialLoadPromise = this.#load(); + } + // Contacts, generated on the fly from the accounts in the wallet (not stored in storage) + get #walletAccountsSourcedContacts() { + return this.#accounts.accounts.map((account) => ({ + name: account.preferences.label, + address: account.addr, + isWalletAccount: true + })); + } + get contacts() { + if (!this.#selectedAccount.account) + return []; + return [...this.#manuallyAddedContacts, ...this.#walletAccountsSourcedContacts].filter(({ address }) => address !== this.#selectedAccount.account.addr); + } + async #load() { + await this.#accounts.initialLoadPromise; + try { + this.#manuallyAddedContacts = await this.#storage.get('contacts', []); + this.emitUpdate(); + } + catch (e) { + this.emitError({ + message: 'Something went wrong when loading the Address Book. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('Address Book: failed to load contacts from the Address Book') + }); + } + } + #handleManuallyAddedContactsChange() { + this.emitUpdate(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#storage.set('contacts', this.#manuallyAddedContacts); + } + #findManuallyAddedContactWithAddress(address) { + return this.#manuallyAddedContacts.find((contact) => contact.address.toLowerCase() === address.toLowerCase()); + } + #findContactWithAddress(address) { + return !this.contacts.some((contact) => contact.address.toLowerCase() === address.toLowerCase()); + } + #getChecksummedAddress(address) { + try { + return getAddress(address); + } + catch { + this.emitError({ + message: 'Invalid address', + level: 'minor', + error: new Error('Address Book: invalid address') + }); + return ''; + } + } + async addContact(name, address) { + await this.#initialLoadPromise; + const checksummedAddress = this.#getChecksummedAddress(address); + const trimmedName = name.trim(); + if (!this.#findContactWithAddress(checksummedAddress)) { + this.emitError({ + message: 'Contact with this address already exists in the Address Book', + level: 'minor', + error: new Error('Address Book: contact with this address already exists in the Address Book') + }); + return; + } + this.#manuallyAddedContacts.push({ + name: trimmedName, + address: checksummedAddress, + createdAt: Date.now(), + updatedAt: Date.now() + }); + this.#handleManuallyAddedContactsChange(); + } + async renameManuallyAddedContact(address, newName) { + await this.#initialLoadPromise; + const checksummedAddress = this.#getChecksummedAddress(address); + const trimmedNewName = newName.trim(); + if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) { + this.emitError({ + message: "Can't rename contact that doesn't exist in the Address Book", + level: 'minor', + error: new Error("Address Book: can't rename contact that doesn't exist in the Address Book") + }); + return; + } + this.#manuallyAddedContacts = this.#manuallyAddedContacts.map((contact) => { + if (contact.address.toLowerCase() === address.toLowerCase()) { + return { ...contact, name: trimmedNewName, updatedAt: Date.now() }; + } + return contact; + }); + this.#handleManuallyAddedContactsChange(); + } + async removeManuallyAddedContact(address) { + await this.#initialLoadPromise; + const checksummedAddress = this.#getChecksummedAddress(address); + if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) { + this.emitError({ + message: "Can't remove contact that doesn't exist in the Address Book", + level: 'minor', + error: new Error("Address Book: can't remove contact that doesn't exist in the Address Book") + }); + return; + } + this.#manuallyAddedContacts = this.#manuallyAddedContacts.filter((contact) => contact.address.toLowerCase() !== address.toLowerCase()); + this.#handleManuallyAddedContactsChange(); + } + toJSON() { + return { + ...this, + contacts: this.contacts + }; + } +} +//# sourceMappingURL=addressBook.js.map \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.js.map b/dist/src/controllers/addressBook/addressBook.js.map new file mode 100644 index 000000000..ab0b7127e --- /dev/null +++ b/dist/src/controllers/addressBook/addressBook.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addressBook.js","sourceRoot":"","sources":["../../../../src/controllers/addressBook/addressBook.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { Account } from '../../interfaces/account'\nimport { Storage } from '../../interfaces/storage'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport type Contact = {\n name: string\n address: Account['addr']\n isWalletAccount?: boolean\n createdAt?: number\n updatedAt?: number\n}\n\nexport type Contacts = Array\n\n/**\n * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book:\n * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller.\n * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one.\n * Both types of contacts are combined and returned as a single array of contacts.\n */\n\nexport class AddressBookController extends EventEmitter {\n // Manually added contact (stored in storage)\n #manuallyAddedContacts: Contacts = []\n\n #storage: Storage\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n constructor(\n storage: Storage,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController\n ) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n\n this.#initialLoadPromise = this.#load()\n }\n\n // Contacts, generated on the fly from the accounts in the wallet (not stored in storage)\n get #walletAccountsSourcedContacts() {\n return this.#accounts.accounts.map((account) => ({\n name: account.preferences.label,\n address: account.addr,\n isWalletAccount: true\n }))\n }\n\n get contacts() {\n if (!this.#selectedAccount.account) return []\n\n return [...this.#manuallyAddedContacts, ...this.#walletAccountsSourcedContacts].filter(\n ({ address }) => address !== this.#selectedAccount.account!.addr\n )\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n try {\n this.#manuallyAddedContacts = await this.#storage.get('contacts', [])\n this.emitUpdate()\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Address Book. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('Address Book: failed to load contacts from the Address Book')\n })\n }\n }\n\n #handleManuallyAddedContactsChange() {\n this.emitUpdate()\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('contacts', this.#manuallyAddedContacts)\n }\n\n #findManuallyAddedContactWithAddress(address: string) {\n return this.#manuallyAddedContacts.find(\n (contact) => contact.address.toLowerCase() === address.toLowerCase()\n )\n }\n\n #findContactWithAddress(address: string) {\n return !this.contacts.some((contact) => contact.address.toLowerCase() === address.toLowerCase())\n }\n\n #getChecksummedAddress(address: string) {\n try {\n return getAddress(address)\n } catch {\n this.emitError({\n message: 'Invalid address',\n level: 'minor',\n error: new Error('Address Book: invalid address')\n })\n return ''\n }\n }\n\n async addContact(name: string, address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedName = name.trim()\n\n if (!this.#findContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: 'Contact with this address already exists in the Address Book',\n level: 'minor',\n error: new Error(\n 'Address Book: contact with this address already exists in the Address Book'\n )\n })\n return\n }\n\n this.#manuallyAddedContacts.push({\n name: trimmedName,\n address: checksummedAddress,\n createdAt: Date.now(),\n updatedAt: Date.now()\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async renameManuallyAddedContact(address: string, newName: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedNewName = newName.trim()\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't rename contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't rename contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.map((contact) => {\n if (contact.address.toLowerCase() === address.toLowerCase()) {\n return { ...contact, name: trimmedNewName, updatedAt: Date.now() }\n }\n\n return contact\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async removeManuallyAddedContact(address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't remove contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't remove contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.filter(\n (contact) => contact.address.toLowerCase() !== address.toLowerCase()\n )\n\n this.#handleManuallyAddedContactsChange()\n }\n\n toJSON() {\n return {\n ...this,\n contacts: this.contacts\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.d.ts b/dist/src/controllers/dapps/dapps.d.ts new file mode 100644 index 000000000..16210c0d5 --- /dev/null +++ b/dist/src/controllers/dapps/dapps.d.ts @@ -0,0 +1,32 @@ +import { Session, SessionProp } from '../../classes/session'; +import { Dapp } from '../../interfaces/dapp'; +import { Messenger } from '../../interfaces/messenger'; +import { Storage } from '../../interfaces/storage'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export declare class DappsController extends EventEmitter { + #private; + dappSessions: { + [key: string]: Session; + }; + initialLoadPromise: Promise; + constructor(_storage: Storage); + get isReady(): boolean; + get dapps(): Dapp[]; + set dapps(updatedDapps: Dapp[]); + getOrCreateDappSession: (data: SessionProp) => Session; + setSessionMessenger: (key: string, messenger: Messenger) => void; + setSessionProp: (key: string, props: SessionProp) => void; + deleteDappSession: (key: string) => void; + broadcastDappSessionEvent: (ev: any, data?: any, origin?: string) => void; + addDapp(dapp: Dapp): void; + updateDapp(url: string, dapp: Partial): void; + removeDapp(url: string): void; + hasPermission(url: string): boolean; + getDapp(url: string): Dapp | undefined; + toJSON(): this & { + dapps: Dapp[]; + isReady: boolean; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=dapps.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.d.ts.map b/dist/src/controllers/dapps/dapps.d.ts.map new file mode 100644 index 000000000..b942988fe --- /dev/null +++ b/dist/src/controllers/dapps/dapps.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"dapps.d.ts","sourceRoot":"","sources":["../../../../src/controllers/dapps/dapps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AASvD,qBAAa,eAAgB,SAAQ,YAAY;;IAK/C,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAK;IAG7C,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAErB,QAAQ,EAAE,OAAO;IAS7B,IAAI,OAAO,YAEV;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAiBlB;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,EAI7B;IAmCD,sBAAsB,SAAU,WAAW,aAS1C;IAED,mBAAmB,QAAS,MAAM,aAAa,SAAS,UAEvD;IAED,cAAc,QAAS,MAAM,SAAS,WAAW,UAEhD;IAED,iBAAiB,QAAS,MAAM,UAG/B;IAED,yBAAyB,OAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAyBhE;IAED,OAAO,CAAC,IAAI,EAAE,IAAI;IAgBlB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;IAU3C,UAAU,CAAC,GAAG,EAAE,MAAM;IAUtB,aAAa,CAAC,GAAG,EAAE,MAAM;IAOzB,OAAO,CAAC,GAAG,EAAE,MAAM;IAMnB,MAAM;;;;;CAQP"} \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.js b/dist/src/controllers/dapps/dapps.js new file mode 100644 index 000000000..c04df5607 --- /dev/null +++ b/dist/src/controllers/dapps/dapps.js @@ -0,0 +1,169 @@ +import { Session } from '../../classes/session'; +import predefinedDapps from '../../consts/dappCatalog.json'; +import EventEmitter from '../eventEmitter/eventEmitter'; +// The DappsController is responsible for the following tasks: +// 1. Managing the dApp catalog +// 2. Handling active sessions between dApps and the wallet +// 3. Broadcasting events from the wallet to connected dApps via the Session +// The possible events include: accountsChanged, chainChanged, disconnect, lock, unlock, and connect. +export class DappsController extends EventEmitter { + #dapps = []; + #storage; + dappSessions = {}; + // Holds the initial load promise, so that one can wait until it completes + initialLoadPromise; + constructor(_storage) { + super(); + this.#storage = _storage; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.initialLoadPromise = this.#load(); + } + get isReady() { + return !!this.dapps; + } + get dapps() { + const predefinedDappsParsed = predefinedDapps.map(({ url, name, icon, description }) => ({ + name, + description, + url, + icon, + isConnected: false, + chainId: 1, + favorite: false + })); + return [...this.#dapps, ...predefinedDappsParsed].reduce((acc, curr) => { + if (!acc.some(({ url }) => url === curr.url)) + return [...acc, curr]; + return acc; + }, []); + } + set dapps(updatedDapps) { + this.#dapps = updatedDapps; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#storage.set('dapps', updatedDapps); + } + async #load() { + // eslint-disable-next-line prefer-const + let [storedDapps, dappSessions] = await Promise.all([ + this.#storage.get('dapps', []), + this.#storage.get('dappSessions', {}) + ]); + this.#dapps = storedDapps; + Object.keys(dappSessions).forEach((sessionId) => { + const session = new Session(dappSessions[sessionId]); + this.dappSessions[sessionId] = session; + }); + this.emitUpdate(); + } + #dappSessionsSet(sessionId, session) { + this.dappSessions[sessionId] = session; + this.#storage.set('dappSessions', this.dappSessions); + } + #dappSessionsDelete(sessionId) { + delete this.dappSessions[sessionId]; + this.#storage.set('dappSessions', this.dappSessions); + } + #createDappSession = (data) => { + const dappSession = new Session(data); + this.#dappSessionsSet(dappSession.sessionId, dappSession); + this.emitUpdate(); + return dappSession; + }; + getOrCreateDappSession = (data) => { + if (!data.tabId || !data.origin) + throw new Error('Invalid props passed to getOrCreateDappSession'); + if (this.dappSessions[`${data.tabId}-${data.origin}`]) { + return this.dappSessions[`${data.tabId}-${data.origin}`]; + } + return this.#createDappSession(data); + }; + setSessionMessenger = (key, messenger) => { + this.dappSessions[key].setMessenger(messenger); + }; + setSessionProp = (key, props) => { + this.dappSessions[key].setProp(props); + }; + deleteDappSession = (key) => { + this.#dappSessionsDelete(key); + this.emitUpdate(); + }; + broadcastDappSessionEvent = (ev, data, origin) => { + let dappSessions = []; + Object.keys(this.dappSessions).forEach((key) => { + if (this.dappSessions[key] && this.hasPermission(this.dappSessions[key].origin)) { + dappSessions.push({ + key, + data: this.dappSessions[key] + }); + } + }); + if (origin) { + dappSessions = dappSessions.filter((dappSession) => dappSession.data.origin === origin); + } + dappSessions.forEach((dappSession) => { + try { + dappSession.data.sendMessage?.(ev, data); + } + catch (e) { + if (this.dappSessions[dappSession.key]) { + this.deleteDappSession(dappSession.key); + } + } + }); + this.emitUpdate(); + }; + addDapp(dapp) { + if (!this.isReady) + return; + const doesAlreadyExist = this.dapps.find((d) => d.url === dapp.url); + if (doesAlreadyExist) { + this.updateDapp(dapp.url, { + chainId: dapp.chainId, + isConnected: dapp.isConnected, + favorite: dapp.favorite + }); + return; + } + this.dapps = [...this.dapps, dapp]; + this.emitUpdate(); + } + updateDapp(url, dapp) { + if (!this.isReady) + return; + this.dapps = this.dapps.map((d) => { + if (d.url === url) + return { ...d, ...dapp }; + return d; + }); + this.emitUpdate(); + } + removeDapp(url) { + if (!this.isReady) + return; + // do not remove predefined dapps + if (predefinedDapps.find((d) => d.url === url)) + return; + this.dapps = this.dapps.filter((d) => d.url !== url); + this.emitUpdate(); + } + hasPermission(url) { + const dapp = this.dapps.find((d) => d.url === url); + if (!dapp) + return false; + return dapp.isConnected; + } + getDapp(url) { + if (!this.isReady) + return; + return this.dapps.find((d) => d.url === url); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + dapps: this.dapps, + isReady: this.isReady + }; + } +} +//# sourceMappingURL=dapps.js.map \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.js.map b/dist/src/controllers/dapps/dapps.js.map new file mode 100644 index 000000000..b9d9edf68 --- /dev/null +++ b/dist/src/controllers/dapps/dapps.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dapps.js","sourceRoot":"","sources":["../../../../src/controllers/dapps/dapps.ts"],"names":[],"mappings":"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","sourcesContent":["import { Session, SessionProp } from '../../classes/session'\nimport predefinedDapps from '../../consts/dappCatalog.json'\nimport { Dapp } from '../../interfaces/dapp'\nimport { Messenger } from '../../interfaces/messenger'\nimport { Storage } from '../../interfaces/storage'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// The DappsController is responsible for the following tasks:\n// 1. Managing the dApp catalog\n// 2. Handling active sessions between dApps and the wallet\n// 3. Broadcasting events from the wallet to connected dApps via the Session\n\n// The possible events include: accountsChanged, chainChanged, disconnect, lock, unlock, and connect.\n\nexport class DappsController extends EventEmitter {\n #dapps: Dapp[] = []\n\n #storage: Storage\n\n dappSessions: { [key: string]: Session } = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(_storage: Storage) {\n super()\n\n this.#storage = _storage\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isReady() {\n return !!this.dapps\n }\n\n get dapps(): Dapp[] {\n const predefinedDappsParsed = predefinedDapps.map(\n ({ url, name, icon, description }): Dapp => ({\n name,\n description,\n url,\n icon,\n isConnected: false,\n chainId: 1,\n favorite: false\n })\n )\n\n return [...this.#dapps, ...predefinedDappsParsed].reduce((acc: Dapp[], curr: Dapp): Dapp[] => {\n if (!acc.some(({ url }) => url === curr.url)) return [...acc, curr]\n return acc\n }, [])\n }\n\n set dapps(updatedDapps: Dapp[]) {\n this.#dapps = updatedDapps\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('dapps', updatedDapps)\n }\n\n async #load() {\n // eslint-disable-next-line prefer-const\n let [storedDapps, dappSessions] = await Promise.all([\n this.#storage.get('dapps', []),\n this.#storage.get('dappSessions', {})\n ])\n\n this.#dapps = storedDapps\n Object.keys(dappSessions).forEach((sessionId) => {\n const session = new Session(dappSessions[sessionId])\n this.dappSessions[sessionId] = session\n })\n this.emitUpdate()\n }\n\n #dappSessionsSet(sessionId: string, session: Session) {\n this.dappSessions[sessionId] = session\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #dappSessionsDelete(sessionId: string) {\n delete this.dappSessions[sessionId]\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #createDappSession = (data: SessionProp) => {\n const dappSession = new Session(data)\n this.#dappSessionsSet(dappSession.sessionId, dappSession)\n this.emitUpdate()\n\n return dappSession\n }\n\n getOrCreateDappSession = (data: SessionProp) => {\n if (!data.tabId || !data.origin)\n throw new Error('Invalid props passed to getOrCreateDappSession')\n\n if (this.dappSessions[`${data.tabId}-${data.origin}`]) {\n return this.dappSessions[`${data.tabId}-${data.origin}`]\n }\n\n return this.#createDappSession(data)\n }\n\n setSessionMessenger = (key: string, messenger: Messenger) => {\n this.dappSessions[key].setMessenger(messenger)\n }\n\n setSessionProp = (key: string, props: SessionProp) => {\n this.dappSessions[key].setProp(props)\n }\n\n deleteDappSession = (key: string) => {\n this.#dappSessionsDelete(key)\n this.emitUpdate()\n }\n\n broadcastDappSessionEvent = (ev: any, data?: any, origin?: string) => {\n let dappSessions: { key: string; data: Session }[] = []\n Object.keys(this.dappSessions).forEach((key) => {\n if (this.dappSessions[key] && this.hasPermission(this.dappSessions[key].origin)) {\n dappSessions.push({\n key,\n data: this.dappSessions[key]\n })\n }\n })\n\n if (origin) {\n dappSessions = dappSessions.filter((dappSession) => dappSession.data.origin === origin)\n }\n\n dappSessions.forEach((dappSession) => {\n try {\n dappSession.data.sendMessage?.(ev, data)\n } catch (e) {\n if (this.dappSessions[dappSession.key]) {\n this.deleteDappSession(dappSession.key)\n }\n }\n })\n this.emitUpdate()\n }\n\n addDapp(dapp: Dapp) {\n if (!this.isReady) return\n\n const doesAlreadyExist = this.dapps.find((d) => d.url === dapp.url)\n if (doesAlreadyExist) {\n this.updateDapp(dapp.url, {\n chainId: dapp.chainId,\n isConnected: dapp.isConnected,\n favorite: dapp.favorite\n })\n return\n }\n this.dapps = [...this.dapps, dapp]\n this.emitUpdate()\n }\n\n updateDapp(url: string, dapp: Partial) {\n if (!this.isReady) return\n\n this.dapps = this.dapps.map((d) => {\n if (d.url === url) return { ...d, ...dapp }\n return d\n })\n this.emitUpdate()\n }\n\n removeDapp(url: string) {\n if (!this.isReady) return\n\n // do not remove predefined dapps\n if (predefinedDapps.find((d) => d.url === url)) return\n\n this.dapps = this.dapps.filter((d) => d.url !== url)\n this.emitUpdate()\n }\n\n hasPermission(url: string) {\n const dapp = this.dapps.find((d) => d.url === url)\n if (!dapp) return false\n\n return dapp.isConnected\n }\n\n getDapp(url: string) {\n if (!this.isReady) return\n\n return this.dapps.find((d) => d.url === url)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n dapps: this.dapps,\n isReady: this.isReady\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.d.ts b/dist/src/controllers/defiPositions/defiPositions.d.ts new file mode 100644 index 000000000..69ced7f87 --- /dev/null +++ b/dist/src/controllers/defiPositions/defiPositions.d.ts @@ -0,0 +1,27 @@ +import { Fetch } from '../../interfaces/fetch'; +import { NetworkId } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import { AccountState } from '../../libs/defiPositions/types'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +export declare class DefiPositionsController extends EventEmitter { + #private; + constructor({ fetch, storage, selectedAccount, providers, networks }: { + fetch: Fetch; + storage: Storage; + selectedAccount: SelectedAccountController; + providers: ProvidersController; + networks: NetworksController; + }); + updatePositions(networkId?: NetworkId): Promise; + removeNetworkData(networkId: NetworkId): void; + getDefiPositionsState(accountAddr: string): AccountState; + getNetworksWithPositions(accountAddr: string): import("../../libs/defiPositions/types").NetworksWithPositions; + removeAccountData(accountAddr: string): void; + toJSON(): this & { + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=defiPositions.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.d.ts.map b/dist/src/controllers/defiPositions/defiPositions.d.ts.map new file mode 100644 index 000000000..2c38a03c7 --- /dev/null +++ b/dist/src/controllers/defiPositions/defiPositions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"defiPositions.d.ts","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,OAAO,EACL,YAAY,EAMb,MAAM,gCAAgC,CAAA;AACvC,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,qBAAa,uBAAwB,SAAQ,YAAY;;gBAiB3C,EACV,KAAK,EACL,OAAO,EACP,eAAe,EACf,SAAS,EACT,QAAQ,EACT,EAAE;QACD,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,eAAe,EAAE,yBAAyB,CAAA;QAC1C,SAAS,EAAE,mBAAmB,CAAA;QAC9B,QAAQ,EAAE,kBAAkB,CAAA;KAC7B;IAqDK,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS;IA4L3C,iBAAiB,CAAC,SAAS,EAAE,SAAS;IAOtC,qBAAqB,CAAC,WAAW,EAAE,MAAM;IAIzC,wBAAwB,CAAC,WAAW,EAAE,MAAM;IAI5C,iBAAiB,CAAC,WAAW,EAAE,MAAM;IAQrC,MAAM;;;CAMP"} \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.js b/dist/src/controllers/defiPositions/defiPositions.js new file mode 100644 index 000000000..7cbb6c6e6 --- /dev/null +++ b/dist/src/controllers/defiPositions/defiPositions.js @@ -0,0 +1,212 @@ +import { getAssetValue } from '../../libs/defiPositions/helpers'; +import { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'; +import getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'; +import { DeFiPositionsError } from '../../libs/defiPositions/types'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export class DefiPositionsController extends EventEmitter { + #selectedAccount; + #providers; + #networks; + #fetch; + #storage; + #minUpdateInterval = 60 * 1000; // 1 minute + #state = {}; + #networksWithPositionsByAccounts = {}; + constructor({ fetch, storage, selectedAccount, providers, networks }) { + super(); + this.#fetch = fetch; + this.#storage = storage; + this.#selectedAccount = selectedAccount; + this.#providers = providers; + this.#networks = networks; + } + #setProviderError(accountAddr, networkId, providerName, errorMessage) { + if (!this.#state[accountAddr][networkId].providerErrors) { + this.#state[accountAddr][networkId].providerErrors = []; + } + this.#state[accountAddr][networkId].providerErrors.push({ + providerName, + error: errorMessage + }); + } + #getCanSkipUpdate(accountAddr, networkId) { + const networkState = this.#state[accountAddr][networkId]; + if (networkState.error || networkState.providerErrors?.length) + return false; + const isWithinMinUpdateInterval = networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval; + return isWithinMinUpdateInterval || networkState.isLoading; + } + async #updateNetworksWithPositions(accountId, accountState) { + const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {}); + this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(accountId, accountState, storageStateByAccount, this.#providers.providers); + this.emitUpdate(); + await this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts); + } + async updatePositions(networkId) { + if (!this.#selectedAccount.account) + return; + const selectedAccountAddr = this.#selectedAccount.account.addr; + const networksToUpdate = networkId + ? this.#networks.networks.filter((n) => n.id === networkId) + : this.#networks.networks; + if (!this.#state[selectedAccountAddr]) { + this.#state[selectedAccountAddr] = {}; + } + await Promise.all(networksToUpdate.map(async (n) => { + if (!this.#state[selectedAccountAddr][n.id]) { + this.#state[selectedAccountAddr][n.id] = { + isLoading: false, + positionsByProvider: [], + updatedAt: undefined + }; + } + if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) { + // Emit an update so that the current account data getter is updated + this.emitUpdate(); + return; + } + this.#state[selectedAccountAddr][n.id].isLoading = true; + this.emitUpdate(); + const networkState = this.#state[selectedAccountAddr][n.id]; + // Reset provider errors before updating + networkState.providerErrors = []; + networkState.error = undefined; + try { + const previousPositions = networkState.positionsByProvider; + const [aavePositions, uniV3Positions] = await Promise.all([ + getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { + console.error('getAAVEPositions error:', e); + this.#setProviderError(selectedAccountAddr, n.id, 'AAVE v3', e?.message || 'Unknown error'); + // We should consider changing the structure of positions in a way + // that this isn't needed. This is done so if there is an error, + // old data can still be displayed + return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null; + }), + getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { + console.error('getUniV3Positions error:', e); + this.#setProviderError(selectedAccountAddr, n.id, 'Uniswap V3', e?.message || 'Unknown error'); + // We should consider changing the structure of positions in a way + // that this isn't needed. This is done so if there is an error, + // old data can still be displayed + return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null; + }) + ]); + const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length; + this.#state[selectedAccountAddr][n.id] = { + ...networkState, + isLoading: false, + positionsByProvider: [aavePositions, uniV3Positions].filter(Boolean), + updatedAt: hasErrors ? networkState.updatedAt : Date.now() + }; + await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => { + console.error('#setAssetPrices error:', e); + this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError; + }); + } + catch (e) { + const prevPositionsByProvider = networkState.positionsByProvider; + this.#state[selectedAccountAddr][n.id] = { + isLoading: false, + positionsByProvider: prevPositionsByProvider || [], + error: DeFiPositionsError.CriticalError + }; + console.error(`updatePositions error on ${n.id}`, e); + } + finally { + this.emitUpdate(); + } + })); + await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr]); + } + async #setAssetPrices(accountAddr, networkId) { + const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId; + // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com) + // since it would return nothing. + // This can happen when adding a custom network that doesn't have a CoinGecko platform ID. + if (!platformId) + throw new Error('Missing `platformId`'); + const dedup = (x) => x.filter((y, i) => x.indexOf(y) === i); + const networkState = this.#state[accountAddr][networkId]; + const addresses = []; + networkState.positionsByProvider.forEach((providerPos) => { + providerPos.positions.forEach((p) => { + p.assets.forEach((a) => { + addresses.push(a.address); + }); + }); + }); + const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(addresses).join('%2C')}&vs_currencies=usd`; + const resp = await this.#fetch(cenaUrl); + const body = await resp.json(); + if (resp.status !== 200) + throw body; + // eslint-disable-next-line no-prototype-builtins + if (body.hasOwnProperty('message')) + throw body; + // eslint-disable-next-line no-prototype-builtins + if (body.hasOwnProperty('error')) + throw body; + const positionsByProviderWithPrices = this.#state[accountAddr][networkId].positionsByProvider.map((positionsByProvider) => { + if (positionsByProvider.providerName.toLowerCase().includes('aave')) + return positionsByProvider; + const updatedPositions = positionsByProvider.positions.map((position) => { + let positionInUSD = position.additionalData.positionInUSD || 0; + const updatedAssets = position.assets.map((asset) => { + const priceData = body[asset.address.toLowerCase()]; + if (!priceData) + return asset; + const priceIn = Object.entries(priceData).map(([currency, price]) => ({ + baseCurrency: currency, + price: price + })); + const value = getAssetValue(asset.amount, asset.decimals, priceIn); + positionInUSD += value; + return { + ...asset, + value, + priceIn + }; + }); + return { + ...position, + assets: updatedAssets, + additionalData: { ...position.additionalData, positionInUSD } + }; + }); + let positionInUSD = positionsByProvider.positionInUSD; + // Already set in the corresponding lib + if (!positionInUSD) { + positionInUSD = updatedPositions.reduce((prevPositionValue, position) => { + return prevPositionValue + (position.additionalData.positionInUSD || 0); + }, 0); + } + return { ...positionsByProvider, positions: updatedPositions, positionInUSD }; + }); + this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices; + } + removeNetworkData(networkId) { + Object.keys(this.#state).forEach((accountId) => { + delete this.#state[accountId][networkId]; + }); + this.emitUpdate(); + } + getDefiPositionsState(accountAddr) { + return this.#state[accountAddr] || {}; + } + getNetworksWithPositions(accountAddr) { + return this.#networksWithPositionsByAccounts[accountAddr] || []; + } + removeAccountData(accountAddr) { + delete this.#state[accountAddr]; + delete this.#networksWithPositionsByAccounts[accountAddr]; + this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts); + this.emitUpdate(); + } + toJSON() { + return { + ...this, + ...super.toJSON() + }; + } +} +//# sourceMappingURL=defiPositions.js.map \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.js.map b/dist/src/controllers/defiPositions/defiPositions.js.map new file mode 100644 index 000000000..67c3b1233 --- /dev/null +++ b/dist/src/controllers/defiPositions/defiPositions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defiPositions.js","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { getAssetValue } from '../../libs/defiPositions/helpers'\nimport { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'\nimport getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'\nimport {\n AccountState,\n DeFiPositionsError,\n DeFiPositionsState,\n NetworksWithPositionsByAccounts,\n PositionsByProvider,\n ProviderName\n} from '../../libs/defiPositions/types'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport class DefiPositionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #fetch: Fetch\n\n #storage: Storage\n\n #minUpdateInterval: number = 60 * 1000 // 1 minute\n\n #state: DeFiPositionsState = {}\n\n #networksWithPositionsByAccounts: NetworksWithPositionsByAccounts = {}\n\n constructor({\n fetch,\n storage,\n selectedAccount,\n providers,\n networks\n }: {\n fetch: Fetch\n storage: Storage\n selectedAccount: SelectedAccountController\n providers: ProvidersController\n networks: NetworksController\n }) {\n super()\n\n this.#fetch = fetch\n this.#storage = storage\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n }\n\n #setProviderError(\n accountAddr: string,\n networkId: string,\n providerName: ProviderName,\n errorMessage: string\n ) {\n if (!this.#state[accountAddr][networkId].providerErrors) {\n this.#state[accountAddr][networkId].providerErrors = []\n }\n\n this.#state[accountAddr][networkId].providerErrors!.push({\n providerName,\n error: errorMessage\n })\n }\n\n #getCanSkipUpdate(accountAddr: string, networkId: string) {\n const networkState = this.#state[accountAddr][networkId]\n\n if (networkState.error || networkState.providerErrors?.length) return false\n const isWithinMinUpdateInterval =\n networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n async #updateNetworksWithPositions(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {})\n\n this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set(\n 'networksWithPositionsByAccounts',\n this.#networksWithPositionsByAccounts\n )\n }\n\n async updatePositions(networkId?: NetworkId) {\n if (!this.#selectedAccount.account) return\n\n const selectedAccountAddr = this.#selectedAccount.account.addr\n const networksToUpdate = networkId\n ? this.#networks.networks.filter((n) => n.id === networkId)\n : this.#networks.networks\n\n if (!this.#state[selectedAccountAddr]) {\n this.#state[selectedAccountAddr] = {}\n }\n\n await Promise.all(\n networksToUpdate.map(async (n) => {\n if (!this.#state[selectedAccountAddr][n.id]) {\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: [],\n updatedAt: undefined\n }\n }\n\n if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) {\n // Emit an update so that the current account data getter is updated\n this.emitUpdate()\n return\n }\n\n this.#state[selectedAccountAddr][n.id].isLoading = true\n this.emitUpdate()\n\n const networkState = this.#state[selectedAccountAddr][n.id]\n // Reset provider errors before updating\n networkState.providerErrors = []\n networkState.error = undefined\n\n try {\n const previousPositions = networkState.positionsByProvider\n const [aavePositions, uniV3Positions] = await Promise.all([\n getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getAAVEPositions error:', e)\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'AAVE v3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null\n }\n ),\n getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getUniV3Positions error:', e)\n\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'Uniswap V3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null\n }\n )\n ])\n\n const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length\n\n this.#state[selectedAccountAddr][n.id] = {\n ...networkState,\n isLoading: false,\n positionsByProvider: [aavePositions, uniV3Positions].filter(\n Boolean\n ) as PositionsByProvider[],\n updatedAt: hasErrors ? networkState.updatedAt : Date.now()\n }\n await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => {\n console.error('#setAssetPrices error:', e)\n this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError\n })\n } catch (e: any) {\n const prevPositionsByProvider = networkState.positionsByProvider\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: prevPositionsByProvider || [],\n error: DeFiPositionsError.CriticalError\n }\n console.error(`updatePositions error on ${n.id}`, e)\n } finally {\n this.emitUpdate()\n }\n })\n )\n\n await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr])\n }\n\n async #setAssetPrices(accountAddr: string, networkId: string) {\n const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId\n\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n if (!platformId) throw new Error('Missing `platformId`')\n\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n\n const networkState = this.#state[accountAddr][networkId]\n\n const addresses: string[] = []\n\n networkState.positionsByProvider.forEach((providerPos) => {\n providerPos.positions.forEach((p) => {\n p.assets.forEach((a) => {\n addresses.push(a.address)\n })\n })\n })\n\n const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(\n addresses\n ).join('%2C')}&vs_currencies=usd`\n\n const resp = await this.#fetch(cenaUrl)\n const body = await resp.json()\n if (resp.status !== 200) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('message')) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('error')) throw body\n\n const positionsByProviderWithPrices = this.#state[accountAddr][\n networkId\n ].positionsByProvider.map((positionsByProvider) => {\n if (positionsByProvider.providerName.toLowerCase().includes('aave'))\n return positionsByProvider\n\n const updatedPositions = positionsByProvider.positions.map((position) => {\n let positionInUSD = position.additionalData.positionInUSD || 0\n\n const updatedAssets = position.assets.map((asset) => {\n const priceData = body[asset.address.toLowerCase()]\n if (!priceData) return asset\n\n const priceIn = Object.entries(priceData).map(([currency, price]) => ({\n baseCurrency: currency,\n price: price as number\n }))\n\n const value = getAssetValue(asset.amount, asset.decimals, priceIn)\n\n positionInUSD += value\n\n return {\n ...asset,\n value,\n priceIn\n }\n })\n\n return {\n ...position,\n assets: updatedAssets,\n additionalData: { ...position.additionalData, positionInUSD }\n }\n })\n\n let positionInUSD = positionsByProvider.positionInUSD\n\n // Already set in the corresponding lib\n if (!positionInUSD) {\n positionInUSD = updatedPositions.reduce((prevPositionValue, position) => {\n return prevPositionValue + (position.additionalData.positionInUSD || 0)\n }, 0)\n }\n\n return { ...positionsByProvider, positions: updatedPositions, positionInUSD }\n })\n\n this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices\n }\n\n removeNetworkData(networkId: NetworkId) {\n Object.keys(this.#state).forEach((accountId) => {\n delete this.#state[accountId][networkId]\n })\n this.emitUpdate()\n }\n\n getDefiPositionsState(accountAddr: string) {\n return this.#state[accountAddr] || {}\n }\n\n getNetworksWithPositions(accountAddr: string) {\n return this.#networksWithPositionsByAccounts[accountAddr] || []\n }\n\n removeAccountData(accountAddr: string) {\n delete this.#state[accountAddr]\n delete this.#networksWithPositionsByAccounts[accountAddr]\n this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts)\n\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.d.ts b/dist/src/controllers/domains/domains.d.ts new file mode 100644 index 000000000..fc345b356 --- /dev/null +++ b/dist/src/controllers/domains/domains.d.ts @@ -0,0 +1,34 @@ +import { RPCProviders } from '../../interfaces/provider'; +import EventEmitter from '../eventEmitter/eventEmitter'; +interface Domains { + [address: string]: { + ens: string | null; + ud: string | null; + savedAt: number; + }; +} +/** + * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names. + * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups. + */ +export declare class DomainsController extends EventEmitter { + #private; + domains: Domains; + loadingAddresses: string[]; + constructor(providers: RPCProviders); + batchReverseLookup(addresses: string[]): Promise; + /** + *Saves an already resolved ENS or UD name for an address. + */ + saveResolvedReverseLookup({ address, name, type }: { + address: string; + name: string; + type: 'ens' | 'ud'; + }): void; + /** + * Resolves the ENS and UD names for an address if such exist. + */ + reverseLookup(address: string, emitUpdate?: boolean): Promise; +} +export {}; +//# sourceMappingURL=domains.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.d.ts.map b/dist/src/controllers/domains/domains.d.ts.map new file mode 100644 index 000000000..86806c229 --- /dev/null +++ b/dist/src/controllers/domains/domains.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../../../src/controllers/domains/domains.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGxD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAEvD,UAAU,OAAO;IACf,CAAC,OAAO,EAAE,MAAM,GAAG;QACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAWD;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;;IAGjD,OAAO,EAAE,OAAO,CAAK;IAErB,gBAAgB,EAAE,MAAM,EAAE,CAAK;gBAEnB,SAAS,EAAE,YAAY;IAK7B,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE;IAO5C;;OAEG;IACH,yBAAyB,CAAC,EACxB,OAAO,EACP,IAAI,EACJ,IAAI,EACL,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;KACnB;IAYD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAO;CAsDvD"} \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.js b/dist/src/controllers/domains/domains.js new file mode 100644 index 000000000..cede9418e --- /dev/null +++ b/dist/src/controllers/domains/domains.js @@ -0,0 +1,91 @@ +import { getAddress, isAddress } from 'ethers'; +import { reverseLookupEns } from '../../services/ensDomains'; +// import { reverseLookupUD } from '../../services/unstoppableDomains' +import EventEmitter from '../eventEmitter/eventEmitter'; +// 15 minutes +const PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000; +// const EXPECTED_UD_ERROR_MESSAGES = [ +// 'Only absolute URLs are supported', +// 'unexpected character at line 1 column 1 of the JSON data', +// 'Unexpected token' +// ] +/** + * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names. + * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups. + */ +export class DomainsController extends EventEmitter { + #providers = {}; + domains = {}; + loadingAddresses = []; + constructor(providers) { + super(); + this.#providers = providers; + } + async batchReverseLookup(addresses) { + const filteredAddresses = addresses.filter((address) => isAddress(address)); + await Promise.all(filteredAddresses.map((address) => this.reverseLookup(address, false))); + this.emitUpdate(); + } + /** + *Saves an already resolved ENS or UD name for an address. + */ + saveResolvedReverseLookup({ address, name, type }) { + const checksummedAddress = getAddress(address); + const { ens: oldEns, ud: oldUd } = this.domains[checksummedAddress] || { ens: null, ud: null }; + this.domains[checksummedAddress] = { + ens: type === 'ens' ? name : oldEns, + ud: type === 'ud' ? name : oldUd, + savedAt: Date.now() + }; + this.emitUpdate(); + } + /** + * Resolves the ENS and UD names for an address if such exist. + */ + async reverseLookup(address, emitUpdate = true) { + if (!('ethereum' in this.#providers)) { + this.emitError({ + error: new Error('domains.reverseLookup: Ethereum provider is not available'), + message: 'The RPC provider for Ethereum is not available.', + level: 'major' + }); + return; + } + const checksummedAddress = getAddress(address); + const isAlreadyResolved = !!this.domains[checksummedAddress]; + const isExpired = isAlreadyResolved && + Date.now() - this.domains[checksummedAddress].savedAt > PERSIST_DOMAIN_FOR_IN_MS; + if ((isAlreadyResolved && !isExpired) || this.loadingAddresses.includes(checksummedAddress)) + return; + this.loadingAddresses.push(checksummedAddress); + this.emitUpdate(); + let ensName = null; + try { + ensName = (await reverseLookupEns(checksummedAddress, this.#providers.ethereum)) || null; + } + catch (e) { + console.error('ENS reverse lookup unexpected error', e); + } + // Don't reverse lookup UD names for now + // https://github.com/AmbireTech/ambire-app/issues/2681#issuecomment-2299460748 + // If UD is ever needed, rewrite using Promise.all + // try { + // udName = (await reverseLookupUD(checksummedAddress)) || null + // } catch (e: any) { + // if ( + // !EXPECTED_UD_ERROR_MESSAGES.some((expectedMessage) => e.message.includes(expectedMessage)) + // ) { + // console.error('UD reverse lookup unexpected error', e) + // } + // } + this.domains[checksummedAddress] = { + ens: ensName, + ud: null, + savedAt: Date.now() + }; + this.loadingAddresses = this.loadingAddresses.filter((loadingAddress) => loadingAddress !== checksummedAddress); + if (emitUpdate) + this.emitUpdate(); + } +} +//# sourceMappingURL=domains.js.map \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.js.map b/dist/src/controllers/domains/domains.js.map new file mode 100644 index 000000000..6f610271a --- /dev/null +++ b/dist/src/controllers/domains/domains.js.map @@ -0,0 +1 @@ +{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../../../src/controllers/domains/domains.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { RPCProviders } from '../../interfaces/provider'\nimport { reverseLookupEns } from '../../services/ensDomains'\n// import { reverseLookupUD } from '../../services/unstoppableDomains'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\ninterface Domains {\n [address: string]: {\n ens: string | null\n ud: string | null\n savedAt: number\n }\n}\n\n// 15 minutes\nconst PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000\n\n// const EXPECTED_UD_ERROR_MESSAGES = [\n// 'Only absolute URLs are supported',\n// 'unexpected character at line 1 column 1 of the JSON data',\n// 'Unexpected token'\n// ]\n\n/**\n * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names.\n * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups.\n */\nexport class DomainsController extends EventEmitter {\n #providers: RPCProviders = {}\n\n domains: Domains = {}\n\n loadingAddresses: string[] = []\n\n constructor(providers: RPCProviders) {\n super()\n this.#providers = providers\n }\n\n async batchReverseLookup(addresses: string[]) {\n const filteredAddresses = addresses.filter((address) => isAddress(address))\n await Promise.all(filteredAddresses.map((address) => this.reverseLookup(address, false)))\n\n this.emitUpdate()\n }\n\n /**\n *Saves an already resolved ENS or UD name for an address.\n */\n saveResolvedReverseLookup({\n address,\n name,\n type\n }: {\n address: string\n name: string\n type: 'ens' | 'ud'\n }) {\n const checksummedAddress = getAddress(address)\n const { ens: oldEns, ud: oldUd } = this.domains[checksummedAddress] || { ens: null, ud: null }\n\n this.domains[checksummedAddress] = {\n ens: type === 'ens' ? name : oldEns,\n ud: type === 'ud' ? name : oldUd,\n savedAt: Date.now()\n }\n this.emitUpdate()\n }\n\n /**\n * Resolves the ENS and UD names for an address if such exist.\n */\n async reverseLookup(address: string, emitUpdate = true) {\n if (!('ethereum' in this.#providers)) {\n this.emitError({\n error: new Error('domains.reverseLookup: Ethereum provider is not available'),\n message: 'The RPC provider for Ethereum is not available.',\n level: 'major'\n })\n return\n }\n const checksummedAddress = getAddress(address)\n const isAlreadyResolved = !!this.domains[checksummedAddress]\n const isExpired =\n isAlreadyResolved &&\n Date.now() - this.domains[checksummedAddress].savedAt > PERSIST_DOMAIN_FOR_IN_MS\n\n if ((isAlreadyResolved && !isExpired) || this.loadingAddresses.includes(checksummedAddress))\n return\n\n this.loadingAddresses.push(checksummedAddress)\n this.emitUpdate()\n\n let ensName = null\n\n try {\n ensName = (await reverseLookupEns(checksummedAddress, this.#providers.ethereum)) || null\n } catch (e) {\n console.error('ENS reverse lookup unexpected error', e)\n }\n\n // Don't reverse lookup UD names for now\n // https://github.com/AmbireTech/ambire-app/issues/2681#issuecomment-2299460748\n // If UD is ever needed, rewrite using Promise.all\n // try {\n // udName = (await reverseLookupUD(checksummedAddress)) || null\n // } catch (e: any) {\n // if (\n // !EXPECTED_UD_ERROR_MESSAGES.some((expectedMessage) => e.message.includes(expectedMessage))\n // ) {\n // console.error('UD reverse lookup unexpected error', e)\n // }\n // }\n\n this.domains[checksummedAddress] = {\n ens: ensName,\n ud: null,\n savedAt: Date.now()\n }\n\n this.loadingAddresses = this.loadingAddresses.filter(\n (loadingAddress) => loadingAddress !== checksummedAddress\n )\n\n if (emitUpdate) this.emitUpdate()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.d.ts b/dist/src/controllers/emailVault/emailVault.d.ts new file mode 100644 index 000000000..7b1fb2db0 --- /dev/null +++ b/dist/src/controllers/emailVault/emailVault.d.ts @@ -0,0 +1,83 @@ +import { Banner } from '../../interfaces/banner'; +import { EmailVaultData, MagicLinkFlow } from '../../interfaces/emailVault'; +import { Fetch } from '../../interfaces/fetch'; +import { Storage } from '../../interfaces/storage'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +import { KeystoreController } from '../keystore/keystore'; +export declare enum EmailVaultState { + Loading = "loading", + WaitingEmailConfirmation = "WaitingEmailConfirmation", + UploadingSecret = "UploadingSecret", + Ready = "Ready" +} +export type MagicLinkKey = { + key: string; + expiry: Date; + confirmed: boolean; +}; +export type MagicLinkKeys = { + [email: string]: MagicLinkKey; +}; +export type SessionKeys = { + [email: string]: string; +}; +declare const STATUS_WRAPPED_METHODS: { + readonly getEmailVaultInfo: "INITIAL"; + readonly uploadKeyStoreSecret: "INITIAL"; + readonly recoverKeyStore: "INITIAL"; + readonly requestKeysSync: "INITIAL"; + readonly finalizeSyncKeys: "INITIAL"; +}; +/** + * EmailVaultController + * @class + * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries + * The most important thing it achieves is handling magicLink and session keys with polling. + * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc. + * Extended documentation about the EV and its internal mechanisms + * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation + */ +export declare class EmailVaultController extends EventEmitter { + #private; + private storage; + private initialLoadPromise; + isReady: boolean; + lastUpdate: Date; + emailVaultStates: { + email: { + [email: string]: EmailVaultData; + }; + criticalError?: Error; + errors?: Error[]; + }; + statuses: Statuses; + constructor(storage: Storage, fetch: Fetch, relayerUrl: string, keyStore: KeystoreController, options?: { + autoConfirmMagicLink?: boolean; + }); + private load; + get currentState(): EmailVaultState; + handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow): Promise; + getMagicLinkKeyByEmail(email: string): MagicLinkKey | null; + getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise; + uploadKeyStoreSecret(email: string): Promise; + recoverKeyStore(email: string, newPassword: string): Promise; + requestKeysSync(email: string, keys: string[]): Promise; + finalizeSyncKeys(email: string, keys: string[], password: string): Promise; + fulfillSyncRequests(email: string, password: string): Promise; + cleanMagicAndSessionKeys(): Promise; + cancelEmailConfirmation(): void; + get keystoreRecoveryEmail(): string | undefined; + get hasKeystoreRecovery(): boolean; + get hasConfirmedRecoveryEmail(): boolean; + get banners(): Banner[]; + toJSON(): this & { + currentState: EmailVaultState; + hasKeystoreRecovery: boolean; + hasConfirmedRecoveryEmail: boolean; + banners: Banner[]; + keystoreRecoveryEmail: string | undefined; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=emailVault.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.d.ts.map b/dist/src/controllers/emailVault/emailVault.d.ts.map new file mode 100644 index 000000000..115528da0 --- /dev/null +++ b/dist/src/controllers/emailVault/emailVault.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.d.ts","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EACL,cAAc,EAEd,aAAa,EAGd,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAMlD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,wBAAwB,6BAA6B;IACrD,eAAe,oBAAoB;IACnC,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,IAAI,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAOD,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACxB,CAAA;AAMD,QAAA,MAAM,sBAAsB;;;;;;CAMlB,CAAA;AAEV;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;;IACpD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,kBAAkB,CAAe;IAsBzC,OAAO,EAAE,OAAO,CAAQ;IAExB,UAAU,EAAE,IAAI,CAAa;IAE7B,gBAAgB,EAAE;QAChB,KAAK,EAAE;YAAE,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAA;SAAE,CAAA;QAC1C,aAAa,CAAC,EAAE,KAAK,CAAA;QACrB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;KACjB,CAEA;IAED,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;gBAG9E,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE;YAYhC,IAAI;IAsBlB,IAAI,YAAY,IAAI,eAAe,CAMlC;IAeK,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa;IA6E3E,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAuBpD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAwCrD,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAyDlC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IA2FlD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IA6D7C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM;IAuBhE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IA+BnD,wBAAwB;IAY9B,uBAAuB;IAMvB,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAY9C;IAED,IAAI,mBAAmB,YAEtB;IAED,IAAI,yBAAyB,IAAI,OAAO,CAQvC;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAiCtB;IAED,MAAM;;;;;;;;CAWP"} \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.js b/dist/src/controllers/emailVault/emailVault.js new file mode 100644 index 000000000..5bc6029cb --- /dev/null +++ b/dist/src/controllers/emailVault/emailVault.js @@ -0,0 +1,526 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable no-await-in-loop */ +import crypto from 'crypto'; +import { OperationRequestType, SecretType } from '../../interfaces/emailVault'; +import { getKeySyncBanner } from '../../libs/banners/banners'; +import { EmailVault } from '../../libs/emailVault/emailVault'; +import { requestMagicLink } from '../../libs/magicLink/magicLink'; +import { Polling } from '../../libs/polling/polling'; +import wait from '../../utils/wait'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export var EmailVaultState; +(function (EmailVaultState) { + EmailVaultState["Loading"] = "loading"; + EmailVaultState["WaitingEmailConfirmation"] = "WaitingEmailConfirmation"; + EmailVaultState["UploadingSecret"] = "UploadingSecret"; + EmailVaultState["Ready"] = "Ready"; +})(EmailVaultState || (EmailVaultState = {})); +const RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'; +const EMAIL_VAULT_STORAGE_KEY = 'emailVault'; +const MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'; +const SESSION_KEYS_STORAGE_KEY = 'sessionKeys'; +function base64UrlEncode(str) { + return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +} +const STATUS_WRAPPED_METHODS = { + getEmailVaultInfo: 'INITIAL', + uploadKeyStoreSecret: 'INITIAL', + recoverKeyStore: 'INITIAL', + requestKeysSync: 'INITIAL', + finalizeSyncKeys: 'INITIAL' +}; +/** + * EmailVaultController + * @class + * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries + * The most important thing it achieves is handling magicLink and session keys with polling. + * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc. + * Extended documentation about the EV and its internal mechanisms + * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation + */ +export class EmailVaultController extends EventEmitter { + storage; + initialLoadPromise; + #isWaitingEmailConfirmation = false; + #isUploadingSecret = false; + #emailVault; + #magicLinkKeys = {}; + #sessionKeys = {}; + #shouldStopConfirmationPolling = false; + #autoConfirmMagicLink = false; + #fetch; + #relayerUrl; + #keyStore; + isReady = false; + lastUpdate = new Date(); + emailVaultStates = { + email: {} + }; + statuses = STATUS_WRAPPED_METHODS; + constructor(storage, fetch, relayerUrl, keyStore, options) { + super(); + this.#fetch = fetch; + this.#relayerUrl = relayerUrl; + this.storage = storage; + this.#emailVault = new EmailVault(fetch, relayerUrl); + this.#keyStore = keyStore; + this.initialLoadPromise = this.load(); + this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false; + } + async load() { + this.isReady = false; + // #load is called in the constructor which is synchronous + // we await (1 ms/next tick) for the constructor to extend the EventEmitter class + // and then we call it's methods + await wait(1); + this.emitUpdate(); + const [emailVaultState, magicLinkKey] = await Promise.all([ + this.storage.get(EMAIL_VAULT_STORAGE_KEY, { + email: {} + }), + this.storage.get(MAGIC_LINK_STORAGE_KEY, {}) + ]); + this.emailVaultStates = emailVaultState; + this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey); + this.lastUpdate = new Date(); + this.isReady = true; + this.emitUpdate(); + } + get currentState() { + if (!this.isReady) + return EmailVaultState.Loading; + if (this.#isWaitingEmailConfirmation) + return EmailVaultState.WaitingEmailConfirmation; + if (this.#isUploadingSecret) + return EmailVaultState.UploadingSecret; + return EmailVaultState.Ready; + } + async #requestSessionKey(email) { + // if magicLinkKey => get sessionKey + const key = (await this.#getMagicLinkKey(email))?.key; + if (!key) + return; + this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key); + // store magicLinkKey and sessionKey + await Promise.all([ + this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys), + this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys) + ]); + } + async handleMagicLinkKey(email, fn, flow) { + await this.initialLoadPromise; + const currentKey = (await this.#getMagicLinkKey(email))?.key; + if (currentKey) { + this.#isWaitingEmailConfirmation = false; + this.emitUpdate(); + return; + } + this.#isWaitingEmailConfirmation = true; + this.#shouldStopConfirmationPolling = false; + this.emitUpdate(); + const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, { + autoConfirm: this.#autoConfirmMagicLink, + flow + }); + const polling = new Polling(); + polling.onUpdate(async () => { + if (polling.state.isError && polling.state.error.output.res.status === 401) { + this.#isWaitingEmailConfirmation = true; + this.emitUpdate(); + } + else if (polling.state.isError) { + this.emitError({ + message: `Can't request magic link for email ${email}: ${polling.state.error.message}`, + level: 'major', + error: new Error(`Can't request magic link for email ${email}: ${polling.state.error.message}`) + }); + this.emailVaultStates.errors = [polling.state.error]; + this.emitUpdate(); + } + }); + const ev = await polling.exec(this.#emailVault.getEmailVaultInfo.bind(this.#emailVault), [email, newKey.key], () => { + this.#isWaitingEmailConfirmation = false; + }, () => this.#shouldStopConfirmationPolling, 3 * 60 * 1000, 1000); + if (this.#shouldStopConfirmationPolling) { + this.emitUpdate(); + return; + } + if (ev && !ev.error) { + this.#isWaitingEmailConfirmation = false; + this.#magicLinkKeys[email] = { + key: newKey.key, + expiry: new Date(newKey.expiry), + confirmed: true + }; + fn && (await fn()); + this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys); + this.#requestSessionKey(email); + } + else { + this.emitError({ + message: `Unexpected error getting email vault for ${email}`, + level: 'major', + error: new Error(`Unexpected error getting email vault for ${email}`) + }); + } + this.emitUpdate(); + } + async #getSessionKey(email) { + await this.initialLoadPromise; + return this.#sessionKeys[email]; + } + getMagicLinkKeyByEmail(email) { + const result = this.#magicLinkKeys[email]; + if (!result || !result.confirmed) + return null; + if (Date.now() >= result.expiry.getTime()) + return null; + return result; + } + async #getMagicLinkKey(email) { + // if we have valid magicLinkKey => returns it else null + await this.initialLoadPromise; + return this.getMagicLinkKeyByEmail(email); + } + #parseMagicLinkKeys(mks) { + return Object.fromEntries(Object.keys(mks).map((email) => [ + email, + { ...mks[email], expiry: new Date(mks[email].expiry) } + ])); + } + async getEmailVaultInfo(email, flow) { + await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow)); + } + async #getEmailVaultInfo(email, flow) { + const [existsSessionKey, magicLinkKey] = await Promise.all([ + this.#getSessionKey(email), + this.#getMagicLinkKey(email) + ]); + const key = existsSessionKey || magicLinkKey?.key; + let emailVault = null; + if (key) { + emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e) => { + this.emitError({ + message: `Error getting email vault for ${email} ${e.message}`, + level: 'major', + error: new Error(`Error getting email vault for ${email} ${e.message}`) + }); + this.emailVaultStates.errors = []; + this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]; + return null; + }); + } + else { + await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow); + } + if (emailVault) { + this.emailVaultStates.email[email] = emailVault; + await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates); + if (!existsSessionKey) { + await this.#requestSessionKey(email); + } + } + this.#isWaitingEmailConfirmation = false; + this.emitUpdate(); + } + async uploadKeyStoreSecret(email) { + await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email)); + } + async #uploadKeyStoreSecret(email) { + if (!this.emailVaultStates.email[email]) { + await this.#getEmailVaultInfo(email, 'setup'); + } + let result = false; + let magicKey = await this.#getMagicLinkKey(email); + if (!magicKey?.key && !this.#shouldStopConfirmationPolling) { + await this.handleMagicLinkKey(email, async () => { + magicKey = await this.#getMagicLinkKey(email); + }, 'setup'); + } + if (this.#shouldStopConfirmationPolling) { + this.#isUploadingSecret = false; + // Set status to ERROR, but don't emit an error message + throw new Error(''); + } + if (magicKey?.key) { + this.#isUploadingSecret = true; + const randomBytes = crypto.randomBytes(32); + // toString('base64url') doesn't work for some reason in the browser extension + const newSecret = base64UrlEncode(randomBytes.toString('base64')); + await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false); + const keyStoreUid = await this.#keyStore.getKeyStoreUid(); + result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret); + } + else + this.emitError({ + message: 'Email key not confirmed', + level: 'minor', + error: new Error('uploadKeyStoreSecret: not confirmed magic link key') + }); + if (result) { + await this.#getEmailVaultInfo(email, 'setup'); + } + else { + this.emitError({ + level: 'minor', + message: 'Error upload keyStore to email vault', + error: new Error('error upload keyStore to email vault') + }); + } + this.#isUploadingSecret = false; + this.emitUpdate(); + } + async recoverKeyStore(email, newPassword) { + await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword)); + } + async #recoverKeyStore(email, newPassword) { + const uid = await this.#keyStore.getKeyStoreUid(); + const state = this.emailVaultStates; + if (!state.email[email]) { + this.emitError({ + message: `You are not logged in with ${email} on this device.`, + level: 'major', + error: new Error(`Keystore recovery: email ${email} not imported`) + }); + return; + } + if (!state.email[email].availableSecrets[uid]) { + this.emitError({ + message: `Resetting the password on this device is not enabled for ${email}.`, + level: 'major', + error: new Error('Keystore recovery: no keystore secret for this device') + }); + return; + } + if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) { + this.emitError({ + message: `Resetting the password on this device is not enabled for ${email}.`, + level: 'major', + error: new Error(`Keystore recovery: no keystore secret for email ${email}`) + }); + return; + } + if (email !== this.keystoreRecoveryEmail) { + return; + } + const emitExpiredMagicLinkError = () => { + this.emitError({ + message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`, + level: 'major', + error: new Error(`Keystore recovery: magic link expired for ${email}`) + }); + // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated. + // The application relies on this flag to make decisions regarding + // which step the user should be in during the Forgotten Password flow. + this.emitUpdate(); + }; + const key = (await this.#getMagicLinkKey(email))?.key; + if (!key) { + emitExpiredMagicLinkError(); + return; + } + let result; + try { + result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid); + } + catch (e) { + if (e?.output?.res?.message === 'invalid key') { + emitExpiredMagicLinkError(); + return; + } + } + if (!result || !result.value) { + this.emitError({ + message: 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support', + level: 'major', + error: new Error("Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.") + }); + return; + } + // Once we are here - it means we pass all the above validations, + // and we are ready to change the keystore password secret + this.emailVaultStates.email[email].availableSecrets[result.key] = result; + await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value); + await this.#keyStore.removeSecret('password'); + await this.#keyStore.addSecret('password', newPassword, '', false); + await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates); + this.emitUpdate(); + } + async requestKeysSync(email, keys) { + await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys)); + } + async #requestKeysSync(email, keys) { + const [magicLinkKey, keyStoreUid] = await Promise.all([ + this.#getMagicLinkKey(email), + this.#keyStore.getKeyStoreUid() + ]); + const operations = keys.map((key) => ({ + type: OperationRequestType.requestKeySync, + requester: keyStoreUid, + key + })); + if (magicLinkKey) { + const newOperations = (await this.#emailVault.operations(email, magicLinkKey.key, operations)); + this.emailVaultStates.email[email].operations = newOperations; + this.emitUpdate(); + } + await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys)); + } + async #finalizeSyncKeys(email, operations) { + const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email)); + if (authKey) { + const cloudOperations = await this.#emailVault + .getOperations(email, authKey, operations) + .catch((e) => { + this.emitError({ + message: `Can't pull operations: ${e}`, + level: 'major', + error: new Error(`Can't pull operations: ${e}`) + }); + }); + if (!cloudOperations) { + this.emitError({ + message: "Can't pull operations", + level: 'major', + error: new Error("Can't pull operations") + }); + } + // Promise.all makes race conditions + for (let i = 0; i < cloudOperations.length; i++) { + const op = cloudOperations[i]; + if (op.type === 'requestKeySync' && op.value) { + const { privateKey } = JSON.parse(op.value || '{}'); + await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true); + } + } + this.emitUpdate(); + } + else { + await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations)); + } + } + async finalizeSyncKeys(email, keys, password) { + const operations = keys + .map((key) => { + const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key); + if (!res) { + this.emitError({ + message: `No sync request for key ${key}`, + level: 'major', + error: new Error(`No sync request for key ${key}`) + }); + return null; + } + return { ...res, password }; + }) + .filter((x) => x); + await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations)); + } + // DOCS + // this function: + // - checks if there are sync requests via the operations route of the relayer + // - exports the encrypted private key and sends it back to the relayer (fulfills) + // @TODO add password + async fulfillSyncRequests(email, password) { + await this.#getEmailVaultInfo(email); + const operations = this.emailVaultStates.email[email].operations; + const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email)); + if (key) { + // pull keys from keystore for every operation + const newOperations = await Promise.all(operations.map(async (op) => { + if (op.type === 'requestKeySync') { + return { + ...op, + value: JSON.stringify({ + privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(op.key, op.requester) + }), + password + }; + } + return op; + })); + await this.#emailVault.operations(email, key, newOperations); + this.emitUpdate(); + } + else { + await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password)); + } + this.emitUpdate(); + } + async cleanMagicAndSessionKeys() { + this.#magicLinkKeys = {}; + this.#sessionKeys = {}; + await Promise.all([ + this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys), + this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys) + ]); + this.emitUpdate(); + } + cancelEmailConfirmation() { + this.#shouldStopConfirmationPolling = true; + this.#isWaitingEmailConfirmation = false; + this.emitUpdate(); + } + get keystoreRecoveryEmail() { + const keyStoreUid = this.#keyStore.keyStoreUid; + const EVEmails = Object.keys(this.emailVaultStates.email); + if (!keyStoreUid || !EVEmails.length) + return; + return EVEmails.find((email) => { + return (this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type === + SecretType.KeyStore); + }); + } + get hasKeystoreRecovery() { + return !!this.keystoreRecoveryEmail; + } + get hasConfirmedRecoveryEmail() { + if (!this.isReady) + return false; + const recoveryEmail = this.keystoreRecoveryEmail; + if (!recoveryEmail) + return false; + return !!this.getMagicLinkKeyByEmail(recoveryEmail); + } + get banners() { + const banners = []; + // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore) + // and if the keystore secret backup is not enabled already + if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) { + banners.push({ + id: 'keystore-secret-backup', + type: 'info', + title: 'Enable device password reset via email', + text: "Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.", + actions: [ + { + label: 'Enable', + actionName: 'backup-keystore-secret' + } + ] + }); + } + Object.keys(this.emailVaultStates.email).forEach((email) => { + const emailVaultData = this.emailVaultStates?.email?.[email]; + Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => { + const keystoreKeys = this.#keyStore.keys.filter((key) => accInfo.associatedKeys.includes(key.addr)); + if (keystoreKeys.length) + return; + banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys)); + }); + }); + return banners; + } + toJSON() { + return { + ...this, + ...super.toJSON(), + currentState: this.currentState, + hasKeystoreRecovery: this.hasKeystoreRecovery, + hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail, + banners: this.banners, + keystoreRecoveryEmail: this.keystoreRecoveryEmail + }; + } +} +//# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.js.map b/dist/src/controllers/emailVault/emailVault.js.map new file mode 100644 index 000000000..9ab959894 --- /dev/null +++ b/dist/src/controllers/emailVault/emailVault.js.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable no-await-in-loop */\nimport crypto from 'crypto'\n\nimport { Banner } from '../../interfaces/banner'\nimport {\n EmailVaultData,\n EmailVaultOperation,\n MagicLinkFlow,\n OperationRequestType,\n SecretType\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { getKeySyncBanner } from '../../libs/banners/banners'\nimport { EmailVault } from '../../libs/emailVault/emailVault'\nimport { requestMagicLink } from '../../libs/magicLink/magicLink'\nimport { Polling } from '../../libs/polling/polling'\nimport wait from '../../utils/wait'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\n\nexport enum EmailVaultState {\n Loading = 'loading',\n WaitingEmailConfirmation = 'WaitingEmailConfirmation',\n UploadingSecret = 'UploadingSecret',\n Ready = 'Ready'\n}\n\nexport type MagicLinkKey = {\n key: string\n expiry: Date\n confirmed: boolean\n}\n\nconst RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'\nconst EMAIL_VAULT_STORAGE_KEY = 'emailVault'\nconst MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'\nconst SESSION_KEYS_STORAGE_KEY = 'sessionKeys'\n\nexport type MagicLinkKeys = {\n [email: string]: MagicLinkKey\n}\n\nexport type SessionKeys = {\n [email: string]: string\n}\n\nfunction base64UrlEncode(str: string) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nconst STATUS_WRAPPED_METHODS = {\n getEmailVaultInfo: 'INITIAL',\n uploadKeyStoreSecret: 'INITIAL',\n recoverKeyStore: 'INITIAL',\n requestKeysSync: 'INITIAL',\n finalizeSyncKeys: 'INITIAL'\n} as const\n\n/**\n * EmailVaultController\n * @class\n * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries\n * The most important thing it achieves is handling magicLink and session keys with polling.\n * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc.\n * Extended documentation about the EV and its internal mechanisms\n * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation\n */\nexport class EmailVaultController extends EventEmitter {\n private storage: Storage\n\n private initialLoadPromise: Promise\n\n #isWaitingEmailConfirmation: boolean = false\n\n #isUploadingSecret: boolean = false\n\n #emailVault: EmailVault\n\n #magicLinkKeys: MagicLinkKeys = {}\n\n #sessionKeys: SessionKeys = {}\n\n #shouldStopConfirmationPolling: boolean = false\n\n #autoConfirmMagicLink: boolean = false\n\n #fetch: Fetch\n\n #relayerUrl: string\n\n #keyStore: KeystoreController\n\n isReady: boolean = false\n\n lastUpdate: Date = new Date()\n\n emailVaultStates: {\n email: { [email: string]: EmailVaultData }\n criticalError?: Error\n errors?: Error[]\n } = {\n email: {}\n }\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n relayerUrl: string,\n keyStore: KeystoreController,\n options?: { autoConfirmMagicLink?: boolean }\n ) {\n super()\n this.#fetch = fetch\n this.#relayerUrl = relayerUrl\n this.storage = storage\n this.#emailVault = new EmailVault(fetch, relayerUrl)\n this.#keyStore = keyStore\n this.initialLoadPromise = this.load()\n this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false\n }\n\n private async load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n const [emailVaultState, magicLinkKey] = await Promise.all([\n this.storage.get(EMAIL_VAULT_STORAGE_KEY, {\n email: {}\n }),\n this.storage.get(MAGIC_LINK_STORAGE_KEY, {})\n ])\n\n this.emailVaultStates = emailVaultState\n this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey)\n\n this.lastUpdate = new Date()\n this.isReady = true\n this.emitUpdate()\n }\n\n get currentState(): EmailVaultState {\n if (!this.isReady) return EmailVaultState.Loading\n if (this.#isWaitingEmailConfirmation) return EmailVaultState.WaitingEmailConfirmation\n if (this.#isUploadingSecret) return EmailVaultState.UploadingSecret\n\n return EmailVaultState.Ready\n }\n\n async #requestSessionKey(email: string) {\n // if magicLinkKey => get sessionKey\n const key = (await this.#getMagicLinkKey(email))?.key\n if (!key) return\n this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key)\n\n // store magicLinkKey and sessionKey\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n }\n\n async handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow) {\n await this.initialLoadPromise\n const currentKey = (await this.#getMagicLinkKey(email))?.key\n if (currentKey) {\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n return\n }\n\n this.#isWaitingEmailConfirmation = true\n this.#shouldStopConfirmationPolling = false\n this.emitUpdate()\n\n const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, {\n autoConfirm: this.#autoConfirmMagicLink,\n flow\n })\n\n const polling = new Polling()\n polling.onUpdate(async () => {\n if (polling.state.isError && polling.state.error.output.res.status === 401) {\n this.#isWaitingEmailConfirmation = true\n this.emitUpdate()\n } else if (polling.state.isError) {\n this.emitError({\n message: `Can't request magic link for email ${email}: ${polling.state.error.message}`,\n level: 'major',\n error: new Error(\n `Can't request magic link for email ${email}: ${polling.state.error.message}`\n )\n })\n this.emailVaultStates.errors = [polling.state.error]\n this.emitUpdate()\n }\n })\n\n const ev: (EmailVaultData & { error?: any; canceled?: boolean }) | null = await polling.exec(\n this.#emailVault.getEmailVaultInfo.bind(this.#emailVault),\n [email, newKey.key],\n () => {\n this.#isWaitingEmailConfirmation = false\n },\n () => this.#shouldStopConfirmationPolling,\n 3 * 60 * 1000,\n 1000\n )\n\n if (this.#shouldStopConfirmationPolling) {\n this.emitUpdate()\n return\n }\n\n if (ev && !ev.error) {\n this.#isWaitingEmailConfirmation = false\n this.#magicLinkKeys[email] = {\n key: newKey.key,\n expiry: new Date(newKey.expiry),\n confirmed: true\n }\n fn && (await fn())\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys)\n this.#requestSessionKey(email)\n } else {\n this.emitError({\n message: `Unexpected error getting email vault for ${email}`,\n level: 'major',\n error: new Error(`Unexpected error getting email vault for ${email}`)\n })\n }\n this.emitUpdate()\n }\n\n async #getSessionKey(email: string): Promise {\n await this.initialLoadPromise\n return this.#sessionKeys[email]\n }\n\n getMagicLinkKeyByEmail(email: string): MagicLinkKey | null {\n const result = this.#magicLinkKeys[email]\n if (!result || !result.confirmed) return null\n if (Date.now() >= result.expiry.getTime()) return null\n return result\n }\n\n async #getMagicLinkKey(email: string): Promise {\n // if we have valid magicLinkKey => returns it else null\n await this.initialLoadPromise\n\n return this.getMagicLinkKeyByEmail(email)\n }\n\n #parseMagicLinkKeys(mks: any): MagicLinkKeys {\n return Object.fromEntries(\n Object.keys(mks).map((email) => [\n email,\n { ...mks[email], expiry: new Date(mks[email].expiry) }\n ])\n )\n }\n\n async getEmailVaultInfo(email: string, flow?: MagicLinkFlow) {\n await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow))\n }\n\n async #getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise {\n const [existsSessionKey, magicLinkKey] = await Promise.all([\n this.#getSessionKey(email),\n this.#getMagicLinkKey(email)\n ])\n const key = existsSessionKey || magicLinkKey?.key\n\n let emailVault: EmailVaultData | null = null\n if (key) {\n emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e: any) => {\n this.emitError({\n message: `Error getting email vault for ${email} ${e.message}`,\n level: 'major',\n error: new Error(`Error getting email vault for ${email} ${e.message}`)\n })\n this.emailVaultStates.errors = []\n this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]\n\n return null\n })\n } else {\n await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow)\n }\n\n if (emailVault) {\n this.emailVaultStates.email[email] = emailVault\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n if (!existsSessionKey) {\n await this.#requestSessionKey(email)\n }\n }\n\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n async uploadKeyStoreSecret(email: string) {\n await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email))\n }\n\n async #uploadKeyStoreSecret(email: string) {\n if (!this.emailVaultStates.email[email]) {\n await this.#getEmailVaultInfo(email, 'setup')\n }\n\n let result: Boolean | null = false\n let magicKey = await this.#getMagicLinkKey(email)\n\n if (!magicKey?.key && !this.#shouldStopConfirmationPolling) {\n await this.handleMagicLinkKey(\n email,\n async () => {\n magicKey = await this.#getMagicLinkKey(email)\n },\n 'setup'\n )\n }\n\n if (this.#shouldStopConfirmationPolling) {\n this.#isUploadingSecret = false\n // Set status to ERROR, but don't emit an error message\n throw new Error('')\n }\n\n if (magicKey?.key) {\n this.#isUploadingSecret = true\n const randomBytes = crypto.randomBytes(32)\n // toString('base64url') doesn't work for some reason in the browser extension\n const newSecret = base64UrlEncode(randomBytes.toString('base64'))\n await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false)\n const keyStoreUid = await this.#keyStore.getKeyStoreUid()\n result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret)\n } else\n this.emitError({\n message: 'Email key not confirmed',\n level: 'minor',\n error: new Error('uploadKeyStoreSecret: not confirmed magic link key')\n })\n\n if (result) {\n await this.#getEmailVaultInfo(email, 'setup')\n } else {\n this.emitError({\n level: 'minor',\n message: 'Error upload keyStore to email vault',\n error: new Error('error upload keyStore to email vault')\n })\n }\n\n this.#isUploadingSecret = false\n this.emitUpdate()\n }\n\n async recoverKeyStore(email: string, newPassword: string) {\n await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword))\n }\n\n async #recoverKeyStore(email: string, newPassword: string): Promise {\n const uid = await this.#keyStore.getKeyStoreUid()\n const state = this.emailVaultStates\n if (!state.email[email]) {\n this.emitError({\n message: `You are not logged in with ${email} on this device.`,\n level: 'major',\n error: new Error(`Keystore recovery: email ${email} not imported`)\n })\n return\n }\n\n if (!state.email[email].availableSecrets[uid]) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error('Keystore recovery: no keystore secret for this device')\n })\n return\n }\n if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error(`Keystore recovery: no keystore secret for email ${email}`)\n })\n return\n }\n\n if (email !== this.keystoreRecoveryEmail) {\n return\n }\n const emitExpiredMagicLinkError = () => {\n this.emitError({\n message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`,\n level: 'major',\n error: new Error(`Keystore recovery: magic link expired for ${email}`)\n })\n\n // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated.\n // The application relies on this flag to make decisions regarding\n // which step the user should be in during the Forgotten Password flow.\n this.emitUpdate()\n }\n\n const key = (await this.#getMagicLinkKey(email))?.key\n\n if (!key) {\n emitExpiredMagicLinkError()\n return\n }\n\n let result\n try {\n result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid)\n } catch (e: any) {\n if (e?.output?.res?.message === 'invalid key') {\n emitExpiredMagicLinkError()\n return\n }\n }\n\n if (!result || !result.value) {\n this.emitError({\n message:\n 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support',\n level: 'major',\n error: new Error(\n \"Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.\"\n )\n })\n\n return\n }\n\n // Once we are here - it means we pass all the above validations,\n // and we are ready to change the keystore password secret\n this.emailVaultStates.email[email].availableSecrets[result.key] = result\n\n await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value)\n await this.#keyStore.removeSecret('password')\n await this.#keyStore.addSecret('password', newPassword, '', false)\n\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n this.emitUpdate()\n }\n\n async requestKeysSync(email: string, keys: string[]) {\n await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys))\n }\n\n async #requestKeysSync(email: string, keys: string[]) {\n const [magicLinkKey, keyStoreUid] = await Promise.all([\n this.#getMagicLinkKey(email),\n this.#keyStore.getKeyStoreUid()\n ])\n\n const operations: EmailVaultOperation[] = keys.map((key) => ({\n type: OperationRequestType.requestKeySync,\n requester: keyStoreUid,\n key\n }))\n if (magicLinkKey) {\n const newOperations = (await this.#emailVault.operations(\n email,\n magicLinkKey.key,\n operations\n ))!\n this.emailVaultStates.email[email].operations = newOperations\n this.emitUpdate()\n }\n await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys))\n }\n\n async #finalizeSyncKeys(email: string, operations: EmailVaultOperation[]) {\n const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (authKey) {\n const cloudOperations = await this.#emailVault\n .getOperations(email, authKey, operations)\n .catch((e) => {\n this.emitError({\n message: `Can't pull operations: ${e}`,\n level: 'major',\n error: new Error(`Can't pull operations: ${e}`)\n })\n })\n if (!cloudOperations) {\n this.emitError({\n message: \"Can't pull operations\",\n level: 'major',\n error: new Error(\"Can't pull operations\")\n })\n }\n\n // Promise.all makes race conditions\n for (let i = 0; i < cloudOperations!.length; i++) {\n const op = cloudOperations![i]\n if (op.type === 'requestKeySync' && op.value) {\n const { privateKey } = JSON.parse(op.value || '{}')\n await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true)\n }\n }\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations))\n }\n }\n\n async finalizeSyncKeys(email: string, keys: string[], password: string) {\n const operations: any[] = keys\n .map((key) => {\n const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key)\n if (!res) {\n this.emitError({\n message: `No sync request for key ${key}`,\n level: 'major',\n error: new Error(`No sync request for key ${key}`)\n })\n return null\n }\n return { ...res, password }\n })\n .filter((x) => x)\n await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations))\n }\n\n // DOCS\n // this function:\n // - checks if there are sync requests via the operations route of the relayer\n // - exports the encrypted private key and sends it back to the relayer (fulfills)\n // @TODO add password\n async fulfillSyncRequests(email: string, password: string) {\n await this.#getEmailVaultInfo(email)\n const operations = this.emailVaultStates.email[email].operations\n const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (key) {\n // pull keys from keystore for every operation\n const newOperations: EmailVaultOperation[] = await Promise.all(\n operations.map(async (op): Promise => {\n if (op.type === 'requestKeySync') {\n return {\n ...op,\n value: JSON.stringify({\n privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(\n op.key,\n op.requester\n )\n }),\n password\n }\n }\n return op\n })\n )\n await this.#emailVault.operations(email, key, newOperations)\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password))\n }\n this.emitUpdate()\n }\n\n async cleanMagicAndSessionKeys() {\n this.#magicLinkKeys = {}\n this.#sessionKeys = {}\n\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n\n this.emitUpdate()\n }\n\n cancelEmailConfirmation() {\n this.#shouldStopConfirmationPolling = true\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n get keystoreRecoveryEmail(): string | undefined {\n const keyStoreUid = this.#keyStore.keyStoreUid\n const EVEmails = Object.keys(this.emailVaultStates.email)\n\n if (!keyStoreUid || !EVEmails.length) return\n\n return EVEmails.find((email) => {\n return (\n this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type ===\n SecretType.KeyStore\n )\n })\n }\n\n get hasKeystoreRecovery() {\n return !!this.keystoreRecoveryEmail\n }\n\n get hasConfirmedRecoveryEmail(): boolean {\n if (!this.isReady) return false\n\n const recoveryEmail = this.keystoreRecoveryEmail\n\n if (!recoveryEmail) return false\n\n return !!this.getMagicLinkKeyByEmail(recoveryEmail)\n }\n\n get banners(): Banner[] {\n const banners: Banner[] = []\n\n // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore)\n // and if the keystore secret backup is not enabled already\n if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) {\n banners.push({\n id: 'keystore-secret-backup',\n type: 'info',\n title: 'Enable device password reset via email',\n text: \"Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.\",\n actions: [\n {\n label: 'Enable',\n actionName: 'backup-keystore-secret'\n }\n ]\n })\n }\n\n Object.keys(this.emailVaultStates.email).forEach((email) => {\n const emailVaultData = this.emailVaultStates?.email?.[email]\n Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => {\n const keystoreKeys = this.#keyStore.keys.filter((key) =>\n accInfo.associatedKeys.includes(key.addr)\n )\n\n if (keystoreKeys.length) return\n banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys))\n })\n })\n\n return banners\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n currentState: this.currentState, // includes the getter in the stringified instance\n hasKeystoreRecovery: this.hasKeystoreRecovery,\n hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail,\n banners: this.banners, // includes the getter in the stringified instance,\n keystoreRecoveryEmail: this.keystoreRecoveryEmail\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.d.ts b/dist/src/controllers/eventEmitter/eventEmitter.d.ts new file mode 100644 index 000000000..cd27c49a9 --- /dev/null +++ b/dist/src/controllers/eventEmitter/eventEmitter.d.ts @@ -0,0 +1,33 @@ +export type ErrorRef = { + message: string; + level: 'fatal' | 'major' | 'minor' | 'silent'; + error: Error; +}; +export type Statuses = { + [key in T]: 'INITIAL' | 'LOADING' | 'SUCCESS' | 'ERROR'; +}; +export default class EventEmitter { + #private; + statuses: Statuses; + get onUpdateIds(): (string | null)[]; + get onErrorIds(): (string | null)[]; + get emittedErrors(): ErrorRef[]; + /** + * Using this function to emit an update bypasses both background and React batching, + * ensuring that the state update is immediately applied at the application level (React/Extension). + * + * This is particularly handy when multiple status flags are being updated rapidly. + * Without the `forceEmitUpdate` option, the application will only render the very first and last status updates, + * batching the ones in between. + */ + forceEmitUpdate(): Promise; + protected emitUpdate(): void; + protected emitError(error: ErrorRef): void; + protected withStatus(callName: string, fn: Function, allowConcurrentActions?: boolean, errorLevel?: ErrorRef['level']): Promise; + onUpdate(cb: (forceUpdate?: boolean) => void, id?: string): () => void; + onError(cb: (error: ErrorRef) => void, id?: string): () => void; + toJSON(): this & { + emittedErrors: ErrorRef[]; + }; +} +//# sourceMappingURL=eventEmitter.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.d.ts.map b/dist/src/controllers/eventEmitter/eventEmitter.d.ts.map new file mode 100644 index 000000000..87bd2e28e --- /dev/null +++ b/dist/src/controllers/eventEmitter/eventEmitter.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../../../src/controllers/eventEmitter/eventEmitter.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG;IAErB,OAAO,EAAE,MAAM,CAAA;IAEf,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;IAE7C,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI;KACtC,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;CACxD,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,YAAY;;IAiB/B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAK;IAE/B,IAAI,WAAW,sBAEd;IAED,IAAI,UAAU,sBAEb;IAID,IAAI,aAAa,eAEhB;IAED;;;;;;;OAOG;IACG,eAAe;IAQrB,SAAS,CAAC,UAAU;IAOpB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ;cAcnB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ,EACZ,sBAAsB,UAAQ,EAI9B,UAAU,GAAE,QAAQ,CAAC,OAAO,CAGjB;IA8Db,QAAQ,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI;IAmBtE,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI;IAkB/D,MAAM;;;CAMP"} \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.js b/dist/src/controllers/eventEmitter/eventEmitter.js new file mode 100644 index 000000000..9ccf41466 --- /dev/null +++ b/dist/src/controllers/eventEmitter/eventEmitter.js @@ -0,0 +1,156 @@ +/* eslint-disable no-restricted-syntax */ +import wait from '../../utils/wait'; +const LIMIT_ON_THE_NUMBER_OF_ERRORS = 100; +export default class EventEmitter { + #callbacksWithId = []; + #callbacks = []; + #errorCallbacksWithId = []; + #errorCallbacks = []; + #errors = []; + statuses = {}; + get onUpdateIds() { + return this.#callbacksWithId.map((item) => item.id); + } + get onErrorIds() { + return this.#errorCallbacksWithId.map((item) => item.id); + } + // called emittedErrors and not just errors because some of the other controllers + // that extend this one have errors defined already + get emittedErrors() { + return this.#errors; + } + /** + * Using this function to emit an update bypasses both background and React batching, + * ensuring that the state update is immediately applied at the application level (React/Extension). + * + * This is particularly handy when multiple status flags are being updated rapidly. + * Without the `forceEmitUpdate` option, the application will only render the very first and last status updates, + * batching the ones in between. + */ + async forceEmitUpdate() { + await wait(1); + // eslint-disable-next-line no-restricted-syntax + for (const i of this.#callbacksWithId) + i.cb(true); + // eslint-disable-next-line no-restricted-syntax + for (const cb of this.#callbacks) + cb(true); + } + emitUpdate() { + // eslint-disable-next-line no-restricted-syntax + for (const i of this.#callbacksWithId) + i.cb(); + // eslint-disable-next-line no-restricted-syntax + for (const cb of this.#callbacks) + cb(); + } + emitError(error) { + this.#errors.push(error); + this.#trimErrorsIfNeeded(); + console.log(`[Еmitted error in controller ${this.constructor.name}] ${error.message}`, this.#errors); + // eslint-disable-next-line no-restricted-syntax + for (const i of this.#errorCallbacksWithId) + i.cb(error); + // eslint-disable-next-line no-restricted-syntax + for (const cb of this.#errorCallbacks) + cb(error); + } + async withStatus(callName, fn, allowConcurrentActions = false, + // Silence this error in prod to avoid displaying wired error messages. + // The only benefit of displaying it is for devs to see when an action is dispatched twice. + // TODO: If this happens on PROD, ideally we should get an error report somehow somewhere. + errorLevel = process.env.APP_ENV === 'production' && + process.env.IS_TESTING !== 'true' + ? 'silent' + : 'minor') { + const someStatusIsLoading = Object.values(this.statuses).some((status) => status !== 'INITIAL'); + if (!this.statuses[callName]) { + console.error(`${callName} is not defined in "statuses".`); + } + // By default, concurrent actions are disallowed to maintain consistency, particularly within sub-controllers where + // simultaneous actions can lead to unintended side effects. The 'allowConcurrentActions' flag is provided to enable + // concurrent execution at the main controller level. This is useful when multiple actions need to modify the state + // of different sub-controllers simultaneously. + if ((someStatusIsLoading && !allowConcurrentActions) || this.statuses[callName] !== 'INITIAL') { + this.emitError({ + level: errorLevel, + message: `Please wait for the completion of the previous action before initiating another one.', ${callName}`, + error: new Error('Another function is already being handled by withStatus refrain from invoking a second function.') + }); + return; + } + this.statuses[callName] = 'LOADING'; + await this.forceEmitUpdate(); + try { + await fn(); + this.statuses[callName] = 'SUCCESS'; + await this.forceEmitUpdate(); + } + catch (error) { + this.statuses[callName] = 'ERROR'; + if ('message' in error && 'level' in error && 'error' in error) { + this.emitError(error); + // Sometimes we don't want to show an error message to the user. For example, if the user cancels a request + // we don't want to go through the SUCCESS state, but we also don't want to show an error message. + } + else if (error?.message) { + this.emitError({ + message: error?.message || 'An unexpected error occurred', + level: 'major', + error + }); + } + await this.forceEmitUpdate(); + } + this.statuses[callName] = 'INITIAL'; + await this.forceEmitUpdate(); + } + // Prevents memory leaks and storing huge amount of errors + #trimErrorsIfNeeded() { + if (this.#errors.length > LIMIT_ON_THE_NUMBER_OF_ERRORS) { + const excessErrors = this.#errors.length - LIMIT_ON_THE_NUMBER_OF_ERRORS; + this.#errors = this.#errors.slice(excessErrors); + } + } + // returns an unsub function + onUpdate(cb, id) { + if (id) { + this.#callbacksWithId.push({ id, cb }); + } + else { + this.#callbacks.push(cb); + } + return () => { + if (id) { + this.#callbacksWithId = this.#callbacksWithId.filter((callbackItem) => callbackItem.id !== id); + } + else { + this.#callbacks.splice(this.#callbacks.indexOf(cb), 1); + } + }; + } + // returns an unsub function for error events + onError(cb, id) { + if (id) { + this.#errorCallbacksWithId.push({ id, cb }); + } + else { + this.#errorCallbacks.push(cb); + } + return () => { + if (id) { + this.#errorCallbacksWithId = this.#errorCallbacksWithId.filter((callbackItem) => callbackItem.id !== id); + } + else { + this.#errorCallbacks.splice(this.#errorCallbacks.indexOf(cb), 1); + } + }; + } + toJSON() { + return { + ...this, + emittedErrors: this.emittedErrors // includes the getter in the stringified instance + }; + } +} +//# sourceMappingURL=eventEmitter.js.map \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.js.map b/dist/src/controllers/eventEmitter/eventEmitter.js.map new file mode 100644 index 000000000..e2898ba85 --- /dev/null +++ b/dist/src/controllers/eventEmitter/eventEmitter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../../../src/controllers/eventEmitter/eventEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\nimport wait from '../../utils/wait'\n\nconst LIMIT_ON_THE_NUMBER_OF_ERRORS = 100\n\nexport type ErrorRef = {\n // user-friendly message, ideally containing call to action\n message: string\n // error level, used for filtering\n level: 'fatal' | 'major' | 'minor' | 'silent'\n // error containing technical details and stack trace\n error: Error\n}\n\nexport type Statuses = {\n [key in T]: 'INITIAL' | 'LOADING' | 'SUCCESS' | 'ERROR'\n}\n\nexport default class EventEmitter {\n #callbacksWithId: {\n id: string | null\n cb: (forceEmit?: true) => void\n }[] = []\n\n #callbacks: ((forceEmit?: true) => void)[] = []\n\n #errorCallbacksWithId: {\n id: string | null\n cb: (error: ErrorRef) => void\n }[] = []\n\n #errorCallbacks: ((error: ErrorRef) => void)[] = []\n\n #errors: ErrorRef[] = []\n\n statuses: Statuses = {}\n\n get onUpdateIds() {\n return this.#callbacksWithId.map((item) => item.id)\n }\n\n get onErrorIds() {\n return this.#errorCallbacksWithId.map((item) => item.id)\n }\n\n // called emittedErrors and not just errors because some of the other controllers\n // that extend this one have errors defined already\n get emittedErrors() {\n return this.#errors\n }\n\n /**\n * Using this function to emit an update bypasses both background and React batching,\n * ensuring that the state update is immediately applied at the application level (React/Extension).\n *\n * This is particularly handy when multiple status flags are being updated rapidly.\n * Without the `forceEmitUpdate` option, the application will only render the very first and last status updates,\n * batching the ones in between.\n */\n async forceEmitUpdate() {\n await wait(1)\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb(true)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb(true)\n }\n\n protected emitUpdate() {\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb()\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb()\n }\n\n protected emitError(error: ErrorRef) {\n this.#errors.push(error)\n this.#trimErrorsIfNeeded()\n console.log(\n `[Еmitted error in controller ${this.constructor.name}] ${error.message}`,\n this.#errors\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#errorCallbacksWithId) i.cb(error)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#errorCallbacks) cb(error)\n }\n\n protected async withStatus(\n callName: string,\n fn: Function,\n allowConcurrentActions = false,\n // Silence this error in prod to avoid displaying wired error messages.\n // The only benefit of displaying it is for devs to see when an action is dispatched twice.\n // TODO: If this happens on PROD, ideally we should get an error report somehow somewhere.\n errorLevel: ErrorRef['level'] = process.env.APP_ENV === 'production' &&\n process.env.IS_TESTING !== 'true'\n ? 'silent'\n : 'minor'\n ) {\n const someStatusIsLoading = Object.values(this.statuses).some((status) => status !== 'INITIAL')\n\n if (!this.statuses[callName]) {\n console.error(`${callName} is not defined in \"statuses\".`)\n }\n\n // By default, concurrent actions are disallowed to maintain consistency, particularly within sub-controllers where\n // simultaneous actions can lead to unintended side effects. The 'allowConcurrentActions' flag is provided to enable\n // concurrent execution at the main controller level. This is useful when multiple actions need to modify the state\n // of different sub-controllers simultaneously.\n if ((someStatusIsLoading && !allowConcurrentActions) || this.statuses[callName] !== 'INITIAL') {\n this.emitError({\n level: errorLevel,\n message: `Please wait for the completion of the previous action before initiating another one.', ${callName}`,\n error: new Error(\n 'Another function is already being handled by withStatus refrain from invoking a second function.'\n )\n })\n\n return\n }\n\n this.statuses[callName] = 'LOADING'\n await this.forceEmitUpdate()\n\n try {\n await fn()\n\n this.statuses[callName] = 'SUCCESS'\n await this.forceEmitUpdate()\n } catch (error: any) {\n this.statuses[callName] = 'ERROR'\n if ('message' in error && 'level' in error && 'error' in error) {\n this.emitError(error)\n\n // Sometimes we don't want to show an error message to the user. For example, if the user cancels a request\n // we don't want to go through the SUCCESS state, but we also don't want to show an error message.\n } else if (error?.message) {\n this.emitError({\n message: error?.message || 'An unexpected error occurred',\n level: 'major',\n error\n })\n }\n await this.forceEmitUpdate()\n }\n\n this.statuses[callName] = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n // Prevents memory leaks and storing huge amount of errors\n #trimErrorsIfNeeded() {\n if (this.#errors.length > LIMIT_ON_THE_NUMBER_OF_ERRORS) {\n const excessErrors = this.#errors.length - LIMIT_ON_THE_NUMBER_OF_ERRORS\n this.#errors = this.#errors.slice(excessErrors)\n }\n }\n\n // returns an unsub function\n onUpdate(cb: (forceUpdate?: boolean) => void, id?: string): () => void {\n if (id) {\n this.#callbacksWithId.push({ id, cb })\n } else {\n this.#callbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#callbacksWithId = this.#callbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#callbacks.splice(this.#callbacks.indexOf(cb), 1)\n }\n }\n }\n\n // returns an unsub function for error events\n onError(cb: (error: ErrorRef) => void, id?: string): () => void {\n if (id) {\n this.#errorCallbacksWithId.push({ id, cb })\n } else {\n this.#errorCallbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#errorCallbacksWithId = this.#errorCallbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#errorCallbacks.splice(this.#errorCallbacks.indexOf(cb), 1)\n }\n }\n }\n\n toJSON() {\n return {\n ...this,\n emittedErrors: this.emittedErrors // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.d.ts b/dist/src/controllers/invite/invite.d.ts new file mode 100644 index 000000000..1780fc2f2 --- /dev/null +++ b/dist/src/controllers/invite/invite.d.ts @@ -0,0 +1,43 @@ +import { Fetch } from '../../interfaces/fetch'; +import { Storage } from '../../interfaces/storage'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export declare enum INVITE_STATUS { + UNVERIFIED = "UNVERIFIED", + VERIFIED = "VERIFIED" +} +type InviteState = { + status: INVITE_STATUS; + verifiedAt: null | number; + verifiedCode: null | string; + becameOGAt: null; +}; +/** + * As of v4.20.0, an invite verification flow is introduced as a first step upon + * extension installation. This flow requires users to provide a valid invite + * code before they can use the Ambire extension. This controller manages the + * verification of these invite codes and persisting the current invite status. + */ +export declare class InviteController extends EventEmitter { + #private; + inviteStatus: InviteState['status']; + verifiedCode: InviteState['verifiedCode']; + /** + * Whether the user has become an Ambire OG (Original Gangster), a status that + * comes with specific privileges (e.g. early access to new or experimental features). + */ + isOG: boolean; + constructor({ relayerUrl, fetch, storage }: { + relayerUrl: string; + fetch: Fetch; + storage: Storage; + }); + /** + * Verifies an invite code and if verified successfully, persists the invite + * status (and some meta information) in the storage. + */ + verify(code: string): Promise; + becomeOG(): Promise; + revokeOG(): Promise; +} +export {}; +//# sourceMappingURL=invite.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.d.ts.map b/dist/src/controllers/invite/invite.d.ts.map new file mode 100644 index 000000000..450939681 --- /dev/null +++ b/dist/src/controllers/invite/invite.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../../../src/controllers/invite/invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAGvD,oBAAY,aAAa;IACvB,UAAU,eAAe;IACzB,QAAQ,aAAa;CACtB;AAED,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,aAAa,CAAA;IACrB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,YAAY,EAAE,IAAI,GAAG,MAAM,CAAA;IAC3B,UAAU,EAAE,IAAI,CAAA;CACjB,CAAA;AASD;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;;IAOhD,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,CAA2B;IAE9D,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,CAAO;IAEhD;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAQ;gBAIT,EACV,UAAU,EACV,KAAK,EACL,OAAO,EACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;KACjB;IAkBD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM;IAwBnB,QAAQ;IAUR,QAAQ;CAQf"} \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.js b/dist/src/controllers/invite/invite.js new file mode 100644 index 000000000..09558bb41 --- /dev/null +++ b/dist/src/controllers/invite/invite.js @@ -0,0 +1,86 @@ +import { relayerCall } from '../../libs/relayerCall/relayerCall'; +import EventEmitter from '../eventEmitter/eventEmitter'; +// eslint-disable-next-line @typescript-eslint/naming-convention +export var INVITE_STATUS; +(function (INVITE_STATUS) { + INVITE_STATUS["UNVERIFIED"] = "UNVERIFIED"; + INVITE_STATUS["VERIFIED"] = "VERIFIED"; +})(INVITE_STATUS || (INVITE_STATUS = {})); +const DEFAULT_STATE = { + status: INVITE_STATUS.UNVERIFIED, + verifiedAt: null, + verifiedCode: null, + becameOGAt: null +}; +/** + * As of v4.20.0, an invite verification flow is introduced as a first step upon + * extension installation. This flow requires users to provide a valid invite + * code before they can use the Ambire extension. This controller manages the + * verification of these invite codes and persisting the current invite status. + */ +export class InviteController extends EventEmitter { + #storage; + #callRelayer; + #state = DEFAULT_STATE; + inviteStatus = INVITE_STATUS.UNVERIFIED; + verifiedCode = null; + /** + * Whether the user has become an Ambire OG (Original Gangster), a status that + * comes with specific privileges (e.g. early access to new or experimental features). + */ + isOG = false; + #initialLoadPromise; + constructor({ relayerUrl, fetch, storage }) { + super(); + this.#storage = storage; + this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.#initialLoadPromise = this.#load(); + } + async #load() { + const nextState = await this.#storage.get('invite', this.#state); + this.#state = { ...DEFAULT_STATE, ...nextState }; + this.inviteStatus = this.#state.status; + this.verifiedCode = this.#state.verifiedCode; + this.isOG = !!this.#state.becameOGAt; + this.emitUpdate(); + } + /** + * Verifies an invite code and if verified successfully, persists the invite + * status (and some meta information) in the storage. + */ + async verify(code) { + await this.#initialLoadPromise; + try { + const res = await this.#callRelayer(`/promotions/extension-key/${code}`, 'GET'); + if (!res.success) + throw new Error(res.message || "Couldn't verify the invite code"); + this.inviteStatus = INVITE_STATUS.VERIFIED; + this.verifiedCode = code; + this.emitUpdate(); + const verifiedAt = Date.now(); + await this.#storage.set('invite', { + ...this.#state, + status: INVITE_STATUS.VERIFIED, + verifiedAt, + verifiedCode: code + }); + } + catch (error) { + this.emitError(error); + } + } + async becomeOG() { + await this.#initialLoadPromise; + const becameOGAt = Date.now(); + await this.#storage.set('invite', { ...this.#state, becameOGAt }); + this.isOG = true; + this.emitUpdate(); + } + async revokeOG() { + await this.#initialLoadPromise; + await this.#storage.set('invite', { ...this.#state, becameOGAt: null }); + this.isOG = false; + this.emitUpdate(); + } +} +//# sourceMappingURL=invite.js.map \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.js.map b/dist/src/controllers/invite/invite.js.map new file mode 100644 index 000000000..cd98f62e8 --- /dev/null +++ b/dist/src/controllers/invite/invite.js.map @@ -0,0 +1 @@ +{"version":3,"file":"invite.js","sourceRoot":"","sources":["../../../../src/controllers/invite/invite.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport enum INVITE_STATUS {\n UNVERIFIED = 'UNVERIFIED',\n VERIFIED = 'VERIFIED'\n}\n\ntype InviteState = {\n status: INVITE_STATUS\n verifiedAt: null | number // timestamp\n verifiedCode: null | string\n becameOGAt: null // timestamp\n}\n\nconst DEFAULT_STATE = {\n status: INVITE_STATUS.UNVERIFIED,\n verifiedAt: null,\n verifiedCode: null,\n becameOGAt: null\n}\n\n/**\n * As of v4.20.0, an invite verification flow is introduced as a first step upon\n * extension installation. This flow requires users to provide a valid invite\n * code before they can use the Ambire extension. This controller manages the\n * verification of these invite codes and persisting the current invite status.\n */\nexport class InviteController extends EventEmitter {\n #storage: Storage\n\n #callRelayer: Function\n\n #state: InviteState = DEFAULT_STATE\n\n inviteStatus: InviteState['status'] = INVITE_STATUS.UNVERIFIED\n\n verifiedCode: InviteState['verifiedCode'] = null\n\n /**\n * Whether the user has become an Ambire OG (Original Gangster), a status that\n * comes with specific privileges (e.g. early access to new or experimental features).\n */\n isOG: boolean = false\n\n #initialLoadPromise: Promise\n\n constructor({\n relayerUrl,\n fetch,\n storage\n }: {\n relayerUrl: string\n fetch: Fetch\n storage: Storage\n }) {\n super()\n\n this.#storage = storage\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n const nextState = await this.#storage.get('invite', this.#state)\n this.#state = { ...DEFAULT_STATE, ...nextState }\n\n this.inviteStatus = this.#state.status\n this.verifiedCode = this.#state.verifiedCode\n this.isOG = !!this.#state.becameOGAt\n this.emitUpdate()\n }\n\n /**\n * Verifies an invite code and if verified successfully, persists the invite\n * status (and some meta information) in the storage.\n */\n async verify(code: string) {\n await this.#initialLoadPromise\n\n try {\n const res = await this.#callRelayer(`/promotions/extension-key/${code}`, 'GET')\n\n if (!res.success) throw new Error(res.message || \"Couldn't verify the invite code\")\n\n this.inviteStatus = INVITE_STATUS.VERIFIED\n this.verifiedCode = code\n this.emitUpdate()\n\n const verifiedAt = Date.now()\n await this.#storage.set('invite', {\n ...this.#state,\n status: INVITE_STATUS.VERIFIED,\n verifiedAt,\n verifiedCode: code\n })\n } catch (error: any) {\n this.emitError(error)\n }\n }\n\n async becomeOG() {\n await this.#initialLoadPromise\n\n const becameOGAt = Date.now()\n await this.#storage.set('invite', { ...this.#state, becameOGAt })\n\n this.isOG = true\n this.emitUpdate()\n }\n\n async revokeOG() {\n await this.#initialLoadPromise\n\n await this.#storage.set('invite', { ...this.#state, becameOGAt: null })\n\n this.isOG = false\n this.emitUpdate()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.d.ts b/dist/src/controllers/keystore/keystore.d.ts new file mode 100644 index 000000000..a0c88871d --- /dev/null +++ b/dist/src/controllers/keystore/keystore.d.ts @@ -0,0 +1,109 @@ +import { Encrypted } from 'eth-crypto'; +import { HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'; +import { Banner } from '../../interfaces/banner'; +import { ExternalKey, Key, KeyPreferences, KeystoreSeed, KeystoreSignerType, ReadyToAddKeys } from '../../interfaces/keystore'; +import { Storage } from '../../interfaces/storage'; +import { WindowManager } from '../../interfaces/window'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +declare const STATUS_WRAPPED_METHODS: { + readonly unlockWithSecret: "INITIAL"; + readonly addSecret: "INITIAL"; + readonly addSeed: "INITIAL"; + readonly moveTempSeedToKeystoreSeeds: "INITIAL"; + readonly deleteSavedSeed: "INITIAL"; + readonly removeSecret: "INITIAL"; + readonly addKeys: "INITIAL"; + readonly addKeysExternallyStored: "INITIAL"; + readonly changeKeystorePassword: "INITIAL"; + readonly updateKeyPreferences: "INITIAL"; +}; +/** + * The KeystoreController is a class that manages a collection of encrypted keys. + * It provides methods for adding, removing, and retrieving keys. The keys are + * encrypted using a main key, which is itself encrypted using one or more secrets. + * + * Docs: + * - Secrets are strings that are used to encrypt the mainKey; the mainKey + * could be encrypted with many secrets + * - All individual keys are encrypted with the mainKey + * - The mainKey is kept in memory, but only for the unlockedTime + * Design decisions: + * - decided to store all keys in the Keystore, even if the private key itself + * is not stored there; simply because it's called a Keystore and the name + * implies the functionality + * - handle HW wallets in it, so that we handle everything uniformly with a + * single API; also, it allows future flexibility to have the concept of + * optional unlocking built-in; if we have interactivity, we can add + * `keystore.signExtraInputRequired(key)` which returns what we need from the user + * - `signWithkey` is presumed to be non-interactive at least from `Keystore` + * point of view (requiring no extra user inputs). This could be wrong, if + * hardware wallets require extra input - they normally always do, but with + * the web SDKs we "outsource" this to the HW wallet software itself; + * this may not be true on mobile + */ +export declare class KeystoreController extends EventEmitter { + #private; + keyStoreUid: string | null; + isReadyToStoreKeys: boolean; + errorMessage: string; + statuses: Statuses; + constructor(_storage: Storage, _keystoreSigners: Partial<{ + [key in Key['type']]: KeystoreSignerType; + }>, windowManager: WindowManager); + lock(): void; + get isUnlocked(): boolean; + getKeyStoreUid(): Promise; + unlockWithSecret(secretId: string, secret: string): Promise; + addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean): Promise; + removeSecret(secretId: string): Promise; + get keys(): Key[]; + addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed): Promise; + deleteTempSeed(shouldUpdate?: boolean): void; + moveTempSeedToKeystoreSeeds(): Promise; + addSeed(keystoreSeed: KeystoreSeed): Promise; + changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE): Promise; + changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE): Promise; + addKeysExternallyStored(keysToAdd: ExternalKey[]): Promise; + addKeys(keysToAdd: ReadyToAddKeys['internal']): Promise; + removeKey(addr: Key['addr'], type: Key['type']): Promise; + exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string): Promise; + sendPrivateKeyToUi(keyAddress: string): Promise; + sendSeedToUi(): Promise; + /** + * Export with public key encrypt + * + * @param keyAddress string - the address of the key you want to export + * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId) + * @returns Encrypted + */ + exportKeyWithPublicKeyEncryption(keyAddress: string, publicKey: string): Promise; + importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean): Promise; + getSigner(keyAddress: Key['addr'], keyType: Key['type']): Promise; + getSavedSeed(): Promise<{ + seed: string; + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; + }>; + changeKeystorePassword(newSecret: string, oldSecret?: string): Promise; + updateKeyPreferences(keys: { + addr: Key['addr']; + type: Key['type']; + preferences: KeyPreferences; + }[]): Promise; + deleteSavedSeed(): Promise; + resetErrorState(): void; + get hasPasswordSecret(): boolean; + get hasKeystoreSavedSeed(): boolean; + get hasKeystoreTempSeed(): boolean; + get banners(): Banner[]; + toJSON(): this & { + isUnlocked: boolean; + keys: Key[]; + hasPasswordSecret: boolean; + hasKeystoreSavedSeed: boolean; + hasKeystoreTempSeed: boolean; + banners: Banner[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=keystore.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.d.ts.map b/dist/src/controllers/keystore/keystore.d.ts.map new file mode 100644 index 000000000..21e588341 --- /dev/null +++ b/dist/src/controllers/keystore/keystore.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.js b/dist/src/controllers/keystore/keystore.js new file mode 100644 index 000000000..9ee11da66 --- /dev/null +++ b/dist/src/controllers/keystore/keystore.js @@ -0,0 +1,753 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable new-cap */ +/* eslint-disable @typescript-eslint/no-shadow */ +import aes from 'aes-js'; +// import { entropyToMnemonic } from 'bip39' +import { decryptWithPrivateKey, encryptWithPublicKey, publicKeyByPrivateKey } from 'eth-crypto'; +import { concat, getBytes, hexlify, keccak256, Mnemonic, randomBytes, toUtf8Bytes, Wallet } from 'ethers'; +import scrypt from 'scrypt-js'; +import EmittableError from '../../classes/EmittableError'; +import { DERIVATION_OPTIONS } from '../../consts/derivation'; +import { getDefaultKeyLabel, getShouldMigrateKeyMetaNullToKeyMetaCreatedAt, getShouldMigrateKeystoreSeedsWithoutHdPath, migrateKeyMetaNullToKeyMetaCreatedAt, migrateKeyPreferencesToKeystoreKeys, migrateKeystoreSeedsWithoutHdPathTemplate } from '../../libs/keys/keys'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }; +const CIPHER = 'aes-128-ctr'; +const KEYSTORE_UNEXPECTED_ERROR_MESSAGE = 'Keystore unexpected error. If the problem persists, please contact support.'; +const STATUS_WRAPPED_METHODS = { + unlockWithSecret: 'INITIAL', + addSecret: 'INITIAL', + addSeed: 'INITIAL', + moveTempSeedToKeystoreSeeds: 'INITIAL', + deleteSavedSeed: 'INITIAL', + removeSecret: 'INITIAL', + addKeys: 'INITIAL', + addKeysExternallyStored: 'INITIAL', + changeKeystorePassword: 'INITIAL', + updateKeyPreferences: 'INITIAL' +}; +function getBytesForSecret(secret) { + // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24 + return toUtf8Bytes(secret, 'NFKC'); +} +/** + * The KeystoreController is a class that manages a collection of encrypted keys. + * It provides methods for adding, removing, and retrieving keys. The keys are + * encrypted using a main key, which is itself encrypted using one or more secrets. + * + * Docs: + * - Secrets are strings that are used to encrypt the mainKey; the mainKey + * could be encrypted with many secrets + * - All individual keys are encrypted with the mainKey + * - The mainKey is kept in memory, but only for the unlockedTime + * Design decisions: + * - decided to store all keys in the Keystore, even if the private key itself + * is not stored there; simply because it's called a Keystore and the name + * implies the functionality + * - handle HW wallets in it, so that we handle everything uniformly with a + * single API; also, it allows future flexibility to have the concept of + * optional unlocking built-in; if we have interactivity, we can add + * `keystore.signExtraInputRequired(key)` which returns what we need from the user + * - `signWithkey` is presumed to be non-interactive at least from `Keystore` + * point of view (requiring no extra user inputs). This could be wrong, if + * hardware wallets require extra input - they normally always do, but with + * the web SDKs we "outsource" this to the HW wallet software itself; + * this may not be true on mobile + */ +export class KeystoreController extends EventEmitter { + #mainKey; + // Secrets are strings that are used to encrypt the mainKey. + // The mainKey could be encrypted with many secrets. + #keystoreSecrets = []; + #storage; + #keystoreSeeds = []; + // when importing a seed, save it temporary here before deciding + // whether to place it in #keystoreSeeds or delete it + // + // this should be done only if there isn't a saved seed already + #tempSeed = null; + #keystoreSigners; + #keystoreKeys = []; + keyStoreUid; + isReadyToStoreKeys = false; + errorMessage = ''; + statuses = STATUS_WRAPPED_METHODS; + // Holds the initial load promise, so that one can wait until it completes + #initialLoadPromise; + #windowManager; + constructor(_storage, _keystoreSigners, windowManager) { + super(); + this.#storage = _storage; + this.#keystoreSigners = _keystoreSigners; + this.#mainKey = null; + this.keyStoreUid = null; + this.#windowManager = windowManager; + this.#initialLoadPromise = this.#load(); + } + async #load() { + try { + const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([ + this.#storage.get('keystoreSeeds', []), + this.#storage.get('keyStoreUid', null), + this.#storage.get('keystoreKeys', []), + this.#storage.get('keyPreferences', []) + ]); + this.keyStoreUid = keyStoreUid; + if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) { + // Cast to the old type (string[]) to avoid TS errors + const preMigrationKeystoreSeeds = keystoreSeeds; + this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds); + await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); + } + else { + this.#keystoreSeeds = keystoreSeeds; + } + const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0; + if (shouldMigrateKeyPreferencesToKeystoreKeys) { + this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys); + await this.#storage.set('keystoreKeys', this.#keystoreKeys); + await this.#storage.remove('keyPreferences'); + } + else { + this.#keystoreKeys = keystoreKeys; + } + if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) { + this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys); + await this.#storage.set('keystoreKeys', this.#keystoreKeys); + } + } + catch (e) { + this.emitError({ + message: 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: failed to pull keys from storage') + }); + } + try { + this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', []); + this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0; + } + catch (e) { + this.emitError({ + message: 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage') + }); + } + this.emitUpdate(); + } + lock() { + this.#mainKey = null; + if (this.#tempSeed) + this.deleteTempSeed(false); + this.emitUpdate(); + } + get isUnlocked() { + return !!this.#mainKey; + } + async getKeyStoreUid() { + const uid = this.keyStoreUid; + if (!uid) + throw new Error('keystore: adding secret before get uid'); + return uid; + } + // @TODO time before unlocking + async #unlockWithSecret(secretId, secret) { + await this.#initialLoadPromise; + // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct + if (!this.#keystoreSecrets.length) { + throw new EmittableError({ + message: 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: no secrets yet') + }); + } + const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId); + if (!secretEntry) { + throw new EmittableError({ + message: 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: secret not found') + }); + } + const { scryptParams, aesEncrypted } = secretEntry; + if (aesEncrypted.cipherType !== CIPHER) { + throw new EmittableError({ + message: 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`) + }); + } + // @TODO: progressCallback? + const key = await scrypt.scrypt(getBytesForSecret(secret), getBytes(scryptParams.salt), scryptParams.N, scryptParams.r, scryptParams.p, scryptParams.dkLen, () => { }); + const iv = getBytes(aesEncrypted.iv); + const derivedKey = key.slice(0, 16); + const macPrefix = key.slice(16, 32); + const counter = new aes.Counter(iv); + const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter); + const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext])); + if (mac !== aesEncrypted.mac) { + this.errorMessage = 'Incorrect password. Please try again.'; + this.emitUpdate(); + const error = new Error(this.errorMessage); + throw new EmittableError({ level: 'silent', message: this.errorMessage, error }); + } + this.errorMessage = ''; + const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext)); + this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }; + } + async unlockWithSecret(secretId, secret) { + await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret)); + } + async #addSecret(secretId, secret, extraEntropy = '', leaveUnlocked = false) { + await this.#initialLoadPromise; + // @TODO test + if (this.#keystoreSecrets.find((x) => x.id === secretId)) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error(`keystore: trying to add duplicate secret ${secretId}`) + }); + let mainKey = this.#mainKey; + // We are not unlocked + if (!mainKey) { + if (!this.#keystoreSecrets.length) { + const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(0, 16); + mainKey = { + key, + iv: randomBytes(16) + }; + } + else + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error('keystore: must unlock keystore before adding secret') + }); + if (leaveUnlocked) { + this.#mainKey = mainKey; + } + } + const salt = randomBytes(32); + const key = await scrypt.scrypt(getBytesForSecret(secret), salt, scryptDefaults.N, scryptDefaults.r, scryptDefaults.p, scryptDefaults.dkLen, () => { }); + const iv = randomBytes(16); + const derivedKey = key.slice(0, 16); + const macPrefix = key.slice(16, 32); + const counter = new aes.Counter(iv); + const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter); + const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv]))); + const mac = keccak256(concat([macPrefix, ciphertext])); + this.#keystoreSecrets.push({ + id: secretId, + scryptParams: { salt: hexlify(salt), ...scryptDefaults }, + aesEncrypted: { + cipherType: CIPHER, + ciphertext: hexlify(ciphertext), + iv: hexlify(iv), + mac: hexlify(mac) + } + }); + // Persist the new secrets + await this.#storage.set('keystoreSecrets', this.#keystoreSecrets); + // produce uid if one doesn't exist (should be created when the first secret is added) + if (!this.keyStoreUid) { + const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv])))); + this.keyStoreUid = uid; + await this.#storage.set('keyStoreUid', uid); + } + this.isReadyToStoreKeys = true; + } + async addSecret(secretId, secret, extraEntropy, leaveUnlocked) { + await this.withStatus('addSecret', () => this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)); + } + async #removeSecret(secretId) { + await this.#initialLoadPromise; + if (!this.#keystoreSecrets.find((x) => x.id === secretId)) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error(`keystore: secret$ ${secretId} not found`) + }); + this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId); + await this.#storage.set('keystoreSecrets', this.#keystoreSecrets); + } + async removeSecret(secretId) { + await this.withStatus('removeSecret', () => this.#removeSecret(secretId)); + } + get keys() { + return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => { + // Written with this 'internal' type guard (if) on purpose, because this + // way TypeScript will be able to narrow down the types properly and infer + // the return type of the map function correctly. + if (type === 'internal') { + return { + addr, + type, + label, + dedicatedToOneSA, + meta, + isExternallyStored: false + }; + } + return { + addr, + type, + label, + dedicatedToOneSA, + meta: meta, + isExternallyStored: true + }; + }); + } + async #getEncryptedSeed(seed) { + await this.#initialLoadPromise; + if (this.#mainKey === null) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error('keystore: needs to be unlocked') + }); + if (!Mnemonic.isValidMnemonic(seed)) { + throw new EmittableError({ + message: 'You are trying to store an invalid seed phrase.', + level: 'major', + error: new Error('keystore: trying to add an invalid seed phrase') + }); + } + // Currently we support only one seed phrase to be added to the keystore + // this fist seed phrase will become the saved seed phrase of the wallet + if (this.#keystoreSeeds.length) { + throw new EmittableError({ + message: 'You can have only one saved seed in the extension', + level: 'major', + error: new Error('keystore: seed phase already added. Storing multiple seed phrases not supported yet') + }); + } + // Set up the cipher + const counter = new aes.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above\ + return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed))); + } + async addSeedToTemp({ seed, hdPathTemplate }) { + const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate); + if (!validHdPath) + throw new EmittableError({ + message: 'Incorrect derivation path when trying to update the temp seed. Please contact support', + level: 'major', + error: new Error('keystore: hd path to temp seed incorrect') + }); + this.#tempSeed = { + seed: await this.#getEncryptedSeed(seed), + hdPathTemplate + }; + this.emitUpdate(); + } + deleteTempSeed(shouldUpdate = true) { + this.#tempSeed = null; + if (shouldUpdate) + this.emitUpdate(); + } + async #moveTempSeedToKeystoreSeeds() { + if (this.#mainKey === null) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error('keystore: needs to be unlocked') + }); + // Currently we support only one seed phrase to be added to the keystore + // this fist seed phrase will become the saved seed phrase of the wallet + if (this.#keystoreSeeds.length) { + throw new EmittableError({ + message: 'You can have only one saved seed in the extension', + level: 'major', + error: new Error('keystore: seed phase already added. Storing multiple seed phrases not supported yet') + }); + } + if (!this.#tempSeed) { + throw new EmittableError({ + message: 'Imported seed no longer exists in the extension. If you want to save it, please re-import it', + level: 'major', + error: new Error('keystore: imported seed deleted although a request to save it was made') + }); + } + this.#keystoreSeeds.push(this.#tempSeed); + await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); + this.#tempSeed = null; + this.emitUpdate(); + } + async moveTempSeedToKeystoreSeeds() { + await this.#initialLoadPromise; + await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds()); + } + async #addSeed({ seed, hdPathTemplate }) { + this.#keystoreSeeds.push({ + seed: await this.#getEncryptedSeed(seed), + hdPathTemplate + }); + await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); + this.emitUpdate(); + } + async addSeed(keystoreSeed) { + await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed)); + } + async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate) { + if (!nextHdPathTemplate) + return; // should never happen + await this.#initialLoadPromise; + if (!this.isUnlocked) + throw new Error('keystore: not unlocked'); + if (!this.#tempSeed) + throw new Error('keystore: no temp seed at the moment'); + const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate; + if (isTheSameHdPathTemplate) + return; + this.#tempSeed.hdPathTemplate = nextHdPathTemplate; + this.emitUpdate(); + } + async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate) { + if (!nextHdPathTemplate) + return; // should never happen + await this.#initialLoadPromise; + if (!this.isUnlocked) + throw new Error('keystore: not unlocked'); + if (!this.#keystoreSeeds.length) + throw new Error('keystore: no seed phrase added yet'); + const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate; + if (isTheSameHdPathTemplate) + return; + // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore + this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate; + await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); + this.emitUpdate(); + } + async #addKeysExternallyStored(keysToAdd) { + await this.#initialLoadPromise; + if (!keysToAdd.length) + return; + // Strip out keys with duplicated private keys. One unique key is enough. + const uniqueKeys = []; + const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => { + if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) { + return false; + } + uniqueKeys.push({ addr, type }); + return true; + }); + if (!uniqueKeysToAdd.length) + return; + const keys = this.#keystoreKeys; + const newKeys = uniqueKeysToAdd + .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({ + addr, + type, + label, + dedicatedToOneSA, + meta, + privKey: null + })) + // No need to re-add keys that are already added (with the same type / device) + .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type)); + if (!newKeys.length) + return; + const nextKeys = [...keys, ...newKeys]; + this.#keystoreKeys = nextKeys; + await this.#storage.set('keystoreKeys', nextKeys); + } + async addKeysExternallyStored(keysToAdd) { + await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd)); + } + async #addKeys(keysToAdd) { + await this.#initialLoadPromise; + if (!keysToAdd.length) + return; + if (this.#mainKey === null) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error('keystore: needs to be unlocked') + }); + // Strip out keys with duplicated private keys. One unique key is enough. + const uniquePrivateKeysToAddSet = new Set(); + const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => { + if (!uniquePrivateKeysToAddSet.has(privateKey)) { + uniquePrivateKeysToAddSet.add(privateKey); + return true; + } + return false; + }); + if (!uniqueKeysToAdd.length) + return; + const keys = this.#keystoreKeys; + const newKeys = uniqueKeysToAdd + .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => { + // eslint-disable-next-line no-param-reassign + privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey; + // Set up the cipher + const counter = new aes.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above + return { + addr, + type, + label, + dedicatedToOneSA, + privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), + meta + }; + }) + // No need to re-add keys that are already added, private key never changes + .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type)); + if (!newKeys.length) + return; + const nextKeys = [...keys, ...newKeys]; + this.#keystoreKeys = nextKeys; + await this.#storage.set('keystoreKeys', nextKeys); + } + async addKeys(keysToAdd) { + await this.withStatus('addKeys', () => this.#addKeys(keysToAdd)); + } + async removeKey(addr, type) { + await this.#initialLoadPromise; + if (!this.isUnlocked) + throw new EmittableError({ + message: 'Extension not unlocked. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: not unlocked') + }); + const keys = this.#keystoreKeys; + if (!keys.find((x) => x.addr === addr && x.type === type)) + throw new EmittableError({ + message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, + level: 'major', + error: new Error(`keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`) + }); + this.#keystoreKeys = keys.filter((key) => { + const isMatching = key.addr === addr && key.type === type; + return !isMatching; + }); + await this.#storage.set('keystoreKeys', this.#keystoreKeys); + } + async exportKeyWithPasscode(keyAddress, keyType, passphrase) { + await this.#initialLoadPromise; + if (this.#mainKey === null) + throw new Error('keystore: needs to be unlocked'); + const keys = this.#keystoreKeys; + const storedKey = keys.find((x) => x.addr === keyAddress && x.type === keyType); + if (!storedKey) + throw new Error('keystore: key not found'); + if (storedKey.type !== 'internal') + throw new Error('keystore: key does not have privateKey'); + const encryptedBytes = getBytes(storedKey.privKey); + const counter = new aes.Counter(this.#mainKey.iv); + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const decryptedBytes = aesCtr.decrypt(encryptedBytes); + const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes); + const wallet = new Wallet(decryptedPrivateKey); + const keyBackup = await wallet.encrypt(passphrase); + return JSON.stringify(keyBackup); + } + async sendPrivateKeyToUi(keyAddress) { + const decryptedPrivateKey = await this.#getPrivateKey(keyAddress); + this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` }); + } + async sendSeedToUi() { + const decrypted = await this.getSavedSeed(); + this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed }); + } + async #getPrivateKey(keyAddress) { + await this.#initialLoadPromise; + if (this.#mainKey === null) + throw new Error('keystore: needs to be unlocked'); + const keys = this.#keystoreKeys; + const storedKey = keys.find((x) => x.addr === keyAddress); + if (!storedKey) + throw new Error('keystore: key not found'); + if (storedKey.type !== 'internal') + throw new Error('keystore: key does not have privateKey'); + // decrypt the pk of keyAddress with the keystore's key + const encryptedBytes = getBytes(storedKey.privKey); + const counter = new aes.Counter(this.#mainKey.iv); + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + // encrypt the pk of keyAddress with publicKey + const decryptedBytes = aesCtr.decrypt(encryptedBytes); + return aes.utils.hex.fromBytes(decryptedBytes); + } + /** + * Export with public key encrypt + * + * @param keyAddress string - the address of the key you want to export + * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId) + * @returns Encrypted + */ + async exportKeyWithPublicKeyEncryption(keyAddress, publicKey) { + const decryptedPrivateKey = await this.#getPrivateKey(keyAddress); + const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey); + return result; + } + async importKeyWithPublicKeyEncryption(encryptedSk, dedicatedToOneSA) { + if (this.#mainKey === null) + throw new Error('keystore: needs to be unlocked'); + const privateKey = await decryptWithPrivateKey(hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))), encryptedSk); + if (!privateKey) + throw new Error('keystore: wrong encryptedSk or private key'); + const keyToAdd = { + addr: new Wallet(privateKey).address, + privateKey, + label: getDefaultKeyLabel(this.keys, 0), + type: 'internal', + dedicatedToOneSA, + meta: { + createdAt: new Date().getTime() + } + }; + await this.addKeys([keyToAdd]); + } + async getSigner(keyAddress, keyType) { + await this.#initialLoadPromise; + const keys = this.#keystoreKeys; + const storedKey = keys.find((x) => x.addr === keyAddress && x.type === keyType); + if (!storedKey) + throw new Error('keystore: key not found'); + const { addr, type, label, dedicatedToOneSA, meta } = storedKey; + const key = { + addr, + type, + label, + dedicatedToOneSA, + meta, + isExternallyStored: type !== 'internal' + }; + const SignerInitializer = this.#keystoreSigners[key.type]; + if (!SignerInitializer) + throw new Error('keystore: unsupported signer type'); + if (key.type === 'internal') { + if (!this.isUnlocked) + throw new Error('keystore: not unlocked'); + const encryptedBytes = getBytes(storedKey.privKey); + // @ts-ignore + const counter = new aes.Counter(this.#mainKey.iv); + // @ts-ignore + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const decryptedBytes = aesCtr.decrypt(encryptedBytes); + const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes); + // @ts-ignore TODO: Figure out the correct type definition + return new SignerInitializer(key, decryptedPrivateKey); + } + // @ts-ignore TODO: Figure out the correct type definition + return new SignerInitializer(key); + } + async getSavedSeed() { + await this.#initialLoadPromise; + if (!this.isUnlocked) + throw new Error('keystore: not unlocked'); + if (!this.#keystoreSeeds.length) + throw new Error('keystore: no seed phrase added yet'); + const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate; + const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed); + // @ts-ignore + const counter = new aes.Counter(this.#mainKey.iv); + // @ts-ignore + const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes); + const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes); + return { seed: decryptedSeed, hdPathTemplate }; + } + async #changeKeystorePassword(newSecret, oldSecret) { + await this.#initialLoadPromise; + // In the case the user wants to change their device password, + // they should also provide the previous password (oldSecret). + // + // However, in the case of KeyStore recovery, the user may have already forgotten the password, + // but the Keystore is already unlocked with the recovery secret. + // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it. + // + // However, there is one problem if we leave it that way: + // + // 1. If the user recovers and unlocks the Keystore. + // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab). + // 3. And later decides to change the old password from Settings. + // 4. Then they would not be able to do it because they don't know the old password. + // + // We are going to discuss it in the next meeting, but for now, we are leaving it as it is. + // The long-term solution would be to refactor EmailVault recovery logic + // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase. + if (oldSecret) + await this.#unlockWithSecret('password', oldSecret); + if (!this.isUnlocked) + throw new EmittableError({ + message: 'App not unlocked. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('keystore: not unlocked') + }); + await this.#removeSecret('password'); + await this.#addSecret('password', newSecret, '', true); + } + async changeKeystorePassword(newSecret, oldSecret) { + await this.withStatus('changeKeystorePassword', () => this.#changeKeystorePassword(newSecret, oldSecret)); + } + async updateKeyPreferences(keys) { + await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys)); + } + async #updateKeyPreferences(keys) { + this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => { + const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type); + if (!key) + return keystoreKey; + return { ...keystoreKey, ...key.preferences }; + }); + await this.#storage.set('keystoreKeys', this.#keystoreKeys); + this.emitUpdate(); + } + async deleteSavedSeed() { + await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed()); + } + async #deleteSavedSeed() { + await this.#initialLoadPromise; + this.#keystoreSeeds = []; + await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); + this.emitUpdate(); + } + resetErrorState() { + this.errorMessage = ''; + this.emitUpdate(); + } + get hasPasswordSecret() { + return this.#keystoreSecrets.some((x) => x.id === 'password'); + } + get hasKeystoreSavedSeed() { + return !!this.#keystoreSeeds.length; + } + get hasKeystoreTempSeed() { + return !!this.#tempSeed; + } + get banners() { + if (!this.#tempSeed) + return []; + return [ + { + id: 'tempSeed', + type: 'warning', + category: 'temp-seed-not-confirmed', + title: 'You have an unsaved imported seed', + text: '', + actions: [ + { + label: 'Check', + actionName: 'confirm-temp-seed' + } + ] + } + ]; + } + toJSON() { + return { + ...this, + ...super.toJSON(), + isUnlocked: this.isUnlocked, + keys: this.keys, + hasPasswordSecret: this.hasPasswordSecret, + hasKeystoreSavedSeed: this.hasKeystoreSavedSeed, + hasKeystoreTempSeed: this.hasKeystoreTempSeed, + banners: this.banners + }; + } +} +//# sourceMappingURL=keystore.js.map \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.js.map b/dist/src/controllers/keystore/keystore.js.map new file mode 100644 index 000000000..935a1402e --- /dev/null +++ b/dist/src/controllers/keystore/keystore.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable new-cap */\n/* eslint-disable @typescript-eslint/no-shadow */\nimport aes from 'aes-js'\n// import { entropyToMnemonic } from 'bip39'\nimport {\n decryptWithPrivateKey,\n Encrypted,\n encryptWithPublicKey,\n publicKeyByPrivateKey\n} from 'eth-crypto'\nimport {\n concat,\n getBytes,\n hexlify,\n keccak256,\n Mnemonic,\n randomBytes,\n toUtf8Bytes,\n Wallet\n} from 'ethers'\nimport scrypt from 'scrypt-js'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { DERIVATION_OPTIONS, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Banner } from '../../interfaces/banner'\nimport {\n ExternalKey,\n InternalKey,\n Key,\n KeyPreferences,\n KeystoreSeed,\n KeystoreSignerType,\n MainKey,\n MainKeyEncryptedWithSecret,\n ReadyToAddKeys,\n StoredKey\n} from '../../interfaces/keystore'\nimport { Storage } from '../../interfaces/storage'\nimport { WindowManager } from '../../interfaces/window'\nimport {\n getDefaultKeyLabel,\n getShouldMigrateKeyMetaNullToKeyMetaCreatedAt,\n getShouldMigrateKeystoreSeedsWithoutHdPath,\n migrateKeyMetaNullToKeyMetaCreatedAt,\n migrateKeyPreferencesToKeystoreKeys,\n migrateKeystoreSeedsWithoutHdPathTemplate\n} from '../../libs/keys/keys'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }\nconst CIPHER = 'aes-128-ctr'\nconst KEYSTORE_UNEXPECTED_ERROR_MESSAGE =\n 'Keystore unexpected error. If the problem persists, please contact support.'\n\nconst STATUS_WRAPPED_METHODS = {\n unlockWithSecret: 'INITIAL',\n addSecret: 'INITIAL',\n addSeed: 'INITIAL',\n moveTempSeedToKeystoreSeeds: 'INITIAL',\n deleteSavedSeed: 'INITIAL',\n removeSecret: 'INITIAL',\n addKeys: 'INITIAL',\n addKeysExternallyStored: 'INITIAL',\n changeKeystorePassword: 'INITIAL',\n updateKeyPreferences: 'INITIAL'\n} as const\n\nfunction getBytesForSecret(secret: string): ArrayLike {\n // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24\n return toUtf8Bytes(secret, 'NFKC')\n}\n\n/**\n * The KeystoreController is a class that manages a collection of encrypted keys.\n * It provides methods for adding, removing, and retrieving keys. The keys are\n * encrypted using a main key, which is itself encrypted using one or more secrets.\n *\n * Docs:\n * - Secrets are strings that are used to encrypt the mainKey; the mainKey\n * could be encrypted with many secrets\n * - All individual keys are encrypted with the mainKey\n * - The mainKey is kept in memory, but only for the unlockedTime\n * Design decisions:\n * - decided to store all keys in the Keystore, even if the private key itself\n * is not stored there; simply because it's called a Keystore and the name\n * implies the functionality\n * - handle HW wallets in it, so that we handle everything uniformly with a\n * single API; also, it allows future flexibility to have the concept of\n * optional unlocking built-in; if we have interactivity, we can add\n * `keystore.signExtraInputRequired(key)` which returns what we need from the user\n * - `signWithkey` is presumed to be non-interactive at least from `Keystore`\n * point of view (requiring no extra user inputs). This could be wrong, if\n * hardware wallets require extra input - they normally always do, but with\n * the web SDKs we \"outsource\" this to the HW wallet software itself;\n * this may not be true on mobile\n */\nexport class KeystoreController extends EventEmitter {\n #mainKey: MainKey | null\n\n // Secrets are strings that are used to encrypt the mainKey.\n // The mainKey could be encrypted with many secrets.\n #keystoreSecrets: MainKeyEncryptedWithSecret[] = []\n\n #storage: Storage\n\n #keystoreSeeds: KeystoreSeed[] = []\n\n // when importing a seed, save it temporary here before deciding\n // whether to place it in #keystoreSeeds or delete it\n //\n // this should be done only if there isn't a saved seed already\n #tempSeed: KeystoreSeed | null = null\n\n #keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n\n #keystoreKeys: StoredKey[] = []\n\n keyStoreUid: string | null\n\n isReadyToStoreKeys: boolean = false\n\n errorMessage: string = ''\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #windowManager: WindowManager\n\n constructor(\n _storage: Storage,\n _keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>,\n windowManager: WindowManager\n ) {\n super()\n this.#storage = _storage\n this.#keystoreSigners = _keystoreSigners\n this.#mainKey = null\n this.keyStoreUid = null\n this.#windowManager = windowManager\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([\n this.#storage.get('keystoreSeeds', []),\n this.#storage.get('keyStoreUid', null),\n this.#storage.get('keystoreKeys', []),\n this.#storage.get('keyPreferences', [])\n ])\n this.keyStoreUid = keyStoreUid\n\n if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) {\n // Cast to the old type (string[]) to avoid TS errors\n const preMigrationKeystoreSeeds = keystoreSeeds as unknown as string[]\n this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n } else {\n this.#keystoreSeeds = keystoreSeeds\n }\n\n const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0\n if (shouldMigrateKeyPreferencesToKeystoreKeys) {\n this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n await this.#storage.remove('keyPreferences')\n } else {\n this.#keystoreKeys = keystoreKeys\n }\n\n if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) {\n this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to pull keys from storage')\n })\n }\n\n try {\n this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', [])\n this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n lock() {\n this.#mainKey = null\n if (this.#tempSeed) this.deleteTempSeed(false)\n this.emitUpdate()\n }\n\n get isUnlocked() {\n return !!this.#mainKey\n }\n\n async getKeyStoreUid() {\n const uid = this.keyStoreUid\n if (!uid) throw new Error('keystore: adding secret before get uid')\n\n return uid\n }\n\n // @TODO time before unlocking\n async #unlockWithSecret(secretId: string, secret: string) {\n await this.#initialLoadPromise\n\n // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct\n if (!this.#keystoreSecrets.length) {\n throw new EmittableError({\n message:\n 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: no secrets yet')\n })\n }\n\n const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId)\n if (!secretEntry) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: secret not found')\n })\n }\n\n const { scryptParams, aesEncrypted } = secretEntry\n if (aesEncrypted.cipherType !== CIPHER) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`)\n })\n }\n // @TODO: progressCallback?\n\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n getBytes(scryptParams.salt),\n scryptParams.N,\n scryptParams.r,\n scryptParams.p,\n scryptParams.dkLen,\n () => {}\n )\n const iv = getBytes(aesEncrypted.iv)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext]))\n if (mac !== aesEncrypted.mac) {\n this.errorMessage = 'Incorrect password. Please try again.'\n this.emitUpdate()\n\n const error = new Error(this.errorMessage)\n throw new EmittableError({ level: 'silent', message: this.errorMessage, error })\n }\n this.errorMessage = ''\n\n const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext))\n this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }\n }\n\n async unlockWithSecret(secretId: string, secret: string) {\n await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret))\n }\n\n async #addSecret(\n secretId: string,\n secret: string,\n extraEntropy: string = '',\n leaveUnlocked: boolean = false\n ) {\n await this.#initialLoadPromise\n\n // @TODO test\n if (this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: trying to add duplicate secret ${secretId}`)\n })\n\n let mainKey: MainKey | null = this.#mainKey\n // We are not unlocked\n if (!mainKey) {\n if (!this.#keystoreSecrets.length) {\n const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(\n 0,\n 16\n )\n mainKey = {\n key,\n iv: randomBytes(16)\n }\n } else\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: must unlock keystore before adding secret')\n })\n\n if (leaveUnlocked) {\n this.#mainKey = mainKey\n }\n }\n\n const salt = randomBytes(32)\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n salt,\n scryptDefaults.N,\n scryptDefaults.r,\n scryptDefaults.p,\n scryptDefaults.dkLen,\n () => {}\n )\n const iv = randomBytes(16)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv])))\n const mac = keccak256(concat([macPrefix, ciphertext]))\n\n this.#keystoreSecrets.push({\n id: secretId,\n scryptParams: { salt: hexlify(salt), ...scryptDefaults },\n aesEncrypted: {\n cipherType: CIPHER,\n ciphertext: hexlify(ciphertext),\n iv: hexlify(iv),\n mac: hexlify(mac)\n }\n })\n // Persist the new secrets\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n\n // produce uid if one doesn't exist (should be created when the first secret is added)\n if (!this.keyStoreUid) {\n const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv]))))\n this.keyStoreUid = uid\n await this.#storage.set('keyStoreUid', uid)\n }\n\n this.isReadyToStoreKeys = true\n }\n\n async addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean) {\n await this.withStatus('addSecret', () =>\n this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)\n )\n }\n\n async #removeSecret(secretId: string) {\n await this.#initialLoadPromise\n\n if (!this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: secret$ ${secretId} not found`)\n })\n\n this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId)\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n }\n\n async removeSecret(secretId: string) {\n await this.withStatus('removeSecret', () => this.#removeSecret(secretId))\n }\n\n get keys(): Key[] {\n return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => {\n // Written with this 'internal' type guard (if) on purpose, because this\n // way TypeScript will be able to narrow down the types properly and infer\n // the return type of the map function correctly.\n if (type === 'internal') {\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: false\n }\n }\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta: meta as ExternalKey['meta'],\n isExternallyStored: true\n }\n })\n }\n\n async #getEncryptedSeed(seed: KeystoreSeed['seed']): Promise {\n await this.#initialLoadPromise\n\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n if (!Mnemonic.isValidMnemonic(seed)) {\n throw new EmittableError({\n message: 'You are trying to store an invalid seed phrase.',\n level: 'major',\n error: new Error('keystore: trying to add an invalid seed phrase')\n })\n }\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\\\n return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed)))\n }\n\n async addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed) {\n const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate)\n if (!validHdPath)\n throw new EmittableError({\n message:\n 'Incorrect derivation path when trying to update the temp seed. Please contact support',\n level: 'major',\n error: new Error('keystore: hd path to temp seed incorrect')\n })\n\n this.#tempSeed = {\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n }\n\n this.emitUpdate()\n }\n\n deleteTempSeed(shouldUpdate = true) {\n this.#tempSeed = null\n if (shouldUpdate) this.emitUpdate()\n }\n\n async #moveTempSeedToKeystoreSeeds() {\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n if (!this.#tempSeed) {\n throw new EmittableError({\n message:\n 'Imported seed no longer exists in the extension. If you want to save it, please re-import it',\n level: 'major',\n error: new Error('keystore: imported seed deleted although a request to save it was made')\n })\n }\n\n this.#keystoreSeeds.push(this.#tempSeed)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n this.#tempSeed = null\n this.emitUpdate()\n }\n\n async moveTempSeedToKeystoreSeeds() {\n await this.#initialLoadPromise\n await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds())\n }\n\n async #addSeed({ seed, hdPathTemplate }: KeystoreSeed) {\n this.#keystoreSeeds.push({\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n })\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async addSeed(keystoreSeed: KeystoreSeed) {\n await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed))\n }\n\n async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#tempSeed) throw new Error('keystore: no temp seed at the moment')\n\n const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n this.#tempSeed.hdPathTemplate = nextHdPathTemplate\n\n this.emitUpdate()\n }\n\n async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore\n this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async #addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.#initialLoadPromise\n\n if (!keysToAdd.length) return\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniqueKeys: { addr: Key['addr']; type: Key['type'] }[] = []\n const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => {\n if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) {\n return false\n }\n\n uniqueKeys.push({ addr, type })\n return true\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys = uniqueKeysToAdd\n .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n privKey: null\n }))\n // No need to re-add keys that are already added (with the same type / device)\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd))\n }\n\n async #addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.#initialLoadPromise\n if (!keysToAdd.length) return\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniquePrivateKeysToAddSet = new Set()\n const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => {\n if (!uniquePrivateKeysToAddSet.has(privateKey)) {\n uniquePrivateKeysToAddSet.add(privateKey)\n return true\n }\n return false\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys: StoredKey[] = uniqueKeysToAdd\n .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => {\n // eslint-disable-next-line no-param-reassign\n privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), // TODO: consider a MAC?\n meta\n }\n })\n // No need to re-add keys that are already added, private key never changes\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.withStatus('addKeys', () => this.#addKeys(keysToAdd))\n }\n\n async removeKey(addr: Key['addr'], type: Key['type']) {\n await this.#initialLoadPromise\n if (!this.isUnlocked)\n throw new EmittableError({\n message:\n 'Extension not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n const keys = this.#keystoreKeys\n if (!keys.find((x) => x.addr === addr && x.type === type))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(\n `keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`\n )\n })\n\n this.#keystoreKeys = keys.filter((key) => {\n const isMatching = key.addr === addr && key.type === type\n\n return !isMatching\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n\n async exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string) {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n const wallet = new Wallet(decryptedPrivateKey)\n const keyBackup = await wallet.encrypt(passphrase)\n return JSON.stringify(keyBackup)\n }\n\n async sendPrivateKeyToUi(keyAddress: string) {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` })\n }\n\n async sendSeedToUi() {\n const decrypted = await this.getSavedSeed()\n this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed })\n }\n\n async #getPrivateKey(keyAddress: string): Promise {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress)\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n // decrypt the pk of keyAddress with the keystore's key\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n // encrypt the pk of keyAddress with publicKey\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n return aes.utils.hex.fromBytes(decryptedBytes)\n }\n\n /**\n * Export with public key encrypt\n *\n * @param keyAddress string - the address of the key you want to export\n * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId)\n * @returns Encrypted\n */\n async exportKeyWithPublicKeyEncryption(\n keyAddress: string,\n publicKey: string\n ): Promise {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey)\n\n return result\n }\n\n async importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean) {\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const privateKey: string = await decryptWithPrivateKey(\n hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))),\n encryptedSk\n )\n if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key')\n\n const keyToAdd: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n } = {\n addr: new Wallet(privateKey).address,\n privateKey,\n label: getDefaultKeyLabel(this.keys, 0),\n type: 'internal',\n dedicatedToOneSA,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n\n await this.addKeys([keyToAdd])\n }\n\n async getSigner(keyAddress: Key['addr'], keyType: Key['type']) {\n await this.#initialLoadPromise\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n const { addr, type, label, dedicatedToOneSA, meta } = storedKey\n\n const key = {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: type !== 'internal'\n }\n\n const SignerInitializer = this.#keystoreSigners[key.type]\n if (!SignerInitializer) throw new Error('keystore: unsupported signer type')\n\n if (key.type === 'internal') {\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key, decryptedPrivateKey)\n }\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key)\n }\n\n async getSavedSeed() {\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate\n const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes)\n const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes)\n return { seed: decryptedSeed, hdPathTemplate }\n }\n\n async #changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.#initialLoadPromise\n\n // In the case the user wants to change their device password,\n // they should also provide the previous password (oldSecret).\n //\n // However, in the case of KeyStore recovery, the user may have already forgotten the password,\n // but the Keystore is already unlocked with the recovery secret.\n // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it.\n //\n // However, there is one problem if we leave it that way:\n //\n // 1. If the user recovers and unlocks the Keystore.\n // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab).\n // 3. And later decides to change the old password from Settings.\n // 4. Then they would not be able to do it because they don't know the old password.\n //\n // We are going to discuss it in the next meeting, but for now, we are leaving it as it is.\n // The long-term solution would be to refactor EmailVault recovery logic\n // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase.\n if (oldSecret) await this.#unlockWithSecret('password', oldSecret)\n\n if (!this.isUnlocked)\n throw new EmittableError({\n message: 'App not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n\n await this.#removeSecret('password')\n await this.#addSecret('password', newSecret, '', true)\n }\n\n async changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.withStatus('changeKeystorePassword', () =>\n this.#changeKeystorePassword(newSecret, oldSecret)\n )\n }\n\n async updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys))\n }\n\n async #updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => {\n const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type)\n\n if (!key) return keystoreKey\n\n return { ...keystoreKey, ...key.preferences }\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n this.emitUpdate()\n }\n\n async deleteSavedSeed() {\n await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed())\n }\n\n async #deleteSavedSeed() {\n await this.#initialLoadPromise\n\n this.#keystoreSeeds = []\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n resetErrorState() {\n this.errorMessage = ''\n this.emitUpdate()\n }\n\n get hasPasswordSecret() {\n return this.#keystoreSecrets.some((x) => x.id === 'password')\n }\n\n get hasKeystoreSavedSeed() {\n return !!this.#keystoreSeeds.length\n }\n\n get hasKeystoreTempSeed() {\n return !!this.#tempSeed\n }\n\n get banners(): Banner[] {\n if (!this.#tempSeed) return []\n\n return [\n {\n id: 'tempSeed',\n type: 'warning',\n category: 'temp-seed-not-confirmed',\n title: 'You have an unsaved imported seed',\n text: '',\n actions: [\n {\n label: 'Check',\n actionName: 'confirm-temp-seed'\n }\n ]\n }\n ]\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isUnlocked: this.isUnlocked, // includes the getter in the stringified instance\n keys: this.keys,\n hasPasswordSecret: this.hasPasswordSecret,\n hasKeystoreSavedSeed: this.hasKeystoreSavedSeed,\n hasKeystoreTempSeed: this.hasKeystoreTempSeed,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/main/main.d.ts b/dist/src/controllers/main/main.d.ts new file mode 100644 index 000000000..b4bf375ef --- /dev/null +++ b/dist/src/controllers/main/main.d.ts @@ -0,0 +1,181 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Account, AccountOnchainState } from '../../interfaces/account'; +import { Banner } from '../../interfaces/banner'; +import { DappProviderRequest } from '../../interfaces/dapp'; +import { Fetch } from '../../interfaces/fetch'; +import { ExternalSignerControllers, Key, KeystoreSignerType } from '../../interfaces/keystore'; +import { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'; +import { NotificationManager } from '../../interfaces/notification'; +import { RPCProvider } from '../../interfaces/provider'; +import { Storage } from '../../interfaces/storage'; +import { UserRequest } from '../../interfaces/userRequest'; +import { WindowManager } from '../../interfaces/window'; +import { AccountOp } from '../../libs/accountOp/accountOp'; +import { EstimateResult } from '../../libs/estimate/interfaces'; +import { GasRecommendation } from '../../libs/gasPrice/gasPrice'; +import { TokenResult } from '../../libs/portfolio/interfaces'; +import { GasSpeeds } from '../../services/bundlers/types'; +import { AccountAdderController } from '../accountAdder/accountAdder'; +import { AccountsController } from '../accounts/accounts'; +import { AccountOpAction, ActionExecutionType, ActionPosition, ActionsController } from '../actions/actions'; +import { ActivityController } from '../activity/activity'; +import { AddressBookController } from '../addressBook/addressBook'; +import { DappsController } from '../dapps/dapps'; +import { DefiPositionsController } from '../defiPositions/defiPositions'; +import { DomainsController } from '../domains/domains'; +import { EmailVaultController } from '../emailVault/emailVault'; +import EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'; +import { InviteController } from '../invite/invite'; +import { KeystoreController } from '../keystore/keystore'; +import { NetworksController } from '../networks/networks'; +import { PortfolioController } from '../portfolio/portfolio'; +import { ProvidersController } from '../providers/providers'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +import { SignAccountOpController } from '../signAccountOp/signAccountOp'; +import { SignMessageController } from '../signMessage/signMessage'; +import { SwapAndBridgeController } from '../swapAndBridge/swapAndBridge'; +declare const STATUS_WRAPPED_METHODS: { + readonly onAccountAdderSuccess: "INITIAL"; + readonly signAccountOp: "INITIAL"; + readonly broadcastSignedAccountOp: "INITIAL"; + readonly removeAccount: "INITIAL"; + readonly handleAccountAdderInitLedger: "INITIAL"; + readonly handleAccountAdderInitLattice: "INITIAL"; + readonly importSmartAccountFromDefaultSeed: "INITIAL"; + readonly buildSwapAndBridgeUserRequest: "INITIAL"; + readonly importSmartAccountFromSavedSeed: "INITIAL"; + readonly selectAccount: "INITIAL"; +}; +export declare class MainController extends EventEmitter { + #private; + fetch: Fetch; + callRelayer: Function; + isReady: boolean; + invite: InviteController; + keystore: KeystoreController; + networks: NetworksController; + providers: ProvidersController; + accountAdder: AccountAdderController; + portfolio: PortfolioController; + defiPositions: DefiPositionsController; + dapps: DappsController; + actions: ActionsController; + emailVault: EmailVaultController; + signMessage: SignMessageController; + swapAndBridge: SwapAndBridgeController; + signAccountOp: SignAccountOpController | null; + signAccOpInitError: string | null; + activity: ActivityController; + addressBook: AddressBookController; + domains: DomainsController; + accounts: AccountsController; + selectedAccount: SelectedAccountController; + userRequests: UserRequest[]; + userRequestWaitingAccountSwitch: UserRequest[]; + gasPrices: { + [key: string]: GasRecommendation[]; + }; + bundlerGasPrices: { + [key: string]: { + speeds: GasSpeeds; + bundler: BUNDLER; + }; + }; + accountOpsToBeConfirmed: { + [key: string]: { + [key: string]: AccountOp; + }; + }; + feePayerKey: Key | null; + lastUpdate: Date; + isOffline: boolean; + statuses: Statuses; + constructor({ storage, fetch, relayerUrl, velcroUrl, socketApiKey, keystoreSigners, externalSignerControllers, windowManager, notificationManager }: { + storage: Storage; + fetch: Fetch; + relayerUrl: string; + velcroUrl: string; + socketApiKey: string; + keystoreSigners: Partial<{ + [key in Key['type']]: KeystoreSignerType; + }>; + externalSignerControllers: ExternalSignerControllers; + windowManager: WindowManager; + notificationManager: NotificationManager; + }); + /** + * - Updates the selected account's account state, portfolio and defi positions + * - Calls batchReverseLookup for all accounts + * + * It's not a problem to call it many times consecutively as all methods have internal + * caching mechanisms to prevent unnecessary calls. + */ + onLoad(isFirstLoad?: boolean): void; + lock(): void; + selectAccount(toAccountAddr: string): Promise; + importSmartAccountFromSavedSeed(seed?: string): Promise; + initSignAccOp(actionId: AccountOpAction['id']): null | void; + handleSignAndBroadcastAccountOp(): Promise; + destroySignAccOp(): void; + traceCall(estimation: EstimateResult): Promise; + handleSignMessage(): Promise; + handleAccountAdderInitLedger(LedgerKeyIterator: any): Promise; + handleAccountAdderInitLattice(LatticeKeyIterator: any): Promise; + updateAccountsOpsStatuses(): Promise<{ + newestOpTimestamp: number; + }>; + setContractsDeployedToTrueIfDeployed(network: Network): Promise; + removeAccount(address: Account['addr']): Promise; + reloadSelectedAccount(options?: { + forceUpdate?: boolean; + networkId?: NetworkId; + }): Promise; + updateSelectedAccountPortfolio(forceUpdate?: boolean, network?: Network): Promise; + buildUserRequestFromDAppRequest(request: DappProviderRequest, dappPromise: { + session: { + name: string; + origin: string; + icon: string; + }; + resolve: (data: any) => void; + reject: (data: any) => void; + }): Promise; + buildTransferUserRequest(amount: string, recipientAddress: string, selectedToken: TokenResult, actionExecutionType?: ActionExecutionType): Promise; + buildSwapAndBridgeUserRequest(activeRouteId?: number): Promise; + buildClaimWalletUserRequest(token: TokenResult): void; + buildMintVestingUserRequest(token: TokenResult): void; + resolveUserRequest(data: any, requestId: UserRequest['id']): void; + rejectUserRequest(err: string, requestId: UserRequest['id']): void; + rejectSignAccountOpCall(callId: string): void; + removeActiveRoute(activeRouteId: number): void; + addUserRequest(req: UserRequest, actionPosition?: ActionPosition, actionExecutionType?: ActionExecutionType): Promise; + removeUserRequest(id: UserRequest['id'], options?: { + shouldRemoveSwapAndBridgeRoute: boolean; + shouldUpdateAccount?: boolean; + shouldOpenNextRequest?: boolean; + }): void; + addEntryPointAuthorization(req: UserRequest, network: Network, accountState: AccountOnchainState, actionExecutionType?: ActionExecutionType): Promise; + addNetwork(network: AddNetworkRequestParams): Promise; + removeNetwork(id: NetworkId): Promise; + resolveAccountOpAction(data: any, actionId: AccountOpAction['id']): Promise; + rejectAccountOpAction(err: string, actionId: AccountOpAction['id'], shouldOpenNextAction: boolean): void; + updateSignAccountOpGasPrice(): Promise; + estimateSignAccountOp(): Promise; + get banners(): Banner[]; + protected throwBroadcastAccountOp({ message: humanReadableMessage, error: _err, accountState, isRelayer, provider, network }: { + message?: string; + error?: Error; + accountState?: AccountOnchainState; + isRelayer?: boolean; + provider?: RPCProvider; + network?: Network; + }): Promise; + get isSignRequestStillActive(): boolean; + toJSON(): this & { + banners: Banner[]; + isSignRequestStillActive: boolean; + emittedErrors: ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/main/main.d.ts.map b/dist/src/controllers/main/main.d.ts.map new file mode 100644 index 000000000..234f19802 --- /dev/null +++ b/dist/src/controllers/main/main.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAO/C,OAAO,EACL,OAAO,EAEP,mBAAmB,EAEpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EACL,yBAAyB,EACzB,GAAG,EACH,kBAAkB,EAEnB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAA2C,WAAW,EAAE,MAAM,8BAA8B,CAAA;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,EAAE,SAAS,EAAqC,MAAM,gCAAgC,CAAA;AAqB7F,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAA8B,MAAM,8BAA8B,CAAA;AAW5F,OAAO,EAAc,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAwBzE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAOzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EAElB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,OAAO,EAAE,uBAAuB,EAAiB,MAAM,gCAAgC,CAAA;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAA2B,MAAM,gCAAgC,CAAA;AAEjG,QAAA,MAAM,sBAAsB;;;;;;;;;;;CAWlB,CAAA;AAEV,qBAAa,cAAe,SAAQ,YAAY;;IAG9C,KAAK,EAAE,KAAK,CAAA;IAKZ,WAAW,EAAE,QAAQ,CAAA;IAErB,OAAO,EAAE,OAAO,CAAQ;IAExB,MAAM,EAAE,gBAAgB,CAAA;IAExB,QAAQ,EAAE,kBAAkB,CAAA;IAU5B,QAAQ,EAAE,kBAAkB,CAAA;IAE5B,SAAS,EAAE,mBAAmB,CAAA;IAE9B,YAAY,EAAE,sBAAsB,CAAA;IAEpC,SAAS,EAAE,mBAAmB,CAAA;IAE9B,aAAa,EAAE,uBAAuB,CAAA;IAEtC,KAAK,EAAE,eAAe,CAAA;IAEtB,OAAO,EAAE,iBAAiB,CAAA;IAI1B,UAAU,EAAE,oBAAoB,CAAA;IAEhC,WAAW,EAAE,qBAAqB,CAAA;IAElC,aAAa,EAAE,uBAAuB,CAAA;IAEtC,aAAa,EAAE,uBAAuB,GAAG,IAAI,CAAO;IAEpD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAO;IAExC,QAAQ,EAAE,kBAAkB,CAAA;IAE5B,WAAW,EAAE,qBAAqB,CAAA;IAElC,OAAO,EAAE,iBAAiB,CAAA;IAE1B,QAAQ,EAAE,kBAAkB,CAAA;IAE5B,eAAe,EAAE,yBAAyB,CAAA;IAE1C,YAAY,EAAE,WAAW,EAAE,CAAK;IAEhC,+BAA+B,EAAE,WAAW,EAAE,CAAK;IAGnD,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAK;IAGtD,gBAAgB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,SAAS,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAK;IAEjF,uBAAuB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE,CAAA;KAAE,CAAK;IAG7E,WAAW,EAAE,GAAG,GAAG,IAAI,CAAO;IAE9B,UAAU,EAAE,IAAI,CAAa;IAE7B,SAAS,EAAE,OAAO,CAAQ;IAE1B,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;gBAUpE,EACV,OAAO,EACP,KAAK,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,mBAAmB,EACpB,EAAE;QACD,OAAO,EAAE,OAAO,CAAA;QAChB,KAAK,EAAE,KAAK,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,CAAA;QACpB,eAAe,EAAE,OAAO,CAAC;aAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,kBAAkB;SAAE,CAAC,CAAA;QACtE,yBAAyB,EAAE,yBAAyB,CAAA;QACpD,aAAa,EAAE,aAAa,CAAA;QAC5B,mBAAmB,EAAE,mBAAmB,CAAA;KACzC;IAgID;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,GAAE,OAAe;IAyEnC,IAAI;IAME,aAAa,CAAC,aAAa,EAAE,MAAM;IAuCnC,+BAA+B,CAAC,IAAI,CAAC,EAAE,MAAM;IA4EnD,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAyDrD,+BAA+B;IAyCrC,gBAAgB;IAaV,SAAS,CAAC,UAAU,EAAE,cAAc;IAiDpC,iBAAiB;IA4FjB,4BAA4B,CAAC,iBAAiB,EAAE,GAAG;IAmCnD,6BAA6B,CACjC,kBAAkB,EAAE,GAAG;IAOnB,yBAAyB,IAAI,OAAO,CAAC;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBnE,oCAAoC,CAAC,OAAO,EAAE,OAAO;IAwCrD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;IA4DtC,qBAAqB,CACzB,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,SAAS,CAAC,EAAE,SAAS,CAAA;KAItB;IA0EG,8BAA8B,CAAC,WAAW,GAAE,OAAe,EAAE,OAAO,CAAC,EAAE,OAAO;IAuC9E,+BAA+B,CACnC,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE;QACX,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;QACvD,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KAC5B;IAuNG,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,WAAW,EAC1B,mBAAmB,GAAE,mBAA0C;IA0B3D,6BAA6B,CAAC,aAAa,CAAC,EAAE,MAAM;IAwF1D,2BAA2B,CAAC,KAAK,EAAE,WAAW;IAiB9C,2BAA2B,CAAC,KAAK,EAAE,WAAW;IAe9C,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;IAkB1D,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;IAgC3D,uBAAuB,CAAC,MAAM,EAAE,MAAM;IA0CtC,iBAAiB,CAAC,aAAa,EAAE,MAAM;IAcjC,cAAc,CAClB,GAAG,EAAE,WAAW,EAChB,cAAc,GAAE,cAAuB,EACvC,mBAAmB,GAAE,mBAA0C;IAuIjE,iBAAiB,CACf,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,EACrB,OAAO,GAAE;QACP,8BAA8B,EAAE,OAAO,CAAA;QACvC,mBAAmB,CAAC,EAAE,OAAO,CAAA;QAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAKhC;IA2FG,0BAA0B,CAC9B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,mBAAmB,GAAE,mBAA0C;IAqC3D,UAAU,CAAC,OAAO,EAAE,uBAAuB;IAK3C,aAAa,CAAC,EAAE,EAAE,SAAS;IAO3B,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;IAiGvE,qBAAqB,CACnB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAC/B,oBAAoB,EAAE,OAAO;IA2EzB,2BAA2B;IAoB3B,qBAAqB;IA+kB3B,IAAI,OAAO,IAAI,MAAM,EAAE,CAuBtB;IAID,SAAS,CAAC,uBAAuB,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,IAAI,EACX,YAAY,EACZ,SAAiB,EACjB,QAAoB,EACpB,OAAmB,EACpB,EAAE;QACD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,YAAY,CAAC,EAAE,mBAAmB,CAAA;QAClC,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,QAAQ,CAAC,EAAE,WAAW,CAAA;QACtB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB;IAyDD,IAAI,wBAAwB,IAAI,OAAO,CAItC;IAGD,MAAM;;;;;CAQP"} \ No newline at end of file diff --git a/dist/src/controllers/main/main.js b/dist/src/controllers/main/main.js new file mode 100644 index 000000000..99b1ecaac --- /dev/null +++ b/dist/src/controllers/main/main.js @@ -0,0 +1,2059 @@ +/* eslint-disable @typescript-eslint/brace-style */ +import { ethErrors } from 'eth-rpc-errors'; +import { getAddress, getBigInt, Interface, isAddress } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import EmittableError from '../../classes/EmittableError'; +import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; +import { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'; +import { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'; +import { BIP44_LEDGER_DERIVATION_TEMPLATE, BIP44_STANDARD_DERIVATION_TEMPLATE } from '../../consts/derivation'; +import { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'; +import { AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'; +import { getDappIdentifier, pollTxnId } from '../../libs/accountOp/submittedAccountOp'; +import { dappRequestMethodToActionKind, getAccountOpActionsByNetwork, getAccountOpFromAction } from '../../libs/actions/actions'; +import { getAccountOpBanners } from '../../libs/banners/banners'; +import { getPaymasterService } from '../../libs/erc7677/erc7677'; +import { getHumanReadableBroadcastError, getHumanReadableEstimationError } from '../../libs/errorHumanizer'; +import { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'; +import { estimate } from '../../libs/estimate/estimate'; +import { getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'; +import { humanizeAccountOp } from '../../libs/humanizer'; +import { KeyIterator } from '../../libs/keyIterator/keyIterator'; +import { ACCOUNT_SWITCH_USER_REQUEST, buildSwitchAccountUserRequest, getAccountOpsForSimulation, makeBasicAccountOpAction, makeSmartAccountOpAction } from '../../libs/main/main'; +import { relayerAdditionalNetworks } from '../../libs/networks/networks'; +import { relayerCall } from '../../libs/relayerCall/relayerCall'; +import { parse } from '../../libs/richJson/richJson'; +import { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'; +import { adjustEntryPointAuthorization, getEntryPointAuthorization } from '../../libs/signMessage/signMessage'; +import { buildSwapAndBridgeUserRequests, getActiveRoutesForAccount } from '../../libs/swapAndBridge/swapAndBridge'; +import { debugTraceCall } from '../../libs/tracer/debugTraceCall'; +import { buildClaimWalletRequest, buildMintVestingRequest, buildTransferUserRequest } from '../../libs/transfer/userRequest'; +import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID, isErc4337Broadcast, shouldAskForEntryPointAuthorization } from '../../libs/userOperation/userOperation'; +import { getDefaultBundler } from '../../services/bundlers/getBundler'; +import { paymasterFactory } from '../../services/paymaster'; +import { failedPaymasters } from '../../services/paymaster/FailedPaymasters'; +import { SocketAPI } from '../../services/socket/api'; +import { getIsViewOnly } from '../../utils/accounts'; +import shortenAddress from '../../utils/shortenAddress'; +import wait from '../../utils/wait'; +import { AccountAdderController } from '../accountAdder/accountAdder'; +import { AccountsController } from '../accounts/accounts'; +import { ActionsController } from '../actions/actions'; +import { ActivityController } from '../activity/activity'; +import { AddressBookController } from '../addressBook/addressBook'; +import { DappsController } from '../dapps/dapps'; +import { DefiPositionsController } from '../defiPositions/defiPositions'; +import { DomainsController } from '../domains/domains'; +import { EmailVaultController } from '../emailVault/emailVault'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { InviteController } from '../invite/invite'; +import { KeystoreController } from '../keystore/keystore'; +import { NetworksController } from '../networks/networks'; +import { PortfolioController } from '../portfolio/portfolio'; +import { ProvidersController } from '../providers/providers'; +/* eslint-disable @typescript-eslint/no-floating-promises */ +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +/* eslint-disable no-underscore-dangle */ +import { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'; +import { SignMessageController } from '../signMessage/signMessage'; +import { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'; +const STATUS_WRAPPED_METHODS = { + onAccountAdderSuccess: 'INITIAL', + signAccountOp: 'INITIAL', + broadcastSignedAccountOp: 'INITIAL', + removeAccount: 'INITIAL', + handleAccountAdderInitLedger: 'INITIAL', + handleAccountAdderInitLattice: 'INITIAL', + importSmartAccountFromDefaultSeed: 'INITIAL', + buildSwapAndBridgeUserRequest: 'INITIAL', + importSmartAccountFromSavedSeed: 'INITIAL', + selectAccount: 'INITIAL' +}; +export class MainController extends EventEmitter { + #storage; + fetch; + // Holds the initial load promise, so that one can wait until it completes + #initialLoadPromise; + callRelayer; + isReady = false; + invite; + keystore; + /** + * Hardware wallets (usually) need an additional (external signer) controller, + * that is app-specific (web, mobile) and is used to interact with the device. + * (example: LedgerController, TrezorController, LatticeController) + */ + #externalSignerControllers = {}; + // Subcontrollers + networks; + providers; + accountAdder; + portfolio; + defiPositions; + dapps; + actions; + // Public sub-structures + // @TODO emailVaults + emailVault; + signMessage; + swapAndBridge; + signAccountOp = null; + signAccOpInitError = null; + activity; + addressBook; + domains; + accounts; + selectedAccount; + userRequests = []; + userRequestWaitingAccountSwitch = []; + // network => GasRecommendation[] + gasPrices = {}; + // network => BundlerGasPrice + bundlerGasPrices = {}; + accountOpsToBeConfirmed = {}; + // TODO: Temporary solution to expose the fee payer key during Account Op broadcast. + feePayerKey = null; + lastUpdate = new Date(); + isOffline = false; + statuses = STATUS_WRAPPED_METHODS; + #windowManager; + #notificationManager; + #signAccountOpSigningPromise; + #signAccountOpBroadcastPromise; + constructor({ storage, fetch, relayerUrl, velcroUrl, socketApiKey, keystoreSigners, externalSignerControllers, windowManager, notificationManager }) { + super(); + this.#storage = storage; + this.fetch = fetch; + this.#windowManager = windowManager; + this.#notificationManager = notificationManager; + this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage }); + this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager); + this.#externalSignerControllers = externalSignerControllers; + this.networks = new NetworksController(this.#storage, this.fetch, async (network) => { + this.providers.setProvider(network); + await this.reloadSelectedAccount({ networkId: network.id }); + }, (networkId) => { + this.providers.removeProvider(networkId); + }); + this.providers = new ProvidersController(this.networks); + this.accounts = new AccountsController(this.#storage, this.providers, this.networks, async (accounts) => { + const defaultSelectedAccount = getDefaultSelectedAccount(accounts); + if (defaultSelectedAccount) { + await this.#selectAccount(defaultSelectedAccount.addr); + } + }, this.providers.updateProviderIsWorking.bind(this.providers), this.#updateIsOffline.bind(this)); + this.selectedAccount = new SelectedAccountController({ + storage: this.#storage, + accounts: this.accounts + }); + this.portfolio = new PortfolioController(this.#storage, this.fetch, this.providers, this.networks, this.accounts, relayerUrl, velcroUrl); + this.defiPositions = new DefiPositionsController({ + fetch: this.fetch, + storage, + selectedAccount: this.selectedAccount, + networks: this.networks, + providers: this.providers + }); + this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore); + this.accountAdder = new AccountAdderController({ + accounts: this.accounts, + keystore: this.keystore, + networks: this.networks, + providers: this.providers, + relayerUrl, + fetch: this.fetch + }); + this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount); + this.signMessage = new SignMessageController(this.keystore, this.providers, this.networks, this.accounts, this.#externalSignerControllers); + const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch }); + this.dapps = new DappsController(this.#storage); + this.actions = new ActionsController({ + selectedAccount: this.selectedAccount, + windowManager, + notificationManager, + onActionWindowClose: () => { + const userRequestsToRejectOnWindowClose = this.userRequests.filter((r) => r.action.kind !== 'calls'); + userRequestsToRejectOnWindowClose.forEach((r) => r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())); + this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls'); + this.userRequestWaitingAccountSwitch = []; + this.emitUpdate(); + } + }); + this.selectedAccount.initControllers({ + portfolio: this.portfolio, + defiPositions: this.defiPositions, + actions: this.actions, + networks: this.networks, + providers: this.providers + }); + this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch }); + this.activity = new ActivityController(this.#storage, this.fetch, this.callRelayer, this.accounts, this.selectedAccount, this.providers, this.networks, async (network) => { + await this.setContractsDeployedToTrueIfDeployed(network); + }); + this.swapAndBridge = new SwapAndBridgeController({ + selectedAccount: this.selectedAccount, + networks: this.networks, + activity: this.activity, + invite: this.invite, + socketAPI, + storage: this.#storage, + actions: this.actions + }); + this.domains = new DomainsController(this.providers.providers); + this.#initialLoadPromise = this.#load(); + paymasterFactory.init(relayerUrl, fetch, (e) => { + if (!this.signAccountOp) + return; + this.emitError(e); + }); + } + /** + * - Updates the selected account's account state, portfolio and defi positions + * - Calls batchReverseLookup for all accounts + * + * It's not a problem to call it many times consecutively as all methods have internal + * caching mechanisms to prevent unnecessary calls. + */ + onLoad(isFirstLoad = false) { + const selectedAccountAddr = this.selectedAccount.account?.addr; + const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length; + this.defiPositions.updatePositions(); + this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr)); + if (!hasBroadcastedButNotConfirmed) { + this.updateSelectedAccountPortfolio(); + } + // The first time the app loads, we update the account state elsewhere + if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading) + this.accounts.updateAccountState(selectedAccountAddr); + } + async #load() { + this.isReady = false; + // #load is called in the constructor which is synchronous + // we await (1 ms/next tick) for the constructor to extend the EventEmitter class + // and then we call it's methods + await wait(1); + this.emitUpdate(); + await this.networks.initialLoadPromise; + await this.providers.initialLoadPromise; + await this.accounts.initialLoadPromise; + await this.selectedAccount.initialLoadPromise; + this.onLoad(true); + /** + * Listener that gets triggered as a finalization step of adding new + * accounts via the AccountAdder controller flow. + * + * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these + * changes are reflected for view-only accounts as well. Because the + * view-only accounts import flow bypasses the AccountAdder, this method + * won't click for them. Their on add success flow continues in the + * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case. + */ + const onAccountAdderSuccess = () => { + if (this.accountAdder.addAccountsStatus !== 'SUCCESS') + return; + return this.withStatus('onAccountAdderSuccess', async () => { + // Add accounts first, because some of the next steps have validation + // if accounts exists. + await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts); + // Then add keys, because some of the next steps could have validation + // if keys exists. Should be separate (not combined in Promise.all, + // since firing multiple keystore actions is not possible + // (the #wrapKeystoreAction listens for the first one to finish and + // skips the parallel one, if one is requested). + await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal); + await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external); + // Update the saved seed `hdPathTemplate` if accounts were added from + // the saved seed, so when user opts in to "Import a new Smart Account + // from the saved Seed Phrase" the next account is derived based + // on the latest `hdPathTemplate` chosen in the AccountAdder. + if (this.accountAdder.isInitializedWithSavedSeed) + this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate); + if (this.keystore.hasKeystoreTempSeed) + this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate); + }, true); + }; + this.accountAdder.onUpdate(onAccountAdderSuccess); + this.isReady = true; + this.emitUpdate(); + } + lock() { + this.keystore.lock(); + this.emailVault.cleanMagicAndSessionKeys(); + this.selectedAccount.setDashboardNetworkFilter(null); + } + async selectAccount(toAccountAddr) { + await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true); + } + async #selectAccount(toAccountAddr) { + await this.#initialLoadPromise; + if (!toAccountAddr) { + await this.selectedAccount.setAccount(null); + this.emitUpdate(); + return; + } + const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr); + if (!accountToSelect) { + console.error(`Account with address ${toAccountAddr} does not exist`); + return; + } + this.isOffline = false; + // call closeActionWindow while still on the currently selected account to allow proper + // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl... + if (this.actions?.currentAction?.type !== 'switchAccount') { + this.actions.closeActionWindow(); + } + this.selectedAccount.setAccount(accountToSelect); + this.swapAndBridge.onAccountChange(); + this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr]); + // forceEmitUpdate to update the getters in the FE state of the ctrl + await this.forceEmitUpdate(); + await this.actions.forceEmitUpdate(); + await this.addressBook.forceEmitUpdate(); + // Don't await these as they are not critical for the account selection + // and if the user decides to quickly change to another account withStatus + // will block the UI until these are resolved. + this.reloadSelectedAccount({ forceUpdate: false }); + this.emitUpdate(); + } + async importSmartAccountFromSavedSeed(seed) { + await this.withStatus('importSmartAccountFromSavedSeed', async () => { + if (this.accountAdder.isInitialized) + this.accountAdder.reset(); + if (seed && !this.keystore.hasKeystoreSavedSeed) { + await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE }); + } + const savedSeed = await this.keystore.getSavedSeed(); + if (!savedSeed) { + throw new EmittableError({ + message: 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.', + level: 'major', + error: new Error('failed to retrieve saved seed phrase from keystore') + }); + } + const keyIterator = new KeyIterator(savedSeed.seed); + await this.accountAdder.init({ + keyIterator, + hdPathTemplate: savedSeed.hdPathTemplate, + pageSize: 1, + shouldGetAccountsUsedOnNetworks: false, + shouldSearchForLinkedAccounts: false + }); + let currentPage = 1; + let isAccountAlreadyAdded; + let nextSmartAccount; + const findNextSmartAccount = async () => { + do { + // eslint-disable-next-line no-await-in-loop + await this.accountAdder.setPage({ page: currentPage }); + nextSmartAccount = this.accountAdder.accountsOnPage.find(({ isLinked, account }) => !isLinked && isSmartAccount(account))?.account; + if (!nextSmartAccount) + break; + isAccountAlreadyAdded = !!this.accounts.accounts.find( + // eslint-disable-next-line @typescript-eslint/no-loop-func + (a) => a.addr === nextSmartAccount.addr); + currentPage++; + } while (isAccountAlreadyAdded); + }; + await findNextSmartAccount(); + if (!nextSmartAccount) { + throw new EmittableError({ + message: 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.', + level: 'major', + error: new Error('Internal error: Failed to find a smart account to add') + }); + } + this.accountAdder.selectAccount(nextSmartAccount); + const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts(); + await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, { + internal: readyToAddKeys, + external: [] + }); + }, true); + } + initSignAccOp(actionId) { + const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue); + if (!accountOp) { + this.signAccOpInitError = + 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'; + return null; + } + const network = this.networks.networks.find((net) => net.id === accountOp.networkId); + if (!this.selectedAccount.account || + this.selectedAccount.account.addr !== accountOp.accountAddr) { + this.signAccOpInitError = + 'Attempting to initialize an accountOp for an account other than the currently selected one.'; + return null; + } + if (!network) { + this.signAccOpInitError = + 'We cannot initiate the signing process as we are unable to locate the specified network.'; + return null; + } + // on init, set the accountOp nonce to the latest one we know + // it could happen that the user inits a userRequest with an old + // accountState and therefore caching the old nonce in the accountOp. + // we make sure the latest nonce is set when initing signAccountOp + const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]; + if (state) + accountOp.nonce = state.nonce; + this.signAccOpInitError = null; + this.signAccountOp = new SignAccountOpController(this.accounts, this.keystore, this.portfolio, this.#externalSignerControllers, this.selectedAccount.account, network, actionId, accountOp, () => { + this.estimateSignAccountOp(); + }, () => { + return this.isSignRequestStillActive; + }); + this.emitUpdate(); + this.updateSignAccountOpGasPrice(); + this.estimateSignAccountOp(); + } + async handleSignAndBroadcastAccountOp() { + await this.withStatus('signAccountOp', async () => { + const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done; + if (wasAlreadySigned) + return Promise.resolve(); + if (!this.signAccountOp) { + const message = 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'; + const error = new Error('SignAccountOp is not initialized'); + this.emitError({ level: 'major', message, error }); + return Promise.reject(error); + } + // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown + this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => { + this.#signAccountOpSigningPromise = undefined; + }); + return this.#signAccountOpSigningPromise; + }, true); + // Error handling on the prev step will notify the user, it's fine to return here + if (this.signAccountOp?.status?.type !== SigningStatus.Done) + return; + return this.withStatus('broadcastSignedAccountOp', async () => { + // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown + this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => { + this.#signAccountOpBroadcastPromise = undefined; + }); + return this.#signAccountOpBroadcastPromise; + }, true); + } + destroySignAccOp() { + if (!this.signAccountOp) + return; + this.feePayerKey = null; + this.signAccountOp = null; + this.signAccOpInitError = null; + // NOTE: no need to update the portfolio here as an update is + // fired upon removeUserRequest + this.emitUpdate(); + } + async traceCall(estimation) { + const accountOp = this.signAccountOp?.accountOp; + if (!accountOp) + return; + const network = this.networks.networks.find((net) => net.id === accountOp?.networkId); + if (!network) + return; + try { + const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr); + const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]; + const provider = this.providers.providers[network.id]; + const gasPrice = this.gasPrices[network.id]; + const { tokens, nfts } = await debugTraceCall(account, accountOp, provider, state, estimation.gasUsed, gasPrice, !network.rpcNoStateOverride); + const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id); + const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id); + // update the portfolio only if new tokens were found through tracing + if (learnedNewTokens || learnedNewNfts) { + this.portfolio + .updateSelectedAccount(accountOp.accountAddr, network, getAccountOpsForSimulation(account, this.actions.visibleActionsQueue, network, accountOp), { forceUpdate: true }) + // fire an update request to refresh the warnings if any + .then(() => this.signAccountOp?.update({})); + } + } + catch (e) { + this.emitError({ + level: 'silent', + message: 'Error in main.traceCall', + error: e + }); + } + } + async handleSignMessage() { + const accountAddr = this.signMessage.messageToSign?.accountAddr; + const networkId = this.signMessage.messageToSign?.networkId; + // Could (rarely) happen if not even a single account state is fetched yet + const shouldForceUpdateAndWaitForAccountState = accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]; + if (shouldForceUpdateAndWaitForAccountState) + await this.accounts.updateAccountState(accountAddr, 'latest', [networkId]); + const isAccountStateStillMissing = !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]; + if (isAccountStateStillMissing) { + const message = 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'; + const error = new Error(`The account state of ${accountAddr} is missing for the network with id ${networkId}.`); + return this.emitError({ level: 'major', message, error }); + } + await this.signMessage.sign(); + const signedMessage = this.signMessage.signedMessage; + // Error handling on the prev step will notify the user, it's fine to return here + if (!signedMessage) + return; + if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { + const accountOpAction = makeSmartAccountOpAction({ + account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0], + networkId: signedMessage.networkId, + nonce: this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce, + userRequests: this.userRequests, + actionsQueue: this.actions.actionsQueue + }); + if (!accountOpAction.accountOp.meta) + accountOpAction.accountOp.meta = {}; + accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(signedMessage.signature); + this.actions.addOrUpdateAction(accountOpAction, 'first'); + } + await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr); + await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId); + await this.#notificationManager.create({ + title: 'Done!', + message: 'The Message was successfully signed.' + }); + } + async #handleAccountAdderInitLedger(LedgerKeyIterator // TODO: KeyIterator type mismatch + ) { + if (this.accountAdder.isInitialized) + this.accountAdder.reset(); + try { + const ledgerCtrl = this.#externalSignerControllers.ledger; + if (!ledgerCtrl) { + const message = 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'; + throw new EmittableError({ message, level: 'major', error: new Error(message) }); + } + // Once a session with the Ledger device gets initiated, the user might + // use the device with another app. In this scenario, when coming back to + // Ambire (the second time a connection gets requested onwards), + // the Ledger device throws with "invalid channel" error. + // To overcome this, always make sure to clean up before starting + // a new session when retrieving keys, in case there already is one. + if (ledgerCtrl.walletSDK) + await ledgerCtrl.cleanUp(); + const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE; + await ledgerCtrl.unlock(hdPathTemplate); + if (!ledgerCtrl.walletSDK) { + const message = 'Could not establish connection with the Ledger device'; + throw new EmittableError({ message, level: 'major', error: new Error(message) }); + } + const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl }); + await this.accountAdder.init({ keyIterator, hdPathTemplate }); + return await this.accountAdder.setPage({ page: 1 }); + } + catch (error) { + const message = error?.message || 'Could not unlock the Ledger device. Please try again.'; + throw new EmittableError({ message, level: 'major', error }); + } + } + async handleAccountAdderInitLedger(LedgerKeyIterator /* TODO: KeyIterator type mismatch */) { + await this.withStatus('handleAccountAdderInitLedger', async () => this.#handleAccountAdderInitLedger(LedgerKeyIterator)); + } + async #handleAccountAdderInitLattice(LatticeKeyIterator /* TODO: KeyIterator type mismatch */) { + if (this.accountAdder.isInitialized) + this.accountAdder.reset(); + try { + const latticeCtrl = this.#externalSignerControllers.lattice; + if (!latticeCtrl) { + const message = 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'; + throw new EmittableError({ message, level: 'major', error: new Error(message) }); + } + const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE; + await latticeCtrl.unlock(hdPathTemplate, undefined, true); + const { walletSDK } = latticeCtrl; + await this.accountAdder.init({ + keyIterator: new LatticeKeyIterator({ walletSDK }), + hdPathTemplate + }); + return await this.accountAdder.setPage({ page: 1 }); + } + catch (error) { + const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'; + throw new EmittableError({ message, level: 'major', error }); + } + } + async handleAccountAdderInitLattice(LatticeKeyIterator /* TODO: KeyIterator type mismatch */) { + await this.withStatus('handleAccountAdderInitLattice', async () => this.#handleAccountAdderInitLattice(LatticeKeyIterator)); + } + async updateAccountsOpsStatuses() { + await this.#initialLoadPromise; + const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } = await this.activity.updateAccountsOpsStatuses(); + if (shouldEmitUpdate) { + this.emitUpdate(); + if (shouldUpdatePortfolio) { + this.updateSelectedAccountPortfolio(true); + } + } + updatedAccountsOps.forEach((op) => { + this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op); + }); + return { newestOpTimestamp }; + } + // call this function after a call to the singleton has been made + // it will check if the factory has been deployed and update the network settings if it has been + async setContractsDeployedToTrueIfDeployed(network) { + await this.#initialLoadPromise; + if (network.areContractsDeployed) + return; + const provider = this.providers.providers[network.id]; + if (!provider) + return; + const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY); + if (factoryCode === '0x') + return; + await this.networks.updateNetwork({ areContractsDeployed: true }, network.id); + } + #removeAccountKeyData(address) { + // Compute account keys that are only associated with this account + const accountAssociatedKeys = this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []; + const keysInKeystore = this.keystore.keys; + const importedAccountKeys = keysInKeystore.filter((key) => accountAssociatedKeys.includes(key.addr)); + const solelyAccountKeys = importedAccountKeys.filter((key) => { + const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some((acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)); + return !isKeyAssociatedWithOtherAccounts; + }); + // Remove account keys from the keystore + solelyAccountKeys.forEach((key) => { + this.keystore.removeKey(key.addr, key.type).catch((e) => { + throw new EmittableError({ + level: 'major', + message: 'Failed to remove account key', + error: e + }); + }); + }); + } + async removeAccount(address) { + await this.withStatus('removeAccount', async () => { + try { + this.#removeAccountKeyData(address); + // Remove account data from sub-controllers + await this.accounts.removeAccountData(address); + this.portfolio.removeAccountData(address); + await this.activity.removeAccountData(address); + this.actions.removeAccountData(address); + this.signMessage.removeAccountData(address); + this.defiPositions.removeAccountData(address); + if (this.selectedAccount.account?.addr === address) { + await this.#selectAccount(this.accounts.accounts[0]?.addr); + } + if (this.signAccountOp?.account.addr === address) { + this.destroySignAccOp(); + } + this.emitUpdate(); + } + catch (e) { + throw new EmittableError({ + level: 'major', + message: 'Failed to remove account', + error: e || new Error('Failed to remove account') + }); + } + }); + } + async #ensureAccountInfo(accountAddr, networkId) { + await this.#initialLoadPromise; + // Initial sanity check: does this account even exist? + if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) { + this.signAccOpInitError = `Account ${accountAddr} does not exist`; + return; + } + // If this still didn't work, re-load + if (!this.accounts.accountStates[accountAddr]?.[networkId]) + await this.accounts.updateAccountState(accountAddr, 'pending', [networkId]); + // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network + if (!this.accounts.accountStates[accountAddr]?.[networkId]) + this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`; + } + #batchCallsFromUserRequests(accountAddr, networkId) { + // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind + return this.userRequests.filter((r) => r.action.kind === 'calls').reduce((uCalls, req) => { + if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) { + const { calls } = req.action; + calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id })); + } + return uCalls; + }, []); + } + async reloadSelectedAccount(options = { + forceUpdate: true, + networkId: undefined + }) { + const { forceUpdate, networkId } = options; + const networkToUpdate = networkId + ? this.networks.networks.find((n) => n.id === networkId) + : undefined; + if (!this.selectedAccount.account) + return; + this.selectedAccount.resetSelectedAccountPortfolio(); + await Promise.all([ + // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon), + // it's very likely that the account state is already in the process of being updated. + // If we try to run the same action, `withStatus` validation will throw an error. + // So, we perform this safety check to prevent the error. + // However, even if we don't trigger an update here, it's not a big problem, + // as the account state will be updated anyway, and its update will be very recent. + !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr + ? this.accounts.updateAccountState(this.selectedAccount.account.addr, 'pending', networkId ? [networkId] : undefined) + : Promise.resolve(), + // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally, + // as the PortfolioController already exposes flags that are highly sufficient for the UX. + // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard), + // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper. + this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate), + this.defiPositions.updatePositions(networkId) + ]); + } + #updateIsOffline() { + const oldIsOffline = this.isOffline; + const accountAddr = this.selectedAccount.account?.addr; + if (!accountAddr) + return; + // We have to make calculations based on the state of the portfolio + // and not the selected account portfolio the flag isOffline + // and the errors of the selected account portfolio should + // come in the same tick. Otherwise the UI may flash the wrong error. + const latestState = this.portfolio.getLatestPortfolioState(accountAddr); + const latestStateKeys = Object.keys(latestState); + const isAllReady = latestStateKeys.every((networkId) => { + return isNetworkReady(latestState[networkId]); + }); + if (!isAllReady) + return; + const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => { + const state = latestState[networkId]; + return !!state?.criticalError; + }); + const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => { + const provider = this.providers.providers[networkId]; + const isWorking = provider.isWorking; + return typeof isWorking === 'boolean' && !isWorking; + }); + // Update isOffline if either all portfolio networks have errors or we've failed to fetch + // the account state for every account. This is because either update may fail first. + this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors; + if (oldIsOffline !== this.isOffline) { + this.emitUpdate(); + } + } + // eslint-disable-next-line default-param-last + async updateSelectedAccountPortfolio(forceUpdate = false, network) { + await this.#initialLoadPromise; + if (!this.selectedAccount.account) + return; + const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId; + const networkData = network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId); + const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(this.selectedAccount.account, this.actions.visibleActionsQueue, networkData, this.signAccountOp?.accountOp); + await this.portfolio.updateSelectedAccount(this.selectedAccount.account.addr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate }); + this.#updateIsOffline(); + } + #getUserRequestAccountError(dappOrigin, fromAccountAddr) { + if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) { + const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr); + if (isAddressInAccounts) + return null; + return 'The dApp is trying to sign using an address that is not imported in the extension.'; + } + const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr; + if (isAddressSelected) + return null; + return 'The dApp is trying to sign using an address that is not selected in the extension.'; + } + async buildUserRequestFromDAppRequest(request, dappPromise) { + await this.#initialLoadPromise; + let userRequest = null; + let actionPosition = 'last'; + const kind = dappRequestMethodToActionKind(request.method); + const dapp = this.dapps.getDapp(request.origin); + if (kind === 'calls') { + if (!this.selectedAccount.account) + throw ethErrors.rpc.internal(); + const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); + if (!network) { + throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + } + const isWalletSendCalls = !!request.params[0].calls; + const accountAddr = getAddress(request.params[0].from); + const calls = isWalletSendCalls + ? request.params[0].calls + : [request.params[0]]; + const paymasterService = isWalletSendCalls + ? getPaymasterService(network.chainId, request.params[0].capabilities) + : null; + userRequest = { + id: new Date().getTime(), + action: { + kind, + calls: calls.map((call) => ({ + to: call.to, + data: call.data || '0x', + value: call.value ? getBigInt(call.value) : 0n + })) + }, + meta: { + isSignAction: true, + isWalletSendCalls, + accountAddr, + networkId: network.id, + paymasterService + }, + dappPromise + }; + if (!this.selectedAccount.account.creation) { + const otherUserRequestFromSameDapp = this.userRequests.find((r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin); + if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) { + actionPosition = 'first'; + } + } + } + else if (kind === 'message') { + if (!this.selectedAccount.account) + throw ethErrors.rpc.internal(); + const msg = request.params; + if (!msg) { + throw ethErrors.rpc.invalidRequest('No msg request to sign'); + } + const msgAddress = getAddress(msg?.[1]); + const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); + if (!network) { + throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + } + userRequest = { + id: new Date().getTime(), + action: { + kind: 'message', + message: msg[0] + }, + session: request.session, + meta: { + isSignAction: true, + accountAddr: msgAddress, + networkId: network.id + }, + dappPromise + }; + } + else if (kind === 'typedMessage') { + if (!this.selectedAccount.account) + throw ethErrors.rpc.internal(); + const msg = request.params; + if (!msg) { + throw ethErrors.rpc.invalidRequest('No msg request to sign'); + } + const msgAddress = getAddress(msg?.[0]); + const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); + if (!network) { + throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + } + let typedData = msg?.[1]; + try { + typedData = parse(typedData); + } + catch (error) { + throw ethErrors.rpc.invalidRequest('Invalid typedData provided'); + } + if (!typedData?.types || + !typedData?.domain || + !typedData?.message || + !typedData?.primaryType) { + throw ethErrors.rpc.methodNotSupported('Invalid typedData format - only typedData v4 is supported'); + } + if (msgAddress === this.selectedAccount.account.addr && + (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)) { + throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed'); + } + userRequest = { + id: new Date().getTime(), + action: { + kind: 'typedMessage', + types: typedData.types, + domain: typedData.domain, + message: typedData.message, + primaryType: typedData.primaryType + }, + session: request.session, + meta: { + isSignAction: true, + accountAddr: msgAddress, + networkId: network.id + }, + dappPromise + }; + } + else { + userRequest = { + id: new Date().getTime(), + session: request.session, + action: { kind, params: request.params }, + meta: { isSignAction: false }, + dappPromise + }; + } + if (userRequest.action.kind !== 'calls') { + const otherUserRequestFromSameDapp = this.userRequests.find((r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin); + if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) { + actionPosition = 'first'; + } + } + if (!userRequest) + return; + const isASignOperationRequestedForAnotherAccount = userRequest.meta.isSignAction && + userRequest.meta.accountAddr !== this.selectedAccount.account?.addr; + // We can simply add the user request if it's not a sign operation + // for another account + if (!isASignOperationRequestedForAnotherAccount) { + await this.addUserRequest(userRequest, actionPosition, actionPosition === 'first' || isSmartAccount(this.selectedAccount.account) + ? 'open-action-window' + : 'queue-but-open-action-window'); + return; + } + const accountError = this.#getUserRequestAccountError(dappPromise.session.origin, userRequest.meta.accountAddr); + if (accountError) { + dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError)); + return; + } + const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); + if (!network) { + throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + } + this.userRequestWaitingAccountSwitch.push(userRequest); + await this.addUserRequest(buildSwitchAccountUserRequest({ + nextUserRequest: userRequest, + networkId: network.id, + selectedAccountAddr: userRequest.meta.accountAddr, + session: dappPromise.session, + dappPromise + }), 'last', 'open-action-window'); + } + async buildTransferUserRequest(amount, recipientAddress, selectedToken, actionExecutionType = 'open-action-window') { + await this.#initialLoadPromise; + if (!this.selectedAccount.account) + return; + const userRequest = buildTransferUserRequest({ + selectedAccount: this.selectedAccount.account.addr, + amount, + selectedToken, + recipientAddress + }); + if (!userRequest) { + this.emitError({ + level: 'major', + message: 'Unexpected error while building transfer request', + error: new Error('buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest') + }); + return; + } + await this.addUserRequest(userRequest, 'last', actionExecutionType); + } + async buildSwapAndBridgeUserRequest(activeRouteId) { + await this.withStatus('buildSwapAndBridgeUserRequest', async () => { + if (!this.selectedAccount.account) + return; + let transaction = null; + const activeRoute = this.swapAndBridge.activeRoutes.find((r) => r.activeRouteId === activeRouteId); + if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) { + transaction = await this.swapAndBridge.getRouteStartUserTx(); + } + if (activeRoute) { + this.removeUserRequest(activeRoute.activeRouteId, { + shouldRemoveSwapAndBridgeRoute: false, + shouldOpenNextRequest: false + }); + this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined }); + if (!isSmartAccount(this.selectedAccount.account)) { + this.removeUserRequest(`${activeRouteId}-revoke-approval`, { + shouldRemoveSwapAndBridgeRoute: false, + shouldOpenNextRequest: false + }); + this.removeUserRequest(`${activeRouteId}-approval`, { + shouldRemoveSwapAndBridgeRoute: false, + shouldOpenNextRequest: false + }); + } + transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId); + } + if (!this.selectedAccount.account || !transaction) { + const errorDetails = `missing ${this.selectedAccount.account ? 'selected account' : 'transaction'} info`; + const error = new SwapAndBridgeError(`Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`); + throw new EmittableError({ message: error.message, level: 'major', error }); + } + const network = this.networks.networks.find((n) => Number(n.chainId) === transaction.chainId); + // TODO: Consider refining the error handling in here, because this + // swallows errors and doesn't provide any feedback to the user. + const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(transaction, network.id, this.selectedAccount.account, this.providers.providers[network.id]); + for (let i = 0; i < swapAndBridgeUserRequests.length; i++) { + if (i === 0) { + this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window'); + } + else { + // eslint-disable-next-line no-await-in-loop + await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue'); + } + } + if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) { + await this.swapAndBridge.addActiveRoute({ + activeRouteId: transaction.activeRouteId, + userTxIndex: transaction.userTxIndex + }); + } + if (activeRouteId) { + this.swapAndBridge.updateActiveRoute(activeRouteId, { + userTxIndex: transaction.userTxIndex, + userTxHash: null + }, true); + } + }, true); + } + buildClaimWalletUserRequest(token) { + if (!this.selectedAccount.account) + return; + const claimableRewardsData = this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData; + if (!claimableRewardsData) + return; + const userRequest = buildClaimWalletRequest({ + selectedAccount: this.selectedAccount.account.addr, + selectedToken: token, + claimableRewardsData + }); + this.addUserRequest(userRequest); + } + buildMintVestingUserRequest(token) { + if (!this.selectedAccount.account) + return; + const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData; + if (!addrVestingData) + return; + const userRequest = buildMintVestingRequest({ + selectedAccount: this.selectedAccount.account.addr, + selectedToken: token, + addrVestingData + }); + this.addUserRequest(userRequest); + } + resolveUserRequest(data, requestId) { + const userRequest = this.userRequests.find((r) => r.id === requestId); + if (!userRequest) + return; // TODO: emit error + userRequest.dappPromise?.resolve(data); + // These requests are transitionary initiated internally (not dApp requests) that block dApp requests + // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives + if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) { + setTimeout(() => { + this.removeUserRequest(requestId); + this.emitUpdate(); + }, 300); + } + else { + this.removeUserRequest(requestId); + this.emitUpdate(); + } + } + rejectUserRequest(err, requestId) { + const userRequest = this.userRequests.find((r) => r.id === requestId); + if (!userRequest) + return; + if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { + this.userRequests = this.userRequests.filter((r) => !(r.action.kind === 'calls' && + r.meta.accountAddr === userRequest.meta.accountAddr && + r.meta.networkId === userRequest.meta.networkId)); + } + // if the userRequest that is about to be removed is an approval request + // find and remove the associated pending transaction request if there is any + // this is valid scenario for a swap & bridge txs with a BA + if (userRequest.action.kind === 'calls') { + const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr); + if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) { + this.removeUserRequest(userRequest.meta.activeRouteId); + this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`); + this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`); + } + } + userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err)); + this.removeUserRequest(requestId); + } + rejectSignAccountOpCall(callId) { + if (!this.signAccountOp) + return; + const { calls, networkId, accountAddr } = this.signAccountOp.accountOp; + const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId; + if (requestId) { + const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId); + const userRequest = this.userRequests[userRequestIndex]; + if (userRequest.action.kind === 'calls') { + ; + userRequest.action.calls = userRequest.action.calls.filter((c) => c.id !== callId); + if (userRequest.action.calls.length === 0) { + // the reject will remove the userRequest which will rebuild the action and update the signAccountOp + this.rejectUserRequest('User rejected the transaction request.', userRequest.id); + } + else { + const accountOpAction = makeSmartAccountOpAction({ + account: this.accounts.accounts.find((a) => a.addr === accountAddr), + networkId, + nonce: this.accounts.accountStates[accountAddr][networkId].nonce, + userRequests: this.userRequests, + actionsQueue: this.actions.actionsQueue + }); + this.actions.addOrUpdateAction(accountOpAction); + this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls }); + this.estimateSignAccountOp(); + } + } + } + else { + this.emitError({ + message: 'Reject call: the call was not found or was not linked to a user request', + level: 'major', + error: new Error(`Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`) + }); + } + } + removeActiveRoute(activeRouteId) { + const userRequest = this.userRequests.find((r) => [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(r.id)); + if (userRequest) { + this.rejectUserRequest('User rejected the transaction request.', userRequest.id); + } + else { + this.swapAndBridge.removeActiveRoute(activeRouteId); + } + } + async addUserRequest(req, actionPosition = 'last', actionExecutionType = 'open-action-window') { + if (req.action.kind === 'calls') { + ; + req.action.calls.forEach((_, i) => { + ; + req.action.calls[i].id = `${req.id}-${i}`; + }); + } + if (actionPosition === 'first') { + this.userRequests.unshift(req); + } + else { + this.userRequests.push(req); + } + const { id, action, meta } = req; + if (action.kind === 'calls') { + // @TODO + // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching + // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network, + // and be recalculated when one gets dismissed + // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise; + // 4) manage recalc on removeUserRequest too in order to handle EOAs + // @TODO consider re-using this whole block in removeUserRequest + await this.#ensureAccountInfo(meta.accountAddr, meta.networkId); + if (this.signAccOpInitError) { + return req.dappPromise?.reject(ethErrors.provider.custom({ + code: 1001, + message: this.signAccOpInitError + })); + } + if (this.#signAccountOpSigningPromise) + await this.#signAccountOpSigningPromise; + if (this.#signAccountOpBroadcastPromise) + await this.#signAccountOpBroadcastPromise; + const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr); + const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]; + if (isSmartAccount(account)) { + const network = this.networks.networks.find((n) => n.id === meta.networkId); + // find me the accountOp for the network if any, it's always 1 for SA + const currentAccountOpAction = this.actions.actionsQueue.find((a) => a.type === 'accountOp' && + a.accountOp.accountAddr === account.addr && + a.accountOp.networkId === network.id); + const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(account.addr, (message) => message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID && + message.networkId === network.id); + const hasAuthorized = !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization || + !!entryPointAuthorizationMessageFromHistory; + if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) { + await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType); + this.emitUpdate(); + return; + } + const accountOpAction = makeSmartAccountOpAction({ + account, + networkId: meta.networkId, + nonce: accountState.nonce, + userRequests: this.userRequests, + actionsQueue: this.actions.actionsQueue, + entryPointAuthorizationSignature: entryPointAuthorizationMessageFromHistory?.signature ?? undefined + }); + this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType); + if (this.signAccountOp) { + if (this.signAccountOp.fromActionId === accountOpAction.id) { + this.signAccountOp.update({ calls: accountOpAction.accountOp.calls }); + this.estimateSignAccountOp(); + } + } + else { + // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation. + // It's necessary to continue operating with the token `amountPostSimulation` amount. + this.updateSelectedAccountPortfolio(true, network); + } + } + else { + const accountOpAction = makeBasicAccountOpAction({ + account, + networkId: meta.networkId, + nonce: accountState.nonce, + userRequest: req + }); + this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType); + } + } + else { + let actionType = 'dappRequest'; + if (req.action.kind === 'typedMessage' || req.action.kind === 'message') { + actionType = 'signMessage'; + if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) { + const msgReq = this.userRequests.find((uReq) => uReq.id === id); + if (!msgReq) + return; + msgReq.dappPromise?.reject(ethErrors.provider.custom({ + code: 1001, + message: 'Rejected: Please complete your pending message request before initiating a new one.' + })); + this.userRequests.splice(this.userRequests.indexOf(msgReq), 1); + return; + } + } + if (req.action.kind === 'benzin') + actionType = 'benzin'; + if (req.action.kind === 'switchAccount') + actionType = 'switchAccount'; + this.actions.addOrUpdateAction({ + id, + type: actionType, + userRequest: req + }, actionPosition, actionExecutionType); + } + this.emitUpdate(); + } + // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations + // first one sounds more reasonable + // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue) + removeUserRequest(id, options = { + shouldRemoveSwapAndBridgeRoute: true, + shouldUpdateAccount: true, + shouldOpenNextRequest: true + }) { + const req = this.userRequests.find((uReq) => uReq.id === id); + if (!req) + return; + // remove from the request queue + this.userRequests.splice(this.userRequests.indexOf(req), 1); + // update the pending stuff to be signed + const { action, meta } = req; + if (action.kind === 'calls') { + const network = this.networks.networks.find((net) => net.id === meta.networkId); + const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr); + if (!account) + throw new Error(`batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`); + if (isSmartAccount(account)) { + const accountOpIndex = this.actions.actionsQueue.findIndex((a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`); + const accountOpAction = this.actions.actionsQueue[accountOpIndex]; + // accountOp has just been rejected or broadcasted + if (!accountOpAction) { + if (options.shouldUpdateAccount) + this.updateSelectedAccountPortfolio(true, network); + if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) { + this.swapAndBridge.removeActiveRoute(meta.activeRouteId); + } + this.emitUpdate(); + return; + } + accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(meta.accountAddr, meta.networkId); + if (accountOpAction.accountOp.calls.length) { + this.actions.addOrUpdateAction(accountOpAction); + if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) { + this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null }); + this.estimateSignAccountOp(); + } + } + else { + if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) { + this.destroySignAccOp(); + } + this.actions.removeAction(`${meta.accountAddr}-${meta.networkId}`, options.shouldOpenNextRequest); + if (options.shouldUpdateAccount) + this.updateSelectedAccountPortfolio(true, network); + } + } + else { + if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) { + this.destroySignAccOp(); + } + this.actions.removeAction(id, options.shouldOpenNextRequest); + if (options.shouldUpdateAccount) + this.updateSelectedAccountPortfolio(true, network); + } + if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) { + this.swapAndBridge.removeActiveRoute(meta.activeRouteId); + } + } + else if (id === ACCOUNT_SWITCH_USER_REQUEST) { + const requestsToAdd = this.userRequestWaitingAccountSwitch.filter((r) => r.meta.accountAddr === this.selectedAccount.account.addr); + this.actions.removeAction(id, this.selectedAccount.account?.addr !== action.params.switchToAccountAddr); + (async () => { + // eslint-disable-next-line no-restricted-syntax + for (const r of requestsToAdd) { + this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1); + // eslint-disable-next-line no-await-in-loop + await this.addUserRequest(r); + } + })(); + } + else { + this.actions.removeAction(id, options.shouldOpenNextRequest); + } + this.emitUpdate(); + } + async addEntryPointAuthorization(req, network, accountState, actionExecutionType = 'open-action-window') { + if (this.actions.visibleActionsQueue.find((a) => a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID && + a.userRequest.meta.networkId === req.meta.networkId)) { + this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + return; + } + const typedMessageAction = await getEntryPointAuthorization(req.meta.accountAddr, network.chainId, BigInt(accountState.nonce)); + await this.addUserRequest({ + id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID, + action: typedMessageAction, + meta: { + isSignAction: true, + accountAddr: req.meta.accountAddr, + networkId: req.meta.networkId + }, + session: req.session, + dappPromise: req?.dappPromise + ? { reject: req?.dappPromise?.reject, resolve: () => { } } + : undefined + }, 'first', actionExecutionType); + } + async addNetwork(network) { + await this.networks.addNetwork(network); + await this.updateSelectedAccountPortfolio(); + } + async removeNetwork(id) { + await this.networks.removeNetwork(id); + this.portfolio.removeNetworkData(id); + this.defiPositions.removeNetworkData(id); + this.accountAdder.removeNetworkData(id); + } + async resolveAccountOpAction(data, actionId) { + const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId); + if (!accountOpAction) + return; + const { accountOp } = accountOpAction; + const network = this.networks.networks.find((n) => n.id === accountOp.networkId); + if (!network) + return; + const meta = { + isSignAction: true, + accountAddr: accountOp.accountAddr, + chainId: network.chainId, + networkId: '', + txnId: null, + userOpHash: null + }; + if (data.submittedAccountOp) { + // can be undefined, check submittedAccountOp.ts + meta.txnId = data.submittedAccountOp.txnId; + meta.identifiedBy = data.submittedAccountOp.identifiedBy; + meta.submittedAccountOp = data.submittedAccountOp; + } + const benzinUserRequest = { + id: new Date().getTime(), + action: { kind: 'benzin' }, + meta + }; + await this.addUserRequest(benzinUserRequest, 'first'); + this.actions.removeAction(actionId); + // handle wallet_sendCalls before pollTxnId as 1) it's faster + // 2) the identifier is different + // eslint-disable-next-line no-restricted-syntax + for (const call of accountOp.calls) { + const walletSendCallsUserReq = this.userRequests.find((r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls); + if (walletSendCallsUserReq) { + walletSendCallsUserReq.dappPromise?.resolve({ + hash: getDappIdentifier(data.submittedAccountOp) + }); + // eslint-disable-next-line no-await-in-loop + this.removeUserRequest(walletSendCallsUserReq.id, { + shouldRemoveSwapAndBridgeRoute: false, + // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction, + // we don't want to update the account portfolio immediately, as we would lose the simulation. + // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()). + // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio, + // the account will be updated automatically. + shouldUpdateAccount: false + }); + } + } + // Note: this may take a while! + const txnId = await pollTxnId(data.submittedAccountOp.identifiedBy, network, this.fetch, this.callRelayer); + // eslint-disable-next-line no-restricted-syntax + for (const call of accountOp.calls) { + const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId); + if (uReq) { + if (txnId) { + uReq.dappPromise?.resolve({ hash: txnId }); + } + else { + uReq.dappPromise?.reject(ethErrors.rpc.transactionRejected({ + message: 'Transaction rejected by the bundler' + })); + } + // eslint-disable-next-line no-await-in-loop + this.removeUserRequest(uReq.id, { + shouldRemoveSwapAndBridgeRoute: false, + // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction, + // we don't want to update the account portfolio immediately, as we would lose the simulation. + // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()). + // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio, + // the account will be updated automatically. + shouldUpdateAccount: false + }); + } + } + this.emitUpdate(); + } + rejectAccountOpAction(err, actionId, shouldOpenNextAction) { + const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId); + if (!accountOpAction) + return; + const { accountOp, id } = accountOpAction; + if (this.signAccountOp && this.signAccountOp.fromActionId === id) { + this.destroySignAccOp(); + } + this.actions.removeAction(actionId, shouldOpenNextAction); + // eslint-disable-next-line no-restricted-syntax + for (const call of accountOp.calls) { + if (call.fromUserRequestId) + this.rejectUserRequest(err, call.fromUserRequestId); + } + this.emitUpdate(); + } + async #updateGasPrice() { + await this.#initialLoadPromise; + // if there's no signAccountOp initialized, we don't want to fetch gas + const accOp = this.signAccountOp?.accountOp ?? null; + if (!accOp) + return undefined; + const network = this.networks.networks.find((net) => net.id === accOp.networkId); + if (!network) + return undefined; // shouldn't happen + const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr); + if (!account) + return undefined; // shouldn't happen + const is4337 = isErc4337Broadcast(account, network, this.accounts.accountStates[accOp.accountAddr][accOp.networkId]); + const bundler = this.signAccountOp + ? this.signAccountOp.bundlerSwitcher.getBundler() + : getDefaultBundler(network); + const bundlerFetch = async () => { + if (!is4337) + return null; + const errorCallback = (e) => { + if (!this.signAccountOp) + return; + this.emitError(e); + }; + return bundler.fetchGasPrices(network, errorCallback).catch((e) => { + this.emitError({ + level: 'silent', + message: "Failed to fetch the bundler's gas price", + error: e + }); + }); + }; + const [gasPriceData, bundlerGas] = await Promise.all([ + getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => { + this.emitError({ + level: 'major', + message: `Unable to get gas price for ${network.id}`, + error: new Error(`Failed to fetch gas price: ${e?.message}`) + }); + return null; + }), + bundlerFetch() + ]); + if (gasPriceData && gasPriceData.gasPrice) + this.gasPrices[network.id] = gasPriceData.gasPrice; + if (bundlerGas) + this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }; + return { + blockGasLimit: gasPriceData?.blockGasLimit + }; + } + async updateSignAccountOpGasPrice() { + if (!this.signAccountOp) + return; + const accOp = this.signAccountOp.accountOp; + const gasData = await this.#updateGasPrice(); + // there's a chance signAccountOp gets destroyed between the time + // the first "if (!this.signAccountOp) return" is performed and + // the time we get here. To prevent issues, we check one more time + if (!this.signAccountOp) + return; + this.signAccountOp.update({ + gasPrices: this.gasPrices[accOp.networkId], + bundlerGasPrices: this.bundlerGasPrices[accOp.networkId], + blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined + }); + this.emitUpdate(); + } + // @TODO: protect this from race conditions/simultanous executions + async estimateSignAccountOp() { + try { + if (!this.signAccountOp) + return; + // make a local copy to avoid updating the main reference + const localAccountOp = { ...this.signAccountOp.accountOp }; + await this.#initialLoadPromise; + // new accountOps should have spoof signatures so that they can be easily simulated + // this is not used by the Estimator, because it iterates through all associatedKeys and + // it knows which ones are authenticated, and it can generate it's own spoofSig + // @TODO + // accountOp.signature = `${}03` + // TODO check if needed data in accountStates are available + // this.accountStates[accountOp.accountAddr][accountOp.networkId]. + const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr); + // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment. + // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee. + // + // If the current account is an EOA, only this account can pay the fee, + // and there's no need for checking other EOA accounts native balances. + // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here. + // + // we're excluding the view only accounts from the natives to check + // in all cases EXCEPT the case where we're making an estimation for + // the view only account itself. In all other, view only accounts options + // should not be present as the user cannot pay the fee with them (no key) + const nativeToCheck = account?.creation + ? this.accounts.accounts + .filter((acc) => !isSmartAccount(acc) && + (acc.addr === localAccountOp.accountAddr || + !getIsViewOnly(this.keystore.keys, acc.associatedKeys))) + .map((acc) => acc.addr) + : []; + if (!account) + throw new Error(`estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`); + const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId); + if (!network) + throw new Error(`estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`); + // Take the fee tokens from two places: the user's tokens and his gasTank + // The gasTank tokens participate on each network as they belong everywhere + // NOTE: at some point we should check all the "?" signs below and if + // an error pops out, we should notify the user about it + const networkFeeTokens = this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[localAccountOp.networkId]?.result?.feeTokens ?? []; + const gasTankFeeTokens = this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result + ?.tokens ?? []; + const feeTokens = [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []; + // can be read from the UI + const humanization = humanizeAccountOp(localAccountOp, {}); + humanization.forEach((call) => { + if (!call.fullVisualization) + return; + call.fullVisualization.forEach(async (visualization) => { + if (visualization.type !== 'address' || !visualization.address) + return; + await this.domains.reverseLookup(visualization.address); + }); + }); + const additionalHints = humanization + .map((call) => !call.fullVisualization + ? [] + : call.fullVisualization.map((vis) => vis.address && isAddress(vis.address) ? getAddress(vis.address) : '')) + .flat() + .filter((x) => isAddress(x)); + this.portfolio.addTokensToBeLearned(additionalHints, network.id); + const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(account, this.actions.visibleActionsQueue, network, this.signAccountOp.accountOp); + const [, estimation] = await Promise.all([ + // NOTE: we are not emitting an update here because the portfolio controller will do that + // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as + // it may have different needs + this.portfolio.updateSelectedAccount(localAccountOp.accountAddr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate: true }), + estimate(this.providers.providers[localAccountOp.networkId], network, account, localAccountOp, this.accounts.accountStates, nativeToCheck, + // @TODO - first time calling this, portfolio is still not loaded. + feeTokens, (e) => { + if (!this.signAccountOp) + return; + this.emitError(e); + }, this.signAccountOp.bundlerSwitcher, { + is4337Broadcast: isErc4337Broadcast(account, network, this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]) + }).catch((e) => { + const { message } = getHumanReadableEstimationError(e); + this.emitError({ + level: 'major', + message, + error: e + }); + return null; + }) + ]); + // @race + // if the signAccountOp has been deleted, don't continue as the request has already finished + if (!this.signAccountOp) + return; + if (estimation) { + const currentNonceAhead = BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n); + // if the nonce from the estimation is bigger than the one in localAccountOp, + // override the accountState and accountOp with the newly detected nonce + if (currentNonceAhead) { + localAccountOp.nonce = BigInt(estimation.currentAccountNonce); + this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce); + if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]) + this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId].nonce = localAccountOp.nonce; + } + const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'; + const lastTxn = this.activity.getLastTxn(localAccountOp.networkId); + const SAHasOldNonceOnARelayerNetwork = isSmartAccount(account) && + !network.erc4337.enabled && + lastTxn && + localAccountOp.nonce === lastTxn.nonce && + lastTxn.success && + lastTxn.status === AccountOpStatus.Success; + if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) { + this.accounts + .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId]) + .then(() => this.estimateSignAccountOp()) + .catch((error) => this.emitError({ + level: 'major', + message: 'Failed to refetch the account state. Please try again to initialize your transaction', + error + })); + return; + } + } + if (estimation && + estimation.nonFatalErrors && + estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') && + this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]) { + this.accounts + .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId]) + .then(() => this.estimateSignAccountOp()) + .catch((error) => this.emitError({ + level: 'major', + message: 'Failed to refetch the account state. Please try again to initialize your transaction', + error + })); + // returning here means estimation will not be set => better UX as + // the user will not see the warning but instead + // just wait for the new estimation + return; + } + // check if an RBF should be applied for the incoming transaction + // for SA conditions are: take the last broadcast but not confirmed accOp + // and check if the nonce is the same as the current nonce (non 4337 txns) + // for EOA: check the last broadcast but not confirmed txn across SA + // as the EOA could've broadcast a txn there + it's own history and + // compare the highest found nonce + const rbfAccountOps = {}; + nativeToCheck.push(localAccountOp.accountAddr); + nativeToCheck.forEach((accId) => { + const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId); + // the accountState of the nativeToCheck may no be initialized + const currentNonce = this.accounts.accountStates && + this.accounts.accountStates[accId] && + this.accounts.accountStates[accId][localAccountOp.networkId] + ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce + : null; + rbfAccountOps[accId] = + notConfirmedOp && + !notConfirmedOp.gasFeePayment?.isERC4337 && + currentNonce && + currentNonce === notConfirmedOp.nonce + ? notConfirmedOp + : null; + }); + // if there's an estimation error, override the pending results + if (estimation && estimation.error) { + this.portfolio.overridePendingResults(localAccountOp); + } + // update the signAccountOp controller once estimation finishes; + // this eliminates the infinite loading bug if the estimation comes slower + if (this.signAccountOp && estimation) { + this.signAccountOp.update({ estimation, rbfAccountOps }); + } + } + catch (error) { + this.signAccountOp?.calculateWarnings(); + this.emitError({ + level: 'silent', + message: 'Estimation error', + error + }); + } + } + /** + * There are 4 ways to broadcast an AccountOp: + * 1. For basic accounts (EOA), there is only one way to do that. After + * signing the transaction, the serialized signed transaction object gets + * send to the network. + * 2. For smart accounts, when EOA pays the fee. Two signatures are needed + * for this. The first one is the signature of the AccountOp itself. The + * second one is the signature of the transaction that will be executed + * by the smart account. + * 3. For smart accounts that broadcast the ERC-4337 way. + * 4. for smart accounts, when the Relayer does the broadcast. + * + */ + async #broadcastSignedAccountOp() { + const accountOp = this.signAccountOp?.accountOp; + const estimation = this.signAccountOp?.estimation; + const actionId = this.signAccountOp?.fromActionId; + const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher; + const contactSupportPrompt = 'Please try again or contact support if the problem persists.'; + if (!accountOp || + !estimation || + !actionId || + !accountOp.signingKeyAddr || + !accountOp.signingKeyType || + !accountOp.signature || + !bundlerSwitcher) { + const message = `Missing mandatory transaction details. ${contactSupportPrompt}`; + return this.throwBroadcastAccountOp({ message }); + } + const provider = this.providers.providers[accountOp.networkId]; + const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr); + const network = this.networks.networks.find((n) => n.id === accountOp.networkId); + if (!provider) { + const networkName = network?.name || `network with id ${accountOp.networkId}`; + const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`; + return this.throwBroadcastAccountOp({ message }); + } + if (!account) { + const addr = shortenAddress(accountOp.accountAddr, 13); + const message = `Account with address ${addr} not found. ${contactSupportPrompt}`; + return this.throwBroadcastAccountOp({ message }); + } + if (!network) { + const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`; + return this.throwBroadcastAccountOp({ message }); + } + const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]; + let transactionRes = null; + // Basic account (EOA) + if (!isSmartAccount(account)) { + try { + const feePayerKeys = this.keystore.keys.filter((key) => key.addr === accountOp.gasFeePayment.paidBy); + const feePayerKey = + // Temporarily prioritize the key with the same type as the signing key. + // TODO: Implement a way to choose the key type to broadcast with. + feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]; + if (!feePayerKey) { + const missingKeyAddr = shortenAddress(accountOp.gasFeePayment.paidBy, 13); + const accAddr = shortenAddress(accountOp.accountAddr, 13); + const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`; + return await this.throwBroadcastAccountOp({ message, accountState }); + } + this.feePayerKey = feePayerKey; + this.emitUpdate(); + const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type); + if (signer.init) + signer.init(this.#externalSignerControllers[feePayerKey.type]); + const gasFeePayment = accountOp.gasFeePayment; + const { to, value, data } = accountOp.calls[0]; + const rawTxn = { + to: to ?? undefined, + value, + data, + chainId: network.chainId, + nonce: await provider.getTransactionCount(accountOp.accountAddr), + gasLimit: gasFeePayment.simulatedGasLimit + }; + // if it's eip1559, send it as such. If no, go to legacy + if (gasFeePayment.maxPriorityFeePerGas !== undefined) { + rawTxn.maxFeePerGas = gasFeePayment.gasPrice; + rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas; + rawTxn.type = 2; + } + else { + rawTxn.gasPrice = gasFeePayment.gasPrice; + rawTxn.type = 0; + } + const signedTxn = await signer.signRawTransaction(rawTxn); + const broadcastRes = await provider.broadcastTransaction(signedTxn); + transactionRes = { + txnId: broadcastRes.hash, + nonce: broadcastRes.nonce, + identifiedBy: { + type: 'Transaction', + identifier: broadcastRes.hash + } + }; + } + catch (error) { + return this.throwBroadcastAccountOp({ error, accountState }); + } + } + // Smart account but EOA pays the fee + else if (account.creation && + accountOp.gasFeePayment && + accountOp.gasFeePayment.paidBy !== account.addr) { + const feePayerKeys = this.keystore.keys.filter((key) => key.addr === accountOp.gasFeePayment.paidBy); + const feePayerKey = + // Temporarily prioritize the key with the same type as the signing key. + // TODO: Implement a way to choose the key type to broadcast with. + feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]; + if (!feePayerKey) { + const missingKeyAddr = shortenAddress(accountOp.gasFeePayment.paidBy, 13); + const accAddr = shortenAddress(accountOp.accountAddr, 13); + const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`; + return this.throwBroadcastAccountOp({ message, accountState }); + } + this.feePayerKey = feePayerKey; + this.emitUpdate(); + let data; + let to; + if (accountState.isDeployed) { + const ambireAccount = new Interface(AmbireAccount.abi); + to = accountOp.accountAddr; + data = ambireAccount.encodeFunctionData('execute', [ + getSignableCalls(accountOp), + accountOp.signature + ]); + } + else { + const ambireFactory = new Interface(AmbireFactory.abi); + to = account.creation.factoryAddr; + data = ambireFactory.encodeFunctionData('deployAndExecute', [ + account.creation.bytecode, + account.creation.salt, + getSignableCalls(accountOp), + accountOp.signature + ]); + } + try { + const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type); + if (signer.init) + signer.init(this.#externalSignerControllers[feePayerKey.type]); + const rawTxn = { + to, + data, + // We ultimately do a smart contract call, which means we don't need + // to send any `value` from the EOA address. The actual `value` will + // get taken from the value encoded in the `data` field. + value: BigInt(0), + chainId: network.chainId, + nonce: await provider.getTransactionCount(accountOp.gasFeePayment.paidBy), + gasLimit: accountOp.gasFeePayment.simulatedGasLimit + }; + if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) { + rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice; + rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas; + rawTxn.type = 2; + } + else { + rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice; + rawTxn.type = 0; + } + const signedTxn = await signer.signRawTransaction(rawTxn); + const broadcastRes = await provider.broadcastTransaction(signedTxn); + transactionRes = { + txnId: broadcastRes.hash, + nonce: broadcastRes.nonce, + identifiedBy: { + type: 'Transaction', + identifier: broadcastRes.hash + } + }; + } + catch (error) { + return this.throwBroadcastAccountOp({ error, accountState }); + } + } + // Smart account, the ERC-4337 way + else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) { + const userOperation = accountOp.asUserOperation; + if (!userOperation) { + const accAddr = shortenAddress(accountOp.accountAddr, 13); + const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`; + return this.throwBroadcastAccountOp({ message, accountState }); + } + // broadcast through bundler's service + let userOperationHash; + const bundler = bundlerSwitcher.getBundler(); + try { + userOperationHash = await bundler.broadcast(userOperation, network); + } + catch (e) { + let retryMsg; + // if the signAccountOp is still active (it should be) + // try to switch the bundler and ask the user to try again + // TODO: explore more error case where we switch the bundler + if (this.signAccountOp) { + const decodedError = bundler.decodeBundlerError(e); + const humanReadable = getHumanReadableBroadcastError(decodedError); + const switcher = this.signAccountOp.bundlerSwitcher; + this.signAccountOp.updateStatus(SigningStatus.ReadyToSign); + if (switcher.canSwitch(humanReadable)) { + switcher.switch(); + this.estimateSignAccountOp(); + this.#updateGasPrice(); + retryMsg = 'Broadcast failed because bundler was down. Please try again'; + } + } + return this.throwBroadcastAccountOp({ + error: e, + accountState, + provider, + network, + message: retryMsg + }); + } + if (!userOperationHash) { + return this.throwBroadcastAccountOp({ + message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.' + }); + } + transactionRes = { + nonce: Number(userOperation.nonce), + identifiedBy: { + type: 'UserOperation', + identifier: userOperationHash, + bundler: bundler.getName() + } + }; + } + // Smart account, the Relayer way + else { + try { + const body = { + gasLimit: Number(accountOp.gasFeePayment.simulatedGasLimit), + txns: getSignableCalls(accountOp), + signature: accountOp.signature, + signer: { address: accountOp.signingKeyAddr }, + nonce: Number(accountOp.nonce) + }; + const additionalRelayerNetwork = relayerAdditionalNetworks.find((net) => net.chainId === network.chainId); + const relayerNetworkId = additionalRelayerNetwork + ? additionalRelayerNetwork.name + : accountOp.networkId; + const response = await this.callRelayer(`/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`, 'POST', body); + if (!response.success) + throw new Error(response.message); + transactionRes = { + txnId: response.txId, + nonce: Number(accountOp.nonce), + identifiedBy: { + type: 'Relayer', + identifier: response.id + } + }; + } + catch (error) { + return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true }); + } + } + if (!transactionRes) + return this.throwBroadcastAccountOp({ + message: 'No transaction response received after being broadcasted.' + }); + this.portfolio.markSimulationAsBroadcasted(account.addr, network.id); + const submittedAccountOp = { + ...accountOp, + status: AccountOpStatus.BroadcastedButNotConfirmed, + txnId: transactionRes.txnId, + nonce: BigInt(transactionRes.nonce), + identifiedBy: transactionRes.identifiedBy, + timestamp: new Date().getTime(), + isSingletonDeploy: !!accountOp.calls.find((call) => call.to && getAddress(call.to) === SINGLETON) + }; + await this.activity.addAccountOp(submittedAccountOp); + this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp); + await this.resolveAccountOpAction({ + networkId: network.id, + isUserOp: !!accountOp?.asUserOperation, + submittedAccountOp + }, actionId); + await this.#notificationManager.create({ + title: 'Done!', + message: 'The transaction was successfully signed and broadcasted to the network.' + }); + return Promise.resolve(submittedAccountOp); + } + // ! IMPORTANT ! + // Banners that depend on async data from sub-controllers should be implemented + // in the sub-controllers themselves. This is because updates in the sub-controllers + // will not trigger emitUpdate in the MainController, therefore the banners will + // remain the same until a subsequent update in the MainController. + get banners() { + if (!this.selectedAccount.account || !this.networks.isInitialized) + return []; + const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(this.selectedAccount.account.addr, this.swapAndBridge.activeRoutes); + const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter((r) => r.routeStatus === 'ready'); + const accountOpBanners = getAccountOpBanners({ + accountOpActionsByNetwork: getAccountOpActionsByNetwork(this.selectedAccount.account.addr, this.actions.actionsQueue), + selectedAccount: this.selectedAccount.account.addr, + accounts: this.accounts.accounts, + networks: this.networks.networks, + swapAndBridgeRoutesPendingSignature + }); + return [...accountOpBanners]; + } + // Technically this is an anti-pattern, but it's the only way to + // test the error handling in the method. + throwBroadcastAccountOp({ message: humanReadableMessage, error: _err, accountState, isRelayer = false, provider = undefined, network = undefined }) { + const originalMessage = _err?.message; + let message = humanReadableMessage; + let isReplacementFeeLow = false; + if (originalMessage) { + if (originalMessage.includes('replacement fee too low')) { + message = + 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'; + isReplacementFeeLow = true; + this.estimateSignAccountOp(); + } + else if (originalMessage.includes('pimlico_getUserOperationGasPrice') || + originalMessage.includes('preVerificationGas')) { + message = + 'Transaction fee underpriced. Please select a higher transaction speed and try again'; + this.updateSignAccountOpGasPrice(); + } + else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) { + message = `Signer key not supported on this network.${!accountState?.isV2 + ? 'You can add/change signers from the web wallet or contact support.' + : 'Please contact support.'}`; + } + else if (originalMessage.includes('underpriced')) { + message = + 'Transaction fee underpriced. Please select a higher transaction speed and try again'; + this.updateSignAccountOpGasPrice(); + this.estimateSignAccountOp(); + } + else if (originalMessage.includes('Failed to fetch') && isRelayer) { + message = + 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'; + } + } + if (!message) { + message = getHumanReadableBroadcastError(_err || new Error('')).message; + // if the message states that the paymaster doesn't have sufficient amount, + // add it to the failedPaymasters to disable it until a top-up is made + if (message.includes(insufficientPaymasterFunds) && provider && network) { + failedPaymasters.addInsufficientFunds(provider, network).then(() => { + this.estimateSignAccountOp(); + }); + } + } + // To enable another try for signing in case of broadcast fail + // broadcast is called in the FE only after successful signing + this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow); + this.feePayerKey = null; + return Promise.reject(new EmittableError({ level: 'major', message, error: _err || new Error(message) })); + } + get isSignRequestStillActive() { + if (!this.signAccountOp) + return false; + return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp.fromActionId); + } + // includes the getters in the stringified instance + toJSON() { + return { + ...this, + ...super.toJSON(), + banners: this.banners, + isSignRequestStillActive: this.isSignRequestStillActive + }; + } +} +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/src/controllers/main/main.js.map b/dist/src/controllers/main/main.js.map new file mode 100644 index 000000000..aaa053c11 --- /dev/null +++ b/dist/src/controllers/main/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/brace-style */\n\nimport { ethErrors } from 'eth-rpc-errors'\nimport { getAddress, getBigInt, Interface, isAddress } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'\nimport { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'\nimport {\n BIP44_LEDGER_DERIVATION_TEMPLATE,\n BIP44_STANDARD_DERIVATION_TEMPLATE\n} from '../../consts/derivation'\nimport {\n Account,\n AccountId,\n AccountOnchainState,\n AccountWithNetworkMeta\n} from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n ExternalSignerControllers,\n Key,\n KeystoreSignerType,\n TxnRequest\n} from '../../interfaces/keystore'\nimport { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Storage } from '../../interfaces/storage'\nimport { SocketAPISendTransactionRequest } from '../../interfaces/swapAndBridge'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport { WindowManager } from '../../interfaces/window'\nimport { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport {\n AccountOpIdentifiedBy,\n getDappIdentifier,\n pollTxnId,\n SubmittedAccountOp\n} from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport {\n dappRequestMethodToActionKind,\n getAccountOpActionsByNetwork,\n getAccountOpFromAction\n} from '../../libs/actions/actions'\nimport { getAccountOpBanners } from '../../libs/banners/banners'\nimport { getPaymasterService } from '../../libs/erc7677/erc7677'\nimport {\n getHumanReadableBroadcastError,\n getHumanReadableEstimationError\n} from '../../libs/errorHumanizer'\nimport { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'\nimport { estimate } from '../../libs/estimate/estimate'\nimport { EstimateResult } from '../../libs/estimate/interfaces'\nimport { GasRecommendation, getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'\nimport { humanizeAccountOp } from '../../libs/humanizer'\nimport { KeyIterator } from '../../libs/keyIterator/keyIterator'\nimport {\n ACCOUNT_SWITCH_USER_REQUEST,\n buildSwitchAccountUserRequest,\n getAccountOpsForSimulation,\n makeBasicAccountOpAction,\n makeSmartAccountOpAction\n} from '../../libs/main/main'\nimport { relayerAdditionalNetworks } from '../../libs/networks/networks'\nimport { GetOptions, TokenResult } from '../../libs/portfolio/interfaces'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { parse } from '../../libs/richJson/richJson'\nimport { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'\nimport {\n adjustEntryPointAuthorization,\n getEntryPointAuthorization\n} from '../../libs/signMessage/signMessage'\nimport {\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { debugTraceCall } from '../../libs/tracer/debugTraceCall'\nimport {\n buildClaimWalletRequest,\n buildMintVestingRequest,\n buildTransferUserRequest\n} from '../../libs/transfer/userRequest'\nimport {\n ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n isErc4337Broadcast,\n shouldAskForEntryPointAuthorization\n} from '../../libs/userOperation/userOperation'\nimport { getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { SocketAPI } from '../../services/socket/api'\nimport { getIsViewOnly } from '../../utils/accounts'\nimport shortenAddress from '../../utils/shortenAddress'\nimport wait from '../../utils/wait'\nimport { AccountAdderController } from '../accountAdder/accountAdder'\nimport { AccountsController } from '../accounts/accounts'\nimport {\n AccountOpAction,\n ActionExecutionType,\n ActionPosition,\n ActionsController,\n SignMessageAction\n} from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport { AddressBookController } from '../addressBook/addressBook'\nimport { DappsController } from '../dapps/dapps'\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport { DomainsController } from '../domains/domains'\nimport { EmailVaultController } from '../emailVault/emailVault'\nimport EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n/* eslint-disable no-underscore-dangle */\nimport { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'\nimport { SignMessageController } from '../signMessage/signMessage'\nimport { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'\n\nconst STATUS_WRAPPED_METHODS = {\n onAccountAdderSuccess: 'INITIAL',\n signAccountOp: 'INITIAL',\n broadcastSignedAccountOp: 'INITIAL',\n removeAccount: 'INITIAL',\n handleAccountAdderInitLedger: 'INITIAL',\n handleAccountAdderInitLattice: 'INITIAL',\n importSmartAccountFromDefaultSeed: 'INITIAL',\n buildSwapAndBridgeUserRequest: 'INITIAL',\n importSmartAccountFromSavedSeed: 'INITIAL',\n selectAccount: 'INITIAL'\n} as const\n\nexport class MainController extends EventEmitter {\n #storage: Storage\n\n fetch: Fetch\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n callRelayer: Function\n\n isReady: boolean = false\n\n invite: InviteController\n\n keystore: KeystoreController\n\n /**\n * Hardware wallets (usually) need an additional (external signer) controller,\n * that is app-specific (web, mobile) and is used to interact with the device.\n * (example: LedgerController, TrezorController, LatticeController)\n */\n #externalSignerControllers: ExternalSignerControllers = {}\n\n // Subcontrollers\n networks: NetworksController\n\n providers: ProvidersController\n\n accountAdder: AccountAdderController\n\n portfolio: PortfolioController\n\n defiPositions: DefiPositionsController\n\n dapps: DappsController\n\n actions: ActionsController\n\n // Public sub-structures\n // @TODO emailVaults\n emailVault: EmailVaultController\n\n signMessage: SignMessageController\n\n swapAndBridge: SwapAndBridgeController\n\n signAccountOp: SignAccountOpController | null = null\n\n signAccOpInitError: string | null = null\n\n activity: ActivityController\n\n addressBook: AddressBookController\n\n domains: DomainsController\n\n accounts: AccountsController\n\n selectedAccount: SelectedAccountController\n\n userRequests: UserRequest[] = []\n\n userRequestWaitingAccountSwitch: UserRequest[] = []\n\n // network => GasRecommendation[]\n gasPrices: { [key: string]: GasRecommendation[] } = {}\n\n // network => BundlerGasPrice\n bundlerGasPrices: { [key: string]: { speeds: GasSpeeds; bundler: BUNDLER } } = {}\n\n accountOpsToBeConfirmed: { [key: string]: { [key: string]: AccountOp } } = {}\n\n // TODO: Temporary solution to expose the fee payer key during Account Op broadcast.\n feePayerKey: Key | null = null\n\n lastUpdate: Date = new Date()\n\n isOffline: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n #signAccountOpSigningPromise?: Promise\n\n #signAccountOpBroadcastPromise?: Promise\n\n constructor({\n storage,\n fetch,\n relayerUrl,\n velcroUrl,\n socketApiKey,\n keystoreSigners,\n externalSignerControllers,\n windowManager,\n notificationManager\n }: {\n storage: Storage\n fetch: Fetch\n relayerUrl: string\n velcroUrl: string\n socketApiKey: string\n keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n externalSignerControllers: ExternalSignerControllers\n windowManager: WindowManager\n notificationManager: NotificationManager\n }) {\n super()\n this.#storage = storage\n this.fetch = fetch\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n\n this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage })\n this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager)\n this.#externalSignerControllers = externalSignerControllers\n this.networks = new NetworksController(\n this.#storage,\n this.fetch,\n async (network: Network) => {\n this.providers.setProvider(network)\n await this.reloadSelectedAccount({ networkId: network.id })\n },\n (networkId: NetworkId) => {\n this.providers.removeProvider(networkId)\n }\n )\n this.providers = new ProvidersController(this.networks)\n this.accounts = new AccountsController(\n this.#storage,\n this.providers,\n this.networks,\n async (accounts) => {\n const defaultSelectedAccount = getDefaultSelectedAccount(accounts)\n if (defaultSelectedAccount) {\n await this.#selectAccount(defaultSelectedAccount.addr)\n }\n },\n this.providers.updateProviderIsWorking.bind(this.providers),\n this.#updateIsOffline.bind(this)\n )\n this.selectedAccount = new SelectedAccountController({\n storage: this.#storage,\n accounts: this.accounts\n })\n this.portfolio = new PortfolioController(\n this.#storage,\n this.fetch,\n this.providers,\n this.networks,\n this.accounts,\n relayerUrl,\n velcroUrl\n )\n this.defiPositions = new DefiPositionsController({\n fetch: this.fetch,\n storage,\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n providers: this.providers\n })\n this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore)\n this.accountAdder = new AccountAdderController({\n accounts: this.accounts,\n keystore: this.keystore,\n networks: this.networks,\n providers: this.providers,\n relayerUrl,\n fetch: this.fetch\n })\n this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount)\n this.signMessage = new SignMessageController(\n this.keystore,\n this.providers,\n this.networks,\n this.accounts,\n this.#externalSignerControllers\n )\n const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch })\n this.dapps = new DappsController(this.#storage)\n this.actions = new ActionsController({\n selectedAccount: this.selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose: () => {\n const userRequestsToRejectOnWindowClose = this.userRequests.filter(\n (r) => r.action.kind !== 'calls'\n )\n userRequestsToRejectOnWindowClose.forEach((r) =>\n r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())\n )\n this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls')\n this.userRequestWaitingAccountSwitch = []\n this.emitUpdate()\n }\n })\n this.selectedAccount.initControllers({\n portfolio: this.portfolio,\n defiPositions: this.defiPositions,\n actions: this.actions,\n networks: this.networks,\n providers: this.providers\n })\n\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch })\n this.activity = new ActivityController(\n this.#storage,\n this.fetch,\n this.callRelayer,\n this.accounts,\n this.selectedAccount,\n this.providers,\n this.networks,\n async (network: Network) => {\n await this.setContractsDeployedToTrueIfDeployed(network)\n }\n )\n this.swapAndBridge = new SwapAndBridgeController({\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n activity: this.activity,\n invite: this.invite,\n socketAPI,\n storage: this.#storage,\n actions: this.actions\n })\n this.domains = new DomainsController(this.providers.providers)\n this.#initialLoadPromise = this.#load()\n paymasterFactory.init(relayerUrl, fetch, (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n })\n }\n\n /**\n * - Updates the selected account's account state, portfolio and defi positions\n * - Calls batchReverseLookup for all accounts\n *\n * It's not a problem to call it many times consecutively as all methods have internal\n * caching mechanisms to prevent unnecessary calls.\n */\n onLoad(isFirstLoad: boolean = false) {\n const selectedAccountAddr = this.selectedAccount.account?.addr\n const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length\n this.defiPositions.updatePositions()\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n if (!hasBroadcastedButNotConfirmed) {\n this.updateSelectedAccountPortfolio()\n }\n // The first time the app loads, we update the account state elsewhere\n if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading)\n this.accounts.updateAccountState(selectedAccountAddr)\n }\n\n async #load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n await this.networks.initialLoadPromise\n await this.providers.initialLoadPromise\n await this.accounts.initialLoadPromise\n await this.selectedAccount.initialLoadPromise\n\n this.onLoad(true)\n /**\n * Listener that gets triggered as a finalization step of adding new\n * accounts via the AccountAdder controller flow.\n *\n * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these\n * changes are reflected for view-only accounts as well. Because the\n * view-only accounts import flow bypasses the AccountAdder, this method\n * won't click for them. Their on add success flow continues in the\n * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case.\n */\n const onAccountAdderSuccess = () => {\n if (this.accountAdder.addAccountsStatus !== 'SUCCESS') return\n\n return this.withStatus(\n 'onAccountAdderSuccess',\n async () => {\n // Add accounts first, because some of the next steps have validation\n // if accounts exists.\n await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts)\n\n // Then add keys, because some of the next steps could have validation\n // if keys exists. Should be separate (not combined in Promise.all,\n // since firing multiple keystore actions is not possible\n // (the #wrapKeystoreAction listens for the first one to finish and\n // skips the parallel one, if one is requested).\n\n await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal)\n await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external)\n\n // Update the saved seed `hdPathTemplate` if accounts were added from\n // the saved seed, so when user opts in to \"Import a new Smart Account\n // from the saved Seed Phrase\" the next account is derived based\n // on the latest `hdPathTemplate` chosen in the AccountAdder.\n if (this.accountAdder.isInitializedWithSavedSeed)\n this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n if (this.keystore.hasKeystoreTempSeed)\n this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n },\n true\n )\n }\n this.accountAdder.onUpdate(onAccountAdderSuccess)\n\n this.isReady = true\n this.emitUpdate()\n }\n\n lock() {\n this.keystore.lock()\n this.emailVault.cleanMagicAndSessionKeys()\n this.selectedAccount.setDashboardNetworkFilter(null)\n }\n\n async selectAccount(toAccountAddr: string) {\n await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true)\n }\n\n async #selectAccount(toAccountAddr: string | null) {\n await this.#initialLoadPromise\n if (!toAccountAddr) {\n await this.selectedAccount.setAccount(null)\n\n this.emitUpdate()\n return\n }\n\n const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr)\n if (!accountToSelect) {\n console.error(`Account with address ${toAccountAddr} does not exist`)\n return\n }\n\n this.isOffline = false\n // call closeActionWindow while still on the currently selected account to allow proper\n // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl...\n if (this.actions?.currentAction?.type !== 'switchAccount') {\n this.actions.closeActionWindow()\n }\n this.selectedAccount.setAccount(accountToSelect)\n this.swapAndBridge.onAccountChange()\n this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr])\n // forceEmitUpdate to update the getters in the FE state of the ctrl\n await this.forceEmitUpdate()\n await this.actions.forceEmitUpdate()\n await this.addressBook.forceEmitUpdate()\n // Don't await these as they are not critical for the account selection\n // and if the user decides to quickly change to another account withStatus\n // will block the UI until these are resolved.\n this.reloadSelectedAccount({ forceUpdate: false })\n this.emitUpdate()\n }\n\n async importSmartAccountFromSavedSeed(seed?: string) {\n await this.withStatus(\n 'importSmartAccountFromSavedSeed',\n async () => {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n if (seed && !this.keystore.hasKeystoreSavedSeed) {\n await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE })\n }\n\n const savedSeed = await this.keystore.getSavedSeed()\n if (!savedSeed) {\n throw new EmittableError({\n message:\n 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.',\n level: 'major',\n error: new Error('failed to retrieve saved seed phrase from keystore')\n })\n }\n\n const keyIterator = new KeyIterator(savedSeed.seed)\n await this.accountAdder.init({\n keyIterator,\n hdPathTemplate: savedSeed.hdPathTemplate,\n pageSize: 1,\n shouldGetAccountsUsedOnNetworks: false,\n shouldSearchForLinkedAccounts: false\n })\n\n let currentPage: number = 1\n let isAccountAlreadyAdded: boolean\n let nextSmartAccount: AccountWithNetworkMeta | undefined\n\n const findNextSmartAccount = async () => {\n do {\n // eslint-disable-next-line no-await-in-loop\n await this.accountAdder.setPage({ page: currentPage })\n\n nextSmartAccount = this.accountAdder.accountsOnPage.find(\n ({ isLinked, account }) => !isLinked && isSmartAccount(account)\n )?.account\n\n if (!nextSmartAccount) break\n\n isAccountAlreadyAdded = !!this.accounts.accounts.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n (a) => a.addr === nextSmartAccount!.addr\n )\n\n currentPage++\n } while (isAccountAlreadyAdded)\n }\n\n await findNextSmartAccount()\n\n if (!nextSmartAccount) {\n throw new EmittableError({\n message:\n 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.',\n level: 'major',\n error: new Error('Internal error: Failed to find a smart account to add')\n })\n }\n\n this.accountAdder.selectAccount(nextSmartAccount)\n\n const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts()\n\n await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, {\n internal: readyToAddKeys,\n external: []\n })\n },\n true\n )\n }\n\n initSignAccOp(actionId: AccountOpAction['id']): null | void {\n const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue)\n if (!accountOp) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'\n return null\n }\n\n const network = this.networks.networks.find((net) => net.id === accountOp.networkId)\n\n if (\n !this.selectedAccount.account ||\n this.selectedAccount.account.addr !== accountOp.accountAddr\n ) {\n this.signAccOpInitError =\n 'Attempting to initialize an accountOp for an account other than the currently selected one.'\n return null\n }\n\n if (!network) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process as we are unable to locate the specified network.'\n return null\n }\n\n // on init, set the accountOp nonce to the latest one we know\n // it could happen that the user inits a userRequest with an old\n // accountState and therefore caching the old nonce in the accountOp.\n // we make sure the latest nonce is set when initing signAccountOp\n const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]\n if (state) accountOp.nonce = state.nonce\n\n this.signAccOpInitError = null\n\n this.signAccountOp = new SignAccountOpController(\n this.accounts,\n this.keystore,\n this.portfolio,\n this.#externalSignerControllers,\n this.selectedAccount.account,\n network,\n actionId,\n accountOp,\n () => {\n this.estimateSignAccountOp()\n },\n () => {\n return this.isSignRequestStillActive\n }\n )\n\n this.emitUpdate()\n\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n }\n\n async handleSignAndBroadcastAccountOp() {\n await this.withStatus(\n 'signAccountOp',\n async () => {\n const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done\n if (wasAlreadySigned) return Promise.resolve()\n\n if (!this.signAccountOp) {\n const message =\n 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'\n const error = new Error('SignAccountOp is not initialized')\n this.emitError({ level: 'major', message, error })\n return Promise.reject(error)\n }\n\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => {\n this.#signAccountOpSigningPromise = undefined\n })\n\n return this.#signAccountOpSigningPromise\n },\n true\n )\n\n // Error handling on the prev step will notify the user, it's fine to return here\n if (this.signAccountOp?.status?.type !== SigningStatus.Done) return\n\n return this.withStatus(\n 'broadcastSignedAccountOp',\n async () => {\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => {\n this.#signAccountOpBroadcastPromise = undefined\n })\n return this.#signAccountOpBroadcastPromise\n },\n true\n )\n }\n\n destroySignAccOp() {\n if (!this.signAccountOp) return\n\n this.feePayerKey = null\n this.signAccountOp = null\n this.signAccOpInitError = null\n\n // NOTE: no need to update the portfolio here as an update is\n // fired upon removeUserRequest\n\n this.emitUpdate()\n }\n\n async traceCall(estimation: EstimateResult) {\n const accountOp = this.signAccountOp?.accountOp\n if (!accountOp) return\n\n const network = this.networks.networks.find((net) => net.id === accountOp?.networkId)\n if (!network) return\n\n try {\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)!\n const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n const provider = this.providers.providers[network.id]\n const gasPrice = this.gasPrices[network.id]\n const { tokens, nfts } = await debugTraceCall(\n account,\n accountOp,\n provider,\n state,\n estimation.gasUsed,\n gasPrice,\n !network.rpcNoStateOverride\n )\n const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id)\n const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id)\n // update the portfolio only if new tokens were found through tracing\n if (learnedNewTokens || learnedNewNfts) {\n this.portfolio\n .updateSelectedAccount(\n accountOp.accountAddr,\n network,\n getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n accountOp\n ),\n { forceUpdate: true }\n )\n // fire an update request to refresh the warnings if any\n .then(() => this.signAccountOp?.update({}))\n }\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: 'Error in main.traceCall',\n error: e\n })\n }\n }\n\n async handleSignMessage() {\n const accountAddr = this.signMessage.messageToSign?.accountAddr\n const networkId = this.signMessage.messageToSign?.networkId\n\n // Could (rarely) happen if not even a single account state is fetched yet\n const shouldForceUpdateAndWaitForAccountState =\n accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (shouldForceUpdateAndWaitForAccountState)\n await this.accounts.updateAccountState(accountAddr, 'latest', [networkId])\n\n const isAccountStateStillMissing =\n !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (isAccountStateStillMissing) {\n const message =\n 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'\n const error = new Error(\n `The account state of ${accountAddr} is missing for the network with id ${networkId}.`\n )\n return this.emitError({ level: 'major', message, error })\n }\n\n await this.signMessage.sign()\n\n const signedMessage = this.signMessage.signedMessage\n // Error handling on the prev step will notify the user, it's fine to return here\n if (!signedMessage) return\n\n if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0],\n networkId: signedMessage.networkId,\n nonce:\n this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}\n accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(\n signedMessage.signature as string\n )\n\n this.actions.addOrUpdateAction(accountOpAction, 'first')\n }\n\n await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr)\n await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId)\n\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The Message was successfully signed.'\n })\n }\n\n async #handleAccountAdderInitLedger(\n LedgerKeyIterator: any // TODO: KeyIterator type mismatch\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const ledgerCtrl = this.#externalSignerControllers.ledger\n if (!ledgerCtrl) {\n const message =\n 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n // Once a session with the Ledger device gets initiated, the user might\n // use the device with another app. In this scenario, when coming back to\n // Ambire (the second time a connection gets requested onwards),\n // the Ledger device throws with \"invalid channel\" error.\n // To overcome this, always make sure to clean up before starting\n // a new session when retrieving keys, in case there already is one.\n if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp()\n\n const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE\n await ledgerCtrl.unlock(hdPathTemplate)\n\n if (!ledgerCtrl.walletSDK) {\n const message = 'Could not establish connection with the Ledger device'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl })\n await this.accountAdder.init({ keyIterator, hdPathTemplate })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Ledger device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLedger(LedgerKeyIterator: any /* TODO: KeyIterator type mismatch */) {\n await this.withStatus('handleAccountAdderInitLedger', async () =>\n this.#handleAccountAdderInitLedger(LedgerKeyIterator)\n )\n }\n\n async #handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const latticeCtrl = this.#externalSignerControllers.lattice\n if (!latticeCtrl) {\n const message =\n 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE\n await latticeCtrl.unlock(hdPathTemplate, undefined, true)\n\n const { walletSDK } = latticeCtrl\n await this.accountAdder.init({\n keyIterator: new LatticeKeyIterator({ walletSDK }),\n hdPathTemplate\n })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n await this.withStatus('handleAccountAdderInitLattice', async () =>\n this.#handleAccountAdderInitLattice(LatticeKeyIterator)\n )\n }\n\n async updateAccountsOpsStatuses(): Promise<{ newestOpTimestamp: number }> {\n await this.#initialLoadPromise\n\n const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } =\n await this.activity.updateAccountsOpsStatuses()\n\n if (shouldEmitUpdate) {\n this.emitUpdate()\n\n if (shouldUpdatePortfolio) {\n this.updateSelectedAccountPortfolio(true)\n }\n }\n\n updatedAccountsOps.forEach((op) => {\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op)\n })\n\n return { newestOpTimestamp }\n }\n\n // call this function after a call to the singleton has been made\n // it will check if the factory has been deployed and update the network settings if it has been\n async setContractsDeployedToTrueIfDeployed(network: Network) {\n await this.#initialLoadPromise\n if (network.areContractsDeployed) return\n\n const provider = this.providers.providers[network.id]\n if (!provider) return\n\n const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY)\n if (factoryCode === '0x') return\n await this.networks.updateNetwork({ areContractsDeployed: true }, network.id)\n }\n\n #removeAccountKeyData(address: Account['addr']) {\n // Compute account keys that are only associated with this account\n const accountAssociatedKeys =\n this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []\n const keysInKeystore = this.keystore.keys\n const importedAccountKeys = keysInKeystore.filter((key) =>\n accountAssociatedKeys.includes(key.addr)\n )\n const solelyAccountKeys = importedAccountKeys.filter((key) => {\n const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some(\n (acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)\n )\n\n return !isKeyAssociatedWithOtherAccounts\n })\n\n // Remove account keys from the keystore\n solelyAccountKeys.forEach((key) => {\n this.keystore.removeKey(key.addr, key.type).catch((e) => {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account key',\n error: e\n })\n })\n })\n }\n\n async removeAccount(address: Account['addr']) {\n await this.withStatus('removeAccount', async () => {\n try {\n this.#removeAccountKeyData(address)\n // Remove account data from sub-controllers\n await this.accounts.removeAccountData(address)\n this.portfolio.removeAccountData(address)\n await this.activity.removeAccountData(address)\n this.actions.removeAccountData(address)\n this.signMessage.removeAccountData(address)\n this.defiPositions.removeAccountData(address)\n\n if (this.selectedAccount.account?.addr === address) {\n await this.#selectAccount(this.accounts.accounts[0]?.addr)\n }\n\n if (this.signAccountOp?.account.addr === address) {\n this.destroySignAccOp()\n }\n\n this.emitUpdate()\n } catch (e: any) {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account',\n error: e || new Error('Failed to remove account')\n })\n }\n })\n }\n\n async #ensureAccountInfo(accountAddr: AccountId, networkId: NetworkId) {\n await this.#initialLoadPromise\n // Initial sanity check: does this account even exist?\n if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) {\n this.signAccOpInitError = `Account ${accountAddr} does not exist`\n return\n }\n // If this still didn't work, re-load\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n await this.accounts.updateAccountState(accountAddr, 'pending', [networkId])\n // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`\n }\n\n #batchCallsFromUserRequests(accountAddr: AccountId, networkId: NetworkId): Call[] {\n // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind\n return (this.userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n }\n\n async reloadSelectedAccount(\n options: {\n forceUpdate?: boolean\n networkId?: NetworkId\n } = {\n forceUpdate: true,\n networkId: undefined\n }\n ) {\n const { forceUpdate, networkId } = options\n const networkToUpdate = networkId\n ? this.networks.networks.find((n) => n.id === networkId)\n : undefined\n if (!this.selectedAccount.account) return\n\n this.selectedAccount.resetSelectedAccountPortfolio()\n await Promise.all([\n // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon),\n // it's very likely that the account state is already in the process of being updated.\n // If we try to run the same action, `withStatus` validation will throw an error.\n // So, we perform this safety check to prevent the error.\n // However, even if we don't trigger an update here, it's not a big problem,\n // as the account state will be updated anyway, and its update will be very recent.\n !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr\n ? this.accounts.updateAccountState(\n this.selectedAccount.account.addr,\n 'pending',\n networkId ? [networkId] : undefined\n )\n : Promise.resolve(),\n // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally,\n // as the PortfolioController already exposes flags that are highly sufficient for the UX.\n // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard),\n // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper.\n this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate),\n this.defiPositions.updatePositions(networkId)\n ])\n }\n\n #updateIsOffline() {\n const oldIsOffline = this.isOffline\n const accountAddr = this.selectedAccount.account?.addr\n\n if (!accountAddr) return\n\n // We have to make calculations based on the state of the portfolio\n // and not the selected account portfolio the flag isOffline\n // and the errors of the selected account portfolio should\n // come in the same tick. Otherwise the UI may flash the wrong error.\n const latestState = this.portfolio.getLatestPortfolioState(accountAddr)\n const latestStateKeys = Object.keys(latestState)\n\n const isAllReady = latestStateKeys.every((networkId) => {\n return isNetworkReady(latestState[networkId])\n })\n\n if (!isAllReady) return\n\n const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => {\n const state = latestState[networkId]\n\n return !!state?.criticalError\n })\n\n const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => {\n const provider = this.providers.providers[networkId]\n const isWorking = provider.isWorking\n\n return typeof isWorking === 'boolean' && !isWorking\n })\n\n // Update isOffline if either all portfolio networks have errors or we've failed to fetch\n // the account state for every account. This is because either update may fail first.\n this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors\n\n if (oldIsOffline !== this.isOffline) {\n this.emitUpdate()\n }\n }\n\n // eslint-disable-next-line default-param-last\n async updateSelectedAccountPortfolio(forceUpdate: boolean = false, network?: Network) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId\n const networkData =\n network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n this.selectedAccount.account,\n this.actions.visibleActionsQueue,\n networkData,\n this.signAccountOp?.accountOp\n )\n\n await this.portfolio.updateSelectedAccount(\n this.selectedAccount.account.addr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate }\n )\n this.#updateIsOffline()\n }\n\n #getUserRequestAccountError(dappOrigin: string, fromAccountAddr: string): string | null {\n if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) {\n const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr)\n\n if (isAddressInAccounts) return null\n\n return 'The dApp is trying to sign using an address that is not imported in the extension.'\n }\n const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr\n\n if (isAddressSelected) return null\n\n return 'The dApp is trying to sign using an address that is not selected in the extension.'\n }\n\n async buildUserRequestFromDAppRequest(\n request: DappProviderRequest,\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n ) {\n await this.#initialLoadPromise\n let userRequest = null\n let actionPosition: ActionPosition = 'last'\n const kind = dappRequestMethodToActionKind(request.method)\n const dapp = this.dapps.getDapp(request.origin)\n\n if (kind === 'calls') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n const isWalletSendCalls = !!request.params[0].calls\n const accountAddr = getAddress(request.params[0].from)\n\n const calls: Calls['calls'] = isWalletSendCalls\n ? request.params[0].calls\n : [request.params[0]]\n const paymasterService = isWalletSendCalls\n ? getPaymasterService(network.chainId, request.params[0].capabilities)\n : null\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data || '0x',\n value: call.value ? getBigInt(call.value) : 0n\n }))\n },\n meta: {\n isSignAction: true,\n isWalletSendCalls,\n accountAddr,\n networkId: network.id,\n paymasterService\n },\n dappPromise\n } as SignUserRequest\n if (!this.selectedAccount.account.creation) {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n } else if (kind === 'message') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[1])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'message',\n message: msg[0]\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else if (kind === 'typedMessage') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[0])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n let typedData = msg?.[1]\n\n try {\n typedData = parse(typedData)\n } catch (error) {\n throw ethErrors.rpc.invalidRequest('Invalid typedData provided')\n }\n\n if (\n !typedData?.types ||\n !typedData?.domain ||\n !typedData?.message ||\n !typedData?.primaryType\n ) {\n throw ethErrors.rpc.methodNotSupported(\n 'Invalid typedData format - only typedData v4 is supported'\n )\n }\n\n if (\n msgAddress === this.selectedAccount.account.addr &&\n (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)\n ) {\n throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'typedMessage',\n types: typedData.types,\n domain: typedData.domain,\n message: typedData.message,\n primaryType: typedData.primaryType\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else {\n userRequest = {\n id: new Date().getTime(),\n session: request.session,\n action: { kind, params: request.params },\n meta: { isSignAction: false },\n dappPromise\n } as DappUserRequest\n }\n\n if (userRequest.action.kind !== 'calls') {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n\n if (!userRequest) return\n\n const isASignOperationRequestedForAnotherAccount =\n userRequest.meta.isSignAction &&\n userRequest.meta.accountAddr !== this.selectedAccount.account?.addr\n\n // We can simply add the user request if it's not a sign operation\n // for another account\n if (!isASignOperationRequestedForAnotherAccount) {\n await this.addUserRequest(\n userRequest,\n actionPosition,\n actionPosition === 'first' || isSmartAccount(this.selectedAccount.account)\n ? 'open-action-window'\n : 'queue-but-open-action-window'\n )\n return\n }\n\n const accountError = this.#getUserRequestAccountError(\n dappPromise.session.origin,\n userRequest.meta.accountAddr\n )\n\n if (accountError) {\n dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError))\n return\n }\n\n const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId))\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n this.userRequestWaitingAccountSwitch.push(userRequest)\n await this.addUserRequest(\n buildSwitchAccountUserRequest({\n nextUserRequest: userRequest,\n networkId: network.id,\n selectedAccountAddr: userRequest.meta.accountAddr,\n session: dappPromise.session,\n dappPromise\n }),\n 'last',\n 'open-action-window'\n )\n }\n\n async buildTransferUserRequest(\n amount: string,\n recipientAddress: string,\n selectedToken: TokenResult,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const userRequest = buildTransferUserRequest({\n selectedAccount: this.selectedAccount.account.addr,\n amount,\n selectedToken,\n recipientAddress\n })\n\n if (!userRequest) {\n this.emitError({\n level: 'major',\n message: 'Unexpected error while building transfer request',\n error: new Error(\n 'buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest'\n )\n })\n return\n }\n\n await this.addUserRequest(userRequest, 'last', actionExecutionType)\n }\n\n async buildSwapAndBridgeUserRequest(activeRouteId?: number) {\n await this.withStatus(\n 'buildSwapAndBridgeUserRequest',\n async () => {\n if (!this.selectedAccount.account) return\n let transaction: SocketAPISendTransactionRequest | null | undefined = null\n\n const activeRoute = this.swapAndBridge.activeRoutes.find(\n (r) => r.activeRouteId === activeRouteId\n )\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n transaction = await this.swapAndBridge.getRouteStartUserTx()\n }\n\n if (activeRoute) {\n this.removeUserRequest(activeRoute.activeRouteId, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined })\n if (!isSmartAccount(this.selectedAccount.account)) {\n this.removeUserRequest(`${activeRouteId}-revoke-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.removeUserRequest(`${activeRouteId}-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n }\n transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId)\n }\n\n if (!this.selectedAccount.account || !transaction) {\n const errorDetails = `missing ${\n this.selectedAccount.account ? 'selected account' : 'transaction'\n } info`\n const error = new SwapAndBridgeError(\n `Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`\n )\n throw new EmittableError({ message: error.message, level: 'major', error })\n }\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === transaction!.chainId\n )!\n\n // TODO: Consider refining the error handling in here, because this\n // swallows errors and doesn't provide any feedback to the user.\n const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(\n transaction,\n network.id,\n this.selectedAccount.account,\n this.providers.providers[network.id]\n )\n\n for (let i = 0; i < swapAndBridgeUserRequests.length; i++) {\n if (i === 0) {\n this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window')\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue')\n }\n }\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n await this.swapAndBridge.addActiveRoute({\n activeRouteId: transaction.activeRouteId,\n userTxIndex: transaction.userTxIndex\n })\n }\n\n if (activeRouteId) {\n this.swapAndBridge.updateActiveRoute(\n activeRouteId,\n {\n userTxIndex: transaction.userTxIndex,\n userTxHash: null\n },\n true\n )\n }\n },\n true\n )\n }\n\n buildClaimWalletUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const claimableRewardsData =\n this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData\n\n if (!claimableRewardsData) return\n\n const userRequest: UserRequest = buildClaimWalletRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n claimableRewardsData\n })\n\n this.addUserRequest(userRequest)\n }\n\n buildMintVestingUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData\n\n if (!addrVestingData) return\n const userRequest: UserRequest = buildMintVestingRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n addrVestingData\n })\n\n this.addUserRequest(userRequest)\n }\n\n resolveUserRequest(data: any, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return // TODO: emit error\n\n userRequest.dappPromise?.resolve(data)\n // These requests are transitionary initiated internally (not dApp requests) that block dApp requests\n // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives\n if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) {\n setTimeout(() => {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }, 300)\n } else {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }\n }\n\n rejectUserRequest(err: string, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return\n\n if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n this.userRequests = this.userRequests.filter(\n (r) =>\n !(\n r.action.kind === 'calls' &&\n r.meta.accountAddr === userRequest.meta.accountAddr &&\n r.meta.networkId === userRequest.meta.networkId\n )\n )\n }\n\n // if the userRequest that is about to be removed is an approval request\n // find and remove the associated pending transaction request if there is any\n // this is valid scenario for a swap & bridge txs with a BA\n if (userRequest.action.kind === 'calls') {\n const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr)!\n\n if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) {\n this.removeUserRequest(userRequest.meta.activeRouteId)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`)\n }\n }\n\n userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err))\n this.removeUserRequest(requestId)\n }\n\n rejectSignAccountOpCall(callId: string) {\n if (!this.signAccountOp) return\n\n const { calls, networkId, accountAddr } = this.signAccountOp.accountOp\n\n const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId\n if (requestId) {\n const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId)\n const userRequest = this.userRequests[userRequestIndex] as SignUserRequest\n if (userRequest.action.kind === 'calls') {\n ;(userRequest.action as Calls).calls = (userRequest.action as Calls).calls.filter(\n (c) => c.id !== callId\n )\n\n if (userRequest.action.calls.length === 0) {\n // the reject will remove the userRequest which will rebuild the action and update the signAccountOp\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.find((a) => a.addr === accountAddr)!,\n networkId,\n nonce: this.accounts.accountStates[accountAddr][networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n\n this.actions.addOrUpdateAction(accountOpAction)\n this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n }\n } else {\n this.emitError({\n message: 'Reject call: the call was not found or was not linked to a user request',\n level: 'major',\n error: new Error(\n `Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`\n )\n })\n }\n }\n\n removeActiveRoute(activeRouteId: number) {\n const userRequest = this.userRequests.find((r) =>\n [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(\n r.id\n )\n )\n\n if (userRequest) {\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n this.swapAndBridge.removeActiveRoute(activeRouteId)\n }\n }\n\n async addUserRequest(\n req: UserRequest,\n actionPosition: ActionPosition = 'last',\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (req.action.kind === 'calls') {\n ;(req.action as Calls).calls.forEach((_, i) => {\n ;(req.action as Calls).calls[i].id = `${req.id}-${i}`\n })\n }\n if (actionPosition === 'first') {\n this.userRequests.unshift(req)\n } else {\n this.userRequests.push(req)\n }\n\n const { id, action, meta } = req\n if (action.kind === 'calls') {\n // @TODO\n // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching\n // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network,\n // and be recalculated when one gets dismissed\n // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise;\n // 4) manage recalc on removeUserRequest too in order to handle EOAs\n // @TODO consider re-using this whole block in removeUserRequest\n await this.#ensureAccountInfo(meta.accountAddr, meta.networkId)\n if (this.signAccOpInitError) {\n return req.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message: this.signAccOpInitError\n })\n )\n }\n\n if (this.#signAccountOpSigningPromise) await this.#signAccountOpSigningPromise\n if (this.#signAccountOpBroadcastPromise) await this.#signAccountOpBroadcastPromise\n\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)!\n const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]\n\n if (isSmartAccount(account)) {\n const network = this.networks.networks.find((n) => n.id === meta.networkId)!\n\n // find me the accountOp for the network if any, it's always 1 for SA\n const currentAccountOpAction = this.actions.actionsQueue.find(\n (a) =>\n a.type === 'accountOp' &&\n a.accountOp.accountAddr === account.addr &&\n a.accountOp.networkId === network.id\n ) as AccountOpAction | undefined\n\n const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(\n account.addr,\n (message) =>\n message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n message.networkId === network.id\n )\n\n const hasAuthorized =\n !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization ||\n !!entryPointAuthorizationMessageFromHistory\n\n if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) {\n await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType)\n this.emitUpdate()\n return\n }\n\n const accountOpAction = makeSmartAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue,\n entryPointAuthorizationSignature:\n entryPointAuthorizationMessageFromHistory?.signature ?? undefined\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n if (this.signAccountOp) {\n if (this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n } else {\n // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation.\n // It's necessary to continue operating with the token `amountPostSimulation` amount.\n this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n const accountOpAction = makeBasicAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequest: req\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n }\n } else {\n let actionType: 'dappRequest' | 'benzin' | 'signMessage' | 'switchAccount' = 'dappRequest'\n\n if (req.action.kind === 'typedMessage' || req.action.kind === 'message') {\n actionType = 'signMessage'\n\n if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) {\n const msgReq = this.userRequests.find((uReq) => uReq.id === id)\n if (!msgReq) return\n msgReq.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message:\n 'Rejected: Please complete your pending message request before initiating a new one.'\n })\n )\n this.userRequests.splice(this.userRequests.indexOf(msgReq), 1)\n return\n }\n }\n if (req.action.kind === 'benzin') actionType = 'benzin'\n if (req.action.kind === 'switchAccount') actionType = 'switchAccount'\n\n this.actions.addOrUpdateAction(\n {\n id,\n type: actionType,\n userRequest: req as UserRequest as never\n },\n actionPosition,\n actionExecutionType\n )\n }\n\n this.emitUpdate()\n }\n\n // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations\n // first one sounds more reasonable\n // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue)\n removeUserRequest(\n id: UserRequest['id'],\n options: {\n shouldRemoveSwapAndBridgeRoute: boolean\n shouldUpdateAccount?: boolean\n shouldOpenNextRequest?: boolean\n } = {\n shouldRemoveSwapAndBridgeRoute: true,\n shouldUpdateAccount: true,\n shouldOpenNextRequest: true\n }\n ) {\n const req = this.userRequests.find((uReq) => uReq.id === id)\n if (!req) return\n\n // remove from the request queue\n this.userRequests.splice(this.userRequests.indexOf(req), 1)\n\n // update the pending stuff to be signed\n const { action, meta } = req\n if (action.kind === 'calls') {\n const network = this.networks.networks.find((net) => net.id === meta.networkId)!\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)\n if (!account)\n throw new Error(\n `batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`\n )\n\n if (isSmartAccount(account)) {\n const accountOpIndex = this.actions.actionsQueue.findIndex(\n (a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`\n )\n const accountOpAction = this.actions.actionsQueue[accountOpIndex] as\n | AccountOpAction\n | undefined\n // accountOp has just been rejected or broadcasted\n if (!accountOpAction) {\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n this.emitUpdate()\n return\n }\n\n accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(\n meta.accountAddr,\n meta.networkId\n )\n if (accountOpAction.accountOp.calls.length) {\n this.actions.addOrUpdateAction(accountOpAction)\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null })\n this.estimateSignAccountOp()\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(\n `${meta.accountAddr}-${meta.networkId}`,\n options.shouldOpenNextRequest\n )\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n } else if (id === ACCOUNT_SWITCH_USER_REQUEST) {\n const requestsToAdd = this.userRequestWaitingAccountSwitch.filter(\n (r) => r.meta.accountAddr === this.selectedAccount.account!.addr\n )\n this.actions.removeAction(\n id,\n this.selectedAccount.account?.addr !== (action as any).params!.switchToAccountAddr\n )\n ;(async () => {\n // eslint-disable-next-line no-restricted-syntax\n for (const r of requestsToAdd) {\n this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1)\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(r)\n }\n })()\n } else {\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n }\n this.emitUpdate()\n }\n\n async addEntryPointAuthorization(\n req: UserRequest,\n network: Network,\n accountState: AccountOnchainState,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (\n this.actions.visibleActionsQueue.find(\n (a) =>\n a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n (a as SignMessageAction).userRequest.meta.networkId === req.meta.networkId\n )\n ) {\n this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return\n }\n\n const typedMessageAction = await getEntryPointAuthorization(\n req.meta.accountAddr,\n network.chainId,\n BigInt(accountState.nonce)\n )\n await this.addUserRequest(\n {\n id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n action: typedMessageAction,\n meta: {\n isSignAction: true,\n accountAddr: req.meta.accountAddr,\n networkId: req.meta.networkId\n },\n session: req.session,\n dappPromise: req?.dappPromise\n ? { reject: req?.dappPromise?.reject, resolve: () => {} }\n : undefined\n } as SignUserRequest,\n 'first',\n actionExecutionType\n )\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.networks.addNetwork(network)\n await this.updateSelectedAccountPortfolio()\n }\n\n async removeNetwork(id: NetworkId) {\n await this.networks.removeNetwork(id)\n this.portfolio.removeNetworkData(id)\n this.defiPositions.removeNetworkData(id)\n this.accountAdder.removeNetworkData(id)\n }\n\n async resolveAccountOpAction(data: any, actionId: AccountOpAction['id']) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp } = accountOpAction as AccountOpAction\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!network) return\n\n const meta: SignUserRequest['meta'] = {\n isSignAction: true,\n accountAddr: accountOp.accountAddr,\n chainId: network.chainId,\n networkId: '',\n txnId: null,\n userOpHash: null\n }\n if (data.submittedAccountOp) {\n // can be undefined, check submittedAccountOp.ts\n meta.txnId = data.submittedAccountOp.txnId\n\n meta.identifiedBy = data.submittedAccountOp.identifiedBy\n meta.submittedAccountOp = data.submittedAccountOp\n }\n\n const benzinUserRequest: SignUserRequest = {\n id: new Date().getTime(),\n action: { kind: 'benzin' },\n meta\n }\n await this.addUserRequest(benzinUserRequest, 'first')\n\n this.actions.removeAction(actionId)\n\n // handle wallet_sendCalls before pollTxnId as 1) it's faster\n // 2) the identifier is different\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const walletSendCallsUserReq = this.userRequests.find(\n (r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls\n )\n if (walletSendCallsUserReq) {\n walletSendCallsUserReq.dappPromise?.resolve({\n hash: getDappIdentifier(data.submittedAccountOp)\n })\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(walletSendCallsUserReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n // Note: this may take a while!\n const txnId = await pollTxnId(\n data.submittedAccountOp.identifiedBy,\n network,\n this.fetch,\n this.callRelayer\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId)\n if (uReq) {\n if (txnId) {\n uReq.dappPromise?.resolve({ hash: txnId })\n } else {\n uReq.dappPromise?.reject(\n ethErrors.rpc.transactionRejected({\n message: 'Transaction rejected by the bundler'\n })\n )\n }\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(uReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n this.emitUpdate()\n }\n\n rejectAccountOpAction(\n err: string,\n actionId: AccountOpAction['id'],\n shouldOpenNextAction: boolean\n ) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp, id } = accountOpAction as AccountOpAction\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(actionId, shouldOpenNextAction)\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n if (call.fromUserRequestId) this.rejectUserRequest(err, call.fromUserRequestId)\n }\n\n this.emitUpdate()\n }\n\n async #updateGasPrice() {\n await this.#initialLoadPromise\n\n // if there's no signAccountOp initialized, we don't want to fetch gas\n const accOp = this.signAccountOp?.accountOp ?? null\n if (!accOp) return undefined\n\n const network = this.networks.networks.find((net) => net.id === accOp.networkId)\n if (!network) return undefined // shouldn't happen\n\n const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr)\n if (!account) return undefined // shouldn't happen\n\n const is4337 = isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[accOp.accountAddr][accOp.networkId]\n )\n const bundler = this.signAccountOp\n ? this.signAccountOp.bundlerSwitcher.getBundler()\n : getDefaultBundler(network)\n const bundlerFetch = async () => {\n if (!is4337) return null\n const errorCallback = (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n }\n return bundler.fetchGasPrices(network, errorCallback).catch((e) => {\n this.emitError({\n level: 'silent',\n message: \"Failed to fetch the bundler's gas price\",\n error: e\n })\n })\n }\n const [gasPriceData, bundlerGas] = await Promise.all([\n getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => {\n this.emitError({\n level: 'major',\n message: `Unable to get gas price for ${network.id}`,\n error: new Error(`Failed to fetch gas price: ${e?.message}`)\n })\n return null\n }),\n bundlerFetch()\n ])\n\n if (gasPriceData && gasPriceData.gasPrice) this.gasPrices[network.id] = gasPriceData.gasPrice\n if (bundlerGas)\n this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }\n\n return {\n blockGasLimit: gasPriceData?.blockGasLimit\n }\n }\n\n async updateSignAccountOpGasPrice() {\n if (!this.signAccountOp) return\n\n const accOp = this.signAccountOp.accountOp\n const gasData = await this.#updateGasPrice()\n\n // there's a chance signAccountOp gets destroyed between the time\n // the first \"if (!this.signAccountOp) return\" is performed and\n // the time we get here. To prevent issues, we check one more time\n if (!this.signAccountOp) return\n\n this.signAccountOp.update({\n gasPrices: this.gasPrices[accOp.networkId],\n bundlerGasPrices: this.bundlerGasPrices[accOp.networkId],\n blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined\n })\n this.emitUpdate()\n }\n\n // @TODO: protect this from race conditions/simultanous executions\n async estimateSignAccountOp() {\n try {\n if (!this.signAccountOp) return\n\n // make a local copy to avoid updating the main reference\n const localAccountOp: AccountOp = { ...this.signAccountOp.accountOp }\n\n await this.#initialLoadPromise\n // new accountOps should have spoof signatures so that they can be easily simulated\n // this is not used by the Estimator, because it iterates through all associatedKeys and\n // it knows which ones are authenticated, and it can generate it's own spoofSig\n // @TODO\n // accountOp.signature = `${}03`\n\n // TODO check if needed data in accountStates are available\n // this.accountStates[accountOp.accountAddr][accountOp.networkId].\n const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr)\n\n // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment.\n // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee.\n //\n // If the current account is an EOA, only this account can pay the fee,\n // and there's no need for checking other EOA accounts native balances.\n // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here.\n //\n // we're excluding the view only accounts from the natives to check\n // in all cases EXCEPT the case where we're making an estimation for\n // the view only account itself. In all other, view only accounts options\n // should not be present as the user cannot pay the fee with them (no key)\n const nativeToCheck = account?.creation\n ? this.accounts.accounts\n .filter(\n (acc) =>\n !isSmartAccount(acc) &&\n (acc.addr === localAccountOp.accountAddr ||\n !getIsViewOnly(this.keystore.keys, acc.associatedKeys))\n )\n .map((acc) => acc.addr)\n : []\n\n if (!account)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`\n )\n const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId)\n if (!network)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`\n )\n\n // Take the fee tokens from two places: the user's tokens and his gasTank\n // The gasTank tokens participate on each network as they belong everywhere\n // NOTE: at some point we should check all the \"?\" signs below and if\n // an error pops out, we should notify the user about it\n const networkFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[\n localAccountOp.networkId\n ]?.result?.feeTokens ?? []\n const gasTankFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result\n ?.tokens ?? []\n\n const feeTokens =\n [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []\n\n // can be read from the UI\n const humanization = humanizeAccountOp(localAccountOp, {})\n humanization.forEach((call: any) => {\n if (!call.fullVisualization) return\n\n call.fullVisualization.forEach(async (visualization: any) => {\n if (visualization.type !== 'address' || !visualization.address) return\n\n await this.domains.reverseLookup(visualization.address)\n })\n })\n\n const additionalHints: GetOptions['additionalErc20Hints'] = humanization\n .map((call: any) =>\n !call.fullVisualization\n ? []\n : call.fullVisualization.map((vis: any) =>\n vis.address && isAddress(vis.address) ? getAddress(vis.address) : ''\n )\n )\n .flat()\n .filter((x: any) => isAddress(x))\n\n this.portfolio.addTokensToBeLearned(additionalHints, network.id)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n this.signAccountOp.accountOp\n )\n\n const [, estimation] = await Promise.all([\n // NOTE: we are not emitting an update here because the portfolio controller will do that\n // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as\n // it may have different needs\n this.portfolio.updateSelectedAccount(\n localAccountOp.accountAddr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate: true }\n ),\n estimate(\n this.providers.providers[localAccountOp.networkId],\n network,\n account,\n localAccountOp,\n this.accounts.accountStates,\n nativeToCheck,\n // @TODO - first time calling this, portfolio is still not loaded.\n feeTokens,\n (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n },\n this.signAccountOp.bundlerSwitcher,\n {\n is4337Broadcast: isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]\n )\n }\n ).catch((e) => {\n const { message } = getHumanReadableEstimationError(e)\n\n this.emitError({\n level: 'major',\n message,\n error: e\n })\n return null\n })\n ])\n\n // @race\n // if the signAccountOp has been deleted, don't continue as the request has already finished\n if (!this.signAccountOp) return\n\n if (estimation) {\n const currentNonceAhead =\n BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n)\n\n // if the nonce from the estimation is bigger than the one in localAccountOp,\n // override the accountState and accountOp with the newly detected nonce\n if (currentNonceAhead) {\n localAccountOp.nonce = BigInt(estimation.currentAccountNonce)\n this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n\n if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId])\n this.accounts.accountStates[localAccountOp.accountAddr][\n localAccountOp.networkId\n ].nonce = localAccountOp.nonce\n }\n\n const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'\n const lastTxn = this.activity.getLastTxn(localAccountOp.networkId)\n const SAHasOldNonceOnARelayerNetwork =\n isSmartAccount(account) &&\n !network.erc4337.enabled &&\n lastTxn &&\n localAccountOp.nonce === lastTxn.nonce &&\n lastTxn.success &&\n lastTxn.status === AccountOpStatus.Success\n\n if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n return\n }\n }\n\n if (\n estimation &&\n estimation.nonFatalErrors &&\n estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') &&\n this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]\n ) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n\n // returning here means estimation will not be set => better UX as\n // the user will not see the warning but instead\n // just wait for the new estimation\n return\n }\n\n // check if an RBF should be applied for the incoming transaction\n // for SA conditions are: take the last broadcast but not confirmed accOp\n // and check if the nonce is the same as the current nonce (non 4337 txns)\n // for EOA: check the last broadcast but not confirmed txn across SA\n // as the EOA could've broadcast a txn there + it's own history and\n // compare the highest found nonce\n const rbfAccountOps: { [key: string]: SubmittedAccountOp | null } = {}\n nativeToCheck.push(localAccountOp.accountAddr)\n nativeToCheck.forEach((accId) => {\n const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId)\n\n // the accountState of the nativeToCheck may no be initialized\n const currentNonce =\n this.accounts.accountStates &&\n this.accounts.accountStates[accId] &&\n this.accounts.accountStates[accId][localAccountOp.networkId]\n ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce\n : null\n\n rbfAccountOps[accId] =\n notConfirmedOp &&\n !notConfirmedOp.gasFeePayment?.isERC4337 &&\n currentNonce &&\n currentNonce === notConfirmedOp.nonce\n ? notConfirmedOp\n : null\n })\n\n // if there's an estimation error, override the pending results\n if (estimation && estimation.error) {\n this.portfolio.overridePendingResults(localAccountOp)\n }\n // update the signAccountOp controller once estimation finishes;\n // this eliminates the infinite loading bug if the estimation comes slower\n if (this.signAccountOp && estimation) {\n this.signAccountOp.update({ estimation, rbfAccountOps })\n }\n } catch (error: any) {\n this.signAccountOp?.calculateWarnings()\n this.emitError({\n level: 'silent',\n message: 'Estimation error',\n error\n })\n }\n }\n\n /**\n * There are 4 ways to broadcast an AccountOp:\n * 1. For basic accounts (EOA), there is only one way to do that. After\n * signing the transaction, the serialized signed transaction object gets\n * send to the network.\n * 2. For smart accounts, when EOA pays the fee. Two signatures are needed\n * for this. The first one is the signature of the AccountOp itself. The\n * second one is the signature of the transaction that will be executed\n * by the smart account.\n * 3. For smart accounts that broadcast the ERC-4337 way.\n * 4. for smart accounts, when the Relayer does the broadcast.\n *\n */\n async #broadcastSignedAccountOp() {\n const accountOp = this.signAccountOp?.accountOp\n const estimation = this.signAccountOp?.estimation\n const actionId = this.signAccountOp?.fromActionId\n const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher\n const contactSupportPrompt = 'Please try again or contact support if the problem persists.'\n\n if (\n !accountOp ||\n !estimation ||\n !actionId ||\n !accountOp.signingKeyAddr ||\n !accountOp.signingKeyType ||\n !accountOp.signature ||\n !bundlerSwitcher\n ) {\n const message = `Missing mandatory transaction details. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const provider = this.providers.providers[accountOp.networkId]\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!provider) {\n const networkName = network?.name || `network with id ${accountOp.networkId}`\n const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!account) {\n const addr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Account with address ${addr} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!network) {\n const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n let transactionRes: {\n txnId?: string\n nonce: number\n identifiedBy: AccountOpIdentifiedBy\n } | null = null\n\n // Basic account (EOA)\n if (!isSmartAccount(account)) {\n try {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`\n return await this.throwBroadcastAccountOp({ message, accountState })\n }\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const gasFeePayment = accountOp.gasFeePayment!\n const { to, value, data } = accountOp.calls[0]\n const rawTxn: TxnRequest = {\n to: to ?? undefined,\n value,\n data,\n chainId: network!.chainId,\n nonce: await provider.getTransactionCount(accountOp.accountAddr),\n gasLimit: gasFeePayment.simulatedGasLimit\n }\n\n // if it's eip1559, send it as such. If no, go to legacy\n if (gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account but EOA pays the fee\n else if (\n account.creation &&\n accountOp.gasFeePayment &&\n accountOp.gasFeePayment.paidBy !== account.addr\n ) {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`\n\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n let data\n let to\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n to = accountOp.accountAddr\n data = ambireAccount.encodeFunctionData('execute', [\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n } else {\n const ambireFactory = new Interface(AmbireFactory.abi)\n to = account.creation.factoryAddr\n data = ambireFactory.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n }\n\n try {\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const rawTxn: TxnRequest = {\n to,\n data,\n // We ultimately do a smart contract call, which means we don't need\n // to send any `value` from the EOA address. The actual `value` will\n // get taken from the value encoded in the `data` field.\n value: BigInt(0),\n chainId: network.chainId,\n nonce: await provider.getTransactionCount(accountOp.gasFeePayment!.paidBy),\n gasLimit: accountOp.gasFeePayment.simulatedGasLimit\n }\n\n if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account, the ERC-4337 way\n else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) {\n const userOperation = accountOp.asUserOperation\n if (!userOperation) {\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n // broadcast through bundler's service\n let userOperationHash\n const bundler = bundlerSwitcher.getBundler()\n try {\n userOperationHash = await bundler.broadcast(userOperation, network)\n } catch (e: any) {\n let retryMsg\n\n // if the signAccountOp is still active (it should be)\n // try to switch the bundler and ask the user to try again\n // TODO: explore more error case where we switch the bundler\n if (this.signAccountOp) {\n const decodedError = bundler.decodeBundlerError(e)\n const humanReadable = getHumanReadableBroadcastError(decodedError)\n const switcher = this.signAccountOp.bundlerSwitcher\n this.signAccountOp.updateStatus(SigningStatus.ReadyToSign)\n\n if (switcher.canSwitch(humanReadable)) {\n switcher.switch()\n this.estimateSignAccountOp()\n this.#updateGasPrice()\n retryMsg = 'Broadcast failed because bundler was down. Please try again'\n }\n }\n\n return this.throwBroadcastAccountOp({\n error: e,\n accountState,\n provider,\n network,\n message: retryMsg\n })\n }\n if (!userOperationHash) {\n return this.throwBroadcastAccountOp({\n message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.'\n })\n }\n\n transactionRes = {\n nonce: Number(userOperation.nonce),\n identifiedBy: {\n type: 'UserOperation',\n identifier: userOperationHash,\n bundler: bundler.getName()\n }\n }\n }\n // Smart account, the Relayer way\n else {\n try {\n const body = {\n gasLimit: Number(accountOp.gasFeePayment!.simulatedGasLimit),\n txns: getSignableCalls(accountOp),\n signature: accountOp.signature,\n signer: { address: accountOp.signingKeyAddr },\n nonce: Number(accountOp.nonce)\n }\n const additionalRelayerNetwork = relayerAdditionalNetworks.find(\n (net) => net.chainId === network.chainId\n )\n const relayerNetworkId = additionalRelayerNetwork\n ? additionalRelayerNetwork.name\n : accountOp.networkId\n const response = await this.callRelayer(\n `/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`,\n 'POST',\n body\n )\n if (!response.success) throw new Error(response.message)\n\n transactionRes = {\n txnId: response.txId,\n nonce: Number(accountOp.nonce),\n identifiedBy: {\n type: 'Relayer',\n identifier: response.id\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true })\n }\n }\n\n if (!transactionRes)\n return this.throwBroadcastAccountOp({\n message: 'No transaction response received after being broadcasted.'\n })\n\n this.portfolio.markSimulationAsBroadcasted(account.addr, network.id)\n\n const submittedAccountOp: SubmittedAccountOp = {\n ...accountOp,\n status: AccountOpStatus.BroadcastedButNotConfirmed,\n txnId: transactionRes.txnId,\n nonce: BigInt(transactionRes.nonce),\n identifiedBy: transactionRes.identifiedBy,\n timestamp: new Date().getTime(),\n isSingletonDeploy: !!accountOp.calls.find(\n (call) => call.to && getAddress(call.to) === SINGLETON\n )\n }\n await this.activity.addAccountOp(submittedAccountOp)\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp)\n await this.resolveAccountOpAction(\n {\n networkId: network.id,\n isUserOp: !!accountOp?.asUserOperation,\n submittedAccountOp\n },\n actionId\n )\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The transaction was successfully signed and broadcasted to the network.'\n })\n return Promise.resolve(submittedAccountOp)\n }\n\n // ! IMPORTANT !\n // Banners that depend on async data from sub-controllers should be implemented\n // in the sub-controllers themselves. This is because updates in the sub-controllers\n // will not trigger emitUpdate in the MainController, therefore the banners will\n // remain the same until a subsequent update in the MainController.\n get banners(): Banner[] {\n if (!this.selectedAccount.account || !this.networks.isInitialized) return []\n\n const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.selectedAccount.account.addr,\n this.swapAndBridge.activeRoutes\n )\n const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter(\n (r) => r.routeStatus === 'ready'\n )\n\n const accountOpBanners = getAccountOpBanners({\n accountOpActionsByNetwork: getAccountOpActionsByNetwork(\n this.selectedAccount.account.addr,\n this.actions.actionsQueue\n ),\n selectedAccount: this.selectedAccount.account.addr,\n accounts: this.accounts.accounts,\n networks: this.networks.networks,\n swapAndBridgeRoutesPendingSignature\n })\n\n return [...accountOpBanners]\n }\n\n // Technically this is an anti-pattern, but it's the only way to\n // test the error handling in the method.\n protected throwBroadcastAccountOp({\n message: humanReadableMessage,\n error: _err,\n accountState,\n isRelayer = false,\n provider = undefined,\n network = undefined\n }: {\n message?: string\n error?: Error\n accountState?: AccountOnchainState\n isRelayer?: boolean\n provider?: RPCProvider\n network?: Network\n }) {\n const originalMessage = _err?.message\n let message = humanReadableMessage\n let isReplacementFeeLow = false\n\n if (originalMessage) {\n if (originalMessage.includes('replacement fee too low')) {\n message =\n 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'\n isReplacementFeeLow = true\n this.estimateSignAccountOp()\n } else if (\n originalMessage.includes('pimlico_getUserOperationGasPrice') ||\n originalMessage.includes('preVerificationGas')\n ) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n } else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) {\n message = `Signer key not supported on this network.${\n !accountState?.isV2\n ? 'You can add/change signers from the web wallet or contact support.'\n : 'Please contact support.'\n }`\n } else if (originalMessage.includes('underpriced')) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n } else if (originalMessage.includes('Failed to fetch') && isRelayer) {\n message =\n 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'\n }\n }\n\n if (!message) {\n message = getHumanReadableBroadcastError(_err || new Error('')).message\n\n // if the message states that the paymaster doesn't have sufficient amount,\n // add it to the failedPaymasters to disable it until a top-up is made\n if (message.includes(insufficientPaymasterFunds) && provider && network) {\n failedPaymasters.addInsufficientFunds(provider, network).then(() => {\n this.estimateSignAccountOp()\n })\n }\n }\n\n // To enable another try for signing in case of broadcast fail\n // broadcast is called in the FE only after successful signing\n this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow)\n this.feePayerKey = null\n\n return Promise.reject(\n new EmittableError({ level: 'major', message, error: _err || new Error(message) })\n )\n }\n\n get isSignRequestStillActive(): boolean {\n if (!this.signAccountOp) return false\n\n return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp!.fromActionId)\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n banners: this.banners,\n isSignRequestStillActive: this.isSignRequestStillActive\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.d.ts b/dist/src/controllers/networks/networks.d.ts new file mode 100644 index 000000000..73ef58595 --- /dev/null +++ b/dist/src/controllers/networks/networks.d.ts @@ -0,0 +1,41 @@ +import { Fetch } from '../../interfaces/fetch'; +import { AddNetworkRequestParams, Network, NetworkId, NetworkInfo, NetworkInfoLoading } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +declare const STATUS_WRAPPED_METHODS: { + readonly addNetwork: "INITIAL"; + readonly updateNetwork: "INITIAL"; +}; +/** + * The NetworksController is responsible for managing networks. It handles both predefined networks and those + * that users can add either through a dApp request or manually via the UI. This controller provides functions + * for adding, updating, and removing networks. + */ +export declare class NetworksController extends EventEmitter { + #private; + statuses: Statuses; + networkToAddOrUpdate: { + chainId: Network['chainId']; + rpcUrl: string; + info?: NetworkInfoLoading; + } | null; + initialLoadPromise: Promise; + constructor(storage: Storage, fetch: Fetch, onAddOrUpdateNetwork: (network: Network) => void, onRemoveNetwork: (id: NetworkId) => void); + get isInitialized(): boolean; + get networks(): Network[]; + setNetworkToAddOrUpdate(networkToAddOrUpdate?: { + chainId: Network['chainId']; + rpcUrl: string; + force4337?: boolean; + } | null): Promise; + addNetwork(network: AddNetworkRequestParams): Promise; + updateNetwork(network: Partial, networkId: NetworkId): Promise; + removeNetwork(id: NetworkId): Promise; + toJSON(): this & { + isInitialized: boolean; + networks: Network[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=networks.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.d.ts.map b/dist/src/controllers/networks/networks.d.ts.map new file mode 100644 index 000000000..d2cf79d42 --- /dev/null +++ b/dist/src/controllers/networks/networks.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../../../src/controllers/networks/networks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EACL,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,WAAW,EACX,kBAAkB,EACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAOlD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAErE,QAAA,MAAM,sBAAsB;;;CAGlB,CAAA;AAEV;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;IAOlD,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;IAEhF,oBAAoB,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAA;KACvC,GAAG,IAAI,CAAO;IAOf,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAG/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EAChD,eAAe,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI;IAW1C,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,QAAQ,IAAI,OAAO,EAAE,CAwBxB;IAiDK,uBAAuB,CAC3B,oBAAoB,GAAE;QACpB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,OAAO,CAAA;KACpB,GAAG,IAAW;IAmEX,UAAU,CAAC,OAAO,EAAE,uBAAuB;IAkG3C,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS;IAI7D,aAAa,CAAC,EAAE,EAAE,SAAS;IAUjC,MAAM;;;;;CAQP"} \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.js b/dist/src/controllers/networks/networks.js new file mode 100644 index 000000000..4a4c93026 --- /dev/null +++ b/dist/src/controllers/networks/networks.js @@ -0,0 +1,239 @@ +import EmittableError from '../../classes/EmittableError'; +import { networks as predefinedNetworks } from '../../consts/networks'; +import { getFeaturesByNetworkProperties, getNetworkInfo, is4337Enabled, migrateNetworkPreferencesToNetworks } from '../../libs/networks/networks'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const STATUS_WRAPPED_METHODS = { + addNetwork: 'INITIAL', + updateNetwork: 'INITIAL' +}; +/** + * The NetworksController is responsible for managing networks. It handles both predefined networks and those + * that users can add either through a dApp request or manually via the UI. This controller provides functions + * for adding, updating, and removing networks. + */ +export class NetworksController extends EventEmitter { + #storage; + #fetch; + #networks = {}; + statuses = STATUS_WRAPPED_METHODS; + networkToAddOrUpdate = null; + #onRemoveNetwork; + #onAddOrUpdateNetwork; + // Holds the initial load promise, so that one can wait until it completes + initialLoadPromise; + constructor(storage, fetch, onAddOrUpdateNetwork, onRemoveNetwork) { + super(); + this.#storage = storage; + this.#fetch = fetch; + this.#onAddOrUpdateNetwork = onAddOrUpdateNetwork; + this.#onRemoveNetwork = onRemoveNetwork; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.initialLoadPromise = this.#load(); + } + get isInitialized() { + return !!Object.keys(this.#networks).length; + } + get networks() { + if (!this.#networks) + return predefinedNetworks; + const uniqueNetworksByChainId = Object.values(this.#networks) + .sort((a, b) => +b.predefined - +a.predefined) // first predefined + .filter((item, index, self) => self.findIndex((i) => i.chainId === item.chainId) === index); // unique by chainId (predefined with priority) + return uniqueNetworksByChainId.map((network) => { + // eslint-disable-next-line no-param-reassign + network.features = getFeaturesByNetworkProperties({ + isSAEnabled: network.isSAEnabled, + isOptimistic: network.isOptimistic ?? false, + rpcNoStateOverride: network.rpcNoStateOverride, + erc4337: network.erc4337, + areContractsDeployed: network.areContractsDeployed, + feeOptions: network.feeOptions, + platformId: network.platformId, + nativeAssetId: network.nativeAssetId, + flagged: network.flagged ?? false, + chainId: network.chainId, + hasSingleton: network.hasSingleton, + force4337: network.force4337 + }); + return network; + }); + } + async #load() { + const storedNetworkPreferences = await this.#storage.get('networkPreferences', undefined); + let storedNetworks; + storedNetworks = await this.#storage.get('networks', {}); + if (!Object.keys(storedNetworks).length && storedNetworkPreferences) { + storedNetworks = await migrateNetworkPreferencesToNetworks(storedNetworkPreferences); + await this.#storage.set('networks', storedNetworks); + await this.#storage.remove('networkPreferences'); + } + this.#networks = storedNetworks; + predefinedNetworks.forEach((n) => { + this.#networks[n.id] = { + ...n, + ...(this.#networks[n.id] || {}), + // attributes that should take predefined priority + feeOptions: n.feeOptions, + hasRelayer: n.hasRelayer, + erc4337: { + enabled: is4337Enabled(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337), + hasPaymaster: n.erc4337.hasPaymaster, + defaultBundler: n.erc4337.defaultBundler, + bundlers: n.erc4337.bundlers + }, + nativeAssetId: n.nativeAssetId, + nativeAssetSymbol: n.nativeAssetSymbol + }; + }); + // add predefined: false for each deleted network from predefined + Object.keys(this.#networks).forEach((networkName) => { + const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === this.#networks[networkName].chainId); + if (!predefinedNetwork) { + this.#networks[networkName].predefined = false; + } + }); + // without await to avoid performance impact on load + // needed to keep the networks storage up to date with the latest from predefinedNetworks + this.#storage.set('networks', this.#networks); + this.emitUpdate(); + } + async setNetworkToAddOrUpdate(networkToAddOrUpdate = null) { + await this.initialLoadPromise; + if (networkToAddOrUpdate) { + this.networkToAddOrUpdate = networkToAddOrUpdate; + this.emitUpdate(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + getNetworkInfo(this.#fetch, networkToAddOrUpdate.rpcUrl, networkToAddOrUpdate.chainId, (info) => { + if (this.networkToAddOrUpdate) { + this.networkToAddOrUpdate = { ...this.networkToAddOrUpdate, info }; + this.emitUpdate(); + } + }, networkToAddOrUpdate.force4337 ? { force4337: networkToAddOrUpdate.force4337 } : undefined); + } + else { + this.networkToAddOrUpdate = null; + this.emitUpdate(); + } + } + async #addNetwork(network) { + await this.initialLoadPromise; + if (!this.networkToAddOrUpdate?.info || + Object.values(this.networkToAddOrUpdate.info).some((prop) => prop === 'LOADING')) { + return; + } + const chainIds = this.networks.map((net) => net.chainId); + const ids = this.networks.map((n) => n.id); + const networkId = network.name.toLowerCase(); + // make sure the id and chainId of the network are unique + if (ids.indexOf(networkId) !== -1 || chainIds.indexOf(BigInt(network.chainId)) !== -1) { + throw new EmittableError({ + message: 'The network you are trying to add has already been added.', + level: 'major', + error: new Error('settings: addNetwork chain already added (duplicate id/chainId)') + }); + } + const info = { ...this.networkToAddOrUpdate.info }; + const { feeOptions } = info; + // @ts-ignore + delete info.feeOptions; + this.#networks[networkId] = { + id: networkId, + ...network, + ...info, + feeOptions, + features: getFeaturesByNetworkProperties(info), + hasRelayer: false, + predefined: false + }; + this.#onAddOrUpdateNetwork(this.#networks[networkId]); + await this.#storage.set('networks', this.#networks); + this.networkToAddOrUpdate = null; + this.emitUpdate(); + } + async addNetwork(network) { + await this.withStatus('addNetwork', () => this.#addNetwork(network)); + } + async #updateNetwork(network, networkId) { + await this.initialLoadPromise; + if (!Object.keys(network).length) + return; + const networkData = this.networks.find((n) => n.id === networkId); + const changedNetwork = Object.keys(network).reduce((acc, key) => { + if (!networkData) + return acc; + // No need to save unchanged networks. Here we filter the networks that are the same as the ones in the storage. + if (network[key] === networkData[key]) + return acc; + return { ...acc, [key]: network[key] }; + }, {}); + // Update the networks with the incoming new values + this.#networks[networkId] = { ...this.#networks[networkId], ...changedNetwork }; + // if force4337 is updated, we have to update the enabled flag as well + if ('force4337' in changedNetwork) { + this.#networks[networkId].erc4337.enabled = is4337Enabled(true, this.#networks[networkId], changedNetwork.force4337); + } + this.#onAddOrUpdateNetwork(this.#networks[networkId]); + await this.#storage.set('networks', this.#networks); + const checkRPC = async (networkToAddOrUpdate) => { + if (changedNetwork.selectedRpcUrl) { + if (networkToAddOrUpdate?.info && + Object.values(networkToAddOrUpdate.info).every((prop) => prop !== 'LOADING')) { + const info = { ...networkToAddOrUpdate.info }; + const { feeOptions } = info; + // eslint-disable-next-line no-param-reassign + delete info.feeOptions; + this.#networks[networkId] = { + ...this.#networks[networkId], + ...info, + ...feeOptions + }; + await this.#storage.set('networks', this.#networks); + this.emitUpdate(); + return; + } + // eslint-disable-next-line @typescript-eslint/no-floating-promises + getNetworkInfo(this.#fetch, changedNetwork.selectedRpcUrl, this.#networks[networkId].chainId, async (info) => { + if (Object.values(info).some((prop) => prop === 'LOADING')) { + return; + } + const { feeOptions } = info; + // eslint-disable-next-line no-param-reassign + delete info.feeOptions; + this.#networks[networkId] = { + ...this.#networks[networkId], + ...info, + ...feeOptions + }; + await this.#storage.set('networks', this.#networks); + this.emitUpdate(); + }); + } + }; + // Do not wait the rpc validation in order to complete the execution of updateNetwork + // eslint-disable-next-line @typescript-eslint/no-floating-promises + checkRPC(this.networkToAddOrUpdate); + this.networkToAddOrUpdate = null; + this.emitUpdate(); + } + async updateNetwork(network, networkId) { + await this.withStatus('updateNetwork', () => this.#updateNetwork(network, networkId)); + } + async removeNetwork(id) { + await this.initialLoadPromise; + if (!this.#networks[id]) + return; + delete this.#networks[id]; + this.#onRemoveNetwork(id); + await this.#storage.set('networks', this.#networks); + this.emitUpdate(); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + isInitialized: this.isInitialized, + networks: this.networks + }; + } +} +//# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.js.map b/dist/src/controllers/networks/networks.js.map new file mode 100644 index 000000000..6593f58fe --- /dev/null +++ b/dist/src/controllers/networks/networks.js.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/controllers/networks/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n AddNetworkRequestParams,\n Network,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getFeaturesByNetworkProperties,\n getNetworkInfo,\n is4337Enabled,\n migrateNetworkPreferencesToNetworks\n} from '../../libs/networks/networks'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst STATUS_WRAPPED_METHODS = {\n addNetwork: 'INITIAL',\n updateNetwork: 'INITIAL'\n} as const\n\n/**\n * The NetworksController is responsible for managing networks. It handles both predefined networks and those\n * that users can add either through a dApp request or manually via the UI. This controller provides functions\n * for adding, updating, and removing networks.\n */\nexport class NetworksController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #networks: { [key: NetworkId]: Network } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n info?: NetworkInfoLoading\n } | null = null\n\n #onRemoveNetwork: (id: NetworkId) => void\n\n #onAddOrUpdateNetwork: (network: Network) => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n onAddOrUpdateNetwork: (network: Network) => void,\n onRemoveNetwork: (id: NetworkId) => void\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#onAddOrUpdateNetwork = onAddOrUpdateNetwork\n this.#onRemoveNetwork = onRemoveNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized(): boolean {\n return !!Object.keys(this.#networks).length\n }\n\n get networks(): Network[] {\n if (!this.#networks) return predefinedNetworks\n\n const uniqueNetworksByChainId = Object.values(this.#networks)\n .sort((a, b) => +b.predefined - +a.predefined) // first predefined\n .filter((item, index, self) => self.findIndex((i) => i.chainId === item.chainId) === index) // unique by chainId (predefined with priority)\n return uniqueNetworksByChainId.map((network) => {\n // eslint-disable-next-line no-param-reassign\n network.features = getFeaturesByNetworkProperties({\n isSAEnabled: network.isSAEnabled,\n isOptimistic: network.isOptimistic ?? false,\n rpcNoStateOverride: network.rpcNoStateOverride,\n erc4337: network.erc4337,\n areContractsDeployed: network.areContractsDeployed,\n feeOptions: network.feeOptions,\n platformId: network.platformId,\n nativeAssetId: network.nativeAssetId,\n flagged: network.flagged ?? false,\n chainId: network.chainId,\n hasSingleton: network.hasSingleton,\n force4337: network.force4337\n })\n return network\n })\n }\n\n async #load() {\n const storedNetworkPreferences: { [key: NetworkId]: Partial } | undefined =\n await this.#storage.get('networkPreferences', undefined)\n let storedNetworks: { [key: NetworkId]: Network }\n storedNetworks = await this.#storage.get('networks', {})\n if (!Object.keys(storedNetworks).length && storedNetworkPreferences) {\n storedNetworks = await migrateNetworkPreferencesToNetworks(storedNetworkPreferences)\n await this.#storage.set('networks', storedNetworks)\n await this.#storage.remove('networkPreferences')\n }\n this.#networks = storedNetworks\n\n predefinedNetworks.forEach((n) => {\n this.#networks[n.id] = {\n ...n, // add the latest structure of the predefined network to include the new props that are not in storage yet\n ...(this.#networks[n.id] || {}), // override with stored props\n // attributes that should take predefined priority\n feeOptions: n.feeOptions,\n hasRelayer: n.hasRelayer,\n erc4337: {\n enabled: is4337Enabled(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337),\n hasPaymaster: n.erc4337.hasPaymaster,\n defaultBundler: n.erc4337.defaultBundler,\n bundlers: n.erc4337.bundlers\n },\n nativeAssetId: n.nativeAssetId,\n nativeAssetSymbol: n.nativeAssetSymbol\n }\n })\n\n // add predefined: false for each deleted network from predefined\n Object.keys(this.#networks).forEach((networkName) => {\n const predefinedNetwork = predefinedNetworks.find(\n (net) => net.chainId === this.#networks[networkName].chainId\n )\n if (!predefinedNetwork) {\n this.#networks[networkName].predefined = false\n }\n })\n\n // without await to avoid performance impact on load\n // needed to keep the networks storage up to date with the latest from predefinedNetworks\n this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n\n async setNetworkToAddOrUpdate(\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n force4337?: boolean\n } | null = null\n ) {\n await this.initialLoadPromise\n if (networkToAddOrUpdate) {\n this.networkToAddOrUpdate = networkToAddOrUpdate\n this.emitUpdate()\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n networkToAddOrUpdate.rpcUrl,\n networkToAddOrUpdate.chainId,\n (info) => {\n if (this.networkToAddOrUpdate) {\n this.networkToAddOrUpdate = { ...this.networkToAddOrUpdate, info }\n this.emitUpdate()\n }\n },\n networkToAddOrUpdate.force4337 ? { force4337: networkToAddOrUpdate.force4337 } : undefined\n )\n } else {\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n }\n\n async #addNetwork(network: AddNetworkRequestParams) {\n await this.initialLoadPromise\n if (\n !this.networkToAddOrUpdate?.info ||\n Object.values(this.networkToAddOrUpdate.info).some((prop) => prop === 'LOADING')\n ) {\n return\n }\n const chainIds = this.networks.map((net) => net.chainId)\n const ids = this.networks.map((n) => n.id)\n const networkId = network.name.toLowerCase()\n\n // make sure the id and chainId of the network are unique\n if (ids.indexOf(networkId) !== -1 || chainIds.indexOf(BigInt(network.chainId)) !== -1) {\n throw new EmittableError({\n message: 'The network you are trying to add has already been added.',\n level: 'major',\n error: new Error('settings: addNetwork chain already added (duplicate id/chainId)')\n })\n }\n\n const info = { ...(this.networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // @ts-ignore\n delete info.feeOptions\n this.#networks[networkId] = {\n id: networkId,\n ...network,\n ...info,\n feeOptions,\n features: getFeaturesByNetworkProperties(info),\n hasRelayer: false,\n predefined: false\n }\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.withStatus('addNetwork', () => this.#addNetwork(network))\n }\n\n async #updateNetwork(network: Partial, networkId: NetworkId) {\n await this.initialLoadPromise\n if (!Object.keys(network).length) return\n\n const networkData = this.networks.find((n) => n.id === networkId)\n const changedNetwork: Network = Object.keys(network).reduce((acc, key) => {\n if (!networkData) return acc\n\n // No need to save unchanged networks. Here we filter the networks that are the same as the ones in the storage.\n if (network[key as keyof Network] === networkData[key as keyof Network]) return acc\n\n return { ...acc, [key]: network[key as keyof Network] }\n }, {} as Network)\n\n // Update the networks with the incoming new values\n this.#networks[networkId] = { ...this.#networks[networkId], ...changedNetwork }\n\n // if force4337 is updated, we have to update the enabled flag as well\n if ('force4337' in changedNetwork) {\n this.#networks[networkId].erc4337.enabled = is4337Enabled(\n true,\n this.#networks[networkId],\n changedNetwork.force4337\n )\n }\n\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n\n const checkRPC = async (\n networkToAddOrUpdate: {\n chainId: bigint\n rpcUrl: string\n info?: NetworkInfoLoading | undefined\n } | null\n ) => {\n if (changedNetwork.selectedRpcUrl) {\n if (\n networkToAddOrUpdate?.info &&\n Object.values(networkToAddOrUpdate.info).every((prop) => prop !== 'LOADING')\n ) {\n const info = { ...(networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...info,\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n changedNetwork.selectedRpcUrl,\n this.#networks[networkId].chainId!,\n async (info) => {\n if (Object.values(info).some((prop) => prop === 'LOADING')) {\n return\n }\n\n const { feeOptions } = info as NetworkInfo\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...(info as NetworkInfo),\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n )\n }\n }\n\n // Do not wait the rpc validation in order to complete the execution of updateNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n checkRPC(this.networkToAddOrUpdate)\n this.networkToAddOrUpdate = null\n\n this.emitUpdate()\n }\n\n async updateNetwork(network: Partial, networkId: NetworkId) {\n await this.withStatus('updateNetwork', () => this.#updateNetwork(network, networkId))\n }\n\n async removeNetwork(id: NetworkId) {\n await this.initialLoadPromise\n if (!this.#networks[id]) return\n\n delete this.#networks[id]\n this.#onRemoveNetwork(id)\n await this.#storage.set('networks', this.#networks)\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized,\n networks: this.networks\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.d.ts b/dist/src/controllers/portfolio/portfolio.d.ts new file mode 100644 index 000000000..012abfc1e --- /dev/null +++ b/dist/src/controllers/portfolio/portfolio.d.ts @@ -0,0 +1,51 @@ +import { Account, AccountId } from '../../interfaces/account'; +import { Fetch } from '../../interfaces/fetch'; +import { Network, NetworkId } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import { AccountOp } from '../../libs/accountOp/accountOp'; +import { Portfolio } from '../../libs/portfolio'; +import { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'; +import { AccountAssetsState, AccountState, GetOptions, TemporaryTokens, TokenResult } from '../../libs/portfolio/interfaces'; +import { AccountsController } from '../accounts/accounts'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +export declare class PortfolioController extends EventEmitter { + #private; + customTokens: CustomToken[]; + tokenPreferences: TokenPreference[]; + validTokens: any; + temporaryTokens: TemporaryTokens; + constructor(storage: Storage, fetch: Fetch, providers: ProvidersController, networks: NetworksController, accounts: AccountsController, relayerUrl: string, velcroUrl: string); + addCustomToken(customToken: CustomToken, selectedAccountAddr?: string, shouldUpdatePortfolio?: boolean): Promise; + removeCustomToken(customToken: Omit, selectedAccountAddr?: string, shouldUpdatePortfolio?: boolean): Promise; + toggleHideToken(tokenPreference: TokenPreference, selectedAccountAddr?: string, shouldUpdatePortfolio?: boolean): Promise; + removeNetworkData(networkId: NetworkId): void; + overridePendingResults(accountOp: AccountOp): void; + updateTokenValidationByStandard(token: { + address: TokenResult['address']; + networkId: TokenResult['networkId']; + }, accountId: AccountId): Promise; + initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network): Portfolio; + getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string): Promise; + protected updatePortfolioState(accountId: string, network: Network, portfolioLib: Portfolio, portfolioProps: Partial & { + blockTag: 'latest' | 'pending'; + }, forceUpdate: boolean): Promise; + updateSelectedAccount(accountId: AccountId, network?: Network, accountOps?: { + [key: string]: AccountOp[]; + }, opts?: { + forceUpdate: boolean; + }): Promise; + markSimulationAsBroadcasted(accountId: string, networkId: string): void; + addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId): boolean; + learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise; + learnNfts(nftsData: [string, bigint[]][] | undefined, networkId: NetworkId): Promise; + removeAccountData(address: Account['addr']): void; + getLatestPortfolioState(accountAddr: string): AccountState; + getPendingPortfolioState(accountAddr: string): AccountState; + getNetworksWithAssets(accountAddr: string): AccountAssetsState; + toJSON(): this & { + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=portfolio.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.d.ts.map b/dist/src/controllers/portfolio/portfolio.d.ts.map new file mode 100644 index 000000000..f587ebe68 --- /dev/null +++ b/dist/src/controllers/portfolio/portfolio.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.js b/dist/src/controllers/portfolio/portfolio.js new file mode 100644 index 000000000..01fdc32ba --- /dev/null +++ b/dist/src/controllers/portfolio/portfolio.js @@ -0,0 +1,651 @@ +import { getAddress, ZeroAddress } from 'ethers'; +import { isSmartAccount } from '../../libs/account/account'; +import { AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'; +import { Portfolio } from '../../libs/portfolio'; +import getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'; +import { getFlags, getPinnedGasTankTokens, getTokensReadyToLearn, getTotal, getUpdatedHints, processTokens, shouldGetAdditionalPortfolio, validateERC20Token } from '../../libs/portfolio/helpers'; +import { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'; +import { relayerCall } from '../../libs/relayerCall/relayerCall'; +import EventEmitter from '../eventEmitter/eventEmitter'; +/* eslint-disable @typescript-eslint/no-shadow */ +const LEARNED_TOKENS_NETWORK_LIMIT = 50; +export class PortfolioController extends EventEmitter { + #latest; + #pending; + // A queue to prevent race conditions when calling `updateSelectedAccount`. + // All calls are queued by network and account. + // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue. + // If a previous call is still running, the new call will be queued and executed only after the first one completes, + // regardless of whether it succeeds or fails. + // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause + // the response of the latest call to be overwritten by a slower previous call. + #queue; + #toBeLearnedTokens; + customTokens = []; + tokenPreferences = []; + validTokens = { erc20: {}, erc721: {} }; + temporaryTokens = {}; + #portfolioLibs; + #storage; + #fetch; + #callRelayer; + #velcroUrl; + #networksWithAssetsByAccounts = {}; + #minUpdateInterval = 20000; // 20 seconds + /** + * Hints stored in storage, divided into three categories: + * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails. + * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing. + * - learnedNfts: Hints of learned NFTs. + */ + #previousHints = { + fromExternalAPI: {}, + learnedTokens: {}, + learnedNfts: {} + }; + #providers; + #networks; + #accounts; + // Holds the initial load promise, so that one can wait until it completes + #initialLoadPromise; + constructor(storage, fetch, providers, networks, accounts, relayerUrl, velcroUrl) { + super(); + this.#latest = {}; + this.#pending = {}; + this.#queue = {}; + this.#portfolioLibs = new Map(); + this.#storage = storage; + this.#fetch = fetch; + this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.#velcroUrl = velcroUrl; + this.#providers = providers; + this.#networks = networks; + this.#accounts = accounts; + this.temporaryTokens = {}; + this.#toBeLearnedTokens = {}; + this.#initialLoadPromise = this.#load(); + } + async #load() { + try { + await this.#networks.initialLoadPromise; + await this.#accounts.initialLoadPromise; + const storageTokenPreferences = await this.#storage.get('tokenPreferences', []); + const storageCustomTokens = await this.#storage.get('customTokens', []); + const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(storageTokenPreferences, storageCustomTokens); + this.tokenPreferences = tokenPreferences; + this.customTokens = customTokens; + if (shouldUpdateStorage) { + await this.#storage.set('tokenPreferences', this.tokenPreferences); + await this.#storage.set('customTokens', this.customTokens); + } + this.#previousHints = await this.#storage.get('previousHints', {}); + const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {}); + const isOldStructure = Object.keys(networksWithAssets).every((key) => Array.isArray(networksWithAssets[key]) && + networksWithAssets[key].every((item) => typeof item === 'string')); + if (!isOldStructure) { + this.#networksWithAssetsByAccounts = networksWithAssets; + } + } + catch (e) { + this.emitError({ + message: 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.', + level: 'major', + error: new Error('portfolio: failed to pull keys from storage') + }); + } + this.emitUpdate(); + } + async #updatePortfolioOnTokenChange(networkId, selectedAccountAddr) { + // As this function currently only updates the portfolio we can skip it altogether + // if skipPortfolioUpdate is set to true + if (!selectedAccountAddr) + return; + const networkData = this.#networks.networks.find(({ id }) => id === networkId); + await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, { + forceUpdate: true + }); + } + async addCustomToken(customToken, selectedAccountAddr, shouldUpdatePortfolio) { + await this.#initialLoadPromise; + const isTokenAlreadyAdded = this.customTokens.some(({ address, networkId }) => address.toLowerCase() === customToken.address.toLowerCase() && + networkId === customToken.networkId); + if (isTokenAlreadyAdded) + return; + this.customTokens.push(customToken); + if (shouldUpdatePortfolio) { + await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr); + } + await this.#storage.set('customTokens', this.customTokens); + } + async removeCustomToken(customToken, selectedAccountAddr, shouldUpdatePortfolio) { + await this.#initialLoadPromise; + this.customTokens = this.customTokens.filter((token) => !(token.address.toLowerCase() === customToken.address.toLowerCase() && + token.networkId === customToken.networkId)); + const existingPreference = this.tokenPreferences.some((pref) => pref.address === customToken.address && pref.networkId === customToken.networkId); + // Delete custom token preference if it exists + if (existingPreference) { + await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio); + await this.#storage.set('customTokens', this.customTokens); + } + else { + this.emitUpdate(); + if (shouldUpdatePortfolio) { + await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr); + } + await this.#storage.set('customTokens', this.customTokens); + } + } + async toggleHideToken(tokenPreference, selectedAccountAddr, shouldUpdatePortfolio) { + await this.#initialLoadPromise; + const existingPreference = this.tokenPreferences.find(({ address, networkId }) => address.toLowerCase() === tokenPreference.address.toLowerCase() && + networkId === tokenPreference.networkId); + // Push the token as hidden + if (!existingPreference) { + this.tokenPreferences.push({ ...tokenPreference, isHidden: true }); + // Remove the token preference if the user decides to show it again + } + else if (existingPreference.isHidden) { + this.tokenPreferences = this.tokenPreferences.filter(({ address, networkId }) => !(address === tokenPreference.address && networkId === tokenPreference.networkId)); + } + else { + // Should happen only after migration + existingPreference.isHidden = !existingPreference.isHidden; + } + this.emitUpdate(); + if (shouldUpdatePortfolio) { + await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr); + } + await this.#storage.set('tokenPreferences', this.tokenPreferences); + } + async #updateNetworksWithAssets(accountId, accountState) { + const storageStateByAccount = this.#networksWithAssetsByAccounts; + this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(accountId, accountState, storageStateByAccount, this.#providers.providers); + this.emitUpdate(); + await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts); + } + #setNetworkLoading(accountId, stateKey, network, isLoading, error) { + const states = { + latest: this.#latest, + pending: this.#pending + }; + const accountState = states[stateKey][accountId]; + if (!accountState[network]) + accountState[network] = { errors: [], isReady: false, isLoading }; + accountState[network].isLoading = isLoading; + if (error) + accountState[network].criticalError = error; + } + removeNetworkData(networkId) { + for (const accountState of [this.#latest, this.#pending]) { + for (const accountId of Object.keys(accountState)) { + delete accountState[accountId][networkId]; + } + } + this.emitUpdate(); + } + // make the pending results the same as the latest ones + overridePendingResults(accountOp) { + if (this.#pending[accountOp.accountAddr] && + this.#pending[accountOp.accountAddr][accountOp.networkId] && + this.#latest[accountOp.accountAddr] && + this.#latest[accountOp.accountAddr][accountOp.networkId]) { + this.#pending[accountOp.accountAddr][accountOp.networkId].result = + this.#latest[accountOp.accountAddr][accountOp.networkId].result; + this.emitUpdate(); + } + } + async updateTokenValidationByStandard(token, accountId) { + await this.#initialLoadPromise; + if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) + return; + const [isValid, standard] = (await validateERC20Token(token, accountId, this.#providers.providers[token.networkId])); + this.validTokens[standard] = { + ...this.validTokens[standard], + [`${token.address}-${token.networkId}`]: isValid + }; + this.emitUpdate(); + } + initializePortfolioLibIfNeeded(accountId, networkId, network) { + const providers = this.#providers.providers; + const key = `${networkId}:${accountId}`; + // Initialize a new Portfolio lib if: + // 1. It does not exist in the portfolioLibs map + // 2. The network RPC URL has changed + if (!this.#portfolioLibs.has(key) || + this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !== + // eslint-disable-next-line no-underscore-dangle + providers[network.id]?._getConnection().url) { + this.#portfolioLibs.set(key, new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)); + } + return this.#portfolioLibs.get(key); + } + async getTemporaryTokens(accountId, networkId, additionalHint) { + const network = this.#networks.networks.find((x) => x.id === networkId); + if (!network) + throw new Error('network not found'); + const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network); + const temporaryTokensToFetch = (this.temporaryTokens[network.id] && + this.temporaryTokens[network.id].result?.tokens.filter((x) => x.address !== additionalHint)) || + []; + this.temporaryTokens[network.id] = { + isLoading: false, + errors: [], + result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result + }; + this.emitUpdate(); + try { + const result = await portfolioLib.get(accountId, { + priceRecency: 60000, + additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)], + disableAutoDiscovery: true + }); + this.temporaryTokens[network.id] = { + isLoading: false, + errors: [], + result: { + tokens: result.tokens + } + }; + this.emitUpdate(); + return true; + } + catch (e) { + this.emitError({ + level: 'silent', + message: "Error while executing the 'get' function in the portfolio library.", + error: e + }); + this.temporaryTokens[network.id].isLoading = false; + this.temporaryTokens[network.id].errors.push(e); + this.emitUpdate(); + return false; + } + } + async #getAdditionalPortfolio(accountId, forceUpdate) { + const rewardsOrGasTankState = this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank; + const canSkipUpdate = rewardsOrGasTankState + ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate) + : false; + if (canSkipUpdate) + return; + const hasNonZeroTokens = !!Object.values(this.#networksWithAssetsByAccounts?.[accountId] || {}).some(Boolean); + const start = Date.now(); + const accountState = this.#latest[accountId]; + this.#setNetworkLoading(accountId, 'latest', 'gasTank', true); + this.#setNetworkLoading(accountId, 'latest', 'rewards', true); + this.emitUpdate(); + let res; + try { + res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`); + } + catch (e) { + console.error('relayer error for portfolio additional'); + this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e); + this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e); + this.emitUpdate(); + return; + } + if (!res) + throw new Error('portfolio controller: no res, should never happen'); + const rewardsTokens = [ + res.data.rewards.xWalletClaimableBalance || [], + res.data.rewards.walletClaimableBalance || [] + ] + .flat() + .map((t) => ({ + ...t, + symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol, + flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address) + })); + accountState.rewards = { + isReady: true, + isLoading: false, + errors: [], + result: { + ...res.data.rewards, + lastSuccessfulUpdate: Date.now(), + updateStarted: start, + tokens: rewardsTokens, + total: getTotal(rewardsTokens) + } + }; + const gasTankTokens = res.data.gasTank.balance.map((t) => ({ + ...t, + flags: getFlags(res.data, 'gasTank', t.networkId, t.address) + })); + accountState.gasTank = { + isReady: true, + isLoading: false, + errors: [], + result: { + updateStarted: start, + lastSuccessfulUpdate: Date.now(), + tokens: [ + ...gasTankTokens, + ...getPinnedGasTankTokens(res.data.gasTank.availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) + ], + total: getTotal(gasTankTokens) + } + }; + this.emitUpdate(); + } + #getCanSkipUpdate(networkState, forceUpdate) { + const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical'); + if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors) + return false; + const updateStarted = networkState.result?.updateStarted || 0; + const isWithinMinUpdateInterval = !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval; + return isWithinMinUpdateInterval || networkState.isLoading; + } + // By our convention, we always stick with private (#) instead of protected methods. + // However, we made a compromise here to allow Jest tests to mock updatePortfolioState. + async updatePortfolioState(accountId, network, portfolioLib, portfolioProps, forceUpdate) { + const blockTag = portfolioProps.blockTag; + const stateKeys = { + latest: this.#latest, + pending: this.#pending + }; + const accountState = stateKeys[blockTag][accountId]; + if (!accountState[network.id]) { + // isLoading must be false here, otherwise canSkipUpdate will return true + // and portfolio will not be updated + accountState[network.id] = { isLoading: false, isReady: false, errors: [] }; + } + const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate); + if (canSkipUpdate) + return false; + this.#setNetworkLoading(accountId, blockTag, network.id, true); + this.emitUpdate(); + const state = accountState[network.id]; + const hasNonZeroTokens = !!Object.values(this.#networksWithAssetsByAccounts?.[accountId] || {}).some(Boolean); + try { + const result = await portfolioLib.get(accountId, { + priceRecency: 60000, + priceCache: state.result?.priceCache, + fetchPinned: !hasNonZeroTokens, + ...portfolioProps + }); + const hasCriticalError = result.errors.some((e) => e.level === 'critical'); + const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []; + let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0; + // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user + // is likely expecting a change in the portfolio. + if (forceUpdate && hasCriticalError) { + lastSuccessfulUpdate = 0; + } + else if (!hasCriticalError) { + // Update the last successful update only if there are no critical errors. + lastSuccessfulUpdate = Date.now(); + } + const processedTokens = processTokens(result.tokens, network, hasNonZeroTokens, additionalHintsErc20Hints, this.tokenPreferences); + accountState[network.id] = { + isReady: true, + isLoading: false, + errors: result.errors, + result: { + ...result, + lastSuccessfulUpdate, + tokens: processedTokens, + total: getTotal(processedTokens) + } + }; + this.emitUpdate(); + return true; + } + catch (e) { + this.emitError({ + level: 'silent', + message: "Error while executing the 'get' function in the portfolio library.", + error: e + }); + state.isLoading = false; + state.criticalError = e; + if (forceUpdate && state.result) { + // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user + // is likely expecting a change in the portfolio. + state.result.lastSuccessfulUpdate = 0; + } + this.emitUpdate(); + return false; + } + } + // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this + // controller doesn't have to update this controller every time that those are updated + // The recommended behavior of the application that this API encourages is: + // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount + // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a + // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance + // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks + // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations) + // the purpose of this function is to call it when an account is selected or the queue of accountOps changes + async updateSelectedAccount(accountId, network, accountOps, opts) { + await this.#initialLoadPromise; + const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId); + if (!selectedAccount) + throw new Error('selected account does not exist'); + if (!this.#latest[accountId]) + this.#latest[accountId] = {}; + if (!this.#pending[accountId]) + this.#pending[accountId] = {}; + const accountState = this.#latest[accountId]; + const pendingState = this.#pending[accountId]; + if (shouldGetAdditionalPortfolio(selectedAccount)) { + this.#getAdditionalPortfolio(accountId, opts?.forceUpdate); + } + const networks = network ? [network] : this.#networks.networks; + await Promise.all(networks.map(async (network) => { + const key = `${network.id}:${accountId}`; + const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network); + const currentAccountOps = accountOps?.[network.id]?.filter((op) => op.accountAddr === accountId); + const simulatedAccountOps = pendingState[network.id]?.accountOps; + if (!this.#queue?.[accountId]?.[network.id]) + this.#queue[accountId] = { + ...this.#queue[accountId], + [network.id]: Promise.resolve() + }; + const updatePromise = async () => { + // We are performing the following extended check because both (or one of both) variables may have an undefined value. + // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent. + // However, when one of the variables is not set, two cases arise: + // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object. + // 2. No change occurs if both variables are undefined. + const areAccountOpsChanged = currentAccountOps && simulatedAccountOps + ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps) + : currentAccountOps !== simulatedAccountOps; + const forceUpdate = opts?.forceUpdate || areAccountOpsChanged; + const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]; + const additionalErc20Hints = [ + ...Object.keys((this.#previousHints?.learnedTokens && + this.#previousHints?.learnedTokens[network.id]) ?? + {}), + ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []), + ...this.customTokens + .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20') + .map(({ address }) => address) + ]; + // TODO: Add custom ERC721 tokens to the hints + const additionalErc721Hints = Object.fromEntries(Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [ + getAddress(k), + { isKnown: false, tokens: v.map((i) => i.toString()) } + ])); + const allHints = { + previousHintsFromExternalAPI, + additionalErc20Hints, + additionalErc721Hints + }; + const [isSuccessfulLatestUpdate] = await Promise.all([ + // Latest state update + this.updatePortfolioState(accountId, network, portfolioLib, { + blockTag: 'latest', + ...allHints + }, forceUpdate), + this.updatePortfolioState(accountId, network, portfolioLib, { + blockTag: 'pending', + ...(currentAccountOps && { + simulation: { + account: selectedAccount, + accountOps: currentAccountOps + } + }), + isEOA: !isSmartAccount(selectedAccount), + ...allHints + }, forceUpdate) + ]); + // Persist latest state in previousHints in the disk storage for further requests + if (isSuccessfulLatestUpdate && + !areAccountOpsChanged && + accountState[network.id]?.result) { + const networkResult = accountState[network.id].result; + const readyToLearnTokens = getTokensReadyToLearn(this.#toBeLearnedTokens[network.id], networkResult.tokens); + if (readyToLearnTokens.length) { + await this.learnTokens(readyToLearnTokens, network.id); + } + // Either a valid response or there is no external API to fetch hints from + const isExternalHintsApiResponseValid = !!networkResult?.hintsFromExternalAPI || !network.hasRelayer; + if (isExternalHintsApiResponseValid) { + const updatedStoragePreviousHints = getUpdatedHints(networkResult.hintsFromExternalAPI || null, networkResult.tokens, networkResult.tokenErrors, network.id, this.#previousHints, key, this.customTokens); + // Updating hints is only needed when the external API response is valid. + // learnTokens and learnNfts update storage separately, so we don't need to update them here + // if the external API response is invalid. + this.#previousHints = updatedStoragePreviousHints; + await this.#storage.set('previousHints', updatedStoragePreviousHints); + } + } + // We cache the previously simulated AccountOps + // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState. + // This allows us to identify any differences between the two. + if (currentAccountOps) { + pendingState[network.id].accountOps = currentAccountOps; + } + }; + // Chain the new updatePromise to the current queue + this.#queue[accountId][network.id] = this.#queue[accountId][network.id] + .then(updatePromise) + .catch(() => updatePromise()); + // Ensure the method waits for the entire queue to resolve + await this.#queue[accountId][network.id]; + })); + await this.#updateNetworksWithAssets(accountId, accountState); + this.emitUpdate(); + } + markSimulationAsBroadcasted(accountId, networkId) { + const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]; + if (!simulation) + return; + simulation.status = AccountOpStatus.BroadcastedButNotConfirmed; + this.emitUpdate(); + } + addTokensToBeLearned(tokenAddresses, networkId) { + if (!tokenAddresses.length) + return false; + if (!this.#toBeLearnedTokens[networkId]) + this.#toBeLearnedTokens[networkId] = []; + let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]; + const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr)); + const tokensToLearn = tokenAddresses.filter((address) => { + let normalizedAddress; + try { + normalizedAddress = getAddress(address); + } + catch (e) { + console.error('Error while normalizing token address', e); + } + return normalizedAddress && !alreadyLearned.includes(normalizedAddress); + }); + if (!tokensToLearn.length) + return false; + networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]; + this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens; + return true; + } + // Learn new tokens from humanizer and debug_traceCall + // return: whether new tokens have been learned + async learnTokens(tokenAddresses, networkId) { + if (!tokenAddresses) + return false; + if (!this.#previousHints.learnedTokens) + this.#previousHints.learnedTokens = {}; + let networkLearnedTokens = this.#previousHints.learnedTokens[networkId] || {}; + const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr)); + const tokensToLearn = tokenAddresses.reduce((acc, address) => { + if (address === ZeroAddress) + return acc; + if (alreadyLearned.includes(getAddress(address))) + return acc; + acc[address] = acc[address] || null; // Keep the timestamp of all learned tokens + return acc; + }, {}); + if (!Object.keys(tokensToLearn).length) + return false; + // Add new tokens in the beginning of the list + networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }; + // Reached limit + if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) { + // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order. + // This ensures that tokens with the most recent timestamps are prioritized for retention, + // and tokens with the oldest timestamps are deleted last when the limit is exceeded. + const learnedTokensArray = Object.entries(networkLearnedTokens).sort((a, b) => Number(b[1]) - Number(a[1])); + networkLearnedTokens = Object.fromEntries(learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)); + } + this.#previousHints.learnedTokens[networkId] = networkLearnedTokens; + await this.#storage.set('previousHints', this.#previousHints); + return true; + } + async learnNfts(nftsData, networkId) { + if (!nftsData?.length) + return false; + if (!this.#previousHints.learnedNfts) + this.#previousHints.learnedNfts = {}; + const networkLearnedNfts = this.#previousHints.learnedNfts[networkId] || {}; + const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat(); + const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts) + .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)) + .flat(); + if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) + return false; + nftsData.forEach(([addr, ids]) => { + if (addr === ZeroAddress) + return; + if (!networkLearnedNfts[addr]) + networkLearnedNfts[addr] = ids; + else + networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]])); + }); + this.#previousHints.learnedNfts[networkId] = networkLearnedNfts; + await this.#storage.set('previousHints', this.#previousHints); + return true; + } + removeAccountData(address) { + delete this.#latest[address]; + delete this.#pending[address]; + delete this.#networksWithAssetsByAccounts[address]; + this.#networks.networks.forEach((network) => { + const key = `${network.id}:${address}`; + if (key in this.#previousHints.fromExternalAPI) { + delete this.#previousHints.fromExternalAPI[key]; + } + if (key in this.#portfolioLibs) { + this.#portfolioLibs.delete(key); + } + }); + this.#storage.set('previousHints', this.#previousHints); + this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts); + this.emitUpdate(); + } + getLatestPortfolioState(accountAddr) { + return this.#latest[accountAddr] || {}; + } + getPendingPortfolioState(accountAddr) { + return this.#pending[accountAddr] || {}; + } + getNetworksWithAssets(accountAddr) { + return this.#networksWithAssetsByAccounts[accountAddr] || []; + } + toJSON() { + return { + ...this, + ...super.toJSON() + }; + } +} +//# sourceMappingURL=portfolio.js.map \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.js.map b/dist/src/controllers/portfolio/portfolio.js.map new file mode 100644 index 000000000..7b3cfe057 --- /dev/null +++ b/dist/src/controllers/portfolio/portfolio.js.map @@ -0,0 +1 @@ +{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, ZeroAddress } from 'ethers'\n\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network, NetworkId } from '../../interfaces/network'\n/* eslint-disable @typescript-eslint/no-shadow */\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'\nimport { Portfolio } from '../../libs/portfolio'\n/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'\nimport getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'\nimport {\n getFlags,\n getPinnedGasTankTokens,\n getTokensReadyToLearn,\n getTotal,\n getUpdatedHints,\n processTokens,\n shouldGetAdditionalPortfolio,\n validateERC20Token\n} from '../../libs/portfolio/helpers'\n/* eslint-disable no-restricted-syntax */\n// eslint-disable-next-line import/no-cycle\nimport {\n AccountAssetsState,\n AccountState,\n GetOptions,\n NetworkState,\n PortfolioControllerState,\n PreviousHintsStorage,\n TemporaryTokens,\n TokenResult\n} from '../../libs/portfolio/interfaces'\nimport { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\n/* eslint-disable @typescript-eslint/no-shadow */\n\nconst LEARNED_TOKENS_NETWORK_LIMIT = 50\n\nexport class PortfolioController extends EventEmitter {\n #latest: PortfolioControllerState\n\n #pending: PortfolioControllerState\n\n // A queue to prevent race conditions when calling `updateSelectedAccount`.\n // All calls are queued by network and account.\n // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue.\n // If a previous call is still running, the new call will be queued and executed only after the first one completes,\n // regardless of whether it succeeds or fails.\n // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause\n // the response of the latest call to be overwritten by a slower previous call.\n #queue: {\n [accountId: string]: {\n [networkId: NetworkId]: Promise\n }\n }\n\n #toBeLearnedTokens: { [network in NetworkId]: string[] }\n\n customTokens: CustomToken[] = []\n\n tokenPreferences: TokenPreference[] = []\n\n validTokens: any = { erc20: {}, erc721: {} }\n\n temporaryTokens: TemporaryTokens = {}\n\n #portfolioLibs: Map\n\n #storage: Storage\n\n #fetch: Fetch\n\n #callRelayer: Function\n\n #velcroUrl: string\n\n #networksWithAssetsByAccounts: {\n [accountId: string]: AccountAssetsState\n } = {}\n\n #minUpdateInterval: number = 20000 // 20 seconds\n\n /**\n * Hints stored in storage, divided into three categories:\n * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails.\n * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing.\n * - learnedNfts: Hints of learned NFTs.\n */\n #previousHints: PreviousHintsStorage = {\n fromExternalAPI: {},\n learnedTokens: {},\n learnedNfts: {}\n }\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #accounts: AccountsController\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n relayerUrl: string,\n velcroUrl: string\n ) {\n super()\n this.#latest = {}\n this.#pending = {}\n this.#queue = {}\n this.#portfolioLibs = new Map()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#velcroUrl = velcroUrl\n this.#providers = providers\n this.#networks = networks\n this.#accounts = accounts\n this.temporaryTokens = {}\n this.#toBeLearnedTokens = {}\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n await this.#networks.initialLoadPromise\n await this.#accounts.initialLoadPromise\n const storageTokenPreferences = await this.#storage.get('tokenPreferences', [])\n const storageCustomTokens = await this.#storage.get('customTokens', [])\n\n const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(\n storageTokenPreferences,\n storageCustomTokens\n )\n\n this.tokenPreferences = tokenPreferences\n this.customTokens = customTokens\n\n if (shouldUpdateStorage) {\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n this.#previousHints = await this.#storage.get('previousHints', {})\n const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {})\n const isOldStructure = Object.keys(networksWithAssets).every(\n (key) =>\n Array.isArray(networksWithAssets[key]) &&\n networksWithAssets[key].every((item: any) => typeof item === 'string')\n )\n if (!isOldStructure) {\n this.#networksWithAssetsByAccounts = networksWithAssets\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('portfolio: failed to pull keys from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n async #updatePortfolioOnTokenChange(networkId: NetworkId, selectedAccountAddr?: string) {\n // As this function currently only updates the portfolio we can skip it altogether\n // if skipPortfolioUpdate is set to true\n if (!selectedAccountAddr) return\n\n const networkData = this.#networks.networks.find(({ id }) => id === networkId)\n await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, {\n forceUpdate: true\n })\n }\n\n async addCustomToken(\n customToken: CustomToken,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n const isTokenAlreadyAdded = this.customTokens.some(\n ({ address, networkId }) =>\n address.toLowerCase() === customToken.address.toLowerCase() &&\n networkId === customToken.networkId\n )\n\n if (isTokenAlreadyAdded) return\n\n this.customTokens.push(customToken)\n\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n async removeCustomToken(\n customToken: Omit,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n this.customTokens = this.customTokens.filter(\n (token) =>\n !(\n token.address.toLowerCase() === customToken.address.toLowerCase() &&\n token.networkId === customToken.networkId\n )\n )\n const existingPreference = this.tokenPreferences.some(\n (pref) => pref.address === customToken.address && pref.networkId === customToken.networkId\n )\n\n // Delete custom token preference if it exists\n if (existingPreference) {\n await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio)\n await this.#storage.set('customTokens', this.customTokens)\n } else {\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n await this.#storage.set('customTokens', this.customTokens)\n }\n }\n\n async toggleHideToken(\n tokenPreference: TokenPreference,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n\n const existingPreference = this.tokenPreferences.find(\n ({ address, networkId }) =>\n address.toLowerCase() === tokenPreference.address.toLowerCase() &&\n networkId === tokenPreference.networkId\n )\n\n // Push the token as hidden\n if (!existingPreference) {\n this.tokenPreferences.push({ ...tokenPreference, isHidden: true })\n // Remove the token preference if the user decides to show it again\n } else if (existingPreference.isHidden) {\n this.tokenPreferences = this.tokenPreferences.filter(\n ({ address, networkId }) =>\n !(address === tokenPreference.address && networkId === tokenPreference.networkId)\n )\n } else {\n // Should happen only after migration\n existingPreference.isHidden = !existingPreference.isHidden\n }\n\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr)\n }\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n }\n\n async #updateNetworksWithAssets(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = this.#networksWithAssetsByAccounts\n\n this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n }\n\n #setNetworkLoading(\n accountId: AccountId,\n stateKey: 'latest' | 'pending',\n network: string,\n isLoading: boolean,\n error?: any\n ) {\n const states = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = states[stateKey][accountId]\n if (!accountState[network]) accountState[network] = { errors: [], isReady: false, isLoading }\n accountState[network]!.isLoading = isLoading\n if (error) accountState[network]!.criticalError = error\n }\n\n removeNetworkData(networkId: NetworkId) {\n for (const accountState of [this.#latest, this.#pending]) {\n for (const accountId of Object.keys(accountState)) {\n delete accountState[accountId][networkId]\n }\n }\n this.emitUpdate()\n }\n\n // make the pending results the same as the latest ones\n overridePendingResults(accountOp: AccountOp) {\n if (\n this.#pending[accountOp.accountAddr] &&\n this.#pending[accountOp.accountAddr][accountOp.networkId] &&\n this.#latest[accountOp.accountAddr] &&\n this.#latest[accountOp.accountAddr][accountOp.networkId]\n ) {\n this.#pending[accountOp.accountAddr][accountOp.networkId]!.result =\n this.#latest[accountOp.accountAddr][accountOp.networkId]!.result\n this.emitUpdate()\n }\n }\n\n async updateTokenValidationByStandard(\n token: { address: TokenResult['address']; networkId: TokenResult['networkId'] },\n accountId: AccountId\n ) {\n await this.#initialLoadPromise\n if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return\n\n const [isValid, standard]: [boolean, string] = (await validateERC20Token(\n token,\n accountId,\n this.#providers.providers[token.networkId]\n )) as [boolean, string]\n\n this.validTokens[standard] = {\n ...this.validTokens[standard],\n [`${token.address}-${token.networkId}`]: isValid\n }\n\n this.emitUpdate()\n }\n\n initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network) {\n const providers = this.#providers.providers\n const key = `${networkId}:${accountId}`\n // Initialize a new Portfolio lib if:\n // 1. It does not exist in the portfolioLibs map\n // 2. The network RPC URL has changed\n if (\n !this.#portfolioLibs.has(key) ||\n this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !==\n // eslint-disable-next-line no-underscore-dangle\n providers[network.id]?._getConnection().url\n ) {\n this.#portfolioLibs.set(\n key,\n new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)\n )\n }\n return this.#portfolioLibs.get(key)!\n }\n\n async getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string) {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n\n if (!network) throw new Error('network not found')\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network)\n\n const temporaryTokensToFetch =\n (this.temporaryTokens[network.id] &&\n this.temporaryTokens[network.id].result?.tokens.filter(\n (x) => x.address !== additionalHint\n )) ||\n []\n\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result\n }\n this.emitUpdate()\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)],\n disableAutoDiscovery: true\n })\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: {\n tokens: result.tokens\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n this.temporaryTokens[network.id].isLoading = false\n this.temporaryTokens[network.id].errors.push(e)\n this.emitUpdate()\n return false\n }\n }\n\n async #getAdditionalPortfolio(accountId: AccountId, forceUpdate?: boolean) {\n const rewardsOrGasTankState =\n this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank\n const canSkipUpdate = rewardsOrGasTankState\n ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate)\n : false\n\n if (canSkipUpdate) return\n\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n const start = Date.now()\n const accountState = this.#latest[accountId]\n\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', true)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', true)\n this.emitUpdate()\n\n let res: any\n try {\n res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`)\n } catch (e: any) {\n console.error('relayer error for portfolio additional')\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e)\n this.emitUpdate()\n return\n }\n\n if (!res) throw new Error('portfolio controller: no res, should never happen')\n\n const rewardsTokens = [\n res.data.rewards.xWalletClaimableBalance || [],\n res.data.rewards.walletClaimableBalance || []\n ]\n .flat()\n .map((t: any) => ({\n ...t,\n symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol,\n flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address)\n }))\n\n accountState.rewards = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n ...res.data.rewards,\n lastSuccessfulUpdate: Date.now(),\n updateStarted: start,\n tokens: rewardsTokens,\n total: getTotal(rewardsTokens)\n }\n }\n\n const gasTankTokens = res.data.gasTank.balance.map((t: any) => ({\n ...t,\n flags: getFlags(res.data, 'gasTank', t.networkId, t.address)\n }))\n\n accountState.gasTank = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n updateStarted: start,\n lastSuccessfulUpdate: Date.now(),\n tokens: [\n ...gasTankTokens,\n ...getPinnedGasTankTokens(\n res.data.gasTank.availableGasTankAssets,\n hasNonZeroTokens,\n accountId,\n gasTankTokens\n )\n ],\n total: getTotal(gasTankTokens)\n }\n }\n\n this.emitUpdate()\n }\n\n #getCanSkipUpdate(networkState?: NetworkState, forceUpdate?: boolean) {\n const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical')\n\n if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors)\n return false\n const updateStarted = networkState.result?.updateStarted || 0\n const isWithinMinUpdateInterval =\n !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n // By our convention, we always stick with private (#) instead of protected methods.\n // However, we made a compromise here to allow Jest tests to mock updatePortfolioState.\n protected async updatePortfolioState(\n accountId: string,\n network: Network,\n portfolioLib: Portfolio,\n portfolioProps: Partial & { blockTag: 'latest' | 'pending' },\n forceUpdate: boolean\n ): Promise {\n const blockTag = portfolioProps.blockTag\n const stateKeys = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = stateKeys[blockTag][accountId]\n if (!accountState[network.id]) {\n // isLoading must be false here, otherwise canSkipUpdate will return true\n // and portfolio will not be updated\n accountState[network.id] = { isLoading: false, isReady: false, errors: [] }\n }\n const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate)\n\n if (canSkipUpdate) return false\n\n this.#setNetworkLoading(accountId, blockTag, network.id, true)\n this.emitUpdate()\n\n const state = accountState[network.id]!\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n priceCache: state.result?.priceCache,\n fetchPinned: !hasNonZeroTokens,\n ...portfolioProps\n })\n\n const hasCriticalError = result.errors.some((e) => e.level === 'critical')\n const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []\n let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0\n\n // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user\n // is likely expecting a change in the portfolio.\n if (forceUpdate && hasCriticalError) {\n lastSuccessfulUpdate = 0\n } else if (!hasCriticalError) {\n // Update the last successful update only if there are no critical errors.\n lastSuccessfulUpdate = Date.now()\n }\n\n const processedTokens = processTokens(\n result.tokens,\n network,\n hasNonZeroTokens,\n additionalHintsErc20Hints,\n this.tokenPreferences\n )\n\n accountState[network.id] = {\n isReady: true,\n isLoading: false,\n errors: result.errors,\n result: {\n ...result,\n lastSuccessfulUpdate,\n tokens: processedTokens,\n total: getTotal(processedTokens)\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n state.isLoading = false\n state.criticalError = e\n if (forceUpdate && state.result) {\n // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user\n // is likely expecting a change in the portfolio.\n state.result.lastSuccessfulUpdate = 0\n }\n this.emitUpdate()\n\n return false\n }\n }\n\n // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this\n // controller doesn't have to update this controller every time that those are updated\n\n // The recommended behavior of the application that this API encourages is:\n // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount\n // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a\n // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance\n // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks\n // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations)\n\n // the purpose of this function is to call it when an account is selected or the queue of accountOps changes\n async updateSelectedAccount(\n accountId: AccountId,\n network?: Network,\n accountOps?: { [key: string]: AccountOp[] },\n opts?: { forceUpdate: boolean }\n ) {\n await this.#initialLoadPromise\n const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId)\n if (!selectedAccount) throw new Error('selected account does not exist')\n if (!this.#latest[accountId]) this.#latest[accountId] = {}\n if (!this.#pending[accountId]) this.#pending[accountId] = {}\n\n const accountState = this.#latest[accountId]\n const pendingState = this.#pending[accountId]\n\n if (shouldGetAdditionalPortfolio(selectedAccount)) {\n this.#getAdditionalPortfolio(accountId, opts?.forceUpdate)\n }\n\n const networks = network ? [network] : this.#networks.networks\n await Promise.all(\n networks.map(async (network) => {\n const key = `${network.id}:${accountId}`\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network)\n\n const currentAccountOps = accountOps?.[network.id]?.filter(\n (op) => op.accountAddr === accountId\n )\n const simulatedAccountOps = pendingState[network.id]?.accountOps\n\n if (!this.#queue?.[accountId]?.[network.id])\n this.#queue[accountId] = {\n ...this.#queue[accountId],\n [network.id]: Promise.resolve()\n }\n\n const updatePromise = async (): Promise => {\n // We are performing the following extended check because both (or one of both) variables may have an undefined value.\n // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent.\n // However, when one of the variables is not set, two cases arise:\n // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object.\n // 2. No change occurs if both variables are undefined.\n const areAccountOpsChanged =\n currentAccountOps && simulatedAccountOps\n ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps)\n : currentAccountOps !== simulatedAccountOps\n const forceUpdate = opts?.forceUpdate || areAccountOpsChanged\n\n const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]\n\n const additionalErc20Hints = [\n ...Object.keys(\n (this.#previousHints?.learnedTokens &&\n this.#previousHints?.learnedTokens[network.id]) ??\n {}\n ),\n ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []),\n ...this.customTokens\n .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20')\n .map(({ address }) => address)\n ]\n // TODO: Add custom ERC721 tokens to the hints\n const additionalErc721Hints = Object.fromEntries(\n Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [\n getAddress(k),\n { isKnown: false, tokens: v.map((i) => i.toString()) }\n ])\n )\n const allHints = {\n previousHintsFromExternalAPI,\n additionalErc20Hints,\n additionalErc721Hints\n }\n\n const [isSuccessfulLatestUpdate] = await Promise.all([\n // Latest state update\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'latest',\n ...allHints\n },\n forceUpdate\n ),\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'pending',\n ...(currentAccountOps && {\n simulation: {\n account: selectedAccount,\n accountOps: currentAccountOps\n }\n }),\n isEOA: !isSmartAccount(selectedAccount),\n ...allHints\n },\n forceUpdate\n )\n ])\n\n // Persist latest state in previousHints in the disk storage for further requests\n if (\n isSuccessfulLatestUpdate &&\n !areAccountOpsChanged &&\n accountState[network.id]?.result\n ) {\n const networkResult = accountState[network.id]!.result\n const readyToLearnTokens = getTokensReadyToLearn(\n this.#toBeLearnedTokens[network.id],\n networkResult!.tokens\n )\n\n if (readyToLearnTokens.length) {\n await this.learnTokens(readyToLearnTokens, network.id)\n }\n\n // Either a valid response or there is no external API to fetch hints from\n const isExternalHintsApiResponseValid =\n !!networkResult?.hintsFromExternalAPI || !network.hasRelayer\n\n if (isExternalHintsApiResponseValid) {\n const updatedStoragePreviousHints = getUpdatedHints(\n networkResult!.hintsFromExternalAPI || null,\n networkResult!.tokens,\n networkResult!.tokenErrors,\n network.id,\n this.#previousHints,\n key,\n this.customTokens\n )\n\n // Updating hints is only needed when the external API response is valid.\n // learnTokens and learnNfts update storage separately, so we don't need to update them here\n // if the external API response is invalid.\n this.#previousHints = updatedStoragePreviousHints\n await this.#storage.set('previousHints', updatedStoragePreviousHints)\n }\n }\n\n // We cache the previously simulated AccountOps\n // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState.\n // This allows us to identify any differences between the two.\n if (currentAccountOps) {\n pendingState[network.id]!.accountOps = currentAccountOps\n }\n }\n\n // Chain the new updatePromise to the current queue\n this.#queue[accountId][network.id] = this.#queue[accountId][network.id]\n .then(updatePromise)\n .catch(() => updatePromise())\n\n // Ensure the method waits for the entire queue to resolve\n await this.#queue[accountId][network.id]\n })\n )\n\n await this.#updateNetworksWithAssets(accountId, accountState)\n this.emitUpdate()\n }\n\n markSimulationAsBroadcasted(accountId: string, networkId: string) {\n const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]\n\n if (!simulation) return\n\n simulation.status = AccountOpStatus.BroadcastedButNotConfirmed\n\n this.emitUpdate()\n }\n\n addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId) {\n if (!tokenAddresses.length) return false\n if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []\n\n let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]\n\n const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.filter((address) => {\n let normalizedAddress\n try {\n normalizedAddress = getAddress(address)\n } catch (e) {\n console.error('Error while normalizing token address', e)\n }\n\n return normalizedAddress && !alreadyLearned.includes(normalizedAddress)\n })\n\n if (!tokensToLearn.length) return false\n\n networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]\n\n this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens\n return true\n }\n\n // Learn new tokens from humanizer and debug_traceCall\n // return: whether new tokens have been learned\n async learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise {\n if (!tokenAddresses) return false\n\n if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}\n\n let networkLearnedTokens: PreviousHintsStorage['learnedTokens'][''] =\n this.#previousHints.learnedTokens[networkId] || {}\n\n const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.reduce((acc: { [key: string]: null }, address) => {\n if (address === ZeroAddress) return acc\n if (alreadyLearned.includes(getAddress(address))) return acc\n\n acc[address] = acc[address] || null // Keep the timestamp of all learned tokens\n return acc\n }, {})\n\n if (!Object.keys(tokensToLearn).length) return false\n // Add new tokens in the beginning of the list\n networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }\n\n // Reached limit\n if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) {\n // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order.\n // This ensures that tokens with the most recent timestamps are prioritized for retention,\n // and tokens with the oldest timestamps are deleted last when the limit is exceeded.\n const learnedTokensArray = Object.entries(networkLearnedTokens).sort(\n (a, b) => Number(b[1]) - Number(a[1])\n )\n\n networkLearnedTokens = Object.fromEntries(\n learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)\n )\n }\n\n this.#previousHints.learnedTokens[networkId] = networkLearnedTokens\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n async learnNfts(\n nftsData: [string, bigint[]][] | undefined,\n networkId: NetworkId\n ): Promise {\n if (!nftsData?.length) return false\n if (!this.#previousHints.learnedNfts) this.#previousHints.learnedNfts = {}\n const networkLearnedNfts: PreviousHintsStorage['learnedNfts'][''] =\n this.#previousHints.learnedNfts[networkId] || {}\n\n const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat()\n const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts)\n .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`))\n .flat()\n if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false\n nftsData.forEach(([addr, ids]) => {\n if (addr === ZeroAddress) return\n if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids\n else networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]]))\n })\n\n this.#previousHints.learnedNfts[networkId] = networkLearnedNfts\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n removeAccountData(address: Account['addr']) {\n delete this.#latest[address]\n delete this.#pending[address]\n delete this.#networksWithAssetsByAccounts[address]\n\n this.#networks.networks.forEach((network) => {\n const key = `${network.id}:${address}`\n\n if (key in this.#previousHints.fromExternalAPI) {\n delete this.#previousHints.fromExternalAPI[key]\n }\n if (key in this.#portfolioLibs) {\n this.#portfolioLibs.delete(key)\n }\n })\n this.#storage.set('previousHints', this.#previousHints)\n this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n\n this.emitUpdate()\n }\n\n getLatestPortfolioState(accountAddr: string) {\n return this.#latest[accountAddr] || {}\n }\n\n getPendingPortfolioState(accountAddr: string) {\n return this.#pending[accountAddr] || {}\n }\n\n getNetworksWithAssets(accountAddr: string) {\n return this.#networksWithAssetsByAccounts[accountAddr] || []\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.d.ts b/dist/src/controllers/providers/providers.d.ts new file mode 100644 index 000000000..a84aa5fec --- /dev/null +++ b/dist/src/controllers/providers/providers.d.ts @@ -0,0 +1,23 @@ +import { Network, NetworkId } from '../../interfaces/network'; +import { RPCProviders } from '../../interfaces/provider'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +/** + * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain. + * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes. + */ +export declare class ProvidersController extends EventEmitter { + #private; + providers: RPCProviders; + initialLoadPromise: Promise; + constructor(networks: NetworksController); + get isInitialized(): boolean; + setProvider(network: Network): void; + updateProviderIsWorking(networkId: NetworkId, isWorking: boolean): void; + removeProvider(networkId: NetworkId): void; + toJSON(): this & { + isInitialized: boolean; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=providers.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.d.ts.map b/dist/src/controllers/providers/providers.d.ts.map new file mode 100644 index 000000000..5e76feaf3 --- /dev/null +++ b/dist/src/controllers/providers/providers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../../src/controllers/providers/providers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;;IAGnD,SAAS,EAAE,YAAY,CAAK;IAG5B,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAErB,QAAQ,EAAE,kBAAkB;IAQxC,IAAI,aAAa,YAEhB;IAQD,WAAW,CAAC,OAAO,EAAE,OAAO;IAkB5B,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;IAQhE,cAAc,CAAC,SAAS,EAAE,SAAS;IAQnC,MAAM;;;;CAOP"} \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.js b/dist/src/controllers/providers/providers.js new file mode 100644 index 000000000..de494b1c3 --- /dev/null +++ b/dist/src/controllers/providers/providers.js @@ -0,0 +1,60 @@ +import { getRpcProvider } from '../../services/provider'; +import EventEmitter from '../eventEmitter/eventEmitter'; +/** + * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain. + * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes. + */ +export class ProvidersController extends EventEmitter { + #networks; + providers = {}; + // Holds the initial load promise, so that one can wait until it completes + initialLoadPromise; + constructor(networks) { + super(); + this.#networks = networks; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.initialLoadPromise = this.#load(); + } + get isInitialized() { + return this.#networks.isInitialized && !!Object.keys(this.providers).length; + } + async #load() { + await this.#networks.initialLoadPromise; + this.#networks.networks.forEach((n) => this.setProvider(n)); + this.emitUpdate(); + } + setProvider(network) { + const provider = this.providers[network.id]; + // Only update the RPC if the new RPC is different from the current one or if there is no RPC for this network yet. + if (!provider || provider?._getConnection().url !== network.selectedRpcUrl) { + const oldRPC = this.providers[network.id]; + // If an RPC fails once it will try to reconnect every second. If we don't destroy the old RPC it will keep trying to reconnect forever. + if (oldRPC) + oldRPC.destroy(); + this.providers[network.id] = getRpcProvider(network.rpcUrls, network.chainId, network.selectedRpcUrl); + } + } + updateProviderIsWorking(networkId, isWorking) { + if (!this.providers[networkId]) + return; + if (this.providers[networkId].isWorking === isWorking) + return; + this.providers[networkId].isWorking = isWorking; + this.emitUpdate(); + } + removeProvider(networkId) { + if (!this.providers[networkId]) + return; + this.providers[networkId]?.destroy(); + delete this.providers[networkId]; + this.emitUpdate(); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + isInitialized: this.isInitialized + }; + } +} +//# sourceMappingURL=providers.js.map \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.js.map b/dist/src/controllers/providers/providers.js.map new file mode 100644 index 000000000..6834b427e --- /dev/null +++ b/dist/src/controllers/providers/providers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../src/controllers/providers/providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAGvD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,SAAS,CAAoB;IAE7B,SAAS,GAAiB,EAAE,CAAA;IAE5B,0EAA0E;IAC1E,kBAAkB,CAAe;IAEjC,YAAY,QAA4B;QACtC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,mEAAmE;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAA;QACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,OAAgB;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE3C,mHAAmH;QACnH,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,cAAc,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAEzC,wIAAwI;YACxI,IAAI,MAAM;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAA;YAE5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,cAAc,CACzC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,CACvB,CAAA;SACF;IACH,CAAC;IAED,uBAAuB,CAAC,SAAoB,EAAE,SAAkB;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,OAAM;QAE7D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,SAAS,CAAA;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,cAAc,CAAC,SAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAA;IACH,CAAC;CACF","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { getRpcProvider } from '../../services/provider'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n\n/**\n * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain.\n * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes.\n */\nexport class ProvidersController extends EventEmitter {\n #networks: NetworksController\n\n providers: RPCProviders = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(networks: NetworksController) {\n super()\n\n this.#networks = networks\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized() {\n return this.#networks.isInitialized && !!Object.keys(this.providers).length\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n this.#networks.networks.forEach((n) => this.setProvider(n))\n this.emitUpdate()\n }\n\n setProvider(network: Network) {\n const provider = this.providers[network.id]\n\n // Only update the RPC if the new RPC is different from the current one or if there is no RPC for this network yet.\n if (!provider || provider?._getConnection().url !== network.selectedRpcUrl) {\n const oldRPC = this.providers[network.id]\n\n // If an RPC fails once it will try to reconnect every second. If we don't destroy the old RPC it will keep trying to reconnect forever.\n if (oldRPC) oldRPC.destroy()\n\n this.providers[network.id] = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl\n )\n }\n }\n\n updateProviderIsWorking(networkId: NetworkId, isWorking: boolean) {\n if (!this.providers[networkId]) return\n if (this.providers[networkId].isWorking === isWorking) return\n\n this.providers[networkId].isWorking = isWorking\n this.emitUpdate()\n }\n\n removeProvider(networkId: NetworkId) {\n if (!this.providers[networkId]) return\n\n this.providers[networkId]?.destroy()\n delete this.providers[networkId]\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.d.ts b/dist/src/controllers/selectedAccount/selectedAccount.d.ts new file mode 100644 index 000000000..935362267 --- /dev/null +++ b/dist/src/controllers/selectedAccount/selectedAccount.d.ts @@ -0,0 +1,59 @@ +import { Account } from '../../interfaces/account'; +import { Banner } from '../../interfaces/banner'; +import { NetworkId } from '../../interfaces/network'; +import { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'; +import { Storage } from '../../interfaces/storage'; +import { PositionsByProvider } from '../../libs/defiPositions/types'; +import { SelectedAccountBalanceError } from '../../libs/selectedAccount/errors'; +import { AccountsController } from '../accounts/accounts'; +import { ActionsController } from '../actions/actions'; +import { DefiPositionsController } from '../defiPositions/defiPositions'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { NetworksController } from '../networks/networks'; +import { PortfolioController } from '../portfolio/portfolio'; +import { ProvidersController } from '../providers/providers'; +export declare const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO: { + tokens: never[]; + collections: never[]; + tokenAmounts: never[]; + totalBalance: number; + isAllReady: boolean; + networkSimulatedAccountOp: {}; + latest: {}; + pending: {}; +}; +export declare class SelectedAccountController extends EventEmitter { + #private; + account: Account | null; + portfolio: SelectedAccountPortfolio; + portfolioStartedLoadingAtTimestamp: number | null; + dashboardNetworkFilter: NetworkId | null; + defiPositions: PositionsByProvider[]; + isReady: boolean; + areControllersInitialized: boolean; + initialLoadPromise: Promise; + constructor({ storage, accounts }: { + storage: Storage; + accounts: AccountsController; + }); + initControllers({ portfolio, defiPositions, actions, networks, providers }: { + portfolio: PortfolioController; + defiPositions: DefiPositionsController; + actions: ActionsController; + networks: NetworksController; + providers: ProvidersController; + }): void; + setAccount(account: Account | null): Promise; + resetSelectedAccountPortfolio(skipUpdate?: boolean): void; + get areDefiPositionsLoading(): boolean; + get balanceAffectingErrors(): SelectedAccountBalanceError[]; + get deprecatedSmartAccountBanner(): Banner[]; + setDashboardNetworkFilter(networkFilter: NetworkId | null): void; + toJSON(): this & { + deprecatedSmartAccountBanner: Banner[]; + areDefiPositionsLoading: boolean; + balanceAffectingErrors: SelectedAccountBalanceError[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=selectedAccount.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map b/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map new file mode 100644 index 000000000..8dcf879bf --- /dev/null +++ b/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,EAIL,2BAA2B,EAC5B,MAAM,mCAAmC,CAAA;AAM1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,kCAAkC;;;;;;;;;CAS9C,CAAA;AAED,qBAAa,yBAA0B,SAAQ,YAAY;;IAezD,OAAO,EAAE,OAAO,GAAG,IAAI,CAAO;IAE9B,SAAS,EAAE,wBAAwB,CAAqC;IAExE,kCAAkC,EAAE,MAAM,GAAG,IAAI,CAAO;IAExD,sBAAsB,EAAE,SAAS,GAAG,IAAI,CAAO;IAI/C,aAAa,EAAE,mBAAmB,EAAE,CAAK;IAMzC,OAAO,EAAE,OAAO,CAAQ;IAExB,yBAAyB,EAAE,OAAO,CAAQ;IAG1C,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAErB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE;IAsBrF,eAAe,CAAC,EACd,SAAS,EACT,aAAa,EACb,OAAO,EACP,QAAQ,EACR,SAAS,EACV,EAAE;QACD,SAAS,EAAE,mBAAmB,CAAA;QAC9B,aAAa,EAAE,uBAAuB,CAAA;QACtC,OAAO,EAAE,iBAAiB,CAAA;QAC1B,QAAQ,EAAE,kBAAkB,CAAA;QAC5B,SAAS,EAAE,mBAAmB,CAAA;KAC/B;IA6DK,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA2BxC,6BAA6B,CAAC,UAAU,CAAC,EAAE,OAAO;IAgElD,IAAI,uBAAuB,YAK1B;IAsHD,IAAI,sBAAsB,kCAEzB;IAED,IAAI,4BAA4B,IAAI,MAAM,EAAE,CA2B3C;IAED,yBAAyB,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI;IAKzD,MAAM;;;;;;CASP"} \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js b/dist/src/controllers/selectedAccount/selectedAccount.js new file mode 100644 index 000000000..40136086c --- /dev/null +++ b/dist/src/controllers/selectedAccount/selectedAccount.js @@ -0,0 +1,294 @@ +import { getAddress } from 'ethers'; +import { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'; +import { isSmartAccount } from '../../libs/account/account'; +import { sortByValue } from '../../libs/defiPositions/helpers'; +// eslint-disable-next-line import/no-cycle +import { getNetworksWithDeFiPositionsErrorErrors, getNetworksWithFailedRPCErrors, getNetworksWithPortfolioErrorErrors } from '../../libs/selectedAccount/errors'; +import { calculateSelectedAccountPortfolio, updatePortfolioStateWithDefiPositions } from '../../libs/selectedAccount/selectedAccount'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = { + tokens: [], + collections: [], + tokenAmounts: [], + totalBalance: 0, + isAllReady: false, + networkSimulatedAccountOp: {}, + latest: {}, + pending: {} +}; +export class SelectedAccountController extends EventEmitter { + #storage; + #accounts; + #portfolio = null; + #defiPositions = null; + #actions = null; + #networks = null; + #providers = null; + account = null; + portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; + portfolioStartedLoadingAtTimestamp = null; + dashboardNetworkFilter = null; + #shouldDebounceFlags = {}; + defiPositions = []; + #portfolioErrors = []; + #defiPositionsErrors = []; + isReady = false; + areControllersInitialized = false; + // Holds the initial load promise, so that one can wait until it completes + initialLoadPromise; + constructor({ storage, accounts }) { + super(); + this.#storage = storage; + this.#accounts = accounts; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.initialLoadPromise = this.#load(); + } + async #load() { + await this.#accounts.initialLoadPromise; + const selectedAccountAddress = await this.#storage.get('selectedAccount', null); + const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress); + this.account = selectedAccount || null; + this.isReady = true; + this.emitUpdate(); + } + initControllers({ portfolio, defiPositions, actions, networks, providers }) { + this.#portfolio = portfolio; + this.#defiPositions = defiPositions; + this.#actions = actions; + this.#networks = networks; + this.#providers = providers; + this.#updateSelectedAccountPortfolio(true); + this.#updatePortfolioErrors(true); + this.#updateSelectedAccountDefiPositions(true); + this.#updateDefiPositionsErrors(true); + this.#portfolio.onUpdate(async () => { + this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => { + this.#updateSelectedAccountPortfolio(); + }); + }, 'selectedAccount'); + this.#defiPositions.onUpdate(() => { + this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => { + this.#updateSelectedAccountDefiPositions(); + if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) { + this.#updateSelectedAccountPortfolio(true); + this.#updateDefiPositionsErrors(); + } + }); + }); + this.#providers.onUpdate(() => { + this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => { + this.#updatePortfolioErrors(true); + this.#updateDefiPositionsErrors(); + }); + }); + this.#networks.onUpdate(() => { + this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => { + if (!this.dashboardNetworkFilter) + return; + const dashboardFilteredNetwork = this.#networks.networks.find((n) => n.id === this.dashboardNetworkFilter); + // reset the dashboardNetworkFilter if the network is removed + if (!dashboardFilteredNetwork) + this.setDashboardNetworkFilter(null); + }); + }); + this.#accounts.onUpdate(() => { + this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => { + this.#updateSelectedAccount(); + this.#updatePortfolioErrors(true); + this.#updateDefiPositionsErrors(); + }); + }); + this.areControllersInitialized = true; + this.emitUpdate(); + } + async setAccount(account) { + this.account = account; + this.#portfolioErrors = []; + this.#defiPositionsErrors = []; + this.resetSelectedAccountPortfolio(true); + this.dashboardNetworkFilter = null; + if (!account) { + await this.#storage.remove('selectedAccount'); + } + else { + await this.#storage.set('selectedAccount', account.addr); + } + this.emitUpdate(); + } + #updateSelectedAccount() { + if (!this.account) + return; + const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account.addr); + if (!updatedAccount) + return; + this.account = updatedAccount; + this.emitUpdate(); + } + resetSelectedAccountPortfolio(skipUpdate) { + this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; + this.#portfolioErrors = []; + if (!skipUpdate) { + this.emitUpdate(); + } + } + #updateSelectedAccountPortfolio(skipUpdate) { + if (!this.#portfolio || !this.#defiPositions || !this.account) + return; + const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); + const latestStateSelectedAccount = structuredClone(this.#portfolio.getLatestPortfolioState(this.account.addr)); + const pendingStateSelectedAccount = structuredClone(this.#portfolio.getPendingPortfolioState(this.account.addr)); + const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(latestStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); + const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(pendingStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); + const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter((action) => action.type === 'accountOp'); + const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(latestStateSelectedAccountWithDefiPositions, pendingStateSelectedAccountWithDefiPositions, this.portfolio, hasSignAccountOp); + if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) { + this.portfolioStartedLoadingAtTimestamp = null; + } + if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) { + this.portfolioStartedLoadingAtTimestamp = Date.now(); + } + if (newSelectedAccountPortfolio.isAllReady || + (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)) { + this.portfolio = newSelectedAccountPortfolio; + this.#updatePortfolioErrors(true); + } + if (!skipUpdate) { + this.emitUpdate(); + } + } + get areDefiPositionsLoading() { + if (!this.account || !this.#defiPositions) + return false; + const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); + return Object.values(defiPositionsAccountState).some((n) => n.isLoading); + } + #updateSelectedAccountDefiPositions(skipUpdate) { + if (!this.#defiPositions || !this.account) + return; + const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); + const positionsByProvider = Object.values(defiPositionsAccountState).flatMap((n) => n.positionsByProvider); + const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => { + const positions = provider.positions + .map((position) => { + const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value)); + return { ...position, assets }; + }) + .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD)); + return { ...provider, positions }; + }); + const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) => sortByValue(a.positionInUSD, b.positionInUSD)); + this.defiPositions = sortedPositionsByProvider; + if (!skipUpdate) { + this.emitUpdate(); + } + } + #debounceFunctionCallsOnSameTick(funcName, func) { + if (this.#shouldDebounceFlags[funcName]) + return; + this.#shouldDebounceFlags[funcName] = true; + // Debounce multiple calls in the same tick and only execute one of them + setTimeout(() => { + this.#shouldDebounceFlags[funcName] = false; + try { + func(); + } + catch (error) { + this.emitError({ + level: 'minor', + message: `The execution of ${funcName} in SelectedAccountController failed`, + error + }); + } + }, 0); + } + #updateDefiPositionsErrors(skipUpdate) { + if (!this.account || + !this.#networks || + !this.#providers || + !this.#defiPositions || + this.areDefiPositionsLoading) { + this.#defiPositionsErrors = []; + if (!skipUpdate) { + this.emitUpdate(); + } + return; + } + const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); + const errorBanners = getNetworksWithDeFiPositionsErrorErrors({ + networks: this.#networks.networks, + currentAccountState: defiPositionsAccountState, + providers: this.#providers.providers, + networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr) + }); + this.#defiPositionsErrors = errorBanners; + if (!skipUpdate) { + this.emitUpdate(); + } + } + #updatePortfolioErrors(skipUpdate) { + if (!this.account || + !this.#networks || + !this.#providers || + !this.#portfolio || + !this.portfolio.isAllReady) { + this.#portfolioErrors = []; + if (!skipUpdate) { + this.emitUpdate(); + } + return; + } + const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({ + providers: this.#providers.providers, + networks: this.#networks.networks, + networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr) + }); + const errorBanners = getNetworksWithPortfolioErrorErrors({ + networks: this.#networks.networks, + selectedAccountLatest: this.portfolio.latest, + providers: this.#providers.providers + }); + this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]; + if (!skipUpdate) { + this.emitUpdate(); + } + } + get balanceAffectingErrors() { + return [...this.#portfolioErrors, ...this.#defiPositionsErrors]; + } + get deprecatedSmartAccountBanner() { + if (!this.account || !isSmartAccount(this.account)) + return []; + if (!this.#accounts.accountStates[this.account.addr] || + !this.#accounts.accountStates[this.account.addr].ethereum || + !this.#accounts.accountStates[this.account.addr].ethereum.isV2) + return []; + if (!this.account.creation || + getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY) + return []; + return [ + { + id: 'old-account', + accountAddr: this.account.addr, + type: 'warning', + category: 'old-account', + title: 'Old Ambire Account', + text: "The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support", + actions: [] + } + ]; + } + setDashboardNetworkFilter(networkFilter) { + this.dashboardNetworkFilter = networkFilter; + this.emitUpdate(); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner, + areDefiPositionsLoading: this.areDefiPositionsLoading, + balanceAffectingErrors: this.balanceAffectingErrors + }; + } +} +//# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js.map b/dist/src/controllers/selectedAccount/selectedAccount.js.map new file mode 100644 index 000000000..7d1302fa0 --- /dev/null +++ b/dist/src/controllers/selectedAccount/selectedAccount.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { NetworkId } from '../../interfaces/network'\nimport { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { sortByValue } from '../../libs/defiPositions/helpers'\nimport { PositionsByProvider } from '../../libs/defiPositions/types'\n// eslint-disable-next-line import/no-cycle\nimport {\n getNetworksWithDeFiPositionsErrorErrors,\n getNetworksWithFailedRPCErrors,\n getNetworksWithPortfolioErrorErrors,\n SelectedAccountBalanceError\n} from '../../libs/selectedAccount/errors'\nimport {\n calculateSelectedAccountPortfolio,\n updatePortfolioStateWithDefiPositions\n} from '../../libs/selectedAccount/selectedAccount'\n// eslint-disable-next-line import/no-cycle\nimport { AccountsController } from '../accounts/accounts'\n// eslint-disable-next-line import/no-cycle\nimport { ActionsController } from '../actions/actions'\n// eslint-disable-next-line import/no-cycle\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n// eslint-disable-next-line import/no-cycle\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = {\n tokens: [],\n collections: [],\n tokenAmounts: [],\n totalBalance: 0,\n isAllReady: false,\n networkSimulatedAccountOp: {},\n latest: {},\n pending: {}\n}\n\nexport class SelectedAccountController extends EventEmitter {\n #storage: Storage\n\n #accounts: AccountsController\n\n #portfolio: PortfolioController | null = null\n\n #defiPositions: DefiPositionsController | null = null\n\n #actions: ActionsController | null = null\n\n #networks: NetworksController | null = null\n\n #providers: ProvidersController | null = null\n\n account: Account | null = null\n\n portfolio: SelectedAccountPortfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n\n portfolioStartedLoadingAtTimestamp: number | null = null\n\n dashboardNetworkFilter: NetworkId | null = null\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n defiPositions: PositionsByProvider[] = []\n\n #portfolioErrors: SelectedAccountBalanceError[] = []\n\n #defiPositionsErrors: SelectedAccountBalanceError[] = []\n\n isReady: boolean = false\n\n areControllersInitialized: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor({ storage, accounts }: { storage: Storage; accounts: AccountsController }) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n const selectedAccountAddress = await this.#storage.get('selectedAccount', null)\n\n const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress)\n\n this.account = selectedAccount || null\n this.isReady = true\n\n this.emitUpdate()\n }\n\n initControllers({\n portfolio,\n defiPositions,\n actions,\n networks,\n providers\n }: {\n portfolio: PortfolioController\n defiPositions: DefiPositionsController\n actions: ActionsController\n networks: NetworksController\n providers: ProvidersController\n }) {\n this.#portfolio = portfolio\n this.#defiPositions = defiPositions\n this.#actions = actions\n this.#networks = networks\n this.#providers = providers\n\n this.#updateSelectedAccountPortfolio(true)\n this.#updatePortfolioErrors(true)\n this.#updateSelectedAccountDefiPositions(true)\n this.#updateDefiPositionsErrors(true)\n\n this.#portfolio.onUpdate(async () => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => {\n this.#updateSelectedAccountPortfolio()\n })\n }, 'selectedAccount')\n\n this.#defiPositions.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => {\n this.#updateSelectedAccountDefiPositions()\n\n if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) {\n this.#updateSelectedAccountPortfolio(true)\n this.#updateDefiPositionsErrors()\n }\n })\n })\n\n this.#providers.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => {\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.#networks.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => {\n if (!this.dashboardNetworkFilter) return\n const dashboardFilteredNetwork = this.#networks!.networks.find(\n (n) => n.id === this.dashboardNetworkFilter\n )\n\n // reset the dashboardNetworkFilter if the network is removed\n if (!dashboardFilteredNetwork) this.setDashboardNetworkFilter(null)\n })\n })\n\n this.#accounts.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => {\n this.#updateSelectedAccount()\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.areControllersInitialized = true\n\n this.emitUpdate()\n }\n\n async setAccount(account: Account | null) {\n this.account = account\n this.#portfolioErrors = []\n this.#defiPositionsErrors = []\n this.resetSelectedAccountPortfolio(true)\n this.dashboardNetworkFilter = null\n\n if (!account) {\n await this.#storage.remove('selectedAccount')\n } else {\n await this.#storage.set('selectedAccount', account.addr)\n }\n\n this.emitUpdate()\n }\n\n #updateSelectedAccount() {\n if (!this.account) return\n\n const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account!.addr)\n if (!updatedAccount) return\n\n this.account = updatedAccount\n\n this.emitUpdate()\n }\n\n resetSelectedAccountPortfolio(skipUpdate?: boolean) {\n this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n this.#portfolioErrors = []\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updateSelectedAccountPortfolio(skipUpdate?: boolean) {\n if (!this.#portfolio || !this.#defiPositions || !this.account) return\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const latestStateSelectedAccount = structuredClone(\n this.#portfolio.getLatestPortfolioState(this.account.addr)\n )\n const pendingStateSelectedAccount = structuredClone(\n this.#portfolio.getPendingPortfolioState(this.account.addr)\n )\n\n const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n latestStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n pendingStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter(\n (action) => action.type === 'accountOp'\n )\n\n const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(\n latestStateSelectedAccountWithDefiPositions,\n pendingStateSelectedAccountWithDefiPositions,\n this.portfolio,\n hasSignAccountOp\n )\n\n if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = null\n }\n\n if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = Date.now()\n }\n\n if (\n newSelectedAccountPortfolio.isAllReady ||\n (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)\n ) {\n this.portfolio = newSelectedAccountPortfolio\n this.#updatePortfolioErrors(true)\n }\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get areDefiPositionsLoading() {\n if (!this.account || !this.#defiPositions) return false\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n return Object.values(defiPositionsAccountState).some((n) => n.isLoading)\n }\n\n #updateSelectedAccountDefiPositions(skipUpdate?: boolean) {\n if (!this.#defiPositions || !this.account) return\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const positionsByProvider = Object.values(defiPositionsAccountState).flatMap(\n (n) => n.positionsByProvider\n )\n\n const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => {\n const positions = provider.positions\n .map((position) => {\n const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value))\n\n return { ...position, assets }\n })\n .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD))\n\n return { ...provider, positions }\n })\n\n const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) =>\n sortByValue(a.positionInUSD, b.positionInUSD)\n )\n\n this.defiPositions = sortedPositionsByProvider\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: () => void) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n try {\n func()\n } catch (error: any) {\n this.emitError({\n level: 'minor',\n message: `The execution of ${funcName} in SelectedAccountController failed`,\n error\n })\n }\n }, 0)\n }\n\n #updateDefiPositionsErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#defiPositions ||\n this.areDefiPositionsLoading\n ) {\n this.#defiPositionsErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const errorBanners = getNetworksWithDeFiPositionsErrorErrors({\n networks: this.#networks.networks,\n currentAccountState: defiPositionsAccountState,\n providers: this.#providers.providers,\n networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr)\n })\n\n this.#defiPositionsErrors = errorBanners\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updatePortfolioErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#portfolio ||\n !this.portfolio.isAllReady\n ) {\n this.#portfolioErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({\n providers: this.#providers.providers,\n networks: this.#networks.networks,\n networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr)\n })\n\n const errorBanners = getNetworksWithPortfolioErrorErrors({\n networks: this.#networks.networks,\n selectedAccountLatest: this.portfolio.latest,\n providers: this.#providers.providers\n })\n\n this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get balanceAffectingErrors() {\n return [...this.#portfolioErrors, ...this.#defiPositionsErrors]\n }\n\n get deprecatedSmartAccountBanner(): Banner[] {\n if (!this.account || !isSmartAccount(this.account)) return []\n\n if (\n !this.#accounts.accountStates[this.account.addr] ||\n !this.#accounts.accountStates[this.account.addr].ethereum ||\n !this.#accounts.accountStates[this.account.addr].ethereum.isV2\n )\n return []\n\n if (\n !this.account.creation ||\n getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n return []\n\n return [\n {\n id: 'old-account',\n accountAddr: this.account.addr,\n type: 'warning',\n category: 'old-account',\n title: 'Old Ambire Account',\n text: \"The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support\",\n actions: []\n }\n ]\n }\n\n setDashboardNetworkFilter(networkFilter: NetworkId | null) {\n this.dashboardNetworkFilter = networkFilter\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner,\n areDefiPositionsLoading: this.areDefiPositionsLoading,\n balanceAffectingErrors: this.balanceAffectingErrors\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.d.ts b/dist/src/controllers/signAccountOp/helper.d.ts new file mode 100644 index 000000000..a55b0296d --- /dev/null +++ b/dist/src/controllers/signAccountOp/helper.d.ts @@ -0,0 +1,12 @@ +import { Network } from '../../interfaces/network'; +import { Warning } from '../../interfaces/signAccountOp'; +import { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'; +import { FeePaymentOption } from '../../libs/estimate/interfaces'; +import { TokenResult } from '../../libs/portfolio'; +import { AccountState } from '../../libs/portfolio/interfaces'; +declare function getFeeSpeedIdentifier(option: FeePaymentOption, accountAddr: string, rbfAccountOp: SubmittedAccountOp | null): string; +declare function getTokenUsdAmount(token: TokenResult, gasAmount: bigint): string; +declare function getSignificantBalanceDecreaseWarning(latest: AccountState, pending: AccountState, networkId: Network['id']): Warning | null; +declare const getFeeTokenPriceUnavailableWarning: (hasSpeed: boolean, feeTokenHasPrice: boolean) => Warning | null; +export { getFeeSpeedIdentifier, getTokenUsdAmount, getSignificantBalanceDecreaseWarning, getFeeTokenPriceUnavailableWarning }; +//# sourceMappingURL=helper.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.d.ts.map b/dist/src/controllers/signAccountOp/helper.d.ts.map new file mode 100644 index 000000000..8a04b5e35 --- /dev/null +++ b/dist/src/controllers/signAccountOp/helper.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/helper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAS,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,iBAAS,qBAAqB,CAC5B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,kBAAkB,GAAG,IAAI,UAWxC;AAED,iBAAS,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED,iBAAS,oCAAoC,CAC3C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GACvB,OAAO,GAAG,IAAI,CAsBhB;AAED,QAAA,MAAM,kCAAkC,aAC5B,OAAO,oBACC,OAAO,KACxB,OAAO,GAAG,IAIZ,CAAA;AAED,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oCAAoC,EACpC,kCAAkC,EACnC,CAAA"} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.js b/dist/src/controllers/signAccountOp/helper.js new file mode 100644 index 000000000..6681b578c --- /dev/null +++ b/dist/src/controllers/signAccountOp/helper.js @@ -0,0 +1,44 @@ +import { formatUnits, ZeroAddress } from 'ethers'; +import { WARNINGS } from '../../consts/signAccountOp/errorHandling'; +import { getAccountPortfolioTotal, getTotal } from '../../libs/portfolio/helpers'; +function getFeeSpeedIdentifier(option, accountAddr, rbfAccountOp) { + // if the token is native and we're paying with EOA, we do not need + // a different identifier as the fee speed calculations will be the same + // regardless of the EOA address + const paidBy = option.token.address === ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy; + return `${paidBy}:${option.token.address}:${option.token.symbol.toLowerCase()}:${option.token.flags.onGasTank ? 'gasTank' : 'feeToken'}${rbfAccountOp ? `rbf-${option.paidBy}` : ''}`; +} +function getTokenUsdAmount(token, gasAmount) { + const isUsd = (price) => price.baseCurrency === 'usd'; + const usdPrice = token.priceIn.find(isUsd)?.price; + if (!usdPrice) + return ''; + const usdPriceFormatted = BigInt(usdPrice * 1e18); + // 18 it's because we multiply usdPrice * 1e18 and here we need to deduct it + return formatUnits(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals); +} +function getSignificantBalanceDecreaseWarning(latest, pending, networkId) { + const latestNetworkData = latest?.[networkId]; + const pendingNetworkData = pending?.[networkId]; + const canDetermineIfBalanceWillDecrease = latestNetworkData && + !latestNetworkData.isLoading && + pendingNetworkData && + !pendingNetworkData.isLoading; + if (canDetermineIfBalanceWillDecrease) { + const latestTotal = getAccountPortfolioTotal(latest, ['rewards', 'gasTank'], false); + const latestOnNetwork = getTotal(latestNetworkData.result?.tokens || []).usd; + const pendingOnNetwork = getTotal(pendingNetworkData.result?.tokens || []).usd; + const willBalanceDecreaseByMoreThan10Percent = latestOnNetwork - pendingOnNetwork > latestTotal * 0.1; + if (!willBalanceDecreaseByMoreThan10Percent) + return null; + return WARNINGS.significantBalanceDecrease; + } + return null; +} +const getFeeTokenPriceUnavailableWarning = (hasSpeed, feeTokenHasPrice) => { + if (!hasSpeed || feeTokenHasPrice) + return null; + return WARNINGS.feeTokenPriceUnavailable; +}; +export { getFeeSpeedIdentifier, getTokenUsdAmount, getSignificantBalanceDecreaseWarning, getFeeTokenPriceUnavailableWarning }; +//# sourceMappingURL=helper.js.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.js.map b/dist/src/controllers/signAccountOp/helper.js.map new file mode 100644 index 000000000..1a04562f5 --- /dev/null +++ b/dist/src/controllers/signAccountOp/helper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, ZeroAddress } from 'ethers'\n\nimport { WARNINGS } from '../../consts/signAccountOp/errorHandling'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { FeePaymentOption } from '../../libs/estimate/interfaces'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getAccountPortfolioTotal, getTotal } from '../../libs/portfolio/helpers'\nimport { AccountState } from '../../libs/portfolio/interfaces'\n\nfunction getFeeSpeedIdentifier(\n option: FeePaymentOption,\n accountAddr: string,\n rbfAccountOp: SubmittedAccountOp | null\n) {\n // if the token is native and we're paying with EOA, we do not need\n // a different identifier as the fee speed calculations will be the same\n // regardless of the EOA address\n const paidBy =\n option.token.address === ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy\n\n return `${paidBy}:${option.token.address}:${option.token.symbol.toLowerCase()}:${\n option.token.flags.onGasTank ? 'gasTank' : 'feeToken'\n }${rbfAccountOp ? `rbf-${option.paidBy}` : ''}`\n}\n\nfunction getTokenUsdAmount(token: TokenResult, gasAmount: bigint): string {\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n const usdPrice = token.priceIn.find(isUsd)?.price\n\n if (!usdPrice) return ''\n\n const usdPriceFormatted = BigInt(usdPrice * 1e18)\n\n // 18 it's because we multiply usdPrice * 1e18 and here we need to deduct it\n return formatUnits(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals)\n}\n\nfunction getSignificantBalanceDecreaseWarning(\n latest: AccountState,\n pending: AccountState,\n networkId: Network['id']\n): Warning | null {\n const latestNetworkData = latest?.[networkId]\n const pendingNetworkData = pending?.[networkId]\n const canDetermineIfBalanceWillDecrease =\n latestNetworkData &&\n !latestNetworkData.isLoading &&\n pendingNetworkData &&\n !pendingNetworkData.isLoading\n\n if (canDetermineIfBalanceWillDecrease) {\n const latestTotal = getAccountPortfolioTotal(latest, ['rewards', 'gasTank'], false)\n const latestOnNetwork = getTotal(latestNetworkData.result?.tokens || []).usd\n const pendingOnNetwork = getTotal(pendingNetworkData.result?.tokens || []).usd\n const willBalanceDecreaseByMoreThan10Percent =\n latestOnNetwork - pendingOnNetwork > latestTotal * 0.1\n\n if (!willBalanceDecreaseByMoreThan10Percent) return null\n\n return WARNINGS.significantBalanceDecrease\n }\n\n return null\n}\n\nconst getFeeTokenPriceUnavailableWarning = (\n hasSpeed: boolean,\n feeTokenHasPrice: boolean\n): Warning | null => {\n if (!hasSpeed || feeTokenHasPrice) return null\n\n return WARNINGS.feeTokenPriceUnavailable\n}\n\nexport {\n getFeeSpeedIdentifier,\n getTokenUsdAmount,\n getSignificantBalanceDecreaseWarning,\n getFeeTokenPriceUnavailableWarning\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.d.ts b/dist/src/controllers/signAccountOp/signAccountOp.d.ts new file mode 100644 index 000000000..c978f49c9 --- /dev/null +++ b/dist/src/controllers/signAccountOp/signAccountOp.d.ts @@ -0,0 +1,130 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Account } from '../../interfaces/account'; +import { ExternalSignerControllers, Key } from '../../interfaces/keystore'; +import { Network } from '../../interfaces/network'; +import { Warning } from '../../interfaces/signAccountOp'; +import { AccountOp } from '../../libs/accountOp/accountOp'; +import { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'; +import { Sponsor } from '../../libs/erc7677/types'; +import { EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'; +import { GasRecommendation } from '../../libs/gasPrice/gasPrice'; +import { TokenResult } from '../../libs/portfolio'; +import { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'; +import { GasSpeeds } from '../../services/bundlers/types'; +import { AccountsController } from '../accounts/accounts'; +import { AccountOpAction } from '../actions/actions'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { KeystoreController } from '../keystore/keystore'; +import { PortfolioController } from '../portfolio/portfolio'; +export declare enum SigningStatus { + EstimationError = "estimation-error", + UnableToSign = "unable-to-sign", + ReadyToSign = "ready-to-sign", + /** + * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc. + * Signing is allowed in this state, but the state of the controller should not change. + */ + UpdatesPaused = "updates-paused", + InProgress = "in-progress", + WaitingForPaymaster = "waiting-for-paymaster-response", + Done = "done" +} +export type Status = { + type: SigningStatus; +}; +export declare enum FeeSpeed { + Slow = "slow", + Medium = "medium", + Fast = "fast", + Ape = "ape" +} +type SpeedCalc = { + type: FeeSpeed; + amount: bigint; + simulatedGasLimit: bigint; + amountFormatted: string; + amountUsd: string; + gasPrice: bigint; + maxPriorityFeePerGas?: bigint; +}; +export declare const noStateUpdateStatuses: SigningStatus[]; +export declare class SignAccountOpController extends EventEmitter { + #private; + account: Account; + fromActionId: AccountOpAction['id']; + accountOp: AccountOp; + gasPrices: GasRecommendation[] | null; + bundlerGasPrices: GasSpeeds | null; + estimation: EstimateResult | null; + feeSpeeds: { + [identifier: string]: SpeedCalc[]; + }; + paidBy: string | null; + feeTokenResult: TokenResult | null; + selectedFeeSpeed: FeeSpeed; + selectedOption: FeePaymentOption | undefined; + status: Status | null; + gasUsedTooHigh: boolean; + gasUsedTooHighAgreed: boolean; + rbfAccountOps: { + [key: string]: SubmittedAccountOp | null; + }; + signedAccountOp: AccountOp | null; + replacementFeeLow: boolean; + warnings: Warning[]; + isSponsored: boolean; + sponsor: Sponsor | undefined; + bundlerSwitcher: BundlerSwitcher; + constructor(accounts: AccountsController, keystore: KeystoreController, portfolio: PortfolioController, externalSignerControllers: ExternalSignerControllers, account: Account, network: Network, fromActionId: AccountOpAction['id'], accountOp: AccountOp, reEstimate: Function, isSignRequestStillActive: Function); + get isInitialized(): boolean; + hasSpeeds(identifier: string): number | false; + getCallDataAdditionalByNetwork(): bigint; + get errors(): string[]; + get readyToSign(): boolean; + calculateWarnings(): void; + update({ gasPrices, estimation, feeToken, paidBy, speed, signingKeyAddr, signingKeyType, calls, gasUsedTooHighAgreed, rbfAccountOps, bundlerGasPrices, blockGasLimit }: { + gasPrices?: GasRecommendation[]; + estimation?: EstimateResult | null; + feeToken?: TokenResult; + paidBy?: string; + speed?: FeeSpeed; + signingKeyAddr?: Key['addr']; + signingKeyType?: Key['type']; + calls?: AccountOp['calls']; + gasUsedTooHighAgreed?: boolean; + rbfAccountOps?: { + [key: string]: SubmittedAccountOp | null; + }; + bundlerGasPrices?: { + speeds: GasSpeeds; + bundler: BUNDLER; + }; + blockGasLimit?: bigint; + }): void; + updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow?: boolean): void; + reset(): void; + resetStatus(): void; + static getAmountAfterFeeTokenConvert(simulatedGasLimit: bigint, gasPrice: bigint, nativeRatio: bigint, feeTokenDecimals: number, addedNative: bigint): bigint; + get feeToken(): string | null; + get feePaidBy(): string | null; + get availableFeeOptions(): EstimateResult['feePaymentOptions']; + get accountKeyStoreKeys(): Key[]; + get speedOptions(): string[]; + get gasSavedUSD(): number | null; + sign(): Promise; + toJSON(): this & { + isInitialized: boolean; + readyToSign: boolean; + availableFeeOptions: FeePaymentOption[]; + accountKeyStoreKeys: Key[]; + feeToken: string | null; + feePaidBy: string | null; + speedOptions: string[]; + selectedOption: FeePaymentOption | undefined; + account: Account; + errors: string[]; + gasSavedUSD: number | null; + }; +} +export {}; +//# sourceMappingURL=signAccountOp.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.d.ts.map b/dist/src/controllers/signAccountOp/signAccountOp.d.ts.map new file mode 100644 index 000000000..83a14c084 --- /dev/null +++ b/dist/src/controllers/signAccountOp/signAccountOp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"signAccountOp.d.ts","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js b/dist/src/controllers/signAccountOp/signAccountOp.js new file mode 100644 index 000000000..f5ae91b88 --- /dev/null +++ b/dist/src/controllers/signAccountOp/signAccountOp.js @@ -0,0 +1,952 @@ +import { AbiCoder, formatEther, formatUnits, getAddress, Interface, toBeHex, ZeroAddress } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import ERC20 from '../../../contracts/compiled/IERC20.json'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { SINGLETON } from '../../consts/deploy'; +/* eslint-disable no-restricted-syntax */ +import { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'; +import { GAS_TANK_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, SA_NATIVE_TRANSFER_GAS_USED } from '../../consts/signAccountOp/gas'; +import { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'; +import { getSignableCalls } from '../../libs/accountOp/accountOp'; +import { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'; +import { getProbableCallData } from '../../libs/gasPrice/gasPrice'; +import { hasRelayerSupport } from '../../libs/networks/networks'; +import { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'; +import { getGasUsed } from '../../libs/singleton/singleton'; +import { getActivatorCall, getOneTimeNonce, getUserOperation, getUserOpHash, isErc4337Broadcast, shouldIncludeActivatorCall, shouldUseOneTimeNonce } from '../../libs/userOperation/userOperation'; +import { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'; +import EventEmitter from '../eventEmitter/eventEmitter'; +import { getFeeSpeedIdentifier, getFeeTokenPriceUnavailableWarning, getSignificantBalanceDecreaseWarning, getTokenUsdAmount } from './helper'; +export var SigningStatus; +(function (SigningStatus) { + SigningStatus["EstimationError"] = "estimation-error"; + SigningStatus["UnableToSign"] = "unable-to-sign"; + SigningStatus["ReadyToSign"] = "ready-to-sign"; + /** + * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc. + * Signing is allowed in this state, but the state of the controller should not change. + */ + SigningStatus["UpdatesPaused"] = "updates-paused"; + SigningStatus["InProgress"] = "in-progress"; + SigningStatus["WaitingForPaymaster"] = "waiting-for-paymaster-response"; + SigningStatus["Done"] = "done"; +})(SigningStatus || (SigningStatus = {})); +export var FeeSpeed; +(function (FeeSpeed) { + FeeSpeed["Slow"] = "slow"; + FeeSpeed["Medium"] = "medium"; + FeeSpeed["Fast"] = "fast"; + FeeSpeed["Ape"] = "ape"; +})(FeeSpeed || (FeeSpeed = {})); +// declare the statuses we don't want state updates on +export const noStateUpdateStatuses = [ + SigningStatus.InProgress, + SigningStatus.Done, + SigningStatus.UpdatesPaused, + SigningStatus.WaitingForPaymaster +]; +export class SignAccountOpController extends EventEmitter { + #accounts; + #keystore; + #portfolio; + #externalSignerControllers; + account; + #network; + #blockGasLimit = undefined; + fromActionId; + accountOp; + gasPrices = null; + bundlerGasPrices = null; + estimation = null; + feeSpeeds = {}; + paidBy = null; + feeTokenResult = null; + selectedFeeSpeed = FeeSpeed.Fast; + selectedOption = undefined; + status = null; + gasUsedTooHigh; + gasUsedTooHighAgreed; + #reEstimate; + #isSignRequestStillActive; + rbfAccountOps; + signedAccountOp; + replacementFeeLow; + warnings = []; + // indicates whether the transaction gas is sponsored or not + isSponsored = false; + // the sponsor data to be displayed, if any + sponsor = undefined; + bundlerSwitcher; + constructor(accounts, keystore, portfolio, externalSignerControllers, account, network, fromActionId, accountOp, reEstimate, isSignRequestStillActive) { + super(); + this.#accounts = accounts; + this.#keystore = keystore; + this.#portfolio = portfolio; + this.#externalSignerControllers = externalSignerControllers; + this.account = account; + this.#network = network; + this.fromActionId = fromActionId; + this.accountOp = structuredClone(accountOp); + this.#reEstimate = reEstimate; + this.#isSignRequestStillActive = isSignRequestStillActive; + this.gasUsedTooHigh = false; + this.gasUsedTooHighAgreed = false; + this.rbfAccountOps = {}; + this.signedAccountOp = null; + this.replacementFeeLow = false; + this.bundlerSwitcher = new BundlerSwitcher(network, () => { + return this.status ? this.status.type : null; + }, noStateUpdateStatuses); + } + get isInitialized() { + return !!this.estimation; + } + #setDefaults() { + // Set the first signer as the default one. + // If there are more available signers, the user will be able to select a different signer from the application. + // The main benefit of having a default signer + // is that it drastically simplifies the logic of determining whether the account is ready for signing. + // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag. + // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer. + // In that case, on the application, we want the "Sign" button to be clickable/enabled, + // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible. + if (this.accountKeyStoreKeys.length && + (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)) { + this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr; + this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type; + } + } + #setGasFeePayment() { + if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) { + this.accountOp.gasFeePayment = this.#getGasFeePayment(); + } + } + // check if speeds are set for the given identifier + hasSpeeds(identifier) { + return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length; + } + getCallDataAdditionalByNetwork() { + // no additional call data is required for arbitrum as the bytes are already + // added in the calculation for the L1 fee + if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) + return 0n; + const estimationCallData = getProbableCallData(this.account, this.accountOp, this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId], this.#network); + const FIXED_OVERHEAD = 21000n; + const bytes = Buffer.from(estimationCallData.substring(2)); + const nonZeroBytes = BigInt(bytes.filter((b) => b).length); + const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes); + const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n; + return txDataGas + FIXED_OVERHEAD; + } + get errors() { + const errors = []; + if (!this.isInitialized) + return errors; + const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr); + const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network); + // This must be the first error check! + if (isAmbireV1AndNetworkNotSupported) { + errors.push('Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'); + // Don't show any other errors + return errors; + } + // if there's an estimation error, show it + if (this.estimation?.error) { + errors.push(this.estimation.error.message); + } + if (this.estimation?.gasUsed && + this.#blockGasLimit && + this.estimation?.gasUsed > this.#blockGasLimit) { + errors.push('Transaction reverted with estimation too high: above block limit'); + } + if (this.#network.predefined && + this.estimation?.gasUsed && + this.estimation?.gasUsed > 500000000n) { + errors.push('Unreasonably high estimation. This transaction will probably fail'); + } + // this error should never happen as availableFeeOptions should always have the native option + if (!this.isSponsored && !this.availableFeeOptions.length) + errors.push(ERRORS.eoaInsufficientFunds); + // This error should not happen, as in the update method we are always setting a default signer. + // It may occur, only if there are no available signer. + if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr) + errors.push('Please select a signer to sign the transaction.'); + const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr); + const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]; + const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find((token) => token.address === '0x0000000000000000000000000000000000000000'); + if (!this.isSponsored && !currentPortfolioNetworkNative) + errors.push('Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'); + // if there's no gasFeePayment calculate but there is: 1) feeTokenResult + // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error + if (!this.isSponsored && + !this.accountOp.gasFeePayment && + this.feeTokenResult && + this.selectedOption) { + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + if (this.hasSpeeds(identifier)) + errors.push('Please select a token and an account for paying the gas fee.'); + } + if (!this.isSponsored && + this.selectedOption && + this.accountOp.gasFeePayment && + this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount) { + const speedCoverage = []; + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + if (this.feeSpeeds[identifier]) { + this.feeSpeeds[identifier].forEach((speed) => { + if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount) + speedCoverage.push(speed.type); + }); + } + if (speedCoverage.length === 0) { + errors.push(isSmartAccount(this.account) + ? "Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee." + : ERRORS.eoaInsufficientFunds); + } + else { + errors.push('The selected speed is not available due to insufficient funds. Please select a slower speed.'); + } + } + // The signing might fail, tell the user why but allow the user to retry signing, + // @ts-ignore fix TODO: type mismatch + if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) { + // @ts-ignore typescript complains, but the error being present gets checked above + errors.push(this.status.error); + } + if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) { + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + if (!this.hasSpeeds(identifier)) { + if (!this.feeTokenResult?.priceIn.length) { + errors.push(`Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`); + } + else { + errors.push('Unable to estimate the transaction fee. Please try changing the fee token or contact support.'); + } + } + } + // if the gasFeePayment is gas tank but the user doesn't have funds, disable it + let balance = 0; + Object.keys(currentPortfolio).forEach((networkName) => { + const networkPortfolio = currentPortfolio[networkName]; + if (!networkPortfolio?.result?.total?.usd) + return; + balance += networkPortfolio.result.total.usd; + }); + if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) { + errors.push("Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account"); + } + return errors; + } + get readyToSign() { + return (!!this.status && + (this.status?.type === SigningStatus.ReadyToSign || + this.status?.type === SigningStatus.UpdatesPaused)); + } + calculateWarnings() { + const warnings = []; + const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr); + const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr); + const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(latestState, pendingState, this.accountOp.networkId); + if (this.selectedOption) { + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd); + const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(!!this.hasSpeeds(identifier), feeTokenHasPrice); + // push the warning only if the txn is not sponsored + if (!this.isSponsored && feeTokenPriceUnavailableWarning) + warnings.push(feeTokenPriceUnavailableWarning); + } + if (significantBalanceDecreaseWarning) + warnings.push(significantBalanceDecreaseWarning); + this.warnings = warnings; + this.emitUpdate(); + } + update({ gasPrices, estimation, feeToken, paidBy, speed, signingKeyAddr, signingKeyType, calls, gasUsedTooHighAgreed, rbfAccountOps, bundlerGasPrices, blockGasLimit }) { + // once the user commits to the things he sees on his screen, + // we need to be sure nothing changes afterwards. + // For example, signing can be slow if it's done by a hardware wallet. + // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism) + // If we allow the estimation to affect the controller state during sign, + // there could be discrepancy between what the user has agreed upon and what + // we broadcast in the end + if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) { + return; + } + if (Array.isArray(calls)) + this.accountOp.calls = calls; + if (blockGasLimit) + this.#blockGasLimit = blockGasLimit; + if (gasPrices) + this.gasPrices = gasPrices; + if (estimation) { + this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n); + this.estimation = estimation; + // on each estimation update, set the newest account nonce + this.accountOp.nonce = BigInt(estimation.currentAccountNonce); + } + // if estimation is undefined, do not clear the estimation. + // We do this only if strictly specified as null + if (estimation === null) + this.estimation = null; + if (feeToken && paidBy) { + this.paidBy = paidBy; + this.feeTokenResult = feeToken; + } + if (speed && this.isInitialized) { + this.selectedFeeSpeed = speed; + } + if (signingKeyAddr && signingKeyType && this.isInitialized) { + this.accountOp.signingKeyAddr = signingKeyAddr; + this.accountOp.signingKeyType = signingKeyType; + } + if (gasUsedTooHighAgreed !== undefined) + this.gasUsedTooHighAgreed = gasUsedTooHighAgreed; + // set the rbf is != undefined + if (rbfAccountOps) + this.rbfAccountOps = rbfAccountOps; + // Set defaults, if some of the optional params are omitted + this.#setDefaults(); + if (this.estimation && this.paidBy && this.feeTokenResult) { + this.selectedOption = this.availableFeeOptions.find((option) => option.paidBy === this.paidBy && + option.token.address === this.feeTokenResult.address && + option.token.symbol.toLocaleLowerCase() === + this.feeTokenResult.symbol.toLocaleLowerCase() && + option.token.flags.onGasTank === this.feeTokenResult.flags.onGasTank); + } + // update the bundler gas prices if the bundlers match + if (this.estimation?.erc4337GasLimits && + bundlerGasPrices && + bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()) { + this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds; + } + if (this.estimation && + this.estimation.erc4337GasLimits && + this.estimation.erc4337GasLimits.paymaster) { + // if it was sponsored but it no longer is (fallback case), + // reset the selectedOption option as we use native for the sponsorship + // but the user might not actually have any native + const isSponsorshipFallback = this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored(); + this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored(); + this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor; + if (isSponsorshipFallback) { + this.selectedOption = this.availableFeeOptions.length + ? this.availableFeeOptions[0] + : undefined; + } + } + // calculate the fee speeds if either there are no feeSpeeds + // or any of properties for update is requested + if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) { + this.#updateFeeSpeeds(); + } + // Here, we expect to have most of the fields set, so we can safely set GasFeePayment + this.#setGasFeePayment(); + this.updateStatus(); + this.calculateWarnings(); + } + updateStatus(forceStatusChange, replacementFeeLow = false) { + // use this to go back to ReadyToSign when a broadcasting error is emitted + if (forceStatusChange) { + this.status = { type: forceStatusChange }; + this.emitUpdate(); + return; + } + // no status updates on these two + const isInTheMiddleOfSigning = this.status?.type === SigningStatus.InProgress || + this.status?.type === SigningStatus.WaitingForPaymaster; + const isDone = this.status?.type === SigningStatus.Done; + if (isInTheMiddleOfSigning || isDone) + return; + // if we have an estimation error, set the state so and return + if (this.estimation?.error) { + this.status = { type: SigningStatus.EstimationError }; + this.emitUpdate(); + return; + } + if (this.errors.length) { + this.status = { type: SigningStatus.UnableToSign }; + this.emitUpdate(); + return; + } + if (this.isInitialized && + this.estimation && + this.accountOp?.signingKeyAddr && + this.accountOp?.signingKeyType && + this.accountOp?.gasFeePayment && + // if the gas used is too high, do not allow the user to sign + // until he explicitly agrees to the risks + (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)) { + this.status = { type: SigningStatus.ReadyToSign }; + // do not reset this once triggered + if (replacementFeeLow) + this.replacementFeeLow = replacementFeeLow; + this.emitUpdate(); + return; + } + // reset the status if a valid state was not found + this.status = null; + this.emitUpdate(); + } + reset() { + this.gasPrices = null; + this.estimation = null; + this.selectedFeeSpeed = FeeSpeed.Fast; + this.paidBy = null; + this.feeTokenResult = null; + this.status = null; + this.emitUpdate(); + } + resetStatus() { + this.status = null; + this.emitUpdate(); + } + /** + * Obtain the native token ratio in relation to a fee token. + * + * By knowing the USD value of the tokens in the portfolio, + * we can calculate the ratio between a native token and a fee token. + * + * For example, 1 ETH = 8 BNB (ratio: 8). + * + * We require the ratio to be in a BigInt format since all the application values, + * such as amount, gasLimit, etc., are also represented as BigInt numbers. + */ + #getNativeToFeeTokenRatio(feeToken) { + const native = this.#portfolio + .getLatestPortfolioState(this.accountOp.accountAddr)[this.accountOp.networkId]?.result?.tokens.find((token) => token.address === '0x0000000000000000000000000000000000000000'); + if (!native) + return null; + // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available. + if (native.address === feeToken.address && native.networkId === feeToken.networkId) + return BigInt(1 * 1e18); + const isUsd = (price) => price.baseCurrency === 'usd'; + const nativePrice = native.priceIn.find(isUsd)?.price; + const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price; + if (!nativePrice || !feeTokenPrice) + return null; + const ratio = nativePrice / feeTokenPrice; + // Here we multiply it by 1e18, in order to keep the decimal precision. + // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point. + // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18. + const ratio1e18 = ratio * 1e18; + const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0); + return BigInt(toBigInt); + } + static getAmountAfterFeeTokenConvert(simulatedGasLimit, gasPrice, nativeRatio, feeTokenDecimals, addedNative) { + const amountInWei = simulatedGasLimit * gasPrice + addedNative; + // Let's break down the process of converting the amount into FeeToken: + // 1. Initially, we multiply the amount in wei by the native to fee token ratio. + // 2. Next, we address the decimal places: + // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals). + // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount. + // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals. + const extraDecimals = BigInt(10 ** 18); + const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals)); + const pow = extraDecimals * feeTokenExtraDecimals; + return (amountInWei * nativeRatio) / pow; + } + /** + * Increase the fee we send to the feeCollector according to the specified + * options in the network tab + */ + #increaseFee(amount) { + if (!this.#network.feeOptions.feeIncrease) { + return amount; + } + return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n; + } + /** + * If the nonce of the current account op and the last account op are the same, + * do an RBF increase or otherwise the user cannot broadcast the txn + * + * calculatedGas: it should be either the whole gasPrice if the network doesn't + * support EIP-1559 OR it should the maxPriorityFeePerGas if the network + * supports EIP-1559 + * + * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas + */ + #rbfIncrease(accId, calculatedGas, gasPropertyName, prevSpeed) { + // ape speed gets 50% increase + const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n; + // when doing an RBF, make sure the min gas for the current speed + // is at least 12% bigger than the previous speed + const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined; + const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n; + const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas; + // if there was an error on the signed account op with a + // replacement fee too low, we increase by 13% the signed account op + // IF the new estimation is not actually higher + if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) { + const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined; + const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n; + return min > bumpFees ? min : bumpFees; + } + // if no RBF option for this paidBy option, return the amount + const rbfOp = this.rbfAccountOps[accId]; + if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName]) + return calculatedGas; + // increase by a minimum of 13% the last broadcast txn and use that + // or use the current gas estimation if it's more + const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n; + const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n; + return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased; + } + get #feeSpeedsLoading() { + return !this.isInitialized || !this.gasPrices; + } + #updateFeeSpeeds() { + if (this.#feeSpeedsLoading) + return; + // reset the fee speeds at the beginning to avoid duplications + this.feeSpeeds = {}; + const gasUsed = this.estimation.gasUsed; + this.availableFeeOptions.forEach((option) => { + // if a calculation has been made, do not make it again + // EOA pays for SA is the most common case for this scenario + // + // addition: make sure there's no rbfAccountOps as well + const identifier = getFeeSpeedIdentifier(option, this.accountOp.accountAddr, this.rbfAccountOps[option.paidBy]); + if (this.hasSpeeds(identifier)) { + return; + } + const nativeRatio = this.#getNativeToFeeTokenRatio(option.token); + if (!nativeRatio) { + this.feeSpeeds[identifier] = []; + return; + } + const erc4337GasLimits = this.estimation?.erc4337GasLimits; + if (erc4337GasLimits) { + const speeds = []; + const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable(); + for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) { + const simulatedGasLimit = BigInt(erc4337GasLimits.callGasLimit) + + BigInt(erc4337GasLimits.preVerificationGas) + + BigInt(option.gasUsed ?? 0); + const gasPrice = BigInt(speedValue.maxFeePerGas); + let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(simulatedGasLimit, gasPrice, nativeRatio, option.token.decimals, 0n); + if (usesPaymaster) + amount = this.#increaseFee(amount); + speeds.push({ + type: speed, + simulatedGasLimit, + amount, + amountFormatted: formatUnits(amount, Number(option.token.decimals)), + amountUsd: getTokenUsdAmount(option.token, amount), + gasPrice, + maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas) + }); + } + if (this.feeSpeeds[identifier] === undefined) + this.feeSpeeds[identifier] = []; + this.feeSpeeds[identifier] = speeds; + return; + } + ; + (this.gasPrices || []).forEach((gasRecommendation, i) => { + let amount; + let simulatedGasLimit; + const prevSpeed = this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length + ? this.feeSpeeds[identifier][i - 1] + : null; + // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation + // depending whether the network supports EIP-1559 and is it enabled on our side. + // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559. + // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns + // the maxPriorityFeePerGas without doing anything (most cases) or if there's a + // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF. + // Finally, we calculate the gasPrice: + // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas + // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF) + const maxPriorityFeePerGas = 'maxPriorityFeePerGas' in gasRecommendation + ? this.#rbfIncrease(option.paidBy, gasRecommendation.maxPriorityFeePerGas, 'maxPriorityFeePerGas', prevSpeed) + : undefined; + const gasPrice = 'maxPriorityFeePerGas' in gasRecommendation + ? gasRecommendation.baseFeePerGas + maxPriorityFeePerGas + : this.#rbfIncrease(option.paidBy, gasRecommendation.gasPrice, 'gasPrice', prevSpeed); + // EOA + if (!isSmartAccount(this.account)) { + simulatedGasLimit = gasUsed; + if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) { + simulatedGasLimit = getGasUsed(simulatedGasLimit); + } + amount = simulatedGasLimit * gasPrice + option.addedNative; + } + else if (option.paidBy !== this.accountOp.accountAddr) { + // Smart account, but EOA pays the fee + simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork(); + amount = simulatedGasLimit * gasPrice + option.addedNative; + } + else { + // Relayer + simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed; + amount = SignAccountOpController.getAmountAfterFeeTokenConvert(simulatedGasLimit, gasPrice, nativeRatio, option.token.decimals, option.addedNative); + amount = this.#increaseFee(amount); + } + const feeSpeed = { + type: gasRecommendation.name, + simulatedGasLimit, + amount, + amountFormatted: formatUnits(amount, Number(option.token.decimals)), + amountUsd: getTokenUsdAmount(option.token, amount), + gasPrice, + maxPriorityFeePerGas + }; + if (this.feeSpeeds[identifier] === undefined) + this.feeSpeeds[identifier] = []; + this.feeSpeeds[identifier].push(feeSpeed); + }); + }); + } + #getGasFeePayment() { + if (!this.isInitialized) { + this.emitError({ + level: 'major', + message: 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.', + error: new Error('SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.') + }); + return null; + } + if (!this.paidBy) { + this.emitError({ + level: 'silent', + message: '', + error: new Error('SignAccountOpController: paying account not selected') + }); + return null; + } + if (!this.feeTokenResult) { + this.emitError({ + level: 'silent', + message: '', + error: new Error('SignAccountOpController: fee token not selected') + }); + return null; + } + // if there are no availableFeeOptions, we don't have a gasFee + // this is normal though as there are such cases: + // - EOA paying in native but doesn't have any native + // so no error should pop out because of this + if (!this.availableFeeOptions.length) { + return null; + } + if (!this.selectedOption) { + this.emitError({ + level: 'silent', + message: '', + error: new Error('SignAccountOpController: paying option not found') + }); + return null; + } + // if there are no fee speeds available for the option, it means + // the nativeRatio could not be calculated. In that case, we do not + // emit an error here but proceed and show an explanation to the user + // in get errors() + // check test: Signing [Relayer]: ... priceIn | native/Ratio + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + if (!this.feeSpeeds[identifier].length) { + return null; + } + const chosenSpeed = this.feeSpeeds[identifier].find((speed) => speed.type === this.selectedFeeSpeed); + if (!chosenSpeed) { + this.emitError({ + level: 'silent', + message: '', + error: new Error('SignAccountOpController: fee speed not selected') + }); + return null; + } + const accountState = this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]; + return { + paidBy: this.paidBy, + // we're allowing EOAs to broadcast on 4337 networks as well + // in that case, we don't do user operations + isERC4337: this.paidBy === this.accountOp.accountAddr && + isErc4337Broadcast(this.account, this.#network, accountState), + isGasTank: this.feeTokenResult.flags.onGasTank, + inToken: this.feeTokenResult.address, + feeTokenNetworkId: this.feeTokenResult.networkId, + amount: chosenSpeed.amount, + simulatedGasLimit: chosenSpeed.simulatedGasLimit, + gasPrice: chosenSpeed.gasPrice, + maxPriorityFeePerGas: 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined + }; + } + get feeToken() { + return this.accountOp?.gasFeePayment?.inToken || null; + } + get feePaidBy() { + return this.accountOp?.gasFeePayment?.paidBy || null; + } + get availableFeeOptions() { + if (!this.estimation) + return []; + // if the txn is sponsored, return the native option only + // even if it's balance is 0 + if (this.isSponsored) { + const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ZeroAddress); + return native ? [native] : []; + } + // FeeOptions having amount + const withAmounts = this.estimation.feePaymentOptions.filter((feeOption) => feeOption.availableAmount); + if (withAmounts.length) + return withAmounts; + // if there are no fee options with amounts, return the native option + const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ZeroAddress); + return native ? [native] : []; + } + get accountKeyStoreKeys() { + return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr)); + } + // eslint-disable-next-line class-methods-use-this + get speedOptions() { + return Object.values(FeeSpeed); + } + get gasSavedUSD() { + if (!this.selectedOption?.token.flags.onGasTank) + return null; + const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const selectedFeeSpeedData = this.feeSpeeds[identifier].find((speed) => speed.type === this.selectedFeeSpeed); + const gasPrice = selectedFeeSpeedData?.gasPrice; + if (!gasPrice) + return null; + // get the native token from the portfolio to calculate prices + const native = this.#portfolio + .getLatestPortfolioState(this.accountOp.accountAddr)[this.accountOp.networkId]?.result?.tokens.find((token) => token.address === '0x0000000000000000000000000000000000000000'); + if (!native) + return null; + const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price; + if (!nativePrice) + return null; + // 4337 gasUsed is set to 0 in the estimation as we rely + // on the bundler for the estimation entirely => use hardcode value + const gasUsedSelectedOption = this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n + ? this.selectedOption.gasUsed + : GAS_TANK_TRANSFER_GAS_USED; + const isNativeSelected = this.selectedOption.token.address === ZeroAddress; + const gasUsedNative = this.availableFeeOptions.find((option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED; + const gasUsedERC20 = this.availableFeeOptions.find((option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || SA_ERC20_TRANSFER_GAS_USED; + const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20; + const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice); + return Number(gasSavedInNative) * nativePrice; + } + #emitSigningErrorAndResetToReadyToSign(error) { + this.emitError({ level: 'major', message: error, error: new Error(error) }); + this.status = { type: SigningStatus.ReadyToSign }; + this.emitUpdate(); + } + #addFeePayment() { + // In case of gas tank token fee payment, we need to include one more call to account op + const abiCoder = new AbiCoder(); + if (this.isSponsored) { + this.accountOp.feeCall = { + to: FEE_COLLECTOR, + value: 0n, + data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC']) + }; + return; + } + if (this.accountOp.gasFeePayment.isGasTank) { + this.accountOp.feeCall = { + to: FEE_COLLECTOR, + value: 0n, + data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', this.accountOp.gasFeePayment.amount, this.feeTokenResult?.symbol]) + }; + return; + } + if (this.accountOp.gasFeePayment.inToken === '0x0000000000000000000000000000000000000000') { + // native payment + this.accountOp.feeCall = { + to: FEE_COLLECTOR, + value: this.accountOp.gasFeePayment.amount, + data: '0x' + }; + } + else { + // token payment + const ERC20Interface = new Interface(ERC20.abi); + this.accountOp.feeCall = { + to: this.accountOp.gasFeePayment.inToken, + value: 0n, + data: ERC20Interface.encodeFunctionData('transfer', [ + FEE_COLLECTOR, + this.accountOp.gasFeePayment.amount + ]) + }; + } + } + async sign() { + if (!this.readyToSign) { + const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + return this.#emitSigningErrorAndResetToReadyToSign(message); + } + // when signing begings, we stop immediatelly state updates on the controller + // by changing the status to InProgress. Check update() for more info + this.status = { type: SigningStatus.InProgress }; + if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) { + const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + return this.#emitSigningErrorAndResetToReadyToSign(message); + } + if (!this.accountOp?.gasFeePayment || !this.selectedOption) { + const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + return this.#emitSigningErrorAndResetToReadyToSign(message); + } + const signer = await this.#keystore.getSigner(this.accountOp.signingKeyAddr, this.accountOp.signingKeyType); + if (!signer) { + const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + return this.#emitSigningErrorAndResetToReadyToSign(message); + } + const accountState = this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]; + const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable(); + const usesOneTimeNonce = shouldUseOneTimeNonce(accountState); + if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) { + this.status = { type: SigningStatus.WaitingForPaymaster }; + } + else { + this.status = { type: SigningStatus.InProgress }; + } + // we update the FE with the changed status (in progress) only after the checks + // above confirm everything is okay to prevent two different state updates + this.emitUpdate(); + const gasFeePayment = this.accountOp.gasFeePayment; + if (signer.init) + signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType]); + // just in-case: before signing begins, we delete the feeCall; + // if there's a need for it, it will be added later on in the code. + // We need this precaution because this could happen: + // - try to broadcast with the relayer + // - the feel call gets added + // - the relayer broadcast fails + // - the user does another broadcast, this time with EOA pays for SA + // - the fee call stays, causing a low gas limit revert + delete this.accountOp.feeCall; + // delete the activatorCall as a precaution that it won't be added twice + delete this.accountOp.activatorCall; + // @EntryPoint activation + // if we broadcast by an EOA, this is the only way to include + // the entry point as a signer + if (shouldIncludeActivatorCall(this.#network, this.account, accountState, this.accountOp.gasFeePayment.isERC4337)) { + this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr); + } + try { + // In case of EOA account + if (!isSmartAccount(this.account)) { + if (this.accountOp.calls.length !== 1) { + const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'; + const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + return this.#emitSigningErrorAndResetToReadyToSign(message); + } + // In legacy mode, we sign the transaction directly. + // that means the signing will happen on broadcast and here + // checking whether the call is 1 and 1 only is enough + this.accountOp.signature = '0x'; + } + else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) { + // Smart account, but EOA pays the fee + // EOA pays for execute() - relayerless + this.accountOp.signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + } + else if (this.accountOp.gasFeePayment.isERC4337) { + // if there's no entryPointAuthorization, the txn will fail + if (!accountState.isDeployed && + (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)) + return this.#emitSigningErrorAndResetToReadyToSign(`Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`); + const erc4337Estimation = this.estimation.erc4337GasLimits; + const userOperation = getUserOperation(this.account, accountState, this.accountOp, this.bundlerSwitcher.getBundler().getName(), !accountState.isDeployed ? this.accountOp.meta.entryPointAuthorization : undefined); + userOperation.preVerificationGas = erc4337Estimation.preVerificationGas; + userOperation.callGasLimit = toBeHex(BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)); + userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit; + userOperation.paymasterVerificationGasLimit = + erc4337Estimation.paymasterVerificationGasLimit; + userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit; + userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice); + userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas); + const paymaster = erc4337Estimation.paymaster; + if (paymaster.shouldIncludePayment()) + this.#addFeePayment(); + const ambireAccount = new Interface(AmbireAccount.abi); + if (usesOneTimeNonce) { + const signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + // after signing has completed, we wait for the paymaster response + // so we tell the user + this.status = { type: SigningStatus.WaitingForPaymaster }; + this.emitUpdate(); + userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [ + [[getSignableCalls(this.accountOp), signature]] + ]); + this.accountOp.signature = signature; + } + else { + userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [ + getSignableCalls(this.accountOp) + ]); + } + if (paymaster.isUsable()) { + const response = await paymaster.call(this.account, this.accountOp, userOperation, this.#network); + if (response.success) { + const paymasterData = response; + this.status = { type: SigningStatus.InProgress }; + this.emitUpdate(); + userOperation.paymaster = paymasterData.paymaster; + userOperation.paymasterData = paymasterData.paymasterData; + if (usesOneTimeNonce) + userOperation.nonce = getOneTimeNonce(userOperation); + this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored(); + } + else { + const errorResponse = response; + this.emitError({ + level: 'major', + message: errorResponse.message, + error: errorResponse.error + }); + this.status = { type: SigningStatus.ReadyToSign }; + this.emitUpdate(); + this.#reEstimate(); + return; + } + } + // query the application state from memory to understand if the user + // hasn't actually rejected the request while waiting for the + // paymaster to respond + if (!this.#isSignRequestStillActive()) + return; + if (userOperation.requestType === 'standard') { + const typedData = getTypedData(this.#network.chainId, this.accountOp.accountAddr, getUserOpHash(userOperation, this.#network.chainId)); + const signature = wrapStandard(await signer.signTypedData(typedData)); + userOperation.signature = signature; + this.accountOp.signature = signature; + } + this.accountOp.asUserOperation = userOperation; + } + else { + // Relayer + this.#addFeePayment(); + this.accountOp.signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + } + this.status = { type: SigningStatus.Done }; + this.signedAccountOp = structuredClone(this.accountOp); + this.emitUpdate(); + return this.signedAccountOp; + } + catch (error) { + const { message } = getHumanReadableBroadcastError(error); + this.#emitSigningErrorAndResetToReadyToSign(message); + } + } + toJSON() { + return { + ...this, + isInitialized: this.isInitialized, + readyToSign: this.readyToSign, + availableFeeOptions: this.availableFeeOptions, + accountKeyStoreKeys: this.accountKeyStoreKeys, + feeToken: this.feeToken, + feePaidBy: this.feePaidBy, + speedOptions: this.speedOptions, + selectedOption: this.selectedOption, + account: this.account, + errors: this.errors, + gasSavedUSD: this.gasSavedUSD + }; + } +} +//# sourceMappingURL=signAccountOp.js.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js.map b/dist/src/controllers/signAccountOp/signAccountOp.js.map new file mode 100644 index 000000000..4374f3821 --- /dev/null +++ b/dist/src/controllers/signAccountOp/signAccountOp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AbiCoder,\n formatEther,\n formatUnits,\n getAddress,\n Interface,\n toBeHex,\n ZeroAddress\n} from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { SINGLETON } from '../../consts/deploy'\n/* eslint-disable no-restricted-syntax */\nimport { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'\nimport {\n GAS_TANK_TRANSFER_GAS_USED,\n SA_ERC20_TRANSFER_GAS_USED,\n SA_NATIVE_TRANSFER_GAS_USED\n} from '../../consts/signAccountOp/gas'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, GasFeePayment, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { PaymasterErrorReponse, PaymasterSuccessReponse, Sponsor } from '../../libs/erc7677/types'\nimport { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'\nimport { Erc4337GasLimits, EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'\nimport {\n Gas1559Recommendation,\n GasPriceRecommendation,\n GasRecommendation,\n getProbableCallData\n} from '../../libs/gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../../libs/networks/networks'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'\nimport { getGasUsed } from '../../libs/singleton/singleton'\nimport {\n getActivatorCall,\n getOneTimeNonce,\n getUserOperation,\n getUserOpHash,\n isErc4337Broadcast,\n shouldIncludeActivatorCall,\n shouldUseOneTimeNonce\n} from '../../libs/userOperation/userOperation'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\n/* eslint-disable no-restricted-syntax */\nimport { AccountsController } from '../accounts/accounts'\nimport { AccountOpAction } from '../actions/actions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport {\n getFeeSpeedIdentifier,\n getFeeTokenPriceUnavailableWarning,\n getSignificantBalanceDecreaseWarning,\n getTokenUsdAmount\n} from './helper'\n\nexport enum SigningStatus {\n EstimationError = 'estimation-error',\n UnableToSign = 'unable-to-sign',\n ReadyToSign = 'ready-to-sign',\n /**\n * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc.\n * Signing is allowed in this state, but the state of the controller should not change.\n */\n UpdatesPaused = 'updates-paused',\n InProgress = 'in-progress',\n WaitingForPaymaster = 'waiting-for-paymaster-response',\n Done = 'done'\n}\n\nexport type Status = {\n // @TODO: get rid of the object and just use the type\n type: SigningStatus\n}\n\nexport enum FeeSpeed {\n Slow = 'slow',\n Medium = 'medium',\n Fast = 'fast',\n Ape = 'ape'\n}\n\ntype SpeedCalc = {\n type: FeeSpeed\n amount: bigint\n simulatedGasLimit: bigint\n amountFormatted: string\n amountUsd: string\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n}\n\n// declare the statuses we don't want state updates on\nexport const noStateUpdateStatuses = [\n SigningStatus.InProgress,\n SigningStatus.Done,\n SigningStatus.UpdatesPaused,\n SigningStatus.WaitingForPaymaster\n]\n\nexport class SignAccountOpController extends EventEmitter {\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #portfolio: PortfolioController\n\n #externalSignerControllers: ExternalSignerControllers\n\n account: Account\n\n #network: Network\n\n #blockGasLimit: bigint | undefined = undefined\n\n fromActionId: AccountOpAction['id']\n\n accountOp: AccountOp\n\n gasPrices: GasRecommendation[] | null = null\n\n bundlerGasPrices: GasSpeeds | null = null\n\n estimation: EstimateResult | null = null\n\n feeSpeeds: {\n [identifier: string]: SpeedCalc[]\n } = {}\n\n paidBy: string | null = null\n\n feeTokenResult: TokenResult | null = null\n\n selectedFeeSpeed: FeeSpeed = FeeSpeed.Fast\n\n selectedOption: FeePaymentOption | undefined = undefined\n\n status: Status | null = null\n\n gasUsedTooHigh: boolean\n\n gasUsedTooHighAgreed: boolean\n\n #reEstimate: Function\n\n #isSignRequestStillActive: Function\n\n rbfAccountOps: { [key: string]: SubmittedAccountOp | null }\n\n signedAccountOp: AccountOp | null\n\n replacementFeeLow: boolean\n\n warnings: Warning[] = []\n\n // indicates whether the transaction gas is sponsored or not\n isSponsored: boolean = false\n\n // the sponsor data to be displayed, if any\n sponsor: Sponsor | undefined = undefined\n\n bundlerSwitcher: BundlerSwitcher\n\n constructor(\n accounts: AccountsController,\n keystore: KeystoreController,\n portfolio: PortfolioController,\n externalSignerControllers: ExternalSignerControllers,\n account: Account,\n network: Network,\n fromActionId: AccountOpAction['id'],\n accountOp: AccountOp,\n reEstimate: Function,\n isSignRequestStillActive: Function\n ) {\n super()\n\n this.#accounts = accounts\n this.#keystore = keystore\n this.#portfolio = portfolio\n this.#externalSignerControllers = externalSignerControllers\n this.account = account\n this.#network = network\n this.fromActionId = fromActionId\n this.accountOp = structuredClone(accountOp)\n this.#reEstimate = reEstimate\n this.#isSignRequestStillActive = isSignRequestStillActive\n\n this.gasUsedTooHigh = false\n this.gasUsedTooHighAgreed = false\n this.rbfAccountOps = {}\n this.signedAccountOp = null\n this.replacementFeeLow = false\n this.bundlerSwitcher = new BundlerSwitcher(\n network,\n () => {\n return this.status ? this.status.type : null\n },\n noStateUpdateStatuses\n )\n }\n\n get isInitialized(): boolean {\n return !!this.estimation\n }\n\n #setDefaults() {\n // Set the first signer as the default one.\n // If there are more available signers, the user will be able to select a different signer from the application.\n // The main benefit of having a default signer\n // is that it drastically simplifies the logic of determining whether the account is ready for signing.\n // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag.\n // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer.\n // In that case, on the application, we want the \"Sign\" button to be clickable/enabled,\n // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible.\n if (\n this.accountKeyStoreKeys.length &&\n (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)\n ) {\n this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr\n this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type\n }\n }\n\n #setGasFeePayment() {\n if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) {\n this.accountOp.gasFeePayment = this.#getGasFeePayment()\n }\n }\n\n // check if speeds are set for the given identifier\n hasSpeeds(identifier: string) {\n return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length\n }\n\n getCallDataAdditionalByNetwork(): bigint {\n // no additional call data is required for arbitrum as the bytes are already\n // added in the calculation for the L1 fee\n if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) return 0n\n\n const estimationCallData = getProbableCallData(\n this.account,\n this.accountOp,\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId],\n this.#network\n )\n const FIXED_OVERHEAD = 21000n\n const bytes = Buffer.from(estimationCallData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n\n return txDataGas + FIXED_OVERHEAD\n }\n\n get errors(): string[] {\n const errors: string[] = []\n\n if (!this.isInitialized) return errors\n\n const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr)\n const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network)\n\n // This must be the first error check!\n if (isAmbireV1AndNetworkNotSupported) {\n errors.push(\n 'Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'\n )\n\n // Don't show any other errors\n return errors\n }\n\n // if there's an estimation error, show it\n if (this.estimation?.error) {\n errors.push(this.estimation.error.message)\n }\n\n if (\n this.estimation?.gasUsed &&\n this.#blockGasLimit &&\n this.estimation?.gasUsed > this.#blockGasLimit\n ) {\n errors.push('Transaction reverted with estimation too high: above block limit')\n }\n\n if (\n this.#network.predefined &&\n this.estimation?.gasUsed &&\n this.estimation?.gasUsed > 500000000n\n ) {\n errors.push('Unreasonably high estimation. This transaction will probably fail')\n }\n\n // this error should never happen as availableFeeOptions should always have the native option\n if (!this.isSponsored && !this.availableFeeOptions.length)\n errors.push(ERRORS.eoaInsufficientFunds)\n\n // This error should not happen, as in the update method we are always setting a default signer.\n // It may occur, only if there are no available signer.\n if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr)\n errors.push('Please select a signer to sign the transaction.')\n\n const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]\n\n const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!this.isSponsored && !currentPortfolioNetworkNative)\n errors.push(\n 'Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'\n )\n\n // if there's no gasFeePayment calculate but there is: 1) feeTokenResult\n // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error\n if (\n !this.isSponsored &&\n !this.accountOp.gasFeePayment &&\n this.feeTokenResult &&\n this.selectedOption\n ) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (this.hasSpeeds(identifier))\n errors.push('Please select a token and an account for paying the gas fee.')\n }\n\n if (\n !this.isSponsored &&\n this.selectedOption &&\n this.accountOp.gasFeePayment &&\n this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount\n ) {\n const speedCoverage = []\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n\n if (this.feeSpeeds[identifier]) {\n this.feeSpeeds[identifier].forEach((speed) => {\n if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount)\n speedCoverage.push(speed.type)\n })\n }\n\n if (speedCoverage.length === 0) {\n errors.push(\n isSmartAccount(this.account)\n ? \"Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee.\"\n : ERRORS.eoaInsufficientFunds\n )\n } else {\n errors.push(\n 'The selected speed is not available due to insufficient funds. Please select a slower speed.'\n )\n }\n }\n\n // The signing might fail, tell the user why but allow the user to retry signing,\n // @ts-ignore fix TODO: type mismatch\n if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) {\n // @ts-ignore typescript complains, but the error being present gets checked above\n errors.push(this.status.error)\n }\n\n if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.hasSpeeds(identifier)) {\n if (!this.feeTokenResult?.priceIn.length) {\n errors.push(\n `Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`\n )\n } else {\n errors.push(\n 'Unable to estimate the transaction fee. Please try changing the fee token or contact support.'\n )\n }\n }\n }\n\n // if the gasFeePayment is gas tank but the user doesn't have funds, disable it\n let balance = 0\n Object.keys(currentPortfolio).forEach((networkName) => {\n const networkPortfolio = currentPortfolio[networkName]\n if (!networkPortfolio?.result?.total?.usd) return\n\n balance += networkPortfolio.result.total.usd\n })\n if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) {\n errors.push(\n \"Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account\"\n )\n }\n\n return errors\n }\n\n get readyToSign() {\n return (\n !!this.status &&\n (this.status?.type === SigningStatus.ReadyToSign ||\n this.status?.type === SigningStatus.UpdatesPaused)\n )\n }\n\n calculateWarnings() {\n const warnings: Warning[] = []\n\n const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr)\n\n const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(\n latestState,\n pendingState,\n this.accountOp.networkId\n )\n\n if (this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd)\n const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(\n !!this.hasSpeeds(identifier),\n feeTokenHasPrice\n )\n\n // push the warning only if the txn is not sponsored\n if (!this.isSponsored && feeTokenPriceUnavailableWarning)\n warnings.push(feeTokenPriceUnavailableWarning)\n }\n\n if (significantBalanceDecreaseWarning) warnings.push(significantBalanceDecreaseWarning)\n\n this.warnings = warnings\n\n this.emitUpdate()\n }\n\n update({\n gasPrices,\n estimation,\n feeToken,\n paidBy,\n speed,\n signingKeyAddr,\n signingKeyType,\n calls,\n gasUsedTooHighAgreed,\n rbfAccountOps,\n bundlerGasPrices,\n blockGasLimit\n }: {\n gasPrices?: GasRecommendation[]\n estimation?: EstimateResult | null\n feeToken?: TokenResult\n paidBy?: string\n speed?: FeeSpeed\n signingKeyAddr?: Key['addr']\n signingKeyType?: Key['type']\n calls?: AccountOp['calls']\n gasUsedTooHighAgreed?: boolean\n rbfAccountOps?: { [key: string]: SubmittedAccountOp | null }\n bundlerGasPrices?: { speeds: GasSpeeds; bundler: BUNDLER }\n blockGasLimit?: bigint\n }) {\n // once the user commits to the things he sees on his screen,\n // we need to be sure nothing changes afterwards.\n // For example, signing can be slow if it's done by a hardware wallet.\n // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism)\n // If we allow the estimation to affect the controller state during sign,\n // there could be discrepancy between what the user has agreed upon and what\n // we broadcast in the end\n if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) {\n return\n }\n\n if (Array.isArray(calls)) this.accountOp.calls = calls\n\n if (blockGasLimit) this.#blockGasLimit = blockGasLimit\n\n if (gasPrices) this.gasPrices = gasPrices\n\n if (estimation) {\n this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n)\n this.estimation = estimation\n // on each estimation update, set the newest account nonce\n this.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n }\n\n // if estimation is undefined, do not clear the estimation.\n // We do this only if strictly specified as null\n if (estimation === null) this.estimation = null\n\n if (feeToken && paidBy) {\n this.paidBy = paidBy\n this.feeTokenResult = feeToken\n }\n\n if (speed && this.isInitialized) {\n this.selectedFeeSpeed = speed\n }\n\n if (signingKeyAddr && signingKeyType && this.isInitialized) {\n this.accountOp.signingKeyAddr = signingKeyAddr\n this.accountOp.signingKeyType = signingKeyType\n }\n\n if (gasUsedTooHighAgreed !== undefined) this.gasUsedTooHighAgreed = gasUsedTooHighAgreed\n\n // set the rbf is != undefined\n if (rbfAccountOps) this.rbfAccountOps = rbfAccountOps\n\n // Set defaults, if some of the optional params are omitted\n this.#setDefaults()\n\n if (this.estimation && this.paidBy && this.feeTokenResult) {\n this.selectedOption = this.availableFeeOptions.find(\n (option) =>\n option.paidBy === this.paidBy &&\n option.token.address === this.feeTokenResult!.address &&\n option.token.symbol.toLocaleLowerCase() ===\n this.feeTokenResult!.symbol.toLocaleLowerCase() &&\n option.token.flags.onGasTank === this.feeTokenResult!.flags.onGasTank\n )\n }\n\n // update the bundler gas prices if the bundlers match\n if (\n this.estimation?.erc4337GasLimits &&\n bundlerGasPrices &&\n bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()\n ) {\n this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds\n }\n\n if (\n this.estimation &&\n this.estimation.erc4337GasLimits &&\n this.estimation.erc4337GasLimits.paymaster\n ) {\n // if it was sponsored but it no longer is (fallback case),\n // reset the selectedOption option as we use native for the sponsorship\n // but the user might not actually have any native\n const isSponsorshipFallback =\n this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored()\n\n this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored()\n this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor\n\n if (isSponsorshipFallback) {\n this.selectedOption = this.availableFeeOptions.length\n ? this.availableFeeOptions[0]\n : undefined\n }\n }\n\n // calculate the fee speeds if either there are no feeSpeeds\n // or any of properties for update is requested\n if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) {\n this.#updateFeeSpeeds()\n }\n\n // Here, we expect to have most of the fields set, so we can safely set GasFeePayment\n this.#setGasFeePayment()\n this.updateStatus()\n this.calculateWarnings()\n }\n\n updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow = false) {\n // use this to go back to ReadyToSign when a broadcasting error is emitted\n if (forceStatusChange) {\n this.status = { type: forceStatusChange }\n this.emitUpdate()\n return\n }\n\n // no status updates on these two\n const isInTheMiddleOfSigning =\n this.status?.type === SigningStatus.InProgress ||\n this.status?.type === SigningStatus.WaitingForPaymaster\n const isDone = this.status?.type === SigningStatus.Done\n if (isInTheMiddleOfSigning || isDone) return\n\n // if we have an estimation error, set the state so and return\n if (this.estimation?.error) {\n this.status = { type: SigningStatus.EstimationError }\n this.emitUpdate()\n return\n }\n\n if (this.errors.length) {\n this.status = { type: SigningStatus.UnableToSign }\n this.emitUpdate()\n return\n }\n\n if (\n this.isInitialized &&\n this.estimation &&\n this.accountOp?.signingKeyAddr &&\n this.accountOp?.signingKeyType &&\n this.accountOp?.gasFeePayment &&\n // if the gas used is too high, do not allow the user to sign\n // until he explicitly agrees to the risks\n (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)\n ) {\n this.status = { type: SigningStatus.ReadyToSign }\n\n // do not reset this once triggered\n if (replacementFeeLow) this.replacementFeeLow = replacementFeeLow\n this.emitUpdate()\n return\n }\n\n // reset the status if a valid state was not found\n this.status = null\n this.emitUpdate()\n }\n\n reset() {\n this.gasPrices = null\n this.estimation = null\n this.selectedFeeSpeed = FeeSpeed.Fast\n this.paidBy = null\n this.feeTokenResult = null\n this.status = null\n this.emitUpdate()\n }\n\n resetStatus() {\n this.status = null\n this.emitUpdate()\n }\n\n /**\n * Obtain the native token ratio in relation to a fee token.\n *\n * By knowing the USD value of the tokens in the portfolio,\n * we can calculate the ratio between a native token and a fee token.\n *\n * For example, 1 ETH = 8 BNB (ratio: 8).\n *\n * We require the ratio to be in a BigInt format since all the application values,\n * such as amount, gasLimit, etc., are also represented as BigInt numbers.\n */\n #getNativeToFeeTokenRatio(feeToken: TokenResult): bigint | null {\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n\n // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available.\n if (native.address === feeToken.address && native.networkId === feeToken.networkId)\n return BigInt(1 * 1e18)\n\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n\n const nativePrice = native.priceIn.find(isUsd)?.price\n const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price\n\n if (!nativePrice || !feeTokenPrice) return null\n\n const ratio = nativePrice / feeTokenPrice\n\n // Here we multiply it by 1e18, in order to keep the decimal precision.\n // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point.\n // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18.\n const ratio1e18 = ratio * 1e18\n const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0)\n return BigInt(toBigInt)\n }\n\n static getAmountAfterFeeTokenConvert(\n simulatedGasLimit: bigint,\n gasPrice: bigint,\n nativeRatio: bigint,\n feeTokenDecimals: number,\n addedNative: bigint\n ) {\n const amountInWei = simulatedGasLimit * gasPrice + addedNative\n\n // Let's break down the process of converting the amount into FeeToken:\n // 1. Initially, we multiply the amount in wei by the native to fee token ratio.\n // 2. Next, we address the decimal places:\n // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals).\n // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount.\n // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals.\n const extraDecimals = BigInt(10 ** 18)\n const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals))\n const pow = extraDecimals * feeTokenExtraDecimals\n return (amountInWei * nativeRatio) / pow\n }\n\n /**\n * Increase the fee we send to the feeCollector according to the specified\n * options in the network tab\n */\n #increaseFee(amount: bigint): bigint {\n if (!this.#network.feeOptions.feeIncrease) {\n return amount\n }\n\n return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n\n }\n\n /**\n * If the nonce of the current account op and the last account op are the same,\n * do an RBF increase or otherwise the user cannot broadcast the txn\n *\n * calculatedGas: it should be either the whole gasPrice if the network doesn't\n * support EIP-1559 OR it should the maxPriorityFeePerGas if the network\n * supports EIP-1559\n *\n * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas\n */\n #rbfIncrease(\n accId: string,\n calculatedGas: bigint,\n gasPropertyName: 'gasPrice' | 'maxPriorityFeePerGas',\n prevSpeed: SpeedCalc | null\n ): bigint {\n // ape speed gets 50% increase\n const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n\n\n // when doing an RBF, make sure the min gas for the current speed\n // is at least 12% bigger than the previous speed\n const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined\n const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n\n const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas\n\n // if there was an error on the signed account op with a\n // replacement fee too low, we increase by 13% the signed account op\n // IF the new estimation is not actually higher\n if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) {\n const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined\n const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n\n return min > bumpFees ? min : bumpFees\n }\n\n // if no RBF option for this paidBy option, return the amount\n const rbfOp = this.rbfAccountOps[accId]\n if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName])\n return calculatedGas\n\n // increase by a minimum of 13% the last broadcast txn and use that\n // or use the current gas estimation if it's more\n const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n\n const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n\n return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased\n }\n\n get #feeSpeedsLoading() {\n return !this.isInitialized || !this.gasPrices\n }\n\n #updateFeeSpeeds() {\n if (this.#feeSpeedsLoading) return\n\n // reset the fee speeds at the beginning to avoid duplications\n this.feeSpeeds = {}\n\n const gasUsed = this.estimation!.gasUsed\n\n this.availableFeeOptions.forEach((option) => {\n // if a calculation has been made, do not make it again\n // EOA pays for SA is the most common case for this scenario\n //\n // addition: make sure there's no rbfAccountOps as well\n const identifier = getFeeSpeedIdentifier(\n option,\n this.accountOp.accountAddr,\n this.rbfAccountOps[option.paidBy]\n )\n if (this.hasSpeeds(identifier)) {\n return\n }\n\n const nativeRatio = this.#getNativeToFeeTokenRatio(option.token)\n if (!nativeRatio) {\n this.feeSpeeds[identifier] = []\n return\n }\n\n const erc4337GasLimits = this.estimation?.erc4337GasLimits\n if (erc4337GasLimits) {\n const speeds: SpeedCalc[] = []\n const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n\n for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) {\n const simulatedGasLimit =\n BigInt(erc4337GasLimits.callGasLimit) +\n BigInt(erc4337GasLimits.preVerificationGas) +\n BigInt(option.gasUsed ?? 0)\n const gasPrice = BigInt(speedValue.maxFeePerGas)\n let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n 0n\n )\n if (usesPaymaster) amount = this.#increaseFee(amount)\n\n speeds.push({\n type: speed as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas)\n })\n }\n\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier] = speeds\n return\n }\n\n ;(this.gasPrices || []).forEach((gasRecommendation, i) => {\n let amount\n let simulatedGasLimit\n const prevSpeed =\n this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length\n ? this.feeSpeeds[identifier][i - 1]\n : null\n\n // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation\n // depending whether the network supports EIP-1559 and is it enabled on our side.\n // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559.\n // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns\n // the maxPriorityFeePerGas without doing anything (most cases) or if there's a\n // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF.\n // Finally, we calculate the gasPrice:\n // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas\n // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF)\n const maxPriorityFeePerGas =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? this.#rbfIncrease(\n option.paidBy,\n gasRecommendation.maxPriorityFeePerGas,\n 'maxPriorityFeePerGas',\n prevSpeed\n )\n : undefined\n\n const gasPrice =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? (gasRecommendation as Gas1559Recommendation).baseFeePerGas + maxPriorityFeePerGas!\n : this.#rbfIncrease(\n option.paidBy,\n (gasRecommendation as GasPriceRecommendation).gasPrice,\n 'gasPrice',\n prevSpeed\n )\n\n // EOA\n if (!isSmartAccount(this.account)) {\n simulatedGasLimit = gasUsed\n\n if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) {\n simulatedGasLimit = getGasUsed(simulatedGasLimit)\n }\n\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else if (option.paidBy !== this.accountOp.accountAddr) {\n // Smart account, but EOA pays the fee\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork()\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else {\n // Relayer\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed!\n amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n option.addedNative\n )\n amount = this.#increaseFee(amount)\n }\n\n const feeSpeed: SpeedCalc = {\n type: gasRecommendation.name as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas\n }\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier].push(feeSpeed)\n })\n })\n }\n\n #getGasFeePayment(): GasFeePayment | null {\n if (!this.isInitialized) {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.',\n error: new Error(\n 'SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.'\n )\n })\n\n return null\n }\n if (!this.paidBy) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying account not selected')\n })\n\n return null\n }\n if (!this.feeTokenResult) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee token not selected')\n })\n\n return null\n }\n\n // if there are no availableFeeOptions, we don't have a gasFee\n // this is normal though as there are such cases:\n // - EOA paying in native but doesn't have any native\n // so no error should pop out because of this\n if (!this.availableFeeOptions.length) {\n return null\n }\n\n if (!this.selectedOption) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying option not found')\n })\n\n return null\n }\n\n // if there are no fee speeds available for the option, it means\n // the nativeRatio could not be calculated. In that case, we do not\n // emit an error here but proceed and show an explanation to the user\n // in get errors()\n // check test: Signing [Relayer]: ... priceIn | native/Ratio\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.feeSpeeds[identifier].length) {\n return null\n }\n\n const chosenSpeed = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n if (!chosenSpeed) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee speed not selected')\n })\n\n return null\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n return {\n paidBy: this.paidBy,\n // we're allowing EOAs to broadcast on 4337 networks as well\n // in that case, we don't do user operations\n isERC4337:\n this.paidBy === this.accountOp.accountAddr &&\n isErc4337Broadcast(this.account, this.#network, accountState),\n isGasTank: this.feeTokenResult.flags.onGasTank,\n inToken: this.feeTokenResult.address,\n feeTokenNetworkId: this.feeTokenResult.networkId,\n amount: chosenSpeed.amount,\n simulatedGasLimit: chosenSpeed.simulatedGasLimit,\n gasPrice: chosenSpeed.gasPrice,\n maxPriorityFeePerGas:\n 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined\n }\n }\n\n get feeToken(): string | null {\n return this.accountOp?.gasFeePayment?.inToken || null\n }\n\n get feePaidBy(): string | null {\n return this.accountOp?.gasFeePayment?.paidBy || null\n }\n\n get availableFeeOptions(): EstimateResult['feePaymentOptions'] {\n if (!this.estimation) return []\n\n // if the txn is sponsored, return the native option only\n // even if it's balance is 0\n if (this.isSponsored) {\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n // FeeOptions having amount\n const withAmounts = this.estimation.feePaymentOptions.filter(\n (feeOption) => feeOption.availableAmount\n )\n if (withAmounts.length) return withAmounts\n\n // if there are no fee options with amounts, return the native option\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n get accountKeyStoreKeys(): Key[] {\n return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr))\n }\n\n // eslint-disable-next-line class-methods-use-this\n get speedOptions() {\n return Object.values(FeeSpeed) as string[]\n }\n\n get gasSavedUSD(): number | null {\n if (!this.selectedOption?.token.flags.onGasTank) return null\n\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const selectedFeeSpeedData = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n const gasPrice = selectedFeeSpeedData?.gasPrice\n if (!gasPrice) return null\n\n // get the native token from the portfolio to calculate prices\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price\n if (!nativePrice) return null\n\n // 4337 gasUsed is set to 0 in the estimation as we rely\n // on the bundler for the estimation entirely => use hardcode value\n const gasUsedSelectedOption =\n this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n\n ? this.selectedOption.gasUsed\n : GAS_TANK_TRANSFER_GAS_USED\n const isNativeSelected = this.selectedOption.token.address === ZeroAddress\n const gasUsedNative =\n this.availableFeeOptions.find(\n (option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED\n const gasUsedERC20 =\n this.availableFeeOptions.find(\n (option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_ERC20_TRANSFER_GAS_USED\n\n const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20\n const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice)\n\n return Number(gasSavedInNative) * nativePrice\n }\n\n #emitSigningErrorAndResetToReadyToSign(error: string) {\n this.emitError({ level: 'major', message: error, error: new Error(error) })\n this.status = { type: SigningStatus.ReadyToSign }\n\n this.emitUpdate()\n }\n\n #addFeePayment() {\n // In case of gas tank token fee payment, we need to include one more call to account op\n const abiCoder = new AbiCoder()\n\n if (this.isSponsored) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.isGasTank) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', this.accountOp.gasFeePayment!.amount, this.feeTokenResult?.symbol]\n )\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.inToken === '0x0000000000000000000000000000000000000000') {\n // native payment\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: this.accountOp.gasFeePayment!.amount,\n data: '0x'\n }\n } else {\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n this.accountOp.feeCall = {\n to: this.accountOp.gasFeePayment!.inToken,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('transfer', [\n FEE_COLLECTOR,\n this.accountOp.gasFeePayment!.amount\n ])\n }\n }\n }\n\n async sign() {\n if (!this.readyToSign) {\n const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // when signing begings, we stop immediatelly state updates on the controller\n // by changing the status to InProgress. Check update() for more info\n this.status = { type: SigningStatus.InProgress }\n\n if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) {\n const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n if (!this.accountOp?.gasFeePayment || !this.selectedOption) {\n const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const signer = await this.#keystore.getSigner(\n this.accountOp.signingKeyAddr,\n this.accountOp.signingKeyType\n )\n if (!signer) {\n const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n const usesOneTimeNonce = shouldUseOneTimeNonce(accountState)\n if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) {\n this.status = { type: SigningStatus.WaitingForPaymaster }\n } else {\n this.status = { type: SigningStatus.InProgress }\n }\n\n // we update the FE with the changed status (in progress) only after the checks\n // above confirm everything is okay to prevent two different state updates\n this.emitUpdate()\n\n const gasFeePayment = this.accountOp.gasFeePayment\n\n if (signer.init) signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType])\n\n // just in-case: before signing begins, we delete the feeCall;\n // if there's a need for it, it will be added later on in the code.\n // We need this precaution because this could happen:\n // - try to broadcast with the relayer\n // - the feel call gets added\n // - the relayer broadcast fails\n // - the user does another broadcast, this time with EOA pays for SA\n // - the fee call stays, causing a low gas limit revert\n delete this.accountOp.feeCall\n\n // delete the activatorCall as a precaution that it won't be added twice\n delete this.accountOp.activatorCall\n\n // @EntryPoint activation\n // if we broadcast by an EOA, this is the only way to include\n // the entry point as a signer\n if (\n shouldIncludeActivatorCall(\n this.#network,\n this.account,\n accountState,\n this.accountOp.gasFeePayment.isERC4337\n )\n ) {\n this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr)\n }\n\n try {\n // In case of EOA account\n if (!isSmartAccount(this.account)) {\n if (this.accountOp.calls.length !== 1) {\n const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'\n const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // In legacy mode, we sign the transaction directly.\n // that means the signing will happen on broadcast and here\n // checking whether the call is 1 and 1 only is enough\n this.accountOp.signature = '0x'\n } else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) {\n // Smart account, but EOA pays the fee\n // EOA pays for execute() - relayerless\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n } else if (this.accountOp.gasFeePayment.isERC4337) {\n // if there's no entryPointAuthorization, the txn will fail\n if (\n !accountState.isDeployed &&\n (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)\n )\n return this.#emitSigningErrorAndResetToReadyToSign(\n `Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n )\n\n const erc4337Estimation = this.estimation!.erc4337GasLimits as Erc4337GasLimits\n\n const userOperation = getUserOperation(\n this.account,\n accountState,\n this.accountOp,\n this.bundlerSwitcher.getBundler().getName(),\n !accountState.isDeployed ? this.accountOp.meta!.entryPointAuthorization : undefined\n )\n userOperation.preVerificationGas = erc4337Estimation.preVerificationGas\n userOperation.callGasLimit = toBeHex(\n BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)\n )\n userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit\n userOperation.paymasterVerificationGasLimit =\n erc4337Estimation.paymasterVerificationGasLimit\n userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit\n userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice)\n userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas!)\n\n const paymaster = erc4337Estimation.paymaster\n if (paymaster.shouldIncludePayment()) this.#addFeePayment()\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n if (usesOneTimeNonce) {\n const signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n\n // after signing has completed, we wait for the paymaster response\n // so we tell the user\n this.status = { type: SigningStatus.WaitingForPaymaster }\n this.emitUpdate()\n\n userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [\n [[getSignableCalls(this.accountOp), signature]]\n ])\n this.accountOp.signature = signature\n } else {\n userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCalls(this.accountOp)\n ])\n }\n\n if (paymaster.isUsable()) {\n const response = await paymaster.call(\n this.account,\n this.accountOp,\n userOperation,\n this.#network\n )\n\n if (response.success) {\n const paymasterData = response as PaymasterSuccessReponse\n this.status = { type: SigningStatus.InProgress }\n this.emitUpdate()\n\n userOperation.paymaster = paymasterData.paymaster\n userOperation.paymasterData = paymasterData.paymasterData\n if (usesOneTimeNonce) userOperation.nonce = getOneTimeNonce(userOperation)\n this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored()\n } else {\n const errorResponse = response as PaymasterErrorReponse\n this.emitError({\n level: 'major',\n message: errorResponse.message,\n error: errorResponse.error\n })\n this.status = { type: SigningStatus.ReadyToSign }\n this.emitUpdate()\n this.#reEstimate()\n return\n }\n }\n\n // query the application state from memory to understand if the user\n // hasn't actually rejected the request while waiting for the\n // paymaster to respond\n if (!this.#isSignRequestStillActive()) return\n\n if (userOperation.requestType === 'standard') {\n const typedData = getTypedData(\n this.#network.chainId,\n this.accountOp.accountAddr,\n getUserOpHash(userOperation, this.#network.chainId)\n )\n const signature = wrapStandard(await signer.signTypedData(typedData))\n userOperation.signature = signature\n this.accountOp.signature = signature\n }\n this.accountOp.asUserOperation = userOperation\n } else {\n // Relayer\n this.#addFeePayment()\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n }\n\n this.status = { type: SigningStatus.Done }\n this.signedAccountOp = structuredClone(this.accountOp)\n this.emitUpdate()\n return this.signedAccountOp\n } catch (error: any) {\n const { message } = getHumanReadableBroadcastError(error)\n\n this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n }\n\n toJSON() {\n return {\n ...this,\n isInitialized: this.isInitialized,\n readyToSign: this.readyToSign,\n availableFeeOptions: this.availableFeeOptions,\n accountKeyStoreKeys: this.accountKeyStoreKeys,\n feeToken: this.feeToken,\n feePaidBy: this.feePaidBy,\n speedOptions: this.speedOptions,\n selectedOption: this.selectedOption,\n account: this.account,\n errors: this.errors,\n gasSavedUSD: this.gasSavedUSD\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.d.ts b/dist/src/controllers/signMessage/signMessage.d.ts new file mode 100644 index 000000000..7002e642b --- /dev/null +++ b/dist/src/controllers/signMessage/signMessage.d.ts @@ -0,0 +1,39 @@ +import { Account } from '../../interfaces/account'; +import { ExternalSignerControllers, Key } from '../../interfaces/keystore'; +import { Message } from '../../interfaces/userRequest'; +import { AccountsController } from '../accounts/accounts'; +import { SignedMessage } from '../activity/activity'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +import { KeystoreController } from '../keystore/keystore'; +import { NetworksController } from '../networks/networks'; +import { ProvidersController } from '../providers/providers'; +declare const STATUS_WRAPPED_METHODS: { + readonly sign: "INITIAL"; +}; +export declare class SignMessageController extends EventEmitter { + #private; + isInitialized: boolean; + statuses: Statuses; + dapp: { + name: string; + icon: string; + } | null; + messageToSign: Message | null; + signingKeyAddr: Key['addr'] | null; + signingKeyType: Key['type'] | null; + signedMessage: SignedMessage | null; + constructor(keystore: KeystoreController, providers: ProvidersController, networks: NetworksController, accounts: AccountsController, externalSignerControllers: ExternalSignerControllers); + init({ dapp, messageToSign }: { + dapp?: { + name: string; + icon: string; + }; + messageToSign: Message; + }): Promise; + reset(): void; + setSigningKey(signingKeyAddr: Key['addr'], signingKeyType: Key['type']): void; + sign(): Promise; + removeAccountData(address: Account['addr']): void; +} +export {}; +//# sourceMappingURL=signMessage.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.d.ts.map b/dist/src/controllers/signMessage/signMessage.d.ts.map new file mode 100644 index 000000000..b2253232d --- /dev/null +++ b/dist/src/controllers/signMessage/signMessage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"signMessage.d.ts","sourceRoot":"","sources":["../../../../src/controllers/signMessage/signMessage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAQtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,QAAA,MAAM,sBAAsB;;CAElB,CAAA;AAEV,qBAAa,qBAAsB,SAAQ,YAAY;;IAgBrD,aAAa,EAAE,OAAO,CAAQ;IAE9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;IAEhF,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,GAAG,IAAI,CAAO;IAEf,aAAa,EAAE,OAAO,GAAG,IAAI,CAAO;IAEpC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAO;IAEzC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAO;IAEzC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAO;gBAGxC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,yBAAyB,EAAE,yBAAyB;IAWhD,IAAI,CAAC,EACT,IAAI,EACJ,aAAa,EACd,EAAE;QACD,IAAI,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;QACrC,aAAa,EAAE,OAAO,CAAA;KACvB;IA2BD,KAAK;IAYL,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAgJhE,IAAI;IAIV,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;CA4B3C"} \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.js b/dist/src/controllers/signMessage/signMessage.js new file mode 100644 index 000000000..f3360c1f0 --- /dev/null +++ b/dist/src/controllers/signMessage/signMessage.js @@ -0,0 +1,193 @@ +import { hexlify, isHexString, toUtf8Bytes } from 'ethers'; +import EmittableError from '../../classes/EmittableError'; +import { getEIP712Signature, getPlainTextSignature, verifyMessage, wrapCounterfactualSign } from '../../libs/signMessage/signMessage'; +import hexStringToUint8Array from '../../utils/hexStringToUint8Array'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const STATUS_WRAPPED_METHODS = { + sign: 'INITIAL' +}; +export class SignMessageController extends EventEmitter { + #keystore; + #providers; + #networks; + #externalSignerControllers; + #accounts; + // this is the signer from keystore.ts + // we don't have a correct return type at getSigner so + // I'm leaving it as any + #signer; + isInitialized = false; + statuses = STATUS_WRAPPED_METHODS; + dapp = null; + messageToSign = null; + signingKeyAddr = null; + signingKeyType = null; + signedMessage = null; + constructor(keystore, providers, networks, accounts, externalSignerControllers) { + super(); + this.#keystore = keystore; + this.#providers = providers; + this.#networks = networks; + this.#externalSignerControllers = externalSignerControllers; + this.#accounts = accounts; + } + async init({ dapp, messageToSign }) { + // In the unlikely case that the signMessage controller was already + // initialized, but not reset, force reset it to prevent misleadingly + // displaying the prev sign message request. + if (this.isInitialized) + this.reset(); + await this.#accounts.initialLoadPromise; + if (['message', 'typedMessage'].includes(messageToSign.content.kind)) { + if (dapp) { + this.dapp = dapp; + } + this.messageToSign = messageToSign; + this.isInitialized = true; + this.emitUpdate(); + } + else { + this.emitError({ + level: 'major', + message: 'Ambire does not support this request format for signing messages. Please contact support if you believe could be a glitch.', + error: new Error(`The ${messageToSign.content.kind} signing method is not supported by signMessageController.`) + }); + } + } + reset() { + if (!this.isInitialized) + return; + this.isInitialized = false; + this.dapp = null; + this.messageToSign = null; + this.signedMessage = null; + this.signingKeyAddr = null; + this.signingKeyType = null; + this.emitUpdate(); + } + setSigningKey(signingKeyAddr, signingKeyType) { + this.signingKeyAddr = signingKeyAddr; + this.signingKeyType = signingKeyType; + this.emitUpdate(); + } + async #sign() { + if (!this.isInitialized) { + return SignMessageController.#throwNotInitialized(); + } + if (!this.messageToSign) { + return SignMessageController.#throwMissingMessage(); + } + if (!this.signingKeyAddr || !this.signingKeyType) { + return SignMessageController.#throwMissingSigningKey(); + } + try { + this.#signer = await this.#keystore.getSigner(this.signingKeyAddr, this.signingKeyType); + if (this.#signer.init) + this.#signer.init(this.#externalSignerControllers[this.signingKeyType]); + const account = this.#accounts.accounts.find((acc) => acc.addr === this.messageToSign?.accountAddr); + if (!account) { + throw new Error('Account details needed for the signing mechanism are not found. Please try again, re-import your account or contact support if nothing else helps.'); + } + const network = this.#networks.networks.find( + // @ts-ignore this.messageToSign is not null and it has a check + // but typescript malfunctions here + (n) => n.id === this.messageToSign.networkId); + if (!network) { + throw new Error('Network not supported on Ambire. Please contract support.'); + } + const accountState = this.#accounts.accountStates[account.addr][network.id]; + let signature; + try { + if (this.messageToSign.content.kind === 'message') { + const message = this.messageToSign.content.message; + this.messageToSign.content.message = isHexString(message) + ? message + : hexlify(toUtf8Bytes(message.toString())); + signature = await getPlainTextSignature(this.messageToSign.content.message, network, account, accountState, this.#signer); + } + if (this.messageToSign.content.kind === 'typedMessage') { + if (account.creation && this.messageToSign.content.primaryType === 'Permit') { + throw new Error('It looks like that this app doesn\'t detect Smart Account wallets, and requested incompatible approval type. Please, go back to the app and change the approval type to "Transaction", which is supported by Smart Account wallets.'); + } + signature = await getEIP712Signature(this.messageToSign.content, account, accountState, this.#signer, network); + } + } + catch (error) { + throw new Error(error?.message || + 'Something went wrong while signing the message. Please try again later or contact support if the problem persists.'); + } + if (!signature) { + throw new Error('Ambire was not able to retrieve the signature. Please try again or contact support if the problem persists.'); + } + // if the account is not deployed, it should be wrapped with EIP-6492 + // magic bytes + signature = + account.creation && !accountState.isDeployed + ? // https://eips.ethereum.org/EIPS/eip-6492 + wrapCounterfactualSign(signature, account.creation) + : signature; + const personalMsgToValidate = typeof this.messageToSign.content.message === 'string' + ? hexStringToUint8Array(this.messageToSign.content.message) + : this.messageToSign.content.message; + const isValidSignature = await verifyMessage({ + network, + provider: this.#providers.providers[network?.id || 'ethereum'], + // the signer is always the account even if the actual + // signature is from a key that has privs to the account + signer: this.messageToSign?.accountAddr, + signature, + // @ts-ignore TODO: Be aware of the type mismatch, could cause troubles + message: this.messageToSign.content.kind === 'message' ? personalMsgToValidate : undefined, + typedData: this.messageToSign.content.kind === 'typedMessage' + ? { + domain: this.messageToSign.content.domain, + types: this.messageToSign.content.types, + message: this.messageToSign.content.message + } + : undefined + }); + if (!isValidSignature) { + throw new Error('Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support.'); + } + this.signedMessage = { + fromActionId: this.messageToSign.fromActionId, + accountAddr: this.messageToSign.accountAddr, + networkId: this.messageToSign.networkId, + content: this.messageToSign.content, + timestamp: new Date().getTime(), + signature, + dapp: this.dapp + }; + return this.signedMessage; + } + catch (e) { + const error = e instanceof Error ? e : new Error(`Signing failed. Error details: ${e}`); + const message = e?.message || 'Something went wrong while signing the message. Please try again.'; + return Promise.reject(new EmittableError({ level: 'major', message, error })); + } + } + async sign() { + await this.withStatus('sign', async () => this.#sign()); + } + removeAccountData(address) { + if (this.messageToSign?.accountAddr.toLowerCase() === address.toLowerCase()) { + this.reset(); + } + } + static #throwNotInitialized() { + const message = 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'; + const error = new Error('signMessage: controller not initialized'); + return Promise.reject(new EmittableError({ level: 'major', message, error })); + } + static #throwMissingMessage() { + const message = 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'; + const error = new Error('signMessage: missing message to sign'); + return Promise.reject(new EmittableError({ level: 'major', message, error })); + } + static #throwMissingSigningKey() { + const message = 'Please select a signing key and try again.'; + const error = new Error('signMessage: missing selected signing key'); + return Promise.reject(new EmittableError({ level: 'major', message, error })); + } +} +//# sourceMappingURL=signMessage.js.map \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.js.map b/dist/src/controllers/signMessage/signMessage.js.map new file mode 100644 index 000000000..993694e18 --- /dev/null +++ b/dist/src/controllers/signMessage/signMessage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/controllers/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify, isHexString, toUtf8Bytes } from 'ethers'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Message } from '../../interfaces/userRequest'\nimport {\n getEIP712Signature,\n getPlainTextSignature,\n verifyMessage,\n wrapCounterfactualSign\n} from '../../libs/signMessage/signMessage'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport { AccountsController } from '../accounts/accounts'\nimport { SignedMessage } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n sign: 'INITIAL'\n} as const\n\nexport class SignMessageController extends EventEmitter {\n #keystore: KeystoreController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #externalSignerControllers: ExternalSignerControllers\n\n #accounts: AccountsController\n\n // this is the signer from keystore.ts\n // we don't have a correct return type at getSigner so\n // I'm leaving it as any\n #signer: any\n\n isInitialized: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n dapp: {\n name: string\n icon: string\n } | null = null\n\n messageToSign: Message | null = null\n\n signingKeyAddr: Key['addr'] | null = null\n\n signingKeyType: Key['type'] | null = null\n\n signedMessage: SignedMessage | null = null\n\n constructor(\n keystore: KeystoreController,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n externalSignerControllers: ExternalSignerControllers\n ) {\n super()\n\n this.#keystore = keystore\n this.#providers = providers\n this.#networks = networks\n this.#externalSignerControllers = externalSignerControllers\n this.#accounts = accounts\n }\n\n async init({\n dapp,\n messageToSign\n }: {\n dapp?: { name: string; icon: string }\n messageToSign: Message\n }) {\n // In the unlikely case that the signMessage controller was already\n // initialized, but not reset, force reset it to prevent misleadingly\n // displaying the prev sign message request.\n if (this.isInitialized) this.reset()\n\n await this.#accounts.initialLoadPromise\n\n if (['message', 'typedMessage'].includes(messageToSign.content.kind)) {\n if (dapp) {\n this.dapp = dapp\n }\n this.messageToSign = messageToSign\n this.isInitialized = true\n this.emitUpdate()\n } else {\n this.emitError({\n level: 'major',\n message:\n 'Ambire does not support this request format for signing messages. Please contact support if you believe could be a glitch.',\n error: new Error(\n `The ${messageToSign.content.kind} signing method is not supported by signMessageController.`\n )\n })\n }\n }\n\n reset() {\n if (!this.isInitialized) return\n\n this.isInitialized = false\n this.dapp = null\n this.messageToSign = null\n this.signedMessage = null\n this.signingKeyAddr = null\n this.signingKeyType = null\n this.emitUpdate()\n }\n\n setSigningKey(signingKeyAddr: Key['addr'], signingKeyType: Key['type']) {\n this.signingKeyAddr = signingKeyAddr\n this.signingKeyType = signingKeyType\n this.emitUpdate()\n }\n\n async #sign() {\n if (!this.isInitialized) {\n return SignMessageController.#throwNotInitialized()\n }\n\n if (!this.messageToSign) {\n return SignMessageController.#throwMissingMessage()\n }\n\n if (!this.signingKeyAddr || !this.signingKeyType) {\n return SignMessageController.#throwMissingSigningKey()\n }\n\n try {\n this.#signer = await this.#keystore.getSigner(this.signingKeyAddr, this.signingKeyType)\n if (this.#signer.init) this.#signer.init(this.#externalSignerControllers[this.signingKeyType])\n\n const account = this.#accounts.accounts.find(\n (acc) => acc.addr === this.messageToSign?.accountAddr\n )\n if (!account) {\n throw new Error(\n 'Account details needed for the signing mechanism are not found. Please try again, re-import your account or contact support if nothing else helps.'\n )\n }\n const network = this.#networks.networks.find(\n // @ts-ignore this.messageToSign is not null and it has a check\n // but typescript malfunctions here\n (n: Network) => n.id === this.messageToSign.networkId\n )\n if (!network) {\n throw new Error('Network not supported on Ambire. Please contract support.')\n }\n\n const accountState = this.#accounts.accountStates[account.addr][network.id]\n let signature\n try {\n if (this.messageToSign.content.kind === 'message') {\n const message = this.messageToSign.content.message\n this.messageToSign.content.message = isHexString(message)\n ? message\n : hexlify(toUtf8Bytes(message.toString()))\n\n signature = await getPlainTextSignature(\n this.messageToSign.content.message,\n network,\n account,\n accountState,\n this.#signer\n )\n }\n\n if (this.messageToSign.content.kind === 'typedMessage') {\n if (account.creation && this.messageToSign.content.primaryType === 'Permit') {\n throw new Error(\n 'It looks like that this app doesn\\'t detect Smart Account wallets, and requested incompatible approval type. Please, go back to the app and change the approval type to \"Transaction\", which is supported by Smart Account wallets.'\n )\n }\n\n signature = await getEIP712Signature(\n this.messageToSign.content,\n account,\n accountState,\n this.#signer,\n network\n )\n }\n } catch (error: any) {\n throw new Error(\n error?.message ||\n 'Something went wrong while signing the message. Please try again later or contact support if the problem persists.'\n )\n }\n\n if (!signature) {\n throw new Error(\n 'Ambire was not able to retrieve the signature. Please try again or contact support if the problem persists.'\n )\n }\n\n // if the account is not deployed, it should be wrapped with EIP-6492\n // magic bytes\n signature =\n account.creation && !accountState.isDeployed\n ? // https://eips.ethereum.org/EIPS/eip-6492\n wrapCounterfactualSign(signature, account.creation!)\n : signature\n\n const personalMsgToValidate =\n typeof this.messageToSign.content.message === 'string'\n ? hexStringToUint8Array(this.messageToSign.content.message)\n : this.messageToSign.content.message\n\n const isValidSignature = await verifyMessage({\n network,\n provider: this.#providers.providers[network?.id || 'ethereum'],\n // the signer is always the account even if the actual\n // signature is from a key that has privs to the account\n signer: this.messageToSign?.accountAddr,\n signature,\n // @ts-ignore TODO: Be aware of the type mismatch, could cause troubles\n message: this.messageToSign.content.kind === 'message' ? personalMsgToValidate : undefined,\n typedData:\n this.messageToSign.content.kind === 'typedMessage'\n ? {\n domain: this.messageToSign.content.domain,\n types: this.messageToSign.content.types,\n message: this.messageToSign.content.message\n }\n : undefined\n })\n\n if (!isValidSignature) {\n throw new Error(\n 'Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support.'\n )\n }\n\n this.signedMessage = {\n fromActionId: this.messageToSign.fromActionId,\n accountAddr: this.messageToSign.accountAddr,\n networkId: this.messageToSign.networkId,\n content: this.messageToSign.content,\n timestamp: new Date().getTime(),\n signature,\n dapp: this.dapp\n }\n\n return this.signedMessage\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(`Signing failed. Error details: ${e}`)\n const message =\n e?.message || 'Something went wrong while signing the message. Please try again.'\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n }\n\n async sign() {\n await this.withStatus('sign', async () => this.#sign())\n }\n\n removeAccountData(address: Account['addr']) {\n if (this.messageToSign?.accountAddr.toLowerCase() === address.toLowerCase()) {\n this.reset()\n }\n }\n\n static #throwNotInitialized() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: controller not initialized')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingMessage() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: missing message to sign')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingSigningKey() {\n const message = 'Please select a signing key and try again.'\n const error = new Error('signMessage: missing selected signing key')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.d.ts b/dist/src/controllers/swapAndBridge/socketApiMock.d.ts new file mode 100644 index 000000000..d2b61ec1e --- /dev/null +++ b/dist/src/controllers/swapAndBridge/socketApiMock.d.ts @@ -0,0 +1,816 @@ +import { Fetch } from '../../interfaces/fetch'; +import { SocketAPIQuote, SocketAPISendTransactionRequest, SocketAPIToken } from '../../interfaces/swapAndBridge'; +export declare class SocketAPIMock { + #private; + isHealthy: boolean | null; + constructor({ fetch, apiKey }: { + fetch: Fetch; + apiKey: string; + }); + getHealth(): Promise; + updateHealth(): Promise; + resetHealth(): void; + getToTokenList({ toChainId }: { + fromChainId: number; + toChainId: number; + }): Promise; + quote({ fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmount, userAddress }: { + fromChainId: number; + fromTokenAddress: string; + toChainId: number; + toTokenAddress: string; + fromAmount: bigint; + userAddress: string; + isSmartAccount: boolean; + sort: 'time' | 'output'; + }): Promise<{ + routes: { + routeId: string; + isOnlySwapRoute: boolean; + fromAmount: bigint; + toAmount: string; + usedBridgeNames: string[]; + minimumGasBalances: { + '10': string; + '8453': string; + }; + chainGasBalances: { + '10': { + minGasBalance: string; + hasGasBalance: boolean; + }; + '8453': { + minGasBalance: string; + hasGasBalance: boolean; + }; + }; + totalUserTx: number; + sender: string; + recipient: string; + totalGasFeesInUsd: number; + receivedValueInUsd: number; + inputValueInUsd: number; + outputValueInUsd: number; + userTxs: ({ + userTxType: string; + txType: string; + chainId: number; + toAmount: string; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: string; + }; + stepCount: number; + routePath: string; + sender: string; + approvalData: { + minimumApprovalAmount: bigint; + approvalTokenAddress: string; + allowanceTarget: string; + owner: string; + }; + steps: ({ + type: string; + protocol: { + name: string; + displayName: string; + icon: string; + securityScore?: undefined; + robustnessScore?: undefined; + }; + chainId: number; + fromAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + fromAmount: bigint; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + toAmount: string; + swapSlippage: number; + minAmountOut: string; + gasFees: { + gasAmount: string; + gasLimit: number; + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + feesInUsd: number; + }; + bridgeSlippage?: undefined; + fromChainId?: undefined; + toChainId?: undefined; + protocolFees?: undefined; + serviceTime?: undefined; + maxServiceTime?: undefined; + extraData?: undefined; + } | { + type: string; + protocol: { + name: string; + displayName: string; + icon: string; + securityScore: number; + robustnessScore: number; + }; + bridgeSlippage: number; + fromChainId: number; + fromAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + fromAmount: string; + toChainId: number; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: string; + }; + minAmountOut: string; + toAmount: string; + protocolFees: { + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + feesInUsd: number; + amount: string; + }; + gasFees: { + gasAmount: string; + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + gasLimit: number; + feesInUsd: number; + }; + serviceTime: number; + maxServiceTime: number; + extraData: { + rewards: never[]; + }; + chainId?: undefined; + swapSlippage?: undefined; + })[]; + gasFees: { + gasAmount: string; + feesInUsd: number; + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + gasLimit: number; + }; + serviceTime: number; + recipient: string; + maxServiceTime: number; + bridgeSlippage: number; + swapSlippage: number; + userTxIndex: number; + protocol?: undefined; + fromAsset?: undefined; + fromAmount?: undefined; + minAmountOut?: undefined; + } | { + userTxType: string; + txType: string; + swapSlippage: number; + chainId: number; + protocol: { + name: string; + displayName: string; + icon: string; + }; + fromAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: string; + }; + approvalData: null; + fromAmount: string; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: null; + logoURI: null; + chainAgnosticId: null; + }; + toAmount: string; + minAmountOut: string; + gasFees: { + gasAmount: string; + gasLimit: number; + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: string; + }; + feesInUsd: number; + }; + sender: string; + recipient: string; + userTxIndex: number; + stepCount?: undefined; + routePath?: undefined; + steps?: undefined; + serviceTime?: undefined; + maxServiceTime?: undefined; + bridgeSlippage?: undefined; + })[]; + serviceTime: number; + maxServiceTime: number; + integratorFee: { + amount: string; + asset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + }; + extraData: { + rewards: never[]; + }; + }[]; + socketRoute: null; + destinationCallData: {}; + fromChainId: number; + fromAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + toChainId: number; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + bridgeRouteErrors: { + cctp: { + status: string; + }; + 'stargate-v2': { + status: string; + }; + across: { + status: string; + }; + symbiosis: { + status: string; + }; + 'refuel-bridge': { + status: string; + }; + hop: { + status: string; + }; + synapse: { + status: string; + }; + 'polygon-bridge': { + status: string; + }; + hyphen: { + status: string; + }; + 'arbitrum-bridge': { + status: string; + }; + 'anyswap-router-v4': { + status: string; + }; + 'anyswap-router-v6': { + status: string; + }; + hopCctp: { + status: string; + }; + celer: { + status: string; + }; + 'optimism-bridge': { + status: string; + }; + connext: { + status: string; + }; + 'base-bridge': { + status: string; + }; + 'zora-bridge': { + status: string; + }; + 'zksync-native': { + status: string; + }; + 'gnosis-native-bridge': { + status: string; + }; + 'mantle-native-bridge': { + status: string; + }; + 'scroll-native-bridge': { + status: string; + }; + 'mode-native-bridge': { + status: string; + }; + 'super-bridge': { + status: string; + }; + }; + }>; + startRoute({ fromChainId, fromAssetAddress }: { + fromChainId: number; + toChainId: number; + fromAssetAddress: string; + toAssetAddress: string; + route: SocketAPIQuote['selectedRoute']; + }): Promise<{ + userTxType: string; + txType: string; + txData: string; + txTarget: string; + chainId: number; + totalUserTx: number; + userTxIndex: number; + activeRouteId: number; + value: string; + approvalData: { + minimumApprovalAmount: string; + approvalTokenAddress: string; + allowanceTarget: string; + owner: string; + }; + }>; + getRouteStatus(props: { + activeRouteId: SocketAPISendTransactionRequest['activeRouteId']; + userTxIndex: SocketAPISendTransactionRequest['userTxIndex']; + txHash: string; + }): Promise<"ready" | "completed">; + updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']): Promise<{ + activeRouteId: number; + userAddress: string; + totalUserTx: number; + userTxs: ({ + steps: ({ + type: string; + chainId: number; + gasFees: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + gasLimit: number; + feesInUsd: number; + gasAmount: string; + }; + toAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + protocol: { + icon: string; + name: string; + displayName: string; + securityScore?: undefined; + robustnessScore?: undefined; + }; + toAmount: string; + fromAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + fromAmount: string; + minAmountOut: string; + swapSlippage: number; + extraData?: undefined; + toChainId?: undefined; + fromChainId?: undefined; + serviceTime?: undefined; + protocolFees?: undefined; + bridgeSlippage?: undefined; + maxServiceTime?: undefined; + } | { + type: string; + gasFees: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + gasLimit: number; + feesInUsd: number; + gasAmount: string; + }; + toAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: string; + }; + protocol: { + icon: string; + name: string; + displayName: string; + securityScore: number; + robustnessScore: number; + }; + toAmount: string; + extraData: { + rewards: never[]; + }; + fromAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + toChainId: number; + fromAmount: string; + fromChainId: number; + serviceTime: number; + minAmountOut: string; + protocolFees: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + amount: string; + feesInUsd: number; + }; + bridgeSlippage: number; + maxServiceTime: number; + chainId?: undefined; + swapSlippage?: undefined; + })[]; + sender: string; + txType: string; + chainId: number; + gasFees: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + gasLimit: number; + feesInUsd: number; + gasAmount: string; + }; + toAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: string; + }; + toAmount: string; + recipient: string; + routePath: string; + stepCount: number; + userTxType: string; + serviceTime: number; + userTxIndex: number; + approvalData: { + owner: string; + allowanceTarget: string; + approvalTokenAddress: string; + minimumApprovalAmount: string; + }; + swapSlippage: number; + userTxStatus: string; + bridgeSlippage: number; + maxServiceTime: number; + destinationTxHash: string; + destinationTxReceipt: { + to: string; + from: string; + logs: { + data: string; + topics: string[]; + address: string; + logIndex: number; + blockHash: string; + blockNumber: number; + transactionHash: string; + transactionIndex: number; + }[]; + type: number; + status: number; + gasUsed: { + hex: string; + type: string; + }; + blockHash: string; + byzantium: boolean; + logsBloom: string; + blockNumber: number; + confirmations: number; + contractAddress: null; + transactionHash: string; + transactionIndex: number; + cumulativeGasUsed: { + hex: string; + type: string; + }; + effectiveGasPrice: { + hex: string; + type: string; + }; + }; + sourceTransactionHash: string; + sourceTransactionReceipt: { + to: string; + from: string; + logs: never[]; + type: number; + status: number; + gasUsed: { + hex: string; + type: string; + }; + blockHash: string; + byzantium: boolean; + logsBloom: string; + blockNumber: number; + confirmations: number; + contractAddress: null; + transactionHash: string; + transactionIndex: number; + cumulativeGasUsed: { + hex: string; + type: string; + }; + effectiveGasPrice: { + hex: string; + type: string; + }; + }; + protocol?: undefined; + fromAsset?: undefined; + fromAmount?: undefined; + minAmountOut?: undefined; + } | { + sender: string; + txType: string; + chainId: number; + gasFees: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: string; + }; + gasLimit: number; + feesInUsd: number; + gasAmount: string; + }; + toAsset: { + icon: null; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: null; + decimals: number; + chainAgnosticId: null; + }; + protocol: { + icon: string; + name: string; + displayName: string; + }; + toAmount: string; + fromAsset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: string; + }; + recipient: string; + fromAmount: string; + userTxType: string; + userTxIndex: number; + approvalData: null; + minAmountOut: string; + swapSlippage: number; + steps?: undefined; + routePath?: undefined; + stepCount?: undefined; + serviceTime?: undefined; + userTxStatus?: undefined; + bridgeSlippage?: undefined; + maxServiceTime?: undefined; + destinationTxHash?: undefined; + destinationTxReceipt?: undefined; + sourceTransactionHash?: undefined; + sourceTransactionReceipt?: undefined; + })[]; + fromChainId: number; + toChainId: number; + fromAssetAddress: string; + toAssetAddress: string; + fromAmount: string; + toAmount: string; + refuel: null; + routeStatus: string; + transactionData: { + '0': { + txHash: string; + chainId: number; + }; + }; + bridgeTxHash: string; + recipient: string; + integratorId: number; + destinationCallData: null; + bridgeInsuranceData: null; + integratorFee: { + asset: { + icon: string; + name: string; + symbol: string; + address: string; + chainId: number; + logoURI: string; + decimals: number; + chainAgnosticId: null; + }; + amount: string; + }; + createdAt: string; + updatedAt: string; + currentUserTxIndex: number; + fromAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + toAsset: { + chainId: number; + address: string; + symbol: string; + name: string; + decimals: number; + icon: string; + logoURI: string; + chainAgnosticId: null; + }; + }>; + getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']): Promise<{ + userTxType: string; + txType: string; + txData: string; + txTarget: string; + chainId: number; + totalUserTx: number; + activeRouteId: number; + value: string; + userTxIndex: number; + approvalData: null; + }>; +} +//# sourceMappingURL=socketApiMock.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.d.ts.map b/dist/src/controllers/swapAndBridge/socketApiMock.d.ts.map new file mode 100644 index 000000000..4bd1c8772 --- /dev/null +++ b/dist/src/controllers/swapAndBridge/socketApiMock.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"socketApiMock.d.ts","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/socketApiMock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgC,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EACL,cAAc,EACd,+BAA+B,EAC/B,cAAc,EACf,MAAM,gCAAgC,CAAA;AAGvC,qBAAa,aAAa;;IAOxB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAO;gBAEpB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzD,SAAS;IAIT,YAAY;IAIlB,WAAW;IAIL,cAAc,CAAC,EACnB,SAAS,EACV,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAiCvB,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACZ,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,gBAAgB,EAAE,MAAM,CAAA;QACxB,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,OAAO,CAAA;QACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;KACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoXK,UAAU,CAAC,EACf,WAAW,EACX,gBAAgB,EACjB,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KACvC;;;;;;;;;;;;;;;;;IAsBK,cAAc,CAAC,KAAK,EAAE;QAC1B,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,CAAA;QAC/D,WAAW,EAAE,+BAA+B,CAAC,aAAa,CAAC,CAAA;QAC3D,MAAM,EAAE,MAAM,CAAA;KACf;IAIK,iBAAiB,CAAC,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8YjF,kBAAkB,CAAC,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC;;;;;;;;;;;;CAezF"} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.js b/dist/src/controllers/swapAndBridge/socketApiMock.js new file mode 100644 index 000000000..61be53157 --- /dev/null +++ b/dist/src/controllers/swapAndBridge/socketApiMock.js @@ -0,0 +1,853 @@ +/* eslint-disable class-methods-use-this */ +export class SocketAPIMock { + #fetch; + #baseUrl = 'https://api.socket.tech/v2'; + #headers; + isHealthy = null; + constructor({ fetch, apiKey }) { + this.#fetch = fetch; + this.#headers = { + 'API-KEY': apiKey, + Accept: 'application/json', + 'Content-Type': 'application/json' + }; + } + async getHealth() { + return true; + } + async updateHealth() { + this.isHealthy = await this.getHealth(); + } + resetHealth() { + this.isHealthy = null; + } + async getToTokenList({ toChainId }) { + return [ + { + name: 'Coinbase Wrapped BTC', + address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', + icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp', + decimals: 8, + symbol: 'CBBTC', + chainId: toChainId, + logoURI: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp' + }, + { + name: 'Coinbase Wrapped Staked ETH', + address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22', + icon: 'https://media.socket.tech/tokens/all/CBETH', + decimals: 18, + symbol: 'CBETH', + chainId: toChainId, + logoURI: 'https://media.socket.tech/tokens/all/CBETH' + }, + { + name: 'USDT', + address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58', + icon: 'https://media.socket.tech/tokens/all/USDT', + decimals: 6, + symbol: 'USDT', + chainId: toChainId, + logoURI: 'https://media.socket.tech/tokens/all/USDT' + } + ]; + } + async quote({ fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmount, userAddress }) { + return { + routes: [ + { + routeId: '16bb1d94-d028-4b64-b660-c0f50784ea3f', + isOnlySwapRoute: false, + fromAmount, + toAmount: '33', + usedBridgeNames: ['stargate'], + minimumGasBalances: { + '10': '1800000000000000', + '8453': '1800000000000000' + }, + chainGasBalances: { + '10': { + minGasBalance: '1800000000000000', + hasGasBalance: false + }, + '8453': { + minGasBalance: '1800000000000000', + hasGasBalance: false + } + }, + totalUserTx: 2, + sender: userAddress, + recipient: userAddress, + totalGasFeesInUsd: 0.17037701010588965, + receivedValueInUsd: -0.15017701010588966, + inputValueInUsd: 0.01997, + outputValueInUsd: 0.0202, + userTxs: [ + { + userTxType: 'fund-movr', + txType: 'eth_sendTransaction', + chainId: fromChainId, + toAmount: '8398236190482', + toAsset: { + chainId: toChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: 'ETH' + }, + stepCount: 2, + routePath: '406-410', + sender: userAddress, + approvalData: { + minimumApprovalAmount: fromAmount, + approvalTokenAddress: fromTokenAddress, + allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5', + owner: userAddress + }, + steps: [ + { + type: 'middleware', + protocol: { + name: 'zerox', + displayName: '0x', + icon: 'https://media.socket.tech/dexes/0x.svg' + }, + chainId: fromChainId, + fromAsset: { + chainId: fromChainId, + address: fromTokenAddress, + symbol: 'USDC', + name: 'USD Coin', + decimals: 6, + icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg', + chainAgnosticId: null + }, + fromAmount, + toAsset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + toAmount: '8403278157375', + swapSlippage: 1, + minAmountOut: '8319245375801', + gasFees: { + gasAmount: '2297984720000', + gasLimit: 283352, + asset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + feesInUsd: 0.0054468902019687996 + } + }, + { + type: 'bridge', + protocol: { + name: 'stargate', + displayName: 'Stargate', + icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png', + securityScore: 2, + robustnessScore: 3 + }, + bridgeSlippage: 0.5, + fromChainId, + fromAsset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + fromAmount: '8403278157375', + toChainId, + toAsset: { + chainId: toChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: 'ETH' + }, + minAmountOut: '8272212227955', + toAmount: '8398236190482', + protocolFees: { + asset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + feesInUsd: 0.000011950923706808, + amount: '5041966893' + }, + gasFees: { + gasAmount: '64850800171325', + asset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + gasLimit: 1000000, + feesInUsd: 0.15371520313808992 + }, + serviceTime: 60, + maxServiceTime: 7200, + extraData: { + rewards: [] + } + } + ], + gasFees: { + gasAmount: '67148784891325', + feesInUsd: 0.15916209334005874, + asset: { + chainId: fromChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: null + }, + gasLimit: 1283352 + }, + serviceTime: 60, + recipient: userAddress, + maxServiceTime: 7200, + bridgeSlippage: 0.5, + swapSlippage: 1, + userTxIndex: 0 + }, + { + userTxType: 'dex-swap', + txType: 'eth_sendTransaction', + swapSlippage: 1, + chainId: toChainId, + protocol: { + name: 'zerox', + displayName: '0x', + icon: 'https://media.socket.tech/dexes/0x.svg' + }, + fromAsset: { + chainId: toChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: 'ETH' + }, + approvalData: null, + fromAmount: '8398236190482', + toAsset: { + chainId: toChainId, + address: toTokenAddress, + symbol: 'cbBTC', + name: 'Coinbase Wrapped BTC', + decimals: 8, + icon: null, + logoURI: null, + chainAgnosticId: null + }, + toAmount: '33', + minAmountOut: '32', + gasFees: { + gasAmount: '4731453436428', + gasLimit: 441774, + asset: { + chainId: toChainId, + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + symbol: 'ETH', + name: 'Ethereum', + decimals: 18, + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + chainAgnosticId: 'ETH' + }, + feesInUsd: 0.011214916765830925 + }, + sender: userAddress, + recipient: userAddress, + userTxIndex: 1 + } + ], + serviceTime: 60, + maxServiceTime: 7200, + integratorFee: { + amount: '0', + asset: { + chainId: fromChainId, + address: fromTokenAddress, + symbol: 'USDC', + name: 'USD Coin', + decimals: 6, + icon: 'https://media.socket.tech/tokens/all/USDC', + logoURI: 'https://media.socket.tech/tokens/all/USDC', + chainAgnosticId: null + } + }, + extraData: { + rewards: [] + } + } + ], + socketRoute: null, + destinationCallData: {}, + fromChainId, + fromAsset: { + chainId: fromChainId, + address: fromTokenAddress, + symbol: 'USDC', + name: 'USD Coin', + decimals: 6, + icon: 'https://media.socket.tech/tokens/all/USDC', + logoURI: 'https://media.socket.tech/tokens/all/USDC', + chainAgnosticId: null + }, + toChainId, + toAsset: { + chainId: toChainId, + address: toTokenAddress, + symbol: 'CBBTC', + name: 'Coinbase Wrapped BTC', + decimals: 8, + icon: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp', + logoURI: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp', + chainAgnosticId: null + }, + bridgeRouteErrors: { + cctp: { + status: 'MIN_AMOUNT_NOT_MET' + }, + 'stargate-v2': { + status: 'SOCKET_INTERNAL_SERVER_ERROR' + }, + across: { + status: 'MIN_AMOUNT_NOT_MET' + }, + symbiosis: { + status: 'INSUFFICIENT_INPUT_AMOUNT' + }, + 'refuel-bridge': { + status: 'MIN_AMOUNT_NOT_MET' + }, + hop: { + status: 'INSUFFICIENT_INPUT_AMOUNT' + }, + synapse: { + status: 'ROUTE_NOT_FOUND' + }, + 'polygon-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + hyphen: { + status: 'ASSET_NOT_SUPPORTED' + }, + 'arbitrum-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'anyswap-router-v4': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'anyswap-router-v6': { + status: 'ASSET_NOT_SUPPORTED' + }, + hopCctp: { + status: 'ASSET_NOT_SUPPORTED' + }, + celer: { + status: 'ASSET_NOT_SUPPORTED' + }, + 'optimism-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + connext: { + status: 'ASSET_NOT_SUPPORTED' + }, + 'base-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'zora-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'zksync-native': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'gnosis-native-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'mantle-native-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'scroll-native-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'mode-native-bridge': { + status: 'ASSET_NOT_SUPPORTED' + }, + 'super-bridge': { + status: 'ASSET_NOT_SUPPORTED' + } + } + }; + } + async startRoute({ fromChainId, fromAssetAddress }) { + return { + userTxType: 'fund-movr', + txType: 'eth_sendTransaction', + txData: '0x0000019aa1b4f14b00000000000000000000000000000000000000000000000000000000000001960000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000008e4ee8f0b860000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000808415565b00000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b8561954e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000420000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000012556e69737761705633000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b9c45870b1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b0b2c639c533813f4aa9d7837caf62653d097ff850001f442000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004200000000000000000000000000000000000006ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000016e3f1bd1000000000000000000000000ad01c20d5886137e056775af56915de824c8fce5000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000de7265c731f34e2d2fccf2dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000316bf7320e95000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000003bc961047b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + txTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5', + chainId: fromChainId, + totalUserTx: 2, + userTxIndex: 0, + activeRouteId: 4338463, + value: '0x316bf7320e95', + approvalData: { + minimumApprovalAmount: '10000', + approvalTokenAddress: fromAssetAddress, + allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5', + owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8' + } + }; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async getRouteStatus(props) { + return props.userTxIndex === 1 ? 'completed' : 'ready'; + } + async updateActiveRoute(activeRouteId) { + return { + activeRouteId, + userAddress: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + totalUserTx: 2, + userTxs: [ + { + steps: [ + { + type: 'middleware', + chainId: 10, + gasFees: { + asset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + gasLimit: 285352, + feesInUsd: 0.0007534051663168406, + gasAmount: '312852513648' + }, + toAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + protocol: { + icon: 'https://media.socket.tech/dexes/0x.svg', + name: 'zerox', + displayName: '0x' + }, + toAmount: '4135625926302', + fromAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg', + name: 'USD Coin', + symbol: 'USDC', + address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg', + decimals: 6, + chainAgnosticId: null + }, + fromAmount: '10000', + minAmountOut: '4094269667038', + swapSlippage: 1 + }, + { + type: 'bridge', + gasFees: { + asset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + gasLimit: 1000000, + feesInUsd: 0.13350023376256365, + gasAmount: '55436152514581' + }, + toAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 8453, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: 'ETH' + }, + protocol: { + icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png', + name: 'stargate', + displayName: 'Stargate', + securityScore: 2, + robustnessScore: 3 + }, + toAmount: '4133144550747', + extraData: { + rewards: [] + }, + fromAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + toChainId: 8453, + fromAmount: '4135625926302', + fromChainId: 10, + serviceTime: 60, + minAmountOut: '4071122568729', + protocolFees: { + asset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + amount: '2481375555', + feesInUsd: 0.000005975598984039 + }, + bridgeSlippage: 0.5, + maxServiceTime: 7200 + } + ], + sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + txType: 'eth_sendTransaction', + chainId: 10, + gasFees: { + asset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 10, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: null + }, + gasLimit: 1285352, + feesInUsd: 0.13425363892888048, + gasAmount: '55749005028229' + }, + toAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 8453, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: 'ETH' + }, + toAmount: '4133144550747', + recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + routePath: '406-410', + stepCount: 2, + userTxType: 'fund-movr', + serviceTime: 60, + userTxIndex: 0, + approvalData: { + owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5', + approvalTokenAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + minimumApprovalAmount: '10000' + }, + swapSlippage: 1, + userTxStatus: 'completed', + bridgeSlippage: 0.5, + maxServiceTime: 7200, + destinationTxHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + destinationTxReceipt: { + to: '0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa', + from: '0xe93685f3bBA03016F02bD1828BaDD6195988D950', + logs: [ + { + data: '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000f1beca945694a1da1dac5e3021928e2dd6623c4dfe3c3a0cf47fd288f26519c84a0950000000000000000000000000000000000000000000000000000000000000014701a95707a0290ac8b90b3719e8ee5b210360883000000000000000000000000', + topics: [ + '0x2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d', + '0x000000000000000000000000000000000000000000000000000000000000006f', + '0x000000000000000000000000af54be5b6eec24d6bfacf1cce4eaf680a8239398' + ], + address: '0x38dE71124f7a447a01D67945a51eDcE9FF491251', + logIndex: 19, + blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281', + blockNumber: 20922920, + transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + transactionIndex: 37 + }, + { + data: '0x000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4dafaa7b9b7731ec', + topics: ['0xdbdd25248751feb2f3b66721dfdd11662a68bc155af3771e661aabec92fba814'], + address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B', + logIndex: 20, + blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281', + blockNumber: 20922920, + transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + transactionIndex: 37 + }, + { + data: '0x000000000000000000000000000000000000000000000000000003c5b59aac9a', + topics: [ + '0xb4a87134099d10c48345145381989042ab07dc53e6e62a6511fca55438562e26', + '0x00000000000000000000000028fc411f9e1c480ad312b3d9c60c22b965015c6b', + '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea' + ], + address: '0x224D8Fd7aB6AD4c6eb4611Ce56EF35Dec2277F03', + logIndex: 21, + blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281', + blockNumber: 20922920, + transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + transactionIndex: 37 + }, + { + data: '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000008d003bf600000000000000000000000000000000000000000000000000000000076bcd42', + topics: ['0xfb2b592367452f1c437675bed47f5e1e6c25188c17d7ba01a12eb030bc41ccef'], + address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B', + logIndex: 22, + blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281', + blockNumber: 20922920, + transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + transactionIndex: 37 + } + ], + type: 0, + status: 1, + gasUsed: { + hex: '0x0315e0', + type: 'BigNumber' + }, + blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281', + byzantium: true, + logsBloom: '0x00000400000000000080200000000000000002000000000000000000000000000000000000000001000000000000000000020000000000000000400000000000000000000800000000000004000000000080000000000000000000000000000000000000000002000000100000000000000000000000000002000100000000000002008000000001000000004000000100000000000000000000000000000000000008002000000060000000000000000000004100082004000000000000000000040000000000000000000000000000000000000000000000000000008000000000000000000000200000000000000000020000001000000000000000000000', + blockNumber: 20922920, + confirmations: 6, + contractAddress: null, + transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29', + transactionIndex: 37, + cumulativeGasUsed: { + hex: '0x2c93f9', + type: 'BigNumber' + }, + effectiveGasPrice: { + hex: '0x4592f8', + type: 'BigNumber' + } + }, + sourceTransactionHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06', + sourceTransactionReceipt: { + to: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5', + from: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + logs: [], + type: 2, + status: 1, + gasUsed: { + hex: '0x0aefd7', + type: 'BigNumber' + }, + blockHash: '0xd2b0a9277ea51b57cbe99156a537ef552def028e8bed00b1301bc11c08e69a57', + byzantium: true, + logsBloom: '0x0000204202040000000000100000000000004008000800042c04000000080000000100100020000000040010001800082000000000012000040001000020000000400000000000080000000800802000000100000040400000000400800000000004000000000001000010100000000000009002000044000000009a000920000000008040000000000000000000000000000401282000020000009002000020820000000000432000000004800001000020001000200104000000800010000080029002000008000000008000008000000000440000000000000006002000001010800002000000000000000000100480020000000200400000400008003000', + blockNumber: 126518175, + confirmations: 4, + contractAddress: null, + transactionHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06', + transactionIndex: 8, + cumulativeGasUsed: { + hex: '0x202cde', + type: 'BigNumber' + }, + effectiveGasPrice: { + hex: '0x0363c5', + type: 'BigNumber' + } + } + }, + { + sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + txType: 'eth_sendTransaction', + chainId: 8453, + gasFees: { + asset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 8453, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: 'ETH' + }, + gasLimit: 566000, + feesInUsd: 0.00522177973754892, + gasAmount: '2168351094000' + }, + toAsset: { + icon: null, + name: 'Coinbase Wrapped BTC', + symbol: 'cbBTC', + address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + chainId: 8453, + logoURI: null, + decimals: 8, + chainAgnosticId: null + }, + protocol: { + icon: 'https://media.socket.tech/dexes/0x.svg', + name: 'zerox', + displayName: '0x' + }, + toAmount: '16', + fromAsset: { + icon: 'https://assets.polygon.technology/tokenAssets/eth.svg', + name: 'Ethereum', + symbol: 'ETH', + address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + chainId: 8453, + logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg', + decimals: 18, + chainAgnosticId: 'ETH' + }, + recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + fromAmount: '4133144550747', + userTxType: 'dex-swap', + userTxIndex: 1, + approvalData: null, + minAmountOut: '15', + swapSlippage: 1 + } + ], + fromChainId: 10, + toChainId: 8453, + fromAssetAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + toAssetAddress: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + fromAmount: '10000', + toAmount: '16', + refuel: null, + routeStatus: 'PENDING', + transactionData: { + '0': { + txHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06', + chainId: 10 + } + }, + bridgeTxHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06', + recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8', + integratorId: 2564, + destinationCallData: null, + bridgeInsuranceData: null, + integratorFee: { + asset: { + icon: 'https://media.socket.tech/tokens/all/USDC', + name: 'USD Coin', + symbol: 'USDC', + address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + chainId: 10, + logoURI: 'https://media.socket.tech/tokens/all/USDC', + decimals: 6, + chainAgnosticId: null + }, + amount: '0' + }, + createdAt: '2024-10-11T08:25:15.853Z', + updatedAt: '2024-10-11T08:26:38.194Z', + currentUserTxIndex: 1, + fromAsset: { + chainId: 10, + address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + symbol: 'USDC', + name: 'USD Coin', + decimals: 6, + icon: 'https://media.socket.tech/tokens/all/USDC', + logoURI: 'https://media.socket.tech/tokens/all/USDC', + chainAgnosticId: null + }, + toAsset: { + chainId: 8453, + address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + symbol: 'CBBTC', + name: 'Coinbase Wrapped BTC', + decimals: 8, + icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp', + logoURI: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp', + chainAgnosticId: null + } + }; + } + async getNextRouteUserTx(activeRouteId) { + return { + userTxType: 'dex-swap', + txType: 'eth_sendTransaction', + txData: '0x000001947899f9ed000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b28415565b0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000002556e6973776170563200000000000000000000000000000000000000000000000000000000000000000003c5b59aac9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000420000000000000000000000000000000000000600000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000244165726f64726f6d6500000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cf77a3ba9a5ca399b7c97c74d54e5b1beb874e4300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420dd381b31aef6683db6b902084cb0ffece40da0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000000869584cd000000000000000000000000100000000000000000000000000000000000001100000000000000000000000000000000000000005252a17c44e837f8ca3be173000000000000000000000000000000000000000000000000', + txTarget: '0x3a23f943181408eac424116af7b7790c94cb97a5', + chainId: 8453, + totalUserTx: 2, + activeRouteId, + value: '0x03c5b59aac9a', + userTxIndex: 1, + approvalData: null + }; + } +} +//# sourceMappingURL=socketApiMock.js.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.js.map b/dist/src/controllers/swapAndBridge/socketApiMock.js.map new file mode 100644 index 000000000..b0139c391 --- /dev/null +++ b/dist/src/controllers/swapAndBridge/socketApiMock.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socketApiMock.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/socketApiMock.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIQuote,\n SocketAPISendTransactionRequest,\n SocketAPIToken\n} from '../../interfaces/swapAndBridge'\n\n/* eslint-disable class-methods-use-this */\nexport class SocketAPIMock {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n return true\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n async getToTokenList({\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n return [\n {\n name: 'Coinbase Wrapped BTC',\n address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf',\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n decimals: 8,\n symbol: 'CBBTC',\n chainId: toChainId,\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp'\n },\n {\n name: 'Coinbase Wrapped Staked ETH',\n address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22',\n icon: 'https://media.socket.tech/tokens/all/CBETH',\n decimals: 18,\n symbol: 'CBETH',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/CBETH'\n },\n {\n name: 'USDT',\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n icon: 'https://media.socket.tech/tokens/all/USDT',\n decimals: 6,\n symbol: 'USDT',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/USDT'\n }\n ]\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n }) {\n return {\n routes: [\n {\n routeId: '16bb1d94-d028-4b64-b660-c0f50784ea3f',\n isOnlySwapRoute: false,\n fromAmount,\n toAmount: '33',\n usedBridgeNames: ['stargate'],\n minimumGasBalances: {\n '10': '1800000000000000',\n '8453': '1800000000000000'\n },\n chainGasBalances: {\n '10': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n },\n '8453': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n }\n },\n totalUserTx: 2,\n sender: userAddress,\n recipient: userAddress,\n totalGasFeesInUsd: 0.17037701010588965,\n receivedValueInUsd: -0.15017701010588966,\n inputValueInUsd: 0.01997,\n outputValueInUsd: 0.0202,\n userTxs: [\n {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n chainId: fromChainId,\n toAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n stepCount: 2,\n routePath: '406-410',\n sender: userAddress,\n approvalData: {\n minimumApprovalAmount: fromAmount,\n approvalTokenAddress: fromTokenAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: userAddress\n },\n steps: [\n {\n type: 'middleware',\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n chainId: fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n chainAgnosticId: null\n },\n fromAmount,\n toAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n toAmount: '8403278157375',\n swapSlippage: 1,\n minAmountOut: '8319245375801',\n gasFees: {\n gasAmount: '2297984720000',\n gasLimit: 283352,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.0054468902019687996\n }\n },\n {\n type: 'bridge',\n protocol: {\n name: 'stargate',\n displayName: 'Stargate',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n securityScore: 2,\n robustnessScore: 3\n },\n bridgeSlippage: 0.5,\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n fromAmount: '8403278157375',\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n minAmountOut: '8272212227955',\n toAmount: '8398236190482',\n protocolFees: {\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.000011950923706808,\n amount: '5041966893'\n },\n gasFees: {\n gasAmount: '64850800171325',\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.15371520313808992\n },\n serviceTime: 60,\n maxServiceTime: 7200,\n extraData: {\n rewards: []\n }\n }\n ],\n gasFees: {\n gasAmount: '67148784891325',\n feesInUsd: 0.15916209334005874,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1283352\n },\n serviceTime: 60,\n recipient: userAddress,\n maxServiceTime: 7200,\n bridgeSlippage: 0.5,\n swapSlippage: 1,\n userTxIndex: 0\n },\n {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n swapSlippage: 1,\n chainId: toChainId,\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n fromAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n approvalData: null,\n fromAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'cbBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: null,\n logoURI: null,\n chainAgnosticId: null\n },\n toAmount: '33',\n minAmountOut: '32',\n gasFees: {\n gasAmount: '4731453436428',\n gasLimit: 441774,\n asset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n feesInUsd: 0.011214916765830925\n },\n sender: userAddress,\n recipient: userAddress,\n userTxIndex: 1\n }\n ],\n serviceTime: 60,\n maxServiceTime: 7200,\n integratorFee: {\n amount: '0',\n asset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n }\n },\n extraData: {\n rewards: []\n }\n }\n ],\n socketRoute: null,\n destinationCallData: {},\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n logoURI: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n chainAgnosticId: null\n },\n bridgeRouteErrors: {\n cctp: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n 'stargate-v2': {\n status: 'SOCKET_INTERNAL_SERVER_ERROR'\n },\n across: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n symbiosis: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n 'refuel-bridge': {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n hop: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n synapse: {\n status: 'ROUTE_NOT_FOUND'\n },\n 'polygon-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hyphen: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'arbitrum-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v4': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v6': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hopCctp: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n celer: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'optimism-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n connext: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'base-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zora-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zksync-native': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'gnosis-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mantle-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'scroll-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mode-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'super-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n }\n }\n }\n }\n\n async startRoute({\n fromChainId,\n fromAssetAddress\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n return {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n txData:\n '0x0000019aa1b4f14b00000000000000000000000000000000000000000000000000000000000001960000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000008e4ee8f0b860000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000808415565b00000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b8561954e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000420000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000012556e69737761705633000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b9c45870b1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b0b2c639c533813f4aa9d7837caf62653d097ff850001f442000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004200000000000000000000000000000000000006ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000016e3f1bd1000000000000000000000000ad01c20d5886137e056775af56915de824c8fce5000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000de7265c731f34e2d2fccf2dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000316bf7320e95000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000003bc961047b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n chainId: fromChainId,\n totalUserTx: 2,\n userTxIndex: 0,\n activeRouteId: 4338463,\n value: '0x316bf7320e95',\n approvalData: {\n minimumApprovalAmount: '10000',\n approvalTokenAddress: fromAssetAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8'\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async getRouteStatus(props: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n return props.userTxIndex === 1 ? 'completed' : 'ready'\n }\n\n async updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n activeRouteId,\n userAddress: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n totalUserTx: 2,\n userTxs: [\n {\n steps: [\n {\n type: 'middleware',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 285352,\n feesInUsd: 0.0007534051663168406,\n gasAmount: '312852513648'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '4135625926302',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n decimals: 6,\n chainAgnosticId: null\n },\n fromAmount: '10000',\n minAmountOut: '4094269667038',\n swapSlippage: 1\n },\n {\n type: 'bridge',\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.13350023376256365,\n gasAmount: '55436152514581'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n protocol: {\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n name: 'stargate',\n displayName: 'Stargate',\n securityScore: 2,\n robustnessScore: 3\n },\n toAmount: '4133144550747',\n extraData: {\n rewards: []\n },\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n toChainId: 8453,\n fromAmount: '4135625926302',\n fromChainId: 10,\n serviceTime: 60,\n minAmountOut: '4071122568729',\n protocolFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n amount: '2481375555',\n feesInUsd: 0.000005975598984039\n },\n bridgeSlippage: 0.5,\n maxServiceTime: 7200\n }\n ],\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1285352,\n feesInUsd: 0.13425363892888048,\n gasAmount: '55749005028229'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n toAmount: '4133144550747',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n routePath: '406-410',\n stepCount: 2,\n userTxType: 'fund-movr',\n serviceTime: 60,\n userTxIndex: 0,\n approvalData: {\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n approvalTokenAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n minimumApprovalAmount: '10000'\n },\n swapSlippage: 1,\n userTxStatus: 'completed',\n bridgeSlippage: 0.5,\n maxServiceTime: 7200,\n destinationTxHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n destinationTxReceipt: {\n to: '0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa',\n from: '0xe93685f3bBA03016F02bD1828BaDD6195988D950',\n logs: [\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000f1beca945694a1da1dac5e3021928e2dd6623c4dfe3c3a0cf47fd288f26519c84a0950000000000000000000000000000000000000000000000000000000000000014701a95707a0290ac8b90b3719e8ee5b210360883000000000000000000000000',\n topics: [\n '0x2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d',\n '0x000000000000000000000000000000000000000000000000000000000000006f',\n '0x000000000000000000000000af54be5b6eec24d6bfacf1cce4eaf680a8239398'\n ],\n address: '0x38dE71124f7a447a01D67945a51eDcE9FF491251',\n logIndex: 19,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4dafaa7b9b7731ec',\n topics: ['0xdbdd25248751feb2f3b66721dfdd11662a68bc155af3771e661aabec92fba814'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 20,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000003c5b59aac9a',\n topics: [\n '0xb4a87134099d10c48345145381989042ab07dc53e6e62a6511fca55438562e26',\n '0x00000000000000000000000028fc411f9e1c480ad312b3d9c60c22b965015c6b',\n '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea'\n ],\n address: '0x224D8Fd7aB6AD4c6eb4611Ce56EF35Dec2277F03',\n logIndex: 21,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000008d003bf600000000000000000000000000000000000000000000000000000000076bcd42',\n topics: ['0xfb2b592367452f1c437675bed47f5e1e6c25188c17d7ba01a12eb030bc41ccef'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 22,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n }\n ],\n type: 0,\n status: 1,\n gasUsed: {\n hex: '0x0315e0',\n type: 'BigNumber'\n },\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n byzantium: true,\n logsBloom:\n '0x00000400000000000080200000000000000002000000000000000000000000000000000000000001000000000000000000020000000000000000400000000000000000000800000000000004000000000080000000000000000000000000000000000000000002000000100000000000000000000000000002000100000000000002008000000001000000004000000100000000000000000000000000000000000008002000000060000000000000000000004100082004000000000000000000040000000000000000000000000000000000000000000000000000008000000000000000000000200000000000000000020000001000000000000000000000',\n blockNumber: 20922920,\n confirmations: 6,\n contractAddress: null,\n transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37,\n cumulativeGasUsed: {\n hex: '0x2c93f9',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x4592f8',\n type: 'BigNumber'\n }\n },\n sourceTransactionHash:\n '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n sourceTransactionReceipt: {\n to: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n from: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n logs: [],\n type: 2,\n status: 1,\n gasUsed: {\n hex: '0x0aefd7',\n type: 'BigNumber'\n },\n blockHash: '0xd2b0a9277ea51b57cbe99156a537ef552def028e8bed00b1301bc11c08e69a57',\n byzantium: true,\n logsBloom:\n '0x0000204202040000000000100000000000004008000800042c04000000080000000100100020000000040010001800082000000000012000040001000020000000400000000000080000000800802000000100000040400000000400800000000004000000000001000010100000000000009002000044000000009a000920000000008040000000000000000000000000000401282000020000009002000020820000000000432000000004800001000020001000200104000000800010000080029002000008000000008000008000000000440000000000000006002000001010800002000000000000000000100480020000000200400000400008003000',\n blockNumber: 126518175,\n confirmations: 4,\n contractAddress: null,\n transactionHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n transactionIndex: 8,\n cumulativeGasUsed: {\n hex: '0x202cde',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x0363c5',\n type: 'BigNumber'\n }\n }\n },\n {\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 8453,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n gasLimit: 566000,\n feesInUsd: 0.00522177973754892,\n gasAmount: '2168351094000'\n },\n toAsset: {\n icon: null,\n name: 'Coinbase Wrapped BTC',\n symbol: 'cbBTC',\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n chainId: 8453,\n logoURI: null,\n decimals: 8,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '16',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n fromAmount: '4133144550747',\n userTxType: 'dex-swap',\n userTxIndex: 1,\n approvalData: null,\n minAmountOut: '15',\n swapSlippage: 1\n }\n ],\n fromChainId: 10,\n toChainId: 8453,\n fromAssetAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n toAssetAddress: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n fromAmount: '10000',\n toAmount: '16',\n refuel: null,\n routeStatus: 'PENDING',\n transactionData: {\n '0': {\n txHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n chainId: 10\n }\n },\n bridgeTxHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n integratorId: 2564,\n destinationCallData: null,\n bridgeInsuranceData: null,\n integratorFee: {\n asset: {\n icon: 'https://media.socket.tech/tokens/all/USDC',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n decimals: 6,\n chainAgnosticId: null\n },\n amount: '0'\n },\n createdAt: '2024-10-11T08:25:15.853Z',\n updatedAt: '2024-10-11T08:26:38.194Z',\n currentUserTxIndex: 1,\n fromAsset: {\n chainId: 10,\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toAsset: {\n chainId: 8453,\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n chainAgnosticId: null\n }\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n txData:\n '0x000001947899f9ed000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b28415565b0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000002556e6973776170563200000000000000000000000000000000000000000000000000000000000000000003c5b59aac9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000420000000000000000000000000000000000000600000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000244165726f64726f6d6500000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cf77a3ba9a5ca399b7c97c74d54e5b1beb874e4300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420dd381b31aef6683db6b902084cb0ffece40da0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000000869584cd000000000000000000000000100000000000000000000000000000000000001100000000000000000000000000000000000000005252a17c44e837f8ca3be173000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23f943181408eac424116af7b7790c94cb97a5',\n chainId: 8453,\n totalUserTx: 2,\n activeRouteId,\n value: '0x03c5b59aac9a',\n userTxIndex: 1,\n approvalData: null\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts b/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts new file mode 100644 index 000000000..7af4a879e --- /dev/null +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts @@ -0,0 +1,136 @@ +import { Network } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import { ActiveRoute, SocketAPIQuote, SocketAPIRoute, SocketAPISendTransactionRequest, SocketAPIToken, SwapAndBridgeToToken } from '../../interfaces/swapAndBridge'; +import { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'; +import { TokenResult } from '../../libs/portfolio'; +import { SocketAPI } from '../../services/socket/api'; +import { ActionsController } from '../actions/actions'; +import { ActivityController } from '../activity/activity'; +import EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'; +import { InviteController } from '../invite/invite'; +import { NetworksController } from '../networks/networks'; +import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +export declare enum SwapAndBridgeFormStatus { + Empty = "empty", + Invalid = "invalid", + FetchingRoutes = "fetching-routes", + NoRoutesFound = "no-routes-found", + InvalidRouteSelected = "invalid-route-selected", + ReadyToSubmit = "ready-to-submit" +} +declare const STATUS_WRAPPED_METHODS: { + readonly addToTokenByAddress: "INITIAL"; +}; +/** + * The Swap and Bridge controller is responsible for managing the state and + * logic related to swapping and bridging tokens across different networks. + * Key responsibilities: + * - Initially setting up the swap and bridge form with the necessary data. + * - Managing form state for token swap and bridge operations (including user preferences). + * - Fetching and updating token lists (from and to). + * - Fetching and updating quotes for token swaps and bridges. + * - Manages token active routes + */ +export declare class SwapAndBridgeController extends EventEmitter { + #private; + statuses: Statuses; + updateQuoteStatus: 'INITIAL' | 'LOADING'; + updateToTokenListStatus: 'INITIAL' | 'LOADING'; + sessionIds: string[]; + fromChainId: number | null; + fromSelectedToken: TokenResult | null; + fromAmount: string; + fromAmountInFiat: string; + fromAmountFieldMode: 'fiat' | 'token'; + toChainId: number | null; + toSelectedToken: SwapAndBridgeToToken | null; + quote: SocketAPIQuote | null; + quoteRoutesStatuses: { + [key: string]: { + status: string; + }; + }; + portfolioTokenList: TokenResult[]; + isTokenListLoading: boolean; + routePriority: 'output' | 'time'; + constructor({ selectedAccount, networks, activity, socketAPI, storage, actions, invite }: { + selectedAccount: SelectedAccountController; + networks: NetworksController; + activity: ActivityController; + socketAPI: SocketAPI; + storage: Storage; + actions: ActionsController; + invite: InviteController; + }); + get maxFromAmount(): string; + get maxFromAmountInFiat(): string; + get isFormEmpty(): boolean; + get formStatus(): SwapAndBridgeFormStatus; + get validateFromAmount(): { + success: boolean; + message: string; + }; + get activeRoutesInProgress(): ActiveRoute[]; + get activeRoutes(): ActiveRoute[]; + set activeRoutes(value: ActiveRoute[]); + get isSwitchFromAndToTokensEnabled(): boolean; + get shouldEnableRoutesSelection(): boolean; + initForm(sessionId: string): Promise; + get isHealthy(): boolean | null; + get supportedChainIds(): Network['chainId'][]; + unloadScreen(sessionId: string): void; + updateForm(props: { + fromAmount?: string; + fromAmountInFiat?: string; + fromAmountFieldMode?: 'fiat' | 'token'; + fromSelectedToken?: TokenResult | null; + toChainId?: bigint | number; + toSelectedToken?: SocketAPIToken | null; + routePriority?: 'output' | 'time'; + }): void; + resetForm(shouldEmit?: boolean): void; + updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]): void; + updateToTokenList(shouldReset: boolean, addressToSelect?: string): Promise; + get toTokenList(): SwapAndBridgeToToken[]; + addToTokenByAddress: (address: string) => Promise; + switchFromAndToTokens(): Promise; + updateQuote(options?: { + skipQuoteUpdateOnSameValues?: boolean; + skipPreviousQuoteRemoval?: boolean; + skipStatusUpdate?: boolean; + }): Promise; + getRouteStartUserTx(): Promise; + getNextRouteUserTx(activeRouteId: number): Promise; + checkForNextUserTxForActiveRoutes(): Promise; + selectRoute(route: SocketAPIRoute): void; + addActiveRoute(activeRoute: { + activeRouteId: SocketAPISendTransactionRequest['activeRouteId']; + userTxIndex: SocketAPISendTransactionRequest['userTxIndex']; + }): Promise; + updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId'], activeRoute?: Partial, forceUpdateRoute?: boolean): void; + removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']): void; + handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp): void; + onAccountChange(): void; + get banners(): import("../../interfaces/banner").Banner[]; + toJSON(): this & { + toTokenList: SwapAndBridgeToToken[]; + maxFromAmount: string; + maxFromAmountInFiat: string; + validateFromAmount: { + success: boolean; + message: string; + }; + isFormEmpty: boolean; + formStatus: SwapAndBridgeFormStatus; + activeRoutesInProgress: ActiveRoute[]; + activeRoutes: ActiveRoute[]; + isSwitchFromAndToTokensEnabled: boolean; + banners: import("../../interfaces/banner").Banner[]; + isHealthy: boolean | null; + shouldEnableRoutesSelection: boolean; + supportedChainIds: bigint[]; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +export {}; +//# sourceMappingURL=swapAndBridge.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts.map b/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts.map new file mode 100644 index 000000000..006cef97c --- /dev/null +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.d.ts","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js b/dist/src/controllers/swapAndBridge/swapAndBridge.js new file mode 100644 index 000000000..176df71ff --- /dev/null +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js @@ -0,0 +1,1030 @@ +/* eslint-disable no-await-in-loop */ +import { formatUnits, isAddress, parseUnits } from 'ethers'; +import { v4 as uuidv4 } from 'uuid'; +import EmittableError from '../../classes/EmittableError'; +import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; +import { isSmartAccount } from '../../libs/account/account'; +import { AccountOpStatus } from '../../libs/accountOp/accountOp'; +import { getBridgeBanners } from '../../libs/banners/banners'; +import { getTokenAmount } from '../../libs/portfolio/helpers'; +import { convertPortfolioTokenToSocketAPIToken, getActiveRoutesForAccount, getIsBridgeTxn, getIsTokenEligibleForSwapAndBridge, getQuoteRouteSteps, sortPortfolioTokenList, sortTokenListResponse } from '../../libs/swapAndBridge/swapAndBridge'; +import { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'; +import { getSanitizedAmount } from '../../libs/transfer/amount'; +import { normalizeIncomingSocketToken } from '../../services/socket/api'; +import { ZERO_ADDRESS } from '../../services/socket/constants'; +import { validateSendTransferAmount } from '../../services/validations/validate'; +import formatDecimals from '../../utils/formatDecimals/formatDecimals'; +import { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'; +import wait from '../../utils/wait'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const HARD_CODED_CURRENCY = 'usd'; +const CONVERSION_PRECISION = 16; +const CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION); +const NETWORK_MISMATCH_MESSAGE = 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'; +export var SwapAndBridgeFormStatus; +(function (SwapAndBridgeFormStatus) { + SwapAndBridgeFormStatus["Empty"] = "empty"; + SwapAndBridgeFormStatus["Invalid"] = "invalid"; + SwapAndBridgeFormStatus["FetchingRoutes"] = "fetching-routes"; + SwapAndBridgeFormStatus["NoRoutesFound"] = "no-routes-found"; + SwapAndBridgeFormStatus["InvalidRouteSelected"] = "invalid-route-selected"; + SwapAndBridgeFormStatus["ReadyToSubmit"] = "ready-to-submit"; +})(SwapAndBridgeFormStatus || (SwapAndBridgeFormStatus = {})); +const STATUS_WRAPPED_METHODS = { + addToTokenByAddress: 'INITIAL' +}; +const SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24; // 1 day +const TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4; // 4 hours +const PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [ + 'stargate', + 'stargate-v2', + 'arbitrum-bridge', + 'zksync-native' +]; +/** + * The Swap and Bridge controller is responsible for managing the state and + * logic related to swapping and bridging tokens across different networks. + * Key responsibilities: + * - Initially setting up the swap and bridge form with the necessary data. + * - Managing form state for token swap and bridge operations (including user preferences). + * - Fetching and updating token lists (from and to). + * - Fetching and updating quotes for token swaps and bridges. + * - Manages token active routes + */ +export class SwapAndBridgeController extends EventEmitter { + #selectedAccount; + #networks; + #actions; + #activity; + #invite; + #storage; + #socketAPI; + #activeRoutes = []; + statuses = STATUS_WRAPPED_METHODS; + updateQuoteStatus = 'INITIAL'; + #updateToTokenListThrottle = { + time: 0, + shouldReset: true, + throttled: false + }; + #updateQuoteId; + #updateQuoteTimeout; + updateToTokenListStatus = 'INITIAL'; + sessionIds = []; + fromChainId = 1; + fromSelectedToken = null; + fromAmount = ''; + fromAmountInFiat = ''; + fromAmountFieldMode = 'token'; + toChainId = 1; + toSelectedToken = null; + quote = null; + quoteRoutesStatuses = {}; + portfolioTokenList = []; + isTokenListLoading = false; + /** + * Needed to efficiently manage and cache token lists for different chain + * combinations (fromChainId and toChainId) without having to fetch them + * repeatedly from the API. Moreover, this way tokens added to a list by + * address are also cached for sometime. + */ + #cachedToTokenLists = {}; + #toTokenList = []; + /** + * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API + * calls to fetch the supported chains from our service provider. + */ + #cachedSupportedChains = { lastFetched: 0, data: [] }; + routePriority = 'output'; + // Holds the initial load promise, so that one can wait until it completes + #initialLoadPromise; + #shouldDebounceFlags = {}; + constructor({ selectedAccount, networks, activity, socketAPI, storage, actions, invite }) { + super(); + this.#selectedAccount = selectedAccount; + this.#networks = networks; + this.#activity = activity; + this.#socketAPI = socketAPI; + this.#storage = storage; + this.#actions = actions; + this.#invite = invite; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#initialLoadPromise = this.#load(); + } + #emitUpdateIfNeeded() { + const shouldSkipUpdate = + // No need to emit emit updates if there are no active sessions + !this.sessionIds.length && + // but ALSO there are no active routes (otherwise, banners need the updates) + !this.activeRoutes.length; + if (shouldSkipUpdate) + return; + super.emitUpdate(); + } + async #load() { + await this.#networks.initialLoadPromise; + await this.#selectedAccount.initialLoadPromise; + this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', []); + this.#selectedAccount.onUpdate(() => { + this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => { + if (this.#selectedAccount.portfolio.isAllReady) { + this.isTokenListLoading = false; + this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens); + // To token list includes selected account portfolio tokens, it should get an update too + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.updateToTokenList(false); + } + }); + }); + this.#emitUpdateIfNeeded(); + } + // The token in portfolio is the source of truth for the amount, it updates + // on every balance (pending or anything) change. + #getFromSelectedTokenInPortfolio = () => this.portfolioTokenList.find((t) => t.address === this.fromSelectedToken?.address && + t.networkId === this.fromSelectedToken?.networkId && + getIsTokenEligibleForSwapAndBridge(t)); + get maxFromAmount() { + const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken; + if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number') + return '0'; + return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals); + } + get maxFromAmountInFiat() { + const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken; + if (!tokenRef || getTokenAmount(tokenRef) === 0n) + return '0'; + const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; + if (!tokenPrice || !Number(this.maxFromAmount)) + return '0'; + const maxAmount = getTokenAmount(tokenRef); + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss + return formatUnits(BigInt(maxAmount) * tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + tokenRef.decimals + tokenPriceDecimals); + } + get isFormEmpty() { + return (!this.fromChainId || + !this.toChainId || + !this.fromAmount || + !this.fromSelectedToken || + !this.toSelectedToken); + } + get formStatus() { + if (this.isFormEmpty) + return SwapAndBridgeFormStatus.Empty; + if (this.validateFromAmount.message) + return SwapAndBridgeFormStatus.Invalid; + if (this.updateQuoteStatus !== 'INITIAL' && !this.quote) + return SwapAndBridgeFormStatus.FetchingRoutes; + if (!this.quote?.selectedRoute) + return SwapAndBridgeFormStatus.NoRoutesFound; + if (this.quote?.selectedRoute?.errorMessage) + return SwapAndBridgeFormStatus.InvalidRouteSelected; + return SwapAndBridgeFormStatus.ReadyToSubmit; + } + get validateFromAmount() { + if (!this.fromSelectedToken) + return { success: false, message: '' }; + if (!this.isFormEmpty && + !this.quote && + Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')) { + return { + success: true, + message: '🔔 A route was found for this pair but the minimum token amount was not met.' + }; + } + return validateSendTransferAmount(this.fromAmount, Number(this.maxFromAmount), Number(this.maxFromAmountInFiat), this.fromSelectedToken); + } + get activeRoutesInProgress() { + return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash); + } + get activeRoutes() { + return this.#activeRoutes; + } + set activeRoutes(value) { + this.#activeRoutes = value; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#storage.set('swapAndBridgeActiveRoutes', value); + } + get isSwitchFromAndToTokensEnabled() { + if (!this.toSelectedToken) + return false; + if (!this.portfolioTokenList.length) + return false; + const toSelectedTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); + return !!this.portfolioTokenList.find((token) => token.address === this.toSelectedToken.address && + token.networkId === toSelectedTokenNetwork.id); + } + get shouldEnableRoutesSelection() { + return (!!this.quote && + !!this.quote.routes && + this.quote.routes.length > 1 && + this.updateQuoteStatus !== 'LOADING'); + } + async initForm(sessionId) { + await this.#initialLoadPromise; + if (this.sessionIds.includes(sessionId)) + return; + // reset only if there are no other instances opened/active + if (!this.sessionIds.length) { + this.resetForm(); // clear prev session form state + // for each new session remove the completed activeRoutes from the previous session + this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed'); + // remove activeRoutes errors from the previous session + this.activeRoutes.forEach((r) => { + if (r.routeStatus !== 'failed') { + // eslint-disable-next-line no-param-reassign + delete r.error; + } + }); + if (this.activeRoutes.length) { + // Otherwise there may be an emitUpdate with [] tokens + this.isTokenListLoading = true; + // update the activeRoute.route prop for the new session + this.activeRoutes.forEach((r) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.updateActiveRoute(r.activeRouteId, undefined, true); + }); + } + } + this.sessionIds.push(sessionId); + // do not await the health status check to prevent UI freeze while fetching + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#socketAPI.updateHealth(); + this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens); + this.isTokenListLoading = false; + // Do not await on purpose as it's not critical for the controller state to be ready + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#fetchSupportedChainsIfNeeded(); + this.#emitUpdateIfNeeded(); + } + get isHealthy() { + return this.#socketAPI.isHealthy; + } + #fetchSupportedChainsIfNeeded = async () => { + const shouldNotReFetchSupportedChains = this.#cachedSupportedChains.data.length && + Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD; + if (shouldNotReFetchSupportedChains) + return; + try { + const supportedChainsResponse = await this.#socketAPI.getSupportedChains(); + this.#cachedSupportedChains = { + lastFetched: Date.now(), + data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled) + }; + this.#emitUpdateIfNeeded(); + } + catch (error) { + // Fail silently, as this is not a critical feature, Swap & Bridge is still usable + this.emitError({ error, level: 'silent', message: error?.message }); + } + }; + get supportedChainIds() { + return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId)); + } + get #toTokenListKey() { + if (this.fromChainId === null || this.toChainId === null) + return null; + return `from-${this.fromChainId}-to-${this.toChainId}`; + } + unloadScreen(sessionId) { + this.sessionIds = this.sessionIds.filter((id) => id !== sessionId); + if (!this.sessionIds.length) { + this.resetForm(true); + // Reset health to prevent the error state from briefly flashing + // before the next health check resolves when the Swap & Bridge + // screen is opened after a some time + this.#socketAPI.resetHealth(); + } + } + updateForm(props) { + const { fromAmount, fromAmountInFiat, fromAmountFieldMode, fromSelectedToken, toChainId, toSelectedToken, routePriority } = props; + if (fromAmount !== undefined) { + this.fromAmount = fromAmount; + (() => { + if (fromAmount === '') { + this.fromAmountInFiat = ''; + return; + } + const tokenPrice = this.fromSelectedToken?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; + if (!tokenPrice) { + this.fromAmountInFiat = ''; + return; + } + if (this.fromAmountFieldMode === 'fiat' && + typeof this.fromSelectedToken?.decimals === 'number') { + this.fromAmountInFiat = fromAmount; + // Get the number of decimals + const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0; + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + // Convert the numbers to big int + const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals); + this.fromAmount = formatUnits((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals); + return; + } + if (this.fromAmountFieldMode === 'token') { + this.fromAmount = fromAmount; + if (!this.fromSelectedToken) + return; + const sanitizedFieldValue = getSanitizedAmount(fromAmount, this.fromSelectedToken.decimals); + // Convert the field value to big int + const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals); + if (!formattedAmount) + return; + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + this.fromAmountInFiat = formatUnits(formattedAmount * tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + this.fromSelectedToken.decimals + tokenPriceDecimals); + } + })(); + } + if (fromAmountInFiat !== undefined) { + this.fromAmountInFiat = fromAmountInFiat; + } + if (fromAmountFieldMode) { + this.fromAmountFieldMode = fromAmountFieldMode; + } + if (fromSelectedToken) { + const isFromNetworkChanged = this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId; + if (isFromNetworkChanged) { + const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId); + if (network) { + this.fromChainId = Number(network.chainId); + // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update) + this.toChainId = Number(network.chainId); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.updateToTokenList(true); + } + } + const shouldResetFromTokenAmount = isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address; + if (shouldResetFromTokenAmount) { + this.fromAmount = ''; + this.fromAmountInFiat = ''; + this.fromAmountFieldMode = 'token'; + } + // Always update to reflect portfolio amount (or other props) changes + this.fromSelectedToken = fromSelectedToken; + } + if (toChainId) { + if (this.toChainId !== Number(toChainId)) { + this.toChainId = Number(toChainId); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.updateToTokenList(true); + } + } + if (toSelectedToken) { + this.toSelectedToken = toSelectedToken; + } + if (routePriority) { + this.routePriority = routePriority; + if (this.quote) { + this.quote = null; + this.quoteRoutesStatuses = {}; + } + } + this.updateQuote(); + this.#emitUpdateIfNeeded(); + } + resetForm(shouldEmit) { + this.fromChainId = 1; + this.fromSelectedToken = null; + this.fromAmount = ''; + this.fromAmountInFiat = ''; + this.fromAmountFieldMode = 'token'; + this.toChainId = 1; + this.toSelectedToken = null; + this.quote = null; + this.quoteRoutesStatuses = {}; + this.portfolioTokenList = []; + this.#toTokenList = []; + if (shouldEmit) + this.#emitUpdateIfNeeded(); + } + updatePortfolioTokenList(nextPortfolioTokenList) { + const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge); + this.portfolioTokenList = sortPortfolioTokenList( + // Filtering out hidden tokens here means: 1) They won't be displayed in + // the "From" token list (`this.portfolioTokenList`) and 2) They won't be + // added to the "Receive" token list as additional tokens from portfolio, + // BUT 3) They will appear in the "Receive" if they are present in service + // provider's to token list. This is the desired behavior. + tokens.filter((t) => !t.flags.isHidden)); + const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find((t) => t.address === this.fromSelectedToken?.address && + t.networkId === this.fromSelectedToken?.networkId); + const shouldUpdateFromSelectedToken = !this.fromSelectedToken || // initial (default) state + // May happen if selected account gets changed or the token gets send away in the meantime + !fromSelectedTokenInNextPortfolio || + // May happen if user receives or sends the token in the meantime + fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount; + if (shouldUpdateFromSelectedToken) { + this.updateForm({ + fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null + }); + } + else { + this.#emitUpdateIfNeeded(); + } + } + async updateToTokenList(shouldReset, addressToSelect) { + const now = Date.now(); + const timeSinceLastCall = now - this.#updateToTokenListThrottle.time; + if (timeSinceLastCall <= 500) { + this.#updateToTokenListThrottle.shouldReset = shouldReset; + this.#updateToTokenListThrottle.addressToSelect = addressToSelect; + if (!this.#updateToTokenListThrottle.throttled) { + this.#updateToTokenListThrottle.throttled = true; + await wait(500 - timeSinceLastCall); + this.#updateToTokenListThrottle.throttled = false; + await this.updateToTokenList(this.#updateToTokenListThrottle.shouldReset, this.#updateToTokenListThrottle.addressToSelect); + } + return; + } + this.updateToTokenListStatus = 'LOADING'; + this.#updateToTokenListThrottle.time = now; + if (!this.fromChainId || !this.toChainId) + return; + if (shouldReset) { + this.#toTokenList = []; + this.toSelectedToken = null; + this.#emitUpdateIfNeeded(); + } + try { + const toTokenListInCache = this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]; + let upToDateToTokenList = toTokenListInCache?.data || []; + const shouldFetchTokenList = !upToDateToTokenList.length || + now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD; + if (shouldFetchTokenList) { + upToDateToTokenList = await this.#socketAPI.getToTokenList({ + fromChainId: this.fromChainId, + toChainId: this.toChainId + }); + if (this.#toTokenListKey) + this.#cachedToTokenLists[this.#toTokenListKey] = { + lastFetched: now, + data: upToDateToTokenList + }; + } + const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); + // should never happen + if (!toTokenNetwork) + throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE); + const additionalTokensFromPortfolio = this.portfolioTokenList + .filter((t) => t.networkId === toTokenNetwork.id) + .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address)) + .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId))); + this.#toTokenList = sortTokenListResponse([...upToDateToTokenList, ...additionalTokensFromPortfolio], this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); + if (!this.toSelectedToken) { + if (addressToSelect) { + const token = this.#toTokenList.find((t) => t.address === addressToSelect); + if (token) { + this.updateForm({ toSelectedToken: token }); + this.updateToTokenListStatus = 'INITIAL'; + this.#emitUpdateIfNeeded(); + return; + } + } + } + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + this.emitError({ error, level: 'major', message }); + } + this.updateToTokenListStatus = 'INITIAL'; + this.#emitUpdateIfNeeded(); + } + get toTokenList() { + const isSwapping = this.fromChainId === this.toChainId; + if (isSwapping) { + // Swaps between same "from" and "to" tokens are not feasible, filter them out + return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address); + } + return this.#toTokenList; + } + async #addToTokenByAddress(address) { + if (!this.toChainId) + return; // should never happen + if (!isAddress(address)) + return; // no need to attempt with invalid addresses + const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address); + if (isAlreadyInTheList) + return; + let token; + try { + token = await this.#socketAPI.getToken({ address, chainId: this.toChainId }); + if (!token) + throw new SwapAndBridgeError('Token with this address is not supported by our service provider.'); + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + throw new EmittableError({ error, level: 'minor', message }); + } + if (this.#toTokenListKey) + // Cache for sometime the tokens added by address + this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token); + const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); + // should never happen + if (!toTokenNetwork) { + const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE); + throw new EmittableError({ error, level: 'minor', message: error?.message }); + } + const nextTokenList = [...this.#toTokenList, token]; + this.#toTokenList = sortTokenListResponse(nextTokenList, this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); + this.#emitUpdateIfNeeded(); + return token; + } + addToTokenByAddress = async (address) => this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true); + async switchFromAndToTokens() { + if (!this.isSwitchFromAndToTokensEnabled) + return; + const currentFromSelectedToken = { ...this.fromSelectedToken }; + const toSelectedTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); + this.fromSelectedToken = this.portfolioTokenList.find((token) => token.address === this.toSelectedToken.address && + token.networkId === toSelectedTokenNetwork.id); + this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken + ; + [this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]; + await this.updateToTokenList(true, currentFromSelectedToken.address); + } + async updateQuote(options = { + skipQuoteUpdateOnSameValues: true, + skipPreviousQuoteRemoval: false, + skipStatusUpdate: false + }) { + const quoteId = uuidv4(); + this.#updateQuoteId = quoteId; + const updateQuoteFunction = async () => { + if (!this.#selectedAccount.account) + return; + if (!this.fromAmount) + return; + const sanitizedFromAmount = getSanitizedAmount(this.fromAmount, this.fromSelectedToken.decimals); + const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken.decimals); + if (this.quote) { + const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString(); + const isFromNetworkSame = this.quote.fromChainId === this.fromChainId; + const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken.address; + const isToNetworkSame = this.quote.toChainId === this.toChainId; + const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken.address; + if (options.skipQuoteUpdateOnSameValues && + isFromAmountSame && + isFromNetworkSame && + isFromAddressSame && + isToNetworkSame && + isToAddressSame) { + return; + } + } + if (!options.skipPreviousQuoteRemoval) { + if (this.quote) + this.quote = null; + this.quoteRoutesStatuses = {}; + this.#emitUpdateIfNeeded(); + } + try { + const quoteResult = await this.#socketAPI.quote({ + fromChainId: this.fromChainId, + fromTokenAddress: this.fromSelectedToken.address, + toChainId: this.toChainId, + toTokenAddress: this.toSelectedToken.address, + fromAmount: bigintFromAmount, + userAddress: this.#selectedAccount.account.addr, + isSmartAccount: isSmartAccount(this.#selectedAccount.account), + sort: this.routePriority, + isOG: this.#invite.isOG + }); + if (quoteId !== this.#updateQuoteId) + return; + if (this.#getIsFormValidToFetchQuote() && + quoteResult && + quoteResult?.routes?.[0] && + quoteResult.fromChainId === this.fromChainId && + quoteResult.toChainId === this.toChainId && + quoteResult.toAsset.address === this.toSelectedToken?.address) { + let routeToSelect; + let routeToSelectSteps; + let routes = quoteResult.routes || []; + try { + routes = routes.map((route) => { + if (!route.userTxs) + return route; + const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)); + if (!bridgeTx) + return route; + const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge'); + if (!bridgeStep) + return route; + if (bridgeStep.protocolFees.amount === '0') + return route; + const normalizedProtocolFeeToken = normalizeIncomingSocketToken(bridgeStep.protocolFees.asset); + const doesProtocolRequireExtraContractFeeInNative = PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) && + // When other tokens than the native ones are being bridged, + // Socket API takes the fee directly from the "From" amount. + normalizedProtocolFeeToken.address === ZERO_ADDRESS; + if (!doesProtocolRequireExtraContractFeeInNative) + return route; + const protocolFeeTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId); + const isTokenToPayFeeWithTheSameAsFromToken = this.fromSelectedToken?.address === normalizedProtocolFeeToken.address && + this.fromChainId === normalizedProtocolFeeToken.chainId; + const tokenToPayFeeWith = this.portfolioTokenList.find((t) => { + return (t.address === normalizedProtocolFeeToken.address && + t.networkId === protocolFeeTokenNetwork.id); + }); + const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals; + const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith + ? tokenToPayFeeWith.decimals + : protocolFeeTokenDecimals; + const fromAmountNumber = Number(this.fromAmount); + const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)); + const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith + ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals + tokenToPayFeeWith.amount * + BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals)) + : BigInt(0); + const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals = isTokenToPayFeeWithTheSameAsFromToken + ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals - + fromAmountScaledToTokenToPayFeeWithDecimals + : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals; + const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(Math.round(Number(bridgeStep.protocolFees.amount) * + 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals))); + const hasEnoughAmountToPayFee = availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >= + protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals; + if (!hasEnoughAmountToPayFee) { + const protocolName = bridgeStep.protocol.displayName; + const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol; + const insufficientTokenNetwork = protocolFeeTokenNetwork.name; + const insufficientAssetAmount = formatUnits(bridgeStep.protocolFees.amount, bridgeStep.protocolFees.asset.decimals); + const insufficientAssetAmountInUsd = formatDecimals(bridgeStep.protocolFees.feesInUsd, 'value'); + // Trick to show the error message on the UI, as the API doesn't handle this + // eslint-disable-next-line no-param-reassign + route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`; + } + return route; + }); + routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage)); + } + catch (error) { + // if the filtration fails for some reason continue with the original routes + // array without interrupting the rest of the logic + console.error(error); + } + if (!routes.length) { + this.quote = null; + return; + } + const alreadySelectedRoute = routes.find((nextRoute) => { + if (!this.quote) + return false; + // Because we only have routes with unique bridges (bridging case) + const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]; + if (selectedRouteUsedBridge) + return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge; + // Assuming to only have routes with unique DEXes (swapping case) + const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName; + if (selectedRouteUsedDex) + return nextRoute.usedDexName === selectedRouteUsedDex; + return false; // should never happen, but just in case of bad data + }); + if (alreadySelectedRoute) { + routeToSelect = alreadySelectedRoute; + routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs); + } + else { + const bestRoute = this.routePriority === 'output' + ? routes[0] // API returns highest output first + : routes[routes.length - 1]; // API returns fastest... last + routeToSelect = bestRoute; + routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs); + } + this.quote = { + fromAsset: quoteResult.fromAsset, + fromChainId: quoteResult.fromChainId, + toAsset: quoteResult.toAsset, + toChainId: quoteResult.toChainId, + selectedRoute: routeToSelect, + selectedRouteSteps: routeToSelectSteps, + routes + }; + } + this.quoteRoutesStatuses = quoteResult.bridgeRouteErrors || {}; + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + this.emitError({ error, level: 'major', message }); + } + }; + if (!this.#getIsFormValidToFetchQuote()) { + if (this.quote || this.quoteRoutesStatuses) { + this.quote = null; + this.quoteRoutesStatuses = {}; + this.#emitUpdateIfNeeded(); + } + return; + } + let nextTimeout = 400; // timeout when there is no pending quote update + if (this.#updateQuoteTimeout) { + nextTimeout = 1000; // timeout when there is a pending quote update + clearTimeout(this.#updateQuoteTimeout); + this.#updateQuoteTimeout = undefined; + } + if (!options.skipStatusUpdate && !this.quote) { + this.updateQuoteStatus = 'LOADING'; + this.#emitUpdateIfNeeded(); + } + this.#updateQuoteTimeout = setTimeout(async () => { + if (!options.skipStatusUpdate && !!this.quote) { + this.updateQuoteStatus = 'LOADING'; + this.#emitUpdateIfNeeded(); + } + await updateQuoteFunction(); + if (quoteId !== this.#updateQuoteId) + return; + this.updateQuoteStatus = 'INITIAL'; + this.#emitUpdateIfNeeded(); + clearTimeout(this.#updateQuoteTimeout); + this.#updateQuoteTimeout = undefined; + }, nextTimeout); + } + async getRouteStartUserTx() { + if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) + return; + try { + const routeResult = await this.#socketAPI.startRoute({ + fromChainId: this.quote.fromChainId, + fromAssetAddress: this.quote.fromAsset.address, + toChainId: this.quote.toChainId, + toAssetAddress: this.quote.toAsset.address, + route: this.quote.selectedRoute + }); + return routeResult; + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + throw new EmittableError({ error, level: 'minor', message }); + } + } + async getNextRouteUserTx(activeRouteId) { + try { + const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId); + return route; + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + throw new EmittableError({ error, level: 'minor', message }); + } + } + async checkForNextUserTxForActiveRoutes() { + await this.#initialLoadPromise; + const fetchAndUpdateRoute = async (activeRoute) => { + let status = null; + const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) => op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)); + // call getRouteStatus only after the transaction has processed + if (broadcastedButNotConfirmed) + return; + if (activeRoute.routeStatus === 'completed') + return; + try { + status = await this.#socketAPI.getRouteStatus({ + activeRouteId: activeRoute.activeRouteId, + userTxIndex: activeRoute.userTxIndex, + txHash: activeRoute.userTxHash + }); + } + catch (e) { + const { message } = getHumanReadableSwapAndBridgeError(e); + this.updateActiveRoute(activeRoute.activeRouteId, { error: message }); + return; + } + const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId); + if (route?.error) { + this.updateActiveRoute(activeRoute.activeRouteId, { + error: undefined + }); + } + if (status === 'completed') { + this.updateActiveRoute(activeRoute.activeRouteId, { + routeStatus: 'completed', + error: undefined + }, true); + } + else if (status === 'ready') { + this.updateActiveRoute(activeRoute.activeRouteId, { + routeStatus: 'ready', + error: undefined + }, true); + } + }; + await Promise.all(this.activeRoutesInProgress.map(async (route) => { + await fetchAndUpdateRoute(route); + })); + } + selectRoute(route) { + if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) + return; + if (![ + SwapAndBridgeFormStatus.ReadyToSubmit, + SwapAndBridgeFormStatus.InvalidRouteSelected + ].includes(this.formStatus)) + return; + this.quote.selectedRoute = route; + this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs); + this.#emitUpdateIfNeeded(); + } + async addActiveRoute(activeRoute) { + await this.#initialLoadPromise; + try { + const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId); + this.activeRoutes.push({ + ...activeRoute, + routeStatus: 'ready', + userTxHash: null, + route + }); + // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion. + // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId, + // while resetting all other state related to the form. + this.fromAmount = ''; + this.fromAmountInFiat = ''; + this.fromAmountFieldMode = 'token'; + this.toSelectedToken = null; + this.quote = null; + this.quoteRoutesStatuses = {}; + this.emitUpdate(); + } + catch (error) { + const { message } = getHumanReadableSwapAndBridgeError(error); + throw new EmittableError({ error, level: 'major', message }); + } + } + updateActiveRoute(activeRouteId, activeRoute, forceUpdateRoute) { + const currentActiveRoutes = [...this.activeRoutes]; + const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId); + if (activeRouteIndex !== -1) { + if (forceUpdateRoute) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + ; + (async () => { + let route = currentActiveRoutes[activeRouteIndex].route; + route = await this.#socketAPI.updateActiveRoute(activeRouteId); + this.updateActiveRoute(activeRouteId, { route }); + })(); + } + if (activeRoute) { + currentActiveRoutes[activeRouteIndex] = { + ...currentActiveRoutes[activeRouteIndex], + ...activeRoute + }; + } + else { + currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }; + } + this.activeRoutes = currentActiveRoutes; + this.#emitUpdateIfNeeded(); + } + } + removeActiveRoute(activeRouteId) { + this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId); + // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners + this.emitUpdate(); + } + // update active route if needed on SubmittedAccountOp update + handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op) { + op.calls.forEach((call) => { + this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status); + this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status); + this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status); + this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId); + this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status); + }); + } + #handleActiveRouteBroadcastedTransaction(fromUserRequestId, opStatus) { + if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) + return; + const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId); + if (!activeRoute) + return; + this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' }); + } + #handleActiveRouteBroadcastedApproval(fromUserRequestId, opStatus) { + if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) + return; + const activeRoute = this.activeRoutes.find((r) => `${r.activeRouteId}-approval` === fromUserRequestId); + if (!activeRoute) + return; + this.updateActiveRoute(activeRoute.activeRouteId, { + routeStatus: 'waiting-approval-to-resolve' + }); + } + #handleActiveRoutesWithReadyApproval(fromUserRequestId, opStatus) { + const activeRouteWaitingApproval = this.activeRoutes.find((r) => r.routeStatus === 'waiting-approval-to-resolve' && + `${r.activeRouteId}-approval` === fromUserRequestId); + if (!activeRouteWaitingApproval) + return; + if (opStatus === AccountOpStatus.Success) { + this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, { + routeStatus: 'ready' + }); + } + if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) { + const errorMessage = opStatus === AccountOpStatus.Rejected + ? 'The approval was rejected but you can try to sign it again' + : 'The approval failed but you can try to sign it again'; + this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, { + routeStatus: 'ready', + error: errorMessage + }); + } + } + #handleUpdateActiveRoutesUserTxId(fromUserRequestId, opTxnId) { + const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId); + if (!activeRoute) + return; + if (opTxnId && !activeRoute.userTxHash) { + this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId }); + } + } + #handleActiveRoutesCompleted(fromUserRequestId, opStatus) { + const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId); + if (!activeRoute) + return; + let shouldUpdateActiveRouteStatus = false; + if (activeRoute.route.fromChainId === activeRoute.route.toChainId) + shouldUpdateActiveRouteStatus = true; + if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) { + const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]; + if (!tx) + return; + if (tx.userTxType === 'dex-swap') + shouldUpdateActiveRouteStatus = true; + } + if (!shouldUpdateActiveRouteStatus) + return; + if (opStatus === AccountOpStatus.Success) { + this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' }); + } + // If the transaction fails, update the status to "ready" to allow the user to sign it again + if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) { + const errorMessage = opStatus === AccountOpStatus.Rejected + ? 'The transaction was rejected but you can try to sign it again' + : 'The transaction failed but you can try to sign it again'; + this.updateActiveRoute(activeRoute.activeRouteId, { + routeStatus: 'ready', + error: errorMessage + }); + } + } + onAccountChange() { + this.portfolioTokenList = []; + this.isTokenListLoading = true; + this.#emitUpdateIfNeeded(); + } + #getIsFormValidToFetchQuote() { + return (this.fromChainId && + this.toChainId && + this.fromAmount && + this.fromSelectedToken && + this.toSelectedToken && + this.validateFromAmount.success); + } + get banners() { + if (!this.#selectedAccount.account) + return []; + const activeRoutesForSelectedAccount = getActiveRoutesForAccount(this.#selectedAccount.account.addr, this.activeRoutes); + const accountOpActions = this.#actions.visibleActionsQueue.filter(({ type }) => type === 'accountOp'); + // Swap banners aren't generated because swaps are completed instantly, + // thus the activity banner on broadcast is sufficient + return getBridgeBanners(activeRoutesForSelectedAccount, accountOpActions, this.#networks.networks); + } + #debounceFunctionCallsOnSameTick(funcName, func) { + if (this.#shouldDebounceFlags[funcName]) + return; + this.#shouldDebounceFlags[funcName] = true; + // Debounce multiple calls in the same tick and only execute one of them + setTimeout(() => { + this.#shouldDebounceFlags[funcName] = false; + func(); + }, 0); + } + toJSON() { + return { + ...this, + ...super.toJSON(), + toTokenList: this.toTokenList, + maxFromAmount: this.maxFromAmount, + maxFromAmountInFiat: this.maxFromAmountInFiat, + validateFromAmount: this.validateFromAmount, + isFormEmpty: this.isFormEmpty, + formStatus: this.formStatus, + activeRoutesInProgress: this.activeRoutesInProgress, + activeRoutes: this.activeRoutes, + isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled, + banners: this.banners, + isHealthy: this.isHealthy, + shouldEnableRoutesSelection: this.shouldEnableRoutesSelection, + supportedChainIds: this.supportedChainIds + }; + } +} +//# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js.map b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map new file mode 100644 index 000000000..d9e564b3a --- /dev/null +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { formatUnits, isAddress, parseUnits } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n ActiveRoute,\n CachedSupportedChains,\n CachedTokenListKey,\n CachedToTokenLists,\n SocketApiBridgeStep,\n SocketAPIBridgeUserTx,\n SocketAPIQuote,\n SocketAPIRoute,\n SocketAPISendTransactionRequest,\n SocketAPIToken,\n SocketRouteStatus,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport { getBridgeBanners } from '../../libs/banners/banners'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport {\n convertPortfolioTokenToSocketAPIToken,\n getActiveRoutesForAccount,\n getIsBridgeTxn,\n getIsTokenEligibleForSwapAndBridge,\n getQuoteRouteSteps,\n sortPortfolioTokenList,\n sortTokenListResponse\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { normalizeIncomingSocketToken, SocketAPI } from '../../services/socket/api'\nimport { ZERO_ADDRESS } from '../../services/socket/constants'\nimport { validateSendTransferAmount } from '../../services/validations/validate'\nimport formatDecimals from '../../utils/formatDecimals/formatDecimals'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport wait from '../../utils/wait'\nimport { AccountOpAction, ActionsController } from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { NetworksController } from '../networks/networks'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst NETWORK_MISMATCH_MESSAGE =\n 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'\n\nexport enum SwapAndBridgeFormStatus {\n Empty = 'empty',\n Invalid = 'invalid',\n FetchingRoutes = 'fetching-routes',\n NoRoutesFound = 'no-routes-found',\n InvalidRouteSelected = 'invalid-route-selected',\n ReadyToSubmit = 'ready-to-submit'\n}\n\nconst STATUS_WRAPPED_METHODS = {\n addToTokenByAddress: 'INITIAL'\n} as const\n\nconst SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24 // 1 day\nconst TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4 // 4 hours\n\nconst PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [\n 'stargate',\n 'stargate-v2',\n 'arbitrum-bridge',\n 'zksync-native'\n]\n\n/**\n * The Swap and Bridge controller is responsible for managing the state and\n * logic related to swapping and bridging tokens across different networks.\n * Key responsibilities:\n * - Initially setting up the swap and bridge form with the necessary data.\n * - Managing form state for token swap and bridge operations (including user preferences).\n * - Fetching and updating token lists (from and to).\n * - Fetching and updating quotes for token swaps and bridges.\n * - Manages token active routes\n */\nexport class SwapAndBridgeController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #networks: NetworksController\n\n #actions: ActionsController\n\n #activity: ActivityController\n\n #invite: InviteController\n\n #storage: Storage\n\n #socketAPI: SocketAPI\n\n #activeRoutes: ActiveRoute[] = []\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n updateQuoteStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n #updateToTokenListThrottle: {\n time: number\n throttled: boolean\n shouldReset: boolean\n addressToSelect?: string\n } = {\n time: 0,\n shouldReset: true,\n throttled: false\n }\n\n #updateQuoteId?: string\n\n #updateQuoteTimeout?: ReturnType\n\n updateToTokenListStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n sessionIds: string[] = []\n\n fromChainId: number | null = 1\n\n fromSelectedToken: TokenResult | null = null\n\n fromAmount: string = ''\n\n fromAmountInFiat: string = ''\n\n fromAmountFieldMode: 'fiat' | 'token' = 'token'\n\n toChainId: number | null = 1\n\n toSelectedToken: SwapAndBridgeToToken | null = null\n\n quote: SocketAPIQuote | null = null\n\n quoteRoutesStatuses: { [key: string]: { status: string } } = {}\n\n portfolioTokenList: TokenResult[] = []\n\n isTokenListLoading: boolean = false\n\n /**\n * Needed to efficiently manage and cache token lists for different chain\n * combinations (fromChainId and toChainId) without having to fetch them\n * repeatedly from the API. Moreover, this way tokens added to a list by\n * address are also cached for sometime.\n */\n #cachedToTokenLists: CachedToTokenLists = {}\n\n #toTokenList: SwapAndBridgeToToken[] = []\n\n /**\n * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API\n * calls to fetch the supported chains from our service provider.\n */\n #cachedSupportedChains: CachedSupportedChains = { lastFetched: 0, data: [] }\n\n routePriority: 'output' | 'time' = 'output'\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n constructor({\n selectedAccount,\n networks,\n activity,\n socketAPI,\n storage,\n actions,\n invite\n }: {\n selectedAccount: SelectedAccountController\n networks: NetworksController\n activity: ActivityController\n socketAPI: SocketAPI\n storage: Storage\n actions: ActionsController\n invite: InviteController\n }) {\n super()\n this.#selectedAccount = selectedAccount\n this.#networks = networks\n this.#activity = activity\n this.#socketAPI = socketAPI\n this.#storage = storage\n this.#actions = actions\n this.#invite = invite\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#initialLoadPromise = this.#load()\n }\n\n #emitUpdateIfNeeded() {\n const shouldSkipUpdate =\n // No need to emit emit updates if there are no active sessions\n !this.sessionIds.length &&\n // but ALSO there are no active routes (otherwise, banners need the updates)\n !this.activeRoutes.length\n if (shouldSkipUpdate) return\n\n super.emitUpdate()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n\n this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', [])\n\n this.#selectedAccount.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => {\n if (this.#selectedAccount.portfolio.isAllReady) {\n this.isTokenListLoading = false\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n // To token list includes selected account portfolio tokens, it should get an update too\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(false)\n }\n })\n })\n this.#emitUpdateIfNeeded()\n }\n\n // The token in portfolio is the source of truth for the amount, it updates\n // on every balance (pending or anything) change.\n #getFromSelectedTokenInPortfolio = () =>\n this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId &&\n getIsTokenEligibleForSwapAndBridge(t)\n )\n\n get maxFromAmount(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number')\n return '0'\n\n return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals)\n }\n\n get maxFromAmountInFiat(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n) return '0'\n\n const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price\n if (!tokenPrice || !Number(this.maxFromAmount)) return '0'\n\n const maxAmount = getTokenAmount(tokenRef)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n BigInt(maxAmount) * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n tokenRef.decimals + tokenPriceDecimals\n )\n }\n\n get isFormEmpty() {\n return (\n !this.fromChainId ||\n !this.toChainId ||\n !this.fromAmount ||\n !this.fromSelectedToken ||\n !this.toSelectedToken\n )\n }\n\n get formStatus() {\n if (this.isFormEmpty) return SwapAndBridgeFormStatus.Empty\n if (this.validateFromAmount.message) return SwapAndBridgeFormStatus.Invalid\n if (this.updateQuoteStatus !== 'INITIAL' && !this.quote)\n return SwapAndBridgeFormStatus.FetchingRoutes\n if (!this.quote?.selectedRoute) return SwapAndBridgeFormStatus.NoRoutesFound\n\n if (this.quote?.selectedRoute?.errorMessage) return SwapAndBridgeFormStatus.InvalidRouteSelected\n\n return SwapAndBridgeFormStatus.ReadyToSubmit\n }\n\n get validateFromAmount() {\n if (!this.fromSelectedToken) return { success: false, message: '' }\n\n if (\n !this.isFormEmpty &&\n !this.quote &&\n Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')\n ) {\n return {\n success: true,\n message: '🔔 A route was found for this pair but the minimum token amount was not met.'\n }\n }\n\n return validateSendTransferAmount(\n this.fromAmount,\n Number(this.maxFromAmount),\n Number(this.maxFromAmountInFiat),\n this.fromSelectedToken\n )\n }\n\n get activeRoutesInProgress() {\n return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash)\n }\n\n get activeRoutes() {\n return this.#activeRoutes\n }\n\n set activeRoutes(value: ActiveRoute[]) {\n this.#activeRoutes = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('swapAndBridgeActiveRoutes', value)\n }\n\n get isSwitchFromAndToTokensEnabled() {\n if (!this.toSelectedToken) return false\n if (!this.portfolioTokenList.length) return false\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n\n return !!this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )\n }\n\n get shouldEnableRoutesSelection() {\n return (\n !!this.quote &&\n !!this.quote.routes &&\n this.quote.routes.length > 1 &&\n this.updateQuoteStatus !== 'LOADING'\n )\n }\n\n async initForm(sessionId: string) {\n await this.#initialLoadPromise\n\n if (this.sessionIds.includes(sessionId)) return\n\n // reset only if there are no other instances opened/active\n if (!this.sessionIds.length) {\n this.resetForm() // clear prev session form state\n // for each new session remove the completed activeRoutes from the previous session\n this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed')\n // remove activeRoutes errors from the previous session\n this.activeRoutes.forEach((r) => {\n if (r.routeStatus !== 'failed') {\n // eslint-disable-next-line no-param-reassign\n delete r.error\n }\n })\n if (this.activeRoutes.length) {\n // Otherwise there may be an emitUpdate with [] tokens\n this.isTokenListLoading = true\n\n // update the activeRoute.route prop for the new session\n this.activeRoutes.forEach((r) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateActiveRoute(r.activeRouteId, undefined, true)\n })\n }\n }\n\n this.sessionIds.push(sessionId)\n // do not await the health status check to prevent UI freeze while fetching\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#socketAPI.updateHealth()\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n this.isTokenListLoading = false\n // Do not await on purpose as it's not critical for the controller state to be ready\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#fetchSupportedChainsIfNeeded()\n this.#emitUpdateIfNeeded()\n }\n\n get isHealthy() {\n return this.#socketAPI.isHealthy\n }\n\n #fetchSupportedChainsIfNeeded = async () => {\n const shouldNotReFetchSupportedChains =\n this.#cachedSupportedChains.data.length &&\n Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD\n if (shouldNotReFetchSupportedChains) return\n\n try {\n const supportedChainsResponse = await this.#socketAPI.getSupportedChains()\n\n this.#cachedSupportedChains = {\n lastFetched: Date.now(),\n data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled)\n }\n this.#emitUpdateIfNeeded()\n } catch (error: any) {\n // Fail silently, as this is not a critical feature, Swap & Bridge is still usable\n this.emitError({ error, level: 'silent', message: error?.message })\n }\n }\n\n get supportedChainIds(): Network['chainId'][] {\n return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId))\n }\n\n get #toTokenListKey(): CachedTokenListKey | null {\n if (this.fromChainId === null || this.toChainId === null) return null\n\n return `from-${this.fromChainId}-to-${this.toChainId}`\n }\n\n unloadScreen(sessionId: string) {\n this.sessionIds = this.sessionIds.filter((id) => id !== sessionId)\n if (!this.sessionIds.length) {\n this.resetForm(true)\n // Reset health to prevent the error state from briefly flashing\n // before the next health check resolves when the Swap & Bridge\n // screen is opened after a some time\n this.#socketAPI.resetHealth()\n }\n }\n\n updateForm(props: {\n fromAmount?: string\n fromAmountInFiat?: string\n fromAmountFieldMode?: 'fiat' | 'token'\n fromSelectedToken?: TokenResult | null\n toChainId?: bigint | number\n toSelectedToken?: SocketAPIToken | null\n routePriority?: 'output' | 'time'\n }) {\n const {\n fromAmount,\n fromAmountInFiat,\n fromAmountFieldMode,\n fromSelectedToken,\n toChainId,\n toSelectedToken,\n routePriority\n } = props\n\n if (fromAmount !== undefined) {\n this.fromAmount = fromAmount\n ;(() => {\n if (fromAmount === '') {\n this.fromAmountInFiat = ''\n return\n }\n const tokenPrice = this.fromSelectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.fromAmountInFiat = ''\n return\n }\n\n if (\n this.fromAmountFieldMode === 'fiat' &&\n typeof this.fromSelectedToken?.decimals === 'number'\n ) {\n this.fromAmountInFiat = fromAmount\n\n // Get the number of decimals\n const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals)\n\n this.fromAmount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.fromAmountFieldMode === 'token') {\n this.fromAmount = fromAmount\n\n if (!this.fromSelectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(\n fromAmount,\n this.fromSelectedToken.decimals\n )\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.fromAmountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.fromSelectedToken.decimals + tokenPriceDecimals\n )\n }\n })()\n }\n\n if (fromAmountInFiat !== undefined) {\n this.fromAmountInFiat = fromAmountInFiat\n }\n\n if (fromAmountFieldMode) {\n this.fromAmountFieldMode = fromAmountFieldMode\n }\n\n if (fromSelectedToken) {\n const isFromNetworkChanged =\n this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId\n if (isFromNetworkChanged) {\n const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId)\n if (network) {\n this.fromChainId = Number(network.chainId)\n // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update)\n this.toChainId = Number(network.chainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n const shouldResetFromTokenAmount =\n isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address\n if (shouldResetFromTokenAmount) {\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n }\n\n // Always update to reflect portfolio amount (or other props) changes\n this.fromSelectedToken = fromSelectedToken\n }\n\n if (toChainId) {\n if (this.toChainId !== Number(toChainId)) {\n this.toChainId = Number(toChainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n if (toSelectedToken) {\n this.toSelectedToken = toSelectedToken\n }\n\n if (routePriority) {\n this.routePriority = routePriority\n if (this.quote) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n }\n }\n this.updateQuote()\n\n this.#emitUpdateIfNeeded()\n }\n\n resetForm(shouldEmit?: boolean) {\n this.fromChainId = 1\n this.fromSelectedToken = null\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toChainId = 1\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.portfolioTokenList = []\n this.#toTokenList = []\n\n if (shouldEmit) this.#emitUpdateIfNeeded()\n }\n\n updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]) {\n const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge)\n this.portfolioTokenList = sortPortfolioTokenList(\n // Filtering out hidden tokens here means: 1) They won't be displayed in\n // the \"From\" token list (`this.portfolioTokenList`) and 2) They won't be\n // added to the \"Receive\" token list as additional tokens from portfolio,\n // BUT 3) They will appear in the \"Receive\" if they are present in service\n // provider's to token list. This is the desired behavior.\n tokens.filter((t) => !t.flags.isHidden)\n )\n\n const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId\n )\n\n const shouldUpdateFromSelectedToken =\n !this.fromSelectedToken || // initial (default) state\n // May happen if selected account gets changed or the token gets send away in the meantime\n !fromSelectedTokenInNextPortfolio ||\n // May happen if user receives or sends the token in the meantime\n fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount\n\n if (shouldUpdateFromSelectedToken) {\n this.updateForm({\n fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null\n })\n } else {\n this.#emitUpdateIfNeeded()\n }\n }\n\n async updateToTokenList(shouldReset: boolean, addressToSelect?: string) {\n const now = Date.now()\n const timeSinceLastCall = now - this.#updateToTokenListThrottle.time\n if (timeSinceLastCall <= 500) {\n this.#updateToTokenListThrottle.shouldReset = shouldReset\n this.#updateToTokenListThrottle.addressToSelect = addressToSelect\n\n if (!this.#updateToTokenListThrottle.throttled) {\n this.#updateToTokenListThrottle.throttled = true\n await wait(500 - timeSinceLastCall)\n this.#updateToTokenListThrottle.throttled = false\n await this.updateToTokenList(\n this.#updateToTokenListThrottle.shouldReset,\n this.#updateToTokenListThrottle.addressToSelect\n )\n }\n return\n }\n this.updateToTokenListStatus = 'LOADING'\n this.#updateToTokenListThrottle.time = now\n if (!this.fromChainId || !this.toChainId) return\n\n if (shouldReset) {\n this.#toTokenList = []\n this.toSelectedToken = null\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const toTokenListInCache =\n this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]\n let upToDateToTokenList: SocketAPIToken[] = toTokenListInCache?.data || []\n const shouldFetchTokenList =\n !upToDateToTokenList.length ||\n now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD\n if (shouldFetchTokenList) {\n upToDateToTokenList = await this.#socketAPI.getToTokenList({\n fromChainId: this.fromChainId,\n toChainId: this.toChainId\n })\n if (this.#toTokenListKey)\n this.#cachedToTokenLists[this.#toTokenListKey] = {\n lastFetched: now,\n data: upToDateToTokenList\n }\n }\n\n const toTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )\n // should never happen\n if (!toTokenNetwork) throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n\n const additionalTokensFromPortfolio = this.portfolioTokenList\n .filter((t) => t.networkId === toTokenNetwork.id)\n .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address))\n .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId)))\n\n this.#toTokenList = sortTokenListResponse(\n [...upToDateToTokenList, ...additionalTokensFromPortfolio],\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n if (!this.toSelectedToken) {\n if (addressToSelect) {\n const token = this.#toTokenList.find((t) => t.address === addressToSelect)\n if (token) {\n this.updateForm({ toSelectedToken: token })\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n return\n }\n }\n }\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n }\n\n get toTokenList(): SwapAndBridgeToToken[] {\n const isSwapping = this.fromChainId === this.toChainId\n if (isSwapping) {\n // Swaps between same \"from\" and \"to\" tokens are not feasible, filter them out\n return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address)\n }\n\n return this.#toTokenList\n }\n\n async #addToTokenByAddress(address: string) {\n if (!this.toChainId) return // should never happen\n if (!isAddress(address)) return // no need to attempt with invalid addresses\n\n const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address)\n if (isAlreadyInTheList) return\n\n let token: SocketAPIToken | null\n try {\n token = await this.#socketAPI.getToken({ address, chainId: this.toChainId })\n\n if (!token)\n throw new SwapAndBridgeError(\n 'Token with this address is not supported by our service provider.'\n )\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n\n if (this.#toTokenListKey)\n // Cache for sometime the tokens added by address\n this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token)\n\n const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId)\n // should never happen\n if (!toTokenNetwork) {\n const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n throw new EmittableError({ error, level: 'minor', message: error?.message })\n }\n\n const nextTokenList: SwapAndBridgeToToken[] = [...this.#toTokenList, token]\n\n this.#toTokenList = sortTokenListResponse(\n nextTokenList,\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n this.#emitUpdateIfNeeded()\n return token\n }\n\n addToTokenByAddress = async (address: string) =>\n this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true)\n\n async switchFromAndToTokens() {\n if (!this.isSwitchFromAndToTokensEnabled) return\n const currentFromSelectedToken = { ...this.fromSelectedToken }\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n this.fromSelectedToken = this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )!\n this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken\n // Reverses the from and to chain ids, since their format is the same\n ;[this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]\n await this.updateToTokenList(true, currentFromSelectedToken.address)\n }\n\n async updateQuote(\n options: {\n skipQuoteUpdateOnSameValues?: boolean\n skipPreviousQuoteRemoval?: boolean\n skipStatusUpdate?: boolean\n } = {\n skipQuoteUpdateOnSameValues: true,\n skipPreviousQuoteRemoval: false,\n skipStatusUpdate: false\n }\n ) {\n const quoteId = uuidv4()\n this.#updateQuoteId = quoteId\n\n const updateQuoteFunction = async () => {\n if (!this.#selectedAccount.account) return\n if (!this.fromAmount) return\n\n const sanitizedFromAmount = getSanitizedAmount(\n this.fromAmount,\n this.fromSelectedToken!.decimals\n )\n\n const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken!.decimals)\n\n if (this.quote) {\n const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString()\n const isFromNetworkSame = this.quote.fromChainId === this.fromChainId\n const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken!.address\n const isToNetworkSame = this.quote.toChainId === this.toChainId\n const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken!.address\n\n if (\n options.skipQuoteUpdateOnSameValues &&\n isFromAmountSame &&\n isFromNetworkSame &&\n isFromAddressSame &&\n isToNetworkSame &&\n isToAddressSame\n ) {\n return\n }\n }\n if (!options.skipPreviousQuoteRemoval) {\n if (this.quote) this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const quoteResult = await this.#socketAPI.quote({\n fromChainId: this.fromChainId!,\n fromTokenAddress: this.fromSelectedToken!.address,\n toChainId: this.toChainId!,\n toTokenAddress: this.toSelectedToken!.address,\n fromAmount: bigintFromAmount,\n userAddress: this.#selectedAccount.account.addr,\n isSmartAccount: isSmartAccount(this.#selectedAccount.account),\n sort: this.routePriority,\n isOG: this.#invite.isOG\n })\n\n if (quoteId !== this.#updateQuoteId) return\n\n if (\n this.#getIsFormValidToFetchQuote() &&\n quoteResult &&\n quoteResult?.routes?.[0] &&\n quoteResult.fromChainId === this.fromChainId &&\n quoteResult.toChainId === this.toChainId &&\n quoteResult.toAsset.address === this.toSelectedToken?.address\n ) {\n let routeToSelect\n let routeToSelectSteps\n let routes = quoteResult.routes || []\n\n try {\n routes = routes.map((route) => {\n if (!route.userTxs) return route\n\n const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)) as\n | SocketAPIBridgeUserTx\n | undefined\n\n if (!bridgeTx) return route\n\n const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge') as\n | SocketApiBridgeStep\n | undefined\n\n if (!bridgeStep) return route\n if (bridgeStep.protocolFees.amount === '0') return route\n\n const normalizedProtocolFeeToken = normalizeIncomingSocketToken(\n bridgeStep.protocolFees.asset\n )\n const doesProtocolRequireExtraContractFeeInNative =\n PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) &&\n // When other tokens than the native ones are being bridged,\n // Socket API takes the fee directly from the \"From\" amount.\n normalizedProtocolFeeToken.address === ZERO_ADDRESS\n if (!doesProtocolRequireExtraContractFeeInNative) return route\n\n const protocolFeeTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId\n )!\n const isTokenToPayFeeWithTheSameAsFromToken =\n this.fromSelectedToken?.address === normalizedProtocolFeeToken.address &&\n this.fromChainId === normalizedProtocolFeeToken.chainId\n\n const tokenToPayFeeWith = this.portfolioTokenList.find((t) => {\n return (\n t.address === normalizedProtocolFeeToken.address &&\n t.networkId === protocolFeeTokenNetwork.id\n )\n })\n\n const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals\n const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? tokenToPayFeeWith.decimals\n : protocolFeeTokenDecimals\n const fromAmountNumber = Number(this.fromAmount)\n const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(\n Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)\n )\n\n const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals\n tokenToPayFeeWith.amount *\n BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals))\n : BigInt(0)\n\n const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals =\n isTokenToPayFeeWithTheSameAsFromToken\n ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals -\n fromAmountScaledToTokenToPayFeeWithDecimals\n : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals\n\n const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(\n Math.round(\n Number(bridgeStep.protocolFees.amount) *\n 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals)\n )\n )\n const hasEnoughAmountToPayFee =\n availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >=\n protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals\n\n if (!hasEnoughAmountToPayFee) {\n const protocolName = bridgeStep.protocol.displayName\n const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol\n const insufficientTokenNetwork = protocolFeeTokenNetwork.name\n const insufficientAssetAmount = formatUnits(\n bridgeStep.protocolFees.amount,\n bridgeStep.protocolFees.asset.decimals\n )\n const insufficientAssetAmountInUsd = formatDecimals(\n bridgeStep.protocolFees.feesInUsd,\n 'value'\n )\n\n // Trick to show the error message on the UI, as the API doesn't handle this\n // eslint-disable-next-line no-param-reassign\n route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`\n }\n\n return route\n })\n\n routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage))\n } catch (error) {\n // if the filtration fails for some reason continue with the original routes\n // array without interrupting the rest of the logic\n console.error(error)\n }\n\n if (!routes.length) {\n this.quote = null\n return\n }\n\n const alreadySelectedRoute = routes.find((nextRoute) => {\n if (!this.quote) return false\n\n // Because we only have routes with unique bridges (bridging case)\n const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]\n if (selectedRouteUsedBridge)\n return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge\n\n // Assuming to only have routes with unique DEXes (swapping case)\n const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName\n if (selectedRouteUsedDex) return nextRoute.usedDexName === selectedRouteUsedDex\n\n return false // should never happen, but just in case of bad data\n })\n\n if (alreadySelectedRoute) {\n routeToSelect = alreadySelectedRoute\n routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs)\n } else {\n const bestRoute =\n this.routePriority === 'output'\n ? routes[0] // API returns highest output first\n : routes[routes.length - 1] // API returns fastest... last\n routeToSelect = bestRoute\n routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs)\n }\n\n this.quote = {\n fromAsset: quoteResult.fromAsset,\n fromChainId: quoteResult.fromChainId,\n toAsset: quoteResult.toAsset,\n toChainId: quoteResult.toChainId,\n selectedRoute: routeToSelect,\n selectedRouteSteps: routeToSelectSteps,\n routes\n }\n }\n this.quoteRoutesStatuses = (quoteResult as any).bridgeRouteErrors || {}\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n }\n\n if (!this.#getIsFormValidToFetchQuote()) {\n if (this.quote || this.quoteRoutesStatuses) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n return\n }\n\n let nextTimeout = 400 // timeout when there is no pending quote update\n if (this.#updateQuoteTimeout) {\n nextTimeout = 1000 // timeout when there is a pending quote update\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }\n\n if (!options.skipStatusUpdate && !this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n this.#updateQuoteTimeout = setTimeout(async () => {\n if (!options.skipStatusUpdate && !!this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n await updateQuoteFunction()\n\n if (quoteId !== this.#updateQuoteId) return\n\n this.updateQuoteStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }, nextTimeout)\n }\n\n async getRouteStartUserTx() {\n if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) return\n\n try {\n const routeResult = await this.#socketAPI.startRoute({\n fromChainId: this.quote!.fromChainId,\n fromAssetAddress: this.quote!.fromAsset.address,\n toChainId: this.quote!.toChainId,\n toAssetAddress: this.quote!.toAsset.address,\n route: this.quote!.selectedRoute\n })\n\n return routeResult\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async getNextRouteUserTx(activeRouteId: number) {\n try {\n const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId)\n return route\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async checkForNextUserTxForActiveRoutes() {\n await this.#initialLoadPromise\n const fetchAndUpdateRoute = async (activeRoute: ActiveRoute) => {\n let status: SocketRouteStatus = null\n const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) =>\n op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)\n )\n\n // call getRouteStatus only after the transaction has processed\n if (broadcastedButNotConfirmed) return\n if (activeRoute.routeStatus === 'completed') return\n\n try {\n status = await this.#socketAPI.getRouteStatus({\n activeRouteId: activeRoute.activeRouteId,\n userTxIndex: activeRoute.userTxIndex,\n txHash: activeRoute.userTxHash!\n })\n } catch (e: any) {\n const { message } = getHumanReadableSwapAndBridgeError(e)\n this.updateActiveRoute(activeRoute.activeRouteId, { error: message })\n return\n }\n\n const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId)\n if (route?.error) {\n this.updateActiveRoute(activeRoute.activeRouteId, {\n error: undefined\n })\n }\n\n if (status === 'completed') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'completed',\n error: undefined\n },\n true\n )\n } else if (status === 'ready') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'ready',\n error: undefined\n },\n true\n )\n }\n }\n\n await Promise.all(\n this.activeRoutesInProgress.map(async (route) => {\n await fetchAndUpdateRoute(route)\n })\n )\n }\n\n selectRoute(route: SocketAPIRoute) {\n if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) return\n if (\n ![\n SwapAndBridgeFormStatus.ReadyToSubmit,\n SwapAndBridgeFormStatus.InvalidRouteSelected\n ].includes(this.formStatus)\n )\n return\n\n this.quote.selectedRoute = route\n this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs)\n\n this.#emitUpdateIfNeeded()\n }\n\n async addActiveRoute(activeRoute: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n }) {\n await this.#initialLoadPromise\n\n try {\n const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId)\n this.activeRoutes.push({\n ...activeRoute,\n routeStatus: 'ready',\n userTxHash: null,\n route\n })\n\n // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion.\n // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId,\n // while resetting all other state related to the form.\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n\n this.emitUpdate()\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'major', message })\n }\n }\n\n updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId'],\n activeRoute?: Partial,\n forceUpdateRoute?: boolean\n ) {\n const currentActiveRoutes = [...this.activeRoutes]\n const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId)\n\n if (activeRouteIndex !== -1) {\n if (forceUpdateRoute) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n let route = currentActiveRoutes[activeRouteIndex].route\n route = await this.#socketAPI.updateActiveRoute(activeRouteId)\n this.updateActiveRoute(activeRouteId, { route })\n })()\n }\n\n if (activeRoute) {\n currentActiveRoutes[activeRouteIndex] = {\n ...currentActiveRoutes[activeRouteIndex],\n ...activeRoute\n }\n } else {\n currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }\n }\n this.activeRoutes = currentActiveRoutes\n\n this.#emitUpdateIfNeeded()\n }\n }\n\n removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId)\n\n // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners\n this.emitUpdate()\n }\n\n // update active route if needed on SubmittedAccountOp update\n handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp) {\n op.calls.forEach((call) => {\n this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status)\n this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status)\n this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status)\n this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId)\n this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status)\n })\n }\n\n #handleActiveRouteBroadcastedTransaction(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' })\n }\n\n #handleActiveRouteBroadcastedApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find(\n (r) => `${r.activeRouteId}-approval` === fromUserRequestId\n )\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'waiting-approval-to-resolve'\n })\n }\n\n #handleActiveRoutesWithReadyApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRouteWaitingApproval = this.activeRoutes.find(\n (r) =>\n r.routeStatus === 'waiting-approval-to-resolve' &&\n `${r.activeRouteId}-approval` === fromUserRequestId\n )\n\n if (!activeRouteWaitingApproval) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready'\n })\n }\n\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The approval was rejected but you can try to sign it again'\n : 'The approval failed but you can try to sign it again'\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n #handleUpdateActiveRoutesUserTxId(\n fromUserRequestId: Call['fromUserRequestId'],\n opTxnId: SubmittedAccountOp['txnId']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n if (opTxnId && !activeRoute.userTxHash) {\n this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId })\n }\n }\n\n #handleActiveRoutesCompleted(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n let shouldUpdateActiveRouteStatus = false\n if (activeRoute.route.fromChainId === activeRoute.route.toChainId)\n shouldUpdateActiveRouteStatus = true\n\n if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) {\n const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]\n if (!tx) return\n\n if (tx.userTxType === 'dex-swap') shouldUpdateActiveRouteStatus = true\n }\n\n if (!shouldUpdateActiveRouteStatus) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' })\n }\n\n // If the transaction fails, update the status to \"ready\" to allow the user to sign it again\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The transaction was rejected but you can try to sign it again'\n : 'The transaction failed but you can try to sign it again'\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n onAccountChange() {\n this.portfolioTokenList = []\n this.isTokenListLoading = true\n\n this.#emitUpdateIfNeeded()\n }\n\n #getIsFormValidToFetchQuote() {\n return (\n this.fromChainId &&\n this.toChainId &&\n this.fromAmount &&\n this.fromSelectedToken &&\n this.toSelectedToken &&\n this.validateFromAmount.success\n )\n }\n\n get banners() {\n if (!this.#selectedAccount.account) return []\n\n const activeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.#selectedAccount.account.addr,\n this.activeRoutes\n )\n const accountOpActions = this.#actions.visibleActionsQueue.filter(\n ({ type }) => type === 'accountOp'\n ) as AccountOpAction[]\n\n // Swap banners aren't generated because swaps are completed instantly,\n // thus the activity banner on broadcast is sufficient\n return getBridgeBanners(\n activeRoutesForSelectedAccount,\n accountOpActions,\n this.#networks.networks\n )\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: Function) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n func()\n }, 0)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n toTokenList: this.toTokenList,\n maxFromAmount: this.maxFromAmount,\n maxFromAmountInFiat: this.maxFromAmountInFiat,\n validateFromAmount: this.validateFromAmount,\n isFormEmpty: this.isFormEmpty,\n formStatus: this.formStatus,\n activeRoutesInProgress: this.activeRoutesInProgress,\n activeRoutes: this.activeRoutes,\n isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled,\n banners: this.banners,\n isHealthy: this.isHealthy,\n shouldEnableRoutesSelection: this.shouldEnableRoutesSelection,\n supportedChainIds: this.supportedChainIds\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.d.ts b/dist/src/controllers/transfer/transfer.d.ts new file mode 100644 index 000000000..e22b07061 --- /dev/null +++ b/dist/src/controllers/transfer/transfer.d.ts @@ -0,0 +1,64 @@ +import { Account } from '../../interfaces/account'; +import { AddressState } from '../../interfaces/domains'; +import { Network } from '../../interfaces/network'; +import { Storage } from '../../interfaces/storage'; +import { TransferUpdate } from '../../interfaces/transfer'; +import { HumanizerMeta } from '../../libs/humanizer/interfaces'; +import { TokenResult } from '../../libs/portfolio'; +import EventEmitter from '../eventEmitter/eventEmitter'; +export declare class TransferController extends EventEmitter { + #private; + isSWWarningVisible: boolean; + isSWWarningAgreed: boolean; + amount: string; + amountInFiat: string; + amountFieldMode: 'fiat' | 'token'; + addressState: AddressState; + isRecipientAddressUnknown: boolean; + isRecipientAddressUnknownAgreed: boolean; + isRecipientHumanizerKnownTokenOrSmartContract: boolean; + isTopUp: boolean; + constructor(storage: Storage, humanizerInfo: HumanizerMeta, selectedAccountData: Account, networks: Network[]); + get shouldSkipTransactionQueuedModal(): boolean; + set shouldSkipTransactionQueuedModal(value: boolean); + set selectedToken(token: TokenResult | null); + get selectedToken(): TokenResult | null; + get maxAmount(): string; + get maxAmountInFiat(): string; + resetForm(): void; + get validationFormMsgs(): { + amount: { + success: boolean; + message: string; + }; + recipientAddress: { + success: boolean; + message: string; + }; + }; + get isFormValid(): boolean | null; + get isInitialized(): boolean; + get recipientAddress(): string; + update({ selectedAccountData, humanizerInfo, selectedToken, amount, addressState, isSWWarningAgreed, isRecipientAddressUnknownAgreed, isTopUp, networks, contacts, amountFieldMode }: TransferUpdate): void; + checkIsRecipientAddressUnknown(): void; + toJSON(): this & { + validationFormMsgs: { + amount: { + success: boolean; + message: string; + }; + recipientAddress: { + success: boolean; + message: string; + }; + }; + isFormValid: boolean | null; + isInitialized: boolean; + selectedToken: TokenResult | null; + maxAmount: string; + maxAmountInFiat: string; + shouldSkipTransactionQueuedModal: boolean; + emittedErrors: import("../eventEmitter/eventEmitter").ErrorRef[]; + }; +} +//# sourceMappingURL=transfer.d.ts.map \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.d.ts.map b/dist/src/controllers/transfer/transfer.d.ts.map new file mode 100644 index 000000000..3b4e7c44f --- /dev/null +++ b/dist/src/controllers/transfer/transfer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../src/controllers/transfer/transfer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMlD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAyBvD,qBAAa,kBAAmB,SAAQ,YAAY;;IAalD,kBAAkB,UAAQ;IAE1B,iBAAiB,UAAQ;IAEzB,MAAM,SAAK;IAEX,YAAY,SAAK;IAEjB,eAAe,EAAE,MAAM,GAAG,OAAO,CAAU;IAE3C,YAAY,EAAE,YAAY,CAA+B;IAEzD,yBAAyB,UAAQ;IAEjC,+BAA+B,UAAQ;IAEvC,6CAA6C,UAAQ;IAErD,OAAO,EAAE,OAAO,CAAQ;gBAQtB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,OAAO,EAC5B,QAAQ,EAAE,OAAO,EAAE;IAsBrB,IAAI,gCAAgC,IAIQ,OAAO,CAFlD;IAED,IAAI,gCAAgC,CAAC,KAAK,EAAE,OAAO,EAKlD;IAGD,IAAI,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAwB1C;IAED,IAAI,aAAa,IA1BQ,WAAW,GAAG,IAAI,CA4B1C;IAED,IAAI,SAAS,IAAI,MAAM,CAStB;IAED,IAAI,eAAe,IAAI,MAAM,CAiB5B;IAED,SAAS;IAaT,IAAI,kBAAkB;;;;;;;;;MAkCrB;IAED,IAAI,WAAW,mBA8Bd;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,gBAAgB,WAInB;IAED,MAAM,CAAC,EACL,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,+BAA+B,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,eAAe,EAChB,EAAE,cAAc;IA4DjB,8BAA8B;IAkH9B,MAAM;;;;;;;;;;;;;;;;;;;CAaP"} \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.js b/dist/src/controllers/transfer/transfer.js new file mode 100644 index 000000000..2607b9e71 --- /dev/null +++ b/dist/src/controllers/transfer/transfer.js @@ -0,0 +1,316 @@ +import { formatUnits, isAddress, parseUnits } from 'ethers'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { isSmartAccount } from '../../libs/account/account'; +import { getTokenAmount } from '../../libs/portfolio/helpers'; +import { getSanitizedAmount } from '../../libs/transfer/amount'; +import { validateSendTransferAddress, validateSendTransferAmount } from '../../services/validations'; +import { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'; +import EventEmitter from '../eventEmitter/eventEmitter'; +const CONVERSION_PRECISION = 16; +const CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION); +const DEFAULT_ADDRESS_STATE = { + fieldValue: '', + ensAddress: '', + udAddress: '', + isDomainResolving: false +}; +const DEFAULT_VALIDATION_FORM_MSGS = { + amount: { + success: false, + message: '' + }, + recipientAddress: { + success: false, + message: '' + } +}; +const HARD_CODED_CURRENCY = 'usd'; +export class TransferController extends EventEmitter { + #storage; + #networks = []; + #addressBookContacts = []; + #selectedToken = null; + #selectedAccountData = null; + #humanizerInfo = null; + isSWWarningVisible = false; + isSWWarningAgreed = false; + amount = ''; + amountInFiat = ''; + amountFieldMode = 'token'; + addressState = { ...DEFAULT_ADDRESS_STATE }; + isRecipientAddressUnknown = false; + isRecipientAddressUnknownAgreed = false; + isRecipientHumanizerKnownTokenOrSmartContract = false; + isTopUp = false; + #shouldSkipTransactionQueuedModal = false; + // Holds the initial load promise, so that one can wait until it completes + #initialLoadPromise; + constructor(storage, humanizerInfo, selectedAccountData, networks) { + super(); + this.#storage = storage; + this.#humanizerInfo = humanizerInfo; + this.#selectedAccountData = selectedAccountData; + this.#networks = networks; + this.#initialLoadPromise = this.#load(); + this.emitUpdate(); + } + async #load() { + this.#shouldSkipTransactionQueuedModal = await this.#storage.get('shouldSkipTransactionQueuedModal', false); + this.emitUpdate(); + } + get shouldSkipTransactionQueuedModal() { + return this.#shouldSkipTransactionQueuedModal; + } + set shouldSkipTransactionQueuedModal(value) { + this.#shouldSkipTransactionQueuedModal = value; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.#storage.set('shouldSkipTransactionQueuedModal', value); + this.emitUpdate(); + } + // every time when updating selectedToken update the amount and maxAmount of the form + set selectedToken(token) { + if (!token || Number(getTokenAmount(token)) === 0) { + this.#selectedToken = null; + this.amount = ''; + this.amountInFiat = ''; + this.amountFieldMode = 'token'; + return; + } + const prevSelectedToken = { ...this.selectedToken }; + this.#selectedToken = token; + if (prevSelectedToken?.address !== token?.address || + prevSelectedToken?.networkId !== token?.networkId) { + if (!token.priceIn.length) { + this.amountFieldMode = 'token'; + } + this.amount = ''; + this.amountInFiat = ''; + this.#setSWWarningVisibleIfNeeded(); + } + } + get selectedToken() { + return this.#selectedToken; + } + get maxAmount() { + if (!this.selectedToken || + getTokenAmount(this.selectedToken) === 0n || + typeof this.selectedToken.decimals !== 'number') + return '0'; + return formatUnits(getTokenAmount(this.selectedToken), this.selectedToken.decimals); + } + get maxAmountInFiat() { + if (!this.selectedToken || getTokenAmount(this.selectedToken) === 0n) + return '0'; + const tokenPrice = this.selectedToken?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; + if (!tokenPrice || !Number(this.maxAmount)) + return '0'; + const maxAmount = getTokenAmount(this.selectedToken); + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss + return formatUnits(maxAmount * tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + this.selectedToken.decimals + tokenPriceDecimals); + } + resetForm() { + this.amount = ''; + this.amountInFiat = ''; + this.addressState = { ...DEFAULT_ADDRESS_STATE }; + this.isRecipientAddressUnknown = false; + this.isRecipientAddressUnknownAgreed = false; + this.isRecipientHumanizerKnownTokenOrSmartContract = false; + this.isSWWarningVisible = false; + this.isSWWarningAgreed = false; + this.emitUpdate(); + } + get validationFormMsgs() { + if (!this.isInitialized) + return DEFAULT_VALIDATION_FORM_MSGS; + const validationFormMsgsNew = DEFAULT_VALIDATION_FORM_MSGS; + if (this.#humanizerInfo && this.#selectedAccountData) { + const isUDAddress = !!this.addressState.udAddress; + const isEnsAddress = !!this.addressState.ensAddress; + validationFormMsgsNew.recipientAddress = validateSendTransferAddress(this.recipientAddress, this.#selectedAccountData.addr, this.isRecipientAddressUnknownAgreed, this.isRecipientAddressUnknown, this.isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, this.addressState.isDomainResolving, this.isSWWarningVisible, this.isSWWarningAgreed); + } + // Validate the amount + if (this.selectedToken) { + validationFormMsgsNew.amount = validateSendTransferAmount(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken); + } + return validationFormMsgsNew; + } + get isFormValid() { + if (!this.isInitialized) + return false; + // if the amount is set, it's enough in topUp mode + if (this.isTopUp) { + return (this.selectedToken && + validateSendTransferAmount(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken).success); + } + const areFormFieldsValid = this.validationFormMsgs.amount.success && this.validationFormMsgs.recipientAddress.success; + const isSWWarningMissingOrAccepted = !this.isSWWarningVisible || this.isSWWarningAgreed; + const isRecipientAddressUnknownMissingOrAccepted = !this.isRecipientAddressUnknown || this.isRecipientAddressUnknownAgreed; + return (areFormFieldsValid && + isSWWarningMissingOrAccepted && + isRecipientAddressUnknownMissingOrAccepted && + !this.addressState.isDomainResolving); + } + get isInitialized() { + return !!this.#humanizerInfo && !!this.#selectedAccountData && !!this.#networks.length; + } + get recipientAddress() { + return (this.addressState.ensAddress || this.addressState.udAddress || this.addressState.fieldValue); + } + update({ selectedAccountData, humanizerInfo, selectedToken, amount, addressState, isSWWarningAgreed, isRecipientAddressUnknownAgreed, isTopUp, networks, contacts, amountFieldMode }) { + if (humanizerInfo) { + this.#humanizerInfo = humanizerInfo; + } + if (networks) { + this.#networks = networks; + } + if (contacts) { + this.#addressBookContacts = contacts; + if (this.isInitialized) { + this.checkIsRecipientAddressUnknown(); + } + } + if (selectedAccountData) { + if (this.#selectedAccountData?.addr !== selectedAccountData.addr) { + this.#setAmount(''); + this.selectedToken = null; + } + this.#selectedAccountData = selectedAccountData; + } + if (selectedToken) { + this.selectedToken = selectedToken; + } + // If we do a regular check the value won't update if it's '' or '0' + if (typeof amount === 'string') { + this.#setAmount(amount); + } + if (amountFieldMode) { + this.amountFieldMode = amountFieldMode; + } + if (addressState) { + this.addressState = { + ...this.addressState, + ...addressState + }; + if (this.isInitialized) { + this.#onRecipientAddressChange(); + } + } + // We can do a regular check here, because the property defines if it should be updated + // and not the actual value + if (isSWWarningAgreed) { + this.isSWWarningAgreed = !this.isSWWarningAgreed; + } + // We can do a regular check here, because the property defines if it should be updated + // and not the actual value + if (isRecipientAddressUnknownAgreed) { + this.isRecipientAddressUnknownAgreed = !this.isRecipientAddressUnknownAgreed; + } + if (typeof isTopUp === 'boolean') { + this.isTopUp = isTopUp; + this.#setSWWarningVisibleIfNeeded(); + } + this.emitUpdate(); + } + checkIsRecipientAddressUnknown() { + if (!isAddress(this.recipientAddress)) { + this.isRecipientAddressUnknown = false; + this.isRecipientAddressUnknownAgreed = false; + this.emitUpdate(); + return; + } + const isAddressInAddressBook = this.#addressBookContacts.some(({ address }) => address.toLowerCase() === this.recipientAddress.toLowerCase()); + this.isRecipientAddressUnknown = + !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== FEE_COLLECTOR.toLowerCase(); + this.isRecipientAddressUnknownAgreed = false; + this.#setSWWarningVisibleIfNeeded(); + this.emitUpdate(); + } + #onRecipientAddressChange() { + if (!isAddress(this.recipientAddress)) { + this.isRecipientAddressUnknown = false; + this.isRecipientAddressUnknownAgreed = false; + this.isRecipientHumanizerKnownTokenOrSmartContract = false; + this.isSWWarningVisible = false; + this.isSWWarningAgreed = false; + return; + } + if (this.#humanizerInfo) { + // @TODO: could fetch address code + this.isRecipientHumanizerKnownTokenOrSmartContract = + !!this.#humanizerInfo.knownAddresses[this.recipientAddress.toLowerCase()]?.isSC; + } + this.checkIsRecipientAddressUnknown(); + } + #setAmount(fieldValue) { + if (!fieldValue) { + this.amount = ''; + this.amountInFiat = ''; + return; + } + const tokenPrice = this.selectedToken?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; + if (!tokenPrice) { + this.amount = fieldValue; + this.amountInFiat = ''; + return; + } + if (this.amountFieldMode === 'fiat' && typeof this.selectedToken?.decimals === 'number') { + this.amountInFiat = fieldValue; + // Get the number of decimals + const amountInFiatDecimals = fieldValue.split('.')[1]?.length || 0; + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + // Convert the numbers to big int + const amountInFiatBigInt = parseUnits(fieldValue, amountInFiatDecimals); + this.amount = formatUnits((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals); + return; + } + if (this.amountFieldMode === 'token') { + this.amount = fieldValue; + if (!this.selectedToken) + return; + const sanitizedFieldValue = getSanitizedAmount(fieldValue, this.selectedToken.decimals); + // Convert the field value to big int + const formattedAmount = parseUnits(sanitizedFieldValue, this.selectedToken.decimals); + if (!formattedAmount) + return; + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + this.amountInFiat = formatUnits(formattedAmount * tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + this.selectedToken.decimals + tokenPriceDecimals); + } + } + #setSWWarningVisibleIfNeeded() { + if (!this.#selectedAccountData) + return; + this.isSWWarningVisible = + this.isRecipientAddressUnknown && + isSmartAccount(this.#selectedAccountData) && + !this.isTopUp && + !!this.selectedToken?.address && + Number(this.selectedToken?.address) === 0 && + this.#networks + .filter((n) => n.id !== 'ethereum') + .map(({ id }) => id) + .includes(this.selectedToken.networkId || 'ethereum'); + this.emitUpdate(); + } + // includes the getters in the stringified instance + toJSON() { + return { + ...this, + ...super.toJSON(), + validationFormMsgs: this.validationFormMsgs, + isFormValid: this.isFormValid, + isInitialized: this.isInitialized, + selectedToken: this.selectedToken, + maxAmount: this.maxAmount, + maxAmountInFiat: this.maxAmountInFiat, + shouldSkipTransactionQueuedModal: this.shouldSkipTransactionQueuedModal + }; + } +} +//# sourceMappingURL=transfer.js.map \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.js.map b/dist/src/controllers/transfer/transfer.js.map new file mode 100644 index 000000000..4a9f90f37 --- /dev/null +++ b/dist/src/controllers/transfer/transfer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../../src/controllers/transfer/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, isAddress, parseUnits } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { Account } from '../../interfaces/account'\nimport { AddressState } from '../../interfaces/domains'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { TransferUpdate } from '../../interfaces/transfer'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { HumanizerMeta } from '../../libs/humanizer/interfaces'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { validateSendTransferAddress, validateSendTransferAmount } from '../../services/validations'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport { Contacts } from '../addressBook/addressBook'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst DEFAULT_ADDRESS_STATE = {\n fieldValue: '',\n ensAddress: '',\n udAddress: '',\n isDomainResolving: false\n}\n\nconst DEFAULT_VALIDATION_FORM_MSGS = {\n amount: {\n success: false,\n message: ''\n },\n recipientAddress: {\n success: false,\n message: ''\n }\n}\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nexport class TransferController extends EventEmitter {\n #storage: Storage\n\n #networks: Network[] = []\n\n #addressBookContacts: Contacts = []\n\n #selectedToken: TokenResult | null = null\n\n #selectedAccountData: Account | null = null\n\n #humanizerInfo: HumanizerMeta | null = null\n\n isSWWarningVisible = false\n\n isSWWarningAgreed = false\n\n amount = ''\n\n amountInFiat = ''\n\n amountFieldMode: 'fiat' | 'token' = 'token'\n\n addressState: AddressState = { ...DEFAULT_ADDRESS_STATE }\n\n isRecipientAddressUnknown = false\n\n isRecipientAddressUnknownAgreed = false\n\n isRecipientHumanizerKnownTokenOrSmartContract = false\n\n isTopUp: boolean = false\n\n #shouldSkipTransactionQueuedModal: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n humanizerInfo: HumanizerMeta,\n selectedAccountData: Account,\n networks: Network[]\n ) {\n super()\n\n this.#storage = storage\n this.#humanizerInfo = humanizerInfo\n this.#selectedAccountData = selectedAccountData\n this.#networks = networks\n\n this.#initialLoadPromise = this.#load()\n this.emitUpdate()\n }\n\n async #load() {\n this.#shouldSkipTransactionQueuedModal = await this.#storage.get(\n 'shouldSkipTransactionQueuedModal',\n false\n )\n\n this.emitUpdate()\n }\n\n get shouldSkipTransactionQueuedModal() {\n return this.#shouldSkipTransactionQueuedModal\n }\n\n set shouldSkipTransactionQueuedModal(value: boolean) {\n this.#shouldSkipTransactionQueuedModal = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('shouldSkipTransactionQueuedModal', value)\n this.emitUpdate()\n }\n\n // every time when updating selectedToken update the amount and maxAmount of the form\n set selectedToken(token: TokenResult | null) {\n if (!token || Number(getTokenAmount(token)) === 0) {\n this.#selectedToken = null\n this.amount = ''\n this.amountInFiat = ''\n this.amountFieldMode = 'token'\n return\n }\n\n const prevSelectedToken = { ...this.selectedToken }\n\n this.#selectedToken = token\n\n if (\n prevSelectedToken?.address !== token?.address ||\n prevSelectedToken?.networkId !== token?.networkId\n ) {\n if (!token.priceIn.length) {\n this.amountFieldMode = 'token'\n }\n this.amount = ''\n this.amountInFiat = ''\n this.#setSWWarningVisibleIfNeeded()\n }\n }\n\n get selectedToken() {\n return this.#selectedToken\n }\n\n get maxAmount(): string {\n if (\n !this.selectedToken ||\n getTokenAmount(this.selectedToken) === 0n ||\n typeof this.selectedToken.decimals !== 'number'\n )\n return '0'\n\n return formatUnits(getTokenAmount(this.selectedToken), this.selectedToken.decimals)\n }\n\n get maxAmountInFiat(): string {\n if (!this.selectedToken || getTokenAmount(this.selectedToken) === 0n) return '0'\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n if (!tokenPrice || !Number(this.maxAmount)) return '0'\n\n const maxAmount = getTokenAmount(this.selectedToken)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n maxAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n\n resetForm() {\n this.amount = ''\n this.amountInFiat = ''\n this.addressState = { ...DEFAULT_ADDRESS_STATE }\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n this.emitUpdate()\n }\n\n get validationFormMsgs() {\n if (!this.isInitialized) return DEFAULT_VALIDATION_FORM_MSGS\n\n const validationFormMsgsNew = DEFAULT_VALIDATION_FORM_MSGS\n\n if (this.#humanizerInfo && this.#selectedAccountData) {\n const isUDAddress = !!this.addressState.udAddress\n const isEnsAddress = !!this.addressState.ensAddress\n\n validationFormMsgsNew.recipientAddress = validateSendTransferAddress(\n this.recipientAddress,\n this.#selectedAccountData.addr,\n this.isRecipientAddressUnknownAgreed,\n this.isRecipientAddressUnknown,\n this.isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n this.addressState.isDomainResolving,\n this.isSWWarningVisible,\n this.isSWWarningAgreed\n )\n }\n\n // Validate the amount\n if (this.selectedToken) {\n validationFormMsgsNew.amount = validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n )\n }\n\n return validationFormMsgsNew\n }\n\n get isFormValid() {\n if (!this.isInitialized) return false\n\n // if the amount is set, it's enough in topUp mode\n if (this.isTopUp) {\n return (\n this.selectedToken &&\n validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n ).success\n )\n }\n\n const areFormFieldsValid =\n this.validationFormMsgs.amount.success && this.validationFormMsgs.recipientAddress.success\n\n const isSWWarningMissingOrAccepted = !this.isSWWarningVisible || this.isSWWarningAgreed\n\n const isRecipientAddressUnknownMissingOrAccepted =\n !this.isRecipientAddressUnknown || this.isRecipientAddressUnknownAgreed\n\n return (\n areFormFieldsValid &&\n isSWWarningMissingOrAccepted &&\n isRecipientAddressUnknownMissingOrAccepted &&\n !this.addressState.isDomainResolving\n )\n }\n\n get isInitialized() {\n return !!this.#humanizerInfo && !!this.#selectedAccountData && !!this.#networks.length\n }\n\n get recipientAddress() {\n return (\n this.addressState.ensAddress || this.addressState.udAddress || this.addressState.fieldValue\n )\n }\n\n update({\n selectedAccountData,\n humanizerInfo,\n selectedToken,\n amount,\n addressState,\n isSWWarningAgreed,\n isRecipientAddressUnknownAgreed,\n isTopUp,\n networks,\n contacts,\n amountFieldMode\n }: TransferUpdate) {\n if (humanizerInfo) {\n this.#humanizerInfo = humanizerInfo\n }\n if (networks) {\n this.#networks = networks\n }\n if (contacts) {\n this.#addressBookContacts = contacts\n\n if (this.isInitialized) {\n this.checkIsRecipientAddressUnknown()\n }\n }\n if (selectedAccountData) {\n if (this.#selectedAccountData?.addr !== selectedAccountData.addr) {\n this.#setAmount('')\n this.selectedToken = null\n }\n this.#selectedAccountData = selectedAccountData\n }\n if (selectedToken) {\n this.selectedToken = selectedToken\n }\n // If we do a regular check the value won't update if it's '' or '0'\n if (typeof amount === 'string') {\n this.#setAmount(amount)\n }\n if (amountFieldMode) {\n this.amountFieldMode = amountFieldMode\n }\n\n if (addressState) {\n this.addressState = {\n ...this.addressState,\n ...addressState\n }\n if (this.isInitialized) {\n this.#onRecipientAddressChange()\n }\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isSWWarningAgreed) {\n this.isSWWarningAgreed = !this.isSWWarningAgreed\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isRecipientAddressUnknownAgreed) {\n this.isRecipientAddressUnknownAgreed = !this.isRecipientAddressUnknownAgreed\n }\n\n if (typeof isTopUp === 'boolean') {\n this.isTopUp = isTopUp\n this.#setSWWarningVisibleIfNeeded()\n }\n\n this.emitUpdate()\n }\n\n checkIsRecipientAddressUnknown() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n\n this.emitUpdate()\n return\n }\n const isAddressInAddressBook = this.#addressBookContacts.some(\n ({ address }) => address.toLowerCase() === this.recipientAddress.toLowerCase()\n )\n\n this.isRecipientAddressUnknown =\n !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== FEE_COLLECTOR.toLowerCase()\n this.isRecipientAddressUnknownAgreed = false\n this.#setSWWarningVisibleIfNeeded()\n\n this.emitUpdate()\n }\n\n #onRecipientAddressChange() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n return\n }\n\n if (this.#humanizerInfo) {\n // @TODO: could fetch address code\n this.isRecipientHumanizerKnownTokenOrSmartContract =\n !!this.#humanizerInfo.knownAddresses[this.recipientAddress.toLowerCase()]?.isSC\n }\n\n this.checkIsRecipientAddressUnknown()\n }\n\n #setAmount(fieldValue: string) {\n if (!fieldValue) {\n this.amount = ''\n this.amountInFiat = ''\n return\n }\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.amount = fieldValue\n this.amountInFiat = ''\n return\n }\n\n if (this.amountFieldMode === 'fiat' && typeof this.selectedToken?.decimals === 'number') {\n this.amountInFiat = fieldValue\n\n // Get the number of decimals\n const amountInFiatDecimals = fieldValue.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fieldValue, amountInFiatDecimals)\n\n this.amount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.amountFieldMode === 'token') {\n this.amount = fieldValue\n\n if (!this.selectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(fieldValue, this.selectedToken.decimals)\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.selectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.amountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n }\n\n #setSWWarningVisibleIfNeeded() {\n if (!this.#selectedAccountData) return\n\n this.isSWWarningVisible =\n this.isRecipientAddressUnknown &&\n isSmartAccount(this.#selectedAccountData) &&\n !this.isTopUp &&\n !!this.selectedToken?.address &&\n Number(this.selectedToken?.address) === 0 &&\n this.#networks\n .filter((n) => n.id !== 'ethereum')\n .map(({ id }) => id)\n .includes(this.selectedToken.networkId || 'ethereum')\n\n this.emitUpdate()\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n validationFormMsgs: this.validationFormMsgs,\n isFormValid: this.isFormValid,\n isInitialized: this.isInitialized,\n selectedToken: this.selectedToken,\n maxAmount: this.maxAmount,\n maxAmountInFiat: this.maxAmountInFiat,\n shouldSkipTransactionQueuedModal: this.shouldSkipTransactionQueuedModal\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/account.d.ts b/dist/src/interfaces/account.d.ts new file mode 100644 index 000000000..7c9b3b07b --- /dev/null +++ b/dist/src/interfaces/account.d.ts @@ -0,0 +1,93 @@ +import { Network } from './network'; +export type AccountId = string; +export type AccountPreferences = { + label: string; + pfp: string; +}; +export interface Account { + addr: AccountId; + associatedKeys: string[]; + initialPrivileges: [string, string][]; + creation: AccountCreation | null; + preferences: AccountPreferences; + email?: string; + newlyCreated?: boolean; + newlyAdded?: boolean; +} +export interface AccountCreation { + factoryAddr: string; + bytecode: string; + salt: string; +} +export interface AccountOnchainState { + accountAddr: string; + isDeployed: boolean; + nonce: bigint; + erc4337Nonce: bigint; + associatedKeysPriviliges: { + [key: string]: string; + }; + deployError: boolean; + balance: bigint; + isEOA: boolean; + isErc4337Enabled: boolean; + isErc4337Nonce: boolean; + isV2: boolean; + currentBlock: bigint; +} +export type AccountStates = { + [accountId: string]: { + [networkId: string]: AccountOnchainState; + }; +}; +type AccountDerivationMeta = { + slot: number; + index: number; + isLinked: boolean; +}; +export type AccountWithNetworkMeta = Account & { + usedOnNetworks: Network[]; +}; +/** + * The account that is derived programmatically and internally by Ambire. + * Could be either a basic (EOA) account, a derived with custom derivation + * basic (EOA) account (used for smart account key only) or a smart account. + */ +export type DerivedAccount = AccountDerivationMeta & { + account: AccountWithNetworkMeta; +}; +export type DerivedAccountWithoutNetworkMeta = Omit & { + account: Account; +}; +/** + * Enum for tracking the import status of an account during the import process. + */ +export declare enum ImportStatus { + NotImported = "not-imported", + ImportedWithoutKey = "imported-without-key", + ImportedWithSomeOfTheKeys = "imported-with-some-of-the-keys", + ImportedWithTheSameKeys = "imported-with-the-same-keys", + ImportedWithDifferentKeys = "imported-with-different-keys" +} +/** + * All the accounts that should be visible on the current page - the Basic + * Accounts, Smart Accounts and the linked accounts. Excludes the derived + * EOA (basic) accounts used for smart account keys only. + */ +export type AccountOnPage = DerivedAccount & { + importStatus: ImportStatus; +}; +/** + * The account that the user has actively chosen (selected) via the app UI. + * It's always one of the visible accounts returned by the accountsOnPage(). + * Could be either a basic (EOA) account, a smart account or a linked account. + */ +export type SelectedAccountForImport = { + account: Account; + isLinked: AccountDerivationMeta['isLinked']; + accountKeys: (Omit & { + addr: Account['addr']; + })[]; +}; +export {}; +//# sourceMappingURL=account.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/account.d.ts.map b/dist/src/interfaces/account.d.ts.map new file mode 100644 index 000000000..aaf3fcf11 --- /dev/null +++ b/dist/src/interfaces/account.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/interfaces/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,CAAA;IAGf,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;IAErC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;IAChC,WAAW,EAAE,kBAAkB,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CAGb;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IAEnB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,wBAAwB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IACnD,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,EAAE,OAAO,CAAA;IACzB,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,SAAS,EAAE,MAAM,GAAG;QACnB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAAA;KACzC,CAAA;CACF,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG;IAAE,cAAc,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,GAAG;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,CAAA;AAExF,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG;IAC/E,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;GAEG;AACH,oBAAY,YAAY;IACtB,WAAW,iBAAiB;IAC5B,kBAAkB,yBAAyB;IAC3C,yBAAyB,mCAAmC;IAE5D,uBAAuB,gCAAgC;IAEvD,yBAAyB,iCAAiC;CAG3D;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,CAAA;AAE3E;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC3C,WAAW,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,EAAE,CAAA;CACrF,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/account.js b/dist/src/interfaces/account.js index 86ffbb26f..f96c294dd 100644 --- a/dist/src/interfaces/account.js +++ b/dist/src/interfaces/account.js @@ -1,3 +1,16 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enum for tracking the import status of an account during the import process. + */ +export var ImportStatus; +(function (ImportStatus) { + ImportStatus["NotImported"] = "not-imported"; + ImportStatus["ImportedWithoutKey"] = "imported-without-key"; + ImportStatus["ImportedWithSomeOfTheKeys"] = "imported-with-some-of-the-keys"; + // some of the keys (having the same key type), but not all found on the current page + ImportStatus["ImportedWithTheSameKeys"] = "imported-with-the-same-keys"; + // keys (having the same key type) found on the current page + ImportStatus["ImportedWithDifferentKeys"] = "imported-with-different-keys"; // different key + // meaning that could be a key with the same address but different type, + // or a key with different address altogether. +})(ImportStatus || (ImportStatus = {})); //# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/interfaces/account.js.map b/dist/src/interfaces/account.js.map index 9da05bd65..907a8fb1c 100644 --- a/dist/src/interfaces/account.js.map +++ b/dist/src/interfaces/account.js.map @@ -1 +1 @@ -{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/interfaces/account.ts"],"names":[],"mappings":""} \ No newline at end of file +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/interfaces/account.ts"],"names":[],"mappings":"AAwEA;;GAEG;AACH,MAAM,CAAN,IAAY,YAUX;AAVD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,2DAA2C,CAAA;IAC3C,4EAA4D,CAAA;IAC5D,qFAAqF;IACrF,uEAAuD,CAAA;IACvD,4DAA4D;IAC5D,0EAA0D,CAAA,CAAC,gBAAgB;IAC3E,wEAAwE;IACxE,8CAA8C;AAChD,CAAC,EAVW,YAAY,KAAZ,YAAY,QAUvB","sourcesContent":["import { Network } from './network'\n\nexport type AccountId = string\n\nexport type AccountPreferences = {\n label: string\n pfp: string // profile picture - acc address as default value to display a unique jazz icon\n}\n\nexport interface Account {\n addr: AccountId\n // Associated keys that can control the account\n // For EOAs this must be set to [account.addr]\n associatedKeys: string[]\n initialPrivileges: [string, string][]\n // Creation data; `null` in case of an EOA\n creation: AccountCreation | null\n preferences: AccountPreferences\n email?: string\n newlyCreated?: boolean\n newlyAdded?: boolean\n}\n\nexport interface AccountCreation {\n factoryAddr: string\n bytecode: string\n salt: string\n // baseIdentityAddr is intentionally omitted because it's not used anywhere\n // and because it can be retrieved from the bytecode\n}\n\nexport interface AccountOnchainState {\n accountAddr: string\n isDeployed: boolean\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint\n erc4337Nonce: bigint\n associatedKeysPriviliges: { [key: string]: string }\n deployError: boolean\n balance: bigint\n isEOA: boolean\n isErc4337Enabled: boolean\n isErc4337Nonce: boolean\n isV2: boolean\n currentBlock: bigint\n}\n\nexport type AccountStates = {\n [accountId: string]: {\n [networkId: string]: AccountOnchainState\n }\n}\n\ntype AccountDerivationMeta = {\n slot: number // the iteration on which the account is derived, starting from 1\n index: number // the derivation index of the in the slot, starting from 0\n isLinked: boolean // linked accounts are also smart accounts, so use a flag to differentiate\n}\n\nexport type AccountWithNetworkMeta = Account & { usedOnNetworks: Network[] }\n\n/**\n * The account that is derived programmatically and internally by Ambire.\n * Could be either a basic (EOA) account, a derived with custom derivation\n * basic (EOA) account (used for smart account key only) or a smart account.\n */\nexport type DerivedAccount = AccountDerivationMeta & { account: AccountWithNetworkMeta }\n// Sub-type, used during intermediate step during the deriving accounts process\nexport type DerivedAccountWithoutNetworkMeta = Omit & {\n account: Account\n}\n\n/**\n * Enum for tracking the import status of an account during the import process.\n */\nexport enum ImportStatus {\n NotImported = 'not-imported',\n ImportedWithoutKey = 'imported-without-key', // as a view only account\n ImportedWithSomeOfTheKeys = 'imported-with-some-of-the-keys', // imported with\n // some of the keys (having the same key type), but not all found on the current page\n ImportedWithTheSameKeys = 'imported-with-the-same-keys', // imported with all\n // keys (having the same key type) found on the current page\n ImportedWithDifferentKeys = 'imported-with-different-keys' // different key\n // meaning that could be a key with the same address but different type,\n // or a key with different address altogether.\n}\n\n/**\n * All the accounts that should be visible on the current page - the Basic\n * Accounts, Smart Accounts and the linked accounts. Excludes the derived\n * EOA (basic) accounts used for smart account keys only.\n */\nexport type AccountOnPage = DerivedAccount & { importStatus: ImportStatus }\n\n/**\n * The account that the user has actively chosen (selected) via the app UI.\n * It's always one of the visible accounts returned by the accountsOnPage().\n * Could be either a basic (EOA) account, a smart account or a linked account.\n */\nexport type SelectedAccountForImport = {\n account: Account\n isLinked: AccountDerivationMeta['isLinked']\n accountKeys: (Omit & { addr: Account['addr'] })[]\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/actions.d.ts b/dist/src/interfaces/actions.d.ts new file mode 100644 index 000000000..1ae4b924f --- /dev/null +++ b/dist/src/interfaces/actions.d.ts @@ -0,0 +1,35 @@ +import { AccountOp } from '../libs/accountOp/accountOp'; +import { Account } from './account'; +import { DappUserRequest, SignUserRequest, UserRequest } from './userRequest'; +export type SwitchAccountAction = { + id: UserRequest['id']; + type: 'switchAccount'; + userRequest: { + meta: { + accountAddr: Account['addr']; + switchToAccountAddr: Account['addr']; + }; + }; +}; +export type AccountOpAction = { + id: SignUserRequest['id']; + type: 'accountOp'; + accountOp: AccountOp; +}; +export type SignMessageAction = { + id: SignUserRequest['id']; + type: 'signMessage'; + userRequest: SignUserRequest; +}; +export type BenzinAction = { + id: UserRequest['id']; + type: 'benzin'; + userRequest: SignUserRequest; +}; +export type DappRequestAction = { + id: UserRequest['id']; + type: 'dappRequest'; + userRequest: DappUserRequest; +}; +export type Action = SwitchAccountAction | AccountOpAction | SignMessageAction | BenzinAction | DappRequestAction; +//# sourceMappingURL=actions.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/actions.d.ts.map b/dist/src/interfaces/actions.d.ts.map new file mode 100644 index 000000000..67f197d51 --- /dev/null +++ b/dist/src/interfaces/actions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/interfaces/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE7E,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACrB,IAAI,EAAE,eAAe,CAAA;IACrB,WAAW,EAAE;QACX,IAAI,EAAE;YACJ,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAC5B,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;SACrC,CAAA;KACF,CAAA;CACF,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAA;IACzB,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAA;IACzB,IAAI,EAAE,aAAa,CAAA;IACnB,WAAW,EAAE,eAAe,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACrB,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,EAAE,eAAe,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACrB,IAAI,EAAE,aAAa,CAAA;IACnB,WAAW,EAAE,eAAe,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,MAAM,GACd,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,iBAAiB,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/actions.js b/dist/src/interfaces/actions.js new file mode 100644 index 000000000..0477c352d --- /dev/null +++ b/dist/src/interfaces/actions.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/interfaces/actions.js.map b/dist/src/interfaces/actions.js.map new file mode 100644 index 000000000..852cc6fb1 --- /dev/null +++ b/dist/src/interfaces/actions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/interfaces/actions.ts"],"names":[],"mappings":"","sourcesContent":["import { AccountOp } from '../libs/accountOp/accountOp'\nimport { Account } from './account'\nimport { DappUserRequest, SignUserRequest, UserRequest } from './userRequest'\n\nexport type SwitchAccountAction = {\n id: UserRequest['id']\n type: 'switchAccount'\n userRequest: {\n meta: {\n accountAddr: Account['addr']\n switchToAccountAddr: Account['addr']\n }\n }\n}\n\nexport type AccountOpAction = {\n id: SignUserRequest['id']\n type: 'accountOp'\n accountOp: AccountOp\n}\n\nexport type SignMessageAction = {\n id: SignUserRequest['id']\n type: 'signMessage'\n userRequest: SignUserRequest\n}\n\nexport type BenzinAction = {\n id: UserRequest['id']\n type: 'benzin'\n userRequest: SignUserRequest\n}\n\nexport type DappRequestAction = {\n id: UserRequest['id']\n type: 'dappRequest'\n userRequest: DappUserRequest\n}\n\nexport type Action =\n | SwitchAccountAction\n | AccountOpAction\n | SignMessageAction\n | BenzinAction\n | DappRequestAction\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/banner.d.ts b/dist/src/interfaces/banner.d.ts new file mode 100644 index 000000000..725bc6db6 --- /dev/null +++ b/dist/src/interfaces/banner.d.ts @@ -0,0 +1,90 @@ +import { AccountOpAction } from './actions'; +export type BannerType = 'error' | 'warning' | 'info' | 'info2' | 'success'; +export type BannerCategory = 'pending-to-be-signed-acc-op' | 'pending-to-be-confirmed-acc-op' | 'bridge-in-progress' | 'bridge-waiting-approval-to-resolve' | 'bridge-ready' | 'bridge-completed' | 'bridge-failed' | 'temp-seed-not-confirmed' | 'old-account'; +export interface Banner { + id: number | string; + accountAddr?: string; + type: BannerType; + category?: BannerCategory; + title: string; + text: string; + actions: Action[]; +} +export type Action = { + label: 'Open'; + actionName: 'open-pending-dapp-requests'; +} | { + label: 'Open'; + actionName: 'open-accountOp'; + meta: { + actionId: AccountOpAction['id']; + }; +} | { + label: 'Reject'; + actionName: 'reject-accountOp'; + meta: { + err: string; + actionId: AccountOpAction['id']; + shouldOpenNextAction: boolean; + }; +} | { + label: 'Sync'; + actionName: 'sync-keys'; + meta: { + email: string; + keys: string[]; + }; +} | { + label: string; + actionName: 'open-external-url'; + meta: { + url: string; + }; +} | { + label: string; + actionName: 'backup-keystore-secret'; +} | { + label: 'Switch'; + actionName: 'switch-default-wallet'; + meta: {}; +} | { + label: 'Reject'; + actionName: 'reject-bridge'; + meta: { + activeRouteId: number; + }; +} | { + label: 'Proceed to Next Step' | 'Open'; + actionName: 'proceed-bridge'; + meta: { + activeRouteId: number; + }; +} | { + label: 'Close'; + actionName: 'close-bridge'; + meta: { + activeRouteId: number; + }; +} | { + label: 'Details'; + actionName: 'open-swap-and-bridge-tab'; +} | { + label: 'Hide'; + actionName: 'hide-activity-banner'; + meta: { + timestamp: number; + addr: string; + network: string; + isHideStyle: boolean; + }; +} | { + label: 'Check'; + actionName: 'confirm-temp-seed'; +} | { + label: 'Reload'; + actionName: 'update-extension-version'; +} | { + label: 'Retry'; + actionName: 'reload-selected-account'; +}; +//# sourceMappingURL=banner.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/banner.d.ts.map b/dist/src/interfaces/banner.d.ts.map new file mode 100644 index 000000000..71ae6cea9 --- /dev/null +++ b/dist/src/interfaces/banner.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/banner.js b/dist/src/interfaces/banner.js new file mode 100644 index 000000000..c6d99cc05 --- /dev/null +++ b/dist/src/interfaces/banner.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=banner.js.map \ No newline at end of file diff --git a/dist/src/interfaces/banner.js.map b/dist/src/interfaces/banner.js.map new file mode 100644 index 000000000..767d0ed62 --- /dev/null +++ b/dist/src/interfaces/banner.js.map @@ -0,0 +1 @@ +{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"","sourcesContent":["import { AccountOpAction } from './actions'\n\nexport type BannerType = 'error' | 'warning' | 'info' | 'info2' | 'success'\nexport type BannerCategory =\n | 'pending-to-be-signed-acc-op'\n | 'pending-to-be-confirmed-acc-op'\n | 'bridge-in-progress'\n | 'bridge-waiting-approval-to-resolve'\n | 'bridge-ready'\n | 'bridge-completed'\n | 'bridge-failed'\n | 'temp-seed-not-confirmed'\n | 'old-account'\n\nexport interface Banner {\n id: number | string\n accountAddr?: string\n type: BannerType\n category?: BannerCategory\n title: string\n text: string\n actions: Action[]\n}\n\nexport type Action =\n | {\n label: 'Open'\n actionName: 'open-pending-dapp-requests'\n }\n | {\n label: 'Open'\n actionName: 'open-accountOp'\n meta: { actionId: AccountOpAction['id'] }\n }\n | {\n label: 'Reject'\n actionName: 'reject-accountOp'\n meta: {\n err: string\n actionId: AccountOpAction['id']\n shouldOpenNextAction: boolean\n }\n }\n | {\n label: 'Sync'\n actionName: 'sync-keys'\n meta: { email: string; keys: string[] }\n }\n | {\n label: string\n actionName: 'open-external-url'\n meta: { url: string }\n }\n | {\n label: string\n actionName: 'backup-keystore-secret'\n }\n | {\n label: 'Switch'\n actionName: 'switch-default-wallet'\n meta: {}\n }\n | {\n label: 'Reject'\n actionName: 'reject-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Proceed to Next Step' | 'Open'\n actionName: 'proceed-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Close'\n actionName: 'close-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Details'\n actionName: 'open-swap-and-bridge-tab'\n }\n | {\n label: 'Hide'\n actionName: 'hide-activity-banner'\n meta: { timestamp: number; addr: string; network: string; isHideStyle: boolean }\n }\n | {\n label: 'Check'\n actionName: 'confirm-temp-seed'\n }\n | {\n label: 'Reload'\n actionName: 'update-extension-version'\n }\n | {\n label: 'Retry'\n actionName: 'reload-selected-account'\n }\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/dapp.d.ts b/dist/src/interfaces/dapp.d.ts new file mode 100644 index 000000000..843768883 --- /dev/null +++ b/dist/src/interfaces/dapp.d.ts @@ -0,0 +1,23 @@ +export interface Dapp { + name: string; + description: string; + url: string; + icon: string | null; + isConnected: boolean; + chainId: number; + favorite: boolean; +} +export interface DappProviderRequest { + method: string; + params?: any; + session: { + name: string; + origin: string; + icon: string; + }; + origin: string; + meta?: { + [key: string]: any; + }; +} +//# sourceMappingURL=dapp.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/dapp.d.ts.map b/dist/src/interfaces/dapp.d.ts.map new file mode 100644 index 000000000..4a24b13ea --- /dev/null +++ b/dist/src/interfaces/dapp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"dapp.d.ts","sourceRoot":"","sources":["../../../src/interfaces/dapp.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;CAC9B"} \ No newline at end of file diff --git a/dist/src/interfaces/dapp.js b/dist/src/interfaces/dapp.js new file mode 100644 index 000000000..b8e7f3864 --- /dev/null +++ b/dist/src/interfaces/dapp.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=dapp.js.map \ No newline at end of file diff --git a/dist/src/interfaces/dapp.js.map b/dist/src/interfaces/dapp.js.map new file mode 100644 index 000000000..9a342df1c --- /dev/null +++ b/dist/src/interfaces/dapp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dapp.js","sourceRoot":"","sources":["../../../src/interfaces/dapp.ts"],"names":[],"mappings":"","sourcesContent":["export interface Dapp {\n name: string\n description: string\n url: string\n icon: string | null\n isConnected: boolean\n chainId: number\n favorite: boolean\n}\n\nexport interface DappProviderRequest {\n method: string\n params?: any\n session: { name: string; origin: string; icon: string }\n origin: string\n meta?: { [key: string]: any }\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/domains.d.ts b/dist/src/interfaces/domains.d.ts new file mode 100644 index 000000000..b0d870059 --- /dev/null +++ b/dist/src/interfaces/domains.d.ts @@ -0,0 +1,14 @@ +type AddressState = { + fieldValue: string; + udAddress: string; + ensAddress: string; + isDomainResolving: boolean; +}; +type AddressStateOptional = { + fieldValue?: AddressState['fieldValue']; + ensAddress?: AddressState['ensAddress']; + udAddress?: AddressState['udAddress']; + isDomainResolving?: AddressState['isDomainResolving']; +}; +export type { AddressState, AddressStateOptional }; +//# sourceMappingURL=domains.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/domains.d.ts.map b/dist/src/interfaces/domains.d.ts.map new file mode 100644 index 000000000..91c05d21a --- /dev/null +++ b/dist/src/interfaces/domains.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../../src/interfaces/domains.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,UAAU,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACvC,UAAU,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAA;CACtD,CAAA;AAED,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/domains.js b/dist/src/interfaces/domains.js new file mode 100644 index 000000000..a013bd5d5 --- /dev/null +++ b/dist/src/interfaces/domains.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=domains.js.map \ No newline at end of file diff --git a/dist/src/interfaces/domains.js.map b/dist/src/interfaces/domains.js.map new file mode 100644 index 000000000..3f7339442 --- /dev/null +++ b/dist/src/interfaces/domains.js.map @@ -0,0 +1 @@ +{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../../src/interfaces/domains.ts"],"names":[],"mappings":"","sourcesContent":["type AddressState = {\n fieldValue: string\n udAddress: string\n ensAddress: string\n isDomainResolving: boolean\n}\n\ntype AddressStateOptional = {\n fieldValue?: AddressState['fieldValue']\n ensAddress?: AddressState['ensAddress']\n udAddress?: AddressState['udAddress']\n isDomainResolving?: AddressState['isDomainResolving']\n}\n\nexport type { AddressState, AddressStateOptional }\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.d.ts b/dist/src/interfaces/emailVault.d.ts new file mode 100644 index 000000000..7808db25e --- /dev/null +++ b/dist/src/interfaces/emailVault.d.ts @@ -0,0 +1,55 @@ +import { AccountCreation, AccountId } from './account'; +export type MagicLinkFlow = 'recovery' | 'setup'; +export declare enum SecretType { + RecoveryKey = "recoveryKey", + KeyStore = "keyStore", + keyBackup = "keyBackup" +} +export interface EmailVaultSecret { + key: string; + value?: string; + type: SecretType; +} +export interface EmailVaultAccountInfo { + addr: AccountId; + associatedKeys: string[]; + creation: AccountCreation | null; +} +export declare enum OperationRequestType { + requestKeySync = "requestKeySync" +} +/** + * Operations are used for communication between devices. + * + * @interface EmailVaultOperation + * @property {string} [id] - A value that is randomly assigned by the relayer if the operation is legit. + * @property {OperationRequestType} type - A label for the intention of the operation. + * @property {string} requester - In the context of the EmailVault, this is the device's keystoreId, acting as a public key for encryption. + * @property {string} key - In the context of the EmailVault and syncing keys, this is the address for the EOA we want the private key for (might not be applicable for new operation types, if any). + * @property {string} [value] - The fetched value. + * @property {string} [password] - The password associated with the operation. The relayer doesn't return the value of the op if wrong password + */ +export interface EmailVaultOperation { + id?: string; + type: OperationRequestType; + requester: string; + key: string; + value?: string; + password?: string; +} +export interface EmailVaultData { + recoveryKey: string; + email: string; + availableAccounts: { + [addr: string]: EmailVaultAccountInfo; + }; + availableSecrets: { + [key: string]: EmailVaultSecret; + }; + operations: EmailVaultOperation[]; +} +export interface RecoveryKey { + key: String; + type: String; +} +//# sourceMappingURL=emailVault.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.d.ts.map b/dist/src/interfaces/emailVault.d.ts.map new file mode 100644 index 000000000..fcd85c62f --- /dev/null +++ b/dist/src/interfaces/emailVault.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.d.ts","sourceRoot":"","sources":["../../../src/interfaces/emailVault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAEtD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,CAAA;AAEhD,oBAAY,UAAU;IACpB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;CACjC;AAED,oBAAY,oBAAoB;IAC9B,cAAc,mBAAmB;CAClC;AACD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,oBAAoB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAAA;KAAE,CAAA;IAC5D,gBAAgB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;KAAE,CAAA;IACrD,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb"} \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.js b/dist/src/interfaces/emailVault.js new file mode 100644 index 000000000..e3ca0833e --- /dev/null +++ b/dist/src/interfaces/emailVault.js @@ -0,0 +1,11 @@ +export var SecretType; +(function (SecretType) { + SecretType["RecoveryKey"] = "recoveryKey"; + SecretType["KeyStore"] = "keyStore"; + SecretType["keyBackup"] = "keyBackup"; +})(SecretType || (SecretType = {})); +export var OperationRequestType; +(function (OperationRequestType) { + OperationRequestType["requestKeySync"] = "requestKeySync"; +})(OperationRequestType || (OperationRequestType = {})); +//# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.js.map b/dist/src/interfaces/emailVault.js.map new file mode 100644 index 000000000..4a6a29711 --- /dev/null +++ b/dist/src/interfaces/emailVault.js.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../src/interfaces/emailVault.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,mCAAqB,CAAA;IACrB,qCAAuB,CAAA;AACzB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAcD,MAAM,CAAN,IAAY,oBAEX;AAFD,WAAY,oBAAoB;IAC9B,yDAAiC,CAAA;AACnC,CAAC,EAFW,oBAAoB,KAApB,oBAAoB,QAE/B","sourcesContent":["import { AccountCreation, AccountId } from './account'\n\nexport type MagicLinkFlow = 'recovery' | 'setup'\n\nexport enum SecretType {\n RecoveryKey = 'recoveryKey',\n KeyStore = 'keyStore',\n keyBackup = 'keyBackup'\n}\n\nexport interface EmailVaultSecret {\n key: string\n value?: string\n type: SecretType\n}\n\nexport interface EmailVaultAccountInfo {\n addr: AccountId\n associatedKeys: string[]\n creation: AccountCreation | null\n}\n\nexport enum OperationRequestType {\n requestKeySync = 'requestKeySync'\n}\n/**\n * Operations are used for communication between devices.\n *\n * @interface EmailVaultOperation\n * @property {string} [id] - A value that is randomly assigned by the relayer if the operation is legit.\n * @property {OperationRequestType} type - A label for the intention of the operation.\n * @property {string} requester - In the context of the EmailVault, this is the device's keystoreId, acting as a public key for encryption.\n * @property {string} key - In the context of the EmailVault and syncing keys, this is the address for the EOA we want the private key for (might not be applicable for new operation types, if any).\n * @property {string} [value] - The fetched value.\n * @property {string} [password] - The password associated with the operation. The relayer doesn't return the value of the op if wrong password\n */\nexport interface EmailVaultOperation {\n id?: string\n type: OperationRequestType\n requester: string\n key: string\n value?: string\n password?: string\n}\n\nexport interface EmailVaultData {\n recoveryKey: string\n email: string\n availableAccounts: { [addr: string]: EmailVaultAccountInfo }\n availableSecrets: { [key: string]: EmailVaultSecret }\n operations: EmailVaultOperation[]\n}\n\nexport interface RecoveryKey {\n key: String\n type: String\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/fetch.d.ts b/dist/src/interfaces/fetch.d.ts new file mode 100644 index 000000000..18a497896 --- /dev/null +++ b/dist/src/interfaces/fetch.d.ts @@ -0,0 +1,12 @@ +import { HeadersInit, RequestInfo, RequestInit, Response } from 'node-fetch'; +export interface CustomResponse extends Response { + [key: string]: any; +} +export interface RequestInitWithCustomHeaders extends RequestInit { + headers: HeadersInit & { + 'x-app-source'?: string; + 'x-api-key'?: string; + }; +} +export type Fetch = (input: RequestInfo, init?: RequestInitWithCustomHeaders) => Promise; +//# sourceMappingURL=fetch.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/fetch.d.ts.map b/dist/src/interfaces/fetch.d.ts.map new file mode 100644 index 000000000..89df74c29 --- /dev/null +++ b/dist/src/interfaces/fetch.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/interfaces/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG5E,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAGD,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAC/D,OAAO,EAAE,WAAW,GAAG;QACrB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED,MAAM,MAAM,KAAK,GAAG,CAClB,KAAK,EAAE,WAAW,EAClB,IAAI,CAAC,EAAE,4BAA4B,KAChC,OAAO,CAAC,cAAc,CAAC,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/fetch.js b/dist/src/interfaces/fetch.js new file mode 100644 index 000000000..168511afa --- /dev/null +++ b/dist/src/interfaces/fetch.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/dist/src/interfaces/fetch.js.map b/dist/src/interfaces/fetch.js.map new file mode 100644 index 000000000..e7d16ea03 --- /dev/null +++ b/dist/src/interfaces/fetch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/interfaces/fetch.ts"],"names":[],"mappings":"","sourcesContent":["import { HeadersInit, RequestInfo, RequestInit, Response } from 'node-fetch'\n\n// TODO: One sunny day, consider adding specific types for the incoming responses\nexport interface CustomResponse extends Response {\n [key: string]: any\n}\n\n// Re-use the global fetch type (type should be with the same footprint across all apps)\nexport interface RequestInitWithCustomHeaders extends RequestInit {\n headers: HeadersInit & {\n 'x-app-source'?: string // used internally to identify the source of the request\n 'x-api-key'?: string // Jiffy Scan API key\n }\n}\n\nexport type Fetch = (\n input: RequestInfo,\n init?: RequestInitWithCustomHeaders\n) => Promise\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/hex.d.ts b/dist/src/interfaces/hex.d.ts new file mode 100644 index 000000000..8c8cadc34 --- /dev/null +++ b/dist/src/interfaces/hex.d.ts @@ -0,0 +1,2 @@ +export type Hex = `0x${string}`; +//# sourceMappingURL=hex.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/hex.d.ts.map b/dist/src/interfaces/hex.d.ts.map new file mode 100644 index 000000000..e8ca61a27 --- /dev/null +++ b/dist/src/interfaces/hex.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../src/interfaces/hex.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/hex.js b/dist/src/interfaces/hex.js new file mode 100644 index 000000000..960efc83e --- /dev/null +++ b/dist/src/interfaces/hex.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=hex.js.map \ No newline at end of file diff --git a/dist/src/interfaces/hex.js.map b/dist/src/interfaces/hex.js.map new file mode 100644 index 000000000..71c109b97 --- /dev/null +++ b/dist/src/interfaces/hex.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/interfaces/hex.ts"],"names":[],"mappings":"","sourcesContent":["export type Hex = `0x${string}`\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/keyIterator.d.ts b/dist/src/interfaces/keyIterator.d.ts new file mode 100644 index 000000000..79742e35a --- /dev/null +++ b/dist/src/interfaces/keyIterator.d.ts @@ -0,0 +1,30 @@ +import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'; +import { SelectedAccountForImport } from './account'; +import { ExternalSignerController, Key } from './keystore'; +export interface KeyIterator { + type: Key['type']; + subType?: 'seed' | 'private-key'; + /** The wallet native SDK instance, if any exists */ + walletSDK?: any; + /** Needed for the hardware wallets only */ + controller?: ExternalSignerController; + /** Retrieves the the public addresses (accounts) from specific indexes */ + retrieve: (fromToArr: { + from: number; + to: number; + }[], derivation?: HD_PATH_TEMPLATE_TYPE) => Promise; + /** Retrieves the private keys (optional, for hot wallets only) */ + retrieveInternalKeys?: (selectedAccountsForImport: SelectedAccountForImport[], hdPathTemplate: HD_PATH_TEMPLATE_TYPE, keystoreKeys: Key[]) => { + addr: string; + type: 'internal'; + label: string; + privateKey: string; + dedicatedToOneSA: boolean; + meta: { + createdAt: number; + }; + }[]; + /** Checks if the seed matches the key iterator's seed (optional, for hot wallets) */ + isSeedMatching?: (seedToCompareWith: string) => boolean; +} +//# sourceMappingURL=keyIterator.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/keyIterator.d.ts.map b/dist/src/interfaces/keyIterator.d.ts.map new file mode 100644 index 000000000..331c29607 --- /dev/null +++ b/dist/src/interfaces/keyIterator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keyIterator.d.ts","sourceRoot":"","sources":["../../../src/interfaces/keyIterator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAA;IAChC,oDAAoD;IACpD,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,2CAA2C;IAC3C,UAAU,CAAC,EAAE,wBAAwB,CAAA;IACrC,0EAA0E;IAC1E,QAAQ,EAAE,CACR,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,EACzC,UAAU,CAAC,EAAE,qBAAqB,KAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACtB,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,CACrB,yBAAyB,EAAE,wBAAwB,EAAE,EACrD,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,GAAG,EAAE,KAChB;QACH,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,UAAU,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,EAAE,MAAM,CAAA;QAClB,gBAAgB,EAAE,OAAO,CAAA;QACzB,IAAI,EAAE;YACJ,SAAS,EAAE,MAAM,CAAA;SAClB,CAAA;KACF,EAAE,CAAA;IACH,qFAAqF;IACrF,cAAc,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAA;CACxD"} \ No newline at end of file diff --git a/dist/src/interfaces/keyIterator.js b/dist/src/interfaces/keyIterator.js new file mode 100644 index 000000000..1f266deb7 --- /dev/null +++ b/dist/src/interfaces/keyIterator.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=keyIterator.js.map \ No newline at end of file diff --git a/dist/src/interfaces/keyIterator.js.map b/dist/src/interfaces/keyIterator.js.map new file mode 100644 index 000000000..39da5f183 --- /dev/null +++ b/dist/src/interfaces/keyIterator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../src/interfaces/keyIterator.ts"],"names":[],"mappings":"","sourcesContent":["import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { SelectedAccountForImport } from './account'\nimport { ExternalSignerController, Key } from './keystore'\n\nexport interface KeyIterator {\n type: Key['type']\n subType?: 'seed' | 'private-key'\n /** The wallet native SDK instance, if any exists */\n walletSDK?: any\n /** Needed for the hardware wallets only */\n controller?: ExternalSignerController\n /** Retrieves the the public addresses (accounts) from specific indexes */\n retrieve: (\n fromToArr: { from: number; to: number }[],\n derivation?: HD_PATH_TEMPLATE_TYPE\n ) => Promise\n /** Retrieves the private keys (optional, for hot wallets only) */\n retrieveInternalKeys?: (\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) => {\n addr: string\n type: 'internal'\n label: string\n privateKey: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number\n }\n }[]\n /** Checks if the seed matches the key iterator's seed (optional, for hot wallets) */\n isSeedMatching?: (seedToCompareWith: string) => boolean\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/keystore.d.ts b/dist/src/interfaces/keystore.d.ts new file mode 100644 index 000000000..debb8832b --- /dev/null +++ b/dist/src/interfaces/keystore.d.ts @@ -0,0 +1,145 @@ +import { Transaction } from 'ethers'; +import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'; +import { GasFeePayment } from '../libs/accountOp/accountOp'; +import { Call } from '../libs/accountOp/types'; +import { getHdPathFromTemplate } from '../utils/hdPath'; +import { Account } from './account'; +import { Network } from './network'; +import { TypedMessage } from './userRequest'; +/** + * The ExternalSignerController interface defines the structure for controllers + * that interact with hardware wallets. Each hardware wallet type (Ledger, + * Trezor, Lattice) will have its own implementation of this interface. + * The interface includes methods for unlocking the device, checking if it's + * unlocked, and cleaning up after use. It also includes properties specific to + * each type of hardware wallet, such as the device model and ID, the path to + * the unlocked device, and any necessary credentials. + */ +export interface ExternalSignerController { + type: string; + deviceModel: string; + deviceId: string; + isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean; + unlock: (path: ReturnType, expectedKeyOnThisPath?: string, shouldOpenLatticeConnectorInTab?: boolean) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>; + unlockedPath: string; + unlockedPathKeyAddr: string; + walletSDK?: any; + cleanUp: () => void; + isInitiated?: boolean; + initialLoadPromise?: Promise; + retrieveAddresses: (paths: string[]) => Promise; + isWebHID?: boolean; + transport?: any; + appName?: string; + creds?: any; + network?: any; +} +export type ExternalSignerControllers = Partial<{ + [key in Key['type']]: ExternalSignerController; +}>; +export interface TxnRequest { + to: Call['to']; + value?: Call['value']; + data: Call['data']; + chainId: Network['chainId']; + nonce: number; + gasLimit: GasFeePayment['simulatedGasLimit']; + gasPrice?: bigint; + maxFeePerGas?: bigint; + maxPriorityFeePerGas?: bigint; + type?: number; +} +export interface KeystoreSigner { + key: Key; + init?: (externalSignerController?: ExternalSignerController) => void; + signRawTransaction: (txnRequest: TxnRequest) => Promise; + signTypedData: (typedMessage: TypedMessage) => Promise; + signMessage: (hex: string) => Promise; +} +export type ScryptParams = { + salt: string; + N: number; + r: number; + p: number; + dkLen: number; +}; +export type AESEncrypted = { + cipherType: string; + ciphertext: string; + iv: string; + mac: string; +}; +export type MainKeyEncryptedWithSecret = { + id: string; + scryptParams: ScryptParams; + aesEncrypted: AESEncrypted; +}; +export type MainKey = { + key: Uint8Array; + iv: Uint8Array; +}; +export type Key = (InternalKey | ExternalKey) & { + isExternallyStored: boolean; +}; +export declare const standardSigningOnlyPriv = "0x0000000000000000000000000000000000000000000000000000000000000001"; +export declare const dedicatedToOneSAPriv = "0x0000000000000000000000000000000000000000000000000000000000000002"; +export type InternalKey = { + addr: Account['addr']; + type: 'internal'; + label: string; + dedicatedToOneSA: boolean; + meta: { + createdAt: number | null; + }; +}; +export type ExternalKey = { + addr: Account['addr']; + type: 'trezor' | 'ledger' | 'lattice' | string; + label: string; + dedicatedToOneSA: boolean; + meta: { + deviceId: string; + deviceModel: string; + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; + index: number; + createdAt: number | null; + }; +}; +export type StoredKey = (InternalKey & { + privKey: string; +}) | (ExternalKey & { + privKey: null; +}); +export type KeystoreSeed = { + seed: string; + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; +}; +export type KeystoreSignerType = { + new (key: Key, privateKey?: string): KeystoreSigner; +}; +/** + * The keys that are ready to be added to the user's keystore (by the Main Controller). + * They are needed as an intermediate step during the accounts import flow + * (for the accounts that were just imported by the AccountAdder Controller). + */ +export type ReadyToAddKeys = { + internal: { + addr: Key['addr']; + label: string; + type: 'internal'; + privateKey: string; + dedicatedToOneSA: Key['dedicatedToOneSA']; + meta: InternalKey['meta']; + }[]; + external: { + addr: Key['addr']; + label: string; + type: Key['type']; + dedicatedToOneSA: Key['dedicatedToOneSA']; + meta: ExternalKey['meta']; + }[]; +}; +export type KeyPreferences = { + label: string; +}; +//# sourceMappingURL=keystore.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/keystore.d.ts.map b/dist/src/interfaces/keystore.d.ts.map new file mode 100644 index 000000000..29110e4ae --- /dev/null +++ b/dist/src/interfaces/keystore.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/keystore.js b/dist/src/interfaces/keystore.js new file mode 100644 index 000000000..516934c60 --- /dev/null +++ b/dist/src/interfaces/keystore.js @@ -0,0 +1,3 @@ +export const standardSigningOnlyPriv = '0x0000000000000000000000000000000000000000000000000000000000000001'; +export const dedicatedToOneSAPriv = '0x0000000000000000000000000000000000000000000000000000000000000002'; +//# sourceMappingURL=keystore.js.map \ No newline at end of file diff --git a/dist/src/interfaces/keystore.js.map b/dist/src/interfaces/keystore.js.map new file mode 100644 index 000000000..6785aa6e5 --- /dev/null +++ b/dist/src/interfaces/keystore.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":"AA8FA,MAAM,CAAC,MAAM,uBAAuB,GAClC,oEAAoE,CAAA;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["import { Transaction } from 'ethers'\n\nimport { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { GasFeePayment } from '../libs/accountOp/accountOp'\nimport { Call } from '../libs/accountOp/types'\nimport { getHdPathFromTemplate } from '../utils/hdPath'\nimport { Account } from './account'\nimport { Network } from './network'\nimport { TypedMessage } from './userRequest'\n\n/**\n * The ExternalSignerController interface defines the structure for controllers\n * that interact with hardware wallets. Each hardware wallet type (Ledger,\n * Trezor, Lattice) will have its own implementation of this interface.\n * The interface includes methods for unlocking the device, checking if it's\n * unlocked, and cleaning up after use. It also includes properties specific to\n * each type of hardware wallet, such as the device model and ID, the path to\n * the unlocked device, and any necessary credentials.\n */\nexport interface ExternalSignerController {\n type: string\n deviceModel: string\n deviceId: string\n isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean\n unlock: (\n path: ReturnType,\n expectedKeyOnThisPath?: string,\n shouldOpenLatticeConnectorInTab?: boolean // Lattice specific\n ) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>\n unlockedPath: string\n unlockedPathKeyAddr: string\n walletSDK?: any // Either the wallet own SDK or its session, each wallet having specifics\n cleanUp: () => void // Trezor and Ledger specific\n isInitiated?: boolean // Trezor specific\n initialLoadPromise?: Promise // Trezor specific\n retrieveAddresses: (paths: string[]) => Promise // Ledger specific\n // TODO: Refine the rest of the props\n isWebHID?: boolean // Ledger specific\n transport?: any // Ledger specific\n appName?: string // Lattice specific\n creds?: any // Lattice specific\n network?: any // Lattice specific\n}\nexport type ExternalSignerControllers = Partial<{ [key in Key['type']]: ExternalSignerController }>\n\nexport interface TxnRequest {\n to: Call['to']\n value?: Call['value']\n data: Call['data']\n chainId: Network['chainId']\n nonce: number\n gasLimit: GasFeePayment['simulatedGasLimit']\n gasPrice?: bigint\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n type?: number\n}\n\nexport interface KeystoreSigner {\n key: Key\n init?: (externalSignerController?: ExternalSignerController) => void\n signRawTransaction: (txnRequest: TxnRequest) => Promise\n signTypedData: (typedMessage: TypedMessage) => Promise\n signMessage: (hex: string) => Promise\n}\n\nexport type ScryptParams = {\n salt: string\n N: number\n r: number\n p: number\n dkLen: number\n}\n\nexport type AESEncrypted = {\n cipherType: string\n ciphertext: string\n iv: string\n mac: string\n}\n\nexport type MainKeyEncryptedWithSecret = {\n id: string\n scryptParams: ScryptParams\n aesEncrypted: AESEncrypted\n}\n\nexport type MainKey = {\n key: Uint8Array\n iv: Uint8Array\n}\n\nexport type Key = (InternalKey | ExternalKey) & { isExternallyStored: boolean }\n\nexport const standardSigningOnlyPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000001'\nexport const dedicatedToOneSAPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000002'\n\nexport type InternalKey = {\n addr: Account['addr']\n type: 'internal'\n label: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number | null\n }\n}\n\nexport type ExternalKey = {\n addr: Account['addr']\n type: 'trezor' | 'ledger' | 'lattice' | string\n label: string\n dedicatedToOneSA: boolean\n meta: {\n deviceId: string\n deviceModel: string\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n index: number\n createdAt: number | null\n }\n}\n\nexport type StoredKey = (InternalKey & { privKey: string }) | (ExternalKey & { privKey: null })\n\nexport type KeystoreSeed = { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }\n\nexport type KeystoreSignerType = {\n new (key: Key, privateKey?: string): KeystoreSigner\n}\n\n/**\n * The keys that are ready to be added to the user's keystore (by the Main Controller).\n * They are needed as an intermediate step during the accounts import flow\n * (for the accounts that were just imported by the AccountAdder Controller).\n */\nexport type ReadyToAddKeys = {\n internal: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n }[]\n external: {\n addr: Key['addr']\n label: string\n type: Key['type']\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: ExternalKey['meta']\n }[]\n}\n\nexport type KeyPreferences = {\n label: string\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/messenger.d.ts b/dist/src/interfaces/messenger.d.ts new file mode 100644 index 000000000..9e168f62b --- /dev/null +++ b/dist/src/interfaces/messenger.d.ts @@ -0,0 +1,45 @@ +/// +export type CallbackOptions = { + /** The sender of the message. */ + sender: chrome.runtime.MessageSender; + /** The topic provided. */ + topic: string; + /** An optional scoped identifier. */ + id?: number | string; +}; +export type CallbackFunction = (payload: TPayload, callbackOptions: CallbackOptions) => Promise; +export type Source = 'background' | 'content' | 'inpage'; +export type SendMessage = { + topic: string; + payload: TPayload; + id?: number | string; +}; +export type ReplyMessage = { + topic: string; + id: number | string; + payload: { + response: TResponse; + error: Error; + }; +}; +export interface Messenger { + /** Whether or not the messenger is available in the context. */ + available: boolean; + /** Name of the messenger */ + name: string; + /** Sends a message to the `reply` handler. */ + send: ( + /** A scoped topic that the `reply` will listen for. */ + topic: string, + /** The payload to send to the `reply` handler. */ + payload: TPayload, options?: { + /** Identify & scope the request via an ID. */ + id?: string | number; + [key: string]: any; + }) => Promise; + /** Replies to `send`. */ + reply: ( + /** A scoped topic that was sent from `send`. */ + topic: string, callback: CallbackFunction) => () => void; +} +//# sourceMappingURL=messenger.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/messenger.d.ts.map b/dist/src/interfaces/messenger.d.ts.map new file mode 100644 index 000000000..b836fbe18 --- /dev/null +++ b/dist/src/interfaces/messenger.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/interfaces/messenger.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAA;IACpC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,QAAQ,EAAE,SAAS,IAAI,CAClD,OAAO,EAAE,QAAQ,EACjB,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAA;AAEvB,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAA;AAExD,MAAM,MAAM,WAAW,CAAC,QAAQ,IAAI;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,QAAQ,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,SAAS,IAAI;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,OAAO,EAAE;QAAE,QAAQ,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAA;CAC/C,CAAA;AAED,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAA;IAClB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS;IACxB,uDAAuD;IACvD,KAAK,EAAE,MAAM;IACb,kDAAkD;IAClD,OAAO,EAAE,QAAQ,EACjB,OAAO,CAAC,EAAE;QACR,8CAA8C;QAC9C,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,KACE,OAAO,CAAC,SAAS,CAAC,CAAA;IACvB,yBAAyB;IACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS;IACzB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,KAC5C,MAAM,IAAI,CAAA;CAChB"} \ No newline at end of file diff --git a/dist/src/interfaces/messenger.js b/dist/src/interfaces/messenger.js new file mode 100644 index 000000000..169ce6382 --- /dev/null +++ b/dist/src/interfaces/messenger.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=messenger.js.map \ No newline at end of file diff --git a/dist/src/interfaces/messenger.js.map b/dist/src/interfaces/messenger.js.map new file mode 100644 index 000000000..7ce3e1dad --- /dev/null +++ b/dist/src/interfaces/messenger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../../../src/interfaces/messenger.ts"],"names":[],"mappings":"","sourcesContent":["export type CallbackOptions = {\n /** The sender of the message. */\n sender: chrome.runtime.MessageSender\n /** The topic provided. */\n topic: string\n /** An optional scoped identifier. */\n id?: number | string\n}\n\nexport type CallbackFunction = (\n payload: TPayload,\n callbackOptions: CallbackOptions\n) => Promise\n\nexport type Source = 'background' | 'content' | 'inpage'\n\nexport type SendMessage = {\n topic: string\n payload: TPayload\n id?: number | string\n}\n\nexport type ReplyMessage = {\n topic: string\n id: number | string\n payload: { response: TResponse; error: Error }\n}\n\nexport interface Messenger {\n /** Whether or not the messenger is available in the context. */\n available: boolean\n /** Name of the messenger */\n name: string\n /** Sends a message to the `reply` handler. */\n send: (\n /** A scoped topic that the `reply` will listen for. */\n topic: string,\n /** The payload to send to the `reply` handler. */\n payload: TPayload,\n options?: {\n /** Identify & scope the request via an ID. */\n id?: string | number\n [key: string]: any\n }\n ) => Promise\n /** Replies to `send`. */\n reply: (\n /** A scoped topic that was sent from `send`. */\n topic: string,\n callback: CallbackFunction\n ) => () => void\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/network.d.ts b/dist/src/interfaces/network.d.ts new file mode 100644 index 000000000..925c22d39 --- /dev/null +++ b/dist/src/interfaces/network.d.ts @@ -0,0 +1,112 @@ +import { BUNDLER } from '../consts/bundlers'; +export type NetworkId = string; +export interface Erc4337settings { + enabled: boolean; + hasPaymaster: boolean; + hasBundlerSupport?: boolean; + bundlers?: BUNDLER[]; + defaultBundler?: BUNDLER; +} +interface FeeOptions { + is1559: boolean; + minBaseFee?: bigint; + elasticityMultiplier?: bigint; + baseFeeMaxChangeDenominator?: bigint; + feeIncrease?: bigint; + minBaseFeeEqualToLastBlock?: boolean; +} +export interface NetworkInfo { + force4337?: boolean; + chainId: bigint; + isSAEnabled: boolean; + hasSingleton: boolean; + isOptimistic: boolean; + rpcNoStateOverride: boolean; + erc4337: Erc4337settings; + areContractsDeployed: boolean; + feeOptions: { + is1559: boolean; + }; + platformId: string; + nativeAssetId: string; + flagged: boolean; +} +export type NetworkInfoLoading = { + [K in keyof T]: T[K] | 'LOADING'; +}; +export interface NetworkFeature { + id: string; + title: string; + msg?: string; + level: 'success' | 'danger' | 'warning' | 'loading' | 'initial'; +} +export interface Network { + id: NetworkId; + name: string; + nativeAssetSymbol: string; + chainId: bigint; + rpcUrls: string[]; + explorerUrl: string; + selectedRpcUrl: string; + erc4337: Erc4337settings; + rpcNoStateOverride: boolean; + feeOptions: FeeOptions; + isSAEnabled: boolean; + areContractsDeployed: boolean; + features: NetworkFeature[]; + hasRelayer: boolean; + hasSingleton: boolean; + platformId: string; + nativeAssetId: string; + iconUrls?: string[]; + reestimateOn?: number; + isOptimistic?: boolean; + flagged?: boolean; + predefined: boolean; + wrappedAddr?: string; + blockGasLimit?: bigint; + oldNativeAssetSymbols?: string[]; + disableEstimateGas?: boolean; + force4337?: boolean; + allowForce4337?: boolean; +} +export interface AddNetworkRequestParams { + name: Network['name']; + rpcUrls: Network['rpcUrls']; + selectedRpcUrl: Network['selectedRpcUrl']; + chainId: Network['chainId']; + nativeAssetSymbol: Network['nativeAssetSymbol']; + explorerUrl: Network['explorerUrl']; + iconUrls: Network['iconUrls']; +} +export interface ChainlistNetwork { + name: string; + chain: string; + icon: string; + rpc: string[]; + features: { + name: string; + }[]; + faucets: string[]; + nativeCurrency: { + name: string; + symbol: string; + decimals: number; + }; + infoURL: string; + shortName: string; + chainId: number; + networkId: number; + slip44: number; + ens: { + registry: string; + }; + explorers: { + name: string; + url: string; + standard: string; + icon?: string; + }[]; +} +export {}; +//# sourceMappingURL=network.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/network.d.ts.map b/dist/src/interfaces/network.d.ts.map new file mode 100644 index 000000000..a2966bd6e --- /dev/null +++ b/dist/src/interfaces/network.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/interfaces/network.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/network.js b/dist/src/interfaces/network.js new file mode 100644 index 000000000..731a3482a --- /dev/null +++ b/dist/src/interfaces/network.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=network.js.map \ No newline at end of file diff --git a/dist/src/interfaces/network.js.map b/dist/src/interfaces/network.js.map new file mode 100644 index 000000000..25f33365a --- /dev/null +++ b/dist/src/interfaces/network.js.map @@ -0,0 +1 @@ +{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/interfaces/network.ts"],"names":[],"mappings":"","sourcesContent":["import { BUNDLER } from '../consts/bundlers'\n\nexport type NetworkId = string\n\nexport interface Erc4337settings {\n enabled: boolean\n hasPaymaster: boolean\n hasBundlerSupport?: boolean\n bundlers?: BUNDLER[]\n defaultBundler?: BUNDLER\n}\n\ninterface FeeOptions {\n is1559: boolean\n minBaseFee?: bigint\n elasticityMultiplier?: bigint\n baseFeeMaxChangeDenominator?: bigint\n feeIncrease?: bigint // should we increase the relayer fee in %\n // transactions on Base get stuck on slow as we lower the baseFee a lot\n // so we make the minBaseFee the same as the last block one\n minBaseFeeEqualToLastBlock?: boolean\n}\n\nexport interface NetworkInfo {\n force4337?: boolean\n chainId: bigint\n isSAEnabled: boolean\n hasSingleton: boolean\n isOptimistic: boolean\n rpcNoStateOverride: boolean\n erc4337: Erc4337settings\n areContractsDeployed: boolean\n feeOptions: { is1559: boolean }\n platformId: string\n nativeAssetId: string\n flagged: boolean\n}\n\nexport type NetworkInfoLoading = {\n [K in keyof T]: T[K] | 'LOADING'\n}\n\nexport interface NetworkFeature {\n id: string\n title: string\n msg?: string\n level: 'success' | 'danger' | 'warning' | 'loading' | 'initial'\n}\n\n// NetworkId is a string: this is our internal identifier for the network\n// chainId is a number and is the chainID used for replay protection (EIP-155)\n// we need this distinction because:\n// 1) it's easier to work with the string identifier, for example if we have an object segmented by networks it's easier to debug with string IDs\n// 2) multiple distinct networks may (rarely) run the same chainId\nexport interface Network {\n id: NetworkId\n name: string\n nativeAssetSymbol: string\n chainId: bigint\n rpcUrls: string[]\n explorerUrl: string\n selectedRpcUrl: string\n erc4337: Erc4337settings\n rpcNoStateOverride: boolean\n feeOptions: FeeOptions\n isSAEnabled: boolean\n areContractsDeployed: boolean\n features: NetworkFeature[]\n hasRelayer: boolean\n hasSingleton: boolean\n platformId: string\n nativeAssetId: string\n iconUrls?: string[]\n reestimateOn?: number\n isOptimistic?: boolean\n flagged?: boolean\n predefined: boolean\n wrappedAddr?: string\n blockGasLimit?: bigint\n oldNativeAssetSymbols?: string[]\n disableEstimateGas?: boolean\n force4337?: boolean\n allowForce4337?: boolean\n}\n\nexport interface AddNetworkRequestParams {\n name: Network['name']\n rpcUrls: Network['rpcUrls']\n selectedRpcUrl: Network['selectedRpcUrl']\n chainId: Network['chainId']\n nativeAssetSymbol: Network['nativeAssetSymbol']\n explorerUrl: Network['explorerUrl']\n iconUrls: Network['iconUrls']\n}\n\nexport interface ChainlistNetwork {\n name: string\n chain: string\n icon: string\n rpc: string[]\n features: {\n name: string\n }[]\n faucets: string[]\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n infoURL: string\n shortName: string\n chainId: number\n networkId: number\n slip44: number\n ens: {\n registry: string\n }\n explorers: {\n name: string\n url: string\n standard: string\n icon?: string\n }[]\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/notification.d.ts b/dist/src/interfaces/notification.d.ts new file mode 100644 index 000000000..b19cb390a --- /dev/null +++ b/dist/src/interfaces/notification.d.ts @@ -0,0 +1,8 @@ +export interface NotificationManager { + create: ({ title, message, icon }: { + title: string; + message: string; + icon?: string; + }) => Promise; +} +//# sourceMappingURL=notification.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/notification.d.ts.map b/dist/src/interfaces/notification.d.ts.map new file mode 100644 index 000000000..0613ae701 --- /dev/null +++ b/dist/src/interfaces/notification.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/interfaces/notification.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,CAAC,EACP,KAAK,EACL,OAAO,EACP,IAAI,EACL,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpB"} \ No newline at end of file diff --git a/dist/src/interfaces/notification.js b/dist/src/interfaces/notification.js new file mode 100644 index 000000000..3db328a47 --- /dev/null +++ b/dist/src/interfaces/notification.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=notification.js.map \ No newline at end of file diff --git a/dist/src/interfaces/notification.js.map b/dist/src/interfaces/notification.js.map new file mode 100644 index 000000000..8f8c498f1 --- /dev/null +++ b/dist/src/interfaces/notification.js.map @@ -0,0 +1 @@ +{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../src/interfaces/notification.ts"],"names":[],"mappings":"","sourcesContent":["export interface NotificationManager {\n create: ({\n title,\n message,\n icon\n }: {\n title: string\n message: string\n icon?: string\n }) => Promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/provider.d.ts b/dist/src/interfaces/provider.d.ts new file mode 100644 index 000000000..9084a2e39 --- /dev/null +++ b/dist/src/interfaces/provider.d.ts @@ -0,0 +1,9 @@ +import { JsonRpcProvider } from 'ethers'; +import { NetworkId } from './network'; +export type RPCProvider = JsonRpcProvider & { + isWorking?: boolean; +}; +export type RPCProviders = { + [networkId: NetworkId]: RPCProvider; +}; +//# sourceMappingURL=provider.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/provider.d.ts.map b/dist/src/interfaces/provider.d.ts.map new file mode 100644 index 000000000..64180380f --- /dev/null +++ b/dist/src/interfaces/provider.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/interfaces/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEnE,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/provider.js b/dist/src/interfaces/provider.js new file mode 100644 index 000000000..be31058cd --- /dev/null +++ b/dist/src/interfaces/provider.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=provider.js.map \ No newline at end of file diff --git a/dist/src/interfaces/provider.js.map b/dist/src/interfaces/provider.js.map new file mode 100644 index 000000000..63205d9bd --- /dev/null +++ b/dist/src/interfaces/provider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/interfaces/provider.ts"],"names":[],"mappings":"","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { NetworkId } from './network'\n\nexport type RPCProvider = JsonRpcProvider & { isWorking?: boolean }\n\nexport type RPCProviders = { [networkId: NetworkId]: RPCProvider }\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.d.ts b/dist/src/interfaces/selectedAccount.d.ts new file mode 100644 index 000000000..4e82c45eb --- /dev/null +++ b/dist/src/interfaces/selectedAccount.d.ts @@ -0,0 +1,21 @@ +import { CollectionResult as CollectionResultInterface, NetworkSimulatedAccountOp, NetworkState, TokenResult as TokenResultInterface } from '../libs/portfolio/interfaces'; +/** A stripped version of the portfolio state that will be used in the UI */ +export type SelectedAccountPortfolioState = { + [networkId: string]: (Omit & { + result?: Omit, 'tokens' | 'collections' | 'tokenErrors' | 'hintsFromExternalAPI' | 'priceCache'>; + }) | undefined; +}; +export type SelectedAccountPortfolioTokenResult = TokenResultInterface & { + latestAmount?: bigint; + pendingAmount?: bigint; +}; +export interface SelectedAccountPortfolio { + tokens: SelectedAccountPortfolioTokenResult[]; + collections: CollectionResultInterface[]; + totalBalance: number; + isAllReady: boolean; + networkSimulatedAccountOp: NetworkSimulatedAccountOp; + latest: SelectedAccountPortfolioState; + pending: SelectedAccountPortfolioState; +} +//# sourceMappingURL=selectedAccount.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.d.ts.map b/dist/src/interfaces/selectedAccount.d.ts.map new file mode 100644 index 000000000..d808d0e51 --- /dev/null +++ b/dist/src/interfaces/selectedAccount.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,IAAI,yBAAyB,EAC7C,yBAAyB,EACzB,YAAY,EACZ,WAAW,IAAI,oBAAoB,EACpC,MAAM,8BAA8B,CAAA;AAErC,4EAA4E;AAC5E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,SAAS,EAAE,MAAM,GACd,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;QAC9B,MAAM,CAAC,EAAE,IAAI,CACX,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EACnC,QAAQ,GAAG,aAAa,GAAG,aAAa,GAAG,sBAAsB,GAAG,YAAY,CACjF,CAAA;KACF,CAAC,GACF,SAAS,CAAA;CACd,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG,oBAAoB,GAAG;IACvE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,mCAAmC,EAAE,CAAA;IAC7C,WAAW,EAAE,yBAAyB,EAAE,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,MAAM,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,6BAA6B,CAAA;CACvC"} \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.js b/dist/src/interfaces/selectedAccount.js new file mode 100644 index 000000000..f8d2e5a21 --- /dev/null +++ b/dist/src/interfaces/selectedAccount.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.js.map b/dist/src/interfaces/selectedAccount.js.map new file mode 100644 index 000000000..ad248e66a --- /dev/null +++ b/dist/src/interfaces/selectedAccount.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"","sourcesContent":["import {\n CollectionResult as CollectionResultInterface,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult as TokenResultInterface\n} from '../libs/portfolio/interfaces'\n\n/** A stripped version of the portfolio state that will be used in the UI */\nexport type SelectedAccountPortfolioState = {\n [networkId: string]:\n | (Omit & {\n result?: Omit<\n NonNullable,\n 'tokens' | 'collections' | 'tokenErrors' | 'hintsFromExternalAPI' | 'priceCache'\n >\n })\n | undefined\n}\n\nexport type SelectedAccountPortfolioTokenResult = TokenResultInterface & {\n latestAmount?: bigint\n pendingAmount?: bigint\n}\n\nexport interface SelectedAccountPortfolio {\n tokens: SelectedAccountPortfolioTokenResult[]\n collections: CollectionResultInterface[]\n totalBalance: number\n isAllReady: boolean\n networkSimulatedAccountOp: NetworkSimulatedAccountOp\n latest: SelectedAccountPortfolioState\n pending: SelectedAccountPortfolioState\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/signAccountOp.d.ts b/dist/src/interfaces/signAccountOp.d.ts new file mode 100644 index 000000000..b34bcb4da --- /dev/null +++ b/dist/src/interfaces/signAccountOp.d.ts @@ -0,0 +1,9 @@ +type Warning = { + id: string; + title: string; + text?: string; + promptBeforeSign: boolean; + displayBeforeSign: boolean; +}; +export type { Warning }; +//# sourceMappingURL=signAccountOp.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/signAccountOp.d.ts.map b/dist/src/interfaces/signAccountOp.d.ts.map new file mode 100644 index 000000000..281fa297d --- /dev/null +++ b/dist/src/interfaces/signAccountOp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"signAccountOp.d.ts","sourceRoot":"","sources":["../../../src/interfaces/signAccountOp.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,OAAO,CAAA;IACzB,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,YAAY,EAAE,OAAO,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/signAccountOp.js b/dist/src/interfaces/signAccountOp.js new file mode 100644 index 000000000..b16ebeeb5 --- /dev/null +++ b/dist/src/interfaces/signAccountOp.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=signAccountOp.js.map \ No newline at end of file diff --git a/dist/src/interfaces/signAccountOp.js.map b/dist/src/interfaces/signAccountOp.js.map new file mode 100644 index 000000000..e4c1026c9 --- /dev/null +++ b/dist/src/interfaces/signAccountOp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../src/interfaces/signAccountOp.ts"],"names":[],"mappings":"","sourcesContent":["type Warning = {\n id: string\n title: string\n text?: string\n promptBeforeSign: boolean\n displayBeforeSign: boolean\n}\n\nexport type { Warning }\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/storage.d.ts b/dist/src/interfaces/storage.d.ts new file mode 100644 index 000000000..07269bf76 --- /dev/null +++ b/dist/src/interfaces/storage.d.ts @@ -0,0 +1,6 @@ +export interface Storage { + get(key: string, defaultValue: any): Promise; + set(key: string, value: any): Promise; + remove(key: string): Promise; +} +//# sourceMappingURL=storage.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/storage.d.ts.map b/dist/src/interfaces/storage.d.ts.map new file mode 100644 index 000000000..46dadb84e --- /dev/null +++ b/dist/src/interfaces/storage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/interfaces/storage.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnC"} \ No newline at end of file diff --git a/dist/src/interfaces/storage.js b/dist/src/interfaces/storage.js new file mode 100644 index 000000000..530407742 --- /dev/null +++ b/dist/src/interfaces/storage.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=storage.js.map \ No newline at end of file diff --git a/dist/src/interfaces/storage.js.map b/dist/src/interfaces/storage.js.map new file mode 100644 index 000000000..317a9494a --- /dev/null +++ b/dist/src/interfaces/storage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/interfaces/storage.ts"],"names":[],"mappings":"","sourcesContent":["export interface Storage {\n get(key: string, defaultValue: any): Promise\n set(key: string, value: any): Promise\n remove(key: string): Promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/swapAndBridge.d.ts b/dist/src/interfaces/swapAndBridge.d.ts new file mode 100644 index 000000000..59afcdc5f --- /dev/null +++ b/dist/src/interfaces/swapAndBridge.d.ts @@ -0,0 +1,244 @@ +export interface SocketAPIResponse { + result: T; + success?: boolean; + message?: { + error?: string; + details?: any; + }; +} +export interface SocketAPIToken { + address: string; + chainId: number; + decimals: number; + icon: string; + logoURI: string; + name: string; + symbol: string; +} +export interface SwapAndBridgeToToken extends SocketAPIToken { +} +export interface SocketAPIQuote { + fromAsset: SocketAPIToken; + fromChainId: number; + toAsset: SocketAPIToken; + toChainId: number; + selectedRoute: SocketAPIRoute; + selectedRouteSteps: SocketAPIStep[]; + routes: SocketAPIRoute[]; +} +export interface SocketAPIRoute { + routeId: string; + isOnlySwapRoute: boolean; + fromAmount: string; + toAmount: string; + usedBridgeNames?: string[]; + usedDexName?: string; + totalUserTx: number; + totalGasFeesInUsd: number; + recipient: string; + sender: string; + userTxs: SocketAPIUserTx[]; + receivedValueInUsd: number; + inputValueInUsd: number; + outputValueInUsd: number; + serviceTime: number; + maxServiceTime: number; + integratorFee: { + feeTakerAddress: string; + amount: string; + asset: SocketAPIToken; + }; + chainGasBalances: object; + minimumGasBalances: object; + extraData: object; + errorMessage?: string; +} +export interface SocketAPISwapUserTx { + userTxType: 'dex-swap'; + userTxIndex: number; + txType: string; + fromAsset: SocketAPIToken; + toAsset: SocketAPIToken; + chainId: number; + fromAmount: string; + toAmount: string; + swapSlippage: number; + sender: string; + recipient: string; + protocol: { + displayName: string; + icon: string; + name: string; + }; + minAmountOut: string; + gasFees: { + gasAmount: string; + gasLimit: number; + feesInUsd: number; + asset: SocketAPIToken; + }; + approvalData: SocketAPIUserTxApprovalData | null; +} +export interface SocketAPIBridgeUserTx { + userTxType: 'fund-movr'; + userTxIndex: number; + txType: string; + toAsset: SocketAPIToken; + toAmount: string; + steps: SocketAPIStep[]; + stepCount: number; + serviceTime: number; + sender: string; + routePath: string; + recipient: string; + maxServiceTime: number; + gasFees: { + gasAmount: string; + gasLimit: number; + feesInUsd: number; + asset: SocketAPIToken; + }; + chainId: number; + bridgeSlippage: number; + approvalData: SocketAPIUserTxApprovalData | null; +} +export interface SocketApiSwapStep { + chainId: number; + fromAmount: string; + fromAsset: SocketAPIToken; + gasFees: { + gasAmount: string; + gasLimit: number; + feesInUsd: number; + asset: SocketAPIToken; + }; + minAmountOut: string; + protocol: { + name: string; + displayName: string; + icon: string; + }; + swapSlippage: number; + toAmount: string; + toAsset: SocketAPIToken; + type: 'middleware' | 'swap'; + userTxIndex?: number; +} +export interface SocketApiBridgeStep { + fromChainId: number; + toChainId: number; + fromAmount: string; + fromAsset: SocketAPIToken; + gasFees: { + gasAmount: string; + gasLimit: number; + feesInUsd: number; + asset: SocketAPIToken; + }; + minAmountOut: string; + protocol: { + name: string; + displayName: string; + icon: string; + }; + protocolFees: { + amount: string; + asset: SocketAPIToken; + feesInUsd: number; + }; + bridgeSlippage: number; + toAmount: string; + toAsset: SocketAPIToken; + serviceTime: number; + maxServiceTime: number; + type: 'bridge'; + userTxIndex?: number; +} +export type SocketAPIStep = SocketApiSwapStep | SocketApiBridgeStep; +export type SocketAPIUserTx = SocketAPISwapUserTx | SocketAPIBridgeUserTx; +export type SocketAPIUserTxApprovalData = { + allowanceTarget: string; + approvalTokenAddress: string; + minimumApprovalAmount: string; + owner: string; +}; +export type SocketAPISendTransactionRequest = { + activeRouteId: number; + approvalData: SocketAPIUserTxApprovalData | null; + chainId: number; + totalUserTx: number; + txData: string; + txTarget: string; + txType: 'eth_sendTransaction'; + userTxIndex: number; + userTxType: 'fund-movr' | 'dex-swap'; + value: string; +}; +export type ActiveRoute = { + activeRouteId: SocketAPISendTransactionRequest['activeRouteId']; + userTxIndex: SocketAPISendTransactionRequest['userTxIndex']; + userTxHash: string | null; + route: Omit & { + createdAt: string; + updatedAt: string; + routeStatus: string; + fromChainId: number; + toChainId: number; + currentUserTxIndex: number; + transactionData: { + txHash: string; + }[] | null; + userAddress: string; + }; + routeStatus: 'waiting-approval-to-resolve' | 'in-progress' | 'ready' | 'completed' | 'failed'; + error?: string; +}; +export type SocketAPIActiveRoutes = ActiveRoute['route'] & { + activeRouteId: SocketAPISendTransactionRequest['activeRouteId']; + userAddress: string; + totalUserTx: number; + userTxs: SocketAPIUserTx[]; + fromAssetAddress: string; + toAssetAddress: string; + fromAmount: string; + toAmount: string; + fromAsset: SocketAPIToken; + toAsset: SocketAPIToken; +}; +export type SocketRouteStatus = 'ready' | 'completed' | null; +export type SocketAPISupportedChain = { + chainId: number; + name: string; + isL1: boolean; + sendingEnabled: boolean; + icon: string; + receivingEnabled: boolean; + refuel: { + sendingEnabled: boolean; + receivingEnabled: boolean; + }; + currency: { + address: SocketAPIToken['address']; + icon: SocketAPIToken['icon']; + name: SocketAPIToken['name']; + symbol: SocketAPIToken['symbol']; + decimals: SocketAPIToken['decimals']; + minNativeCurrencyForGas: string; + }; + rpcs: string[]; + explorers: string[]; +}; +export type CachedSupportedChains = { + lastFetched: number; + data: SocketAPISupportedChain[]; +}; +type StringifiedChainId = string; +export type CachedTokenListKey = `from-${StringifiedChainId}-to-${StringifiedChainId}`; +export type CachedToTokenLists = { + [key: CachedTokenListKey]: { + lastFetched: number; + data: SocketAPIToken[]; + }; +}; +export {}; +//# sourceMappingURL=swapAndBridge.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/swapAndBridge.d.ts.map b/dist/src/interfaces/swapAndBridge.d.ts.map new file mode 100644 index 000000000..cb84d0900 --- /dev/null +++ b/dist/src/interfaces/swapAndBridge.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.d.ts","sourceRoot":"","sources":["../../../src/interfaces/swapAndBridge.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/swapAndBridge.js b/dist/src/interfaces/swapAndBridge.js new file mode 100644 index 000000000..a171925eb --- /dev/null +++ b/dist/src/interfaces/swapAndBridge.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/interfaces/swapAndBridge.js.map b/dist/src/interfaces/swapAndBridge.js.map new file mode 100644 index 000000000..feff12aeb --- /dev/null +++ b/dist/src/interfaces/swapAndBridge.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../src/interfaces/swapAndBridge.ts"],"names":[],"mappings":"","sourcesContent":["export interface SocketAPIResponse {\n result: T\n success?: boolean\n message?: { error?: string; details?: any }\n}\n\nexport interface SocketAPIToken {\n address: string\n chainId: number\n decimals: number\n icon: string\n logoURI: string\n name: string\n symbol: string\n}\n\nexport interface SwapAndBridgeToToken extends SocketAPIToken {\n // TODO: Strip out the properties that are not needed.\n}\n\nexport interface SocketAPIQuote {\n fromAsset: SocketAPIToken\n fromChainId: number\n toAsset: SocketAPIToken\n toChainId: number\n selectedRoute: SocketAPIRoute\n selectedRouteSteps: SocketAPIStep[]\n routes: SocketAPIRoute[]\n}\n\nexport interface SocketAPIRoute {\n routeId: string\n isOnlySwapRoute: boolean\n fromAmount: string\n toAmount: string\n usedBridgeNames?: string[]\n usedDexName?: string\n totalUserTx: number\n totalGasFeesInUsd: number\n recipient: string\n sender: string\n userTxs: SocketAPIUserTx[]\n receivedValueInUsd: number\n inputValueInUsd: number\n outputValueInUsd: number\n serviceTime: number\n maxServiceTime: number\n integratorFee: {\n feeTakerAddress: string\n amount: string\n asset: SocketAPIToken\n }\n chainGasBalances: object\n minimumGasBalances: object\n extraData: object\n errorMessage?: string\n}\n\nexport interface SocketAPISwapUserTx {\n userTxType: 'dex-swap'\n userTxIndex: number\n txType: string\n fromAsset: SocketAPIToken\n toAsset: SocketAPIToken\n chainId: number\n fromAmount: string\n toAmount: string\n swapSlippage: number\n sender: string\n recipient: string\n protocol: {\n displayName: string\n icon: string\n name: string\n }\n minAmountOut: string\n gasFees: {\n gasAmount: string\n gasLimit: number\n feesInUsd: number\n asset: SocketAPIToken\n }\n approvalData: SocketAPIUserTxApprovalData | null\n}\n\nexport interface SocketAPIBridgeUserTx {\n userTxType: 'fund-movr'\n userTxIndex: number\n txType: string\n toAsset: SocketAPIToken\n toAmount: string\n steps: SocketAPIStep[]\n stepCount: number\n serviceTime: number\n sender: string\n routePath: string\n recipient: string\n maxServiceTime: number\n gasFees: {\n gasAmount: string\n gasLimit: number\n feesInUsd: number\n asset: SocketAPIToken\n }\n chainId: number\n bridgeSlippage: number\n approvalData: SocketAPIUserTxApprovalData | null\n}\n\nexport interface SocketApiSwapStep {\n chainId: number\n fromAmount: string\n fromAsset: SocketAPIToken\n gasFees: {\n gasAmount: string\n gasLimit: number\n feesInUsd: number\n asset: SocketAPIToken\n }\n minAmountOut: string\n protocol: {\n name: string\n displayName: string\n icon: string\n }\n swapSlippage: number\n toAmount: string\n toAsset: SocketAPIToken\n type: 'middleware' | 'swap'\n userTxIndex?: number\n}\n\nexport interface SocketApiBridgeStep {\n fromChainId: number\n toChainId: number\n fromAmount: string\n fromAsset: SocketAPIToken\n gasFees: {\n gasAmount: string\n gasLimit: number\n feesInUsd: number\n asset: SocketAPIToken\n }\n minAmountOut: string\n protocol: {\n name: string\n displayName: string\n icon: string\n }\n protocolFees: {\n amount: string\n asset: SocketAPIToken\n feesInUsd: number\n }\n bridgeSlippage: number\n toAmount: string\n toAsset: SocketAPIToken\n serviceTime: number\n maxServiceTime: number\n type: 'bridge'\n userTxIndex?: number\n}\n\nexport type SocketAPIStep = SocketApiSwapStep | SocketApiBridgeStep\n\nexport type SocketAPIUserTx = SocketAPISwapUserTx | SocketAPIBridgeUserTx\n\nexport type SocketAPIUserTxApprovalData = {\n allowanceTarget: string\n approvalTokenAddress: string\n minimumApprovalAmount: string\n owner: string\n}\n\nexport type SocketAPISendTransactionRequest = {\n activeRouteId: number\n approvalData: SocketAPIUserTxApprovalData | null\n chainId: number\n totalUserTx: number\n txData: string\n txTarget: string\n txType: 'eth_sendTransaction'\n userTxIndex: number\n userTxType: 'fund-movr' | 'dex-swap'\n value: string\n}\n\nexport type ActiveRoute = {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n userTxHash: string | null\n route: Omit & {\n createdAt: string\n updatedAt: string\n routeStatus: string\n fromChainId: number\n toChainId: number\n currentUserTxIndex: number\n transactionData: { txHash: string }[] | null\n userAddress: string\n }\n routeStatus: 'waiting-approval-to-resolve' | 'in-progress' | 'ready' | 'completed' | 'failed'\n error?: string\n}\n\nexport type SocketAPIActiveRoutes = ActiveRoute['route'] & {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userAddress: string\n totalUserTx: number\n userTxs: SocketAPIUserTx[]\n fromAssetAddress: string\n toAssetAddress: string\n fromAmount: string\n toAmount: string\n fromAsset: SocketAPIToken\n toAsset: SocketAPIToken\n}\n\nexport type SocketRouteStatus = 'ready' | 'completed' | null\n\nexport type SocketAPISupportedChain = {\n chainId: number\n name: string\n isL1: boolean\n sendingEnabled: boolean\n icon: string\n receivingEnabled: boolean\n refuel: {\n sendingEnabled: boolean\n receivingEnabled: boolean\n }\n currency: {\n address: SocketAPIToken['address']\n icon: SocketAPIToken['icon']\n name: SocketAPIToken['name']\n symbol: SocketAPIToken['symbol']\n decimals: SocketAPIToken['decimals']\n minNativeCurrencyForGas: string\n }\n rpcs: string[]\n explorers: string[]\n}\n\nexport type CachedSupportedChains = { lastFetched: number; data: SocketAPISupportedChain[] }\n\ntype StringifiedChainId = string\nexport type CachedTokenListKey = `from-${StringifiedChainId}-to-${StringifiedChainId}`\nexport type CachedToTokenLists = {\n [key: CachedTokenListKey]: { lastFetched: number; data: SocketAPIToken[] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/transfer.d.ts b/dist/src/interfaces/transfer.d.ts new file mode 100644 index 000000000..dbfb1196b --- /dev/null +++ b/dist/src/interfaces/transfer.d.ts @@ -0,0 +1,20 @@ +import { Contacts } from '../controllers/addressBook/addressBook'; +import { HumanizerMeta } from '../libs/humanizer/interfaces'; +import { TokenResult } from '../libs/portfolio'; +import { Account } from './account'; +import { AddressStateOptional } from './domains'; +import { Network } from './network'; +export interface TransferUpdate { + selectedAccountData?: Account; + humanizerInfo?: HumanizerMeta; + networks?: Network[]; + contacts?: Contacts; + selectedToken?: TokenResult; + amount?: string; + addressState?: AddressStateOptional; + isSWWarningAgreed?: boolean; + isRecipientAddressUnknownAgreed?: boolean; + isTopUp?: boolean; + amountFieldMode?: 'token' | 'fiat'; +} +//# sourceMappingURL=transfer.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/transfer.d.ts.map b/dist/src/interfaces/transfer.d.ts.map new file mode 100644 index 000000000..6dc589616 --- /dev/null +++ b/dist/src/interfaces/transfer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../src/interfaces/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,WAAW,cAAc;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,WAAW,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,oBAAoB,CAAA;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CACnC"} \ No newline at end of file diff --git a/dist/src/interfaces/transfer.js b/dist/src/interfaces/transfer.js new file mode 100644 index 000000000..d1462cfc6 --- /dev/null +++ b/dist/src/interfaces/transfer.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=transfer.js.map \ No newline at end of file diff --git a/dist/src/interfaces/transfer.js.map b/dist/src/interfaces/transfer.js.map new file mode 100644 index 000000000..8a4bd7de5 --- /dev/null +++ b/dist/src/interfaces/transfer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/interfaces/transfer.ts"],"names":[],"mappings":"","sourcesContent":["import { Contacts } from '../controllers/addressBook/addressBook'\nimport { HumanizerMeta } from '../libs/humanizer/interfaces'\nimport { TokenResult } from '../libs/portfolio'\nimport { Account } from './account'\nimport { AddressStateOptional } from './domains'\nimport { Network } from './network'\n\nexport interface TransferUpdate {\n selectedAccountData?: Account\n humanizerInfo?: HumanizerMeta\n networks?: Network[]\n contacts?: Contacts\n selectedToken?: TokenResult\n amount?: string\n addressState?: AddressStateOptional\n isSWWarningAgreed?: boolean\n isRecipientAddressUnknownAgreed?: boolean\n isTopUp?: boolean\n amountFieldMode?: 'token' | 'fiat'\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.d.ts b/dist/src/interfaces/userRequest.d.ts new file mode 100644 index 000000000..06b3d22e2 --- /dev/null +++ b/dist/src/interfaces/userRequest.d.ts @@ -0,0 +1,81 @@ +import { SignMessageAction } from 'controllers/actions/actions'; +import { TypedDataDomain, TypedDataField } from 'ethers'; +import { PaymasterService } from '../libs/erc7677/types'; +import { AccountId } from './account'; +import { DappProviderRequest } from './dapp'; +import { NetworkId } from './network'; +export interface Calls { + kind: 'calls'; + calls: { + to: string; + value: bigint; + data: string; + id?: string; + }[]; +} +export interface PlainTextMessage { + kind: 'message'; + message: string | Uint8Array; +} +export interface TypedMessage { + kind: 'typedMessage'; + domain: TypedDataDomain; + types: Record>; + message: Record; + primaryType: keyof TypedMessage['types']; +} +export interface Message { + fromActionId: SignMessageAction['id']; + accountAddr: AccountId; + networkId: NetworkId; + content: PlainTextMessage | TypedMessage; + signature: string | null; +} +export interface SignUserRequest { + id: string | number; + action: Calls | PlainTextMessage | TypedMessage | { + kind: 'benzin'; + }; + session?: DappProviderRequest['session']; + meta: { + isSignAction: true; + accountAddr: AccountId; + networkId: NetworkId; + paymasterService?: PaymasterService; + isWalletSendCalls?: boolean; + submittedAccountOp?: any; + [key: string]: any; + }; + dappPromise?: { + session: { + name: string; + origin: string; + icon: string; + }; + resolve: (data: any) => void; + reject: (data: any) => void; + }; +} +export interface DappUserRequest { + id: string | number; + action: { + kind: Exclude; + params: any; + }; + session: DappProviderRequest['session']; + meta: { + isSignAction: false; + [key: string]: any; + }; + dappPromise: { + session: { + name: string; + origin: string; + icon: string; + }; + resolve: (data: any) => void; + reject: (data: any) => void; + }; +} +export type UserRequest = DappUserRequest | SignUserRequest; +//# sourceMappingURL=userRequest.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.d.ts.map b/dist/src/interfaces/userRequest.d.ts.map new file mode 100644 index 000000000..cc35c5fa5 --- /dev/null +++ b/dist/src/interfaces/userRequest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"userRequest.d.ts","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,CAAC,EAAE,MAAM,CAAA;KACZ,EAAE,CAAA;CACJ;AACD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,GAAG,UAAU,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAA;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,WAAW,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;CACzC;AAGD,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACrC,WAAW,EAAE,SAAS,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAAA;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,KAAK,GAAG,gBAAgB,GAAG,YAAY,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAA;IACpE,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACxC,IAAI,EAAE;QACJ,YAAY,EAAE,IAAI,CAAA;QAClB,WAAW,EAAE,SAAS,CAAA;QACtB,SAAS,EAAE,SAAS,CAAA;QACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;QACnC,iBAAiB,CAAC,EAAE,OAAO,CAAA;QAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAA;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IAED,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;QACvD,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,GAAG,eAAe,CAAC,CAAA;QACxF,MAAM,EAAE,GAAG,CAAA;KACZ,CAAA;IACD,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACvC,IAAI,EAAE;QACJ,YAAY,EAAE,KAAK,CAAA;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,WAAW,EAAE;QACX,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;QACvD,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,eAAe,CAAA"} \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.js b/dist/src/interfaces/userRequest.js new file mode 100644 index 000000000..95e2f8f30 --- /dev/null +++ b/dist/src/interfaces/userRequest.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=userRequest.js.map \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.js.map b/dist/src/interfaces/userRequest.js.map new file mode 100644 index 000000000..4ca86dd7b --- /dev/null +++ b/dist/src/interfaces/userRequest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"","sourcesContent":["import { SignMessageAction } from 'controllers/actions/actions'\nimport { TypedDataDomain, TypedDataField } from 'ethers'\n\nimport { PaymasterService } from '../libs/erc7677/types'\nimport { AccountId } from './account'\nimport { DappProviderRequest } from './dapp'\nimport { NetworkId } from './network'\n\nexport interface Calls {\n kind: 'calls'\n calls: {\n to: string\n value: bigint\n data: string\n id?: string\n }[]\n}\nexport interface PlainTextMessage {\n kind: 'message'\n message: string | Uint8Array\n}\n\nexport interface TypedMessage {\n kind: 'typedMessage'\n domain: TypedDataDomain\n types: Record>\n message: Record\n primaryType: keyof TypedMessage['types']\n}\n// @TODO: move this type and it's deps (PlainTextMessage, TypedMessage) to another place,\n// probably interfaces\nexport interface Message {\n fromActionId: SignMessageAction['id']\n accountAddr: AccountId\n networkId: NetworkId\n content: PlainTextMessage | TypedMessage\n signature: string | null\n}\n\nexport interface SignUserRequest {\n id: string | number\n action: Calls | PlainTextMessage | TypedMessage | { kind: 'benzin' }\n session?: DappProviderRequest['session']\n meta: {\n isSignAction: true\n accountAddr: AccountId\n networkId: NetworkId\n paymasterService?: PaymasterService\n isWalletSendCalls?: boolean\n submittedAccountOp?: any\n [key: string]: any\n }\n // defined only when SignUserRequest is built from a DappRequest\n dappPromise?: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport interface DappUserRequest {\n id: string | number\n action: {\n kind: Exclude\n params: any\n }\n session: DappProviderRequest['session']\n meta: {\n isSignAction: false\n [key: string]: any\n }\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport type UserRequest = DappUserRequest | SignUserRequest\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/window.d.ts b/dist/src/interfaces/window.d.ts new file mode 100644 index 000000000..c1c7b557f --- /dev/null +++ b/dist/src/interfaces/window.d.ts @@ -0,0 +1,24 @@ +/// +import { EventEmitter } from 'events'; +export type WindowId = number; +export type WindowProps = { + id: WindowId; + top: number; + left: number; + width: number; + height: number; + focused: boolean; +} | null; +export interface WindowManager { + event: EventEmitter; + open: (route?: string) => Promise; + focus: (windowProps: WindowProps) => Promise; + remove: (winId: WindowId) => Promise; + sendWindowToastMessage: (message: string, options?: { + timeout?: number; + type?: 'error' | 'success' | 'info' | 'warning'; + sticky?: boolean; + }) => void; + sendWindowUiMessage: (params: {}) => void; +} +//# sourceMappingURL=window.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/window.d.ts.map b/dist/src/interfaces/window.d.ts.map new file mode 100644 index 000000000..223c8f02e --- /dev/null +++ b/dist/src/interfaces/window.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../src/interfaces/window.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,QAAQ,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,IAAI,CAAA;AAER,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;IAC9C,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,sBAAsB,EAAE,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,KACE,IAAI,CAAA;IACT,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI,CAAA;CAC1C"} \ No newline at end of file diff --git a/dist/src/interfaces/window.js b/dist/src/interfaces/window.js new file mode 100644 index 000000000..715c517e1 --- /dev/null +++ b/dist/src/interfaces/window.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=window.js.map \ No newline at end of file diff --git a/dist/src/interfaces/window.js.map b/dist/src/interfaces/window.js.map new file mode 100644 index 000000000..9120eaa1c --- /dev/null +++ b/dist/src/interfaces/window.js.map @@ -0,0 +1 @@ +{"version":3,"file":"window.js","sourceRoot":"","sources":["../../../src/interfaces/window.ts"],"names":[],"mappings":"","sourcesContent":["import { EventEmitter } from 'events'\n\nexport type WindowId = number\n\nexport type WindowProps = {\n id: WindowId\n top: number\n left: number\n width: number\n height: number\n focused: boolean\n} | null\n\nexport interface WindowManager {\n event: EventEmitter\n open: (route?: string) => Promise\n focus: (windowProps: WindowProps) => Promise\n remove: (winId: WindowId) => Promise\n sendWindowToastMessage: (\n message: string,\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n ) => void\n sendWindowUiMessage: (params: {}) => void\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/account/account.d.ts b/dist/src/libs/account/account.d.ts new file mode 100644 index 000000000..7c40ca637 --- /dev/null +++ b/dist/src/libs/account/account.d.ts @@ -0,0 +1,70 @@ +import { Account, AccountId, AccountOnPage, AccountPreferences, ImportStatus } from '../../interfaces/account'; +import { KeyIterator } from '../../interfaces/keyIterator'; +import { Key } from '../../interfaces/keystore'; +import { PrivLevels } from '../proxyDeploy/deploy'; +/** + * The minimum requirements are emailFrom and secondaryKey. + * - emailFrom is the email from the email vault + * - secondaryKey is the recoveryKey set in the email vault + * - acceptUnknownSelectors: sets whether recovery can be done by DNSSEC keys + * - waitUntilAcceptAdded: how much time to wait before the user accepts + * a DNSSEC key + * - waitUntilAcceptRemoved: how much time to wait before the user accepts + * a removal of a DNSSEC key + * - acceptEmptyDKIMSig: can recovery be performed without DKIM + * - acceptEmptySecondSig: can recovery be performed without secondaryKey + * - onlyOneSigTimelock: in case of 1/2 multisig, how much time to wait + * before the recovery transaction can be executed + */ +interface DKIMRecoveryAccInfo { + emailFrom: string; + secondaryKey: string; + waitUntilAcceptAdded?: BigInt; + waitUntilAcceptRemoved?: BigInt; + acceptEmptyDKIMSig?: boolean; + acceptEmptySecondSig?: boolean; + onlyOneSigTimelock?: BigInt; +} +export declare function getAccountDeployParams(account: Account): [string, string]; +export declare function getBasicAccount(addr: string, existingAccounts: Account[]): Account; +export declare function getSmartAccount(privileges: PrivLevels[], existingAccounts: Account[]): Promise; +export declare function getSpoof(account: Account): string; +/** + * Create a DKIM recoverable email smart account + * + * @param recoveryInfo DKIMRecoveryAccInfo + * @param associatedKey the key that has privileges + * @returns Promise + */ +export declare function getEmailAccount(recoveryInfo: DKIMRecoveryAccInfo, associatedKey: string): Promise; +export declare const isAmbireV1LinkedAccount: (factoryAddr?: string) => boolean | "" | undefined; +export declare const isSmartAccount: (account?: Account | null) => boolean; +/** + * Checks if a (basic) EOA account is a derived one, + * that is meant to be used as a smart account key only. + */ +export declare const isDerivedForSmartAccountKeyOnly: (index?: number) => boolean; +export declare const getDefaultSelectedAccount: (accounts: Account[]) => Account | null; +export declare const getAccountImportStatus: ({ account, alreadyImportedAccounts, keys, accountsOnPage, keyIteratorType }: { + account: Account; + alreadyImportedAccounts: Account[]; + keys: Key[]; + accountsOnPage?: Omit[] | undefined; + keyIteratorType?: string | undefined; +}) => ImportStatus; +export declare const getDefaultAccountPreferences: (accountAddr: string, prevAccounts: Account[], i?: number) => AccountPreferences; +export declare function migrateAccountPreferencesToAccounts(accountPreferences: { + [key: AccountId]: AccountPreferences; +}, accounts: Account[]): { + preferences: AccountPreferences; + addr: string; + associatedKeys: string[]; + initialPrivileges: [string, string][]; + creation: import("../../interfaces/account").AccountCreation | null; + email?: string | undefined; + newlyCreated?: boolean | undefined; + newlyAdded?: boolean | undefined; +}[]; +export declare function getUniqueAccountsArray(accounts: Account[]): Account[]; +export {}; +//# sourceMappingURL=account.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/account/account.d.ts.map b/dist/src/libs/account/account.d.ts.map new file mode 100644 index 000000000..feb451e03 --- /dev/null +++ b/dist/src/libs/account/account.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/libs/account/account.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,OAAO,EACP,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,YAAY,EACb,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGlD;;;;;;;;;;;;;GAaG;AACH,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUzE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO,CAYlF;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EAAE,EACxB,gBAAgB,EAAE,OAAO,EAAE,GAC1B,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,UAGxC;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAsElB;AAED,eAAO,MAAM,uBAAuB,iBAAkB,MAAM,6BAC6B,CAAA;AAEzF,eAAO,MAAM,cAAc,aAAc,OAAO,GAAG,IAAI,YAAoC,CAAA;AAE3F;;;GAGG;AACH,eAAO,MAAM,+BAA+B,WAAY,MAAM,YACoB,CAAA;AAElF,eAAO,MAAM,yBAAyB,aAAc,OAAO,EAAE,mBAO5D,CAAA;AAED,eAAO,MAAM,sBAAsB;aAOxB,OAAO;6BACS,OAAO,EAAE;UAC5B,GAAG,EAAE;;;MAGT,YAqEH,CAAA;AAED,eAAO,MAAM,4BAA4B,gBAC1B,MAAM,gBACL,OAAO,EAAE,MACnB,MAAM,KACT,kBAOF,CAAA;AAMD,wBAAgB,mCAAmC,CACjD,kBAAkB,EAAE;IAClB,CAAC,GAAG,EAAE,SAAS,GAAG,kBAAkB,CAAA;CACrC,EACD,QAAQ,EAAE,OAAO,EAAE;;;;;;;;;IAQpB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAEzD"} \ No newline at end of file diff --git a/dist/src/libs/account/account.js b/dist/src/libs/account/account.js index 54ff33c95..22e311a5c 100644 --- a/dist/src/libs/account/account.js +++ b/dist/src/libs/account/account.js @@ -1,54 +1,216 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isAmbireV1LinkedAccount = exports.getSmartAccount = exports.getLegacyAccount = exports.getAccountDeployParams = void 0; -const ethers_1 = require("ethers"); -const deploy_1 = require("../../consts/deploy"); -const networks_1 = require("../../consts/networks"); -const bytecode_1 = require("../proxyDeploy/bytecode"); -const getAmbireAddressTwo_1 = require("../proxyDeploy/getAmbireAddressTwo"); +import { AbiCoder, getAddress, hexlify, Interface, toBeHex, toUtf8Bytes, ZeroAddress } from 'ethers'; +import { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'; +import { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'; +import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; +import { SPOOF_SIGTYPE } from '../../consts/signatures'; +import { ImportStatus } from '../../interfaces/account'; +import { DKIM_VALIDATOR_ADDR, getSignerKey, RECOVERY_DEFAULTS } from '../dkim/recovery'; +import { getBytecode } from '../proxyDeploy/bytecode'; +import { getAmbireAccountAddress } from '../proxyDeploy/getAmbireAddressTwo'; // returns to, data -function getAccountDeployParams(account) { +export function getAccountDeployParams(account) { + // for EOAs, we do not throw an error anymore as we need fake + // values for the simulation if (account.creation === null) - throw new Error('tried to get deployment params for an EOA'); - const factory = new ethers_1.Interface(['function deploy(bytes calldata code, uint256 salt) external']); + return [ZeroAddress, '0x']; + const factory = new Interface(['function deploy(bytes calldata code, uint256 salt) external']); return [ account.creation.factoryAddr, factory.encodeFunctionData('deploy', [account.creation.bytecode, account.creation.salt]) ]; } -exports.getAccountDeployParams = getAccountDeployParams; -function getLegacyAccount(key) { +export function getBasicAccount(addr, existingAccounts) { + const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}; return { - addr: key, - label: '', - pfp: '', - associatedKeys: [key], - creation: null + addr, + associatedKeys: [addr], + initialPrivileges: [], + creation: null, + preferences: { + label: preferences?.label || DEFAULT_ACCOUNT_LABEL, + pfp: preferences?.pfp || addr + } }; } -exports.getLegacyAccount = getLegacyAccount; -async function getSmartAccount(address) { - // Temporarily use the polygon network, - // to be discussed which network we would use for - // getBytocode once the contract is deployed on all of them - const polygon = networks_1.networks.find((x) => x.id === 'polygon'); - if (!polygon) - throw new Error('unable to find polygon network in consts'); - const priv = { addr: address, hash: true }; - const bytecode = await (0, bytecode_1.getBytecode)(polygon, [priv]); +export async function getSmartAccount(privileges, existingAccounts) { + const bytecode = await getBytecode(privileges); + const addr = getAmbireAccountAddress(AMBIRE_ACCOUNT_FACTORY, bytecode); + const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}; return { - addr: (0, getAmbireAddressTwo_1.getAmbireAccountAddress)(deploy_1.AMBIRE_ACCOUNT_FACTORY, bytecode), - label: '', - pfp: '', - associatedKeys: [address], + addr, + initialPrivileges: privileges.map((priv) => [priv.addr, priv.hash]), + associatedKeys: privileges.map((priv) => priv.addr), creation: { - factoryAddr: deploy_1.AMBIRE_ACCOUNT_FACTORY, + factoryAddr: AMBIRE_ACCOUNT_FACTORY, bytecode, - salt: ethers_1.ethers.toBeHex(0, 32) + salt: toBeHex(0, 32) + }, + preferences: { + label: preferences?.label || DEFAULT_ACCOUNT_LABEL, + pfp: preferences?.pfp || addr } }; } -exports.getSmartAccount = getSmartAccount; -const isAmbireV1LinkedAccount = (factoryAddr) => factoryAddr === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'; -exports.isAmbireV1LinkedAccount = isAmbireV1LinkedAccount; +export function getSpoof(account) { + const abiCoder = new AbiCoder(); + return abiCoder.encode(['address'], [account.associatedKeys[0]]) + SPOOF_SIGTYPE; +} +/** + * Create a DKIM recoverable email smart account + * + * @param recoveryInfo DKIMRecoveryAccInfo + * @param associatedKey the key that has privileges + * @returns Promise + */ +export async function getEmailAccount(recoveryInfo, associatedKey) { + // const domain: string = recoveryInfo.emailFrom.split('@')[1] + // TODO: make getEmailAccount work with cloudflare + // try to take the dkimKey from the list of knownSelectors + // if we cannot, we query a list of frequentlyUsedSelectors to try + // to find the dkim key + // let selector = knownSelectors[domain as keyof typeof knownSelectors] ?? '' + // let dkimKey = selector ? await getPublicKeyIfAny({domain, selector: selector}) : '' + // if (!dkimKey) { + // const promises = frequentlyUsedSelectors.map(sel => getPublicKeyIfAny({domain, selector: sel})) + // const results = await Promise.all(promises) + // for (let i = 0; i < results.length; i++) { + // if (results[i]) { + // dkimKey = results[i] + // selector = frequentlyUsedSelectors[i] + // break + // } + // } + // } + // if there's no dkimKey, standard DKIM recovery is not possible + // we leave the defaults empty and the user will have to rely on + // keys added through DNSSEC + const selector = hexlify(toUtf8Bytes('')); + const modulus = hexlify(toUtf8Bytes('')); + const exponent = hexlify(toUtf8Bytes('')); + // if (dkimKey) { + // const key = publicKeyToComponents(dkimKey.publicKey) + // modulus = hexlify(key.modulus) + // exponent = hexlify(toBeHex(key.exponent)) + // } + // acceptUnknownSelectors should be always true + // and should not be overriden by the FE at this point + const acceptUnknownSelectors = RECOVERY_DEFAULTS.acceptUnknownSelectors; + const waitUntilAcceptAdded = recoveryInfo.waitUntilAcceptAdded ?? RECOVERY_DEFAULTS.waitUntilAcceptAdded; + const waitUntilAcceptRemoved = recoveryInfo.waitUntilAcceptRemoved ?? RECOVERY_DEFAULTS.waitUntilAcceptRemoved; + const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? RECOVERY_DEFAULTS.acceptEmptyDKIMSig; + const acceptEmptySecondSig = recoveryInfo.acceptEmptySecondSig ?? RECOVERY_DEFAULTS.acceptEmptySecondSig; + const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? RECOVERY_DEFAULTS.onlyOneSigTimelock; + const abiCoder = new AbiCoder(); + const validatorAddr = DKIM_VALIDATOR_ADDR; + const validatorData = abiCoder.encode(['tuple(string,string,string,bytes,bytes,address,bool,uint32,uint32,bool,bool,uint32)'], [ + [ + recoveryInfo.emailFrom, + RECOVERY_DEFAULTS.emailTo, + selector, + modulus, + exponent, + recoveryInfo.secondaryKey, + acceptUnknownSelectors, + waitUntilAcceptAdded, + waitUntilAcceptRemoved, + acceptEmptyDKIMSig, + acceptEmptySecondSig, + onlyOneSigTimelock + ] + ]); + const { hash } = getSignerKey(validatorAddr, validatorData); + const privileges = [{ addr: associatedKey, hash }]; + return getSmartAccount(privileges, []); +} +export const isAmbireV1LinkedAccount = (factoryAddr) => factoryAddr && getAddress(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'; +export const isSmartAccount = (account) => !!account && !!account.creation; +/** + * Checks if a (basic) EOA account is a derived one, + * that is meant to be used as a smart account key only. + */ +export const isDerivedForSmartAccountKeyOnly = (index) => typeof index === 'number' && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; +export const getDefaultSelectedAccount = (accounts) => { + if (accounts.length === 0) + return null; + const smartAccounts = accounts.filter((acc) => acc.creation); + if (smartAccounts.length) + return smartAccounts[0]; + return accounts[0]; +}; +export const getAccountImportStatus = ({ account, alreadyImportedAccounts, keys, accountsOnPage = [], keyIteratorType }) => { + const isAlreadyImported = alreadyImportedAccounts.some(({ addr }) => addr === account.addr); + if (!isAlreadyImported) + return ImportStatus.NotImported; + // Check if the account has been imported with at least one of the keys + // that the account was originally associated with, when it was imported. + const storedAssociatedKeys = alreadyImportedAccounts.find((x) => x.addr === account.addr)?.associatedKeys || []; + const importedKeysForThisAcc = keys.filter((key) => storedAssociatedKeys.includes(key.addr)); + // Could be imported as a view only account (and therefore, without a key) + if (!importedKeysForThisAcc.length) + return ImportStatus.ImportedWithoutKey; + // Merge the `associatedKeys` from the account instances found on the page, + // with the `associatedKeys` of the account from the extension storage. This + // ensures up-to-date keys, considering the account existing associatedKeys + // could be outdated (associated keys of the smart accounts can change) or + // incomplete initial data (during the initial import, not all associatedKeys + // could have been fetched (for privacy). + const mergedAssociatedKeys = Array.from(new Set([ + ...accountsOnPage + .filter((x) => x.account.addr === account.addr) + .flatMap((x) => x.account.associatedKeys), + ...storedAssociatedKeys + ])); + // Same key in this context means not only the same key address, but the + // same type too. Because user can opt in to import same key address with + // many different hardware wallets (Trezor, Ledger, GridPlus, etc.) or + // the same address with seed (private key). + const associatedKeysAlreadyImported = importedKeysForThisAcc.filter((key) => mergedAssociatedKeys.includes(key.addr) && + // if key type is not provided, skip this part of the check on purpose + (keyIteratorType ? key.type === keyIteratorType : true)); + if (associatedKeysAlreadyImported.length) { + const associatedKeysNotImportedYet = mergedAssociatedKeys.filter((keyAddr) => associatedKeysAlreadyImported.some((x) => x.addr !== keyAddr)); + const notImportedYetKeysExistInPage = accountsOnPage.some((x) => associatedKeysNotImportedYet.includes(x.account.addr)); + if (notImportedYetKeysExistInPage) + return ImportStatus.ImportedWithSomeOfTheKeys; + // Could happen when user imports a smart account with one associated key. + // Then imports an Basic account. Then makes the Basic account a second key + // for the smart account. In this case, both associated keys of the smart + // account are imported, but the smart account's `associatedKeys` are incomplete. + const associatedKeysFoundOnPageAreDifferent = accountsOnPage + .filter((x) => x.account.addr === account.addr) + .some((x) => { + const incomingAssociatedKeysSet = new Set(x.account.associatedKeys); + const storedAssociatedKeysSet = new Set(storedAssociatedKeys); + return ![...incomingAssociatedKeysSet].every((k) => storedAssociatedKeysSet.has(k)); + }); + return associatedKeysFoundOnPageAreDifferent + ? ImportStatus.ImportedWithSomeOfTheKeys + : ImportStatus.ImportedWithTheSameKeys; + } + // Since there are `importedKeysForThisAcc`, as a fallback - + // for all other scenarios this account has been imported with different keys. + return ImportStatus.ImportedWithDifferentKeys; +}; +export const getDefaultAccountPreferences = (accountAddr, prevAccounts, i) => { + const number = i ? prevAccounts.length + (i + 1) : prevAccounts.length + 1; + return { + label: `Account ${number}`, + pfp: getAddress(accountAddr) // default pfp - a jazz icon generated from the addr + }; +}; +// As of version 4.25.0, a new Account interface has been introduced, +// merging the previously separate Account and AccountPreferences interfaces. +// This change requires a migration due to the introduction of a new controller, AccountsController, +// which now manages both accounts and their preferences. +export function migrateAccountPreferencesToAccounts(accountPreferences, accounts) { + return accounts.map((a) => { + return { + ...a, + preferences: accountPreferences[a.addr] || { label: DEFAULT_ACCOUNT_LABEL, pfp: a.addr } + }; + }); +} +export function getUniqueAccountsArray(accounts) { + return Array.from(new Map(accounts.map((account) => [account.addr, account])).values()); +} //# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/libs/account/account.js.map b/dist/src/libs/account/account.js.map index a567397b2..91352cda1 100644 --- a/dist/src/libs/account/account.js.map +++ b/dist/src/libs/account/account.js.map @@ -1 +1 @@ -{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/libs/account/account.ts"],"names":[],"mappings":";;;AAAA,mCAA0C;AAE1C,gDAA4D;AAC5D,oDAAgD;AAEhD,sDAAqD;AACrD,4EAA4E;AAE5E,mBAAmB;AACnB,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC3F,MAAM,OAAO,GAAG,IAAI,kBAAS,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAA;IAC9F,OAAO;QACL,OAAO,CAAC,QAAQ,CAAC,WAAW;QAC5B,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KACzF,CAAA;AACH,CAAC;AAPD,wDAOC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO;QACL,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE;QACT,GAAG,EAAE,EAAE;QACP,cAAc,EAAE,CAAC,GAAG,CAAC;QACrB,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AARD,4CAQC;AAEM,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,uCAAuC;IACvC,iDAAiD;IACjD,2DAA2D;IAC3D,MAAM,OAAO,GAAG,mBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;IACxD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAEzE,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,sBAAW,EAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEnD,OAAO;QACL,IAAI,EAAE,IAAA,6CAAuB,EAAC,+BAAsB,EAAE,QAAQ,CAAC;QAC/D,KAAK,EAAE,EAAE;QACT,GAAG,EAAE,EAAE;QACP,cAAc,EAAE,CAAC,OAAO,CAAC;QACzB,QAAQ,EAAE;YACR,WAAW,EAAE,+BAAsB;YACnC,QAAQ;YACR,IAAI,EAAE,eAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;SAC5B;KACF,CAAA;AACH,CAAC;AArBD,0CAqBC;AAEM,MAAM,uBAAuB,GAAG,CAAC,WAAoB,EAAE,EAAE,CAC9D,WAAW,KAAK,4CAA4C,CAAA;AADjD,QAAA,uBAAuB,2BAC0B"} \ No newline at end of file +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/libs/account/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getAddress, hexlify, Interface, toBeHex, toUtf8Bytes, ZeroAddress } from 'ethers'\n\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport {\n Account,\n AccountId,\n AccountOnPage,\n AccountPreferences,\n ImportStatus\n} from '../../interfaces/account'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { DKIM_VALIDATOR_ADDR, getSignerKey, RECOVERY_DEFAULTS } from '../dkim/recovery'\nimport { getBytecode } from '../proxyDeploy/bytecode'\nimport { PrivLevels } from '../proxyDeploy/deploy'\nimport { getAmbireAccountAddress } from '../proxyDeploy/getAmbireAddressTwo'\n\n/**\n * The minimum requirements are emailFrom and secondaryKey.\n * - emailFrom is the email from the email vault\n * - secondaryKey is the recoveryKey set in the email vault\n * - acceptUnknownSelectors: sets whether recovery can be done by DNSSEC keys\n * - waitUntilAcceptAdded: how much time to wait before the user accepts\n * a DNSSEC key\n * - waitUntilAcceptRemoved: how much time to wait before the user accepts\n * a removal of a DNSSEC key\n * - acceptEmptyDKIMSig: can recovery be performed without DKIM\n * - acceptEmptySecondSig: can recovery be performed without secondaryKey\n * - onlyOneSigTimelock: in case of 1/2 multisig, how much time to wait\n * before the recovery transaction can be executed\n */\ninterface DKIMRecoveryAccInfo {\n emailFrom: string\n secondaryKey: string\n waitUntilAcceptAdded?: BigInt\n waitUntilAcceptRemoved?: BigInt\n acceptEmptyDKIMSig?: boolean\n acceptEmptySecondSig?: boolean\n onlyOneSigTimelock?: BigInt\n}\n\n// returns to, data\nexport function getAccountDeployParams(account: Account): [string, string] {\n // for EOAs, we do not throw an error anymore as we need fake\n // values for the simulation\n if (account.creation === null) return [ZeroAddress, '0x']\n\n const factory = new Interface(['function deploy(bytes calldata code, uint256 salt) external'])\n return [\n account.creation.factoryAddr,\n factory.encodeFunctionData('deploy', [account.creation.bytecode, account.creation.salt])\n ]\n}\n\nexport function getBasicAccount(addr: string, existingAccounts: Account[]): Account {\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n return {\n addr,\n associatedKeys: [addr],\n initialPrivileges: [],\n creation: null,\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport async function getSmartAccount(\n privileges: PrivLevels[],\n existingAccounts: Account[]\n): Promise {\n const bytecode = await getBytecode(privileges)\n const addr = getAmbireAccountAddress(AMBIRE_ACCOUNT_FACTORY, bytecode)\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n\n return {\n addr,\n initialPrivileges: privileges.map((priv) => [priv.addr, priv.hash]),\n associatedKeys: privileges.map((priv) => priv.addr),\n creation: {\n factoryAddr: AMBIRE_ACCOUNT_FACTORY,\n bytecode,\n salt: toBeHex(0, 32)\n },\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport function getSpoof(account: Account) {\n const abiCoder = new AbiCoder()\n return abiCoder.encode(['address'], [account.associatedKeys[0]]) + SPOOF_SIGTYPE\n}\n\n/**\n * Create a DKIM recoverable email smart account\n *\n * @param recoveryInfo DKIMRecoveryAccInfo\n * @param associatedKey the key that has privileges\n * @returns Promise\n */\nexport async function getEmailAccount(\n recoveryInfo: DKIMRecoveryAccInfo,\n associatedKey: string\n): Promise {\n // const domain: string = recoveryInfo.emailFrom.split('@')[1]\n\n // TODO: make getEmailAccount work with cloudflare\n\n // try to take the dkimKey from the list of knownSelectors\n // if we cannot, we query a list of frequentlyUsedSelectors to try\n // to find the dkim key\n // let selector = knownSelectors[domain as keyof typeof knownSelectors] ?? ''\n // let dkimKey = selector ? await getPublicKeyIfAny({domain, selector: selector}) : ''\n // if (!dkimKey) {\n // const promises = frequentlyUsedSelectors.map(sel => getPublicKeyIfAny({domain, selector: sel}))\n // const results = await Promise.all(promises)\n // for (let i = 0; i < results.length; i++) {\n // if (results[i]) {\n // dkimKey = results[i]\n // selector = frequentlyUsedSelectors[i]\n // break\n // }\n // }\n // }\n\n // if there's no dkimKey, standard DKIM recovery is not possible\n // we leave the defaults empty and the user will have to rely on\n // keys added through DNSSEC\n const selector = hexlify(toUtf8Bytes(''))\n const modulus = hexlify(toUtf8Bytes(''))\n const exponent = hexlify(toUtf8Bytes(''))\n // if (dkimKey) {\n // const key = publicKeyToComponents(dkimKey.publicKey)\n // modulus = hexlify(key.modulus)\n // exponent = hexlify(toBeHex(key.exponent))\n // }\n\n // acceptUnknownSelectors should be always true\n // and should not be overriden by the FE at this point\n const acceptUnknownSelectors = RECOVERY_DEFAULTS.acceptUnknownSelectors\n const waitUntilAcceptAdded =\n recoveryInfo.waitUntilAcceptAdded ?? RECOVERY_DEFAULTS.waitUntilAcceptAdded\n const waitUntilAcceptRemoved =\n recoveryInfo.waitUntilAcceptRemoved ?? RECOVERY_DEFAULTS.waitUntilAcceptRemoved\n const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? RECOVERY_DEFAULTS.acceptEmptyDKIMSig\n const acceptEmptySecondSig =\n recoveryInfo.acceptEmptySecondSig ?? RECOVERY_DEFAULTS.acceptEmptySecondSig\n const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? RECOVERY_DEFAULTS.onlyOneSigTimelock\n\n const abiCoder = new AbiCoder()\n const validatorAddr = DKIM_VALIDATOR_ADDR\n const validatorData = abiCoder.encode(\n ['tuple(string,string,string,bytes,bytes,address,bool,uint32,uint32,bool,bool,uint32)'],\n [\n [\n recoveryInfo.emailFrom,\n RECOVERY_DEFAULTS.emailTo,\n selector,\n modulus,\n exponent,\n recoveryInfo.secondaryKey,\n acceptUnknownSelectors,\n waitUntilAcceptAdded,\n waitUntilAcceptRemoved,\n acceptEmptyDKIMSig,\n acceptEmptySecondSig,\n onlyOneSigTimelock\n ]\n ]\n )\n const { hash } = getSignerKey(validatorAddr, validatorData)\n const privileges = [{ addr: associatedKey, hash }]\n return getSmartAccount(privileges, [])\n}\n\nexport const isAmbireV1LinkedAccount = (factoryAddr?: string) =>\n factoryAddr && getAddress(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'\n\nexport const isSmartAccount = (account?: Account | null) => !!account && !!account.creation\n\n/**\n * Checks if a (basic) EOA account is a derived one,\n * that is meant to be used as a smart account key only.\n */\nexport const isDerivedForSmartAccountKeyOnly = (index?: number) =>\n typeof index === 'number' && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n\nexport const getDefaultSelectedAccount = (accounts: Account[]) => {\n if (accounts.length === 0) return null\n\n const smartAccounts = accounts.filter((acc) => acc.creation)\n if (smartAccounts.length) return smartAccounts[0]\n\n return accounts[0]\n}\n\nexport const getAccountImportStatus = ({\n account,\n alreadyImportedAccounts,\n keys,\n accountsOnPage = [],\n keyIteratorType\n}: {\n account: Account\n alreadyImportedAccounts: Account[]\n keys: Key[]\n accountsOnPage?: Omit[]\n keyIteratorType?: KeyIterator['type']\n}): ImportStatus => {\n const isAlreadyImported = alreadyImportedAccounts.some(({ addr }) => addr === account.addr)\n if (!isAlreadyImported) return ImportStatus.NotImported\n\n // Check if the account has been imported with at least one of the keys\n // that the account was originally associated with, when it was imported.\n const storedAssociatedKeys =\n alreadyImportedAccounts.find((x) => x.addr === account.addr)?.associatedKeys || []\n const importedKeysForThisAcc = keys.filter((key) => storedAssociatedKeys.includes(key.addr))\n // Could be imported as a view only account (and therefore, without a key)\n if (!importedKeysForThisAcc.length) return ImportStatus.ImportedWithoutKey\n\n // Merge the `associatedKeys` from the account instances found on the page,\n // with the `associatedKeys` of the account from the extension storage. This\n // ensures up-to-date keys, considering the account existing associatedKeys\n // could be outdated (associated keys of the smart accounts can change) or\n // incomplete initial data (during the initial import, not all associatedKeys\n // could have been fetched (for privacy).\n const mergedAssociatedKeys = Array.from(\n new Set([\n ...accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .flatMap((x) => x.account.associatedKeys),\n ...storedAssociatedKeys\n ])\n )\n\n // Same key in this context means not only the same key address, but the\n // same type too. Because user can opt in to import same key address with\n // many different hardware wallets (Trezor, Ledger, GridPlus, etc.) or\n // the same address with seed (private key).\n const associatedKeysAlreadyImported = importedKeysForThisAcc.filter(\n (key) =>\n mergedAssociatedKeys.includes(key.addr) &&\n // if key type is not provided, skip this part of the check on purpose\n (keyIteratorType ? key.type === keyIteratorType : true)\n )\n if (associatedKeysAlreadyImported.length) {\n const associatedKeysNotImportedYet = mergedAssociatedKeys.filter((keyAddr) =>\n associatedKeysAlreadyImported.some((x) => x.addr !== keyAddr)\n )\n\n const notImportedYetKeysExistInPage = accountsOnPage.some((x) =>\n associatedKeysNotImportedYet.includes(x.account.addr)\n )\n\n if (notImportedYetKeysExistInPage) return ImportStatus.ImportedWithSomeOfTheKeys\n\n // Could happen when user imports a smart account with one associated key.\n // Then imports an Basic account. Then makes the Basic account a second key\n // for the smart account. In this case, both associated keys of the smart\n // account are imported, but the smart account's `associatedKeys` are incomplete.\n const associatedKeysFoundOnPageAreDifferent = accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .some((x) => {\n const incomingAssociatedKeysSet = new Set(x.account.associatedKeys)\n const storedAssociatedKeysSet = new Set(storedAssociatedKeys)\n\n return ![...incomingAssociatedKeysSet].every((k) => storedAssociatedKeysSet.has(k))\n })\n\n return associatedKeysFoundOnPageAreDifferent\n ? ImportStatus.ImportedWithSomeOfTheKeys\n : ImportStatus.ImportedWithTheSameKeys\n }\n\n // Since there are `importedKeysForThisAcc`, as a fallback -\n // for all other scenarios this account has been imported with different keys.\n return ImportStatus.ImportedWithDifferentKeys\n}\n\nexport const getDefaultAccountPreferences = (\n accountAddr: string,\n prevAccounts: Account[],\n i?: number\n): AccountPreferences => {\n const number = i ? prevAccounts.length + (i + 1) : prevAccounts.length + 1\n\n return {\n label: `Account ${number}`,\n pfp: getAddress(accountAddr) // default pfp - a jazz icon generated from the addr\n }\n}\n\n// As of version 4.25.0, a new Account interface has been introduced,\n// merging the previously separate Account and AccountPreferences interfaces.\n// This change requires a migration due to the introduction of a new controller, AccountsController,\n// which now manages both accounts and their preferences.\nexport function migrateAccountPreferencesToAccounts(\n accountPreferences: {\n [key: AccountId]: AccountPreferences\n },\n accounts: Account[]\n) {\n return accounts.map((a) => {\n return {\n ...a,\n preferences: accountPreferences[a.addr] || { label: DEFAULT_ACCOUNT_LABEL, pfp: a.addr }\n }\n })\n}\n\nexport function getUniqueAccountsArray(accounts: Account[]) {\n return Array.from(new Map(accounts.map((account) => [account.addr, account])).values())\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.d.ts b/dist/src/libs/accountAdder/accountAdder.d.ts new file mode 100644 index 000000000..95e14804b --- /dev/null +++ b/dist/src/libs/accountAdder/accountAdder.d.ts @@ -0,0 +1,11 @@ +import { Fetch } from '../../interfaces/fetch'; +export declare function getIdentity(address: string, fetch: Fetch, relayerUrl: string): Promise<{ + creation: { + factoryAddr: any; + bytecode: any; + salt: any; + } | null; + associatedKeys: string[]; + initialPrivileges: any; +}>; +//# sourceMappingURL=accountAdder.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.d.ts.map b/dist/src/libs/accountAdder/accountAdder.d.ts.map new file mode 100644 index 000000000..1dca1823e --- /dev/null +++ b/dist/src/libs/accountAdder/accountAdder.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accountAdder.d.ts","sourceRoot":"","sources":["../../../../src/libs/accountAdder/accountAdder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM;;;;;;;;GAyClF"} \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.js b/dist/src/libs/accountAdder/accountAdder.js new file mode 100644 index 000000000..ec8b83587 --- /dev/null +++ b/dist/src/libs/accountAdder/accountAdder.js @@ -0,0 +1,38 @@ +import { fetchCaught } from '../../../v1/services/fetch'; +export async function getIdentity(address, fetch, relayerUrl) { + // Use `fetchCaught` because the endpoint could return 404 if the account + // is not found, which should not throw an error + const accountIdentityResponse = await fetchCaught(fetch, `${relayerUrl}/v2/identity/${address}`); + // Trick to determine if there is an error throw. When the request 404s, + // there is no error message incoming, which is enough to treat it as a + // no-error, 404 response is expected for EOAs. + if (accountIdentityResponse?.errMsg) + throw new Error(accountIdentityResponse.errMsg); + const accountIdentity = accountIdentityResponse?.body; + let creation = null; + let associatedKeys = [address]; + if (typeof accountIdentity === 'object' && + accountIdentity !== null && + 'identityFactoryAddr' in accountIdentity && + typeof accountIdentity.identityFactoryAddr === 'string' && + 'bytecode' in accountIdentity && + typeof accountIdentity.bytecode === 'string' && + 'salt' in accountIdentity && + typeof accountIdentity.salt === 'string') { + creation = { + factoryAddr: accountIdentity.identityFactoryAddr, + bytecode: accountIdentity.bytecode, + salt: accountIdentity.salt + }; + } + if (accountIdentity?.associatedKeys) { + associatedKeys = Object.keys(accountIdentity?.associatedKeys || {}); + } + const initialPrivileges = accountIdentity?.initialPrivileges || []; + return { + creation, + associatedKeys, + initialPrivileges + }; +} +//# sourceMappingURL=accountAdder.js.map \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.js.map b/dist/src/libs/accountAdder/accountAdder.js.map new file mode 100644 index 000000000..fd4944929 --- /dev/null +++ b/dist/src/libs/accountAdder/accountAdder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/libs/accountAdder/accountAdder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAGxD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,KAAY,EAAE,UAAkB;IACjF,yEAAyE;IACzE,gDAAgD;IAChD,MAAM,uBAAuB,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,UAAU,gBAAgB,OAAO,EAAE,CAAC,CAAA;IAEhG,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,IAAI,uBAAuB,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;IAEpF,MAAM,eAAe,GAAQ,uBAAuB,EAAE,IAAI,CAAA;IAC1D,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,IAAI,cAAc,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,eAAe,KAAK,IAAI;QACxB,qBAAqB,IAAI,eAAe;QACxC,OAAO,eAAe,CAAC,mBAAmB,KAAK,QAAQ;QACvD,UAAU,IAAI,eAAe;QAC7B,OAAO,eAAe,CAAC,QAAQ,KAAK,QAAQ;QAC5C,MAAM,IAAI,eAAe;QACzB,OAAO,eAAe,CAAC,IAAI,KAAK,QAAQ,EACxC;QACA,QAAQ,GAAG;YACT,WAAW,EAAE,eAAe,CAAC,mBAAmB;YAChD,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,IAAI,EAAE,eAAe,CAAC,IAAI;SAC3B,CAAA;KACF;IAED,IAAI,eAAe,EAAE,cAAc,EAAE;QACnC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,IAAI,EAAE,CAAC,CAAA;KACpE;IAED,MAAM,iBAAiB,GAAG,eAAe,EAAE,iBAAiB,IAAI,EAAE,CAAA;IAElE,OAAO;QACL,QAAQ;QACR,cAAc;QACd,iBAAiB;KAClB,CAAA;AACH,CAAC","sourcesContent":["import { fetchCaught } from '../../../v1/services/fetch'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport async function getIdentity(address: string, fetch: Fetch, relayerUrl: string) {\n // Use `fetchCaught` because the endpoint could return 404 if the account\n // is not found, which should not throw an error\n const accountIdentityResponse = await fetchCaught(fetch, `${relayerUrl}/v2/identity/${address}`)\n\n // Trick to determine if there is an error throw. When the request 404s,\n // there is no error message incoming, which is enough to treat it as a\n // no-error, 404 response is expected for EOAs.\n if (accountIdentityResponse?.errMsg) throw new Error(accountIdentityResponse.errMsg)\n\n const accountIdentity: any = accountIdentityResponse?.body\n let creation = null\n let associatedKeys = [address]\n if (\n typeof accountIdentity === 'object' &&\n accountIdentity !== null &&\n 'identityFactoryAddr' in accountIdentity &&\n typeof accountIdentity.identityFactoryAddr === 'string' &&\n 'bytecode' in accountIdentity &&\n typeof accountIdentity.bytecode === 'string' &&\n 'salt' in accountIdentity &&\n typeof accountIdentity.salt === 'string'\n ) {\n creation = {\n factoryAddr: accountIdentity.identityFactoryAddr,\n bytecode: accountIdentity.bytecode,\n salt: accountIdentity.salt\n }\n }\n\n if (accountIdentity?.associatedKeys) {\n associatedKeys = Object.keys(accountIdentity?.associatedKeys || {})\n }\n\n const initialPrivileges = accountIdentity?.initialPrivileges || []\n\n return {\n creation,\n associatedKeys,\n initialPrivileges\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.d.ts b/dist/src/libs/accountOp/accountOp.d.ts new file mode 100644 index 000000000..23176b6a6 --- /dev/null +++ b/dist/src/libs/accountOp/accountOp.d.ts @@ -0,0 +1,98 @@ +import { AccountId } from '../../interfaces/account'; +import { Key } from '../../interfaces/keystore'; +import { NetworkId } from '../../interfaces/network'; +import { PaymasterService } from '../erc7677/types'; +import { UserOperation } from '../userOperation/types'; +import { Call } from './types'; +export interface GasFeePayment { + isERC4337: boolean; + isGasTank: boolean; + paidBy: string; + inToken: string; + feeTokenNetworkId?: NetworkId; + amount: bigint; + simulatedGasLimit: bigint; + gasPrice: bigint; + maxPriorityFeePerGas?: bigint; + isSponsored?: boolean; +} +export declare enum AccountOpStatus { + Pending = "pending", + BroadcastedButNotConfirmed = "broadcasted-but-not-confirmed", + Success = "success", + Failure = "failure", + Rejected = "rejected", + UnknownButPastNonce = "unknown-but-past-nonce", + BroadcastButStuck = "broadcast-but-stuck" +} +export interface AccountOp { + accountAddr: string; + networkId: NetworkId; + signingKeyAddr: Key['addr'] | null; + signingKeyType: Key['type'] | null; + nonce: bigint | null; + calls: Call[]; + feeCall?: Call; + activatorCall?: Call; + gasLimit: number | null; + signature: string | null; + gasFeePayment: GasFeePayment | null; + accountOpToExecuteBefore: AccountOp | null; + txnId?: string; + status?: AccountOpStatus; + asUserOperation?: UserOperation; + meta?: { + entryPointAuthorization?: string; + paymasterService?: PaymasterService; + }; +} +/** + * If we want to deploy a contract, the to field of Call will actually + * be empty (undefined). In order to simulate it in a transaction or + * perform it using a smart account, we need to transform the call to + * a call to the singleton + * + * @param call + * @returns Call + */ +export declare function toSingletonCall(call: Call): Call; +export declare function callToTuple(call: Call): [string, string, string]; +export declare function canBroadcast(op: AccountOp, accountIsEOA: boolean): boolean; +/** + * Compare two AccountOps intents. + * + * By 'intent,' we are referring to the sender of the transaction, the network it is sent on, and the included calls. + * + * Since we are comparing the intents, we exclude any other properties of the AccountOps. + */ +export declare function isAccountOpsIntentEqual(accountOps1: AccountOp[], accountOps2: AccountOp[]): boolean; +export declare function getSignableCalls(op: AccountOp): [string, string, string][]; +export declare function getSignableCallsForBundlerEstimate(op: AccountOp): [string, string, string][]; +export declare function getSignableHash(addr: AccountId, chainId: bigint, nonce: bigint, calls: [string, string, string][]): Uint8Array; +/** + * This function returns the hash as a Uint8Array instead of string + * and the reason for this is the implementation that follows: + * + * const hash = accountOpSignableHash(op); // get the hash + * const signature = await wallet.signMessage(hash) + * + * The signMessage method is an ethers method. It checks whether + * the hash is a string or not. If it's a string, it calls + * ethers.toUtf8Bytes to it, completing ignoring that the string + * might actually be abi-encoded (like in our case). + * + * Applying ethers.toUtf8Bytes to a string is only correct if the + * string is... a utf8 string. In our case, IT IS NOT. + * That's why we need to wrap in with ethers.getBytes to prevent + * the sign message from breaking it. + * + * If despite everything you wish to return a string instead of a Uint8Array, + * you have to wrap the hash with ethers.getBytes each time before passing it + * to signMessage. Also, the reverse method of ethers.getBytes is ethers.hexlify + * if you need to transform it back. + * + * @param op AccountOp + * @returns Uint8Array + */ +export declare function accountOpSignableHash(op: AccountOp, chainId: bigint): Uint8Array; +//# sourceMappingURL=accountOp.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.d.ts.map b/dist/src/libs/accountOp/accountOp.d.ts.map new file mode 100644 index 000000000..c0cd32dd4 --- /dev/null +++ b/dist/src/libs/accountOp/accountOp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accountOp.d.ts","sourceRoot":"","sources":["../../../../src/libs/accountOp/accountOp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.js b/dist/src/libs/accountOp/accountOp.js index 8d316cb1e..7abbf41e9 100644 --- a/dist/src/libs/accountOp/accountOp.js +++ b/dist/src/libs/accountOp/accountOp.js @@ -1,28 +1,51 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.canBroadcast = exports.isEOA = exports.callToTuple = exports.GasFeePaymentType = void 0; -var GasFeePaymentType; -(function (GasFeePaymentType) { - // when a paymaster is used, we put it in the `paidBy` instead of the accountAddr - GasFeePaymentType["ERC4337"] = "erc4337"; - GasFeePaymentType["AmbireRelayer"] = "ambireRelayer"; - GasFeePaymentType["AmbireGasTank"] = "ambireGasTank"; - // we use this in two cases: 1) Ambire account, fee paid by an EOA 2) account itself is an EAO - // when the account itself is an EOA, paymentType equals accountAddr - GasFeePaymentType["EOA"] = "eoa"; -})(GasFeePaymentType = exports.GasFeePaymentType || (exports.GasFeePaymentType = {})); -function callToTuple(call) { - return [call.to, call.value, call.data]; -} -exports.callToTuple = callToTuple; -function isEOA(op) { - if (op.gasFeePayment === null) - throw new Error('missing gasFeePayment'); - return op.gasFeePayment.paymentType === GasFeePaymentType.EOA - && op.gasFeePayment.paidBy === op.accountAddr; +import { AbiCoder, getBytes, Interface, keccak256, toBeHex } from 'ethers'; +import { SINGLETON } from '../../consts/deploy'; +import { stringify } from '../richJson/richJson'; +export var AccountOpStatus; +(function (AccountOpStatus) { + AccountOpStatus["Pending"] = "pending"; + AccountOpStatus["BroadcastedButNotConfirmed"] = "broadcasted-but-not-confirmed"; + AccountOpStatus["Success"] = "success"; + AccountOpStatus["Failure"] = "failure"; + AccountOpStatus["Rejected"] = "rejected"; + AccountOpStatus["UnknownButPastNonce"] = "unknown-but-past-nonce"; + AccountOpStatus["BroadcastButStuck"] = "broadcast-but-stuck"; +})(AccountOpStatus || (AccountOpStatus = {})); +/** + * If we want to deploy a contract, the to field of Call will actually + * be empty (undefined). In order to simulate it in a transaction or + * perform it using a smart account, we need to transform the call to + * a call to the singleton + * + * @param call + * @returns Call + */ +export function toSingletonCall(call) { + if (call.to) + return call; + const singletonABI = [ + { + inputs: [ + { internalType: 'bytes', name: '_initCode', type: 'bytes' }, + { internalType: 'bytes32', name: '_salt', type: 'bytes32' } + ], + name: 'deploy', + outputs: [{ internalType: 'address payable', name: 'createdContract', type: 'address' }], + stateMutability: 'nonpayable', + type: 'function' + } + ]; + const singletonInterface = new Interface(singletonABI); + return { + to: SINGLETON, + value: call.value, + data: singletonInterface.encodeFunctionData('deploy', [call.data, toBeHex(0, 32)]) + }; } -exports.isEOA = isEOA; -function canBroadcast(op, accountIsEOA) { +export function callToTuple(call) { + return [call.to, call.value.toString(), call.data]; +} +export function canBroadcast(op, accountIsEOA) { if (op.signingKeyAddr === null) throw new Error('missing signingKeyAddr'); if (op.signature === null) @@ -34,12 +57,80 @@ function canBroadcast(op, accountIsEOA) { if (op.nonce === null) throw new Error('missing nonce'); if (accountIsEOA) { - if (op.gasFeePayment.paymentType !== GasFeePaymentType.EOA) - throw new Error('gas fee payment type is not EOA'); + if (op.gasFeePayment.isGasTank) + throw new Error('gas fee payment with gas tank cannot be used with an EOA'); + if (op.gasFeePayment.inToken !== '0x0000000000000000000000000000000000000000') + throw new Error('gas fee payment needs to be in the native asset'); if (op.gasFeePayment.paidBy !== op.accountAddr) throw new Error('gas fee payment cannot be paid by anyone other than the EOA that signed it'); } return true; } -exports.canBroadcast = canBroadcast; +/** + * Compare two AccountOps intents. + * + * By 'intent,' we are referring to the sender of the transaction, the network it is sent on, and the included calls. + * + * Since we are comparing the intents, we exclude any other properties of the AccountOps. + */ +export function isAccountOpsIntentEqual(accountOps1, accountOps2) { + const createIntent = (accountOps) => { + return accountOps.map(({ accountAddr, networkId, calls }) => ({ + accountAddr, + networkId, + calls + })); + }; + return stringify(createIntent(accountOps1)) === stringify(createIntent(accountOps2)); +} +export function getSignableCalls(op) { + const callsToSign = op.calls.map(toSingletonCall).map(callToTuple); + if (op.activatorCall) + callsToSign.push(callToTuple(op.activatorCall)); + if (op.feeCall) + callsToSign.push(callToTuple(op.feeCall)); + return callsToSign; +} +export function getSignableCallsForBundlerEstimate(op) { + const callsToSign = getSignableCalls(op); + // add the fee call one more time when doing a bundler estimate + // this is because the feeCall during estimation is fake (approve instead + // of transfer, incorrect amount) and more ofteh than not, this causes + // a lower estimation than the real one, causing bad UX in the process + if (op.feeCall) + callsToSign.push(callToTuple(op.feeCall)); + return callsToSign; +} +export function getSignableHash(addr, chainId, nonce, calls) { + const abiCoder = new AbiCoder(); + return getBytes(keccak256(abiCoder.encode(['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'], [addr, chainId, nonce, calls]))); +} +/** + * This function returns the hash as a Uint8Array instead of string + * and the reason for this is the implementation that follows: + * + * const hash = accountOpSignableHash(op); // get the hash + * const signature = await wallet.signMessage(hash) + * + * The signMessage method is an ethers method. It checks whether + * the hash is a string or not. If it's a string, it calls + * ethers.toUtf8Bytes to it, completing ignoring that the string + * might actually be abi-encoded (like in our case). + * + * Applying ethers.toUtf8Bytes to a string is only correct if the + * string is... a utf8 string. In our case, IT IS NOT. + * That's why we need to wrap in with ethers.getBytes to prevent + * the sign message from breaking it. + * + * If despite everything you wish to return a string instead of a Uint8Array, + * you have to wrap the hash with ethers.getBytes each time before passing it + * to signMessage. Also, the reverse method of ethers.getBytes is ethers.hexlify + * if you need to transform it back. + * + * @param op AccountOp + * @returns Uint8Array + */ +export function accountOpSignableHash(op, chainId) { + return getSignableHash(op.accountAddr, chainId, op.nonce ?? 0n, getSignableCalls(op)); +} //# sourceMappingURL=accountOp.js.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.js.map b/dist/src/libs/accountOp/accountOp.js.map index 4ae50c3ef..845034432 100644 --- a/dist/src/libs/accountOp/accountOp.js.map +++ b/dist/src/libs/accountOp/accountOp.js.map @@ -1 +1 @@ -{"version":3,"file":"accountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/accountOp.ts"],"names":[],"mappings":";;;AAYA,IAAY,iBAQX;AARD,WAAY,iBAAiB;IAC3B,iFAAiF;IACjF,wCAAmB,CAAA;IACnB,oDAA+B,CAAA;IAC/B,oDAA+B,CAAA;IAC/B,8FAA8F;IAC9F,oEAAoE;IACpE,gCAAW,CAAA;AACb,CAAC,EARW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAQ5B;AAmCD,SAAgB,WAAW,CAAC,IAAU;IACpC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AAFD,kCAEC;AAED,SAAgB,KAAK,CAAC,EAAa;IACjC,IAAI,EAAE,CAAC,aAAa,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACvE,OAAO,EAAE,CAAC,aAAa,CAAC,WAAW,KAAK,iBAAiB,CAAC,GAAG;WACxD,EAAE,CAAC,aAAa,CAAC,MAAM,KAAK,EAAE,CAAC,WAAW,CAAA;AACjD,CAAC;AAJD,sBAIC;AAED,SAAgB,YAAY,CAAC,EAAa,EAAE,YAAqB;IAC/D,IAAI,EAAE,CAAC,cAAc,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACzE,IAAI,EAAE,CAAC,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAC/D,IAAI,EAAE,CAAC,aAAa,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACvE,IAAI,EAAE,CAAC,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC7D,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,YAAY,EAAE;QAChB,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,KAAK,iBAAiB,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAC9G,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,KAAK,EAAE,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;KAC9I;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAXD,oCAWC"} \ No newline at end of file +{"version":3,"file":"accountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/accountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getBytes, Interface, keccak256, toBeHex } from 'ethers'\n\nimport { SINGLETON } from '../../consts/deploy'\nimport { AccountId } from '../../interfaces/account'\n// eslint-disable-next-line import/no-cycle\nimport { Key } from '../../interfaces/keystore'\nimport { NetworkId } from '../../interfaces/network'\nimport { PaymasterService } from '../erc7677/types'\nimport { stringify } from '../richJson/richJson'\nimport { UserOperation } from '../userOperation/types'\nimport { Call } from './types'\n\n// This is an abstract representation of the gas fee payment\n// 1) it cannot contain details about maxFeePerGas/baseFee because some networks might not be aware of EIP-1559; it only cares about total amount\n// 2) it cannot contain info about the mechanism of payment (from EOA but on smart account, pure EOA paying it's fee directly, 4337 paymaster, 4337 direct, relayer, etc.)\n// This info can be inferred when needed from the account type and whether we're running in 4337 mode or not\n// 3) isGasTank and isERC4337 can both be true\n// 4) whether those values are sane will be checked in an additional function (currently `canBroadcast`); for example, this function is meant to ensure that in case of an EOA, the fee is always paid in native\nexport interface GasFeePayment {\n isERC4337: boolean\n isGasTank: boolean\n paidBy: string\n inToken: string\n // optional, because older versions of the extension did not have this stored locally\n feeTokenNetworkId?: NetworkId\n amount: bigint\n simulatedGasLimit: bigint\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n isSponsored?: boolean\n}\n\nexport enum AccountOpStatus {\n Pending = 'pending',\n BroadcastedButNotConfirmed = 'broadcasted-but-not-confirmed',\n Success = 'success',\n Failure = 'failure',\n Rejected = 'rejected',\n UnknownButPastNonce = 'unknown-but-past-nonce',\n BroadcastButStuck = 'broadcast-but-stuck'\n}\n\n// Equivalent to ERC-4337 UserOp, but more universal than it since a AccountOp can be transformed to\n// a UserOp, or to a direct EOA transaction, or relayed through the Ambire relayer\n// it is more precisely defined than a UserOp though - UserOp just has calldata and this has individual `calls`\nexport interface AccountOp {\n accountAddr: string\n networkId: NetworkId\n // this may not be defined, in case the user has not picked a key yet\n signingKeyAddr: Key['addr'] | null\n signingKeyType: Key['type'] | null\n // this may not be set in case we haven't set it yet\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint | null\n // @TODO: nonce namespace? it is dependent on gasFeePayment\n calls: Call[]\n // the feeCall is an extra call we add manually when there's a\n // relayer/paymaster transaction so that the relayer/paymaster\n // can authorize the payment\n feeCall?: Call\n // the activator call is for cases where we want to activate the EntryPoint\n // it existed previously in the UserOperation type but now it is no longer\n // limited to it as we can broadcast none ERC-4337 txn with an activatorCall\n activatorCall?: Call\n gasLimit: number | null\n signature: string | null\n gasFeePayment: GasFeePayment | null\n // This is used when we have an account recovery to finalize before executing the AccountOp,\n // And we set this to the recovery finalization AccountOp; could be used in other scenarios too in the future,\n // for example account migration (from v1 QuickAcc to v2)\n // theoretically you can recurse these (an AccountOp set as *ToExecuteBefore can have another accountOpToExecuteBefore)\n // however, in practice we only use this for recovery atm and we never have a case with more than one\n // Supporting this can done relatively easily via executeMany() for v2 accounts, and with multiple UserOps via 4337 (again v2 accs)\n accountOpToExecuteBefore: AccountOp | null\n txnId?: string\n status?: AccountOpStatus\n // in the case of ERC-4337, we need an UserOperation structure for the AccountOp\n asUserOperation?: UserOperation\n // all kinds of custom accountOp properties that are needed in specific cases\n meta?: {\n // pass the entry point authorization signature for the deploy 4337 txn\n entryPointAuthorization?: string\n paymasterService?: PaymasterService\n }\n}\n\n/**\n * If we want to deploy a contract, the to field of Call will actually\n * be empty (undefined). In order to simulate it in a transaction or\n * perform it using a smart account, we need to transform the call to\n * a call to the singleton\n *\n * @param call\n * @returns Call\n */\nexport function toSingletonCall(call: Call): Call {\n if (call.to) return call\n\n const singletonABI = [\n {\n inputs: [\n { internalType: 'bytes', name: '_initCode', type: 'bytes' },\n { internalType: 'bytes32', name: '_salt', type: 'bytes32' }\n ],\n name: 'deploy',\n outputs: [{ internalType: 'address payable', name: 'createdContract', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'function'\n }\n ]\n const singletonInterface = new Interface(singletonABI)\n return {\n to: SINGLETON,\n value: call.value,\n data: singletonInterface.encodeFunctionData('deploy', [call.data, toBeHex(0, 32)])\n }\n}\n\nexport function callToTuple(call: Call): [string, string, string] {\n return [call.to, call.value.toString(), call.data]\n}\n\nexport function canBroadcast(op: AccountOp, accountIsEOA: boolean): boolean {\n if (op.signingKeyAddr === null) throw new Error('missing signingKeyAddr')\n if (op.signature === null) throw new Error('missing signature')\n if (op.gasFeePayment === null) throw new Error('missing gasFeePayment')\n if (op.gasLimit === null) throw new Error('missing gasLimit')\n if (op.nonce === null) throw new Error('missing nonce')\n if (accountIsEOA) {\n if (op.gasFeePayment.isGasTank)\n throw new Error('gas fee payment with gas tank cannot be used with an EOA')\n if (op.gasFeePayment.inToken !== '0x0000000000000000000000000000000000000000')\n throw new Error('gas fee payment needs to be in the native asset')\n if (op.gasFeePayment.paidBy !== op.accountAddr)\n throw new Error('gas fee payment cannot be paid by anyone other than the EOA that signed it')\n }\n return true\n}\n\n/**\n * Compare two AccountOps intents.\n *\n * By 'intent,' we are referring to the sender of the transaction, the network it is sent on, and the included calls.\n *\n * Since we are comparing the intents, we exclude any other properties of the AccountOps.\n */\nexport function isAccountOpsIntentEqual(\n accountOps1: AccountOp[],\n accountOps2: AccountOp[]\n): boolean {\n const createIntent = (accountOps: AccountOp[]) => {\n return accountOps.map(({ accountAddr, networkId, calls }) => ({\n accountAddr,\n networkId,\n calls\n }))\n }\n\n return stringify(createIntent(accountOps1)) === stringify(createIntent(accountOps2))\n}\n\nexport function getSignableCalls(op: AccountOp): [string, string, string][] {\n const callsToSign = op.calls.map(toSingletonCall).map(callToTuple)\n if (op.activatorCall) callsToSign.push(callToTuple(op.activatorCall))\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableCallsForBundlerEstimate(op: AccountOp): [string, string, string][] {\n const callsToSign = getSignableCalls(op)\n // add the fee call one more time when doing a bundler estimate\n // this is because the feeCall during estimation is fake (approve instead\n // of transfer, incorrect amount) and more ofteh than not, this causes\n // a lower estimation than the real one, causing bad UX in the process\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableHash(\n addr: AccountId,\n chainId: bigint,\n nonce: bigint,\n calls: [string, string, string][]\n): Uint8Array {\n const abiCoder = new AbiCoder()\n return getBytes(\n keccak256(\n abiCoder.encode(\n ['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'],\n [addr, chainId, nonce, calls]\n )\n )\n )\n}\n\n/**\n * This function returns the hash as a Uint8Array instead of string\n * and the reason for this is the implementation that follows:\n *\n * const hash = accountOpSignableHash(op); // get the hash\n * const signature = await wallet.signMessage(hash)\n *\n * The signMessage method is an ethers method. It checks whether\n * the hash is a string or not. If it's a string, it calls\n * ethers.toUtf8Bytes to it, completing ignoring that the string\n * might actually be abi-encoded (like in our case).\n *\n * Applying ethers.toUtf8Bytes to a string is only correct if the\n * string is... a utf8 string. In our case, IT IS NOT.\n * That's why we need to wrap in with ethers.getBytes to prevent\n * the sign message from breaking it.\n *\n * If despite everything you wish to return a string instead of a Uint8Array,\n * you have to wrap the hash with ethers.getBytes each time before passing it\n * to signMessage. Also, the reverse method of ethers.getBytes is ethers.hexlify\n * if you need to transform it back.\n *\n * @param op AccountOp\n * @returns Uint8Array\n */\nexport function accountOpSignableHash(op: AccountOp, chainId: bigint): Uint8Array {\n return getSignableHash(op.accountAddr, chainId, op.nonce ?? 0n, getSignableCalls(op))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.d.ts b/dist/src/libs/accountOp/submittedAccountOp.d.ts new file mode 100644 index 000000000..1f21e50e2 --- /dev/null +++ b/dist/src/libs/accountOp/submittedAccountOp.d.ts @@ -0,0 +1,30 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { AccountOp } from './accountOp'; +export type AccountOpIdentifiedBy = { + type: 'Transaction' | 'UserOperation' | 'Relayer'; + identifier: string; + bundler?: BUNDLER; +}; +export interface SubmittedAccountOp extends AccountOp { + txnId?: string; + nonce: bigint; + success?: boolean; + timestamp: number; + isSingletonDeploy?: boolean; + identifiedBy: AccountOpIdentifiedBy; + flags?: { + hideActivityBanner?: boolean; + }; +} +export declare function isIdentifiedByTxn(identifiedBy: AccountOpIdentifiedBy): boolean; +export declare function isIdentifiedByUserOpHash(identifiedBy: AccountOpIdentifiedBy): boolean; +export declare function isIdentifiedByRelayer(identifiedBy: AccountOpIdentifiedBy): boolean; +export declare function getDappIdentifier(op: SubmittedAccountOp): string; +export declare function fetchTxnId(identifiedBy: AccountOpIdentifiedBy, network: Network, fetchFn: Fetch, callRelayer: Function, op?: AccountOp): Promise<{ + status: string; + txnId: string | null; +}>; +export declare function pollTxnId(identifiedBy: AccountOpIdentifiedBy, network: Network, fetchFn: Fetch, callRelayer: Function, failCount?: number): Promise; +//# sourceMappingURL=submittedAccountOp.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.d.ts.map b/dist/src/libs/accountOp/submittedAccountOp.d.ts.map new file mode 100644 index 000000000..808dbcd17 --- /dev/null +++ b/dist/src/libs/accountOp/submittedAccountOp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"submittedAccountOp.d.ts","sourceRoot":"","sources":["../../../../src/libs/accountOp/submittedAccountOp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AA0BvC,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS,CAAA;IACjD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,YAAY,EAAE,qBAAqB,CAAA;IACnC,KAAK,CAAC,EAAE;QACN,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,CAAA;CACF;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAE9E;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAErF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAElF;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,UAIvD;AAED,wBAAsB,UAAU,CAC9B,YAAY,EAAE,qBAAqB,EACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,QAAQ,EACrB,EAAE,CAAC,EAAE,SAAS,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA0FnD;AAED,wBAAsB,SAAS,CAC7B,YAAY,EAAE,qBAAqB,EACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,QAAQ,EACrB,SAAS,SAAI,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB"} \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.js b/dist/src/libs/accountOp/submittedAccountOp.js new file mode 100644 index 000000000..803b9cbb7 --- /dev/null +++ b/dist/src/libs/accountOp/submittedAccountOp.js @@ -0,0 +1,114 @@ +import { getBundlerByName, getDefaultBundler } from '../../services/bundlers/getBundler'; +import { fetchUserOp } from '../../services/explorers/jiffyscan'; +export function isIdentifiedByTxn(identifiedBy) { + return identifiedBy.type === 'Transaction'; +} +export function isIdentifiedByUserOpHash(identifiedBy) { + return identifiedBy.type === 'UserOperation'; +} +export function isIdentifiedByRelayer(identifiedBy) { + return identifiedBy.type === 'Relayer'; +} +export function getDappIdentifier(op) { + let hash = `${op.identifiedBy.type}:${op.identifiedBy.identifier}`; + if (op.identifiedBy?.bundler) + hash = `${hash}:${op.identifiedBy.bundler}`; + return hash; +} +export async function fetchTxnId(identifiedBy, network, fetchFn, callRelayer, op) { + if (isIdentifiedByTxn(identifiedBy)) + return { + status: 'success', + txnId: identifiedBy.identifier + }; + if (isIdentifiedByUserOpHash(identifiedBy)) { + const userOpHash = identifiedBy.identifier; + const bundler = identifiedBy.bundler + ? getBundlerByName(identifiedBy.bundler) + : getDefaultBundler(network); + const [response, bundlerResult] = await Promise.all([ + fetchUserOp(userOpHash, fetchFn), + bundler.getStatus(network, userOpHash) + ]); + if (bundlerResult.status === 'rejected') + return { + status: 'rejected', + txnId: null + }; + if (bundlerResult.transactionHash) + return { + status: 'success', + txnId: bundlerResult.transactionHash + }; + // on custom networks the response is null + if (!response) + return { + status: 'not_found', + txnId: null + }; + // nothing we can do if we don't have information + if (response.status !== 200) + return { + status: 'not_found', + txnId: null + }; + const data = await response.json(); + const userOps = data.userOps; + // if there are not user ops, it means the userOpHash is not + // indexed, yet, so we wait + if (userOps.length) + return { + status: 'success', + txnId: userOps[0].transactionHash + }; + return { + status: 'not_found', + txnId: null + }; + } + const id = identifiedBy.identifier; + let response = null; + try { + response = await callRelayer(`/v2/get-txn-id/${id}`); + } + catch (e) { + console.log(`relayer responded with an error when trying to find the txnId: ${e}`); + return { + status: 'not_found', + txnId: null + }; + } + if (!response.data.txId) { + if (op && op.txnId) + return { + status: 'success', + txnId: op.txnId + }; + return { + status: 'not_found', + txnId: null + }; + } + return { + status: 'success', + txnId: response.data.txId + }; +} +export async function pollTxnId(identifiedBy, network, fetchFn, callRelayer, failCount = 0) { + // allow 8 retries and declate fetching the txnId a failure after + if (failCount >= 8) + return null; + const fetchTxnIdResult = await fetchTxnId(identifiedBy, network, fetchFn, callRelayer); + if (fetchTxnIdResult.status === 'rejected') + return null; + if (fetchTxnIdResult.status === 'not_found') { + const delayPromise = () => new Promise((resolve) => { + setTimeout(resolve, 1500); + }); + await delayPromise(); + const increase = failCount + 1; + return pollTxnId(identifiedBy, network, fetchFn, callRelayer, increase); + } + return fetchTxnIdResult.txnId; +} +//# sourceMappingURL=submittedAccountOp.js.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.js.map b/dist/src/libs/accountOp/submittedAccountOp.js.map new file mode 100644 index 000000000..08c48d5c9 --- /dev/null +++ b/dist/src/libs/accountOp/submittedAccountOp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"submittedAccountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/submittedAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { getBundlerByName, getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { fetchUserOp } from '../../services/explorers/jiffyscan'\nimport { AccountOp } from './accountOp'\n\n/*\n * AccountOpIdentifiedBy\n * The txnId may not neceseraly be final on the moment of broadcast.\n * It is final when the type is Transaction. This is the case when we do\n * a regular EOA broadcast (including SA EOA broadcast)\n * The relayer and bundler work differently, though. The relayer may sometimes\n * decide not to return a txnId at all if it decides the current gas prices\n * are too high for the transaction. Also, it may return a txnId only to\n * replace it with another if the conditions meet. Here is an example:\n * - you broadcast a transaction on slow and the relayer returns a txnId\n * - at the same time another person broadcasts via the relayer, fast speed\n * - the relayer sees- that the second txn's chances of getting confirmed sooner\n * are higher and replaces the current one with the RBF logic\n * - at a later stage, the relayer re-broadcasts the first txn but since it's\n * a different nonce and signature, the txnId also differs\n * That's why we cannot rely on txnId for smart accounts in the relayer\n * broadcast case to fetch information about the transaction. Instead, the\n * relayer will return a database ID record of the transaction and we will be\n * refetching the txnId from the relayer until the transaction gets mined.\n *\n * The same logic is true for userOps and bundler broadcast. In the case of\n * userOps, the only difference is that we get a userOpHash instead of a\n * database ID record\n */\nexport type AccountOpIdentifiedBy = {\n type: 'Transaction' | 'UserOperation' | 'Relayer'\n identifier: string\n bundler?: BUNDLER\n}\n\nexport interface SubmittedAccountOp extends AccountOp {\n txnId?: string\n nonce: bigint\n success?: boolean\n timestamp: number\n isSingletonDeploy?: boolean\n identifiedBy: AccountOpIdentifiedBy\n flags?: {\n hideActivityBanner?: boolean\n }\n}\n\nexport function isIdentifiedByTxn(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Transaction'\n}\n\nexport function isIdentifiedByUserOpHash(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'UserOperation'\n}\n\nexport function isIdentifiedByRelayer(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Relayer'\n}\n\nexport function getDappIdentifier(op: SubmittedAccountOp) {\n let hash = `${op.identifiedBy.type}:${op.identifiedBy.identifier}`\n if (op.identifiedBy?.bundler) hash = `${hash}:${op.identifiedBy.bundler}`\n return hash\n}\n\nexport async function fetchTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n op?: AccountOp\n): Promise<{ status: string; txnId: string | null }> {\n if (isIdentifiedByTxn(identifiedBy))\n return {\n status: 'success',\n txnId: identifiedBy.identifier\n }\n\n if (isIdentifiedByUserOpHash(identifiedBy)) {\n const userOpHash = identifiedBy.identifier\n\n const bundler = identifiedBy.bundler\n ? getBundlerByName(identifiedBy.bundler)\n : getDefaultBundler(network)\n\n const [response, bundlerResult]: [any, any] = await Promise.all([\n fetchUserOp(userOpHash, fetchFn),\n bundler.getStatus(network, userOpHash)\n ])\n\n if (bundlerResult.status === 'rejected')\n return {\n status: 'rejected',\n txnId: null\n }\n\n if (bundlerResult.transactionHash)\n return {\n status: 'success',\n txnId: bundlerResult.transactionHash\n }\n\n // on custom networks the response is null\n if (!response)\n return {\n status: 'not_found',\n txnId: null\n }\n\n // nothing we can do if we don't have information\n if (response.status !== 200)\n return {\n status: 'not_found',\n txnId: null\n }\n\n const data = await response.json()\n const userOps = data.userOps\n\n // if there are not user ops, it means the userOpHash is not\n // indexed, yet, so we wait\n if (userOps.length)\n return {\n status: 'success',\n txnId: userOps[0].transactionHash\n }\n\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n const id = identifiedBy.identifier\n let response = null\n try {\n response = await callRelayer(`/v2/get-txn-id/${id}`)\n } catch (e) {\n console.log(`relayer responded with an error when trying to find the txnId: ${e}`)\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n if (!response.data.txId) {\n if (op && op.txnId)\n return {\n status: 'success',\n txnId: op.txnId\n }\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n return {\n status: 'success',\n txnId: response.data.txId\n }\n}\n\nexport async function pollTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n failCount = 0\n): Promise {\n // allow 8 retries and declate fetching the txnId a failure after\n if (failCount >= 8) return null\n\n const fetchTxnIdResult = await fetchTxnId(identifiedBy, network, fetchFn, callRelayer)\n if (fetchTxnIdResult.status === 'rejected') return null\n\n if (fetchTxnIdResult.status === 'not_found') {\n const delayPromise = () =>\n new Promise((resolve) => {\n setTimeout(resolve, 1500)\n })\n await delayPromise()\n const increase = failCount + 1\n return pollTxnId(identifiedBy, network, fetchFn, callRelayer, increase)\n }\n\n return fetchTxnIdResult.txnId\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/types.d.ts b/dist/src/libs/accountOp/types.d.ts new file mode 100644 index 000000000..5e7c25078 --- /dev/null +++ b/dist/src/libs/accountOp/types.d.ts @@ -0,0 +1,9 @@ +import { Calls, UserRequest } from '../../interfaces/userRequest'; +export interface Call { + to: string; + value: bigint; + data: string; + fromUserRequestId?: UserRequest['id']; + id?: Calls['calls'][number]['id']; +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/types.d.ts.map b/dist/src/libs/accountOp/types.d.ts.map new file mode 100644 index 000000000..5c8aa06f2 --- /dev/null +++ b/dist/src/libs/accountOp/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/accountOp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAEjE,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IAIZ,iBAAiB,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACrC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;CAClC"} \ No newline at end of file diff --git a/dist/src/libs/accountOp/types.js b/dist/src/libs/accountOp/types.js new file mode 100644 index 000000000..718fd38ae --- /dev/null +++ b/dist/src/libs/accountOp/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/types.js.map b/dist/src/libs/accountOp/types.js.map new file mode 100644 index 000000000..633b4cdea --- /dev/null +++ b/dist/src/libs/accountOp/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Calls, UserRequest } from '../../interfaces/userRequest'\n\nexport interface Call {\n to: string\n value: bigint\n data: string\n // if this call is associated with a particular user request\n // multiple calls can be associated with the same user request, for example\n // when a batching request is made\n fromUserRequestId?: UserRequest['id']\n id?: Calls['calls'][number]['id']\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.d.ts b/dist/src/libs/accountState/accountState.d.ts new file mode 100644 index 000000000..6c9959f3d --- /dev/null +++ b/dist/src/libs/accountState/accountState.d.ts @@ -0,0 +1,5 @@ +import { Provider } from 'ethers'; +import { Account, AccountOnchainState } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +export declare function getAccountState(provider: Provider, network: Network, accounts: Account[], blockTag?: string | number): Promise; +//# sourceMappingURL=accountState.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.d.ts.map b/dist/src/libs/accountState/accountState.d.ts.map new file mode 100644 index 000000000..c9708091f --- /dev/null +++ b/dist/src/libs/accountState/accountState.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accountState.d.ts","sourceRoot":"","sources":["../../../../src/libs/accountState/accountState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIjC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,GAAE,MAAM,GAAG,MAAiB,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA6EhC"} \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.js b/dist/src/libs/accountState/accountState.js index ae117b5a1..7f031e8a1 100644 --- a/dist/src/libs/accountState/accountState.js +++ b/dist/src/libs/accountState/accountState.js @@ -1,87 +1,55 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getAccountState = void 0; -const AmbireAccountState_json_1 = __importDefault(require("../../../contracts/compiled/AmbireAccountState.json")); -const account_1 = require("../account/account"); -const deployless_1 = require("../deployless/deployless"); -const deploy_1 = require("../../consts/deploy"); -async function getAccountState(provider, network, accounts, blockTag = 'latest') { - const deploylessAccountState = (0, deployless_1.fromDescriptor)(provider, AmbireAccountState_json_1.default, !network.rpcNoStateOverride); +import AmbireAccountState from '../../../contracts/compiled/AmbireAccountState.json'; +import { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT, MAX_UINT256 } from '../../consts/deploy'; +import { getAccountDeployParams, isSmartAccount } from '../account/account'; +import { fromDescriptor } from '../deployless/deployless'; +export async function getAccountState(provider, network, accounts, blockTag = 'latest') { + const deploylessAccountState = fromDescriptor(provider, AmbireAccountState, !network.rpcNoStateOverride); const args = accounts.map((account) => { - const associatedKeys = network?.erc4337?.enabled && - !account.associatedKeys.includes(network?.erc4337?.entryPointAddr) - ? [...account.associatedKeys, network?.erc4337?.entryPointAddr] + const associatedKeys = network?.erc4337?.enabled && !account.associatedKeys.includes(ERC_4337_ENTRYPOINT) + ? [...account.associatedKeys, ERC_4337_ENTRYPOINT] : account.associatedKeys; return [ account.addr, associatedKeys, ...(account.creation == null ? ['0x0000000000000000000000000000000000000000', '0x'] - : (0, account_1.getAccountDeployParams)(account)), - network?.erc4337?.enabled - ? network?.erc4337?.entryPointAddr - : '0x0000000000000000000000000000000000000000' + : getAccountDeployParams(account)), + network?.erc4337?.enabled ? ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000' ]; }); - const [accountStateResult] = await deploylessAccountState.call('getAccountsState', [args], { - blockTag - }); + async function getEOAsNonce(eoaAccounts) { + const nonces = await Promise.all(eoaAccounts.map((addr) => provider.getTransactionCount(addr))); + return Object.assign({}, ...eoaAccounts.map((addr, index) => ({ + [addr]: BigInt(nonces[index]) + }))); + } + const [[accountStateResult], eoaNonces] = await Promise.all([ + deploylessAccountState.call('getAccountsState', [args], { + blockTag + }), + getEOAsNonce(accounts.filter((account) => !isSmartAccount(account)).map((account) => account.addr)) + ]); const result = accountStateResult.map((accResult, index) => { const associatedKeys = accResult.associatedKeyPrivileges.map((privilege, keyIndex) => { return [args[index][1][keyIndex], privilege]; }); const res = { accountAddr: accounts[index].addr, - nonce: network?.erc4337?.enabled && accResult.erc4337Nonce < deploy_1.MAX_UINT256 - ? accResult.erc4337Nonce - : accResult.nonce, + nonce: !isSmartAccount(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce, + erc4337Nonce: accResult.erc4337Nonce, isDeployed: accResult.isDeployed, associatedKeys: Object.fromEntries(associatedKeys), isV2: accResult.isV2, balance: accResult.balance, isEOA: accResult.isEOA, isErc4337Enabled: !!(network?.erc4337?.enabled && - accResult.erc4337Nonce < deploy_1.MAX_UINT256 && - associatedKeys.find((associatedKey) => associatedKey[0] === network?.erc4337?.entryPointAddr && - (associatedKey[1] === `0x${'0'.repeat(63)}1`))), + accResult.erc4337Nonce < MAX_UINT256 && + associatedKeys.find((associatedKey) => associatedKey[0] === ERC_4337_ENTRYPOINT && associatedKey[1] === ENTRY_POINT_MARKER)), + currentBlock: accResult.currentBlock, deployError: accounts[index].associatedKeys.length > 0 && accResult.associatedKeyPrivileges.length === 0 }; return res; }); return result; } -exports.getAccountState = getAccountState; -// const ethereum = networks.find((x) => x.id === 'ethereum') -// if (!ethereum) throw new Error('no eth') -// const provider = new JsonRpcProvider(ethereum.rpcUrl) -// const account = { -// addr: '0xa07D75aacEFd11b425AF7181958F0F85c312f143', -// label: '', -// pfp: '', -// associatedKeys: ['0xd6e371526cdaeE04cd8AF225D42e37Bc14688D9E'], -// creation: { -// factoryAddr: '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA', -// bytecode: -// '0x7f28d4ea8f825adb036e9b306b2269570e63d2aa5bd10751437d98ed83551ba1cd7fa57498058891e98f45f8abb85dafbcd30f3d8b3ab586dfae2e0228bbb1de7018553d602d80604d3d3981f3363d3d373d3d3d363d732a2b85eb1054d6f0c6c2e37da05ed3e5fea684ef5af43d82803e903d91602b57fd5bf3', -// salt: '0x0000000000000000000000000000000000000000000000000000000000000001' -// } -// } -// const notDeployedAccount = { -// addr: '0x6C0937c7a04487573673a47F22E4Af9e96b91ecd', -// label: '', -// pfp: '', -// associatedKeys: ['0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'], -// creation: { -// factoryAddr: '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA', -// bytecode: -// '0x7f1e7646e4695bead8bb0596679b0caf3a7ff6c4e04d2ad79103c8fa61fb6337f47fa57498058891e98f45f8abb85dafbcd30f3d8b3ab586dfae2e0228bbb1de7018553d602d80604d3d3981f3363d3d373d3d3d363d732a2b85eb1054d6f0c6c2e37da05ed3e5fea684ef5af43d82803e903d91602b57fd5bf3', -// salt: '0x0000000000000000000000000000000000000000000000000000000000000001' -// } -// } -// getAccountState(provider, ethereum, [account, notDeployedAccount]) -// .then((res: any) => console.log(JSON.stringify(res, null, 2))) -// .catch((e) => console.error('caught', e)) //# sourceMappingURL=accountState.js.map \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.js.map b/dist/src/libs/accountState/accountState.js.map index a2cfe832b..960dea7eb 100644 --- a/dist/src/libs/accountState/accountState.js.map +++ b/dist/src/libs/accountState/accountState.js.map @@ -1 +1 @@ -{"version":3,"file":"accountState.js","sourceRoot":"","sources":["../../../../src/libs/accountState/accountState.ts"],"names":[],"mappings":";;;;;;AAEA,kHAAoF;AAGpF,gDAA2D;AAC3D,yDAAyD;AACzD,gDAAiD;AAE1C,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,OAA0B,EAC1B,QAAmB,EACnB,WAA4B,QAAQ;IAEpC,MAAM,sBAAsB,GAAG,IAAA,2BAAc,EAC3C,QAAQ,EACR,iCAAkB,EAClB,CAAC,OAAO,CAAC,kBAAkB,CAC5B,CAAA;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,MAAM,cAAc,GAClB,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;YAChE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;YAC/D,CAAC,CAAC,OAAO,CAAC,cAAc,CAAA;QAE5B,OAAO;YACL,OAAO,CAAC,IAAI;YACZ,cAAc;YACd,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI;gBAC1B,CAAC,CAAC,CAAC,4CAA4C,EAAE,IAAI,CAAC;gBACtD,CAAC,CAAC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,OAAO;gBACvB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc;gBAClC,CAAC,CAAC,4CAA4C;SACjD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE;QACzF,QAAQ;KACT,CAAC,CAAA;IAEF,MAAM,MAAM,GAA0B,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE;QAC7F,MAAM,cAAc,GAAG,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAC1D,CAAC,SAAiB,EAAE,QAAgB,EAAE,EAAE;YACtC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAA;QAC9C,CAAC,CACF,CAAA;QACD,MAAM,GAAG,GAAG;YACV,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI;YACjC,KAAK,EACH,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC,YAAY,GAAG,oBAAW;gBAC/D,CAAC,CAAC,SAAS,CAAC,YAAY;gBACxB,CAAC,CAAC,SAAS,CAAC,KAAK;YACrB,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC;YAClD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,gBAAgB,EAAE,CAAC,CAAC,CAClB,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,SAAS,CAAC,YAAY,GAAG,oBAAW;gBACpC,cAAc,CAAC,IAAI,CACjB,CAAC,aAAuB,EAAE,EAAE,CAC1B,aAAa,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,OAAO,EAAE,cAAc;oBACrD,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,gBAAgB;wBACrD,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CACjD,CACF;YACD,WAAW,EACT,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC;SAC9F,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC;AAtED,0CAsEC;AAED,6DAA6D;AAC7D,2CAA2C;AAC3C,wDAAwD;AAExD,oBAAoB;AACpB,wDAAwD;AACxD,eAAe;AACf,aAAa;AACb,oEAAoE;AACpE,gBAAgB;AAChB,iEAAiE;AACjE,gBAAgB;AAChB,kQAAkQ;AAClQ,iFAAiF;AACjF,MAAM;AACN,IAAI;AAEJ,+BAA+B;AAC/B,wDAAwD;AACxD,eAAe;AACf,aAAa;AACb,oEAAoE;AACpE,gBAAgB;AAChB,iEAAiE;AACjE,gBAAgB;AAChB,kQAAkQ;AAClQ,iFAAiF;AACjF,MAAM;AACN,IAAI;AAEJ,qEAAqE;AACrE,mEAAmE;AACnE,8CAA8C"} \ No newline at end of file +{"version":3,"file":"accountState.js","sourceRoot":"","sources":["../../../../src/libs/accountState/accountState.ts"],"names":[],"mappings":"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","sourcesContent":["import { Provider } from 'ethers'\n\nimport AmbireAccountState from '../../../contracts/compiled/AmbireAccountState.json'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT, MAX_UINT256 } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { fromDescriptor } from '../deployless/deployless'\n\nexport async function getAccountState(\n provider: Provider,\n network: Network,\n accounts: Account[],\n blockTag: string | number = 'latest'\n): Promise {\n const deploylessAccountState = fromDescriptor(\n provider,\n AmbireAccountState,\n !network.rpcNoStateOverride\n )\n\n const args = accounts.map((account) => {\n const associatedKeys =\n network?.erc4337?.enabled && !account.associatedKeys.includes(ERC_4337_ENTRYPOINT)\n ? [...account.associatedKeys, ERC_4337_ENTRYPOINT]\n : account.associatedKeys\n\n return [\n account.addr,\n associatedKeys,\n ...(account.creation == null\n ? ['0x0000000000000000000000000000000000000000', '0x']\n : getAccountDeployParams(account)),\n network?.erc4337?.enabled ? ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000'\n ]\n })\n\n async function getEOAsNonce(eoaAccounts: any[]): Promise<{ [addr: string]: number }> {\n const nonces: any = await Promise.all(\n eoaAccounts.map((addr: string) => provider.getTransactionCount(addr))\n )\n return Object.assign(\n {},\n ...eoaAccounts.map((addr: string, index: string | number) => ({\n [addr]: BigInt(nonces[index])\n }))\n )\n }\n\n const [[accountStateResult], eoaNonces] = await Promise.all([\n deploylessAccountState.call('getAccountsState', [args], {\n blockTag\n }),\n getEOAsNonce(\n accounts.filter((account) => !isSmartAccount(account)).map((account) => account.addr)\n )\n ])\n\n const result: AccountOnchainState[] = accountStateResult.map((accResult: any, index: number) => {\n const associatedKeys = accResult.associatedKeyPrivileges.map(\n (privilege: string, keyIndex: number) => {\n return [args[index][1][keyIndex], privilege]\n }\n )\n\n const res = {\n accountAddr: accounts[index].addr,\n nonce: !isSmartAccount(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce,\n erc4337Nonce: accResult.erc4337Nonce,\n isDeployed: accResult.isDeployed,\n associatedKeys: Object.fromEntries(associatedKeys),\n isV2: accResult.isV2,\n balance: accResult.balance,\n isEOA: accResult.isEOA,\n isErc4337Enabled: !!(\n network?.erc4337?.enabled &&\n accResult.erc4337Nonce < MAX_UINT256 &&\n associatedKeys.find(\n (associatedKey: string[]) =>\n associatedKey[0] === ERC_4337_ENTRYPOINT && associatedKey[1] === ENTRY_POINT_MARKER\n )\n ),\n currentBlock: accResult.currentBlock,\n deployError:\n accounts[index].associatedKeys.length > 0 && accResult.associatedKeyPrivileges.length === 0\n }\n\n return res\n })\n\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/actions/actions.d.ts b/dist/src/libs/actions/actions.d.ts new file mode 100644 index 000000000..ea2e484a9 --- /dev/null +++ b/dist/src/libs/actions/actions.d.ts @@ -0,0 +1,13 @@ +import { AccountOpAction, Action } from '../../controllers/actions/actions'; +import { DappProviderRequest } from '../../interfaces/dapp'; +import { AccountOp } from '../accountOp/accountOp'; +export declare const dappRequestMethodToActionKind: (method: DappProviderRequest['method']) => string; +export declare const getAccountOpsByNetwork: (accountAddr: string, actions: Action[]) => { + [key: string]: AccountOp[]; +} | undefined; +export declare const getAccountOpActionsByNetwork: (accountAddr: string, actions: Action[]) => { + [key: string]: AccountOpAction[]; +}; +export declare const getAccountOpFromAction: (accountOpActionId: AccountOpAction['id'], actions: Action[]) => AccountOp | undefined; +export declare const messageOnNewAction: (action: Action, addType: 'queued' | 'updated') => string | null; +//# sourceMappingURL=actions.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/actions/actions.d.ts.map b/dist/src/libs/actions/actions.d.ts.map new file mode 100644 index 000000000..26e97714c --- /dev/null +++ b/dist/src/libs/actions/actions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../src/libs/actions/actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,eAAO,MAAM,6BAA6B,WAAY,mBAAmB,CAAC,QAAQ,CAAC,WAclF,CAAA;AAED,eAAO,MAAM,sBAAsB,gBACpB,MAAM,WACV,MAAM,EAAE;;aAelB,CAAA;AAED,eAAO,MAAM,4BAA4B,gBAC1B,MAAM,WACV,MAAM,EAAE;;CAalB,CAAA;AAED,eAAO,MAAM,sBAAsB,sBACd,eAAe,CAAC,IAAI,CAAC,WAC/B,MAAM,EAAE,0BAKlB,CAAA;AAED,eAAO,MAAM,kBAAkB,WAAY,MAAM,WAAW,QAAQ,GAAG,SAAS,kBAqB/E,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/actions/actions.js b/dist/src/libs/actions/actions.js new file mode 100644 index 000000000..8e54cc8c1 --- /dev/null +++ b/dist/src/libs/actions/actions.js @@ -0,0 +1,71 @@ +export const dappRequestMethodToActionKind = (method) => { + if (['call', 'calls', 'eth_sendTransaction', 'wallet_sendCalls'].includes(method)) + return 'calls'; + if ([ + 'eth_signTypedData', + 'eth_signTypedData_v1', + 'eth_signTypedData_v3', + 'eth_signTypedData_v4' + ].includes(method)) + return 'typedMessage'; + if (['personal_sign'].includes(method)) + return 'message'; + // method to camelCase + return method.replace(/_(.)/g, (m, p1) => p1.toUpperCase()); +}; +export const getAccountOpsByNetwork = (accountAddr, actions) => { + const accountOps = actions.filter((a) => a.type === 'accountOp') + .map((a) => a.accountOp) + .filter((op) => op.accountAddr === accountAddr); + if (!accountOps.length) + return undefined; + return accountOps.reduce((acc, accountOp) => { + const { networkId } = accountOp; + if (!acc[networkId]) + acc[networkId] = []; + acc[networkId].push(accountOp); + return acc; + }, {}); +}; +export const getAccountOpActionsByNetwork = (accountAddr, actions) => { + const accountOpActions = actions.filter((a) => a.type === 'accountOp').filter((action) => action.accountOp.accountAddr === accountAddr); + const actionsByNetwork = accountOpActions.reduce((acc, accountOpAction) => { + const { networkId } = accountOpAction.accountOp; + if (!acc[networkId]) + acc[networkId] = []; + acc[networkId].push(accountOpAction); + return acc; + }, {}); + return actionsByNetwork; +}; +export const getAccountOpFromAction = (accountOpActionId, actions) => { + const accountOpAction = actions.find((a) => a.id === accountOpActionId); + if (!accountOpAction) + return undefined; + return accountOpAction.accountOp; +}; +export const messageOnNewAction = (action, addType) => { + let requestType = ''; + if (action.type === 'accountOp') + requestType = 'Sign Transaction'; + if (action.type === 'signMessage') + requestType = 'Sign Message'; + if (action.type === 'dappRequest') { + if (action.userRequest.action.kind === 'dappConnect') + requestType = 'Dapp Connect'; + if (action.userRequest.action.kind === 'walletAddEthereumChain') + requestType = 'Add Chain'; + if (action.userRequest.action.kind === 'walletWatchAsset') + requestType = 'Watch Asset'; + if (action.userRequest.action.kind === 'ethGetEncryptionPublicKey') + requestType = 'Get Encryption Public Key'; + } + if (addType === 'queued') { + return `A new${requestType ? ` ${requestType} ` : ' '}request was queued.`; + } + if (addType === 'updated') { + return `${requestType ? ` ${requestType} ` : ' '}request was updated.`; + } + return null; +}; +//# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/libs/actions/actions.js.map b/dist/src/libs/actions/actions.js.map new file mode 100644 index 000000000..cbcedb76a --- /dev/null +++ b/dist/src/libs/actions/actions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/libs/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-cycle\nimport { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport const dappRequestMethodToActionKind = (method: DappProviderRequest['method']) => {\n if (['call', 'calls', 'eth_sendTransaction', 'wallet_sendCalls'].includes(method)) return 'calls'\n if (\n [\n 'eth_signTypedData',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4'\n ].includes(method)\n )\n return 'typedMessage'\n if (['personal_sign'].includes(method)) return 'message'\n // method to camelCase\n return method.replace(/_(.)/g, (m, p1) => p1.toUpperCase())\n}\n\nexport const getAccountOpsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOp[] } | undefined => {\n const accountOps = (actions.filter((a) => a.type === 'accountOp') as AccountOpAction[])\n .map((a) => a.accountOp)\n .filter((op) => op.accountAddr === accountAddr)\n\n if (!accountOps.length) return undefined\n\n return accountOps.reduce((acc: any, accountOp) => {\n const { networkId } = accountOp\n if (!acc[networkId]) acc[networkId] = []\n\n acc[networkId].push(accountOp)\n return acc\n }, {})\n}\n\nexport const getAccountOpActionsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOpAction[] } => {\n const accountOpActions = (\n actions.filter((a) => a.type === 'accountOp') as AccountOpAction[]\n ).filter((action) => action.accountOp.accountAddr === accountAddr)\n\n const actionsByNetwork = accountOpActions.reduce((acc: any, accountOpAction) => {\n const { networkId } = accountOpAction.accountOp\n if (!acc[networkId]) acc[networkId] = []\n acc[networkId].push(accountOpAction)\n return acc\n }, {})\n return actionsByNetwork\n}\n\nexport const getAccountOpFromAction = (\n accountOpActionId: AccountOpAction['id'],\n actions: Action[]\n) => {\n const accountOpAction = actions.find((a) => a.id === accountOpActionId) as AccountOpAction\n if (!accountOpAction) return undefined\n return accountOpAction.accountOp\n}\n\nexport const messageOnNewAction = (action: Action, addType: 'queued' | 'updated') => {\n let requestType = ''\n if (action.type === 'accountOp') requestType = 'Sign Transaction'\n if (action.type === 'signMessage') requestType = 'Sign Message'\n if (action.type === 'dappRequest') {\n if (action.userRequest.action.kind === 'dappConnect') requestType = 'Dapp Connect'\n if (action.userRequest.action.kind === 'walletAddEthereumChain') requestType = 'Add Chain'\n if (action.userRequest.action.kind === 'walletWatchAsset') requestType = 'Watch Asset'\n if (action.userRequest.action.kind === 'ethGetEncryptionPublicKey')\n requestType = 'Get Encryption Public Key'\n }\n\n if (addType === 'queued') {\n return `A new${requestType ? ` ${requestType} ` : ' '}request was queued.`\n }\n\n if (addType === 'updated') {\n return `${requestType ? ` ${requestType} ` : ' '}request was updated.`\n }\n\n return null\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/banners/banners.d.ts b/dist/src/libs/banners/banners.d.ts new file mode 100644 index 000000000..b9e0f7a6e --- /dev/null +++ b/dist/src/libs/banners/banners.d.ts @@ -0,0 +1,18 @@ +import { Account } from '../../interfaces/account'; +import { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'; +import { Banner } from '../../interfaces/banner'; +import { Network } from '../../interfaces/network'; +import { ActiveRoute } from '../../interfaces/swapAndBridge'; +export declare const getBridgeBanners: (activeRoutes: ActiveRoute[], accountOpActions: AccountOpAction[], networks: Network[]) => Banner[]; +export declare const getDappActionRequestsBanners: (actions: ActionFromActionsQueue[]) => Banner[]; +export declare const getAccountOpBanners: ({ accountOpActionsByNetwork, selectedAccount, accounts, networks, swapAndBridgeRoutesPendingSignature }: { + accountOpActionsByNetwork: { + [key: string]: AccountOpAction[]; + }; + selectedAccount: string; + accounts: Account[]; + networks: Network[]; + swapAndBridgeRoutesPendingSignature: ActiveRoute[]; +}) => Banner[]; +export declare const getKeySyncBanner: (addr: string, email: string, keys: string[]) => Banner; +//# sourceMappingURL=banners.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/banners/banners.d.ts.map b/dist/src/libs/banners/banners.d.ts.map new file mode 100644 index 000000000..01b7e0ed6 --- /dev/null +++ b/dist/src/libs/banners/banners.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAE5F,OAAO,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAuD5D,eAAO,MAAM,gBAAgB,iBACb,WAAW,EAAE,oBACT,eAAe,EAAE,YACzB,OAAO,EAAE,KAClB,MAAM,EAmER,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,sBAAsB,EAAE,KAAG,MAAM,EAkBtF,CAAA;AA+BD,eAAO,MAAM,mBAAmB;;;;qBAWb,MAAM;cACb,OAAO,EAAE;cACT,OAAO,EAAE;yCACkB,WAAW,EAAE;MAChD,MAAM,EA0GT,CAAA;AAED,eAAO,MAAM,gBAAgB,SAAU,MAAM,SAAS,MAAM,QAAQ,MAAM,EAAE,WAgB3E,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/banners/banners.js b/dist/src/libs/banners/banners.js new file mode 100644 index 000000000..f7b275914 --- /dev/null +++ b/dist/src/libs/banners/banners.js @@ -0,0 +1,228 @@ +import { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'; +const getBridgeBannerTitle = (routeStatus) => { + switch (routeStatus) { + case 'completed': + return 'Bridge request completed'; + case 'in-progress': + return 'Bridge request in progress'; + default: + return 'Bridge request awaiting signature'; + } +}; +const getBridgeActionText = (routeStatus, isBridgeTxn) => { + if (isBridgeTxn) { + return routeStatus === 'completed' ? 'Bridged' : 'Bridge'; + } + return routeStatus === 'completed' ? 'Swapped' : 'Swap'; +}; +const getBridgeBannerText = (route, isBridgeTxn, networks) => { + const steps = getQuoteRouteSteps(route.route.userTxs); + const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn); + const fromAssetSymbol = steps[0].fromAsset.symbol; + const toAssetSymbol = steps[steps.length - 1].toAsset.symbol; + let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`; + if (networks) { + const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId); + const toAssetNetwork = networks.find((n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId); + if (fromAssetNetwork && toAssetNetwork) { + assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`; + } + } + const stepsIndexText = `(step ${route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1} of ${route.route.totalUserTx})`; + return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`; +}; +export const getBridgeBanners = (activeRoutes, accountOpActions, networks) => { + const isBridgeTxn = (route) => route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType)); + const isRouteTurnedIntoAccountOp = (route) => { + return accountOpActions.some((action) => { + return action.accountOp.calls.some((call) => call.fromUserRequestId === route.activeRouteId || + call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` || + call.fromUserRequestId === `${route.activeRouteId}-approval`); + }); + }; + return activeRoutes + .filter(isBridgeTxn) + .filter((route) => { + if (route.routeStatus === 'failed') + return false; + if (route.routeStatus !== 'ready') + return true; + // If the route is ready to be signed, we should display the banner only if it's not turned into an account op + // because when it does get turned into an account op, there will be a different banner for that + return !isRouteTurnedIntoAccountOp(route); + }) + .map((r) => { + const actions = []; + if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') { + actions.push({ + label: 'Details', + actionName: 'open-swap-and-bridge-tab' + }); + } + if (r.routeStatus === 'completed') { + actions.push({ + label: 'Close', + actionName: 'close-bridge', + meta: { activeRouteId: r.activeRouteId } + }); + } + if (r.routeStatus === 'ready') { + const isNextTnxForBridging = r.route.currentUserTxIndex >= 1; + actions.push({ + label: 'Reject', + actionName: 'reject-bridge', + meta: { activeRouteId: r.activeRouteId } + }, { + label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open', + actionName: 'proceed-bridge', + meta: { activeRouteId: r.activeRouteId } + }); + } + return { + id: `bridge-${r.activeRouteId}`, + type: r.routeStatus === 'completed' ? 'success' : 'info', + category: `bridge-${r.routeStatus}`, + title: getBridgeBannerTitle(r.routeStatus), + text: getBridgeBannerText(r, true, networks), + actions + }; + }); +}; +export const getDappActionRequestsBanners = (actions) => { + const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type)); + if (!requests.length) + return []; + return [ + { + id: 'dapp-requests-banner', + type: 'info', + title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`, + text: '', + actions: [ + { + label: 'Open', + actionName: 'open-pending-dapp-requests' + } + ] + } + ]; +}; +const getAccountOpBannerText = (activeSwapAndBridgeRoutesForSelectedAccount, chainId, nonSwapAndBridgeTxns, networks) => { + const swapsAndBridges = []; + const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => { + return BigInt(route.route.fromChainId) === chainId; + }); + if (networkSwapAndBridgeRoutes.length) { + networkSwapAndBridgeRoutes.forEach((route) => { + const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType)); + const desc = getBridgeBannerText(route, isBridgeTxn, networks); + swapsAndBridges.push(desc); + }); + return `${swapsAndBridges.join(', ')} ${nonSwapAndBridgeTxns + ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}` + : ''}`; + } + return ''; +}; +export const getAccountOpBanners = ({ accountOpActionsByNetwork, selectedAccount, accounts, networks, swapAndBridgeRoutesPendingSignature }) => { + if (!accountOpActionsByNetwork) + return []; + const txnBanners = []; + const account = accounts.find((acc) => acc.addr === selectedAccount); + if (account?.creation) { + Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => { + actions.forEach((action) => { + const network = networks.filter((n) => n.id === netId)[0]; + const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => { + const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some((route) => route.activeRouteId === call.fromUserRequestId); + if (isSwapAndBridge) + return prev; + return prev + 1; + }, 0); + const text = getAccountOpBannerText(swapAndBridgeRoutesPendingSignature, BigInt(network.chainId), nonSwapAndBridgeTxns, networks); + txnBanners.push({ + id: `${selectedAccount}-${netId}`, + type: 'info', + category: 'pending-to-be-signed-acc-op', + title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`, + text, + actions: [ + { + label: 'Reject', + actionName: 'reject-accountOp', + meta: { + err: 'User rejected the transaction request.', + actionId: action.id, + shouldOpenNextAction: false + } + }, + { + label: 'Open', + actionName: 'open-accountOp', + meta: { actionId: action.id } + } + ] + }); + }); + }); + } + else { + Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => { + const network = networks.filter((n) => n.id === netId)[0]; + const nonSwapAndBridgeTxns = actions.reduce((prev, action) => { + action.accountOp.calls.forEach((call) => { + const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some((route) => route.activeRouteId === call.fromUserRequestId); + if (isSwapAndBridge) + return prev; + return prev + 1; + }); + return prev; + }, 0); + const text = getAccountOpBannerText(swapAndBridgeRoutesPendingSignature, BigInt(network.chainId), nonSwapAndBridgeTxns, networks); + txnBanners.push({ + id: `${selectedAccount}-${netId}`, + type: 'info', + title: `${actions.length} transaction${actions.length > 1 ? 's' : ''} waiting to be signed ${network.name ? `on ${network.name}` : ''}`, + text, + actions: [ + actions.length <= 1 + ? { + label: 'Reject', + actionName: 'reject-accountOp', + meta: { + err: 'User rejected the transaction request.', + actionId: actions[0].id + } + } + : undefined, + { + label: 'Open', + actionName: 'open-accountOp', + meta: { + actionId: actions[0].id + } + } + ].filter(Boolean) + }); + }); + } + return txnBanners; +}; +export const getKeySyncBanner = (addr, email, keys) => { + const banner = { + id: `keys-sync:${addr}:${email}`, + accountAddr: addr, + type: 'info', + title: 'Sync Key Store keys', + text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.', + actions: [ + { + label: 'Sync', + actionName: 'sync-keys', + meta: { email, keys } + } + ] + }; + return banner; +}; +//# sourceMappingURL=banners.js.map \ No newline at end of file diff --git a/dist/src/libs/banners/banners.js.map b/dist/src/libs/banners/banners.js.map new file mode 100644 index 000000000..00ec890be --- /dev/null +++ b/dist/src/libs/banners/banners.js.map @@ -0,0 +1 @@ +{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'\n// eslint-disable-next-line import/no-cycle\nimport { Action, Banner } from '../../interfaces/banner'\nimport { Network } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport { ActiveRoute } from '../../interfaces/swapAndBridge'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\nimport { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'\n\nconst getBridgeBannerTitle = (routeStatus: ActiveRoute['routeStatus']) => {\n switch (routeStatus) {\n case 'completed':\n return 'Bridge request completed'\n case 'in-progress':\n return 'Bridge request in progress'\n default:\n return 'Bridge request awaiting signature'\n }\n}\n\nconst getBridgeActionText = (routeStatus: ActiveRoute['routeStatus'], isBridgeTxn: boolean) => {\n if (isBridgeTxn) {\n return routeStatus === 'completed' ? 'Bridged' : 'Bridge'\n }\n\n return routeStatus === 'completed' ? 'Swapped' : 'Swap'\n}\n\nconst getBridgeBannerText = (route: ActiveRoute, isBridgeTxn: boolean, networks?: Network[]) => {\n const steps = getQuoteRouteSteps(route.route.userTxs)\n const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn)\n const fromAssetSymbol = steps[0].fromAsset.symbol\n const toAssetSymbol = steps[steps.length - 1].toAsset.symbol\n\n let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`\n\n if (networks) {\n const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId)\n const toAssetNetwork = networks.find(\n (n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId\n )\n if (fromAssetNetwork && toAssetNetwork) {\n assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`\n }\n }\n\n const stepsIndexText = `(step ${\n route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1\n } of ${route.route.totalUserTx})`\n\n return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`\n}\n\nexport const getBridgeBanners = (\n activeRoutes: ActiveRoute[],\n accountOpActions: AccountOpAction[],\n networks: Network[]\n): Banner[] => {\n const isBridgeTxn = (route: ActiveRoute) =>\n route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const isRouteTurnedIntoAccountOp = (route: ActiveRoute) => {\n return accountOpActions.some((action) => {\n return action.accountOp.calls.some(\n (call) =>\n call.fromUserRequestId === route.activeRouteId ||\n call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` ||\n call.fromUserRequestId === `${route.activeRouteId}-approval`\n )\n })\n }\n\n return activeRoutes\n .filter(isBridgeTxn)\n .filter((route) => {\n if (route.routeStatus === 'failed') return false\n if (route.routeStatus !== 'ready') return true\n // If the route is ready to be signed, we should display the banner only if it's not turned into an account op\n // because when it does get turned into an account op, there will be a different banner for that\n return !isRouteTurnedIntoAccountOp(route)\n })\n .map((r) => {\n const actions: Action[] = []\n\n if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') {\n actions.push({\n label: 'Details',\n actionName: 'open-swap-and-bridge-tab'\n })\n }\n\n if (r.routeStatus === 'completed') {\n actions.push({\n label: 'Close',\n actionName: 'close-bridge',\n meta: { activeRouteId: r.activeRouteId }\n })\n }\n\n if (r.routeStatus === 'ready') {\n const isNextTnxForBridging = r.route.currentUserTxIndex >= 1\n\n actions.push(\n {\n label: 'Reject',\n actionName: 'reject-bridge',\n meta: { activeRouteId: r.activeRouteId }\n },\n {\n label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open',\n actionName: 'proceed-bridge',\n meta: { activeRouteId: r.activeRouteId }\n }\n )\n }\n\n return {\n id: `bridge-${r.activeRouteId}`,\n type: r.routeStatus === 'completed' ? 'success' : 'info',\n category: `bridge-${r.routeStatus}`,\n title: getBridgeBannerTitle(r.routeStatus),\n text: getBridgeBannerText(r, true, networks),\n actions\n }\n })\n}\n\nexport const getDappActionRequestsBanners = (actions: ActionFromActionsQueue[]): Banner[] => {\n const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type))\n if (!requests.length) return []\n\n return [\n {\n id: 'dapp-requests-banner',\n type: 'info',\n title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`,\n text: '',\n actions: [\n {\n label: 'Open',\n actionName: 'open-pending-dapp-requests'\n }\n ]\n }\n ]\n}\n\nconst getAccountOpBannerText = (\n activeSwapAndBridgeRoutesForSelectedAccount: ActiveRoute[],\n chainId: bigint,\n nonSwapAndBridgeTxns: number,\n networks: Network[]\n) => {\n const swapsAndBridges: string[] = []\n const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => {\n return BigInt(route.route.fromChainId) === chainId\n })\n\n if (networkSwapAndBridgeRoutes.length) {\n networkSwapAndBridgeRoutes.forEach((route) => {\n const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const desc = getBridgeBannerText(route, isBridgeTxn, networks)\n\n swapsAndBridges.push(desc)\n })\n\n return `${swapsAndBridges.join(', ')} ${\n nonSwapAndBridgeTxns\n ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}`\n : ''\n }`\n }\n\n return ''\n}\n\nexport const getAccountOpBanners = ({\n accountOpActionsByNetwork,\n selectedAccount,\n accounts,\n networks,\n swapAndBridgeRoutesPendingSignature\n}: {\n accountOpActionsByNetwork: {\n [key: string]: AccountOpAction[]\n }\n\n selectedAccount: string\n accounts: Account[]\n networks: Network[]\n swapAndBridgeRoutesPendingSignature: ActiveRoute[]\n}): Banner[] => {\n if (!accountOpActionsByNetwork) return []\n const txnBanners: Banner[] = []\n\n const account = accounts.find((acc) => acc.addr === selectedAccount)\n\n if (account?.creation) {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n actions.forEach((action) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n }, 0)\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n category: 'pending-to-be-signed-acc-op',\n title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: action.id,\n shouldOpenNextAction: false\n }\n },\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: { actionId: action.id }\n }\n ]\n })\n })\n })\n } else {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = actions.reduce((prev, action) => {\n action.accountOp.calls.forEach((call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n })\n\n return prev\n }, 0)\n\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n title: `${actions.length} transaction${\n actions.length > 1 ? 's' : ''\n } waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n actions.length <= 1\n ? {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: actions[0].id\n }\n }\n : undefined,\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: {\n actionId: actions[0].id\n }\n }\n ].filter(Boolean) as Action[]\n })\n })\n }\n\n return txnBanners\n}\n\nexport const getKeySyncBanner = (addr: string, email: string, keys: string[]) => {\n const banner: Banner = {\n id: `keys-sync:${addr}:${email}`,\n accountAddr: addr,\n type: 'info',\n title: 'Sync Key Store keys',\n text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.',\n actions: [\n {\n label: 'Sync',\n actionName: 'sync-keys',\n meta: { email, keys }\n }\n ]\n }\n return banner\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/calls/calls.d.ts b/dist/src/libs/calls/calls.d.ts new file mode 100644 index 000000000..66648bf2b --- /dev/null +++ b/dist/src/libs/calls/calls.d.ts @@ -0,0 +1,4 @@ +import { Call } from '../accountOp/types'; +import { TokenResult } from '../portfolio'; +export declare function getFeeCall(feeToken: TokenResult): Call; +//# sourceMappingURL=calls.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/calls/calls.d.ts.map b/dist/src/libs/calls/calls.d.ts.map new file mode 100644 index 000000000..c97ad87f0 --- /dev/null +++ b/dist/src/libs/calls/calls.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../../../src/libs/calls/calls.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAoCtD"} \ No newline at end of file diff --git a/dist/src/libs/calls/calls.js b/dist/src/libs/calls/calls.js new file mode 100644 index 000000000..33f77bdd6 --- /dev/null +++ b/dist/src/libs/calls/calls.js @@ -0,0 +1,36 @@ +import { AbiCoder, Interface, ZeroAddress } from 'ethers'; +import ERC20 from '../../../contracts/compiled/IERC20.json'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; +export function getFeeCall(feeToken) { + // set a bigger number for gas tank / approvals so on + // L2s it could calculate the preVerificationGas better + const gasTankOrApproveAmount = 500000000n * BigInt(feeToken.decimals); + if (feeToken.flags.onGasTank) { + const abiCoder = new AbiCoder(); + return { + to: FEE_COLLECTOR, + value: 0n, + data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', gasTankOrApproveAmount, feeToken.symbol]) + }; + } + if (feeToken.address === ZeroAddress) { + // native payment + return { + to: FEE_COLLECTOR, + value: 1n, + data: '0x' + }; + } + // token payment + const ERC20Interface = new Interface(ERC20.abi); + return { + to: feeToken.address, + value: 0n, + data: ERC20Interface.encodeFunctionData('approve', [ + DEPLOYLESS_SIMULATION_FROM, + gasTankOrApproveAmount + ]) + }; +} +//# sourceMappingURL=calls.js.map \ No newline at end of file diff --git a/dist/src/libs/calls/calls.js.map b/dist/src/libs/calls/calls.js.map new file mode 100644 index 000000000..ff3910f4b --- /dev/null +++ b/dist/src/libs/calls/calls.js.map @@ -0,0 +1 @@ +{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/libs/calls/calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,KAAK,MAAM,yCAAyC,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAIhE,MAAM,UAAU,UAAU,CAAC,QAAqB;IAC9C,qDAAqD;IACrD,uDAAuD;IACvD,MAAM,sBAAsB,GAAG,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAErE,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,OAAO;YACL,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ,CAAC,MAAM,CACnB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC/B,CAAC,SAAS,EAAE,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CACrD;SACF,CAAA;KACF;IAED,IAAI,QAAQ,CAAC,OAAO,KAAK,WAAW,EAAE;QACpC,iBAAiB;QACjB,OAAO;YACL,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,IAAI;SACX,CAAA;KACF;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,OAAO;QACpB,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE;YACjD,0BAA0B;YAC1B,sBAAsB;SACvB,CAAC;KACH,CAAA;AACH,CAAC","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeCall(feeToken: TokenResult): Call {\n // set a bigger number for gas tank / approvals so on\n // L2s it could calculate the preVerificationGas better\n const gasTankOrApproveAmount = 500000000n * BigInt(feeToken.decimals)\n\n if (feeToken.flags.onGasTank) {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', gasTankOrApproveAmount, feeToken.symbol]\n )\n }\n }\n\n if (feeToken.address === ZeroAddress) {\n // native payment\n return {\n to: FEE_COLLECTOR,\n value: 1n,\n data: '0x'\n }\n }\n\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n return {\n to: feeToken.address,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('approve', [\n DEPLOYLESS_SIMULATION_FROM,\n gasTankOrApproveAmount\n ])\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/defiAddresses.d.ts b/dist/src/libs/defiPositions/defiAddresses.d.ts new file mode 100644 index 000000000..8d1fa9ef9 --- /dev/null +++ b/dist/src/libs/defiPositions/defiAddresses.d.ts @@ -0,0 +1,43 @@ +export declare const AAVE_V3: { + ethereum: { + poolAddr: string; + }; + optimism: { + poolAddr: string; + }; + arbitrum: { + poolAddr: string; + }; + base: { + poolAddr: string; + }; + polygon: { + poolAddr: string; + }; + scroll: { + poolAddr: string; + }; +}; +export declare const UNISWAP_V3: { + ethereum: { + nonfungiblePositionManagerAddr: string; + factoryAddr: string; + }; + optimism: { + nonfungiblePositionManagerAddr: string; + factoryAddr: string; + }; + arbitrum: { + nonfungiblePositionManagerAddr: string; + factoryAddr: string; + }; + base: { + nonfungiblePositionManagerAddr: string; + factoryAddr: string; + }; + polygon: { + nonfungiblePositionManagerAddr: string; + factoryAddr: string; + }; +}; +//# sourceMappingURL=defiAddresses.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/defiAddresses.d.ts.map b/dist/src/libs/defiPositions/defiAddresses.d.ts.map new file mode 100644 index 000000000..f779797c7 --- /dev/null +++ b/dist/src/libs/defiPositions/defiAddresses.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"defiAddresses.d.ts","sourceRoot":"","sources":["../../../../src/libs/defiPositions/defiAddresses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;CAoBnB,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;CAqBtB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/defiAddresses.js b/dist/src/libs/defiPositions/defiAddresses.js new file mode 100644 index 000000000..59bf08d73 --- /dev/null +++ b/dist/src/libs/defiPositions/defiAddresses.js @@ -0,0 +1,44 @@ +export const AAVE_V3 = { + ethereum: { + poolAddr: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2' + }, + optimism: { + poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD' + // poolAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88' + }, + arbitrum: { + poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD' + }, + base: { + poolAddr: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5' + }, + polygon: { + poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD' + }, + scroll: { + poolAddr: '0x11fCfe756c05AD438e312a7fd934381537D3cFfe' + } +}; +export const UNISWAP_V3 = { + ethereum: { + nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88', + factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984' + }, + optimism: { + nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88', + factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984' + }, + arbitrum: { + nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88', + factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984' + }, + base: { + nonfungiblePositionManagerAddr: '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1', + factoryAddr: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD' + }, + polygon: { + nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88', + factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984' + } +}; +//# sourceMappingURL=defiAddresses.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/defiAddresses.js.map b/dist/src/libs/defiPositions/defiAddresses.js.map new file mode 100644 index 000000000..877e64b24 --- /dev/null +++ b/dist/src/libs/defiPositions/defiAddresses.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defiAddresses.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/defiAddresses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;QACtD,yDAAyD;KAC1D;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,4CAA4C;KACvD;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,4CAA4C;KACvD;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,4CAA4C;KACvD;CACF,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,IAAI,EAAE;QACJ,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,OAAO,EAAE;QACP,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;CACF,CAAA","sourcesContent":["export const AAVE_V3 = {\n ethereum: {\n poolAddr: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2'\n },\n optimism: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n // poolAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88'\n },\n arbitrum: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n base: {\n poolAddr: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5'\n },\n polygon: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n scroll: {\n poolAddr: '0x11fCfe756c05AD438e312a7fd934381537D3cFfe'\n }\n}\n\nexport const UNISWAP_V3 = {\n ethereum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n optimism: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n arbitrum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n base: {\n nonfungiblePositionManagerAddr: '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1',\n factoryAddr: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD'\n },\n polygon: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.d.ts b/dist/src/libs/defiPositions/helpers.d.ts new file mode 100644 index 000000000..ded854604 --- /dev/null +++ b/dist/src/libs/defiPositions/helpers.d.ts @@ -0,0 +1,5 @@ +import { Price } from '../portfolio'; +declare const sortByValue: (aValue?: number, bValue?: number) => number; +declare const getAssetValue: (amount: bigint, decimals: number, priceIn: Price[]) => number | undefined; +export { sortByValue, getAssetValue }; +//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.d.ts.map b/dist/src/libs/defiPositions/helpers.d.ts.map new file mode 100644 index 000000000..18a151fe6 --- /dev/null +++ b/dist/src/libs/defiPositions/helpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/defiPositions/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,QAAA,MAAM,WAAW,YAAa,MAAM,WAAW,MAAM,WAYpD,CAAA;AAED,QAAA,MAAM,aAAa,WAAY,MAAM,YAAY,MAAM,WAAW,KAAK,EAAE,KAAG,MAAM,GAAG,SASpF,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.js b/dist/src/libs/defiPositions/helpers.js new file mode 100644 index 000000000..dfc3f8c0e --- /dev/null +++ b/dist/src/libs/defiPositions/helpers.js @@ -0,0 +1,24 @@ +import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'; +const sortByValue = (aValue, bValue) => { + if (aValue && bValue) { + return bValue - aValue; + } + if (aValue && !bValue) { + return -1; + } + if (!aValue && bValue) { + return 1; + } + return 0; +}; +const getAssetValue = (amount, decimals, priceIn) => { + if (!priceIn.length) + return undefined; + const priceInUSD = priceIn.find((p) => p.baseCurrency === 'usd')?.price; + if (!priceInUSD) + return undefined; + const assetValueString = safeTokenAmountAndNumberMultiplication(amount, decimals, priceInUSD); + return Number(assetValueString); +}; +export { sortByValue, getAssetValue }; +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.js.map b/dist/src/libs/defiPositions/helpers.js.map new file mode 100644 index 000000000..cc761a753 --- /dev/null +++ b/dist/src/libs/defiPositions/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sCAAsC,EAAE,MAAM,gCAAgC,CAAA;AAGvF,MAAM,WAAW,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,EAAE;IACvD,IAAI,MAAM,IAAI,MAAM,EAAE;QACpB,OAAO,MAAM,GAAG,MAAM,CAAA;KACvB;IACD,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB,OAAO,CAAC,CAAC,CAAA;KACV;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;QACrB,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAgB,EAAsB,EAAE;IAC/F,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,KAAK,CAAA;IACvE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAE7F,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA","sourcesContent":["import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport { Price } from '../portfolio'\n\nconst sortByValue = (aValue?: number, bValue?: number) => {\n if (aValue && bValue) {\n return bValue - aValue\n }\n if (aValue && !bValue) {\n return -1\n }\n if (!aValue && bValue) {\n return 1\n }\n\n return 0\n}\n\nconst getAssetValue = (amount: bigint, decimals: number, priceIn: Price[]): number | undefined => {\n if (!priceIn.length) return undefined\n\n const priceInUSD = priceIn.find((p) => p.baseCurrency === 'usd')?.price\n if (!priceInUSD) return undefined\n\n const assetValueString = safeTokenAmountAndNumberMultiplication(amount, decimals, priceInUSD)\n\n return Number(assetValueString)\n}\n\nexport { sortByValue, getAssetValue }\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.d.ts b/dist/src/libs/defiPositions/providers/aaveV3.d.ts new file mode 100644 index 000000000..9c9afc783 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/aaveV3.d.ts @@ -0,0 +1,5 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Network } from '../../../interfaces/network'; +import { PositionsByProvider } from '../types'; +export declare function getAAVEPositions(userAddr: string, provider: Provider | JsonRpcProvider, network: Network): Promise; +//# sourceMappingURL=aaveV3.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.d.ts.map b/dist/src/libs/defiPositions/providers/aaveV3.d.ts.map new file mode 100644 index 000000000..7866f933c --- /dev/null +++ b/dist/src/libs/defiPositions/providers/aaveV3.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveV3.d.ts","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/aaveV3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIlD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAIrD,OAAO,EAAsC,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAKlF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,eAAe,EACpC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAiKrC"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.js b/dist/src/libs/defiPositions/providers/aaveV3.js new file mode 100644 index 000000000..1308d81c8 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/aaveV3.js @@ -0,0 +1,147 @@ +import { v4 as uuidv4 } from 'uuid'; +import DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiAAVEPosition.json'; +import { fromDescriptor } from '../../deployless/deployless'; +import { AAVE_V3 } from '../defiAddresses'; +import { getAssetValue } from '../helpers'; +import { AssetType } from '../types'; +const AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; +export async function getAAVEPositions(userAddr, provider, network) { + const networkId = network.id; + if (networkId && !AAVE_V3[networkId]) + return null; + const { poolAddr } = AAVE_V3[networkId]; + const deploylessDeFiPositionsGetter = fromDescriptor(provider, DeFiPositionsDeploylessCode, network.rpcNoStateOverride); + const [[result0], [result1], [result2]] = await Promise.all([ + deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 0, 15], {}), + deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 15, 30], {}), + deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 30, 45], {}) + ]); + const accountDataRes = result0[1]; + const userAssets = [...result0[0], ...result1[0], ...result2[0]] + .map((asset) => ({ + address: asset[0], + symbol: asset[1], + balance: asset[2], + decimals: asset[3], + price: asset[4], + borrowAssetBalance: asset[5], + stableBorrowAssetBalance: asset[6], + currentLiquidityRate: asset[7], + currentVariableBorrowRate: asset[8], + currentStableBorrowRate: asset[9], + aaveAddress: asset[10], + aaveSymbol: asset[11], + aaveDecimals: asset[12], + aaveSDebtAddr: asset[13], + aaveSDebtSymbol: asset[14], + aaveSDebtDecimals: asset[15], + aaveVDebtAddr: asset[16], + aaveVDebtSymbol: asset[17], + aaveVDebtDecimals: asset[18] + })) + .filter((t) => t.balance > 0 || t.borrowAssetBalance > 0 || t.stableBorrowAssetBalance > 0); + const accountData = { + totalCollateralBase: accountDataRes[0], + totalDebtBase: accountDataRes[1], + availableBorrowsBase: accountDataRes[2], + currentLiquidationThreshold: accountDataRes[3], + ltv: accountDataRes[4], + healthFactor: accountDataRes[5] + }; + if (accountData.healthFactor === AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER) { + accountData.healthFactor = null; + } + const position = { + id: uuidv4(), + additionalData: { + healthRate: accountData.healthFactor ? Number(accountData.healthFactor) / 1e18 : null, + positionInUSD: 0, + deptInUSD: 0, + collateralInUSD: 0, + availableBorrowInUSD: Number(accountData.availableBorrowsBase) / 1e8 + }, + assets: [] + }; + position.assets = userAssets + .map((asset) => { + const balance = Number(asset.balance) / 10 ** Number(asset.decimals); + const price = Number(asset.price) / 1e8; + const borrow = (Number(asset.borrowAssetBalance) / 10 ** Number(asset.decimals)) * -1; + const stableBorrow = (Number(asset.stableBorrowAssetBalance) / 10 ** Number(asset.decimals)) * -1; + position.additionalData.positionInUSD += (balance + borrow + stableBorrow) * price; + position.additionalData.deptInUSD += borrow * price; + position.additionalData.deptInUSD += stableBorrow * price; + position.additionalData.collateralInUSD += balance * price; + const assetsResult = []; + const priceIn = [{ baseCurrency: 'usd', price }]; + if (asset.balance > 0) { + assetsResult.push({ + address: asset.address, + symbol: asset.symbol, + decimals: Number(asset.decimals), + amount: asset.balance, + priceIn, + value: getAssetValue(asset.balance, Number(asset.decimals), priceIn), + type: AssetType.Collateral, + additionalData: { + APY: Number(asset.currentLiquidityRate) / 10 ** 25 + }, + protocolAsset: { + address: asset.aaveAddress, + symbol: asset.aaveSymbol, + decimals: asset.aaveDecimals + } + }); + } + if (asset.stableBorrowAssetBalanc > 0) { + assetsResult.push({ + address: asset.address, + symbol: asset.symbol, + decimals: Number(asset.decimals), + amount: asset.stableBorrowAssetBalanc, + priceIn, + value: getAssetValue(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn), + type: AssetType.Borrow, + additionalData: { + APY: Number(asset.currentStableBorrowRate) / 10 ** 25 + }, + protocolAsset: { + address: asset.aaveSDebtAddr, + symbol: asset.aaveSDebtSymbol, + decimals: asset.aaveSDebtDecimals + } + }); + } + if (asset.borrowAssetBalance > 0) { + assetsResult.push({ + address: asset.address, + symbol: asset.symbol, + decimals: Number(asset.decimals), + amount: asset.borrowAssetBalance, + priceIn, + value: getAssetValue(asset.borrowAssetBalance, Number(asset.decimals), priceIn), + type: AssetType.Borrow, + additionalData: { + APY: Number(asset.currentVariableBorrowRate) / 10 ** 25 + }, + protocolAsset: { + address: asset.aaveVDebtAddr, + symbol: asset.aaveVDebtSymbol, + decimals: asset.aaveVDebtDecimals + } + }); + } + return assetsResult; + }) + .flat(); + if (position.additionalData.positionInUSD === 0 || !position.assets.length) + return null; + return { + providerName: 'AAVE v3', + networkId, + type: 'lending', + positions: [position], + positionInUSD: position.additionalData.positionInUSD + }; +} +//# sourceMappingURL=aaveV3.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.js.map b/dist/src/libs/defiPositions/providers/aaveV3.js.map new file mode 100644 index 000000000..6b460cc02 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/aaveV3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiAAVEPosition.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { AAVE_V3 } from '../defiAddresses'\nimport { getAssetValue } from '../helpers'\nimport { AssetType, Position, PositionAsset, PositionsByProvider } from '../types'\n\nconst AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\n\nexport async function getAAVEPositions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !AAVE_V3[networkId as keyof typeof AAVE_V3]) return null\n\n const { poolAddr } = AAVE_V3[networkId as keyof typeof AAVE_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [[result0], [result1], [result2]] = await Promise.all([\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 0, 15], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 15, 30], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 30, 45], {})\n ])\n\n const accountDataRes = result0[1]\n\n const userAssets = [...result0[0], ...result1[0], ...result2[0]]\n .map((asset: any) => ({\n address: asset[0],\n symbol: asset[1],\n balance: asset[2],\n decimals: asset[3],\n price: asset[4],\n borrowAssetBalance: asset[5],\n stableBorrowAssetBalance: asset[6],\n currentLiquidityRate: asset[7],\n currentVariableBorrowRate: asset[8],\n currentStableBorrowRate: asset[9],\n\n aaveAddress: asset[10],\n aaveSymbol: asset[11],\n aaveDecimals: asset[12],\n\n aaveSDebtAddr: asset[13],\n aaveSDebtSymbol: asset[14],\n aaveSDebtDecimals: asset[15],\n\n aaveVDebtAddr: asset[16],\n aaveVDebtSymbol: asset[17],\n aaveVDebtDecimals: asset[18]\n }))\n .filter((t: any) => t.balance > 0 || t.borrowAssetBalance > 0 || t.stableBorrowAssetBalance > 0)\n\n const accountData = {\n totalCollateralBase: accountDataRes[0],\n totalDebtBase: accountDataRes[1],\n availableBorrowsBase: accountDataRes[2],\n currentLiquidationThreshold: accountDataRes[3],\n ltv: accountDataRes[4],\n healthFactor: accountDataRes[5]\n }\n\n if (accountData.healthFactor === AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER) {\n accountData.healthFactor = null\n }\n\n const position = {\n id: uuidv4(),\n additionalData: {\n healthRate: accountData.healthFactor ? Number(accountData.healthFactor) / 1e18 : null,\n positionInUSD: 0,\n deptInUSD: 0,\n collateralInUSD: 0,\n availableBorrowInUSD: Number(accountData.availableBorrowsBase) / 1e8\n },\n assets: []\n } as Position\n\n position.assets = userAssets\n .map((asset: any) => {\n const balance = Number(asset.balance) / 10 ** Number(asset.decimals)\n const price = Number(asset.price) / 1e8\n const borrow = (Number(asset.borrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n const stableBorrow =\n (Number(asset.stableBorrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n\n position.additionalData.positionInUSD += (balance + borrow + stableBorrow) * price\n position.additionalData.deptInUSD += borrow * price\n position.additionalData.deptInUSD += stableBorrow * price\n position.additionalData.collateralInUSD += balance * price\n\n const assetsResult = []\n\n const priceIn = [{ baseCurrency: 'usd', price }]\n\n if (asset.balance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.balance,\n priceIn,\n value: getAssetValue(asset.balance, Number(asset.decimals), priceIn),\n type: AssetType.Collateral,\n additionalData: {\n APY: Number(asset.currentLiquidityRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveAddress,\n symbol: asset.aaveSymbol,\n decimals: asset.aaveDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.stableBorrowAssetBalanc > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.stableBorrowAssetBalanc,\n priceIn,\n value: getAssetValue(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentStableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveSDebtAddr,\n symbol: asset.aaveSDebtSymbol,\n decimals: asset.aaveSDebtDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.borrowAssetBalance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.borrowAssetBalance,\n priceIn,\n value: getAssetValue(asset.borrowAssetBalance, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentVariableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveVDebtAddr,\n symbol: asset.aaveVDebtSymbol,\n decimals: asset.aaveVDebtDecimals\n }\n } as PositionAsset)\n }\n\n return assetsResult\n })\n .flat()\n\n if (position.additionalData.positionInUSD === 0 || !position.assets.length) return null\n\n return {\n providerName: 'AAVE v3',\n networkId,\n type: 'lending',\n positions: [position],\n positionInUSD: position.additionalData.positionInUSD\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts new file mode 100644 index 000000000..14005bcb2 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts @@ -0,0 +1,6 @@ +import { AccountId } from '../../../../interfaces/account'; +import { RPCProviders } from '../../../../interfaces/provider'; +import { AccountState, NetworksWithPositions, NetworksWithPositionsByAccounts } from '../../types'; +declare const getAccountNetworksWithPositions: (accountId: AccountId, accountState: AccountState, oldNetworksWithPositionsByAccounts: NetworksWithPositionsByAccounts, providers: RPCProviders) => NetworksWithPositions; +export default getAccountNetworksWithPositions; +//# sourceMappingURL=networksWithPositions.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts.map b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts.map new file mode 100644 index 000000000..2ea3fc575 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"networksWithPositions.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/networksWithPositions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAElG,QAAA,MAAM,+BAA+B,cACxB,SAAS,gBACN,YAAY,sCACU,+BAA+B,aACxD,YAAY,KACtB,qBA4BF,CAAA;AAED,eAAe,+BAA+B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js new file mode 100644 index 000000000..42b9089ec --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js @@ -0,0 +1,23 @@ +const getAccountNetworksWithPositions = (accountId, accountState, oldNetworksWithPositionsByAccounts, providers) => { + const networksWithPositions = { + ...oldNetworksWithPositionsByAccounts[accountId] + }; + Object.keys(accountState).forEach((networkId) => { + if (!providers[networkId]) + return; + const isRPCDown = !providers[networkId].isWorking; + const { positionsByProvider, error, providerErrors } = accountState[networkId]; + // RPC is down or an error occurred + if (error || isRPCDown || providerErrors?.length) + return; + networksWithPositions[networkId] = positionsByProvider.reduce((networksWithPositionsByProviders, provider) => { + if (networksWithPositionsByProviders.includes(provider.providerName)) + return networksWithPositionsByProviders; + networksWithPositionsByProviders.push(provider.providerName); + return networksWithPositionsByProviders; + }, networksWithPositions[networkId] || []); + }); + return networksWithPositions; +}; +export default getAccountNetworksWithPositions; +//# sourceMappingURL=networksWithPositions.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map new file mode 100644 index 000000000..3872908e9 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"networksWithPositions.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/networksWithPositions.ts"],"names":[],"mappings":"AAIA,MAAM,+BAA+B,GAAG,CACtC,SAAoB,EACpB,YAA0B,EAC1B,kCAAmE,EACnE,SAAuB,EACA,EAAE;IACzB,MAAM,qBAAqB,GAA0B;QACnD,GAAG,kCAAkC,CAAC,SAAS,CAAC;KACjD,CAAA;IAED,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAE9E,mCAAmC;QACnC,IAAI,KAAK,IAAI,SAAS,IAAI,cAAc,EAAE,MAAM;YAAE,OAAM;QAExD,qBAAqB,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAC3D,CAAC,gCAAgC,EAAE,QAAQ,EAAE,EAAE;YAC7C,IAAI,gCAAgC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAClE,OAAO,gCAAgC,CAAA;YAEzC,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAE5D,OAAO,gCAAgC,CAAA;QACzC,CAAC,EACD,qBAAqB,CAAC,SAAS,CAAC,IAAI,EAAE,CACvC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,qBAAqB,CAAA;AAC9B,CAAC,CAAA;AAED,eAAe,+BAA+B,CAAA","sourcesContent":["import { AccountId } from '../../../../interfaces/account'\nimport { RPCProviders } from '../../../../interfaces/provider'\nimport { AccountState, NetworksWithPositions, NetworksWithPositionsByAccounts } from '../../types'\n\nconst getAccountNetworksWithPositions = (\n accountId: AccountId,\n accountState: AccountState,\n oldNetworksWithPositionsByAccounts: NetworksWithPositionsByAccounts,\n providers: RPCProviders\n): NetworksWithPositions => {\n const networksWithPositions: NetworksWithPositions = {\n ...oldNetworksWithPositionsByAccounts[accountId]\n }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const { positionsByProvider, error, providerErrors } = accountState[networkId]\n\n // RPC is down or an error occurred\n if (error || isRPCDown || providerErrors?.length) return\n\n networksWithPositions[networkId] = positionsByProvider.reduce(\n (networksWithPositionsByProviders, provider) => {\n if (networksWithPositionsByProviders.includes(provider.providerName))\n return networksWithPositionsByProviders\n\n networksWithPositionsByProviders.push(provider.providerName)\n\n return networksWithPositionsByProviders\n },\n networksWithPositions[networkId] || []\n )\n })\n\n return networksWithPositions\n}\n\nexport default getAccountNetworksWithPositions\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts b/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts new file mode 100644 index 000000000..a7b130190 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts @@ -0,0 +1,6 @@ +export declare function uniV3DataToPortfolioPosition(liquidity: bigint, sqrtPriceX96: bigint, tickLow: bigint, tickHigh: bigint): { + amount0: number; + amount1: number; + isInRage: boolean; +}; +//# sourceMappingURL=univ3Math.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts.map b/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts.map new file mode 100644 index 000000000..04378327d --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"univ3Math.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/univ3Math.ts"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;;;;EAsCjB"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js new file mode 100644 index 000000000..0486f8d23 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js @@ -0,0 +1,32 @@ +export function uniV3DataToPortfolioPosition(liquidity, sqrtPriceX96, tickLow, tickHigh) { + const Q96 = 2 ** 96; + function getTickAtSqrtPrice(sqrtPriceX96) { + const tick = Math.floor(Math.log((sqrtPriceX96 / Q96) ** 2) / Math.log(1.0001)); + return tick; + } + function getTokenAmounts(liquidity, sqrtPriceX96, tickLow, tickHigh) { + let isInRage = false; + const sqrtRatioA = Math.sqrt(1.0001 ** tickLow); + const sqrtRatioB = Math.sqrt(1.0001 ** tickHigh); + const currentTick = getTickAtSqrtPrice(sqrtPriceX96); + const sqrtPrice = sqrtPriceX96 / Q96; + let amount0 = 0; + let amount1 = 0; + if (currentTick < tickLow) { + isInRage = false; + amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB))); + } + else if (currentTick >= tickHigh) { + isInRage = false; + amount1 = Math.floor(liquidity * (sqrtRatioB - sqrtRatioA)); + } + else if (currentTick >= tickLow && currentTick < tickHigh) { + isInRage = true; + amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB))); + amount1 = Math.floor(liquidity * (sqrtPrice - sqrtRatioA)); + } + return { amount0, amount1, isInRage }; + } + return getTokenAmounts(Number(liquidity), Number(sqrtPriceX96), Number(tickLow), Number(tickHigh)); +} +//# sourceMappingURL=univ3Math.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map new file mode 100644 index 000000000..293b1de75 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map @@ -0,0 +1 @@ +{"version":3,"file":"univ3Math.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/univ3Math.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,4BAA4B,CAC1C,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;IAEhB,MAAM,GAAG,GAAQ,CAAC,IAAI,EAAE,CAAA;IAExB,SAAS,kBAAkB,CAAC,YAAoB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,eAAe,CACtB,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;QAEhB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;QAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,YAAY,GAAG,GAAG,CAAA;QACpC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,WAAW,GAAG,OAAO,EAAE;YACzB,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;SAC1F;aAAM,IAAI,WAAW,IAAI,QAAQ,EAAE;YAClC,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAA;SAC5D;aAAM,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,GAAG,QAAQ,EAAE;YAC3D,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YACvF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAA;SAC3D;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACvC,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpG,CAAC","sourcesContent":["export function uniV3DataToPortfolioPosition(\n liquidity: bigint,\n sqrtPriceX96: bigint,\n tickLow: bigint,\n tickHigh: bigint\n) {\n const Q96: any = 2 ** 96\n\n function getTickAtSqrtPrice(sqrtPriceX96: number) {\n const tick = Math.floor(Math.log((sqrtPriceX96 / Q96) ** 2) / Math.log(1.0001))\n return tick\n }\n\n function getTokenAmounts(\n liquidity: number,\n sqrtPriceX96: number,\n tickLow: number,\n tickHigh: number\n ) {\n let isInRage = false\n const sqrtRatioA = Math.sqrt(1.0001 ** tickLow)\n const sqrtRatioB = Math.sqrt(1.0001 ** tickHigh)\n const currentTick = getTickAtSqrtPrice(sqrtPriceX96)\n\n const sqrtPrice = sqrtPriceX96 / Q96\n let amount0 = 0\n let amount1 = 0\n if (currentTick < tickLow) {\n isInRage = false\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))\n } else if (currentTick >= tickHigh) {\n isInRage = false\n amount1 = Math.floor(liquidity * (sqrtRatioB - sqrtRatioA))\n } else if (currentTick >= tickLow && currentTick < tickHigh) {\n isInRage = true\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB)))\n amount1 = Math.floor(liquidity * (sqrtPrice - sqrtRatioA))\n }\n return { amount0, amount1, isInRage }\n }\n\n return getTokenAmounts(Number(liquidity), Number(sqrtPriceX96), Number(tickLow), Number(tickHigh))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.d.ts b/dist/src/libs/defiPositions/providers/index.d.ts new file mode 100644 index 000000000..0fc7be040 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/index.d.ts @@ -0,0 +1,4 @@ +import { getAAVEPositions } from './aaveV3'; +import { getUniV3Positions } from './uniV3'; +export { getUniV3Positions, getAAVEPositions }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.d.ts.map b/dist/src/libs/defiPositions/providers/index.d.ts.map new file mode 100644 index 000000000..a9e7d1d55 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.js b/dist/src/libs/defiPositions/providers/index.js new file mode 100644 index 000000000..2d84d506e --- /dev/null +++ b/dist/src/libs/defiPositions/providers/index.js @@ -0,0 +1,4 @@ +import { getAAVEPositions } from './aaveV3'; +import { getUniV3Positions } from './uniV3'; +export { getUniV3Positions, getAAVEPositions }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.js.map b/dist/src/libs/defiPositions/providers/index.js.map new file mode 100644 index 000000000..dc53efe66 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAA","sourcesContent":["import { getAAVEPositions } from './aaveV3'\nimport { getUniV3Positions } from './uniV3'\n\nexport { getUniV3Positions, getAAVEPositions }\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.d.ts b/dist/src/libs/defiPositions/providers/uniV3.d.ts new file mode 100644 index 000000000..65ac90dda --- /dev/null +++ b/dist/src/libs/defiPositions/providers/uniV3.d.ts @@ -0,0 +1,5 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Network } from '../../../interfaces/network'; +import { PositionsByProvider } from '../types'; +export declare function getUniV3Positions(userAddr: string, provider: Provider | JsonRpcProvider, network: Network): Promise; +//# sourceMappingURL=uniV3.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.d.ts.map b/dist/src/libs/defiPositions/providers/uniV3.d.ts.map new file mode 100644 index 000000000..c1e8abf79 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/uniV3.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV3.d.ts","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/uniV3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAGrD,OAAO,EAAuB,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAGnE,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,eAAe,EACpC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA4FrC"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.js b/dist/src/libs/defiPositions/providers/uniV3.js new file mode 100644 index 000000000..cab383e00 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/uniV3.js @@ -0,0 +1,85 @@ +import DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiUniswapV3Positions.json'; +import { fromDescriptor } from '../../deployless/deployless'; +import { UNISWAP_V3 } from '../defiAddresses'; +import { AssetType } from '../types'; +import { uniV3DataToPortfolioPosition } from './helpers/univ3Math'; +export async function getUniV3Positions(userAddr, provider, network) { + const networkId = network.id; + if (networkId && !UNISWAP_V3[networkId]) + return null; + const { nonfungiblePositionManagerAddr, factoryAddr } = UNISWAP_V3[networkId]; + const deploylessDeFiPositionsGetter = fromDescriptor(provider, DeFiPositionsDeploylessCode, network.rpcNoStateOverride); + const [result] = await deploylessDeFiPositionsGetter.call('getUniV3Position', [ + userAddr, + nonfungiblePositionManagerAddr, + factoryAddr + ]); + const data = result.map((asset) => ({ + positionId: asset.positionId, + token0Symbol: asset.token0Symbol, + token0Decimals: asset.token0Decimals, + token1Symbol: asset.token1Symbol, + token1Decimals: asset.token1Decimals, + feeGrowthGlobal0X128: asset.feeGrowthGlobal0X128, + positionInfo: { + nonce: asset.positionInfo.nonce, + operator: asset.positionInfo.operator, + token0: asset.positionInfo.token0, + token1: asset.positionInfo.token1, + fee: asset.positionInfo.fee, + tickLower: asset.positionInfo.tickLower, + tickUpper: asset.positionInfo.tickUpper, + liquidity: asset.positionInfo.liquidity, + feeGrowthInside0LastX128: asset.positionInfo.feeGrowthInside0LastX128, + feeGrowthInside1LastX128: asset.positionInfo.feeGrowthInside1LastX128, + tokensOwed0: asset.positionInfo.tokensOwed0, + tokensOwed1: asset.positionInfo.tokensOwed1 + }, + poolSlot0: { + sqrtPriceX96: asset.poolSlot0.sqrtPriceX96, + tick: asset.poolSlot0.tick, + observationIndex: asset.poolSlot0.observationIndex, + observationCardinality: asset.poolSlot0.observationCardinality, + observationCardinalityNext: asset.poolSlot0.observationCardinalityNext, + feeProtocol: asset.poolSlot0.feeProtocol, + unlocked: asset.poolSlot0.unlocked + } + })); + const positions = data + .map((pos) => { + const tokenAmounts = uniV3DataToPortfolioPosition(pos.positionInfo.liquidity, pos.poolSlot0.sqrtPriceX96, pos.positionInfo.tickLower, pos.positionInfo.tickUpper); + return { + id: pos.positionId.toString(), + additionalData: { + inRange: tokenAmounts.isInRage, + liquidity: pos.positionInfo.liquidity + }, + assets: [ + { + address: pos.positionInfo.token0, + symbol: pos.token0Symbol, + decimals: Number(pos.token0Decimals), + amount: BigInt(tokenAmounts.amount0), + type: AssetType.Liquidity + }, + { + address: pos.positionInfo.token1, + symbol: pos.token1Symbol, + decimals: Number(pos.token1Decimals), + amount: BigInt(tokenAmounts.amount1), + type: AssetType.Liquidity + } + ] + }; + }) + .filter((p) => p.additionalData.liquidity !== BigInt(0)); + if (positions.length === 0) + return null; + return { + providerName: 'Uniswap V3', + networkId, + type: 'liquidity-pool', + positions + }; +} +//# sourceMappingURL=uniV3.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.js.map b/dist/src/libs/defiPositions/providers/uniV3.js.map new file mode 100644 index 000000000..dfa9e5472 --- /dev/null +++ b/dist/src/libs/defiPositions/providers/uniV3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiUniswapV3Positions.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { UNISWAP_V3 } from '../defiAddresses'\nimport { AssetType, Position, PositionsByProvider } from '../types'\nimport { uniV3DataToPortfolioPosition } from './helpers/univ3Math'\n\nexport async function getUniV3Positions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]) return null\n\n const { nonfungiblePositionManagerAddr, factoryAddr } =\n UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [result] = await deploylessDeFiPositionsGetter.call('getUniV3Position', [\n userAddr,\n nonfungiblePositionManagerAddr,\n factoryAddr\n ])\n\n const data = result.map((asset: any) => ({\n positionId: asset.positionId,\n token0Symbol: asset.token0Symbol,\n token0Decimals: asset.token0Decimals,\n token1Symbol: asset.token1Symbol,\n token1Decimals: asset.token1Decimals,\n feeGrowthGlobal0X128: asset.feeGrowthGlobal0X128,\n positionInfo: {\n nonce: asset.positionInfo.nonce,\n operator: asset.positionInfo.operator,\n token0: asset.positionInfo.token0,\n token1: asset.positionInfo.token1,\n fee: asset.positionInfo.fee,\n tickLower: asset.positionInfo.tickLower,\n tickUpper: asset.positionInfo.tickUpper,\n liquidity: asset.positionInfo.liquidity,\n feeGrowthInside0LastX128: asset.positionInfo.feeGrowthInside0LastX128,\n feeGrowthInside1LastX128: asset.positionInfo.feeGrowthInside1LastX128,\n tokensOwed0: asset.positionInfo.tokensOwed0,\n tokensOwed1: asset.positionInfo.tokensOwed1\n },\n poolSlot0: {\n sqrtPriceX96: asset.poolSlot0.sqrtPriceX96,\n tick: asset.poolSlot0.tick,\n observationIndex: asset.poolSlot0.observationIndex,\n observationCardinality: asset.poolSlot0.observationCardinality,\n observationCardinalityNext: asset.poolSlot0.observationCardinalityNext,\n feeProtocol: asset.poolSlot0.feeProtocol,\n unlocked: asset.poolSlot0.unlocked\n }\n }))\n\n const positions: Position[] = data\n .map((pos: any) => {\n const tokenAmounts = uniV3DataToPortfolioPosition(\n pos.positionInfo.liquidity,\n pos.poolSlot0.sqrtPriceX96,\n pos.positionInfo.tickLower,\n pos.positionInfo.tickUpper\n )\n return {\n id: pos.positionId.toString(),\n additionalData: {\n inRange: tokenAmounts.isInRage,\n liquidity: pos.positionInfo.liquidity\n },\n assets: [\n {\n address: pos.positionInfo.token0,\n symbol: pos.token0Symbol,\n decimals: Number(pos.token0Decimals),\n amount: BigInt(tokenAmounts.amount0),\n type: AssetType.Liquidity\n },\n {\n address: pos.positionInfo.token1,\n symbol: pos.token1Symbol,\n decimals: Number(pos.token1Decimals),\n amount: BigInt(tokenAmounts.amount1),\n type: AssetType.Liquidity\n }\n ]\n }\n })\n .filter((p: Position) => p.additionalData.liquidity !== BigInt(0))\n\n if (positions.length === 0) return null\n\n return {\n providerName: 'Uniswap V3',\n networkId,\n type: 'liquidity-pool',\n positions\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.d.ts b/dist/src/libs/defiPositions/types.d.ts new file mode 100644 index 000000000..e263d89f7 --- /dev/null +++ b/dist/src/libs/defiPositions/types.d.ts @@ -0,0 +1,67 @@ +import { Network, NetworkId } from '../../interfaces/network'; +import { Price } from '../portfolio'; +export declare enum AssetType { + Liquidity = 0, + Collateral = 1, + Borrow = 2 +} +export declare enum DeFiPositionsError { + AssetPriceError = "AssetPriceError", + CriticalError = "CriticalError" +} +export type ProviderName = 'AAVE v3' | 'Uniswap V3'; +export interface PositionAsset { + address: string; + symbol: string; + decimals: number; + amount: bigint; + priceIn: Price[]; + value?: number; + type: AssetType; + additionalData?: { + [key: string]: any; + }; + protocolAsset?: { + address: string; + symbol: string; + decimals: number; + }; +} +export interface DeFiPositionsState { + [accountId: string]: AccountState; +} +export interface AccountState { + [networkId: string]: NetworkState; +} +export interface ProviderError { + providerName: ProviderName; + error: string; +} +export interface NetworkState { + positionsByProvider: PositionsByProvider[]; + isLoading: boolean; + updatedAt?: number; + error?: string | null; + providerErrors?: ProviderError[]; +} +export type NetworksWithPositions = { + [networkId: NetworkId]: ProviderName[]; +}; +export type NetworksWithPositionsByAccounts = { + [accountId: string]: NetworksWithPositions; +}; +export type PositionsByProvider = { + providerName: ProviderName; + networkId: Network['id']; + type: 'lending' | 'liquidity-pool'; + positions: Position[]; + positionInUSD?: number; +}; +export interface Position { + id: string; + assets: PositionAsset[]; + additionalData: { + [key: string]: any; + }; +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.d.ts.map b/dist/src/libs/defiPositions/types.d.ts.map new file mode 100644 index 000000000..67411f210 --- /dev/null +++ b/dist/src/libs/defiPositions/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,UAAU,IAAA;IACV,MAAM,IAAA;CACP;AAED,oBAAY,kBAAkB;IAC5B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,CAAC,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,mBAAmB,EAAE,CAAA;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,EAAE,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAA;IAClC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,cAAc,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;CACF"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.js b/dist/src/libs/defiPositions/types.js new file mode 100644 index 000000000..bd0522caa --- /dev/null +++ b/dist/src/libs/defiPositions/types.js @@ -0,0 +1,12 @@ +export var AssetType; +(function (AssetType) { + AssetType[AssetType["Liquidity"] = 0] = "Liquidity"; + AssetType[AssetType["Collateral"] = 1] = "Collateral"; + AssetType[AssetType["Borrow"] = 2] = "Borrow"; +})(AssetType || (AssetType = {})); +export var DeFiPositionsError; +(function (DeFiPositionsError) { + DeFiPositionsError["AssetPriceError"] = "AssetPriceError"; + DeFiPositionsError["CriticalError"] = "CriticalError"; +})(DeFiPositionsError || (DeFiPositionsError = {})); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.js.map b/dist/src/libs/defiPositions/types.js.map new file mode 100644 index 000000000..82584958d --- /dev/null +++ b/dist/src/libs/defiPositions/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,mDAAS,CAAA;IACT,qDAAU,CAAA;IACV,6CAAM,CAAA;AACR,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;AACjC,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { Price } from '../portfolio'\n\nexport enum AssetType {\n Liquidity,\n Collateral,\n Borrow\n}\n\nexport enum DeFiPositionsError {\n AssetPriceError = 'AssetPriceError',\n CriticalError = 'CriticalError'\n}\n\nexport type ProviderName = 'AAVE v3' | 'Uniswap V3'\n\nexport interface PositionAsset {\n address: string\n symbol: string\n decimals: number\n amount: bigint\n priceIn: Price[]\n value?: number\n type: AssetType\n additionalData?: {\n [key: string]: any\n }\n protocolAsset?: {\n address: string\n symbol: string\n decimals: number\n }\n}\n\nexport interface DeFiPositionsState {\n [accountId: string]: AccountState\n}\n\nexport interface AccountState {\n [networkId: string]: NetworkState\n}\n\nexport interface ProviderError {\n providerName: ProviderName\n error: string\n}\n\nexport interface NetworkState {\n positionsByProvider: PositionsByProvider[]\n isLoading: boolean\n updatedAt?: number\n error?: string | null\n providerErrors?: ProviderError[]\n}\n\nexport type NetworksWithPositions = {\n [networkId: NetworkId]: ProviderName[]\n}\n\nexport type NetworksWithPositionsByAccounts = {\n [accountId: string]: NetworksWithPositions\n}\n\nexport type PositionsByProvider = {\n providerName: ProviderName\n networkId: Network['id']\n type: 'lending' | 'liquidity-pool'\n positions: Position[]\n positionInUSD?: number\n}\n\nexport interface Position {\n id: string\n assets: PositionAsset[]\n additionalData: {\n [key: string]: any\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.d.ts b/dist/src/libs/deployless/compile.d.ts new file mode 100644 index 000000000..2a48139f0 --- /dev/null +++ b/dist/src/libs/deployless/compile.d.ts @@ -0,0 +1,11 @@ +interface Options { + fileName?: null | string; + contractsFolder?: null | string; +} +export declare function compile(contractName: string, options?: Options): { + abi: any; + bin: string; + binRuntime: string; +}; +export {}; +//# sourceMappingURL=compile.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.d.ts.map b/dist/src/libs/deployless/compile.d.ts.map new file mode 100644 index 000000000..b55c367b1 --- /dev/null +++ b/dist/src/libs/deployless/compile.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../../src/libs/deployless/compile.ts"],"names":[],"mappings":"AAYA,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CAChC;AASD,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY;;;;EA+DlE"} \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.js b/dist/src/libs/deployless/compile.js new file mode 100644 index 000000000..7df37d017 --- /dev/null +++ b/dist/src/libs/deployless/compile.js @@ -0,0 +1,70 @@ +import fs from 'fs'; +import path from 'path'; +// solc js doesn't support typescript so we hack it +let _solc = null; +function getSolc() { + if (!_solc) { + _solc = require('solc'); + } + return _solc; +} +// a function that compiles a contract at run time as long +// as that contract and all its includes are in the /contracts folder +// +// contractName - the name of the contract, not the file name +// options +// - fileName - if the name of the file is different than the name +// of the contract, it should be passed along as we cannot guess it +export function compile(contractName, options = {}) { + const fileName = options.fileName ? options.fileName : `${contractName}.sol`; + const contractsFolder = options.contractsFolder ? options.contractsFolder : 'contracts'; + const contractPath = path.resolve(`${__dirname}../../../../`, contractsFolder, fileName); + const contractSource = fs.readFileSync(contractPath, { encoding: 'utf8' }); + const input = { + language: 'Solidity', + sources: { + [contractName]: { + content: contractSource + } + }, + settings: { + viaIR: true, + optimizer: { + enabled: true, + runs: 1000 + }, + outputSelection: { + '*': { + '*': ['*'] + } + } + } + }; + function findImports(libPath) { + let compileFolder = libPath.indexOf('node_modules') === -1 + ? contractsFolder + : ''; + if (libPath.indexOf('contracts/libs') !== -1) { + compileFolder = ''; + } + return { + contents: fs.readFileSync(path.resolve(`${__dirname}../../../../`, compileFolder, libPath), { + encoding: 'utf8' + }) + }; + } + const output = JSON.parse(getSolc().compile(JSON.stringify(input), { import: findImports })); + if (output.errors) { + const error = output.errors.map((err) => `${err.formattedMessage} `); + throw new Error(error); + } + if (!output.contracts[contractName][contractName]) { + throw new Error(`unable to find contract named ${contractName} in output from file ${contractName}: perhaps the name of the file is different compared to the name of the contract?`); + } + return { + abi: output.contracts[contractName][contractName].abi, + bin: `0x${output.contracts[contractName][contractName].evm.bytecode.object}`, + binRuntime: `0x${output.contracts[contractName][contractName].evm.deployedBytecode.object}` // binRuntime + }; +} +//# sourceMappingURL=compile.js.map \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.js.map b/dist/src/libs/deployless/compile.js.map new file mode 100644 index 000000000..b12434f3d --- /dev/null +++ b/dist/src/libs/deployless/compile.js.map @@ -0,0 +1 @@ +{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/libs/deployless/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,mDAAmD;AACnD,IAAI,KAAK,GAAQ,IAAI,CAAA;AACrB,SAAS,OAAO;IACd,IAAI,CAAC,KAAK,EAAE;QACV,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KACxB;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAOD,0DAA0D;AAC1D,qEAAqE;AACrE,EAAE;AACF,6DAA6D;AAC7D,UAAU;AACV,oEAAoE;AACpE,mEAAmE;AACnE,MAAM,UAAU,OAAO,CAAC,YAAoB,EAAE,UAAmB,EAAE;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,MAAM,CAAA;IAC5E,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAA;IAEvF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,cAAc,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAA;IACxF,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IAE1E,MAAM,KAAK,GAAG;QACZ,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE;YACP,CAAC,YAAY,CAAC,EAAE;gBACd,OAAO,EAAE,cAAc;aACxB;SACF;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,IAAI;YACX,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,IAAI;aACX;YACD,eAAe,EAAE;gBACf,GAAG,EAAE;oBACH,GAAG,EAAE,CAAC,GAAG,CAAC;iBACX;aACF;SACF;KACF,CAAA;IAED,SAAS,WAAW,CAAC,OAAe;QAClC,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,EAAE,CAAA;QAEN,IAAI,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE;YAC5C,aAAa,GAAG,EAAE,CAAA;SACnB;QAED,OAAO;YACL,QAAQ,EAAE,EAAE,CAAC,YAAY,CACvB,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,EAChE;gBACE,QAAQ,EAAE,MAAM;aACjB,CACF;SACF,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;IAE5F,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAA;QACzE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;KACvB;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,EAAE;QACjD,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,wBAAwB,YAAY,mFAAmF,CAAC,CAAA;KACtL;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG;QACrD,GAAG,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5E,UAAU,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,aAAa;KAC1G,CAAA;AACH,CAAC","sourcesContent":["import fs from 'fs'\nimport path from 'path'\n\n// solc js doesn't support typescript so we hack it\nlet _solc: any = null\nfunction getSolc(): any {\n if (!_solc) {\n _solc = require('solc')\n }\n return _solc\n}\n\ninterface Options {\n fileName?: null | string\n contractsFolder?: null | string\n}\n\n// a function that compiles a contract at run time as long\n// as that contract and all its includes are in the /contracts folder\n//\n// contractName - the name of the contract, not the file name\n// options\n// - fileName - if the name of the file is different than the name\n// of the contract, it should be passed along as we cannot guess it\nexport function compile(contractName: string, options: Options = {}) {\n const fileName = options.fileName ? options.fileName : `${contractName}.sol`\n const contractsFolder = options.contractsFolder ? options.contractsFolder : 'contracts'\n\n const contractPath = path.resolve(`${__dirname}../../../../`, contractsFolder, fileName)\n const contractSource = fs.readFileSync(contractPath, { encoding: 'utf8' })\n\n const input = {\n language: 'Solidity',\n sources: {\n [contractName]: {\n content: contractSource\n }\n },\n settings: {\n viaIR: true,\n optimizer: {\n enabled: true,\n runs: 1000\n },\n outputSelection: {\n '*': {\n '*': ['*']\n }\n }\n }\n }\n\n function findImports(libPath: string) {\n let compileFolder = libPath.indexOf('node_modules') === -1\n ? contractsFolder\n : ''\n\n if (libPath.indexOf('contracts/libs') !== -1) {\n compileFolder = ''\n }\n\n return {\n contents: fs.readFileSync(\n path.resolve(`${__dirname}../../../../`, compileFolder, libPath),\n {\n encoding: 'utf8'\n }\n )\n }\n }\n\n const output = JSON.parse(getSolc().compile(JSON.stringify(input), { import: findImports }))\n\n if (output.errors) {\n const error = output.errors.map((err: any) => `${err.formattedMessage} `)\n throw new Error(error)\n }\n\n if (!output.contracts[contractName][contractName]) {\n throw new Error(`unable to find contract named ${contractName} in output from file ${contractName}: perhaps the name of the file is different compared to the name of the contract?`)\n }\n\n return {\n abi: output.contracts[contractName][contractName].abi,\n bin: `0x${output.contracts[contractName][contractName].evm.bytecode.object}`, // bin\n binRuntime: `0x${output.contracts[contractName][contractName].evm.deployedBytecode.object}` // binRuntime\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.d.ts b/dist/src/libs/deployless/deployless.d.ts new file mode 100644 index 000000000..8fd392f30 --- /dev/null +++ b/dist/src/libs/deployless/deployless.d.ts @@ -0,0 +1,35 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +export declare enum DeploylessMode { + Detect = 0, + ProxyContract = 1, + StateOverride = 2 +} +export type CallOptions = { + mode: DeploylessMode; + blockTag: string | number; + from?: string; + to?: string; + gasPrice?: string; + gasLimit?: string; + stateToOverride: object | null; +}; +export declare class Deployless { + private iface; + private contractBytecode; + private provider; + private isProviderInvictus; + private detectionPromise?; + private stateOverrideSupported?; + private contractRuntimeCode?; + get isLimitedAt24kbData(): boolean; + constructor(provider: JsonRpcProvider | Provider, abi: any[], code: string, codeAtRuntime?: string); + private detectStateOverride; + call(methodName: string, args: any[], opts?: Partial): Promise; +} +export declare function fromDescriptor(provider: JsonRpcProvider | Provider, desc: { + abi: any; + bin: string; + binRuntime: string; +}, supportStateOverride: boolean): Deployless; +export declare function parseErr(data: string): string | null; +//# sourceMappingURL=deployless.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.d.ts.map b/dist/src/libs/deployless/deployless.d.ts.map new file mode 100644 index 000000000..374c8008d --- /dev/null +++ b/dist/src/libs/deployless/deployless.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"deployless.d.ts","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AA+BzF,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,aAAa,IAAA;IACb,aAAa,IAAA;CACd;AACD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,cAAc,CAAA;IAEpB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B,CAAA;AASD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAW;IAGxB,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,OAAO,CAAC,QAAQ,CAA4B;IAE5C,OAAO,CAAC,kBAAkB,CAAiB;IAG3C,OAAO,CAAC,gBAAgB,CAAC,CAAe;IAExC,OAAO,CAAC,sBAAsB,CAAC,CAAS;IAIxC,OAAO,CAAC,mBAAmB,CAAC,CAAQ;IAEpC,IAAW,mBAAmB,YAE7B;gBAGC,QAAQ,EAAE,eAAe,GAAG,QAAQ,EACpC,GAAG,EAAE,GAAG,EAAE,EACV,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM;YAoBV,mBAAmB;IA6B3B,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAoE3F;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,GAAG,QAAQ,EACpC,IAAI,EAAE;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACnD,oBAAoB,EAAE,OAAO,GAC5B,UAAU,CAOZ;AAuBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+BpD"} \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.js b/dist/src/libs/deployless/deployless.js index d2101458e..382bb8e71 100644 --- a/dist/src/libs/deployless/deployless.js +++ b/dist/src/libs/deployless/deployless.js @@ -1,15 +1,9 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseErr = exports.fromDescriptor = exports.Deployless = exports.DeploylessMode = void 0; -const ethers_1 = require("ethers"); -const assert_1 = __importDefault(require("assert")); -const Deployless_json_1 = __importDefault(require("../../../contracts/compiled/Deployless.json")); +import assert from 'assert'; +import { AbiCoder, concat, getBytes, Interface } from 'ethers'; +import DeploylessCompiled from '../../../contracts/compiled/Deployless.json'; // this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call // compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17 -const deploylessProxyBin = Deployless_json_1.default.bin; +const deploylessProxyBin = DeploylessCompiled.bin; // This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself // see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e const codeOfContractCode = '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'; @@ -19,44 +13,69 @@ const codeOfContractAbi = ['function codeOf(bytes deployCode) external view']; const deployErrorSig = '0xb4f54111'; // Signature of Error(string) const errorSig = '0x08c379a0'; +// LBRouter__InvalidTokenPath +const invalidPath = '0x4feac00c'; // Signature of Panic(uint256) const panicSig = '0x4e487b71'; +// uniswap swap expired +const expiredSwap = '0x5bf6f916'; +// uniswap signature expired +const expiredSig = '0xcd21db4f'; // any made up addr would work const arbitraryAddr = '0x0000000000000000000000000000000000696969'; -const abiCoder = new ethers_1.AbiCoder(); -var DeploylessMode; +const abiCoder = new AbiCoder(); +export var DeploylessMode; (function (DeploylessMode) { DeploylessMode[DeploylessMode["Detect"] = 0] = "Detect"; DeploylessMode[DeploylessMode["ProxyContract"] = 1] = "ProxyContract"; DeploylessMode[DeploylessMode["StateOverride"] = 2] = "StateOverride"; -})(DeploylessMode || (exports.DeploylessMode = DeploylessMode = {})); +})(DeploylessMode || (DeploylessMode = {})); const defaultOptions = { mode: DeploylessMode.Detect, blockTag: 'latest', - from: undefined + from: undefined, + to: arbitraryAddr, + stateToOverride: null }; -class Deployless { +export class Deployless { + iface; + // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs + contractBytecode; + provider; + isProviderInvictus = false; + // We need to detect whether the provider supports state override + detectionPromise; + stateOverrideSupported; + // the code of the contract after it's actually deployed (or in our case, simulate-deployed) + // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df + contractRuntimeCode; get isLimitedAt24kbData() { return !this.stateOverrideSupported; } constructor(provider, abi, code, codeAtRuntime) { - assert_1.default.ok(code.startsWith('0x'), 'contract code must start with 0x'); - assert_1.default.ok(!abi.includes((x) => x.type === 'constructor'), 'contract cannot have a constructor, as it is not supported in state override mode'); + assert.ok(code.startsWith('0x'), 'contract code must start with 0x'); + assert.ok(!abi.includes((x) => x.type === 'constructor'), 'contract cannot have a constructor, as it is not supported in state override mode'); this.contractBytecode = code; this.provider = provider; - this.iface = new ethers_1.Interface(abi); + // eslint-disable-next-line no-underscore-dangle + this.isProviderInvictus = provider._getConnection().url.includes('invictus'); + this.iface = new Interface(abi); if (codeAtRuntime !== undefined) { - assert_1.default.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x'); + assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x'); this.stateOverrideSupported = true; this.contractRuntimeCode = codeAtRuntime; } } // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using async detectStateOverride() { - if (!(this.provider instanceof ethers_1.JsonRpcProvider)) { + const isJsonRpcProvider = this.provider && + typeof this.provider.send === 'function' && + // eslint-disable-next-line no-underscore-dangle + typeof this.provider._send === 'function'; + if (!isJsonRpcProvider) { throw new Error('state override mode (or auto-detect) not available unless you use JsonRpcProvider'); } - const codeOfIface = new ethers_1.Interface(codeOfContractAbi); + const codeOfIface = new Interface(codeOfContractAbi); const code = await mapError(this.provider.send('eth_call', [ { to: arbitraryAddr, @@ -66,7 +85,8 @@ class Deployless { { [arbitraryAddr]: { code: codeOfContractCode } } ])); // any response bigger than 0x is sufficient to know that state override worked - this.stateOverrideSupported = code.length > 2; + // the response would be just "0x" if state override doesn't work + this.stateOverrideSupported = code.startsWith('0x') && code.length > 2; this.contractRuntimeCode = mapResponse(code); } async call(methodName, args, opts = {}) { @@ -74,46 +94,63 @@ class Deployless { const forceProxy = opts.mode === DeploylessMode.ProxyContract; // First, start by detecting which modes are available, unless we're forcing the proxy mode // if we use state override, we do need detection to run still so it can populate contractRuntimeCode - if (!this.detectionPromise && !forceProxy && this.contractRuntimeCode === undefined) { + if (this.stateOverrideSupported && + !this.detectionPromise && + !forceProxy && + this.contractRuntimeCode === undefined) { this.detectionPromise = this.detectStateOverride(); } await this.detectionPromise; + if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) { + throw new Error('state override passed but not requested'); + } if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) { - // @TODO test this case - throw new Error('state override requested but not supported'); + throw new Error(`${methodName}: state override requested but not supported`); } const callData = this.iface.encodeFunctionData(methodName, args); + const toAddr = opts.to ?? arbitraryAddr; const callPromise = !!this.stateOverrideSupported && !forceProxy ? this.provider.send('eth_call', [ { - to: arbitraryAddr, + to: toAddr, data: callData, from: opts.from, gasPrice: opts?.gasPrice, gas: opts?.gasLimit }, opts.blockTag, - { [arbitraryAddr]: { code: this.contractRuntimeCode } } + { + [toAddr]: { code: this.contractRuntimeCode }, + ...(opts.stateToOverride || {}) + } ]) : this.provider.call({ blockTag: opts.blockTag, from: opts.from, gasPrice: opts?.gasPrice, gasLimit: opts?.gasLimit, - data: checkDataSize((0, ethers_1.concat)([ + data: checkDataSize(concat([ deploylessProxyBin, abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData]) ])) }); - const returnDataRaw = mapResponse(await mapError(callPromise)); + // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise. + // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve + // or the timeout promise will reject after 10 seconds, whichever occurs first. + const callPromisedWithResolveTimeout = Promise.race([ + callPromise, + new Promise((_resolve, reject) => { + // Custom providers may take longer to respond, so we set a longer timeout for them. + setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000); + }) + ]); + const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout)); return this.iface.decodeFunctionResult(methodName, returnDataRaw); } } -exports.Deployless = Deployless; -function fromDescriptor(provider, desc, supportStateOverride) { +export function fromDescriptor(provider, desc, supportStateOverride) { return new Deployless(provider, desc.abi, desc.bin, supportStateOverride ? desc.binRuntime : undefined); } -exports.fromDescriptor = fromDescriptor; async function mapError(callPromise) { try { return await callPromise; @@ -139,11 +176,11 @@ function mapResponse(data) { throw err; return data; } -function parseErr(data) { +export function parseErr(data) { const dataNoPrefix = data.slice(10); if (data.startsWith(panicSig)) { // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require - const num = parseInt('0x' + dataNoPrefix); + const num = parseInt(`0x${dataNoPrefix}`); if (num === 0x00) return 'generic compiler error'; if (num === 0x01) @@ -156,21 +193,30 @@ function parseErr(data) { } if (data.startsWith(errorSig)) { try { - return abiCoder.decode(['string'], '0x' + dataNoPrefix)[0]; + return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]; } catch (e) { if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix; - else - throw e; + return e; } } + if (data.startsWith(invalidPath)) { + return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'; + } + // uniswap expired error + if (data === expiredSwap) { + return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'; + } + // uniswap signature expired error + if (data.startsWith(expiredSig)) { + return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'; + } return null; } -exports.parseErr = parseErr; function checkDataSize(data) { - if ((0, ethers_1.getBytes)(data).length >= 24576) - throw new Error('24kb call data size limit reached, use StateOverride mode'); + if (getBytes(data).length >= 24576) + throw new Error('Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'); return data; } //# sourceMappingURL=deployless.js.map \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.js.map b/dist/src/libs/deployless/deployless.js.map index 132d7360d..7f695a0b2 100644 --- a/dist/src/libs/deployless/deployless.js.map +++ b/dist/src/libs/deployless/deployless.js.map @@ -1 +1 @@ -{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport { AbiCoder, concat, getBytes, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport DeploylessCompiled from '../../../contracts/compiled/Deployless.json'\n\n// this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call\n// compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17\nconst deploylessProxyBin = DeploylessCompiled.bin\n// This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself\n// see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e\nconst codeOfContractCode =\n '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'\nconst codeOfContractAbi = ['function codeOf(bytes deployCode) external view']\n\n// The custom error that both these contracts will raise in case the deploy process of the contract goes wrong\n// error DeployFailed();\nconst deployErrorSig = '0xb4f54111'\n// Signature of Error(string)\nconst errorSig = '0x08c379a0'\n// LBRouter__InvalidTokenPath\nconst invalidPath = '0x4feac00c'\n// Signature of Panic(uint256)\nconst panicSig = '0x4e487b71'\n// uniswap swap expired\nconst expiredSwap = '0x5bf6f916'\n// uniswap signature expired\nconst expiredSig = '0xcd21db4f'\n\n// any made up addr would work\nconst arbitraryAddr = '0x0000000000000000000000000000000000696969'\nconst abiCoder = new AbiCoder()\n\nexport enum DeploylessMode {\n Detect,\n ProxyContract,\n StateOverride\n}\nexport type CallOptions = {\n mode: DeploylessMode\n // Note: some RPCs don't seem to like numbers, we can use hex strings for them\n blockTag: string | number\n from?: string\n to?: string\n gasPrice?: string\n gasLimit?: string\n stateToOverride: object | null\n}\nconst defaultOptions: CallOptions = {\n mode: DeploylessMode.Detect,\n blockTag: 'latest',\n from: undefined,\n to: arbitraryAddr,\n stateToOverride: null\n}\n\nexport class Deployless {\n private iface: Interface\n\n // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs\n private contractBytecode: string\n\n private provider: JsonRpcProvider | Provider\n\n private isProviderInvictus: boolean = false\n\n // We need to detect whether the provider supports state override\n private detectionPromise?: Promise\n\n private stateOverrideSupported?: boolean\n\n // the code of the contract after it's actually deployed (or in our case, simulate-deployed)\n // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df\n private contractRuntimeCode?: string\n\n public get isLimitedAt24kbData() {\n return !this.stateOverrideSupported\n }\n\n constructor(\n provider: JsonRpcProvider | Provider,\n abi: any[],\n code: string,\n codeAtRuntime?: string\n ) {\n assert.ok(code.startsWith('0x'), 'contract code must start with 0x')\n assert.ok(\n !abi.includes((x: any) => x.type === 'constructor'),\n 'contract cannot have a constructor, as it is not supported in state override mode'\n )\n this.contractBytecode = code\n this.provider = provider\n // eslint-disable-next-line no-underscore-dangle\n this.isProviderInvictus = (provider as any)._getConnection().url.includes('invictus')\n this.iface = new Interface(abi)\n if (codeAtRuntime !== undefined) {\n assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x')\n this.stateOverrideSupported = true\n this.contractRuntimeCode = codeAtRuntime\n }\n }\n\n // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using\n private async detectStateOverride(): Promise {\n const isJsonRpcProvider =\n this.provider &&\n typeof (this.provider as JsonRpcProvider).send === 'function' &&\n // eslint-disable-next-line no-underscore-dangle\n typeof (this.provider as JsonRpcProvider)._send === 'function'\n\n if (!isJsonRpcProvider) {\n throw new Error(\n 'state override mode (or auto-detect) not available unless you use JsonRpcProvider'\n )\n }\n const codeOfIface = new Interface(codeOfContractAbi)\n const code = await mapError(\n (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: arbitraryAddr,\n data: codeOfIface.encodeFunctionData('codeOf', [this.contractBytecode])\n },\n 'latest',\n { [arbitraryAddr]: { code: codeOfContractCode } }\n ])\n )\n // any response bigger than 0x is sufficient to know that state override worked\n // the response would be just \"0x\" if state override doesn't work\n this.stateOverrideSupported = code.startsWith('0x') && code.length > 2\n this.contractRuntimeCode = mapResponse(code)\n }\n\n async call(methodName: string, args: any[], opts: Partial = {}): Promise {\n opts = { ...defaultOptions, ...opts }\n const forceProxy = opts.mode === DeploylessMode.ProxyContract\n\n // First, start by detecting which modes are available, unless we're forcing the proxy mode\n // if we use state override, we do need detection to run still so it can populate contractRuntimeCode\n if (\n this.stateOverrideSupported &&\n !this.detectionPromise &&\n !forceProxy &&\n this.contractRuntimeCode === undefined\n ) {\n this.detectionPromise = this.detectStateOverride()\n }\n await this.detectionPromise\n\n if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) {\n throw new Error('state override passed but not requested')\n }\n if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) {\n throw new Error(`${methodName}: state override requested but not supported`)\n }\n\n const callData = this.iface.encodeFunctionData(methodName, args)\n const toAddr = opts.to ?? arbitraryAddr\n const callPromise =\n !!this.stateOverrideSupported && !forceProxy\n ? (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: toAddr,\n data: callData,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gas: opts?.gasLimit\n },\n opts.blockTag,\n {\n [toAddr]: { code: this.contractRuntimeCode },\n ...(opts.stateToOverride || {})\n }\n ])\n : this.provider.call({\n blockTag: opts.blockTag,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gasLimit: opts?.gasLimit,\n data: checkDataSize(\n concat([\n deploylessProxyBin,\n abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData])\n ])\n )\n })\n\n // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise.\n // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve\n // or the timeout promise will reject after 10 seconds, whichever occurs first.\n const callPromisedWithResolveTimeout = Promise.race([\n callPromise,\n new Promise((_resolve, reject) => {\n // Custom providers may take longer to respond, so we set a longer timeout for them.\n setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000)\n })\n ])\n\n const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout))\n return this.iface.decodeFunctionResult(methodName, returnDataRaw)\n }\n}\n\nexport function fromDescriptor(\n provider: JsonRpcProvider | Provider,\n desc: { abi: any; bin: string; binRuntime: string },\n supportStateOverride: boolean\n): Deployless {\n return new Deployless(\n provider,\n desc.abi,\n desc.bin,\n supportStateOverride ? desc.binRuntime : undefined\n )\n}\n\nasync function mapError(callPromise: Promise): Promise {\n try {\n return await callPromise\n } catch (e: any) {\n // ethers v5 provider: e.error.data is usually our eth_call output in case of execution reverted\n if (e.error && e.error.data) return e.error.data\n // ethers v5 provider: unwrap the wrapping that ethers adds to this type of error in case of provider.call\n if (e.code === 'CALL_EXCEPTION' && e.error) throw e.error\n // ethers v6 provider: wrapping the error in case of execution reverted\n if (e.code === 'CALL_EXCEPTION' && e.data) return e.data\n throw e\n }\n}\n\nfunction mapResponse(data: string): string {\n if (data === deployErrorSig) throw new Error('contract deploy failed')\n const err = parseErr(data)\n if (err) throw err\n return data\n}\n\nexport function parseErr(data: string): string | null {\n const dataNoPrefix = data.slice(10)\n if (data.startsWith(panicSig)) {\n // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require\n const num = parseInt(`0x${dataNoPrefix}`)\n if (num === 0x00) return 'generic compiler error'\n if (num === 0x01) return 'solidity assert error'\n if (num === 0x11) return 'arithmetic error'\n if (num === 0x12) return 'division by zero'\n return `panic error: 0x${num.toString(16)}`\n }\n if (data.startsWith(errorSig)) {\n try {\n return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]\n } catch (e: any) {\n if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix\n return e\n }\n }\n if (data.startsWith(invalidPath)) {\n return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'\n }\n // uniswap expired error\n if (data === expiredSwap) {\n return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'\n }\n // uniswap signature expired error\n if (data.startsWith(expiredSig)) {\n return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'\n }\n return null\n}\n\nfunction checkDataSize(data: string): string {\n if (getBytes(data).length >= 24576)\n throw new Error(\n 'Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'\n )\n return data\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.d.ts b/dist/src/libs/deployless/simulateDeployCall.d.ts new file mode 100644 index 000000000..bf079f4bb --- /dev/null +++ b/dist/src/libs/deployless/simulateDeployCall.d.ts @@ -0,0 +1,6 @@ +import { JsonRpcProvider } from 'ethers'; +export declare function getSASupport(provider: JsonRpcProvider): Promise<{ + addressMatches: boolean; + supportsStateOverride: boolean; +}>; +//# sourceMappingURL=simulateDeployCall.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.d.ts.map b/dist/src/libs/deployless/simulateDeployCall.d.ts.map new file mode 100644 index 000000000..7c42d19bb --- /dev/null +++ b/dist/src/libs/deployless/simulateDeployCall.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"simulateDeployCall.d.ts","sourceRoot":"","sources":["../../../../src/libs/deployless/simulateDeployCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,QAAQ,CAAA;AAYrD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAA;CAAE,CAAC,CA8CtE"} \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.js b/dist/src/libs/deployless/simulateDeployCall.js new file mode 100644 index 000000000..cb084cb86 --- /dev/null +++ b/dist/src/libs/deployless/simulateDeployCall.js @@ -0,0 +1,49 @@ +import { ZeroAddress } from 'ethers'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import { AMBIRE_ACCOUNT_FACTORY, DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; +import { getSmartAccount, getSpoof } from '../account/account'; +import { callToTuple } from '../accountOp/accountOp'; +import { getActivatorCall } from '../userOperation/userOperation'; +import { DeploylessMode, fromDescriptor } from './deployless'; +// simulate a deployless call to the given provider. +// if the call is successful, it means Ambire smart accounts are supported +// on the given network +export async function getSASupport(provider) { + const smartAccount = await getSmartAccount([ + { + addr: DEPLOYLESS_SIMULATION_FROM, + hash: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + } + ], []); + const deploylessOptions = { + blockTag: 'latest', + from: DEPLOYLESS_SIMULATION_FROM, + // very important to send to the AMBIRE_ACCOUNT_FACTORY + // or else the SA address won't match + to: AMBIRE_ACCOUNT_FACTORY, + mode: DeploylessMode.StateOverride + }; + const deployless = fromDescriptor(provider, AmbireFactory, true); + let supportsStateOverride = true; + const result = await deployless + .call('deployAndExecute', [ + smartAccount.creation.bytecode, + smartAccount.creation.salt, + [callToTuple(getActivatorCall(smartAccount.addr))], + getSpoof(smartAccount) + ], deploylessOptions) + .catch((e) => { + if (e.message.includes('no response')) { + throw new Error('no response'); + } + // if there's an error, return the zero address indicating that + // our smart accounts will most likely not work on this chain + supportsStateOverride = false; + return [ZeroAddress]; + }); + return { + addressMatches: result[0] === smartAccount.addr, + supportsStateOverride + }; +} +//# sourceMappingURL=simulateDeployCall.js.map \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.js.map b/dist/src/libs/deployless/simulateDeployCall.js.map new file mode 100644 index 000000000..e726ca392 --- /dev/null +++ b/dist/src/libs/deployless/simulateDeployCall.js.map @@ -0,0 +1 @@ +{"version":3,"file":"simulateDeployCall.js","sourceRoot":"","sources":["../../../../src/libs/deployless/simulateDeployCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7D,oDAAoD;AACpD,0EAA0E;AAC1E,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,eAAe,CACxC;QACE;YACE,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,oEAAoE;SAC3E;KACF,EACD,EAAE,CACH,CAAA;IACD,MAAM,iBAAiB,GAAG;QACxB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,0BAA0B;QAChC,uDAAuD;QACvD,qCAAqC;QACrC,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,cAAc,CAAC,aAAa;KACnC,CAAA;IACD,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;IAChE,IAAI,qBAAqB,GAAG,IAAI,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU;SAC5B,IAAI,CACH,kBAAkB,EAClB;QACE,YAAY,CAAC,QAAS,CAAC,QAAQ;QAC/B,YAAY,CAAC,QAAS,CAAC,IAAI;QAC3B,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,YAAY,CAAC;KACvB,EACD,iBAAiB,CAClB;SACA,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;SAC/B;QAED,+DAA+D;QAC/D,6DAA6D;QAC7D,qBAAqB,GAAG,KAAK,CAAA;QAC7B,OAAO,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI;QAC/C,qBAAqB;KACtB,CAAA;AACH,CAAC","sourcesContent":["import { JsonRpcProvider, ZeroAddress } from 'ethers'\n\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { AMBIRE_ACCOUNT_FACTORY, DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { getSmartAccount, getSpoof } from '../account/account'\nimport { callToTuple } from '../accountOp/accountOp'\nimport { getActivatorCall } from '../userOperation/userOperation'\nimport { DeploylessMode, fromDescriptor } from './deployless'\n\n// simulate a deployless call to the given provider.\n// if the call is successful, it means Ambire smart accounts are supported\n// on the given network\nexport async function getSASupport(\n provider: JsonRpcProvider\n): Promise<{ addressMatches: boolean; supportsStateOverride: boolean }> {\n const smartAccount = await getSmartAccount(\n [\n {\n addr: DEPLOYLESS_SIMULATION_FROM,\n hash: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n ],\n []\n )\n const deploylessOptions = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n // very important to send to the AMBIRE_ACCOUNT_FACTORY\n // or else the SA address won't match\n to: AMBIRE_ACCOUNT_FACTORY,\n mode: DeploylessMode.StateOverride\n }\n const deployless = fromDescriptor(provider, AmbireFactory, true)\n let supportsStateOverride = true\n const result = await deployless\n .call(\n 'deployAndExecute',\n [\n smartAccount.creation!.bytecode,\n smartAccount.creation!.salt,\n [callToTuple(getActivatorCall(smartAccount.addr))],\n getSpoof(smartAccount)\n ],\n deploylessOptions\n )\n .catch((e: any) => {\n if (e.message.includes('no response')) {\n throw new Error('no response')\n }\n\n // if there's an error, return the zero address indicating that\n // our smart accounts will most likely not work on this chain\n supportsStateOverride = false\n return [ZeroAddress]\n })\n\n return {\n addressMatches: result[0] === smartAccount.addr,\n supportsStateOverride\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.d.ts b/dist/src/libs/dkim/getPublicKey.d.ts new file mode 100644 index 000000000..fabe80985 --- /dev/null +++ b/dist/src/libs/dkim/getPublicKey.d.ts @@ -0,0 +1,10 @@ +export default function getPublicKey({ domain, selector }: any): any; +/** + * A wrapper to help getPublicKey reverts when a pub key is not found. + * We don't want that + * + * @param {domain: string, selector: string} + * @returns base64encoded | null + */ +export declare function getPublicKeyIfAny({ domain, selector }: any): Promise; +//# sourceMappingURL=getPublicKey.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.d.ts.map b/dist/src/libs/dkim/getPublicKey.d.ts.map new file mode 100644 index 000000000..918c68eb5 --- /dev/null +++ b/dist/src/libs/dkim/getPublicKey.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getPublicKey.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/getPublicKey.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,OAa7D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,gBAOhE"} \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.js b/dist/src/libs/dkim/getPublicKey.js new file mode 100644 index 000000000..f83e7cc8d --- /dev/null +++ b/dist/src/libs/dkim/getPublicKey.js @@ -0,0 +1,35 @@ +/* + fetch domainkey record (nodejs) +*/ +const { promisify } = require("util"); +const getKey = promisify(require("dkim/lib/get-key")); +export default function getPublicKey({ domain, selector }) { + return getKey(domain, selector).then((key) => { + const publicKey = "-----BEGIN PUBLIC KEY-----\n" + + key.key.toString("base64") + + "\n-----END PUBLIC KEY-----"; + return { + domain, + selector, + publicKey + }; + }); +} +; +/** + * A wrapper to help getPublicKey reverts when a pub key is not found. + * We don't want that + * + * @param {domain: string, selector: string} + * @returns base64encoded | null + */ +export async function getPublicKeyIfAny({ domain, selector }) { + try { + const dkimKey = await getPublicKey({ domain, selector: selector }); + return dkimKey; + } + catch (e) { + return null; + } +} +//# sourceMappingURL=getPublicKey.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.js.map b/dist/src/libs/dkim/getPublicKey.js.map new file mode 100644 index 000000000..d51a122e1 --- /dev/null +++ b/dist/src/libs/dkim/getPublicKey.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getPublicKey.js","sourceRoot":"","sources":["../../../../src/libs/dkim/getPublicKey.ts"],"names":[],"mappings":"AAAA;;EAEE;AACF,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;QAChD,MAAM,SAAS,GACb,8BAA8B;YAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,4BAA4B,CAAC;QAE/B,OAAO;YACL,MAAM;YACN,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAAA,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC/D,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC,CAAA;QAChE,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,IAAI,CAAA;KACZ;AACH,CAAC","sourcesContent":["/*\n fetch domainkey record (nodejs)\n*/\nconst { promisify } = require(\"util\");\nconst getKey = promisify(require(\"dkim/lib/get-key\"));\n\nexport default function getPublicKey({ domain, selector }: any) {\n return getKey(domain, selector).then((key: any) => {\n const publicKey =\n \"-----BEGIN PUBLIC KEY-----\\n\" +\n key.key.toString(\"base64\") +\n \"\\n-----END PUBLIC KEY-----\";\n\n return {\n domain,\n selector,\n publicKey\n };\n });\n};\n\n/**\n * A wrapper to help getPublicKey reverts when a pub key is not found.\n * We don't want that\n *\n * @param {domain: string, selector: string}\n * @returns base64encoded | null\n */\nexport async function getPublicKeyIfAny({ domain, selector }: any) {\n try {\n const dkimKey = await getPublicKey({domain, selector: selector})\n return dkimKey\n } catch (e) {\n return null\n }\n}"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.d.ts b/dist/src/libs/dkim/isDKIM.d.ts new file mode 100644 index 000000000..daef6e840 --- /dev/null +++ b/dist/src/libs/dkim/isDKIM.d.ts @@ -0,0 +1,2 @@ +export default function isDKIM(key: any): boolean; +//# sourceMappingURL=isDKIM.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.d.ts.map b/dist/src/libs/dkim/isDKIM.d.ts.map new file mode 100644 index 000000000..44644d469 --- /dev/null +++ b/dist/src/libs/dkim/isDKIM.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"isDKIM.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/isDKIM.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAG,EAAE,GAAG,WAEtC"} \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.js b/dist/src/libs/dkim/isDKIM.js new file mode 100644 index 000000000..760d63150 --- /dev/null +++ b/dist/src/libs/dkim/isDKIM.js @@ -0,0 +1,4 @@ +export default function isDKIM(key) { + return /^(DKIM-Signature|X-Google-DKIM-Signature)/.test(key); +} +//# sourceMappingURL=isDKIM.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.js.map b/dist/src/libs/dkim/isDKIM.js.map new file mode 100644 index 000000000..91e727efb --- /dev/null +++ b/dist/src/libs/dkim/isDKIM.js.map @@ -0,0 +1 @@ +{"version":3,"file":"isDKIM.js","sourceRoot":"","sources":["../../../../src/libs/dkim/isDKIM.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAQ;IACnC,OAAO,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAChE,CAAC","sourcesContent":["export default function isDKIM(key: any) {\n return /^(DKIM-Signature|X-Google-DKIM-Signature)/.test(key)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.d.ts b/dist/src/libs/dkim/parse.d.ts new file mode 100644 index 000000000..01398a612 --- /dev/null +++ b/dist/src/libs/dkim/parse.d.ts @@ -0,0 +1,6 @@ +export declare function parse(email: any): { + header: any; + body: any; + dkims: any; +}; +//# sourceMappingURL=parse.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.d.ts.map b/dist/src/libs/dkim/parse.d.ts.map new file mode 100644 index 000000000..21bf358ad --- /dev/null +++ b/dist/src/libs/dkim/parse.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/parse.ts"],"names":[],"mappings":"AAwDA,wBAAgB,KAAK,CAAC,KAAK,EAAE,GAAG;;;;EA2C/B"} \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.js b/dist/src/libs/dkim/parse.js new file mode 100644 index 000000000..aed33c7a2 --- /dev/null +++ b/dist/src/libs/dkim/parse.js @@ -0,0 +1,76 @@ +import isDKIM from "./isDKIM"; +/* + parse email + (cross-platform) +*/ +const Signature = require("dkim-signature"); +const processHeader = require("dkim/lib/process-header"); +const processBody = require("dkim/lib/process-body"); +const emailToHeaderAndBody = (email) => { + const boundary = email.indexOf("\r\n\r\n"); + if (boundary === -1) { + throw Error("no header boundary found"); + } + const header = email.slice(0, boundary); + const body = email.slice(boundary + 4); + return { + boundary, + header, + body + }; +}; +const getDkimEntry = (dkim) => { + const [name, ...rest] = dkim.split(":"); + return { + name, + value: rest.join(":").slice(1) + }; +}; +const getDkims = (header) => { + return header + .split(/\r\n(?=[^\x20\x09]|$)/g) + .map((h, i, allHeaders) => { + if (isDKIM(h)) { + // remove DKIM headers + const headers = allHeaders.filter((v) => !isDKIM(v)); + // add one DKIM header + headers.unshift(h); + return { + entry: getDkimEntry(h), + headers + }; + } + return undefined; + }) + .filter((v) => !!v); +}; +export function parse(email) { + const { header, body } = emailToHeaderAndBody(email); + const dkims = getDkims(header).map((dkim) => { + // a new field called dara has been introduced to DKIM signature + // standarts. We add it manually as the lib does not support it + if (dkim.entry.value.indexOf('dara') !== -1) { + Signature.fields.push('dara'); + Signature.keys.push('dara'); + } + const signature = Signature.parse(dkim.entry.value); + const sigBody = signature.length != null ? body.slice(0, signature.length) : body; + const processedBody = processBody(sigBody, signature.canonical.split("/").pop()); + const processedHeader = processHeader(dkim.headers, signature.headers, signature.canonical.split("/").shift()); + const algorithm = signature.algorithm.toUpperCase(); + return { + ...dkim, + signature, + processedBody, + processedHeader, + algorithm + }; + }); + return { + header, + body, + dkims + }; +} +; +//# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.js.map b/dist/src/libs/dkim/parse.js.map new file mode 100644 index 000000000..b8adc39c5 --- /dev/null +++ b/dist/src/libs/dkim/parse.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parse.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B;;;EAGE;AACF,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAErD,MAAM,oBAAoB,GAAG,CAAC,KAAU,EAAE,EAAE;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;QACnB,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;KACzC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEvC,OAAO;QACL,QAAQ;QACR,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAS,EAAE,EAAE;IACjC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,MAAW,EAAE,EAAE;IAC/B,OAAO,MAAM;SACV,KAAK,CAAC,wBAAwB,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,UAAe,EAAE,EAAE;QACvC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;YACb,sBAAsB;YACtB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,sBAAsB;YACtB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEnB,OAAO;gBACL,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;gBACtB,OAAO;aACR,CAAC;SACH;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,UAAU,KAAK,CAAC,KAAU;IAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QAC/C,gEAAgE;QAChE,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YAC3C,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;SAC5B;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpD,MAAM,OAAO,GACX,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,MAAM,aAAa,GAAG,WAAW,CAC/B,OAAO,EACP,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CACrC,CAAC;QAEF,MAAM,eAAe,GAAG,aAAa,CACnC,IAAI,CAAC,OAAO,EACZ,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CACvC,CAAC;QAEF,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAEpD,OAAO;YACL,GAAG,IAAI;YACP,SAAS;YACT,aAAa;YACb,eAAe;YACf,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC;AAAA,CAAC","sourcesContent":["import isDKIM from \"./isDKIM\";\n\n/*\n parse email\n (cross-platform)\n*/\nconst Signature = require(\"dkim-signature\");\nconst processHeader = require(\"dkim/lib/process-header\");\nconst processBody = require(\"dkim/lib/process-body\");\n\nconst emailToHeaderAndBody = (email: any) => {\n const boundary = email.indexOf(\"\\r\\n\\r\\n\");\n if (boundary === -1) {\n throw Error(\"no header boundary found\");\n }\n\n const header = email.slice(0, boundary);\n const body = email.slice(boundary + 4);\n\n return {\n boundary,\n header,\n body\n };\n};\n\nconst getDkimEntry = (dkim: any) => {\n const [name, ...rest] = dkim.split(\":\");\n\n return {\n name,\n value: rest.join(\":\").slice(1)\n };\n};\n\nconst getDkims = (header: any) => {\n return header\n .split(/\\r\\n(?=[^\\x20\\x09]|$)/g)\n .map((h: any, i: any, allHeaders: any) => {\n if (isDKIM(h)) {\n // remove DKIM headers\n const headers = allHeaders.filter((v: any) => !isDKIM(v));\n // add one DKIM header\n headers.unshift(h);\n\n return {\n entry: getDkimEntry(h),\n headers\n };\n }\n\n return undefined;\n })\n .filter((v: any) => !!v);\n};\n\nexport function parse(email: any) {\n const { header, body } = emailToHeaderAndBody(email);\n\n const dkims = getDkims(header).map((dkim: any) => {\n // a new field called dara has been introduced to DKIM signature\n // standarts. We add it manually as the lib does not support it\n if (dkim.entry.value.indexOf('dara') !== -1) {\n Signature.fields.push('dara')\n Signature.keys.push('dara')\n }\n\n const signature = Signature.parse(dkim.entry.value);\n\n const sigBody =\n signature.length != null ? body.slice(0, signature.length) : body;\n\n const processedBody = processBody(\n sigBody,\n signature.canonical.split(\"/\").pop()\n );\n\n const processedHeader = processHeader(\n dkim.headers,\n signature.headers,\n signature.canonical.split(\"/\").shift()\n );\n\n const algorithm = signature.algorithm.toUpperCase();\n\n return {\n ...dkim,\n signature,\n processedBody,\n processedHeader,\n algorithm\n };\n });\n\n return {\n header,\n body,\n dkims\n };\n};"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.d.ts b/dist/src/libs/dkim/parseEmail.d.ts new file mode 100644 index 000000000..d633a692f --- /dev/null +++ b/dist/src/libs/dkim/parseEmail.d.ts @@ -0,0 +1,2 @@ +export default function parseEmail(email: any): Promise; +//# sourceMappingURL=parseEmail.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.d.ts.map b/dist/src/libs/dkim/parseEmail.d.ts.map new file mode 100644 index 000000000..acc56d590 --- /dev/null +++ b/dist/src/libs/dkim/parseEmail.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEmail.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/parseEmail.ts"],"names":[],"mappings":"AAUA,wBAA8B,UAAU,CAAC,KAAK,EAAE,GAAG,gBAgElD"} \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.js b/dist/src/libs/dkim/parseEmail.js new file mode 100644 index 000000000..a929d4282 --- /dev/null +++ b/dist/src/libs/dkim/parseEmail.js @@ -0,0 +1,60 @@ +/* + parse and return email data + (nodejs) +*/ +import { parse } from './parse'; +import getPublicKey from './getPublicKey'; +import publicKeyToComponents from './publicKeyToComponents'; +import toSolidity from './toSolidity'; +import { createHash } from 'crypto'; +export default async function parseEmail(email) { + const dkims = parse(email).dkims.map((dkim) => { + const algorithm = dkim.algorithm + .split('-') + .pop() + .toUpperCase(); + const bodyHash = createHash(algorithm) + .update(dkim.processedBody) + .digest(); + const bodyHashMatched = bodyHash.compare(dkim.signature.hash) !== 0; + if (bodyHashMatched) { + throw new Error('body hash did not verify'); + } + const hash = createHash(algorithm) + .update(dkim.processedHeader) + .digest(); + return { + ...dkim, + hash + }; + }); + // get dns records + const publicKeysEntries = await Promise.all(dkims.map((dkim) => getPublicKey({ + domain: dkim.signature.domain, + selector: dkim.signature.selector + }))); + const publicKeys = publicKeysEntries.map((entry) => { + const { publicKey } = entry; + const { exponent, modulus } = publicKeyToComponents(publicKey); + return { + ...entry, + exponent, + modulus + }; + }); + return dkims.map((dkim, i) => { + const solidity = toSolidity({ + algorithm: dkim.algorithm, + hash: dkim.hash, + signature: dkim.signature.signature, + exponent: publicKeys[i].exponent, + modulus: publicKeys[i].modulus + }); + return { + ...dkim, + ...publicKeys[i], + solidity + }; + }); +} +//# sourceMappingURL=parseEmail.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.js.map b/dist/src/libs/dkim/parseEmail.js.map new file mode 100644 index 000000000..b75166fa5 --- /dev/null +++ b/dist/src/libs/dkim/parseEmail.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEmail.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parseEmail.ts"],"names":[],"mappings":"AAAA;;;EAGE;AACF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,qBAAqB,MAAM,yBAAyB,CAAA;AAC3D,OAAO,UAAU,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,UAAU,CAAC,KAAU;IAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;aAC7B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,EAAE;aACL,WAAW,EAAE,CAAA;QAEhB,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;aACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;aAC1B,MAAM,EAAE,CAAA;QAEX,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEnE,IAAI,eAAe,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;SAC5C;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;aAC5B,MAAM,EAAE,CAAA;QAEX,OAAO;YACL,GAAG,IAAI;YACP,IAAI;SACL,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,MAAM,iBAAiB,GAAQ,MAAM,OAAO,CAAC,GAAG,CAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CACtB,YAAY,CAAC;QACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;QAC7B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;KAClC,CAAC,CACH,CACF,CAAA;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAE9D,OAAO;YACL,GAAG,KAAK;YACR,QAAQ;YACR,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,CAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;YACnC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ;YAChC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO;SAC/B,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,IAAI;YACP,GAAG,UAAU,CAAC,CAAC,CAAC;YAChB,QAAQ;SACT,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/*\n parse and return email data\n (nodejs)\n*/\nimport { parse } from './parse'\nimport getPublicKey from './getPublicKey'\nimport publicKeyToComponents from './publicKeyToComponents'\nimport toSolidity from './toSolidity'\nimport { createHash } from 'crypto'\n\nexport default async function parseEmail(email: any) {\n\n const dkims = parse(email).dkims.map((dkim: any) => {\n const algorithm = dkim.algorithm\n .split('-')\n .pop()\n .toUpperCase()\n\n const bodyHash = createHash(algorithm)\n .update(dkim.processedBody)\n .digest()\n\n const bodyHashMatched = bodyHash.compare(dkim.signature.hash) !== 0\n\n if (bodyHashMatched) {\n throw new Error('body hash did not verify')\n }\n\n const hash = createHash(algorithm)\n .update(dkim.processedHeader)\n .digest()\n\n return {\n ...dkim,\n hash\n }\n })\n\n // get dns records\n const publicKeysEntries: any = await Promise.all(\n dkims.map((dkim: any) =>\n getPublicKey({\n domain: dkim.signature.domain,\n selector: dkim.signature.selector\n })\n )\n )\n\n const publicKeys = publicKeysEntries.map((entry: any) => {\n const { publicKey } = entry\n const { exponent, modulus } = publicKeyToComponents(publicKey)\n\n return {\n ...entry,\n exponent,\n modulus\n }\n })\n\n return dkims.map((dkim: any, i: any) => {\n const solidity = toSolidity({\n algorithm: dkim.algorithm,\n hash: dkim.hash,\n signature: dkim.signature.signature,\n exponent: publicKeys[i].exponent,\n modulus: publicKeys[i].modulus\n })\n\n return {\n ...dkim,\n ...publicKeys[i],\n solidity\n }\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.d.ts b/dist/src/libs/dkim/publicKeyToComponents.d.ts new file mode 100644 index 000000000..cec790c3f --- /dev/null +++ b/dist/src/libs/dkim/publicKeyToComponents.d.ts @@ -0,0 +1,5 @@ +export default function publicKeyToComponents(publicKey: any): { + exponent: any; + modulus: any; +}; +//# sourceMappingURL=publicKeyToComponents.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.d.ts.map b/dist/src/libs/dkim/publicKeyToComponents.d.ts.map new file mode 100644 index 000000000..d0dc10cac --- /dev/null +++ b/dist/src/libs/dkim/publicKeyToComponents.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"publicKeyToComponents.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/publicKeyToComponents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,SAAS,EAAE,GAAG;;;EAS3D"} \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.js b/dist/src/libs/dkim/publicKeyToComponents.js new file mode 100644 index 000000000..7777aac8b --- /dev/null +++ b/dist/src/libs/dkim/publicKeyToComponents.js @@ -0,0 +1,10 @@ +const NodeRSA = require("node-rsa"); +export default function publicKeyToComponents(publicKey) { + const parsed = new NodeRSA(publicKey); + const { e: exponent, n: modulus } = parsed.exportKey("components-public"); + return { + exponent, + modulus + }; +} +//# sourceMappingURL=publicKeyToComponents.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.js.map b/dist/src/libs/dkim/publicKeyToComponents.js.map new file mode 100644 index 000000000..b37b3b941 --- /dev/null +++ b/dist/src/libs/dkim/publicKeyToComponents.js.map @@ -0,0 +1 @@ +{"version":3,"file":"publicKeyToComponents.js","sourceRoot":"","sources":["../../../../src/libs/dkim/publicKeyToComponents.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEnC,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,SAAc;IAC1D,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAErC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAEzE,OAAO;QACL,QAAQ;QACR,OAAO;KACR,CAAA;AACH,CAAC","sourcesContent":["const NodeRSA = require(\"node-rsa\")\n\nexport default function publicKeyToComponents(publicKey: any) {\n const parsed = new NodeRSA(publicKey)\n\n const { e: exponent, n: modulus } = parsed.exportKey(\"components-public\")\n\n return {\n exponent,\n modulus\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.d.ts b/dist/src/libs/dkim/recovery.d.ts new file mode 100644 index 000000000..3e7d00e55 --- /dev/null +++ b/dist/src/libs/dkim/recovery.d.ts @@ -0,0 +1,27 @@ +export declare const DKIM_VALIDATOR_ADDR = "0x0000000000000000000000000000000000000000"; +export declare const RECOVERY_DEFAULTS: { + emailTo: string; + acceptUnknownSelectors: boolean; + waitUntilAcceptAdded: bigint; + waitUntilAcceptRemoved: bigint; + acceptEmptyDKIMSig: boolean; + acceptEmptySecondSig: boolean; + onlyOneSigTimelock: bigint; +}; +export declare const knownSelectors: { + 'gmail.com': string; +}; +export declare const frequentlyUsedSelectors: string[]; +/** + * Get the signerKey that goes as the address in privileges + * and its accompanying priv hash for the email recovery + * + * @param validatorAddr string + * @param validatorData BytesLike + * @returns {Address, bytes32} + */ +export declare function getSignerKey(validatorAddr: string, validatorData: any): { + signerKey: string; + hash: string; +}; +//# sourceMappingURL=recovery.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.d.ts.map b/dist/src/libs/dkim/recovery.d.ts.map new file mode 100644 index 000000000..55606e178 --- /dev/null +++ b/dist/src/libs/dkim/recovery.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/recovery.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,+CAA+C,CAAA;AAE/E,eAAO,MAAM,iBAAiB;;;;;;;;CAQ7B,CAAA;AAED,eAAO,MAAM,cAAc;;CAE1B,CAAA;AAED,eAAO,MAAM,uBAAuB,UAUnC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG;;;EAKrE"} \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.js b/dist/src/libs/dkim/recovery.js new file mode 100644 index 000000000..4275a488c --- /dev/null +++ b/dist/src/libs/dkim/recovery.js @@ -0,0 +1,41 @@ +import { AbiCoder, getAddress, keccak256 } from 'ethers'; +// TODO: change to original address once deployed +export const DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'; +export const RECOVERY_DEFAULTS = { + emailTo: 'recovery@ambire.com', + acceptUnknownSelectors: true, + waitUntilAcceptAdded: 138240n, + waitUntilAcceptRemoved: 138240n, + acceptEmptyDKIMSig: true, + acceptEmptySecondSig: true, + onlyOneSigTimelock: 259200n // 3 days +}; +export const knownSelectors = { + 'gmail.com': '20230601' +}; +export const frequentlyUsedSelectors = [ + 'Google', + 'selector1', + 'selector2', + 'everlytickey1', + 'everlytickey2', + 'eversrv', + 'k1', + 'mxvault', + 'dkim' +]; +/** + * Get the signerKey that goes as the address in privileges + * and its accompanying priv hash for the email recovery + * + * @param validatorAddr string + * @param validatorData BytesLike + * @returns {Address, bytes32} + */ +export function getSignerKey(validatorAddr, validatorData) { + const abiCoder = new AbiCoder(); + const hash = keccak256(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData])); + const signerKey = getAddress(`0x${hash.slice(hash.length - 40, hash.length)}`); + return { signerKey, hash }; +} +//# sourceMappingURL=recovery.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.js.map b/dist/src/libs/dkim/recovery.js.map new file mode 100644 index 000000000..f74fc8190 --- /dev/null +++ b/dist/src/libs/dkim/recovery.js.map @@ -0,0 +1 @@ +{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../../src/libs/dkim/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAExD,iDAAiD;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAE/E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,sBAAsB,EAAE,IAAI;IAC5B,oBAAoB,EAAE,OAAO;IAC7B,sBAAsB,EAAE,OAAO;IAC/B,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,IAAI;IAC1B,kBAAkB,EAAE,OAAO,CAAC,SAAS;CACtC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,UAAU;CACxB,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ;IACR,WAAW;IACX,WAAW;IACX,eAAe;IACf,eAAe;IACf,SAAS;IACT,IAAI;IACJ,SAAS;IACT,MAAM;CACP,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,aAAkB;IACpE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC","sourcesContent":["import { AbiCoder, getAddress, keccak256 } from 'ethers'\n\n// TODO: change to original address once deployed\nexport const DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'\n\nexport const RECOVERY_DEFAULTS = {\n emailTo: 'recovery@ambire.com',\n acceptUnknownSelectors: true,\n waitUntilAcceptAdded: 138240n, // 4 days\n waitUntilAcceptRemoved: 138240n, // 4 days\n acceptEmptyDKIMSig: true,\n acceptEmptySecondSig: true,\n onlyOneSigTimelock: 259200n // 3 days\n}\n\nexport const knownSelectors = {\n 'gmail.com': '20230601'\n}\n\nexport const frequentlyUsedSelectors = [\n 'Google',\n 'selector1',\n 'selector2',\n 'everlytickey1',\n 'everlytickey2',\n 'eversrv',\n 'k1',\n 'mxvault',\n 'dkim'\n]\n\n/**\n * Get the signerKey that goes as the address in privileges\n * and its accompanying priv hash for the email recovery\n *\n * @param validatorAddr string\n * @param validatorData BytesLike\n * @returns {Address, bytes32}\n */\nexport function getSignerKey(validatorAddr: string, validatorData: any) {\n const abiCoder = new AbiCoder()\n const hash = keccak256(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData]))\n const signerKey = getAddress(`0x${hash.slice(hash.length - 40, hash.length)}`)\n return { signerKey, hash }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.d.ts b/dist/src/libs/dkim/toSolidity.d.ts new file mode 100644 index 000000000..21c35021e --- /dev/null +++ b/dist/src/libs/dkim/toSolidity.d.ts @@ -0,0 +1,2 @@ +export default function toSolidity(rawData: any): any; +//# sourceMappingURL=toSolidity.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.d.ts.map b/dist/src/libs/dkim/toSolidity.d.ts.map new file mode 100644 index 000000000..af7780a88 --- /dev/null +++ b/dist/src/libs/dkim/toSolidity.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"toSolidity.d.ts","sourceRoot":"","sources":["../../../../src/libs/dkim/toSolidity.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,GAAG,OAS9C"} \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.js b/dist/src/libs/dkim/toSolidity.js new file mode 100644 index 000000000..6ccbc2121 --- /dev/null +++ b/dist/src/libs/dkim/toSolidity.js @@ -0,0 +1,15 @@ +const algorithms = { + RSASHA1: 0, + RSASHA256: 1 +}; +export default function toSolidity(rawData) { + return { + ...rawData, + algorithm: algorithms[rawData.algorithm.replace("-", "")], + hash: "0x" + rawData.hash.toString("hex"), + signature: "0x" + rawData.signature.toString("hex"), + exponent: "0x" + rawData.exponent.toString(16), + modulus: "0x" + rawData.modulus.toString("hex").slice(2) + }; +} +//# sourceMappingURL=toSolidity.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.js.map b/dist/src/libs/dkim/toSolidity.js.map new file mode 100644 index 000000000..eec394fb0 --- /dev/null +++ b/dist/src/libs/dkim/toSolidity.js.map @@ -0,0 +1 @@ +{"version":3,"file":"toSolidity.js","sourceRoot":"","sources":["../../../../src/libs/dkim/toSolidity.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAQ;IACpB,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAY;IAC3C,OAAO;QACH,GAAG,OAAO;QACV,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnD,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3D,CAAA;AACL,CAAC","sourcesContent":["const algorithms: any = {\n RSASHA1: 0,\n RSASHA256: 1\n};\n \nexport default function toSolidity(rawData: any) {\n return {\n ...rawData,\n algorithm: algorithms[rawData.algorithm.replace(\"-\", \"\")],\n hash: \"0x\" + rawData.hash.toString(\"hex\"),\n signature: \"0x\" + rawData.signature.toString(\"hex\"),\n exponent: \"0x\" + rawData.exponent.toString(16),\n modulus: \"0x\" + rawData.modulus.toString(\"hex\").slice(2)\n }\n}"]} \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.d.ts b/dist/src/libs/dns/lookup.d.ts new file mode 100644 index 000000000..90a5253e7 --- /dev/null +++ b/dist/src/libs/dns/lookup.d.ts @@ -0,0 +1,17 @@ +interface Options { + apiProvider?: string; +} +/** + * The method returns a SignedSet answer if found or throws an exception + * if it could not verify it. So in the case of NoValidDnskeyError, we + * silently return null to indicate that no SignedSet exists for this record. + * If the error is of a different kind, we throw it. + * + * @param selector string "20221208" from example 20221208._domainkey.gmail.com + * @param domain string "gmail.com" from example 20221208._domainkey.gmail.com + * @param opt: Options + * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]} + */ +export default function lookup(selector: string, domain: string, opt?: Options): Promise; +export {}; +//# sourceMappingURL=lookup.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.d.ts.map b/dist/src/libs/dns/lookup.d.ts.map new file mode 100644 index 000000000..c4cc4ecb3 --- /dev/null +++ b/dist/src/libs/dns/lookup.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../../../src/libs/dns/lookup.ts"],"names":[],"mappings":"AAEA,UAAU,OAAO;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAA8B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,OAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAWtG"} \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.js b/dist/src/libs/dns/lookup.js new file mode 100644 index 000000000..663ce1fb7 --- /dev/null +++ b/dist/src/libs/dns/lookup.js @@ -0,0 +1,27 @@ +const { DNSProver } = require('@ensdomains/dnsprovejs'); +/** + * The method returns a SignedSet answer if found or throws an exception + * if it could not verify it. So in the case of NoValidDnskeyError, we + * silently return null to indicate that no SignedSet exists for this record. + * If the error is of a different kind, we throw it. + * + * @param selector string "20221208" from example 20221208._domainkey.gmail.com + * @param domain string "gmail.com" from example 20221208._domainkey.gmail.com + * @param opt: Options + * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]} + */ +export default async function lookup(selector, domain, opt = {}) { + const provider = opt.apiProvider ?? 'https://cloudflare-dns.com/dns-query'; + const textDomain = `${selector}._domainKey.${domain}`; + const prover = DNSProver.create(provider); + try { + const res = await prover.queryWithProof('TXT', textDomain); + return res; + } + catch (error) { + if (error.name == 'NoValidDnskeyError') + return null; + throw new Error(error.message); + } +} +//# sourceMappingURL=lookup.js.map \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.js.map b/dist/src/libs/dns/lookup.js.map new file mode 100644 index 000000000..e369507a2 --- /dev/null +++ b/dist/src/libs/dns/lookup.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/libs/dns/lookup.ts"],"names":[],"mappings":"AAAA,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAMvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAe,EAAE;IACtF,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,sCAAsC,CAAA;IAC1E,MAAM,UAAU,GAAG,GAAG,QAAQ,eAAe,MAAM,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzC,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1D,OAAO,GAAG,CAAA;KACX;IAAC,OAAO,KAAU,EAAE;QACnB,IAAI,KAAK,CAAC,IAAI,IAAI,oBAAoB;YAAE,OAAO,IAAI,CAAA;QACnD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;KAC/B;AACH,CAAC","sourcesContent":["const { DNSProver } = require('@ensdomains/dnsprovejs')\n\ninterface Options {\n apiProvider?: string // cloudflare or another DNS api provider\n}\n\n/**\n * The method returns a SignedSet answer if found or throws an exception\n * if it could not verify it. So in the case of NoValidDnskeyError, we\n * silently return null to indicate that no SignedSet exists for this record.\n * If the error is of a different kind, we throw it.\n *\n * @param selector string \"20221208\" from example 20221208._domainkey.gmail.com\n * @param domain string \"gmail.com\" from example 20221208._domainkey.gmail.com\n * @param opt: Options\n * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]}\n */\nexport default async function lookup(selector: string, domain: string, opt: Options = {}): Promise {\n const provider = opt.apiProvider ?? 'https://cloudflare-dns.com/dns-query'\n const textDomain = `${selector}._domainKey.${domain}`\n const prover = DNSProver.create(provider)\n try {\n const res = await prover.queryWithProof('TXT', textDomain)\n return res\n } catch (error: any) {\n if (error.name == 'NoValidDnskeyError') return null\n throw new Error(error.message)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.d.ts b/dist/src/libs/emailVault/emailVault.d.ts new file mode 100644 index 000000000..3da17c38f --- /dev/null +++ b/dist/src/libs/emailVault/emailVault.d.ts @@ -0,0 +1,27 @@ +import { EmailVaultData, EmailVaultOperation, EmailVaultSecret, RecoveryKey } from '../../interfaces/emailVault'; +import { Fetch } from '../../interfaces/fetch'; +export interface Secret { + key: String; + type: String; +} +export interface EmailVaultInfo { + email: String; + recoveryKey: String; + availableSecrets: Secret[]; + availableAccounts: any; +} +export declare class EmailVault { + private callRelayer; + constructor(fetch: Fetch, relayerUrl: string); + getRecoveryKeyAddress(email: String, authKey: String): Promise; + getSessionKey(email: String, authKey: String): Promise; + getEmailVaultInfo(email: String, authKey: String): Promise; + operations(email: String, authKey: String, operations: EmailVaultOperation[]): Promise; + getOperations(email: String, authKey: String, operations: EmailVaultOperation[]): Promise; + addKeyStoreSecret(email: String, authKey: String, keyStoreUid: String, secret: String): Promise; + retrieveKeyStoreSecret(email: String, authKey: String, keyStoreUid: String): Promise; + addKeyBackup(email: String, authKey: String, keyAddress: String, privateKeyEncryptedJSON: String): Promise; + retrieveKeyBackup(email: String, authKey: String, keyAddress: String): Promise; + getInfo(email: String, authKey: String): Promise; +} +//# sourceMappingURL=emailVault.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.d.ts.map b/dist/src/libs/emailVault/emailVault.d.ts.map new file mode 100644 index 000000000..022fb4f2d --- /dev/null +++ b/dist/src/libs/emailVault/emailVault.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.d.ts","sourceRoot":"","sources":["../../../../src/libs/emailVault/emailVault.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAG9C,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAGD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,EAAE,GAAG,CAAA;CACvB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAU;gBAEjB,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM;IAItC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI3E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9D,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAgBjF,UAAU,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAQlC,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAQlC,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IASb,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAQtB,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,uBAAuB,EAAE,MAAM,GAC9B,OAAO,CAAC,OAAO,CAAC;IASb,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC;IAMtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAGvE"} \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.js b/dist/src/libs/emailVault/emailVault.js new file mode 100644 index 000000000..8f935818b --- /dev/null +++ b/dist/src/libs/emailVault/emailVault.js @@ -0,0 +1,54 @@ +import { relayerCall } from '../relayerCall/relayerCall'; +export class EmailVault { + callRelayer; + constructor(fetch, relayerUrl) { + this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + } + async getRecoveryKeyAddress(email, authKey) { + return (await this.callRelayer(`/email-vault/get-recovery-key/${email}/${authKey}`)).data; + } + async getSessionKey(email, authKey) { + return (await this.callRelayer(`/email-vault/get-session-key/${email}/${authKey}`))?.data + ?.sessionKey; + } + async getEmailVaultInfo(email, authKey) { + const result = await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`).then((res) => res.data); + return { + ...result, + availableAccounts: Object.fromEntries(result.availableAccounts.map((acc) => [acc.addr, acc])), + availableSecrets: Object.fromEntries(result.availableSecrets.map((secret) => [secret.key, secret])) + }; + } + async operations(email, authKey, operations) { + return (await this.callRelayer(`/email-vault/post-operations/${email}/${authKey}`, 'POST', { + operations + })).data; + } + async getOperations(email, authKey, operations) { + return (await this.callRelayer(`/email-vault/get-operations/${email}/${authKey}`, 'POST', { + operations + })).data; + } + async addKeyStoreSecret(email, authKey, keyStoreUid, secret) { + return (await this.callRelayer(`/email-vault/add-key-store-secret/${email}/${authKey}`, 'POST', { + secret, + uid: keyStoreUid + })).success; + } + async retrieveKeyStoreSecret(email, authKey, keyStoreUid) { + return (await this.callRelayer(`/email-vault/retrieve-key-store-secret/${email}/${keyStoreUid}/${authKey}`)).data; + } + async addKeyBackup(email, authKey, keyAddress, privateKeyEncryptedJSON) { + return (await this.callRelayer(`/email-vault/add-key-backup/${email}/${authKey}`, 'POST', { + keyAddress, + encryptedBackup: privateKeyEncryptedJSON + })).success; + } + async retrieveKeyBackup(email, authKey, keyAddress) { + return (await this.callRelayer(`/email-vault/retrieve-key-backup/${email}/${keyAddress}/${authKey}`)).data; + } + async getInfo(email, authKey) { + return (await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`)).data; + } +} +//# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.js.map b/dist/src/libs/emailVault/emailVault.js.map new file mode 100644 index 000000000..25f203558 --- /dev/null +++ b/dist/src/libs/emailVault/emailVault.js.map @@ -0,0 +1 @@ +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/libs/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmailVaultData,\n EmailVaultOperation,\n EmailVaultSecret,\n RecoveryKey\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { relayerCall } from '../relayerCall/relayerCall'\n\nexport interface Secret {\n key: String\n type: String\n}\n\n// NOTE: its a quick fix. Will be updated in other branch\nexport interface EmailVaultInfo {\n email: String\n recoveryKey: String\n availableSecrets: Secret[]\n availableAccounts: any\n}\n\nexport class EmailVault {\n private callRelayer: Function\n\n constructor(fetch: Fetch, relayerUrl: string) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n async getRecoveryKeyAddress(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-recovery-key/${email}/${authKey}`)).data\n }\n\n async getSessionKey(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-session-key/${email}/${authKey}`))?.data\n ?.sessionKey\n }\n\n async getEmailVaultInfo(email: String, authKey: String): Promise {\n const result = await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`).then(\n (res: any) => res.data\n )\n\n return {\n ...result,\n availableAccounts: Object.fromEntries(\n result.availableAccounts.map((acc: any) => [acc.addr, acc])\n ),\n availableSecrets: Object.fromEntries(\n result.availableSecrets.map((secret: any) => [secret.key, secret])\n )\n }\n }\n\n async operations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/post-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async getOperations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/get-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async addKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String,\n secret: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-store-secret/${email}/${authKey}`, 'POST', {\n secret,\n uid: keyStoreUid\n })\n ).success\n }\n\n async retrieveKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String\n ): Promise {\n return (\n await this.callRelayer(\n `/email-vault/retrieve-key-store-secret/${email}/${keyStoreUid}/${authKey}`\n )\n ).data\n }\n\n async addKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String,\n privateKeyEncryptedJSON: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-backup/${email}/${authKey}`, 'POST', {\n keyAddress,\n encryptedBackup: privateKeyEncryptedJSON\n })\n ).success\n }\n\n async retrieveKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/retrieve-key-backup/${email}/${keyAddress}/${authKey}`)\n ).data\n }\n\n async getInfo(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`)).data\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.d.ts b/dist/src/libs/erc7677/erc7677.d.ts new file mode 100644 index 000000000..8886c4a40 --- /dev/null +++ b/dist/src/libs/erc7677/erc7677.d.ts @@ -0,0 +1,9 @@ +import { Network } from '../../interfaces/network'; +import { UserOperation } from '../userOperation/types'; +import { PaymasterCapabilities, PaymasterData, PaymasterEstimationData, PaymasterService } from './types'; +export declare function getPaymasterService(chainId: bigint, capabilities?: { + paymasterService?: PaymasterCapabilities; +}): PaymasterService | undefined; +export declare function getPaymasterStubData(service: PaymasterService, userOp: UserOperation, network: Network): Promise; +export declare function getPaymasterData(service: PaymasterService, userOp: UserOperation, network: Network): Promise; +//# sourceMappingURL=erc7677.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.d.ts.map b/dist/src/libs/erc7677/erc7677.d.ts.map new file mode 100644 index 000000000..e2eed248e --- /dev/null +++ b/dist/src/libs/erc7677/erc7677.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"erc7677.d.ts","sourceRoot":"","sources":["../../../../src/libs/erc7677/erc7677.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,SAAS,CAAA;AAEhB,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,qBAAqB,CAAA;CAAE,GAC1D,gBAAgB,GAAG,SAAS,CAc9B;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,CAQlC;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAQxB"} \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.js b/dist/src/libs/erc7677/erc7677.js new file mode 100644 index 000000000..ce28945f1 --- /dev/null +++ b/dist/src/libs/erc7677/erc7677.js @@ -0,0 +1,37 @@ +import { toBeHex, toQuantity } from 'ethers'; +import { ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +import { getRpcProvider } from '../../services/provider'; +import { getCleanUserOp } from '../userOperation/userOperation'; +export function getPaymasterService(chainId, capabilities) { + if (!capabilities || !capabilities.paymasterService) + return undefined; + // hex may come with a leading zero or not. Prepare for both + const chainIdHex = toBeHex(chainId); + const chainIdQuantity = toQuantity(chainId); + const paymasterService = chainIdHex in capabilities.paymasterService + ? capabilities.paymasterService[chainIdHex] + : capabilities.paymasterService[chainIdQuantity]; + if (!paymasterService) + return undefined; + paymasterService.id = new Date().getTime(); + return paymasterService; +} +export function getPaymasterStubData(service, userOp, network) { + const provider = getRpcProvider([service.url], network.chainId); + return provider.send('pm_getPaymasterStubData', [ + getCleanUserOp(userOp)[0], + ERC_4337_ENTRYPOINT, + toBeHex(network.chainId.toString()), + service.context + ]); +} +export async function getPaymasterData(service, userOp, network) { + const provider = getRpcProvider([service.url], network.chainId); + return provider.send('pm_getPaymasterData', [ + getCleanUserOp(userOp)[0], + ERC_4337_ENTRYPOINT, + toBeHex(network.chainId.toString()), + service.context + ]); +} +//# sourceMappingURL=erc7677.js.map \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.js.map b/dist/src/libs/erc7677/erc7677.js.map new file mode 100644 index 000000000..faea224fd --- /dev/null +++ b/dist/src/libs/erc7677/erc7677.js.map @@ -0,0 +1 @@ +{"version":3,"file":"erc7677.js","sourceRoot":"","sources":["../../../../src/libs/erc7677/erc7677.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAQ/D,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,YAA2D;IAE3D,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAErE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAkB,CAAA;IACpD,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAkB,CAAA;IAC5D,MAAM,gBAAgB,GACpB,UAAU,IAAI,YAAY,CAAC,gBAAgB;QACzC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;IACpD,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAEvC,gBAAgB,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC1C,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAC9C,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,mBAAmB;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAC1C,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,mBAAmB;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { toBeHex, toQuantity } from 'ethers'\n\nimport { ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp } from '../userOperation/userOperation'\nimport {\n PaymasterCapabilities,\n PaymasterData,\n PaymasterEstimationData,\n PaymasterService\n} from './types'\n\nexport function getPaymasterService(\n chainId: bigint,\n capabilities?: { paymasterService?: PaymasterCapabilities }\n): PaymasterService | undefined {\n if (!capabilities || !capabilities.paymasterService) return undefined\n\n // hex may come with a leading zero or not. Prepare for both\n const chainIdHex = toBeHex(chainId) as `0x${string}`\n const chainIdQuantity = toQuantity(chainId) as `0x${string}`\n const paymasterService =\n chainIdHex in capabilities.paymasterService\n ? capabilities.paymasterService[chainIdHex]\n : capabilities.paymasterService[chainIdQuantity]\n if (!paymasterService) return undefined\n\n paymasterService.id = new Date().getTime()\n return paymasterService\n}\n\nexport function getPaymasterStubData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterStubData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n\nexport async function getPaymasterData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/erc7677/types.d.ts b/dist/src/libs/erc7677/types.d.ts new file mode 100644 index 000000000..0e1e447ba --- /dev/null +++ b/dist/src/libs/erc7677/types.d.ts @@ -0,0 +1,37 @@ +import { Hex } from '../../interfaces/hex'; +export interface PaymasterService { + url: string; + context: { + policyId: string; + }; + id: number; + failed?: boolean; +} +export interface PaymasterCapabilities { + [chainId: Hex]: PaymasterService; +} +export interface Sponsor { + name: string; + icon?: string; +} +export type PaymasterEstimationData = { + paymaster: Hex; + paymasterData: Hex; + paymasterVerificationGasLimit?: Hex; + paymasterPostOpGasLimit?: Hex; + sponsor?: Sponsor; + isFinal?: boolean; +}; +export interface PaymasterData { + paymaster: Hex; + paymasterData: Hex; +} +export interface PaymasterSuccessReponse extends PaymasterData { + success: boolean; +} +export interface PaymasterErrorReponse { + success: boolean; + message: string; + error: Error; +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/erc7677/types.d.ts.map b/dist/src/libs/erc7677/types.d.ts.map new file mode 100644 index 000000000..5a00d9ed4 --- /dev/null +++ b/dist/src/libs/erc7677/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/erc7677/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,OAAO,EAAE,GAAG,GAAG,gBAAgB,CAAA;CACjC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,GAAG,CAAA;IACd,aAAa,EAAE,GAAG,CAAA;IAClB,6BAA6B,CAAC,EAAE,GAAG,CAAA;IACnC,uBAAuB,CAAC,EAAE,GAAG,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAA;IACd,aAAa,EAAE,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,KAAK,CAAA;CACb"} \ No newline at end of file diff --git a/dist/src/libs/erc7677/types.js b/dist/src/libs/erc7677/types.js new file mode 100644 index 000000000..718fd38ae --- /dev/null +++ b/dist/src/libs/erc7677/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/erc7677/types.js.map b/dist/src/libs/erc7677/types.js.map new file mode 100644 index 000000000..fb403c0bd --- /dev/null +++ b/dist/src/libs/erc7677/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/erc7677/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Hex } from '../../interfaces/hex'\n\nexport interface PaymasterService {\n url: string\n context: {\n policyId: string\n }\n id: number\n failed?: boolean\n}\n\nexport interface PaymasterCapabilities {\n [chainId: Hex]: PaymasterService\n}\n\nexport interface Sponsor {\n name: string\n icon?: string\n}\n\nexport type PaymasterEstimationData = {\n paymaster: Hex\n paymasterData: Hex\n paymasterVerificationGasLimit?: Hex\n paymasterPostOpGasLimit?: Hex\n sponsor?: Sponsor\n isFinal?: boolean // Indicates that the caller does not need to call pm_getPaymasterData\n}\n\nexport interface PaymasterData {\n paymaster: Hex\n paymasterData: Hex\n}\n\nexport interface PaymasterSuccessReponse extends PaymasterData {\n success: boolean\n}\n\nexport interface PaymasterErrorReponse {\n success: boolean\n message: string\n error: Error\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.d.ts b/dist/src/libs/errorDecoder/constants.d.ts new file mode 100644 index 000000000..bd961e293 --- /dev/null +++ b/dist/src/libs/errorDecoder/constants.d.ts @@ -0,0 +1,5 @@ +declare const ERROR_PREFIX = "0x08c379a0"; +declare const PANIC_ERROR_PREFIX = "0x4e487b71"; +declare const EXPIRED_PREFIX = "0x5bf6f916"; +export { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }; +//# sourceMappingURL=constants.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.d.ts.map b/dist/src/libs/errorDecoder/constants.d.ts.map new file mode 100644 index 000000000..fba9a3d39 --- /dev/null +++ b/dist/src/libs/errorDecoder/constants.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/constants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY,eAAe,CAAA;AACjC,QAAA,MAAM,kBAAkB,eAAe,CAAA;AAGvC,QAAA,MAAM,cAAc,eAAe,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.js b/dist/src/libs/errorDecoder/constants.js new file mode 100644 index 000000000..44c8b6bb5 --- /dev/null +++ b/dist/src/libs/errorDecoder/constants.js @@ -0,0 +1,6 @@ +const ERROR_PREFIX = '0x08c379a0'; +const PANIC_ERROR_PREFIX = '0x4e487b71'; +// Signature of TransactionDeadlinePassed +const EXPIRED_PREFIX = '0x5bf6f916'; +export { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.js.map b/dist/src/libs/errorDecoder/constants.js.map new file mode 100644 index 000000000..e567a4e3a --- /dev/null +++ b/dist/src/libs/errorDecoder/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/constants.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,YAAY,CAAA;AACjC,MAAM,kBAAkB,GAAG,YAAY,CAAA;AAEvC,yCAAyC;AACzC,MAAM,cAAc,GAAG,YAAY,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA","sourcesContent":["const ERROR_PREFIX = '0x08c379a0'\nconst PANIC_ERROR_PREFIX = '0x4e487b71'\n\n// Signature of TransactionDeadlinePassed\nconst EXPIRED_PREFIX = '0x5bf6f916'\n\nexport { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.d.ts b/dist/src/libs/errorDecoder/customErrors.d.ts new file mode 100644 index 000000000..c209c1604 --- /dev/null +++ b/dist/src/libs/errorDecoder/customErrors.d.ts @@ -0,0 +1,22 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Network } from '../../interfaces/network'; +import { Call } from '../accountOp/types'; +declare class InnerCallFailureError extends Error { + data: string; + calls: Call[]; + nativePortfolioValue: bigint | undefined; + network: Network; + constructor(message: string, calls: Call[], network: Network, nativePortfolioValue?: bigint); +} +declare class RelayerPaymasterError extends Error { + constructor(error: any); +} +declare class SponsorshipPaymasterError extends Error { + constructor(); +} +declare class BundlerError extends Error { + bundlerName: BUNDLER; + constructor(message: string, bundlerName: BUNDLER); +} +export { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }; +//# sourceMappingURL=customErrors.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.d.ts.map b/dist/src/libs/errorDecoder/customErrors.d.ts.map new file mode 100644 index 000000000..44d1ca78d --- /dev/null +++ b/dist/src/libs/errorDecoder/customErrors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"customErrors.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/customErrors.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,cAAM,qBAAsB,SAAQ,KAAK;IAChC,IAAI,EAAE,MAAM,CAAK;IAEjB,KAAK,EAAE,IAAI,EAAE,CAAA;IAEb,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAA;IAExC,OAAO,EAAE,OAAO,CAAA;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,MAAM;CAY5F;AAED,cAAM,qBAAsB,SAAQ,KAAK;gBAC3B,KAAK,EAAE,GAAG;CAYvB;AAED,cAAM,yBAA0B,SAAQ,KAAK;;CAO5C;AAED,cAAM,YAAa,SAAQ,KAAK;IAC9B,WAAW,EAAE,OAAO,CAAA;gBAER,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;CAMlD;AAED,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,YAAY,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.js b/dist/src/libs/errorDecoder/customErrors.js new file mode 100644 index 000000000..08668817c --- /dev/null +++ b/dist/src/libs/errorDecoder/customErrors.js @@ -0,0 +1,53 @@ +/* eslint-disable max-classes-per-file */ +import { isHexString } from 'ethers'; +class InnerCallFailureError extends Error { + data = ''; + calls; + nativePortfolioValue; + network; + constructor(message, calls, network, nativePortfolioValue) { + super(message); + this.name = 'InnerCallFailureError'; + this.calls = calls; + this.network = network; + this.nativePortfolioValue = nativePortfolioValue; + // If the message is a hex string pass it to + // the data field so it can be used by other error handlers + if (isHexString(message)) { + this.data = message; + } + } +} +class RelayerPaymasterError extends Error { + constructor(error) { + let message = ''; + if (error.errorState && error.errorState[0]) { + message = error.errorState[0].message; + } + else if (error.message) { + message = error.message; + } + super(message); + this.name = 'PaymasterError'; + this.message = message; + } +} +class SponsorshipPaymasterError extends Error { + constructor() { + const message = 'Sponsorship failed.'; + super(message); + this.name = 'PaymasterSponsorshipError'; + this.message = message; + } +} +class BundlerError extends Error { + bundlerName; + constructor(message, bundlerName) { + super(message); + this.bundlerName = bundlerName; + this.name = 'BundlerError'; + this.message = message; + } +} +export { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }; +//# sourceMappingURL=customErrors.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.js.map b/dist/src/libs/errorDecoder/customErrors.js.map new file mode 100644 index 000000000..29c0533e0 --- /dev/null +++ b/dist/src/libs/errorDecoder/customErrors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"customErrors.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/customErrors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAMpC,MAAM,qBAAsB,SAAQ,KAAK;IAChC,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,CAAQ;IAEb,oBAAoB,CAAoB;IAExC,OAAO,CAAS;IAEvB,YAAY,OAAe,EAAE,KAAa,EAAE,OAAgB,EAAE,oBAA6B;QACzF,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAChD,4CAA4C;QAC5C,2DAA2D;QAC3D,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;YACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;SACpB;IACH,CAAC;CACF;AAED,MAAM,qBAAsB,SAAQ,KAAK;IACvC,YAAY,KAAU;QACpB,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YAC3C,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;SACtC;aAAM,IAAI,KAAK,CAAC,OAAO,EAAE;YACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;SACxB;QAED,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,yBAA0B,SAAQ,KAAK;IAC3C;QACE,MAAM,OAAO,GAAG,qBAAqB,CAAA;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,YAAa,SAAQ,KAAK;IAC9B,WAAW,CAAS;IAEpB,YAAY,OAAe,EAAE,WAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,YAAY,EAAE,CAAA","sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport { isHexString } from 'ethers'\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Call } from '../accountOp/types'\n\nclass InnerCallFailureError extends Error {\n public data: string = ''\n\n public calls: Call[]\n\n public nativePortfolioValue: bigint | undefined\n\n public network: Network\n\n constructor(message: string, calls: Call[], network: Network, nativePortfolioValue?: bigint) {\n super(message)\n this.name = 'InnerCallFailureError'\n this.calls = calls\n this.network = network\n this.nativePortfolioValue = nativePortfolioValue\n // If the message is a hex string pass it to\n // the data field so it can be used by other error handlers\n if (isHexString(message)) {\n this.data = message\n }\n }\n}\n\nclass RelayerPaymasterError extends Error {\n constructor(error: any) {\n let message = ''\n if (error.errorState && error.errorState[0]) {\n message = error.errorState[0].message\n } else if (error.message) {\n message = error.message\n }\n\n super(message)\n this.name = 'PaymasterError'\n this.message = message\n }\n}\n\nclass SponsorshipPaymasterError extends Error {\n constructor() {\n const message = 'Sponsorship failed.'\n super(message)\n this.name = 'PaymasterSponsorshipError'\n this.message = message\n }\n}\n\nclass BundlerError extends Error {\n bundlerName: BUNDLER\n\n constructor(message: string, bundlerName: BUNDLER) {\n super(message)\n this.bundlerName = bundlerName\n this.name = 'BundlerError'\n this.message = message\n }\n}\n\nexport { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.d.ts b/dist/src/libs/errorDecoder/errorDecoder.d.ts new file mode 100644 index 000000000..4d8cdb6d5 --- /dev/null +++ b/dist/src/libs/errorDecoder/errorDecoder.d.ts @@ -0,0 +1,3 @@ +import { DecodedError } from './types'; +export declare function decodeError(e: Error): DecodedError; +//# sourceMappingURL=errorDecoder.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.d.ts.map b/dist/src/libs/errorDecoder/errorDecoder.d.ts.map new file mode 100644 index 000000000..a673f64df --- /dev/null +++ b/dist/src/libs/errorDecoder/errorDecoder.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errorDecoder.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/errorDecoder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAa,MAAM,SAAS,CAAA;AAmBjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CA+DlD"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.js b/dist/src/libs/errorDecoder/errorDecoder.js new file mode 100644 index 000000000..94ce6067d --- /dev/null +++ b/dist/src/libs/errorDecoder/errorDecoder.js @@ -0,0 +1,75 @@ +import { BundlerError } from './customErrors'; +import { BundlerErrorHandler, CustomErrorHandler, InnerCallFailureHandler, PanicErrorHandler, PaymasterErrorHandler, RevertErrorHandler, RpcErrorHandler, UserRejectionHandler } from './handlers'; +import BiconomyEstimationErrorHandler from './handlers/biconomy'; +import PimlicoEstimationErrorHandler from './handlers/pimlico'; +import RelayerErrorHandler from './handlers/relayer'; +import { formatReason, getDataFromError, isReasonValid } from './helpers'; +import { ErrorType } from './types'; +const PREPROCESSOR_BUNDLER_HANDLERS = [ + BiconomyEstimationErrorHandler, + PimlicoEstimationErrorHandler +]; +const PREPROCESSOR_HANDLERS = [BundlerErrorHandler, RelayerErrorHandler, InnerCallFailureHandler]; +const ERROR_HANDLERS = [ + RpcErrorHandler, + CustomErrorHandler, + PanicErrorHandler, + RevertErrorHandler, + PaymasterErrorHandler, + UserRejectionHandler +]; +// additionalHandlers is a list of handlers we want to add only for +// specific decodeError cases (e.g. bundler estimation) +export function decodeError(e) { + // Otherwise regular JS/TS errors will be handled + // as RPC errors which is confusing. + if (e instanceof TypeError || + e instanceof ReferenceError || + e instanceof SyntaxError || + e instanceof RangeError) { + console.error('Encountered a code error', e); + return { + type: ErrorType.CodeError, + reason: e.name, + data: null + }; + } + const errorData = getDataFromError(e); + let decodedError = { + type: ErrorType.UnknownError, + reason: '', + data: errorData + }; + // configure a list of preprocessorHandlers we want to use. + // There are very generic errors like 400 bad request that when they come + // from a bundler that mean one thing but from an RPC another, and from the relayer + // a third. So we will add additional handlers optionally + const preprocessorHandlers = PREPROCESSOR_HANDLERS; + if (e instanceof BundlerError) { + preprocessorHandlers.push(...PREPROCESSOR_BUNDLER_HANDLERS); + } + // Run preprocessor handlers first + // The idea is that preprocessor handlers can either decode the error + // or leave it partially decoded for the other handlers to decode + preprocessorHandlers.forEach((HandlerClass) => { + const handler = new HandlerClass(); + if (handler.matches(errorData, e)) { + decodedError = handler.handle(errorData, e); + } + }); + // Run error handlers + ERROR_HANDLERS.forEach((HandlerClass) => { + const handler = new HandlerClass(); + const isValidReason = isReasonValid(decodedError.reason); + const processedData = decodedError.data || errorData; + if (handler.matches(processedData, e) && !isValidReason) { + decodedError = handler.handle(processedData, e); + } + }); + decodedError.reason = formatReason(decodedError.reason || ''); + if (decodedError.type === ErrorType.UnknownError) { + console.error('Failed to decode error', e); + } + return decodedError; +} +//# sourceMappingURL=errorDecoder.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.js.map b/dist/src/libs/errorDecoder/errorDecoder.js.map new file mode 100644 index 000000000..7820844b6 --- /dev/null +++ b/dist/src/libs/errorDecoder/errorDecoder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errorDecoder.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/errorDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,MAAM,YAAY,CAAA;AACnB,OAAO,8BAA8B,MAAM,qBAAqB,CAAA;AAChE,OAAO,6BAA6B,MAAM,oBAAoB,CAAA;AAC9D,OAAO,mBAAmB,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzE,OAAO,EAAgB,SAAS,EAAE,MAAM,SAAS,CAAA;AAEjD,MAAM,6BAA6B,GAAG;IACpC,8BAA8B;IAC9B,6BAA6B;CAC9B,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAA;AACjG,MAAM,cAAc,GAAG;IACrB,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;CACrB,CAAA;AAED,mEAAmE;AACnE,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,iDAAiD;IACjD,oCAAoC;IACpC,IACE,CAAC,YAAY,SAAS;QACtB,CAAC,YAAY,cAAc;QAC3B,CAAC,YAAY,WAAW;QACxB,CAAC,YAAY,UAAU,EACvB;QACA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAA;QAE5C,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,SAAS;YACzB,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,IAAI,EAAE,IAAI;SACX,CAAA;KACF;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAErC,IAAI,YAAY,GAAiB;QAC/B,IAAI,EAAE,SAAS,CAAC,YAAY;QAC5B,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB,CAAA;IAED,2DAA2D;IAC3D,yEAAyE;IACzE,mFAAmF;IACnF,yDAAyD;IACzD,MAAM,oBAAoB,GAAG,qBAAqB,CAAA;IAClD,IAAI,CAAC,YAAY,YAAY,EAAE;QAC7B,oBAAoB,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAA;KAC5D;IAED,kCAAkC;IAClC,qEAAqE;IACrE,iEAAiE;IACjE,oBAAoB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QAClC,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;YACjC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;SAC5C;IACH,CAAC,CAAC,CAAA;IAEF,qBAAqB;IACrB,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QAClC,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,IAAI,SAAS,CAAA;QAEpD,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;YACvD,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;SAChD;IACH,CAAC,CAAC,CAAA;IAEF,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAE7D,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,YAAY,EAAE;QAChD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAA;KAC3C;IAED,OAAO,YAAY,CAAA;AACrB,CAAC","sourcesContent":["import { BundlerError } from './customErrors'\nimport {\n BundlerErrorHandler,\n CustomErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n PaymasterErrorHandler,\n RevertErrorHandler,\n RpcErrorHandler,\n UserRejectionHandler\n} from './handlers'\nimport BiconomyEstimationErrorHandler from './handlers/biconomy'\nimport PimlicoEstimationErrorHandler from './handlers/pimlico'\nimport RelayerErrorHandler from './handlers/relayer'\nimport { formatReason, getDataFromError, isReasonValid } from './helpers'\nimport { DecodedError, ErrorType } from './types'\n\nconst PREPROCESSOR_BUNDLER_HANDLERS = [\n BiconomyEstimationErrorHandler,\n PimlicoEstimationErrorHandler\n]\n\nconst PREPROCESSOR_HANDLERS = [BundlerErrorHandler, RelayerErrorHandler, InnerCallFailureHandler]\nconst ERROR_HANDLERS = [\n RpcErrorHandler,\n CustomErrorHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler\n]\n\n// additionalHandlers is a list of handlers we want to add only for\n// specific decodeError cases (e.g. bundler estimation)\nexport function decodeError(e: Error): DecodedError {\n // Otherwise regular JS/TS errors will be handled\n // as RPC errors which is confusing.\n if (\n e instanceof TypeError ||\n e instanceof ReferenceError ||\n e instanceof SyntaxError ||\n e instanceof RangeError\n ) {\n console.error('Encountered a code error', e)\n\n return {\n type: ErrorType.CodeError,\n reason: e.name,\n data: null\n }\n }\n\n const errorData = getDataFromError(e)\n\n let decodedError: DecodedError = {\n type: ErrorType.UnknownError,\n reason: '',\n data: errorData\n }\n\n // configure a list of preprocessorHandlers we want to use.\n // There are very generic errors like 400 bad request that when they come\n // from a bundler that mean one thing but from an RPC another, and from the relayer\n // a third. So we will add additional handlers optionally\n const preprocessorHandlers = PREPROCESSOR_HANDLERS\n if (e instanceof BundlerError) {\n preprocessorHandlers.push(...PREPROCESSOR_BUNDLER_HANDLERS)\n }\n\n // Run preprocessor handlers first\n // The idea is that preprocessor handlers can either decode the error\n // or leave it partially decoded for the other handlers to decode\n preprocessorHandlers.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n if (handler.matches(errorData, e)) {\n decodedError = handler.handle(errorData, e)\n }\n })\n\n // Run error handlers\n ERROR_HANDLERS.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n const isValidReason = isReasonValid(decodedError.reason)\n const processedData = decodedError.data || errorData\n\n if (handler.matches(processedData, e) && !isValidReason) {\n decodedError = handler.handle(processedData, e)\n }\n })\n\n decodedError.reason = formatReason(decodedError.reason || '')\n\n if (decodedError.type === ErrorType.UnknownError) {\n console.error('Failed to decode error', e)\n }\n\n return decodedError\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.d.ts b/dist/src/libs/errorDecoder/handlers/biconomy.d.ts new file mode 100644 index 000000000..bbdd077fe --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/biconomy.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class BiconomyEstimationErrorHandler implements ErrorHandler { + matches(data: string, error: any): any; + handle(data: string, error: any): DecodedError; +} +export default BiconomyEstimationErrorHandler; +//# sourceMappingURL=biconomy.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.d.ts.map b/dist/src/libs/errorDecoder/handlers/biconomy.d.ts.map new file mode 100644 index 000000000..185b7f99a --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/biconomy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"biconomy.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/biconomy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,8BAA+B,YAAW,YAAY;IACnD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAMhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;CAgBtD;AAED,eAAe,8BAA8B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.js b/dist/src/libs/errorDecoder/handlers/biconomy.js new file mode 100644 index 000000000..708588536 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/biconomy.js @@ -0,0 +1,25 @@ +/* eslint-disable class-methods-use-this */ +import { BICONOMY } from '../../../consts/bundlers'; +import { ErrorType } from '../types'; +class BiconomyEstimationErrorHandler { + matches(data, error) { + const { bundlerName } = error; + return bundlerName && bundlerName === BICONOMY; + } + handle(data, error) { + const { message } = error?.error || error || {}; + const lowerCased = message.toLowerCase(); + // TODO: expand with more error cases + let reason = ''; + if (lowerCased.includes('400') || lowerCased.includes('internal error')) { + reason = 'biconomy: 400'; + } + return { + type: ErrorType.BundlerError, + reason, + data: reason + }; + } +} +export default BiconomyEstimationErrorHandler; +//# sourceMappingURL=biconomy.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.js.map b/dist/src/libs/errorDecoder/handlers/biconomy.js.map new file mode 100644 index 000000000..b3ad5051c --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/biconomy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/biconomy.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,8BAA8B;IAC3B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,QAAQ,CAAA;IAChD,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACvE,MAAM,GAAG,eAAe,CAAA;SACzB;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,8BAA8B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { BICONOMY } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BiconomyEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === BICONOMY\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('400') || lowerCased.includes('internal error')) {\n reason = 'biconomy: 400'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BiconomyEstimationErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.d.ts b/dist/src/libs/errorDecoder/handlers/bundler.d.ts new file mode 100644 index 000000000..295c6a626 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/bundler.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class BundlerErrorHandler implements ErrorHandler { + matches(data: string, error: any): any; + handle(data: string, error: any): DecodedError; +} +export default BundlerErrorHandler; +//# sourceMappingURL=bundler.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.d.ts.map b/dist/src/libs/errorDecoder/handlers/bundler.d.ts.map new file mode 100644 index 000000000..c9a83698e --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/bundler.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/bundler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,mBAAoB,YAAW,YAAY;IACxC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAWhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;CAmCtD;AAED,eAAe,mBAAmB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.js b/dist/src/libs/errorDecoder/handlers/bundler.js new file mode 100644 index 000000000..b52adee2d --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/bundler.js @@ -0,0 +1,45 @@ +/* eslint-disable class-methods-use-this */ +import { ErrorType } from '../types'; +class BundlerErrorHandler { + matches(data, error) { + const { message } = error?.error || error || {}; + return (message.includes('UserOperation reverted during simulation with reason:') || + message.includes('pimlico_getUserOperationGasPrice') || + message.includes('UserOperation failed validation with reason:') || + message.includes('UserOperation reverted with reason:')); + } + handle(data, error) { + const { message } = error?.error || error || {}; + let reason = ''; + if (message.includes('pimlico_getUserOperationGasPrice')) { + reason = 'pimlico_getUserOperationGasPrice'; + } + else { + const userOperationSimulationRegex = /UserOperation reverted during simulation with reason:\s*/i; + const userOperationValidationRegex = /UserOperation failed validation with reason:\s*/i; + const userOperationRevertedRegex = /UserOperation reverted with reason:\s*/i; + const regexes = [ + userOperationSimulationRegex, + userOperationValidationRegex, + userOperationRevertedRegex + ]; + for (let i = 0; i < regexes.length; i++) { + const regex = regexes[i]; + if (regex.test(message)) { + const EntryPointErrorCode = /AA[0-9]{1,2}\s?/; + reason = message.replace(regex, ''); + // Remove error codes like AA1, AA2, etc. and the space after them + reason = reason.replace(EntryPointErrorCode, ''); + break; + } + } + } + return { + type: ErrorType.BundlerError, + reason, + data: reason + }; + } +} +export default BundlerErrorHandler; +//# sourceMappingURL=bundler.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.js.map b/dist/src/libs/errorDecoder/handlers/bundler.js.map new file mode 100644 index 000000000..b2b339e1b --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/bundler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/bundler.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAE/C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACzE,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACpD,OAAO,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAChE,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE;YACxD,MAAM,GAAG,kCAAkC,CAAA;SAC5C;aAAM;YACL,MAAM,4BAA4B,GAChC,2DAA2D,CAAA;YAC7D,MAAM,4BAA4B,GAAG,kDAAkD,CAAA;YACvF,MAAM,0BAA0B,GAAG,yCAAyC,CAAA;YAC5E,MAAM,OAAO,GAAG;gBACd,4BAA4B;gBAC5B,4BAA4B;gBAC5B,0BAA0B;aAC3B,CAAA;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;gBACxB,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACvB,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;oBAC7C,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;oBACnC,kEAAkE;oBAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;oBAChD,MAAK;iBACN;aACF;SACF;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BundlerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error?.error || error || {}\n\n return (\n message.includes('UserOperation reverted during simulation with reason:') ||\n message.includes('pimlico_getUserOperationGasPrice') ||\n message.includes('UserOperation failed validation with reason:') ||\n message.includes('UserOperation reverted with reason:')\n )\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n let reason = ''\n\n if (message.includes('pimlico_getUserOperationGasPrice')) {\n reason = 'pimlico_getUserOperationGasPrice'\n } else {\n const userOperationSimulationRegex =\n /UserOperation reverted during simulation with reason:\\s*/i\n const userOperationValidationRegex = /UserOperation failed validation with reason:\\s*/i\n const userOperationRevertedRegex = /UserOperation reverted with reason:\\s*/i\n const regexes = [\n userOperationSimulationRegex,\n userOperationValidationRegex,\n userOperationRevertedRegex\n ]\n\n for (let i = 0; i < regexes.length; i++) {\n const regex = regexes[i]\n if (regex.test(message)) {\n const EntryPointErrorCode = /AA[0-9]{1,2}\\s?/\n reason = message.replace(regex, '')\n // Remove error codes like AA1, AA2, etc. and the space after them\n reason = reason.replace(EntryPointErrorCode, '')\n break\n }\n }\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BundlerErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.d.ts b/dist/src/libs/errorDecoder/handlers/custom.d.ts new file mode 100644 index 000000000..ccea0b5e4 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/custom.d.ts @@ -0,0 +1,8 @@ +import { DecodedError, ErrorHandler } from '../types'; +/** Handles custom errors thrown by contracts */ +declare class CustomErrorHandler implements ErrorHandler { + matches(data: string): boolean; + handle(data: string): DecodedError; +} +export default CustomErrorHandler; +//# sourceMappingURL=custom.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.d.ts.map b/dist/src/libs/errorDecoder/handlers/custom.d.ts.map new file mode 100644 index 000000000..6347057cc --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/custom.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/custom.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,gDAAgD;AAChD,cAAM,kBAAmB,YAAW,YAAY;IACvC,OAAO,CAAC,IAAI,EAAE,MAAM;IASpB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;CAU1C;AAED,eAAe,kBAAkB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.js b/dist/src/libs/errorDecoder/handlers/custom.js new file mode 100644 index 000000000..4e65423c6 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/custom.js @@ -0,0 +1,24 @@ +/* eslint-disable class-methods-use-this */ +import { ERROR_PREFIX, PANIC_ERROR_PREFIX } from '../constants'; +import { ErrorType } from '../types'; +/** Handles custom errors thrown by contracts */ +class CustomErrorHandler { + matches(data) { + return (!!data && + data !== '0x' && + !data?.startsWith(ERROR_PREFIX) && + !data?.startsWith(PANIC_ERROR_PREFIX)); + } + handle(data) { + return { + type: ErrorType.CustomError, + // Custom errors do not provide a specific reason. + // Therefore, we return the raw data in hexadecimal format, + // which can be used to map to a corresponding error message. + reason: data, + data + }; + } +} +export default CustomErrorHandler; +//# sourceMappingURL=custom.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.js.map b/dist/src/libs/errorDecoder/handlers/custom.js.map new file mode 100644 index 000000000..12eb3b6da --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/custom.js.map @@ -0,0 +1 @@ +{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/custom.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,gDAAgD;AAChD,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,CACL,CAAC,CAAC,IAAI;YACN,IAAI,KAAK,IAAI;YACb,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;YAC/B,CAAC,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CACtC,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,WAAW;YAC3B,kDAAkD;YAClD,2DAA2D;YAC3D,6DAA6D;YAC7D,MAAM,EAAE,IAAI;YACZ,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\n/** Handles custom errors thrown by contracts */\nclass CustomErrorHandler implements ErrorHandler {\n public matches(data: string) {\n return (\n !!data &&\n data !== '0x' &&\n !data?.startsWith(ERROR_PREFIX) &&\n !data?.startsWith(PANIC_ERROR_PREFIX)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.CustomError,\n // Custom errors do not provide a specific reason.\n // Therefore, we return the raw data in hexadecimal format,\n // which can be used to map to a corresponding error message.\n reason: data,\n data\n }\n }\n}\n\nexport default CustomErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.d.ts b/dist/src/libs/errorDecoder/handlers/index.d.ts new file mode 100644 index 000000000..b18be7d84 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/index.d.ts @@ -0,0 +1,10 @@ +import BundlerErrorHandler from './bundler'; +import CustomErrorHandler from './custom'; +import InnerCallFailureHandler from './innerCallFailure'; +import PanicErrorHandler from './panic'; +import PaymasterErrorHandler from './paymaster'; +import RevertErrorHandler from './revert'; +import RpcErrorHandler from './rpc'; +import UserRejectionHandler from './userRejection'; +export { BundlerErrorHandler, RpcErrorHandler, InnerCallFailureHandler, PanicErrorHandler, RevertErrorHandler, PaymasterErrorHandler, UserRejectionHandler, CustomErrorHandler }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.d.ts.map b/dist/src/libs/errorDecoder/handlers/index.d.ts.map new file mode 100644 index 000000000..3983df601 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,WAAW,CAAA;AAC3C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,uBAAuB,MAAM,oBAAoB,CAAA;AACxD,OAAO,iBAAiB,MAAM,SAAS,CAAA;AACvC,OAAO,qBAAqB,MAAM,aAAa,CAAA;AAC/C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,eAAe,MAAM,OAAO,CAAA;AACnC,OAAO,oBAAoB,MAAM,iBAAiB,CAAA;AAElD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.js b/dist/src/libs/errorDecoder/handlers/index.js new file mode 100644 index 000000000..970fce2f5 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/index.js @@ -0,0 +1,10 @@ +import BundlerErrorHandler from './bundler'; +import CustomErrorHandler from './custom'; +import InnerCallFailureHandler from './innerCallFailure'; +import PanicErrorHandler from './panic'; +import PaymasterErrorHandler from './paymaster'; +import RevertErrorHandler from './revert'; +import RpcErrorHandler from './rpc'; +import UserRejectionHandler from './userRejection'; +export { BundlerErrorHandler, RpcErrorHandler, InnerCallFailureHandler, PanicErrorHandler, RevertErrorHandler, PaymasterErrorHandler, UserRejectionHandler, CustomErrorHandler }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.js.map b/dist/src/libs/errorDecoder/handlers/index.js.map new file mode 100644 index 000000000..d7d9d7b2c --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,WAAW,CAAA;AAC3C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,uBAAuB,MAAM,oBAAoB,CAAA;AACxD,OAAO,iBAAiB,MAAM,SAAS,CAAA;AACvC,OAAO,qBAAqB,MAAM,aAAa,CAAA;AAC/C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,eAAe,MAAM,OAAO,CAAA;AACnC,OAAO,oBAAoB,MAAM,iBAAiB,CAAA;AAElD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,CAAA","sourcesContent":["import BundlerErrorHandler from './bundler'\nimport CustomErrorHandler from './custom'\nimport InnerCallFailureHandler from './innerCallFailure'\nimport PanicErrorHandler from './panic'\nimport PaymasterErrorHandler from './paymaster'\nimport RevertErrorHandler from './revert'\nimport RpcErrorHandler from './rpc'\nimport UserRejectionHandler from './userRejection'\n\nexport {\n BundlerErrorHandler,\n RpcErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler,\n CustomErrorHandler\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts b/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts new file mode 100644 index 000000000..5d4dbc048 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts @@ -0,0 +1,8 @@ +import { DecodedError, ErrorHandler, ErrorType } from '../types'; +declare class InnerCallFailureHandler implements ErrorHandler { + type: ErrorType; + matches(data: string, error: Error): boolean; + handle(data: string, error: Error): DecodedError; +} +export default InnerCallFailureHandler; +//# sourceMappingURL=innerCallFailure.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts.map b/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts.map new file mode 100644 index 000000000..1e7e23eef --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"innerCallFailure.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/innerCallFailure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,cAAM,uBAAwB,YAAW,YAAY;IACnD,IAAI,YAAkC;IAE/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,YAAY;CAwCxD;AAED,eAAe,uBAAuB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js new file mode 100644 index 000000000..c6acadaed --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js @@ -0,0 +1,45 @@ +import { ErrorType } from '../types'; +class InnerCallFailureHandler { + type = ErrorType.InnerCallFailureError; + matches(data, error) { + return error.name === 'InnerCallFailureError'; + } + handle(data, error) { + const innerCallError = error; + const isError0x = innerCallError.message === '0x'; + // if an error has been found, report it back + if (!isError0x) { + const reason = innerCallError.message; + return { + type: this.type, + reason, + data: reason + }; + } + // if the error is 0x but we don't have info on the portfolio value + // because of an RPC failure or something, return error unknown + if (innerCallError.nativePortfolioValue === undefined) { + const reason = 'Inner call: 0x'; + return { + type: this.type, + reason, + data: reason + }; + } + let callsNative = 0n; + innerCallError.calls.forEach((call) => { + callsNative += call.value ?? 0n; + }); + const isCallsNativeMoreThanPortfolio = callsNative > innerCallError.nativePortfolioValue; + const reason = isCallsNativeMoreThanPortfolio + ? `Insufficient ${innerCallError.network.nativeAssetSymbol} for transaction calls` + : 'Inner call: 0x'; + return { + type: this.type, + reason, + data: reason + }; + } +} +export default InnerCallFailureHandler; +//# sourceMappingURL=innerCallFailure.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map new file mode 100644 index 000000000..35f30511e --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map @@ -0,0 +1 @@ +{"version":3,"file":"innerCallFailure.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/innerCallFailure.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,uBAAuB;IAC3B,IAAI,GAAG,SAAS,CAAC,qBAAqB,CAAA;IAE/B,OAAO,CAAC,IAAY,EAAE,KAAY;QACvC,OAAO,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,cAAc,GAAG,KAA8B,CAAA;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,KAAK,IAAI,CAAA;QAEjD,6CAA6C;QAC7C,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAA;YACrC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,mEAAmE;QACnE,+DAA+D;QAC/D,IAAI,cAAc,CAAC,oBAAoB,KAAK,SAAS,EAAE;YACrD,MAAM,MAAM,GAAG,gBAAgB,CAAA;YAC/B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,MAAM,8BAA8B,GAAG,WAAW,GAAG,cAAc,CAAC,oBAAqB,CAAA;QACzF,MAAM,MAAM,GAAG,8BAA8B;YAC3C,CAAC,CAAC,gBAAgB,cAAc,CAAC,OAAO,CAAC,iBAAiB,wBAAwB;YAClF,CAAC,CAAC,gBAAgB,CAAA;QAEpB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,uBAAuB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { InnerCallFailureError } from '../customErrors'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass InnerCallFailureHandler implements ErrorHandler {\n type = ErrorType.InnerCallFailureError\n\n public matches(data: string, error: Error) {\n return error.name === 'InnerCallFailureError'\n }\n\n public handle(data: string, error: Error): DecodedError {\n const innerCallError = error as InnerCallFailureError\n const isError0x = innerCallError.message === '0x'\n\n // if an error has been found, report it back\n if (!isError0x) {\n const reason = innerCallError.message\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n // if the error is 0x but we don't have info on the portfolio value\n // because of an RPC failure or something, return error unknown\n if (innerCallError.nativePortfolioValue === undefined) {\n const reason = 'Inner call: 0x'\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n let callsNative = 0n\n innerCallError.calls.forEach((call) => {\n callsNative += call.value ?? 0n\n })\n const isCallsNativeMoreThanPortfolio = callsNative > innerCallError.nativePortfolioValue!\n const reason = isCallsNativeMoreThanPortfolio\n ? `Insufficient ${innerCallError.network.nativeAssetSymbol} for transaction calls`\n : 'Inner call: 0x'\n\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n}\n\nexport default InnerCallFailureHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.d.ts b/dist/src/libs/errorDecoder/handlers/panic.d.ts new file mode 100644 index 000000000..df926f8f4 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/panic.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class PanicErrorHandler implements ErrorHandler { + matches(data: string): boolean; + handle(data: string): DecodedError; +} +export default PanicErrorHandler; +//# sourceMappingURL=panic.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.d.ts.map b/dist/src/libs/errorDecoder/handlers/panic.d.ts.map new file mode 100644 index 000000000..715a7c9b0 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/panic.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"panic.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/panic.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,iBAAkB,YAAW,YAAY;IACtC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;CAsB1C;AAED,eAAe,iBAAiB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.js b/dist/src/libs/errorDecoder/handlers/panic.js new file mode 100644 index 000000000..fe9088ef5 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/panic.js @@ -0,0 +1,34 @@ +/* eslint-disable class-methods-use-this */ +import { AbiCoder, ErrorFragment } from 'ethers'; +import { PANIC_ERROR_PREFIX } from '../constants'; +import { panicErrorCodeToReason } from '../helpers'; +import { ErrorType } from '../types'; +class PanicErrorHandler { + matches(data) { + return data?.startsWith(PANIC_ERROR_PREFIX); + } + handle(data) { + const encodedReason = data.slice(PANIC_ERROR_PREFIX.length); + const abi = new AbiCoder(); + try { + const fragment = ErrorFragment.from('Panic(uint256)'); + const args = abi.decode(fragment.inputs, `0x${encodedReason}`); + const reason = panicErrorCodeToReason(args[0]) ?? 'Unknown panic code'; + return { + type: ErrorType.PanicError, + reason, + data + }; + } + catch (e) { + console.error('Failed to decode panic error', e); + return { + type: ErrorType.PanicError, + reason: 'Failed to decode panic error', + data + }; + } + } +} +export default PanicErrorHandler; +//# sourceMappingURL=panic.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.js.map b/dist/src/libs/errorDecoder/handlers/panic.js.map new file mode 100644 index 000000000..4583a208c --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/panic.js.map @@ -0,0 +1 @@ +{"version":3,"file":"panic.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/panic.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,iBAAiB;IACd,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC7C,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC,IAAI,oBAAoB,CAAA;YAEhF,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,UAAU;gBAC1B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;YAChD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,UAAU;gBAC1B,MAAM,EAAE,8BAA8B;gBACtC,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { PANIC_ERROR_PREFIX } from '../constants'\nimport { panicErrorCodeToReason } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PanicErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(PANIC_ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(PANIC_ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Panic(uint256)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = panicErrorCodeToReason(args[0] as bigint) ?? 'Unknown panic code'\n\n return {\n type: ErrorType.PanicError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode panic error', e)\n return {\n type: ErrorType.PanicError,\n reason: 'Failed to decode panic error',\n data\n }\n }\n }\n}\n\nexport default PanicErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.d.ts b/dist/src/libs/errorDecoder/handlers/paymaster.d.ts new file mode 100644 index 000000000..1570b1893 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/paymaster.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class PaymasterErrorHandler implements ErrorHandler { + matches(data: string, error: any): boolean; + handle(data: string, error: any): DecodedError; +} +export default PaymasterErrorHandler; +//# sourceMappingURL=paymaster.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.d.ts.map b/dist/src/libs/errorDecoder/handlers/paymaster.d.ts.map new file mode 100644 index 000000000..c1ce676f9 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/paymaster.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"paymaster.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/paymaster.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,qBAAsB,YAAW,YAAY;IAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAMhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;CAStD;AAED,eAAe,qBAAqB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.js b/dist/src/libs/errorDecoder/handlers/paymaster.js new file mode 100644 index 000000000..74cefb46c --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/paymaster.js @@ -0,0 +1,18 @@ +/* eslint-disable class-methods-use-this */ +import { ErrorType } from '../types'; +class PaymasterErrorHandler { + matches(data, error) { + const { name } = error; + return name === 'PaymasterError' || name === 'PaymasterSponsorshipError'; + } + handle(data, error) { + const { message: reason } = error; + return { + type: ErrorType.PaymasterError, + reason, + data: '' + }; + } +} +export default PaymasterErrorHandler; +//# sourceMappingURL=paymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.js.map b/dist/src/libs/errorDecoder/handlers/paymaster.js.map new file mode 100644 index 000000000..1ae1eb3f9 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/paymaster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/paymaster.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,qBAAqB;IAClB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAEtB,OAAO,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,2BAA2B,CAAA;IAC1E,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;QAEjC,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,cAAc;YAC9B,MAAM;YACN,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;CACF;AAED,eAAe,qBAAqB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PaymasterErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { name } = error\n\n return name === 'PaymasterError' || name === 'PaymasterSponsorshipError'\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message: reason } = error\n\n return {\n type: ErrorType.PaymasterError,\n reason,\n data: ''\n }\n }\n}\n\nexport default PaymasterErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.d.ts b/dist/src/libs/errorDecoder/handlers/pimlico.d.ts new file mode 100644 index 000000000..2b8462b08 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/pimlico.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class PimlicoEstimationErrorHandler implements ErrorHandler { + matches(data: string, error: any): any; + handle(data: string, error: any): DecodedError; +} +export default PimlicoEstimationErrorHandler; +//# sourceMappingURL=pimlico.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.d.ts.map b/dist/src/libs/errorDecoder/handlers/pimlico.d.ts.map new file mode 100644 index 000000000..1ac2cb727 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/pimlico.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pimlico.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/pimlico.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,6BAA8B,YAAW,YAAY;IAClD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAMhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;CAgBtD;AAED,eAAe,6BAA6B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.js b/dist/src/libs/errorDecoder/handlers/pimlico.js new file mode 100644 index 000000000..5b2648ef4 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/pimlico.js @@ -0,0 +1,25 @@ +/* eslint-disable class-methods-use-this */ +import { PIMLICO } from '../../../consts/bundlers'; +import { ErrorType } from '../types'; +class PimlicoEstimationErrorHandler { + matches(data, error) { + const { bundlerName } = error; + return bundlerName && bundlerName === PIMLICO; + } + handle(data, error) { + const { message } = error?.error || error || {}; + const lowerCased = message.toLowerCase(); + // TODO: expand with more error cases + let reason = ''; + if (lowerCased.includes('internal error')) { + reason = 'pimlico: 500'; + } + return { + type: ErrorType.BundlerError, + reason, + data: reason + }; + } +} +export default PimlicoEstimationErrorHandler; +//# sourceMappingURL=pimlico.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.js.map b/dist/src/libs/errorDecoder/handlers/pimlico.js.map new file mode 100644 index 000000000..eb0f0a97b --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/pimlico.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/pimlico.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,6BAA6B;IAC1B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,OAAO,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACzC,MAAM,GAAG,cAAc,CAAA;SACxB;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,6BAA6B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { PIMLICO } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PimlicoEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === PIMLICO\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('internal error')) {\n reason = 'pimlico: 500'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default PimlicoEstimationErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.d.ts b/dist/src/libs/errorDecoder/handlers/relayer.d.ts new file mode 100644 index 000000000..4957569df --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/relayer.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class RelayerErrorHandler implements ErrorHandler { + matches(data: string, error: any): boolean; + handle(data: string, error: any): DecodedError; +} +export default RelayerErrorHandler; +//# sourceMappingURL=relayer.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.d.ts.map b/dist/src/libs/errorDecoder/handlers/relayer.d.ts.map new file mode 100644 index 000000000..e55453830 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/relayer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/relayer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,mBAAoB,YAAW,YAAY;IACxC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAQhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;CAyBtD;AAED,eAAe,mBAAmB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.js b/dist/src/libs/errorDecoder/handlers/relayer.js new file mode 100644 index 000000000..2b527e1f5 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/relayer.js @@ -0,0 +1,37 @@ +/* eslint-disable class-methods-use-this */ +import { RELAYER_DOWN_MESSAGE, RelayerError } from '../../relayerCall/relayerCall'; +import { isReasonValid } from '../helpers'; +import { ErrorType } from '../types'; +class RelayerErrorHandler { + matches(data, error) { + const { message } = error || {}; + if (message === RELAYER_DOWN_MESSAGE) + return true; + return error instanceof RelayerError; + } + handle(data, error) { + let reason = ''; + let finalData = ''; + if (error.message === RELAYER_DOWN_MESSAGE) { + // Relayer is down + reason = RELAYER_DOWN_MESSAGE; + } + else { + // RPC error returned as string + reason = error.message.match(/reason="([^"]*)"/)?.[1] || ''; + finalData = error.message.match(/data="([^"]*)"/)?.[1] || ''; + // The response isn't a stringified RPC error so the + // reason is likely the error message + if (!isReasonValid(reason) && !finalData) { + reason = error.message; + } + } + return { + type: ErrorType.RelayerError, + reason, + data: finalData + }; + } +} +export default RelayerErrorHandler; +//# sourceMappingURL=relayer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.js.map b/dist/src/libs/errorDecoder/handlers/relayer.js.map new file mode 100644 index 000000000..58d935bf7 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/relayer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"relayer.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/relayer.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QAE/B,IAAI,OAAO,KAAK,oBAAoB;YAAE,OAAO,IAAI,CAAA;QAEjD,OAAO,KAAK,YAAY,YAAY,CAAA;IACtC,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,SAAS,GAAG,EAAE,CAAA;QAElB,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,EAAE;YAC1C,kBAAkB;YAClB,MAAM,GAAG,oBAAoB,CAAA;SAC9B;aAAM;YACL,+BAA+B;YAC/B,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC3D,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAE5D,oDAAoD;YACpD,qCAAqC;YACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;gBACxC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;aACvB;SACF;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,SAAS;SAChB,CAAA;IACH,CAAC;CACF;AAED,eAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { RELAYER_DOWN_MESSAGE, RelayerError } from '../../relayerCall/relayerCall'\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RelayerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error || {}\n\n if (message === RELAYER_DOWN_MESSAGE) return true\n\n return error instanceof RelayerError\n }\n\n public handle(data: string, error: any): DecodedError {\n let reason = ''\n let finalData = ''\n\n if (error.message === RELAYER_DOWN_MESSAGE) {\n // Relayer is down\n reason = RELAYER_DOWN_MESSAGE\n } else {\n // RPC error returned as string\n reason = error.message.match(/reason=\"([^\"]*)\"/)?.[1] || ''\n finalData = error.message.match(/data=\"([^\"]*)\"/)?.[1] || ''\n\n // The response isn't a stringified RPC error so the\n // reason is likely the error message\n if (!isReasonValid(reason) && !finalData) {\n reason = error.message\n }\n }\n\n return {\n type: ErrorType.RelayerError,\n reason,\n data: finalData\n }\n }\n}\n\nexport default RelayerErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.d.ts b/dist/src/libs/errorDecoder/handlers/revert.d.ts new file mode 100644 index 000000000..e04e2ad1a --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/revert.d.ts @@ -0,0 +1,7 @@ +import { DecodedError, ErrorHandler } from '../types'; +declare class RevertErrorHandler implements ErrorHandler { + matches(data: string): boolean; + handle(data: string): DecodedError; +} +export default RevertErrorHandler; +//# sourceMappingURL=revert.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.d.ts.map b/dist/src/libs/errorDecoder/handlers/revert.d.ts.map new file mode 100644 index 000000000..10c561296 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/revert.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"revert.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/revert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,cAAM,kBAAmB,YAAW,YAAY;IACvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;CAuB1C;AAED,eAAe,kBAAkB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.js b/dist/src/libs/errorDecoder/handlers/revert.js new file mode 100644 index 000000000..9763d52b4 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/revert.js @@ -0,0 +1,33 @@ +/* eslint-disable class-methods-use-this */ +import { AbiCoder, ErrorFragment } from 'ethers'; +import { ERROR_PREFIX } from '../constants'; +import { ErrorType } from '../types'; +class RevertErrorHandler { + matches(data) { + return data?.startsWith(ERROR_PREFIX); + } + handle(data) { + const encodedReason = data.slice(ERROR_PREFIX.length); + const abi = new AbiCoder(); + try { + const fragment = ErrorFragment.from('Error(string)'); + const args = abi.decode(fragment.inputs, `0x${encodedReason}`); + const reason = args[0]; + return { + type: ErrorType.RevertError, + reason, + data + }; + } + catch (e) { + console.error('Failed to decode revert error', e); + return { + type: ErrorType.RevertError, + reason: '', + data + }; + } + } +} +export default RevertErrorHandler; +//# sourceMappingURL=revert.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.js.map b/dist/src/libs/errorDecoder/handlers/revert.js.map new file mode 100644 index 000000000..b99bedbe9 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/revert.js.map @@ -0,0 +1 @@ +{"version":3,"file":"revert.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/revert.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YAEhC,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,WAAW;gBAC3B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,WAAW;gBAC3B,MAAM,EAAE,EAAE;gBACV,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,eAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RevertErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Error(string)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = args[0] as string\n\n return {\n type: ErrorType.RevertError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode revert error', e)\n\n return {\n type: ErrorType.RevertError,\n reason: '',\n data\n }\n }\n }\n}\n\nexport default RevertErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.d.ts b/dist/src/libs/errorDecoder/handlers/rpc.d.ts new file mode 100644 index 000000000..b000c860b --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/rpc.d.ts @@ -0,0 +1,10 @@ +import { DecodedError, ErrorHandler } from '../types'; +export declare const RPC_HARDCODED_ERRORS: { + rpcTimeout: string; +}; +declare class RpcErrorHandler implements ErrorHandler { + matches(data: string, error: any): boolean; + handle(data: string, error: Error): DecodedError; +} +export default RpcErrorHandler; +//# sourceMappingURL=rpc.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.d.ts.map b/dist/src/libs/errorDecoder/handlers/rpc.d.ts.map new file mode 100644 index 000000000..f71b45dbf --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/rpc.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAGhE,eAAO,MAAM,oBAAoB;;CAEhC,CAAA;AAED,cAAM,eAAgB,YAAW,YAAY;IACpC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAehC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,YAAY;CAoBxD;AAED,eAAe,eAAe,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.js b/dist/src/libs/errorDecoder/handlers/rpc.js new file mode 100644 index 000000000..801f81c00 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/rpc.js @@ -0,0 +1,41 @@ +/* eslint-disable class-methods-use-this */ +import { isReasonValid } from '../helpers'; +import { ErrorType } from '../types'; +import { USER_REJECTED_TRANSACTION_ERROR_CODE } from './userRejection'; +export const RPC_HARDCODED_ERRORS = { + rpcTimeout: 'rpc-timeout' +}; +class RpcErrorHandler { + matches(data, error) { + // This is the only case in which we want to check for a specific error message + // because it's a custom error that should be handled as an RPC error + if (error?.message === RPC_HARDCODED_ERRORS.rpcTimeout) + return true; + return (!data && + !!error.message && + !error?.message?.includes('rejected transaction') && + // eslint-disable-next-line @typescript-eslint/no-explicit-any + error?.code !== undefined && + error.code !== USER_REJECTED_TRANSACTION_ERROR_CODE); + } + handle(data, error) { + const rpcError = error; + // The order is important here, we want to prioritize the most relevant reason + // Also, we do it this way as the reason can be in different places depending on the error + const possibleReasons = [ + rpcError.code, + rpcError.shortMessage, + rpcError.message, + rpcError.info?.error?.message, + rpcError.error?.message + ]; + const reason = possibleReasons.find((r) => !!r && isReasonValid(r)) || ''; + return { + type: ErrorType.RpcError, + reason, + data + }; + } +} +export default RpcErrorHandler; +//# sourceMappingURL=rpc.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.js.map b/dist/src/libs/errorDecoder/handlers/rpc.js.map new file mode 100644 index 000000000..77d82b1f8 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/rpc.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/rpc.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAChE,OAAO,EAAE,oCAAoC,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,aAAa;CAC1B,CAAA;AAED,MAAM,eAAe;IACZ,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,+EAA+E;QAC/E,qEAAqE;QACrE,IAAI,KAAK,EAAE,OAAO,KAAK,oBAAoB,CAAC,UAAU;YAAE,OAAO,IAAI,CAAA;QAEnE,OAAO,CACL,CAAC,IAAI;YACL,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;YACjD,8DAA8D;YAC9D,KAAK,EAAE,IAAI,KAAK,SAAS;YACzB,KAAK,CAAC,IAAI,KAAK,oCAAoC,CACpD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,QAAQ,GAAG,KAAY,CAAA;QAC7B,8EAA8E;QAC9E,0FAA0F;QAC1F,MAAM,eAAe,GAAG;YACtB,QAAQ,CAAC,IAAI;YACb,QAAQ,CAAC,YAAY;YACrB,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;YAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO;SACxB,CAAA;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAEzE,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,QAAQ;YACxB,MAAM;YACN,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,eAAe,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\nimport { USER_REJECTED_TRANSACTION_ERROR_CODE } from './userRejection'\n\nexport const RPC_HARDCODED_ERRORS = {\n rpcTimeout: 'rpc-timeout'\n}\n\nclass RpcErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n // This is the only case in which we want to check for a specific error message\n // because it's a custom error that should be handled as an RPC error\n if (error?.message === RPC_HARDCODED_ERRORS.rpcTimeout) return true\n\n return (\n !data &&\n !!error.message &&\n !error?.message?.includes('rejected transaction') &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error?.code !== undefined &&\n error.code !== USER_REJECTED_TRANSACTION_ERROR_CODE\n )\n }\n\n public handle(data: string, error: Error): DecodedError {\n const rpcError = error as any\n // The order is important here, we want to prioritize the most relevant reason\n // Also, we do it this way as the reason can be in different places depending on the error\n const possibleReasons = [\n rpcError.code,\n rpcError.shortMessage,\n rpcError.message,\n rpcError.info?.error?.message,\n rpcError.error?.message\n ]\n\n const reason = possibleReasons.find((r) => !!r && isReasonValid(r)) || ''\n\n return {\n type: ErrorType.RpcError,\n reason,\n data\n }\n }\n}\n\nexport default RpcErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.d.ts b/dist/src/libs/errorDecoder/handlers/userRejection.d.ts new file mode 100644 index 000000000..8a5740540 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/userRejection.d.ts @@ -0,0 +1,9 @@ +import { DecodedError, ErrorHandler } from '../types'; +export declare const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001; +export declare const TRANSACTION_REJECTED_REASON = "transaction-rejected"; +declare class UserRejectionHandler implements ErrorHandler { + matches(data: string, error: any): any; + handle(data: string): DecodedError; +} +export default UserRejectionHandler; +//# sourceMappingURL=userRejection.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.d.ts.map b/dist/src/libs/errorDecoder/handlers/userRejection.d.ts.map new file mode 100644 index 000000000..d37b121fb --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/userRejection.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"userRejection.d.ts","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/userRejection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,UAAU,CAAA;AAEhE,eAAO,MAAM,oCAAoC,OAAO,CAAA;AACxD,eAAO,MAAM,2BAA2B,yBAAyB,CAAA;AAEjE,cAAM,oBAAqB,YAAW,YAAY;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAQhC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;CAO1C;AAED,eAAe,oBAAoB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.js b/dist/src/libs/errorDecoder/handlers/userRejection.js new file mode 100644 index 000000000..bc8d868cd --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/userRejection.js @@ -0,0 +1,20 @@ +/* eslint-disable class-methods-use-this */ +import { ErrorType } from '../types'; +export const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001; +export const TRANSACTION_REJECTED_REASON = 'transaction-rejected'; +class UserRejectionHandler { + matches(data, error) { + return (!data && + (error?.message?.includes('rejected transaction') || + error?.code === USER_REJECTED_TRANSACTION_ERROR_CODE)); + } + handle(data) { + return { + type: ErrorType.UserRejectionError, + reason: TRANSACTION_REJECTED_REASON, + data + }; + } +} +export default UserRejectionHandler; +//# sourceMappingURL=userRejection.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.js.map b/dist/src/libs/errorDecoder/handlers/userRejection.js.map new file mode 100644 index 000000000..0e4f3c243 --- /dev/null +++ b/dist/src/libs/errorDecoder/handlers/userRejection.js.map @@ -0,0 +1 @@ +{"version":3,"file":"userRejection.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/userRejection.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAA;AACxD,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAAA;AAEjE,MAAM,oBAAoB;IACjB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,OAAO,CACL,CAAC,IAAI;YACL,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;gBAC/C,KAAK,EAAE,IAAI,KAAK,oCAAoC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,kBAAkB;YAClC,MAAM,EAAE,2BAA2B;YACnC,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,oBAAoB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nexport const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001\nexport const TRANSACTION_REJECTED_REASON = 'transaction-rejected'\n\nclass UserRejectionHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n return (\n !data &&\n (error?.message?.includes('rejected transaction') ||\n error?.code === USER_REJECTED_TRANSACTION_ERROR_CODE)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.UserRejectionError,\n reason: TRANSACTION_REJECTED_REASON,\n data\n }\n }\n}\n\nexport default UserRejectionHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.d.ts b/dist/src/libs/errorDecoder/helpers.d.ts new file mode 100644 index 000000000..d0c978e23 --- /dev/null +++ b/dist/src/libs/errorDecoder/helpers.d.ts @@ -0,0 +1,11 @@ +declare const panicErrorCodeToReason: (errorCode: bigint) => string | undefined; +declare const isReasonValid: (reason: string | null) => boolean; +/** + * Some reasons are encoded in hex, this function will decode them to a human-readable string + * which can then be matched to a specific error message. + */ +declare const formatReason: (reason: string) => string; +declare const getErrorCodeStringFromReason: (reason: string, withSpace?: boolean) => string; +declare function getDataFromError(error: Error): string; +export { panicErrorCodeToReason, getErrorCodeStringFromReason, isReasonValid, getDataFromError, formatReason }; +//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.d.ts.map b/dist/src/libs/errorDecoder/helpers.d.ts.map new file mode 100644 index 000000000..2e9b3b6dd --- /dev/null +++ b/dist/src/libs/errorDecoder/helpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/helpers.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,sBAAsB,cAAe,MAAM,KAAG,MAAM,GAAG,SAyB5D,CAAA;AAED,QAAA,MAAM,aAAa,WAAY,MAAM,GAAG,IAAI,KAAG,OAW9C,CAAA;AAED;;;GAGG;AACH,QAAA,MAAM,YAAY,WAAY,MAAM,KAAG,MAWtC,CAAA;AAED,QAAA,MAAM,4BAA4B,WAAY,MAAM,0BAAqB,MAMxE,CAAA;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAmB9C;AAED,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,aAAa,EACb,gBAAgB,EAChB,YAAY,EACb,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.js b/dist/src/libs/errorDecoder/helpers.js new file mode 100644 index 000000000..9c3c0ec3c --- /dev/null +++ b/dist/src/libs/errorDecoder/helpers.js @@ -0,0 +1,78 @@ +import { isHexString, toUtf8String } from 'ethers'; +import { ERROR_PREFIX, PANIC_ERROR_PREFIX } from './constants'; +const panicErrorCodeToReason = (errorCode) => { + switch (errorCode) { + case 0x0n: + return 'Generic compiler inserted panic'; + case 0x1n: + return 'Assertion error'; + case 0x11n: + return 'Arithmetic operation underflowed or overflowed outside of an unchecked block'; + case 0x12n: + return 'Division or modulo division by zero'; + case 0x21n: + return 'Tried to convert a value into an enum, but the value was too big or negative'; + case 0x22n: + return 'Incorrectly encoded storage byte array'; + case 0x31n: + return '.pop() was called on an empty array'; + case 0x32n: + return 'Array accessed at an out-of-bounds or negative index'; + case 0x41n: + return 'Too much memory was allocated, or an array was created that is too large'; + case 0x51n: + return 'Called a zero-initialized variable of internal function type'; + default: + return undefined; + } +}; +const isReasonValid = (reason) => { + return (!!reason && + typeof reason === 'string' && + reason !== '0x' && + reason !== 'Unknown error' && + reason !== 'UNKNOWN_ERROR' && + !reason.startsWith(ERROR_PREFIX) && + !reason.startsWith(PANIC_ERROR_PREFIX) && + !reason.toLowerCase().includes('could not coalesce error')); +}; +/** + * Some reasons are encoded in hex, this function will decode them to a human-readable string + * which can then be matched to a specific error message. + */ +const formatReason = (reason) => { + const trimmedReason = reason.trim(); + if (!isHexString(trimmedReason)) + return trimmedReason; + if (trimmedReason.startsWith(ERROR_PREFIX) || trimmedReason.startsWith(PANIC_ERROR_PREFIX)) + return trimmedReason; + try { + return toUtf8String(trimmedReason); + } + catch { + return trimmedReason; + } +}; +const getErrorCodeStringFromReason = (reason, withSpace = true) => { + if (!reason || !isReasonValid(reason)) + return ''; + const truncatedReason = reason.length > 100 ? `${reason.slice(0, 100)}...` : reason; + return `${withSpace ? ' ' : ''}Error code: ${truncatedReason}`; +}; +function getDataFromError(error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const errorData = error.data ?? error.error?.data; + if (errorData === undefined) { + return ''; + } + let returnData = typeof errorData === 'string' ? errorData : errorData.data; + if (typeof returnData === 'object' && returnData.data) { + returnData = returnData.data; + } + if (returnData === undefined || typeof returnData !== 'string') { + return ''; + } + return returnData; +} +export { panicErrorCodeToReason, getErrorCodeStringFromReason, isReasonValid, getDataFromError, formatReason }; +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.js.map b/dist/src/libs/errorDecoder/helpers.js.map new file mode 100644 index 000000000..71e3b1674 --- /dev/null +++ b/dist/src/libs/errorDecoder/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from './constants'\n\nconst panicErrorCodeToReason = (errorCode: bigint): string | undefined => {\n switch (errorCode) {\n case 0x0n:\n return 'Generic compiler inserted panic'\n case 0x1n:\n return 'Assertion error'\n case 0x11n:\n return 'Arithmetic operation underflowed or overflowed outside of an unchecked block'\n case 0x12n:\n return 'Division or modulo division by zero'\n case 0x21n:\n return 'Tried to convert a value into an enum, but the value was too big or negative'\n case 0x22n:\n return 'Incorrectly encoded storage byte array'\n case 0x31n:\n return '.pop() was called on an empty array'\n case 0x32n:\n return 'Array accessed at an out-of-bounds or negative index'\n case 0x41n:\n return 'Too much memory was allocated, or an array was created that is too large'\n case 0x51n:\n return 'Called a zero-initialized variable of internal function type'\n default:\n return undefined\n }\n}\n\nconst isReasonValid = (reason: string | null): boolean => {\n return (\n !!reason &&\n typeof reason === 'string' &&\n reason !== '0x' &&\n reason !== 'Unknown error' &&\n reason !== 'UNKNOWN_ERROR' &&\n !reason.startsWith(ERROR_PREFIX) &&\n !reason.startsWith(PANIC_ERROR_PREFIX) &&\n !reason.toLowerCase().includes('could not coalesce error')\n )\n}\n\n/**\n * Some reasons are encoded in hex, this function will decode them to a human-readable string\n * which can then be matched to a specific error message.\n */\nconst formatReason = (reason: string): string => {\n const trimmedReason = reason.trim()\n if (!isHexString(trimmedReason)) return trimmedReason\n if (trimmedReason.startsWith(ERROR_PREFIX) || trimmedReason.startsWith(PANIC_ERROR_PREFIX))\n return trimmedReason\n\n try {\n return toUtf8String(trimmedReason)\n } catch {\n return trimmedReason\n }\n}\n\nconst getErrorCodeStringFromReason = (reason: string, withSpace = true): string => {\n if (!reason || !isReasonValid(reason)) return ''\n\n const truncatedReason = reason.length > 100 ? `${reason.slice(0, 100)}...` : reason\n\n return `${withSpace ? ' ' : ''}Error code: ${truncatedReason}`\n}\n\nfunction getDataFromError(error: Error): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorData = (error as any).data ?? (error as any).error?.data\n\n if (errorData === undefined) {\n return ''\n }\n\n let returnData = typeof errorData === 'string' ? errorData : errorData.data\n\n if (typeof returnData === 'object' && returnData.data) {\n returnData = returnData.data\n }\n\n if (returnData === undefined || typeof returnData !== 'string') {\n return ''\n }\n\n return returnData\n}\n\nexport {\n panicErrorCodeToReason,\n getErrorCodeStringFromReason,\n isReasonValid,\n getDataFromError,\n formatReason\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.d.ts b/dist/src/libs/errorDecoder/index.d.ts new file mode 100644 index 000000000..4db93b680 --- /dev/null +++ b/dist/src/libs/errorDecoder/index.d.ts @@ -0,0 +1,3 @@ +import { decodeError } from './errorDecoder'; +export { decodeError }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.d.ts.map b/dist/src/libs/errorDecoder/index.d.ts.map new file mode 100644 index 000000000..7379ec0ba --- /dev/null +++ b/dist/src/libs/errorDecoder/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.js b/dist/src/libs/errorDecoder/index.js new file mode 100644 index 000000000..8fd4b94c3 --- /dev/null +++ b/dist/src/libs/errorDecoder/index.js @@ -0,0 +1,3 @@ +import { decodeError } from './errorDecoder'; +export { decodeError }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.js.map b/dist/src/libs/errorDecoder/index.js.map new file mode 100644 index 000000000..a88bb4be1 --- /dev/null +++ b/dist/src/libs/errorDecoder/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,CAAA","sourcesContent":["import { decodeError } from './errorDecoder'\n\nexport { decodeError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.d.ts b/dist/src/libs/errorDecoder/types.d.ts new file mode 100644 index 000000000..8728e3554 --- /dev/null +++ b/dist/src/libs/errorDecoder/types.d.ts @@ -0,0 +1,34 @@ +export declare enum ErrorType { + /** Reference, Type, Syntax and Range errors (JS/TS) */ + CodeError = "CodeError", + /** Error due to contract reverting, identified by prefix 0x08c379a0 */ + RevertError = "RevertError", + /** Error due to contract panic, identified by prefix 0x4e487b71 */ + PanicError = "PanicError", + /** Error originating from a relayer call */ + RelayerError = "RelayerError", + /** Error originating from the Paymaster (our Relayer) */ + PaymasterError = "PaymasterError", + /** Error during bundler estimation or broadcast */ + BundlerError = "BundlerError", + /** Custom contract errors */ + CustomError = "CustomError", + /** Error from an RPC call */ + RpcError = "RpcError", + /** Error that cannot be decoded */ + UnknownError = "UnknownError", + /** Error due to the user rejecting a transaction */ + UserRejectionError = "UserRejectionError", + /** Error due to an inner call failure during estimation */ + InnerCallFailureError = "InnerCallFailureError" +} +export type DecodedError = { + type: ErrorType; + reason: string | null; + data: string | null; +}; +export type ErrorHandler = { + matches: (data: string, error: Error) => boolean; + handle: (data: string, error: Error) => DecodedError; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.d.ts.map b/dist/src/libs/errorDecoder/types.d.ts.map new file mode 100644 index 000000000..9f5b24c84 --- /dev/null +++ b/dist/src/libs/errorDecoder/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/types.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,uDAAuD;IACvD,SAAS,cAAc;IACvB,uEAAuE;IACvE,WAAW,gBAAgB;IAC3B,mEAAmE;IACnE,UAAU,eAAe;IACzB,4CAA4C;IAC5C,YAAY,iBAAiB;IAC7B,yDAAyD;IACzD,cAAc,mBAAmB;IACjC,mDAAmD;IACnD,YAAY,iBAAiB;IAC7B,6BAA6B;IAC7B,WAAW,gBAAgB;IAC3B,6BAA6B;IAC7B,QAAQ,aAAa;IACrB,mCAAmC;IACnC,YAAY,iBAAiB;IAC7B,oDAAoD;IACpD,kBAAkB,uBAAuB;IACzC,2DAA2D;IAC3D,qBAAqB,0BAA0B;CAChD;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;IAChD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,YAAY,CAAA;CACrD,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.js b/dist/src/libs/errorDecoder/types.js new file mode 100644 index 000000000..2c00d2c3d --- /dev/null +++ b/dist/src/libs/errorDecoder/types.js @@ -0,0 +1,26 @@ +export var ErrorType; +(function (ErrorType) { + /** Reference, Type, Syntax and Range errors (JS/TS) */ + ErrorType["CodeError"] = "CodeError"; + /** Error due to contract reverting, identified by prefix 0x08c379a0 */ + ErrorType["RevertError"] = "RevertError"; + /** Error due to contract panic, identified by prefix 0x4e487b71 */ + ErrorType["PanicError"] = "PanicError"; + /** Error originating from a relayer call */ + ErrorType["RelayerError"] = "RelayerError"; + /** Error originating from the Paymaster (our Relayer) */ + ErrorType["PaymasterError"] = "PaymasterError"; + /** Error during bundler estimation or broadcast */ + ErrorType["BundlerError"] = "BundlerError"; + /** Custom contract errors */ + ErrorType["CustomError"] = "CustomError"; + /** Error from an RPC call */ + ErrorType["RpcError"] = "RpcError"; + /** Error that cannot be decoded */ + ErrorType["UnknownError"] = "UnknownError"; + /** Error due to the user rejecting a transaction */ + ErrorType["UserRejectionError"] = "UserRejectionError"; + /** Error due to an inner call failure during estimation */ + ErrorType["InnerCallFailureError"] = "InnerCallFailureError"; +})(ErrorType || (ErrorType = {})); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.js.map b/dist/src/libs/errorDecoder/types.js.map new file mode 100644 index 000000000..1c0b220db --- /dev/null +++ b/dist/src/libs/errorDecoder/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAuBX;AAvBD,WAAY,SAAS;IACnB,uDAAuD;IACvD,oCAAuB,CAAA;IACvB,uEAAuE;IACvE,wCAA2B,CAAA;IAC3B,mEAAmE;IACnE,sCAAyB,CAAA;IACzB,4CAA4C;IAC5C,0CAA6B,CAAA;IAC7B,yDAAyD;IACzD,8CAAiC,CAAA;IACjC,mDAAmD;IACnD,0CAA6B,CAAA;IAC7B,6BAA6B;IAC7B,wCAA2B,CAAA;IAC3B,6BAA6B;IAC7B,kCAAqB,CAAA;IACrB,mCAAmC;IACnC,0CAA6B,CAAA;IAC7B,oDAAoD;IACpD,sDAAyC,CAAA;IACzC,2DAA2D;IAC3D,4DAA+C,CAAA;AACjD,CAAC,EAvBW,SAAS,KAAT,SAAS,QAuBpB","sourcesContent":["export enum ErrorType {\n /** Reference, Type, Syntax and Range errors (JS/TS) */\n CodeError = 'CodeError',\n /** Error due to contract reverting, identified by prefix 0x08c379a0 */\n RevertError = 'RevertError',\n /** Error due to contract panic, identified by prefix 0x4e487b71 */\n PanicError = 'PanicError',\n /** Error originating from a relayer call */\n RelayerError = 'RelayerError',\n /** Error originating from the Paymaster (our Relayer) */\n PaymasterError = 'PaymasterError',\n /** Error during bundler estimation or broadcast */\n BundlerError = 'BundlerError',\n /** Custom contract errors */\n CustomError = 'CustomError',\n /** Error from an RPC call */\n RpcError = 'RpcError',\n /** Error that cannot be decoded */\n UnknownError = 'UnknownError',\n /** Error due to the user rejecting a transaction */\n UserRejectionError = 'UserRejectionError',\n /** Error due to an inner call failure during estimation */\n InnerCallFailureError = 'InnerCallFailureError'\n}\n\nexport type DecodedError = {\n type: ErrorType\n reason: string | null\n data: string | null\n}\n\nexport type ErrorHandler = {\n matches: (data: string, error: Error) => boolean\n handle: (data: string, error: Error) => DecodedError\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts new file mode 100644 index 000000000..4283e3450 --- /dev/null +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts @@ -0,0 +1,4 @@ +import { DecodedError } from '../errorDecoder/types'; +export declare const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE = "Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists"; +export declare function getHumanReadableBroadcastError(e: Error | DecodedError): Error; +//# sourceMappingURL=broadcastErrorHumanizer.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts.map b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts.map new file mode 100644 index 000000000..27220a6c8 --- /dev/null +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"broadcastErrorHumanizer.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/broadcastErrorHumanizer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAa,MAAM,uBAAuB,CAAA;AAQ/D,eAAO,MAAM,sCAAsC,oLACgI,CAAA;AAOnL,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,SAgCrE"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js new file mode 100644 index 000000000..f687ab631 --- /dev/null +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js @@ -0,0 +1,33 @@ +import EmittableError from '../../classes/EmittableError'; +import ExternalSignerError from '../../classes/ExternalSignerError'; +import { decodeError } from '../errorDecoder'; +import { ErrorType } from '../errorDecoder/types'; +import { BROADCAST_ERRORS } from './errors'; +import { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'; +import { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'; +const LAST_RESORT_ERROR_MESSAGE = 'An unknown error occurred while broadcasting the transaction. Please try again or contact Ambire support for assistance.'; +const MESSAGE_PREFIX = 'The transaction cannot be broadcast because'; +export const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE = 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'; +function getPrefix(reason) { + if (!reason) + return MESSAGE_PREFIX; + return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''; +} +export function getHumanReadableBroadcastError(e) { + if (e instanceof EmittableError || e instanceof ExternalSignerError) { + return e; + } + const decodedError = e instanceof Error ? decodeError(e) : e; + const commonError = humanizeEstimationOrBroadcastError(decodedError.reason, getPrefix(decodedError.reason)); + let errorMessage = getHumanReadableErrorMessage(commonError, BROADCAST_ERRORS, MESSAGE_PREFIX, decodedError.reason, e); + if (!errorMessage) { + if (decodedError.type === ErrorType.PaymasterError) { + errorMessage = PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE; + } + else { + errorMessage = getGenericMessageFromType(decodedError.type, decodedError.reason, MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); + } + } + return new Error(errorMessage, { cause: decodedError.reason }); +} +//# sourceMappingURL=broadcastErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map new file mode 100644 index 000000000..f22bc4b06 --- /dev/null +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"broadcastErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/broadcastErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAgB,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE1E,MAAM,yBAAyB,GAC7B,0HAA0H,CAAA;AAC5H,MAAM,cAAc,GAAG,6CAA6C,CAAA;AACpE,MAAM,CAAC,MAAM,sCAAsC,GACjD,iLAAiL,CAAA;AAEnL,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,cAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,CAAuB;IACpE,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,YAAY,mBAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,kCAAkC,CACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,4BAA4B,CAC7C,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,cAAc,EAAE;YAClD,YAAY,GAAG,sCAAsC,CAAA;SACtD;aAAM;YACL,YAAY,GAAG,yBAAyB,CACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,cAAc,EACd,yBAAyB,CAC1B,CAAA;SACF;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { BROADCAST_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while broadcasting the transaction. Please try again or contact Ambire support for assistance.'\nconst MESSAGE_PREFIX = 'The transaction cannot be broadcast because'\nexport const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE =\n 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableBroadcastError(e: Error | DecodedError) {\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n BROADCAST_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n if (decodedError.type === ErrorType.PaymasterError) {\n errorMessage = PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE\n } else {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.d.ts b/dist/src/libs/errorHumanizer/errors.d.ts new file mode 100644 index 000000000..31b926bea --- /dev/null +++ b/dist/src/libs/errorHumanizer/errors.d.ts @@ -0,0 +1,7 @@ +import { ErrorHumanizerError } from './types'; +declare const insufficientPaymasterFunds = "the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options."; +declare const BROADCAST_OR_ESTIMATION_ERRORS: ErrorHumanizerError[]; +declare const BROADCAST_ERRORS: ErrorHumanizerError[]; +declare const ESTIMATION_ERRORS: ErrorHumanizerError[]; +export { BROADCAST_OR_ESTIMATION_ERRORS, BROADCAST_ERRORS, ESTIMATION_ERRORS, insufficientPaymasterFunds }; +//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.d.ts.map b/dist/src/libs/errorHumanizer/errors.d.ts.map new file mode 100644 index 000000000..873fc2bac --- /dev/null +++ b/dist/src/libs/errorHumanizer/errors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/errors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE7C,QAAA,MAAM,0BAA0B,uJACsH,CAAA;AAEtJ,QAAA,MAAM,8BAA8B,EAAE,mBAAmB,EAyGxD,CAAA;AAED,QAAA,MAAM,gBAAgB,EAAE,mBAAmB,EAc1C,CAAA;AAED,QAAA,MAAM,iBAAiB,EAAE,mBAAmB,EAyD3C,CAAA;AAED,OAAO,EACL,8BAA8B,EAC9B,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.js b/dist/src/libs/errorHumanizer/errors.js new file mode 100644 index 000000000..9ca66a8b2 --- /dev/null +++ b/dist/src/libs/errorHumanizer/errors.js @@ -0,0 +1,163 @@ +import { EXPIRED_PREFIX } from '../errorDecoder/constants'; +import { RPC_HARDCODED_ERRORS } from '../errorDecoder/handlers/rpc'; +import { RELAYER_DOWN_MESSAGE } from '../relayerCall/relayerCall'; +const insufficientPaymasterFunds = "the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options."; +const BROADCAST_OR_ESTIMATION_ERRORS = [ + // Rpc + { + reasons: ['Method not found'], + message: 'the RPC provider does not support the requested operation. Please check your RPC settings or contact the app team.' + }, + { + reasons: [RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'], + message: 'of a problem with the RPC on this network. Please try again later, change the RPC or contact support for assistance.' + }, + { + reasons: ['Invalid JSON RPC parameters'], + message: 'of a RPC request that contains invalid or missing parameters. Please try again later or contact support.' + }, + { + reasons: ['Too Many Requests'], + message: 'your wallet has sent too many requests in a short time. Please wait a moment and try again.' + }, + // Contract / Transaction + { + reasons: ['IMPOSSIBLE_GAS_CONSUMPTION'], + message: 'of a low gas limit. Please try again or contact support for assistance.' + }, + { + reasons: ['INSUFFICIENT_FUNDS', 'insufficient funds'], + message: 'of insufficient funds for the transaction fee. Please add more fee tokens to your account and try again.' + }, + { + reasons: ['transfer amount exceeds balance'], + message: 'the transfer amount exceeds your account balance. Please check your balance or adjust the transfer amount.' + }, + { + reasons: ['ERC721: insufficient balance for transfer'], + message: 'you do not have enough of the specified NFT in your account. Please check your balance or adjust the transfer amount.' + }, + { + reasons: ['Low gas limit'], + message: 'of a low gas limit. Please try again or contact support for assistance.' + }, + { + reasons: ['Transaction underpriced'], + message: 'it is underpriced. Please select a higher transaction speed and try again.' + }, + // Smart Accounts + { + reasons: ['Sponsorship failed.'], + message: 'the gas sponsorship was refused by the app. Please try again by paying for the gas instead' + }, + { + reasons: ['paymaster deposit too low'], + message: insufficientPaymasterFunds + }, + // Relayer + { + reasons: [RELAYER_DOWN_MESSAGE], + message: 'the Ambire relayer is temporarily down.\nPlease try again or contact Ambire support for assistance.' + }, + { + reasons: ['user nonce too low'], + message: 'the user nonce is too low. Is there a pending transaction? Please try broadcasting again.' + }, + // dApp interactions + { + reasons: ['INSUFFICIENT_INPUT_AMOUNT'], + message: 'the input token amount is too low. Please increase the token amount and try again.' + }, + { + reasons: ['INSUFFICIENT_OUTPUT_AMOUNT'], + message: 'the slippage tolerance was exceeded. Please reduce the slippage tolerance in the app and try again.' + }, + { + reasons: ['80'], + message: "the smart contract you're interacting with doesn't support this operation. This could be due to contract restrictions, insufficient permissions, or specific conditions that haven't been met. Please review the requirements of this operation or consult the contract documentation." + }, + { + reasons: ['STF'], + message: 'of one of the following reasons: missing approval, insufficient approved amount, the amount exceeds the account balance.' + }, + { + reasons: [EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'], + message: 'the swap has expired. Return to the app and reinitiate the swap if you wish to proceed.' + }, + // bundler + { + reasons: ['biconomy: 400'], + message: 'it will revert onchain with reason unknown.' + }, + { + reasons: ['pimlico: 500'], + message: 'The bundler seems to be down at the moment. Please try again later' + } +]; +const BROADCAST_ERRORS = [ + { + reasons: ['pimlico_getUserOperationGasPrice'], + message: 'the selected fee is too low. Please select a higher transaction speed and try again.' + }, + { + reasons: ['Replacement transaction underpriced'], + message: 'the gas fee for replacing a pending transaction is too low. Please try again.' + }, + { + reasons: ['Max fee per gas less than block base fee'], + message: 'the fee set for the transaction is lower than the network’s current base fee. Please try again with a higher fee.' + } +]; +const ESTIMATION_ERRORS = [ + { + reasons: ['SPOOF_ERROR', 'INSUFFICIENT_PRIVILEGE'], + message: 'your account key lacks the necessary permissions. Ensure that you have authorization to sign or use an account with sufficient privileges.' + }, + { + reasons: [ + 'caller is a contract', + 'contract not allowed', + 'contract not supported', + 'No contractz allowed', + 'contracts allowed', + 'ontract is not allowed' + ], + message: 'this app does not support Smart Account wallets. Use a Basic Account (EOA) instead.' + }, + // Contract errors + { + reasons: ['0x7b36c479', '0x81ceff30'], + message: 'of a Swap failure. Please try performing the same swap again.' + }, + { + reasons: ['ERC721: token already minted'], + message: 'the NFT you are trying to mint is already minted. This can also happen if you have batched multiple mint transactions for the same NFT.' + }, + { + reasons: ['ERC721: token does not exist'], + message: 'the NFT you are trying to interact with does not exist. Ensure you are using the correct token ID.' + }, + { + reasons: ['Inner call: 0x'], + message: 'it reverted onchain with reason unknown.' + }, + // Rare contract errors + { + reasons: ['AccessControl: account is missing role'], + message: 'your account lacks the necessary permissions to perform this action. Please contact the contract owner or ensure you have the required role.' + }, + { + reasons: ['Pausable: paused'], + message: 'the contract is currently paused. Please wait until it is active or contact the contract owner for more information.' + }, + { + reasons: ['Contract code size exceeds'], + message: 'the contract’s size exceeds the EVM limit for deployment. Please ensure the contract is optimized before redeploying.' + }, + { + reasons: ['Constructor reverted'], + message: 'the smart contract’s initialization failed. This is likely a deployment issue; please check the constructor parameters.' + } +]; +export { BROADCAST_OR_ESTIMATION_ERRORS, BROADCAST_ERRORS, ESTIMATION_ERRORS, insufficientPaymasterFunds }; +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.js.map b/dist/src/libs/errorHumanizer/errors.js.map new file mode 100644 index 000000000..32940f014 --- /dev/null +++ b/dist/src/libs/errorHumanizer/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXPIRED_PREFIX } from '../errorDecoder/constants'\nimport { RPC_HARDCODED_ERRORS } from '../errorDecoder/handlers/rpc'\nimport { RELAYER_DOWN_MESSAGE } from '../relayerCall/relayerCall'\nimport { ErrorHumanizerError } from './types'\n\nconst insufficientPaymasterFunds =\n \"the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options.\"\n\nconst BROADCAST_OR_ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n // Rpc\n {\n reasons: ['Method not found'],\n message:\n 'the RPC provider does not support the requested operation. Please check your RPC settings or contact the app team.'\n },\n {\n reasons: [RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'],\n message:\n 'of a problem with the RPC on this network. Please try again later, change the RPC or contact support for assistance.'\n },\n {\n reasons: ['Invalid JSON RPC parameters'],\n message:\n 'of a RPC request that contains invalid or missing parameters. Please try again later or contact support.'\n },\n {\n reasons: ['Too Many Requests'],\n message:\n 'your wallet has sent too many requests in a short time. Please wait a moment and try again.'\n },\n // Contract / Transaction\n {\n reasons: ['IMPOSSIBLE_GAS_CONSUMPTION'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['INSUFFICIENT_FUNDS', 'insufficient funds'],\n message:\n 'of insufficient funds for the transaction fee. Please add more fee tokens to your account and try again.'\n },\n {\n reasons: ['transfer amount exceeds balance'],\n message:\n 'the transfer amount exceeds your account balance. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['ERC721: insufficient balance for transfer'],\n message:\n 'you do not have enough of the specified NFT in your account. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['Low gas limit'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['Transaction underpriced'],\n message: 'it is underpriced. Please select a higher transaction speed and try again.'\n },\n // Smart Accounts\n {\n reasons: ['Sponsorship failed.'],\n message:\n 'the gas sponsorship was refused by the app. Please try again by paying for the gas instead'\n },\n {\n reasons: ['paymaster deposit too low'],\n message: insufficientPaymasterFunds\n },\n // Relayer\n {\n reasons: [RELAYER_DOWN_MESSAGE],\n message:\n 'the Ambire relayer is temporarily down.\\nPlease try again or contact Ambire support for assistance.'\n },\n {\n reasons: ['user nonce too low'],\n message:\n 'the user nonce is too low. Is there a pending transaction? Please try broadcasting again.'\n },\n // dApp interactions\n {\n reasons: ['INSUFFICIENT_INPUT_AMOUNT'],\n message: 'the input token amount is too low. Please increase the token amount and try again.'\n },\n {\n reasons: ['INSUFFICIENT_OUTPUT_AMOUNT'],\n message:\n 'the slippage tolerance was exceeded. Please reduce the slippage tolerance in the app and try again.'\n },\n {\n reasons: ['80'],\n message:\n \"the smart contract you're interacting with doesn't support this operation. This could be due to contract restrictions, insufficient permissions, or specific conditions that haven't been met. Please review the requirements of this operation or consult the contract documentation.\"\n },\n {\n reasons: ['STF'],\n message:\n 'of one of the following reasons: missing approval, insufficient approved amount, the amount exceeds the account balance.'\n },\n {\n reasons: [EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'],\n message:\n 'the swap has expired. Return to the app and reinitiate the swap if you wish to proceed.'\n },\n // bundler\n {\n reasons: ['biconomy: 400'],\n message: 'it will revert onchain with reason unknown.'\n },\n {\n reasons: ['pimlico: 500'],\n message: 'The bundler seems to be down at the moment. Please try again later'\n }\n]\n\nconst BROADCAST_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['pimlico_getUserOperationGasPrice'],\n message: 'the selected fee is too low. Please select a higher transaction speed and try again.'\n },\n {\n reasons: ['Replacement transaction underpriced'],\n message: 'the gas fee for replacing a pending transaction is too low. Please try again.'\n },\n {\n reasons: ['Max fee per gas less than block base fee'],\n message:\n 'the fee set for the transaction is lower than the network’s current base fee. Please try again with a higher fee.'\n }\n]\n\nconst ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['SPOOF_ERROR', 'INSUFFICIENT_PRIVILEGE'],\n message:\n 'your account key lacks the necessary permissions. Ensure that you have authorization to sign or use an account with sufficient privileges.'\n },\n {\n reasons: [\n 'caller is a contract',\n 'contract not allowed',\n 'contract not supported',\n 'No contractz allowed',\n 'contracts allowed',\n 'ontract is not allowed'\n ],\n message: 'this app does not support Smart Account wallets. Use a Basic Account (EOA) instead.'\n },\n // Contract errors\n {\n reasons: ['0x7b36c479', '0x81ceff30'],\n message: 'of a Swap failure. Please try performing the same swap again.'\n },\n {\n reasons: ['ERC721: token already minted'],\n message:\n 'the NFT you are trying to mint is already minted. This can also happen if you have batched multiple mint transactions for the same NFT.'\n },\n {\n reasons: ['ERC721: token does not exist'],\n message:\n 'the NFT you are trying to interact with does not exist. Ensure you are using the correct token ID.'\n },\n {\n reasons: ['Inner call: 0x'],\n message: 'it reverted onchain with reason unknown.'\n },\n // Rare contract errors\n {\n reasons: ['AccessControl: account is missing role'],\n message:\n 'your account lacks the necessary permissions to perform this action. Please contact the contract owner or ensure you have the required role.'\n },\n {\n reasons: ['Pausable: paused'],\n message:\n 'the contract is currently paused. Please wait until it is active or contact the contract owner for more information.'\n },\n {\n reasons: ['Contract code size exceeds'],\n message:\n 'the contract’s size exceeds the EVM limit for deployment. Please ensure the contract is optimized before redeploying.'\n },\n {\n reasons: ['Constructor reverted'],\n message:\n 'the smart contract’s initialization failed. This is likely a deployment issue; please check the constructor parameters.'\n }\n]\n\nexport {\n BROADCAST_OR_ESTIMATION_ERRORS,\n BROADCAST_ERRORS,\n ESTIMATION_ERRORS,\n insufficientPaymasterFunds\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts new file mode 100644 index 000000000..a834fddf4 --- /dev/null +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts @@ -0,0 +1,4 @@ +import { DecodedError } from '../errorDecoder/types'; +export declare const MESSAGE_PREFIX = "The transaction will fail because"; +export declare function getHumanReadableEstimationError(e: Error | DecodedError): Error; +//# sourceMappingURL=estimationErrorHumanizer.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts.map b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts.map new file mode 100644 index 000000000..141e8ca78 --- /dev/null +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimationErrorHumanizer.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/estimationErrorHumanizer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAKpD,eAAO,MAAM,cAAc,sCAAsC,CAAA;AAUjE,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,SA8BtE"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js new file mode 100644 index 000000000..14333aa62 --- /dev/null +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js @@ -0,0 +1,28 @@ +import EmittableError from '../../classes/EmittableError'; +import ExternalSignerError from '../../classes/ExternalSignerError'; +import { decodeError } from '../errorDecoder'; +import { ESTIMATION_ERRORS } from './errors'; +import { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'; +import { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'; +export const MESSAGE_PREFIX = 'The transaction will fail because'; +const LAST_RESORT_ERROR_MESSAGE = 'An unknown error occurred while estimating the transaction. Please try again or contact Ambire support for assistance.'; +function getPrefix(reason) { + if (!reason) + return MESSAGE_PREFIX; + return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''; +} +export function getHumanReadableEstimationError(e) { + // These errors should be thrown as they are + // as they are already human-readable + if (e instanceof EmittableError || e instanceof ExternalSignerError) { + return e; + } + const decodedError = e instanceof Error ? decodeError(e) : e; + const commonError = humanizeEstimationOrBroadcastError(decodedError.reason, getPrefix(decodedError.reason)); + let errorMessage = getHumanReadableErrorMessage(commonError, ESTIMATION_ERRORS, MESSAGE_PREFIX, decodedError.reason, e); + if (!errorMessage) { + errorMessage = getGenericMessageFromType(decodedError.type, decodedError.reason, MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); + } + return new Error(errorMessage, { cause: decodedError.reason }); +} +//# sourceMappingURL=estimationErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map new file mode 100644 index 000000000..4929af5aa --- /dev/null +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimationErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/estimationErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AAEjE,MAAM,yBAAyB,GAC7B,wHAAwH,CAAA;AAE1H,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,cAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,CAAuB;IACrE,4CAA4C;IAC5C,qCAAqC;IACrC,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,YAAY,mBAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,kCAAkC,CACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,4BAA4B,CAC7C,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,yBAAyB,CACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,cAAc,EACd,yBAAyB,CAC1B,CAAA;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError } from '../errorDecoder/types'\nimport { ESTIMATION_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nexport const MESSAGE_PREFIX = 'The transaction will fail because'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while estimating the transaction. Please try again or contact Ambire support for assistance.'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableEstimationError(e: Error | DecodedError) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n ESTIMATION_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.d.ts b/dist/src/libs/errorHumanizer/helpers.d.ts new file mode 100644 index 000000000..815cd27fb --- /dev/null +++ b/dist/src/libs/errorHumanizer/helpers.d.ts @@ -0,0 +1,6 @@ +import { DecodedError, ErrorType } from '../errorDecoder/types'; +import { ErrorHumanizerError } from './types'; +declare function getGenericMessageFromType(errorType: ErrorType, reason: DecodedError['reason'], messagePrefix: string, lastResortMessage: string): string; +declare const getHumanReadableErrorMessage: (commonError: string | null, errors: ErrorHumanizerError[], messagePrefix: string, reason: DecodedError['reason'], e: any) => string | null; +export { getGenericMessageFromType, getHumanReadableErrorMessage }; +//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.d.ts.map b/dist/src/libs/errorHumanizer/helpers.d.ts.map new file mode 100644 index 000000000..747c48db2 --- /dev/null +++ b/dist/src/libs/errorHumanizer/helpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE7C,iBAAS,yBAAyB,CAChC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC9B,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAgCR;AAED,QAAA,MAAM,4BAA4B,gBACnB,MAAM,GAAG,IAAI,UAClB,mBAAmB,EAAE,iBACd,MAAM,UACb,YAAY,CAAC,QAAQ,CAAC,KAC3B,GAAG,kBAmBP,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.js b/dist/src/libs/errorHumanizer/helpers.js new file mode 100644 index 000000000..bcd51134e --- /dev/null +++ b/dist/src/libs/errorHumanizer/helpers.js @@ -0,0 +1,49 @@ +import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'; +import { ErrorType } from '../errorDecoder/types'; +function getGenericMessageFromType(errorType, reason, messagePrefix, lastResortMessage) { + const reasonString = getErrorCodeStringFromReason(reason ?? ''); + const messageSuffixNoSupport = `${reasonString}\n`; + const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`; + const origin = errorType?.split('Error')?.[0] || ''; + switch (errorType) { + case ErrorType.RelayerError: + case ErrorType.RpcError: + return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`; + case ErrorType.PaymasterError: + return `${messagePrefix} of a Paymaster Error.${messageSuffix}`; + case ErrorType.BundlerError: + return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`; + case ErrorType.CodeError: + case ErrorType.UnknownError: + return `${messagePrefix} of an unknown error.${messageSuffix}`; + case ErrorType.InnerCallFailureError: + return (reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`); + // I don't think we should say anything else for this case + case ErrorType.UserRejectionError: + return 'Transaction rejected.'; + // Panic error may scare the user so let's call it a contract error + case ErrorType.CustomError: + case ErrorType.PanicError: + case ErrorType.RevertError: + return `${messagePrefix} of a contract error.${messageSuffix}`; + default: + return lastResortMessage; + } +} +const getHumanReadableErrorMessage = (commonError, errors, messagePrefix, reason, e) => { + if (commonError) + return commonError; + const checkAgainst = reason || e?.error?.message || e?.message; + let message = null; + if (checkAgainst) { + errors.forEach((error) => { + const isMatching = error.reasons.some((errorReason) => checkAgainst.toLowerCase().includes(errorReason.toLowerCase())); + if (!isMatching) + return; + message = `${messagePrefix} ${error.message}`; + }); + } + return message; +}; +export { getGenericMessageFromType, getHumanReadableErrorMessage }; +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.js.map b/dist/src/libs/errorHumanizer/helpers.js.map new file mode 100644 index 000000000..7d1b986e9 --- /dev/null +++ b/dist/src/libs/errorHumanizer/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAgB,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAG/D,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAA8B,EAC9B,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,YAAY,GAAG,4BAA4B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,sBAAsB,GAAG,GAAG,YAAY,IAAI,CAAA;IAClD,MAAM,aAAa,GAAG,GAAG,sBAAsB,4DAA4D,CAAA;IAC3G,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnD,QAAQ,SAAS,EAAE;QACjB,KAAK,SAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,SAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,aAAa,iCAAiC,MAAM,UAAU,aAAa,EAAE,CAAA;QACzF,KAAK,SAAS,CAAC,cAAc;YAC3B,OAAO,GAAG,aAAa,yBAAyB,aAAa,EAAE,CAAA;QACjE,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,iBAAiB,sBAAsB,EAAE,CAAA;QAClE,KAAK,SAAS,CAAC,SAAS,CAAC;QACzB,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE,KAAK,SAAS,CAAC,qBAAqB;YAClC,OAAO,CACL,MAAM,IAAI,GAAG,aAAa,+CAA+C,aAAa,EAAE,CACzF,CAAA;QACH,0DAA0D;QAC1D,KAAK,SAAS,CAAC,kBAAkB;YAC/B,OAAO,uBAAuB,CAAA;QAChC,mEAAmE;QACnE,KAAK,SAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,SAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE;YACE,OAAO,iBAAiB,CAAA;KAC3B;AACH,CAAC;AAED,MAAM,4BAA4B,GAAG,CACnC,WAA0B,EAC1B,MAA6B,EAC7B,aAAqB,EACrB,MAA8B,EAC9B,CAAM,EACN,EAAE;IACF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAA;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;YACD,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;KACH;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,CAAA","sourcesContent":["import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { ErrorHumanizerError } from './types'\n\nfunction getGenericMessageFromType(\n errorType: ErrorType,\n reason: DecodedError['reason'],\n messagePrefix: string,\n lastResortMessage: string\n): string {\n const reasonString = getErrorCodeStringFromReason(reason ?? '')\n const messageSuffixNoSupport = `${reasonString}\\n`\n const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`\n const origin = errorType?.split('Error')?.[0] || ''\n\n switch (errorType) {\n case ErrorType.RelayerError:\n case ErrorType.RpcError:\n return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`\n case ErrorType.PaymasterError:\n return `${messagePrefix} of a Paymaster Error.${messageSuffix}`\n case ErrorType.BundlerError:\n return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`\n case ErrorType.CodeError:\n case ErrorType.UnknownError:\n return `${messagePrefix} of an unknown error.${messageSuffix}`\n case ErrorType.InnerCallFailureError:\n return (\n reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`\n )\n // I don't think we should say anything else for this case\n case ErrorType.UserRejectionError:\n return 'Transaction rejected.'\n // Panic error may scare the user so let's call it a contract error\n case ErrorType.CustomError:\n case ErrorType.PanicError:\n case ErrorType.RevertError:\n return `${messagePrefix} of a contract error.${messageSuffix}`\n default:\n return lastResortMessage\n }\n}\n\nconst getHumanReadableErrorMessage = (\n commonError: string | null,\n errors: ErrorHumanizerError[],\n messagePrefix: string,\n reason: DecodedError['reason'],\n e: any\n) => {\n if (commonError) return commonError\n\n const checkAgainst = reason || e?.error?.message || e?.message\n let message = null\n\n if (checkAgainst) {\n errors.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n checkAgainst.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${messagePrefix} ${error.message}`\n })\n }\n\n return message\n}\n\nexport { getGenericMessageFromType, getHumanReadableErrorMessage }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts b/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts new file mode 100644 index 000000000..7998f231c --- /dev/null +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts @@ -0,0 +1,3 @@ +declare const humanizeEstimationOrBroadcastError: (reason: string | null, prefix: string) => string | null; +export { humanizeEstimationOrBroadcastError }; +//# sourceMappingURL=humanizeCommonCases.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts.map b/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts.map new file mode 100644 index 000000000..c95b771b3 --- /dev/null +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"humanizeCommonCases.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/humanizeCommonCases.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,kCAAkC,WAC9B,MAAM,GAAG,IAAI,UACb,MAAM,KACb,MAAM,GAAG,IAeX,CAAA;AAED,OAAO,EAAE,kCAAkC,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.js b/dist/src/libs/errorHumanizer/humanizeCommonCases.js new file mode 100644 index 000000000..41f3793e7 --- /dev/null +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.js @@ -0,0 +1,15 @@ +import { BROADCAST_OR_ESTIMATION_ERRORS } from './errors'; +const humanizeEstimationOrBroadcastError = (reason, prefix) => { + let message = null; + if (!reason) + return message; + BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => { + const isMatching = error.reasons.some((errorReason) => reason.toLowerCase().includes(errorReason.toLowerCase())); + if (!isMatching) + return; + message = `${prefix !== '' ? `${prefix} ` : ''}${error.message}`; + }); + return message; +}; +export { humanizeEstimationOrBroadcastError }; +//# sourceMappingURL=humanizeCommonCases.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map b/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map new file mode 100644 index 000000000..f3813f164 --- /dev/null +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map @@ -0,0 +1 @@ +{"version":3,"file":"humanizeCommonCases.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/humanizeCommonCases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAA;AAEzD,MAAM,kCAAkC,GAAG,CACzC,MAAqB,EACrB,MAAc,EACC,EAAE;IACjB,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAE3B,8BAA8B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CACzD,CAAA;QACD,IAAI,CAAC,UAAU;YAAE,OAAM;QAEvB,OAAO,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,OAAO,EAAE,kCAAkC,EAAE,CAAA","sourcesContent":["import { BROADCAST_OR_ESTIMATION_ERRORS } from './errors'\n\nconst humanizeEstimationOrBroadcastError = (\n reason: string | null,\n prefix: string\n): string | null => {\n let message = null\n\n if (!reason) return message\n\n BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n reason.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${prefix !== '' ? `${prefix} ` : ''}${error.message}`\n })\n\n return message\n}\n\nexport { humanizeEstimationOrBroadcastError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.d.ts b/dist/src/libs/errorHumanizer/index.d.ts new file mode 100644 index 000000000..46e46dac8 --- /dev/null +++ b/dist/src/libs/errorHumanizer/index.d.ts @@ -0,0 +1,4 @@ +import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'; +import { getHumanReadableEstimationError } from './estimationErrorHumanizer'; +export { getHumanReadableBroadcastError, getHumanReadableEstimationError }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.d.ts.map b/dist/src/libs/errorHumanizer/index.d.ts.map new file mode 100644 index 000000000..9f1e67055 --- /dev/null +++ b/dist/src/libs/errorHumanizer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAA;AAE5E,OAAO,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.js b/dist/src/libs/errorHumanizer/index.js new file mode 100644 index 000000000..0a8d54c50 --- /dev/null +++ b/dist/src/libs/errorHumanizer/index.js @@ -0,0 +1,4 @@ +import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'; +import { getHumanReadableEstimationError } from './estimationErrorHumanizer'; +export { getHumanReadableBroadcastError, getHumanReadableEstimationError }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.js.map b/dist/src/libs/errorHumanizer/index.js.map new file mode 100644 index 000000000..3a5ad0086 --- /dev/null +++ b/dist/src/libs/errorHumanizer/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAA;AAE5E,OAAO,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,CAAA","sourcesContent":["import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'\nimport { getHumanReadableEstimationError } from './estimationErrorHumanizer'\n\nexport { getHumanReadableBroadcastError, getHumanReadableEstimationError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/types.d.ts b/dist/src/libs/errorHumanizer/types.d.ts new file mode 100644 index 000000000..fade613ee --- /dev/null +++ b/dist/src/libs/errorHumanizer/types.d.ts @@ -0,0 +1,6 @@ +type ErrorHumanizerError = { + reasons: string[]; + message: string; +}; +export type { ErrorHumanizerError }; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/types.d.ts.map b/dist/src/libs/errorHumanizer/types.d.ts.map new file mode 100644 index 000000000..02eb2cbe4 --- /dev/null +++ b/dist/src/libs/errorHumanizer/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/types.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/types.js b/dist/src/libs/errorHumanizer/types.js new file mode 100644 index 000000000..718fd38ae --- /dev/null +++ b/dist/src/libs/errorHumanizer/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/types.js.map b/dist/src/libs/errorHumanizer/types.js.map new file mode 100644 index 000000000..0554245d4 --- /dev/null +++ b/dist/src/libs/errorHumanizer/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/types.ts"],"names":[],"mappings":"","sourcesContent":["type ErrorHumanizerError = {\n reasons: string[]\n message: string\n}\n\nexport type { ErrorHumanizerError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.d.ts b/dist/src/libs/estimate/errors.d.ts new file mode 100644 index 000000000..2297a4129 --- /dev/null +++ b/dist/src/libs/estimate/errors.d.ts @@ -0,0 +1,6 @@ +import { EstimateResult } from './interfaces'; +export declare function estimationErrorFormatted(error: Error, opts?: { + feePaymentOptions?: EstimateResult['feePaymentOptions']; + nonFatalErrors?: Error[]; +}): EstimateResult; +//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.d.ts.map b/dist/src/libs/estimate/errors.d.ts.map new file mode 100644 index 000000000..23d9a1161 --- /dev/null +++ b/dist/src/libs/estimate/errors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,IAAI,CAAC,EAAE;IACL,iBAAiB,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAA;IACvD,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,GACA,cAAc,CAchB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.js b/dist/src/libs/estimate/errors.js new file mode 100644 index 000000000..fb590de1a --- /dev/null +++ b/dist/src/libs/estimate/errors.js @@ -0,0 +1,15 @@ +export function estimationErrorFormatted(error, opts) { + const feePaymentOptions = opts?.feePaymentOptions ?? []; + const finalsOps = { + ...opts, + feePaymentOptions, + nonFatalErrors: opts?.nonFatalErrors ?? undefined + }; + return { + gasUsed: 0n, + currentAccountNonce: 0, + error, + ...finalsOps + }; +} +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.js.map b/dist/src/libs/estimate/errors.js.map new file mode 100644 index 000000000..bbfbfb9e3 --- /dev/null +++ b/dist/src/libs/estimate/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/estimate/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,KAAY,EACZ,IAGC;IAED,MAAM,iBAAiB,GAAG,IAAI,EAAE,iBAAiB,IAAI,EAAE,CAAA;IACvD,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,iBAAiB;QACjB,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,SAAS;KAClD,CAAA;IAED,OAAO;QACL,OAAO,EAAE,EAAE;QACX,mBAAmB,EAAE,CAAC;QACtB,KAAK;QACL,GAAG,SAAS;KACb,CAAA;AACH,CAAC","sourcesContent":["import { EstimateResult } from './interfaces'\n\nexport function estimationErrorFormatted(\n error: Error,\n opts?: {\n feePaymentOptions?: EstimateResult['feePaymentOptions']\n nonFatalErrors?: Error[]\n }\n): EstimateResult {\n const feePaymentOptions = opts?.feePaymentOptions ?? []\n const finalsOps = {\n ...opts,\n feePaymentOptions,\n nonFatalErrors: opts?.nonFatalErrors ?? undefined\n }\n\n return {\n gasUsed: 0n,\n currentAccountNonce: 0,\n error,\n ...finalsOps\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.d.ts b/dist/src/libs/estimate/estimate.d.ts new file mode 100644 index 000000000..918d2b999 --- /dev/null +++ b/dist/src/libs/estimate/estimate.d.ts @@ -0,0 +1,14 @@ +import { Account, AccountStates } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'; +import { AccountOp } from '../accountOp/accountOp'; +import { Call } from '../accountOp/types'; +import { TokenResult } from '../portfolio'; +import { EstimateResult } from './interfaces'; +export declare function estimate4337(account: Account, op: AccountOp, calls: Call[], accountStates: AccountStates, network: Network, provider: RPCProvider, feeTokens: TokenResult[], blockTag: string | number, nativeToCheck: string[], switcher: BundlerSwitcher, errorCallback: Function): Promise; +export declare function estimate(provider: RPCProvider, network: Network, account: Account, op: AccountOp, accountStates: AccountStates, nativeToCheck: string[], feeTokens: TokenResult[], errorCallback: Function, bundlerSwitcher: BundlerSwitcher, opts?: { + calculateRefund?: boolean; + is4337Broadcast?: boolean; +}, blockFrom?: string, blockTag?: string | number): Promise; +//# sourceMappingURL=estimate.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.d.ts.map b/dist/src/libs/estimate/estimate.d.ts.map new file mode 100644 index 000000000..f4049dc0f --- /dev/null +++ b/dist/src/libs/estimate/estimate.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimate.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,SAAS,EAAmB,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAOzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAQ1C,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AAgC/D,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,aAAa,EAAE,MAAM,EAAE,EACvB,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,QAAQ,GACtB,OAAO,CAAC,cAAc,CAAC,CA6LzB;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,WAAW,EAAE,EACxB,aAAa,EAAE,QAAQ,EACvB,eAAe,EAAE,eAAe,EAChC,IAAI,CAAC,EAAE;IACL,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,EACD,SAAS,GAAE,MAAqD,EAChE,QAAQ,GAAE,MAAM,GAAG,MAAkB,GACpC,OAAO,CAAC,cAAc,CAAC,CAwMzB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.js b/dist/src/libs/estimate/estimate.js index 9d92faae5..f4a025c1a 100644 --- a/dist/src/libs/estimate/estimate.js +++ b/dist/src/libs/estimate/estimate.js @@ -1,50 +1,214 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.estimate = void 0; -const ethers_1 = require("ethers"); -const deployless_1 = require("../deployless/deployless"); -const account_1 = require("../account/account"); -const Estimation_json_1 = __importDefault(require("../../../contracts/compiled/Estimation.json")); -const AmbireAccount_json_1 = __importDefault(require("../../../contracts/compiled/AmbireAccount.json")); -const AmbireAccountFactory_json_1 = __importDefault(require("../../../contracts/compiled/AmbireFactory.json")); -async function estimate(provider, network, account, op, nativeToCheck, feeTokens, opts, fromAddrHavingNative, blockFrom = '0x0000000000000000000000000000000000000001', blockTag = 'latest') { - if (!account.creation) { - if (op.calls.length !== 1) { - throw new Error("EOA can't have more than one call!"); - } - const call = op.calls[0]; - const nonce = await provider.getTransactionCount(account.addr); - const [gasUsed, balance] = await Promise.all([ - provider.estimateGas({ - from: account.addr, - to: call.to, - value: call.value, - data: call.data, - nonce - }), - provider.getBalance(account.addr) - ]); +import { AbiCoder, ZeroAddress } from 'ethers'; +import Estimation from '../../../contracts/compiled/Estimation.json'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { DEPLOYLESS_SIMULATION_FROM, OPTIMISTIC_ORACLE } from '../../consts/deploy'; +import { getAccountDeployParams, isSmartAccount } from '../account/account'; +import { toSingletonCall } from '../accountOp/accountOp'; +import { getFeeCall } from '../calls/calls'; +import { fromDescriptor } from '../deployless/deployless'; +import { InnerCallFailureError } from '../errorDecoder/customErrors'; +import { getHumanReadableEstimationError } from '../errorHumanizer'; +import { getProbableCallData } from '../gasPrice/gasPrice'; +import { hasRelayerSupport } from '../networks/networks'; +import { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'; +import { estimationErrorFormatted } from './errors'; +import { bundlerEstimate } from './estimateBundler'; +import { estimateEOA } from './estimateEOA'; +import { estimateGas } from './estimateGas'; +import { getFeeTokenForEstimate } from './estimateHelpers'; +import { estimateWithRetries } from './estimateWithRetries'; +import { refund } from './refund'; +const abiCoder = new AbiCoder(); +function getInnerCallFailure(estimationOp, calls, network, portfolioNativeValue) { + if (estimationOp.success) + return null; + const error = getHumanReadableEstimationError(new InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)); + return new Error(error.message, { + cause: 'CALLS_FAILURE' + }); +} +// the outcomeNonce should always be equal to the nonce in accountOp + 1 +// that's an indication of transaction success +function getNonceDiscrepancyFailure(op, outcomeNonce) { + if (op.nonce !== null && op.nonce + 1n === BigInt(outcomeNonce)) + return null; + return new Error("Nonce discrepancy, perhaps there's a pending transaction. Retrying...", { + cause: 'NONCE_FAILURE' + }); +} +export async function estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, switcher, errorCallback) { + const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); + // build the feePaymentOptions with the available current amounts. We will + // change them after simulation passes + let feePaymentOptions = feeTokens.map((token) => { return { - gasUsed, - nonce, - feePaymentOptions: [ - { - paidBy: account.addr, - availableAmount: balance - } - ] + paidBy: account.addr, + availableAmount: token.amount, + // @relyOnBundler + // gasUsed goes to 0 + // we add a transfer call or a native call when sending the uOp to the + // bundler and he estimates that. For different networks this gasUsed + // goes to different places (callGasLimit or preVerificationGas) and + // its calculated differently. So it's a wild bet to think we could + // calculate this on our own for each network. + gasUsed: 0n, + // addedNative gets calculated by the bundler & added to uOp gasData + addedNative: 0n, + token }; + }); + const accountState = accountStates[op.accountAddr][op.networkId]; + const checkInnerCallsArgs = [ + account.addr, + ...getAccountDeployParams(account), + [ + account.addr, + op.accountOpToExecuteBefore?.nonce || 0, + op.accountOpToExecuteBefore?.calls || [], + op.accountOpToExecuteBefore?.signature || '0x' + ], + [account.addr, op.nonce || 1, calls, '0x'], + getProbableCallData(account, op, accountState, network), + account.associatedKeys, + feeTokens.map((feeToken) => feeToken.address), + FEE_COLLECTOR, + nativeToCheck, + network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress + ]; + // always add a feeCall if available as we're using the paymaster + // on predefined chains and on custom networks it is better to + // have a slightly bigger estimation (if we don't have a paymaster) + const estimateGasOp = { ...op }; + const feeToken = getFeeTokenForEstimate(feeTokens, network); + if (feeToken) + estimateGasOp.feeCall = getFeeCall(feeToken); + const initializeRequests = () => [ + deploylessEstimator + .call('estimate', checkInnerCallsArgs, { + from: DEPLOYLESS_SIMULATION_FROM, + blockTag + }) + .catch(getHumanReadableEstimationError), + bundlerEstimate(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback), + estimateGas(account, estimateGasOp, provider, accountState, network).catch(() => 0n) + ]; + const estimations = await estimateWithRetries(initializeRequests, 'estimation-deployless', errorCallback, 12000); + const ambireEstimation = estimations[0]; + const bundlerEstimationResult = estimations[1]; + if (ambireEstimation instanceof Error) { + return estimationErrorFormatted( + // give priority to the bundler error if both estimations end up with an error + bundlerEstimationResult.error ?? ambireEstimation, { feePaymentOptions }); + } + // // if there's a bundler error only, remove the smart account payment options + // if (bundlerEstimationResult instanceof Error) feePaymentOptions = [] + const [[deployment, accountOpToExecuteBefore, accountOp, outcomeNonce, feeTokenOutcomes, , nativeAssetBalances, , l1GasEstimation]] = estimations[0]; + const ambireEstimationError = getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, outcomeNonce); + // if Estimation.sol estimate is a success, it means the nonce has incremented + // so we subtract 1 from it. If it's an error, we return the old one + bundlerEstimationResult.currentAccountNonce = accountOp.success + ? Number(outcomeNonce - 1n) + : Number(outcomeNonce); + if (ambireEstimationError) { + // if there's an ambire estimation error, we do not allow the txn + // to be executed as it means it will most certainly fail + bundlerEstimationResult.error = ambireEstimationError; + } + else if (!ambireEstimationError && bundlerEstimationResult.error) { + // if there's a bundler error only, it means it's a bundler specific + // problem. If we can switch the bundler, re-estimate + if (switcher.canSwitch(null)) { + switcher.switch(); + return estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, switcher, errorCallback); + } + // if there's a bundler error only, it means we cannot do ERC-4337 + // but we have to do broadcast by EOA + feePaymentOptions = []; + delete bundlerEstimationResult.erc4337GasLimits; + bundlerEstimationResult.error = null; } - const deploylessEstimator = (0, deployless_1.fromDescriptor)(provider, Estimation_json_1.default, !network.rpcNoStateOverride); - // @TODO - .env or passed as parameter? - const relayerAddress = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'; - const calculateAnomalies = opts?.calculateAnomalies && fromAddrHavingNative; + // set the gasUsed to the biggest one found from all estimations + const bigIntMax = (...args) => args.reduce((m, e) => (e > m ? e : m)); + const ambireGas = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed; + const estimateGasCall = estimations[2]; + bundlerEstimationResult.gasUsed = bigIntMax(bundlerEstimationResult.gasUsed, estimateGasCall, ambireGas); + const isPaymasterUsable = !!bundlerEstimationResult.erc4337GasLimits?.paymaster.isUsable(); + bundlerEstimationResult.feePaymentOptions = feePaymentOptions + .filter((option) => isPaymasterUsable || option.token.address === ZeroAddress) + .map((option, index) => { + // after simulation: add the left over amount as available + const localOp = { ...option }; + if (!option.token.flags.onGasTank) { + localOp.availableAmount = feeTokenOutcomes[index][1]; + localOp.token.amount = feeTokenOutcomes[index][1]; + } + localOp.gasUsed = localOp.token.flags.onGasTank ? 5000n : feeTokenOutcomes[index][0]; + return localOp; + }); + // this is for EOAs paying for SA in native + const nativeToken = feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank); + const nativeTokenOptions = nativeAssetBalances.map((balance, key) => ({ + paidBy: nativeToCheck[key], + availableAmount: balance, + addedNative: l1GasEstimation.fee, + token: { + ...nativeToken, + amount: balance + } + })); + bundlerEstimationResult.feePaymentOptions = [ + ...bundlerEstimationResult.feePaymentOptions, + ...nativeTokenOptions + ]; + return bundlerEstimationResult; +} +export async function estimate(provider, network, account, op, accountStates, nativeToCheck, feeTokens, errorCallback, bundlerSwitcher, opts, blockFrom = '0x0000000000000000000000000000000000000001', blockTag = 'pending') { + // if EOA, delegate + if (!isSmartAccount(account)) + return estimateEOA(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback); + if (!network.isSAEnabled) + return estimationErrorFormatted(new Error('Smart accounts are not available for this network. Please use a Basic Account')); + if (!network.areContractsDeployed) + return estimationErrorFormatted(new Error('The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings')); + // @EntryPoint activation + // if the account is v2 without the entry point signer being a signer + // and the network is 4337 but doesn't have a paymaster and the account + // is deployed for some reason, we should include the activator + const calls = [...op.calls.map(toSingletonCall)]; + const accountState = accountStates[op.accountAddr][op.networkId]; + if (shouldIncludeActivatorCall(network, account, accountState, false)) { + calls.push(getActivatorCall(op.accountAddr)); + } + // if 4337, delegate + if (opts && opts.is4337Broadcast) + return estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, bundlerSwitcher, errorCallback); + const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); + const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress; + // if the network doesn't have a relayer, we can't pay in fee tokens + const filteredFeeTokens = hasRelayerSupport(network) ? feeTokens : []; + // @L2s + // craft the probableTxn that's going to be saved on the L1 + // so we could do proper estimation + const encodedCallData = abiCoder.encode([ + 'bytes', + 'address', + 'address', + 'uint256', + 'uint256', + 'uint256', + 'uint256' // gasLimit + ], [ + getProbableCallData(account, op, accountState, network), + op.accountAddr, + FEE_COLLECTOR, + 100000, + 2, + op.nonce, + 100000 + ]); const args = [ account.addr, - ...(0, account_1.getAccountDeployParams)(account), + ...getAccountDeployParams(account), // @TODO can pass 0 here for the addr [ account.addr, @@ -52,78 +216,79 @@ async function estimate(provider, network, account, op, nativeToCheck, feeTokens op.accountOpToExecuteBefore?.calls || [], op.accountOpToExecuteBefore?.signature || '0x' ], - [account.addr, op.nonce || 1, op.calls, '0x'], + [account.addr, op.nonce || 1, calls, '0x'], + encodedCallData, account.associatedKeys, - feeTokens, - relayerAddress, - calculateAnomalies ? [fromAddrHavingNative].concat(nativeToCheck) : nativeToCheck + filteredFeeTokens.map((token) => token.address), + FEE_COLLECTOR, + nativeToCheck, + optimisticOracle ]; - // @TODO explain this - const simulationGasPrice = 500000000n; - const simulationGasLimit = 500000n; - const gasPrice = `0x${Number(simulationGasPrice).toString(16)}`; - const gasLimit = `0x${Number(simulationGasLimit).toString(16)}`; - /* eslint-disable prefer-const */ - let [[deployment, accountOpToExecuteBefore, accountOp, nonce, feeTokenOutcomes, , nativeAssetBalances]] = await deploylessEstimator.call('estimate', args, { - from: blockFrom, - blockTag, - gasPrice: calculateAnomalies ? gasPrice : undefined, - gasLimit: calculateAnomalies ? gasLimit : undefined - }); - /* eslint-enable prefer-const */ + const initializeRequests = () => [ + deploylessEstimator + .call('estimate', args, { + from: blockFrom, + blockTag + }) + .catch(getHumanReadableEstimationError), + estimateGas(account, op, provider, accountState, network).catch(() => 0n) + ]; + const estimations = await estimateWithRetries(initializeRequests, 'estimation-deployless', errorCallback); + if (estimations instanceof Error) + return estimationErrorFormatted(estimations); + const [[deployment, accountOpToExecuteBefore, accountOp, nonce, feeTokenOutcomes, , nativeAssetBalances, , l1GasEstimation // [gasUsed, baseFee, totalFee, gasOracle] + ]] = estimations[0]; let gasUsed = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed; - if (opts?.calculateRefund) { - const IAmbireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); - const IAmbireAccountFactory = new ethers_1.Interface(AmbireAccountFactory_json_1.default.abi); - const accountCalldata = op.accountOpToExecuteBefore - ? IAmbireAccount.encodeFunctionData('executeMultiple', [ - [ - [op.accountOpToExecuteBefore.calls, op.accountOpToExecuteBefore.signature], - [op.calls, op.signature] - ] - ]) - : IAmbireAccount.encodeFunctionData('execute', [op.calls, op.signature]); - const factoryCalldata = IAmbireAccountFactory.encodeFunctionData('deployAndExecute', [ - account.creation.bytecode, - account.creation.salt, - [[account.addr, 0, accountCalldata]], - op.signature - ]); - const estimatedGas = await provider.estimateGas({ - from: '0x0000000000000000000000000000000000000001', - to: account.creation.factoryAddr, - data: factoryCalldata - }); - const estimatedRefund = gasUsed - estimatedGas; - // As of EIP-3529, the max refund is 1/5th of the entire cost - if (estimatedRefund <= gasUsed / 5n && estimatedRefund > 0n) - gasUsed = estimatedGas; - } - let addedNative; - if (calculateAnomalies) { - const nativeFromBalance = await provider.getBalance(fromAddrHavingNative); - // @TODO - Both balances are equal, but they shouldn't be as the contract balance should include the fee - console.log({ nativeFromBalance, contractNativeFromBalance: nativeAssetBalances[0] }); - addedNative = - nativeFromBalance - (nativeAssetBalances[0] - simulationGasPrice * simulationGasLimit); - nativeAssetBalances = nativeAssetBalances.slice(1); - } - const feeTokenOptions = feeTokenOutcomes.map((token, key) => ({ - address: feeTokens[key], - paidBy: account.addr, - availableAmount: token.amount, - gasUsed: token.gasUsed - })); + // if estimateGas brings a bigger estimation than Estimation.sol, use it + const customlyEstimatedGas = estimations[1]; + if (gasUsed < customlyEstimatedGas) + gasUsed = customlyEstimatedGas; + // WARNING: calculateRefund will 100% NOT work in all cases we have + // So a warning not to assume this is working + if (opts?.calculateRefund) + gasUsed = await refund(account, op, provider, gasUsed); + const feeTokenOptions = filteredFeeTokens.map((token, key) => { + const availableAmount = token.flags.onGasTank ? token.amount : feeTokenOutcomes[key].amount; + return { + paidBy: account.addr, + availableAmount, + // gasUsed for the gas tank tokens is smaller because of the commitment: + // ['gasTank', amount, symbol] + // and this commitment costs onchain: + // - 1535, if the broadcasting addr is the relayer + // - 4035, if the broadcasting addr is different + // currently, there are more than 1 relayer addresses and we cannot + // be sure which is the one that will broadcast this txn; also, ERC-4337 + // broadcasts will always consume at least 4035. + // setting it to 5000n just be sure + gasUsed: token.flags.onGasTank ? 5000n : feeTokenOutcomes[key].gasUsed, + addedNative: token.address === ZeroAddress + ? l1GasEstimation.feeWithNativePayment + : l1GasEstimation.feeWithTransferPayment, + token: { + ...token, + amount: availableAmount + } + }; + }); + // this is for EOAs paying for SA in native + const nativeToken = feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank); const nativeTokenOptions = nativeAssetBalances.map((balance, key) => ({ paidBy: nativeToCheck[key], - availableAmount: balance + availableAmount: balance, + addedNative: l1GasEstimation.fee, + token: { + ...nativeToken, + amount: balance + } })); return { gasUsed, - nonce, - addedNative, - feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions] + // if Estimation.sol estimate is a success, it means the nonce has incremented + // so we subtract 1 from it. If it's an error, we return the old one + currentAccountNonce: accountOp.success ? Number(nonce - 1n) : Number(nonce), + feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions], + error: getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, nonce) }; } -exports.estimate = estimate; //# sourceMappingURL=estimate.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.js.map b/dist/src/libs/estimate/estimate.js.map index 563721b56..bd5adfed1 100644 --- a/dist/src/libs/estimate/estimate.js.map +++ b/dist/src/libs/estimate/estimate.js.map @@ -1 +1 @@ -{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimate.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM, OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { InnerCallFailureError } from '../errorDecoder/customErrors'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { getProbableCallData } from '../gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../networks/networks'\nimport { TokenResult } from '../portfolio'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { bundlerEstimate } from './estimateBundler'\nimport { estimateEOA } from './estimateEOA'\nimport { estimateGas } from './estimateGas'\nimport { getFeeTokenForEstimate } from './estimateHelpers'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\nimport { refund } from './refund'\n\nconst abiCoder = new AbiCoder()\n\nfunction getInnerCallFailure(\n estimationOp: { success: boolean; err: string },\n calls: Call[],\n network: Network,\n portfolioNativeValue?: bigint\n): Error | null {\n if (estimationOp.success) return null\n\n const error = getHumanReadableEstimationError(\n new InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)\n )\n\n return new Error(error.message, {\n cause: 'CALLS_FAILURE'\n })\n}\n\n// the outcomeNonce should always be equal to the nonce in accountOp + 1\n// that's an indication of transaction success\nfunction getNonceDiscrepancyFailure(op: AccountOp, outcomeNonce: number): Error | null {\n if (op.nonce !== null && op.nonce + 1n === BigInt(outcomeNonce)) return null\n\n return new Error(\"Nonce discrepancy, perhaps there's a pending transaction. Retrying...\", {\n cause: 'NONCE_FAILURE'\n })\n}\n\nexport async function estimate4337(\n account: Account,\n op: AccountOp,\n calls: Call[],\n accountStates: AccountStates,\n network: Network,\n provider: RPCProvider,\n feeTokens: TokenResult[],\n blockTag: string | number,\n nativeToCheck: string[],\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n\n // build the feePaymentOptions with the available current amounts. We will\n // change them after simulation passes\n let feePaymentOptions = feeTokens.map((token: TokenResult) => {\n return {\n paidBy: account.addr,\n availableAmount: token.amount,\n // @relyOnBundler\n // gasUsed goes to 0\n // we add a transfer call or a native call when sending the uOp to the\n // bundler and he estimates that. For different networks this gasUsed\n // goes to different places (callGasLimit or preVerificationGas) and\n // its calculated differently. So it's a wild bet to think we could\n // calculate this on our own for each network.\n gasUsed: 0n,\n // addedNative gets calculated by the bundler & added to uOp gasData\n addedNative: 0n,\n token\n }\n })\n\n const accountState = accountStates[op.accountAddr][op.networkId]\n const checkInnerCallsArgs = [\n account.addr,\n ...getAccountDeployParams(account),\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n getProbableCallData(account, op, accountState, network),\n account.associatedKeys,\n feeTokens.map((feeToken) => feeToken.address),\n FEE_COLLECTOR,\n nativeToCheck,\n network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n ]\n\n // always add a feeCall if available as we're using the paymaster\n // on predefined chains and on custom networks it is better to\n // have a slightly bigger estimation (if we don't have a paymaster)\n const estimateGasOp = { ...op }\n const feeToken = getFeeTokenForEstimate(feeTokens, network)\n if (feeToken) estimateGasOp.feeCall = getFeeCall(feeToken)\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', checkInnerCallsArgs, {\n from: DEPLOYLESS_SIMULATION_FROM,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n bundlerEstimate(\n account,\n accountStates,\n op,\n network,\n feeTokens,\n provider,\n switcher,\n errorCallback\n ),\n estimateGas(account, estimateGasOp, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback,\n 12000\n )\n\n const ambireEstimation = estimations[0]\n const bundlerEstimationResult: EstimateResult = estimations[1]\n if (ambireEstimation instanceof Error) {\n return estimationErrorFormatted(\n // give priority to the bundler error if both estimations end up with an error\n bundlerEstimationResult.error ?? ambireEstimation,\n { feePaymentOptions }\n )\n }\n // // if there's a bundler error only, remove the smart account payment options\n // if (bundlerEstimationResult instanceof Error) feePaymentOptions = []\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n outcomeNonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation\n ]\n ] = estimations[0]\n const ambireEstimationError =\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, outcomeNonce)\n\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n bundlerEstimationResult.currentAccountNonce = accountOp.success\n ? Number(outcomeNonce - 1n)\n : Number(outcomeNonce)\n\n if (ambireEstimationError) {\n // if there's an ambire estimation error, we do not allow the txn\n // to be executed as it means it will most certainly fail\n bundlerEstimationResult.error = ambireEstimationError\n } else if (!ambireEstimationError && bundlerEstimationResult.error) {\n // if there's a bundler error only, it means it's a bundler specific\n // problem. If we can switch the bundler, re-estimate\n if (switcher.canSwitch(null)) {\n switcher.switch()\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n switcher,\n errorCallback\n )\n }\n\n // if there's a bundler error only, it means we cannot do ERC-4337\n // but we have to do broadcast by EOA\n feePaymentOptions = []\n delete bundlerEstimationResult.erc4337GasLimits\n bundlerEstimationResult.error = null\n }\n\n // set the gasUsed to the biggest one found from all estimations\n const bigIntMax = (...args: bigint[]): bigint => args.reduce((m, e) => (e > m ? e : m))\n const ambireGas = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n const estimateGasCall = estimations[2]\n bundlerEstimationResult.gasUsed = bigIntMax(\n bundlerEstimationResult.gasUsed,\n estimateGasCall,\n ambireGas\n )\n\n const isPaymasterUsable = !!bundlerEstimationResult.erc4337GasLimits?.paymaster.isUsable()\n bundlerEstimationResult.feePaymentOptions = feePaymentOptions\n .filter((option) => isPaymasterUsable || option.token.address === ZeroAddress)\n .map((option: FeePaymentOption, index: number) => {\n // after simulation: add the left over amount as available\n const localOp = { ...option }\n if (!option.token.flags.onGasTank) {\n localOp.availableAmount = feeTokenOutcomes[index][1]\n localOp.token.amount = feeTokenOutcomes[index][1]\n }\n\n localOp.gasUsed = localOp.token.flags.onGasTank ? 5000n : feeTokenOutcomes[index][0]\n return localOp\n })\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n bundlerEstimationResult.feePaymentOptions = [\n ...bundlerEstimationResult.feePaymentOptions,\n ...nativeTokenOptions\n ]\n return bundlerEstimationResult\n}\n\nexport async function estimate(\n provider: RPCProvider,\n network: Network,\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n nativeToCheck: string[],\n feeTokens: TokenResult[],\n errorCallback: Function,\n bundlerSwitcher: BundlerSwitcher,\n opts?: {\n calculateRefund?: boolean\n is4337Broadcast?: boolean\n },\n blockFrom: string = '0x0000000000000000000000000000000000000001',\n blockTag: string | number = 'pending'\n): Promise {\n // if EOA, delegate\n if (!isSmartAccount(account))\n return estimateEOA(\n account,\n op,\n accountStates,\n network,\n provider,\n feeTokens,\n blockFrom,\n blockTag,\n errorCallback\n )\n\n if (!network.isSAEnabled)\n return estimationErrorFormatted(\n new Error('Smart accounts are not available for this network. Please use a Basic Account')\n )\n if (!network.areContractsDeployed)\n return estimationErrorFormatted(\n new Error(\n 'The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings'\n )\n )\n\n // @EntryPoint activation\n // if the account is v2 without the entry point signer being a signer\n // and the network is 4337 but doesn't have a paymaster and the account\n // is deployed for some reason, we should include the activator\n const calls = [...op.calls.map(toSingletonCall)]\n const accountState = accountStates[op.accountAddr][op.networkId]\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n calls.push(getActivatorCall(op.accountAddr))\n }\n\n // if 4337, delegate\n if (opts && opts.is4337Broadcast)\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n bundlerSwitcher,\n errorCallback\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n\n // if the network doesn't have a relayer, we can't pay in fee tokens\n const filteredFeeTokens = hasRelayerSupport(network) ? feeTokens : []\n\n // @L2s\n // craft the probableTxn that's going to be saved on the L1\n // so we could do proper estimation\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [\n getProbableCallData(account, op, accountState, network),\n op.accountAddr,\n FEE_COLLECTOR,\n 100000,\n 2,\n op.nonce,\n 100000\n ]\n )\n\n const args = [\n account.addr,\n ...getAccountDeployParams(account),\n // @TODO can pass 0 here for the addr\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n encodedCallData,\n account.associatedKeys,\n filteredFeeTokens.map((token) => token.address),\n FEE_COLLECTOR,\n nativeToCheck,\n optimisticOracle\n ]\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', args, {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n estimateGas(account, op, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback\n )\n\n if (estimations instanceof Error) return estimationErrorFormatted(estimations)\n\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n nonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation // [gasUsed, baseFee, totalFee, gasOracle]\n ]\n ] = estimations[0]\n\n let gasUsed = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n\n // if estimateGas brings a bigger estimation than Estimation.sol, use it\n const customlyEstimatedGas = estimations[1]\n if (gasUsed < customlyEstimatedGas) gasUsed = customlyEstimatedGas\n\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n if (opts?.calculateRefund) gasUsed = await refund(account, op, provider, gasUsed)\n\n const feeTokenOptions: FeePaymentOption[] = filteredFeeTokens.map(\n (token: TokenResult, key: number) => {\n const availableAmount = token.flags.onGasTank ? token.amount : feeTokenOutcomes[key].amount\n return {\n paidBy: account.addr,\n availableAmount,\n // gasUsed for the gas tank tokens is smaller because of the commitment:\n // ['gasTank', amount, symbol]\n // and this commitment costs onchain:\n // - 1535, if the broadcasting addr is the relayer\n // - 4035, if the broadcasting addr is different\n // currently, there are more than 1 relayer addresses and we cannot\n // be sure which is the one that will broadcast this txn; also, ERC-4337\n // broadcasts will always consume at least 4035.\n // setting it to 5000n just be sure\n gasUsed: token.flags.onGasTank ? 5000n : feeTokenOutcomes[key].gasUsed,\n addedNative:\n token.address === ZeroAddress\n ? l1GasEstimation.feeWithNativePayment\n : l1GasEstimation.feeWithTransferPayment,\n token: {\n ...token,\n amount: availableAmount\n }\n }\n }\n )\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n\n return {\n gasUsed,\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n currentAccountNonce: accountOp.success ? Number(nonce - 1n) : Number(nonce),\n feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions],\n error:\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, nonce)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.d.ts b/dist/src/libs/estimate/estimateBundler.d.ts new file mode 100644 index 000000000..64f6c147d --- /dev/null +++ b/dist/src/libs/estimate/estimateBundler.d.ts @@ -0,0 +1,9 @@ +import { Account, AccountStates } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'; +import { AccountOp } from '../accountOp/accountOp'; +import { TokenResult } from '../portfolio'; +import { EstimateResult } from './interfaces'; +export declare function bundlerEstimate(account: Account, accountStates: AccountStates, op: AccountOp, network: Network, feeTokens: TokenResult[], provider: RPCProvider, switcher: BundlerSwitcher, errorCallback: Function): Promise; +//# sourceMappingURL=estimateBundler.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.d.ts.map b/dist/src/libs/estimate/estimateBundler.d.ts.map new file mode 100644 index 000000000..1cbbe5a44 --- /dev/null +++ b/dist/src/libs/estimate/estimateBundler.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateBundler.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateBundler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAGzE,OAAO,EAAE,SAAS,EAAsC,MAAM,wBAAwB,CAAA;AAGtF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAK1C,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AAsE/D,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,QAAQ,GACtB,OAAO,CAAC,cAAc,CAAC,CAoFzB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.js b/dist/src/libs/estimate/estimateBundler.js new file mode 100644 index 000000000..fa6a0d516 --- /dev/null +++ b/dist/src/libs/estimate/estimateBundler.js @@ -0,0 +1,122 @@ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-continue */ +/* eslint-disable no-constant-condition */ +import { Interface } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import { paymasterFactory } from '../../services/paymaster'; +import { getSignableCallsForBundlerEstimate } from '../accountOp/accountOp'; +import { getHumanReadableEstimationError } from '../errorHumanizer'; +import { getSigForCalculations, getUserOperation } from '../userOperation/userOperation'; +import { estimationErrorFormatted } from './errors'; +import { estimateWithRetries } from './estimateWithRetries'; +async function estimate(bundler, network, userOp, isEdgeCase, errorCallback) { + const gasPrice = await bundler.fetchGasPrices(network, errorCallback).catch(() => { + return new Error('Could not fetch gas prices, retrying...'); + }); + // if the gasPrice fetch fails, we will switch the bundler and try again + if (gasPrice instanceof Error) { + const decodedError = bundler.decodeBundlerError(new Error('internal error')); + return { + gasPrice, + // if gas prices couldn't be fetched, it means there's an internal error + estimation: getHumanReadableEstimationError(decodedError), + nonFatalErrors: [] + }; + } + // add the maxFeePerGas and maxPriorityFeePerGas only if the network + // is optimistic as the bundler uses these values to determine the + // preVerificationGas. + const localUserOp = { ...userOp }; + if (network.isOptimistic) { + // use medium for the gas limit estimation + localUserOp.maxPriorityFeePerGas = gasPrice.medium.maxPriorityFeePerGas; + localUserOp.maxFeePerGas = gasPrice.medium.maxFeePerGas; + } + const nonFatalErrors = []; + const initializeRequests = () => [ + bundler.estimate(userOp, network, isEdgeCase).catch((e) => { + const decodedError = bundler.decodeBundlerError(e); + // if the bundler estimation fails, add a nonFatalError so we can react to + // it on the FE. The BE at a later stage decides if this error is actually + // fatal (at estimate.ts -> estimate4337) + nonFatalErrors.push(new Error('Bundler estimation failed', { cause: '4337_ESTIMATION' })); + if (decodedError.reason && decodedError.reason.indexOf('invalid account nonce') !== -1) { + nonFatalErrors.push(new Error('4337 invalid account nonce', { cause: '4337_INVALID_NONCE' })); + } + return getHumanReadableEstimationError(decodedError); + }) + ]; + const estimation = await estimateWithRetries(initializeRequests, 'estimation-bundler', errorCallback); + return { + gasPrice, + estimation, + nonFatalErrors + }; +} +export async function bundlerEstimate(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback) { + // we pass an empty array of feePaymentOptions as they are built + // in an upper level using the balances from Estimation.sol. + // balances from Estimation.sol reflect the balances after pending txn exec + const feePaymentOptions = []; + const localOp = { ...op }; + const accountState = accountStates[localOp.accountAddr][localOp.networkId]; + // if there's no entryPointAuthorization, we cannot do the estimation on deploy + if (!accountState.isDeployed && (!op.meta || !op.meta.entryPointAuthorization)) + return estimationErrorFormatted(new Error('Entry point privileges not granted. Please contact support'), { feePaymentOptions }); + const initialBundler = switcher.getBundler(); + const userOp = getUserOperation(account, accountState, localOp, initialBundler.getName(), !accountState.isDeployed ? op.meta.entryPointAuthorization : undefined); + // set the callData + if (userOp.activatorCall) + localOp.activatorCall = userOp.activatorCall; + const ambireAccount = new Interface(AmbireAccount.abi); + const isEdgeCase = !accountState.isErc4337Enabled && accountState.isDeployed; + userOp.signature = getSigForCalculations(); + const paymaster = await paymasterFactory.create(op, userOp, network, provider); + localOp.feeCall = paymaster.getFeeCallForEstimation(feeTokens); + userOp.callData = ambireAccount.encodeFunctionData('executeBySender', [ + getSignableCallsForBundlerEstimate(localOp) + ]); + if (paymaster.isUsable()) { + const paymasterEstimationData = paymaster.getEstimationData(); + userOp.paymaster = paymasterEstimationData.paymaster; + userOp.paymasterData = paymasterEstimationData.paymasterData; + if (paymasterEstimationData.paymasterPostOpGasLimit) + userOp.paymasterPostOpGasLimit = paymasterEstimationData.paymasterPostOpGasLimit; + if (paymasterEstimationData.paymasterVerificationGasLimit) + userOp.paymasterVerificationGasLimit = paymasterEstimationData.paymasterVerificationGasLimit; + } + while (true) { + // estimate + const bundler = switcher.getBundler(); + const estimations = await estimate(bundler, network, userOp, isEdgeCase, errorCallback); + // if no errors, return the results and get on with life + if (!(estimations.estimation instanceof Error)) { + const gasData = estimations.estimation[0]; + return { + gasUsed: BigInt(gasData.callGasLimit), + currentAccountNonce: Number(op.nonce), + feePaymentOptions, + erc4337GasLimits: { + preVerificationGas: gasData.preVerificationGas, + verificationGasLimit: gasData.verificationGasLimit, + callGasLimit: gasData.callGasLimit, + paymasterVerificationGasLimit: gasData.paymasterVerificationGasLimit, + paymasterPostOpGasLimit: gasData.paymasterPostOpGasLimit, + gasPrice: estimations.gasPrice, + paymaster + }, + error: null + }; + } + // if there's an error but we can't switch, return the error + if (!switcher.canSwitch(estimations.estimation)) { + return estimationErrorFormatted(estimations.estimation, { + feePaymentOptions, + nonFatalErrors: estimations.nonFatalErrors + }); + } + // try again + switcher.switch(); + } +} +//# sourceMappingURL=estimateBundler.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.js.map b/dist/src/libs/estimate/estimateBundler.js.map new file mode 100644 index 000000000..8490dadc6 --- /dev/null +++ b/dist/src/libs/estimate/estimateBundler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateBundler.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateBundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\n/* eslint-disable no-continue */\n/* eslint-disable no-constant-condition */\n\nimport { Interface } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { AccountOp, getSignableCallsForBundlerEstimate } from '../accountOp/accountOp'\nimport { PaymasterEstimationData } from '../erc7677/types'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getSigForCalculations, getUserOperation } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\n\nasync function estimate(\n bundler: Bundler,\n network: Network,\n userOp: UserOperation,\n isEdgeCase: boolean,\n errorCallback: Function\n): Promise<{\n gasPrice: GasSpeeds | Error\n estimation: any\n nonFatalErrors: Error[]\n}> {\n const gasPrice = await bundler.fetchGasPrices(network, errorCallback).catch(() => {\n return new Error('Could not fetch gas prices, retrying...')\n })\n\n // if the gasPrice fetch fails, we will switch the bundler and try again\n if (gasPrice instanceof Error) {\n const decodedError = bundler.decodeBundlerError(new Error('internal error'))\n return {\n gasPrice,\n // if gas prices couldn't be fetched, it means there's an internal error\n estimation: getHumanReadableEstimationError(decodedError),\n nonFatalErrors: []\n }\n }\n\n // add the maxFeePerGas and maxPriorityFeePerGas only if the network\n // is optimistic as the bundler uses these values to determine the\n // preVerificationGas.\n const localUserOp = { ...userOp }\n if (network.isOptimistic) {\n // use medium for the gas limit estimation\n localUserOp.maxPriorityFeePerGas = gasPrice.medium.maxPriorityFeePerGas\n localUserOp.maxFeePerGas = gasPrice.medium.maxFeePerGas\n }\n\n const nonFatalErrors: Error[] = []\n const initializeRequests = () => [\n bundler.estimate(userOp, network, isEdgeCase).catch((e: Error) => {\n const decodedError = bundler.decodeBundlerError(e)\n\n // if the bundler estimation fails, add a nonFatalError so we can react to\n // it on the FE. The BE at a later stage decides if this error is actually\n // fatal (at estimate.ts -> estimate4337)\n nonFatalErrors.push(new Error('Bundler estimation failed', { cause: '4337_ESTIMATION' }))\n\n if (decodedError.reason && decodedError.reason.indexOf('invalid account nonce') !== -1) {\n nonFatalErrors.push(\n new Error('4337 invalid account nonce', { cause: '4337_INVALID_NONCE' })\n )\n }\n\n return getHumanReadableEstimationError(decodedError)\n })\n ]\n\n const estimation = await estimateWithRetries(\n initializeRequests,\n 'estimation-bundler',\n errorCallback\n )\n return {\n gasPrice,\n estimation,\n nonFatalErrors\n }\n}\n\nexport async function bundlerEstimate(\n account: Account,\n accountStates: AccountStates,\n op: AccountOp,\n network: Network,\n feeTokens: TokenResult[],\n provider: RPCProvider,\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n // we pass an empty array of feePaymentOptions as they are built\n // in an upper level using the balances from Estimation.sol.\n // balances from Estimation.sol reflect the balances after pending txn exec\n const feePaymentOptions: FeePaymentOption[] = []\n\n const localOp = { ...op }\n const accountState = accountStates[localOp.accountAddr][localOp.networkId]\n // if there's no entryPointAuthorization, we cannot do the estimation on deploy\n if (!accountState.isDeployed && (!op.meta || !op.meta.entryPointAuthorization))\n return estimationErrorFormatted(\n new Error('Entry point privileges not granted. Please contact support'),\n { feePaymentOptions }\n )\n\n const initialBundler = switcher.getBundler()\n const userOp = getUserOperation(\n account,\n accountState,\n localOp,\n initialBundler.getName(),\n !accountState.isDeployed ? op.meta!.entryPointAuthorization : undefined\n )\n // set the callData\n if (userOp.activatorCall) localOp.activatorCall = userOp.activatorCall\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n const isEdgeCase = !accountState.isErc4337Enabled && accountState.isDeployed\n userOp.signature = getSigForCalculations()\n\n const paymaster = await paymasterFactory.create(op, userOp, network, provider)\n localOp.feeCall = paymaster.getFeeCallForEstimation(feeTokens)\n userOp.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCallsForBundlerEstimate(localOp)\n ])\n\n if (paymaster.isUsable()) {\n const paymasterEstimationData = paymaster.getEstimationData() as PaymasterEstimationData\n userOp.paymaster = paymasterEstimationData.paymaster\n userOp.paymasterData = paymasterEstimationData.paymasterData\n\n if (paymasterEstimationData.paymasterPostOpGasLimit)\n userOp.paymasterPostOpGasLimit = paymasterEstimationData.paymasterPostOpGasLimit\n\n if (paymasterEstimationData.paymasterVerificationGasLimit)\n userOp.paymasterVerificationGasLimit = paymasterEstimationData.paymasterVerificationGasLimit\n }\n\n while (true) {\n // estimate\n const bundler = switcher.getBundler()\n const estimations = await estimate(bundler, network, userOp, isEdgeCase, errorCallback)\n\n // if no errors, return the results and get on with life\n if (!(estimations.estimation instanceof Error)) {\n const gasData = estimations.estimation[0]\n return {\n gasUsed: BigInt(gasData.callGasLimit),\n currentAccountNonce: Number(op.nonce),\n feePaymentOptions,\n erc4337GasLimits: {\n preVerificationGas: gasData.preVerificationGas,\n verificationGasLimit: gasData.verificationGasLimit,\n callGasLimit: gasData.callGasLimit,\n paymasterVerificationGasLimit: gasData.paymasterVerificationGasLimit,\n paymasterPostOpGasLimit: gasData.paymasterPostOpGasLimit,\n gasPrice: estimations.gasPrice as GasSpeeds,\n paymaster\n },\n error: null\n }\n }\n\n // if there's an error but we can't switch, return the error\n if (!switcher.canSwitch(estimations.estimation)) {\n return estimationErrorFormatted(estimations.estimation as Error, {\n feePaymentOptions,\n nonFatalErrors: estimations.nonFatalErrors\n })\n }\n\n // try again\n switcher.switch()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.d.ts b/dist/src/libs/estimate/estimateEOA.d.ts new file mode 100644 index 000000000..2df149a2f --- /dev/null +++ b/dist/src/libs/estimate/estimateEOA.d.ts @@ -0,0 +1,8 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Account, AccountStates } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { AccountOp } from '../accountOp/accountOp'; +import { TokenResult } from '../portfolio'; +import { EstimateResult } from './interfaces'; +export declare function estimateEOA(account: Account, op: AccountOp, accountStates: AccountStates, network: Network, provider: JsonRpcProvider | Provider, feeTokens: TokenResult[], blockFrom: string, blockTag: string | number, errorCallback: Function): Promise; +//# sourceMappingURL=estimateEOA.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.d.ts.map b/dist/src/libs/estimate/estimateEOA.d.ts.map new file mode 100644 index 000000000..735072047 --- /dev/null +++ b/dist/src/libs/estimate/estimateEOA.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateEOA.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateEOA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAA;AAMzE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,SAAS,EAAmB,MAAM,wBAAwB,CAAA;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAI7C,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,GAAG,QAAQ,EACpC,SAAS,EAAE,WAAW,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,aAAa,EAAE,QAAQ,GACtB,OAAO,CAAC,cAAc,CAAC,CAyGzB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.js b/dist/src/libs/estimate/estimateEOA.js new file mode 100644 index 000000000..05983f62d --- /dev/null +++ b/dist/src/libs/estimate/estimateEOA.js @@ -0,0 +1,107 @@ +import { AbiCoder, ZeroAddress } from 'ethers'; +import Estimation from '../../../contracts/compiled/Estimation.json'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { OPTIMISTIC_ORACLE } from '../../consts/deploy'; +import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; +import { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'; +import { toSingletonCall } from '../accountOp/accountOp'; +import { DeploylessMode, fromDescriptor } from '../deployless/deployless'; +import { getHumanReadableEstimationError } from '../errorHumanizer'; +import { estimationErrorFormatted } from './errors'; +import { estimateWithRetries } from './estimateWithRetries'; +const abiCoder = new AbiCoder(); +export async function estimateEOA(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback) { + if (op.calls.length !== 1) + return estimationErrorFormatted(new Error("Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.")); + const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); + const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress; + const call = op.calls[0]; + // TODO: try to remove this call + const nonce = await provider.getTransactionCount(account.addr); + const accountState = accountStates[op.accountAddr][op.networkId]; + const encodedCallData = abiCoder.encode([ + 'bytes', + 'address', + 'address', + 'uint256', + 'uint256', + 'uint256', + 'uint256' // gasLimit + ], [call.data, call.to ?? ZeroAddress, account.addr, 100000000, 2, nonce, 100000]); + const initializeRequests = () => [ + provider + .estimateGas({ + from: account.addr, + to: call.to ?? undefined, + value: call.value, + data: call.data, + nonce + }) + .catch(getHumanReadableEstimationError), + !network.rpcNoStateOverride + ? deploylessEstimator + .call('estimateEoa', [ + account.addr, + [account.addr, EOA_SIMULATION_NONCE, op.calls.map(toSingletonCall), '0x'], + encodedCallData, + [account.addr], + FEE_COLLECTOR, + optimisticOracle + ], { + from: blockFrom, + blockTag, + mode: DeploylessMode.StateOverride, + stateToOverride: getEoaSimulationStateOverride(account.addr) + }) + .catch((e) => { + console.log('error calling estimateEoa:', e); + return [[0n, [], {}]]; + }) + : deploylessEstimator + .call('getL1GasEstimation', [encodedCallData, FEE_COLLECTOR, optimisticOracle], { + from: blockFrom, + blockTag + }) + .catch(getHumanReadableEstimationError) + ]; + const result = await estimateWithRetries(initializeRequests, 'estimation-eoa', errorCallback); + const feePaymentOptions = [ + { + paidBy: account.addr, + availableAmount: accountState.balance, + addedNative: 0n, + token: feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank) + } + ]; + if (result instanceof Error) + return estimationErrorFormatted(result, { feePaymentOptions }); + let gasUsed = 0n; + if (!network.rpcNoStateOverride) { + const [gasUsedEstimateGas, [[gasUsedEstimationSol, feeTokenOutcomes, l1GasEstimation]]] = result; + if (feeTokenOutcomes.length && feeTokenOutcomes[0].length) { + feePaymentOptions[0].availableAmount = feeTokenOutcomes[0][1]; + } + if (l1GasEstimation && l1GasEstimation.fee) { + feePaymentOptions[0].addedNative = l1GasEstimation.fee; + } + // if it's a simple transfer, trust estimateGas as it should be 21K + // if it's a contract call, trust whichever is higher + if (call.data === '0x') + gasUsed = gasUsedEstimateGas; + else + gasUsed = + gasUsedEstimateGas > gasUsedEstimationSol ? gasUsedEstimateGas : gasUsedEstimationSol; + } + else { + const [gasUsedEstimateGas, [l1GasEstimation]] = result; + feePaymentOptions[0].addedNative = l1GasEstimation.fee; + gasUsed = gasUsedEstimateGas; + } + return { + gasUsed, + currentAccountNonce: nonce, + feePaymentOptions, + error: result instanceof Error ? result : null + }; +} +//# sourceMappingURL=estimateEOA.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.js.map b/dist/src/libs/estimate/estimateEOA.js.map new file mode 100644 index 000000000..0a47beb29 --- /dev/null +++ b/dist/src/libs/estimate/estimateEOA.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateEOA.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateEOA.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult } from './interfaces'\n\nconst abiCoder = new AbiCoder()\n\nexport async function estimateEOA(\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n network: Network,\n provider: JsonRpcProvider | Provider,\n feeTokens: TokenResult[],\n blockFrom: string,\n blockTag: string | number,\n errorCallback: Function\n): Promise {\n if (op.calls.length !== 1)\n return estimationErrorFormatted(\n new Error(\n \"Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.\"\n )\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n const call = op.calls[0]\n // TODO: try to remove this call\n const nonce = await provider.getTransactionCount(account.addr)\n const accountState = accountStates[op.accountAddr][op.networkId]\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [call.data, call.to ?? ZeroAddress, account.addr, 100000000, 2, nonce, 100000]\n )\n const initializeRequests = () => [\n provider\n .estimateGas({\n from: account.addr,\n to: call.to ?? undefined,\n value: call.value,\n data: call.data,\n nonce\n })\n .catch(getHumanReadableEstimationError),\n !network.rpcNoStateOverride\n ? deploylessEstimator\n .call(\n 'estimateEoa',\n [\n account.addr,\n [account.addr, EOA_SIMULATION_NONCE, op.calls.map(toSingletonCall), '0x'],\n encodedCallData,\n [account.addr],\n FEE_COLLECTOR,\n optimisticOracle\n ],\n {\n from: blockFrom,\n blockTag,\n mode: DeploylessMode.StateOverride,\n stateToOverride: getEoaSimulationStateOverride(account.addr)\n }\n )\n .catch((e) => {\n console.log('error calling estimateEoa:', e)\n return [[0n, [], {}]]\n })\n : deploylessEstimator\n .call('getL1GasEstimation', [encodedCallData, FEE_COLLECTOR, optimisticOracle], {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError)\n ]\n const result = await estimateWithRetries(initializeRequests, 'estimation-eoa', errorCallback)\n const feePaymentOptions = [\n {\n paidBy: account.addr,\n availableAmount: accountState.balance,\n addedNative: 0n,\n token: feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)!\n }\n ]\n if (result instanceof Error) return estimationErrorFormatted(result, { feePaymentOptions })\n\n let gasUsed = 0n\n if (!network.rpcNoStateOverride) {\n const [gasUsedEstimateGas, [[gasUsedEstimationSol, feeTokenOutcomes, l1GasEstimation]]] = result\n if (feeTokenOutcomes.length && feeTokenOutcomes[0].length) {\n feePaymentOptions[0].availableAmount = feeTokenOutcomes[0][1]\n }\n if (l1GasEstimation && l1GasEstimation.fee) {\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n }\n\n // if it's a simple transfer, trust estimateGas as it should be 21K\n // if it's a contract call, trust whichever is higher\n if (call.data === '0x') gasUsed = gasUsedEstimateGas\n else\n gasUsed =\n gasUsedEstimateGas > gasUsedEstimationSol ? gasUsedEstimateGas : gasUsedEstimationSol\n } else {\n const [gasUsedEstimateGas, [l1GasEstimation]] = result\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n gasUsed = gasUsedEstimateGas\n }\n\n return {\n gasUsed,\n currentAccountNonce: nonce,\n feePaymentOptions,\n error: result instanceof Error ? result : null\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.d.ts b/dist/src/libs/estimate/estimateGas.d.ts new file mode 100644 index 000000000..a4eb8ec1c --- /dev/null +++ b/dist/src/libs/estimate/estimateGas.d.ts @@ -0,0 +1,6 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Account, AccountOnchainState } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { AccountOp } from '../accountOp/accountOp'; +export declare function estimateGas(account: Account, op: AccountOp, provider: Provider | JsonRpcProvider, accountState: AccountOnchainState, network: Network): Promise; +//# sourceMappingURL=estimateGas.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.d.ts.map b/dist/src/libs/estimate/estimateGas.d.ts.map new file mode 100644 index 000000000..bc27113b3 --- /dev/null +++ b/dist/src/libs/estimate/estimateGas.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateGas.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAK7D,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAA;AAGpE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,QAAQ,GAAG,eAAe,EACpC,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAwDjB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.js b/dist/src/libs/estimate/estimateGas.js new file mode 100644 index 000000000..2a806b6f6 --- /dev/null +++ b/dist/src/libs/estimate/estimateGas.js @@ -0,0 +1,59 @@ +import { Interface } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; +import { getRpcProvider } from '../../services/provider'; +import { getSpoof } from '../account/account'; +import { getSignableCalls } from '../accountOp/accountOp'; +// Use this estimateGas only for SA estimations +export async function estimateGas(account, op, provider, accountState, network) { + if (network.disableEstimateGas) + return 0n; + if (!account.creation) + throw new Error('Use this estimation only for smart accounts'); + const saAbi = new Interface(AmbireAccount.abi); + const factoryAbi = new Interface(AmbireFactory.abi); + const callData = accountState.isDeployed + ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)]) + : factoryAbi.encodeFunctionData('deployAndExecute', [ + account.creation.bytecode, + account.creation.salt, + getSignableCalls(op), + getSpoof(account) + ]); + // try estimating the gas without state override. If an error of type + // insufficient funds is encountered, try re-estimating with state override + return provider + .estimateGas({ + from: DEPLOYLESS_SIMULATION_FROM, + to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, + value: 0, + data: callData, + nonce: 0 + }) + .catch(async (e) => { + if (!e.message.includes('insufficient funds')) + return 0n; + const isolatedProvider = getRpcProvider(network.rpcUrls, network.chainId, network.selectedRpcUrl, { batchMaxCount: 1 }); + const withOverrides = await isolatedProvider + .send('eth_estimateGas', [ + { + to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, + value: '0x0', + data: callData, + from: DEPLOYLESS_SIMULATION_FROM, + nonce: '0x0' + }, + 'latest', + { + [DEPLOYLESS_SIMULATION_FROM]: { + balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + } + } + ]) + .catch(() => '0x0'); + isolatedProvider.destroy(); + return BigInt(withOverrides); + }); +} +//# sourceMappingURL=estimateGas.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.js.map b/dist/src/libs/estimate/estimateGas.js.map new file mode 100644 index 000000000..f64587db7 --- /dev/null +++ b/dist/src/libs/estimate/estimateGas.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateGas.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,QAAQ,CAAA;AAE7D,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAa,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,YAAiC,EACjC,OAAgB;IAEhB,IAAI,OAAO,CAAC,kBAAkB;QAAE,OAAO,EAAE,CAAA;IAEzC,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAErF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU;QACtC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;YAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;YACrB,gBAAgB,CAAC,EAAE,CAAC;YACpB,QAAQ,CAAC,OAAO,CAAC;SAClB,CAAC,CAAA;IAEN,qEAAqE;IACrE,2EAA2E;IAC3E,OAAO,QAAQ;SACZ,WAAW,CAAC;QACX,IAAI,EAAE,0BAA0B;QAChC,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW;QACzE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,CAAC;KACT,CAAC;SACD,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,OAAO,EAAE,CAAA;QAExD,MAAM,gBAAgB,GAAG,cAAc,CACrC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,EACtB,EAAE,aAAa,EAAE,CAAC,EAAE,CACrB,CAAA;QACD,MAAM,aAAa,GAAG,MAAM,gBAAgB;aACzC,IAAI,CAAC,iBAAiB,EAAE;YACvB;gBACE,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAS,CAAC,WAAW;gBAC1E,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,KAAK;aACb;YACD,QAAQ;YACR;gBACE,CAAC,0BAA0B,CAAC,EAAE;oBAC5B,OAAO,EAAE,oEAAoE;iBAC9E;aACF;SACF,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAErB,gBAAgB,CAAC,OAAO,EAAE,CAAA;QAC1B,OAAO,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACN,CAAC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSpoof } from '../account/account'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\n\n// Use this estimateGas only for SA estimations\nexport async function estimateGas(\n account: Account,\n op: AccountOp,\n provider: Provider | JsonRpcProvider,\n accountState: AccountOnchainState,\n network: Network\n): Promise {\n if (network.disableEstimateGas) return 0n\n\n if (!account.creation) throw new Error('Use this estimation only for smart accounts')\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n // try estimating the gas without state override. If an error of type\n // insufficient funds is encountered, try re-estimating with state override\n return provider\n .estimateGas({\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData,\n nonce: 0\n })\n .catch(async (e) => {\n if (!e.message.includes('insufficient funds')) return 0n\n\n const isolatedProvider = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl,\n { batchMaxCount: 1 }\n )\n const withOverrides = await isolatedProvider\n .send('eth_estimateGas', [\n {\n to: accountState.isDeployed ? account.addr : account.creation!.factoryAddr,\n value: '0x0',\n data: callData,\n from: DEPLOYLESS_SIMULATION_FROM,\n nonce: '0x0'\n },\n 'latest',\n {\n [DEPLOYLESS_SIMULATION_FROM]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n }\n ])\n .catch(() => '0x0')\n\n isolatedProvider.destroy()\n return BigInt(withOverrides)\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.d.ts b/dist/src/libs/estimate/estimateHelpers.d.ts new file mode 100644 index 000000000..000782025 --- /dev/null +++ b/dist/src/libs/estimate/estimateHelpers.d.ts @@ -0,0 +1,4 @@ +import { Network } from '../../interfaces/network'; +import { TokenResult } from '../portfolio'; +export declare function getFeeTokenForEstimate(feeTokens: TokenResult[], network: Network): TokenResult | null; +//# sourceMappingURL=estimateHelpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.d.ts.map b/dist/src/libs/estimate/estimateHelpers.d.ts.map new file mode 100644 index 000000000..6fb707baa --- /dev/null +++ b/dist/src/libs/estimate/estimateHelpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateHelpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EAAE,EACxB,OAAO,EAAE,OAAO,GACf,WAAW,GAAG,IAAI,CA2BpB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.js b/dist/src/libs/estimate/estimateHelpers.js new file mode 100644 index 000000000..fb6e9721f --- /dev/null +++ b/dist/src/libs/estimate/estimateHelpers.js @@ -0,0 +1,24 @@ +import { ZeroAddress } from 'ethers'; +export function getFeeTokenForEstimate(feeTokens, network) { + if (!feeTokens.length) + return null; + const gasTankToken = feeTokens.find((feeToken) => feeToken.flags.onGasTank && feeToken.amount > 0n); + const erc20token = feeTokens.find((feeToken) => feeToken.address !== ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); + const nativeToken = feeTokens.find((feeToken) => feeToken.address === ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); + // for optimistic L2s, prioritize the gas tank token as a fee payment + // option as its callData costs more than the actual transfer of tokens + if (network.isOptimistic) { + if (gasTankToken) + return gasTankToken; + if (erc20token) + return erc20token; + return nativeToken ?? null; + } + // for L1s, prioritize erc20 transfer as it's the most expensive + if (erc20token) + return erc20token; + if (nativeToken) + return nativeToken; + return gasTankToken ?? null; +} +//# sourceMappingURL=estimateHelpers.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.js.map b/dist/src/libs/estimate/estimateHelpers.js.map new file mode 100644 index 000000000..d200834e0 --- /dev/null +++ b/dist/src/libs/estimate/estimateHelpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateHelpers.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKpC,MAAM,UAAU,sBAAsB,CACpC,SAAwB,EACxB,OAAgB;IAEhB,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAElC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CACjC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAC/D,CAAA;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAC/B,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IAED,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,OAAO,CAAC,YAAY,EAAE;QACxB,IAAI,YAAY;YAAE,OAAO,YAAY,CAAA;QACrC,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,OAAO,WAAW,IAAI,IAAI,CAAA;KAC3B;IAED,gEAAgE;IAChE,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACjC,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IACnC,OAAO,YAAY,IAAI,IAAI,CAAA;AAC7B,CAAC","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../../interfaces/network'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeTokenForEstimate(\n feeTokens: TokenResult[],\n network: Network\n): TokenResult | null {\n if (!feeTokens.length) return null\n\n const gasTankToken = feeTokens.find(\n (feeToken) => feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const erc20token = feeTokens.find(\n (feeToken) =>\n feeToken.address !== ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const nativeToken = feeTokens.find(\n (feeToken) =>\n feeToken.address === ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n\n // for optimistic L2s, prioritize the gas tank token as a fee payment\n // option as its callData costs more than the actual transfer of tokens\n if (network.isOptimistic) {\n if (gasTankToken) return gasTankToken\n if (erc20token) return erc20token\n return nativeToken ?? null\n }\n\n // for L1s, prioritize erc20 transfer as it's the most expensive\n if (erc20token) return erc20token\n if (nativeToken) return nativeToken\n return gasTankToken ?? null\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.d.ts b/dist/src/libs/estimate/estimateWithRetries.d.ts new file mode 100644 index 000000000..981817ced --- /dev/null +++ b/dist/src/libs/estimate/estimateWithRetries.d.ts @@ -0,0 +1,2 @@ +export declare function estimateWithRetries(fetchRequests: Function, timeoutType: string, errorCallback: Function, timeoutInMill?: number, counter?: number): Promise; +//# sourceMappingURL=estimateWithRetries.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.d.ts.map b/dist/src/libs/estimate/estimateWithRetries.d.ts.map new file mode 100644 index 000000000..4706cb615 --- /dev/null +++ b/dist/src/libs/estimate/estimateWithRetries.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateWithRetries.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateWithRetries.ts"],"names":[],"mappings":"AAAA,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,QAAQ,EACvB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,QAAQ,EACvB,aAAa,GAAE,MAAc,EAC7B,OAAO,GAAE,MAAU,GAClB,OAAO,CAAC,GAAG,CAAC,CAkEd"} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.js b/dist/src/libs/estimate/estimateWithRetries.js new file mode 100644 index 000000000..2106a8ad1 --- /dev/null +++ b/dist/src/libs/estimate/estimateWithRetries.js @@ -0,0 +1,53 @@ +export async function estimateWithRetries(fetchRequests, timeoutType, errorCallback, timeoutInMill = 10000, counter = 0) { + // stop the execution on 5 fails; + // the below error message is not shown to the user so we are safe + if (counter >= 5) + return new Error('Estimation failure, retrying in a couple of seconds. If this issue persists, please change your RPC provider or contact Ambire support'); + const santinelTimeoutErr = {}; + const estimationTimeout = new Promise((resolve) => { + setTimeout(() => { + resolve(santinelTimeoutErr); + }, timeoutInMill); + }); + let result = await Promise.race([Promise.all(fetchRequests()), estimationTimeout]); + // retry on a timeout + if (result === santinelTimeoutErr) { + const incremented = counter + 1; + // display a timeout error only on the first try + switch (timeoutType) { + case 'estimation-deployless': + errorCallback({ + level: 'major', + message: 'Estimating gas limits from the RPC timed out. Retrying...', + error: new Error('Estimation.sol deployless timeout') + }); + break; + case 'estimation-bundler': + errorCallback({ + level: 'major', + message: 'Estimating gas limits from the bundler timed out. Retrying...', + error: new Error('Budler gas limit estimation timeout') + }); + break; + case 'estimation-eoa': + errorCallback({ + level: 'major', + message: 'Estimating gas limits for Basic Account from the RPC timed out. Retrying...', + error: new Error('Budler gas limit estimation timeout') + }); + break; + default: + break; + } + result = await estimateWithRetries(fetchRequests, timeoutType, errorCallback, timeoutInMill, incremented); + } + else { + // if one of the calls returns an error, return it + const error = Array.isArray(result) ? result.find((res) => res instanceof Error) : null; + if (error) + return error; + } + // success outcome + return result; +} +//# sourceMappingURL=estimateWithRetries.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.js.map b/dist/src/libs/estimate/estimateWithRetries.js.map new file mode 100644 index 000000000..7fc2afae8 --- /dev/null +++ b/dist/src/libs/estimate/estimateWithRetries.js.map @@ -0,0 +1 @@ +{"version":3,"file":"estimateWithRetries.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateWithRetries.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAuB,EACvB,WAAmB,EACnB,aAAuB,EACvB,gBAAwB,KAAK,EAC7B,UAAkB,CAAC;IAEnB,iCAAiC;IACjC,kEAAkE;IAClE,IAAI,OAAO,IAAI,CAAC;QACd,OAAO,IAAI,KAAK,CACd,wIAAwI,CACzI,CAAA;IAEH,MAAM,kBAAkB,GAAG,EAAE,CAAA;IAC7B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAC7B,CAAC,EAAE,aAAa,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAElF,qBAAqB;IACrB,IAAI,MAAM,KAAK,kBAAkB,EAAE;QACjC,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,gDAAgD;QAEhD,QAAQ,WAAW,EAAE;YACnB,KAAK,uBAAuB;gBAC1B,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,2DAA2D;oBACpE,KAAK,EAAE,IAAI,KAAK,CAAC,mCAAmC,CAAC;iBACtD,CAAC,CAAA;gBACF,MAAK;YAEP,KAAK,oBAAoB;gBACvB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,+DAA+D;oBACxE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YACP,KAAK,gBAAgB;gBACnB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,6EAA6E;oBACtF,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YAEP;gBACE,MAAK;SACR;QAED,MAAM,GAAG,MAAM,mBAAmB,CAChC,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,CACZ,CAAA;KACF;SAAM;QACL,kDAAkD;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;KACxB;IAED,kBAAkB;IAClB,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["export async function estimateWithRetries(\n fetchRequests: Function,\n timeoutType: string,\n errorCallback: Function,\n timeoutInMill: number = 10000,\n counter: number = 0\n): Promise {\n // stop the execution on 5 fails;\n // the below error message is not shown to the user so we are safe\n if (counter >= 5)\n return new Error(\n 'Estimation failure, retrying in a couple of seconds. If this issue persists, please change your RPC provider or contact Ambire support'\n )\n\n const santinelTimeoutErr = {}\n const estimationTimeout = new Promise((resolve) => {\n setTimeout(() => {\n resolve(santinelTimeoutErr)\n }, timeoutInMill)\n })\n\n let result = await Promise.race([Promise.all(fetchRequests()), estimationTimeout])\n\n // retry on a timeout\n if (result === santinelTimeoutErr) {\n const incremented = counter + 1\n\n // display a timeout error only on the first try\n\n switch (timeoutType) {\n case 'estimation-deployless':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the RPC timed out. Retrying...',\n error: new Error('Estimation.sol deployless timeout')\n })\n break\n\n case 'estimation-bundler':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the bundler timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n case 'estimation-eoa':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits for Basic Account from the RPC timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n\n default:\n break\n }\n\n result = await estimateWithRetries(\n fetchRequests,\n timeoutType,\n errorCallback,\n timeoutInMill,\n incremented\n )\n } else {\n // if one of the calls returns an error, return it\n const error = Array.isArray(result) ? result.find((res) => res instanceof Error) : null\n if (error) return error\n }\n\n // success outcome\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/interfaces.d.ts b/dist/src/libs/estimate/interfaces.d.ts new file mode 100644 index 000000000..5ccd8b26f --- /dev/null +++ b/dist/src/libs/estimate/interfaces.d.ts @@ -0,0 +1,36 @@ +import { Hex } from '../../interfaces/hex'; +import { GasSpeeds } from '../../services/bundlers/types'; +import { AbstractPaymaster } from '../paymaster/abstractPaymaster'; +import { TokenResult } from '../portfolio'; +export interface BundlerEstimateResult { + preVerificationGas: Hex; + verificationGasLimit: Hex; + callGasLimit: Hex; + paymasterVerificationGasLimit: Hex; + paymasterPostOpGasLimit: Hex; +} +export interface Erc4337GasLimits { + preVerificationGas: string; + verificationGasLimit: string; + callGasLimit: string; + paymasterVerificationGasLimit: string; + paymasterPostOpGasLimit: string; + gasPrice: GasSpeeds; + paymaster: AbstractPaymaster; +} +export interface FeePaymentOption { + availableAmount: bigint; + paidBy: string; + gasUsed?: bigint; + addedNative: bigint; + token: TokenResult; +} +export interface EstimateResult { + gasUsed: bigint; + currentAccountNonce: number; + feePaymentOptions: FeePaymentOption[]; + erc4337GasLimits?: Erc4337GasLimits; + error: Error | null; + nonFatalErrors?: Error[]; +} +//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/interfaces.d.ts.map b/dist/src/libs/estimate/interfaces.d.ts.map new file mode 100644 index 000000000..96d7f7708 --- /dev/null +++ b/dist/src/libs/estimate/interfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,GAAG,CAAA;IACvB,oBAAoB,EAAE,GAAG,CAAA;IACzB,YAAY,EAAE,GAAG,CAAA;IACjB,6BAA6B,EAAE,GAAG,CAAA;IAClC,uBAAuB,EAAE,GAAG,CAAA;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,6BAA6B,EAAE,MAAM,CAAA;IACrC,uBAAuB,EAAE,MAAM,CAAA;IAC/B,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,EAAE,iBAAiB,CAAA;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,WAAW,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IAIf,mBAAmB,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IAMnB,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/interfaces.js b/dist/src/libs/estimate/interfaces.js new file mode 100644 index 000000000..c30bb68c1 --- /dev/null +++ b/dist/src/libs/estimate/interfaces.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/interfaces.js.map b/dist/src/libs/estimate/interfaces.js.map new file mode 100644 index 000000000..4e5608cc9 --- /dev/null +++ b/dist/src/libs/estimate/interfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/estimate/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { Hex } from '../../interfaces/hex'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { AbstractPaymaster } from '../paymaster/abstractPaymaster'\nimport { TokenResult } from '../portfolio'\n\nexport interface BundlerEstimateResult {\n preVerificationGas: Hex\n verificationGasLimit: Hex\n callGasLimit: Hex\n paymasterVerificationGasLimit: Hex\n paymasterPostOpGasLimit: Hex\n}\n\nexport interface Erc4337GasLimits {\n preVerificationGas: string\n verificationGasLimit: string\n callGasLimit: string\n paymasterVerificationGasLimit: string\n paymasterPostOpGasLimit: string\n gasPrice: GasSpeeds\n paymaster: AbstractPaymaster\n}\n\nexport interface FeePaymentOption {\n availableAmount: bigint\n paidBy: string\n gasUsed?: bigint\n addedNative: bigint\n token: TokenResult\n}\n\nexport interface EstimateResult {\n gasUsed: bigint\n // the nonce should always be the current value of account.nonce()\n // even in ERC-4337 case, we might use the account.nonce() for\n // signatures. We don't need the EntryPoint nonce\n currentAccountNonce: number\n feePaymentOptions: FeePaymentOption[]\n erc4337GasLimits?: Erc4337GasLimits\n error: Error | null\n // put here errors that are not fatal to the signing process\n // but reactable if known\n // example: bundler simulation fails because of incorrect 4337 nonce.\n // The user can still broadcast with EOA but we can also react\n // to this error by setting the correct nonce and re-estimating\n nonFatalErrors?: Error[]\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.d.ts b/dist/src/libs/estimate/refund.d.ts new file mode 100644 index 000000000..17a9b8776 --- /dev/null +++ b/dist/src/libs/estimate/refund.d.ts @@ -0,0 +1,5 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Account } from '../../interfaces/account'; +import { AccountOp } from '../accountOp/accountOp'; +export declare function refund(account: Account, op: AccountOp, provider: JsonRpcProvider | Provider, gasUsed: bigint): Promise; +//# sourceMappingURL=refund.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.d.ts.map b/dist/src/libs/estimate/refund.d.ts.map new file mode 100644 index 000000000..c497bd67a --- /dev/null +++ b/dist/src/libs/estimate/refund.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"refund.d.ts","sourceRoot":"","sources":["../../../../src/libs/estimate/refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAI7D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,eAAe,GAAG,QAAQ,EACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAiCjB"} \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.js b/dist/src/libs/estimate/refund.js new file mode 100644 index 000000000..34eb956ba --- /dev/null +++ b/dist/src/libs/estimate/refund.js @@ -0,0 +1,34 @@ +import { Interface } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +export async function refund(account, op, provider, gasUsed) { + // WARNING: calculateRefund will 100% NOT work in all cases we have + // So a warning not to assume this is working + const IAmbireAccount = new Interface(AmbireAccount.abi); + const IAmbireFactory = new Interface(AmbireFactory.abi); + const accountCalldata = op.accountOpToExecuteBefore + ? IAmbireAccount.encodeFunctionData('executeMultiple', [ + [ + [op.accountOpToExecuteBefore.calls, op.accountOpToExecuteBefore.signature], + [op.calls, op.signature] + ] + ]) + : IAmbireAccount.encodeFunctionData('execute', [op.calls, op.signature]); + const factoryCalldata = IAmbireFactory.encodeFunctionData('deployAndExecute', [ + account.creation.bytecode, + account.creation.salt, + [[account.addr, 0, accountCalldata]], + op.signature + ]); + const estimatedGas = await provider.estimateGas({ + from: '0x0000000000000000000000000000000000000001', + to: account.creation.factoryAddr, + data: factoryCalldata + }); + const estimatedRefund = gasUsed - estimatedGas; + // As of EIP-3529, the max refund is 1/5th of the entire cost + if (estimatedRefund <= gasUsed / 5n && estimatedRefund > 0n) + return estimatedGas; + return gasUsed; +} +//# sourceMappingURL=refund.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.js.map b/dist/src/libs/estimate/refund.js.map new file mode 100644 index 000000000..6adead122 --- /dev/null +++ b/dist/src/libs/estimate/refund.js.map @@ -0,0 +1 @@ +{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../../src/libs/estimate/refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,QAAQ,CAAA;AAE7D,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAI1E,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,OAAe;IAEf,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAEvD,MAAM,eAAe,GAAG,EAAE,CAAC,wBAAwB;QACjD,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACnD;gBACE,CAAC,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;gBAC1E,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC;aACzB;SACF,CAAC;QACJ,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAE1E,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;QAC5E,OAAO,CAAC,QAAS,CAAC,QAAQ;QAC1B,OAAO,CAAC,QAAS,CAAC,IAAI;QACtB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACpC,EAAE,CAAC,SAAS;KACb,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;QAC9C,IAAI,EAAE,4CAA4C;QAClD,EAAE,EAAE,OAAO,CAAC,QAAS,CAAC,WAAW;QACjC,IAAI,EAAE,eAAe;KACtB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,CAAA;IAE9C,6DAA6D;IAC7D,IAAI,eAAe,IAAI,OAAO,GAAG,EAAE,IAAI,eAAe,GAAG,EAAE;QAAE,OAAO,YAAY,CAAA;IAChF,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account } from '../../interfaces/account'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport async function refund(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider | Provider,\n gasUsed: bigint\n): Promise {\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n const IAmbireAccount = new Interface(AmbireAccount.abi)\n const IAmbireFactory = new Interface(AmbireFactory.abi)\n\n const accountCalldata = op.accountOpToExecuteBefore\n ? IAmbireAccount.encodeFunctionData('executeMultiple', [\n [\n [op.accountOpToExecuteBefore.calls, op.accountOpToExecuteBefore.signature],\n [op.calls, op.signature]\n ]\n ])\n : IAmbireAccount.encodeFunctionData('execute', [op.calls, op.signature])\n\n const factoryCalldata = IAmbireFactory.encodeFunctionData('deployAndExecute', [\n account.creation!.bytecode,\n account.creation!.salt,\n [[account.addr, 0, accountCalldata]],\n op.signature\n ])\n\n const estimatedGas = await provider.estimateGas({\n from: '0x0000000000000000000000000000000000000001',\n to: account.creation!.factoryAddr,\n data: factoryCalldata\n })\n\n const estimatedRefund = gasUsed - estimatedGas\n\n // As of EIP-3529, the max refund is 1/5th of the entire cost\n if (estimatedRefund <= gasUsed / 5n && estimatedRefund > 0n) return estimatedGas\n return gasUsed\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.d.ts b/dist/src/libs/gasPrice/gasPrice.d.ts new file mode 100644 index 000000000..1e5f95c3e --- /dev/null +++ b/dist/src/libs/gasPrice/gasPrice.d.ts @@ -0,0 +1,21 @@ +import { Provider } from 'ethers'; +import { Account, AccountOnchainState } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { AccountOp } from '../accountOp/accountOp'; +export declare const MIN_GAS_PRICE = 1000000000n; +export interface GasPriceRecommendation { + name: string; + gasPrice: bigint; +} +export interface Gas1559Recommendation { + name: string; + baseFeePerGas: bigint; + maxPriorityFeePerGas: bigint; +} +export type GasRecommendation = GasPriceRecommendation | Gas1559Recommendation; +export declare function getGasPriceRecommendations(provider: Provider, network: Network, blockTag?: string | number): Promise<{ + gasPrice: GasRecommendation[]; + blockGasLimit: bigint; +}>; +export declare function getProbableCallData(account: Account, accountOp: AccountOp, accountState: AccountOnchainState, network: Network): string; +//# sourceMappingURL=gasPrice.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.d.ts.map b/dist/src/libs/gasPrice/gasPrice.d.ts.map new file mode 100644 index 000000000..6833ee9de --- /dev/null +++ b/dist/src/libs/gasPrice/gasPrice.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gasPrice.d.ts","sourceRoot":"","sources":["../../../../src/libs/gasPrice/gasPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIpE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAA;AAQpE,eAAO,MAAM,aAAa,cAAc,CAAA;AAWxC,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AACD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AACD,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,GAAG,qBAAqB,CAAA;AAgG9E,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,MAAM,GAAG,MAAW,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAoFnE;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,OAAO,GACf,MAAM,CAqCR"} \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.js b/dist/src/libs/gasPrice/gasPrice.js new file mode 100644 index 000000000..dad54d273 --- /dev/null +++ b/dist/src/libs/gasPrice/gasPrice.js @@ -0,0 +1,214 @@ +import { Interface } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import { getSignableCalls } from '../accountOp/accountOp'; +import { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'; +// https://eips.ethereum.org/EIPS/eip-1559 +const DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR = 8n; +const DEFAULT_ELASTICITY_MULTIPLIER = 2n; +// a 1 gwei min for gas price, non1559 networks +export const MIN_GAS_PRICE = 1000000000n; +// multipliers from the old: https://github.com/AmbireTech/relayer/blob/wallet-v2/src/utils/gasOracle.js#L64-L76 +// 2x, 2x*0.4, 2x*0.2 - all of them divided by 8 so 0.25, 0.1, 0.05 - those seem usable; with a slight tweak for the ape +const speeds = [ + { name: 'slow', baseFeeAddBps: 0n }, + { name: 'medium', baseFeeAddBps: 500n }, + { name: 'fast', baseFeeAddBps: 1000n }, + { name: 'ape', baseFeeAddBps: 1500n } +]; +// https://stackoverflow.com/questions/20811131/javascript-remove-outlier-from-an-array +function filterOutliers(data) { + if (!data.length) + return []; + // numeric sort, a - b doesn't work for bigint + data.sort((a, b) => { + if (a === b) + return 0; + if (a > b) + return 1; + return -1; + }); + const q1 = data[Math.floor(data.length / 4)]; + const endPosition = Math.ceil(data.length * (3 / 4)); + const q2 = data[endPosition < data.length ? endPosition : data.length - 1]; + const iqr = q2 - q1; + const maxValue = q2 + (iqr * 15n) / 10n; + const minValue = q1 - (iqr * 15n) / 10n; + const filteredValues = data.filter((x) => x <= maxValue && x >= minValue); + return filteredValues; +} +function nthGroup(data, n, outOf) { + const step = Math.floor(data.length / outOf); + const at = n * step; + // if n is 3 (ape speed) and we have at least 4 txns in the previous block, + // we want to include the remaining high cost transactions in the group. + // Example: 15 txns make 3 groups of 3 for slow, medium and fast, totalling 9 + // the remaining 6 get included in the ape calculation + const end = n !== 3 || data.length < 4 ? at + Math.max(1, step) : data.length; + return data.slice(at, end); +} +function average(data) { + if (data.length === 0) + return 0n; + return data.reduce((a, b) => a + b, 0n) / BigInt(data.length); +} +function getNetworkMinBaseFee(network, lastBlock) { + // if we have a minBaseFee set in our config, use it + if (network.feeOptions.minBaseFee) + return network.feeOptions.minBaseFee; + // if we don't have a config, we return 0 + if (network.predefined && !network.feeOptions.minBaseFeeEqualToLastBlock) + return 0n; + // if it's a custom network and it has EIP-1559, set the minimum + // to the lastBlock's baseFeePerGas. Every chain is free to tweak + // its EIP-1559 implementation as it deems fit. Therefore, we have no + // guarantee the 12.5% block base fee reduction will actually happen. + // if it doesn't and we reduce the baseFee with our calculations, + // most often than not the transaction will just get stuck. + // + // Transaction fees are no longer an issue on L2s. + // Having the user spend a fraction of the cent more is way better + // than having his txns constantly getting stuck + return lastBlock.baseFeePerGas ?? 0n; +} +// if there's an RPC issue, try refetching the block at least +// 5 times before declaring a failure +async function refetchBlock(provider, blockTag = -1, counter = 0) { + // the reason we throw an error here is that getGasPriceRecommendations is + // used in main.ts #updateGasPrice where we emit an error with a predefined + // msg, which in turn displays a notification popup with the error. + // If we change the design and decide to display this as an error + // somewhere else, we should probably not throw, but return the + // error instead + if (counter >= 5) + throw new Error('unable to retrieve block'); + let lastBlock = null; + try { + const response = await Promise.race([ + provider.getBlock(blockTag, true), + new Promise((_resolve, reject) => { + setTimeout(() => reject(new Error('last block failed to resolve, request too slow')), 6000); + }) + ]); + lastBlock = response; + } + catch (e) { + lastBlock = null; + } + if (!lastBlock) { + const localCounter = counter + 1; + lastBlock = await refetchBlock(provider, blockTag, localCounter); + } + return lastBlock; +} +export async function getGasPriceRecommendations(provider, network, blockTag = -1) { + const [lastBlock, ethGasPrice] = await Promise.all([ + refetchBlock(provider, blockTag), + provider.send('eth_gasPrice', []).catch((e) => { + console.log('eth_gasPrice failed because of the following reason:'); + console.log(e); + return '0x'; + }) + ]); + // https://github.com/ethers-io/ethers.js/issues/3683#issuecomment-1436554995 + const txns = lastBlock.prefetchedTransactions; + if (network.feeOptions.is1559 && + lastBlock.baseFeePerGas != null && + lastBlock.baseFeePerGas !== 0n) { + // https://eips.ethereum.org/EIPS/eip-1559 + const elasticityMultiplier = network.feeOptions.elasticityMultiplier ?? DEFAULT_ELASTICITY_MULTIPLIER; + const baseFeeMaxChangeDenominator = network.feeOptions.baseFeeMaxChangeDenominator ?? DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR; + const gasTarget = lastBlock.gasLimit / elasticityMultiplier; + const baseFeePerGas = lastBlock.baseFeePerGas; + const getBaseFeeDelta = (delta) => (baseFeePerGas * delta) / gasTarget / baseFeeMaxChangeDenominator; + let expectedBaseFee = baseFeePerGas; + if (lastBlock.gasUsed > gasTarget) { + const baseFeeDelta = getBaseFeeDelta(lastBlock.gasUsed - gasTarget); + expectedBaseFee += baseFeeDelta === 0n ? 1n : baseFeeDelta; + } + else if (lastBlock.gasUsed < gasTarget) { + const baseFeeDelta = getBaseFeeDelta(gasTarget - lastBlock.gasUsed); + expectedBaseFee -= baseFeeDelta; + } + // if the estimated fee is below the chain minimum, set it to the min + const minBaseFee = getNetworkMinBaseFee(network, lastBlock); + if (expectedBaseFee < minBaseFee) + expectedBaseFee = minBaseFee; + const tips = filterOutliers(txns.map((x) => x.maxPriorityFeePerGas).filter((x) => x > 0)); + const fee = []; + speeds.forEach(({ name, baseFeeAddBps }, i) => { + const baseFee = expectedBaseFee + (expectedBaseFee * baseFeeAddBps) / 10000n; + let maxPriorityFeePerGas = average(nthGroup(tips, i, speeds.length)); + // set a bare minimum of 100000n for maxPriorityFeePerGas + maxPriorityFeePerGas = maxPriorityFeePerGas >= 100000n ? maxPriorityFeePerGas : 100000n; + // compare the maxPriorityFeePerGas with the previous speed + // if it's not at least 12% bigger, then replace the calculated one + // with at least 12% bigger maxPriorityFeePerGas. + // This is most impactufull on L2s where txns get stuck for low maxPriorityFeePerGas + // + // if the speed is ape, make it 50% more + const prevSpeed = fee.length ? fee[i - 1].maxPriorityFeePerGas : null; + if (prevSpeed) { + const divider = name === 'ape' ? 2n : 8n; + const min = prevSpeed + prevSpeed / divider; + if (maxPriorityFeePerGas < min) + maxPriorityFeePerGas = min; + } + fee.push({ + name, + baseFeePerGas: baseFee, + maxPriorityFeePerGas + }); + }); + return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }; + } + const prices = filterOutliers(txns.map((x) => x.gasPrice).filter((x) => x > 0)); + // use th fetched price as a min if not 0 as it could be actually lower + // than the hardcoded MIN. + const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : MIN_GAS_PRICE; + const fee = speeds.map(({ name }, i) => { + const avgGasPrice = average(nthGroup(prices, i, speeds.length)); + return { + name, + gasPrice: avgGasPrice >= minOrFetchedGasPrice ? avgGasPrice : minOrFetchedGasPrice + }; + }); + return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }; +} +export function getProbableCallData(account, accountOp, accountState, network) { + let estimationCallData; + // include the activator call for estimation if any + const localOp = { ...accountOp }; + if (shouldIncludeActivatorCall(network, account, accountState, false)) { + localOp.activatorCall = getActivatorCall(localOp.accountAddr); + } + // always call executeMultiple as the worts case scenario + // we disregard the initCode + if (accountState.isDeployed) { + const ambireAccount = new Interface(AmbireAccount.abi); + estimationCallData = ambireAccount.encodeFunctionData('executeMultiple', [ + [ + [ + getSignableCalls(localOp), + '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01' + ] + ] + ]); + } + else { + // deployAndExecuteMultiple is the worst case + const ambireFactory = new Interface(AmbireFactory.abi); + estimationCallData = ambireFactory.encodeFunctionData('deployAndExecuteMultiple', [ + '0x7f00000000000000000000000000000000000000000000000000000000000000017fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5553d602d80604d3d3981f3363d3d373d3d3d363d7353a31973ebcc225e219bb0d7c0c9324773f5b3e95af43d82803e903d91602b57fd5bf3', + '0x0000000000000000000000000000000000000000000000000000000000000000', + [ + [ + getSignableCalls(localOp), + '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01' + ] + ] + ]); + } + return estimationCallData; +} +//# sourceMappingURL=gasPrice.js.map \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.js.map b/dist/src/libs/gasPrice/gasPrice.js.map new file mode 100644 index 000000000..25afa296f --- /dev/null +++ b/dist/src/libs/gasPrice/gasPrice.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gasPrice.js","sourceRoot":"","sources":["../../../../src/libs/gasPrice/gasPrice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Block, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\n\n// https://eips.ethereum.org/EIPS/eip-1559\nconst DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR = 8n\nconst DEFAULT_ELASTICITY_MULTIPLIER = 2n\n\n// a 1 gwei min for gas price, non1559 networks\nexport const MIN_GAS_PRICE = 1000000000n\n\n// multipliers from the old: https://github.com/AmbireTech/relayer/blob/wallet-v2/src/utils/gasOracle.js#L64-L76\n// 2x, 2x*0.4, 2x*0.2 - all of them divided by 8 so 0.25, 0.1, 0.05 - those seem usable; with a slight tweak for the ape\nconst speeds = [\n { name: 'slow', baseFeeAddBps: 0n },\n { name: 'medium', baseFeeAddBps: 500n },\n { name: 'fast', baseFeeAddBps: 1000n },\n { name: 'ape', baseFeeAddBps: 1500n }\n]\n\nexport interface GasPriceRecommendation {\n name: string\n gasPrice: bigint\n}\nexport interface Gas1559Recommendation {\n name: string\n baseFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\nexport type GasRecommendation = GasPriceRecommendation | Gas1559Recommendation\n\n// https://stackoverflow.com/questions/20811131/javascript-remove-outlier-from-an-array\nfunction filterOutliers(data: bigint[]): bigint[] {\n if (!data.length) return []\n\n // numeric sort, a - b doesn't work for bigint\n data.sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n\n const q1 = data[Math.floor(data.length / 4)]\n const endPosition = Math.ceil(data.length * (3 / 4))\n const q2 = data[endPosition < data.length ? endPosition : data.length - 1]\n const iqr = q2 - q1\n const maxValue = q2 + (iqr * 15n) / 10n\n const minValue = q1 - (iqr * 15n) / 10n\n const filteredValues = data.filter((x) => x <= maxValue && x >= minValue)\n return filteredValues\n}\n\nfunction nthGroup(data: bigint[], n: number, outOf: number): bigint[] {\n const step = Math.floor(data.length / outOf)\n const at = n * step\n\n // if n is 3 (ape speed) and we have at least 4 txns in the previous block,\n // we want to include the remaining high cost transactions in the group.\n // Example: 15 txns make 3 groups of 3 for slow, medium and fast, totalling 9\n // the remaining 6 get included in the ape calculation\n const end = n !== 3 || data.length < 4 ? at + Math.max(1, step) : data.length\n return data.slice(at, end)\n}\n\nfunction average(data: bigint[]): bigint {\n if (data.length === 0) return 0n\n return data.reduce((a, b) => a + b, 0n) / BigInt(data.length)\n}\n\nfunction getNetworkMinBaseFee(network: Network, lastBlock: Block): bigint {\n // if we have a minBaseFee set in our config, use it\n if (network.feeOptions.minBaseFee) return network.feeOptions.minBaseFee\n\n // if we don't have a config, we return 0\n if (network.predefined && !network.feeOptions.minBaseFeeEqualToLastBlock) return 0n\n\n // if it's a custom network and it has EIP-1559, set the minimum\n // to the lastBlock's baseFeePerGas. Every chain is free to tweak\n // its EIP-1559 implementation as it deems fit. Therefore, we have no\n // guarantee the 12.5% block base fee reduction will actually happen.\n // if it doesn't and we reduce the baseFee with our calculations,\n // most often than not the transaction will just get stuck.\n //\n // Transaction fees are no longer an issue on L2s.\n // Having the user spend a fraction of the cent more is way better\n // than having his txns constantly getting stuck\n return lastBlock.baseFeePerGas ?? 0n\n}\n\n// if there's an RPC issue, try refetching the block at least\n// 5 times before declaring a failure\nasync function refetchBlock(\n provider: Provider,\n blockTag: string | number = -1,\n counter = 0\n): Promise {\n // the reason we throw an error here is that getGasPriceRecommendations is\n // used in main.ts #updateGasPrice where we emit an error with a predefined\n // msg, which in turn displays a notification popup with the error.\n // If we change the design and decide to display this as an error\n // somewhere else, we should probably not throw, but return the\n // error instead\n if (counter >= 5) throw new Error('unable to retrieve block')\n\n let lastBlock = null\n try {\n const response = await Promise.race([\n provider.getBlock(blockTag, true),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('last block failed to resolve, request too slow')), 6000)\n })\n ])\n lastBlock = response as Block\n } catch (e) {\n lastBlock = null\n }\n\n if (!lastBlock) {\n const localCounter = counter + 1\n lastBlock = await refetchBlock(provider, blockTag, localCounter)\n }\n\n return lastBlock\n}\n\nexport async function getGasPriceRecommendations(\n provider: Provider,\n network: Network,\n blockTag: string | number = -1\n): Promise<{ gasPrice: GasRecommendation[]; blockGasLimit: bigint }> {\n const [lastBlock, ethGasPrice] = await Promise.all([\n refetchBlock(provider, blockTag),\n (provider as JsonRpcProvider).send('eth_gasPrice', []).catch((e) => {\n console.log('eth_gasPrice failed because of the following reason:')\n console.log(e)\n return '0x'\n })\n ])\n // https://github.com/ethers-io/ethers.js/issues/3683#issuecomment-1436554995\n const txns = lastBlock.prefetchedTransactions\n\n if (\n network.feeOptions.is1559 &&\n lastBlock.baseFeePerGas != null &&\n lastBlock.baseFeePerGas !== 0n\n ) {\n // https://eips.ethereum.org/EIPS/eip-1559\n const elasticityMultiplier =\n network.feeOptions.elasticityMultiplier ?? DEFAULT_ELASTICITY_MULTIPLIER\n const baseFeeMaxChangeDenominator =\n network.feeOptions.baseFeeMaxChangeDenominator ?? DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR\n\n const gasTarget = lastBlock.gasLimit / elasticityMultiplier\n const baseFeePerGas = lastBlock.baseFeePerGas\n const getBaseFeeDelta = (delta: bigint) =>\n (baseFeePerGas * delta) / gasTarget / baseFeeMaxChangeDenominator\n let expectedBaseFee = baseFeePerGas\n if (lastBlock.gasUsed > gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(lastBlock.gasUsed - gasTarget)\n expectedBaseFee += baseFeeDelta === 0n ? 1n : baseFeeDelta\n } else if (lastBlock.gasUsed < gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(gasTarget - lastBlock.gasUsed)\n expectedBaseFee -= baseFeeDelta\n }\n\n // if the estimated fee is below the chain minimum, set it to the min\n const minBaseFee = getNetworkMinBaseFee(network, lastBlock)\n if (expectedBaseFee < minBaseFee) expectedBaseFee = minBaseFee\n\n const tips = filterOutliers(txns.map((x) => x.maxPriorityFeePerGas!).filter((x) => x > 0))\n const fee: Gas1559Recommendation[] = []\n speeds.forEach(({ name, baseFeeAddBps }, i) => {\n const baseFee = expectedBaseFee + (expectedBaseFee * baseFeeAddBps) / 10000n\n let maxPriorityFeePerGas = average(nthGroup(tips, i, speeds.length))\n\n // set a bare minimum of 100000n for maxPriorityFeePerGas\n maxPriorityFeePerGas = maxPriorityFeePerGas >= 100000n ? maxPriorityFeePerGas : 100000n\n\n // compare the maxPriorityFeePerGas with the previous speed\n // if it's not at least 12% bigger, then replace the calculated one\n // with at least 12% bigger maxPriorityFeePerGas.\n // This is most impactufull on L2s where txns get stuck for low maxPriorityFeePerGas\n //\n // if the speed is ape, make it 50% more\n const prevSpeed = fee.length ? fee[i - 1].maxPriorityFeePerGas : null\n if (prevSpeed) {\n const divider = name === 'ape' ? 2n : 8n\n const min = prevSpeed + prevSpeed / divider\n if (maxPriorityFeePerGas < min) maxPriorityFeePerGas = min\n }\n\n fee.push({\n name,\n baseFeePerGas: baseFee,\n maxPriorityFeePerGas\n })\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n }\n const prices = filterOutliers(txns.map((x) => x.gasPrice!).filter((x) => x > 0))\n\n // use th fetched price as a min if not 0 as it could be actually lower\n // than the hardcoded MIN.\n const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : MIN_GAS_PRICE\n\n const fee = speeds.map(({ name }, i) => {\n const avgGasPrice = average(nthGroup(prices, i, speeds.length))\n return {\n name,\n gasPrice: avgGasPrice >= minOrFetchedGasPrice ? avgGasPrice : minOrFetchedGasPrice\n }\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n}\n\nexport function getProbableCallData(\n account: Account,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n network: Network\n): string {\n let estimationCallData\n\n // include the activator call for estimation if any\n const localOp = { ...accountOp }\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n localOp.activatorCall = getActivatorCall(localOp.accountAddr)\n }\n\n // always call executeMultiple as the worts case scenario\n // we disregard the initCode\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n estimationCallData = ambireAccount.encodeFunctionData('executeMultiple', [\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n } else {\n // deployAndExecuteMultiple is the worst case\n const ambireFactory = new Interface(AmbireFactory.abi)\n estimationCallData = ambireFactory.encodeFunctionData('deployAndExecuteMultiple', [\n '0x7f00000000000000000000000000000000000000000000000000000000000000017fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5553d602d80604d3d3981f3363d3d373d3d3d363d7353a31973ebcc225e219bb0d7c0c9324773f5b3e95af43d82803e903d91602b57fd5bf3',\n '0x0000000000000000000000000000000000000000000000000000000000000000',\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n }\n\n return estimationCallData\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/1Inch.d.ts b/dist/src/libs/humanizer/const/abis/1Inch.d.ts new file mode 100644 index 000000000..4789e2e99 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/1Inch.d.ts @@ -0,0 +1,2 @@ +export declare const OneInch: string[]; +//# sourceMappingURL=1Inch.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/1Inch.d.ts.map b/dist/src/libs/humanizer/const/abis/1Inch.d.ts.map new file mode 100644 index 000000000..12bc18f24 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/1Inch.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"1Inch.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/1Inch.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAoDnB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/1Inch.js b/dist/src/libs/humanizer/const/abis/1Inch.js new file mode 100644 index 000000000..796483878 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/1Inch.js @@ -0,0 +1,54 @@ +export const OneInch = [ + 'function advanceEpoch(uint96,uint256)', + 'function and(uint256,bytes) view returns (bool)', + 'function arbitraryStaticCall(address,bytes) view returns (uint256)', + 'function bitInvalidatorForOrder(address,uint256) view returns (uint256)', + 'function bitsInvalidateForOrder(uint256,uint256)', + 'function cancelOrder(uint256 makerTraits, bytes32 orderHash)', + 'function cancelOrders(uint256[],bytes32[])', + 'function checkPredicate(bytes) view returns (bool)', + 'function clipperSwap(address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)', + 'function clipperSwapTo(address,address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)', + 'function curveSwapCallback(address,address,address,uint256,uint256)', + 'function eip712Domain() view returns (bytes1,string,string,uint256,address,bytes32,uint256[])', + 'function epoch(address,uint96) view returns (uint256)', + 'function epochEquals(address,uint256,uint256) view returns (bool)', + 'function eq(uint256,bytes) view returns (bool)', + 'function ethUnoswap(uint256,uint256) payable returns (uint256)', + 'function ethUnoswap2(uint256,uint256,uint256) payable returns (uint256)', + 'function ethUnoswap3(uint256,uint256,uint256,uint256) payable returns (uint256)', + 'function ethUnoswapTo(uint256,uint256,uint256) payable returns (uint256)', + 'function ethUnoswapTo2(uint256,uint256,uint256,uint256) payable returns (uint256)', + 'function ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256) payable returns (uint256)', + 'function fillContractOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256) returns (uint256,uint256,bytes32)', + 'function fillContractOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256,bytes) returns (uint256,uint256,bytes32)', + 'function fillOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256) payable returns (uint256,uint256,bytes32)', + 'function fillOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256,bytes) payable returns (uint256,uint256,bytes32)', + 'function gt(uint256,bytes) view returns (bool)', + 'function hashOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) view returns (bytes32)', + 'function increaseEpoch(uint96)', + 'function lt(uint256,bytes) view returns (bool)', + 'function not(bytes) view returns (bool)', + 'function or(uint256,bytes) view returns (bool)', + 'function owner() view returns (address)', + 'function pause()', + 'function paused() view returns (bool)', + 'function permitAndCall(bytes,bytes) payable', + 'function rawRemainingInvalidatorForOrder(address,bytes32) view returns (uint256)', + 'function remainingInvalidatorForOrder(address,bytes32) view returns (uint256)', + 'function renounceOwnership()', + 'function rescueFunds(address,uint256)', + 'function simulate(address,bytes)', + 'function swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data) payable returns (uint256,uint256)', + 'function transferOwnership(address)', + 'function uniswapV3SwapCallback(int256,int256,bytes)', + 'function unoswap(uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256)', + 'function unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)', + 'function unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3) returns (uint256)', + 'function unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex) returns (uint256)', + 'function unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)', + 'function unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)', + 'function unpause()', + 'function swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)' +]; +//# sourceMappingURL=1Inch.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/1Inch.js.map b/dist/src/libs/humanizer/const/abis/1Inch.js.map new file mode 100644 index 000000000..b91fec271 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/1Inch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"1Inch.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/1Inch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,uCAAuC;IACvC,iDAAiD;IACjD,oEAAoE;IACpE,yEAAyE;IACzE,kDAAkD;IAClD,8DAA8D;IAC9D,4CAA4C;IAC5C,oDAAoD;IACpD,iHAAiH;IACjH,2HAA2H;IAC3H,qEAAqE;IACrE,+FAA+F;IAC/F,uDAAuD;IACvD,mEAAmE;IACnE,gDAAgD;IAChD,gEAAgE;IAChE,yEAAyE;IACzE,iFAAiF;IACjF,0EAA0E;IAC1E,mFAAmF;IACnF,2FAA2F;IAC3F,4JAA4J;IAC5J,sKAAsK;IACtK,sKAAsK;IACtK,gLAAgL;IAChL,gDAAgD;IAChD,mHAAmH;IACnH,gCAAgC;IAChC,gDAAgD;IAChD,yCAAyC;IACzC,gDAAgD;IAChD,yCAAyC;IACzC,kBAAkB;IAClB,uCAAuC;IACvC,6CAA6C;IAC7C,kFAAkF;IAClF,+EAA+E;IAC/E,8BAA8B;IAC9B,uCAAuC;IACvC,kCAAkC;IAClC,yNAAyN;IACzN,qCAAqC;IACrC,qDAAqD;IACrD,oGAAoG;IACpG,gGAAgG;IAChG,2HAA2H;IAC3H,6GAA6G;IAC7G,wFAAwF;IACxF,gGAAgG;IAChG,oBAAoB;IACpB,yQAAyQ;CAC1Q,CAAA","sourcesContent":["export const OneInch = [\n 'function advanceEpoch(uint96,uint256)',\n 'function and(uint256,bytes) view returns (bool)',\n 'function arbitraryStaticCall(address,bytes) view returns (uint256)',\n 'function bitInvalidatorForOrder(address,uint256) view returns (uint256)',\n 'function bitsInvalidateForOrder(uint256,uint256)',\n 'function cancelOrder(uint256 makerTraits, bytes32 orderHash)',\n 'function cancelOrders(uint256[],bytes32[])',\n 'function checkPredicate(bytes) view returns (bool)',\n 'function clipperSwap(address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function clipperSwapTo(address,address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function curveSwapCallback(address,address,address,uint256,uint256)',\n 'function eip712Domain() view returns (bytes1,string,string,uint256,address,bytes32,uint256[])',\n 'function epoch(address,uint96) view returns (uint256)',\n 'function epochEquals(address,uint256,uint256) view returns (bool)',\n 'function eq(uint256,bytes) view returns (bool)',\n 'function ethUnoswap(uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap2(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap3(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo2(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function fillContractOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256) returns (uint256,uint256,bytes32)',\n 'function fillContractOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256,bytes) returns (uint256,uint256,bytes32)',\n 'function fillOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256) payable returns (uint256,uint256,bytes32)',\n 'function fillOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256,bytes) payable returns (uint256,uint256,bytes32)',\n 'function gt(uint256,bytes) view returns (bool)',\n 'function hashOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) view returns (bytes32)',\n 'function increaseEpoch(uint96)',\n 'function lt(uint256,bytes) view returns (bool)',\n 'function not(bytes) view returns (bool)',\n 'function or(uint256,bytes) view returns (bool)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function paused() view returns (bool)',\n 'function permitAndCall(bytes,bytes) payable',\n 'function rawRemainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function remainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function simulate(address,bytes)',\n 'function swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data) payable returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function uniswapV3SwapCallback(int256,int256,bytes)',\n 'function unoswap(uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256)',\n 'function unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)',\n 'function unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3) returns (uint256)',\n 'function unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex) returns (uint256)',\n 'function unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unpause()',\n 'function swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Aave.d.ts b/dist/src/libs/humanizer/const/abis/Aave.d.ts new file mode 100644 index 000000000..be5087d06 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Aave.d.ts @@ -0,0 +1,4 @@ +export declare const AaveLendingPoolV2: string[]; +export declare const AaveWethGatewayV2: string[]; +export declare const AaveV3Pool: string[]; +//# sourceMappingURL=Aave.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Aave.d.ts.map b/dist/src/libs/humanizer/const/abis/Aave.d.ts.map new file mode 100644 index 000000000..30c478915 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Aave.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Aave.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Aave.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,UA6B7B,CAAA;AAED,eAAO,MAAM,iBAAiB,UAY7B,CAAA;AAED,eAAO,MAAM,UAAU,UAyEtB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Aave.js b/dist/src/libs/humanizer/const/abis/Aave.js new file mode 100644 index 000000000..ac3b89746 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Aave.js @@ -0,0 +1,118 @@ +export const AaveLendingPoolV2 = [ + 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)', + 'function LENDINGPOOL_REVISION() view returns (uint256)', + 'function MAX_NUMBER_RESERVES() view returns (uint256)', + 'function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() view returns (uint256)', + 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)', + 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)', + 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)', + 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] modes, address onBehalfOf, bytes params, uint16 referralCode)', + 'function getAddressesProvider() view returns (address)', + 'function getConfiguration(address asset) view returns ((uint256 data))', + 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id))', + 'function getReserveNormalizedIncome(address asset) view returns (uint256)', + 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)', + 'function getReservesList() view returns (address[])', + 'function getUserAccountData(address user) view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)', + 'function getUserConfiguration(address user) view returns ((uint256 data))', + 'function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress)', + 'function initialize(address provider)', + 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)', + 'function paused() view returns (bool)', + 'function rebalanceStableBorrowRate(address asset, address user)', + 'function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)', + 'function setConfiguration(address asset, uint256 configuration)', + 'function setPause(bool val)', + 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)', + 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)', + 'function swapBorrowRateMode(address asset, uint256 rateMode)', + 'function withdraw(address asset, uint256 amount, address to) returns (uint256)' +]; +export const AaveWethGatewayV2 = [ + 'function authorizeLendingPool(address lendingPool)', + 'function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)', + 'function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable', + 'function emergencyEtherTransfer(address to, uint256 amount)', + 'function emergencyTokenTransfer(address token, address to, uint256 amount)', + 'function getWETHAddress() view returns (address)', + 'function owner() view returns (address)', + 'function renounceOwnership()', + 'function repayETH(address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf) payable', + 'function transferOwnership(address newOwner)', + 'function withdrawETH(address lendingPool, uint256 amount, address to)' +]; +export const AaveV3Pool = [ + 'function ADDRESSES_PROVIDER() view returns (address)', + 'function BRIDGE_PROTOCOL_FEE() view returns (uint256)', + 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint128)', + 'function FLASHLOAN_PREMIUM_TO_PROTOCOL() view returns (uint128)', + 'function MAX_NUMBER_RESERVES() view returns (uint16)', + 'function POOL_REVISION() view returns (uint256)', + 'function backUnbacked(address asset, uint256 amount, uint256 fee) returns (uint256)', + 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)', + 'function borrow(bytes32 args)', + 'function configureEModeCategory(uint8 id, (uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, string label) category)', + 'function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap)', + 'function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap)', + 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)', + 'function dropReserve(address asset)', + 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)', + 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] interestRateModes, address onBehalfOf, bytes params, uint16 referralCode)', + 'function flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)', + 'function getBorrowLogic() pure returns (address)', + 'function getBridgeLogic() pure returns (address)', + 'function getConfiguration(address asset) view returns ((uint256 data))', + 'function getEModeCategoryBorrowableBitmap(uint8 id) view returns (uint128)', + 'function getEModeCategoryCollateralBitmap(uint8 id) view returns (uint128)', + 'function getEModeCategoryCollateralConfig(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus))', + 'function getEModeCategoryData(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, address priceSource, string label))', + 'function getEModeCategoryLabel(uint8 id) view returns (string)', + 'function getEModeLogic() pure returns (address)', + 'function getFlashLoanLogic() pure returns (address)', + 'function getLiquidationGracePeriod(address asset) returns (uint40)', + 'function getLiquidationLogic() pure returns (address)', + 'function getPoolLogic() pure returns (address)', + 'function getReserveAddressById(uint16 id) view returns (address)', + 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt))', + 'function getReserveDataExtended(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 __deprecatedStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, uint40 liquidationGracePeriodUntil, address aTokenAddress, address __deprecatedStableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt, uint128 virtualUnderlyingBalance))', + 'function getReserveNormalizedIncome(address asset) view returns (uint256)', + 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)', + 'function getReservesCount() view returns (uint256)', + 'function getReservesList() view returns (address[])', + 'function getSupplyLogic() pure returns (address)', + 'function getUserAccountData(address user) view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)', + 'function getUserConfiguration(address user) view returns ((uint256 data))', + 'function getUserEMode(address user) view returns (uint256)', + 'function getVirtualUnderlyingBalance(address asset) view returns (uint128)', + 'function initReserve(address asset, address aTokenAddress, address variableDebtAddress, address interestRateStrategyAddress)', + 'function initialize(address provider)', + 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)', + 'function liquidationCall(bytes32 args1, bytes32 args2)', + 'function mintToTreasury(address[] assets)', + 'function mintUnbacked(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)', + 'function repay(bytes32 args) returns (uint256)', + 'function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)', + 'function repayWithATokens(address asset, uint256 amount, uint256 interestRateMode) returns (uint256)', + 'function repayWithATokens(bytes32 args) returns (uint256)', + 'function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) returns (uint256)', + 'function repayWithPermit(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS) returns (uint256)', + 'function rescueTokens(address token, address to, uint256 amount)', + 'function resetIsolationModeTotalDebt(address asset)', + 'function setConfiguration(address asset, (uint256 data) configuration)', + 'function setLiquidationGracePeriod(address asset, uint40 until)', + 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)', + 'function setUserEMode(uint8 categoryId)', + 'function setUserUseReserveAsCollateral(bytes32 args)', + 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)', + 'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)', + 'function supply(bytes32 args)', + 'function supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)', + 'function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s)', + 'function syncIndexesState(address asset)', + 'function syncRatesState(address asset)', + 'function updateBridgeProtocolFee(uint256 protocolFee)', + 'function updateFlashloanPremiums(uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol)', + 'function withdraw(address asset, uint256 amount, address to) returns (uint256)', + 'function withdraw(bytes32 args) returns (uint256)' +]; +//# sourceMappingURL=Aave.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Aave.js.map b/dist/src/libs/humanizer/const/abis/Aave.js.map new file mode 100644 index 000000000..1d1104a40 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Aave.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Aave.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Aave.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,2DAA2D;IAC3D,wDAAwD;IACxD,uDAAuD;IACvD,uEAAuE;IACvE,mHAAmH;IACnH,0FAA0F;IAC1F,wIAAwI;IACxI,0JAA0J;IAC1J,wDAAwD;IACxD,wEAAwE;IACxE,iZAAiZ;IACjZ,2EAA2E;IAC3E,iFAAiF;IACjF,qDAAqD;IACrD,gNAAgN;IAChN,2EAA2E;IAC3E,yJAAyJ;IACzJ,uCAAuC;IACvC,6HAA6H;IAC7H,uCAAuC;IACvC,iEAAiE;IACjE,uGAAuG;IACvG,iEAAiE;IACjE,6BAA6B;IAC7B,4FAA4F;IAC5F,6EAA6E;IAC7E,8DAA8D;IAC9D,gFAAgF;CACjF,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oDAAoD;IACpD,uGAAuG;IACvG,2FAA2F;IAC3F,6DAA6D;IAC7D,4EAA4E;IAC5E,kDAAkD;IAClD,yCAAyC;IACzC,8BAA8B;IAC9B,sGAAsG;IACtG,8CAA8C;IAC9C,uEAAuE;CACxE,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,sDAAsD;IACtD,uDAAuD;IACvD,2DAA2D;IAC3D,iEAAiE;IACjE,sDAAsD;IACtD,iDAAiD;IACjD,qFAAqF;IACrF,mHAAmH;IACnH,+BAA+B;IAC/B,sIAAsI;IACtI,qFAAqF;IACrF,qFAAqF;IACrF,0FAA0F;IAC1F,qCAAqC;IACrC,wIAAwI;IACxI,sKAAsK;IACtK,qHAAqH;IACrH,kDAAkD;IAClD,kDAAkD;IAClD,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,uIAAuI;IACvI,8JAA8J;IAC9J,gEAAgE;IAChE,iDAAiD;IACjD,qDAAqD;IACrD,oEAAoE;IACpE,uDAAuD;IACvD,gDAAgD;IAChD,kEAAkE;IAClE,+dAA+d;IAC/d,8jBAA8jB;IAC9jB,2EAA2E;IAC3E,iFAAiF;IACjF,oDAAoD;IACpD,qDAAqD;IACrD,kDAAkD;IAClD,mNAAmN;IACnN,2EAA2E;IAC3E,4DAA4D;IAC5D,4EAA4E;IAC5E,8HAA8H;IAC9H,uCAAuC;IACvC,6HAA6H;IAC7H,wDAAwD;IACxD,2CAA2C;IAC3C,+FAA+F;IAC/F,gDAAgD;IAChD,+GAA+G;IAC/G,sGAAsG;IACtG,2DAA2D;IAC3D,gFAAgF;IAChF,4LAA4L;IAC5L,kEAAkE;IAClE,qDAAqD;IACrD,wEAAwE;IACxE,iEAAiE;IACjE,4FAA4F;IAC5F,yCAAyC;IACzC,sDAAsD;IACtD,6EAA6E;IAC7E,yFAAyF;IACzF,+BAA+B;IAC/B,sKAAsK;IACtK,+DAA+D;IAC/D,0CAA0C;IAC1C,wCAAwC;IACxC,uDAAuD;IACvD,qGAAqG;IACrG,gFAAgF;IAChF,mDAAmD;CACpD,CAAA","sourcesContent":["export const AaveLendingPoolV2 = [\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)',\n 'function LENDINGPOOL_REVISION() view returns (uint256)',\n 'function MAX_NUMBER_RESERVES() view returns (uint256)',\n 'function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() view returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] modes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function getAddressesProvider() view returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function paused() view returns (bool)',\n 'function rebalanceStableBorrowRate(address asset, address user)',\n 'function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)',\n 'function setConfiguration(address asset, uint256 configuration)',\n 'function setPause(bool val)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function swapBorrowRateMode(address asset, uint256 rateMode)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)'\n]\n\nexport const AaveWethGatewayV2 = [\n 'function authorizeLendingPool(address lendingPool)',\n 'function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)',\n 'function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable',\n 'function emergencyEtherTransfer(address to, uint256 amount)',\n 'function emergencyTokenTransfer(address token, address to, uint256 amount)',\n 'function getWETHAddress() view returns (address)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function repayETH(address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf) payable',\n 'function transferOwnership(address newOwner)',\n 'function withdrawETH(address lendingPool, uint256 amount, address to)'\n]\n\nexport const AaveV3Pool = [\n 'function ADDRESSES_PROVIDER() view returns (address)',\n 'function BRIDGE_PROTOCOL_FEE() view returns (uint256)',\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint128)',\n 'function FLASHLOAN_PREMIUM_TO_PROTOCOL() view returns (uint128)',\n 'function MAX_NUMBER_RESERVES() view returns (uint16)',\n 'function POOL_REVISION() view returns (uint256)',\n 'function backUnbacked(address asset, uint256 amount, uint256 fee) returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function borrow(bytes32 args)',\n 'function configureEModeCategory(uint8 id, (uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, string label) category)',\n 'function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap)',\n 'function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function dropReserve(address asset)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] interestRateModes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)',\n 'function getBorrowLogic() pure returns (address)',\n 'function getBridgeLogic() pure returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getEModeCategoryBorrowableBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralConfig(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus))',\n 'function getEModeCategoryData(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, address priceSource, string label))',\n 'function getEModeCategoryLabel(uint8 id) view returns (string)',\n 'function getEModeLogic() pure returns (address)',\n 'function getFlashLoanLogic() pure returns (address)',\n 'function getLiquidationGracePeriod(address asset) returns (uint40)',\n 'function getLiquidationLogic() pure returns (address)',\n 'function getPoolLogic() pure returns (address)',\n 'function getReserveAddressById(uint16 id) view returns (address)',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt))',\n 'function getReserveDataExtended(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 __deprecatedStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, uint40 liquidationGracePeriodUntil, address aTokenAddress, address __deprecatedStableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt, uint128 virtualUnderlyingBalance))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesCount() view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getSupplyLogic() pure returns (address)',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function getUserEMode(address user) view returns (uint256)',\n 'function getVirtualUnderlyingBalance(address asset) view returns (uint128)',\n 'function initReserve(address asset, address aTokenAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function liquidationCall(bytes32 args1, bytes32 args2)',\n 'function mintToTreasury(address[] assets)',\n 'function mintUnbacked(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function repay(bytes32 args) returns (uint256)',\n 'function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)',\n 'function repayWithATokens(address asset, uint256 amount, uint256 interestRateMode) returns (uint256)',\n 'function repayWithATokens(bytes32 args) returns (uint256)',\n 'function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) returns (uint256)',\n 'function repayWithPermit(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS) returns (uint256)',\n 'function rescueTokens(address token, address to, uint256 amount)',\n 'function resetIsolationModeTotalDebt(address asset)',\n 'function setConfiguration(address asset, (uint256 data) configuration)',\n 'function setLiquidationGracePeriod(address asset, uint40 until)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserEMode(uint8 categoryId)',\n 'function setUserUseReserveAsCollateral(bytes32 args)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function supply(bytes32 args)',\n 'function supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)',\n 'function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s)',\n 'function syncIndexesState(address asset)',\n 'function syncRatesState(address asset)',\n 'function updateBridgeProtocolFee(uint256 protocolFee)',\n 'function updateFlashloanPremiums(uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)',\n 'function withdraw(bytes32 args) returns (uint256)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Across.d.ts b/dist/src/libs/humanizer/const/abis/Across.d.ts new file mode 100644 index 000000000..6e075c76a --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Across.d.ts @@ -0,0 +1,2 @@ +export declare const Across: string[]; +//# sourceMappingURL=Across.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Across.d.ts.map b/dist/src/libs/humanizer/const/abis/Across.d.ts.map new file mode 100644 index 000000000..af41fdc2e --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Across.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Across.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Across.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,UAsDlB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Across.js b/dist/src/libs/humanizer/const/abis/Across.js new file mode 100644 index 000000000..a3c45ed17 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Across.js @@ -0,0 +1,56 @@ +export const Across = [ + 'function EMPTY_RELAYER() view returns (address)', + 'function EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)', + 'function INFINITE_FILL_DEADLINE() view returns (uint32)', + 'function MAX_TRANSFER_SIZE() view returns (uint256)', + 'function UPDATE_V3_DEPOSIT_DETAILS_HASH() view returns (bytes32)', + 'function __SpokePool_init(uint32,address,address)', + 'function cctpTokenMessenger() view returns (address)', + 'function chainId() view returns (uint256)', + 'function crossDomainAdmin() view returns (address)', + 'function deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount) payable', + 'function depositFor(address,address,address,uint256,uint256,int64,uint32,bytes,uint256) payable', + 'function depositQuoteTimeBuffer() view returns (uint32)', + 'function depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message) payable', + 'function depositV3Now(address,address,address,address,uint256,uint256,uint256,address,uint32,uint32,bytes) payable', + 'function emergencyDeleteRootBundle(uint256)', + 'function enabledDepositRoutes(address,uint256) view returns (bool)', + 'function executeRelayerRefundLeaf(uint32,tuple(uint256,uint256,uint256[],uint32,address,address[]),bytes32[]) payable', + 'function executeV3SlowRelayLeaf(tuple(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256),uint32,bytes32[])', + 'function fillDeadlineBuffer() view returns (uint32)', + 'function fillStatuses(bytes32) view returns (uint256)', + 'function fillV3Relay(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256)', + 'function fillV3RelayWithUpdatedDeposit(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256,address,bytes,bytes)', + 'function fxChild() view returns (address)', + 'function getCurrentTime() view returns (uint256)', + 'function hubPool() view returns (address)', + 'function initialize(uint32,address,address,address,address)', + 'function multicall(bytes[]) returns (bytes[])', + 'function numberOfDeposits() view returns (uint32)', + 'function pauseDeposits(bool)', + 'function pauseFills(bool)', + 'function pausedDeposits() view returns (bool)', + 'function pausedFills() view returns (bool)', + 'function polygonTokenBridger() view returns (address)', + 'function processMessageFromRoot(uint256,address,bytes)', + 'function proxiableUUID() view returns (bytes32)', + 'function recipientCircleDomainId() view returns (uint32)', + 'function relayRootBundle(bytes32,bytes32)', + 'function requestV3SlowFill(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes))', + 'function rootBundles(uint256) view returns (bytes32,bytes32)', + 'function setCrossDomainAdmin(address)', + 'function setEnableRoute(address,uint256,bool)', + 'function setFxChild(address)', + 'function setHubPool(address)', + 'function setPolygonTokenBridger(address)', + 'function speedUpV3Deposit(address,uint32,uint256,address,bytes,bytes)', + 'function tryMulticall(bytes[]) returns (tuple(bool,bytes)[])', + 'function upgradeTo(address)', + 'function upgradeToAndCall(address,bytes) payable', + 'function usdcToken() view returns (address)', + 'function wrap()', + 'function wrappedNativeToken() view returns (address)', + 'receive() payable', + 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable' +]; +//# sourceMappingURL=Across.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Across.js.map b/dist/src/libs/humanizer/const/abis/Across.js.map new file mode 100644 index 000000000..868e65aa1 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Across.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Across.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Across.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,iDAAiD;IACjD,4DAA4D;IAC5D,yDAAyD;IACzD,qDAAqD;IACrD,kEAAkE;IAClE,mDAAmD;IACnD,sDAAsD;IACtD,2CAA2C;IAC3C,oDAAoD;IACpD,2LAA2L;IAC3L,iGAAiG;IACjG,yDAAyD;IACzD,iSAAiS;IACjS,oHAAoH;IACpH,6CAA6C;IAC7C,oEAAoE;IACpE,uHAAuH;IACvH,4KAA4K;IAC5K,qDAAqD;IACrD,uDAAuD;IACvD,iIAAiI;IACjI,+KAA+K;IAC/K,2CAA2C;IAC3C,kDAAkD;IAClD,2CAA2C;IAC3C,6DAA6D;IAC7D,+CAA+C;IAC/C,mDAAmD;IACnD,8BAA8B;IAC9B,2BAA2B;IAC3B,+CAA+C;IAC/C,4CAA4C;IAC5C,uDAAuD;IACvD,wDAAwD;IACxD,iDAAiD;IACjD,0DAA0D;IAC1D,2CAA2C;IAC3C,+HAA+H;IAC/H,8DAA8D;IAC9D,uCAAuC;IACvC,+CAA+C;IAC/C,8BAA8B;IAC9B,8BAA8B;IAC9B,0CAA0C;IAC1C,uEAAuE;IACvE,8DAA8D;IAC9D,6BAA6B;IAC7B,kDAAkD;IAClD,6CAA6C;IAC7C,iBAAiB;IACjB,sDAAsD;IACtD,mBAAmB;IACnB,4MAA4M;CAC7M,CAAA","sourcesContent":["export const Across = [\n 'function EMPTY_RELAYER() view returns (address)',\n 'function EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)',\n 'function INFINITE_FILL_DEADLINE() view returns (uint32)',\n 'function MAX_TRANSFER_SIZE() view returns (uint256)',\n 'function UPDATE_V3_DEPOSIT_DETAILS_HASH() view returns (bytes32)',\n 'function __SpokePool_init(uint32,address,address)',\n 'function cctpTokenMessenger() view returns (address)',\n 'function chainId() view returns (uint256)',\n 'function crossDomainAdmin() view returns (address)',\n 'function deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount) payable',\n 'function depositFor(address,address,address,uint256,uint256,int64,uint32,bytes,uint256) payable',\n 'function depositQuoteTimeBuffer() view returns (uint32)',\n 'function depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message) payable',\n 'function depositV3Now(address,address,address,address,uint256,uint256,uint256,address,uint32,uint32,bytes) payable',\n 'function emergencyDeleteRootBundle(uint256)',\n 'function enabledDepositRoutes(address,uint256) view returns (bool)',\n 'function executeRelayerRefundLeaf(uint32,tuple(uint256,uint256,uint256[],uint32,address,address[]),bytes32[]) payable',\n 'function executeV3SlowRelayLeaf(tuple(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256),uint32,bytes32[])',\n 'function fillDeadlineBuffer() view returns (uint32)',\n 'function fillStatuses(bytes32) view returns (uint256)',\n 'function fillV3Relay(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256)',\n 'function fillV3RelayWithUpdatedDeposit(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256,address,bytes,bytes)',\n 'function fxChild() view returns (address)',\n 'function getCurrentTime() view returns (uint256)',\n 'function hubPool() view returns (address)',\n 'function initialize(uint32,address,address,address,address)',\n 'function multicall(bytes[]) returns (bytes[])',\n 'function numberOfDeposits() view returns (uint32)',\n 'function pauseDeposits(bool)',\n 'function pauseFills(bool)',\n 'function pausedDeposits() view returns (bool)',\n 'function pausedFills() view returns (bool)',\n 'function polygonTokenBridger() view returns (address)',\n 'function processMessageFromRoot(uint256,address,bytes)',\n 'function proxiableUUID() view returns (bytes32)',\n 'function recipientCircleDomainId() view returns (uint32)',\n 'function relayRootBundle(bytes32,bytes32)',\n 'function requestV3SlowFill(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes))',\n 'function rootBundles(uint256) view returns (bytes32,bytes32)',\n 'function setCrossDomainAdmin(address)',\n 'function setEnableRoute(address,uint256,bool)',\n 'function setFxChild(address)',\n 'function setHubPool(address)',\n 'function setPolygonTokenBridger(address)',\n 'function speedUpV3Deposit(address,uint32,uint256,address,bytes,bytes)',\n 'function tryMulticall(bytes[]) returns (tuple(bool,bytes)[])',\n 'function upgradeTo(address)',\n 'function upgradeToAndCall(address,bytes) payable',\n 'function usdcToken() view returns (address)',\n 'function wrap()',\n 'function wrappedNativeToken() view returns (address)',\n 'receive() payable',\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts b/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts new file mode 100644 index 000000000..ee7b841a2 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts @@ -0,0 +1,2 @@ +export declare const AmbireAccount: string[]; +//# sourceMappingURL=AmbireAccount.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts.map b/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts.map new file mode 100644 index 000000000..20aeac130 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"AmbireAccount.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/AmbireAccount.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAWzB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.js b/dist/src/libs/humanizer/const/abis/AmbireAccount.js new file mode 100644 index 000000000..01b945701 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.js @@ -0,0 +1,13 @@ +export const AmbireAccount = [ + // executable by address(this) + 'function tryCatch(address to, uint256 value, bytes calldata data)', + 'function tryCatchLimit(address to, uint256 value, bytes calldata data, uint256 gasLimit)', + 'function executeBySelfSingle((address to, uint256 value, bytes data) call)', + 'function executeBySelf((address to, uint256 value, bytes data)[] calls)', + // executed with signature + 'function execute((address to, uint256 value, bytes data)[] calls, bytes signature) payable', + 'function executeMultiple(((address to, uint256 value, bytes data)[] calls, bytes signature)[] toExec) payable', + // executable by signer + 'function executeBySender((address to, uint256 value, bytes data)[] calls) payable' +]; +//# sourceMappingURL=AmbireAccount.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map b/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map new file mode 100644 index 000000000..fcfb33f19 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AmbireAccount.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/AmbireAccount.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,8BAA8B;IAC9B,mEAAmE;IACnE,0FAA0F;IAC1F,4EAA4E;IAC5E,yEAAyE;IACzE,0BAA0B;IAC1B,4FAA4F;IAC5F,+GAA+G;IAC/G,uBAAuB;IACvB,mFAAmF;CACpF,CAAA","sourcesContent":["export const AmbireAccount = [\n // executable by address(this)\n 'function tryCatch(address to, uint256 value, bytes calldata data)',\n 'function tryCatchLimit(address to, uint256 value, bytes calldata data, uint256 gasLimit)',\n 'function executeBySelfSingle((address to, uint256 value, bytes data) call)',\n 'function executeBySelf((address to, uint256 value, bytes data)[] calls)',\n // executed with signature\n 'function execute((address to, uint256 value, bytes data)[] calls, bytes signature) payable',\n 'function executeMultiple(((address to, uint256 value, bytes data)[] calls, bytes signature)[] toExec) payable',\n // executable by signer\n 'function executeBySender((address to, uint256 value, bytes data)[] calls) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Curve.d.ts b/dist/src/libs/humanizer/const/abis/Curve.d.ts new file mode 100644 index 000000000..2eeb6ab81 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Curve.d.ts @@ -0,0 +1,2 @@ +export declare const CurveRouter: string[]; +//# sourceMappingURL=Curve.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Curve.d.ts.map b/dist/src/libs/humanizer/const/abis/Curve.d.ts.map new file mode 100644 index 000000000..b3cadf7a8 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Curve.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Curve.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Curve.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAcvB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Curve.js b/dist/src/libs/humanizer/const/abis/Curve.js new file mode 100644 index 000000000..4faca7e00 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Curve.js @@ -0,0 +1,16 @@ +export const CurveRouter = [ + 'event Exchange(address indexed,address indexed,address[11],uint256[5][5],address[5],uint256,uint256)', + 'fallback()', + 'constructor(address,address,address,address[2])', + 'function exchange(address[11],uint256[5][5],uint256,uint256)', + 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] pools, address _receiver)', + 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)', + 'function get_dy(address[11],uint256[5][5],uint256)', + 'function get_dy(address[11],uint256[5][5],uint256,address[5])', + 'function get_dx(address[11],uint256[5][5],uint256,address[5])', + 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5])', + 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5])', + 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5])', + 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5],address[5])' +]; +//# sourceMappingURL=Curve.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Curve.js.map b/dist/src/libs/humanizer/const/abis/Curve.js.map new file mode 100644 index 000000000..b1de4df85 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Curve.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Curve.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Curve.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,sGAAsG;IACtG,YAAY;IACZ,iDAAiD;IACjD,8DAA8D;IAC9D,4IAA4I;IAC5I,0HAA0H;IAC1H,oDAAoD;IACpD,+DAA+D;IAC/D,+DAA+D;IAC/D,0EAA0E;IAC1E,qFAAqF;IACrF,gGAAgG;IAChG,2GAA2G;CAC5G,CAAA","sourcesContent":["export const CurveRouter = [\n 'event Exchange(address indexed,address indexed,address[11],uint256[5][5],address[5],uint256,uint256)',\n 'fallback()',\n 'constructor(address,address,address,address[2])',\n 'function exchange(address[11],uint256[5][5],uint256,uint256)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] pools, address _receiver)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)',\n 'function get_dy(address[11],uint256[5][5],uint256)',\n 'function get_dy(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5],address[5])'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts b/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts new file mode 100644 index 000000000..c5b410b03 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts @@ -0,0 +1,2 @@ +export declare const KyberSwap: string[]; +//# sourceMappingURL=KyberSwap.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts.map b/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts.map new file mode 100644 index 000000000..02bde5b7f --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"KyberSwap.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/KyberSwap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,UAYrB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.js b/dist/src/libs/humanizer/const/abis/KyberSwap.js new file mode 100644 index 000000000..c27e3dd8b --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.js @@ -0,0 +1,14 @@ +export const KyberSwap = [ + 'function WETH() view returns (address)', + 'function isWhitelist(address) view returns (bool)', + 'function owner() view returns (address)', + 'function renounceOwnership()', + 'function rescueFunds(address,uint256)', + 'function swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution) payable returns (uint256,uint256)', + 'function swapGeneric(tuple(address,address,bytes,tuple(address,address,address[],uint256[],address[],uint256[],address,uint256,uint256,uint256,bytes),bytes)) payable returns (uint256,uint256)', + 'function swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData) returns (uint256,uint256)', + 'function transferOwnership(address)', + 'function updateWhitelist(address[],bool[])', + 'receive() payable' +]; +//# sourceMappingURL=KyberSwap.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.js.map b/dist/src/libs/humanizer/const/abis/KyberSwap.js.map new file mode 100644 index 000000000..28c4c9c77 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"KyberSwap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/KyberSwap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,wCAAwC;IACxC,mDAAmD;IACnD,yCAAyC;IACzC,8BAA8B;IAC9B,uCAAuC;IACvC,0WAA0W;IAC1W,iMAAiM;IACjM,oUAAoU;IACpU,qCAAqC;IACrC,4CAA4C;IAC5C,mBAAmB;CACpB,CAAA","sourcesContent":["export const KyberSwap = [\n 'function WETH() view returns (address)',\n 'function isWhitelist(address) view returns (bool)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution) payable returns (uint256,uint256)',\n 'function swapGeneric(tuple(address,address,bytes,tuple(address,address,address[],uint256[],address[],uint256[],address,uint256,uint256,uint256,bytes),bytes)) payable returns (uint256,uint256)',\n 'function swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData) returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function updateWhitelist(address[],bool[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Legends.d.ts b/dist/src/libs/humanizer/const/abis/Legends.d.ts new file mode 100644 index 000000000..cd472eb10 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Legends.d.ts @@ -0,0 +1,2 @@ +export declare const Legends: string[]; +//# sourceMappingURL=Legends.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Legends.d.ts.map b/dist/src/libs/humanizer/const/abis/Legends.d.ts.map new file mode 100644 index 000000000..6750da2d7 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Legends.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Legends.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Legends.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAMnB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Legends.js b/dist/src/libs/humanizer/const/abis/Legends.js new file mode 100644 index 000000000..665dcd2d4 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Legends.js @@ -0,0 +1,8 @@ +export const Legends = [ + 'function mint(uint256 )', + 'function spinWheel(uint256 random)', + 'function linkAndAcceptInvite(address INVITEE_V2_ACCOUNT, address INVITEE_EOA_OR_V1, address INVITER_V2, bytes signature)', + 'function invite(address)', + 'function getDailyReward()' +]; +//# sourceMappingURL=Legends.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Legends.js.map b/dist/src/libs/humanizer/const/abis/Legends.js.map new file mode 100644 index 000000000..985d77fca --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Legends.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Legends.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Legends.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB;IACzB,oCAAoC;IACpC,0HAA0H;IAC1H,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAA","sourcesContent":["export const Legends = [\n 'function mint(uint256 )',\n 'function spinWheel(uint256 random)',\n 'function linkAndAcceptInvite(address INVITEE_V2_ACCOUNT, address INVITEE_EOA_OR_V1, address INVITER_V2, bytes signature)',\n 'function invite(address)',\n 'function getDailyReward()'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Lido.d.ts b/dist/src/libs/humanizer/const/abis/Lido.d.ts new file mode 100644 index 000000000..7bb5949d2 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Lido.d.ts @@ -0,0 +1,3 @@ +export declare const WrappedStETH: string[]; +export declare const unstETH: string[]; +//# sourceMappingURL=Lido.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Lido.d.ts.map b/dist/src/libs/humanizer/const/abis/Lido.d.ts.map new file mode 100644 index 000000000..9f08ce0c1 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Lido.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Lido.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Lido.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,UAsBxB,CAAA;AAED,eAAO,MAAM,OAAO,UAKnB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Lido.js b/dist/src/libs/humanizer/const/abis/Lido.js new file mode 100644 index 000000000..d69b70bfb --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Lido.js @@ -0,0 +1,30 @@ +export const WrappedStETH = [ + 'function DOMAIN_SEPARATOR() view returns (bytes32)', + 'function allowance(address owner, address spender) view returns (uint256)', + 'function approve(address spender, uint256 amount) returns (bool)', + 'function balanceOf(address account) view returns (uint256)', + 'function decimals() view returns (uint8)', + 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)', + 'function getStETHByWstETH(uint256 _wstETHAmount) view returns (uint256)', + 'function getWstETHByStETH(uint256 _stETHAmount) view returns (uint256)', + 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)', + 'function name() view returns (string)', + 'function nonces(address owner) view returns (uint256)', + 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)', + 'function stETH() view returns (address)', + 'function stEthPerToken() view returns (uint256)', + 'function symbol() view returns (string)', + 'function tokensPerStEth() view returns (uint256)', + 'function totalSupply() view returns (uint256)', + 'function transfer(address recipient, uint256 amount) returns (bool)', + 'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)', + 'function unwrap(uint256 _wstETHAmount) returns (uint256)', + 'function wrap(uint256 _stETHAmount) returns (uint256)' +]; +export const unstETH = [ + 'function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)', + 'function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints)', + 'function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient)', + 'function claimWithdrawal(uint256 _requestId)' +]; +//# sourceMappingURL=Lido.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Lido.js.map b/dist/src/libs/humanizer/const/abis/Lido.js.map new file mode 100644 index 000000000..ceb061adb --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Lido.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Lido.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Lido.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oDAAoD;IACpD,2EAA2E;IAC3E,kEAAkE;IAClE,4DAA4D;IAC5D,0CAA0C;IAC1C,qFAAqF;IACrF,yEAAyE;IACzE,wEAAwE;IACxE,gFAAgF;IAChF,uCAAuC;IACvC,uDAAuD;IACvD,iHAAiH;IACjH,yCAAyC;IACzC,iDAAiD;IACjD,yCAAyC;IACzC,kDAAkD;IAClD,+CAA+C;IAC/C,qEAAqE;IACrE,yFAAyF;IACzF,0DAA0D;IAC1D,uDAAuD;CACxD,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,gGAAgG;IAChG,sFAAsF;IACtF,4GAA4G;IAC5G,8CAA8C;CAC/C,CAAA","sourcesContent":["export const WrappedStETH = [\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function getStETHByWstETH(uint256 _wstETHAmount) view returns (uint256)',\n 'function getWstETHByStETH(uint256 _stETHAmount) view returns (uint256)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function stETH() view returns (address)',\n 'function stEthPerToken() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function tokensPerStEth() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address recipient, uint256 amount) returns (bool)',\n 'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)',\n 'function unwrap(uint256 _wstETHAmount) returns (uint256)',\n 'function wrap(uint256 _stETHAmount) returns (uint256)'\n]\n\nexport const unstETH = [\n 'function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)',\n 'function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints)',\n 'function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient)',\n 'function claimWithdrawal(uint256 _requestId)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Sushi.d.ts b/dist/src/libs/humanizer/const/abis/Sushi.d.ts new file mode 100644 index 000000000..bb1795d19 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Sushi.d.ts @@ -0,0 +1,2 @@ +export declare const RouteProcessor: string[]; +//# sourceMappingURL=Sushi.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Sushi.d.ts.map b/dist/src/libs/humanizer/const/abis/Sushi.d.ts.map new file mode 100644 index 000000000..cef07f43f --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Sushi.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Sushi.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Sushi.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAW1B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Sushi.js b/dist/src/libs/humanizer/const/abis/Sushi.js new file mode 100644 index 000000000..98bb83a5a --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Sushi.js @@ -0,0 +1,13 @@ +export const RouteProcessor = [ + 'function bentoBox() view returns (address)', + 'function owner() view returns (address)', + 'function pause()', + 'function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)', + 'function renounceOwnership()', + 'function resume()', + 'function setPriviledge(address user, bool priviledge)', + 'function transferOwnership(address newOwner)', + 'function transferValueAndprocessRoute(address transferValueTo, uint256 amountValueTransfer, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)', + 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)' +]; +//# sourceMappingURL=Sushi.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Sushi.js.map b/dist/src/libs/humanizer/const/abis/Sushi.js.map new file mode 100644 index 000000000..90a4644e0 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Sushi.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Sushi.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Sushi.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4CAA4C;IAC5C,yCAAyC;IACzC,kBAAkB;IAClB,+JAA+J;IAC/J,8BAA8B;IAC9B,mBAAmB;IACnB,uDAAuD;IACvD,8CAA8C;IAC9C,qOAAqO;IACrO,sFAAsF;CACvF,CAAA","sourcesContent":["export const RouteProcessor = [\n 'function bentoBox() view returns (address)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function renounceOwnership()',\n 'function resume()',\n 'function setPriviledge(address user, bool priviledge)',\n 'function transferOwnership(address newOwner)',\n 'function transferValueAndprocessRoute(address transferValueTo, uint256 amountValueTransfer, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Tokens.d.ts b/dist/src/libs/humanizer/const/abis/Tokens.d.ts new file mode 100644 index 000000000..2242d3232 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Tokens.d.ts @@ -0,0 +1,4 @@ +export declare const ERC20: string[]; +export declare const ERC721: string[]; +export declare const WETH: string[]; +//# sourceMappingURL=Tokens.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Tokens.d.ts.map b/dist/src/libs/humanizer/const/abis/Tokens.d.ts.map new file mode 100644 index 000000000..b5704ffaf --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Tokens.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Tokens.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Tokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,UAYjB,CAAA;AAED,eAAO,MAAM,MAAM,UAsClB,CAAA;AAED,eAAO,MAAM,IAAI,UAYhB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Tokens.js b/dist/src/libs/humanizer/const/abis/Tokens.js new file mode 100644 index 000000000..614d0963f --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Tokens.js @@ -0,0 +1,66 @@ +export const ERC20 = [ + 'function name() view returns (string)', + 'function approve(address _spender, uint256 _value) returns (bool)', + 'function totalSupply() view returns (uint256)', + 'function transferFrom(address _from, address _to, uint256 _value) returns (bool)', + 'function decimals() view returns (uint8)', + 'function balanceOf(address _owner) view returns (uint256 balance)', + 'function symbol() view returns (string)', + 'function transfer(address _to, uint256 _value) returns (bool)', + 'function allowance(address _owner, address _spender) view returns (uint256)', + 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)', + 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)' +]; +export const ERC721 = [ + 'function BAYC_PROVENANCE() view returns (string)', + 'function MAX_APES() view returns (uint256)', + 'function REVEAL_TIMESTAMP() view returns (uint256)', + 'function apePrice() view returns (uint256)', + 'function approve(address to, uint256 tokenId)', + 'function balanceOf(address owner) view returns (uint256)', + 'function baseURI() view returns (string)', + 'function emergencySetStartingIndexBlock()', + 'function flipSaleState()', + 'function getApproved(uint256 tokenId) view returns (address)', + 'function isApprovedForAll(address owner, address operator) view returns (bool)', + 'function maxApePurchase() view returns (uint256)', + 'function mintApe(uint256 numberOfTokens) payable', + 'function name() view returns (string)', + 'function owner() view returns (address)', + 'function ownerOf(uint256 tokenId) view returns (address)', + 'function renounceOwnership()', + 'function reserveApes()', + 'function safeTransferFrom(address from, address to, uint256 tokenId)', + 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)', + 'function saleIsActive() view returns (bool)', + 'function setApprovalForAll(address operator, bool approved)', + 'function setBaseURI(string baseURI)', + 'function setProvenanceHash(string provenanceHash)', + 'function setRevealTimestamp(uint256 revealTimeStamp)', + 'function setStartingIndex()', + 'function startingIndex() view returns (uint256)', + 'function startingIndexBlock() view returns (uint256)', + 'function supportsInterface(bytes4 interfaceId) view returns (bool)', + 'function symbol() view returns (string)', + 'function tokenByIndex(uint256 index) view returns (uint256)', + 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)', + 'function tokenURI(uint256 tokenId) view returns (string)', + 'function totalSupply() view returns (uint256)', + 'function transferFrom(address from, address to, uint256 tokenId)', + 'function transferOwnership(address newOwner)', + 'function withdraw()' +]; +export const WETH = [ + 'function name() view returns (string)', + 'function approve(address guy, uint256 wad) returns (bool)', + 'function totalSupply() view returns (uint256)', + 'function transferFrom(address src, address dst, uint256 wad) returns (bool)', + 'function withdraw(uint256 wad)', + 'function decimals() view returns (uint8)', + 'function balanceOf(address) view returns (uint256)', + 'function symbol() view returns (string)', + 'function transfer(address dst, uint256 wad) returns (bool)', + 'function deposit() payable', + 'function allowance(address, address) view returns (uint256)' +]; +//# sourceMappingURL=Tokens.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Tokens.js.map b/dist/src/libs/humanizer/const/abis/Tokens.js.map new file mode 100644 index 000000000..6a44b5f58 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Tokens.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,uCAAuC;IACvC,mEAAmE;IACnE,+CAA+C;IAC/C,kFAAkF;IAClF,0CAA0C;IAC1C,mEAAmE;IACnE,yCAAyC;IACzC,+DAA+D;IAC/D,6EAA6E;IAC7E,qFAAqF;IACrF,gFAAgF;CACjF,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,kDAAkD;IAClD,4CAA4C;IAC5C,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,0DAA0D;IAC1D,0CAA0C;IAC1C,2CAA2C;IAC3C,0BAA0B;IAC1B,8DAA8D;IAC9D,gFAAgF;IAChF,kDAAkD;IAClD,kDAAkD;IAClD,uCAAuC;IACvC,yCAAyC;IACzC,0DAA0D;IAC1D,8BAA8B;IAC9B,wBAAwB;IACxB,sEAAsE;IACtE,mFAAmF;IACnF,6CAA6C;IAC7C,6DAA6D;IAC7D,qCAAqC;IACrC,mDAAmD;IACnD,sDAAsD;IACtD,6BAA6B;IAC7B,iDAAiD;IACjD,sDAAsD;IACtD,oEAAoE;IACpE,yCAAyC;IACzC,6DAA6D;IAC7D,mFAAmF;IACnF,0DAA0D;IAC1D,+CAA+C;IAC/C,kEAAkE;IAClE,8CAA8C;IAC9C,qBAAqB;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,uCAAuC;IACvC,2DAA2D;IAC3D,+CAA+C;IAC/C,6EAA6E;IAC7E,gCAAgC;IAChC,0CAA0C;IAC1C,oDAAoD;IACpD,yCAAyC;IACzC,4DAA4D;IAC5D,4BAA4B;IAC5B,6DAA6D;CAC9D,CAAA","sourcesContent":["export const ERC20 = [\n 'function name() view returns (string)',\n 'function approve(address _spender, uint256 _value) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address _from, address _to, uint256 _value) returns (bool)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address _owner) view returns (uint256 balance)',\n 'function symbol() view returns (string)',\n 'function transfer(address _to, uint256 _value) returns (bool)',\n 'function allowance(address _owner, address _spender) view returns (uint256)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)'\n]\n\nexport const ERC721 = [\n 'function BAYC_PROVENANCE() view returns (string)',\n 'function MAX_APES() view returns (uint256)',\n 'function REVEAL_TIMESTAMP() view returns (uint256)',\n 'function apePrice() view returns (uint256)',\n 'function approve(address to, uint256 tokenId)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function baseURI() view returns (string)',\n 'function emergencySetStartingIndexBlock()',\n 'function flipSaleState()',\n 'function getApproved(uint256 tokenId) view returns (address)',\n 'function isApprovedForAll(address owner, address operator) view returns (bool)',\n 'function maxApePurchase() view returns (uint256)',\n 'function mintApe(uint256 numberOfTokens) payable',\n 'function name() view returns (string)',\n 'function owner() view returns (address)',\n 'function ownerOf(uint256 tokenId) view returns (address)',\n 'function renounceOwnership()',\n 'function reserveApes()',\n 'function safeTransferFrom(address from, address to, uint256 tokenId)',\n 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n 'function saleIsActive() view returns (bool)',\n 'function setApprovalForAll(address operator, bool approved)',\n 'function setBaseURI(string baseURI)',\n 'function setProvenanceHash(string provenanceHash)',\n 'function setRevealTimestamp(uint256 revealTimeStamp)',\n 'function setStartingIndex()',\n 'function startingIndex() view returns (uint256)',\n 'function startingIndexBlock() view returns (uint256)',\n 'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n 'function symbol() view returns (string)',\n 'function tokenByIndex(uint256 index) view returns (uint256)',\n 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',\n 'function tokenURI(uint256 tokenId) view returns (string)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address from, address to, uint256 tokenId)',\n 'function transferOwnership(address newOwner)',\n 'function withdraw()'\n]\n\nexport const WETH = [\n 'function name() view returns (string)',\n 'function approve(address guy, uint256 wad) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address src, address dst, uint256 wad) returns (bool)',\n 'function withdraw(uint256 wad)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address) view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function transfer(address dst, uint256 wad) returns (bool)',\n 'function deposit() payable',\n 'function allowance(address, address) view returns (uint256)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts b/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts new file mode 100644 index 000000000..c9d8fd3bf --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts @@ -0,0 +1,2 @@ +export declare const JoeRouter: string[]; +//# sourceMappingURL=TraderJoe.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts.map b/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts.map new file mode 100644 index 000000000..90da6bae9 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TraderJoe.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/TraderJoe.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,UA4BrB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.js b/dist/src/libs/humanizer/const/abis/TraderJoe.js new file mode 100644 index 000000000..543eb3c82 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.js @@ -0,0 +1,30 @@ +export const JoeRouter = [ + 'function addLiquidity(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) returns (uint256,uint256,uint256,uint256,uint256[],uint256[])', + 'function addLiquidityNATIVE(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) payable returns (uint256,uint256,uint256,uint256,uint256[],uint256[])', + 'function createLBPair(address,address,uint24,uint16) returns (address)', + 'function getFactory() view returns (address)', + 'function getFactoryV2_1() view returns (address)', + 'function getIdFromPrice(address,uint256) view returns (uint24)', + 'function getLegacyFactory() view returns (address)', + 'function getLegacyRouter() view returns (address)', + 'function getPriceFromId(address,uint24) view returns (uint256)', + 'function getSwapIn(address,uint128,bool) view returns (uint128,uint128,uint128)', + 'function getSwapOut(address,uint128,bool) view returns (uint128,uint128,uint128)', + 'function getV1Factory() view returns (address)', + 'function getWNATIVE() view returns (address)', + 'function removeLiquidity(address,address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)', + 'function removeLiquidityNATIVE(address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)', + 'function swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256)', + 'function swapExactNATIVEForTokensSupportingFeeOnTransferTokens(uint256,tuple(uint256[],uint8[],address[]),address,uint256) payable returns (uint256)', + 'function swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)', + 'function swapExactTokensForNATIVESupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)', + 'function swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)', + 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)', + 'function swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256[])', + 'function swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])', + 'function swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])', + 'function sweep(address,address,uint256)', + 'function sweepLBToken(address,address,uint256[],uint256[])', + 'receive() payable' +]; +//# sourceMappingURL=TraderJoe.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.js.map b/dist/src/libs/humanizer/const/abis/TraderJoe.js.map new file mode 100644 index 000000000..aaf4ca1d9 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TraderJoe.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/TraderJoe.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,0NAA0N;IAC1N,wOAAwO;IACxO,wEAAwE;IACxE,8CAA8C;IAC9C,kDAAkD;IAClD,gEAAgE;IAChE,oDAAoD;IACpD,mDAAmD;IACnD,gEAAgE;IAChE,iFAAiF;IACjF,kFAAkF;IAClF,gDAAgD;IAChD,8CAA8C;IAC9C,gIAAgI;IAChI,8HAA8H;IAC9H,kJAAkJ;IAClJ,sJAAsJ;IACtJ,sKAAsK;IACtK,sJAAsJ;IACtJ,gKAAgK;IAChK,sJAAsJ;IACtJ,sJAAsJ;IACtJ,wKAAwK;IACxK,kKAAkK;IAClK,yCAAyC;IACzC,4DAA4D;IAC5D,mBAAmB;CACpB,CAAA","sourcesContent":["export const JoeRouter = [\n 'function addLiquidity(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function addLiquidityNATIVE(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) payable returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function createLBPair(address,address,uint24,uint16) returns (address)',\n 'function getFactory() view returns (address)',\n 'function getFactoryV2_1() view returns (address)',\n 'function getIdFromPrice(address,uint256) view returns (uint24)',\n 'function getLegacyFactory() view returns (address)',\n 'function getLegacyRouter() view returns (address)',\n 'function getPriceFromId(address,uint24) view returns (uint256)',\n 'function getSwapIn(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getSwapOut(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getV1Factory() view returns (address)',\n 'function getWNATIVE() view returns (address)',\n 'function removeLiquidity(address,address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function removeLiquidityNATIVE(address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256)',\n 'function swapExactNATIVEForTokensSupportingFeeOnTransferTokens(uint256,tuple(uint256[],uint8[],address[]),address,uint256) payable returns (uint256)',\n 'function swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForNATIVESupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256[])',\n 'function swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function sweep(address,address,uint256)',\n 'function sweepLBToken(address,address,uint256[],uint256[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.d.ts b/dist/src/libs/humanizer/const/abis/Uniswap.d.ts new file mode 100644 index 000000000..ffc81c643 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Uniswap.d.ts @@ -0,0 +1,5 @@ +export declare const UniswapUniversalRouter: string[]; +export declare const UniV2Router: string[]; +export declare const UniV3Router: string[]; +export declare const UniV3Router2: string[]; +//# sourceMappingURL=Uniswap.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.d.ts.map b/dist/src/libs/humanizer/const/abis/Uniswap.d.ts.map new file mode 100644 index 000000000..ff8d5f4dc --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Uniswap.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Uniswap.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Uniswap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,UASlC,CAAA;AAED,eAAO,MAAM,WAAW,UAyBvB,CAAA;AAED,eAAO,MAAM,WAAW,UAkBvB,CAAA;AAED,eAAO,MAAM,YAAY,UA2CxB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.js b/dist/src/libs/humanizer/const/abis/Uniswap.js new file mode 100644 index 000000000..ff2cda225 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Uniswap.js @@ -0,0 +1,100 @@ +export const UniswapUniversalRouter = [ + 'function collectRewards(bytes looksRareClaim)', + 'function execute(bytes commands, bytes[] inputs) payable', + 'function execute(bytes commands, bytes[] inputs, uint256 deadline) payable', + 'function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) pure returns (bytes4)', + 'function onERC1155Received(address, address, uint256, uint256, bytes) pure returns (bytes4)', + 'function onERC721Received(address, address, uint256, bytes) pure returns (bytes4)', + 'function supportsInterface(bytes4 interfaceId) pure returns (bool)', + 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)' +]; +export const UniV2Router = [ + 'function WETH() view returns (address)', + 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)', + 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)', + 'function factory() view returns (address)', + 'function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)', + 'function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)', + 'function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)', + 'function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)', + 'function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)', + 'function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)', + 'function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)', + 'function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)', + 'function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)', + 'function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)', + 'function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)', + 'function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)', + 'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)', + 'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable', + 'function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)', + 'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)', + 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)', + 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)', + 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)', + 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)' +]; +export const UniV3Router = [ + 'function WETH9() view returns (address)', + 'function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)', + 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)', + 'function exactOutput((bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)', + 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)', + 'function factory() view returns (address)', + 'function multicall(bytes[] data) payable returns (bytes[] results)', + 'function refundETH() payable', + 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable', + 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable', + 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable', + 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)', + 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable', + 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable' +]; +export const UniV3Router2 = [ + 'function WETH9() view returns (address)', + 'function approveMax(address token) payable', + 'function approveMaxMinusOne(address token) payable', + 'function approveZeroThenMax(address token) payable', + 'function approveZeroThenMaxMinusOne(address token) payable', + 'function callPositionManager(bytes data) payable returns (bytes result)', + 'function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view', + 'function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view', + 'function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)', + 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)', + 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)', + 'function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)', + 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)', + 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)', + 'function factory() view returns (address)', + 'function factoryV2() view returns (address)', + 'function getApprovalType(address token, uint256 amount) returns (uint8)', + 'function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)', + 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)', + 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)', + 'function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])', + 'function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])', + 'function multicall(bytes[] data) payable returns (bytes[] results)', + 'function positionManager() view returns (address)', + 'function pull(address token, uint256 value) payable', + 'function refundETH() payable', + 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable', + 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable', + 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)', + 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)', + 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable', + 'function sweepToken(address token, uint256 amountMinimum) payable', + 'function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable', + 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable', + 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)', + 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable', + 'function unwrapWETH9(uint256 amountMinimum) payable', + 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable', + 'function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable', + 'function wrapETH(uint256 value) payable' +]; +//# sourceMappingURL=Uniswap.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.js.map b/dist/src/libs/humanizer/const/abis/Uniswap.js.map new file mode 100644 index 000000000..93b43e7c2 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Uniswap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Uniswap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Uniswap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,+CAA+C;IAC/C,0DAA0D;IAC1D,4EAA4E;IAC5E,sGAAsG;IACtG,6FAA6F;IAC7F,mFAAmF;IACnF,oEAAoE;IACpE,sFAAsF;CACvF,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,wCAAwC;IACxC,2OAA2O;IAC3O,6NAA6N;IAC7N,2CAA2C;IAC3C,gHAAgH;IAChH,iHAAiH;IACjH,2FAA2F;IAC3F,2FAA2F;IAC3F,oGAAoG;IACpG,8LAA8L;IAC9L,4LAA4L;IAC5L,oMAAoM;IACpM,sPAAsP;IACtP,8PAA8P;IAC9P,wPAAwP;IACxP,qIAAqI;IACrI,wIAAwI;IACxI,yIAAyI;IACzI,kJAAkJ;IAClJ,mJAAmJ;IACnJ,qJAAqJ;IACrJ,sJAAsJ;IACtJ,kJAAkJ;IAClJ,qJAAqJ;CACtJ,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,yCAAyC;IACzC,+JAA+J;IAC/J,mOAAmO;IACnO,+JAA+J;IAC/J,mOAAmO;IACnO,2CAA2C;IAC3C,oEAAoE;IACpE,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,sFAAsF;IACtF,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,sHAAsH;CACvH,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,yCAAyC;IACzC,4CAA4C;IAC5C,oDAAoD;IACpD,oDAAoD;IACpD,4DAA4D;IAC5D,yEAAyE;IACzE,sHAAsH;IACtH,gGAAgG;IAChG,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,2CAA2C;IAC3C,6CAA6C;IAC7C,yEAAyE;IACzE,6JAA6J;IAC7J,gMAAgM;IAChM,0TAA0T;IAC1T,uFAAuF;IACvF,8EAA8E;IAC9E,oEAAoE;IACpE,mDAAmD;IACnD,qDAAqD;IACrD,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,2IAA2I;IAC3I,0IAA0I;IAC1I,sFAAsF;IACtF,mEAAmE;IACnE,iHAAiH;IACjH,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,qDAAqD;IACrD,sHAAsH;IACtH,mGAAmG;IACnG,yCAAyC;CAC1C,CAAA","sourcesContent":["export const UniswapUniversalRouter = [\n 'function collectRewards(bytes looksRareClaim)',\n 'function execute(bytes commands, bytes[] inputs) payable',\n 'function execute(bytes commands, bytes[] inputs, uint256 deadline) payable',\n 'function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) pure returns (bytes4)',\n 'function onERC1155Received(address, address, uint256, uint256, bytes) pure returns (bytes4)',\n 'function onERC721Received(address, address, uint256, bytes) pure returns (bytes4)',\n 'function supportsInterface(bytes4 interfaceId) pure returns (bool)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n\nexport const UniV2Router = [\n 'function WETH() view returns (address)',\n 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)',\n 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)',\n 'function factory() view returns (address)',\n 'function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)',\n 'function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)',\n 'function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)',\n 'function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)',\n 'function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)',\n 'function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)',\n 'function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)',\n 'function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)',\n 'function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)',\n 'function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',\n 'function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)'\n]\n\nexport const UniV3Router = [\n 'function WETH9() view returns (address)',\n 'function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable'\n]\n\nexport const UniV3Router2 = [\n 'function WETH9() view returns (address)',\n 'function approveMax(address token) payable',\n 'function approveMaxMinusOne(address token) payable',\n 'function approveZeroThenMax(address token) payable',\n 'function approveZeroThenMaxMinusOne(address token) payable',\n 'function callPositionManager(bytes data) payable returns (bytes result)',\n 'function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function factoryV2() view returns (address)',\n 'function getApprovalType(address token, uint256 amount) returns (uint8)',\n 'function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)',\n 'function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])',\n 'function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function positionManager() view returns (address)',\n 'function pull(address token, uint256 value) payable',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepToken(address token, uint256 amountMinimum) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9(uint256 amountMinimum) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function wrapETH(uint256 value) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Wallet.d.ts b/dist/src/libs/humanizer/const/abis/Wallet.d.ts new file mode 100644 index 000000000..3d6367441 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Wallet.d.ts @@ -0,0 +1,2 @@ +export declare const StakingPool: string[]; +//# sourceMappingURL=Wallet.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Wallet.d.ts.map b/dist/src/libs/humanizer/const/abis/Wallet.d.ts.map new file mode 100644 index 000000000..f945cfe4b --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Wallet.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Wallet.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Wallet.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UA2CvB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Wallet.js b/dist/src/libs/humanizer/const/abis/Wallet.js new file mode 100644 index 000000000..759aca543 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Wallet.js @@ -0,0 +1,45 @@ +export const StakingPool = [ + 'function ADXToken() view returns (address)', + 'function ADXUSDOracle() view returns (address)', + 'function DOMAIN_SEPARATOR() view returns (bytes32)', + 'function PERMIT_TYPEHASH() view returns (bytes32)', + 'function allowance(address owner, address spender) view returns (uint256 remaining)', + 'function approve(address spender, uint256 amount) returns (bool success)', + 'function balanceOf(address owner) view returns (uint256 balance)', + 'function claim(address tokenOut, address to, uint256 amount)', + 'function commitments(bytes32) view returns (uint256)', + 'function decimals() view returns (uint8)', + 'function enter(uint256 amount)', + 'function enterTo(address recipient, uint256 amount)', + 'function governance() view returns (address)', + 'function guardian() view returns (address)', + 'function leave(uint256 shares, bool skipMint)', + 'function limitLastReset() view returns (uint256)', + 'function limitRemaining() view returns (uint256)', + 'function lockedShares(address) view returns (uint256)', + 'function maxDailyPenaltiesPromilles() view returns (uint256)', + 'function name() view returns (string)', + 'function nonces(address) view returns (uint256)', + 'function penalize(uint256 adxAmount)', + 'function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)', + 'function rageLeave(uint256 shares, bool skipMint)', + 'function rageReceivedPromilles() view returns (uint256)', + 'function setDailyPenaltyMax(uint256 max)', + 'function setGovernance(address addr)', + 'function setGuardian(address newGuardian)', + 'function setRageReceived(uint256 rageReceived)', + 'function setTimeToUnbond(uint256 time)', + 'function setWhitelistedClaimToken(address token, bool whitelisted)', + 'function shareValue() view returns (uint256)', + 'function symbol() view returns (string)', + 'function timeToUnbond() view returns (uint256)', + 'function totalSupply() view returns (uint256)', + 'function transfer(address to, uint256 amount) returns (bool success)', + 'function transferFrom(address from, address to, uint256 amount) returns (bool success)', + 'function unbondingCommitmentWorth(address owner, uint256 shares, uint256 unlocksAt) view returns (uint256)', + 'function uniswap() view returns (address)', + 'function validator() view returns (address)', + 'function whitelistedClaimTokens(address) view returns (bool)', + 'function withdraw(uint256 shares, uint256 unlocksAt, bool skipMint)' +]; +//# sourceMappingURL=Wallet.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Wallet.js.map b/dist/src/libs/humanizer/const/abis/Wallet.js.map new file mode 100644 index 000000000..2533f6007 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/Wallet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Wallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Wallet.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,4CAA4C;IAC5C,gDAAgD;IAChD,oDAAoD;IACpD,mDAAmD;IACnD,qFAAqF;IACrF,0EAA0E;IAC1E,kEAAkE;IAClE,8DAA8D;IAC9D,sDAAsD;IACtD,0CAA0C;IAC1C,gCAAgC;IAChC,qDAAqD;IACrD,8CAA8C;IAC9C,4CAA4C;IAC5C,+CAA+C;IAC/C,kDAAkD;IAClD,kDAAkD;IAClD,uDAAuD;IACvD,8DAA8D;IAC9D,uCAAuC;IACvC,iDAAiD;IACjD,sCAAsC;IACtC,kHAAkH;IAClH,mDAAmD;IACnD,yDAAyD;IACzD,0CAA0C;IAC1C,sCAAsC;IACtC,2CAA2C;IAC3C,gDAAgD;IAChD,wCAAwC;IACxC,oEAAoE;IACpE,8CAA8C;IAC9C,yCAAyC;IACzC,gDAAgD;IAChD,+CAA+C;IAC/C,sEAAsE;IACtE,wFAAwF;IACxF,4GAA4G;IAC5G,2CAA2C;IAC3C,6CAA6C;IAC7C,8DAA8D;IAC9D,qEAAqE;CACtE,CAAA","sourcesContent":["export const StakingPool = [\n 'function ADXToken() view returns (address)',\n 'function ADXUSDOracle() view returns (address)',\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function PERMIT_TYPEHASH() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256 remaining)',\n 'function approve(address spender, uint256 amount) returns (bool success)',\n 'function balanceOf(address owner) view returns (uint256 balance)',\n 'function claim(address tokenOut, address to, uint256 amount)',\n 'function commitments(bytes32) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function enter(uint256 amount)',\n 'function enterTo(address recipient, uint256 amount)',\n 'function governance() view returns (address)',\n 'function guardian() view returns (address)',\n 'function leave(uint256 shares, bool skipMint)',\n 'function limitLastReset() view returns (uint256)',\n 'function limitRemaining() view returns (uint256)',\n 'function lockedShares(address) view returns (uint256)',\n 'function maxDailyPenaltiesPromilles() view returns (uint256)',\n 'function name() view returns (string)',\n 'function nonces(address) view returns (uint256)',\n 'function penalize(uint256 adxAmount)',\n 'function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function rageLeave(uint256 shares, bool skipMint)',\n 'function rageReceivedPromilles() view returns (uint256)',\n 'function setDailyPenaltyMax(uint256 max)',\n 'function setGovernance(address addr)',\n 'function setGuardian(address newGuardian)',\n 'function setRageReceived(uint256 rageReceived)',\n 'function setTimeToUnbond(uint256 time)',\n 'function setWhitelistedClaimToken(address token, bool whitelisted)',\n 'function shareValue() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function timeToUnbond() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool success)',\n 'function transferFrom(address from, address to, uint256 amount) returns (bool success)',\n 'function unbondingCommitmentWorth(address owner, uint256 shares, uint256 unlocksAt) view returns (uint256)',\n 'function uniswap() view returns (address)',\n 'function validator() view returns (address)',\n 'function whitelistedClaimTokens(address) view returns (bool)',\n 'function withdraw(uint256 shares, uint256 unlocksAt, bool skipMint)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.d.ts b/dist/src/libs/humanizer/const/abis/index.d.ts new file mode 100644 index 000000000..24687a228 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/index.d.ts @@ -0,0 +1,13 @@ +import { OneInch } from './1Inch'; +import { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'; +import { Across } from './Across'; +import { KyberSwap } from './KyberSwap'; +import { Legends } from './Legends'; +import { SocketViaAcross } from './socket'; +import { RouteProcessor } from './Sushi'; +import { ERC20, ERC721, WETH } from './Tokens'; +import { JoeRouter } from './TraderJoe'; +import { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'; +import { StakingPool } from './Wallet'; +export { AaveLendingPoolV2, AaveWethGatewayV2, AaveV3Pool, UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2, StakingPool, ERC20, ERC721, WETH, RouteProcessor, JoeRouter, Across, OneInch, KyberSwap, SocketViaAcross, Legends }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.d.ts.map b/dist/src/libs/humanizer/const/abis/index.d.ts.map new file mode 100644 index 000000000..bdde28899 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,MAAM,EACN,IAAI,EACJ,cAAc,EACd,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,eAAe,EACf,OAAO,EACR,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.js b/dist/src/libs/humanizer/const/abis/index.js new file mode 100644 index 000000000..6e17a7c43 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/index.js @@ -0,0 +1,13 @@ +import { OneInch } from './1Inch'; +import { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'; +import { Across } from './Across'; +import { KyberSwap } from './KyberSwap'; +import { Legends } from './Legends'; +import { SocketViaAcross } from './socket'; +import { RouteProcessor } from './Sushi'; +import { ERC20, ERC721, WETH } from './Tokens'; +import { JoeRouter } from './TraderJoe'; +import { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'; +import { StakingPool } from './Wallet'; +export { AaveLendingPoolV2, AaveWethGatewayV2, AaveV3Pool, UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2, StakingPool, ERC20, ERC721, WETH, RouteProcessor, JoeRouter, Across, OneInch, KyberSwap, SocketViaAcross, Legends }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.js.map b/dist/src/libs/humanizer/const/abis/index.js.map new file mode 100644 index 000000000..b3fffd2b8 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,MAAM,EACN,IAAI,EACJ,cAAc,EACd,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,eAAe,EACf,OAAO,EACR,CAAA","sourcesContent":["import { OneInch } from './1Inch'\nimport { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'\nimport { Across } from './Across'\nimport { KyberSwap } from './KyberSwap'\nimport { Legends } from './Legends'\nimport { SocketViaAcross } from './socket'\nimport { RouteProcessor } from './Sushi'\nimport { ERC20, ERC721, WETH } from './Tokens'\nimport { JoeRouter } from './TraderJoe'\nimport { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'\nimport { StakingPool } from './Wallet'\n\nexport {\n AaveLendingPoolV2,\n AaveWethGatewayV2,\n AaveV3Pool,\n UniswapUniversalRouter,\n UniV2Router,\n UniV3Router,\n UniV3Router2,\n StakingPool,\n ERC20,\n ERC721,\n WETH,\n RouteProcessor,\n JoeRouter,\n Across,\n OneInch,\n KyberSwap,\n SocketViaAcross,\n Legends\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/socket.d.ts b/dist/src/libs/humanizer/const/abis/socket.d.ts new file mode 100644 index 000000000..b7bb3d4c2 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/socket.d.ts @@ -0,0 +1,2 @@ +export declare const SocketViaAcross: string[]; +//# sourceMappingURL=socket.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/socket.d.ts.map b/dist/src/libs/humanizer/const/abis/socket.d.ts.map new file mode 100644 index 000000000..c53fed98a --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/socket.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/socket.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,UAmC3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/socket.js b/dist/src/libs/humanizer/const/abis/socket.js new file mode 100644 index 000000000..329b6441f --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/socket.js @@ -0,0 +1,37 @@ +export const SocketViaAcross = [ + // 'constructor(address _spokePool, address _wethAddress, address _socketGateway, address _socketDeployFactory)', + 'error OnlySocketGatewayOwner()', + 'event NativeBridgeFee(uint256 fee)', + 'event SocketBridge(uint256 amount, address token, uint256 toChainId, bytes32 bridgeName, address sender, address receiver, bytes32 metadata)', + 'function ACROSS_ERC20_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)', + 'function ACROSS_NATIVE_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)', + 'function ACROSS_SWAP_BRIDGE_SELECTOR() view returns (bytes4)', + 'function AcrossIdentifier() view returns (bytes32)', + 'function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)', + 'function NATIVE_TOKEN_ADDRESS() view returns (address)', + 'function WETH() view returns (address)', + 'function bridgeAfterSwap(uint256 amount, bytes bridgeData) payable', + 'function bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable', + 'function rescueEther(address userAddress, uint256 amount)', + 'function rescueFunds(address token, address userAddress, uint256 amount)', + 'function socketDeployFactory() view returns (address)', + 'function socketGateway() view returns (address)', + 'function socketRoute() view returns (address)', + 'function spokePool() view returns (address)', + 'function spokePoolAddress() view returns (address)', + 'function swapAndBridge(uint32 swapId, bytes swapData, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable', + 'function swapAndBridge(uint32,address,uint256,bytes32,bytes)', + 'function swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable', + 'function bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable', + 'function bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data) payable', + 'function bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash) payable', + 'function bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable', + 'function bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)', + 'function bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery) payable', + 'function bridgeNativeTo(uint256,address,uint256,bytes32)', + 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable', + 'function bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable', + 'function bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)', + 'function bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable' +]; +//# sourceMappingURL=socket.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/socket.js.map b/dist/src/libs/humanizer/const/abis/socket.js.map new file mode 100644 index 000000000..0ff07f2a7 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/socket.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/socket.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iHAAiH;IACjH,gCAAgC;IAChC,oCAAoC;IACpC,8IAA8I;IAC9I,iFAAiF;IACjF,kFAAkF;IAClF,8DAA8D;IAC9D,oDAAoD;IACpD,6DAA6D;IAC7D,wDAAwD;IACxD,wCAAwC;IACxC,oEAAoE;IACpE,mPAAmP;IACnP,2DAA2D;IAC3D,0EAA0E;IAC1E,uDAAuD;IACvD,iDAAiD;IACjD,+CAA+C;IAC/C,6CAA6C;IAC7C,oDAAoD;IACpD,0PAA0P;IAC1P,8DAA8D;IAC9D,gLAAgL;IAChL,4OAA4O;IAC5O,6JAA6J;IAC7J,mKAAmK;IACnK,kNAAkN;IAClN,2IAA2I;IAC3I,gVAAgV;IAChV,0DAA0D;IAC1D,wPAAwP;IACxP,2UAA2U;IAC3U,qRAAqR;IACrR,qXAAqX;CACtX,CAAA","sourcesContent":["export const SocketViaAcross = [\n // 'constructor(address _spokePool, address _wethAddress, address _socketGateway, address _socketDeployFactory)',\n 'error OnlySocketGatewayOwner()',\n 'event NativeBridgeFee(uint256 fee)',\n 'event SocketBridge(uint256 amount, address token, uint256 toChainId, bytes32 bridgeName, address sender, address receiver, bytes32 metadata)',\n 'function ACROSS_ERC20_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_NATIVE_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_SWAP_BRIDGE_SELECTOR() view returns (bytes4)',\n 'function AcrossIdentifier() view returns (bytes32)',\n 'function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)',\n 'function NATIVE_TOKEN_ADDRESS() view returns (address)',\n 'function WETH() view returns (address)',\n 'function bridgeAfterSwap(uint256 amount, bytes bridgeData) payable',\n 'function bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function rescueEther(address userAddress, uint256 amount)',\n 'function rescueFunds(address token, address userAddress, uint256 amount)',\n 'function socketDeployFactory() view returns (address)',\n 'function socketGateway() view returns (address)',\n 'function socketRoute() view returns (address)',\n 'function spokePool() view returns (address)',\n 'function spokePoolAddress() view returns (address)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function swapAndBridge(uint32,address,uint256,bytes32,bytes)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable',\n 'function bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data) payable',\n 'function bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash) payable',\n 'function bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable',\n 'function bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)',\n 'function bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery) payable',\n 'function bridgeNativeTo(uint256,address,uint256,bytes32)',\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable',\n 'function bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable',\n 'function bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)',\n 'function bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.d.ts b/dist/src/libs/humanizer/const/abis/stkWallet.d.ts new file mode 100644 index 000000000..c222f55a8 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/stkWallet.d.ts @@ -0,0 +1,2 @@ +export declare const StkWallet: string[]; +//# sourceMappingURL=stkWallet.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.d.ts.map b/dist/src/libs/humanizer/const/abis/stkWallet.d.ts.map new file mode 100644 index 000000000..de478e59e --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/stkWallet.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"stkWallet.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/stkWallet.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,UAKrB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.js b/dist/src/libs/humanizer/const/abis/stkWallet.js new file mode 100644 index 000000000..1c69ce781 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/stkWallet.js @@ -0,0 +1,7 @@ +export const StkWallet = [ + 'function wrapAll()', + 'function wrap(uint256 shareAmount)', + 'function unwrap(uint256 shareAmount)', + 'function stakeAndWrap(uint256 amount)' +]; +//# sourceMappingURL=stkWallet.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.js.map b/dist/src/libs/humanizer/const/abis/stkWallet.js.map new file mode 100644 index 000000000..f991fea13 --- /dev/null +++ b/dist/src/libs/humanizer/const/abis/stkWallet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"stkWallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/stkWallet.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,oBAAoB;IACpB,oCAAoC;IACpC,sCAAsC;IACtC,uCAAuC;CACxC,CAAA","sourcesContent":["export const StkWallet = [\n 'function wrapAll()',\n 'function wrap(uint256 shareAmount)',\n 'function unwrap(uint256 shareAmount)',\n 'function stakeAndWrap(uint256 amount)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/coinType.d.ts b/dist/src/libs/humanizer/const/coinType.d.ts new file mode 100644 index 000000000..db70a54ec --- /dev/null +++ b/dist/src/libs/humanizer/const/coinType.d.ts @@ -0,0 +1,4 @@ +export declare const registeredCoinTypes: { + [n: number]: any[]; +}; +//# sourceMappingURL=coinType.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/coinType.d.ts.map b/dist/src/libs/humanizer/const/coinType.d.ts.map new file mode 100644 index 000000000..16aa5532a --- /dev/null +++ b/dist/src/libs/humanizer/const/coinType.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"coinType.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/const/coinType.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,CAAA;CAk1CrD,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/coinType.js b/dist/src/libs/humanizer/const/coinType.js new file mode 100644 index 000000000..6108a0527 --- /dev/null +++ b/dist/src/libs/humanizer/const/coinType.js @@ -0,0 +1,1364 @@ +export const registeredCoinTypes = { + 0: ['0x80000000', 'BTC', 'Bitcoin'], + 1: ['0x80000001', undefined, 'Testnet'], + 2: ['0x80000002', 'LTC', 'Litecoin'], + 3: ['0x80000003', 'DOGE', 'Dogecoin'], + 4: ['0x80000004', 'RDD', 'Reddcoin'], + 5: ['0x80000005', 'DASH', 'Dash'], + 6: ['0x80000006', 'PPC', 'Peercoin'], + 7: ['0x80000007', 'NMC', 'Namecoin'], + 8: ['0x80000008', 'FTC', 'Feathercoin'], + 9: ['0x80000009', 'XCP', 'Counterparty'], + 10: ['0x8000000a', 'BLK', 'Blackcoin'], + 11: ['0x8000000b', 'NSR', 'NuShares'], + 12: ['0x8000000c', 'NBT', 'NuBits'], + 13: ['0x8000000d', 'MZC', 'Mazacoin'], + 14: ['0x8000000e', 'VIA', 'Viacoin'], + 15: ['0x8000000f', 'XCH', 'ClearingHouse'], + 16: ['0x80000010', 'RBY', 'Rubycoin'], + 17: ['0x80000011', 'GRS', 'Groestlcoin'], + 18: ['0x80000012', 'DGC', 'Digitalcoin'], + 19: ['0x80000013', 'CCN', 'Cannacoin'], + 20: ['0x80000014', 'DGB', 'DigiByte'], + 21: ['0x80000015', 'Open Assets'], + 22: ['0x80000016', 'MONA', 'Monacoin'], + 23: ['0x80000017', 'CLAM', 'Clams'], + 24: ['0x80000018', 'XPM', 'Primecoin'], + 25: ['0x80000019', 'NEOS', 'Neoscoin'], + 26: ['0x8000001a', 'JBS', 'Jumbucks'], + 27: ['0x8000001b', 'ZRC', 'ziftrCOIN'], + 28: ['0x8000001c', 'VTC', 'Vertcoin'], + 29: ['0x8000001d', 'NXT', 'NXT'], + 30: ['0x8000001e', 'BURST', 'Burst'], + 31: ['0x8000001f', 'MUE', 'MonetaryUnit'], + 32: ['0x80000020', 'ZOOM', 'Zoom'], + 33: ['0x80000021', 'VASH', 'Virtual Cash'], + 34: ['0x80000022', 'CDN', 'Canada eCoin'], + 35: ['0x80000023', 'SDC', 'ShadowCash'], + 36: ['0x80000024', 'PKB', 'ParkByte'], + 37: ['0x80000025', 'PND', 'Pandacoin'], + 38: ['0x80000026', 'START', 'StartCOIN'], + 39: ['0x80000027', 'MOIN', 'MOIN'], + 40: ['0x80000028', 'EXP', 'Expanse'], + 41: ['0x80000029', 'EMC2', 'Einsteinium'], + 42: ['0x8000002a', 'DCR', 'Decred'], + 43: ['0x8000002b', 'XEM', 'NEM'], + 44: ['0x8000002c', 'PART', 'Particl'], + 45: ['0x8000002d', 'ARG', 'Argentum (dead)'], + 46: ['0x8000002e', 'Libertas'], + 47: ['0x8000002f', 'Posw coin'], + 48: ['0x80000030', 'SHR', 'Shreeji'], + 49: ['0x80000031', 'GCR', 'Global Currency Reserve'], + 50: ['0x80000032', 'NVC', 'Novacoin'], + 51: ['0x80000033', 'AC', 'Asiacoin'], + 52: ['0x80000034', 'BTCD', 'BitcoinDark'], + 53: ['0x80000035', 'DOPE', 'Dopecoin'], + 54: ['0x80000036', 'TPC', 'Templecoin'], + 55: ['0x80000037', 'AIB', 'AIB'], + 56: ['0x80000038', 'EDRC', 'EDRCoin'], + 57: ['0x80000039', 'SYS', 'Syscoin'], + 58: ['0x8000003a', 'SLR', 'Solarcoin'], + 59: ['0x8000003b', 'SMLY', 'Smileycoin'], + 60: ['0x8000003c', 'ETH', 'Ether'], + 61: ['0x8000003d', 'ETC', 'Ether Classic'], + 62: ['0x8000003e', 'PSB', 'Pesobit'], + 63: ['0x8000003f', 'LDCN', 'Landcoin (dead)'], + 64: ['0x80000040', 'Open Chain'], + 65: ['0x80000041', 'XBC', 'Bitcoinplus'], + 66: ['0x80000042', 'IOP', 'Internet of People'], + 67: ['0x80000043', 'NXS', 'Nexus'], + 68: ['0x80000044', 'INSN', 'InsaneCoin'], + 69: ['0x80000045', 'OK', 'OKCash'], + 70: ['0x80000046', 'BRIT', 'BritCoin'], + 71: ['0x80000047', 'CMP', 'Compcoin'], + 72: ['0x80000048', 'CRW', 'Crown'], + 73: ['0x80000049', 'BELA', 'BelaCoin'], + 74: ['0x8000004a', 'ICX', 'ICON'], + 75: ['0x8000004b', 'FJC', 'FujiCoin'], + 76: ['0x8000004c', 'MIX', 'MIX'], + 77: ['0x8000004d', 'XVG', 'Verge Currency'], + 78: ['0x8000004e', 'EFL', 'Electronic Gulden'], + 79: ['0x8000004f', 'CLUB', 'ClubCoin'], + 80: ['0x80000050', 'RICHX', 'RichCoin'], + 81: ['0x80000051', 'POT', 'Potcoin'], + 82: ['0x80000052', 'QRK', 'Quarkcoin'], + 83: ['0x80000053', 'TRC', 'Terracoin'], + 84: ['0x80000054', 'GRC', 'Gridcoin'], + 85: ['0x80000055', 'AUR', 'Auroracoin'], + 86: ['0x80000056', 'IXC', 'IXCoin'], + 87: ['0x80000057', 'NLG', 'Gulden'], + 88: ['0x80000058', 'BITB', 'BitBean'], + 89: ['0x80000059', 'BTA', 'Bata'], + 90: ['0x8000005a', 'XMY', 'Myriadcoin'], + 91: ['0x8000005b', 'BSD', 'BitSend'], + 92: ['0x8000005c', 'UNO', 'Unobtanium'], + 93: ['0x8000005d', 'MTR', 'MasterTrader'], + 94: ['0x8000005e', 'GB', 'GoldBlocks'], + 95: ['0x8000005f', 'SHM', 'Saham'], + 96: ['0x80000060', 'CRX', 'Chronos'], + 97: ['0x80000061', 'BIQ', 'Ubiquoin'], + 98: ['0x80000062', 'EVO', 'Evotion'], + 99: ['0x80000063', 'STO', 'SaveTheOcean'], + 100: ['0x80000064', 'BIGUP', 'BigUp'], + 101: ['0x80000065', 'GAME', 'GameCredits'], + 102: ['0x80000066', 'DLC', 'Dollarcoins'], + 103: ['0x80000067', 'ZYD', 'Zayedcoin'], + 104: ['0x80000068', 'DBIC', 'Dubaicoin'], + 105: ['0x80000069', 'STRAT', 'Stratis'], + 106: ['0x8000006a', 'SH', 'Shilling'], + 107: ['0x8000006b', 'MARS', 'MarsCoin'], + 108: ['0x8000006c', 'UBQ', 'Ubiq'], + 109: ['0x8000006d', 'PTC', 'Pesetacoin'], + 110: ['0x8000006e', 'NRO', 'Neurocoin'], + 111: ['0x8000006f', 'ARK', 'ARK'], + 112: ['0x80000070', 'USC', 'UltimateSecureCashMain'], + 113: ['0x80000071', 'THC', 'Hempcoin'], + 114: ['0x80000072', 'LINX', 'Linx'], + 115: ['0x80000073', 'ECN', 'Ecoin'], + 116: ['0x80000074', 'DNR', 'Denarius'], + 117: ['0x80000075', 'PINK', 'Pinkcoin'], + 118: ['0x80000076', 'ATOM', 'Atom'], + 119: ['0x80000077', 'PIVX', 'Pivx'], + 120: ['0x80000078', 'FLASH', 'Flashcoin'], + 121: ['0x80000079', 'ZEN', 'Zencash'], + 122: ['0x8000007a', 'PUT', 'Putincoin'], + 123: ['0x8000007b', 'ZNY', 'BitZeny'], + 124: ['0x8000007c', 'UNIFY', 'Unify'], + 125: ['0x8000007d', 'XST', 'StealthCoin'], + 126: ['0x8000007e', 'BRK', 'Breakout Coin'], + 127: ['0x8000007f', 'VC', 'Vcash'], + 128: ['0x80000080', 'XMR', 'Monero'], + 129: ['0x80000081', 'VOX', 'Voxels'], + 130: ['0x80000082', 'NAV', 'NavCoin'], + 131: ['0x80000083', 'FCT', 'Factom Factoids'], + 132: ['0x80000084', 'EC', 'Factom Entry Credits'], + 133: ['0x80000085', 'ZEC', 'Zcash'], + 134: ['0x80000086', 'LSK', 'Lisk'], + 135: ['0x80000087', 'STEEM', 'Steem'], + 136: ['0x80000088', 'XZC', 'ZCoin'], + 137: ['0x80000089', 'RBTC', 'Rootstock'], + '138': ['0x8000008a', 'Giftblock'], + 139: ['0x8000008b', 'RPT', 'RealPointCoin'], + 140: ['0x8000008c', 'LBC', 'LBRY Credits'], + 141: ['0x8000008d', 'KMD', 'Komodo'], + 142: ['0x8000008e', 'BSQ', 'bisq Token'], + 143: ['0x8000008f', 'RIC', 'Riecoin'], + 144: ['0x80000090', 'XRP', 'XRP'], + 145: ['0x80000091', 'BCH', 'Bitcoin Cash'], + 146: ['0x80000092', 'NEBL', 'Neblio'], + 147: ['0x80000093', 'ZCL', 'ZClassic'], + 148: ['0x80000094', 'XLM', 'Stellar Lumens'], + 149: ['0x80000095', 'NLC2', 'NoLimitCoin2'], + 150: ['0x80000096', 'WHL', 'WhaleCoin'], + 151: ['0x80000097', 'ERC', 'EuropeCoin'], + 152: ['0x80000098', 'DMD', 'Diamond'], + 153: ['0x80000099', 'BTM', 'Bytom'], + 154: ['0x8000009a', 'BIO', 'Biocoin'], + 155: ['0x8000009b', 'XWCC', 'Whitecoin Classic'], + 156: ['0x8000009c', 'BTG', 'Bitcoin Gold'], + 157: ['0x8000009d', 'BTC2X', 'Bitcoin 2x'], + 158: ['0x8000009e', 'SSN', 'SuperSkynet'], + 159: ['0x8000009f', 'TOA', 'TOACoin'], + 160: ['0x800000a0', 'BTX', 'Bitcore'], + 161: ['0x800000a1', 'ACC', 'Adcoin'], + 162: ['0x800000a2', 'BCO', 'Bridgecoin'], + 163: ['0x800000a3', 'ELLA', 'Ellaism'], + 164: ['0x800000a4', 'PIRL', 'Pirl'], + 165: ['0x800000a5', 'XNO', 'Nano'], + 166: ['0x800000a6', 'VIVO', 'Vivo'], + 167: ['0x800000a7', 'FRST', 'Firstcoin'], + 168: ['0x800000a8', 'HNC', 'Helleniccoin'], + 169: ['0x800000a9', 'BUZZ', 'BUZZ'], + 170: ['0x800000aa', 'MBRS', 'Ember'], + 171: ['0x800000ab', 'HC', 'Hcash'], + 172: ['0x800000ac', 'HTML', 'HTMLCOIN'], + 173: ['0x800000ad', 'ODN', 'Obsidian'], + 174: ['0x800000ae', 'ONX', 'OnixCoin'], + 175: ['0x800000af', 'RVN', 'Ravencoin'], + 176: ['0x800000b0', 'GBX', 'GoByte'], + 177: ['0x800000b1', 'BTCZ', 'BitcoinZ'], + 178: ['0x800000b2', 'POA', 'Poa'], + 179: ['0x800000b3', 'NYC', 'NewYorkCoin'], + 180: ['0x800000b4', 'MXT', 'MarteXcoin'], + 181: ['0x800000b5', 'WC', 'Wincoin'], + 182: ['0x800000b6', 'MNX', 'Minexcoin'], + 183: ['0x800000b7', 'BTCP', 'Bitcoin Private'], + 184: ['0x800000b8', 'MUSIC', 'Musicoin'], + 185: ['0x800000b9', 'BCA', 'Bitcoin Atom'], + 186: ['0x800000ba', 'CRAVE', 'Crave'], + 187: ['0x800000bb', 'STAK', 'STRAKS'], + 188: ['0x800000bc', 'WBTC', 'World Bitcoin'], + 189: ['0x800000bd', 'LCH', 'LiteCash'], + 190: ['0x800000be', 'EXCL', 'ExclusiveCoin'], + '191': ['0x800000bf', 'Lynx'], + 192: ['0x800000c0', 'LCC', 'LitecoinCash'], + 193: ['0x800000c1', 'XFE', 'Feirm'], + 194: ['0x800000c2', 'EOS', 'EOS'], + 195: ['0x800000c3', 'TRX', 'Tron'], + 196: ['0x800000c4', 'KOBO', 'Kobocoin'], + 197: ['0x800000c5', 'HUSH', 'HUSH'], + 198: ['0x800000c6', 'BAN', 'Banano'], + 199: ['0x800000c7', 'ETF', 'ETF'], + 200: ['0x800000c8', 'OMNI', 'Omni'], + 201: ['0x800000c9', 'BIFI', 'BitcoinFile'], + 202: ['0x800000ca', 'UFO', 'Uniform Fiscal Object'], + 203: ['0x800000cb', 'CNMC', 'Cryptonodes'], + 204: ['0x800000cc', 'BCN', 'Bytecoin'], + 205: ['0x800000cd', 'RIN', 'Ringo'], + 206: ['0x800000ce', 'ATP', 'Alaya'], + 207: ['0x800000cf', 'EVT', 'everiToken'], + 208: ['0x800000d0', 'ATN', 'ATN'], + 209: ['0x800000d1', 'BIS', 'Bismuth'], + 210: ['0x800000d2', 'NEET', 'NEETCOIN'], + 211: ['0x800000d3', 'BOPO', 'BopoChain'], + 212: ['0x800000d4', 'OOT', 'Utrum'], + 213: ['0x800000d5', 'ALIAS', 'Alias'], + 214: ['0x800000d6', 'MONK', 'Monkey Project'], + 215: ['0x800000d7', 'BOXY', 'BoxyCoin'], + 216: ['0x800000d8', 'FLO', 'Flo'], + 217: ['0x800000d9', 'MEC', 'Megacoin'], + 218: ['0x800000da', 'BTDX', 'BitCloud'], + 219: ['0x800000db', 'XAX', 'Artax'], + 220: ['0x800000dc', 'ANON', 'ANON'], + 221: ['0x800000dd', 'LTZ', 'LitecoinZ'], + 222: ['0x800000de', 'BITG', 'Bitcoin Green'], + 223: ['0x800000df', 'ICP', 'Internet Computer (DFINITY)'], + 224: ['0x800000e0', 'SMART', 'Smartcash'], + 225: ['0x800000e1', 'XUEZ', 'XUEZ'], + 226: ['0x800000e2', 'HLM', 'Helium'], + 227: ['0x800000e3', 'WEB', 'Webchain'], + 228: ['0x800000e4', 'ACM', 'Actinium'], + 229: ['0x800000e5', 'NOS', 'NOS Stable Coins'], + 230: ['0x800000e6', 'BITC', 'BitCash'], + 231: ['0x800000e7', 'HTH', 'Help The Homeless Coin'], + 232: ['0x800000e8', 'TZC', 'Trezarcoin'], + 233: ['0x800000e9', 'VAR', 'Varda'], + 234: ['0x800000ea', 'IOV', 'IOV'], + 235: ['0x800000eb', 'FIO', 'FIO'], + 236: ['0x800000ec', 'BSV', 'BitcoinSV'], + 237: ['0x800000ed', 'DXN', 'DEXON'], + 238: ['0x800000ee', 'QRL', 'Quantum Resistant Ledger'], + 239: ['0x800000ef', 'PCX', 'ChainX'], + 240: ['0x800000f0', 'LOKI', 'Loki'], + '241': ['0x800000f1', 'Imagewallet'], + 242: ['0x800000f2', 'NIM', 'Nimiq'], + 243: ['0x800000f3', 'SOV', 'Sovereign Coin'], + 244: ['0x800000f4', 'JCT', 'Jibital Coin'], + 245: ['0x800000f5', 'SLP', 'Simple Ledger Protocol'], + 246: ['0x800000f6', 'EWT', 'Energy Web'], + 247: ['0x800000f7', 'UC', 'Ulord'], + 248: ['0x800000f8', 'EXOS', 'EXOS'], + 249: ['0x800000f9', 'ECA', 'Electra'], + 250: ['0x800000fa', 'SOOM', 'Soom'], + 251: ['0x800000fb', 'XRD', 'Redstone'], + 252: ['0x800000fc', 'FREE', 'FreeCoin'], + 253: ['0x800000fd', 'NPW', 'NewPowerCoin'], + 254: ['0x800000fe', 'BST', 'BlockStamp'], + '255': ['0x800000ff', 'SmartHoldem'], + 256: ['0x80000100', 'NANO', 'Bitcoin Nano'], + 257: ['0x80000101', 'BTCC', 'Bitcoin Core'], + 258: ['0x80000102', 'Zen Protocol'], + 259: ['0x80000103', 'ZEST', 'Zest'], + 260: ['0x80000104', 'ABT', 'ArcBlock'], + 261: ['0x80000105', 'PION', 'Pion'], + 262: ['0x80000106', 'DT3', 'DreamTeam3'], + 263: ['0x80000107', 'ZBUX', 'Zbux'], + 264: ['0x80000108', 'KPL', 'Kepler'], + 265: ['0x80000109', 'TPAY', 'TokenPay'], + 266: ['0x8000010a', 'ZILLA', 'ChainZilla'], + 267: ['0x8000010b', 'ANK', 'Anker'], + 268: ['0x8000010c', 'BCC', 'BCChain'], + 269: ['0x8000010d', 'HPB', 'HPB'], + 270: ['0x8000010e', 'ONE', 'ONE'], + 271: ['0x8000010f', 'SBC', 'SBC'], + 272: ['0x80000110', 'IPC', 'IPChain'], + 273: ['0x80000111', 'DMTC', 'Dominantchain'], + 274: ['0x80000112', 'OGC', 'Onegram'], + 275: ['0x80000113', 'SHIT', 'Shitcoin'], + 276: ['0x80000114', 'ANDES', 'Andescoin'], + 277: ['0x80000115', 'AREPA', 'Arepacoin'], + 278: ['0x80000116', 'BOLI', 'Bolivarcoin'], + 279: ['0x80000117', 'RIL', 'Rilcoin'], + 280: ['0x80000118', 'HTR', 'Hathor Network'], + 281: ['0x80000119', 'ACME', 'Accumulate'], + 282: ['0x8000011a', 'BRAVO', 'BRAVO'], + 283: ['0x8000011b', 'ALGO', 'Algorand'], + 284: ['0x8000011c', 'BZX', 'Bitcoinzero'], + 285: ['0x8000011d', 'GXX', 'GravityCoin'], + 286: ['0x8000011e', 'HEAT', 'HEAT'], + 287: ['0x8000011f', 'XDN', 'DigitalNote'], + 288: ['0x80000120', 'FSN', 'FUSION'], + 289: ['0x80000121', 'CPC', 'Capricoin'], + 290: ['0x80000122', 'BOLD', 'Bold'], + 291: ['0x80000123', 'IOST', 'IOST'], + 292: ['0x80000124', 'TKEY', 'Tkeycoin'], + 293: ['0x80000125', 'USE', 'Usechain'], + 294: ['0x80000126', 'BCZ', 'BitcoinCZ'], + 295: ['0x80000127', 'IOC', 'Iocoin'], + 296: ['0x80000128', 'ASF', 'Asofe'], + 297: ['0x80000129', 'MASS', 'MASS'], + 298: ['0x8000012a', 'FAIR', 'FairCoin'], + 299: ['0x8000012b', 'NUKO', 'Nekonium'], + 300: ['0x8000012c', 'GNX', 'Genaro Network'], + 301: ['0x8000012d', 'DIVI', 'Divi Project'], + 302: ['0x8000012e', 'CMT', 'Community'], + 303: ['0x8000012f', 'EUNO', 'EUNO'], + 304: ['0x80000130', 'IOTX', 'IoTeX'], + 305: ['0x80000131', 'ONION', 'DeepOnion'], + 306: ['0x80000132', '8BIT', '8Bit'], + 307: ['0x80000133', 'ATC', 'AToken Coin'], + 308: ['0x80000134', 'BTS', 'Bitshares'], + 309: ['0x80000135', 'CKB', 'Nervos CKB'], + 310: ['0x80000136', 'UGAS', 'Ultrain'], + 311: ['0x80000137', 'ADS', 'Adshares'], + 312: ['0x80000138', 'ARA', 'Aura'], + 313: ['0x80000139', 'ZIL', 'Zilliqa'], + 314: ['0x8000013a', 'MOAC', 'MOAC'], + 315: ['0x8000013b', 'SWTC', 'SWTC'], + 316: ['0x8000013c', 'VNSC', 'vnscoin'], + 317: ['0x8000013d', 'PLUG', 'Pl ^ g'], + 318: ['0x8000013e', 'MAN', 'Matrix AI Network'], + 319: ['0x8000013f', 'ECC', 'ECCoin'], + 320: ['0x80000140', 'RPD', 'Rapids'], + 321: ['0x80000141', 'RAP', 'Rapture'], + 322: ['0x80000142', 'GARD', 'Hashgard'], + 323: ['0x80000143', 'ZER', 'Zero'], + 324: ['0x80000144', 'EBST', 'eBoost'], + 325: ['0x80000145', 'SHARD', 'Shard'], + 326: ['0x80000146', 'MRX', 'Metrix Coin'], + 327: ['0x80000147', 'CMM', 'Commercium'], + 328: ['0x80000148', 'BLOCK', 'Blocknet'], + 329: ['0x80000149', 'AUDAX', 'AUDAX'], + 330: ['0x8000014a', 'LUNA', 'Terra'], + 331: ['0x8000014b', 'ZPM', 'zPrime'], + 332: ['0x8000014c', 'KUVA', 'Kuva Utility Note'], + 333: ['0x8000014d', 'MEM', 'MemCoin'], + 334: ['0x8000014e', 'CS', 'Credits'], + 335: ['0x8000014f', 'SWIFT', 'SwiftCash'], + 336: ['0x80000150', 'FIX', 'FIX'], + 337: ['0x80000151', 'CPC', 'CPChain'], + 338: ['0x80000152', 'VGO', 'VirtualGoodsToken'], + 339: ['0x80000153', 'DVT', 'DeVault'], + 340: ['0x80000154', 'N8V', 'N8VCoin'], + 341: ['0x80000155', 'MTNS', 'OmotenashiCoin'], + 342: ['0x80000156', 'BLAST', 'BLAST'], + 343: ['0x80000157', 'DCT', 'DECENT'], + 344: ['0x80000158', 'AUX', 'Auxilium'], + 345: ['0x80000159', 'USDP', 'USDP'], + 346: ['0x8000015a', 'HTDF', 'HTDF'], + 347: ['0x8000015b', 'YEC', 'Ycash'], + 348: ['0x8000015c', 'QLC', 'QLC Chain'], + 349: ['0x8000015d', 'TEA', 'Icetea Blockchain'], + 350: ['0x8000015e', 'ARW', 'ArrowChain'], + 351: ['0x8000015f', 'MDM', 'Medium'], + 352: ['0x80000160', 'CYB', 'Cybex'], + 353: ['0x80000161', 'LTO', 'LTO Network'], + 354: ['0x80000162', 'DOT', 'Polkadot'], + 355: ['0x80000163', 'AEON', 'Aeon'], + 356: ['0x80000164', 'RES', 'Resistance'], + 357: ['0x80000165', 'AYA', 'Aryacoin'], + 358: ['0x80000166', 'DAPS', 'Dapscoin'], + 359: ['0x80000167', 'CSC', 'CasinoCoin'], + 360: ['0x80000168', 'VSYS', 'V Systems'], + 361: ['0x80000169', 'NOLLAR', 'Nollar'], + 362: ['0x8000016a', 'XNOS', 'NOS'], + 363: ['0x8000016b', 'CPU', 'CPUchain'], + 364: ['0x8000016c', 'LAMB', 'Lambda Storage Chain'], + 365: ['0x8000016d', 'VCT', 'ValueCyber'], + 366: ['0x8000016e', 'CZR', 'Canonchain'], + 367: ['0x8000016f', 'ABBC', 'ABBC'], + 368: ['0x80000170', 'HET', 'HET'], + 369: ['0x80000171', 'XAS', 'Asch'], + 370: ['0x80000172', 'VDL', 'Vidulum'], + 371: ['0x80000173', 'MED', 'MediBloc'], + 372: ['0x80000174', 'ZVC', 'ZVChain'], + 373: ['0x80000175', 'VESTX', 'Vestx'], + 374: ['0x80000176', 'DBT', 'DarkBit'], + 375: ['0x80000177', 'SEOS', 'SuperEOS'], + 376: ['0x80000178', 'MXW', 'Maxonrow'], + 377: ['0x80000179', 'ZNZ', 'ZENZO'], + 378: ['0x8000017a', 'XCX', 'XChain'], + 379: ['0x8000017b', 'SOX', 'SonicX'], + 380: ['0x8000017c', 'NYZO', 'Nyzo'], + 381: ['0x8000017d', 'ULC', 'ULCoin'], + 382: ['0x8000017e', 'RYO', 'Ryo Currency'], + 383: ['0x8000017f', 'KAL', 'Kaleidochain'], + 384: ['0x80000180', 'XSN', 'Stakenet'], + 385: ['0x80000181', 'DOGEC', 'DogeCash'], + 386: ['0x80000182', 'BMV', "Bitcoin Matteo\\'s Vision"], + 387: ['0x80000183', 'QBC', 'Quebecoin'], + 388: ['0x80000184', 'IMG', 'ImageCoin'], + 389: ['0x80000185', 'QOS', 'QOS'], + 390: ['0x80000186', 'PKT', 'PKT'], + 391: ['0x80000187', 'LHD', 'LitecoinHD'], + 392: ['0x80000188', 'CENNZ', 'CENNZnet'], + 393: ['0x80000189', 'HSN', 'Hyper Speed Network'], + 394: ['0x8000018a', 'CRO', 'Crypto Chain'], + 395: ['0x8000018b', 'UMBRU', 'Umbru'], + 396: ['0x8000018c', 'EVER', 'Everscale'], + 397: ['0x8000018d', 'NEAR', 'NEAR Protocol'], + 398: ['0x8000018e', 'XPC', 'XPChain'], + 399: ['0x8000018f', 'ZOC', '01coin'], + 400: ['0x80000190', 'NIX', 'NIX'], + 401: ['0x80000191', 'UC', 'Utopiacoin'], + 402: ['0x80000192', 'GALI', 'Galilel'], + 403: ['0x80000193', 'OLT', 'Oneledger'], + 404: ['0x80000194', 'XBI', 'XBI'], + 405: ['0x80000195', 'DONU', 'DONU'], + 406: ['0x80000196', 'EARTHS', 'Earths'], + 407: ['0x80000197', 'HDD', 'HDDCash'], + 408: ['0x80000198', 'SUGAR', 'Sugarchain'], + 409: ['0x80000199', 'AILE', 'AileCoin'], + 410: ['0x8000019a', 'TENT', 'TENT'], + 411: ['0x8000019b', 'TAN', 'Tangerine Network'], + 412: ['0x8000019c', 'AIN', 'AIN'], + 413: ['0x8000019d', 'MSR', 'Masari'], + 414: ['0x8000019e', 'SUMO', 'Sumokoin'], + 415: ['0x8000019f', 'ETN', 'Electroneum'], + 416: ['0x800001a0', 'BYTZ', 'BYTZ'], + 417: ['0x800001a1', 'WOW', 'Wownero'], + 418: ['0x800001a2', 'XTNC', 'XtendCash'], + 419: ['0x800001a3', 'LTHN', 'Lethean'], + 420: ['0x800001a4', 'NODE', 'NodeHost'], + 421: ['0x800001a5', 'AGM', 'Argoneum'], + 422: ['0x800001a6', 'CCX', 'Conceal Network'], + 423: ['0x800001a7', 'TNET', 'Title Network'], + 424: ['0x800001a8', 'TELOS', 'TelosCoin'], + 425: ['0x800001a9', 'AION', 'Aion'], + 426: ['0x800001aa', 'BC', 'Bitcoin Confidential'], + 427: ['0x800001ab', 'KTV', 'KmushiCoin'], + 428: ['0x800001ac', 'ZCR', 'ZCore'], + 429: ['0x800001ad', 'ERG', 'Ergo'], + 430: ['0x800001ae', 'PESO', 'Criptopeso'], + 431: ['0x800001af', 'BTC2', 'Bitcoin 2'], + 432: ['0x800001b0', 'XRPHD', 'XRPHD'], + 433: ['0x800001b1', 'WE', 'WE Coin'], + 434: ['0x800001b2', 'KSM', 'Kusama'], + 435: ['0x800001b3', 'PCN', 'Peepcoin'], + 436: ['0x800001b4', 'NCH', 'NetCloth'], + 437: ['0x800001b5', 'ICU', 'CHIPO'], + 438: ['0x800001b6', 'FNSA', 'FINSCHIA'], + 439: ['0x800001b7', 'DTP', 'DeVault Token Protocol'], + 440: ['0x800001b8', 'BTCR', 'Bitcoin Royale'], + 441: ['0x800001b9', 'AERGO', 'AERGO'], + 442: ['0x800001ba', 'XTH', 'Dothereum'], + 443: ['0x800001bb', 'LV', 'Lava'], + 444: ['0x800001bc', 'PHR', 'Phore'], + 445: ['0x800001bd', 'VITAE', 'Vitae'], + 446: ['0x800001be', 'COCOS', 'Cocos - BCX'], + 447: ['0x800001bf', 'DIN', 'Dinero'], + 448: ['0x800001c0', 'SPL', 'Simplicity'], + 449: ['0x800001c1', 'YCE', 'MYCE'], + 450: ['0x800001c2', 'XLR', 'Solaris'], + 451: ['0x800001c3', 'KTS', 'Klimatas'], + 452: ['0x800001c4', 'DGLD', 'DGLD'], + 453: ['0x800001c5', 'XNS', 'Insolar'], + 454: ['0x800001c6', 'EM', 'EMPOW'], + 455: ['0x800001c7', 'SHN', 'ShineBlocks'], + 456: ['0x800001c8', 'SEELE', 'Seele'], + 457: ['0x800001c9', 'AE', 'æternity'], + 458: ['0x800001ca', 'ODX', 'ObsidianX'], + 459: ['0x800001cb', 'KAVA', 'Kava'], + 460: ['0x800001cc', 'GLEEC', 'GLEEC'], + 461: ['0x800001cd', 'FIL', 'Filecoin'], + 462: ['0x800001ce', 'RUTA', 'Rutanio'], + 463: ['0x800001cf', 'CSDT', 'CSDT'], + 464: ['0x800001d0', 'ETI', 'EtherInc'], + 465: ['0x800001d1', 'ZSLP', 'Zclassic Simple Ledger Protocol'], + 466: ['0x800001d2', 'ERE', 'EtherCore'], + 467: ['0x800001d3', 'DX', 'DxChain Token'], + 468: ['0x800001d4', 'CPS', 'Capricoin+'], + 469: ['0x800001d5', 'BTH', 'Bithereum'], + 470: ['0x800001d6', 'MESG', 'MESG'], + 471: ['0x800001d7', 'FIMK', 'FIMK'], + 472: ['0x800001d8', 'AR', 'Arweave'], + 473: ['0x800001d9', 'OGO', 'Origo'], + 474: ['0x800001da', 'ROSE', 'Oasis Network'], + 475: ['0x800001db', 'BARE', 'BARE Network'], + 476: ['0x800001dc', 'GLEEC', 'GleecBTC'], + 477: ['0x800001dd', 'CLR', 'Color Coin'], + 478: ['0x800001de', 'RNG', 'Ring'], + 479: ['0x800001df', 'OLO', 'Tool Global'], + 480: ['0x800001e0', 'PEXA', 'Pexa'], + 481: ['0x800001e1', 'MOON', 'Mooncoin'], + 482: ['0x800001e2', 'OCEAN', 'Ocean Protocol'], + 483: ['0x800001e3', 'BNT', 'Bluzelle Native'], + 484: ['0x800001e4', 'AMO', 'AMO Blockchain'], + 485: ['0x800001e5', 'FCH', 'FreeCash'], + 486: ['0x800001e6', 'LAT', 'PlatON'], + 487: ['0x800001e7', 'COIN', 'Bitcoin Bank'], + 488: ['0x800001e8', 'VEO', 'Amoveo'], + 489: ['0x800001e9', 'CCA', 'Counos Coin'], + 490: ['0x800001ea', 'GFN', 'Graphene'], + 491: ['0x800001eb', 'BIP', 'Minter Network'], + 492: ['0x800001ec', 'KPG', 'Kunpeng Network'], + 493: ['0x800001ed', 'FIN', 'FINL Chain'], + 494: ['0x800001ee', 'BAND', 'Band'], + 495: ['0x800001ef', 'DROP', 'Dropil'], + 496: ['0x800001f0', 'BHT', 'Bluehelix Chain'], + 497: ['0x800001f1', 'LYRA', 'Scrypta'], + 498: ['0x800001f2', 'CS', 'Credits'], + 499: ['0x800001f3', 'RUPX', 'Rupaya'], + 500: ['0x800001f4', 'THETA', 'Theta'], + 501: ['0x800001f5', 'SOL', 'Solana'], + 502: ['0x800001f6', 'THT', 'ThoughtAI'], + 503: ['0x800001f7', 'CFX', 'Conflux'], + 504: ['0x800001f8', 'KUMA', 'Kumacoin'], + 505: ['0x800001f9', 'HASH', 'Provenance'], + 506: ['0x800001fa', 'CSPR', 'Casper'], + 507: ['0x800001fb', 'EARTH', 'EARTH'], + 508: ['0x800001fc', 'EGLD', 'MultiversX'], + 509: ['0x800001fd', 'CHI', 'Xaya'], + 510: ['0x800001fe', 'KOTO', 'Koto'], + 511: ['0x800001ff', 'OTC', 'θ'], + 512: ['0x80000200', 'RXD', 'Radiant'], + 513: ['0x80000201', 'SEELEN', 'Seele - N'], + 514: ['0x80000202', 'AETH', 'AETH'], + 515: ['0x80000203', 'DNA', 'Idena'], + 516: ['0x80000204', 'VEE', 'Virtual Economy Era'], + 517: ['0x80000205', 'SIERRA', 'SierraCoin'], + 518: ['0x80000206', 'LET', 'Linkeye'], + 519: ['0x80000207', 'BSC', 'Bitcoin Smart Contract'], + 520: ['0x80000208', 'BTCV', 'BitcoinVIP'], + 521: ['0x80000209', 'ABA', 'Dabacus'], + 522: ['0x8000020a', 'SCC', 'StakeCubeCoin'], + 523: ['0x8000020b', 'EDG', 'Edgeware'], + 524: ['0x8000020c', 'AMS', 'AmsterdamCoin'], + 525: ['0x8000020d', 'GOSS', 'GOSSIP Coin'], + 526: ['0x8000020e', 'BU', 'BUMO'], + 527: ['0x8000020f', 'GRAM', 'GRAM'], + 528: ['0x80000210', 'YAP', 'Yapstone'], + 529: ['0x80000211', 'SCRT', 'Secret Network'], + 530: ['0x80000212', 'NOVO', 'Novo'], + 531: ['0x80000213', 'GHOST', 'Ghost'], + 532: ['0x80000214', 'HST', 'HST'], + 533: ['0x80000215', 'PRJ', 'ProjectCoin'], + 534: ['0x80000216', 'YOU', 'YOUChain'], + 535: ['0x80000217', 'XHV', 'Haven Protocol'], + 536: ['0x80000218', 'BYND', 'Beyondcoin'], + 537: ['0x80000219', 'JOYS', 'Joys Digital'], + 538: ['0x8000021a', 'VAL', 'Valorbit'], + 539: ['0x8000021b', 'FLOW', 'Flow'], + 540: ['0x8000021c', 'SMESH', 'Spacemesh Coin'], + 541: ['0x8000021d', 'SCDO', 'SCDO'], + 542: ['0x8000021e', 'IQS', 'IQ - Cash'], + 543: ['0x8000021f', 'BIND', 'Compendia'], + 544: ['0x80000220', 'COINEVO', 'Coinevo'], + 545: ['0x80000221', 'SCRIBE', 'Scribe'], + 546: ['0x80000222', 'HYN', 'Hyperion'], + 547: ['0x80000223', 'BHP', 'BHP'], + 548: ['0x80000224', 'BBC', 'BigBang Core'], + 549: ['0x80000225', 'MKF', 'MarketFinance'], + 550: ['0x80000226', 'XDC', 'XinFin'], + 551: ['0x80000227', 'STR', 'Straightedge'], + 552: ['0x80000228', 'SUM', 'Sumcoin'], + 553: ['0x80000229', 'HBC', 'HuobiChain'], + 554: ['0x8000022a', 'reserved'], + 555: ['0x8000022b', 'BCS', 'Bitcoin Smart'], + 556: ['0x8000022c', 'KTS', 'Kratos'], + 557: ['0x8000022d', 'LKR', 'Lkrcoin'], + 558: ['0x8000022e', 'TAO', 'Tao'], + 559: ['0x8000022f', 'XWC', 'Whitecoin'], + 560: ['0x80000230', 'DEAL', 'DEAL'], + 561: ['0x80000231', 'NTY', 'Nexty'], + 562: ['0x80000232', 'TOP', 'TOP NetWork'], + 563: ['0x80000233,---', 'reserved'], + 564: ['0x80000234', 'AG', 'Agoric'], + 565: ['0x80000235', 'CICO', 'Coinicles'], + 566: ['0x80000236', 'IRIS', 'Irisnet'], + 567: ['0x80000237', 'NCG', 'Nine Chronicles'], + 568: ['0x80000238', 'LRG', 'Large Coin'], + 569: ['0x80000239', 'SERO', 'Super Zero Protocol'], + 570: ['0x8000023a', 'BDX', 'Beldex'], + 571: ['0x8000023b', 'CCXX', 'Counos X'], + 572: ['0x8000023c', 'SLS', 'Saluscoin'], + 573: ['0x8000023d', 'SRM', 'Serum'], + 574: ['0x8000023e,---', 'reserved'], + 575: ['0x8000023f', 'VIVT', 'VIDT Datalink'], + 576: ['0x80000240', 'BPS', 'BitcoinPoS'], + 577: ['0x80000241', 'NKN', 'NKN'], + 578: ['0x80000242', 'ICL', 'ILCOIN'], + 579: ['0x80000243', 'BONO', 'Bonorum'], + 580: ['0x80000244', 'PLC', 'PLATINCOIN'], + 581: ['0x80000245', 'DUN', 'Dune'], + 582: ['0x80000246', 'DMCH', 'Darmacash'], + 583: ['0x80000247', 'CTC', 'Creditcoin'], + 584: ['0x80000248', 'KELP', 'Haidai Network'], + 585: ['0x80000249', 'GBCR', 'GoldBCR'], + 586: ['0x8000024a', 'XDAG', 'XDAG'], + 587: ['0x8000024b', 'PRV', 'Incognito Privacy'], + 588: ['0x8000024c', 'SCAP', 'SafeCapital'], + 589: ['0x8000024d', 'TFUEL', 'Theta Fuel'], + 590: ['0x8000024e', 'GTM', 'Gentarium'], + 591: ['0x8000024f', 'RNL', 'RentalChain'], + 592: ['0x80000250', 'GRIN', 'Grin'], + 593: ['0x80000251', 'MWC', 'MimbleWimbleCoin'], + 594: ['0x80000252', 'DOCK', 'Dock'], + 595: ['0x80000253', 'POLYX', 'Polymesh'], + 596: ['0x80000254', 'DIVER', 'Divergenti'], + 597: ['0x80000255', 'XEP', 'Electra Protocol'], + 598: ['0x80000256', 'APN', 'Apron'], + 599: ['0x80000257', 'TFC', 'Turbo File Coin'], + 600: ['0x80000258', 'UTE', 'Unit - e'], + 601: ['0x80000259', 'MTC', 'Metacoin'], + 602: ['0x8000025a', 'NC', 'NobodyCash'], + 603: ['0x8000025b', 'XINY', 'Xinyuehu'], + 604: ['0x8000025c', 'DYN', 'Dynamo'], + 605: ['0x8000025d', 'BUFS', 'Buffer'], + 606: ['0x8000025e', 'STOS', 'Stratos'], + 607: ['0x8000025f', 'TON', 'TON'], + 608: ['0x80000260', 'TAFT', 'TAFT'], + 609: ['0x80000261', 'HYDRA', 'HYDRA'], + 610: ['0x80000262', 'NOR', 'Noir'], + 611: ['0x80000263', undefined, 'Manta Network Private Asset'], + 612: ['0x80000264', undefined, 'Calamari Network Private Asset'], + 613: ['0x80000265', 'WCN', 'Widecoin'], + 614: ['0x80000266', 'OPT', 'Optimistic Ethereum'], + 615: ['0x80000267', 'PSWAP', 'PolkaSwap'], + 616: ['0x80000268', 'VAL', 'Validator'], + 617: ['0x80000269', 'XOR', 'Sora'], + 618: ['0x8000026a', 'SSP', 'SmartShare'], + 619: ['0x8000026b', 'DEI', 'DeimosX'], + 620: ['0x8000026c,---', 'reserved'], + 621: ['0x8000026d', 'ZERO', 'Singularity'], + 622: ['0x8000026e', 'ALPHA', 'AlphaDAO'], + 623: ['0x8000026f', 'BDECO', 'BDCashProtocol Ecosystem'], + 624: ['0x80000270', 'NOBL', 'Nobility'], + 625: ['0x80000271', 'EAST', 'Eastcoin'], + 626: ['0x80000272', 'KDA', 'Kadena'], + 627: ['0x80000273', 'SOUL', 'Phantasma'], + 628: ['0x80000274', 'LORE', 'Gitopia'], + 629: ['0x80000275', 'FNR', 'Fincor'], + 630: ['0x80000276', 'NEXUS', 'Nexus'], + 631: ['0x80000277', 'QTZ', 'Quartz'], + 632: ['0x80000278', 'MAS', 'Massa'], + 633: ['0x80000279', 'CALL', 'Callchain'], + 634: ['0x8000027a', 'VAL', 'Validity'], + 635: ['0x8000027b', 'POKT', 'Pocket Network'], + 636: ['0x8000027c', 'EMIT', 'EMIT'], + 637: ['0x8000027d', 'APTOS', 'Aptos'], + 638: ['0x8000027e', 'ADON', 'ADON'], + 639: ['0x8000027f', 'BTSG', 'BitSong'], + 640: ['0x80000280', 'LFC', 'Leofcoin'], + 641: ['0x80000281', 'KCS', 'KuCoin Shares'], + 642: ['0x80000282', 'KCC', 'KuCoin Community Chain'], + 643: ['0x80000283', 'AZERO', 'Aleph Zero'], + 644: ['0x80000284', 'TREE', 'Tree'], + 645: ['0x80000285', 'LX', 'Lynx'], + 646: ['0x80000286', 'XLN', 'Lunarium'], + 647: ['0x80000287', 'CIC', 'CIC Chain'], + 648: ['0x80000288', 'ZRB', 'Zarb'], + 649: ['0x80000289,---', 'reserved'], + 650: ['0x8000028a', 'UCO', 'Archethic'], + 651: ['0x8000028b', 'SFX', 'Safex Cash'], + 652: ['0x8000028c', 'SFT', 'Safex Token'], + 653: ['0x8000028d', 'WSFX', 'Wrapped Safex Cash'], + 654: ['0x8000028e', 'USDG', 'US Digital Gold'], + 655: ['0x8000028f', 'WMP', 'WAMP'], + 656: ['0x80000290', 'EKTA', 'Ekta'], + 657: ['0x80000291', 'YDA', 'YadaCoin'], + 658: ['0x80000292', 'WHIVE', 'Whive'], + 659: ['0x80000293', 'KOIN', 'Koinos'], + 660: ['0x80000294', 'PIRATE', 'PirateCash'], + 661: ['0x80000295', 'UNQ', 'Unique'], + 662: ['0x80000296', 'ULM', 'UltonSmartchain'], + 663: ['0x80000297', 'SFRX', 'EtherGem Sapphire'], + 664: ['0x80000298', 'BSTY', 'GlobalBoost - Y'], + 665: ['0x80000299', 'IMP', 'Impact Protocol'], + 666: ['0x8000029a', 'ACT', 'Achain'], + 667: ['0x8000029b', 'PRKL', 'Perkle'], + 668: ['0x8000029c', 'SSC', 'SelfSell'], + 669: ['0x8000029d', 'GC', 'GateChain'], + 670: ['0x8000029e', 'PLGR', 'Pledger'], + 671: ['0x8000029f', 'MPLGR', 'Pledger'], + 672: ['0x800002a0', 'KNOX', 'Knox'], + 673: ['0x800002a1', 'ZED', 'ZED'], + 674: ['0x800002a2', 'CNDL', 'Candle'], + 675: ['0x800002a3', 'WLKR', 'Walker Crypto Innovation Index'], + 676: ['0x800002a4', 'WLKRR', 'Walker'], + 677: ['0x800002a5', 'YUNGE', 'Yunge'], + 678: ['0x800002a6', 'Voken', 'Voken'], + 679: ['0x800002a7', 'APL', 'Apollo'], + 680: ['0x800002a8', 'Evrynet', 'Evrynet'], + 681: ['0x800002a9', 'NENG', 'Nengcoin'], + 682: ['0x800002aa', 'CHTA', 'Cheetahcoin'], + 683: ['0x800002ab', 'ALEO', 'Aleo Network'], + 684: ['0x800002ac', 'HMS', 'Hemis'], + 685: ['0x800002ad', 'OAS', 'Oasys'], + 686: ['0x800002ae', 'KAR', 'Karura Network'], + 687: ['0x800002af', 'FLON', 'FullOn Network'], + 688: ['0x800002b0', 'CET', 'CoinEx Chain'], + 689: ['0x800002b1', 'XLINK', 'XLink Chain'], + 690: ['0x800002b2', 'KLV', 'KleverChain'], + 691: ['0x800002b3', 'TNT', 'Tangle'], + 692: ['0x800002b4', 'GTG', 'Gotigin'], + 693: ['0x800002b5', 'NET', 'RealityNet'], + 694: ['0x800002b6', 'VTBC', 'VTB Community'], + 695: ['0x800002b7', 'DIONE', 'Odyssey Chain'], + 696: ['0x800002b8', 'LUM', 'Lumos'], + 697: ['0x800002b9', 'AVA', 'Avalon'], + 698: ['0x800002ba', 'VEIL', 'Veil'], + 699: ['0x800002bb', 'GTB', 'GotaBit'], + 700: ['0x800002bc', 'XDAI', 'xDai'], + 701: ['0x800002bd', 'COM', 'Commercio'], + 702: ['0x800002be', 'CCC', 'Commercio Cash Credit'], + 703: ['0x800002bf', 'SNR', 'Sonr'], + 704: ['0x800002c0', 'RAQ', 'Ra Quantum'], + 705: ['0x800002c1', 'PEG', 'Pegasus Token'], + 706: ['0x800002c2', 'LKG', 'Lionking'], + 707: ['0x800002c3', 'MCOIN', 'Moneta Coin'], + 708: ['0x800002c4,---', 'reserved'], + 709: ['0x800002c5', 'AVAIL', 'Avail'], + 710: ['0x800002c6', 'FURY', 'Highbury'], + 711: ['0x800002c7', 'CHC', 'Chaincoin'], + 712: ['0x800002c8', 'SERF', 'Serfnet'], + 713: ['0x800002c9', 'XTL', 'Katal Chain'], + 714: ['0x800002ca', 'BNB', 'Binance'], + 715: ['0x800002cb', 'SIN', 'Sinovate'], + 716: ['0x800002cc', 'DLN', 'Delion'], + 717: ['0x800002cd', 'BONTE', 'Bontecoin'], + 718: ['0x800002ce', 'PEER', 'Peer'], + 719: ['0x800002cf', 'ZET', 'Zetacoin'], + 720: ['0x800002d0', 'ABY', 'Artbyte'], + 721: ['0x800002d1', 'PGX', 'Mirai Chain'], + 722: ['0x800002d2', 'IL8P', 'InfiniLooP'], + 723: ['0x800002d3', 'VOI', 'Voi'], + 724: ['0x800002d4', 'XVC', 'Vanillacash'], + 725: ['0x800002d5', 'MCX', 'MultiCash'], + 726: ['0x800002d6', 'TARA', 'Taraxa'], + 727: ['0x800002d7', 'BLU', 'BluCrates'], + 728: ['0x800002d8', 'BFC', 'BFC'], + 729: ['0x800002d9'], + 730: ['0x800002da', 'HEALIOS', 'Tenacity'], + 731: ['0x800002db', 'BMK', 'Bitmark'], + 732: ['0x800002dc'], + 733: ['0x800002dd', 'TBC', 'TBChat'], + 734: ['0x800002de', 'DENTX', 'DENTNet'], + 735: ['0x800002df'], + 736: ['0x800002e0'], + 737: ['0x800002e1', 'ATOP', 'Financial Blockchain'], + 738: ['0x800002e2', 'BTE', 'Bitweb'], + 739: ['0x800002e3', 'DPC', 'Dpowcoin (DualPowCoin)'], + 740: ['0x800002e4', 'MDC', 'MyDataCoin'], + 741: ['0x800002e5', 'RIV', 'Rigvid'], + 742: ['0x800002e6'], + 743: ['0x800002e7'], + 744: ['0x800002e8', 'DUSK', 'Dusk'], + 745: ['0x800002e9'], + 746: ['0x800002ea'], + 747: ['0x800002eb', 'CFG', 'Centrifuge'], + 748: ['0x800002ec'], + 749: ['0x800002ed'], + 750: ['0x800002ee', 'XPRT', 'Persistence'], + 751: ['0x800002ef'], + 752: ['0x800002f0'], + 753: ['0x800002f1', undefined, 'Age NIST Encryption'], + 754: ['0x800002f2', undefined, 'Age NIST Encryption'], + 755: ['0x800002f3'], + 756: ['0x800002f4'], + 757: ['0x800002f5', 'HONEY', 'HoneyWood'], + 758: ['0x800002f6', 'XDD', 'XDDCoin'], + 759: ['0x800002f7'], + 760: ['0x800002f8'], + 761: ['0x800002f9'], + 762: ['0x800002fa'], + 763: ['0x800002fb'], + 764: ['0x800002fc'], + 765: ['0x800002fd', 'TGN', 'Tagion'], + 766: ['0x800002fe'], + 767: ['0x800002ff'], + 768: ['0x80000300', 'BALLZ', 'Ballzcoin'], + 769: ['0x80000301'], + 770: ['0x80000302', 'COSA', 'Cosanta'], + 771: ['0x80000303', 'BR', 'BR'], + 772: ['0x80000304'], + 773: ['0x80000305', 'CSB', 'CosmoBliss'], + 774: ['0x80000306'], + 775: ['0x80000307', 'PLSR', 'Pulsar Coin'], + 776: ['0x80000308', 'KEY', 'Keymaker Coin'], + 777: ['0x80000309', 'BTW', 'Bitcoin World'], + 778: ['0x8000030a'], + 779: ['0x8000030b'], + 780: ['0x8000030c', 'PLCUC', 'PLC Ultima Classic'], + 781: ['0x8000030d', 'PLCUX', 'PLC Ultima X'], + 782: ['0x8000030e', 'PLCU', 'PLC Ultima'], + 783: ['0x8000030f', 'SMARTBC', 'SMART Blockchain'], + 784: ['0x80000310', 'SUI', 'Sui'], + 785: ['0x80000311', 'ULTIMA', 'ULTIMA'], + 786: ['0x80000312', 'UIDD', 'UIDD'], + 787: ['0x80000313', 'ACA', 'Acala'], + 788: ['0x80000314', 'BNC', 'Bifrost'], + 789: ['0x80000315', 'TAU', 'Lamden'], + 790: ['0x80000316'], + 791: ['0x80000317'], + 792: ['0x80000318'], + 793: ['0x80000319'], + 794: ['0x8000031a', 'INTR', 'Interlay'], + 795: ['0x8000031b', 'KINT', 'Kintsugi'], + 796: ['0x8000031c'], + 797: ['0x8000031d'], + 798: ['0x8000031e'], + 799: ['0x8000031f', 'PDEX', 'Polkadex'], + 800: ['0x80000320', 'BEET', 'Beetle Coin'], + 801: ['0x80000321', 'DST', 'DSTRA'], + 802: ['0x80000322', 'CY', 'Cyberyen'], + 803: ['0x80000323', 'RYME', 'Ryme Network'], + 804: ['0x80000324', 'ZKS', 'zkSync'], + 805: ['0x80000325', 'SCASH', 'Scash'], + 806: ['0x80000326'], + 807: ['0x80000327'], + 808: ['0x80000328', 'QVT', 'Qvolta'], + 809: ['0x80000329', 'SDN', 'Shiden Network'], + 810: ['0x8000032a', 'ASTR', 'Astar Network'], + 811: ['0x8000032b', '---', 'reserved'], + 812: ['0x8000032c'], + 813: ['0x8000032d', 'MEER', 'Qitmeer'], + 814: ['0x8000032e'], + 815: ['0x8000032f', 'FACT', 'ImFACT'], + 816: ['0x80000330', 'FSC', 'FSC'], + 817: ['0x80000331'], + 818: ['0x80000332', 'VET', 'VeChain Token'], + 819: ['0x80000333', 'REEF', 'Reef'], + 820: ['0x80000334', 'CLO', 'Callisto'], + 821: ['0x80000335'], + 822: ['0x80000336', 'BDB', 'BigchainDB'], + 823: ['0x80000337'], + 824: ['0x80000338', 'RBNT', 'Redbelly Network'], + 825: ['0x80000339'], + 826: ['0x8000033a'], + 827: ['0x8000033b', 'ACE', 'Endurance'], + 828: ['0x8000033c', 'CCN', 'ComputeCoin'], + 829: ['0x8000033d', 'BBA', 'BBACHAIN'], + 830: ['0x8000033e'], + 831: ['0x8000033f', 'CRUZ', 'cruzbit'], + 832: ['0x80000340', 'SAPP', 'Sapphire'], + 833: ['0x80000341', 777, 'Jackpot'], + 834: ['0x80000342', 'KYAN', 'Kyanite'], + 835: ['0x80000343', 'AZR', 'Azzure'], + 836: ['0x80000344', 'CFL', 'CryptoFlow'], + 837: ['0x80000345', 'DASHD', 'Dash Diamond'], + 838: ['0x80000346', 'TRTT', 'Trittium'], + 839: ['0x80000347', 'UCR', 'Ultra Clear'], + 840: ['0x80000348', 'PNY', 'Peony'], + 841: ['0x80000349', 'BECN', 'Beacon'], + 842: ['0x8000034a', 'MONK', 'Monk'], + 843: ['0x8000034b', 'SAGA', 'CryptoSaga'], + 844: ['0x8000034c', 'SUV', 'Suvereno'], + 845: ['0x8000034d', 'ESK', 'EskaCoin'], + 846: ['0x8000034e', 'OWO', 'OneWorld Coin'], + 847: ['0x8000034f', 'PEPS', 'PEPS Coin'], + 848: ['0x80000350', 'BIR', 'Birake'], + 849: ['0x80000351', 'MOBIC', 'MobilityCoin'], + 850: ['0x80000352', 'FLS', 'Flits'], + 851: ['0x80000353', 'FRECO', 'Freco'], + 852: ['0x80000354', 'DSM', 'Desmos'], + 853: ['0x80000355', 'PRCY', 'PRCY Coin'], + 854: ['0x80000356'], + 855: ['0x80000357'], + 856: ['0x80000358'], + 857: ['0x80000359'], + 858: ['0x8000035a', 'HVH', 'HAVAH'], + 859: ['0x8000035b'], + 860: ['0x8000035c', 'XBIT', 'XBIT Coin'], + 861: ['0x8000035d'], + 862: ['0x8000035e'], + 863: ['0x8000035f'], + 864: ['0x80000360', 'CVM', 'Convex'], + 865: ['0x80000361'], + 866: ['0x80000362', 'MOB', 'MobileCoin'], + 867: ['0x80000363'], + 868: ['0x80000364', 'IF', 'Infinitefuture'], + 869: ['0x80000365'], + 870: ['0x80000366'], + 871: ['0x80000367'], + 872: ['0x80000368'], + 873: ['0x80000369', 'QUORUM', 'Quorum'], + 874: ['0x8000036a'], + 875: ['0x8000036b'], + 876: ['0x8000036c'], + 877: ['0x8000036d', 'NAM', 'Namada'], + 878: ['0x8000036e', 'SCR', 'Scorum Network'], + 879: ['0x8000036f'], + 880: ['0x80000370', 'LUM', 'Lum Network'], + 881: ['0x80000371'], + 882: ['0x80000372'], + 883: ['0x80000373', 'ZBC', 'ZooBC'], + 884: ['0x80000374'], + 885: ['0x80000375'], + 886: ['0x80000376', 'ADF', 'AD Token'], + 887: ['0x80000377'], + 888: ['0x80000378', 'NEO', 'NEO'], + 889: ['0x80000379', 'TOMO', 'TOMO'], + 890: ['0x8000037a', 'XSEL', 'Seln'], + 891: ['0x8000037b'], + 892: ['0x8000037c'], + 893: ['0x8000037d'], + 894: ['0x8000037e'], + 895: ['0x8000037f'], + 896: ['0x80000380', 'LKSC', 'LKSCoin'], + 897: ['0x80000381'], + 898: ['0x80000382', 'AS', 'Assetchain'], + 899: ['0x80000383', 'XEC', 'eCash'], + 900: ['0x80000384', 'LMO', 'Lumeneo'], + 901: ['0x80000385', 'NXT', 'NxtMeta'], + 902: ['0x80000386'], + 903: ['0x80000387'], + 904: ['0x80000388', 'HNT', 'Helium'], + 905: ['0x80000389'], + 906: ['0x8000038a', 'XPX', 'Sirius'], + 907: ['0x8000038b', 'FIS', 'StaFi'], + 908: ['0x8000038c'], + 909: ['0x8000038d', 'SGE', 'Saage'], + 910: ['0x8000038e'], + 911: ['0x8000038f', 'GERT', 'Gert'], + 912: ['0x80000390'], + 913: ['0x80000391', 'VARA', 'Vara Network'], + 914: ['0x80000392'], + 915: ['0x80000393'], + 916: ['0x80000394', 'META', 'Metadium'], + 917: ['0x80000395', 'FRA', 'Findora'], + 918: ['0x80000396'], + 919: ['0x80000397', 'CCD', 'Concordium'], + 920: ['0x80000398'], + 921: ['0x80000399', 'AVN', 'Avian Network'], + 922: ['0x8000039a'], + 923: ['0x8000039b'], + 924: ['0x8000039c'], + 925: ['0x8000039d', 'DIP', 'Dipper Network'], + 926: ['0x8000039e'], + 927: ['0x8000039f'], + 928: ['0x800003a0', 'GHM', 'HermitMatrixNetwork'], + 929: ['0x800003a1'], + 930: ['0x800003a2'], + 931: ['0x800003a3', 'RUNE', 'THORChain (RUNE)'], + 932: ['0x800003a4'], + 933: ['0x800003a5'], + 934: ['0x800003a6'], + 935: ['0x800003a7'], + 936: ['0x800003a8'], + 937: ['0x800003a9'], + 938: ['0x800003aa', 'MGO', 'Mango Network'], + 939: ['0x800003ab', 'AB', 'Argot Protocol'], + 940: ['0x800003ac'], + 941: ['0x800003ad', '---', 'reserved'], + 942: ['0x800003ae', 'KCN', 'Kylacoin'], + 943: ['0x800003af', 'LCN', 'Lyncoin'], + 944: ['0x800003b0'], + 945: ['0x800003b1', 'UNLOCK', 'Jasiri protocol'], + 946: ['0x800003b2'], + 947: ['0x800003b3'], + 948: ['0x800003b4'], + 949: ['0x800003b5'], + 950: ['0x800003b6'], + 951: ['0x800003b7'], + 952: ['0x800003b8'], + 953: ['0x800003b9'], + 954: ['0x800003ba'], + 955: ['0x800003bb', 'LTP', 'LifetionCoin'], + 956: ['0x800003bc'], + 957: ['0x800003bd'], + 958: ['0x800003be', undefined, 'KickSoccer'], + 959: ['0x800003bf'], + 960: ['0x800003c0', 'VKAX', 'Vkax'], + 961: ['0x800003c1'], + 962: ['0x800003c2'], + 963: ['0x800003c3'], + 964: ['0x800003c4'], + 965: ['0x800003c5'], + 966: ['0x800003c6', 'MATIC', 'Matic'], + 967: ['0x800003c7'], + 968: ['0x800003c8', 'UNW', 'UNW'], + 969: ['0x800003c9', 'QI', 'Quai Network'], + 970: ['0x800003ca', 'TWINS', 'TWINS'], + 971: ['0x800003cb'], + 972: ['0x800003cc'], + 973: ['0x800003cd'], + 974: ['0x800003ce'], + 975: ['0x800003cf'], + 976: ['0x800003d0'], + 977: ['0x800003d1', 'TLOS', 'Telos'], + 978: ['0x800003d2'], + 979: ['0x800003d3'], + 980: ['0x800003d4'], + 981: ['0x800003d5', 'TAFECO', 'Taf ECO Chain'], + 982: ['0x800003d6'], + 983: ['0x800003d7'], + 984: ['0x800003d8'], + 985: ['0x800003d9', 'AU', 'Autonomy'], + 986: ['0x800003da'], + 987: ['0x800003db', 'VCG', 'VipCoin'], + 988: ['0x800003dc', 'XAZAB', 'Xazab core'], + 989: ['0x800003dd', 'AIOZ', 'AIOZ'], + 990: ['0x800003de', 'CORE', 'Coreum'], + 991: ['0x800003df', 'PEC', 'Phoenix'], + 992: ['0x800003e0', 'UNT', 'Unit'], + 993: ['0x800003e1', 'XRB', 'X Currency'], + 994: ['0x800003e2', 'QUAI', 'Quai Network'], + 995: ['0x800003e3', 'CAPS', 'Ternoa'], + 996: ['0x800003e4', 'OKT', 'OKChain Token'], + 997: ['0x800003e5', 'SUM', 'Solidum'], + 998: ['0x800003e6', 'LBTC', 'Lightning Bitcoin'], + 999: ['0x800003e7', 'BCD', 'Bitcoin Diamond'], + 1000: ['0x800003e8', 'BTN', 'Bitcoin New'], + 1001: ['0x800003e9', 'TT', 'ThunderCore'], + 1002: ['0x800003ea', 'BKT', 'BanKitt'], + 1003: ['0x800003eb', 'NODL', 'Nodle'], + 1004: ['0x800003ec', 'PCOIN', 'PCOIN'], + 1005: ['0x800003ed', 'TAO', 'Bittensor'], + 1006: ['0x800003ee', 'HSK', 'HashKey Chain'], + 1007: ['0x800003ef', 'FTM', 'Fantom'], + 1008: ['0x800003f0', 'RPG', 'RPG'], + 1009: ['0x800003f1', 'LAKE', 'iconLake'], + 1010: ['0x800003f2', 'HT', 'Huobi ECO Chain'], + 1011: ['0x800003f3', 'ELV', 'Eluvio'], + 1012: ['0x800003f4', 'JOC', 'Japan Open Chain'], + 1013: ['0x800003f5', 'BIC', 'Beincrypto'], + 1014: ['0x800003f6', 'JOY', 'Joystream'], + 1015: ['0x800003f7', 'ZCX', 'ZEN Exchange Token'], + 1016: ['0x800003f8', '---', 'reserved'], + 1020: ['0x800003fc', 'EVC', 'Evrice'], + 1022: ['0x800003fe', 'XRD', 'Radix DLT'], + 1023: ['0x800003ff', 'ONE', 'HARMONY-ONE (Legacy)'], + 1024: ['0x80000400', 'ONT', 'Ontology'], + 1025: ['0x80000401', 'CZZ', 'Classzz'], + 1026: ['0x80000402', 'KEX', 'Kira Exchange Token'], + 1027: ['0x80000403', 'MCM', 'Mochimo'], + 1028: ['0x80000404', 'PLS', 'Pulse Coin'], + 1032: ['0x80000408', 'BTCR', 'BTCR'], + 1042: ['0x80000412', 'MFID', 'Moonfish ID'], + 1111: ['0x80000457', 'BBC', 'Big Bitcoin'], + 1116: ['0x8000045c', 'CORE', 'Core'], + 1120: ['0x80000460', 'RISE', 'RISE'], + 1122: ['0x80000462', 'CMT', 'CyberMiles Token'], + 1128: ['0x80000468', 'ETSC', 'Ethereum Social'], + 1129: ['0x80000469', 'DFI', 'DeFiChain'], + 1130: ['0x8000046a', 'DFI', 'DeFiChain EVM Network'], + 1137: ['0x80000471', '$DAG', 'Constellation Labs'], + 1145: ['0x80000479', 'CDY', 'Bitcoin Candy'], + 1155: ['0x80000483', 'ENJ', 'Enjin Coin'], + 1170: ['0x80000492', 'HOO', 'Hoo Smart Chain'], + 1234: ['0x800004d2', 'ALPH', 'Alephium'], + 1236: ['0x800004d4', undefined, 'Masca'], + 1237: ['0x800004d5', undefined, 'Nostr'], + 1280: ['0x80000500', undefined, 'Kudos Setler'], + 1284: ['0x80000504', 'GLMR', 'Moonbeam'], + 1285: ['0x80000505', 'MOVR', 'Moonriver'], + 1286: ['0x80000506', 'DSG', 'Dessage Social Protocol'], + 1298: ['0x80000512', 'WPC', 'Wpc'], + 1308: ['0x8000051c', 'WEI', 'WEI'], + 1312: ['0x80000520', 'BITS', 'Entropy'], + 1337: ['0x80000539', 'DFC', 'Defcoin'], + 1338: ['0x8000053a', 'IRON', 'Iron Fish'], + 1348: ['0x80000544', 'ISLM', 'IslamicCoin'], + 1397: ['0x80000575', 'HYC', 'Hycon'], + 1410: ['0x80000582', 'TENTSLP', 'TENT Simple Ledger Protocol'], + 1510: ['0x800005e6', 'XSC', 'XT Smart Chain'], + 1512: ['0x800005e8', 'AAC', 'Double-A Chain'], + 1524: ['0x800005f4', undefined, 'Taler'], + 1533: ['0x800005fd', 'BEAM', 'Beam'], + 1536: ['0x80000600', 'GAS', 'BubiChain'], + 1540: ['0x80000604', 'ATHENA', 'Athena'], + 1551: ['0x8000060f', 'SDK', 'Sovereign SDK'], + 1555: ['0x80000613', 'APC', 'Apc Chain'], + 1616: ['0x80000650', 'ELF', 'AELF'], + 1618: ['0x80000652', 'AUDL', 'AUDL'], + 1620: ['0x80000654', 'ATH', 'Atheios'], + 1627: ['0x8000065b', 'LUME', 'Lume Web'], + 1642: ['0x8000066a', 'NEW', 'Newton'], + 1657: ['0x80000679', 'BTA', 'Btachain'], + 1668: ['0x80000684', 'NEOX', 'Neoxa'], + 1669: ['0x80000685', 'MEWC', 'Meowcoin'], + 1688: ['0x80000698', 'BCX', 'BitcoinX'], + 1729: ['0x800006c1', 'XTZ', 'Tezos'], + 1776: ['0x800006f0', 'LBTC', 'Liquid BTC'], + 1777: ['0x800006f1', 'BBP', 'Biblepay'], + 1784: ['0x800006f8', 'JPYS', 'JPY Stablecoin'], + 1789: ['0x800006fd', 'VEGA', 'Vega Protocol'], + 1815: ['0x80000717', 'ADA', 'Cardano'], + 1818: ['0x8000071a', 'CUBE', 'Cube Chain Native Token'], + 1856: ['0x80000743', 'TES', 'Teslacoin'], + 1888: ['0x80000760', 'ZTX', 'Zetrix'], + 1899: ['0x8000076b', 'XEC', 'eCash token'], + 1900: ['0x8000076c', 'XNA', 'Neurai'], + 1901: ['0x8000076d', 'CLC', 'Classica'], + 1907: ['0x80000773', 'BITCI', 'Bitcicoin'], + 1918: ['0x8000077e', 'BKC', 'Briskcoin'], + 1919: ['0x8000077f', 'VIPS', 'VIPSTARCOIN'], + 1926: ['0x80000786', 'CITY', 'City Coin'], + 1951: ['0x8000079f', 'ESA', 'Esa'], + 1952: ['0x800007a0', 'ESC', 'EsaCoin'], + 1955: ['0x800007a3', 'XX', 'xx coin'], + 1977: ['0x800007b9', 'XMX', 'Xuma'], + 1984: ['0x800007c0', 'TRTL', 'TurtleCoin'], + 1985: ['0x800007c1', 'SLRT', 'Solarti Chain'], + 1986: ['0x800007c2', 'QTH', 'Qing Tong Horizon'], + 1987: ['0x800007c3', 'EGEM', 'EtherGem'], + 1988: ['0x800007c4', 'MIRA', 'Mira Chain'], + 1989: ['0x800007c5', 'HODL', 'HOdlcoin'], + 1990: ['0x800007c6', 'PHL', 'Placeholders'], + 1991: ['0x800007c7', 'SC', 'Sia'], + 1996: ['0x800007cc', 'MYT', 'Mineyourtime'], + 1997: ['0x800007cd', 'POLIS', 'Polis'], + 1998: ['0x800007ce', 'XMCC', 'Monoeci'], + 1999: ['0x800007cf', 'COLX', 'ColossusXT'], + 2000: ['0x800007d0', 'GIN', 'GinCoin'], + 2001: ['0x800007d1', 'MNP', 'MNPCoin'], + 2002: ['0x800007d2', 'MLN', 'Miraland'], + 2015: ['0x800007df', 'TEER', 'Integritee'], + 2017: ['0x800007e1', 'KIN', 'Kin'], + 2018: ['0x800007e2', 'EOSC', 'EOSClassic'], + 2019: ['0x800007e3', 'GBT', 'GoldBean Token'], + 2020: ['0x800007e4', 'PKC', 'PKC'], + 2021: ['0x800007e5', 'SKT', 'Sukhavati'], + 2024: ['0x800007e8', 'USBC', 'Universal Ledger USBC'], + 2022: ['0x800007e6', 'XHT', 'Xinghuo Token'], + 2023: ['0x800007e7', 'COC', 'Chat On Chain'], + 2025: ['0x800007e9', 'ROCK', 'Zenrock Labs'], + 2026: ['0x800007ea', 'ASTRON', 'ASTRON Token'], + 2046: ['0x800007fe', 'ANY', 'Any'], + 2048: ['0x80000800', 'MCASH', 'MCashChain'], + 2049: ['0x80000801', 'TRUE', 'TrueChain'], + 2050: ['0x80000802', 'MOVO', 'Movo Smart Chain'], + 2086: ['0x80000826', 'KILT', 'KILT Spiritnet'], + 2091: ['0x8000082b', 'FRQCY', 'Frequency'], + 2109: ['0x8000083d', 'SAMA', 'Exosama Network'], + 2112: ['0x80000840', 'IoTE', 'IoTE'], + 2125: ['0x8000084d', 'BAY', 'BitBay'], + 2137: ['0x80000859', 'XRG', 'Ergon'], + 2199: ['0x80000897', 'SAMA', 'Moonsama Network'], + 2221: ['0x800008ad', 'ASK', 'ASK'], + 2222: ['0x800008ae', 'CWEB', 'Coinweb'], + 2285: ['0x800008ed', undefined, 'Qiyi Chain'], + 2301: ['0x800008fd', 'QTUM', 'QTUM'], + 2302: ['0x800008fe', 'ETP', 'Metaverse'], + 2303: ['0x800008ff', 'GXC', 'GXChain'], + 2304: ['0x80000900', 'CRP', 'CranePay'], + 2305: ['0x80000901', 'ELA', 'Elastos'], + 2338: ['0x80000922', 'SNOW', 'Snowblossom'], + 2365: ['0x8000093d', 'XIN', 'Mixin'], + 2500: ['0x800009c4', 'NEXI', 'Nexi'], + 2570: ['0x80000a0a', 'AOA', 'Aurora'], + 2686: ['0x80000a7e', 'AIPG', 'AIPowerGrid'], + 2718: ['0x80000a9e', 'NAS', 'Nebulas'], + 2809: ['0x80000af9', 'LAN', 'Lanify'], + 2894: ['0x80000b4e', 'REOSC', 'REOSC Ecosystem'], + 2941: ['0x80000b7d', 'BND', 'Blocknode'], + 3000: ['0x80000bb8', 'SM', 'Stealth Message'], + 3003: ['0x80000bbb', 'LUX', 'LUX'], + 3030: ['0x80000bd6', 'HBAR', 'Hedera HBAR'], + 3077: ['0x80000c05', 'COS', 'Contentos'], + 3276: ['0x80000ccc', 'CCC', 'CodeChain'], + 3344: ['0x80000d10', 'PLMC', 'Polimec'], + 3333: ['0x80000d05', 'SXP', 'Solar'], + 3338: ['0x80000d0a', 'PEAQ', 'peaq'], + 3377: ['0x80000d31', 'ROI', 'ROIcoin'], + 3381: ['0x80000d35', 'DYN', 'Dynamic'], + 3383: ['0x80000d37', 'SEQ', 'Sequence'], + 3434: ['0x80000d6a', 'PEPE', 'Pepecoin Core'], + 3501: ['0x80000dad', 'JFIN', 'JFIN Coin'], + 3552: ['0x80000de0', 'DEO', 'Destocoin'], + 3564: ['0x80000dec', 'DST', 'DeStream'], + 3601: ['0x80000e11', 'CY', 'Cybits'], + 3757: ['0x80000ead', 'MPC', 'Partisia Blockchain'], + 3840: ['0x80000f00', 'RED', 'ReDeFi RED'], + 4040: ['0x80000fc8', 'FC8', 'FCH Network'], + 4096: ['0x80001000', 'YEE', 'YeeCo'], + 4218: ['0x8000107a', 'IOTA', 'IOTA'], + 4219: ['0x8000107b', 'SMR', 'Shimmer'], + 4242: ['0x80001092', 'AXE', 'Axe'], + 4343: ['0x800010f7', 'XYM', 'Symbol'], + 4444: ['0x8000115c', 'C4EI', 'Chain4Energy'], + 4646: ['0x80001226', 'MST', 'MST'], + 4919: ['0x80001337', 'XVM', 'Venidium'], + 4976: ['0x80001370', 'VARA', 'Vara'], + 4999: ['0x80001387', 'BXN', 'BlackFort Exchange Network'], + 5000: ['0x80001388', 'V12', 'Vet The Vote'], + 5006: ['0x8000138e', 'SBC', 'Senior Blockchain'], + 5248: ['0x80001480', 'FIC', 'FIC'], + 5353: ['0x800014e9', 'HNS', 'Handshake'], + 5404: ['0x8000151c', 'ISK', 'ISKRA'], + 5467: ['0x8000155b', 'ALTME', 'ALTME'], + 5555: ['0x800015b3', 'FUND', 'Unification'], + 5757: ['0x8000167d', 'STX', 'Stacks'], + 5895: ['0x80001707', 'VOW', 'VowChain VOW'], + 5920: ['0x80001720', 'SLU', 'SILUBIUM'], + 5995: ['0x8000176B', 'DUSK', 'Dusk Network'], + 6060: ['0x800017ac', 'GO', 'GoChain GO'], + 6144: ['0x80001800', 'DTS', 'Datos'], + 6174: ['0x8000181e', 'MOI', 'My Own Internet'], + 6278: ['0x80001886', 'STEAMX', 'Rails Network Mainnet'], + 6532: ['0x80001984', 'UM', 'Penumbra'], + 6599: ['0x800019c7', 'RSC', 'Royal Sports City'], + 6666: ['0x80001a0a', 'BPA', 'Bitcoin Pizza'], + 6688: ['0x80001a20', 'SAFE', 'SAFE'], + 6779: ['0x80001a7b', 'COTI', 'COTI'], + 6969: ['0x80001b39', 'ROGER', 'TheHolyrogerCoin'], + 7000: ['0x80001b58', 'ZETA', 'ZetaChain'], + 7027: ['0x80001b73', 'ELLA', 'Ella the heart'], + 7028: ['0x80001b74', 'AA', 'Arthera'], + 7070: ['0x80001b9e', 'DOI', 'Doichain'], + 7091: ['0x80001bb3', 'TOPL', 'Topl'], + 7331: ['0x80001ca3', 'KLY', 'KLYNTAR'], + 7341: ['0x80001cad', 'SHFT', 'Shyft'], + 7518: ['0x80001d5e', 'MEV', 'MEVerse'], + 7576: ['0x80001d98', 'ADIL', 'ADIL Chain'], + 7777: ['0x80001e61', 'BTV', 'Bitvote'], + 7779: ['0x80001e63', 'CPV', 'Compverse'], + 8000: ['0x80001f40', 'SKY', 'Skycoin'], + 8017: ['0x80001f51', 'ISC', 'iSunCoin'], + 8080: ['0x80001f90', undefined, 'DSRV'], + 8181: ['0x80001ff5', 'BOC', 'BeOne Chain'], + 8192: ['0x80002000', 'PAC', 'pacprotocol'], + 8217: ['0x80002019', 'KAIA', 'KAIA'], + 8339: ['0x80002093', 'BTQ', 'BitcoinQuark'], + 8444: ['0x800020fc', 'XCH', 'Chia'], + 8453: ['0x80002105', undefined, 'Base'], + 8520: ['0x80002148', '---', 'reserved'], + 8680: ['0x800021e8', 'PLMNT', 'Planetmint'], + 8732: ['0x8000221c', 'BLN', 'Bullions'], + 8866: ['0x800022a2', 'GGX', 'Golden Gate'], + 8886: ['0x800022b6', 'GGXT', 'Golden Gate Sydney'], + 8888: ['0x800022b8', 'SBTC', 'Super Bitcoin'], + 8964: ['0x80002304', 'NULS', 'NULS'], + 8997: ['0x80002325', 'BBC', 'Babacoin'], + 8998: ['0x80002326', 'JGC', 'JagoanCoin'], + 8999: ['0x80002327', 'BTP', 'Bitcoin Pay'], + 9000: ['0x80002328', 'AVAX', 'Avalanche'], + 9001: ['0x80002329', 'ARB1', 'Arbitrum'], + 9002: ['0x8000232a', 'BOBA', 'Boba'], + 9003: ['0x8000232b', 'LOOP', 'Loopring'], + 9004: ['0x8000232c', 'STRK', 'StarkNet'], + 9005: ['0x8000232d', 'AVAXC', 'Avalanche C-Chain'], + 9006: ['0x8000232e', 'BSC', 'Binance Smart Chain'], + 9797: ['0x80002645', 'NRG', 'Energi'], + 9888: ['0x800026a0', 'BTF', 'Bitcoin Faith'], + 9969: ['0x800026f1', 'OSMI', 'Osmium'], + 9999: ['0x8000270f', 'GOD', 'Bitcoin God'], + 10000: ['0x80002710', 'FO', 'FIBOS'], + 10001: ['0x80002711', 'SPACE', 'Space'], + 10007: ['0x80002717', 'S', 'SONIC'], + 10111: ['0x8000277f', 'DHP', 'dHealth'], + 10226: ['0x800027f2', 'RTM', 'Raptoreum'], + 10242: ['0x80002802', 'AA', 'Arthera'], + 10291: ['0x80002833', 'XRC', 'XRhodium'], + 10507: ['0x8000290b', 'NUM', 'Numbers Protocol'], + 10605: ['0x8000296d', 'XPI', 'Lotus'], + 11111: ['0x80002b67', 'ESS', 'Essentia One'], + 11742: ['0x80002dde', 'VARCH', 'InvArch'], + 11743: ['0x80002ddf', 'TNKR', 'Tinkernet'], + 12345: ['0x80003039', 'IPOS', 'IPOS'], + 12586: ['0x8000312a', 'MINA', 'Mina'], + 13107: ['0x80003333', 'BTY', 'BitYuan'], + 13108: ['0x80003334', 'YCC', 'Yuan Chain Coin'], + 13381: ['0x80003445', 'PHX', 'Phoenix'], + 14001: ['0x800036b1', 'WAX', 'Worldwide Asset Exchange'], + 15845: ['0x80003de5', 'SDGO', 'SanDeGo'], + 16181: ['0x80003f35', 'XTX', 'Totem Live Network'], + 16754: ['0x80004172', 'ARDR', 'Ardor'], + 18000: ['0x80004650', 'MTR', 'Meter'], + 19165: ['0x80004add', 'SAFE', 'Safecoin'], + 19167: ['0x80004adf', 'FLUX', 'Flux'], + 19169: ['0x80004ae1', 'RITO', 'Ritocoin'], + 19788: ['0x80004d4c', 'ML', 'Mintlayer'], + 20036: ['0x80004e44', 'XND', 'ndau'], + 21004: ['0x8000520c', 'C4EI', 'c4ei'], + 21337: ['0x80005359', 'XAH', 'Xahau'], + 21888: ['0x80005580', 'PAC', 'Pactus'], + 22504: ['0x800057e8', 'PWR', 'PWRcoin'], + 23000: ['0x800059d8', 'EPIC', 'Epic Cash'], + 25252: ['0x800062a4', 'BELL', 'Bellcoin'], + 25718: ['0x80006476', 'CHX', 'Own'], + 26417: ['0x80006731', 'G1', 'Ğ1'], + 29223: ['0x80007227', 'NEXA', 'Nexa'], + 30001: ['0x80007531', '---', 'reserved'], + 31102: ['0x8000797e', 'ESN', 'EtherSocial Network'], + 31337: ['0x80007a69', undefined, 'ThePower'], + 33416: ['0x80008288', 'TEO', 'Trust Eth reOrigin'], + 33878: ['0x80008456', 'BTCS', 'Bitcoin Stake'], + 34952: ['0x80008888', 'BTT', 'ByteTrade'], + 37992: ['0x80009468', 'FXTC', 'FixedTradeCoin'], + 39321: ['0x80009999', 'AMA', 'Amabig'], + 42069: ['0x8000a455', 'FACT', 'FACT0RN'], + 43028: ['0x8000a814', 'AXIV', 'AXIV'], + 47803: ['0x8000babb', 'BAX', 'BAX'], + 49262: ['0x8000c06e', 'EVE', 'evan'], + 49344: ['0x8000c0c0', 'STASH', 'STASH'], + 52752: ['0x8000ce10', 'CELO', 'Celo'], + 54176: ['0x8000d3a0', 'OVER', 'OverProtocol'], + 61616: ['0x8000f0b0', 'TH', 'TianHe'], + 65536: ['0x80010000', 'KETH', 'Krypton World'], + 69420: ['0x80010f2c', 'GRLC', 'Garlicoin'], + 70007: ['0x80011177', 'GWL', 'Gewel'], + 83293: ['0x8001455d', 'QUBIC', 'Qubic'], + 77777: ['0x80012fd1', 'ZYN', 'Wethio'], + 88888: ['0x80015b38', 'RYO', 'c0ban'], + 99999: ['0x8001869f', 'WICC', 'Waykichain'], + 100500: ['0x80018894', 'HOME', 'HomeCoin'], + 101010: ['0x80018a92', 'STC', 'Starcoin'], + 104109: ['0x800196ad', undefined, 'Seed Hypermedia'], + 105105: ['0x80019a91', 'STRAX', 'Strax'], + 111111: ['0x8001b207', 'KAS', 'Kaspa'], + 121337: ['0x8001d9f9', 'KLS', 'Karlsen'], + 123456: ['0x8001e240', 'SPR', 'Spectre'], + 130822: ['0x8001ff06', 'WBT', 'WhiteBIT Coin'], + 161803: ['0x8002780b', 'APTA', 'Bloqs4Good'], + 200625: ['0x80030fb1', 'AKA', 'Akroma'], + 200901: ['0x800310c5', 'BTR', 'Bitlayer'], + 224433: ['0x80036cb1', 'CONET', 'CONET Holesky Network'], + 246529: ['0x8003c301', 'ATS', 'ARTIS sigma1'], + 261131: ['0x8003fc0b', 'ZAMA', 'Zama'], + 314159: ['0x8004cb2f', 'PI', 'Pi Network'], + 333332: ['0x80051614', 'VALUE', 'Value Chain'], + 333333: ['0x80051615', 3333, 'Pi Value Consensus'], + 424242: ['0x80067932', 'X42', 'x42'], + 440017: ['0x8006b6d1', '@G', 'Graphite'], + 534352: ['0x80082750', 'SCR', 'Scroll'], + 666666: ['0x800a2c2a', 'VITE', 'Vite'], + 696365: ['0x800b3206', 'ICE', 'Ice Network'], + 888888: ['0x800d9038', 'SEA', 'Second Exchange Alliance'], + 999999: ['0x800c9061', 'WTC', 'WaltonChain'], + 1048576: ['0x80100000', 'AMAX', 'Armonia Meta Chain'], + 1171337: ['0x8011df89', 'ILT', 'iOlite'], + 1313114: ['0x8014095a', 'ETHO', 'Etho Protocol'], + 1313500: ['0x80140adc', 'XERO', 'Xerom'], + 1712144: ['0x801a2010', 'LAX', 'LAPO'], + 3924011: ['0x803be02b', 'EPK', 'EPIK Protocol'], + 4741444: ['0x80485944', 'HYD', 'Hydra Token'], + 5249353: ['0x80501949', 'BCO', 'BitcoinOre'], + 5249354: ['0x8050194a', 'BHD', 'BitcoinHD'], + 5264462: ['0x8050544e', 'PTN', 'PalletOne'], + 5655640: ['0x80564c58', 'VLX', 'Velas'], + 5718350: ['0x8057414e', 'WAN', 'Wanchain'], + 5741564: ['0x80579bfc', 'WAVES', 'Waves'], + 5741565: ['0x80579bfd', 'WEST', 'Waves Enterprise'], + 6382179: ['0x80616263', 'ABC', 'Abcmint'], + 6517357: ['0x8063726d', 'CRM', 'Creamcoin'], + 7171666: ['0x806d6e52', 'BROCK', 'Bitrock'], + 7562605: ['0x8073656d', 'SEM', 'Semux'], + 7567736: ['0x80737978', 'ION', 'ION'], + 7777777: ['0x8076adf1', 'FCT', 'FirmaChain'], + 7825266: ['0x80776772', 'WGR', 'WGR'], + 7825267: ['0x80776773', 'OBSR', 'OBServer'], + 8163271: ['0x807c8fc7', 'AFS', 'ANFS'], + 10000118: ['0x805d30b6', 'OSMO', 'Osmosis'], + 15118976: ['0x80e6b280', 'XDS', 'XDS'], + 19000118: ['0x8121eb36', 'SEI', 'SEI'], + 61717561: ['0x83adbc39', 'AQUA', 'Aquachain'], + 77777777: ['0x84a2cb71', 'AZT', 'Aztecoin'], + 88888888: ['0x854c5638', 'HATCH', 'Hatch'], + 91927009: ['0x857ab1e1', 'kUSD', 'kUSD'], + 99999996: ['0x85f5e0fc', 'GENS', 'GENS'], + 99999997: ['0x85f5e0fd', 'EQ', 'EQ'], + 99999998: ['0x85f5e0fe', 'FLUID', 'Fluid Chains'], + 99999999: ['0x85f5e0ff', 'QKC', 'QuarkChain'], + 11259375: ['0x80abcdef', 'LBR', '0L'], + 20230101: ['0x8134afd5', 'ROH', 'Rooch'], + 20240430: ['0x8134d82e', 'NLK', 'NuLinkCoin'], + 608589380: ['0xa4465644', 'FVDC', 'ForumCoin'], + 1179993420: ['0xc655454c', undefined, 'Fuel'], + 1179993421: ['0xc655454d', 'TTNC', 'TakeTitan'], + 1179993431: ['0xc6554557', 'MTGBP', 'MTGBP'], + 1179993441: ['0xc6554561', 'QFS', 'Qfs'], + 1179993451: ['0xc655456b', 'RWA', 'Asset Chain'] +}; +//# sourceMappingURL=coinType.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/coinType.js.map b/dist/src/libs/humanizer/const/coinType.js.map new file mode 100644 index 000000000..bf8d655d4 --- /dev/null +++ b/dist/src/libs/humanizer/const/coinType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"coinType.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/const/coinType.ts"],"names":[],"mappings":"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","sourcesContent":["export const registeredCoinTypes: { [n: number]: any[] } = {\n 0: ['0x80000000', 'BTC', 'Bitcoin'],\n 1: ['0x80000001', undefined, 'Testnet'],\n 2: ['0x80000002', 'LTC', 'Litecoin'],\n 3: ['0x80000003', 'DOGE', 'Dogecoin'],\n 4: ['0x80000004', 'RDD', 'Reddcoin'],\n 5: ['0x80000005', 'DASH', 'Dash'],\n 6: ['0x80000006', 'PPC', 'Peercoin'],\n 7: ['0x80000007', 'NMC', 'Namecoin'],\n 8: ['0x80000008', 'FTC', 'Feathercoin'],\n 9: ['0x80000009', 'XCP', 'Counterparty'],\n 10: ['0x8000000a', 'BLK', 'Blackcoin'],\n 11: ['0x8000000b', 'NSR', 'NuShares'],\n 12: ['0x8000000c', 'NBT', 'NuBits'],\n 13: ['0x8000000d', 'MZC', 'Mazacoin'],\n 14: ['0x8000000e', 'VIA', 'Viacoin'],\n 15: ['0x8000000f', 'XCH', 'ClearingHouse'],\n 16: ['0x80000010', 'RBY', 'Rubycoin'],\n 17: ['0x80000011', 'GRS', 'Groestlcoin'],\n 18: ['0x80000012', 'DGC', 'Digitalcoin'],\n 19: ['0x80000013', 'CCN', 'Cannacoin'],\n 20: ['0x80000014', 'DGB', 'DigiByte'],\n 21: ['0x80000015', 'Open Assets'],\n 22: ['0x80000016', 'MONA', 'Monacoin'],\n 23: ['0x80000017', 'CLAM', 'Clams'],\n 24: ['0x80000018', 'XPM', 'Primecoin'],\n 25: ['0x80000019', 'NEOS', 'Neoscoin'],\n 26: ['0x8000001a', 'JBS', 'Jumbucks'],\n 27: ['0x8000001b', 'ZRC', 'ziftrCOIN'],\n 28: ['0x8000001c', 'VTC', 'Vertcoin'],\n 29: ['0x8000001d', 'NXT', 'NXT'],\n 30: ['0x8000001e', 'BURST', 'Burst'],\n 31: ['0x8000001f', 'MUE', 'MonetaryUnit'],\n 32: ['0x80000020', 'ZOOM', 'Zoom'],\n 33: ['0x80000021', 'VASH', 'Virtual Cash'],\n 34: ['0x80000022', 'CDN', 'Canada eCoin'],\n 35: ['0x80000023', 'SDC', 'ShadowCash'],\n 36: ['0x80000024', 'PKB', 'ParkByte'],\n 37: ['0x80000025', 'PND', 'Pandacoin'],\n 38: ['0x80000026', 'START', 'StartCOIN'],\n 39: ['0x80000027', 'MOIN', 'MOIN'],\n 40: ['0x80000028', 'EXP', 'Expanse'],\n 41: ['0x80000029', 'EMC2', 'Einsteinium'],\n 42: ['0x8000002a', 'DCR', 'Decred'],\n 43: ['0x8000002b', 'XEM', 'NEM'],\n 44: ['0x8000002c', 'PART', 'Particl'],\n 45: ['0x8000002d', 'ARG', 'Argentum (dead)'],\n 46: ['0x8000002e', 'Libertas'],\n 47: ['0x8000002f', 'Posw coin'],\n 48: ['0x80000030', 'SHR', 'Shreeji'],\n 49: ['0x80000031', 'GCR', 'Global Currency Reserve'],\n 50: ['0x80000032', 'NVC', 'Novacoin'],\n 51: ['0x80000033', 'AC', 'Asiacoin'],\n 52: ['0x80000034', 'BTCD', 'BitcoinDark'],\n 53: ['0x80000035', 'DOPE', 'Dopecoin'],\n 54: ['0x80000036', 'TPC', 'Templecoin'],\n 55: ['0x80000037', 'AIB', 'AIB'],\n 56: ['0x80000038', 'EDRC', 'EDRCoin'],\n 57: ['0x80000039', 'SYS', 'Syscoin'],\n 58: ['0x8000003a', 'SLR', 'Solarcoin'],\n 59: ['0x8000003b', 'SMLY', 'Smileycoin'],\n 60: ['0x8000003c', 'ETH', 'Ether'],\n 61: ['0x8000003d', 'ETC', 'Ether Classic'],\n 62: ['0x8000003e', 'PSB', 'Pesobit'],\n 63: ['0x8000003f', 'LDCN', 'Landcoin (dead)'],\n 64: ['0x80000040', 'Open Chain'],\n 65: ['0x80000041', 'XBC', 'Bitcoinplus'],\n 66: ['0x80000042', 'IOP', 'Internet of People'],\n 67: ['0x80000043', 'NXS', 'Nexus'],\n 68: ['0x80000044', 'INSN', 'InsaneCoin'],\n 69: ['0x80000045', 'OK', 'OKCash'],\n 70: ['0x80000046', 'BRIT', 'BritCoin'],\n 71: ['0x80000047', 'CMP', 'Compcoin'],\n 72: ['0x80000048', 'CRW', 'Crown'],\n 73: ['0x80000049', 'BELA', 'BelaCoin'],\n 74: ['0x8000004a', 'ICX', 'ICON'],\n 75: ['0x8000004b', 'FJC', 'FujiCoin'],\n 76: ['0x8000004c', 'MIX', 'MIX'],\n 77: ['0x8000004d', 'XVG', 'Verge Currency'],\n 78: ['0x8000004e', 'EFL', 'Electronic Gulden'],\n 79: ['0x8000004f', 'CLUB', 'ClubCoin'],\n 80: ['0x80000050', 'RICHX', 'RichCoin'],\n 81: ['0x80000051', 'POT', 'Potcoin'],\n 82: ['0x80000052', 'QRK', 'Quarkcoin'],\n 83: ['0x80000053', 'TRC', 'Terracoin'],\n 84: ['0x80000054', 'GRC', 'Gridcoin'],\n 85: ['0x80000055', 'AUR', 'Auroracoin'],\n 86: ['0x80000056', 'IXC', 'IXCoin'],\n 87: ['0x80000057', 'NLG', 'Gulden'],\n 88: ['0x80000058', 'BITB', 'BitBean'],\n 89: ['0x80000059', 'BTA', 'Bata'],\n 90: ['0x8000005a', 'XMY', 'Myriadcoin'],\n 91: ['0x8000005b', 'BSD', 'BitSend'],\n 92: ['0x8000005c', 'UNO', 'Unobtanium'],\n 93: ['0x8000005d', 'MTR', 'MasterTrader'],\n 94: ['0x8000005e', 'GB', 'GoldBlocks'],\n 95: ['0x8000005f', 'SHM', 'Saham'],\n 96: ['0x80000060', 'CRX', 'Chronos'],\n 97: ['0x80000061', 'BIQ', 'Ubiquoin'],\n 98: ['0x80000062', 'EVO', 'Evotion'],\n 99: ['0x80000063', 'STO', 'SaveTheOcean'],\n 100: ['0x80000064', 'BIGUP', 'BigUp'],\n 101: ['0x80000065', 'GAME', 'GameCredits'],\n 102: ['0x80000066', 'DLC', 'Dollarcoins'],\n 103: ['0x80000067', 'ZYD', 'Zayedcoin'],\n 104: ['0x80000068', 'DBIC', 'Dubaicoin'],\n 105: ['0x80000069', 'STRAT', 'Stratis'],\n 106: ['0x8000006a', 'SH', 'Shilling'],\n 107: ['0x8000006b', 'MARS', 'MarsCoin'],\n 108: ['0x8000006c', 'UBQ', 'Ubiq'],\n 109: ['0x8000006d', 'PTC', 'Pesetacoin'],\n 110: ['0x8000006e', 'NRO', 'Neurocoin'],\n 111: ['0x8000006f', 'ARK', 'ARK'],\n 112: ['0x80000070', 'USC', 'UltimateSecureCashMain'],\n 113: ['0x80000071', 'THC', 'Hempcoin'],\n 114: ['0x80000072', 'LINX', 'Linx'],\n 115: ['0x80000073', 'ECN', 'Ecoin'],\n 116: ['0x80000074', 'DNR', 'Denarius'],\n 117: ['0x80000075', 'PINK', 'Pinkcoin'],\n 118: ['0x80000076', 'ATOM', 'Atom'],\n 119: ['0x80000077', 'PIVX', 'Pivx'],\n 120: ['0x80000078', 'FLASH', 'Flashcoin'],\n 121: ['0x80000079', 'ZEN', 'Zencash'],\n 122: ['0x8000007a', 'PUT', 'Putincoin'],\n 123: ['0x8000007b', 'ZNY', 'BitZeny'],\n 124: ['0x8000007c', 'UNIFY', 'Unify'],\n 125: ['0x8000007d', 'XST', 'StealthCoin'],\n 126: ['0x8000007e', 'BRK', 'Breakout Coin'],\n 127: ['0x8000007f', 'VC', 'Vcash'],\n 128: ['0x80000080', 'XMR', 'Monero'],\n 129: ['0x80000081', 'VOX', 'Voxels'],\n 130: ['0x80000082', 'NAV', 'NavCoin'],\n 131: ['0x80000083', 'FCT', 'Factom Factoids'],\n 132: ['0x80000084', 'EC', 'Factom Entry Credits'],\n 133: ['0x80000085', 'ZEC', 'Zcash'],\n 134: ['0x80000086', 'LSK', 'Lisk'],\n 135: ['0x80000087', 'STEEM', 'Steem'],\n 136: ['0x80000088', 'XZC', 'ZCoin'],\n 137: ['0x80000089', 'RBTC', 'Rootstock'],\n '138': ['0x8000008a', 'Giftblock'],\n 139: ['0x8000008b', 'RPT', 'RealPointCoin'],\n 140: ['0x8000008c', 'LBC', 'LBRY Credits'],\n 141: ['0x8000008d', 'KMD', 'Komodo'],\n 142: ['0x8000008e', 'BSQ', 'bisq Token'],\n 143: ['0x8000008f', 'RIC', 'Riecoin'],\n 144: ['0x80000090', 'XRP', 'XRP'],\n 145: ['0x80000091', 'BCH', 'Bitcoin Cash'],\n 146: ['0x80000092', 'NEBL', 'Neblio'],\n 147: ['0x80000093', 'ZCL', 'ZClassic'],\n 148: ['0x80000094', 'XLM', 'Stellar Lumens'],\n 149: ['0x80000095', 'NLC2', 'NoLimitCoin2'],\n 150: ['0x80000096', 'WHL', 'WhaleCoin'],\n 151: ['0x80000097', 'ERC', 'EuropeCoin'],\n 152: ['0x80000098', 'DMD', 'Diamond'],\n 153: ['0x80000099', 'BTM', 'Bytom'],\n 154: ['0x8000009a', 'BIO', 'Biocoin'],\n 155: ['0x8000009b', 'XWCC', 'Whitecoin Classic'],\n 156: ['0x8000009c', 'BTG', 'Bitcoin Gold'],\n 157: ['0x8000009d', 'BTC2X', 'Bitcoin 2x'],\n 158: ['0x8000009e', 'SSN', 'SuperSkynet'],\n 159: ['0x8000009f', 'TOA', 'TOACoin'],\n 160: ['0x800000a0', 'BTX', 'Bitcore'],\n 161: ['0x800000a1', 'ACC', 'Adcoin'],\n 162: ['0x800000a2', 'BCO', 'Bridgecoin'],\n 163: ['0x800000a3', 'ELLA', 'Ellaism'],\n 164: ['0x800000a4', 'PIRL', 'Pirl'],\n 165: ['0x800000a5', 'XNO', 'Nano'],\n 166: ['0x800000a6', 'VIVO', 'Vivo'],\n 167: ['0x800000a7', 'FRST', 'Firstcoin'],\n 168: ['0x800000a8', 'HNC', 'Helleniccoin'],\n 169: ['0x800000a9', 'BUZZ', 'BUZZ'],\n 170: ['0x800000aa', 'MBRS', 'Ember'],\n 171: ['0x800000ab', 'HC', 'Hcash'],\n 172: ['0x800000ac', 'HTML', 'HTMLCOIN'],\n 173: ['0x800000ad', 'ODN', 'Obsidian'],\n 174: ['0x800000ae', 'ONX', 'OnixCoin'],\n 175: ['0x800000af', 'RVN', 'Ravencoin'],\n 176: ['0x800000b0', 'GBX', 'GoByte'],\n 177: ['0x800000b1', 'BTCZ', 'BitcoinZ'],\n 178: ['0x800000b2', 'POA', 'Poa'],\n 179: ['0x800000b3', 'NYC', 'NewYorkCoin'],\n 180: ['0x800000b4', 'MXT', 'MarteXcoin'],\n 181: ['0x800000b5', 'WC', 'Wincoin'],\n 182: ['0x800000b6', 'MNX', 'Minexcoin'],\n 183: ['0x800000b7', 'BTCP', 'Bitcoin Private'],\n 184: ['0x800000b8', 'MUSIC', 'Musicoin'],\n 185: ['0x800000b9', 'BCA', 'Bitcoin Atom'],\n 186: ['0x800000ba', 'CRAVE', 'Crave'],\n 187: ['0x800000bb', 'STAK', 'STRAKS'],\n 188: ['0x800000bc', 'WBTC', 'World Bitcoin'],\n 189: ['0x800000bd', 'LCH', 'LiteCash'],\n 190: ['0x800000be', 'EXCL', 'ExclusiveCoin'],\n '191': ['0x800000bf', 'Lynx'],\n 192: ['0x800000c0', 'LCC', 'LitecoinCash'],\n 193: ['0x800000c1', 'XFE', 'Feirm'],\n 194: ['0x800000c2', 'EOS', 'EOS'],\n 195: ['0x800000c3', 'TRX', 'Tron'],\n 196: ['0x800000c4', 'KOBO', 'Kobocoin'],\n 197: ['0x800000c5', 'HUSH', 'HUSH'],\n 198: ['0x800000c6', 'BAN', 'Banano'],\n 199: ['0x800000c7', 'ETF', 'ETF'],\n 200: ['0x800000c8', 'OMNI', 'Omni'],\n 201: ['0x800000c9', 'BIFI', 'BitcoinFile'],\n 202: ['0x800000ca', 'UFO', 'Uniform Fiscal Object'],\n 203: ['0x800000cb', 'CNMC', 'Cryptonodes'],\n 204: ['0x800000cc', 'BCN', 'Bytecoin'],\n 205: ['0x800000cd', 'RIN', 'Ringo'],\n 206: ['0x800000ce', 'ATP', 'Alaya'],\n 207: ['0x800000cf', 'EVT', 'everiToken'],\n 208: ['0x800000d0', 'ATN', 'ATN'],\n 209: ['0x800000d1', 'BIS', 'Bismuth'],\n 210: ['0x800000d2', 'NEET', 'NEETCOIN'],\n 211: ['0x800000d3', 'BOPO', 'BopoChain'],\n 212: ['0x800000d4', 'OOT', 'Utrum'],\n 213: ['0x800000d5', 'ALIAS', 'Alias'],\n 214: ['0x800000d6', 'MONK', 'Monkey Project'],\n 215: ['0x800000d7', 'BOXY', 'BoxyCoin'],\n 216: ['0x800000d8', 'FLO', 'Flo'],\n 217: ['0x800000d9', 'MEC', 'Megacoin'],\n 218: ['0x800000da', 'BTDX', 'BitCloud'],\n 219: ['0x800000db', 'XAX', 'Artax'],\n 220: ['0x800000dc', 'ANON', 'ANON'],\n 221: ['0x800000dd', 'LTZ', 'LitecoinZ'],\n 222: ['0x800000de', 'BITG', 'Bitcoin Green'],\n 223: ['0x800000df', 'ICP', 'Internet Computer (DFINITY)'],\n 224: ['0x800000e0', 'SMART', 'Smartcash'],\n 225: ['0x800000e1', 'XUEZ', 'XUEZ'],\n 226: ['0x800000e2', 'HLM', 'Helium'],\n 227: ['0x800000e3', 'WEB', 'Webchain'],\n 228: ['0x800000e4', 'ACM', 'Actinium'],\n 229: ['0x800000e5', 'NOS', 'NOS Stable Coins'],\n 230: ['0x800000e6', 'BITC', 'BitCash'],\n 231: ['0x800000e7', 'HTH', 'Help The Homeless Coin'],\n 232: ['0x800000e8', 'TZC', 'Trezarcoin'],\n 233: ['0x800000e9', 'VAR', 'Varda'],\n 234: ['0x800000ea', 'IOV', 'IOV'],\n 235: ['0x800000eb', 'FIO', 'FIO'],\n 236: ['0x800000ec', 'BSV', 'BitcoinSV'],\n 237: ['0x800000ed', 'DXN', 'DEXON'],\n 238: ['0x800000ee', 'QRL', 'Quantum Resistant Ledger'],\n 239: ['0x800000ef', 'PCX', 'ChainX'],\n 240: ['0x800000f0', 'LOKI', 'Loki'],\n '241': ['0x800000f1', 'Imagewallet'],\n 242: ['0x800000f2', 'NIM', 'Nimiq'],\n 243: ['0x800000f3', 'SOV', 'Sovereign Coin'],\n 244: ['0x800000f4', 'JCT', 'Jibital Coin'],\n 245: ['0x800000f5', 'SLP', 'Simple Ledger Protocol'],\n 246: ['0x800000f6', 'EWT', 'Energy Web'],\n 247: ['0x800000f7', 'UC', 'Ulord'],\n 248: ['0x800000f8', 'EXOS', 'EXOS'],\n 249: ['0x800000f9', 'ECA', 'Electra'],\n 250: ['0x800000fa', 'SOOM', 'Soom'],\n 251: ['0x800000fb', 'XRD', 'Redstone'],\n 252: ['0x800000fc', 'FREE', 'FreeCoin'],\n 253: ['0x800000fd', 'NPW', 'NewPowerCoin'],\n 254: ['0x800000fe', 'BST', 'BlockStamp'],\n '255': ['0x800000ff', 'SmartHoldem'],\n 256: ['0x80000100', 'NANO', 'Bitcoin Nano'],\n 257: ['0x80000101', 'BTCC', 'Bitcoin Core'],\n 258: ['0x80000102', 'Zen Protocol'],\n 259: ['0x80000103', 'ZEST', 'Zest'],\n 260: ['0x80000104', 'ABT', 'ArcBlock'],\n 261: ['0x80000105', 'PION', 'Pion'],\n 262: ['0x80000106', 'DT3', 'DreamTeam3'],\n 263: ['0x80000107', 'ZBUX', 'Zbux'],\n 264: ['0x80000108', 'KPL', 'Kepler'],\n 265: ['0x80000109', 'TPAY', 'TokenPay'],\n 266: ['0x8000010a', 'ZILLA', 'ChainZilla'],\n 267: ['0x8000010b', 'ANK', 'Anker'],\n 268: ['0x8000010c', 'BCC', 'BCChain'],\n 269: ['0x8000010d', 'HPB', 'HPB'],\n 270: ['0x8000010e', 'ONE', 'ONE'],\n 271: ['0x8000010f', 'SBC', 'SBC'],\n 272: ['0x80000110', 'IPC', 'IPChain'],\n 273: ['0x80000111', 'DMTC', 'Dominantchain'],\n 274: ['0x80000112', 'OGC', 'Onegram'],\n 275: ['0x80000113', 'SHIT', 'Shitcoin'],\n 276: ['0x80000114', 'ANDES', 'Andescoin'],\n 277: ['0x80000115', 'AREPA', 'Arepacoin'],\n 278: ['0x80000116', 'BOLI', 'Bolivarcoin'],\n 279: ['0x80000117', 'RIL', 'Rilcoin'],\n 280: ['0x80000118', 'HTR', 'Hathor Network'],\n 281: ['0x80000119', 'ACME', 'Accumulate'],\n 282: ['0x8000011a', 'BRAVO', 'BRAVO'],\n 283: ['0x8000011b', 'ALGO', 'Algorand'],\n 284: ['0x8000011c', 'BZX', 'Bitcoinzero'],\n 285: ['0x8000011d', 'GXX', 'GravityCoin'],\n 286: ['0x8000011e', 'HEAT', 'HEAT'],\n 287: ['0x8000011f', 'XDN', 'DigitalNote'],\n 288: ['0x80000120', 'FSN', 'FUSION'],\n 289: ['0x80000121', 'CPC', 'Capricoin'],\n 290: ['0x80000122', 'BOLD', 'Bold'],\n 291: ['0x80000123', 'IOST', 'IOST'],\n 292: ['0x80000124', 'TKEY', 'Tkeycoin'],\n 293: ['0x80000125', 'USE', 'Usechain'],\n 294: ['0x80000126', 'BCZ', 'BitcoinCZ'],\n 295: ['0x80000127', 'IOC', 'Iocoin'],\n 296: ['0x80000128', 'ASF', 'Asofe'],\n 297: ['0x80000129', 'MASS', 'MASS'],\n 298: ['0x8000012a', 'FAIR', 'FairCoin'],\n 299: ['0x8000012b', 'NUKO', 'Nekonium'],\n 300: ['0x8000012c', 'GNX', 'Genaro Network'],\n 301: ['0x8000012d', 'DIVI', 'Divi Project'],\n 302: ['0x8000012e', 'CMT', 'Community'],\n 303: ['0x8000012f', 'EUNO', 'EUNO'],\n 304: ['0x80000130', 'IOTX', 'IoTeX'],\n 305: ['0x80000131', 'ONION', 'DeepOnion'],\n 306: ['0x80000132', '8BIT', '8Bit'],\n 307: ['0x80000133', 'ATC', 'AToken Coin'],\n 308: ['0x80000134', 'BTS', 'Bitshares'],\n 309: ['0x80000135', 'CKB', 'Nervos CKB'],\n 310: ['0x80000136', 'UGAS', 'Ultrain'],\n 311: ['0x80000137', 'ADS', 'Adshares'],\n 312: ['0x80000138', 'ARA', 'Aura'],\n 313: ['0x80000139', 'ZIL', 'Zilliqa'],\n 314: ['0x8000013a', 'MOAC', 'MOAC'],\n 315: ['0x8000013b', 'SWTC', 'SWTC'],\n 316: ['0x8000013c', 'VNSC', 'vnscoin'],\n 317: ['0x8000013d', 'PLUG', 'Pl ^ g'],\n 318: ['0x8000013e', 'MAN', 'Matrix AI Network'],\n 319: ['0x8000013f', 'ECC', 'ECCoin'],\n 320: ['0x80000140', 'RPD', 'Rapids'],\n 321: ['0x80000141', 'RAP', 'Rapture'],\n 322: ['0x80000142', 'GARD', 'Hashgard'],\n 323: ['0x80000143', 'ZER', 'Zero'],\n 324: ['0x80000144', 'EBST', 'eBoost'],\n 325: ['0x80000145', 'SHARD', 'Shard'],\n 326: ['0x80000146', 'MRX', 'Metrix Coin'],\n 327: ['0x80000147', 'CMM', 'Commercium'],\n 328: ['0x80000148', 'BLOCK', 'Blocknet'],\n 329: ['0x80000149', 'AUDAX', 'AUDAX'],\n 330: ['0x8000014a', 'LUNA', 'Terra'],\n 331: ['0x8000014b', 'ZPM', 'zPrime'],\n 332: ['0x8000014c', 'KUVA', 'Kuva Utility Note'],\n 333: ['0x8000014d', 'MEM', 'MemCoin'],\n 334: ['0x8000014e', 'CS', 'Credits'],\n 335: ['0x8000014f', 'SWIFT', 'SwiftCash'],\n 336: ['0x80000150', 'FIX', 'FIX'],\n 337: ['0x80000151', 'CPC', 'CPChain'],\n 338: ['0x80000152', 'VGO', 'VirtualGoodsToken'],\n 339: ['0x80000153', 'DVT', 'DeVault'],\n 340: ['0x80000154', 'N8V', 'N8VCoin'],\n 341: ['0x80000155', 'MTNS', 'OmotenashiCoin'],\n 342: ['0x80000156', 'BLAST', 'BLAST'],\n 343: ['0x80000157', 'DCT', 'DECENT'],\n 344: ['0x80000158', 'AUX', 'Auxilium'],\n 345: ['0x80000159', 'USDP', 'USDP'],\n 346: ['0x8000015a', 'HTDF', 'HTDF'],\n 347: ['0x8000015b', 'YEC', 'Ycash'],\n 348: ['0x8000015c', 'QLC', 'QLC Chain'],\n 349: ['0x8000015d', 'TEA', 'Icetea Blockchain'],\n 350: ['0x8000015e', 'ARW', 'ArrowChain'],\n 351: ['0x8000015f', 'MDM', 'Medium'],\n 352: ['0x80000160', 'CYB', 'Cybex'],\n 353: ['0x80000161', 'LTO', 'LTO Network'],\n 354: ['0x80000162', 'DOT', 'Polkadot'],\n 355: ['0x80000163', 'AEON', 'Aeon'],\n 356: ['0x80000164', 'RES', 'Resistance'],\n 357: ['0x80000165', 'AYA', 'Aryacoin'],\n 358: ['0x80000166', 'DAPS', 'Dapscoin'],\n 359: ['0x80000167', 'CSC', 'CasinoCoin'],\n 360: ['0x80000168', 'VSYS', 'V Systems'],\n 361: ['0x80000169', 'NOLLAR', 'Nollar'],\n 362: ['0x8000016a', 'XNOS', 'NOS'],\n 363: ['0x8000016b', 'CPU', 'CPUchain'],\n 364: ['0x8000016c', 'LAMB', 'Lambda Storage Chain'],\n 365: ['0x8000016d', 'VCT', 'ValueCyber'],\n 366: ['0x8000016e', 'CZR', 'Canonchain'],\n 367: ['0x8000016f', 'ABBC', 'ABBC'],\n 368: ['0x80000170', 'HET', 'HET'],\n 369: ['0x80000171', 'XAS', 'Asch'],\n 370: ['0x80000172', 'VDL', 'Vidulum'],\n 371: ['0x80000173', 'MED', 'MediBloc'],\n 372: ['0x80000174', 'ZVC', 'ZVChain'],\n 373: ['0x80000175', 'VESTX', 'Vestx'],\n 374: ['0x80000176', 'DBT', 'DarkBit'],\n 375: ['0x80000177', 'SEOS', 'SuperEOS'],\n 376: ['0x80000178', 'MXW', 'Maxonrow'],\n 377: ['0x80000179', 'ZNZ', 'ZENZO'],\n 378: ['0x8000017a', 'XCX', 'XChain'],\n 379: ['0x8000017b', 'SOX', 'SonicX'],\n 380: ['0x8000017c', 'NYZO', 'Nyzo'],\n 381: ['0x8000017d', 'ULC', 'ULCoin'],\n 382: ['0x8000017e', 'RYO', 'Ryo Currency'],\n 383: ['0x8000017f', 'KAL', 'Kaleidochain'],\n 384: ['0x80000180', 'XSN', 'Stakenet'],\n 385: ['0x80000181', 'DOGEC', 'DogeCash'],\n 386: ['0x80000182', 'BMV', \"Bitcoin Matteo\\\\'s Vision\"],\n 387: ['0x80000183', 'QBC', 'Quebecoin'],\n 388: ['0x80000184', 'IMG', 'ImageCoin'],\n 389: ['0x80000185', 'QOS', 'QOS'],\n 390: ['0x80000186', 'PKT', 'PKT'],\n 391: ['0x80000187', 'LHD', 'LitecoinHD'],\n 392: ['0x80000188', 'CENNZ', 'CENNZnet'],\n 393: ['0x80000189', 'HSN', 'Hyper Speed Network'],\n 394: ['0x8000018a', 'CRO', 'Crypto Chain'],\n 395: ['0x8000018b', 'UMBRU', 'Umbru'],\n 396: ['0x8000018c', 'EVER', 'Everscale'],\n 397: ['0x8000018d', 'NEAR', 'NEAR Protocol'],\n 398: ['0x8000018e', 'XPC', 'XPChain'],\n 399: ['0x8000018f', 'ZOC', '01coin'],\n 400: ['0x80000190', 'NIX', 'NIX'],\n 401: ['0x80000191', 'UC', 'Utopiacoin'],\n 402: ['0x80000192', 'GALI', 'Galilel'],\n 403: ['0x80000193', 'OLT', 'Oneledger'],\n 404: ['0x80000194', 'XBI', 'XBI'],\n 405: ['0x80000195', 'DONU', 'DONU'],\n 406: ['0x80000196', 'EARTHS', 'Earths'],\n 407: ['0x80000197', 'HDD', 'HDDCash'],\n 408: ['0x80000198', 'SUGAR', 'Sugarchain'],\n 409: ['0x80000199', 'AILE', 'AileCoin'],\n 410: ['0x8000019a', 'TENT', 'TENT'],\n 411: ['0x8000019b', 'TAN', 'Tangerine Network'],\n 412: ['0x8000019c', 'AIN', 'AIN'],\n 413: ['0x8000019d', 'MSR', 'Masari'],\n 414: ['0x8000019e', 'SUMO', 'Sumokoin'],\n 415: ['0x8000019f', 'ETN', 'Electroneum'],\n 416: ['0x800001a0', 'BYTZ', 'BYTZ'],\n 417: ['0x800001a1', 'WOW', 'Wownero'],\n 418: ['0x800001a2', 'XTNC', 'XtendCash'],\n 419: ['0x800001a3', 'LTHN', 'Lethean'],\n 420: ['0x800001a4', 'NODE', 'NodeHost'],\n 421: ['0x800001a5', 'AGM', 'Argoneum'],\n 422: ['0x800001a6', 'CCX', 'Conceal Network'],\n 423: ['0x800001a7', 'TNET', 'Title Network'],\n 424: ['0x800001a8', 'TELOS', 'TelosCoin'],\n 425: ['0x800001a9', 'AION', 'Aion'],\n 426: ['0x800001aa', 'BC', 'Bitcoin Confidential'],\n 427: ['0x800001ab', 'KTV', 'KmushiCoin'],\n 428: ['0x800001ac', 'ZCR', 'ZCore'],\n 429: ['0x800001ad', 'ERG', 'Ergo'],\n 430: ['0x800001ae', 'PESO', 'Criptopeso'],\n 431: ['0x800001af', 'BTC2', 'Bitcoin 2'],\n 432: ['0x800001b0', 'XRPHD', 'XRPHD'],\n 433: ['0x800001b1', 'WE', 'WE Coin'],\n 434: ['0x800001b2', 'KSM', 'Kusama'],\n 435: ['0x800001b3', 'PCN', 'Peepcoin'],\n 436: ['0x800001b4', 'NCH', 'NetCloth'],\n 437: ['0x800001b5', 'ICU', 'CHIPO'],\n 438: ['0x800001b6', 'FNSA', 'FINSCHIA'],\n 439: ['0x800001b7', 'DTP', 'DeVault Token Protocol'],\n 440: ['0x800001b8', 'BTCR', 'Bitcoin Royale'],\n 441: ['0x800001b9', 'AERGO', 'AERGO'],\n 442: ['0x800001ba', 'XTH', 'Dothereum'],\n 443: ['0x800001bb', 'LV', 'Lava'],\n 444: ['0x800001bc', 'PHR', 'Phore'],\n 445: ['0x800001bd', 'VITAE', 'Vitae'],\n 446: ['0x800001be', 'COCOS', 'Cocos - BCX'],\n 447: ['0x800001bf', 'DIN', 'Dinero'],\n 448: ['0x800001c0', 'SPL', 'Simplicity'],\n 449: ['0x800001c1', 'YCE', 'MYCE'],\n 450: ['0x800001c2', 'XLR', 'Solaris'],\n 451: ['0x800001c3', 'KTS', 'Klimatas'],\n 452: ['0x800001c4', 'DGLD', 'DGLD'],\n 453: ['0x800001c5', 'XNS', 'Insolar'],\n 454: ['0x800001c6', 'EM', 'EMPOW'],\n 455: ['0x800001c7', 'SHN', 'ShineBlocks'],\n 456: ['0x800001c8', 'SEELE', 'Seele'],\n 457: ['0x800001c9', 'AE', 'æternity'],\n 458: ['0x800001ca', 'ODX', 'ObsidianX'],\n 459: ['0x800001cb', 'KAVA', 'Kava'],\n 460: ['0x800001cc', 'GLEEC', 'GLEEC'],\n 461: ['0x800001cd', 'FIL', 'Filecoin'],\n 462: ['0x800001ce', 'RUTA', 'Rutanio'],\n 463: ['0x800001cf', 'CSDT', 'CSDT'],\n 464: ['0x800001d0', 'ETI', 'EtherInc'],\n 465: ['0x800001d1', 'ZSLP', 'Zclassic Simple Ledger Protocol'],\n 466: ['0x800001d2', 'ERE', 'EtherCore'],\n 467: ['0x800001d3', 'DX', 'DxChain Token'],\n 468: ['0x800001d4', 'CPS', 'Capricoin+'],\n 469: ['0x800001d5', 'BTH', 'Bithereum'],\n 470: ['0x800001d6', 'MESG', 'MESG'],\n 471: ['0x800001d7', 'FIMK', 'FIMK'],\n 472: ['0x800001d8', 'AR', 'Arweave'],\n 473: ['0x800001d9', 'OGO', 'Origo'],\n 474: ['0x800001da', 'ROSE', 'Oasis Network'],\n 475: ['0x800001db', 'BARE', 'BARE Network'],\n 476: ['0x800001dc', 'GLEEC', 'GleecBTC'],\n 477: ['0x800001dd', 'CLR', 'Color Coin'],\n 478: ['0x800001de', 'RNG', 'Ring'],\n 479: ['0x800001df', 'OLO', 'Tool Global'],\n 480: ['0x800001e0', 'PEXA', 'Pexa'],\n 481: ['0x800001e1', 'MOON', 'Mooncoin'],\n 482: ['0x800001e2', 'OCEAN', 'Ocean Protocol'],\n 483: ['0x800001e3', 'BNT', 'Bluzelle Native'],\n 484: ['0x800001e4', 'AMO', 'AMO Blockchain'],\n 485: ['0x800001e5', 'FCH', 'FreeCash'],\n 486: ['0x800001e6', 'LAT', 'PlatON'],\n 487: ['0x800001e7', 'COIN', 'Bitcoin Bank'],\n 488: ['0x800001e8', 'VEO', 'Amoveo'],\n 489: ['0x800001e9', 'CCA', 'Counos Coin'],\n 490: ['0x800001ea', 'GFN', 'Graphene'],\n 491: ['0x800001eb', 'BIP', 'Minter Network'],\n 492: ['0x800001ec', 'KPG', 'Kunpeng Network'],\n 493: ['0x800001ed', 'FIN', 'FINL Chain'],\n 494: ['0x800001ee', 'BAND', 'Band'],\n 495: ['0x800001ef', 'DROP', 'Dropil'],\n 496: ['0x800001f0', 'BHT', 'Bluehelix Chain'],\n 497: ['0x800001f1', 'LYRA', 'Scrypta'],\n 498: ['0x800001f2', 'CS', 'Credits'],\n 499: ['0x800001f3', 'RUPX', 'Rupaya'],\n 500: ['0x800001f4', 'THETA', 'Theta'],\n 501: ['0x800001f5', 'SOL', 'Solana'],\n 502: ['0x800001f6', 'THT', 'ThoughtAI'],\n 503: ['0x800001f7', 'CFX', 'Conflux'],\n 504: ['0x800001f8', 'KUMA', 'Kumacoin'],\n 505: ['0x800001f9', 'HASH', 'Provenance'],\n 506: ['0x800001fa', 'CSPR', 'Casper'],\n 507: ['0x800001fb', 'EARTH', 'EARTH'],\n 508: ['0x800001fc', 'EGLD', 'MultiversX'],\n 509: ['0x800001fd', 'CHI', 'Xaya'],\n 510: ['0x800001fe', 'KOTO', 'Koto'],\n 511: ['0x800001ff', 'OTC', 'θ'],\n 512: ['0x80000200', 'RXD', 'Radiant'],\n 513: ['0x80000201', 'SEELEN', 'Seele - N'],\n 514: ['0x80000202', 'AETH', 'AETH'],\n 515: ['0x80000203', 'DNA', 'Idena'],\n 516: ['0x80000204', 'VEE', 'Virtual Economy Era'],\n 517: ['0x80000205', 'SIERRA', 'SierraCoin'],\n 518: ['0x80000206', 'LET', 'Linkeye'],\n 519: ['0x80000207', 'BSC', 'Bitcoin Smart Contract'],\n 520: ['0x80000208', 'BTCV', 'BitcoinVIP'],\n 521: ['0x80000209', 'ABA', 'Dabacus'],\n 522: ['0x8000020a', 'SCC', 'StakeCubeCoin'],\n 523: ['0x8000020b', 'EDG', 'Edgeware'],\n 524: ['0x8000020c', 'AMS', 'AmsterdamCoin'],\n 525: ['0x8000020d', 'GOSS', 'GOSSIP Coin'],\n 526: ['0x8000020e', 'BU', 'BUMO'],\n 527: ['0x8000020f', 'GRAM', 'GRAM'],\n 528: ['0x80000210', 'YAP', 'Yapstone'],\n 529: ['0x80000211', 'SCRT', 'Secret Network'],\n 530: ['0x80000212', 'NOVO', 'Novo'],\n 531: ['0x80000213', 'GHOST', 'Ghost'],\n 532: ['0x80000214', 'HST', 'HST'],\n 533: ['0x80000215', 'PRJ', 'ProjectCoin'],\n 534: ['0x80000216', 'YOU', 'YOUChain'],\n 535: ['0x80000217', 'XHV', 'Haven Protocol'],\n 536: ['0x80000218', 'BYND', 'Beyondcoin'],\n 537: ['0x80000219', 'JOYS', 'Joys Digital'],\n 538: ['0x8000021a', 'VAL', 'Valorbit'],\n 539: ['0x8000021b', 'FLOW', 'Flow'],\n 540: ['0x8000021c', 'SMESH', 'Spacemesh Coin'],\n 541: ['0x8000021d', 'SCDO', 'SCDO'],\n 542: ['0x8000021e', 'IQS', 'IQ - Cash'],\n 543: ['0x8000021f', 'BIND', 'Compendia'],\n 544: ['0x80000220', 'COINEVO', 'Coinevo'],\n 545: ['0x80000221', 'SCRIBE', 'Scribe'],\n 546: ['0x80000222', 'HYN', 'Hyperion'],\n 547: ['0x80000223', 'BHP', 'BHP'],\n 548: ['0x80000224', 'BBC', 'BigBang Core'],\n 549: ['0x80000225', 'MKF', 'MarketFinance'],\n 550: ['0x80000226', 'XDC', 'XinFin'],\n 551: ['0x80000227', 'STR', 'Straightedge'],\n 552: ['0x80000228', 'SUM', 'Sumcoin'],\n 553: ['0x80000229', 'HBC', 'HuobiChain'],\n 554: ['0x8000022a', 'reserved'],\n 555: ['0x8000022b', 'BCS', 'Bitcoin Smart'],\n 556: ['0x8000022c', 'KTS', 'Kratos'],\n 557: ['0x8000022d', 'LKR', 'Lkrcoin'],\n 558: ['0x8000022e', 'TAO', 'Tao'],\n 559: ['0x8000022f', 'XWC', 'Whitecoin'],\n 560: ['0x80000230', 'DEAL', 'DEAL'],\n 561: ['0x80000231', 'NTY', 'Nexty'],\n 562: ['0x80000232', 'TOP', 'TOP NetWork'],\n 563: ['0x80000233,---', 'reserved'],\n 564: ['0x80000234', 'AG', 'Agoric'],\n 565: ['0x80000235', 'CICO', 'Coinicles'],\n 566: ['0x80000236', 'IRIS', 'Irisnet'],\n 567: ['0x80000237', 'NCG', 'Nine Chronicles'],\n 568: ['0x80000238', 'LRG', 'Large Coin'],\n 569: ['0x80000239', 'SERO', 'Super Zero Protocol'],\n 570: ['0x8000023a', 'BDX', 'Beldex'],\n 571: ['0x8000023b', 'CCXX', 'Counos X'],\n 572: ['0x8000023c', 'SLS', 'Saluscoin'],\n 573: ['0x8000023d', 'SRM', 'Serum'],\n 574: ['0x8000023e,---', 'reserved'],\n 575: ['0x8000023f', 'VIVT', 'VIDT Datalink'],\n 576: ['0x80000240', 'BPS', 'BitcoinPoS'],\n 577: ['0x80000241', 'NKN', 'NKN'],\n 578: ['0x80000242', 'ICL', 'ILCOIN'],\n 579: ['0x80000243', 'BONO', 'Bonorum'],\n 580: ['0x80000244', 'PLC', 'PLATINCOIN'],\n 581: ['0x80000245', 'DUN', 'Dune'],\n 582: ['0x80000246', 'DMCH', 'Darmacash'],\n 583: ['0x80000247', 'CTC', 'Creditcoin'],\n 584: ['0x80000248', 'KELP', 'Haidai Network'],\n 585: ['0x80000249', 'GBCR', 'GoldBCR'],\n 586: ['0x8000024a', 'XDAG', 'XDAG'],\n 587: ['0x8000024b', 'PRV', 'Incognito Privacy'],\n 588: ['0x8000024c', 'SCAP', 'SafeCapital'],\n 589: ['0x8000024d', 'TFUEL', 'Theta Fuel'],\n 590: ['0x8000024e', 'GTM', 'Gentarium'],\n 591: ['0x8000024f', 'RNL', 'RentalChain'],\n 592: ['0x80000250', 'GRIN', 'Grin'],\n 593: ['0x80000251', 'MWC', 'MimbleWimbleCoin'],\n 594: ['0x80000252', 'DOCK', 'Dock'],\n 595: ['0x80000253', 'POLYX', 'Polymesh'],\n 596: ['0x80000254', 'DIVER', 'Divergenti'],\n 597: ['0x80000255', 'XEP', 'Electra Protocol'],\n 598: ['0x80000256', 'APN', 'Apron'],\n 599: ['0x80000257', 'TFC', 'Turbo File Coin'],\n 600: ['0x80000258', 'UTE', 'Unit - e'],\n 601: ['0x80000259', 'MTC', 'Metacoin'],\n 602: ['0x8000025a', 'NC', 'NobodyCash'],\n 603: ['0x8000025b', 'XINY', 'Xinyuehu'],\n 604: ['0x8000025c', 'DYN', 'Dynamo'],\n 605: ['0x8000025d', 'BUFS', 'Buffer'],\n 606: ['0x8000025e', 'STOS', 'Stratos'],\n 607: ['0x8000025f', 'TON', 'TON'],\n 608: ['0x80000260', 'TAFT', 'TAFT'],\n 609: ['0x80000261', 'HYDRA', 'HYDRA'],\n 610: ['0x80000262', 'NOR', 'Noir'],\n 611: ['0x80000263', undefined, 'Manta Network Private Asset'],\n 612: ['0x80000264', undefined, 'Calamari Network Private Asset'],\n 613: ['0x80000265', 'WCN', 'Widecoin'],\n 614: ['0x80000266', 'OPT', 'Optimistic Ethereum'],\n 615: ['0x80000267', 'PSWAP', 'PolkaSwap'],\n 616: ['0x80000268', 'VAL', 'Validator'],\n 617: ['0x80000269', 'XOR', 'Sora'],\n 618: ['0x8000026a', 'SSP', 'SmartShare'],\n 619: ['0x8000026b', 'DEI', 'DeimosX'],\n 620: ['0x8000026c,---', 'reserved'],\n 621: ['0x8000026d', 'ZERO', 'Singularity'],\n 622: ['0x8000026e', 'ALPHA', 'AlphaDAO'],\n 623: ['0x8000026f', 'BDECO', 'BDCashProtocol Ecosystem'],\n 624: ['0x80000270', 'NOBL', 'Nobility'],\n 625: ['0x80000271', 'EAST', 'Eastcoin'],\n 626: ['0x80000272', 'KDA', 'Kadena'],\n 627: ['0x80000273', 'SOUL', 'Phantasma'],\n 628: ['0x80000274', 'LORE', 'Gitopia'],\n 629: ['0x80000275', 'FNR', 'Fincor'],\n 630: ['0x80000276', 'NEXUS', 'Nexus'],\n 631: ['0x80000277', 'QTZ', 'Quartz'],\n 632: ['0x80000278', 'MAS', 'Massa'],\n 633: ['0x80000279', 'CALL', 'Callchain'],\n 634: ['0x8000027a', 'VAL', 'Validity'],\n 635: ['0x8000027b', 'POKT', 'Pocket Network'],\n 636: ['0x8000027c', 'EMIT', 'EMIT'],\n 637: ['0x8000027d', 'APTOS', 'Aptos'],\n 638: ['0x8000027e', 'ADON', 'ADON'],\n 639: ['0x8000027f', 'BTSG', 'BitSong'],\n 640: ['0x80000280', 'LFC', 'Leofcoin'],\n 641: ['0x80000281', 'KCS', 'KuCoin Shares'],\n 642: ['0x80000282', 'KCC', 'KuCoin Community Chain'],\n 643: ['0x80000283', 'AZERO', 'Aleph Zero'],\n 644: ['0x80000284', 'TREE', 'Tree'],\n 645: ['0x80000285', 'LX', 'Lynx'],\n 646: ['0x80000286', 'XLN', 'Lunarium'],\n 647: ['0x80000287', 'CIC', 'CIC Chain'],\n 648: ['0x80000288', 'ZRB', 'Zarb'],\n 649: ['0x80000289,---', 'reserved'],\n 650: ['0x8000028a', 'UCO', 'Archethic'],\n 651: ['0x8000028b', 'SFX', 'Safex Cash'],\n 652: ['0x8000028c', 'SFT', 'Safex Token'],\n 653: ['0x8000028d', 'WSFX', 'Wrapped Safex Cash'],\n 654: ['0x8000028e', 'USDG', 'US Digital Gold'],\n 655: ['0x8000028f', 'WMP', 'WAMP'],\n 656: ['0x80000290', 'EKTA', 'Ekta'],\n 657: ['0x80000291', 'YDA', 'YadaCoin'],\n 658: ['0x80000292', 'WHIVE', 'Whive'],\n 659: ['0x80000293', 'KOIN', 'Koinos'],\n 660: ['0x80000294', 'PIRATE', 'PirateCash'],\n 661: ['0x80000295', 'UNQ', 'Unique'],\n 662: ['0x80000296', 'ULM', 'UltonSmartchain'],\n 663: ['0x80000297', 'SFRX', 'EtherGem Sapphire'],\n 664: ['0x80000298', 'BSTY', 'GlobalBoost - Y'],\n 665: ['0x80000299', 'IMP', 'Impact Protocol'],\n 666: ['0x8000029a', 'ACT', 'Achain'],\n 667: ['0x8000029b', 'PRKL', 'Perkle'],\n 668: ['0x8000029c', 'SSC', 'SelfSell'],\n 669: ['0x8000029d', 'GC', 'GateChain'],\n 670: ['0x8000029e', 'PLGR', 'Pledger'],\n 671: ['0x8000029f', 'MPLGR', 'Pledger'],\n 672: ['0x800002a0', 'KNOX', 'Knox'],\n 673: ['0x800002a1', 'ZED', 'ZED'],\n 674: ['0x800002a2', 'CNDL', 'Candle'],\n 675: ['0x800002a3', 'WLKR', 'Walker Crypto Innovation Index'],\n 676: ['0x800002a4', 'WLKRR', 'Walker'],\n 677: ['0x800002a5', 'YUNGE', 'Yunge'],\n 678: ['0x800002a6', 'Voken', 'Voken'],\n 679: ['0x800002a7', 'APL', 'Apollo'],\n 680: ['0x800002a8', 'Evrynet', 'Evrynet'],\n 681: ['0x800002a9', 'NENG', 'Nengcoin'],\n 682: ['0x800002aa', 'CHTA', 'Cheetahcoin'],\n 683: ['0x800002ab', 'ALEO', 'Aleo Network'],\n 684: ['0x800002ac', 'HMS', 'Hemis'],\n 685: ['0x800002ad', 'OAS', 'Oasys'],\n 686: ['0x800002ae', 'KAR', 'Karura Network'],\n 687: ['0x800002af', 'FLON', 'FullOn Network'],\n 688: ['0x800002b0', 'CET', 'CoinEx Chain'],\n 689: ['0x800002b1', 'XLINK', 'XLink Chain'],\n 690: ['0x800002b2', 'KLV', 'KleverChain'],\n 691: ['0x800002b3', 'TNT', 'Tangle'],\n 692: ['0x800002b4', 'GTG', 'Gotigin'],\n 693: ['0x800002b5', 'NET', 'RealityNet'],\n 694: ['0x800002b6', 'VTBC', 'VTB Community'],\n 695: ['0x800002b7', 'DIONE', 'Odyssey Chain'],\n 696: ['0x800002b8', 'LUM', 'Lumos'],\n 697: ['0x800002b9', 'AVA', 'Avalon'],\n 698: ['0x800002ba', 'VEIL', 'Veil'],\n 699: ['0x800002bb', 'GTB', 'GotaBit'],\n 700: ['0x800002bc', 'XDAI', 'xDai'],\n 701: ['0x800002bd', 'COM', 'Commercio'],\n 702: ['0x800002be', 'CCC', 'Commercio Cash Credit'],\n 703: ['0x800002bf', 'SNR', 'Sonr'],\n 704: ['0x800002c0', 'RAQ', 'Ra Quantum'],\n 705: ['0x800002c1', 'PEG', 'Pegasus Token'],\n 706: ['0x800002c2', 'LKG', 'Lionking'],\n 707: ['0x800002c3', 'MCOIN', 'Moneta Coin'],\n 708: ['0x800002c4,---', 'reserved'],\n 709: ['0x800002c5', 'AVAIL', 'Avail'],\n 710: ['0x800002c6', 'FURY', 'Highbury'],\n 711: ['0x800002c7', 'CHC', 'Chaincoin'],\n 712: ['0x800002c8', 'SERF', 'Serfnet'],\n 713: ['0x800002c9', 'XTL', 'Katal Chain'],\n 714: ['0x800002ca', 'BNB', 'Binance'],\n 715: ['0x800002cb', 'SIN', 'Sinovate'],\n 716: ['0x800002cc', 'DLN', 'Delion'],\n 717: ['0x800002cd', 'BONTE', 'Bontecoin'],\n 718: ['0x800002ce', 'PEER', 'Peer'],\n 719: ['0x800002cf', 'ZET', 'Zetacoin'],\n 720: ['0x800002d0', 'ABY', 'Artbyte'],\n 721: ['0x800002d1', 'PGX', 'Mirai Chain'],\n 722: ['0x800002d2', 'IL8P', 'InfiniLooP'],\n 723: ['0x800002d3', 'VOI', 'Voi'],\n 724: ['0x800002d4', 'XVC', 'Vanillacash'],\n 725: ['0x800002d5', 'MCX', 'MultiCash'],\n 726: ['0x800002d6', 'TARA', 'Taraxa'],\n 727: ['0x800002d7', 'BLU', 'BluCrates'],\n 728: ['0x800002d8', 'BFC', 'BFC'],\n 729: ['0x800002d9'],\n 730: ['0x800002da', 'HEALIOS', 'Tenacity'],\n 731: ['0x800002db', 'BMK', 'Bitmark'],\n 732: ['0x800002dc'],\n 733: ['0x800002dd', 'TBC', 'TBChat'],\n 734: ['0x800002de', 'DENTX', 'DENTNet'],\n 735: ['0x800002df'],\n 736: ['0x800002e0'],\n 737: ['0x800002e1', 'ATOP', 'Financial Blockchain'],\n 738: ['0x800002e2', 'BTE', 'Bitweb'],\n 739: ['0x800002e3', 'DPC', 'Dpowcoin (DualPowCoin)'],\n 740: ['0x800002e4', 'MDC', 'MyDataCoin'],\n 741: ['0x800002e5', 'RIV', 'Rigvid'],\n 742: ['0x800002e6'],\n 743: ['0x800002e7'],\n 744: ['0x800002e8', 'DUSK', 'Dusk'],\n 745: ['0x800002e9'],\n 746: ['0x800002ea'],\n 747: ['0x800002eb', 'CFG', 'Centrifuge'],\n 748: ['0x800002ec'],\n 749: ['0x800002ed'],\n 750: ['0x800002ee', 'XPRT', 'Persistence'],\n 751: ['0x800002ef'],\n 752: ['0x800002f0'],\n 753: ['0x800002f1', undefined, 'Age NIST Encryption'],\n 754: ['0x800002f2', undefined, 'Age NIST Encryption'],\n 755: ['0x800002f3'],\n 756: ['0x800002f4'],\n 757: ['0x800002f5', 'HONEY', 'HoneyWood'],\n 758: ['0x800002f6', 'XDD', 'XDDCoin'],\n 759: ['0x800002f7'],\n 760: ['0x800002f8'],\n 761: ['0x800002f9'],\n 762: ['0x800002fa'],\n 763: ['0x800002fb'],\n 764: ['0x800002fc'],\n 765: ['0x800002fd', 'TGN', 'Tagion'],\n 766: ['0x800002fe'],\n 767: ['0x800002ff'],\n 768: ['0x80000300', 'BALLZ', 'Ballzcoin'],\n 769: ['0x80000301'],\n 770: ['0x80000302', 'COSA', 'Cosanta'],\n 771: ['0x80000303', 'BR', 'BR'],\n 772: ['0x80000304'],\n 773: ['0x80000305', 'CSB', 'CosmoBliss'],\n 774: ['0x80000306'],\n 775: ['0x80000307', 'PLSR', 'Pulsar Coin'],\n 776: ['0x80000308', 'KEY', 'Keymaker Coin'],\n 777: ['0x80000309', 'BTW', 'Bitcoin World'],\n 778: ['0x8000030a'],\n 779: ['0x8000030b'],\n 780: ['0x8000030c', 'PLCUC', 'PLC Ultima Classic'],\n 781: ['0x8000030d', 'PLCUX', 'PLC Ultima X'],\n 782: ['0x8000030e', 'PLCU', 'PLC Ultima'],\n 783: ['0x8000030f', 'SMARTBC', 'SMART Blockchain'],\n 784: ['0x80000310', 'SUI', 'Sui'],\n 785: ['0x80000311', 'ULTIMA', 'ULTIMA'],\n 786: ['0x80000312', 'UIDD', 'UIDD'],\n 787: ['0x80000313', 'ACA', 'Acala'],\n 788: ['0x80000314', 'BNC', 'Bifrost'],\n 789: ['0x80000315', 'TAU', 'Lamden'],\n 790: ['0x80000316'],\n 791: ['0x80000317'],\n 792: ['0x80000318'],\n 793: ['0x80000319'],\n 794: ['0x8000031a', 'INTR', 'Interlay'],\n 795: ['0x8000031b', 'KINT', 'Kintsugi'],\n 796: ['0x8000031c'],\n 797: ['0x8000031d'],\n 798: ['0x8000031e'],\n 799: ['0x8000031f', 'PDEX', 'Polkadex'],\n 800: ['0x80000320', 'BEET', 'Beetle Coin'],\n 801: ['0x80000321', 'DST', 'DSTRA'],\n 802: ['0x80000322', 'CY', 'Cyberyen'],\n 803: ['0x80000323', 'RYME', 'Ryme Network'],\n 804: ['0x80000324', 'ZKS', 'zkSync'],\n 805: ['0x80000325', 'SCASH', 'Scash'],\n 806: ['0x80000326'],\n 807: ['0x80000327'],\n 808: ['0x80000328', 'QVT', 'Qvolta'],\n 809: ['0x80000329', 'SDN', 'Shiden Network'],\n 810: ['0x8000032a', 'ASTR', 'Astar Network'],\n 811: ['0x8000032b', '---', 'reserved'],\n 812: ['0x8000032c'],\n 813: ['0x8000032d', 'MEER', 'Qitmeer'],\n 814: ['0x8000032e'],\n 815: ['0x8000032f', 'FACT', 'ImFACT'],\n 816: ['0x80000330', 'FSC', 'FSC'],\n 817: ['0x80000331'],\n 818: ['0x80000332', 'VET', 'VeChain Token'],\n 819: ['0x80000333', 'REEF', 'Reef'],\n 820: ['0x80000334', 'CLO', 'Callisto'],\n 821: ['0x80000335'],\n 822: ['0x80000336', 'BDB', 'BigchainDB'],\n 823: ['0x80000337'],\n 824: ['0x80000338', 'RBNT', 'Redbelly Network'],\n 825: ['0x80000339'],\n 826: ['0x8000033a'],\n 827: ['0x8000033b', 'ACE', 'Endurance'],\n 828: ['0x8000033c', 'CCN', 'ComputeCoin'],\n 829: ['0x8000033d', 'BBA', 'BBACHAIN'],\n 830: ['0x8000033e'],\n 831: ['0x8000033f', 'CRUZ', 'cruzbit'],\n 832: ['0x80000340', 'SAPP', 'Sapphire'],\n 833: ['0x80000341', 777, 'Jackpot'],\n 834: ['0x80000342', 'KYAN', 'Kyanite'],\n 835: ['0x80000343', 'AZR', 'Azzure'],\n 836: ['0x80000344', 'CFL', 'CryptoFlow'],\n 837: ['0x80000345', 'DASHD', 'Dash Diamond'],\n 838: ['0x80000346', 'TRTT', 'Trittium'],\n 839: ['0x80000347', 'UCR', 'Ultra Clear'],\n 840: ['0x80000348', 'PNY', 'Peony'],\n 841: ['0x80000349', 'BECN', 'Beacon'],\n 842: ['0x8000034a', 'MONK', 'Monk'],\n 843: ['0x8000034b', 'SAGA', 'CryptoSaga'],\n 844: ['0x8000034c', 'SUV', 'Suvereno'],\n 845: ['0x8000034d', 'ESK', 'EskaCoin'],\n 846: ['0x8000034e', 'OWO', 'OneWorld Coin'],\n 847: ['0x8000034f', 'PEPS', 'PEPS Coin'],\n 848: ['0x80000350', 'BIR', 'Birake'],\n 849: ['0x80000351', 'MOBIC', 'MobilityCoin'],\n 850: ['0x80000352', 'FLS', 'Flits'],\n 851: ['0x80000353', 'FRECO', 'Freco'],\n 852: ['0x80000354', 'DSM', 'Desmos'],\n 853: ['0x80000355', 'PRCY', 'PRCY Coin'],\n 854: ['0x80000356'],\n 855: ['0x80000357'],\n 856: ['0x80000358'],\n 857: ['0x80000359'],\n 858: ['0x8000035a', 'HVH', 'HAVAH'],\n 859: ['0x8000035b'],\n 860: ['0x8000035c', 'XBIT', 'XBIT Coin'],\n 861: ['0x8000035d'],\n 862: ['0x8000035e'],\n 863: ['0x8000035f'],\n 864: ['0x80000360', 'CVM', 'Convex'],\n 865: ['0x80000361'],\n 866: ['0x80000362', 'MOB', 'MobileCoin'],\n 867: ['0x80000363'],\n 868: ['0x80000364', 'IF', 'Infinitefuture'],\n 869: ['0x80000365'],\n 870: ['0x80000366'],\n 871: ['0x80000367'],\n 872: ['0x80000368'],\n 873: ['0x80000369', 'QUORUM', 'Quorum'],\n 874: ['0x8000036a'],\n 875: ['0x8000036b'],\n 876: ['0x8000036c'],\n 877: ['0x8000036d', 'NAM', 'Namada'],\n 878: ['0x8000036e', 'SCR', 'Scorum Network'],\n 879: ['0x8000036f'],\n 880: ['0x80000370', 'LUM', 'Lum Network'],\n 881: ['0x80000371'],\n 882: ['0x80000372'],\n 883: ['0x80000373', 'ZBC', 'ZooBC'],\n 884: ['0x80000374'],\n 885: ['0x80000375'],\n 886: ['0x80000376', 'ADF', 'AD Token'],\n 887: ['0x80000377'],\n 888: ['0x80000378', 'NEO', 'NEO'],\n 889: ['0x80000379', 'TOMO', 'TOMO'],\n 890: ['0x8000037a', 'XSEL', 'Seln'],\n 891: ['0x8000037b'],\n 892: ['0x8000037c'],\n 893: ['0x8000037d'],\n 894: ['0x8000037e'],\n 895: ['0x8000037f'],\n 896: ['0x80000380', 'LKSC', 'LKSCoin'],\n 897: ['0x80000381'],\n 898: ['0x80000382', 'AS', 'Assetchain'],\n 899: ['0x80000383', 'XEC', 'eCash'],\n 900: ['0x80000384', 'LMO', 'Lumeneo'],\n 901: ['0x80000385', 'NXT', 'NxtMeta'],\n 902: ['0x80000386'],\n 903: ['0x80000387'],\n 904: ['0x80000388', 'HNT', 'Helium'],\n 905: ['0x80000389'],\n 906: ['0x8000038a', 'XPX', 'Sirius'],\n 907: ['0x8000038b', 'FIS', 'StaFi'],\n 908: ['0x8000038c'],\n 909: ['0x8000038d', 'SGE', 'Saage'],\n 910: ['0x8000038e'],\n 911: ['0x8000038f', 'GERT', 'Gert'],\n 912: ['0x80000390'],\n 913: ['0x80000391', 'VARA', 'Vara Network'],\n 914: ['0x80000392'],\n 915: ['0x80000393'],\n 916: ['0x80000394', 'META', 'Metadium'],\n 917: ['0x80000395', 'FRA', 'Findora'],\n 918: ['0x80000396'],\n 919: ['0x80000397', 'CCD', 'Concordium'],\n 920: ['0x80000398'],\n 921: ['0x80000399', 'AVN', 'Avian Network'],\n 922: ['0x8000039a'],\n 923: ['0x8000039b'],\n 924: ['0x8000039c'],\n 925: ['0x8000039d', 'DIP', 'Dipper Network'],\n 926: ['0x8000039e'],\n 927: ['0x8000039f'],\n 928: ['0x800003a0', 'GHM', 'HermitMatrixNetwork'],\n 929: ['0x800003a1'],\n 930: ['0x800003a2'],\n 931: ['0x800003a3', 'RUNE', 'THORChain (RUNE)'],\n 932: ['0x800003a4'],\n 933: ['0x800003a5'],\n 934: ['0x800003a6'],\n 935: ['0x800003a7'],\n 936: ['0x800003a8'],\n 937: ['0x800003a9'],\n 938: ['0x800003aa', 'MGO', 'Mango Network'],\n 939: ['0x800003ab', 'AB', 'Argot Protocol'],\n 940: ['0x800003ac'],\n 941: ['0x800003ad', '---', 'reserved'],\n 942: ['0x800003ae', 'KCN', 'Kylacoin'],\n 943: ['0x800003af', 'LCN', 'Lyncoin'],\n 944: ['0x800003b0'],\n 945: ['0x800003b1', 'UNLOCK', 'Jasiri protocol'],\n 946: ['0x800003b2'],\n 947: ['0x800003b3'],\n 948: ['0x800003b4'],\n 949: ['0x800003b5'],\n 950: ['0x800003b6'],\n 951: ['0x800003b7'],\n 952: ['0x800003b8'],\n 953: ['0x800003b9'],\n 954: ['0x800003ba'],\n 955: ['0x800003bb', 'LTP', 'LifetionCoin'],\n 956: ['0x800003bc'],\n 957: ['0x800003bd'],\n 958: ['0x800003be', undefined, 'KickSoccer'],\n 959: ['0x800003bf'],\n 960: ['0x800003c0', 'VKAX', 'Vkax'],\n 961: ['0x800003c1'],\n 962: ['0x800003c2'],\n 963: ['0x800003c3'],\n 964: ['0x800003c4'],\n 965: ['0x800003c5'],\n 966: ['0x800003c6', 'MATIC', 'Matic'],\n 967: ['0x800003c7'],\n 968: ['0x800003c8', 'UNW', 'UNW'],\n 969: ['0x800003c9', 'QI', 'Quai Network'],\n 970: ['0x800003ca', 'TWINS', 'TWINS'],\n 971: ['0x800003cb'],\n 972: ['0x800003cc'],\n 973: ['0x800003cd'],\n 974: ['0x800003ce'],\n 975: ['0x800003cf'],\n 976: ['0x800003d0'],\n 977: ['0x800003d1', 'TLOS', 'Telos'],\n 978: ['0x800003d2'],\n 979: ['0x800003d3'],\n 980: ['0x800003d4'],\n 981: ['0x800003d5', 'TAFECO', 'Taf ECO Chain'],\n 982: ['0x800003d6'],\n 983: ['0x800003d7'],\n 984: ['0x800003d8'],\n 985: ['0x800003d9', 'AU', 'Autonomy'],\n 986: ['0x800003da'],\n 987: ['0x800003db', 'VCG', 'VipCoin'],\n 988: ['0x800003dc', 'XAZAB', 'Xazab core'],\n 989: ['0x800003dd', 'AIOZ', 'AIOZ'],\n 990: ['0x800003de', 'CORE', 'Coreum'],\n 991: ['0x800003df', 'PEC', 'Phoenix'],\n 992: ['0x800003e0', 'UNT', 'Unit'],\n 993: ['0x800003e1', 'XRB', 'X Currency'],\n 994: ['0x800003e2', 'QUAI', 'Quai Network'],\n 995: ['0x800003e3', 'CAPS', 'Ternoa'],\n 996: ['0x800003e4', 'OKT', 'OKChain Token'],\n 997: ['0x800003e5', 'SUM', 'Solidum'],\n 998: ['0x800003e6', 'LBTC', 'Lightning Bitcoin'],\n 999: ['0x800003e7', 'BCD', 'Bitcoin Diamond'],\n 1000: ['0x800003e8', 'BTN', 'Bitcoin New'],\n 1001: ['0x800003e9', 'TT', 'ThunderCore'],\n 1002: ['0x800003ea', 'BKT', 'BanKitt'],\n 1003: ['0x800003eb', 'NODL', 'Nodle'],\n 1004: ['0x800003ec', 'PCOIN', 'PCOIN'],\n 1005: ['0x800003ed', 'TAO', 'Bittensor'],\n 1006: ['0x800003ee', 'HSK', 'HashKey Chain'],\n 1007: ['0x800003ef', 'FTM', 'Fantom'],\n 1008: ['0x800003f0', 'RPG', 'RPG'],\n 1009: ['0x800003f1', 'LAKE', 'iconLake'],\n 1010: ['0x800003f2', 'HT', 'Huobi ECO Chain'],\n 1011: ['0x800003f3', 'ELV', 'Eluvio'],\n 1012: ['0x800003f4', 'JOC', 'Japan Open Chain'],\n 1013: ['0x800003f5', 'BIC', 'Beincrypto'],\n 1014: ['0x800003f6', 'JOY', 'Joystream'],\n 1015: ['0x800003f7', 'ZCX', 'ZEN Exchange Token'],\n 1016: ['0x800003f8', '---', 'reserved'],\n 1020: ['0x800003fc', 'EVC', 'Evrice'],\n 1022: ['0x800003fe', 'XRD', 'Radix DLT'],\n 1023: ['0x800003ff', 'ONE', 'HARMONY-ONE (Legacy)'],\n 1024: ['0x80000400', 'ONT', 'Ontology'],\n 1025: ['0x80000401', 'CZZ', 'Classzz'],\n 1026: ['0x80000402', 'KEX', 'Kira Exchange Token'],\n 1027: ['0x80000403', 'MCM', 'Mochimo'],\n 1028: ['0x80000404', 'PLS', 'Pulse Coin'],\n 1032: ['0x80000408', 'BTCR', 'BTCR'],\n 1042: ['0x80000412', 'MFID', 'Moonfish ID'],\n 1111: ['0x80000457', 'BBC', 'Big Bitcoin'],\n 1116: ['0x8000045c', 'CORE', 'Core'],\n 1120: ['0x80000460', 'RISE', 'RISE'],\n 1122: ['0x80000462', 'CMT', 'CyberMiles Token'],\n 1128: ['0x80000468', 'ETSC', 'Ethereum Social'],\n 1129: ['0x80000469', 'DFI', 'DeFiChain'],\n 1130: ['0x8000046a', 'DFI', 'DeFiChain EVM Network'],\n 1137: ['0x80000471', '$DAG', 'Constellation Labs'],\n 1145: ['0x80000479', 'CDY', 'Bitcoin Candy'],\n 1155: ['0x80000483', 'ENJ', 'Enjin Coin'],\n 1170: ['0x80000492', 'HOO', 'Hoo Smart Chain'],\n 1234: ['0x800004d2', 'ALPH', 'Alephium'],\n 1236: ['0x800004d4', undefined, 'Masca'],\n 1237: ['0x800004d5', undefined, 'Nostr'],\n 1280: ['0x80000500', undefined, 'Kudos Setler'],\n 1284: ['0x80000504', 'GLMR', 'Moonbeam'],\n 1285: ['0x80000505', 'MOVR', 'Moonriver'],\n 1286: ['0x80000506', 'DSG', 'Dessage Social Protocol'],\n 1298: ['0x80000512', 'WPC', 'Wpc'],\n 1308: ['0x8000051c', 'WEI', 'WEI'],\n 1312: ['0x80000520', 'BITS', 'Entropy'],\n 1337: ['0x80000539', 'DFC', 'Defcoin'],\n 1338: ['0x8000053a', 'IRON', 'Iron Fish'],\n 1348: ['0x80000544', 'ISLM', 'IslamicCoin'],\n 1397: ['0x80000575', 'HYC', 'Hycon'],\n 1410: ['0x80000582', 'TENTSLP', 'TENT Simple Ledger Protocol'],\n 1510: ['0x800005e6', 'XSC', 'XT Smart Chain'],\n 1512: ['0x800005e8', 'AAC', 'Double-A Chain'],\n 1524: ['0x800005f4', undefined, 'Taler'],\n 1533: ['0x800005fd', 'BEAM', 'Beam'],\n 1536: ['0x80000600', 'GAS', 'BubiChain'],\n 1540: ['0x80000604', 'ATHENA', 'Athena'],\n 1551: ['0x8000060f', 'SDK', 'Sovereign SDK'],\n 1555: ['0x80000613', 'APC', 'Apc Chain'],\n 1616: ['0x80000650', 'ELF', 'AELF'],\n 1618: ['0x80000652', 'AUDL', 'AUDL'],\n 1620: ['0x80000654', 'ATH', 'Atheios'],\n 1627: ['0x8000065b', 'LUME', 'Lume Web'],\n 1642: ['0x8000066a', 'NEW', 'Newton'],\n 1657: ['0x80000679', 'BTA', 'Btachain'],\n 1668: ['0x80000684', 'NEOX', 'Neoxa'],\n 1669: ['0x80000685', 'MEWC', 'Meowcoin'],\n 1688: ['0x80000698', 'BCX', 'BitcoinX'],\n 1729: ['0x800006c1', 'XTZ', 'Tezos'],\n 1776: ['0x800006f0', 'LBTC', 'Liquid BTC'],\n 1777: ['0x800006f1', 'BBP', 'Biblepay'],\n 1784: ['0x800006f8', 'JPYS', 'JPY Stablecoin'],\n 1789: ['0x800006fd', 'VEGA', 'Vega Protocol'],\n 1815: ['0x80000717', 'ADA', 'Cardano'],\n 1818: ['0x8000071a', 'CUBE', 'Cube Chain Native Token'],\n 1856: ['0x80000743', 'TES', 'Teslacoin'],\n 1888: ['0x80000760', 'ZTX', 'Zetrix'],\n 1899: ['0x8000076b', 'XEC', 'eCash token'],\n 1900: ['0x8000076c', 'XNA', 'Neurai'],\n 1901: ['0x8000076d', 'CLC', 'Classica'],\n 1907: ['0x80000773', 'BITCI', 'Bitcicoin'],\n 1918: ['0x8000077e', 'BKC', 'Briskcoin'],\n 1919: ['0x8000077f', 'VIPS', 'VIPSTARCOIN'],\n 1926: ['0x80000786', 'CITY', 'City Coin'],\n 1951: ['0x8000079f', 'ESA', 'Esa'],\n 1952: ['0x800007a0', 'ESC', 'EsaCoin'],\n 1955: ['0x800007a3', 'XX', 'xx coin'],\n 1977: ['0x800007b9', 'XMX', 'Xuma'],\n 1984: ['0x800007c0', 'TRTL', 'TurtleCoin'],\n 1985: ['0x800007c1', 'SLRT', 'Solarti Chain'],\n 1986: ['0x800007c2', 'QTH', 'Qing Tong Horizon'],\n 1987: ['0x800007c3', 'EGEM', 'EtherGem'],\n 1988: ['0x800007c4', 'MIRA', 'Mira Chain'],\n 1989: ['0x800007c5', 'HODL', 'HOdlcoin'],\n 1990: ['0x800007c6', 'PHL', 'Placeholders'],\n 1991: ['0x800007c7', 'SC', 'Sia'],\n 1996: ['0x800007cc', 'MYT', 'Mineyourtime'],\n 1997: ['0x800007cd', 'POLIS', 'Polis'],\n 1998: ['0x800007ce', 'XMCC', 'Monoeci'],\n 1999: ['0x800007cf', 'COLX', 'ColossusXT'],\n 2000: ['0x800007d0', 'GIN', 'GinCoin'],\n 2001: ['0x800007d1', 'MNP', 'MNPCoin'],\n 2002: ['0x800007d2', 'MLN', 'Miraland'],\n 2015: ['0x800007df', 'TEER', 'Integritee'],\n 2017: ['0x800007e1', 'KIN', 'Kin'],\n 2018: ['0x800007e2', 'EOSC', 'EOSClassic'],\n 2019: ['0x800007e3', 'GBT', 'GoldBean Token'],\n 2020: ['0x800007e4', 'PKC', 'PKC'],\n 2021: ['0x800007e5', 'SKT', 'Sukhavati'],\n 2024: ['0x800007e8', 'USBC', 'Universal Ledger USBC'],\n 2022: ['0x800007e6', 'XHT', 'Xinghuo Token'],\n 2023: ['0x800007e7', 'COC', 'Chat On Chain'],\n 2025: ['0x800007e9', 'ROCK', 'Zenrock Labs'],\n 2026: ['0x800007ea', 'ASTRON', 'ASTRON Token'],\n 2046: ['0x800007fe', 'ANY', 'Any'],\n 2048: ['0x80000800', 'MCASH', 'MCashChain'],\n 2049: ['0x80000801', 'TRUE', 'TrueChain'],\n 2050: ['0x80000802', 'MOVO', 'Movo Smart Chain'],\n 2086: ['0x80000826', 'KILT', 'KILT Spiritnet'],\n 2091: ['0x8000082b', 'FRQCY', 'Frequency'],\n 2109: ['0x8000083d', 'SAMA', 'Exosama Network'],\n 2112: ['0x80000840', 'IoTE', 'IoTE'],\n 2125: ['0x8000084d', 'BAY', 'BitBay'],\n 2137: ['0x80000859', 'XRG', 'Ergon'],\n 2199: ['0x80000897', 'SAMA', 'Moonsama Network'],\n 2221: ['0x800008ad', 'ASK', 'ASK'],\n 2222: ['0x800008ae', 'CWEB', 'Coinweb'],\n 2285: ['0x800008ed', undefined, 'Qiyi Chain'],\n 2301: ['0x800008fd', 'QTUM', 'QTUM'],\n 2302: ['0x800008fe', 'ETP', 'Metaverse'],\n 2303: ['0x800008ff', 'GXC', 'GXChain'],\n 2304: ['0x80000900', 'CRP', 'CranePay'],\n 2305: ['0x80000901', 'ELA', 'Elastos'],\n 2338: ['0x80000922', 'SNOW', 'Snowblossom'],\n 2365: ['0x8000093d', 'XIN', 'Mixin'],\n 2500: ['0x800009c4', 'NEXI', 'Nexi'],\n 2570: ['0x80000a0a', 'AOA', 'Aurora'],\n 2686: ['0x80000a7e', 'AIPG', 'AIPowerGrid'],\n 2718: ['0x80000a9e', 'NAS', 'Nebulas'],\n 2809: ['0x80000af9', 'LAN', 'Lanify'],\n 2894: ['0x80000b4e', 'REOSC', 'REOSC Ecosystem'],\n 2941: ['0x80000b7d', 'BND', 'Blocknode'],\n 3000: ['0x80000bb8', 'SM', 'Stealth Message'],\n 3003: ['0x80000bbb', 'LUX', 'LUX'],\n 3030: ['0x80000bd6', 'HBAR', 'Hedera HBAR'],\n 3077: ['0x80000c05', 'COS', 'Contentos'],\n 3276: ['0x80000ccc', 'CCC', 'CodeChain'],\n 3344: ['0x80000d10', 'PLMC', 'Polimec'],\n 3333: ['0x80000d05', 'SXP', 'Solar'],\n 3338: ['0x80000d0a', 'PEAQ', 'peaq'],\n 3377: ['0x80000d31', 'ROI', 'ROIcoin'],\n 3381: ['0x80000d35', 'DYN', 'Dynamic'],\n 3383: ['0x80000d37', 'SEQ', 'Sequence'],\n 3434: ['0x80000d6a', 'PEPE', 'Pepecoin Core'],\n 3501: ['0x80000dad', 'JFIN', 'JFIN Coin'],\n 3552: ['0x80000de0', 'DEO', 'Destocoin'],\n 3564: ['0x80000dec', 'DST', 'DeStream'],\n 3601: ['0x80000e11', 'CY', 'Cybits'],\n 3757: ['0x80000ead', 'MPC', 'Partisia Blockchain'],\n 3840: ['0x80000f00', 'RED', 'ReDeFi RED'],\n 4040: ['0x80000fc8', 'FC8', 'FCH Network'],\n 4096: ['0x80001000', 'YEE', 'YeeCo'],\n 4218: ['0x8000107a', 'IOTA', 'IOTA'],\n 4219: ['0x8000107b', 'SMR', 'Shimmer'],\n 4242: ['0x80001092', 'AXE', 'Axe'],\n 4343: ['0x800010f7', 'XYM', 'Symbol'],\n 4444: ['0x8000115c', 'C4EI', 'Chain4Energy'],\n 4646: ['0x80001226', 'MST', 'MST'],\n 4919: ['0x80001337', 'XVM', 'Venidium'],\n 4976: ['0x80001370', 'VARA', 'Vara'],\n 4999: ['0x80001387', 'BXN', 'BlackFort Exchange Network'],\n 5000: ['0x80001388', 'V12', 'Vet The Vote'],\n 5006: ['0x8000138e', 'SBC', 'Senior Blockchain'],\n 5248: ['0x80001480', 'FIC', 'FIC'],\n 5353: ['0x800014e9', 'HNS', 'Handshake'],\n 5404: ['0x8000151c', 'ISK', 'ISKRA'],\n 5467: ['0x8000155b', 'ALTME', 'ALTME'],\n 5555: ['0x800015b3', 'FUND', 'Unification'],\n 5757: ['0x8000167d', 'STX', 'Stacks'],\n 5895: ['0x80001707', 'VOW', 'VowChain VOW'],\n 5920: ['0x80001720', 'SLU', 'SILUBIUM'],\n 5995: ['0x8000176B', 'DUSK', 'Dusk Network'],\n 6060: ['0x800017ac', 'GO', 'GoChain GO'],\n 6144: ['0x80001800', 'DTS', 'Datos'],\n 6174: ['0x8000181e', 'MOI', 'My Own Internet'],\n 6278: ['0x80001886', 'STEAMX', 'Rails Network Mainnet'],\n 6532: ['0x80001984', 'UM', 'Penumbra'],\n 6599: ['0x800019c7', 'RSC', 'Royal Sports City'],\n 6666: ['0x80001a0a', 'BPA', 'Bitcoin Pizza'],\n 6688: ['0x80001a20', 'SAFE', 'SAFE'],\n 6779: ['0x80001a7b', 'COTI', 'COTI'],\n 6969: ['0x80001b39', 'ROGER', 'TheHolyrogerCoin'],\n 7000: ['0x80001b58', 'ZETA', 'ZetaChain'],\n 7027: ['0x80001b73', 'ELLA', 'Ella the heart'],\n 7028: ['0x80001b74', 'AA', 'Arthera'],\n 7070: ['0x80001b9e', 'DOI', 'Doichain'],\n 7091: ['0x80001bb3', 'TOPL', 'Topl'],\n 7331: ['0x80001ca3', 'KLY', 'KLYNTAR'],\n 7341: ['0x80001cad', 'SHFT', 'Shyft'],\n 7518: ['0x80001d5e', 'MEV', 'MEVerse'],\n 7576: ['0x80001d98', 'ADIL', 'ADIL Chain'],\n 7777: ['0x80001e61', 'BTV', 'Bitvote'],\n 7779: ['0x80001e63', 'CPV', 'Compverse'],\n 8000: ['0x80001f40', 'SKY', 'Skycoin'],\n 8017: ['0x80001f51', 'ISC', 'iSunCoin'],\n 8080: ['0x80001f90', undefined, 'DSRV'],\n 8181: ['0x80001ff5', 'BOC', 'BeOne Chain'],\n 8192: ['0x80002000', 'PAC', 'pacprotocol'],\n 8217: ['0x80002019', 'KAIA', 'KAIA'],\n 8339: ['0x80002093', 'BTQ', 'BitcoinQuark'],\n 8444: ['0x800020fc', 'XCH', 'Chia'],\n 8453: ['0x80002105', undefined, 'Base'],\n 8520: ['0x80002148', '---', 'reserved'],\n 8680: ['0x800021e8', 'PLMNT', 'Planetmint'],\n 8732: ['0x8000221c', 'BLN', 'Bullions'],\n 8866: ['0x800022a2', 'GGX', 'Golden Gate'],\n 8886: ['0x800022b6', 'GGXT', 'Golden Gate Sydney'],\n 8888: ['0x800022b8', 'SBTC', 'Super Bitcoin'],\n 8964: ['0x80002304', 'NULS', 'NULS'],\n 8997: ['0x80002325', 'BBC', 'Babacoin'],\n 8998: ['0x80002326', 'JGC', 'JagoanCoin'],\n 8999: ['0x80002327', 'BTP', 'Bitcoin Pay'],\n 9000: ['0x80002328', 'AVAX', 'Avalanche'],\n 9001: ['0x80002329', 'ARB1', 'Arbitrum'],\n 9002: ['0x8000232a', 'BOBA', 'Boba'],\n 9003: ['0x8000232b', 'LOOP', 'Loopring'],\n 9004: ['0x8000232c', 'STRK', 'StarkNet'],\n 9005: ['0x8000232d', 'AVAXC', 'Avalanche C-Chain'],\n 9006: ['0x8000232e', 'BSC', 'Binance Smart Chain'],\n 9797: ['0x80002645', 'NRG', 'Energi'],\n 9888: ['0x800026a0', 'BTF', 'Bitcoin Faith'],\n 9969: ['0x800026f1', 'OSMI', 'Osmium'],\n 9999: ['0x8000270f', 'GOD', 'Bitcoin God'],\n 10000: ['0x80002710', 'FO', 'FIBOS'],\n 10001: ['0x80002711', 'SPACE', 'Space'],\n 10007: ['0x80002717', 'S', 'SONIC'],\n 10111: ['0x8000277f', 'DHP', 'dHealth'],\n 10226: ['0x800027f2', 'RTM', 'Raptoreum'],\n 10242: ['0x80002802', 'AA', 'Arthera'],\n 10291: ['0x80002833', 'XRC', 'XRhodium'],\n 10507: ['0x8000290b', 'NUM', 'Numbers Protocol'],\n 10605: ['0x8000296d', 'XPI', 'Lotus'],\n 11111: ['0x80002b67', 'ESS', 'Essentia One'],\n 11742: ['0x80002dde', 'VARCH', 'InvArch'],\n 11743: ['0x80002ddf', 'TNKR', 'Tinkernet'],\n 12345: ['0x80003039', 'IPOS', 'IPOS'],\n 12586: ['0x8000312a', 'MINA', 'Mina'],\n 13107: ['0x80003333', 'BTY', 'BitYuan'],\n 13108: ['0x80003334', 'YCC', 'Yuan Chain Coin'],\n 13381: ['0x80003445', 'PHX', 'Phoenix'],\n 14001: ['0x800036b1', 'WAX', 'Worldwide Asset Exchange'],\n 15845: ['0x80003de5', 'SDGO', 'SanDeGo'],\n 16181: ['0x80003f35', 'XTX', 'Totem Live Network'],\n 16754: ['0x80004172', 'ARDR', 'Ardor'],\n 18000: ['0x80004650', 'MTR', 'Meter'],\n 19165: ['0x80004add', 'SAFE', 'Safecoin'],\n 19167: ['0x80004adf', 'FLUX', 'Flux'],\n 19169: ['0x80004ae1', 'RITO', 'Ritocoin'],\n 19788: ['0x80004d4c', 'ML', 'Mintlayer'],\n 20036: ['0x80004e44', 'XND', 'ndau'],\n 21004: ['0x8000520c', 'C4EI', 'c4ei'],\n 21337: ['0x80005359', 'XAH', 'Xahau'],\n 21888: ['0x80005580', 'PAC', 'Pactus'],\n 22504: ['0x800057e8', 'PWR', 'PWRcoin'],\n 23000: ['0x800059d8', 'EPIC', 'Epic Cash'],\n 25252: ['0x800062a4', 'BELL', 'Bellcoin'],\n 25718: ['0x80006476', 'CHX', 'Own'],\n 26417: ['0x80006731', 'G1', 'Ğ1'],\n 29223: ['0x80007227', 'NEXA', 'Nexa'],\n 30001: ['0x80007531', '---', 'reserved'],\n 31102: ['0x8000797e', 'ESN', 'EtherSocial Network'],\n 31337: ['0x80007a69', undefined, 'ThePower'],\n 33416: ['0x80008288', 'TEO', 'Trust Eth reOrigin'],\n 33878: ['0x80008456', 'BTCS', 'Bitcoin Stake'],\n 34952: ['0x80008888', 'BTT', 'ByteTrade'],\n 37992: ['0x80009468', 'FXTC', 'FixedTradeCoin'],\n 39321: ['0x80009999', 'AMA', 'Amabig'],\n 42069: ['0x8000a455', 'FACT', 'FACT0RN'],\n 43028: ['0x8000a814', 'AXIV', 'AXIV'],\n 47803: ['0x8000babb', 'BAX', 'BAX'],\n 49262: ['0x8000c06e', 'EVE', 'evan'],\n 49344: ['0x8000c0c0', 'STASH', 'STASH'],\n 52752: ['0x8000ce10', 'CELO', 'Celo'],\n 54176: ['0x8000d3a0', 'OVER', 'OverProtocol'],\n 61616: ['0x8000f0b0', 'TH', 'TianHe'],\n 65536: ['0x80010000', 'KETH', 'Krypton World'],\n 69420: ['0x80010f2c', 'GRLC', 'Garlicoin'],\n 70007: ['0x80011177', 'GWL', 'Gewel'],\n 83293: ['0x8001455d', 'QUBIC', 'Qubic'],\n 77777: ['0x80012fd1', 'ZYN', 'Wethio'],\n 88888: ['0x80015b38', 'RYO', 'c0ban'],\n 99999: ['0x8001869f', 'WICC', 'Waykichain'],\n 100500: ['0x80018894', 'HOME', 'HomeCoin'],\n 101010: ['0x80018a92', 'STC', 'Starcoin'],\n 104109: ['0x800196ad', undefined, 'Seed Hypermedia'],\n 105105: ['0x80019a91', 'STRAX', 'Strax'],\n 111111: ['0x8001b207', 'KAS', 'Kaspa'],\n 121337: ['0x8001d9f9', 'KLS', 'Karlsen'],\n 123456: ['0x8001e240', 'SPR', 'Spectre'],\n 130822: ['0x8001ff06', 'WBT', 'WhiteBIT Coin'],\n 161803: ['0x8002780b', 'APTA', 'Bloqs4Good'],\n 200625: ['0x80030fb1', 'AKA', 'Akroma'],\n 200901: ['0x800310c5', 'BTR', 'Bitlayer'],\n 224433: ['0x80036cb1', 'CONET', 'CONET Holesky Network'],\n 246529: ['0x8003c301', 'ATS', 'ARTIS sigma1'],\n 261131: ['0x8003fc0b', 'ZAMA', 'Zama'],\n 314159: ['0x8004cb2f', 'PI', 'Pi Network'],\n 333332: ['0x80051614', 'VALUE', 'Value Chain'],\n 333333: ['0x80051615', 3333, 'Pi Value Consensus'],\n 424242: ['0x80067932', 'X42', 'x42'],\n 440017: ['0x8006b6d1', '@G', 'Graphite'],\n 534352: ['0x80082750', 'SCR', 'Scroll'],\n 666666: ['0x800a2c2a', 'VITE', 'Vite'],\n 696365: ['0x800b3206', 'ICE', 'Ice Network'],\n 888888: ['0x800d9038', 'SEA', 'Second Exchange Alliance'],\n 999999: ['0x800c9061', 'WTC', 'WaltonChain'],\n 1048576: ['0x80100000', 'AMAX', 'Armonia Meta Chain'],\n 1171337: ['0x8011df89', 'ILT', 'iOlite'],\n 1313114: ['0x8014095a', 'ETHO', 'Etho Protocol'],\n 1313500: ['0x80140adc', 'XERO', 'Xerom'],\n 1712144: ['0x801a2010', 'LAX', 'LAPO'],\n 3924011: ['0x803be02b', 'EPK', 'EPIK Protocol'],\n 4741444: ['0x80485944', 'HYD', 'Hydra Token'],\n 5249353: ['0x80501949', 'BCO', 'BitcoinOre'],\n 5249354: ['0x8050194a', 'BHD', 'BitcoinHD'],\n 5264462: ['0x8050544e', 'PTN', 'PalletOne'],\n 5655640: ['0x80564c58', 'VLX', 'Velas'],\n 5718350: ['0x8057414e', 'WAN', 'Wanchain'],\n 5741564: ['0x80579bfc', 'WAVES', 'Waves'],\n 5741565: ['0x80579bfd', 'WEST', 'Waves Enterprise'],\n 6382179: ['0x80616263', 'ABC', 'Abcmint'],\n 6517357: ['0x8063726d', 'CRM', 'Creamcoin'],\n 7171666: ['0x806d6e52', 'BROCK', 'Bitrock'],\n 7562605: ['0x8073656d', 'SEM', 'Semux'],\n 7567736: ['0x80737978', 'ION', 'ION'],\n 7777777: ['0x8076adf1', 'FCT', 'FirmaChain'],\n 7825266: ['0x80776772', 'WGR', 'WGR'],\n 7825267: ['0x80776773', 'OBSR', 'OBServer'],\n 8163271: ['0x807c8fc7', 'AFS', 'ANFS'],\n 10000118: ['0x805d30b6', 'OSMO', 'Osmosis'],\n 15118976: ['0x80e6b280', 'XDS', 'XDS'],\n 19000118: ['0x8121eb36', 'SEI', 'SEI'],\n 61717561: ['0x83adbc39', 'AQUA', 'Aquachain'],\n 77777777: ['0x84a2cb71', 'AZT', 'Aztecoin'],\n 88888888: ['0x854c5638', 'HATCH', 'Hatch'],\n 91927009: ['0x857ab1e1', 'kUSD', 'kUSD'],\n 99999996: ['0x85f5e0fc', 'GENS', 'GENS'],\n 99999997: ['0x85f5e0fd', 'EQ', 'EQ'],\n 99999998: ['0x85f5e0fe', 'FLUID', 'Fluid Chains'],\n 99999999: ['0x85f5e0ff', 'QKC', 'QuarkChain'],\n 11259375: ['0x80abcdef', 'LBR', '0L'],\n 20230101: ['0x8134afd5', 'ROH', 'Rooch'],\n 20240430: ['0x8134d82e', 'NLK', 'NuLinkCoin'],\n 608589380: ['0xa4465644', 'FVDC', 'ForumCoin'],\n 1179993420: ['0xc655454c', undefined, 'Fuel'],\n 1179993421: ['0xc655454d', 'TTNC', 'TakeTitan'],\n 1179993431: ['0xc6554557', 'MTGBP', 'MTGBP'],\n 1179993441: ['0xc6554561', 'QFS', 'Qfs'],\n 1179993451: ['0xc655456b', 'RWA', 'Asset Chain']\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.d.ts b/dist/src/libs/humanizer/index.d.ts new file mode 100644 index 000000000..ee4016822 --- /dev/null +++ b/dist/src/libs/humanizer/index.d.ts @@ -0,0 +1,10 @@ +import { Storage } from '../../interfaces/storage'; +import { Message } from '../../interfaces/userRequest'; +import { AccountOp } from '../accountOp/accountOp'; +import { HumanizerCallModule, HumanizerOptions, IrCall, IrMessage } from './interfaces'; +export declare const humanizerCallModules: HumanizerCallModule[]; +declare const humanizeAccountOp: (_accountOp: AccountOp, options: HumanizerOptions) => IrCall[]; +declare const humanizeMessage: (_message: Message) => IrMessage; +declare function clearHumanizerMetaObjectFromStorage(storage: Storage): Promise; +export { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.d.ts.map b/dist/src/libs/humanizer/index.d.ts.map new file mode 100644 index 000000000..b3144ff20 --- /dev/null +++ b/dist/src/libs/humanizer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/humanizer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,OAAO,EACL,mBAAmB,EAEnB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACV,MAAM,cAAc,CAAA;AAuCrB,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,EA4BrD,CAAA;AAcD,QAAA,MAAM,iBAAiB,eAAgB,SAAS,WAAW,gBAAgB,KAAG,MAAM,EAiBnF,CAAA;AAED,QAAA,MAAM,eAAe,aAAc,OAAO,KAAG,SAa5C,CAAA;AAKD,iBAAe,mCAAmC,CAAC,OAAO,EAAE,OAAO,iBAElE;AAED,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,mCAAmC,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.js b/dist/src/libs/humanizer/index.js new file mode 100644 index 000000000..07dc7b8bb --- /dev/null +++ b/dist/src/libs/humanizer/index.js @@ -0,0 +1,109 @@ +import humanizerInfo from '../../consts/humanizer/humanizerInfo.json'; +import { parse, stringify } from '../richJson/richJson'; +import { ensMessageModule, entryPointModule, erc20Module, erc721Module, legendsMessageModule, openseaMessageModule, permit2Module } from './messageModules'; +import OneInchModule from './modules/1Inch'; +import { aaveHumanizer } from './modules/Aave'; +import AcrossModule from './modules/Across'; +import { airdropsModule } from './modules/Airdrops'; +import asciiModule from './modules/AsciiModule'; +import curveModule from './modules/Curve'; +import { deploymentModule } from './modules/Deployment'; +import { embeddedAmbireOperationHumanizer } from './modules/embeddedAmbireOperationHumanizer'; +import { ensModule } from './modules/ENS'; +import fallbackHumanizer from './modules/FallbackHumanizer'; +import gasTankModule from './modules/GasTankModule'; +import KyberSwap from './modules/KyberSwap'; +import legendsModule from './modules/Legends'; +import { LidoModule } from './modules/Lido'; +import { openSeaModule } from './modules/OpenSea'; +import { postProcessing } from './modules/PostProcessing/postProcessModule'; +import preProcessHumanizer from './modules/PreProcess'; +import privilegeHumanizer from './modules/Privileges'; +import singletonFactory from './modules/SingletonFactory'; +import { SocketModule } from './modules/Socket'; +import sushiSwapModule from './modules/Sushiswap'; +import { genericErc20Humanizer, genericErc721Humanizer } from './modules/Tokens'; +import traderJoeModule from './modules/TraderJoe'; +import { uniswapHumanizer } from './modules/Uniswap'; +import { WALLETModule } from './modules/WALLET'; +import wrappingModule from './modules/Wrapping'; +// from most generic to least generic +// the final humanization is the final triggered module +export const humanizerCallModules = [ + preProcessHumanizer, + embeddedAmbireOperationHumanizer, + deploymentModule, + genericErc721Humanizer, + genericErc20Humanizer, + LidoModule, + gasTankModule, + airdropsModule, + uniswapHumanizer, + curveModule, + traderJoeModule, + KyberSwap, + SocketModule, + AcrossModule, + OneInchModule, + wrappingModule, + aaveHumanizer, + WALLETModule, + privilegeHumanizer, + sushiSwapModule, + legendsModule, + singletonFactory, + ensModule, + openSeaModule, + asciiModule, + fallbackHumanizer, + postProcessing +]; +// from least generic to most generic +// the final visualization and warnings are from the first triggered module +const humanizerTMModules = [ + erc20Module, + erc721Module, + permit2Module, + entryPointModule, + legendsMessageModule, + ensMessageModule, + openseaMessageModule +]; +const humanizeAccountOp = (_accountOp, options) => { + const accountOp = parse(stringify(_accountOp)); + const humanizerOptions = { + ...options, + networkId: accountOp.networkId + }; + let currentCalls = accountOp.calls; + humanizerCallModules.forEach((hm) => { + try { + currentCalls = hm(accountOp, currentCalls, humanizerInfo, humanizerOptions); + } + catch (error) { + console.error(error); + // No action is needed here; we only set `currentCalls` if the module successfully resolves the calls. + } + }); + return currentCalls; +}; +const humanizeMessage = (_message) => { + const message = parse(stringify(_message)); + try { + // runs all modules and takes the first non empty array + const { fullVisualization, warnings } = humanizerTMModules.map((m) => m(message)).filter((p) => p.fullVisualization?.length)[0] || {}; + return { ...message, fullVisualization, warnings }; + } + catch (error) { + console.error(error); + return message; + } +}; +// As of version v4.34.0 HumanizerMetaV2 in storage is no longer needed. It was +// used for persisting learnt data from async operations, triggered by the +// humanization process. +async function clearHumanizerMetaObjectFromStorage(storage) { + await storage.remove('HumanizerMetaV2'); +} +export { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.js.map b/dist/src/libs/humanizer/index.js.map new file mode 100644 index 000000000..888ebf17c --- /dev/null +++ b/dist/src/libs/humanizer/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import humanizerInfo from '../../consts/humanizer/humanizerInfo.json'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { parse, stringify } from '../richJson/richJson'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerOptions,\n IrCall,\n IrMessage\n} from './interfaces'\nimport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n openseaMessageModule,\n permit2Module\n} from './messageModules'\nimport OneInchModule from './modules/1Inch'\nimport { aaveHumanizer } from './modules/Aave'\nimport AcrossModule from './modules/Across'\nimport { airdropsModule } from './modules/Airdrops'\nimport asciiModule from './modules/AsciiModule'\nimport curveModule from './modules/Curve'\nimport { deploymentModule } from './modules/Deployment'\nimport { embeddedAmbireOperationHumanizer } from './modules/embeddedAmbireOperationHumanizer'\nimport { ensModule } from './modules/ENS'\nimport fallbackHumanizer from './modules/FallbackHumanizer'\nimport gasTankModule from './modules/GasTankModule'\nimport KyberSwap from './modules/KyberSwap'\nimport legendsModule from './modules/Legends'\nimport { LidoModule } from './modules/Lido'\nimport { openSeaModule } from './modules/OpenSea'\nimport { postProcessing } from './modules/PostProcessing/postProcessModule'\nimport preProcessHumanizer from './modules/PreProcess'\nimport privilegeHumanizer from './modules/Privileges'\nimport singletonFactory from './modules/SingletonFactory'\nimport { SocketModule } from './modules/Socket'\nimport sushiSwapModule from './modules/Sushiswap'\nimport { genericErc20Humanizer, genericErc721Humanizer } from './modules/Tokens'\nimport traderJoeModule from './modules/TraderJoe'\nimport { uniswapHumanizer } from './modules/Uniswap'\nimport { WALLETModule } from './modules/WALLET'\nimport wrappingModule from './modules/Wrapping'\n\n// from most generic to least generic\n// the final humanization is the final triggered module\nexport const humanizerCallModules: HumanizerCallModule[] = [\n preProcessHumanizer,\n embeddedAmbireOperationHumanizer,\n deploymentModule,\n genericErc721Humanizer,\n genericErc20Humanizer,\n LidoModule,\n gasTankModule,\n airdropsModule,\n uniswapHumanizer,\n curveModule,\n traderJoeModule,\n KyberSwap,\n SocketModule,\n AcrossModule,\n OneInchModule,\n wrappingModule,\n aaveHumanizer,\n WALLETModule,\n privilegeHumanizer,\n sushiSwapModule,\n legendsModule,\n singletonFactory,\n ensModule,\n openSeaModule,\n asciiModule,\n fallbackHumanizer,\n postProcessing\n]\n\n// from least generic to most generic\n// the final visualization and warnings are from the first triggered module\nconst humanizerTMModules = [\n erc20Module,\n erc721Module,\n permit2Module,\n entryPointModule,\n legendsMessageModule,\n ensMessageModule,\n openseaMessageModule\n]\n\nconst humanizeAccountOp = (_accountOp: AccountOp, options: HumanizerOptions): IrCall[] => {\n const accountOp = parse(stringify(_accountOp))\n const humanizerOptions: HumanizerOptions = {\n ...options,\n networkId: accountOp.networkId\n }\n\n let currentCalls: IrCall[] = accountOp.calls\n humanizerCallModules.forEach((hm) => {\n try {\n currentCalls = hm(accountOp, currentCalls, humanizerInfo as HumanizerMeta, humanizerOptions)\n } catch (error) {\n console.error(error)\n // No action is needed here; we only set `currentCalls` if the module successfully resolves the calls.\n }\n })\n return currentCalls\n}\n\nconst humanizeMessage = (_message: Message): IrMessage => {\n const message = parse(stringify(_message))\n\n try {\n // runs all modules and takes the first non empty array\n const { fullVisualization, warnings } =\n humanizerTMModules.map((m) => m(message)).filter((p) => p.fullVisualization?.length)[0] || {}\n\n return { ...message, fullVisualization, warnings }\n } catch (error) {\n console.error(error)\n return message\n }\n}\n\n// As of version v4.34.0 HumanizerMetaV2 in storage is no longer needed. It was\n// used for persisting learnt data from async operations, triggered by the\n// humanization process.\nasync function clearHumanizerMetaObjectFromStorage(storage: Storage) {\n await storage.remove('HumanizerMetaV2')\n}\n\nexport { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/interfaces.d.ts b/dist/src/libs/humanizer/interfaces.d.ts new file mode 100644 index 000000000..faaf3377b --- /dev/null +++ b/dist/src/libs/humanizer/interfaces.d.ts @@ -0,0 +1,85 @@ +import { Account } from '../../interfaces/account'; +import { Network, NetworkId } from '../../interfaces/network'; +import { Message } from '../../interfaces/userRequest'; +import { AccountOp } from '../accountOp/accountOp'; +import { Call } from '../accountOp/types'; +export type HumanizerVisualization = ({ + type: 'address' | 'label' | 'action' | 'danger' | 'deadline' | 'chain' | 'message' | 'image' | 'link' | 'text'; + url?: string; + address?: string; + content?: string; + value?: bigint; + warning?: boolean; + chainId?: bigint; + messageContent?: Uint8Array | string; +} | { + type: 'token'; + address: string; + value: bigint; + chainId?: bigint; +}) & { + isHidden?: boolean; + id: number; + content?: string; + isBold?: boolean; +}; +export interface IrCall extends Call { + fullVisualization?: HumanizerVisualization[]; + warnings?: HumanizerWarning[]; +} +export interface IrMessage extends Message { + fullVisualization?: HumanizerVisualization[]; + warnings?: HumanizerWarning[]; +} +export interface HumanizerWarning { + content: string; + level?: 'caution' | 'alert' | 'alarm'; +} +export interface Ir { + calls: IrCall[]; + messages: IrMessage[]; +} +export interface HumanizerCallModule { + (AccountOp: AccountOp, calls: IrCall[], humanizerMeta: HumanizerMeta, options?: HumanizerOptions): IrCall[]; +} +export interface HumanizerTypedMessageModule { + (typedMessage: Message): Omit; +} +export interface AbiFragment { + selector: string; + type: 'error' | 'function' | 'event'; + signature: string; +} +export interface HumanizerMetaAddress { + name?: string; + token?: { + symbol: string; + decimals: number; + networks?: string[]; + }; + isSC?: { + abiName?: string; + }; +} +export interface HumanizerMeta { + abis: { + [name: string]: { + [selector: string]: AbiFragment; + }; + NO_ABI: { + [selector: string]: AbiFragment; + }; + }; + knownAddresses: { + [address: string]: HumanizerMetaAddress; + }; +} +export interface HumanizerOptions { + network?: Network; + networkId?: NetworkId; +} +export type DataToHumanize = AccountOp | Message; +export type KnownAddressLabels = { + [key in Account['addr']]: string; +}; +//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/interfaces.d.ts.map b/dist/src/libs/humanizer/interfaces.d.ts.map new file mode 100644 index 000000000..85d601ea4 --- /dev/null +++ b/dist/src/libs/humanizer/interfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/libs/humanizer/interfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/interfaces.js b/dist/src/libs/humanizer/interfaces.js new file mode 100644 index 000000000..c30bb68c1 --- /dev/null +++ b/dist/src/libs/humanizer/interfaces.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/interfaces.js.map b/dist/src/libs/humanizer/interfaces.js.map new file mode 100644 index 000000000..b34af64ac --- /dev/null +++ b/dist/src/libs/humanizer/interfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { Message } from '../../interfaces/userRequest'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\n\n// @TODO remove property humanizerMeta\nexport type HumanizerVisualization = (\n | {\n type:\n | 'address'\n | 'label'\n | 'action'\n | 'danger'\n | 'deadline'\n | 'chain'\n | 'message'\n | 'image'\n | 'link'\n | 'text'\n url?: string\n address?: string\n content?: string\n value?: bigint\n warning?: boolean\n chainId?: bigint\n messageContent?: Uint8Array | string\n }\n | {\n type: 'token'\n address: string\n value: bigint\n chainId?: bigint\n }\n) & { isHidden?: boolean; id: number; content?: string; isBold?: boolean }\nexport interface IrCall extends Call {\n fullVisualization?: HumanizerVisualization[]\n warnings?: HumanizerWarning[]\n}\nexport interface IrMessage extends Message {\n fullVisualization?: HumanizerVisualization[]\n warnings?: HumanizerWarning[]\n}\nexport interface HumanizerWarning {\n content: string\n level?: 'caution' | 'alert' | 'alarm'\n}\nexport interface Ir {\n calls: IrCall[]\n messages: IrMessage[]\n}\n\n// @TODO make humanizer options interface\nexport interface HumanizerCallModule {\n (\n AccountOp: AccountOp,\n calls: IrCall[],\n humanizerMeta: HumanizerMeta,\n options?: HumanizerOptions\n ): IrCall[]\n}\n\nexport interface HumanizerTypedMessageModule {\n (typedMessage: Message): Omit\n}\n\nexport interface AbiFragment {\n selector: string\n type: 'error' | 'function' | 'event'\n signature: string\n}\n\nexport interface HumanizerMetaAddress {\n name?: string\n // undefined means it is not a token\n token?: { symbol: string; decimals: number; networks?: string[] }\n // undefined means not a SC, {} means it is SC but we have no more info\n isSC?: { abiName?: string }\n}\n\n// more infor here https://github.com/AmbireTech/ambire-app/issues/1662\nexport interface HumanizerMeta {\n abis: {\n [name: string]: {\n [selector: string]: AbiFragment\n }\n NO_ABI: {\n [selector: string]: AbiFragment\n }\n }\n knownAddresses: {\n [address: string]: HumanizerMetaAddress\n }\n}\n\nexport interface HumanizerOptions {\n network?: Network\n networkId?: NetworkId\n}\n\nexport type DataToHumanize = AccountOp | Message\n\nexport type KnownAddressLabels = { [key in Account['addr']]: string }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.d.ts b/dist/src/libs/humanizer/messageModules/ensModule.d.ts new file mode 100644 index 000000000..dde4c6373 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/ensModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const ensMessageModule: HumanizerTypedMessageModule; +//# sourceMappingURL=ensModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.d.ts.map b/dist/src/libs/humanizer/messageModules/ensModule.d.ts.map new file mode 100644 index 000000000..9f55fe82f --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/ensModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ensModule.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/ensModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAG3D,eAAO,MAAM,gBAAgB,EAAE,2BAkB9B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.js b/dist/src/libs/humanizer/messageModules/ensModule.js new file mode 100644 index 000000000..9b7febea0 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/ensModule.js @@ -0,0 +1,20 @@ +import { getAction, getDeadline, getLabel } from '../utils'; +export const ensMessageModule = (message) => { + if (message.content.kind !== 'typedMessage') + return { fullVisualization: [] }; + if (message.content.domain.name === 'Ethereum Name Service') { + if (message.content.message.upload === 'avatar' && + message.content.message.name && + message.content.message.expiry) + return { + fullVisualization: [ + getAction('Update'), + getLabel('ENS profile pic of'), + getLabel(message.content.message.name), + getDeadline(BigInt(message.content.message.expiry) / 1000n) + ] + }; + } + return { fullVisualization: [] }; +}; +//# sourceMappingURL=ensModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.js.map b/dist/src/libs/humanizer/messageModules/ensModule.js.map new file mode 100644 index 000000000..597660f58 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/ensModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ensModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/ensModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE;QAC3D,IACE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;YAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YAC5B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;YAE9B,OAAO;gBACL,iBAAiB,EAAE;oBACjB,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,oBAAoB,CAAC;oBAC9B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBACtC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;iBAC5D;aACF,CAAA;KACJ;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getDeadline, getLabel } from '../utils'\n\nexport const ensMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n if (message.content.domain.name === 'Ethereum Name Service') {\n if (\n message.content.message.upload === 'avatar' &&\n message.content.message.name &&\n message.content.message.expiry\n )\n return {\n fullVisualization: [\n getAction('Update'),\n getLabel('ENS profile pic of'),\n getLabel(message.content.message.name),\n getDeadline(BigInt(message.content.message.expiry) / 1000n)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts b/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts new file mode 100644 index 000000000..dbd044551 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const entryPointModule: HumanizerTypedMessageModule; +//# sourceMappingURL=entryPointModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts.map b/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts.map new file mode 100644 index 000000000..896737bba --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"entryPointModule.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/entryPointModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAG3D,eAAO,MAAM,gBAAgB,EAAE,2BAY9B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.js b/dist/src/libs/humanizer/messageModules/entryPointModule.js new file mode 100644 index 000000000..3378ef17d --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.js @@ -0,0 +1,16 @@ +import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../userOperation/userOperation'; +import { getAction, getAddressVisualization, getLabel } from '../utils'; +export const entryPointModule = (message) => { + if (message.content.kind !== 'typedMessage') + return { fullVisualization: [] }; + if (message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) + return { + fullVisualization: [ + getAction('Authorize entry point'), + getLabel('for'), + getAddressVisualization(message.accountAddr) + ] + }; + return { fullVisualization: [] }; +}; +//# sourceMappingURL=entryPointModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.js.map b/dist/src/libs/humanizer/messageModules/entryPointModule.js.map new file mode 100644 index 000000000..b3d33a615 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"entryPointModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/entryPointModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oCAAoC,EAAE,MAAM,mCAAmC,CAAA;AAExF,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEvE,MAAM,CAAC,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAE7E,IAAI,OAAO,CAAC,YAAY,KAAK,oCAAoC;QAC/D,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,uBAAuB,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC;gBACf,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC;aAC7C;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../userOperation/userOperation'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const entryPointModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n\n if (message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return {\n fullVisualization: [\n getAction('Authorize entry point'),\n getLabel('for'),\n getAddressVisualization(message.accountAddr)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.d.ts b/dist/src/libs/humanizer/messageModules/erc20Module.d.ts new file mode 100644 index 000000000..4036b8631 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc20Module.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const erc20Module: HumanizerTypedMessageModule; +//# sourceMappingURL=erc20Module.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.d.ts.map b/dist/src/libs/humanizer/messageModules/erc20Module.d.ts.map new file mode 100644 index 000000000..33a5ff769 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc20Module.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"erc20Module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc20Module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAA0B,MAAM,eAAe,CAAA;AAGnF,eAAO,MAAM,WAAW,EAAE,2BAwCzB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.js b/dist/src/libs/humanizer/messageModules/erc20Module.js new file mode 100644 index 000000000..0acaf5752 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc20Module.js @@ -0,0 +1,40 @@ +import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; +export const erc20Module = (message) => { + if (message.content.kind !== 'typedMessage') + return { fullVisualization: [] }; + const tm = message.content; + if (tm.types.Permit && + tm.primaryType === 'Permit' && + tm.message && + ['owner', 'spender', 'value', 'nonce', 'deadline'].every((i) => i in tm.message) && + tm.domain.verifyingContract) { + return { + fullVisualization: [ + getAction('Grant approval'), + getLabel('for'), + getToken(tm.domain.verifyingContract, tm.message.value), + getLabel('to'), + getAddressVisualization(tm.message.spender), + tm.message.deadline ? getDeadline(tm.message.deadline) : null + ].filter((x) => x) + }; + } + if (tm.types.PermitSingle && + tm.primaryType === 'PermitSingle' && + tm?.message?.spender && + tm?.message?.details?.token && + tm?.message?.details?.amount && + tm?.message?.details?.expiration) { + return { + fullVisualization: [ + getAction('Approve'), + getAddressVisualization(tm.message.spender), + getLabel('to use'), + getToken(tm.message.details.token, BigInt(tm.message.details.amount)), + getDeadline(tm.message.details.expiration) + ] + }; + } + return { fullVisualization: [] }; +}; +//# sourceMappingURL=erc20Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.js.map b/dist/src/libs/humanizer/messageModules/erc20Module.js.map new file mode 100644 index 000000000..dd1c87b20 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc20Module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"erc20Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc20Module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE9F,MAAM,CAAC,MAAM,WAAW,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC3E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO;QACV,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;QAChF,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAC3B;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,gBAAgB,CAAC;gBAC3B,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAkB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;aAC9D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAA6B;SAC/C,CAAA;KACF;IACD,IACE,EAAE,CAAC,KAAK,CAAC,YAAY;QACrB,EAAE,CAAC,WAAW,KAAK,cAAc;QACjC,EAAE,EAAE,OAAO,EAAE,OAAO;QACpB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;QAC3B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;QAC5B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAChC;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,SAAS,CAAC;gBACpB,uBAAuB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,QAAQ,CAAC,QAAQ,CAAC;gBAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;aAC3C;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nexport const erc20Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message &&\n ['owner', 'spender', 'value', 'nonce', 'deadline'].every((i) => i in tm.message) &&\n tm.domain.verifyingContract\n ) {\n return {\n fullVisualization: [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(tm.domain.verifyingContract!, tm.message.value),\n getLabel('to'),\n getAddressVisualization(tm.message.spender),\n tm.message.deadline ? getDeadline(tm.message.deadline) : null\n ].filter((x) => x) as HumanizerVisualization[]\n }\n }\n if (\n tm.types.PermitSingle &&\n tm.primaryType === 'PermitSingle' &&\n tm?.message?.spender &&\n tm?.message?.details?.token &&\n tm?.message?.details?.amount &&\n tm?.message?.details?.expiration\n ) {\n return {\n fullVisualization: [\n getAction('Approve'),\n getAddressVisualization(tm.message.spender),\n getLabel('to use'),\n getToken(tm.message.details.token, BigInt(tm.message.details.amount)),\n getDeadline(tm.message.details.expiration)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.d.ts b/dist/src/libs/humanizer/messageModules/erc721Module.d.ts new file mode 100644 index 000000000..7f5726c9e --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc721Module.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const erc721Module: HumanizerTypedMessageModule; +//# sourceMappingURL=erc721Module.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.d.ts.map b/dist/src/libs/humanizer/messageModules/erc721Module.d.ts.map new file mode 100644 index 000000000..072797530 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc721Module.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"erc721Module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc721Module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAA0B,MAAM,eAAe,CAAA;AAkBnF,eAAO,MAAM,YAAY,EAAE,2BAqB1B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.js b/dist/src/libs/humanizer/messageModules/erc721Module.js new file mode 100644 index 000000000..acfedeb38 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc721Module.js @@ -0,0 +1,29 @@ +import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; +const visualizePermit = (spender, tokenId, deadline, contract) => { + const res = [ + getAction('Permit use of'), + getToken(contract, tokenId), + getLabel('to'), + getAddressVisualization(spender) + ]; + if (getDeadline(deadline)) + res.push(getDeadline(deadline)); + return res; +}; +export const erc721Module = (message) => { + if (message.content.kind !== 'typedMessage') + return { fullVisualization: [] }; + const tm = message.content; + if (tm.types.Permit && + tm.primaryType === 'Permit' && + tm.message.spender && + tm.message.tokenId && + tm.message.nonce && + tm.message.deadline) { + return { + fullVisualization: visualizePermit(tm.message.spender, tm.message.tokenId, tm.message.deadline, tm.domain.verifyingContract) + }; + } + return { fullVisualization: [] }; +}; +//# sourceMappingURL=erc721Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.js.map b/dist/src/libs/humanizer/messageModules/erc721Module.js.map new file mode 100644 index 000000000..628bae34e --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/erc721Module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"erc721Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc721Module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE9F,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,OAAe,EACf,QAAgB,EAChB,QAAgB,EACU,EAAE;IAC5B,MAAM,GAAG,GAAG;QACV,SAAS,CAAC,eAAe,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;QACd,uBAAuB,CAAC,OAAO,CAAC;KACjC,CAAA;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAA2B,CAAC,CAAA;IACpF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC5E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,KAAK;QAChB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB;QACA,OAAO;YACL,iBAAiB,EAAE,eAAe,CAChC,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB,EAAE,CAAC,MAAM,CAAC,iBAA2B,CACtC;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nconst visualizePermit = (\n spender: string,\n tokenId: bigint,\n deadline: bigint,\n contract: string\n): HumanizerVisualization[] => {\n const res = [\n getAction('Permit use of'),\n getToken(contract, tokenId),\n getLabel('to'),\n getAddressVisualization(spender)\n ]\n if (getDeadline(deadline)) res.push(getDeadline(deadline) as HumanizerVisualization)\n return res\n}\nexport const erc721Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message.spender &&\n tm.message.tokenId &&\n tm.message.nonce &&\n tm.message.deadline\n ) {\n return {\n fullVisualization: visualizePermit(\n tm.message.spender,\n tm.message.tokenId,\n tm.message.deadline,\n tm.domain.verifyingContract as string\n )\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.d.ts b/dist/src/libs/humanizer/messageModules/index.d.ts new file mode 100644 index 000000000..5ea371ccc --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/index.d.ts @@ -0,0 +1,9 @@ +import { ensMessageModule } from './ensModule'; +import { entryPointModule } from './entryPointModule'; +import { erc20Module } from './erc20Module'; +import { erc721Module } from './erc721Module'; +import { legendsMessageModule } from './legendsModule'; +import { openseaMessageModule } from './openseaModule'; +import { permit2Module } from './permit2Module'; +export { ensMessageModule, entryPointModule, erc20Module, erc721Module, legendsMessageModule, permit2Module, openseaMessageModule }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.d.ts.map b/dist/src/libs/humanizer/messageModules/index.d.ts.map new file mode 100644 index 000000000..eab2b511a --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACrB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.js b/dist/src/libs/humanizer/messageModules/index.js new file mode 100644 index 000000000..12f88e4aa --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/index.js @@ -0,0 +1,9 @@ +import { ensMessageModule } from './ensModule'; +import { entryPointModule } from './entryPointModule'; +import { erc20Module } from './erc20Module'; +import { erc721Module } from './erc721Module'; +import { legendsMessageModule } from './legendsModule'; +import { openseaMessageModule } from './openseaModule'; +import { permit2Module } from './permit2Module'; +export { ensMessageModule, entryPointModule, erc20Module, erc721Module, legendsMessageModule, permit2Module, openseaMessageModule }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.js.map b/dist/src/libs/humanizer/messageModules/index.js.map new file mode 100644 index 000000000..c26145035 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACrB,CAAA","sourcesContent":["import { ensMessageModule } from './ensModule'\nimport { entryPointModule } from './entryPointModule'\nimport { erc20Module } from './erc20Module'\nimport { erc721Module } from './erc721Module'\nimport { legendsMessageModule } from './legendsModule'\nimport { openseaMessageModule } from './openseaModule'\nimport { permit2Module } from './permit2Module'\n\nexport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n permit2Module,\n openseaMessageModule\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.d.ts b/dist/src/libs/humanizer/messageModules/legendsModule.d.ts new file mode 100644 index 000000000..794d1a09e --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/legendsModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const legendsMessageModule: HumanizerTypedMessageModule; +//# sourceMappingURL=legendsModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.d.ts.map b/dist/src/libs/humanizer/messageModules/legendsModule.d.ts.map new file mode 100644 index 000000000..be69aeab2 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/legendsModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"legendsModule.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/legendsModule.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAG3D,eAAO,MAAM,oBAAoB,EAAE,2BAuBlC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.js b/dist/src/libs/humanizer/messageModules/legendsModule.js new file mode 100644 index 000000000..6a043e65b --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/legendsModule.js @@ -0,0 +1,25 @@ +import { isHexString, toUtf8Bytes, toUtf8String } from 'ethers'; +import { getAction, getAddressVisualization, getLabel } from '../utils'; +export const legendsMessageModule = (message) => { + if (message.content.kind !== 'message' || typeof message.content.message !== 'string') + return { fullVisualization: [] }; + let messageAsText = message.content.message; + if (isHexString(message.content.message) && message.content.message.length % 2 === 0) { + messageAsText = toUtf8String(toUtf8Bytes(message.content.message)); + } + const messageRegex = /Assign 0x[a-fA-F0-9]{40} to Ambire Legends 0x[a-fA-F0-9]{40}/; + const addressRegex = /0x[a-fA-F0-9]{40}/g; + if (messageAsText.match(messageRegex) && + messageAsText.match(addressRegex)[0] === message.accountAddr) + return { + fullVisualization: [ + getAction('Link'), + getAddressVisualization(messageAsText.match(addressRegex)[0]), + getLabel('to'), + getAddressVisualization(messageAsText.match(addressRegex)[1]), + getLabel('for Ambire Legends', true) + ] + }; + return { fullVisualization: [] }; +}; +//# sourceMappingURL=legendsModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.js.map b/dist/src/libs/humanizer/messageModules/legendsModule.js.map new file mode 100644 index 000000000..683ac4ed7 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/legendsModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"legendsModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/legendsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAI/D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEvE,MAAM,CAAC,MAAM,oBAAoB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IACpF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;QACnF,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAClC,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAA;IAC3C,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QACpF,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;KACnE;IACD,MAAM,YAAY,GAAG,8DAA8D,CAAA;IACnF,MAAM,YAAY,GAAG,oBAAoB,CAAA;IACzC,IACE,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW;QAE7D,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,MAAM,CAAC;gBACjB,uBAAuB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;aACrC;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { isHexString, toUtf8Bytes, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const legendsMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'message' || typeof message.content.message !== 'string')\n return { fullVisualization: [] }\n let messageAsText = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(toUtf8Bytes(message.content.message))\n }\n const messageRegex = /Assign 0x[a-fA-F0-9]{40} to Ambire Legends 0x[a-fA-F0-9]{40}/\n const addressRegex = /0x[a-fA-F0-9]{40}/g\n if (\n messageAsText.match(messageRegex) &&\n messageAsText.match(addressRegex)![0] === message.accountAddr\n )\n return {\n fullVisualization: [\n getAction('Link'),\n getAddressVisualization(messageAsText.match(addressRegex)![0]),\n getLabel('to'),\n getAddressVisualization(messageAsText.match(addressRegex)![1]),\n getLabel('for Ambire Legends', true)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.d.ts b/dist/src/libs/humanizer/messageModules/openseaModule.d.ts new file mode 100644 index 000000000..9de73f358 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/openseaModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const openseaMessageModule: HumanizerTypedMessageModule; +//# sourceMappingURL=openseaModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.d.ts.map b/dist/src/libs/humanizer/messageModules/openseaModule.d.ts.map new file mode 100644 index 000000000..98b7ed270 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/openseaModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"openseaModule.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/openseaModule.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAiB3D,eAAO,MAAM,oBAAoB,EAAE,2BA0DlC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.js b/dist/src/libs/humanizer/messageModules/openseaModule.js new file mode 100644 index 000000000..348248b60 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/openseaModule.js @@ -0,0 +1,66 @@ +import { isHexString, toUtf8String } from 'ethers'; +import { getAction, getLabel, getToken } from '../utils'; +const SEAPORT_ADDRESS = [ + '0x0000000000000068F116a894984e2DB1123eB395', + '0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC', + '0x00000000006c3852cbEf3e08E8dF289169EdE581', + '0x00000000F9490004C11Cef243f5400493c00Ad63', + '0x00e5F120f500006757E984F1DED400fc00370000', + '0x0000f00000627D293Ab4Dfb40082001724dB006F' +]; +export const openseaMessageModule = (message) => { + if (message.content.kind === 'message' && typeof message.content.message === 'string') { + let messageAsText = message.content.message; + if (isHexString(message.content.message) && message.content.message.length % 2 === 0) { + messageAsText = toUtf8String(message.content.message); + } + const OPENSEA_LOGIN_MESSAGE_PREFIX = 'Welcome to OpenSea!'; + if (messageAsText.includes(OPENSEA_LOGIN_MESSAGE_PREFIX) && + messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())) { + return { + fullVisualization: [getAction('Log in'), getLabel('OpenSea', true)] + }; + } + const OPENSEA_PRO_LOGIN_MESSAGE_PREFIX = 'Sign in to OpenSea Pro'; + if (messageAsText.includes(OPENSEA_PRO_LOGIN_MESSAGE_PREFIX) && + messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())) { + return { + fullVisualization: [getAction('Log in'), getLabel('OpenSea Pro', true)] + }; + } + } + if (message.content.kind === 'typedMessage') { + if (message.content.domain.name === 'Seaport' && + message.content.domain.version === '1.6' && + SEAPORT_ADDRESS.includes(message.content.domain.verifyingContract || '')) { + const considerations = message.content.message.consideration; + const offer = message.content.message.offer; + const extractItems = ({ itemType, token, identifierOrCriteria, startAmount }) => { + if (itemType === '0') + return { address: token, amountOrId: BigInt(startAmount) }; + if (itemType === '1') + return { address: token, amountOrId: BigInt(startAmount) }; + if (itemType === '2') + return { address: token, amountOrId: BigInt(identifierOrCriteria) }; + if (itemType === '3') + return { address: token, amountOrId: BigInt(identifierOrCriteria) }; + return null; + }; + const itemsToList = offer.map(extractItems).filter((x) => x); + const itemsToGet = considerations + .filter(({ recipient }) => recipient === message.accountAddr) + .map(extractItems) + .filter((x) => x); + return { + fullVisualization: [ + getAction('Make offer to swap'), + ...itemsToList.map(({ address, amountOrId }) => getToken(address, amountOrId)), + getLabel('for'), + ...itemsToGet.map(({ address, amountOrId }) => getToken(address, amountOrId)) + ] + }; + } + } + return { fullVisualization: [] }; +}; +//# sourceMappingURL=openseaModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.js.map b/dist/src/libs/humanizer/messageModules/openseaModule.js.map new file mode 100644 index 000000000..08f53b81b --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/openseaModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"openseaModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/openseaModule.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getLabel, getToken } from '../utils'\n\nconst SEAPORT_ADDRESS = [\n '0x0000000000000068F116a894984e2DB1123eB395',\n\n '0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC',\n\n '0x00000000006c3852cbEf3e08E8dF289169EdE581',\n\n '0x00000000F9490004C11Cef243f5400493c00Ad63',\n\n '0x00e5F120f500006757E984F1DED400fc00370000',\n\n '0x0000f00000627D293Ab4Dfb40082001724dB006F'\n]\n\nexport const openseaMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind === 'message' && typeof message.content.message === 'string') {\n let messageAsText: string = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(message.content.message)\n }\n const OPENSEA_LOGIN_MESSAGE_PREFIX = 'Welcome to OpenSea!'\n if (\n messageAsText.includes(OPENSEA_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea', true)]\n }\n }\n const OPENSEA_PRO_LOGIN_MESSAGE_PREFIX = 'Sign in to OpenSea Pro'\n if (\n messageAsText.includes(OPENSEA_PRO_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea Pro', true)]\n }\n }\n }\n if (message.content.kind === 'typedMessage') {\n if (\n message.content.domain.name === 'Seaport' &&\n message.content.domain.version === '1.6' &&\n SEAPORT_ADDRESS.includes(message.content.domain.verifyingContract || '')\n ) {\n const considerations = message.content.message.consideration\n const offer = message.content.message.offer\n\n const extractItems = ({ itemType, token, identifierOrCriteria, startAmount }: any) => {\n if (itemType === '0') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '1') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '2') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n if (itemType === '3') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n return null\n }\n const itemsToList = offer.map(extractItems).filter((x: any) => x)\n const itemsToGet = considerations\n .filter(({ recipient }: any) => recipient === message.accountAddr)\n .map(extractItems)\n .filter((x: any) => x)\n\n return {\n fullVisualization: [\n getAction('Make offer to swap'),\n ...itemsToList.map(({ address, amountOrId }: any) => getToken(address, amountOrId)),\n getLabel('for'),\n ...itemsToGet.map(({ address, amountOrId }: any) => getToken(address, amountOrId))\n ]\n }\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.d.ts b/dist/src/libs/humanizer/messageModules/permit2Module.d.ts new file mode 100644 index 000000000..92af37671 --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/permit2Module.d.ts @@ -0,0 +1,3 @@ +import { HumanizerTypedMessageModule } from '../interfaces'; +export declare const permit2Module: HumanizerTypedMessageModule; +//# sourceMappingURL=permit2Module.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.d.ts.map b/dist/src/libs/humanizer/messageModules/permit2Module.d.ts.map new file mode 100644 index 000000000..c698b9a8f --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/permit2Module.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"permit2Module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/permit2Module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAA0B,MAAM,eAAe,CAAA;AAgDnF,eAAO,MAAM,aAAa,EAAE,2BA8B3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.js b/dist/src/libs/humanizer/messageModules/permit2Module.js new file mode 100644 index 000000000..e559311dd --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/permit2Module.js @@ -0,0 +1,37 @@ +import { PERMIT_2_ADDRESS } from '../../../consts/addresses'; +import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; +const visualizePermit = (permit) => { + return [ + getAction('Permit'), + getAddressVisualization(PERMIT_2_ADDRESS), + getLabel('to use'), + getToken(permit.token, permit.amount), + getLabel('for time period'), + getDeadline(permit.expiration) + ]; +}; +export const permit2Module = (message) => { + if (message.content.kind !== 'typedMessage') + return { fullVisualization: [] }; + const tm = message.content; + const visualizations = []; + if (tm?.domain?.verifyingContract && + tm.domain.verifyingContract.toLowerCase() === PERMIT_2_ADDRESS.toLowerCase()) { + if (tm?.types?.PermitSingle?.[0]?.type === 'PermitDetails') { + visualizations.push(...visualizePermit(tm.message.details), getLabel('this whole signatuere'), getDeadline(tm.message.sigDeadline)); + } + else if (tm?.types?.PermitBatch?.[0]?.type === 'PermitDetails[]') { + tm.message.details.forEach((permitDetails, i) => { + visualizations.push(...[ + getLabel(`Permit #${i + 1}`), + ...visualizePermit(permitDetails), + getLabel('this whole signatuere'), + getDeadline(tm.message.sigDeadline) + ]); + }); + } + return { fullVisualization: visualizations }; + } + return { fullVisualization: [] }; +}; +//# sourceMappingURL=permit2Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.js.map b/dist/src/libs/humanizer/messageModules/permit2Module.js.map new file mode 100644 index 000000000..40800cdce --- /dev/null +++ b/dist/src/libs/humanizer/messageModules/permit2Module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"permit2Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/permit2Module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAG5D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoC9F,MAAM,eAAe,GAAG,CAAC,MAAqB,EAA4B,EAAE;IAC1E,OAAO;QACL,SAAS,CAAC,QAAQ,CAAC;QACnB,uBAAuB,CAAC,gBAAgB,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC;QAClB,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACrC,QAAQ,CAAC,iBAAiB,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;KAC/B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,MAAM,cAAc,GAA6B,EAAE,CAAA;IACnD,IACE,EAAE,EAAE,MAAM,EAAE,iBAAiB;QAC7B,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,WAAW,EAAE,EAC5E;QACA,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,eAAe,EAAE;YAC1D,cAAc,CAAC,IAAI,CACjB,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EACtC,QAAQ,CAAC,uBAAuB,CAAC,EACjC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CACpC,CAAA;SACF;aAAM,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,iBAAiB,EAAE;YAClE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAA4B,EAAE,CAAS,EAAE,EAAE;gBACrE,cAAc,CAAC,IAAI,CACjB,GAAG;oBACD,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,GAAG,eAAe,CAAC,aAAa,CAAC;oBACjC,QAAQ,CAAC,uBAAuB,CAAC;oBACjC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAA2B;iBAC9D,CACF,CAAA;YACH,CAAC,CAAC,CAAA;SACH;QACD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAA;KAC7C;IAED,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { PERMIT_2_ADDRESS } from '../../../consts/addresses'\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\n// interfaces\n// export interface PermitSingle {\n// details: PermitDetails\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// interface PermitBatch {\n// details: PermitDetails[]\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// example\n// const permitSingle: PermitSingle = {\n// details: {\n// token: tokenAddress,\n// amount: MaxAllowanceTransferAmount,\n// // You may set your own deadline - we use 30 days.\n// expiration: toDeadline(/* 30 days= */ 1000 * 60 * 60 * 24 * 30),\n// nonce\n// },\n// spender: spenderAddress,\n// // You may set your own deadline - we use 30 minutes.\n// sigDeadline: toDeadline(/* 30 minutes= */ 1000 * 60 * 60 * 30)\n// }\n\ninterface PermitDetails {\n token: string\n amount: bigint\n expiration: bigint\n nonce: bigint\n}\n\nconst visualizePermit = (permit: PermitDetails): HumanizerVisualization[] => {\n return [\n getAction('Permit'),\n getAddressVisualization(PERMIT_2_ADDRESS),\n getLabel('to use'),\n getToken(permit.token, permit.amount),\n getLabel('for time period'),\n getDeadline(permit.expiration)\n ]\n}\n\nexport const permit2Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n const visualizations: HumanizerVisualization[] = []\n if (\n tm?.domain?.verifyingContract &&\n tm.domain.verifyingContract.toLowerCase() === PERMIT_2_ADDRESS.toLowerCase()\n ) {\n if (tm?.types?.PermitSingle?.[0]?.type === 'PermitDetails') {\n visualizations.push(\n ...visualizePermit(tm.message.details),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline)\n )\n } else if (tm?.types?.PermitBatch?.[0]?.type === 'PermitDetails[]') {\n tm.message.details.forEach((permitDetails: PermitDetails, i: number) => {\n visualizations.push(\n ...[\n getLabel(`Permit #${i + 1}`),\n ...visualizePermit(permitDetails),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline) as HumanizerVisualization\n ]\n )\n })\n }\n return { fullVisualization: visualizations }\n }\n\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.d.ts b/dist/src/libs/humanizer/modules/1Inch/index.d.ts new file mode 100644 index 000000000..b551e5d20 --- /dev/null +++ b/dist/src/libs/humanizer/modules/1Inch/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const OneInchModule: HumanizerCallModule; +export default OneInchModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.d.ts.map b/dist/src/libs/humanizer/modules/1Inch/index.d.ts.map new file mode 100644 index 000000000..d9c780dec --- /dev/null +++ b/dist/src/libs/humanizer/modules/1Inch/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/1Inch/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAW9D,QAAA,MAAM,aAAa,EAAE,mBAuFpB,CAAA;AAED,eAAe,aAAa,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.js b/dist/src/libs/humanizer/modules/1Inch/index.js new file mode 100644 index 000000000..3bd4d399d --- /dev/null +++ b/dist/src/libs/humanizer/modules/1Inch/index.js @@ -0,0 +1,67 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { OneInch } from '../../const/abis/1Inch'; +import { eToNative, getAction, getLabel, getRecipientText, getToken, uintToAddress } from '../../utils'; +const OneInchModule = (accOp, calls) => { + const iface = new Interface(OneInch); + const matcher = { + [iface.getFunction('cancelOrder(uint256 makerTraits, bytes32 orderHash)')?.selector]: (call) => { + const { orderHash } = iface.parseTransaction(call).args; + return [ + getAction('Cancel order'), + getLabel(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`) + ]; + }, + [iface.getFunction('unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)')?.selector]: (call) => { + const { token: tokenArg, amount } = iface.parseTransaction(call).args; + const token = uintToAddress(tokenArg); + return [getAction('Swap'), getToken(eToNative(token), amount)]; + }, + [iface.getFunction('swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data)')?.selector]: (call) => { + const { desc: { srcToken, dstToken, dstReceiver, amount, minReturnAmount } } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(eToNative(srcToken), amount), + getLabel('for'), + getToken(eToNative(dstToken), minReturnAmount), + ...getRecipientText(accOp.accountAddr, dstReceiver) + ]; + }, + [iface.getFunction('ethUnoswap(uint256, uint256)')?.selector]: (call) => { + return [getAction('Swap'), getToken(ZeroAddress, call.value)]; + }, + [iface.getFunction('unoswap(uint256 token,uint256 amount,uint256 minReturn,uint256 dex)') + ?.selector]: (call) => { + const { token: tokenArg, amount } = iface.parseTransaction(call).args; + const token = uintToAddress(tokenArg); + return [getAction('Swap'), getToken(eToNative(token), amount)]; + }, + [iface.getFunction('unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex)')?.selector]: (call) => { + const { token: tokenArg, amount } = iface.parseTransaction(call).args; + const token = uintToAddress(tokenArg); + return [getAction('Swap'), getToken(eToNative(token), amount)]; + }, + [iface.getFunction('unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3)')?.selector]: (call) => { + const { token: tokenArg, amount } = iface.parseTransaction(call).args; + const token = uintToAddress(tokenArg); + return [getAction('Swap'), getToken(eToNative(token), amount)]; + }, + [iface.getFunction('swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)')?.selector]: (call) => { + const { executor, desc: { srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags }, permit, data } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(srcToken, amount), + getLabel('for'), + getToken(dstToken, minReturnAmount), + ...getRecipientText(accOp.accountAddr, dstReceiver) + ]; + } + }; + const newCalls = calls.map((call) => { + if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default OneInchModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.js.map b/dist/src/libs/humanizer/modules/1Inch/index.js.map new file mode 100644 index 000000000..c5abe1188 --- /dev/null +++ b/dist/src/libs/humanizer/modules/1Inch/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/1Inch/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { OneInch } from '../../const/abis/1Inch'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getLabel,\n getRecipientText,\n getToken,\n uintToAddress\n} from '../../utils'\n\nconst OneInchModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(OneInch)\n const matcher = {\n [iface.getFunction('cancelOrder(uint256 makerTraits, bytes32 orderHash)')?.selector!]: (\n call: IrCall\n ) => {\n const { orderHash } = iface.parseTransaction(call)!.args\n return [\n getAction('Cancel order'),\n getLabel(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`)\n ]\n },\n [iface.getFunction(\n 'unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, dstReceiver, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n },\n [iface.getFunction('ethUnoswap(uint256, uint256)')?.selector!]: (call: IrCall) => {\n return [getAction('Swap'), getToken(ZeroAddress, call.value)]\n },\n [iface.getFunction('unoswap(uint256 token,uint256 amount,uint256 minReturn,uint256 dex)')\n ?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n )?.selector!]: (call: IrCall) => {\n const {\n executor,\n desc: { srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags },\n permit,\n data\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Swap'),\n getToken(srcToken, amount),\n getLabel('for'),\n getToken(dstToken, minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default OneInchModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts new file mode 100644 index 000000000..814b6d269 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts @@ -0,0 +1,4 @@ +export declare const aaveLendingPoolV2: () => { + [key: string]: Function; +}; +//# sourceMappingURL=aaveLendingPoolV2.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts.map b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts.map new file mode 100644 index 000000000..8bce1a217 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveLendingPoolV2.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveLendingPoolV2.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;CA4C7B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js new file mode 100644 index 000000000..791a7af5a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js @@ -0,0 +1,49 @@ +import { Interface } from 'ethers'; +import { AaveLendingPoolV2 } from '../../const/abis'; +import { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'; +export const aaveLendingPoolV2 = () => { + const iface = new Interface(AaveLendingPoolV2); + const matcher = { + [iface.getFunction('deposit')?.selector]: (accountOp, call) => { + const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Deposit'), + getToken(asset, amount), + getLabel('to'), + getAddressVisualization(call.to), + ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('withdraw')?.selector]: (accountOp, call) => { + const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Withdraw'), + getToken(asset, amount), + getLabel('from'), + getAddressVisualization(call.to), + ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('repay')?.selector]: (accountOp, call) => { + const [asset, amount /* rateMode */, , onBehalf] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Repay'), + getToken(asset, amount), + getLabel('to'), + getAddressVisualization(call.to), + ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('borrow')?.selector]: (accountOp, call) => { + const [asset, amount] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Borrow'), + getToken(asset, amount), + getLabel('from'), + getAddressVisualization(call.to) + ]; + } + }; + return matcher; +}; +//# sourceMappingURL=aaveLendingPoolV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map new file mode 100644 index 000000000..fcdf0e98a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveLendingPoolV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveLendingPoolV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAChF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,SAAS,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,SAAS,CAAC,UAAU,CAAC;gBACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC9E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC3F,OAAO;gBACL,SAAS,CAAC,OAAO,CAAC;gBAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAChE,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveLendingPoolV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveLendingPoolV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveLendingPoolV2)\n const matcher = {\n [iface.getFunction('deposit')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repay')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount /* rateMode */, , onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrow')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n return matcher\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts b/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts new file mode 100644 index 000000000..e5a006789 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts @@ -0,0 +1,4 @@ +export declare const aaveV3Pool: () => { + [key: string]: Function; +}; +//# sourceMappingURL=aaveV3.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts.map b/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts.map new file mode 100644 index 000000000..a6a7bc82b --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveV3.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveV3.ts"],"names":[],"mappings":"AAmHA,eAAO,MAAM,UAAU;;CAwFtB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.js b/dist/src/libs/humanizer/modules/Aave/aaveV3.js new file mode 100644 index 000000000..a35af7858 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.js @@ -0,0 +1,172 @@ +import { Interface, MaxUint256 } from 'ethers'; +import { AaveV3Pool } from '../../const/abis'; +import { getAction, getAddressVisualization, getDeadline, getLabel, getOnBehalfOf, getToken } from '../../utils'; +/* +Fetched via + let maxValueForUint16 = 65535 + let tokenIdsStorageSlot = 54 + let poolAddress = '0x794a61358D6845594F94dc1DB02A252b5b4814aD' + for (let i = 0; i < maxValueForUint16; i++) { + const storageSlot = solidityPackedKeccak256(['uint256', 'uint256'], [i, tokenIdsStorageSlot]) + const res = await provider.getStorage(poolAddress, storageSlot) + if (res !== '0x0000000000000000000000000000000000000000000000000000000000000000') + console.log(res, i) + + pool address is taken from + https://aave.com/docs/resources/addresses +*/ +const AAVE_TOKENS_BY_INDEX = { + optimism: [ + '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1', + '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6', + '0x7f5c764cbc14f9669b88837ca1490cca17c31607', + '0x68f180fcce6836688e9084f035309e29bf0a2095', + '0x4200000000000000000000000000000000000006', + '0x94b008aa00579c1307b0ef2c499ad98a8ce58e58', + '0x76fb31fb4af56892a25e32cfc43de717950c9278', + '0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9', + '0x4200000000000000000000000000000000000042', + '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb', + '0xc40f949f8a4e094d1b49a23ea9241d289b7b2819', + '0xdfa46478f9e5ea86d57387849598dbfb2e964b02', + '0x9bcef72be871e61ed4fbbc7630889bee758eb81d', + '0x0b2c639c533813f4aa9d7837caf62653d097ff85' + ], + arbitrum: [ + '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1', + '0xf97f4df75117a78c1a5a0dbb814af92458539fb4', + '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', + '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f', + '0x82af49447d8a07e3bd95bd0d56f35241523fbab1', + '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', + '0xba5ddd1f9d7f570dc94a51479a000e3bce967196', + '0xd22a58f79e9481d1a88e00c343885a588b34b68b', + '0x5979d7b546e38e414f7e9822514be443a4800529', + '0x3f56e0c36d275367b8c502090edf38289b3dea0d', + '0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8', + '0x93b346b6bc2548da6a1e7d98e9a421b42541425b', + '0xaf88d065e77c8cc2239327c5edb3a432268e5831', + '0x17fc002b466eec40dae837fc4be5c67993ddbd6f', + '0x912ce59144191c1204e64559fe8253a0e49e6548', + '0x35751007a407ca6feffe80b3cb397736d2cf4dbe', + '0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33', + '0x2416092f143378750bb29b79ed961ab195cceea5' + ], + avalanche: [ + '0xd586e7f844cea2f87f50152665bcbc2c279d8d70', + '0x5947bb275c521040051d82396192181b413227a3', + '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e', + '0x50b7545627a5162f82a992c33b87adc75187b218', + '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab', + '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7', + '0x63a72806098bd3d9520cc43356dd78afe5d386d9', + '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7', + '0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be', + '0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64', + '0x5c49b268c9841aff1cc3b0a418ff5c3442ee3f3b', + '0x152b9d0fdc40c096757f570a51e494bd4b943e50', + '0x00000000efe302beaa2b3e6e1b18d08d69a9012a' + ], + polygon: [ + '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063', + '0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39', + '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', + '0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6', + '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619', + '0xc2132d05d31c914a87c6611c10748aeb04b58e8f', + '0xd6df932a45c0f255f85145f286ea0b292b21c90b', + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + '0x172370d5cd63279efa6d502dab29171933a610af', + '0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a', + '0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7', + '0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3', + '0x85955046df4668e1dd369d2de9f3aeb98dd2a369', + '0xe111178a87a3bff0c8d18decba5798827539ae99', + '0x4e3decbb3645551b8a19f0ea1678079fcb33fb4c', + '0xe0b52e49357fd4daf2c15e02058dce6bc0057db4', + '0xa3fa99a148fa48d14ed51d610c367c61876997f1', + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + '0xfa68fb4628dff1028cfec22b4162fccd0d45efb6', + '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd', + '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359' + ], + base: [ + '0x4200000000000000000000000000000000000006', + '0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22', + '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca', + '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452', + '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', + '0x04c0599ae5a44757c0af6f9ec3b93da8976c150a', + '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + '0x2416092f143378750bb29b79ed961ab195cceea5' + ] +}; +export const aaveV3Pool = () => { + const iface = new Interface(AaveV3Pool); + return { + [iface.getFunction('supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)')?.selector]: (accountOp, call) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { asset, amount, onBehalfOf, referralCode } = iface.parseTransaction(call).args; + return [ + getAction('Deposit'), + getToken(asset, amount), + getLabel('to'), + getAddressVisualization(call.to), + ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)')?.selector]: (accountOp, call) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { receiverAddress, asset, amount, params, referralCode } = iface.parseTransaction(call).args; + return [ + getAction('Execute Flash Loan'), + getToken(asset, amount), + getLabel('and call'), + getAddressVisualization(receiverAddress) + ]; + }, + [iface.getFunction('repayWithATokens(bytes32 args)')?.selector]: (accountOp, call) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { args } = iface.parseTransaction(call).args; + return [getAction('Repay with token A'), getLabel('to'), getAddressVisualization(call.to)]; + }, + [iface.getFunction('repayWithPermit(bytes32 args, bytes32 r, bytes32 s)')?.selector]: (accountOp, call) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { args } = iface.parseTransaction(call).args; + return [getAction('Repay with permit'), getLabel('to'), getAddressVisualization(call.to)]; + }, + [iface.getFunction('supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)')?.selector]: (accountOp, call) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { asset, amount, onBehalfOf, referralCode, deadline, permitV, permitR, bytes32 } = iface.parseTransaction(call).args; + return [ + getAction('Supply'), + getToken(asset, amount), + getLabel('to'), + getAddressVisualization(call.to), + ...(onBehalfOf !== accountOp.accountAddr + ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)] + : []), + getDeadline(deadline) + ]; + }, + [iface.getFunction('withdraw(bytes32 args)')?.selector]: (accountOp, call) => { + // @TODO do some hecks for network OR + const { args } = iface.parseTransaction(call).args; + const amountAsString = args.slice(30, 62); + const tokenIndex = Number(`0x${args.slice(62)}`); + if (!AAVE_TOKENS_BY_INDEX[accountOp.networkId]) + return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]; + if (tokenIndex >= AAVE_TOKENS_BY_INDEX[accountOp.networkId].length) + return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]; + // stores amount inn uint128 instead of uint256, but max value is treated as max value + const amount = amountAsString === 'f'.repeat(32) ? MaxUint256 : BigInt(`0x${amountAsString}`); + return [ + getAction('Withdraw'), + getToken(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount), + getLabel('from'), + getAddressVisualization(call.to) + ]; + } + }; +}; +//# sourceMappingURL=aaveV3.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map b/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map new file mode 100644 index 000000000..7039d42c1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, MaxUint256 } from 'ethers'\n\nimport { NetworkId } from '../../../../interfaces/network'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveV3Pool } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getOnBehalfOf,\n getToken\n} from '../../utils'\n\n/*\nFetched via\n let maxValueForUint16 = 65535\n let tokenIdsStorageSlot = 54\n let poolAddress = '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n for (let i = 0; i < maxValueForUint16; i++) {\n const storageSlot = solidityPackedKeccak256(['uint256', 'uint256'], [i, tokenIdsStorageSlot])\n const res = await provider.getStorage(poolAddress, storageSlot)\n if (res !== '0x0000000000000000000000000000000000000000000000000000000000000000')\n console.log(res, i)\n\n pool address is taken from\n https://aave.com/docs/resources/addresses\n*/\nconst AAVE_TOKENS_BY_INDEX: { [network: NetworkId]: string[] } = {\n optimism: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6',\n '0x7f5c764cbc14f9669b88837ca1490cca17c31607',\n '0x68f180fcce6836688e9084f035309e29bf0a2095',\n '0x4200000000000000000000000000000000000006',\n '0x94b008aa00579c1307b0ef2c499ad98a8ce58e58',\n '0x76fb31fb4af56892a25e32cfc43de717950c9278',\n '0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9',\n '0x4200000000000000000000000000000000000042',\n '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n '0xc40f949f8a4e094d1b49a23ea9241d289b7b2819',\n '0xdfa46478f9e5ea86d57387849598dbfb2e964b02',\n '0x9bcef72be871e61ed4fbbc7630889bee758eb81d',\n '0x0b2c639c533813f4aa9d7837caf62653d097ff85'\n ],\n arbitrum: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0xf97f4df75117a78c1a5a0dbb814af92458539fb4',\n '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8',\n '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f',\n '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',\n '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',\n '0xba5ddd1f9d7f570dc94a51479a000e3bce967196',\n '0xd22a58f79e9481d1a88e00c343885a588b34b68b',\n '0x5979d7b546e38e414f7e9822514be443a4800529',\n '0x3f56e0c36d275367b8c502090edf38289b3dea0d',\n '0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8',\n '0x93b346b6bc2548da6a1e7d98e9a421b42541425b',\n '0xaf88d065e77c8cc2239327c5edb3a432268e5831',\n '0x17fc002b466eec40dae837fc4be5c67993ddbd6f',\n '0x912ce59144191c1204e64559fe8253a0e49e6548',\n '0x35751007a407ca6feffe80b3cb397736d2cf4dbe',\n '0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ],\n avalanche: [\n '0xd586e7f844cea2f87f50152665bcbc2c279d8d70',\n '0x5947bb275c521040051d82396192181b413227a3',\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n '0x50b7545627a5162f82a992c33b87adc75187b218',\n '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab',\n '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7',\n '0x63a72806098bd3d9520cc43356dd78afe5d386d9',\n '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n '0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be',\n '0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64',\n '0x5c49b268c9841aff1cc3b0a418ff5c3442ee3f3b',\n '0x152b9d0fdc40c096757f570a51e494bd4b943e50',\n '0x00000000efe302beaa2b3e6e1b18d08d69a9012a'\n ],\n polygon: [\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6',\n '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',\n '0xd6df932a45c0f255f85145f286ea0b292b21c90b',\n '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n '0x172370d5cd63279efa6d502dab29171933a610af',\n '0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a',\n '0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7',\n '0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3',\n '0x85955046df4668e1dd369d2de9f3aeb98dd2a369',\n '0xe111178a87a3bff0c8d18decba5798827539ae99',\n '0x4e3decbb3645551b8a19f0ea1678079fcb33fb4c',\n '0xe0b52e49357fd4daf2c15e02058dce6bc0057db4',\n '0xa3fa99a148fa48d14ed51d610c367c61876997f1',\n '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4',\n '0xfa68fb4628dff1028cfec22b4162fccd0d45efb6',\n '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359'\n ],\n base: [\n '0x4200000000000000000000000000000000000006',\n '0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22',\n '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca',\n '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n '0x04c0599ae5a44757c0af6f9ec3b93da8976c150a',\n '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ]\n}\nexport const aaveV3Pool = (): { [key: string]: Function } => {\n const iface = new Interface(AaveV3Pool)\n return {\n [iface.getFunction(\n 'supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction(\n 'flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { receiverAddress, asset, amount, params, referralCode } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Execute Flash Loan'),\n getToken(asset, amount),\n getLabel('and call'),\n getAddressVisualization(receiverAddress)\n ]\n },\n [iface.getFunction('repayWithATokens(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with token A'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction('repayWithPermit(bytes32 args, bytes32 r, bytes32 s)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with permit'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction(\n 'supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode, deadline, permitV, permitR, bytes32 } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Supply'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...(onBehalfOf !== accountOp.accountAddr\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('withdraw(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // @TODO do some hecks for network OR\n const { args } = iface.parseTransaction(call)!.args\n const amountAsString = args.slice(30, 62)\n const tokenIndex = Number(`0x${args.slice(62)}`)\n if (!AAVE_TOKENS_BY_INDEX[accountOp.networkId])\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n if (tokenIndex >= AAVE_TOKENS_BY_INDEX[accountOp.networkId].length)\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n // stores amount inn uint128 instead of uint256, but max value is treated as max value\n const amount = amountAsString === 'f'.repeat(32) ? MaxUint256 : BigInt(`0x${amountAsString}`)\n\n return [\n getAction('Withdraw'),\n getToken(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts new file mode 100644 index 000000000..544ab1ad3 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts @@ -0,0 +1,4 @@ +export declare const aaveWethGatewayV2: () => { + [key: string]: Function; +}; +//# sourceMappingURL=aaveWethGatewayV2.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts.map b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts.map new file mode 100644 index 000000000..a7be157d1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveWethGatewayV2.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveWethGatewayV2.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;CA4C7B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js new file mode 100644 index 000000000..f4f268a5d --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js @@ -0,0 +1,48 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { AaveWethGatewayV2 } from '../../const/abis'; +import { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'; +export const aaveWethGatewayV2 = () => { + const iface = new Interface(AaveWethGatewayV2); + return { + [iface.getFunction('depositETH')?.selector]: (accountOp, call) => { + const [, onBehalfOf] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Deposit'), + getToken(ZeroAddress, call.value), + getLabel('to'), + getAddressVisualization(call.to), + ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('withdrawETH')?.selector]: (accountOp, call) => { + const [, /* lendingPool */ amount, to] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Withdraw'), + getToken(ZeroAddress, amount), + getLabel('from'), + getAddressVisualization(call.to), + ...getOnBehalfOf(to, accountOp.accountAddr) + ]; + }, + [iface.getFunction('repayETH')?.selector]: (accountOp, call) => { + const [, , , /* lendingPool */ /* amount */ /* rateMode */ onBehalfOf] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Repay'), + getToken(ZeroAddress, call.value), + getLabel('to'), + getAddressVisualization(call.to), + getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + ]; + }, + [iface.getFunction('borrowETH')?.selector]: (accountOp, call) => { + const [, /* lendingPool */ amount] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Borrow'), + getToken(ZeroAddress, amount), + getLabel('from'), + getAddressVisualization(call.to) + ]; + } + }; +}; +//# sourceMappingURL=aaveWethGatewayV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map new file mode 100644 index 000000000..78311acd9 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"aaveWethGatewayV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveWethGatewayV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC9C,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACnF,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC/D,OAAO;gBACL,SAAS,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACpD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACpF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YACjF,OAAO;gBACL,SAAS,CAAC,UAAU,CAAC;gBACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC;aAC5C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,GACpE,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1C,OAAO;gBACL,SAAS,CAAC,OAAO,CAAC;gBAClB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACjD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAClF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC7E,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveWethGatewayV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveWethGatewayV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveWethGatewayV2)\n return {\n [iface.getFunction('depositETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, onBehalfOf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdrawETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount, to] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(to, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repayETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, , , /* lendingPool */ /* amount */ /* rateMode */ onBehalfOf] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrowETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.d.ts b/dist/src/libs/humanizer/modules/Aave/index.d.ts new file mode 100644 index 000000000..f385cb53b --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const aaveHumanizer: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.d.ts.map b/dist/src/libs/humanizer/modules/Aave/index.d.ts.map new file mode 100644 index 000000000..ba387367d --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAK9D,eAAO,MAAM,aAAa,EAAE,mBAa3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.js b/dist/src/libs/humanizer/modules/Aave/index.js new file mode 100644 index 000000000..8c588368e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/index.js @@ -0,0 +1,18 @@ +import { aaveLendingPoolV2 } from './aaveLendingPoolV2'; +import { aaveV3Pool } from './aaveV3'; +import { aaveWethGatewayV2 } from './aaveWethGatewayV2'; +export const aaveHumanizer = (accountOp, irCalls) => { + const matcher = { + ...aaveLendingPoolV2(), + ...aaveWethGatewayV2(), + ...aaveV3Pool() + }; + const newCalls = irCalls.map((call) => { + const sigHash = call.data.slice(0, 10); + return matcher[sigHash] + ? { ...call, fullVisualization: matcher[sigHash](accountOp, call) } + : call; + }); + return newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.js.map b/dist/src/libs/humanizer/modules/Aave/index.js.map new file mode 100644 index 000000000..fc971d0f9 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Aave/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC5F,MAAM,OAAO,GAAG;QACd,GAAG,iBAAiB,EAAE;QACtB,GAAG,iBAAiB,EAAE;QACtB,GAAG,UAAU,EAAE;KAChB,CAAA;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtC,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YACnE,CAAC,CAAC,IAAI,CAAA;IACV,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { aaveLendingPoolV2 } from './aaveLendingPoolV2'\nimport { aaveV3Pool } from './aaveV3'\nimport { aaveWethGatewayV2 } from './aaveWethGatewayV2'\n\nexport const aaveHumanizer: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n ...aaveLendingPoolV2(),\n ...aaveWethGatewayV2(),\n ...aaveV3Pool()\n }\n const newCalls = irCalls.map((call) => {\n const sigHash = call.data.slice(0, 10)\n return matcher[sigHash]\n ? { ...call, fullVisualization: matcher[sigHash](accountOp, call) }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.d.ts b/dist/src/libs/humanizer/modules/Across/index.d.ts new file mode 100644 index 000000000..f5ee75f87 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Across/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const AcrossModule: HumanizerCallModule; +export default AcrossModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.d.ts.map b/dist/src/libs/humanizer/modules/Across/index.d.ts.map new file mode 100644 index 000000000..fe76bab3d --- /dev/null +++ b/dist/src/libs/humanizer/modules/Across/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Across/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAW9D,QAAA,MAAM,YAAY,EAAE,mBA4DnB,CAAA;AAED,eAAe,YAAY,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.js b/dist/src/libs/humanizer/modules/Across/index.js new file mode 100644 index 000000000..e775b39bd --- /dev/null +++ b/dist/src/libs/humanizer/modules/Across/index.js @@ -0,0 +1,49 @@ +import { Interface } from 'ethers'; +import { Across } from '../../const/abis'; +import { getAction, getChain, getDeadline, getLabel, getRecipientText, getToken, getTokenWithChain } from '../../utils'; +const AcrossModule = (accOp, calls) => { + const iface = new Interface(Across); + const matcher = { + [iface.getFunction('depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message)')?.selector]: (call) => { + const { recipient, inputToken, outputToken, inputAmount, outputAmount, destinationChainId, fillDeadline } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(inputToken, inputAmount), + getLabel('for'), + getTokenWithChain(outputToken, outputAmount, destinationChainId), + getLabel('to'), + getChain(destinationChainId), + getDeadline(fillDeadline), + ...getRecipientText(accOp.accountAddr, recipient) + ]; + }, + [iface.getFunction('deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount)')?.selector]: (call) => { + const { recipient, originToken, amount, destinationChainId } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(originToken, amount), + getLabel('to'), + getChain(destinationChainId), + ...getRecipientText(accOp.accountAddr, recipient) + ]; + }, + [iface.getFunction('function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable')?.selector]: (call) => { + const { recipient, originToken, amount, destinationChainId } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(originToken, amount), + getLabel('to'), + getChain(destinationChainId), + ...getRecipientText(accOp.accountAddr, recipient) + ]; + } + }; + const newCalls = calls.map((call) => { + if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default AcrossModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.js.map b/dist/src/libs/humanizer/modules/Across/index.js.map new file mode 100644 index 000000000..37556fba1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Across/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Across/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Across } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n getAction,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\nconst AcrossModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Across)\n const matcher = {\n [iface.getFunction(\n 'depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message)'\n )?.selector!]: (call: IrCall) => {\n const {\n recipient,\n inputToken,\n outputToken,\n inputAmount,\n outputAmount,\n destinationChainId,\n fillDeadline\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(inputToken, inputAmount),\n getLabel('for'),\n getTokenWithChain(outputToken, outputAmount, destinationChainId),\n getLabel('to'),\n getChain(destinationChainId),\n getDeadline(fillDeadline),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount)'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default AcrossModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.d.ts b/dist/src/libs/humanizer/modules/Airdrops/index.d.ts new file mode 100644 index 000000000..e9797c2e9 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Airdrops/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const airdropsModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.d.ts.map b/dist/src/libs/humanizer/modules/Airdrops/index.d.ts.map new file mode 100644 index 000000000..106a50d1e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Airdrops/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Airdrops/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAQ9D,eAAO,MAAM,cAAc,EAAE,mBAe5B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.js b/dist/src/libs/humanizer/modules/Airdrops/index.js new file mode 100644 index 000000000..5a20a99ba --- /dev/null +++ b/dist/src/libs/humanizer/modules/Airdrops/index.js @@ -0,0 +1,19 @@ +import { Interface } from 'ethers'; +import { getAction, getToken } from '../../utils'; +const iface = new Interface([ + 'function claimTokens(uint256 index, uint256 amount, bytes32[] merkleProof)' +]); +const WTC_TOKEN_ADDRESS = '0xeF4461891DfB3AC8572cCf7C794664A8DD927945'; +export const airdropsModule = (accountOp, currentIrCalls) => { + const matcher = { + [iface.getFunction('claimTokens').selector]: (call) => { + if (call.to !== '0x4ee97a759AACa2EdF9c1445223b6Cd17c2eD3fb4') + return call; + const { amount } = iface.parseTransaction(call).args; + const fullVisualization = [getAction('Claim'), getToken(WTC_TOKEN_ADDRESS, amount)]; + return { ...call, fullVisualization }; + } + }; + return currentIrCalls.map((call) => matcher[call.data.slice(0, 10)] ? matcher[call.data.slice(0, 10)](call) : call); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.js.map b/dist/src/libs/humanizer/modules/Airdrops/index.js.map new file mode 100644 index 000000000..8335becc3 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Airdrops/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Airdrops/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIlC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;IAC1B,4EAA4E;CAC7E,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAwB,CACjD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAY,EAAU,EAAE;YACrE,IAAI,IAAI,CAAC,EAAE,KAAK,4CAA4C;gBAAE,OAAO,IAAI,CAAA;YACzE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,MAAM,iBAAiB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;YACnF,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/E,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function claimTokens(uint256 index, uint256 amount, bytes32[] merkleProof)'\n])\nconst WTC_TOKEN_ADDRESS = '0xeF4461891DfB3AC8572cCf7C794664A8DD927945'\n\nexport const airdropsModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const matcher = {\n [iface.getFunction('claimTokens')!.selector]: (call: IrCall): IrCall => {\n if (call.to !== '0x4ee97a759AACa2EdF9c1445223b6Cd17c2eD3fb4') return call\n const { amount } = iface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim'), getToken(WTC_TOKEN_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n return currentIrCalls.map((call) =>\n matcher[call.data.slice(0, 10)] ? matcher[call.data.slice(0, 10)](call) : call\n )\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts new file mode 100644 index 000000000..bb8fe4587 --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const asciiModule: HumanizerCallModule; +//# sourceMappingURL=asciiModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts.map b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts.map new file mode 100644 index 000000000..7ee948ed0 --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"asciiModule.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/asciiModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAU9D,eAAO,MAAM,WAAW,EAAE,mBA4BzB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js new file mode 100644 index 000000000..6c8bbbaab --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js @@ -0,0 +1,33 @@ +/* eslint-disable no-await-in-loop */ +import { toUtf8String, ZeroAddress } from 'ethers'; +import { checkIfUnknownAction, getAction, getAddressVisualization, getLabel, getText, getToken } from '../../utils'; +export const asciiModule = (accountOp, currentIrCalls) => { + const newCalls = currentIrCalls.map((call) => { + if (call.data === '0x') + return call; + if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) + return call; + let messageAsText; + try { + messageAsText = toUtf8String(call.data); + } + catch { + return call; + } + const sendNativeHumanization = call.value + ? [getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)] + : []; + return { + ...call, + fullVisualization: [ + getAction('Send this message'), + getLabel('to'), + getAddressVisualization(call.to), + getText(messageAsText), + ...sendNativeHumanization + ] + }; + }); + return newCalls; +}; +//# sourceMappingURL=asciiModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map new file mode 100644 index 000000000..f3612633e --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"asciiModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/asciiModule.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIlD,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,uBAAuB,EACvB,QAAQ,EACR,OAAO,EACP,QAAQ,EACT,MAAM,aAAa,CAAA;AAEpB,MAAM,CAAC,MAAM,WAAW,GAAwB,CAC9C,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACnC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAA;QACzF,IAAI,aAAa,CAAA;QACjB,IAAI;YACF,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACxC;QAAC,MAAM;YACN,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK;YACvC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzE,CAAC,CAAC,EAAE,CAAA;QACN,OAAO;YACL,GAAG,IAAI;YACP,iBAAiB,EAAE;gBACjB,SAAS,CAAC,mBAAmB,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,aAAa,CAAC;gBACtB,GAAG,sBAAsB;aAC1B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { toUtf8String, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getText,\n getToken\n} from '../../utils'\n\nexport const asciiModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.data === '0x') return call\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n let messageAsText\n try {\n messageAsText = toUtf8String(call.data)\n } catch {\n return call\n }\n const sendNativeHumanization = call.value\n ? [getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n : []\n return {\n ...call,\n fullVisualization: [\n getAction('Send this message'),\n getLabel('to'),\n getAddressVisualization(call.to),\n getText(messageAsText),\n ...sendNativeHumanization\n ]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts b/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts new file mode 100644 index 000000000..101cd5ce1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts @@ -0,0 +1,3 @@ +import { asciiModule } from './asciiModule'; +export default asciiModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts.map b/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts.map new file mode 100644 index 000000000..774fdb52c --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,eAAe,WAAW,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.js b/dist/src/libs/humanizer/modules/AsciiModule/index.js new file mode 100644 index 000000000..0bbe35635 --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.js @@ -0,0 +1,3 @@ +import { asciiModule } from './asciiModule'; +export default asciiModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.js.map b/dist/src/libs/humanizer/modules/AsciiModule/index.js.map new file mode 100644 index 000000000..dc9b16430 --- /dev/null +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,eAAe,WAAW,CAAA","sourcesContent":["import { asciiModule } from './asciiModule'\n\nexport default asciiModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.d.ts b/dist/src/libs/humanizer/modules/Curve/index.d.ts new file mode 100644 index 000000000..8be91b3d8 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Curve/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const curveModule: HumanizerCallModule; +export default curveModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.d.ts.map b/dist/src/libs/humanizer/modules/Curve/index.d.ts.map new file mode 100644 index 000000000..045acdfba --- /dev/null +++ b/dist/src/libs/humanizer/modules/Curve/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Curve/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,QAAA,MAAM,WAAW,EAAE,mBAkClB,CAAA;AAED,eAAe,WAAW,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.js b/dist/src/libs/humanizer/modules/Curve/index.js new file mode 100644 index 000000000..a48549086 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Curve/index.js @@ -0,0 +1,33 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { CurveRouter } from '../../const/abis/Curve'; +import { getAction, getLabel, getToken } from '../../utils'; +const curveModule = (_, calls) => { + const iface = new Interface(CurveRouter); + const parseCurveNative = (address) => address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ZeroAddress : address; + const handleBasicSwap = (curveRoute, amountIn, amountOut) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const route = curveRoute.filter((a) => a !== ZeroAddress); + const [inToken, outToken] = [route[0], route[route.length - 1]]; + return [ + getAction('Swap'), + getToken(parseCurveNative(inToken), amountIn), + getLabel('for'), + getToken(parseCurveNative(outToken), amountOut) + ]; + }; + const matcher = { + [iface.getFunction('exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { _route, _amount, _expected } = iface.parseTransaction(call).args; + return handleBasicSwap(_route, _amount, _expected); + } + }; + const newCalls = calls.map((call) => { + if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default curveModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.js.map b/dist/src/libs/humanizer/modules/Curve/index.js.map new file mode 100644 index 000000000..cf7da6ffd --- /dev/null +++ b/dist/src/libs/humanizer/modules/Curve/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Curve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3D,MAAM,WAAW,GAAwB,CAAC,CAAY,EAAE,KAAe,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;IAExC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE,CAC3C,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA;IAEhG,MAAM,eAAe,GAAG,CAAC,UAAoB,EAAE,QAAgB,EAAE,SAAiB,EAAE,EAAE;QACpF,gEAAgE;QAChE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAA;QACjE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/D,OAAO;YACL,SAAS,CAAC,MAAM,CAAC;YACjB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;YAC7C,QAAQ,CAAC,KAAK,CAAC;YACf,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;SAChD,CAAA;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,iHAAiH,CAClH,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACzE,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { CurveRouter } from '../../const/abis/Curve'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getToken } from '../../utils'\n\nconst curveModule: HumanizerCallModule = (_: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(CurveRouter)\n\n const parseCurveNative = (address: string) =>\n address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ZeroAddress : address\n\n const handleBasicSwap = (curveRoute: string[], amountIn: bigint, amountOut: bigint) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const route = curveRoute.filter((a: string) => a !== ZeroAddress)\n const [inToken, outToken] = [route[0], route[route.length - 1]]\n return [\n getAction('Swap'),\n getToken(parseCurveNative(inToken), amountIn),\n getLabel('for'),\n getToken(parseCurveNative(outToken), amountOut)\n ]\n }\n\n const matcher = {\n [iface.getFunction(\n 'exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _route, _amount, _expected } = iface.parseTransaction(call)!.args\n return handleBasicSwap(_route, _amount, _expected)\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default curveModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.d.ts b/dist/src/libs/humanizer/modules/Deployment/index.d.ts new file mode 100644 index 000000000..30616f5b1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Deployment/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const deploymentModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.d.ts.map b/dist/src/libs/humanizer/modules/Deployment/index.d.ts.map new file mode 100644 index 000000000..6f9224118 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Deployment/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Deployment/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,eAAO,MAAM,gBAAgB,EAAE,mBAc9B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.js b/dist/src/libs/humanizer/modules/Deployment/index.js new file mode 100644 index 000000000..0ca4d1485 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Deployment/index.js @@ -0,0 +1,13 @@ +import { getAction } from '../../utils'; +export const deploymentModule = (_, irCalls +// humanizerMeta: HumanizerMeta +) => { + const newCalls = irCalls.map((irCall) => irCall.to === undefined + ? { + ...irCall, + fullVisualization: [getAction('Deploy a smart contract')] + } + : irCall); + return newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.js.map b/dist/src/libs/humanizer/modules/Deployment/index.js.map new file mode 100644 index 000000000..4000ef2d5 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Deployment/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Deployment/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CACnD,CAAY,EACZ,OAAiB;AACjB,+BAA+B;EAC/B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACtC,MAAM,CAAC,EAAE,KAAK,SAAS;QACrB,CAAC,CAAC;YACE,GAAG,MAAM;YACT,iBAAiB,EAAE,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;SAC1D;QACH,CAAC,CAAC,MAAM,CACX,CAAA;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction } from '../../utils'\n\nexport const deploymentModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[]\n // humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((irCall) =>\n irCall.to === undefined\n ? {\n ...irCall,\n fullVisualization: [getAction('Deploy a smart contract')]\n }\n : irCall\n )\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.d.ts b/dist/src/libs/humanizer/modules/ENS/index.d.ts new file mode 100644 index 000000000..634a0bca8 --- /dev/null +++ b/dist/src/libs/humanizer/modules/ENS/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const ensModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.d.ts.map b/dist/src/libs/humanizer/modules/ENS/index.d.ts.map new file mode 100644 index 000000000..4b326e8b7 --- /dev/null +++ b/dist/src/libs/humanizer/modules/ENS/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/ENS/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAkC,MAAM,kBAAkB,CAAA;AA4BtF,eAAO,MAAM,SAAS,EAAE,mBA6HvB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.js b/dist/src/libs/humanizer/modules/ENS/index.js new file mode 100644 index 000000000..862043c5e --- /dev/null +++ b/dist/src/libs/humanizer/modules/ENS/index.js @@ -0,0 +1,128 @@ +import { getAddress, Interface, isAddress } from 'ethers'; +import { registeredCoinTypes } from '../../const/coinType'; +import { getAction, getAddressVisualization, getLabel } from '../../utils'; +const ENS_CONTROLLER = '0x253553366Da8546fC250F225fe3d25d0C782303b'; +const ENS_RESOLVER = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'; +const BULK_RENEWAL = '0xa12159e5131b1eEf6B4857EEE3e1954744b5033A'; +const iface = new Interface([ + 'function register(string name,address owner, uint256 duration, bytes32 secret, address resolver, bytes[] data, bool reverseRecord, uint16 ownerControlledFuses)', + 'function commit(bytes32)', + 'function setText(bytes32 node,string calldata key,string calldata value)', + 'function multicall(bytes[] data)', + // 'function setAddr(bytes32,uint256,bytes)', + 'function setAddr(bytes32 node, uint256 coinType, bytes memory a)', + 'function setContenthash(bytes32,bytes)', + 'function setABI(bytes32,uint256,bytes)', + 'function renew(string id,uint256 duration)', + 'function renewAll(string[] calldata names, uint256 duration)' +]); +const YEAR_IN_SECONDS = 60n * 60n * 24n * 365n; +const getDurationText = (duration) => { + const durationLabel = `${duration / YEAR_IN_SECONDS} year${duration < 2n * YEAR_IN_SECONDS ? '' : 's'}`; + return durationLabel; +}; +export const ensModule = (accountOp, irCalls) => { + // @TODO: set text and others + return irCalls.map((call) => { + if (getAddress(call.to) === ENS_CONTROLLER) { + if (call.data.slice(0, 10) === iface.getFunction('register').selector) { + const { name, owner, duration + // secret, + // resolver, + // data, + // reverseRecord, + // ownerControlledFuses + } = iface.decodeFunctionData('register', call.data); + const fullVisualization = [getAction('Register'), getLabel(`${name}.ens`, true)]; + if (owner !== accountOp.accountAddr) + fullVisualization.push(getLabel('to'), getAddressVisualization(owner)); + const durationLabel = getDurationText(duration); + fullVisualization.push(getLabel('for'), getLabel(durationLabel, true)); + return { ...call, fullVisualization }; + } + if (call.data.slice(0, 10) === iface.getFunction('renew').selector) { + const { id, duration } = iface.decodeFunctionData('renew', call.data); + const durationLabel = getDurationText(duration); + const fullVisualization = [ + getAction('Renew'), + getLabel(`${id}.eth`), + getLabel('for'), + getLabel(durationLabel, true) + ]; + return { ...call, fullVisualization }; + } + if (call.data.slice(0, 10) === iface.getFunction('commit').selector) { + return { + ...call, + fullVisualization: [getAction('Request'), getLabel('to register an ENS record')] + }; + } + } + const resolverMatcher = { + [iface.getFunction('setText').selector]: (data) => { + const { + // node, + key, value } = iface.decodeFunctionData('setText', data); + return [getAction('Set'), getLabel(`${key} to`), getLabel(value, true)]; + }, + [iface.getFunction('setAddr').selector]: (data) => { + const { + // node, + coinType, a } = iface.decodeFunctionData('setAddr', data); + const ct = registeredCoinTypes[Number(coinType)]; + const networkName = (ct && ct[2]) || 'Unknown network'; + return networkName === 'Ether' + ? [ + getAction('Transfer ENS'), + getLabel('to'), + isAddress(a) ? getAddressVisualization(a) : getLabel(a, true) + ] + : [ + getAction('Set'), + getLabel('address'), + isAddress(a) ? getAddressVisualization(a) : getLabel(a, true), + getLabel('on'), + getLabel(networkName, true) + ]; + }, + [iface.getFunction('setContenthash').selector]: () => { + return [getAction('Update'), getLabel('data')]; + }, + [iface.getFunction('setABI').selector]: () => { + return [getAction('Set'), getLabel('ABI')]; + } + }; + if (getAddress(call.to) === ENS_RESOLVER) { + if (resolverMatcher[call.data.slice(0, 10)]) + return { ...call, fullVisualization: resolverMatcher[call.data.slice(0, 10)](call.data) }; + if (call.data.slice(0, 10) === iface.getFunction('multicall').selector) { + const { data } = iface.decodeFunctionData('multicall', call.data); + const separator = getLabel('and'); + const fullVisualization = data + .map((i) => { + return resolverMatcher[i.slice(0, 10)] + ? resolverMatcher[i.slice(0, 10)](i) + : [getAction('Unknown ENS action')]; + }) + .reduce((acc, curr, index) => acc.concat(index ? [separator, ...curr] : curr), []); + return { ...call, fullVisualization }; + } + } + if (getAddress(call.to) === BULK_RENEWAL && + call.data.startsWith(iface.getFunction('renewAll').selector)) { + const { names, duration } = iface.decodeFunctionData('renewAll', call.data); + const durationLabel = getDurationText(duration); + return { + ...call, + fullVisualization: [ + getAction('Renew'), + ...names.map((name) => getLabel(`${name}.eth`, true)), + getLabel('for'), + getLabel(durationLabel, true) + ] + }; + } + return call; + }); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.js.map b/dist/src/libs/humanizer/modules/ENS/index.js.map new file mode 100644 index 000000000..51580493b --- /dev/null +++ b/dist/src/libs/humanizer/modules/ENS/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/ENS/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { registeredCoinTypes } from '../../const/coinType'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst ENS_CONTROLLER = '0x253553366Da8546fC250F225fe3d25d0C782303b'\nconst ENS_RESOLVER = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'\nconst BULK_RENEWAL = '0xa12159e5131b1eEf6B4857EEE3e1954744b5033A'\n\nconst iface = new Interface([\n 'function register(string name,address owner, uint256 duration, bytes32 secret, address resolver, bytes[] data, bool reverseRecord, uint16 ownerControlledFuses)',\n 'function commit(bytes32)',\n 'function setText(bytes32 node,string calldata key,string calldata value)',\n 'function multicall(bytes[] data)',\n // 'function setAddr(bytes32,uint256,bytes)',\n 'function setAddr(bytes32 node, uint256 coinType, bytes memory a)',\n 'function setContenthash(bytes32,bytes)',\n 'function setABI(bytes32,uint256,bytes)',\n 'function renew(string id,uint256 duration)',\n 'function renewAll(string[] calldata names, uint256 duration)'\n])\n\nconst YEAR_IN_SECONDS = 60n * 60n * 24n * 365n\nconst getDurationText = (duration: bigint): string => {\n const durationLabel = `${duration / YEAR_IN_SECONDS} year${\n duration < 2n * YEAR_IN_SECONDS ? '' : 's'\n }`\n return durationLabel\n}\n\nexport const ensModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n // @TODO: set text and others\n return irCalls.map((call) => {\n if (getAddress(call.to) === ENS_CONTROLLER) {\n if (call.data.slice(0, 10) === iface.getFunction('register')!.selector) {\n const {\n name,\n owner,\n duration\n // secret,\n // resolver,\n // data,\n // reverseRecord,\n // ownerControlledFuses\n } = iface.decodeFunctionData('register', call.data)\n const fullVisualization = [getAction('Register'), getLabel(`${name}.ens`, true)]\n\n if (owner !== accountOp.accountAddr)\n fullVisualization.push(getLabel('to'), getAddressVisualization(owner))\n const durationLabel = getDurationText(duration)\n\n fullVisualization.push(getLabel('for'), getLabel(durationLabel, true))\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('renew')!.selector) {\n const { id, duration } = iface.decodeFunctionData('renew', call.data)\n const durationLabel = getDurationText(duration)\n const fullVisualization = [\n getAction('Renew'),\n getLabel(`${id}.eth`),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('commit')!.selector) {\n return {\n ...call,\n fullVisualization: [getAction('Request'), getLabel('to register an ENS record')]\n }\n }\n }\n const resolverMatcher = {\n [iface.getFunction('setText')!.selector]: (data: string) => {\n const {\n // node,\n key,\n value\n } = iface.decodeFunctionData('setText', data)\n return [getAction('Set'), getLabel(`${key} to`), getLabel(value, true)]\n },\n [iface.getFunction('setAddr')!.selector]: (data: string) => {\n const {\n // node,\n coinType,\n a\n } = iface.decodeFunctionData('setAddr', data)\n const ct = registeredCoinTypes[Number(coinType)]\n const networkName = (ct && ct[2]) || 'Unknown network'\n return networkName === 'Ether'\n ? [\n getAction('Transfer ENS'),\n getLabel('to'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true)\n ]\n : [\n getAction('Set'),\n getLabel('address'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true),\n getLabel('on'),\n getLabel(networkName, true)\n ]\n },\n [iface.getFunction('setContenthash')!.selector]: () => {\n return [getAction('Update'), getLabel('data')]\n },\n [iface.getFunction('setABI')!.selector]: () => {\n return [getAction('Set'), getLabel('ABI')]\n }\n }\n\n if (getAddress(call.to) === ENS_RESOLVER) {\n if (resolverMatcher[call.data.slice(0, 10)])\n return { ...call, fullVisualization: resolverMatcher[call.data.slice(0, 10)](call.data) }\n\n if (call.data.slice(0, 10) === iface.getFunction('multicall')!.selector) {\n const { data } = iface.decodeFunctionData('multicall', call.data)\n const separator = getLabel('and')\n const fullVisualization = data\n .map((i: string): HumanizerVisualization[] => {\n return resolverMatcher[i.slice(0, 10)]\n ? resolverMatcher[i.slice(0, 10)](i)\n : [getAction('Unknown ENS action')]\n })\n .reduce(\n (acc: HumanizerVisualization[], curr: HumanizerVisualization[], index: number) =>\n acc.concat(index ? [separator, ...curr] : curr),\n []\n )\n return { ...call, fullVisualization }\n }\n }\n if (\n getAddress(call.to) === BULK_RENEWAL &&\n call.data.startsWith(iface.getFunction('renewAll')!.selector)\n ) {\n const { names, duration } = iface.decodeFunctionData('renewAll', call.data)\n const durationLabel = getDurationText(duration)\n\n return {\n ...call,\n fullVisualization: [\n getAction('Renew'),\n ...names.map((name: string) => getLabel(`${name}.eth`, true)),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n }\n }\n return call\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts new file mode 100644 index 000000000..14d80e42d --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const fallbackHumanizer: HumanizerCallModule; +//# sourceMappingURL=fallBackHumanizer.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts.map new file mode 100644 index 000000000..a8ed43f34 --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fallBackHumanizer.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,mBAAmB,EAIpB,MAAM,kBAAkB,CAAA;AA2BzB,eAAO,MAAM,iBAAiB,EAAE,mBAgE/B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js new file mode 100644 index 000000000..f58f3c6a0 --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js @@ -0,0 +1,64 @@ +/* eslint-disable no-await-in-loop */ +import { Interface, isAddress, ZeroAddress } from 'ethers'; +import { checkIfUnknownAction, getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +function extractAddresses(data, _selector) { + const selector = _selector.startsWith('function') ? _selector : `function ${_selector}`; + const iface = new Interface([selector]); + const args = iface.decodeFunctionData(selector, data); + const deepSearchForAddress = (obj) => { + return Object.values(obj) + .map((o) => { + if (typeof o === 'string' && isAddress(o)) + return [o]; + if (typeof o === 'object') + return deepSearchForAddress(o).filter((x) => x); + return undefined; + }) + .filter((x) => x).flat(); + }; + return deepSearchForAddress(args); +} +export const fallbackHumanizer = (accountOp, currentIrCalls, humanizerMeta) => { + const newCalls = currentIrCalls.map((call) => { + if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) + return call; + const knownSigHashes = Object.values(humanizerMeta.abis).reduce((a, b) => ({ ...a, ...b }), {}); + const visualization = []; + if (call.data !== '0x') { + let extractedAddresses = []; + if (knownSigHashes[call.data.slice(0, 10)]?.signature) { + try { + extractedAddresses = extractAddresses(call.data, knownSigHashes[call.data.slice(0, 10)].signature); + } + catch (e) { + console.error('Humanizer: fallback: Could not decode addresses from calldata'); + } + visualization.push(getAction(`Call ${ + // from function asd(address asd) returns ... => asd(address asd) + knownSigHashes[call.data.slice(0, 10)].signature + .split('function ') + .filter((x) => x !== '')[0] + .split(' returns') + .filter((x) => x !== '')[0]}`), getLabel('from'), getAddressVisualization(call.to), ...extractedAddresses.map((a) => ({ ...getToken(a, 0n), isHidden: true }))); + } + else { + visualization.push(getAction('Unknown action'), getLabel('to'), getAddressVisualization(call.to)); + } + } + if (call.value) { + if (call.data !== '0x') + visualization.push(getLabel('and')); + visualization.push(getAction('Send'), getToken(ZeroAddress, call.value)); + if (call.data === '0x') + visualization.push(getLabel('to'), getAddressVisualization(call.to)); + } + return { + ...call, + fullVisualization: visualization.length + ? visualization + : [getAction('No data, no value, call to'), getAddressVisualization(call.to)] + }; + }); + return newCalls; +}; +//# sourceMappingURL=fallBackHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map new file mode 100644 index 000000000..cd22f710f --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fallBackHumanizer.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAS1D,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,uBAAuB,EACvB,QAAQ,EACR,QAAQ,EACT,MAAM,aAAa,CAAA;AAEpB,SAAS,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAA;IACvF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,oBAAoB,GAAG,CAAC,GAA4B,EAAY,EAAE;QACtE,OACE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;aACf,GAAG,CAAC,CAAC,CAAM,EAAwB,EAAE;YACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAa,CAAA;YACjE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAa,CAAA;YACtF,OAAO,SAAS,CAAA;QAClB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACnB,CAAC,IAAI,EAAc,CAAA;IACtB,CAAC,CAAA;IACD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAwB,CACpD,SAAoB,EACpB,cAAwB,EACxB,aAA4B,EAC5B,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAA;QAEzF,MAAM,cAAc,GAAoC,MAAM,CAAC,MAAM,CACnE,aAAa,CAAC,IAA6B,CAC5C,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAExC,MAAM,aAAa,GAAkC,EAAE,CAAA;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;YACtB,IAAI,kBAAkB,GAAa,EAAE,CAAA;YACrC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE;gBACrD,IAAI;oBACF,kBAAkB,GAAG,gBAAgB,CACnC,IAAI,CAAC,IAAI,EACT,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CACjD,CAAA;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;iBAC/E;gBACD,aAAa,CAAC,IAAI,CAChB,SAAS,CACP,QAAQ;gBACN,kEAAkE;gBAClE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;qBAC7C,KAAK,CAAC,WAAW,CAAC;qBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;qBAC1B,KAAK,CAAC,UAAU,CAAC;qBACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC9B,EAAE,CACH,EACD,QAAQ,CAAC,MAAM,CAAC,EAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,EAChC,GAAG,kBAAkB,CAAC,GAAG,CACvB,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CACxE,CACF,CAAA;aACF;iBAAM;gBACL,aAAa,CAAC,IAAI,CAChB,SAAS,CAAC,gBAAgB,CAAC,EAC3B,QAAQ,CAAC,IAAI,CAAC,EACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CACjC,CAAA;aACF;SACF;QACD,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;YAC3D,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YACxE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;SAC7F;QAED,OAAO;YACL,GAAG,IAAI;YACP,iBAAiB,EAAE,aAAa,CAAC,MAAM;gBACrC,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getToken\n} from '../../utils'\n\nfunction extractAddresses(data: string, _selector: string): string[] {\n const selector = _selector.startsWith('function') ? _selector : `function ${_selector}`\n const iface = new Interface([selector])\n const args = iface.decodeFunctionData(selector, data)\n const deepSearchForAddress = (obj: { [prop: string]: any }): string[] => {\n return (\n Object.values(obj)\n .map((o: any): string[] | undefined => {\n if (typeof o === 'string' && isAddress(o)) return [o] as string[]\n if (typeof o === 'object') return deepSearchForAddress(o).filter((x) => x) as string[]\n return undefined\n })\n .filter((x) => x) as string[][]\n ).flat() as string[]\n }\n return deepSearchForAddress(args)\n}\n\nexport const fallbackHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n\n const knownSigHashes: HumanizerMeta['abis']['NO_ABI'] = Object.values(\n humanizerMeta.abis as HumanizerMeta['abis']\n ).reduce((a, b) => ({ ...a, ...b }), {})\n\n const visualization: Array = []\n if (call.data !== '0x') {\n let extractedAddresses: string[] = []\n if (knownSigHashes[call.data.slice(0, 10)]?.signature) {\n try {\n extractedAddresses = extractAddresses(\n call.data,\n knownSigHashes[call.data.slice(0, 10)].signature\n )\n } catch (e) {\n console.error('Humanizer: fallback: Could not decode addresses from calldata')\n }\n visualization.push(\n getAction(\n `Call ${\n // from function asd(address asd) returns ... => asd(address asd)\n knownSigHashes[call.data.slice(0, 10)].signature\n .split('function ')\n .filter((x) => x !== '')[0]\n .split(' returns')\n .filter((x) => x !== '')[0]\n }`\n ),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...extractedAddresses.map(\n (a): HumanizerVisualization => ({ ...getToken(a, 0n), isHidden: true })\n )\n )\n } else {\n visualization.push(\n getAction('Unknown action'),\n getLabel('to'),\n getAddressVisualization(call.to)\n )\n }\n }\n if (call.value) {\n if (call.data !== '0x') visualization.push(getLabel('and'))\n visualization.push(getAction('Send'), getToken(ZeroAddress, call.value))\n if (call.data === '0x') visualization.push(getLabel('to'), getAddressVisualization(call.to))\n }\n\n return {\n ...call,\n fullVisualization: visualization.length\n ? visualization\n : [getAction('No data, no value, call to'), getAddressVisualization(call.to)]\n }\n })\n\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts new file mode 100644 index 000000000..2a0b4720f --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts @@ -0,0 +1,3 @@ +import { fallbackHumanizer } from './fallBackHumanizer'; +export default fallbackHumanizer; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts.map new file mode 100644 index 000000000..bf971bc98 --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,eAAe,iBAAiB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js new file mode 100644 index 000000000..43d22f448 --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js @@ -0,0 +1,3 @@ +import { fallbackHumanizer } from './fallBackHumanizer'; +export default fallbackHumanizer; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map new file mode 100644 index 000000000..1bf7578c3 --- /dev/null +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,eAAe,iBAAiB,CAAA","sourcesContent":["import { fallbackHumanizer } from './fallBackHumanizer'\n\nexport default fallbackHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts new file mode 100644 index 000000000..04377d6ff --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const gasTankModule: HumanizerCallModule; +//# sourceMappingURL=gasTankModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts.map b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts.map new file mode 100644 index 000000000..82ca622e5 --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gasTankModule.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/gasTankModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,eAAO,MAAM,aAAa,EAAE,mBAgC3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js new file mode 100644 index 000000000..e45f0be1e --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js @@ -0,0 +1,37 @@ +import { AbiCoder, ZeroAddress } from 'ethers'; +import { FEE_COLLECTOR } from '../../../../consts/addresses'; +import { getAction, getToken } from '../../utils'; +export const gasTankModule = (_, irCalls) => { + const newCalls = irCalls.map((call) => { + // @TODO fix those upper/lowercase + if (call.to.toLowerCase() === FEE_COLLECTOR.toLowerCase()) { + if (call.value > 0n) { + return { + ...call, + fullVisualization: [getAction('Fuel gas tank with'), getToken(ZeroAddress, call.value)] + }; + } + try { + const [text] = new AbiCoder().decode(['string', 'uint256', 'string'], call.data); + // mostly useful for filtering out call in benzin + if (text === 'gasTank') + return { ...call, fullVisualization: [getAction('Pay fee with gas tank')] }; + } + catch (e) { + // do nothing + } + } + else if (call.fullVisualization?.[0]?.content === 'Send' && + call.fullVisualization?.[1]?.type === 'token' && + call.fullVisualization?.[2]?.content === 'to' && + call.fullVisualization?.[3].type === 'address' && + call.fullVisualization[3].address.toLowerCase() === FEE_COLLECTOR.toLowerCase()) + return { + ...call, + fullVisualization: [getAction('Fuel gas tank with'), call.fullVisualization[1]] + }; + return call; + }); + return newCalls; +}; +//# sourceMappingURL=gasTankModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map new file mode 100644 index 000000000..3cf5f4327 --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gasTankModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/gasTankModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAG5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,EAAE;YACzD,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE;gBACnB,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACxF,CAAA;aACF;YACD,IAAI;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChF,iDAAiD;gBACjD,IAAI,IAAI,KAAK,SAAS;oBACpB,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAA;aAC9E;YAAC,OAAO,CAAC,EAAE;gBACV,aAAa;aACd;SACF;aAAM,IACL,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM;YAC/C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAC9C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAQ,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE;YAEhF,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;aAChF,CAAA;QACH,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nexport const gasTankModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (call.to.toLowerCase() === FEE_COLLECTOR.toLowerCase()) {\n if (call.value > 0n) {\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), getToken(ZeroAddress, call.value)]\n }\n }\n try {\n const [text] = new AbiCoder().decode(['string', 'uint256', 'string'], call.data)\n // mostly useful for filtering out call in benzin\n if (text === 'gasTank')\n return { ...call, fullVisualization: [getAction('Pay fee with gas tank')] }\n } catch (e) {\n // do nothing\n }\n } else if (\n call.fullVisualization?.[0]?.content === 'Send' &&\n call.fullVisualization?.[1]?.type === 'token' &&\n call.fullVisualization?.[2]?.content === 'to' &&\n call.fullVisualization?.[3].type === 'address' &&\n call.fullVisualization[3].address!.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n )\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), call.fullVisualization[1]]\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts b/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts new file mode 100644 index 000000000..835453b07 --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts @@ -0,0 +1,3 @@ +import { gasTankModule } from './gasTankModule'; +export default gasTankModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts.map b/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts.map new file mode 100644 index 000000000..859ab9c23 --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,eAAe,aAAa,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.js b/dist/src/libs/humanizer/modules/GasTankModule/index.js new file mode 100644 index 000000000..a17c54ee7 --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.js @@ -0,0 +1,3 @@ +import { gasTankModule } from './gasTankModule'; +export default gasTankModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.js.map b/dist/src/libs/humanizer/modules/GasTankModule/index.js.map new file mode 100644 index 000000000..3b35a8f3c --- /dev/null +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,eAAe,aAAa,CAAA","sourcesContent":["import { gasTankModule } from './gasTankModule'\n\nexport default gasTankModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts b/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts new file mode 100644 index 000000000..b550a5e2f --- /dev/null +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const KyberModule: HumanizerCallModule; +export default KyberModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts.map b/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts.map new file mode 100644 index 000000000..49aab32ed --- /dev/null +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/KyberSwap/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,QAAA,MAAM,WAAW,EAAE,mBAuClB,CAAA;AAED,eAAe,WAAW,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.js b/dist/src/libs/humanizer/modules/KyberSwap/index.js new file mode 100644 index 000000000..6e88e7544 --- /dev/null +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.js @@ -0,0 +1,34 @@ +import { Interface } from 'ethers'; +import { KyberSwap } from '../../const/abis'; +import { eToNative, getAction, getLabel, getToken } from '../../utils'; +const KyberModule = (accOp, calls) => { + const iface = new Interface(KyberSwap); + const matcher = { + [iface.getFunction('swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution)')?.selector]: (call) => { + const { execution: { desc: { srcToken, dstToken, amount, minReturnAmount } } } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(eToNative(srcToken), amount), + getLabel('for'), + getToken(eToNative(dstToken), minReturnAmount) + ]; + }, + [iface.getFunction('swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData)')?.selector]: (call) => { + const { desc: { srcToken, dstToken, amount, minReturnAmount } } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(eToNative(srcToken), amount), + getLabel('for'), + getToken(eToNative(dstToken), minReturnAmount) + ]; + } + }; + const newCalls = calls.map((call) => { + if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default KyberModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.js.map b/dist/src/libs/humanizer/modules/KyberSwap/index.js.map new file mode 100644 index 000000000..b8214b86f --- /dev/null +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/KyberSwap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtE,MAAM,WAAW,GAAwB,CAAC,KAAgB,EAAE,KAAe,EAAE,EAAE;IAC7E,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,+TAA+T,CAChU,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,SAAS,EAAE,EACT,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,iSAAiS,CAClS,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { KyberSwap } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { eToNative, getAction, getLabel, getToken } from '../../utils'\n\nconst KyberModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(KyberSwap)\n\n const matcher = {\n [iface.getFunction(\n 'swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution)'\n )?.selector!]: (call: IrCall) => {\n const {\n execution: {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n },\n [iface.getFunction(\n 'swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default KyberModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.d.ts b/dist/src/libs/humanizer/modules/Legends/index.d.ts new file mode 100644 index 000000000..e184cf7c6 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Legends/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const legendsModule: HumanizerCallModule; +export default legendsModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.d.ts.map b/dist/src/libs/humanizer/modules/Legends/index.d.ts.map new file mode 100644 index 000000000..1e95ffaeb --- /dev/null +++ b/dist/src/libs/humanizer/modules/Legends/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Legends/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAW9D,QAAA,MAAM,aAAa,EAAE,mBAsFpB,CAAA;AAED,eAAe,aAAa,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.js b/dist/src/libs/humanizer/modules/Legends/index.js new file mode 100644 index 000000000..0bb868337 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Legends/index.js @@ -0,0 +1,91 @@ +import { getAddress, Interface, ZeroAddress } from 'ethers'; +import { Legends } from '../../const/abis/Legends'; +import { getAction, getAddressVisualization, getImage, getLabel } from '../../utils'; +const ONCHAIN_TXNS_LEGENDS_ADDRESS = '0x1415926535897932384626433832795028841971'; +const OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [ + '0x52d067EBB7b06F31AEB645Bd34f92c3Ac13a29ea', + '0xcfbAec203431045E9589F70375AC5F529EE55511', + '0xF51dF52d0a9BEeB7b6E4B6451e729108a115B863', + '0xb850AcfBC7720873242D27A38E4AE987f914Ef5B' +]; +const legendsModule = (accOp, calls) => { + const iface = new Interface(Legends); + const characterTypes = [ + { + type: 'Unknown', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/unknown.png' + }, + { + type: 'The Degenerate', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/slime-lvl0.png' + }, + { + type: 'The Codeweaver', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/sorceress-lvl0.png' + }, + { + type: 'The Layerbinder', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/necromancer-lvl0.png' + }, + { + type: 'The Custodian', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/penguin-lvl0.png' + }, + { + type: 'The Warrior', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/orc-lvl0.png' + }, + { + type: 'The Shapeshifter', + image: 'https://relayer.ambire.com/legends/nft-image/avatar/shapeshifter-lvl0.png' + } + ]; + const matcher = { + [iface.getFunction('mint')?.selector]: (call) => { + const [heroType] = iface.parseTransaction(call).args; + return [ + getAction('Pick character'), + getImage(characterTypes[heroType]?.image || characterTypes[0].image), + getLabel(characterTypes[heroType]?.type || characterTypes[0].type, true), + getLabel('for Ambire Legends') + ]; + }, + [iface.getFunction('getDailyReward')?.selector]: () => [ + getAction('Unlock the treasure chest') + ], + [iface.getFunction('spinWheel')?.selector]: () => { + return [getAction('Unlock the wheel of fortune')]; + }, + [iface.getFunction('linkAndAcceptInvite')?.selector]: (call) => { + const [inviteeV2Account, inviteeEoaOrV1, inviter] = iface.parseTransaction(call).args; + const acceptInvitationVisualizationPrefix = inviter !== ZeroAddress + ? [ + getAction('Accept invitation'), + getLabel('from'), + getAddressVisualization(inviter), + getLabel('and') + ] + : []; + return [ + ...acceptInvitationVisualizationPrefix, + getAction('Link account'), + getAddressVisualization(inviteeEoaOrV1), + getLabel('to'), + getAddressVisualization(inviteeV2Account) + ]; + }, + [iface.getFunction('invite')?.selector]: (call) => { + const [invitee] = iface.parseTransaction(call).args; + return [getAction('Invite'), getAddressVisualization(invitee), getLabel('to Ambire Legends')]; + } + }; + const newCalls = calls.map((call) => { + if (![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes(getAddress(call.to)) || + !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default legendsModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.js.map b/dist/src/libs/humanizer/modules/Legends/index.js.map new file mode 100644 index 000000000..d76390d55 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Legends/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Legends/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Legends } from '../../const/abis/Legends'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getImage, getLabel } from '../../utils'\n\nconst ONCHAIN_TXNS_LEGENDS_ADDRESS = '0x1415926535897932384626433832795028841971'\nconst OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [\n '0x52d067EBB7b06F31AEB645Bd34f92c3Ac13a29ea',\n '0xcfbAec203431045E9589F70375AC5F529EE55511',\n '0xF51dF52d0a9BEeB7b6E4B6451e729108a115B863',\n '0xb850AcfBC7720873242D27A38E4AE987f914Ef5B'\n]\n\nconst legendsModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Legends)\n const characterTypes = [\n {\n type: 'Unknown',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/unknown.png'\n },\n {\n type: 'The Degenerate',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/slime-lvl0.png'\n },\n {\n type: 'The Codeweaver',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/sorceress-lvl0.png'\n },\n {\n type: 'The Layerbinder',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/necromancer-lvl0.png'\n },\n {\n type: 'The Custodian',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/penguin-lvl0.png'\n },\n {\n type: 'The Warrior',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/orc-lvl0.png'\n },\n {\n type: 'The Shapeshifter',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/shapeshifter-lvl0.png'\n }\n ]\n const matcher = {\n [iface.getFunction('mint')?.selector!]: (call: IrCall) => {\n const [heroType] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Pick character'),\n getImage(characterTypes[heroType]?.image || characterTypes[0].image),\n getLabel(characterTypes[heroType]?.type || characterTypes[0].type, true),\n getLabel('for Ambire Legends')\n ]\n },\n [iface.getFunction('getDailyReward')?.selector!]: () => [\n getAction('Unlock the treasure chest')\n ],\n [iface.getFunction('spinWheel')?.selector!]: () => {\n return [getAction('Unlock the wheel of fortune')]\n },\n [iface.getFunction('linkAndAcceptInvite')?.selector!]: (call: IrCall) => {\n const [inviteeV2Account, inviteeEoaOrV1, inviter] = iface.parseTransaction(call)!.args\n const acceptInvitationVisualizationPrefix =\n inviter !== ZeroAddress\n ? [\n getAction('Accept invitation'),\n getLabel('from'),\n getAddressVisualization(inviter),\n getLabel('and')\n ]\n : []\n return [\n ...acceptInvitationVisualizationPrefix,\n getAction('Link account'),\n getAddressVisualization(inviteeEoaOrV1),\n getLabel('to'),\n getAddressVisualization(inviteeV2Account)\n ]\n },\n [iface.getFunction('invite')?.selector!]: (call: IrCall) => {\n const [invitee] = iface.parseTransaction(call)!.args\n\n return [getAction('Invite'), getAddressVisualization(invitee), getLabel('to Ambire Legends')]\n }\n }\n const newCalls = calls.map((call) => {\n if (\n ![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes(\n getAddress(call.to)\n ) ||\n !matcher[call.data.slice(0, 10)]\n )\n return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default legendsModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.d.ts b/dist/src/libs/humanizer/modules/Lido/index.d.ts new file mode 100644 index 000000000..4ca024b84 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Lido/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const LidoModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.d.ts.map b/dist/src/libs/humanizer/modules/Lido/index.d.ts.map new file mode 100644 index 000000000..6ad116154 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Lido/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Lido/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAQ9D,eAAO,MAAM,UAAU,EAAE,mBA6CxB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.js b/dist/src/libs/humanizer/modules/Lido/index.js new file mode 100644 index 000000000..36aa70021 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Lido/index.js @@ -0,0 +1,52 @@ +import { getAddress, Interface, isAddress, ZeroAddress } from 'ethers'; +import { unstETH, WrappedStETH } from '../../const/abis/Lido'; +import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +const WRAPPED_ST_ETH_ADDRESS = '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'; +const ST_ETH_ADDRESS = '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84'; +const UNWRAP_CONTRACT_ADDR = '0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1'; +const wrapIface = new Interface(WrappedStETH); +const unwrapIface = new Interface(unstETH); +export const LidoModule = (accOp, calls) => { + const newCalls = calls.map((call) => { + if (isAddress(call.to) && getAddress(call.to) === WRAPPED_ST_ETH_ADDRESS) { + if (call.data.startsWith(wrapIface.getFunction('wrap(uint256)').selector)) { + const [amount] = wrapIface.parseTransaction(call).args; + const fullVisualization = [getAction('Wrap'), getToken(ST_ETH_ADDRESS, amount)]; + return { ...call, fullVisualization }; + } + if (call.data.startsWith(wrapIface.getFunction('unwrap(uint256)').selector)) { + const [amount] = wrapIface.parseTransaction(call).args; + const fullVisualization = [getAction('Unwrap'), getToken(ST_ETH_ADDRESS, amount)]; + return { ...call, fullVisualization }; + } + } + if (isAddress(call.to) && getAddress(call.to) === UNWRAP_CONTRACT_ADDR) { + if (call.data.startsWith(unwrapIface.getFunction('requestWithdrawals').selector)) { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { _amounts, _owner } = unwrapIface.parseTransaction(call).args; + const amount = _amounts.reduce((acc, cur) => acc + cur, 0n); + const fullVisualization = [getAction('Request withdraw'), getToken(ST_ETH_ADDRESS, amount)]; + if (![ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase())) + fullVisualization.push(getLabel('and authorize'), getAddressVisualization(_owner)); + return { ...call, fullVisualization }; + } + if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawals').selector)) { + return { ...call, fullVisualization: [getAction('Claim withdrawals')] }; + } + if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawal').selector)) { + return { ...call, fullVisualization: [getAction('Claim withdrawal')] }; + } + if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawalsTo').selector)) { + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars + const { _requestIds, _hints, _recipient } = unwrapIface.parseTransaction(call).args; + const fullVisualization = [getAction('Claim withdrawal')]; + if (_recipient.toLowerCase() !== accOp.accountAddr.toLowerCase()) + fullVisualization.push(getLabel('and send to'), getAddressVisualization(_recipient)); + return { ...call, fullVisualization: [getAction('Claim withdrawal')] }; + } + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.js.map b/dist/src/libs/humanizer/modules/Lido/index.js.map new file mode 100644 index 000000000..766673c86 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Lido/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Lido/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { unstETH, WrappedStETH } from '../../const/abis/Lido'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst WRAPPED_ST_ETH_ADDRESS = '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'\nconst ST_ETH_ADDRESS = '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84'\nconst UNWRAP_CONTRACT_ADDR = '0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1'\nconst wrapIface = new Interface(WrappedStETH)\nconst unwrapIface = new Interface(unstETH)\nexport const LidoModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const newCalls = calls.map((call) => {\n if (isAddress(call.to) && getAddress(call.to) === WRAPPED_ST_ETH_ADDRESS) {\n if (call.data.startsWith(wrapIface.getFunction('wrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Wrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(wrapIface.getFunction('unwrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Unwrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n\n if (isAddress(call.to) && getAddress(call.to) === UNWRAP_CONTRACT_ADDR) {\n if (call.data.startsWith(unwrapIface.getFunction('requestWithdrawals')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _amounts, _owner } = unwrapIface.parseTransaction(call)!.args\n const amount = _amounts.reduce((acc: bigint, cur: bigint) => acc + cur, 0n)\n const fullVisualization = [getAction('Request withdraw'), getToken(ST_ETH_ADDRESS, amount)]\n if (![ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase()))\n fullVisualization.push(getLabel('and authorize'), getAddressVisualization(_owner))\n return { ...call, fullVisualization }\n }\n\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawals')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawals')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawal')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawalsTo')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars\n const { _requestIds, _hints, _recipient } = unwrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim withdrawal')]\n if (_recipient.toLowerCase() !== accOp.accountAddr.toLowerCase())\n fullVisualization.push(getLabel('and send to'), getAddressVisualization(_recipient))\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n }\n return call\n })\n\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.d.ts b/dist/src/libs/humanizer/modules/OpenSea/index.d.ts new file mode 100644 index 000000000..fe797c158 --- /dev/null +++ b/dist/src/libs/humanizer/modules/OpenSea/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const openSeaModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.d.ts.map b/dist/src/libs/humanizer/modules/OpenSea/index.d.ts.map new file mode 100644 index 000000000..617a167ac --- /dev/null +++ b/dist/src/libs/humanizer/modules/OpenSea/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/OpenSea/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AA6G9D,eAAO,MAAM,aAAa,EAAE,mBAwG3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.js b/dist/src/libs/humanizer/modules/OpenSea/index.js new file mode 100644 index 000000000..745fcb555 --- /dev/null +++ b/dist/src/libs/humanizer/modules/OpenSea/index.js @@ -0,0 +1,177 @@ +import { Interface } from 'ethers'; +import { stringify } from '../../../richJson/richJson'; +import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../../utils'; +const iface = new Interface([ + 'function fulfillBasicOrder_efficient_6GL6yc(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)', + 'function fulfillBasicOrder(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)', + 'function fulfillAvailableAdvancedOrders(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData)[], (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], (uint256 orderIndex, uint256 itemIndex)[][], (uint256 orderIndex, uint256 itemIndex)[][], bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled) payable returns (bool[], ((uint8 itemType, address token, uint256 identifier, uint256 amount, address recipient) item, address offerer, bytes32 conduitKey)[])', + 'function fulfillAdvancedOrder(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData), (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], bytes32 fulfillerConduitKey, address recipient) payable returns (bool fulfilled)' +]); +const parsePrice = (price, numerator, denumerator) => BigInt((price * numerator) / denumerator); +const parseOrder = (order) => { + const [params, num, denum + // data2, data3 + ] = order; + const [, , + // currentOwner + // zone + offers, consideration, , , + // orderType + // startTime + endTime + // zoneHash, + // salt, + // conduitKey + // totalOriginalConsiderationItems + ] = params; + const items = offers.map((o) => { + const [, + // type + address, id, fromAmount, endAmount] = o; + return { + address, + id, + fromAmount: parsePrice(fromAmount, num, denum), + endAmount: parsePrice(endAmount, num, denum) + }; + }); + const payment = []; + const tokenPayments = {}; + consideration.forEach((o) => { + const [type, token, tokenId, , + // fromAmount + endAmount] = o; + if (type === 0n || type === 1n) + tokenPayments[token] = (tokenPayments[token] || 0n) + parsePrice(endAmount, num, denum); + if (type === 2n || type === 3n) + payment.push({ address: token, amountOrId: BigInt(tokenId) }); + }); + Object.entries(tokenPayments).forEach(([address, amountOrId]) => { + payment.push({ address, amountOrId }); + }); + return { items, payment, end: BigInt(endTime) }; +}; +const dedupe1155Orders = (orders) => { + if (orders.length <= 30) + return orders; + const uniqueOrders = [...new Set(orders.map(stringify))]; + if (uniqueOrders.length > 1) + return orders; + if (orders[0].items.length > 1) + return orders; + if (orders[0].payment.length > 1) + return orders; + // if (uniqueOrders.items.length > 1) return orders + const correctNumberOfOrders = BigInt(orders.length - 30); + const finalOrder = orders[0]; + finalOrder.items[0].endAmount *= correctNumberOfOrders; + finalOrder.items[0].fromAmount *= correctNumberOfOrders; + finalOrder.payment[0].amountOrId *= correctNumberOfOrders; + return [finalOrder]; +}; +const humanizerOrder = ({ items, payment, end }) => { + return [ + getAction('Buy'), + ...items + .map(({ address, id, fromAmount }) => fromAmount === 1n + ? [getToken(address, id)] + : [getLabel(fromAmount.toString(), true), getToken(address, id)]) + .flat(), + getLabel('for up to'), + ...payment.map(({ address, amountOrId }) => getToken(address, amountOrId)), + getDeadline(end) + ]; +}; +export const openSeaModule = (accountOp, irCalls) => { + return irCalls.map((call) => { + if ([ + iface.getFunction('fulfillBasicOrder_efficient_6GL6yc').selector, + iface.getFunction('fulfillBasicOrder').selector + ].includes(call.data.slice(0, 10))) { + let orders; + if (call.data.slice(0, 10) === iface.getFunction('fulfillBasicOrder').selector) + orders = iface.decodeFunctionData('fulfillBasicOrder', call.data); + else + orders = iface.decodeFunctionData('fulfillBasicOrder_efficient_6GL6yc', call.data); + const data = orders.map((i) => { + const [considerationToken, considerationIdentifier, considerationAmount, , , + // offerer, + // zone, + offerToken, offerIdentifier, , , + // offerAmount, + // basicOrderType, + startTime, endTime + // zoneHash, + // salt, + // offererConduitKey, + // fulfillerConduitKey, + // totalOriginalAdditionalRecipients, + // additionalRecipients, + // signature + ] = i; + return { + considerationToken, + considerationIdentifier, + considerationAmount, + // offerer, + // zone, + offerToken, + offerIdentifier, + // offerAmount, + // basicOrderType, + startTime, + endTime + // zoneHash, + // salt, + // offererConduitKey, + // fulfillerConduitKey, + // totalOriginalAdditionalRecipients, + // additionalRecipients, + // signature + }; + }); + if (data.length !== 1) + return call; + return { + ...call, + fullVisualization: [ + getAction('Buy'), + getToken(data[0].offerToken, data[0].offerIdentifier), + getLabel('for'), + getToken(data[0].considerationToken, data[0].considerationAmount), + getDeadline(data[0].endTime) + ] + }; + } + if (call.data.startsWith(iface.getFunction('fulfillAvailableAdvancedOrders').selector)) { + const [orders] = iface.decodeFunctionData('fulfillAvailableAdvancedOrders', call.data); + let totalOrders = orders.map((o) => parseOrder(o)); + // opensea allows batch buy of 30 items at most + // if we detect more than 30 orders, that means the dapp attempts to + // execute n-30 EIP1155 orders that are being deduplicated accordingly on a contract level + // dedupe1155Orders removes 30 repeating orders and merges the remaining n orders + if (totalOrders.length > 30) + totalOrders = dedupe1155Orders(totalOrders); + // still not deduped + if (totalOrders.length > 30) + return { + ...call, + fullVisualization: [ + getAction('Buy NFTs'), + getLabel('from'), + getAddressVisualization(call.to) + ] + }; + const fullVisualization = totalOrders.map(humanizerOrder).flat(); + return { ...call, fullVisualization }; + } + if (call.data.startsWith(iface.getFunction('fulfillAdvancedOrder').selector)) { + const [order] = iface.decodeFunctionData('fulfillAdvancedOrder', call.data); + const parsedOrder = parseOrder(order); + const fullVisualization = humanizerOrder(parsedOrder); + return { ...call, fullVisualization }; + } + return call; + }); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.js.map b/dist/src/libs/humanizer/modules/OpenSea/index.js.map new file mode 100644 index 000000000..ae5a3b9a3 --- /dev/null +++ b/dist/src/libs/humanizer/modules/OpenSea/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/OpenSea/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { stringify } from '../../../richJson/richJson'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function fulfillBasicOrder_efficient_6GL6yc(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillBasicOrder(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillAvailableAdvancedOrders(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData)[], (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], (uint256 orderIndex, uint256 itemIndex)[][], (uint256 orderIndex, uint256 itemIndex)[][], bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled) payable returns (bool[], ((uint8 itemType, address token, uint256 identifier, uint256 amount, address recipient) item, address offerer, bytes32 conduitKey)[])',\n 'function fulfillAdvancedOrder(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData), (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], bytes32 fulfillerConduitKey, address recipient) payable returns (bool fulfilled)'\n])\n\ninterface Order {\n items: { address: string; id: bigint; fromAmount: bigint; endAmount: bigint }[]\n payment: { address: string; amountOrId: bigint }[]\n end: bigint\n}\nconst parsePrice = (price: bigint, numerator: bigint, denumerator: bigint): bigint =>\n BigInt((price * numerator) / denumerator)\nconst parseOrder = (order: any): Order => {\n const [\n params,\n num,\n denum\n // data2, data3\n ] = order\n const [\n ,\n ,\n // currentOwner\n // zone\n offers,\n consideration,\n ,\n ,\n // orderType\n // startTime\n endTime\n // zoneHash,\n // salt,\n // conduitKey\n // totalOriginalConsiderationItems\n ] = params\n const items = offers.map((o: any): Order['items'][0] => {\n const [\n ,\n // type\n address,\n id,\n fromAmount,\n endAmount\n ] = o\n return {\n address,\n id,\n fromAmount: parsePrice(fromAmount, num, denum),\n endAmount: parsePrice(endAmount, num, denum)\n }\n })\n const payment: Order['payment'][0][] = []\n const tokenPayments: { [addr: string]: bigint } = {}\n consideration.forEach((o: any) => {\n const [\n type,\n token,\n tokenId,\n ,\n // fromAmount\n endAmount\n ] = o\n if (type === 0n || type === 1n)\n tokenPayments[token] = (tokenPayments[token] || 0n) + parsePrice(endAmount, num, denum)\n if (type === 2n || type === 3n)\n payment.push({ address: token as string, amountOrId: BigInt(tokenId) })\n })\n Object.entries(tokenPayments).forEach(([address, amountOrId]) => {\n payment.push({ address, amountOrId })\n })\n return { items, payment, end: BigInt(endTime) }\n}\n\nconst dedupe1155Orders = (orders: Order[]): any[] => {\n if (orders.length <= 30) return orders\n const uniqueOrders = [...new Set(orders.map(stringify))]\n if (uniqueOrders.length > 1) return orders\n if (orders[0].items.length > 1) return orders\n if (orders[0].payment.length > 1) return orders\n // if (uniqueOrders.items.length > 1) return orders\n const correctNumberOfOrders = BigInt(orders.length - 30)\n const finalOrder = orders[0]\n finalOrder.items[0].endAmount *= correctNumberOfOrders\n finalOrder.items[0].fromAmount *= correctNumberOfOrders\n finalOrder.payment[0].amountOrId *= correctNumberOfOrders\n return [finalOrder]\n}\nconst humanizerOrder = ({ items, payment, end }: Order) => {\n return [\n getAction('Buy'),\n ...items\n .map(({ address, id, fromAmount }) =>\n fromAmount === 1n\n ? [getToken(address, id)]\n : [getLabel(fromAmount.toString(), true), getToken(address, id)]\n )\n .flat(),\n getLabel('for up to'),\n ...payment.map(({ address, amountOrId }) => getToken(address, amountOrId)),\n getDeadline(end)\n ]\n}\n\nexport const openSeaModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n return irCalls.map((call: IrCall) => {\n if (\n [\n iface.getFunction('fulfillBasicOrder_efficient_6GL6yc')!.selector,\n iface.getFunction('fulfillBasicOrder')!.selector\n ].includes(call.data.slice(0, 10))\n ) {\n let orders\n if (call.data.slice(0, 10) === iface.getFunction('fulfillBasicOrder')!.selector)\n orders = iface.decodeFunctionData('fulfillBasicOrder', call.data)\n else orders = iface.decodeFunctionData('fulfillBasicOrder_efficient_6GL6yc', call.data)\n\n const data = orders.map((i) => {\n const [\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n ,\n ,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n ,\n ,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n ] = i\n\n return {\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n }\n })\n if (data.length !== 1) return call\n return {\n ...call,\n fullVisualization: [\n getAction('Buy'),\n getToken(data[0].offerToken, data[0].offerIdentifier),\n getLabel('for'),\n getToken(data[0].considerationToken, data[0].considerationAmount),\n getDeadline(data[0].endTime)\n ]\n }\n }\n\n if (call.data.startsWith(iface.getFunction('fulfillAvailableAdvancedOrders')!.selector)) {\n const [orders] = iface.decodeFunctionData('fulfillAvailableAdvancedOrders', call.data)\n\n let totalOrders: Order[] = orders.map((o: any) => parseOrder(o))\n // opensea allows batch buy of 30 items at most\n // if we detect more than 30 orders, that means the dapp attempts to\n // execute n-30 EIP1155 orders that are being deduplicated accordingly on a contract level\n // dedupe1155Orders removes 30 repeating orders and merges the remaining n orders\n if (totalOrders.length > 30) totalOrders = dedupe1155Orders(totalOrders)\n // still not deduped\n if (totalOrders.length > 30)\n return {\n ...call,\n fullVisualization: [\n getAction('Buy NFTs'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n const fullVisualization = totalOrders.map(humanizerOrder).flat()\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(iface.getFunction('fulfillAdvancedOrder')!.selector)) {\n const [order] = iface.decodeFunctionData('fulfillAdvancedOrder', call.data)\n const parsedOrder: Order = parseOrder(order)\n const fullVisualization = humanizerOrder(parsedOrder)\n return { ...call, fullVisualization }\n }\n\n return call\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts b/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts new file mode 100644 index 000000000..94114bfcc --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts @@ -0,0 +1,3 @@ +import { postProcessing } from './postProcessModule'; +export default postProcessing; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts.map b/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts.map new file mode 100644 index 000000000..ed1e0baba --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,eAAe,cAAc,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.js b/dist/src/libs/humanizer/modules/PostProcessing/index.js new file mode 100644 index 000000000..c8bd11dc2 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.js @@ -0,0 +1,3 @@ +import { postProcessing } from './postProcessModule'; +export default postProcessing; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.js.map b/dist/src/libs/humanizer/modules/PostProcessing/index.js.map new file mode 100644 index 000000000..45d7621aa --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,eAAe,cAAc,CAAA","sourcesContent":["import { postProcessing } from './postProcessModule'\n\nexport default postProcessing\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts new file mode 100644 index 000000000..f1ebd6443 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const postProcessing: HumanizerCallModule; +//# sourceMappingURL=postProcessModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts.map b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts.map new file mode 100644 index 000000000..ce0673175 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"postProcessModule.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/postProcessModule.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,eAAO,MAAM,cAAc,EAAE,mBAa5B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js new file mode 100644 index 000000000..e0187b570 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js @@ -0,0 +1,17 @@ +import { ZeroAddress } from 'ethers'; +import { getToken } from '../../utils'; +export const postProcessing = (_, currentIrCalls) => { + const newCalls = currentIrCalls.map((_call) => { + const fullVisualization = (_call?.fullVisualization || []).map((i) => { + if (i.type === 'token' && i.address.toLowerCase() === '0x'.padEnd(42, 'e')) + return { ...i, address: ZeroAddress }; + return i; + }); + return { + ..._call, + fullVisualization: [...fullVisualization, getToken(_call.to, 0n, true)] + }; + }); + return newCalls; +}; +//# sourceMappingURL=postProcessModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map new file mode 100644 index 000000000..dabf46127 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"postProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/postProcessModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAwB,CAAC,CAAY,EAAE,cAAwB,EAAE,EAAE;IAC5F,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;gBACxE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;YACvC,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,OAAO;YACL,GAAG,KAAK;YACR,iBAAiB,EAAE,CAAC,GAAG,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;SACxE,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getToken } from '../../utils'\n\nexport const postProcessing: HumanizerCallModule = (_: AccountOp, currentIrCalls: IrCall[]) => {\n const newCalls = currentIrCalls.map((_call) => {\n const fullVisualization = (_call?.fullVisualization || []).map((i) => {\n if (i.type === 'token' && i.address.toLowerCase() === '0x'.padEnd(42, 'e'))\n return { ...i, address: ZeroAddress }\n return i\n })\n return {\n ..._call,\n fullVisualization: [...fullVisualization, getToken(_call.to, 0n, true)]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.d.ts b/dist/src/libs/humanizer/modules/PreProcess/index.d.ts new file mode 100644 index 000000000..6bcbf5d8f --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/index.d.ts @@ -0,0 +1,3 @@ +import { preProcessHumanizer } from './preProcessModule'; +export default preProcessHumanizer; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.d.ts.map b/dist/src/libs/humanizer/modules/PreProcess/index.d.ts.map new file mode 100644 index 000000000..55ead9444 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,eAAe,mBAAmB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.js b/dist/src/libs/humanizer/modules/PreProcess/index.js new file mode 100644 index 000000000..50d563a3b --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/index.js @@ -0,0 +1,3 @@ +import { preProcessHumanizer } from './preProcessModule'; +export default preProcessHumanizer; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.js.map b/dist/src/libs/humanizer/modules/PreProcess/index.js.map new file mode 100644 index 000000000..dc69de1d6 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,eAAe,mBAAmB,CAAA","sourcesContent":["import { preProcessHumanizer } from './preProcessModule'\n\nexport default preProcessHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts new file mode 100644 index 000000000..c97d88e6f --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const preProcessHumanizer: HumanizerCallModule; +//# sourceMappingURL=preProcessModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts.map b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts.map new file mode 100644 index 000000000..2fcf56147 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"preProcessModule.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/preProcessModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAE9D,eAAO,MAAM,mBAAmB,EAAE,mBAYjC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js new file mode 100644 index 000000000..48e35be6d --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js @@ -0,0 +1,11 @@ +export const preProcessHumanizer = (_, currentIrCalls) => { + const newCalls = currentIrCalls.map((_call) => { + const call = { ..._call }; + if (!call.data) { + call.data = '0x'; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=preProcessModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map new file mode 100644 index 000000000..b3796fc12 --- /dev/null +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"preProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/preProcessModule.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAwB,CACtD,CAAY,EACZ,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;SACjB;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\n\nexport const preProcessHumanizer: HumanizerCallModule = (\n _: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((_call) => {\n const call = { ..._call }\n if (!call.data) {\n call.data = '0x'\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.d.ts b/dist/src/libs/humanizer/modules/Privileges/index.d.ts new file mode 100644 index 000000000..442dac7b1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/index.d.ts @@ -0,0 +1,3 @@ +import { privilegeHumanizer } from './privileges'; +export default privilegeHumanizer; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.d.ts.map b/dist/src/libs/humanizer/modules/Privileges/index.d.ts.map new file mode 100644 index 000000000..be969836a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,eAAe,kBAAkB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.js b/dist/src/libs/humanizer/modules/Privileges/index.js new file mode 100644 index 000000000..5c074f5e8 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/index.js @@ -0,0 +1,3 @@ +import { privilegeHumanizer } from './privileges'; +export default privilegeHumanizer; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.js.map b/dist/src/libs/humanizer/modules/Privileges/index.js.map new file mode 100644 index 000000000..1c69948e9 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,eAAe,kBAAkB,CAAA","sourcesContent":["import { privilegeHumanizer } from './privileges'\n\nexport default privilegeHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts b/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts new file mode 100644 index 000000000..79ce35809 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const privilegeHumanizer: HumanizerCallModule; +//# sourceMappingURL=privileges.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts.map b/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts.map new file mode 100644 index 000000000..44b1e1640 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"privileges.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/privileges.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,mBAAmB,EAIpB,MAAM,kBAAkB,CAAA;AAyBzB,eAAO,MAAM,kBAAkB,EAAE,mBAehC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.js b/dist/src/libs/humanizer/modules/Privileges/privileges.js new file mode 100644 index 000000000..352738917 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.js @@ -0,0 +1,34 @@ +import { Interface, ZeroHash } from 'ethers'; +import AmbireAccount from '../../../../../contracts/compiled/AmbireAccount.json'; +import { ENTRY_POINT_MARKER } from '../../../../consts/deploy'; +import { getAction, getAddressVisualization, getKnownName, getLabel } from '../../utils'; +const iface = new Interface(AmbireAccount.abi); +const parsePrivilegeCall = (humanizerMeta, call) => { + const { addr, priv } = iface.parseTransaction(call).args; + if (getKnownName(humanizerMeta, addr)?.includes('entry point') && priv === ENTRY_POINT_MARKER) + return [getAction('Enable'), getAddressVisualization(addr)]; + if (priv === ZeroHash) + return [getAction('Revoke access'), getLabel('of'), getAddressVisualization(addr)]; + return [ + getAction('Update access status'), + getLabel('of'), + getAddressVisualization(addr), + getLabel('to'), + priv === '0x0000000000000000000000000000000000000000000000000000000000000001' + ? getLabel('regular access') + : getLabel(priv) + ]; +}; +export const privilegeHumanizer = (accountOp, irCalls, humanizerMeta) => { + const newCalls = irCalls.map((call) => { + if (call.data.slice(0, 10) === iface.getFunction('setAddrPrivilege')?.selector) { + return { + ...call, + fullVisualization: parsePrivilegeCall(humanizerMeta, call) + }; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=privileges.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.js.map b/dist/src/libs/humanizer/modules/Privileges/privileges.js.map new file mode 100644 index 000000000..54beba14a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.js.map @@ -0,0 +1 @@ +{"version":3,"file":"privileges.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/privileges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,aAAa,MAAM,sDAAsD,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAQ9D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,kBAAkB,GAAG,CACzB,aAA4B,EAC5B,IAAY,EACc,EAAE;IAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;IACzD,IAAI,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,kBAAkB;QAC3F,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7D,IAAI,IAAI,KAAK,QAAQ;QACnB,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IACpF,OAAO;QACL,SAAS,CAAC,sBAAsB,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC;QACd,uBAAuB,CAAC,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;QACd,IAAI,KAAK,oEAAoE;YAC3E,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;KACnB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAwB,CACrD,SAAoB,EACpB,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE;YAC9E,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC;aAC3D,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroHash } from 'ethers'\n\nimport AmbireAccount from '../../../../../contracts/compiled/AmbireAccount.json'\nimport { ENTRY_POINT_MARKER } from '../../../../consts/deploy'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport { getAction, getAddressVisualization, getKnownName, getLabel } from '../../utils'\n\nconst iface = new Interface(AmbireAccount.abi)\n\nconst parsePrivilegeCall = (\n humanizerMeta: HumanizerMeta,\n call: IrCall\n): HumanizerVisualization[] => {\n const { addr, priv } = iface.parseTransaction(call)!.args\n if (getKnownName(humanizerMeta, addr)?.includes('entry point') && priv === ENTRY_POINT_MARKER)\n return [getAction('Enable'), getAddressVisualization(addr)]\n if (priv === ZeroHash)\n return [getAction('Revoke access'), getLabel('of'), getAddressVisualization(addr)]\n return [\n getAction('Update access status'),\n getLabel('of'),\n getAddressVisualization(addr),\n getLabel('to'),\n priv === '0x0000000000000000000000000000000000000000000000000000000000000001'\n ? getLabel('regular access')\n : getLabel(priv)\n ]\n}\n\nexport const privilegeHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((call) => {\n if (call.data.slice(0, 10) === iface.getFunction('setAddrPrivilege')?.selector) {\n return {\n ...call,\n fullVisualization: parsePrivilegeCall(humanizerMeta, call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts b/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts new file mode 100644 index 000000000..f0b6ed26b --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts @@ -0,0 +1,3 @@ +import { singletonFactory } from './singletonFactory'; +export default singletonFactory; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts.map b/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts.map new file mode 100644 index 000000000..679a40dc7 --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAe,gBAAgB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.js b/dist/src/libs/humanizer/modules/SingletonFactory/index.js new file mode 100644 index 000000000..f732f387a --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.js @@ -0,0 +1,3 @@ +import { singletonFactory } from './singletonFactory'; +export default singletonFactory; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map b/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map new file mode 100644 index 000000000..839287183 --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAe,gBAAgB,CAAA","sourcesContent":["import { singletonFactory } from './singletonFactory'\n\nexport default singletonFactory\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts new file mode 100644 index 000000000..ed6d911c6 --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const singletonFactory: HumanizerCallModule; +//# sourceMappingURL=singletonFactory.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts.map b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts.map new file mode 100644 index 000000000..d2b1f2c8c --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"singletonFactory.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/singletonFactory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAI9D,eAAO,MAAM,gBAAgB,EAAE,mBAoB9B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js new file mode 100644 index 000000000..69c602b68 --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js @@ -0,0 +1,23 @@ +import { getAddress, Interface } from 'ethers'; +import { getAction, getAddressVisualization, getLabel } from '../../utils'; +const CONTRACT_FACTORY_ADDRESS = '0xce0042B868300000d44A59004Da54A005ffdcf9f'; +export const singletonFactory = (_, irCalls) => { + const iface = new Interface(['function deploy(bytes,bytes32)']); + const newCalls = irCalls.map((call) => { + // @TODO fix those upper/lowercase + if (getAddress(call.to) === CONTRACT_FACTORY_ADDRESS && + call.data.slice(0, 10) === iface.getFunction('deploy').selector) { + return { + ...call, + fullVisualization: [ + getAction('Deploy a contract'), + getLabel('via'), + getAddressVisualization(CONTRACT_FACTORY_ADDRESS) + ] + }; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=singletonFactory.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map new file mode 100644 index 000000000..f454ca387 --- /dev/null +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"singletonFactory.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/singletonFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAI9C,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE1E,MAAM,wBAAwB,GAAG,4CAA4C,CAAA;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IACE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,wBAAwB;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAE,CAAC,QAAQ,EAChE;YACA,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,SAAS,CAAC,mBAAmB,CAAC;oBAC9B,QAAQ,CAAC,KAAK,CAAC;oBACf,uBAAuB,CAAC,wBAAwB,CAAC;iBAClD;aACF,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { getAddress, Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst CONTRACT_FACTORY_ADDRESS = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const singletonFactory: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const iface = new Interface(['function deploy(bytes,bytes32)'])\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (\n getAddress(call.to) === CONTRACT_FACTORY_ADDRESS &&\n call.data.slice(0, 10) === iface.getFunction('deploy')!.selector\n ) {\n return {\n ...call,\n fullVisualization: [\n getAction('Deploy a contract'),\n getLabel('via'),\n getAddressVisualization(CONTRACT_FACTORY_ADDRESS)\n ]\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.d.ts b/dist/src/libs/humanizer/modules/Socket/index.d.ts new file mode 100644 index 000000000..e2d348519 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/index.d.ts @@ -0,0 +1,3 @@ +import { SocketModule } from './socketModules'; +export { SocketModule }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.d.ts.map b/dist/src/libs/humanizer/modules/Socket/index.d.ts.map new file mode 100644 index 000000000..4eefce588 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.js b/dist/src/libs/humanizer/modules/Socket/index.js new file mode 100644 index 000000000..05123f459 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/index.js @@ -0,0 +1,3 @@ +import { SocketModule } from './socketModules'; +export { SocketModule }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.js.map b/dist/src/libs/humanizer/modules/Socket/index.js.map new file mode 100644 index 000000000..2e625d44a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,CAAA","sourcesContent":["import { SocketModule } from './socketModules'\n\nexport { SocketModule }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts b/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts new file mode 100644 index 000000000..76d4aae6e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const SocketModule: HumanizerCallModule; +//# sourceMappingURL=socketModules.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts.map b/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts.map new file mode 100644 index 000000000..45d66fb6b --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"socketModules.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/socketModules.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAkC,MAAM,kBAAkB,CAAA;AA+BtF,eAAO,MAAM,YAAY,EAAE,mBAk5B1B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.js b/dist/src/libs/humanizer/modules/Socket/socketModules.js new file mode 100644 index 000000000..707735ec0 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.js @@ -0,0 +1,572 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { AbiCoder, Interface, ZeroAddress } from 'ethers'; +import { SocketViaAcross } from '../../const/abis'; +import { eToNative, getAction, getAddressVisualization, getChain, getDeadline, getLabel, getRecipientText, getToken, getTokenWithChain } from '../../utils'; +// taken from https://stargateprotocol.gitbook.io/stargate/developers/chain-ids +const STARGATE_CHAIN_IDS = { + '101': 1n, + '102': 56n, + '106': 43114n, + '109': 137n, + '110': 42161n, + '111': 10n, + '112': 250n, + '151': 1088n, + '184': 8453n, + '183': 59144n, + '177': 2222n, + '181': 5000n +}; +// @TODO check all additional data provided +// @TODO consider fees everywhere +// @TODO add automated tests +export const SocketModule = (accountOp, irCalls) => { + const preControllerIface = new Interface([ + 'function executeController((uint32 controllerId, bytes data) socketControllerRequest)', + 'function takeFeesAndSwap((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes swapRequestData) ftsRequest) payable returns (bytes)', + 'function takeFeesAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes bridgeRequestData) ftbRequest) payable returns (bytes)', + // @TODO + 'function takeFeeAndSwapAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 swapRouteId, bytes swapData, uint32 bridgeRouteId, bytes bridgeData) fsbRequest)' + ]); + const iface = new Interface([ + ...SocketViaAcross, + // @TODO move to more appropriate place all funcs + 'function performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData) payable returns (uint256)', + 'function performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)', + 'function bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)', + 'function bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)', + 'function transformERC20(address inputToken, address outputToken, uint256 inputTokenAmount, uint256 minOutputTokenAmount, (uint32,bytes)[] transformations)', + 'function swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)', + 'function swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData) payable', + 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable', + 'function swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)', + 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)', + 'function exec(address,address,uint256,address,bytes)', + 'function execute((address recipient, address buyToken, uint256 minAmountOut) slippage, bytes[] actions, bytes32) payable returns (bool)', + 'function uniswapV3SwapTo(address,uint256,uint256,uint256[])', + 'function BASIC(address,uint256,address,uint256,bytes)', + 'function UNISWAPV3(address,uint256,bytes,uint256)' + ]); + const matcher = { + [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes swapData, tuple(address[] senderReceiverAddresses,address outputToken,uint256[] outputAmountToChainIdArray,uint32[] quoteAndDeadlineTimeStamps,uint256 bridgeFee,bytes32 metadata) acrossBridgeData)')?.selector}`]: (call) => { + const { + // swapId, + swapData, acrossBridgeData: { senderReceiverAddresses: [senderAddress, recipientAddress], outputToken, outputAmountToChainIdArray: [outputAmount, dstChain], quoteAndDeadlineTimeStamps + // bridgeFee, + // metadata + } } = iface.parseTransaction(call).args; + if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { + const { fromToken, amount, toToken } = iface.parseTransaction({ + data: swapData + }).args; + return [ + getAction('Bridge'), + getToken(eToNative(fromToken), amount), + getLabel('to'), + getTokenWithChain(eToNative(toToken), outputAmount), + getLabel('on'), + getChain(dstChain), + getDeadline(quoteAndDeadlineTimeStamps[1]), + ...getRecipientText(senderAddress, recipientAddress) + ]; + } + return [ + getAction('Bridge'), + getLabel('undetected token'), + getLabel('to'), + getTokenWithChain(eToNative(outputToken), outputAmount, dstChain), + getLabel('on'), + getChain(dstChain), + getDeadline(quoteAndDeadlineTimeStamps[1]), + ...getRecipientText(senderAddress, recipientAddress) + ]; + }, + [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable')?.selector}`]: (call) => { + const { swapId, swapData, celerBridgeData: { receiverAddress, toChainId, maxSlippage, nonce, metadata } } = iface.parseTransaction(call).args; + if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { + const { fromToken, amount, toToken } = iface.parseTransaction({ + data: swapData + }).args; + return [ + getAction('Bridge'), + getToken(eToNative(fromToken), amount), + getLabel('to'), + getTokenWithChain(eToNative(toToken), 0n), + getLabel('on'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + } + return [ + getAction('Bridge'), + getLabel('via'), + getAddressVisualization(call.to), + getLabel('to'), + getChain(toChainId) + ]; + }, + [`${iface.getFunction('swapAndBridge(uint32,address,uint256,bytes32,bytes)')?.selector}`]: (call) => { + const [, , chainId, , data] = iface.parseTransaction(call).args; + if (data.startsWith(iface.getFunction('performActionWithIn').selector)) { + const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({ + ...call, + data + }).args; + if (swapExtraData.startsWith(iface.getFunction('transformERC20').selector)) { + const { minOutputTokenAmount } = iface.parseTransaction({ + ...call, + data: swapExtraData + }).args; + return [ + getAction('Bridge'), + getToken(fromToken, amount), + getLabel('to'), + getToken(toToken, minOutputTokenAmount, false, chainId), + getLabel('on'), + getChain(chainId) + ]; + } + return [ + getAction('Bridge'), + getToken(fromToken, amount), + getLabel('to'), + getToken(toToken, 0n, false, chainId), + getLabel('on'), + getChain(chainId) + ]; + } + return [getAction('Bridge'), getLabel('to'), getChain(chainId)]; + }, + [`${iface.getFunction('bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)')?.selector}`]: (call) => { + const [amount, [[sender, receiver], outputToken, [outputAmount, chainId], quoteAndDeadlineTimeStamps + // @TODO + // bridgeFee + ]] = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getTokenWithChain(eToNative(outputToken), outputAmount, chainId), + getLabel('on'), + getChain(chainId), + getDeadline(quoteAndDeadlineTimeStamps[1]), + ...getRecipientText(sender, receiver) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData)')?.selector}`]: (call) => { + const { senderAddress, receiverAddress, amount, stargateBridgeExtraData: { minReceivedAmt, stargateDstChainId } } = iface.parseTransaction(call).args; + const chainId = STARGATE_CHAIN_IDS[stargateDstChainId.toString()]; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getTokenWithChain(ZeroAddress, minReceivedAmt), + getLabel('on'), + getChain(chainId), + ...getRecipientText(senderAddress, receiverAddress) + ]; + }, + [`${iface.getFunction('performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)')?.selector}`]: (call) => { + // eslint-disable-next-line prefer-const + let { fromToken, toToken, amount, receiverAddress, swapExtraData, metadata } = iface.parseTransaction(call).args; + let outAmount = 0n; + if (swapExtraData.startsWith(iface.getFunction('performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)')?.selector)) { + outAmount = iface.parseTransaction({ data: swapExtraData }).args[3]; + } + else if (swapExtraData.startsWith(iface.getFunction('swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)')?.selector)) { + const [randAddress, [token1, token2, randAddress2, recipient, amount1, amount2], bytes1, bytes2] = iface.parseTransaction({ data: swapExtraData }).args; + outAmount = amount2; + } + else if (swapExtraData.startsWith(iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])') + .selector)) { + const params = iface.parseTransaction({ data: swapExtraData }).args; + outAmount = params[3]; + } + else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) { + const [, , , , extraData] = iface.parseTransaction({ + data: swapExtraData + }).args; + if (extraData.startsWith(iface.getFunction('execute')?.selector)) { + // eslint-disable-next-line prefer-const + let [[, , minAmountOut], actions] = iface.parseTransaction({ + data: extraData + }).args; + if (!minAmountOut) { + const uniswapData = actions.find((i) => i.startsWith(iface.getFunction('UNISWAPV3')?.selector)); + if (uniswapData) { + ; + [, , , minAmountOut] = iface.parseTransaction({ data: uniswapData }).args; + } + } + outAmount = minAmountOut; + } + } + else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) { + const [address, amount1, amount2] = iface.parseTransaction({ + data: swapExtraData + }).args; + outAmount = amount2; + } + else if (swapExtraData.startsWith(iface.getFunction('function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)')?.selector)) { + const { + // caller, + desc: { + // srcToken, + // dstToken, + // srcReceiver, + // dstReceiver, + // amount: _amount, + minReturnAmount + // guaranteedAmount, + // flags, + // referrer, + // permit + } } = iface.parseTransaction({ + data: swapExtraData + }).args; + outAmount = minReturnAmount; + } + return [ + getAction('Swap'), + getToken(eToNative(fromToken), amount), + getLabel(outAmount ? 'for at least' : 'for'), + getToken(eToNative(toToken), outAmount), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector}`]: (call) => { + // eslint-disable-next-line prefer-const + let { fromToken, toToken, amount, metadata, swapExtraData } = iface.parseTransaction(call).args; + let outAmount = 0n; + if (swapExtraData.startsWith(iface.getFunction('performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)')?.selector)) { + outAmount = iface.parseTransaction({ data: swapExtraData }).args[3]; + } + else if (swapExtraData.startsWith(iface.getFunction('swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)')?.selector)) { + const [randAddress, [token1, token2, randAddress2, recipient, amount1, amount2], bytes1, bytes2] = iface.parseTransaction({ data: swapExtraData }).args; + outAmount = amount2; + } + else if (swapExtraData.startsWith(iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])') + .selector)) { + const params = iface.parseTransaction({ data: swapExtraData }).args; + outAmount = params[3]; + } + else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) { + const [, , , , extraData] = iface.parseTransaction({ + data: swapExtraData + }).args; + if (extraData.startsWith(iface.getFunction('execute')?.selector)) { + // eslint-disable-next-line prefer-const + let [[, , minAmountOut], actions] = iface.parseTransaction({ + data: extraData + }).args; + if (!minAmountOut) { + const uniswapData = actions.find((i) => i.startsWith(iface.getFunction('UNISWAPV3')?.selector)); + if (uniswapData) { + ; + [, , , minAmountOut] = iface.parseTransaction({ data: uniswapData }).args; + } + } + outAmount = minAmountOut; + } + } + else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) { + const [address, amount1, amount2] = iface.parseTransaction({ + data: swapExtraData + }).args; + outAmount = amount2; + } + else if (swapExtraData.startsWith(iface.getFunction('function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)')?.selector)) { + const { + // caller, + desc: { + // srcToken, + // dstToken, + // srcReceiver, + // dstReceiver, + // amount: _amount, + minReturnAmount + // guaranteedAmount, + // flags, + // referrer, + // permit + } } = iface.parseTransaction({ + data: swapExtraData + }).args; + outAmount = minReturnAmount; + } + return [ + getAction('Swap'), + getToken(eToNative(fromToken), amount), + getLabel(outAmount ? 'for at least' : 'for'), + getToken(eToNative(toToken), outAmount) + ]; + }, + [`${iface.getFunction('bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)')?.selector}`]: (call) => { + const { amount, acrossBridgeData: { senderReceiverAddresses: [sender, receiver], inputOutputTokens: [inputToken, outputToken], outputAmountToChainIdArray: [outputAmount, chainId] } } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(eToNative(inputToken), amount), + getLabel('to'), + getTokenWithChain(eToNative(outputToken), outputAmount, chainId), + getLabel('on'), + getChain(chainId), + ...getRecipientText(sender, receiver) + ]; + }, + [`${iface.getFunction('bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)')?.selector}`]: (call) => { + const { amount, connextBridgeData: { toChainId, dstChainDomain, token, receiverAddress, metadata, callData, delegate } } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(eToNative(token), amount), + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery)')?.selector}`]: (call) => { + const { amount, metadata, receiverAddress, toChainId, originQuery: { tokenOut, minAmountOut, deadline }, destinationQuery // : { swapAdapter, tokenOut, minAmountOut, deadline, rawParams } + } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(eToNative(tokenOut), amount), + getLabel('to'), + getTokenWithChain(eToNative(destinationQuery.tokenOut), destinationQuery.minAmountOut, toChainId), + getLabel('on'), + getChain(toChainId), + getDeadline(deadline), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)') + ?.selector}`]: (call) => { + const [amount, id, recipient, token, chainId, unknown1, fee] = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(eToNative(token), amount), + getLabel('to'), + getToken(eToNative(token), amount), + getLabel('on'), + getChain(chainId), + ...getRecipientText(accountOp.accountAddr, recipient) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)')?.selector}`]: (call) => { + const { receiverAddress, customBridgeAddress, l2Gas, amount, metadata, data } = iface.parseTransaction(call).args; + // @TODO + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('via'), + getAddressVisualization(customBridgeAddress), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data)')?.selector}`]: (call) => { + const { receiverAddress, l2Gas, amount, toChainId, metadata, bridgeHash, data } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash)')?.selector}`]: (call) => { + const { receiverAddress, gasLimit, fees, metadata, amount, toChainId, bridgeHash } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable')?.selector}`]: (call) => { + const { receiverAddress, l1bridgeAddr, toChainId, amount, amountOutMin, relayerFee, deadline, metadata } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getToken(ZeroAddress, amountOutMin), + getLabel('on'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress), + getDeadline(deadline) + ]; + }, + [`${iface.getFunction('bridgeNativeTo(uint256,address,uint256,bytes32)')?.selector}`]: (call) => { + const [amount, recipient, chainId, metadata] = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getChain(chainId), + ...getRecipientText(accountOp.accountAddr, recipient) + ]; + }, + [`${iface.getFunction('function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable')?.selector}`]: (call) => { + const { receiverAddress, hopAMM, amount, toChainId, bonderFee, amountOutMin, deadline, amountOutMinDestination, deadlineDestination, metadata } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(ZeroAddress, amount), + getLabel('to'), + getToken(ZeroAddress, amountOutMin), + getLabel('on'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress), + getDeadline(deadline) + ]; + }, + [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)')?.selector}`]: (call) => { + const { swapData, connextBridgeData: { chainId, slippage, relayerFee, dstChainDomain, receiverAddress, metadata, callData, delegate } } = iface.parseTransaction(call).args; + if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { + const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({ + data: swapData + }).args; + let outAmount = 0n; + // @TODO no harcoded sighashes + if (swapExtraData.startsWith('0x415565b0')) + outAmount = iface.parseTransaction({ data: swapExtraData }).args[3]; + return [ + getAction('Bridge'), + getToken(eToNative(fromToken), amount), + getLabel('to'), + ...(chainId + ? [ + getTokenWithChain(eToNative(toToken), outAmount, chainId), + getLabel('on'), + getChain(chainId) + ] + : [getToken(eToNative(toToken), outAmount)]), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ].filter((x) => x); + } + return [ + getAction('Bridge'), + getLabel('undetected token'), + getLabel('to'), + getLabel('undetected token'), + ...(chainId ? [getLabel('on'), getChain(chainId)] : []), + ...getRecipientText(accountOp.accountAddr, receiverAddress) + ].filter((x) => x); + }, + [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData)')?.selector}`]: (call) => { + const { swapId, swapData, acrossBridgeData: { receiverAddress, senderAddress, value, srcPoolId, dstPoolId, minReceivedAmt, destinationGasLimit, isNativeSwapRequired, stargateDstChainId, swapId: innerSwapId, swapData: innerSwapData, metadata, destinationPayload } } = iface.parseTransaction(call).args; + const dstChain = []; + const tokensData = []; + if (STARGATE_CHAIN_IDS[stargateDstChainId]) + dstChain.push(getLabel('to'), getChain(STARGATE_CHAIN_IDS[stargateDstChainId])); + if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { + const { fromToken, toToken, amount, metadata: newMeta, swapExtraData } = iface.parseTransaction({ + ...call, + data: swapData + }).args; + tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, value)); + } + return [ + getAction('Bridge'), + ...tokensData, + ...dstChain, + ...getRecipientText(senderAddress, receiverAddress) + ]; + }, + [`${iface.getFunction('function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable')?.selector}`]: (call) => { + const { swapId, swapData, stargateBridgeData: { dstEid, minAmountLD, stargatePoolAddress, destinationPayload, destinationExtraOptions, messagingFee: { nativeFee, lzTokenFee }, metadata, toChainId, receiver, swapData: InnerSwapData, swapId: InnerSwapId, isNativeSwapRequired } } = iface.parseTransaction(call).args; + const dstChain = []; + const tokensData = []; + if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { + const { fromToken, toToken, amount, metadata: newMeta, swapExtraData } = iface.parseTransaction({ + ...call, + data: swapData + }).args; + tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, minAmountLD)); + } + return [ + getAction('Bridge'), + ...tokensData, + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiver) + ]; + }, + [`${iface.getFunction('bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)')?.selector}`]: (call) => { + const { receiverAddress, token, hopAMM, amount, toChainId, hopBridgeRequestData: { bonderFee, amountOutMin, deadline, amountOutMinDestination, deadlineDestination, metadata } } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(token, amount), + getLabel('for at least'), + getToken(token, amountOutMinDestination), + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiverAddress), + getDeadline(deadline) + ]; + }, + [`${iface.getFunction('bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable')?.selector}`]: (call) => { + const { token, amount, stargateBridgeData: { dstEid, minAmountLD, stargatePoolAddress, destinationPayload, destinationExtraOptions, messagingFee: { nativeFee, lzTokenFee }, metadata, toChainId, receiver, swapData, swapId, isNativeSwapRequired } } = iface.parseTransaction(call).args; + return [ + getAction('Bridge'), + getToken(token, amount), + getLabel('to'), + getChain(toChainId), + ...getRecipientText(accountOp.accountAddr, receiver) + ]; + } + }; + const newCalls = irCalls.map((call) => { + let dataToUse = call.data; + if (call.data.startsWith(preControllerIface.getFunction('executeController').selector)) { + const [[controllerId, newData]] = preControllerIface.parseTransaction(call).args; + dataToUse = newData; + if (dataToUse.startsWith(preControllerIface.getFunction('takeFeeAndSwapAndBridge').selector)) { + const [[feesTakerAddress, feesToken, feesAmount, swapRouteId, swapData, bridgeRouteId, bridgeData]] = preControllerIface.decodeFunctionData('takeFeeAndSwapAndBridge', dataToUse); + const humanizationOfSwap = matcher[swapData.slice(0, 10)] + ? matcher[swapData.slice(0, 10)]({ ...call, data: swapData }) + : [getAction('Swap')]; + let humanizationOfBridge = [getAction('Bridge')]; + try { + const [[[sender, receiver], [tokenIn, tokenOut], [outputAmount, chainId], [quoteTime, deadline], bridgeFee, metadata]] = new AbiCoder().decode([ + 'tuple(address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata)' + ], bridgeData); + humanizationOfBridge = [ + getAction('Bridge'), + getToken(tokenIn, 0n), + getLabel('for at least'), + getTokenWithChain(tokenOut, outputAmount, chainId), + getLabel('to'), + getChain(chainId), + ...getRecipientText(accountOp.accountAddr, receiver), + getDeadline(deadline) + ]; + } + catch (e) { + console.log(e); + } + return { + ...call, + fullVisualization: [...humanizationOfSwap, getLabel('and'), ...humanizationOfBridge] + }; + } + if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndSwap').selector)) { + const [[feesTakerAddress, feesToken, feesAmount, routeId, swapRequestData]] = preControllerIface.decodeFunctionData('takeFeesAndSwap', dataToUse); + dataToUse = swapRequestData; + } + else if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndBridge').selector)) { + const [[feesTakerAddress, feesToken, feesAmount, routeId, bridgeRequestData]] = preControllerIface.decodeFunctionData('takeFeesAndBridge', dataToUse); + dataToUse = bridgeRequestData; + } + } + else { + dataToUse = `0x${dataToUse.slice(10)}`; + } + if (matcher[dataToUse.slice(0, 10)]) { + return { + ...call, + fullVisualization: matcher[dataToUse.slice(0, 10)]({ ...call, data: dataToUse }) + }; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=socketModules.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.js.map b/dist/src/libs/humanizer/modules/Socket/socketModules.js.map new file mode 100644 index 000000000..bfe946d68 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socketModules.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/socketModules.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { SocketViaAcross } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\n// taken from https://stargateprotocol.gitbook.io/stargate/developers/chain-ids\nconst STARGATE_CHAIN_IDS: { [key: string]: bigint } = {\n '101': 1n,\n '102': 56n,\n '106': 43114n,\n '109': 137n,\n '110': 42161n,\n '111': 10n,\n '112': 250n,\n '151': 1088n,\n '184': 8453n,\n '183': 59144n,\n '177': 2222n,\n '181': 5000n\n}\n// @TODO check all additional data provided\n// @TODO consider fees everywhere\n// @TODO add automated tests\nexport const SocketModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const preControllerIface = new Interface([\n 'function executeController((uint32 controllerId, bytes data) socketControllerRequest)',\n 'function takeFeesAndSwap((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes swapRequestData) ftsRequest) payable returns (bytes)',\n 'function takeFeesAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes bridgeRequestData) ftbRequest) payable returns (bytes)',\n // @TODO\n 'function takeFeeAndSwapAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 swapRouteId, bytes swapData, uint32 bridgeRouteId, bytes bridgeData) fsbRequest)'\n ])\n const iface = new Interface([\n ...SocketViaAcross,\n // @TODO move to more appropriate place all funcs\n 'function performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData) payable returns (uint256)',\n 'function performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)',\n 'function bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)',\n 'function bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function transformERC20(address inputToken, address outputToken, uint256 inputTokenAmount, uint256 minOutputTokenAmount, (uint32,bytes)[] transformations)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData) payable',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable',\n 'function swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)',\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)',\n 'function exec(address,address,uint256,address,bytes)',\n 'function execute((address recipient, address buyToken, uint256 minAmountOut) slippage, bytes[] actions, bytes32) payable returns (bool)',\n 'function uniswapV3SwapTo(address,uint256,uint256,uint256[])',\n 'function BASIC(address,uint256,address,uint256,bytes)',\n 'function UNISWAPV3(address,uint256,bytes,uint256)'\n ])\n const matcher: { [sighash: string]: (irCall: IrCall) => HumanizerVisualization[] } = {\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(address[] senderReceiverAddresses,address outputToken,uint256[] outputAmountToChainIdArray,uint32[] quoteAndDeadlineTimeStamps,uint256 bridgeFee,bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n // swapId,\n swapData,\n acrossBridgeData: {\n senderReceiverAddresses: [senderAddress, recipientAddress],\n outputToken,\n outputAmountToChainIdArray: [outputAmount, dstChain],\n quoteAndDeadlineTimeStamps\n // bridgeFee,\n // metadata\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), outputAmount),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, dstChain),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n celerBridgeData: { receiverAddress, toChainId, maxSlippage, nonce, metadata }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), 0n),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('via'),\n getAddressVisualization(call.to),\n getLabel('to'),\n getChain(toChainId)\n ]\n },\n [`${iface.getFunction('swapAndBridge(uint32,address,uint256,bytes32,bytes)')?.selector}`]: (\n call: IrCall\n ) => {\n const [, , chainId, , data] = iface.parseTransaction(call)!.args\n if (data.startsWith(iface.getFunction('performActionWithIn')!.selector)) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n ...call,\n data\n })!.args\n if (swapExtraData.startsWith(iface.getFunction('transformERC20')!.selector)) {\n const { minOutputTokenAmount } = iface.parseTransaction({\n ...call,\n data: swapExtraData\n })!.args\n\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, minOutputTokenAmount, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, 0n, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [getAction('Bridge'), getLabel('to'), getChain(chainId)]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const [\n amount,\n [\n [sender, receiver],\n outputToken,\n [outputAmount, chainId],\n quoteAndDeadlineTimeStamps\n // @TODO\n // bridgeFee\n ]\n ] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n senderAddress,\n receiverAddress,\n amount,\n stargateBridgeExtraData: { minReceivedAmt, stargateDstChainId }\n } = iface.parseTransaction(call)!.args\n const chainId = STARGATE_CHAIN_IDS[stargateDstChainId.toString()]\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(ZeroAddress, minReceivedAmt),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, receiverAddress, swapExtraData, metadata } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, metadata, swapExtraData } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n acrossBridgeData: {\n senderReceiverAddresses: [sender, receiver],\n inputOutputTokens: [inputToken, outputToken],\n outputAmountToChainIdArray: [outputAmount, chainId]\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(inputToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n connextBridgeData: {\n toChainId,\n dstChainDomain,\n token,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n metadata,\n receiverAddress,\n toChainId,\n originQuery: { tokenOut, minAmountOut, deadline },\n destinationQuery // : { swapAdapter, tokenOut, minAmountOut, deadline, rawParams }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(tokenOut), amount),\n getLabel('to'),\n getTokenWithChain(\n eToNative(destinationQuery.tokenOut),\n destinationQuery.minAmountOut,\n toChainId\n ),\n getLabel('on'),\n getChain(toChainId),\n getDeadline(deadline),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction('bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)')\n ?.selector\n }`]: (call: IrCall) => {\n const [amount, id, recipient, token, chainId, unknown1, fee] =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getToken(eToNative(token), amount),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, customBridgeAddress, l2Gas, amount, metadata, data } =\n iface.parseTransaction(call)!.args\n // @TODO\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('via'),\n getAddressVisualization(customBridgeAddress),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, l2Gas, amount, toChainId, metadata, bridgeHash, data } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, gasLimit, fees, metadata, amount, toChainId, bridgeHash } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n l1bridgeAddr,\n toChainId,\n amount,\n amountOutMin,\n relayerFee,\n deadline,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${iface.getFunction('bridgeNativeTo(uint256,address,uint256,bytes32)')?.selector}`]: (\n call: IrCall\n ) => {\n const [amount, recipient, chainId, metadata] = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n hopAMM,\n amount,\n toChainId,\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapData,\n connextBridgeData: {\n chainId,\n slippage,\n relayerFee,\n dstChainDomain,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n data: swapData\n })!.args\n let outAmount = 0n\n // @TODO no harcoded sighashes\n if (swapExtraData.startsWith('0x415565b0'))\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n\n ...(chainId\n ? [\n getTokenWithChain(eToNative(toToken), outAmount, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n : [getToken(eToNative(toToken), outAmount)]),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getLabel('undetected token'),\n ...(chainId ? [getLabel('on'), getChain(chainId)] : []),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n acrossBridgeData: {\n receiverAddress,\n senderAddress,\n value,\n srcPoolId,\n dstPoolId,\n minReceivedAmt,\n destinationGasLimit,\n isNativeSwapRequired,\n stargateDstChainId,\n swapId: innerSwapId,\n swapData: innerSwapData,\n metadata,\n destinationPayload\n }\n } = iface.parseTransaction(call)!.args\n\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (STARGATE_CHAIN_IDS[stargateDstChainId])\n dstChain.push(getLabel('to'), getChain(STARGATE_CHAIN_IDS[stargateDstChainId]))\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, value))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n ...dstChain,\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n\n [`${\n iface.getFunction(\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData: InnerSwapData,\n swapId: InnerSwapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, minAmountLD))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n },\n\n [`${\n iface.getFunction(\n 'bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n token,\n hopAMM,\n amount,\n toChainId,\n hopBridgeRequestData: {\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n }\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('for at least'),\n getToken(token, amountOutMinDestination),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n token,\n amount,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData,\n swapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n let dataToUse = call.data\n\n if (call.data.startsWith(preControllerIface.getFunction('executeController')!.selector)) {\n const [[controllerId, newData]] = preControllerIface.parseTransaction(call)!.args\n dataToUse = newData\n\n if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeeAndSwapAndBridge')!.selector)\n ) {\n const [\n [\n feesTakerAddress,\n feesToken,\n feesAmount,\n swapRouteId,\n swapData,\n bridgeRouteId,\n bridgeData\n ]\n ] = preControllerIface.decodeFunctionData('takeFeeAndSwapAndBridge', dataToUse)\n const humanizationOfSwap = matcher[swapData.slice(0, 10)]\n ? matcher[swapData.slice(0, 10)]({ ...call, data: swapData })\n : [getAction('Swap')]\n\n let humanizationOfBridge = [getAction('Bridge')]\n\n try {\n const [\n [\n [sender, receiver],\n [tokenIn, tokenOut],\n [outputAmount, chainId],\n [quoteTime, deadline],\n bridgeFee,\n metadata\n ]\n ] = new AbiCoder().decode(\n [\n 'tuple(address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata)'\n ],\n bridgeData\n )\n\n humanizationOfBridge = [\n getAction('Bridge'),\n getToken(tokenIn, 0n),\n getLabel('for at least'),\n getTokenWithChain(tokenOut, outputAmount, chainId),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, receiver),\n getDeadline(deadline)\n ]\n } catch (e) {\n console.log(e)\n }\n return {\n ...call,\n fullVisualization: [...humanizationOfSwap, getLabel('and'), ...humanizationOfBridge]\n }\n }\n if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndSwap')!.selector)) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, swapRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndSwap', dataToUse)\n dataToUse = swapRequestData\n } else if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndBridge')!.selector)\n ) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, bridgeRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndBridge', dataToUse)\n dataToUse = bridgeRequestData\n }\n } else {\n dataToUse = `0x${dataToUse.slice(10)}`\n }\n if (matcher[dataToUse.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher[dataToUse.slice(0, 10)]({ ...call, data: dataToUse })\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts b/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts new file mode 100644 index 000000000..a76548f89 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts @@ -0,0 +1,3 @@ +import { sushiSwapModule } from './sushiSwapModule'; +export default sushiSwapModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts.map b/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts.map new file mode 100644 index 000000000..edaf596c7 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,eAAe,eAAe,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.js b/dist/src/libs/humanizer/modules/Sushiswap/index.js new file mode 100644 index 000000000..51b212b81 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.js @@ -0,0 +1,3 @@ +import { sushiSwapModule } from './sushiSwapModule'; +export default sushiSwapModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.js.map b/dist/src/libs/humanizer/modules/Sushiswap/index.js.map new file mode 100644 index 000000000..8488b0d58 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,eAAe,eAAe,CAAA","sourcesContent":["import { sushiSwapModule } from './sushiSwapModule'\n\nexport default sushiSwapModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts new file mode 100644 index 000000000..850cc0a22 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const sushiSwapModule: HumanizerCallModule; +//# sourceMappingURL=sushiSwapModule.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts.map b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts.map new file mode 100644 index 000000000..3332d5f77 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sushiSwapModule.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/sushiSwapModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAG9D,eAAO,MAAM,eAAe,EAAE,mBAkC7B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js new file mode 100644 index 000000000..da474231d --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js @@ -0,0 +1,35 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { RouteProcessor } from '../../const/abis'; +import { getAction, getLabel, getRecipientText, getToken } from '../../utils'; +export const sushiSwapModule = (accountOp, irCalls) => { + const routeProcessorIface = new Interface(RouteProcessor); + const matcher = { + [`${routeProcessorIface.getFunction('processRoute')?.selector}`]: (_accountOp, call) => { + const params = routeProcessorIface.parseTransaction(call).args; + let { tokenIn, tokenOut /* route */ } = params; + const { amountIn, amountOutMin, to } = params; + if (tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee') + tokenIn = ZeroAddress; + if (tokenOut.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee') + tokenOut = ZeroAddress; + return { + ...call, + fullVisualization: [ + getAction('Swap'), + getToken(tokenIn, amountIn), + getLabel('for'), + getToken(tokenOut, amountOutMin), + ...getRecipientText(accountOp.accountAddr, to) + ] + }; + } + }; + const newCalls = irCalls.map((call) => { + if (matcher[call.data.slice(0, 10)]) { + return matcher[call.data.slice(0, 10)](accountOp, call); + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=sushiSwapModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map new file mode 100644 index 000000000..073441aaf --- /dev/null +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sushiSwapModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/sushiSwapModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,CAAC,MAAM,eAAe,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC9F,MAAM,mBAAmB,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG;QACd,CAAC,GAAG,mBAAmB,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChE,UAAqB,EACrB,IAAY,EACJ,EAAE;YACV,MAAM,MAAM,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAC/D,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,MAAM,CAAA;YAC9C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,MAAM,CAAA;YAC7C,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACxE,OAAO,GAAG,WAAW,CAAA;YACvB,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACzE,QAAQ,GAAG,WAAW,CAAA;YAExB,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,SAAS,CAAC,MAAM,CAAC;oBACjB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;oBAC3B,QAAQ,CAAC,KAAK,CAAC;oBACf,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;oBAChC,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;iBAC/C;aACF,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;YACnC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACxD;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { RouteProcessor } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getRecipientText, getToken } from '../../utils'\n\nexport const sushiSwapModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const routeProcessorIface = new Interface(RouteProcessor)\n const matcher = {\n [`${routeProcessorIface.getFunction('processRoute')?.selector}`]: (\n _accountOp: AccountOp,\n call: IrCall\n ): IrCall => {\n const params = routeProcessorIface.parseTransaction(call)!.args\n let { tokenIn, tokenOut /* route */ } = params\n const { amountIn, amountOutMin, to } = params\n if (tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenIn = ZeroAddress\n if (tokenOut.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenOut = ZeroAddress\n\n return {\n ...call,\n fullVisualization: [\n getAction('Swap'),\n getToken(tokenIn, amountIn),\n getLabel('for'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accountOp.accountAddr, to)\n ]\n }\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n if (matcher[call.data.slice(0, 10)]) {\n return matcher[call.data.slice(0, 10)](accountOp, call)\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.d.ts b/dist/src/libs/humanizer/modules/Tokens/index.d.ts new file mode 100644 index 000000000..1cde452ef --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/index.d.ts @@ -0,0 +1,3 @@ +import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'; +export { genericErc20Humanizer, genericErc721Humanizer }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.d.ts.map b/dist/src/libs/humanizer/modules/Tokens/index.d.ts.map new file mode 100644 index 000000000..b43ff4ac3 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAExE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.js b/dist/src/libs/humanizer/modules/Tokens/index.js new file mode 100644 index 000000000..32ce3f4dd --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/index.js @@ -0,0 +1,3 @@ +import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'; +export { genericErc20Humanizer, genericErc721Humanizer }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.js.map b/dist/src/libs/humanizer/modules/Tokens/index.js.map new file mode 100644 index 000000000..79173cfd8 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAExE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAA","sourcesContent":["import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'\n\nexport { genericErc20Humanizer, genericErc721Humanizer }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts b/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts new file mode 100644 index 000000000..378a79391 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const genericErc721Humanizer: HumanizerCallModule; +export declare const genericErc20Humanizer: HumanizerCallModule; +//# sourceMappingURL=tokens.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts.map b/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts.map new file mode 100644 index 000000000..d73d4dccd --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/tokens.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAK9D,eAAO,MAAM,sBAAsB,EAAE,mBAqEpC,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,mBA6FnC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.js b/dist/src/libs/humanizer/modules/Tokens/tokens.js new file mode 100644 index 000000000..1f9ca9478 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.js @@ -0,0 +1,158 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { ERC20, ERC721 } from '../../const/abis'; +import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +// @TODO merge this with the erc20 humanizer module as sometimes +// we see no difference between the two +export const genericErc721Humanizer = (accountOp, currentIrCalls) => { + const iface = new Interface(ERC721); + const nftTransferVisualization = (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + return args[0] === accountOp.accountAddr + ? [ + getAction('Send'), + getToken(call.to, args[2]), + getLabel('to'), + getAddressVisualization(args[1]) + ] + : [ + getAction('Transfer'), + getToken(call.to, args[2]), + getLabel('from'), + getAddressVisualization(args[0]), + getLabel('to'), + getAddressVisualization(args[1]) + ]; + }; + const matcher = { + [iface.getFunction('approve')?.selector]: (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + return args[0] === ZeroAddress + ? [getAction('Revoke approval'), getLabel('for'), getToken(call.to, args[1])] + : [ + getAction('Grant approval'), + getLabel('for'), + getToken(call.to, args[1]), + getLabel('to'), + getAddressVisualization(args[0]) + ]; + }, + [iface.getFunction('setApprovalForAll')?.selector]: (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + return args[1] + ? [ + getAction('Grant approval'), + getLabel('for all nfts'), + getToken(call.to, args[1]), + getLabel('to'), + getAddressVisualization(args[0]) + ] + : [getAction('Revoke approval'), getLabel('for all nfts'), getAddressVisualization(args[0])]; + }, + // not in tests + [iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256'])?.selector]: nftTransferVisualization, + // [`${ + // iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256', 'bytes']) + // ?.selector + // }`]: nftTransferVisualization, + [iface.getFunction('transferFrom', ['address', 'address', 'uint256'])?.selector]: nftTransferVisualization + }; + const newCalls = currentIrCalls.map((call) => { + // could do additional check if it is actually NFT contract + return matcher[call.data.substring(0, 10)] + ? { + ...call, + fullVisualization: matcher[call.data.substring(0, 10)](call) + } + : call; + }); + return newCalls; +}; +export const genericErc20Humanizer = (accountOp, currentIrCalls) => { + const iface = new Interface(ERC20); + const matcher = { + [iface.getFunction('approve')?.selector]: (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + return args[1] !== BigInt(0) + ? [ + getAction('Grant approval'), + getLabel('for'), + getToken(call.to, args[1]), + getLabel('to'), + getAddressVisualization(args[0]) + ] + : [ + getAction('Revoke approval'), + getToken(call.to, args[1]), + getLabel('for'), + getAddressVisualization(args[0]) + ]; + }, + [iface.getFunction('increaseAllowance')?.selector]: (call) => { + const { spender, addedValue } = iface.decodeFunctionData('increaseAllowance', call.data); + return [ + getAction('Increase allowance'), + getLabel('of'), + getAddressVisualization(spender), + getLabel('with'), + getToken(call.to, addedValue) + ]; + }, + [iface.getFunction('decreaseAllowance')?.selector]: (call) => { + const { spender, subtractedValue } = iface.decodeFunctionData('decreaseAllowance', call.data); + return [ + getAction('Decrease allowance'), + getLabel('of'), + getAddressVisualization(spender), + getLabel('with'), + getToken(call.to, subtractedValue) + ]; + }, + [iface.getFunction('transfer')?.selector]: (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + return [ + getAction('Send'), + getToken(call.to, args[1]), + getLabel('to'), + getAddressVisualization(args[0]) + ]; + }, + [iface.getFunction('transferFrom')?.selector]: (call) => { + const args = iface.parseTransaction(call)?.args.toArray() || []; + if (args[0] === accountOp.accountAddr) { + return [ + getAction('Transfer'), + getToken(call.to, args[2]), + getLabel('to'), + getAddressVisualization(args[1]) + ]; + } + if (args[1] === accountOp.accountAddr) { + return [ + getAction('Take'), + getToken(call.to, args[2]), + getLabel('from'), + getAddressVisualization(args[0]) + ]; + } + return [ + getAction('Move'), + getToken(call.to, args[2]), + getLabel('from'), + getAddressVisualization(args[0]), + getLabel('to'), + getAddressVisualization(args[1]) + ]; + } + }; + const newCalls = currentIrCalls.map((call) => { + const sigHash = call.data.substring(0, 10); + return matcher[sigHash] + ? { + ...call, + fullVisualization: matcher[sigHash](call) + } + : call; + }); + return newCalls; +}; +//# sourceMappingURL=tokens.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.js.map b/dist/src/libs/humanizer/modules/Tokens/tokens.js.map new file mode 100644 index 000000000..76bc5f292 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { ERC20, ERC721 } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\n// @TODO merge this with the erc20 humanizer module as sometimes\n// we see no difference between the two\nexport const genericErc721Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC721)\n const nftTransferVisualization = (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === accountOp.accountAddr\n ? [\n getAction('Send'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n : [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === ZeroAddress\n ? [getAction('Revoke approval'), getLabel('for'), getToken(call.to, args[1])]\n : [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('setApprovalForAll')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1]\n ? [\n getAction('Grant approval'),\n getLabel('for all nfts'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [getAction('Revoke approval'), getLabel('for all nfts'), getAddressVisualization(args[0])]\n },\n // not in tests\n [iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization,\n // [`${\n // iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256', 'bytes'])\n // ?.selector\n // }`]: nftTransferVisualization,\n [iface.getFunction('transferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization\n }\n\n const newCalls = currentIrCalls.map((call) => {\n // could do additional check if it is actually NFT contract\n return matcher[call.data.substring(0, 10)]\n ? {\n ...call,\n fullVisualization: matcher[call.data.substring(0, 10)](call)\n }\n : call\n })\n return newCalls\n}\n\nexport const genericErc20Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC20)\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1] !== BigInt(0)\n ? [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [\n getAction('Revoke approval'),\n getToken(call.to, args[1]),\n getLabel('for'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('increaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, addedValue } = iface.decodeFunctionData('increaseAllowance', call.data)\n\n return [\n getAction('Increase allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, addedValue)\n ]\n },\n\n [iface.getFunction('decreaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, subtractedValue } = iface.decodeFunctionData('decreaseAllowance', call.data)\n\n return [\n getAction('Decrease allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, subtractedValue)\n ]\n },\n [iface.getFunction('transfer')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return [\n getAction('Send'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('transferFrom')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n if (args[0] === accountOp.accountAddr) {\n return [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n if (args[1] === accountOp.accountAddr) {\n return [\n getAction('Take'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0])\n ]\n }\n return [\n getAction('Move'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n }\n const newCalls = currentIrCalls.map((call) => {\n const sigHash = call.data.substring(0, 10)\n return matcher[sigHash]\n ? {\n ...call,\n fullVisualization: matcher[sigHash](call)\n }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts b/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts new file mode 100644 index 000000000..59cdc7beb --- /dev/null +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts @@ -0,0 +1,4 @@ +import { HumanizerCallModule } from '../../interfaces'; +declare const traderJoeModule: HumanizerCallModule; +export default traderJoeModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts.map b/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts.map new file mode 100644 index 000000000..62da6242c --- /dev/null +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/TraderJoe/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAQ9D,QAAA,MAAM,eAAe,EAAE,mBAmGtB,CAAA;AAED,eAAe,eAAe,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.js b/dist/src/libs/humanizer/modules/TraderJoe/index.js new file mode 100644 index 000000000..af1eb65b2 --- /dev/null +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.js @@ -0,0 +1,95 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { JoeRouter } from '../../const/abis'; +import { getAction, getDeadline, getLabel, getRecipientText, getToken } from '../../utils'; +// @TODO limit order manager +// @TODO those use AVAX in the function method +// https://snowtrace.io/address/0x60aE616a2155Ee3d9A68541Ba4544862310933d4 +// https://arbiscan.io/address/0xbeE5c10Cf6E4F68f831E11C1D9E59B43560B3642 +// https://arbiscan.io/address/0x7BFd7192E76D950832c77BB412aaE841049D8D9B +const traderJoeModule = (accOp, calls) => { + const iface = new Interface(JoeRouter); + const matcher = { + [iface.getFunction('swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountOutMin, path, to, deadline } = iface.parseTransaction(call).args; + const tokenOut = path[2][path[2].length - 1]; + return [ + getAction('Swap'), + getToken(ZeroAddress, call.value), + getLabel('for at least'), + getToken(tokenOut, amountOutMin), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountOut, path, to, deadline } = iface.parseTransaction(call).args; + const tokenOut = path[2][path[2].length - 1]; + return [ + getAction('Swap up to'), + getToken(ZeroAddress, call.value), + getLabel('for'), + getToken(tokenOut, amountOut), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountIn, amountOutMinNATIVE, path, to, deadline } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(path[2][0], amountIn), + getLabel('for at least'), + getToken(ZeroAddress, amountOutMinNATIVE), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountNATIVEOut, amountInMax, path, to, deadline } = iface.parseTransaction(call).args; + return [ + getAction('Swap up to'), + getToken(path[2][0], amountInMax), + getLabel('for'), + getToken(ZeroAddress, amountNATIVEOut), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountIn, amountOutMin, path, to, deadline } = iface.parseTransaction(call).args; + return [ + getAction('Swap'), + getToken(path[2][0], amountIn), + getLabel('for at least'), + getToken(path[2][path[2].length - 1], amountOutMin), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { amountOut, amountInMax, path, to, deadline } = iface.parseTransaction(call).args; + return [ + getAction('Swap up to'), + getToken(path[2][0], amountInMax), + getLabel('for'), + getToken(path[2][path[2].length - 1], amountOut), + ...getRecipientText(accOp.accountAddr, to), + getDeadline(deadline) + ]; + } + }; + const newCalls = calls.map((call) => { + if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) + return call; + return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; + }); + return newCalls; +}; +export default traderJoeModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.js.map b/dist/src/libs/humanizer/modules/TraderJoe/index.js.map new file mode 100644 index 000000000..5f07cff4f --- /dev/null +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/TraderJoe/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { JoeRouter } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getRecipientText, getToken } from '../../utils'\n\n// @TODO limit order manager\n// @TODO those use AVAX in the function method\n// https://snowtrace.io/address/0x60aE616a2155Ee3d9A68541Ba4544862310933d4\n// https://arbiscan.io/address/0xbeE5c10Cf6E4F68f831E11C1D9E59B43560B3642\n// https://arbiscan.io/address/0x7BFd7192E76D950832c77BB412aaE841049D8D9B\nconst traderJoeModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(JoeRouter)\n const matcher = {\n [iface.getFunction(\n 'swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, call.value),\n getLabel('for at least'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, call.value),\n getLabel('for'),\n getToken(tokenOut, amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMinNATIVE, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMinNATIVE),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountNATIVEOut, amountInMax, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountNATIVEOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(path[2][path[2].length - 1], amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, amountInMax, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(path[2][path[2].length - 1], amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default traderJoeModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts b/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts new file mode 100644 index 000000000..1f175bfd6 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts @@ -0,0 +1,170 @@ +export declare const COMMANDS: { + FLAG_ALLOW_REVERT: string; + COMMAND_TYPE_MASK: string; + V3_SWAP_EXACT_IN: string; + V3_SWAP_EXACT_OUT: string; + PERMIT2_TRANSFER_FROM: string; + SWEEP: string; + TRANSFER: string; + PAY_PORTION: string; + V2_SWAP_EXACT_IN: string; + V2_SWAP_EXACT_OUT: string; + PERMIT2_PERMIT: string; + WRAP_ETH: string; + UNWRAP_WETH: string; + SEAPORT: string; + NFTX: string; + CRYPTOPUNKS: string; + OWNER_CHECK_721: string; + OWNER_CHECK_1155: string; + SWEEP_ERC721: string; + SUDOSWAP: string; + NFT20: string; +}; +/** + * ABI-like structure for each uniswap action + * https://docs.uniswap.org/contracts/universal-router/technical-reference + */ +export declare const COMMANDS_DESCRIPTIONS: { + V3_SWAP_EXACT_IN: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + V3_SWAP_EXACT_OUT: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + PERMIT2_TRANSFER_FROM: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + SWEEP: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + TRANSFER: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + PAY_PORTION: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + V2_SWAP_EXACT_IN: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + V2_SWAP_EXACT_OUT: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + PERMIT2_PERMIT: { + command: string; + inputsDetails: { + name: string; + type: string; + }[]; + }; + WRAP_ETH: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + UNWRAP_WETH: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + SEAPORT: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + NFTX: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + CRYPTOPUNKS: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + OWNER_CHECK_721: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + OWNER_CHECK_1155: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + SWEEP_ERC721: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + SUDOSWAP: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + NFT20: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; + SWEEP_ERC1155: { + command: string; + inputsDetails: { + type: string; + name: string; + }[]; + }; +}; +//# sourceMappingURL=Commands.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts.map new file mode 100644 index 000000000..139424d4a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Commands.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/Commands.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;CA8BpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgKjC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.js b/dist/src/libs/humanizer/modules/Uniswap/Commands.js new file mode 100644 index 000000000..0b947160b --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.js @@ -0,0 +1,197 @@ +export const COMMANDS = { + FLAG_ALLOW_REVERT: '0x80', + COMMAND_TYPE_MASK: '0x3f', + V3_SWAP_EXACT_IN: '0x00', + V3_SWAP_EXACT_OUT: '0x01', + PERMIT2_TRANSFER_FROM: '0x02', + // PERMIT2_PERMIT_BATCH: '0x03', + SWEEP: '0x04', + TRANSFER: '0x05', + PAY_PORTION: '0x06', + V2_SWAP_EXACT_IN: '0x08', + V2_SWAP_EXACT_OUT: '0x09', + PERMIT2_PERMIT: '0x0a', + WRAP_ETH: '0x0b', + UNWRAP_WETH: '0x0c', + // PERMIT2_TRANSFER_FROM_BATCH: '0x0d', + SEAPORT: '0x10', + // LOOKS_RARE_721: '0x11', + NFTX: '0x12', + CRYPTOPUNKS: '0x13', + // LOOKS_RARE_1155: '0x14', + OWNER_CHECK_721: '0x15', + OWNER_CHECK_1155: '0x16', + SWEEP_ERC721: '0x17', + // X2Y2_721: '0x18', + SUDOSWAP: '0x19', + NFT20: '0x1a' + // X2Y2_1155: '0x1b', + // FOUNDATION: '0x1c', + // SWEEP_ERC1155: '0x1d' +}; +/** + * ABI-like structure for each uniswap action + * https://docs.uniswap.org/contracts/universal-router/technical-reference + */ +export const COMMANDS_DESCRIPTIONS = { + V3_SWAP_EXACT_IN: { + command: '0x00', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountIn' }, + { type: 'uint256', name: 'amountOutMin' }, + { type: 'bytes', name: 'path' }, + { type: 'bool', name: 'payerIsUser' } + ] + }, + V3_SWAP_EXACT_OUT: { + command: '0x01', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountOut' }, + { type: 'uint256', name: 'amountInMax' }, + { type: 'bytes', name: 'path' }, + { type: 'bool', name: 'payerIsUser' } + ] + }, + PERMIT2_TRANSFER_FROM: { + command: '0x02', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint160', name: 'amount' } + ] + }, + // PERMIT2_PERMIT_BATCH + SWEEP: { + command: '0x04', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint160', name: 'amountMin' } + ] + }, + TRANSFER: { + command: '0x05', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'value' } + ] + }, + PAY_PORTION: { + command: '0x06', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'bips' } + ] + }, + V2_SWAP_EXACT_IN: { + command: '0x08', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountIn' }, + { type: 'uint256', name: 'amountOutMin' }, + { type: 'address[]', name: 'path' }, + { type: 'bool', name: 'payerIsUser' } + ] + }, + V2_SWAP_EXACT_OUT: { + command: '0x09', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountOut' }, + { type: 'uint256', name: 'amountInMax' }, + { type: 'address[]', name: 'path' }, + { type: 'bool', name: 'payerIsUser' } + ] + }, + PERMIT2_PERMIT: { + command: '0x0a', + inputsDetails: [ + { + name: 'permit', + type: 'tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline)' + }, + { name: 'signature', type: 'bytes' } + ] + }, + WRAP_ETH: { + command: '0x0b', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountMin' } + ] + }, + UNWRAP_WETH: { + command: '0x0c', + inputsDetails: [ + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'amountMin' } + ] + }, + SEAPORT: { + command: '0x10', + inputsDetails: [{ type: 'uint256', name: 'value' }] + }, + NFTX: { + command: '0x12', + inputsDetails: [{ type: 'uint256', name: 'value' }] + }, + CRYPTOPUNKS: { + command: '0x13', + inputsDetails: [ + { type: 'uint256', name: 'punkId' }, + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'value' } + ] + }, + // LOOKS_RARE_1155: '0x14', + OWNER_CHECK_721: { + command: '0x15', + inputsDetails: [ + { type: 'address', name: 'owner' }, + { type: 'address', name: 'token' }, + { type: 'uint256', name: 'id' } + ] + }, + OWNER_CHECK_1155: { + command: '0x16', + inputsDetails: [ + { type: 'address', name: 'owner' }, + { type: 'address', name: 'token' }, + { type: 'uint256', name: 'id' }, + { type: 'uint256', name: 'minBalance' } + ] + }, + SWEEP_ERC721: { + command: '0x17', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'id' } + ] + }, + // X2Y2_721: '0x18', + SUDOSWAP: { + command: '0x19', + inputsDetails: [{ type: 'uint256', name: 'value' }] + }, + NFT20: { + command: '0x1a', + inputsDetails: [{ type: 'uint256', name: 'value' }] + }, + // X2Y2_1155: '0x1b', + // FOUNDATION: '0x1c', + SWEEP_ERC1155: { + command: '0x1d', + inputsDetails: [ + { type: 'address', name: 'token' }, + { type: 'address', name: 'recipient' }, + { type: 'uint256', name: 'id' }, + { type: 'uint256', name: 'amount' } + ] + } +}; +//# sourceMappingURL=Commands.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map b/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map new file mode 100644 index 000000000..e9493084e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Commands.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/Commands.ts"],"names":[],"mappings":"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","sourcesContent":["export const COMMANDS = {\n FLAG_ALLOW_REVERT: '0x80',\n COMMAND_TYPE_MASK: '0x3f',\n V3_SWAP_EXACT_IN: '0x00',\n V3_SWAP_EXACT_OUT: '0x01',\n PERMIT2_TRANSFER_FROM: '0x02',\n // PERMIT2_PERMIT_BATCH: '0x03',\n SWEEP: '0x04',\n TRANSFER: '0x05',\n PAY_PORTION: '0x06',\n V2_SWAP_EXACT_IN: '0x08',\n V2_SWAP_EXACT_OUT: '0x09',\n PERMIT2_PERMIT: '0x0a',\n WRAP_ETH: '0x0b',\n UNWRAP_WETH: '0x0c',\n // PERMIT2_TRANSFER_FROM_BATCH: '0x0d',\n SEAPORT: '0x10',\n // LOOKS_RARE_721: '0x11',\n NFTX: '0x12',\n CRYPTOPUNKS: '0x13',\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: '0x15',\n OWNER_CHECK_1155: '0x16',\n SWEEP_ERC721: '0x17',\n // X2Y2_721: '0x18',\n SUDOSWAP: '0x19',\n NFT20: '0x1a'\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n // SWEEP_ERC1155: '0x1d'\n}\n\n/**\n * ABI-like structure for each uniswap action\n * https://docs.uniswap.org/contracts/universal-router/technical-reference\n */\nexport const COMMANDS_DESCRIPTIONS = {\n V3_SWAP_EXACT_IN: {\n command: '0x00',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V3_SWAP_EXACT_OUT: {\n command: '0x01',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_TRANSFER_FROM: {\n command: '0x02',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amount' }\n ]\n },\n // PERMIT2_PERMIT_BATCH\n SWEEP: {\n command: '0x04',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amountMin' }\n ]\n },\n TRANSFER: {\n command: '0x05',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n PAY_PORTION: {\n command: '0x06',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'bips' }\n ]\n },\n V2_SWAP_EXACT_IN: {\n command: '0x08',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V2_SWAP_EXACT_OUT: {\n command: '0x09',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_PERMIT: {\n command: '0x0a',\n inputsDetails: [\n {\n name: 'permit',\n type: 'tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline)'\n },\n { name: 'signature', type: 'bytes' }\n ]\n },\n WRAP_ETH: {\n command: '0x0b',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n UNWRAP_WETH: {\n command: '0x0c',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n SEAPORT: {\n command: '0x10',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFTX: {\n command: '0x12',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n CRYPTOPUNKS: {\n command: '0x13',\n inputsDetails: [\n { type: 'uint256', name: 'punkId' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: {\n command: '0x15',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' }\n ]\n },\n OWNER_CHECK_1155: {\n command: '0x16',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'minBalance' }\n ]\n },\n SWEEP_ERC721: {\n command: '0x17',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' }\n ]\n },\n // X2Y2_721: '0x18',\n SUDOSWAP: {\n command: '0x19',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFT20: {\n command: '0x1a',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n SWEEP_ERC1155: {\n command: '0x1d',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'amount' }\n ]\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.d.ts b/dist/src/libs/humanizer/modules/Uniswap/index.d.ts new file mode 100644 index 000000000..c248b3dfa --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const uniswapHumanizer: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/index.d.ts.map new file mode 100644 index 000000000..e0682d4ea --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAM9D,eAAO,MAAM,gBAAgB,EAAE,mBAqD9B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.js b/dist/src/libs/humanizer/modules/Uniswap/index.js new file mode 100644 index 000000000..04849a64e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/index.js @@ -0,0 +1,52 @@ +import { uniUniversalRouter } from './uniUniversalRouter'; +import { uniV2Mapping } from './uniV2'; +import { uniV32Mapping, uniV3Mapping } from './uniV3'; +export const uniswapHumanizer = (accountOp, currentIrCalls) => { + const uniV2MappingObj = uniV2Mapping(); + const uniV3MappingObj = uniV3Mapping(); + const uniV32MappingObj = uniV32Mapping(); + const uniUniversalRouterObj = uniUniversalRouter(); + const matcher = { + '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D': uniV2MappingObj, + '0xe592427a0aece92de3edee1f18e0157c05861564': uniV3MappingObj, + // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address + '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45': uniV32MappingObj, + // same as above line but on on base (https://docs.uniswap.org/contracts/v3/reference/deployments) + '0x2626664c2603336e57b271c5c0b26f421741e481': uniV32MappingObj, + // empirical address from wallet txns + '0x4c60051384bd2d3c01bfc845cf5f4b44bcbe9de5': uniUniversalRouterObj, + // same as above but with address from official documentation (https://docs.uniswap.org/contracts/v3/reference/deployments) + '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad': uniUniversalRouterObj, + // optimism + '0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4': uniUniversalRouterObj, + '0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8': uniUniversalRouterObj, + // polygon + '0x643770e279d5d0733f21d6dc03a8efbabf3255b4': uniUniversalRouterObj, + '0xec7be89e9d109e7e3fec59c222cf297125fefda2': uniUniversalRouterObj, + // avalanche + '0x82635af6146972cd6601161c4472ffe97237d292': uniUniversalRouterObj, + // arbitrum + '0x5e325eda8064b456f4781070c0738d849c824258': uniUniversalRouterObj + }; + const fallbackFlatUniswapsMather = Object.values(matcher).reduce((a, b) => ({ ...a, ...b }), {}); + const newCalls = []; + currentIrCalls.forEach((call) => { + const sigHash = call.data.substring(0, 10); + const knownUniswapVersion = matcher[call.to.toLowerCase()]; + if (knownUniswapVersion && knownUniswapVersion?.[sigHash]) { + const fullVisualization = knownUniswapVersion[sigHash](accountOp, call); + // @TODO add visualization squashing + newCalls.push({ ...call, fullVisualization }); + // if unknown address, but known sighash + } + else if (fallbackFlatUniswapsMather[sigHash]) { + const fullVisualization = fallbackFlatUniswapsMather[sigHash](accountOp, call); + newCalls.push({ ...call, fullVisualization }); + } + else { + newCalls.push(call); + } + }); + return newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.js.map b/dist/src/libs/humanizer/modules/Uniswap/index.js.map new file mode 100644 index 000000000..05f608208 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CACnD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,eAAe,GAAG,YAAY,EAAE,CAAA;IACtC,MAAM,eAAe,GAAG,YAAY,EAAE,CAAA;IACtC,MAAM,gBAAgB,GAAG,aAAa,EAAE,CAAA;IACxC,MAAM,qBAAqB,GAAG,kBAAkB,EAAE,CAAA;IAElD,MAAM,OAAO,GAET;QACF,4CAA4C,EAAE,eAAe;QAC7D,4CAA4C,EAAE,eAAe;QAC7D,uDAAuD;QACvD,4CAA4C,EAAE,gBAAgB;QAC9D,kGAAkG;QAClG,4CAA4C,EAAE,gBAAgB;QAC9D,qCAAqC;QACrC,4CAA4C,EAAE,qBAAqB;QACnE,2HAA2H;QAC3H,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,UAAU;QACV,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,YAAY;QACZ,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;KACpE,CAAA;IACD,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAChG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,cAAc,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1C,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,IAAI,mBAAmB,IAAI,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE;YACzD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACvE,oCAAoC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;YAE7C,wCAAwC;SACzC;aAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;SAC9C;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACpB;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { uniUniversalRouter } from './uniUniversalRouter'\nimport { uniV2Mapping } from './uniV2'\nimport { uniV32Mapping, uniV3Mapping } from './uniV3'\n\nexport const uniswapHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const uniV2MappingObj = uniV2Mapping()\n const uniV3MappingObj = uniV3Mapping()\n const uniV32MappingObj = uniV32Mapping()\n const uniUniversalRouterObj = uniUniversalRouter()\n\n const matcher: {\n [address: string]: HumanizerUniMatcher\n } = {\n '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D': uniV2MappingObj,\n '0xe592427a0aece92de3edee1f18e0157c05861564': uniV3MappingObj,\n // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address\n '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45': uniV32MappingObj,\n // same as above line but on on base (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x2626664c2603336e57b271c5c0b26f421741e481': uniV32MappingObj,\n // empirical address from wallet txns\n '0x4c60051384bd2d3c01bfc845cf5f4b44bcbe9de5': uniUniversalRouterObj,\n // same as above but with address from official documentation (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad': uniUniversalRouterObj,\n // optimism\n '0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4': uniUniversalRouterObj,\n '0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8': uniUniversalRouterObj,\n // polygon\n '0x643770e279d5d0733f21d6dc03a8efbabf3255b4': uniUniversalRouterObj,\n '0xec7be89e9d109e7e3fec59c222cf297125fefda2': uniUniversalRouterObj,\n // avalanche\n '0x82635af6146972cd6601161c4472ffe97237d292': uniUniversalRouterObj,\n // arbitrum\n '0x5e325eda8064b456f4781070c0738d849c824258': uniUniversalRouterObj\n }\n const fallbackFlatUniswapsMather = Object.values(matcher).reduce((a, b) => ({ ...a, ...b }), {})\n const newCalls: IrCall[] = []\n currentIrCalls.forEach((call: IrCall) => {\n const sigHash = call.data.substring(0, 10)\n\n const knownUniswapVersion = matcher[call.to.toLowerCase()]\n if (knownUniswapVersion && knownUniswapVersion?.[sigHash]) {\n const fullVisualization = knownUniswapVersion[sigHash](accountOp, call)\n // @TODO add visualization squashing\n newCalls.push({ ...call, fullVisualization })\n\n // if unknown address, but known sighash\n } else if (fallbackFlatUniswapsMather[sigHash]) {\n const fullVisualization = fallbackFlatUniswapsMather[sigHash](accountOp, call)\n newCalls.push({ ...call, fullVisualization })\n } else {\n newCalls.push(call)\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts b/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts new file mode 100644 index 000000000..1e3b39c27 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts @@ -0,0 +1,6 @@ +import { AccountOp } from '../../../accountOp/accountOp'; +import { HumanizerVisualization, IrCall } from '../../interfaces'; +export type HumanizerUniMatcher = { + [key: string]: (a: AccountOp, c: IrCall) => HumanizerVisualization[]; +}; +//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts.map new file mode 100644 index 000000000..d571f535d --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/interfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,KAAK,sBAAsB,EAAE,CAAA;CACrE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/interfaces.js b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js new file mode 100644 index 000000000..c30bb68c1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/interfaces.js.map b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js.map new file mode 100644 index 000000000..b7819a484 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\n\nexport type HumanizerUniMatcher = {\n [key: string]: (a: AccountOp, c: IrCall) => HumanizerVisualization[]\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts new file mode 100644 index 000000000..95e51c8d9 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts @@ -0,0 +1,3 @@ +import { HumanizerUniMatcher } from './interfaces'; +export declare const uniUniversalRouter: () => HumanizerUniMatcher; +//# sourceMappingURL=uniUniversalRouter.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts.map new file mode 100644 index 000000000..b65d98c55 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"uniUniversalRouter.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniUniversalRouter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AA+BlD,eAAO,MAAM,kBAAkB,QAAO,mBAmJrC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js new file mode 100644 index 000000000..403d4fb3a --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js @@ -0,0 +1,173 @@ +import { AbiCoder, Interface, ZeroAddress } from 'ethers'; +import { UniswapUniversalRouter } from '../../const/abis'; +import { getAction, getAddressVisualization, getDeadline, getLabel, getToken, getUnknownVisualization, getWrapping } from '../../utils'; +import { COMMANDS, COMMANDS_DESCRIPTIONS } from './Commands'; +import { getUniRecipientText, parsePath, uniReduce } from './utils'; +const coder = new AbiCoder(); +const extractParams = (inputsDetails, input) => { + const types = inputsDetails.map((i) => i.type); + const decodedInput = coder.decode(types, input); + const params = {}; + inputsDetails.forEach((item, index) => { + params[item.name] = decodedInput[index]; + }); + return params; +}; +// this function splits uniswap commands from single hex string to multiple hex strings +// '0x1234' => ['0x12', '0x34'] +function parseCommands(commands) { + // all commands are 1 byte = 2 hex chars + if (commands.length % 2) + return null; + if (!/^0x[0-9A-Fa-f]+$/.test(commands)) + return null; + const res = []; + // iterate over pairs of chars + for (let i = 2; i < commands.length; i += 2) { + res.push(`0x${commands.slice(i, i + 2)}`); + } + return res; +} +export const uniUniversalRouter = () => { + const ifaceUniversalRouter = new Interface(UniswapUniversalRouter); + return { + [`${ifaceUniversalRouter.getFunction('execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)')?.selector}`]: (accountOp, call) => { + const [commands, inputs, deadline] = ifaceUniversalRouter.parseTransaction(call)?.args || []; + const parsedCommands = parseCommands(commands); + const parsed = []; + parsedCommands + ? parsedCommands.forEach((command, index) => { + if (command === COMMANDS.V3_SWAP_EXACT_IN) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN; + const params = extractParams(inputsDetails, inputs[index]); + const path = parsePath(params.path); + parsed.push([ + getAction('Swap'), + getToken(path[0], params.amountIn), + getLabel('for at least'), + getToken(path[path.length - 1], params.amountOutMin), + getDeadline(deadline) + ]); + } + else if (command === COMMANDS.V3_SWAP_EXACT_OUT) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT; + const params = extractParams(inputsDetails, inputs[index]); + const path = parsePath(params.path); + parsed.push([ + getAction('Swap up to'), + getToken(path[path.length - 1], params.amountInMax), + getLabel('for'), + getToken(path[0], params.amountOut), + getDeadline(deadline) + ]); + } + else if (command === COMMANDS.SWEEP) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.SWEEP; + const params = extractParams(inputsDetails, inputs[index]); + if (['0x0000000000000000000000000000000000000001', accountOp.accountAddr].includes(params.recipient)) + parsed.push([ + getAction('Take'), + getLabel('at least'), + getToken(params.token, params.amountMin) + ]); + else + parsed.push([ + getAction('Send'), + getToken(params.token, params.amountMin), + getLabel('to'), + getAddressVisualization(params.recipient) + ]); + } + else if (command === COMMANDS.PAY_PORTION) { + // @NOTE: this is used for paying fee although its already calculated in the humanized response + // @NOTE: no need to be displayed but we can add warning id the fee is too high? + // const { inputsDetails } = COMMANDS_DESCRIPTIONS.PAY_PORTION + // const params = extractParams(inputsDetails, inputs[index]) + // parsed.push({ + // ...call, + // fullVisualization: [ + // getAction('Pay fee'), + // getLabel('of'), + // // bips are fee. can be 0 or within 10-9999 and converts to % + // // https://docs.uniswap.org/contracts/v2/guides/interface-integration/custom-interface-linking#constraints + // getLabel(`${Number(params.bips) / 100}%`) + // ] + // }) + } + else if (command === COMMANDS.TRANSFER) { + // when we swap with exact out the ui displays amount X for out token + // the actual swap is X + small fee + // and this is the small fee that is to be sent to the fee collector of uniswap + // at later stage of the humanizer pipeline if swap with the same token is present exactly before this transfer + // we will subtract the amount from the swap and remove this call from the visualization + const { inputsDetails } = COMMANDS_DESCRIPTIONS.TRANSFER; + const params = extractParams(inputsDetails, inputs[index]); + parsed.push([ + getAction('Send'), + getToken(params.token, params.value), + getLabel('to'), + getAddressVisualization(params.recipient) + ]); + } + else if (command === COMMANDS.V2_SWAP_EXACT_IN) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN; + const params = extractParams(inputsDetails, inputs[index]); + const path = params.path; + parsed.push([ + getAction('Swap'), + getToken(path[0], params.amountIn), + getLabel('for at least'), + getToken(path[path.length - 1], params.amountOutMin), + getDeadline(deadline) + ]); + } + else if (command === COMMANDS.V2_SWAP_EXACT_OUT) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT; + const params = extractParams(inputsDetails, inputs[index]); + const path = params.path; + parsed.push([ + getAction('Swap up to'), + getToken(path[0], params.amountInMax), + getLabel('for'), + getToken(path[path.length - 1], params.amountOut), + getDeadline(deadline) + ]); + } + else if (command === COMMANDS.PERMIT2_PERMIT) { + const { permit: { details: { token, amount /* expiration, nonce */ }, spender + // sigDeadline + } + // signature + } = extractParams(COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index]); + parsed.push([ + getAction('Grant approval'), + getLabel('for'), + getToken(token, amount), + getLabel('to'), + getAddressVisualization(spender) + ]); + } + else if (command === COMMANDS.WRAP_ETH) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.WRAP_ETH; + const params = extractParams(inputsDetails, inputs[index]); + params.amountMin && parsed.push(getWrapping(ZeroAddress, params.amountMin)); + } + else if (command === COMMANDS.UNWRAP_WETH) { + const { inputsDetails } = COMMANDS_DESCRIPTIONS.UNWRAP_WETH; + const params = extractParams(inputsDetails, inputs[index]); + params.amountMin && + parsed.push([ + getAction('Unwrap'), + getToken(ZeroAddress, params.amountMin), + ...getUniRecipientText(accountOp.accountAddr, params.recipient) + ]); + } + else + parsed.push(getUnknownVisualization('Uni V3', call)); + }) + : parsed.push(getUnknownVisualization('Uniswap V3', call)); + return uniReduce(parsed); + } + }; +}; +//# sourceMappingURL=uniUniversalRouter.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map new file mode 100644 index 000000000..a61eff87e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uniUniversalRouter.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniUniversalRouter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniswapUniversalRouter } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getToken,\n getUnknownVisualization,\n getWrapping\n} from '../../utils'\nimport { COMMANDS, COMMANDS_DESCRIPTIONS } from './Commands'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst coder = new AbiCoder()\n\nconst extractParams = (inputsDetails: any, input: any) => {\n const types = inputsDetails.map((i: any) => i.type)\n const decodedInput = coder.decode(types, input)\n\n const params: any = {}\n inputsDetails.forEach((item: any, index: number) => {\n params[item.name] = decodedInput[index]\n })\n\n return params\n}\n\n// this function splits uniswap commands from single hex string to multiple hex strings\n// '0x1234' => ['0x12', '0x34']\nfunction parseCommands(commands: string): string[] | null {\n // all commands are 1 byte = 2 hex chars\n if (commands.length % 2) return null\n if (!/^0x[0-9A-Fa-f]+$/.test(commands)) return null\n const res: string[] = []\n // iterate over pairs of chars\n for (let i = 2; i < commands.length; i += 2) {\n res.push(`0x${commands.slice(i, i + 2)}`)\n }\n return res\n}\n\nexport const uniUniversalRouter = (): HumanizerUniMatcher => {\n const ifaceUniversalRouter = new Interface(UniswapUniversalRouter)\n return {\n [`${\n ifaceUniversalRouter.getFunction(\n 'execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall) => {\n const [commands, inputs, deadline] = ifaceUniversalRouter.parseTransaction(call)?.args || []\n const parsedCommands = parseCommands(commands)\n const parsed: HumanizerVisualization[][] = []\n\n parsedCommands\n ? parsedCommands.forEach((command: string, index: number) => {\n if (command === COMMANDS.V3_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V3_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMax),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.SWEEP) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.SWEEP\n const params = extractParams(inputsDetails, inputs[index])\n if (\n ['0x0000000000000000000000000000000000000001', accountOp.accountAddr].includes(\n params.recipient\n )\n )\n parsed.push([\n getAction('Take'),\n getLabel('at least'),\n getToken(params.token, params.amountMin)\n ])\n else\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.amountMin),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.PAY_PORTION) {\n // @NOTE: this is used for paying fee although its already calculated in the humanized response\n // @NOTE: no need to be displayed but we can add warning id the fee is too high?\n // const { inputsDetails } = COMMANDS_DESCRIPTIONS.PAY_PORTION\n // const params = extractParams(inputsDetails, inputs[index])\n // parsed.push({\n // ...call,\n // fullVisualization: [\n // getAction('Pay fee'),\n // getLabel('of'),\n // // bips are fee. can be 0 or within 10-9999 and converts to %\n // // https://docs.uniswap.org/contracts/v2/guides/interface-integration/custom-interface-linking#constraints\n // getLabel(`${Number(params.bips) / 100}%`)\n // ]\n // })\n } else if (command === COMMANDS.TRANSFER) {\n // when we swap with exact out the ui displays amount X for out token\n // the actual swap is X + small fee\n // and this is the small fee that is to be sent to the fee collector of uniswap\n // at later stage of the humanizer pipeline if swap with the same token is present exactly before this transfer\n // we will subtract the amount from the swap and remove this call from the visualization\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.TRANSFER\n const params = extractParams(inputsDetails, inputs[index])\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.value),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[0], params.amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.PERMIT2_PERMIT) {\n const {\n permit: {\n details: { token, amount /* expiration, nonce */ },\n spender\n // sigDeadline\n }\n // signature\n } = extractParams(COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index])\n parsed.push([\n getAction('Grant approval'),\n getLabel('for'),\n getToken(token, amount),\n getLabel('to'),\n getAddressVisualization(spender)\n ])\n } else if (command === COMMANDS.WRAP_ETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.WRAP_ETH\n const params = extractParams(inputsDetails, inputs[index])\n params.amountMin && parsed.push(getWrapping(ZeroAddress, params.amountMin))\n } else if (command === COMMANDS.UNWRAP_WETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.UNWRAP_WETH\n const params = extractParams(inputsDetails, inputs[index])\n\n params.amountMin &&\n parsed.push([\n getAction('Unwrap'),\n getToken(ZeroAddress, params.amountMin),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ])\n } else parsed.push(getUnknownVisualization('Uni V3', call))\n })\n : parsed.push(getUnknownVisualization('Uniswap V3', call))\n\n return uniReduce(parsed)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts b/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts new file mode 100644 index 000000000..a3929f97e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts @@ -0,0 +1,4 @@ +import { HumanizerUniMatcher } from './interfaces'; +declare const uniV2Mapping: () => HumanizerUniMatcher; +export { uniV2Mapping }; +//# sourceMappingURL=uniV2.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts.map new file mode 100644 index 000000000..f893b6e53 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV2.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV2.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,QAAA,MAAM,YAAY,QAAO,mBA6JxB,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js new file mode 100644 index 000000000..34f19e632 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js @@ -0,0 +1,134 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { UniV2Router } from '../../const/abis'; +import { getAction, getDeadline, getLabel, getToken } from '../../utils'; +import { getUniRecipientText } from './utils'; +const uniV2Mapping = () => { + const iface = new Interface(UniV2Router); + return { + // ordered in the same order as the router + [iface.getFunction('swapExactTokensForTokens')?.selector]: (accountOp, call) => { + const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []; + const outputAsset = path[path.length - 1]; + return [ + getAction('Swap'), + getToken(path[0], amountIn), + getLabel('for at least'), + getToken(outputAsset, amountOutMin), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapTokensForExactTokens')?.selector]: (accountOp, call) => { + const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []; + const outputAsset = path[path.length - 1]; + return [ + getAction('Swap up to'), + getToken(path[0], amountInMax), + getLabel('for'), + getToken(outputAsset, amountOut), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapExactETHForTokens')?.selector]: (accountOp, call) => { + const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }; + const [amountOutMin, path, to, deadline] = args || []; + const outputAsset = path[path.length - 1]; + return [ + getAction('Swap'), + getToken(ZeroAddress, value), + getLabel('for for at least'), + getToken(outputAsset, amountOutMin), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapTokensForExactETH')?.selector]: (accountOp, call) => { + const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Swap up to'), + getToken(path[0], amountInMax), + getLabel('for'), + getToken(ZeroAddress, amountOut), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapExactTokensForETH')?.selector]: (accountOp, call) => { + const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Swap'), + getToken(path[0], amountIn), + getLabel('for at least'), + getToken(ZeroAddress, amountOutMin), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('swapETHForExactTokens')?.selector]: (accountOp, call) => { + const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }; + const [amountOut, path, to, deadline] = args || []; + const outputAsset = path[path.length - 1]; + return [ + getAction('Swap up to'), + getToken(ZeroAddress, value), + getLabel('for'), + getToken(outputAsset, amountOut), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + // Liquidity + [iface.getFunction('addLiquidity')?.selector]: (accountOp, call) => { + const [tokenA, tokenB, amountADesired, amountBDesired /* amountAMin */ /* amountBMin */, , , to, deadline] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Add liquidity'), + getToken(tokenA, amountADesired), + getLabel('and'), + getToken(tokenB, amountBDesired), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('addLiquidityETH')?.selector]: (accountOp, call) => { + const { args, value } = iface.parseTransaction(call) || { args: [], value: BigInt(0) }; + const [token, amountTokenDesired /* amountTokenMin */ /* amountETHMin */, , , to, deadline] = args; + return [ + getAction('Add liquidity'), + getToken(token, amountTokenDesired), + getLabel('and'), + getToken(ZeroAddress, value), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('removeLiquidity')?.selector]: (accountOp, call) => { + const [tokenA, tokenB /* liquidity */, , amountAMin, amountBMin, to, deadline] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Remove liquidity'), + getLabel('at least'), + getToken(tokenA, amountAMin), + getLabel('and'), + getToken(tokenB, amountBMin), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + }, + [iface.getFunction('removeLiquidityETH')?.selector]: (accountOp, call) => { + const [token /* liquidity */, , amountTokenMin, amountETHMin, to, deadline] = iface.parseTransaction(call)?.args || []; + return [ + getAction('Remove liquidity'), + getLabel('at least'), + getToken(token, amountTokenMin), + getLabel('and'), + getToken(ZeroAddress, amountETHMin), + ...getUniRecipientText(accountOp.accountAddr, to), + getDeadline(deadline) + ]; + } + // NOTE: We currently do not support *WithPermit functions cause they require an ecrecover signature + // Uniswap will detect we don't support it cause it will fail on requesting eth_signTypedData_v4 + }; +}; +export { uniV2Mapping }; +//# sourceMappingURL=uniV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map new file mode 100644 index 000000000..599af7416 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV2Router } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getToken } from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText } from './utils'\n\nconst uniV2Mapping = (): HumanizerUniMatcher => {\n const iface = new Interface(UniV2Router)\n return {\n // ordered in the same order as the router\n [iface.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactETHForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOutMin, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, value),\n getLabel('for for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactTokensForETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapETHForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOut, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, value),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n // Liquidity\n [iface.getFunction('addLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired /* amountAMin */ /* amountBMin */,\n ,\n ,\n to,\n deadline\n ] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(tokenA, amountADesired),\n getLabel('and'),\n getToken(tokenB, amountBDesired),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('addLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const { args, value } = iface.parseTransaction(call) || { args: [], value: BigInt(0) }\n const [token, amountTokenDesired /* amountTokenMin */ /* amountETHMin */, , , to, deadline] =\n args\n return [\n getAction('Add liquidity'),\n getToken(token, amountTokenDesired),\n getLabel('and'),\n getToken(ZeroAddress, value),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [tokenA, tokenB /* liquidity */, , amountAMin, amountBMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(tokenA, amountAMin),\n getLabel('and'),\n getToken(tokenB, amountBMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [token /* liquidity */, , amountTokenMin, amountETHMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(token, amountTokenMin),\n getLabel('and'),\n getToken(ZeroAddress, amountETHMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n // NOTE: We currently do not support *WithPermit functions cause they require an ecrecover signature\n // Uniswap will detect we don't support it cause it will fail on requesting eth_signTypedData_v4\n }\n}\n\nexport { uniV2Mapping }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts b/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts new file mode 100644 index 000000000..b5c6bced1 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts @@ -0,0 +1,5 @@ +import { HumanizerUniMatcher } from './interfaces'; +declare const uniV32Mapping: () => HumanizerUniMatcher; +declare const uniV3Mapping: () => HumanizerUniMatcher; +export { uniV32Mapping, uniV3Mapping }; +//# sourceMappingURL=uniV3.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts.map new file mode 100644 index 000000000..413d42370 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV3.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV3.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,QAAA,MAAM,aAAa,QAAO,mBA+RzB,CAAA;AAED,QAAA,MAAM,YAAY,QAAO,mBAsHxB,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js new file mode 100644 index 000000000..28ca76899 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js @@ -0,0 +1,315 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { UniV3Router, UniV3Router2 } from '../../const/abis'; +import { getAction, getAddressVisualization, getDeadline, getLabel, getRecipientText, getToken, getUnknownVisualization } from '../../utils'; +import { getUniRecipientText, parsePath, uniReduce } from './utils'; +const uniV32Mapping = () => { + const ifaceV32 = new Interface(UniV3Router2); + return { + // 0x5ae401dc + [ifaceV32.getFunction('multicall(uint256 deadline,bytes[])')?.selector]: (accountOp, call) => { + const [deadline, calls] = ifaceV32.parseTransaction(call)?.args || []; + const mappingResult = uniV32Mapping(); + const parsed = calls.map((data) => { + const sigHash = data.slice(0, 10); + const humanizer = mappingResult[sigHash]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + }); + const res = uniReduce(parsed); + return res.length ? [...res, getDeadline(deadline)] : getUnknownVisualization('Uni V3', call); + }, + // 0xac9650d8 + [ifaceV32.getFunction('multicall(bytes[])')?.selector]: (accountOp, call) => { + const [calls] = ifaceV32.parseTransaction(call)?.args || []; + const mappingResult = uniV32Mapping(); + const parsed = calls.map((data) => { + const sigHash = data.slice(0, 10); + const humanizer = mappingResult[sigHash]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + }); + return uniReduce(parsed); + }, + // 0x1f0464d1 + [ifaceV32.getFunction('multicall(bytes32 prevBlockHash, bytes[])')?.selector]: (accountOp, call) => { + const [prevBlockHash, calls] = ifaceV32.parseTransaction(call)?.args || []; + const mappingResult = uniV32Mapping(); + const parsed = calls.map((data) => { + const sigHash = data.slice(0, 10); + const humanizer = mappingResult[sigHash]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + }); + return parsed.length + ? uniReduce(parsed) + : [...getUnknownVisualization('Uni V3', call), getLabel(`after block ${prevBlockHash}`)]; + }, + // NOTE: selfPermit is not supported cause it requires an ecrecover signature + // 0x04e45aaf + [ifaceV32.getFunction('exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + // @TODO: consider fees + return [ + getAction('Swap'), + getToken(params.tokenIn, params.amountIn), + getLabel('for at least'), + getToken(params.tokenOut, params.amountOutMinimum), + ...getUniRecipientText(accountOp.accountAddr, params.recipient) + ]; + }, + // 0x414bf389 + [ifaceV32.getFunction('exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Swap'), + getToken(params.tokenIn, params.amountIn), + getLabel('for at least'), + getToken(params.tokenOut, params.amountOutMinimum), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0xb858183f + [ifaceV32.getFunction('exactInput')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + const path = parsePath(params.path); + return [ + getAction('Swap'), + getToken(path[0], params.amountIn), + getLabel('for at least'), + getToken(path[path.length - 1], params.amountOutMinimum), + ...getUniRecipientText(accountOp.accountAddr, params.recipient) + ]; + }, + // 0x5023b4df + [ifaceV32.getFunction('exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Swap up to'), + getToken(params.tokenIn, params.amountInMaximum), + getLabel('for'), + getToken(params.tokenOut, params.amountOut), + ...getUniRecipientText(accountOp.accountAddr, params.recipient) + ]; + }, + // 0xdb3e2198 + [ifaceV32.getFunction('exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Swap up to'), + getToken(params.tokenIn, params.amountInMaximum), + getLabel('for'), + getToken(params.tokenOut, params.amountOut), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0x12210e8a + [ifaceV32.getFunction('refundETH()')?.selector]: (accountOp, call) => { + return [getAction('Withdraw'), getToken(ZeroAddress, call.value)]; + }, + // 0x09b81346 + [ifaceV32.getFunction('exactOutput')?.selector]: (accountOp, call) => { + const [params] = ifaceV32.parseTransaction(call)?.args || []; + const path = parsePath(params.path); + return [ + getAction('Swap up to'), + getToken(path[path.length - 1], params.amountInMaximum), + getLabel('for'), + getToken(path[0], params.amountOut), + ...getUniRecipientText(accountOp.accountAddr, params.recipient) + ]; + }, + // 0x42712a67 + [ifaceV32.getFunction('swapTokensForExactTokens')?.selector]: (accountOp, call) => { + const [amountOut, amountInMax, path, to] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Swap up to'), + getToken(path[0], amountInMax), + getLabel('for'), + getToken(path[path.length - 1], amountOut), + ...getUniRecipientText(accountOp.accountAddr, to) + ]; + }, + // 0x472b43f3 + [ifaceV32.getFunction('swapExactTokensForTokens')?.selector]: (accountOp, call) => { + const [amountIn, amountOutMin, path, to] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Swap'), + getToken(path[0], amountIn), + getLabel('for at least'), + getToken(path[path.length - 1], amountOutMin), + ...getUniRecipientText(accountOp.accountAddr, to) + ]; + }, + // 0x49616997 + [ifaceV32.getFunction('unwrapWETH9(uint256)')?.selector]: (_accountOp, call) => { + const [amountMin] = ifaceV32.parseTransaction(call)?.args || []; + return [getAction('Unwrap'), getToken(ZeroAddress, amountMin)]; + }, + // 0x49404b7c + [ifaceV32.getFunction('unwrapWETH9(uint256,address recipient)')?.selector]: (accountOp, call) => { + const [amountMin, recipient] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Unwrap'), + getToken(ZeroAddress, amountMin), + ...getUniRecipientText(accountOp.accountAddr, recipient) + ]; + }, + // 0xe90a182f + [ifaceV32.getFunction('sweepToken(address,uint256)')?.selector]: (_accountOp, call) => { + const [token, amountMinimum] = ifaceV32.parseTransaction(call)?.args || []; + return [getAction('Sweep'), getLabel('at least'), getToken(token, amountMinimum)]; + }, + // 0xdf2ab5bb + [ifaceV32.getFunction('sweepToken(address,uint256,address)')?.selector]: (accountOp, call) => { + const [token, amountMinimum, recipient] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Sweep'), + getLabel('at least'), + getToken(token, amountMinimum), + ...getUniRecipientText(accountOp.accountAddr, recipient) + ]; + }, + // 0x3068c554 + [ifaceV32.getFunction('sweepTokenWithFee(address,uint256,uint256,address)')?.selector]: (_accountOp, call) => { + const [token, amountMinimum, feeBips, feeRecipient] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Sweep'), + getLabel('at least'), + getToken(token, amountMinimum), + getLabel('with fee'), + getToken(token, feeBips), + getLabel('to'), + getAddressVisualization(feeRecipient) + ]; + }, + // 0xe0e189a0 + [`${ifaceV32.getFunction('sweepTokenWithFee(address,uint256,address,uint256,address)')?.selector}`]: (accountOp, call) => { + const [token, amountMinimum, recipient, feeBips, feeRecipient] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Sweep'), + getLabel('at least'), + getToken(token, amountMinimum), + getLabel('with fee'), + getToken(token, feeBips), + getLabel('to'), + getAddressVisualization(feeRecipient), + ...getUniRecipientText(accountOp.accountAddr, recipient) + ]; + }, + // 0x88316456 + [`${ifaceV32.getFunction('mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))')?.selector}`]: (accountOp, call) => { + const [[token0, token1, , , , , , + // fee, + // tickLower, + // tickUpper, + // amount0Desired, + // amount1Desired, + amount0Min, amount1Min, recipient, deadline]] = ifaceV32.parseTransaction(call)?.args || []; + return [ + getAction('Add liquidity'), + getToken(token0, amount0Min), + getToken(token1, amount1Min), + getLabel('pair'), + ...getRecipientText(accountOp.accountAddr, recipient), + getDeadline(deadline) + ]; + } + }; +}; +const uniV3Mapping = () => { + const ifaceV3 = new Interface(UniV3Router); + return { + // 0xac9650d8 + [ifaceV3.getFunction('multicall')?.selector]: (accountOp, call) => { + const args = ifaceV3.parseTransaction(call)?.args || []; + const calls = args[args.length - 1]; + const mappingResult = uniV3Mapping(); + const parsed = calls.map((data) => { + const sigHash = data.slice(0, 10); + const humanizer = mappingResult[sigHash]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + }); + return parsed.length ? uniReduce(parsed) : getUnknownVisualization('Uni V3', call); + }, + // ------------------------------------------------------------------------------------------------- + // NOTE: selfPermit is not supported cause it requires an ecrecover signature + // 0x414bf389 + [ifaceV3.getFunction('exactInputSingle')?.selector]: (accountOp, call) => { + const [params] = ifaceV3.parseTransaction(call)?.args || []; + // @TODO: consider fees + return [ + getAction('Swap'), + getToken(params.tokenIn, params.amountIn), + getLabel('for at least'), + getToken(params.tokenOut, params.amountOutMinimum), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0xc04b8d59 + [ifaceV3.getFunction('exactInput')?.selector]: (accountOp, call) => { + const [params] = ifaceV3.parseTransaction(call)?.args || []; + const path = parsePath(params.path); + return [ + getAction('Swap'), + getToken(path[0], params.amountIn), + getLabel('for at least'), + getToken(path[path.length - 1], params.amountOutMinimum), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0xdb3e2198 + [ifaceV3.getFunction('exactOutputSingle')?.selector]: (accountOp, call) => { + const [params] = ifaceV3.parseTransaction(call)?.args || []; + return [ + getAction('Swap up to'), + getToken(params.tokenIn, params.amountInMaximum), + getLabel('for'), + getToken(params.tokenOut, params.amountOut), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0xf28c0498 + [ifaceV3.getFunction('exactOutput')?.selector]: (accountOp, call) => { + const [params] = ifaceV3.parseTransaction(call)?.args || []; + const path = parsePath(params.path); + return [ + getAction('Swap up to'), + getToken(path[path.length - 1], params.amountInMaximum), + getLabel('for'), + getToken(path[0], params.amountOut), + ...getUniRecipientText(accountOp.accountAddr, params.recipient), + getDeadline(params.deadline) + ]; + }, + // 0x49404b7c + [ifaceV3.getFunction('unwrapWETH9')?.selector]: (accountOp, call) => { + const [amountMin, recipient] = ifaceV3.parseTransaction(call)?.args || []; + return [ + getAction('Unwrap'), + getToken(ZeroAddress, amountMin), + ...getUniRecipientText(accountOp.accountAddr, recipient) + ]; + }, + // 0x9b2c0a37 + [ifaceV3.getFunction('unwrapWETH9WithFee')?.selector]: (accountOp, call) => { + const [amountMin, recipient, feeBips, feeRecipient] = ifaceV3.parseTransaction(call)?.args || []; + return [ + getAction('Unwrap'), + getToken(ZeroAddress, amountMin), + getLabel('with fee'), + getToken(ZeroAddress, feeBips), + getLabel('to'), + getAddressVisualization(feeRecipient), + ...getUniRecipientText(accountOp.accountAddr, recipient) + ]; + }, + // 0x12210e8a + [ifaceV3.getFunction('refundETH()')?.selector]: () => { + return [getAction('Refund')]; + } + }; +}; +export { uniV32Mapping, uniV3Mapping }; +//# sourceMappingURL=uniV3.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map new file mode 100644 index 000000000..35c49ff34 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV3Router, UniV3Router2 } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst uniV32Mapping = (): HumanizerUniMatcher => {\n const ifaceV32 = new Interface(UniV3Router2)\n return {\n // 0x5ae401dc\n [ifaceV32.getFunction('multicall(uint256 deadline,bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [deadline, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n const res = uniReduce(parsed)\n return res.length ? [...res, getDeadline(deadline)] : getUnknownVisualization('Uni V3', call)\n },\n // 0xac9650d8\n [ifaceV32.getFunction('multicall(bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n return uniReduce(parsed)\n },\n // 0x1f0464d1\n [ifaceV32.getFunction('multicall(bytes32 prevBlockHash, bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [prevBlockHash, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n return parsed.length\n ? uniReduce(parsed)\n : [...getUnknownVisualization('Uni V3', call), getLabel(`after block ${prevBlockHash}`)]\n },\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x04e45aaf\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x414bf389\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xb858183f\n [ifaceV32.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x5023b4df\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0xdb3e2198\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n\n // 0x12210e8a\n [ifaceV32.getFunction('refundETH()')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n return [getAction('Withdraw'), getToken(ZeroAddress, call.value)]\n },\n // 0x09b81346\n [ifaceV32.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x42712a67\n [ifaceV32.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountOut, amountInMax, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x472b43f3\n [ifaceV32.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountIn, amountOutMin, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x49616997\n [ifaceV32.getFunction('unwrapWETH9(uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Unwrap'), getToken(ZeroAddress, amountMin)]\n },\n // 0x49404b7c\n [ifaceV32.getFunction('unwrapWETH9(uint256,address recipient)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0xe90a182f\n [ifaceV32.getFunction('sweepToken(address,uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Sweep'), getLabel('at least'), getToken(token, amountMinimum)]\n },\n // 0xdf2ab5bb\n [ifaceV32.getFunction('sweepToken(address,uint256,address)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x3068c554\n [ifaceV32.getFunction('sweepTokenWithFee(address,uint256,uint256,address)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient)\n ]\n },\n // 0xe0e189a0\n [`${\n ifaceV32.getFunction('sweepTokenWithFee(address,uint256,address,uint256,address)')?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x88316456\n [`${\n ifaceV32.getFunction(\n 'mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [\n [\n token0,\n token1,\n ,\n ,\n ,\n ,\n ,\n // fee,\n // tickLower,\n // tickUpper,\n // amount0Desired,\n // amount1Desired,\n amount0Min,\n amount1Min,\n recipient,\n deadline\n ]\n ] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(token0, amount0Min),\n getToken(token1, amount1Min),\n getLabel('pair'),\n ...getRecipientText(accountOp.accountAddr, recipient),\n getDeadline(deadline)\n ]\n }\n }\n}\n\nconst uniV3Mapping = (): HumanizerUniMatcher => {\n const ifaceV3 = new Interface(UniV3Router)\n return {\n // 0xac9650d8\n [ifaceV3.getFunction('multicall')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const args = ifaceV3.parseTransaction(call)?.args || []\n const calls = args[args.length - 1]\n const mappingResult = uniV3Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n\n return parsed.length ? uniReduce(parsed) : getUnknownVisualization('Uni V3', call)\n },\n // -------------------------------------------------------------------------------------------------\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x414bf389\n [ifaceV3.getFunction('exactInputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xc04b8d59\n [ifaceV3.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xdb3e2198\n [ifaceV3.getFunction('exactOutputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xf28c0498\n [ifaceV3.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0x49404b7c\n [ifaceV3.getFunction('unwrapWETH9')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x9b2c0a37\n [ifaceV3.getFunction('unwrapWETH9WithFee')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient, feeBips, feeRecipient] =\n ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n getLabel('with fee'),\n getToken(ZeroAddress, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x12210e8a\n [ifaceV3.getFunction('refundETH()')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Refund')]\n }\n }\n}\n\nexport { uniV32Mapping, uniV3Mapping }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts b/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts new file mode 100644 index 000000000..f446e4542 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts @@ -0,0 +1,6 @@ +import { HumanizerVisualization } from '../../interfaces'; +export declare function parsePath(pathBytes: any): string[]; +export declare const getUniRecipientText: (accAddr: string, recAddr: string) => HumanizerVisualization[]; +export declare const joinWithAndLabel: (humanizations: HumanizerVisualization[][]) => HumanizerVisualization[]; +export declare const uniReduce: (_calls: HumanizerVisualization[][]) => HumanizerVisualization[]; +//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts.map b/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts.map new file mode 100644 index 000000000..f58e4cb71 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,wBAAgB,SAAS,CAAC,SAAS,EAAE,GAAG,YASvC;AAED,eAAO,MAAM,mBAAmB,YAAa,MAAM,WAAW,MAAM,KAAG,sBAAsB,EAGrD,CAAA;AAExC,eAAO,MAAM,gBAAgB,kBACZ,sBAAsB,EAAE,EAAE,KACxC,sBAAsB,EAExB,CAAA;AA6BD,eAAO,MAAM,SAAS,WAAY,sBAAsB,EAAE,EAAE,KAAG,sBAAsB,EA0EpF,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.js b/dist/src/libs/humanizer/modules/Uniswap/utils.js new file mode 100644 index 000000000..8ca25ff0e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.js @@ -0,0 +1,100 @@ +/* eslint-disable no-continue */ +import { ZeroAddress } from 'ethers'; +import { getLabel, getRecipientText } from '../../utils'; +export function parsePath(pathBytes) { + // some decodePacked fun + // can we do this with Ethers AbiCoder? probably not + const path = []; + // address, uint24 + for (let i = 2; i < pathBytes.length; i += 46) { + path.push(`0x${pathBytes.substr(i, 40)}`); + } + return path; +} +export const getUniRecipientText = (accAddr, recAddr) => ['0x0000000000000000000000000000000000000001', ZeroAddress].includes(recAddr) + ? [] + : getRecipientText(accAddr, recAddr); +export const joinWithAndLabel = (humanizations) => { + return humanizations.reduce((acc, arr) => [...acc, ...arr, getLabel('and')], []).slice(0, -1); +}; +const isSwap = (call) => call && + call.length >= 4 && + call[0].content?.includes('Swap') && + call[1].type === 'token' && + call[3].type === 'token'; +const isTake = (call) => call && + call.length === 3 && + call[0].content?.includes('Take') && + call[1].content === 'at least' && + call[2].type === 'token'; +const isWrap = (call) => call && call.length >= 2 && call[0].content?.includes('Wrap') && call[1].type === 'token'; +const isUnwrap = (call) => call && call.length >= 2 && call[0].content?.includes('Unwrap') && call[1].type === 'token'; +const isSend = (call) => call && + call.length >= 4 && + call[0].content?.includes('Send') && + call[1].type === 'token' && + call[2]?.content?.includes('to') && + call[3].type === 'address'; +export const uniReduce = (_calls) => { + const calls = _calls; + const originalCallsLength = calls.length; + for (let i = 0; i < calls.length; i++) { + for (let j = 0; j < calls.length; j++) { + // looks for wraps before the swap + if (j < i && + calls[i] && + calls[j] && + isSwap(calls[i]) && + isWrap(calls[j]) && + calls[j][1].value === calls[i][1].value) { + calls[i][1].address = ZeroAddress; + calls.splice(j, 1); + } + // looks for unwrap after the swap + if (i < j && + calls[i] && + calls[j] && + isSwap(calls[i]) && + isUnwrap(calls[j]) && + calls[j][1].value === calls[i][3].value) { + calls[i][3].address = ZeroAddress; + calls.splice(j, 1); + } + // looks for swaps to merge + if (i !== j && + calls[i] && + calls[j] && + isSwap(calls[i]) && + isSwap(calls[j]) && + calls[i][1].address === calls[j][1].address && + calls[i][3].address === calls[j][3].address) { + calls[i][1].value = calls[i][1].value + calls[j][1].value; + calls[i][3].value = calls[i][3].value + calls[j][3].value; + calls.splice(j, 1); + } + // looks for fee payment to subtract + if (i !== j && + calls[i] && + calls[j] && + isSend(calls[j]) && + isSwap(calls[i]) && + calls[i][3].value / 400n >= calls[j][1].value) { + calls[i][3].value = calls[i][3].value - calls[j][1].value; + calls.splice(j, 1); + } + // looks for take (sweep) action to infer the swap minimum by + if (i !== j && + calls[i] && + calls[j] && + isSwap(calls[i]) && + isTake(calls[j]) && + calls[i][3].address === calls[j][2].address) { + calls[i][3].value = + calls[i][3].value > calls[j][2].value ? calls[i][3].value : calls[j][2].value; + calls.splice(j, 1); + } + } + } + return originalCallsLength === calls.length ? joinWithAndLabel(calls) : uniReduce(calls); +}; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.js.map b/dist/src/libs/humanizer/modules/Uniswap/utils.js.map new file mode 100644 index 000000000..0a7ea678f --- /dev/null +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-continue */\nimport { ZeroAddress } from 'ethers'\n\nimport { HumanizerVisualization } from '../../interfaces'\nimport { getLabel, getRecipientText } from '../../utils'\n\nexport function parsePath(pathBytes: any) {\n // some decodePacked fun\n // can we do this with Ethers AbiCoder? probably not\n const path = []\n // address, uint24\n for (let i = 2; i < pathBytes.length; i += 46) {\n path.push(`0x${pathBytes.substr(i, 40)}`)\n }\n return path\n}\n\nexport const getUniRecipientText = (accAddr: string, recAddr: string): HumanizerVisualization[] =>\n ['0x0000000000000000000000000000000000000001', ZeroAddress].includes(recAddr)\n ? []\n : getRecipientText(accAddr, recAddr)\n\nexport const joinWithAndLabel = (\n humanizations: HumanizerVisualization[][]\n): HumanizerVisualization[] => {\n return humanizations.reduce((acc, arr) => [...acc, ...arr, getLabel('and')], []).slice(0, -1)\n}\n\nconst isSwap = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Swap') &&\n call[1].type === 'token' &&\n call[3].type === 'token'\n\nconst isTake = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length === 3 &&\n call[0].content?.includes('Take') &&\n call[1].content === 'at least' &&\n call[2].type === 'token'\n\nconst isWrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Wrap') && call[1].type === 'token'\n\nconst isUnwrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Unwrap') && call[1].type === 'token'\n\nconst isSend = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Send') &&\n call[1].type === 'token' &&\n call[2]?.content?.includes('to') &&\n call[3].type === 'address'\nexport const uniReduce = (_calls: HumanizerVisualization[][]): HumanizerVisualization[] => {\n const calls = _calls\n const originalCallsLength = calls.length\n for (let i = 0; i < calls.length; i++) {\n for (let j = 0; j < calls.length; j++) {\n // looks for wraps before the swap\n if (\n j < i &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isWrap(calls[j]) &&\n calls[j]![1].value === calls[i]![1].value\n ) {\n calls[i]![1].address = ZeroAddress\n calls.splice(j, 1)\n }\n // looks for unwrap after the swap\n if (\n i < j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isUnwrap(calls[j]) &&\n calls[j]![1].value === calls[i]![3].value\n ) {\n calls[i]![3].address = ZeroAddress\n calls.splice(j, 1)\n }\n\n // looks for swaps to merge\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isSwap(calls[j]!) &&\n calls[i]![1].address === calls[j]![1].address &&\n calls[i]![3].address === calls[j]![3].address\n ) {\n calls[i]![1].value = calls[i]![1].value! + calls[j]![1].value!\n calls[i]![3].value = calls[i]![3].value! + calls[j]![3].value!\n calls.splice(j, 1)\n }\n\n // looks for fee payment to subtract\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSend(calls[j]) &&\n isSwap(calls[i]!) &&\n calls[i]![3].value! / 400n >= calls[j]![1].value!\n ) {\n calls[i]![3].value = calls[i]![3].value! - calls[j]![1].value!\n calls.splice(j, 1)\n }\n\n // looks for take (sweep) action to infer the swap minimum by\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isTake(calls[j]!) &&\n calls[i]![3].address === calls[j]![2].address\n ) {\n calls[i]![3].value =\n calls[i]![3].value! > calls[j]![2].value! ? calls[i]![3].value : calls[j]![2].value\n calls.splice(j, 1)\n }\n }\n }\n return originalCallsLength === calls.length ? joinWithAndLabel(calls) : uniReduce(calls)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts new file mode 100644 index 000000000..bb6abb805 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts @@ -0,0 +1,5 @@ +import { HumanizerVisualization, IrCall } from '../../interfaces'; +export declare const WALLETSupplyControllerMapping: () => { + [key: string]: (arg1: IrCall) => HumanizerVisualization[]; +}; +//# sourceMappingURL=WALLETSupplyController.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts.map b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts.map new file mode 100644 index 000000000..073a5075c --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"WALLETSupplyController.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/WALLETSupplyController.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIjE,eAAO,MAAM,6BAA6B;0BAClB,MAAM,KAAK,sBAAsB,EAAE;CA2B1D,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js new file mode 100644 index 000000000..360810be4 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js @@ -0,0 +1,29 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Interface } from 'ethers'; +import WALLETSupplyControllerABI from '../../../../../contracts/compiled/WALLETSupplyController.json'; +import { getAction, getLabel } from '../../utils'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const WALLETSupplyControllerMapping = () => { + const iface = new Interface(WALLETSupplyControllerABI); + return { + [iface.getFunction('claim')?.selector]: (call) => { + const { toBurnBps } = iface.parseTransaction(call).args; + const burnPercentage = toBurnBps.toString() / 100; + return burnPercentage > 0 + ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)] + : [getAction('Claim rewards')]; + }, + [iface.getFunction('claimWithRootUpdate')?.selector]: (call) => { + const { toBurnBps } = iface.parseTransaction(call).args; + const burnPercentage = toBurnBps.toString() / 100; + return burnPercentage > 0 + ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)] + : [getAction('Claim rewards')]; + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + [iface.getFunction('mintVesting')?.selector]: () => { + return [getAction('Claim vested tokens')]; + } + }; +}; +//# sourceMappingURL=WALLETSupplyController.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map new file mode 100644 index 000000000..f069937f2 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WALLETSupplyController.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/WALLETSupplyController.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,yBAAyB,MAAM,+DAA+D,CAAA;AAErG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAE3C,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAEtD,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAA4B,EAAE;YAClF,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YACjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,QAAS,CAAC,EAAE,CACrD,IAAY,EACc,EAAE;YAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YAEjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,6DAA6D;QAC7D,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,GAA6B,EAAE;YAC5E,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAA;QAC3C,CAAC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Interface } from 'ethers'\n\nimport WALLETSupplyControllerABI from '../../../../../contracts/compiled/WALLETSupplyController.json'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getLabel } from '../../utils'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETSupplyControllerMapping = (): {\n [key: string]: (arg1: IrCall) => HumanizerVisualization[]\n} => {\n const iface = new Interface(WALLETSupplyControllerABI)\n\n return {\n [iface.getFunction('claim')?.selector!]: (call: IrCall): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n [iface.getFunction('claimWithRootUpdate')?.selector!]: (\n call: IrCall\n ): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [iface.getFunction('mintVesting')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Claim vested tokens')]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.d.ts b/dist/src/libs/humanizer/modules/WALLET/index.d.ts new file mode 100644 index 000000000..93618114b --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const WALLETModule: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.d.ts.map b/dist/src/libs/humanizer/modules/WALLET/index.d.ts.map new file mode 100644 index 000000000..bb07d2f10 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAU,MAAM,kBAAkB,CAAA;AAoB9D,eAAO,MAAM,YAAY,EAAE,mBA6E1B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.js b/dist/src/libs/humanizer/modules/WALLET/index.js new file mode 100644 index 000000000..e1510a43f --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/index.js @@ -0,0 +1,87 @@ +import { Interface } from 'ethers'; +import { STK_WALLET, WALLET_STAKING_ADDR, WALLET_TOKEN } from '../../../../consts/addresses'; +import { StkWallet } from '../../const/abis/stkWallet'; +import { checkIfUnknownAction, getAction, getLabel, getToken, getUnknownVisualization } from '../../utils'; +import { StakingPools } from './stakingPools'; +// update return ir to be {...ir,calls:newCalls} instead of {calls:newCalls} everywhere +import { WALLETSupplyControllerMapping } from './WALLETSupplyController'; +const stakingAddresses = [ + '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935', + '0xb6456b57f03352be48bf101b46c1752a0813491a', + '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e' +]; +const stkWalletIface = new Interface(StkWallet); +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const WALLETModule = (_, irCalls) => { + const matcher = { + supplyController: WALLETSupplyControllerMapping(), + stakingPool: StakingPools(), + stkWallet: { + [stkWalletIface.getFunction('wrapAll').selector]: () => { + return [ + getAction('Wrap all'), + getToken(WALLET_STAKING_ADDR, 0n), + getLabel('to'), + getToken(STK_WALLET, 0n) + ]; + }, + [stkWalletIface.getFunction('wrap').selector]: ({ data }) => { + const [shareAmount] = stkWalletIface.parseTransaction({ data }).args; + return [ + getAction('Wrap'), + getToken(WALLET_STAKING_ADDR, shareAmount), + getLabel('to'), + getToken(STK_WALLET, 0n) + ]; + }, + [stkWalletIface.getFunction('unwrap').selector]: ({ data }) => { + const [shareAmount] = stkWalletIface.parseTransaction({ data }).args; + return [ + getAction('Unwrap'), + getToken(STK_WALLET, 0n), + getLabel('for'), + getToken(WALLET_STAKING_ADDR, shareAmount) + ]; + }, + [stkWalletIface.getFunction('stakeAndWrap').selector]: ({ data }) => { + const [amount] = stkWalletIface.parseTransaction({ data }).args; + return [ + getAction('Stake and wrap'), + getToken(WALLET_TOKEN, amount), + getLabel('for'), + getToken(STK_WALLET, 0n) + ]; + } + } + }; + const newCalls = irCalls.map((call) => { + if (stakingAddresses.includes(call.to.toLowerCase()) && + (!call.fullVisualization || checkIfUnknownAction(call.fullVisualization))) { + if (matcher.stakingPool[call.data.slice(0, 10)]) { + return { + ...call, + fullVisualization: matcher.stakingPool[call.data.slice(0, 10)](call) + }; + } + return { + ...call, + fullVisualization: getUnknownVisualization('staking', call) + }; + } + if (matcher.supplyController[call.data.slice(0, 10)]) { + return { + ...call, + fullVisualization: matcher.supplyController[call.data.slice(0, 10)](call) + }; + } + if (call.to === STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) { + return { + ...call, + fullVisualization: matcher.stkWallet[call.data.slice(0, 10)](call) + }; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.js.map b/dist/src/libs/humanizer/modules/WALLET/index.js.map new file mode 100644 index 000000000..fca01eb6c --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { STK_WALLET, WALLET_STAKING_ADDR, WALLET_TOKEN } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { StkWallet } from '../../const/abis/stkWallet'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getLabel,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { StakingPools } from './stakingPools'\n// update return ir to be {...ir,calls:newCalls} instead of {calls:newCalls} everywhere\nimport { WALLETSupplyControllerMapping } from './WALLETSupplyController'\n\nconst stakingAddresses = [\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935',\n '0xb6456b57f03352be48bf101b46c1752a0813491a',\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e'\n]\n\nconst stkWalletIface = new Interface(StkWallet)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n supplyController: WALLETSupplyControllerMapping(),\n stakingPool: StakingPools(),\n stkWallet: {\n [stkWalletIface.getFunction('wrapAll')!.selector]: () => {\n return [\n getAction('Wrap all'),\n getToken(WALLET_STAKING_ADDR, 0n),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('wrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Wrap'),\n getToken(WALLET_STAKING_ADDR, shareAmount),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('unwrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Unwrap'),\n getToken(STK_WALLET, 0n),\n getLabel('for'),\n getToken(WALLET_STAKING_ADDR, shareAmount)\n ]\n },\n [stkWalletIface.getFunction('stakeAndWrap')!.selector]: ({ data }: IrCall) => {\n const [amount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Stake and wrap'),\n getToken(WALLET_TOKEN, amount),\n getLabel('for'),\n getToken(STK_WALLET, 0n)\n ]\n }\n }\n }\n const newCalls = irCalls.map((call: IrCall) => {\n if (\n stakingAddresses.includes(call.to.toLowerCase()) &&\n (!call.fullVisualization || checkIfUnknownAction(call.fullVisualization))\n ) {\n if (matcher.stakingPool[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stakingPool[call.data.slice(0, 10)](call)\n }\n }\n return {\n ...call,\n fullVisualization: getUnknownVisualization('staking', call)\n }\n }\n if (matcher.supplyController[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.supplyController[call.data.slice(0, 10)](call)\n }\n }\n\n if (call.to === STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stkWallet[call.data.slice(0, 10)](call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts b/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts new file mode 100644 index 000000000..11b1eb272 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts @@ -0,0 +1,5 @@ +import { HumanizerVisualization, IrCall } from '../../interfaces'; +export declare const StakingPools: () => { + [key: string]: (c: IrCall) => HumanizerVisualization[]; +}; +//# sourceMappingURL=stakingPools.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts.map b/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts.map new file mode 100644 index 000000000..f08bf11cc --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"stakingPools.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/stakingPools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAoBjE,eAAO,MAAM,YAAY;uBAA4B,MAAM,KAAK,sBAAsB,EAAE;CA0CvF,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js new file mode 100644 index 000000000..425c2be50 --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js @@ -0,0 +1,61 @@ +import { Interface } from 'ethers'; +import { StakingPool } from '../../const/abis'; +import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +const STAKING_POOLS = { + '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': { + baseToken: '0x88800092ff476844f74dc2fc427974bbee2794ae', + name: 'WALLET Staking Pool' + }, + '0xb6456b57f03352be48bf101b46c1752a0813491a': { + baseToken: '0xade00c28244d5ce17d72e40330b1c318cd12b7c3', + name: 'ADX Staking Pool' + }, + // this is on polygon for tests + '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e': { + baseToken: '0xe9415e904143e42007865e6864f7f632bd054a08', + name: 'WALLET Staking Pool (Test)' + } +}; +// const WALLET_TOKEN_ADDR = '0x88800092ff476844f74dc2fc427974bbee2794ae' +export const StakingPools = () => { + const iface = new Interface(StakingPool); + return { + [iface.getFunction('enter')?.selector]: (call) => { + const { amount } = iface.parseTransaction(call).args; + return [ + getAction('Deposit'), + getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount), + getLabel('to'), + getAddressVisualization(call.to) + ]; + }, + [iface.getFunction('leave')?.selector]: (call) => { + const { shares } = iface.parseTransaction(call).args; + return [ + getAction('Leave'), + getLabel('with'), + getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + getAddressVisualization(call.to) + ]; + }, + [iface.getFunction('withdraw')?.selector]: (call) => { + const { shares } = iface.parseTransaction(call).args; + return [ + getAction('Withdraw'), + getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + getLabel('from'), + getAddressVisualization(call.to) + ]; + }, + [iface.getFunction('rageLeave')?.selector]: (call) => { + const { shares } = iface.parseTransaction(call).args; + return [ + getAction('Rage leave'), + getLabel('with'), + getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + getAddressVisualization(call.to) + ]; + } + }; +}; +//# sourceMappingURL=stakingPools.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map new file mode 100644 index 000000000..4dc99c96a --- /dev/null +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map @@ -0,0 +1 @@ +{"version":3,"file":"stakingPools.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/stakingPools.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { StakingPool } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst STAKING_POOLS: { [key: string]: { [key: string]: string } } = {\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': {\n baseToken: '0x88800092ff476844f74dc2fc427974bbee2794ae',\n name: 'WALLET Staking Pool'\n },\n '0xb6456b57f03352be48bf101b46c1752a0813491a': {\n baseToken: '0xade00c28244d5ce17d72e40330b1c318cd12b7c3',\n name: 'ADX Staking Pool'\n },\n // this is on polygon for tests\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e': {\n baseToken: '0xe9415e904143e42007865e6864f7f632bd054a08',\n name: 'WALLET Staking Pool (Test)'\n }\n}\n// const WALLET_TOKEN_ADDR = '0x88800092ff476844f74dc2fc427974bbee2794ae'\n\nexport const StakingPools = (): { [key: string]: (c: IrCall) => HumanizerVisualization[] } => {\n const iface = new Interface(StakingPool)\n return {\n [iface.getFunction('enter')?.selector!]: (call: IrCall) => {\n const { amount } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('leave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Withdraw'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n },\n\n [iface.getFunction('rageLeave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Rage leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.d.ts b/dist/src/libs/humanizer/modules/Wrapping/index.d.ts new file mode 100644 index 000000000..2539414ee --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/index.d.ts @@ -0,0 +1,3 @@ +import { wrappingModule } from './wrapping'; +export default wrappingModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.d.ts.map b/dist/src/libs/humanizer/modules/Wrapping/index.d.ts.map new file mode 100644 index 000000000..c13cbc32f --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAe,cAAc,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.js b/dist/src/libs/humanizer/modules/Wrapping/index.js new file mode 100644 index 000000000..75c85652c --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/index.js @@ -0,0 +1,3 @@ +import { wrappingModule } from './wrapping'; +export default wrappingModule; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.js.map b/dist/src/libs/humanizer/modules/Wrapping/index.js.map new file mode 100644 index 000000000..7a7ae332e --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAe,cAAc,CAAA","sourcesContent":["import { wrappingModule } from './wrapping'\n\nexport default wrappingModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts b/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts new file mode 100644 index 000000000..61f7a5623 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const wrappingModule: HumanizerCallModule; +//# sourceMappingURL=wrapping.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts.map b/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts.map new file mode 100644 index 000000000..3c1844599 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"wrapping.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/wrapping.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAyB,MAAM,kBAAkB,CAAA;AAG7E,eAAO,MAAM,cAAc,EAAE,mBAwC5B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js new file mode 100644 index 000000000..9d94fdffb --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js @@ -0,0 +1,39 @@ +import { Interface, ZeroAddress } from 'ethers'; +import { WETH } from '../../const/abis'; +import { getUnknownVisualization, getUnwrapping, getWrapping } from '../../utils'; +export const wrappingModule = (_, irCalls, humanizerMeta) => { + const iface = new Interface(WETH); + const newCalls = irCalls.map((call) => { + const knownAddressData = humanizerMeta?.knownAddresses[call.to.toLowerCase()]; + if (knownAddressData?.name === 'Wrapped ETH' || + knownAddressData?.name === 'WETH' || + knownAddressData?.token?.symbol === 'WETH' || + knownAddressData?.name === 'WMATIC' || + knownAddressData?.token?.symbol === 'WMATIC' || + knownAddressData?.token?.symbol === 'WAVAX') { + // 0xd0e30db0 + if (call.data.slice(0, 10) === iface.getFunction('deposit')?.selector) { + return { + ...call, + fullVisualization: getWrapping(ZeroAddress, call.value) + }; + } + // 0x2e1a7d4d + if (call.data.slice(0, 10) === iface.getFunction('withdraw')?.selector) { + const [amount] = iface.parseTransaction(call)?.args || []; + return { + ...call, + fullVisualization: getUnwrapping(ZeroAddress, amount) + }; + } + if (!call?.fullVisualization) + return { + ...call, + fullVisualization: getUnknownVisualization('wrapped', call) + }; + } + return call; + }); + return newCalls; +}; +//# sourceMappingURL=wrapping.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map new file mode 100644 index 000000000..0c61dcd82 --- /dev/null +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map @@ -0,0 +1 @@ +{"version":3,"file":"wrapping.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/wrapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEjF,MAAM,CAAC,MAAM,cAAc,GAAwB,CACjD,CAAY,EACZ,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QAC5C,MAAM,gBAAgB,GAAG,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7E,IACE,gBAAgB,EAAE,IAAI,KAAK,aAAa;YACxC,gBAAgB,EAAE,IAAI,KAAK,MAAM;YACjC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;YAC1C,gBAAgB,EAAE,IAAI,KAAK,QAAQ;YACnC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,QAAQ;YAC5C,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,EAC3C;YACA,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE;gBACrE,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;iBACxD,CAAA;aACF;YACD,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;gBACtE,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;gBACzD,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC;iBACtD,CAAA;aACF;YACD,IAAI,CAAC,IAAI,EAAE,iBAAiB;gBAC1B,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC;iBAC5D,CAAA;SACJ;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { WETH } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getUnknownVisualization, getUnwrapping, getWrapping } from '../../utils'\n\nexport const wrappingModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const iface = new Interface(WETH)\n const newCalls = irCalls.map((call: IrCall) => {\n const knownAddressData = humanizerMeta?.knownAddresses[call.to.toLowerCase()]\n if (\n knownAddressData?.name === 'Wrapped ETH' ||\n knownAddressData?.name === 'WETH' ||\n knownAddressData?.token?.symbol === 'WETH' ||\n knownAddressData?.name === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WAVAX'\n ) {\n // 0xd0e30db0\n if (call.data.slice(0, 10) === iface.getFunction('deposit')?.selector) {\n return {\n ...call,\n fullVisualization: getWrapping(ZeroAddress, call.value)\n }\n }\n // 0x2e1a7d4d\n if (call.data.slice(0, 10) === iface.getFunction('withdraw')?.selector) {\n const [amount] = iface.parseTransaction(call)?.args || []\n return {\n ...call,\n fullVisualization: getUnwrapping(ZeroAddress, amount)\n }\n }\n if (!call?.fullVisualization)\n return {\n ...call,\n fullVisualization: getUnknownVisualization('wrapped', call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts new file mode 100644 index 000000000..82c68432c --- /dev/null +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts @@ -0,0 +1,3 @@ +import { HumanizerCallModule } from '../../interfaces'; +export declare const embeddedAmbireOperationHumanizer: HumanizerCallModule; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts.map b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts.map new file mode 100644 index 000000000..1afe5beb5 --- /dev/null +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAyB,MAAM,kBAAkB,CAAA;AAM7E,eAAO,MAAM,gCAAgC,EAAE,mBAwE9C,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js new file mode 100644 index 000000000..0a3dd8f07 --- /dev/null +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js @@ -0,0 +1,66 @@ +import { Interface } from 'ethers'; +import { AmbireAccount } from '../../const/abis/AmbireAccount'; +import { getAction, getAddressVisualization, getLabel } from '../../utils'; +// the purpose of this module is simply to visualize attempts to hide ambire operations within the current account op +// such thing can be done if the dapp requests a tryCatch/executeBySelfSingle/executeBySelf function call directed to the current account +// this call will be executed without needing extra authentication. For more details check out AmbireAccount.sol +export const embeddedAmbireOperationHumanizer = (accountOp, irCalls) => { + const iface = new Interface(AmbireAccount); + const matcher = { + [iface.getFunction('tryCatch').selector]: (originalCall) => { + const { to, value, data } = iface.decodeFunctionData('tryCatch', originalCall.data); + return [{ ...originalCall, to, value, data }]; + }, + [iface.getFunction('tryCatchLimit').selector]: (originalCall) => { + const { to, value, data } = iface.decodeFunctionData('tryCatchLimit', originalCall.data); + return [{ ...originalCall, to, value, data }]; + }, + [iface.getFunction('executeBySelfSingle').selector]: (originalCall) => { + const { call: { to, value, data } } = iface.decodeFunctionData('executeBySelfSingle', originalCall.data); + return [{ ...originalCall, to, value, data }]; + }, + [iface.getFunction('executeBySelf').selector]: (originalCall) => { + const { calls } = iface.decodeFunctionData('executeBySelf', originalCall.data); + // ethers returns Result type, which we do not want to leak in the result + return calls.map(({ to, value, data }) => ({ ...originalCall, to, value, data })); + } + }; + const functionSelectorsCallableFromSigner = ['execute', 'executeMultiple', 'executeBySender'].map((i) => iface.getFunction(i).selector); + const functionSelectorsCallableFromSelf = [ + 'tryCatch', + 'tryCatch', + 'executeBySelfSingle', + 'executeBySelf' + ].map((i) => iface.getFunction(i).selector); + const newCalls = []; + irCalls.forEach((call) => { + if (call.to?.toLowerCase() === accountOp.accountAddr.toLowerCase() && + matcher[call.data.slice(0, 10)]) { + newCalls.push(...matcher[call.data.slice(0, 10)](call)); + return; + } + if (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10))) { + newCalls.push({ + ...call, + fullVisualization: [ + getAction('Execute calls'), + getLabel('from'), + getAddressVisualization(call.to) + ] + }); + return; + } + newCalls.push(call); + }); + // if an attacker hides some call deeper inside a method, callable from self + const hasParsableCalls = newCalls.some((call) => + // we could unwrap more + functionSelectorsCallableFromSelf.includes(call.data.slice(0, 10)) || + // an unwrapped call could get humanization here + (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10)) && + !call.fullVisualization?.length)); + return hasParsableCalls + ? embeddedAmbireOperationHumanizer(accountOp, newCalls, {}) + : newCalls; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map new file mode 100644 index 000000000..0543e93fc --- /dev/null +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, Result } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AmbireAccount } from '../../const/abis/AmbireAccount'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\n// the purpose of this module is simply to visualize attempts to hide ambire operations within the current account op\n// such thing can be done if the dapp requests a tryCatch/executeBySelfSingle/executeBySelf function call directed to the current account\n// this call will be executed without needing extra authentication. For more details check out AmbireAccount.sol\nexport const embeddedAmbireOperationHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[]\n) => {\n const iface = new Interface(AmbireAccount)\n const matcher: { [selector: string]: (originalCall: IrCall) => IrCall[] } = {\n [iface.getFunction('tryCatch')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatch', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('tryCatchLimit')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatchLimit', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelfSingle')!.selector]: (originalCall: IrCall) => {\n const {\n call: { to, value, data }\n } = iface.decodeFunctionData('executeBySelfSingle', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelf')!.selector]: (originalCall: IrCall) => {\n const { calls } = iface.decodeFunctionData('executeBySelf', originalCall.data)\n // ethers returns Result type, which we do not want to leak in the result\n return calls.map(({ to, value, data }: Result) => ({ ...originalCall, to, value, data }))\n }\n }\n const functionSelectorsCallableFromSigner = ['execute', 'executeMultiple', 'executeBySender'].map(\n (i) => iface.getFunction(i)!.selector\n )\n const functionSelectorsCallableFromSelf = [\n 'tryCatch',\n 'tryCatch',\n 'executeBySelfSingle',\n 'executeBySelf'\n ].map((i) => iface.getFunction(i)!.selector)\n const newCalls: IrCall[] = []\n\n irCalls.forEach((call) => {\n if (\n call.to?.toLowerCase() === accountOp.accountAddr.toLowerCase() &&\n matcher[call.data.slice(0, 10)]\n ) {\n newCalls.push(...matcher[call.data.slice(0, 10)](call))\n return\n }\n if (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10))) {\n newCalls.push({\n ...call,\n fullVisualization: [\n getAction('Execute calls'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n })\n return\n }\n newCalls.push(call)\n })\n\n // if an attacker hides some call deeper inside a method, callable from self\n const hasParsableCalls = newCalls.some(\n (call) =>\n // we could unwrap more\n functionSelectorsCallableFromSelf.includes(call.data.slice(0, 10)) ||\n // an unwrapped call could get humanization here\n (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10)) &&\n !call.fullVisualization?.length)\n )\n\n return hasParsableCalls\n ? embeddedAmbireOperationHumanizer(accountOp, newCalls, {} as HumanizerMeta)\n : newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.d.ts b/dist/src/libs/humanizer/testHelpers.d.ts new file mode 100644 index 000000000..2a6469d80 --- /dev/null +++ b/dist/src/libs/humanizer/testHelpers.d.ts @@ -0,0 +1,4 @@ +import { HumanizerVisualization, IrCall } from './interfaces'; +export declare const compareHumanizerVisualizations: (_calls: IrCall[], _expectedVisualizations: HumanizerVisualization[][]) => void; +export declare const compareVisualizations: (v1: HumanizerVisualization[], v2: HumanizerVisualization[]) => void; +//# sourceMappingURL=testHelpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.d.ts.map b/dist/src/libs/humanizer/testHelpers.d.ts.map new file mode 100644 index 000000000..efcbe1938 --- /dev/null +++ b/dist/src/libs/humanizer/testHelpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/humanizer/testHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE7D,eAAO,MAAM,8BAA8B,WACjC,MAAM,EAAE,2BACS,sBAAsB,EAAE,EAAE,SAcpD,CAAA;AAED,eAAO,MAAM,qBAAqB,OAC5B,sBAAsB,EAAE,MACxB,sBAAsB,EAAE,SAM7B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.js b/dist/src/libs/humanizer/testHelpers.js new file mode 100644 index 000000000..5d6dcc022 --- /dev/null +++ b/dist/src/libs/humanizer/testHelpers.js @@ -0,0 +1,19 @@ +export const compareHumanizerVisualizations = (_calls, _expectedVisualizations) => { + const calls = _calls.map((c) => ({ + ...c, + fullVisualization: c.fullVisualization?.map((v) => ({ ...v, id: null })) + })); + const expectedVisualizations = _expectedVisualizations.map((vs) => vs.map((v) => ({ ...v, id: null }))); + expect(calls.length).toBe(expectedVisualizations.length); + calls.forEach((call, i) => { + expect(call.fullVisualization?.length || 0).toBe(expectedVisualizations[i].length); + expect(call.fullVisualization || []).toEqual(expectedVisualizations[i]); + }); +}; +export const compareVisualizations = (v1, v2) => { + expect(v1.length).toBe(v2.length); + v1.forEach((v, i) => { + expect({ ...v2[i], id: null }).toMatchObject({ ...v, id: null }); + }); +}; +//# sourceMappingURL=testHelpers.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.js.map b/dist/src/libs/humanizer/testHelpers.js.map new file mode 100644 index 000000000..9212dbdbf --- /dev/null +++ b/dist/src/libs/humanizer/testHelpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"testHelpers.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/testHelpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,MAAgB,EAChB,uBAAmD,EACnD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC;QACJ,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE,CAAC,CAAC,CAAA;IACH,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAChE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACpC,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACxD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,EAA4B,EAC5B,EAA4B,EAC5B,EAAE;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IACjC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA","sourcesContent":["import { HumanizerVisualization, IrCall } from './interfaces'\n\nexport const compareHumanizerVisualizations = (\n _calls: IrCall[],\n _expectedVisualizations: HumanizerVisualization[][]\n) => {\n const calls = _calls.map((c) => ({\n ...c,\n fullVisualization: c.fullVisualization?.map((v) => ({ ...v, id: null }))\n }))\n const expectedVisualizations = _expectedVisualizations.map((vs) =>\n vs.map((v) => ({ ...v, id: null }))\n )\n expect(calls.length).toBe(expectedVisualizations.length)\n calls.forEach((call, i) => {\n expect(call.fullVisualization?.length || 0).toBe(expectedVisualizations[i].length)\n expect(call.fullVisualization || []).toEqual(expectedVisualizations[i])\n })\n}\n\nexport const compareVisualizations = (\n v1: HumanizerVisualization[],\n v2: HumanizerVisualization[]\n) => {\n expect(v1.length).toBe(v2.length)\n v1.forEach((v, i) => {\n expect({ ...v2[i], id: null }).toMatchObject({ ...v, id: null })\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.d.ts b/dist/src/libs/humanizer/utils.d.ts new file mode 100644 index 000000000..d418d55aa --- /dev/null +++ b/dist/src/libs/humanizer/utils.d.ts @@ -0,0 +1,37 @@ +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { HumanizerMeta, HumanizerVisualization, HumanizerWarning, IrCall } from './interfaces'; +export declare function getWarning(content: string, level?: HumanizerWarning['level']): HumanizerWarning; +export declare const randomId: () => number; +export declare function getLabel(content: string, isBold?: boolean): HumanizerVisualization; +export declare function getAction(content: string): HumanizerVisualization; +export declare function getImage(content: string): HumanizerVisualization; +export declare function getAddressVisualization(_address: string): HumanizerVisualization; +export declare function getToken(_address: string, amount: bigint, isHidden?: boolean, chainId?: bigint): HumanizerVisualization; +export declare function getTokenWithChain(address: string, amount: bigint, chainId?: bigint): HumanizerVisualization; +export declare function getChain(chainId: bigint): HumanizerVisualization; +export declare function getText(text: string): HumanizerVisualization; +export declare function getOnBehalfOf(onBehalfOf: string, sender: string): HumanizerVisualization[]; +export declare function getRecipientText(from: string, recipient: string): HumanizerVisualization[]; +export declare function getDeadlineText(deadline: bigint): string; +export declare function getDeadline(deadlineSecs: bigint | number): HumanizerVisualization; +export declare function getLink(url: string, content: string): HumanizerVisualization; +/** + * Make a request to coingecko to fetch the latest price of the native token. + * This is used by benzina and hence we cannot wrap the errors in emitError + */ +export declare function getNativePrice(network: Network, fetch: Fetch): Promise; +export declare function checkIfUnknownAction(v: HumanizerVisualization[] | undefined): boolean; +export declare function getUnknownVisualization(name: string, call: IrCall): HumanizerVisualization[]; +export declare function getWrapping(address: string, amount: bigint): HumanizerVisualization[]; +export declare function getUnwrapping(address: string, amount: bigint): HumanizerVisualization[]; +export declare function getKnownName(humanizerMeta: HumanizerMeta | undefined, address: string): string | undefined; +export declare const EMPTY_HUMANIZER_META: { + abis: { + NO_ABI: {}; + }; + knownAddresses: {}; +}; +export declare const uintToAddress: (uint: bigint) => string; +export declare const eToNative: (address: string) => string; +//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.d.ts.map b/dist/src/libs/humanizer/utils.d.ts.map new file mode 100644 index 000000000..717929fe8 --- /dev/null +++ b/dist/src/libs/humanizer/utils.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/libs/humanizer/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAI9F,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,gBAAgB,CAAC,OAAO,CAAa,GAC3C,gBAAgB,CAElB;AACD,eAAO,MAAM,QAAQ,QAAO,MAA6D,CAAA;AAEzF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAElF;AACD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAEjE;AACD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAEhE;AACD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAGhF;AAED,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,sBAAsB,CAUxB;AACD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,sBAAsB,CAExB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAE5D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAI1F;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAI1F;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASxD;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,sBAAsB,CAOjF;AACD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAE5E;AAED;;;GAGG;AAEH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAepF;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,sBAAsB,EAAE,GAAG,SAAS,GAAG,OAAO,CAErF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAW5F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAErF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAEvF;AAGD,wBAAgB,YAAY,CAC1B,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAEpB;AAED,eAAO,MAAM,oBAAoB;;;;;CAA+C,CAAA;AAEhF,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,MACkB,CAAA;AAE/D,eAAO,MAAM,SAAS,YAAa,MAAM,KAAG,MACqC,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.js b/dist/src/libs/humanizer/utils.js new file mode 100644 index 000000000..7a91e9237 --- /dev/null +++ b/dist/src/libs/humanizer/utils.js @@ -0,0 +1,120 @@ +import { ZeroAddress } from 'ethers'; +import { geckoIdMapper } from '../../consts/coingecko'; +const baseUrlCena = 'https://cena.ambire.com/api/v3'; +export function getWarning(content, level = 'caution') { + return { content, level }; +} +export const randomId = () => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); +export function getLabel(content, isBold) { + return { type: 'label', content, id: randomId(), isBold }; +} +export function getAction(content) { + return { type: 'action', content, id: randomId() }; +} +export function getImage(content) { + return { type: 'image', content, id: randomId() }; +} +export function getAddressVisualization(_address) { + const address = _address.toLowerCase(); + return { type: 'address', address, id: randomId() }; +} +export function getToken(_address, amount, isHidden, chainId) { + const address = _address.toLowerCase(); + return { + type: 'token', + address, + value: BigInt(amount), + id: randomId(), + isHidden, + chainId + }; +} +export function getTokenWithChain(address, amount, chainId) { + return getToken(address, amount, undefined, chainId); +} +export function getChain(chainId) { + return { type: 'chain', id: randomId(), chainId }; +} +export function getText(text) { + return { type: 'text', content: text, id: randomId() }; +} +export function getOnBehalfOf(onBehalfOf, sender) { + return onBehalfOf.toLowerCase() !== sender.toLowerCase() + ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)] + : []; +} +// @TODO on some humanization of uniswap there is recipient 0x000...000 +export function getRecipientText(from, recipient) { + return from.toLowerCase() === recipient.toLowerCase() + ? [] + : [getLabel('and send it to'), getAddressVisualization(recipient)]; +} +export function getDeadlineText(deadline) { + const minute = 60000n; + const diff = BigInt(deadline) - BigInt(Date.now()); + if (diff < 0 && diff > -minute * 2n) + return 'expired just now'; + if (diff < 0) + return 'already expired'; + if (diff < minute) + return 'expires in less than a minute'; + if (diff < 30n * minute) + return `expires in ${Math.floor(Number(diff / minute))} minutes`; + return `valid until ${new Date(Number(deadline)).toLocaleString()}`; +} +export function getDeadline(deadlineSecs) { + const deadline = BigInt(deadlineSecs) * 1000n; + return { + type: 'deadline', + value: deadline, + id: randomId() + }; +} +export function getLink(url, content) { + return { type: 'link', url, content, id: randomId() }; +} +/** + * Make a request to coingecko to fetch the latest price of the native token. + * This is used by benzina and hence we cannot wrap the errors in emitError + */ +// @TODO this shouldn't be here, a more suitable place would be portfolio/gecko +export async function getNativePrice(network, fetch) { + const platformId = geckoIdMapper(ZeroAddress, network); + if (!platformId) { + throw new Error(`getNativePrice: ${network.name} is not supported`); + } + const queryUrl = `${baseUrlCena}/simple/price?ids=${platformId}&vs_currencies=usd`; + let response = await fetch(queryUrl); + response = await response.json(); + if (!response[platformId] || !response[platformId].usd) { + throw new Error(`getNativePrice: could not fetch native token price for ${network.name} `); + } + return response[platformId].usd; +} +export function checkIfUnknownAction(v) { + return !!(v && v[0]?.type === 'action' && v?.[0]?.content?.startsWith('Unknown action')); +} +export function getUnknownVisualization(name, call) { + const unknownVisualization = [ + getAction(`Unknown action (${name})`), + getLabel('to'), + getAddressVisualization(call.to) + ]; + if (call.value) + unknownVisualization.push(...[getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]); + return unknownVisualization; +} +export function getWrapping(address, amount) { + return [getAction('Wrap'), getToken(address, amount)]; +} +export function getUnwrapping(address, amount) { + return [getAction('Unwrap'), getToken(address, amount)]; +} +// @TODO cant this be used in the
+export function getKnownName(humanizerMeta, address) { + return humanizerMeta?.knownAddresses?.[address.toLowerCase()]?.name; +} +export const EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }; +export const uintToAddress = (uint) => `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`; +export const eToNative = (address) => address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ZeroAddress : address; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.js.map b/dist/src/libs/humanizer/utils.js.map new file mode 100644 index 000000000..71f38dc70 --- /dev/null +++ b/dist/src/libs/humanizer/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { HumanizerMeta, HumanizerVisualization, HumanizerWarning, IrCall } from './interfaces'\n\nconst baseUrlCena = 'https://cena.ambire.com/api/v3'\n\nexport function getWarning(\n content: string,\n level: HumanizerWarning['level'] = 'caution'\n): HumanizerWarning {\n return { content, level }\n}\nexport const randomId = (): number => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)\n\nexport function getLabel(content: string, isBold?: boolean): HumanizerVisualization {\n return { type: 'label', content, id: randomId(), isBold }\n}\nexport function getAction(content: string): HumanizerVisualization {\n return { type: 'action', content, id: randomId() }\n}\nexport function getImage(content: string): HumanizerVisualization {\n return { type: 'image', content, id: randomId() }\n}\nexport function getAddressVisualization(_address: string): HumanizerVisualization {\n const address = _address.toLowerCase()\n return { type: 'address', address, id: randomId() }\n}\n\nexport function getToken(\n _address: string,\n amount: bigint,\n isHidden?: boolean,\n chainId?: bigint\n): HumanizerVisualization {\n const address = _address.toLowerCase()\n return {\n type: 'token',\n address,\n value: BigInt(amount),\n id: randomId(),\n isHidden,\n chainId\n }\n}\nexport function getTokenWithChain(\n address: string,\n amount: bigint,\n chainId?: bigint\n): HumanizerVisualization {\n return getToken(address, amount, undefined, chainId)\n}\n\nexport function getChain(chainId: bigint): HumanizerVisualization {\n return { type: 'chain', id: randomId(), chainId }\n}\n\nexport function getText(text: string): HumanizerVisualization {\n return { type: 'text', content: text, id: randomId() }\n}\n\nexport function getOnBehalfOf(onBehalfOf: string, sender: string): HumanizerVisualization[] {\n return onBehalfOf.toLowerCase() !== sender.toLowerCase()\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []\n}\n\n// @TODO on some humanization of uniswap there is recipient 0x000...000\nexport function getRecipientText(from: string, recipient: string): HumanizerVisualization[] {\n return from.toLowerCase() === recipient.toLowerCase()\n ? []\n : [getLabel('and send it to'), getAddressVisualization(recipient)]\n}\n\nexport function getDeadlineText(deadline: bigint): string {\n const minute = 60000n\n const diff = BigInt(deadline) - BigInt(Date.now())\n\n if (diff < 0 && diff > -minute * 2n) return 'expired just now'\n if (diff < 0) return 'already expired'\n if (diff < minute) return 'expires in less than a minute'\n if (diff < 30n * minute) return `expires in ${Math.floor(Number(diff / minute))} minutes`\n return `valid until ${new Date(Number(deadline)).toLocaleString()}`\n}\n\nexport function getDeadline(deadlineSecs: bigint | number): HumanizerVisualization {\n const deadline = BigInt(deadlineSecs) * 1000n\n return {\n type: 'deadline',\n value: deadline,\n id: randomId()\n }\n}\nexport function getLink(url: string, content: string): HumanizerVisualization {\n return { type: 'link', url, content, id: randomId() }\n}\n\n/**\n * Make a request to coingecko to fetch the latest price of the native token.\n * This is used by benzina and hence we cannot wrap the errors in emitError\n */\n// @TODO this shouldn't be here, a more suitable place would be portfolio/gecko\nexport async function getNativePrice(network: Network, fetch: Fetch): Promise {\n const platformId = geckoIdMapper(ZeroAddress, network)\n if (!platformId) {\n throw new Error(`getNativePrice: ${network.name} is not supported`)\n }\n\n const queryUrl = `${baseUrlCena}/simple/price?ids=${platformId}&vs_currencies=usd`\n let response = await fetch(queryUrl)\n response = await response.json()\n\n if (!response[platformId] || !response[platformId].usd) {\n throw new Error(`getNativePrice: could not fetch native token price for ${network.name} `)\n }\n\n return response[platformId].usd\n}\n\nexport function checkIfUnknownAction(v: HumanizerVisualization[] | undefined): boolean {\n return !!(v && v[0]?.type === 'action' && v?.[0]?.content?.startsWith('Unknown action'))\n}\n\nexport function getUnknownVisualization(name: string, call: IrCall): HumanizerVisualization[] {\n const unknownVisualization = [\n getAction(`Unknown action (${name})`),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n if (call.value)\n unknownVisualization.push(\n ...[getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n )\n return unknownVisualization\n}\n\nexport function getWrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Wrap'), getToken(address, amount)]\n}\n\nexport function getUnwrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Unwrap'), getToken(address, amount)]\n}\n\n// @TODO cant this be used in the
\nexport function getKnownName(\n humanizerMeta: HumanizerMeta | undefined,\n address: string\n): string | undefined {\n return humanizerMeta?.knownAddresses?.[address.toLowerCase()]?.name\n}\n\nexport const EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }\n\nexport const uintToAddress = (uint: bigint): string =>\n `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`\n\nexport const eToNative = (address: string): string =>\n address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ZeroAddress : address\n"]} \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.d.ts b/dist/src/libs/keyIterator/keyIterator.d.ts new file mode 100644 index 000000000..0de90405d --- /dev/null +++ b/dist/src/libs/keyIterator/keyIterator.d.ts @@ -0,0 +1,31 @@ +import { HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'; +import { SelectedAccountForImport } from '../../interfaces/account'; +import { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'; +import { Key } from '../../interfaces/keystore'; +export declare function isValidPrivateKey(value: string): boolean; +export declare const getPrivateKeyFromSeed: (seed: string, keyIndex: number, hdPathTemplate: HD_PATH_TEMPLATE_TYPE) => string; +/** + * Serves for retrieving a range of addresses/keys from a given private key or seed phrase + */ +export declare class KeyIterator implements KeyIteratorInterface { + #private; + type: string; + subType: 'seed' | 'private-key'; + constructor(_privKeyOrSeed: string); + retrieve(fromToArr: { + from: number; + to: number; + }[], hdPathTemplate?: HD_PATH_TEMPLATE_TYPE): Promise; + retrieveInternalKeys(selectedAccountsForImport: SelectedAccountForImport[], hdPathTemplate: HD_PATH_TEMPLATE_TYPE, keystoreKeys: Key[]): { + addr: string; + type: "internal"; + label: string; + privateKey: string; + dedicatedToOneSA: boolean; + meta: { + createdAt: number; + }; + }[]; + isSeedMatching(seedPhraseToCompareWith: string): boolean; +} +//# sourceMappingURL=keyIterator.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.d.ts.map b/dist/src/libs/keyIterator/keyIterator.d.ts.map new file mode 100644 index 000000000..d5cbf86b8 --- /dev/null +++ b/dist/src/libs/keyIterator/keyIterator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keyIterator.d.ts","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EAEtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAK/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,eAAO,MAAM,qBAAqB,SAC1B,MAAM,YACF,MAAM,kBACA,qBAAqB,WAYtC,CAAA;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,oBAAoB;;IACtD,IAAI,SAAa;IAEjB,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;gBAMnB,cAAc,EAAE,MAAM;IAkB5B,QAAQ,CACZ,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,EACzC,cAAc,CAAC,EAAE,qBAAqB;IAgCxC,oBAAoB,CAClB,yBAAyB,EAAE,wBAAwB,EAAE,EACrD,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,GAAG,EAAE;;;;;;;;;;IA+ErB,cAAc,CAAC,uBAAuB,EAAE,MAAM;CAQ/C"} \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.js b/dist/src/libs/keyIterator/keyIterator.js new file mode 100644 index 000000000..450048fa4 --- /dev/null +++ b/dist/src/libs/keyIterator/keyIterator.js @@ -0,0 +1,137 @@ +/* eslint-disable new-cap */ +import { HDNodeWallet, Mnemonic, Wallet } from 'ethers'; +import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; +import { getHdPathFromTemplate } from '../../utils/hdPath'; +import { isDerivedForSmartAccountKeyOnly } from '../account/account'; +import { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'; +export function isValidPrivateKey(value) { + try { + return !!new Wallet(value); + } + catch { + return false; + } +} +export const getPrivateKeyFromSeed = (seed, keyIndex, hdPathTemplate) => { + const mnemonic = Mnemonic.fromPhrase(seed); + const wallet = HDNodeWallet.fromMnemonic(mnemonic, getHdPathFromTemplate(hdPathTemplate, keyIndex)); + if (wallet) { + return wallet.privateKey; + } + throw new Error('Getting the private key from the seed phrase failed.'); +}; +/** + * Serves for retrieving a range of addresses/keys from a given private key or seed phrase + */ +export class KeyIterator { + type = 'internal'; + subType; + #privateKey = null; + #seedPhrase = null; + constructor(_privKeyOrSeed) { + if (!_privKeyOrSeed) + throw new Error('keyIterator: no private key or seed phrase provided'); + if (isValidPrivateKey(_privKeyOrSeed)) { + this.#privateKey = _privKeyOrSeed; + this.subType = 'private-key'; + return; + } + if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) { + this.#seedPhrase = _privKeyOrSeed; + this.subType = 'seed'; + return; + } + throw new Error('keyIterator: invalid argument provided to constructor'); + } + async retrieve(fromToArr, hdPathTemplate) { + const keys = []; + fromToArr.forEach(({ from, to }) => { + if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate) + throw new Error('keyIterator: invalid or missing arguments'); + if (this.#privateKey) { + const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + // Before v4.31.0, private keys for accounts used as smart account keys + // were derived. That's no longer the case. Importing private keys + // does not generate smart accounts anymore. + if (!shouldDerive) + keys.push(new Wallet(this.#privateKey).address); + } + if (this.#seedPhrase) { + const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase); + for (let i = from; i <= to; i++) { + const wallet = HDNodeWallet.fromMnemonic(mnemonic, getHdPathFromTemplate(hdPathTemplate, i)); + keys.push(wallet.address); + } + } + }); + return keys; + } + retrieveInternalKeys(selectedAccountsForImport, hdPathTemplate, keystoreKeys) { + return selectedAccountsForImport.flatMap((acc) => { + // Should never happen + if (!['seed', 'private-key'].includes(this.subType)) { + console.error('keyIterator: invalid subType', this.subType); + return []; + } + return acc.accountKeys.flatMap(({ index }, i) => { + // In case it is a seed, the private keys have to be extracted + if (this.subType === 'seed') { + if (!this.#seedPhrase) { + // Should never happen + console.error('keyIterator: no seed phrase provided'); + return []; + } + const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate); + return [ + { + addr: new Wallet(privateKey).address, + type: 'internal', + label: getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) || + getDefaultKeyLabel(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), i), + privateKey, + dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index), + meta: { + createdAt: new Date().getTime() + } + } + ]; + } + // So the subType is 'private-key' then + if (!this.#privateKey) { + // Should never happen + console.error('keyIterator: no private key provided'); + return []; + } + // Before v4.31.0, private keys for accounts used as smart account keys + // were derived. That's no longer the case. Importing private keys + // does not generate smart accounts anymore. + const isPrivateKeyThatShouldBeDerived = isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + if (isPrivateKeyThatShouldBeDerived) { + // Should never happen + console.error('keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'); + return []; + } + return [ + { + addr: new Wallet(this.#privateKey).address, + type: 'internal', + label: getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) || + getDefaultKeyLabel(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), 0), + privateKey: this.#privateKey, + dedicatedToOneSA: false, + meta: { + createdAt: new Date().getTime() + } + } + ]; + }); + }); + } + isSeedMatching(seedPhraseToCompareWith) { + if (!this.#seedPhrase) + return false; + return (Mnemonic.fromPhrase(this.#seedPhrase).phrase === + Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase); + } +} +//# sourceMappingURL=keyIterator.js.map \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.js.map b/dist/src/libs/keyIterator/keyIterator.js.map new file mode 100644 index 000000000..d3284a6f8 --- /dev/null +++ b/dist/src/libs/keyIterator/keyIterator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEvD,OAAO,EAEL,0CAA0C,EAC3C,MAAM,yBAAyB,CAAA;AAIhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEtE,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI;QACF,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAA;KAC3B;IAAC,MAAM;QACN,OAAO,KAAK,CAAA;KACb;AACH,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAY,EACZ,QAAgB,EAChB,cAAqC,EACrC,EAAE;IACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CACtC,QAAQ,EACR,qBAAqB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAChD,CAAA;IACD,IAAI,MAAM,EAAE;QACV,OAAO,MAAM,CAAC,UAAU,CAAA;KACzB;IAED,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;AACzE,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACtB,IAAI,GAAG,UAAU,CAAA;IAEjB,OAAO,CAAwB;IAE/B,WAAW,GAAkB,IAAI,CAAA;IAEjC,WAAW,GAAkB,IAAI,CAAA;IAEjC,YAAY,cAAsB;QAChC,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QAE3F,IAAI,iBAAiB,CAAC,cAAc,CAAC,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,cAAc,CAAA;YACjC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAA;YAC5B,OAAM;SACP;QAED,IAAI,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE;YAC5C,IAAI,CAAC,WAAW,GAAG,cAAc,CAAA;YACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;YACrB,OAAM;SACP;QAED,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAC1E,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,SAAyC,EACzC,cAAsC;QAEtC,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;YACjC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc;gBAC/D,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;YAE9D,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,MAAM,YAAY,GAAG,IAAI,IAAI,0CAA0C,CAAA;gBACvE,uEAAuE;gBACvE,kEAAkE;gBAClE,4CAA4C;gBAC5C,IAAI,CAAC,YAAY;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAA;aACnE;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBAEtD,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;oBAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CACtC,QAAQ,EACR,qBAAqB,CAAC,cAAc,EAAE,CAAC,CAAC,CACzC,CAAA;oBACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;iBAC1B;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oBAAoB,CAClB,yBAAqD,EACrD,cAAqC,EACrC,YAAmB;QAEnB,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/C,sBAAsB;YACtB,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBACnD,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC3D,OAAO,EAAE,CAAA;aACV;YAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAqB,EAAE,CAAC,EAAE,EAAE;gBACjE,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE;oBAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;wBACrB,sBAAsB;wBACtB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;wBACrD,OAAO,EAAE,CAAA;qBACV;oBAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;oBACjF,OAAO;wBACL;4BACE,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO;4BACpC,IAAI,EAAE,UAAwB;4BAC9B,KAAK,EACH,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gCAC9D,kBAAkB,CAChB,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAC3E,CAAC,CACF;4BACH,UAAU;4BACV,gBAAgB,EAAE,+BAA+B,CAAC,KAAK,CAAC;4BACxD,IAAI,EAAE;gCACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;6BAChC;yBACF;qBACF,CAAA;iBACF;gBAED,uCAAuC;gBACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrB,sBAAsB;oBACtB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;oBACrD,OAAO,EAAE,CAAA;iBACV;gBAED,uEAAuE;gBACvE,kEAAkE;gBAClE,4CAA4C;gBAC5C,MAAM,+BAA+B,GACnC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,0CAA0C,CAAA;gBAC5F,IAAI,+BAA+B,EAAE;oBACnC,sBAAsB;oBACtB,OAAO,CAAC,KAAK,CACX,qHAAqH,CACtH,CAAA;oBACD,OAAO,EAAE,CAAA;iBACV;gBAED,OAAO;oBACL;wBACE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO;wBAC1C,IAAI,EAAE,UAAwB;wBAC9B,KAAK,EACH,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;4BAC9D,kBAAkB,CAChB,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAC3E,CAAC,CACF;wBACH,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,gBAAgB,EAAE,KAAK;wBACvB,IAAI,EAAE;4BACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;yBAChC;qBACF;iBACF,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,cAAc,CAAC,uBAA+B;QAC5C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAA;QAEnC,OAAO,CACL,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM;YAC5C,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,MAAM,CACpD,CAAA;IACH,CAAC;CACF","sourcesContent":["/* eslint-disable new-cap */\nimport { HDNodeWallet, Mnemonic, Wallet } from 'ethers'\n\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport { SelectedAccountForImport } from '../../interfaces/account'\nimport { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { getHdPathFromTemplate } from '../../utils/hdPath'\nimport { isDerivedForSmartAccountKeyOnly } from '../account/account'\nimport { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'\n\nexport function isValidPrivateKey(value: string): boolean {\n try {\n return !!new Wallet(value)\n } catch {\n return false\n }\n}\n\nexport const getPrivateKeyFromSeed = (\n seed: string,\n keyIndex: number,\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n) => {\n const mnemonic = Mnemonic.fromPhrase(seed)\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, keyIndex)\n )\n if (wallet) {\n return wallet.privateKey\n }\n\n throw new Error('Getting the private key from the seed phrase failed.')\n}\n\n/**\n * Serves for retrieving a range of addresses/keys from a given private key or seed phrase\n */\nexport class KeyIterator implements KeyIteratorInterface {\n type = 'internal'\n\n subType: 'seed' | 'private-key'\n\n #privateKey: string | null = null\n\n #seedPhrase: string | null = null\n\n constructor(_privKeyOrSeed: string) {\n if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided')\n\n if (isValidPrivateKey(_privKeyOrSeed)) {\n this.#privateKey = _privKeyOrSeed\n this.subType = 'private-key'\n return\n }\n\n if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) {\n this.#seedPhrase = _privKeyOrSeed\n this.subType = 'seed'\n return\n }\n\n throw new Error('keyIterator: invalid argument provided to constructor')\n }\n\n async retrieve(\n fromToArr: { from: number; to: number }[],\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n ) {\n const keys: string[] = []\n\n fromToArr.forEach(({ from, to }) => {\n if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate)\n throw new Error('keyIterator: invalid or missing arguments')\n\n if (this.#privateKey) {\n const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n if (!shouldDerive) keys.push(new Wallet(this.#privateKey).address)\n }\n\n if (this.#seedPhrase) {\n const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase)\n\n for (let i = from; i <= to; i++) {\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, i)\n )\n keys.push(wallet.address)\n }\n }\n })\n\n return keys\n }\n\n retrieveInternalKeys(\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) {\n return selectedAccountsForImport.flatMap((acc) => {\n // Should never happen\n if (!['seed', 'private-key'].includes(this.subType)) {\n console.error('keyIterator: invalid subType', this.subType)\n return []\n }\n\n return acc.accountKeys.flatMap(({ index }: { index: number }, i) => {\n // In case it is a seed, the private keys have to be extracted\n if (this.subType === 'seed') {\n if (!this.#seedPhrase) {\n // Should never happen\n console.error('keyIterator: no seed phrase provided')\n return []\n }\n\n const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate)\n return [\n {\n addr: new Wallet(privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n i\n ),\n privateKey,\n dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index),\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n }\n\n // So the subType is 'private-key' then\n if (!this.#privateKey) {\n // Should never happen\n console.error('keyIterator: no private key provided')\n return []\n }\n\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n const isPrivateKeyThatShouldBeDerived =\n isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n if (isPrivateKeyThatShouldBeDerived) {\n // Should never happen\n console.error(\n 'keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'\n )\n return []\n }\n\n return [\n {\n addr: new Wallet(this.#privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n 0\n ),\n privateKey: this.#privateKey,\n dedicatedToOneSA: false,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n })\n })\n }\n\n isSeedMatching(seedPhraseToCompareWith: string) {\n if (!this.#seedPhrase) return false\n\n return (\n Mnemonic.fromPhrase(this.#seedPhrase).phrase ===\n Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase\n )\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/keys/keys.d.ts b/dist/src/libs/keys/keys.d.ts new file mode 100644 index 000000000..9c9736ac3 --- /dev/null +++ b/dist/src/libs/keys/keys.d.ts @@ -0,0 +1,24 @@ +import { HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'; +import { Account, AccountId } from '../../interfaces/account'; +import { Key, KeystoreSeed, StoredKey } from '../../interfaces/keystore'; +export declare const DEFAULT_KEY_LABEL_PATTERN: RegExp; +export declare const getDefaultKeyLabel: (prevKeys: Key[], i: number) => string; +export declare const getExistingKeyLabel: (keys: Key[], addr: string, accountAdderType?: Key['type']) => string | undefined; +export declare const getAccountKeysCount: ({ accountAddr, accounts, keys }: { + accountAddr: AccountId; + accounts: Account[]; + keys: Key[]; +}) => number; +export declare function migrateKeyPreferencesToKeystoreKeys(keyPreferences: { + addr: Key['addr']; + type: Key['type']; + label: string; +}[], keystoreKeys: StoredKey[]): StoredKey[]; +export declare const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt: (keystoreKeys: StoredKey[]) => boolean; +export declare function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys: StoredKey[]): StoredKey[]; +export declare const getShouldMigrateKeystoreSeedsWithoutHdPath: (keystoreSeeds: string[] | KeystoreSeed[]) => any; +export declare function migrateKeystoreSeedsWithoutHdPathTemplate(prevKeystoreSeeds: string[]): { + seed: string; + hdPathTemplate: HD_PATH_TEMPLATE_TYPE; +}[]; +//# sourceMappingURL=keys.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/keys/keys.d.ts.map b/dist/src/libs/keys/keys.d.ts.map new file mode 100644 index 000000000..f6a2ee067 --- /dev/null +++ b/dist/src/libs/keys/keys.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../../src/libs/keys/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACnG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAExE,eAAO,MAAM,yBAAyB,QAAgB,CAAA;AACtD,eAAO,MAAM,kBAAkB,aAAc,GAAG,EAAE,KAAK,MAAM,WAI5D,CAAA;AAED,eAAO,MAAM,mBAAmB,SAAU,GAAG,EAAE,QAAQ,MAAM,qBAAqB,GAAG,CAAC,MAAM,CAAC,uBAQ5F,CAAA;AAED,eAAO,MAAM,mBAAmB;iBAKjB,SAAS;cACZ,OAAO,EAAE;UACb,GAAG,EAAE;YAKZ,CAAA;AAKD,wBAAgB,mCAAmC,CACjD,cAAc,EAAE;IACd,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,EAAE,EACH,YAAY,EAAE,SAAS,EAAE,eAa1B;AAGD,eAAO,MAAM,6CAA6C,iBAAkB,SAAS,EAAE,YAMnF,CAAA;AACJ,wBAAgB,oCAAoC,CAAC,YAAY,EAAE,SAAS,EAAE,eAO7E;AAKD,eAAO,MAAM,0CAA0C,kBACtC,MAAM,EAAE,GAAG,YAAY,EAAE,QAG0C,CAAA;AACpF,wBAAgB,yCAAyC,CACvD,iBAAiB,EAAE,MAAM,EAAE,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,qBAAqB,CAAA;CAAE,EAAE,CAK3D"} \ No newline at end of file diff --git a/dist/src/libs/keys/keys.js b/dist/src/libs/keys/keys.js new file mode 100644 index 000000000..acacf4674 --- /dev/null +++ b/dist/src/libs/keys/keys.js @@ -0,0 +1,62 @@ +import { BIP44_STANDARD_DERIVATION_TEMPLATE } from '../../consts/derivation'; +export const DEFAULT_KEY_LABEL_PATTERN = /^Key (\d+)$/; +export const getDefaultKeyLabel = (prevKeys, i) => { + const number = prevKeys.length + i + 1; + return `Key ${number}`; +}; +export const getExistingKeyLabel = (keys, addr, accountAdderType) => { + let key; + if (accountAdderType) { + key = keys.find((k) => k.addr === addr && k.type === accountAdderType); + } + else { + key = keys.find((k) => k.addr === addr); + } + return key?.label; +}; +export const getAccountKeysCount = ({ accountAddr, accounts, keys }) => { + const account = accounts.find((x) => x.addr === accountAddr); + return keys.filter((x) => account?.associatedKeys.includes(x.addr)).length; +}; +// As of version 4.33.0, we no longer store the key preferences in a separate object called keyPreferences in the storage. +// Migration is needed because each preference (like key label) +// is now part of the Key interface and managed by the KeystoreController. +export function migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys) { + return keystoreKeys.map((key) => { + if (key.label) + return key; + const keyPref = keyPreferences.find((k) => k.addr === key.addr && k.type === key.type); + if (keyPref) { + return { ...key, label: keyPref.label }; + } + return key; + }); +} +// As of version 4.33.0, we introduced createdAt prop to the Key interface to help with sorting and add more details for the Keys. +export const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys) => keystoreKeys.some((key) => { + const internalKeyWithoutMeta = key.type === 'internal' && !key.meta; + const externalKeyWithoutCreatedAt = key.type !== 'internal' && !('createdAt' in key.meta); + return internalKeyWithoutMeta || externalKeyWithoutCreatedAt; +}); +export function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys) { + return keystoreKeys.map((key) => { + if (!key.meta) + return { ...key, meta: { createdAt: null } }; + if (!key.meta.createdAt) + return { ...key, meta: { ...key.meta, createdAt: null } }; + return key; + }); +} +// As of version v4.33.0, user can change the HD path when importing a seed. +// Migration is needed because previously the HD path was not stored, +// and the default used was `BIP44_STANDARD_DERIVATION_TEMPLATE`. +export const getShouldMigrateKeystoreSeedsWithoutHdPath = (keystoreSeeds) => +// @ts-ignore TS complains, but we know that keystoreSeeds is either an array of strings or an array of objects +!!keystoreSeeds?.length && keystoreSeeds.every((seed) => typeof seed === 'string'); +export function migrateKeystoreSeedsWithoutHdPathTemplate(prevKeystoreSeeds) { + return prevKeystoreSeeds.map((seed) => ({ + seed, + hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE + })); +} +//# sourceMappingURL=keys.js.map \ No newline at end of file diff --git a/dist/src/libs/keys/keys.js.map b/dist/src/libs/keys/keys.js.map new file mode 100644 index 000000000..6209fd744 --- /dev/null +++ b/dist/src/libs/keys/keys.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/libs/keys/keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { BIP44_STANDARD_DERIVATION_TEMPLATE, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Key, KeystoreSeed, StoredKey } from '../../interfaces/keystore'\n\nexport const DEFAULT_KEY_LABEL_PATTERN = /^Key (\\d+)$/\nexport const getDefaultKeyLabel = (prevKeys: Key[], i: number) => {\n const number = prevKeys.length + i + 1\n\n return `Key ${number}`\n}\n\nexport const getExistingKeyLabel = (keys: Key[], addr: string, accountAdderType?: Key['type']) => {\n let key: Key | undefined\n if (accountAdderType) {\n key = keys.find((k) => k.addr === addr && k.type === accountAdderType)\n } else {\n key = keys.find((k) => k.addr === addr)\n }\n return key?.label\n}\n\nexport const getAccountKeysCount = ({\n accountAddr,\n accounts,\n keys\n}: {\n accountAddr: AccountId\n accounts: Account[]\n keys: Key[]\n}) => {\n const account = accounts.find((x) => x.addr === accountAddr)\n\n return keys.filter((x) => account?.associatedKeys.includes(x.addr)).length\n}\n\n// As of version 4.33.0, we no longer store the key preferences in a separate object called keyPreferences in the storage.\n// Migration is needed because each preference (like key label)\n// is now part of the Key interface and managed by the KeystoreController.\nexport function migrateKeyPreferencesToKeystoreKeys(\n keyPreferences: {\n addr: Key['addr']\n type: Key['type']\n label: string\n }[],\n keystoreKeys: StoredKey[]\n) {\n return keystoreKeys.map((key) => {\n if (key.label) return key\n\n const keyPref = keyPreferences.find((k) => k.addr === key.addr && k.type === key.type)\n\n if (keyPref) {\n return { ...key, label: keyPref.label }\n }\n\n return key\n })\n}\n\n// As of version 4.33.0, we introduced createdAt prop to the Key interface to help with sorting and add more details for the Keys.\nexport const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys: StoredKey[]) =>\n keystoreKeys.some((key) => {\n const internalKeyWithoutMeta = key.type === 'internal' && !key.meta\n const externalKeyWithoutCreatedAt = key.type !== 'internal' && !('createdAt' in key.meta)\n\n return internalKeyWithoutMeta || externalKeyWithoutCreatedAt\n })\nexport function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys: StoredKey[]) {\n return keystoreKeys.map((key) => {\n if (!key.meta) return { ...key, meta: { createdAt: null } } as StoredKey\n if (!key.meta.createdAt) return { ...key, meta: { ...key.meta, createdAt: null } } as StoredKey\n\n return key\n })\n}\n\n// As of version v4.33.0, user can change the HD path when importing a seed.\n// Migration is needed because previously the HD path was not stored,\n// and the default used was `BIP44_STANDARD_DERIVATION_TEMPLATE`.\nexport const getShouldMigrateKeystoreSeedsWithoutHdPath = (\n keystoreSeeds: string[] | KeystoreSeed[]\n) =>\n // @ts-ignore TS complains, but we know that keystoreSeeds is either an array of strings or an array of objects\n !!keystoreSeeds?.length && keystoreSeeds.every((seed) => typeof seed === 'string')\nexport function migrateKeystoreSeedsWithoutHdPathTemplate(\n prevKeystoreSeeds: string[]\n): { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }[] {\n return prevKeystoreSeeds.map((seed) => ({\n seed,\n hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE\n }))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.d.ts b/dist/src/libs/keystoreSigner/keystoreSigner.d.ts new file mode 100644 index 000000000..3f2fa5bf9 --- /dev/null +++ b/dist/src/libs/keystoreSigner/keystoreSigner.d.ts @@ -0,0 +1,13 @@ +import { TransactionRequest } from 'ethers'; +import { Key, KeystoreSigner as KeystoreSignerInterface } from '../../interfaces/keystore'; +import { TypedMessage } from '../../interfaces/userRequest'; +export declare class KeystoreSigner implements KeystoreSignerInterface { + #private; + key: Key; + constructor(_key: Key, _privKey?: string); + signRawTransaction(params: TransactionRequest): Promise; + signTypedData(typedMessage: TypedMessage): Promise; + signMessage(hex: string): Promise; + sendTransaction(transaction: TransactionRequest): Promise; +} +//# sourceMappingURL=keystoreSigner.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.d.ts.map b/dist/src/libs/keystoreSigner/keystoreSigner.d.ts.map new file mode 100644 index 000000000..e40f2d727 --- /dev/null +++ b/dist/src/libs/keystoreSigner/keystoreSigner.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"keystoreSigner.d.ts","sourceRoot":"","sources":["../../../../src/libs/keystoreSigner/keystoreSigner.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,kBAAkB,EAAU,MAAM,QAAQ,CAAA;AAE1E,OAAO,EAAE,GAAG,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,qBAAa,cAAe,YAAW,uBAAuB;;IAC5D,GAAG,EAAE,GAAG,CAAA;gBAII,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM;IASlC,kBAAkB,CAAC,MAAM,EAAE,kBAAkB;IAM7C,aAAa,CAAC,YAAY,EAAE,YAAY;IAgBxC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBzC,eAAe,CAAC,WAAW,EAAE,kBAAkB;CAKtD"} \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.js b/dist/src/libs/keystoreSigner/keystoreSigner.js new file mode 100644 index 000000000..43f5565ca --- /dev/null +++ b/dist/src/libs/keystoreSigner/keystoreSigner.js @@ -0,0 +1,49 @@ +/* eslint-disable new-cap */ +import { getBytes, isHexString, Wallet } from 'ethers'; +export class KeystoreSigner { + key; + #signer; + constructor(_key, _privKey) { + if (!_key) + throw new Error('keystoreSigner: no key provided in constructor'); + if (!_privKey) + throw new Error('keystoreSigner: no decrypted private key provided in constructor'); + this.key = _key; + this.#signer = new Wallet(_privKey); + } + async signRawTransaction(params) { + const sig = await this.#signer.signTransaction(params); + return sig; + } + async signTypedData(typedMessage) { + // remove EIP712Domain because otherwise signTypedData throws: ambiguous primary types or unused types + if (typedMessage.types.EIP712Domain) { + // eslint-disable-next-line no-param-reassign + delete typedMessage.types.EIP712Domain; + } + // @ts-ignore + const sig = await this.#signer.signTypedData(typedMessage.domain, typedMessage.types, typedMessage.message); + return sig; + } + async signMessage(hex) { + // interface implementation expects a hex number + // if something different is passed, we have two options: + // * throw an error + // * convert to hex + // converting to hex is not so straightforward, though + // you might do ethers.toUtf8Bytes() if it's a string + // or you might do ethers.toBeHex() for a number with a specific length + // or you might do ethers.hexlify() if you don't care + // therefore, it's the job of the client to think what he wants + // to pass. Throwing an error here might save debuging hours + if (!isHexString(hex)) { + throw new Error('Keystore signer, signMessage: passed value is not a hex'); + } + return this.#signer.signMessage(getBytes(hex)); + } + async sendTransaction(transaction) { + const transactionRes = await this.#signer.sendTransaction(transaction); + return transactionRes; + } +} +//# sourceMappingURL=keystoreSigner.js.map \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.js.map b/dist/src/libs/keystoreSigner/keystoreSigner.js.map new file mode 100644 index 000000000..1d51b2230 --- /dev/null +++ b/dist/src/libs/keystoreSigner/keystoreSigner.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keystoreSigner.js","sourceRoot":"","sources":["../../../../src/libs/keystoreSigner/keystoreSigner.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAK1E,MAAM,OAAO,cAAc;IACzB,GAAG,CAAK;IAER,OAAO,CAAQ;IAEf,YAAY,IAAS,EAAE,QAAiB;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAC5E,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QAErF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAA0B;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAEtD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAA0B;QAC5C,sGAAsG;QACtG,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE;YACnC,6CAA6C;YAC7C,OAAO,YAAY,CAAC,KAAK,CAAC,YAAY,CAAA;SACvC;QACD,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAC1C,YAAY,CAAC,MAAM,EACnB,YAAY,CAAC,KAAK,EAClB,YAAY,CAAC,OAAO,CACrB,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,gDAAgD;QAChD,yDAAyD;QACzD,mBAAmB;QACnB,mBAAmB;QACnB,sDAAsD;QACtD,qDAAqD;QACrD,uEAAuE;QACvE,qDAAqD;QACrD,+DAA+D;QAC/D,4DAA4D;QAC5D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;SAC3E;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAA+B;QACnD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAEtE,OAAO,cAAc,CAAA;IACvB,CAAC;CACF","sourcesContent":["/* eslint-disable new-cap */\nimport { getBytes, isHexString, TransactionRequest, Wallet } from 'ethers'\n\nimport { Key, KeystoreSigner as KeystoreSignerInterface } from '../../interfaces/keystore'\nimport { TypedMessage } from '../../interfaces/userRequest'\n\nexport class KeystoreSigner implements KeystoreSignerInterface {\n key: Key\n\n #signer: Wallet\n\n constructor(_key: Key, _privKey?: string) {\n if (!_key) throw new Error('keystoreSigner: no key provided in constructor')\n if (!_privKey)\n throw new Error('keystoreSigner: no decrypted private key provided in constructor')\n\n this.key = _key\n this.#signer = new Wallet(_privKey)\n }\n\n async signRawTransaction(params: TransactionRequest) {\n const sig = await this.#signer.signTransaction(params)\n\n return sig\n }\n\n async signTypedData(typedMessage: TypedMessage) {\n // remove EIP712Domain because otherwise signTypedData throws: ambiguous primary types or unused types\n if (typedMessage.types.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typedMessage.types.EIP712Domain\n }\n // @ts-ignore\n const sig = await this.#signer.signTypedData(\n typedMessage.domain,\n typedMessage.types,\n typedMessage.message\n )\n\n return sig\n }\n\n async signMessage(hex: string): Promise {\n // interface implementation expects a hex number\n // if something different is passed, we have two options:\n // * throw an error\n // * convert to hex\n // converting to hex is not so straightforward, though\n // you might do ethers.toUtf8Bytes() if it's a string\n // or you might do ethers.toBeHex() for a number with a specific length\n // or you might do ethers.hexlify() if you don't care\n // therefore, it's the job of the client to think what he wants\n // to pass. Throwing an error here might save debuging hours\n if (!isHexString(hex)) {\n throw new Error('Keystore signer, signMessage: passed value is not a hex')\n }\n\n return this.#signer.signMessage(getBytes(hex))\n }\n\n async sendTransaction(transaction: TransactionRequest) {\n const transactionRes = await this.#signer.sendTransaction(transaction)\n\n return transactionRes\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.d.ts b/dist/src/libs/ledger/ledger.d.ts new file mode 100644 index 000000000..ff098a2ab --- /dev/null +++ b/dist/src/libs/ledger/ledger.d.ts @@ -0,0 +1,8 @@ +/** + * Used to "translate" error codes (inside the messages) returned by the Ledger + * device into a human-readable messages. Although alongside the raw error codes + * there is a message incoming from Ledger too, it's not self-explanatory and + * can be difficult for the end users to understand. + */ +export declare const normalizeLedgerMessage: (error?: string) => string; +//# sourceMappingURL=ledger.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.d.ts.map b/dist/src/libs/ledger/ledger.d.ts.map new file mode 100644 index 000000000..e82a45fd9 --- /dev/null +++ b/dist/src/libs/ledger/ledger.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../../src/libs/ledger/ledger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,WAAY,MAAM,KAAG,MAiCvD,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.js b/dist/src/libs/ledger/ledger.js new file mode 100644 index 000000000..3b8415f5c --- /dev/null +++ b/dist/src/libs/ledger/ledger.js @@ -0,0 +1,35 @@ +/** + * Used to "translate" error codes (inside the messages) returned by the Ledger + * device into a human-readable messages. Although alongside the raw error codes + * there is a message incoming from Ledger too, it's not self-explanatory and + * can be difficult for the end users to understand. + */ +export const normalizeLedgerMessage = (error) => { + if (!error || + // Generic error returned by the Ledger transport (@ledgerhq/hw-transport) + error.toLowerCase().includes('access denied')) + return 'Cannot connect to your Ledger device. Please make sure it is connected.'; + if (error.includes('0x5515') || + error.includes('0x6b0c') || + error.includes('0x650f') || + error.includes('0x6511')) { + return 'Cannot connect to your Ledger device. Please make sure it is unlocked and running the Ethereum app.'; + } + if (error.includes('0x6e00') || error.includes('0x6b00')) { + return 'Your Ledger device requires a firmware and Ethereum App update.'; + } + if (error.includes('0x6d00')) { + return "Your Ledger doesn't recognize the command sent. Please update device firmware and Ethereum App and try again."; + } + if (error.includes('0x6985')) { + return 'Rejected by your Ledger device.'; + } + if (error.toLowerCase().includes('please enable blind signing')) { + return 'Blind Signing is disabled on your Ledger device. To sign this transaction, please enable Blind Signing (formerly called Contract Data) in the Ethereum app settings on your Ledger device, then try again.'; + } + // Indicates a custom timeout error, no need to normalize + if (error.includes('Cannot connect to your Ledger device for an extended period')) + return error; + return `Cannot connect to your Ledger device. Close all other apps that may be accessing it (including apps on your computer). Ensure device is responsive. Ensure Ledger firmware and Ethereum App are up to date. Device error: ${error}`; +}; +//# sourceMappingURL=ledger.js.map \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.js.map b/dist/src/libs/ledger/ledger.js.map new file mode 100644 index 000000000..84bb5b0d4 --- /dev/null +++ b/dist/src/libs/ledger/ledger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../../src/libs/ledger/ledger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IACE,CAAC,KAAK;QACN,0EAA0E;QAC1E,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAE7C,OAAO,yEAAyE,CAAA;IAElF,IACE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACxB;QACA,OAAO,qGAAqG,CAAA;KAC7G;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACxD,OAAO,iEAAiE,CAAA;KACzE;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,+GAA+G,CAAA;KACvH;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,iCAAiC,CAAA;KACzC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;QAC/D,OAAO,4MAA4M,CAAA;KACpN;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAAE,OAAO,KAAK,CAAA;IAE/F,OAAO,6NAA6N,KAAK,EAAE,CAAA;AAC7O,CAAC,CAAA","sourcesContent":["/**\n * Used to \"translate\" error codes (inside the messages) returned by the Ledger\n * device into a human-readable messages. Although alongside the raw error codes\n * there is a message incoming from Ledger too, it's not self-explanatory and\n * can be difficult for the end users to understand.\n */\nexport const normalizeLedgerMessage = (error?: string): string => {\n if (\n !error ||\n // Generic error returned by the Ledger transport (@ledgerhq/hw-transport)\n error.toLowerCase().includes('access denied')\n )\n return 'Cannot connect to your Ledger device. Please make sure it is connected.'\n\n if (\n error.includes('0x5515') ||\n error.includes('0x6b0c') ||\n error.includes('0x650f') ||\n error.includes('0x6511')\n ) {\n return 'Cannot connect to your Ledger device. Please make sure it is unlocked and running the Ethereum app.'\n }\n if (error.includes('0x6e00') || error.includes('0x6b00')) {\n return 'Your Ledger device requires a firmware and Ethereum App update.'\n }\n if (error.includes('0x6d00')) {\n return \"Your Ledger doesn't recognize the command sent. Please update device firmware and Ethereum App and try again.\"\n }\n if (error.includes('0x6985')) {\n return 'Rejected by your Ledger device.'\n }\n if (error.toLowerCase().includes('please enable blind signing')) {\n return 'Blind Signing is disabled on your Ledger device. To sign this transaction, please enable Blind Signing (formerly called Contract Data) in the Ethereum app settings on your Ledger device, then try again.'\n }\n\n // Indicates a custom timeout error, no need to normalize\n if (error.includes('Cannot connect to your Ledger device for an extended period')) return error\n\n return `Cannot connect to your Ledger device. Close all other apps that may be accessing it (including apps on your computer). Ensure device is responsive. Ensure Ledger firmware and Ethereum App are up to date. Device error: ${error}`\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.d.ts b/dist/src/libs/magicLink/magicLink.d.ts new file mode 100644 index 000000000..977ee262e --- /dev/null +++ b/dist/src/libs/magicLink/magicLink.d.ts @@ -0,0 +1,17 @@ +import { MagicLinkFlow } from '../../interfaces/emailVault'; +import { Fetch } from '../../interfaces/fetch'; +export interface MagicLinkData { + key: string; + secret?: String; + expiry: number; +} +export interface RequestMagicLinkResult { + success: Boolean; + data: MagicLinkData; + message: String; +} +export declare function requestMagicLink(email: String, relayerUrl: String, fetch: Fetch, options?: { + autoConfirm?: boolean; + flow?: MagicLinkFlow; +}): Promise; +//# sourceMappingURL=magicLink.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.d.ts.map b/dist/src/libs/magicLink/magicLink.d.ts.map new file mode 100644 index 000000000..7d9065e67 --- /dev/null +++ b/dist/src/libs/magicLink/magicLink.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"magicLink.d.ts","sourceRoot":"","sources":["../../../../src/libs/magicLink/magicLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAA;CAAE,GACxD,OAAO,CAAC,aAAa,CAAC,CAgBxB"} \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.js b/dist/src/libs/magicLink/magicLink.js new file mode 100644 index 000000000..ad9474fa2 --- /dev/null +++ b/dist/src/libs/magicLink/magicLink.js @@ -0,0 +1,13 @@ +export async function requestMagicLink(email, relayerUrl, fetch, options) { + const flow = options?.flow; + const resp = await fetch(`${relayerUrl}/email-vault/request-key/${email}${flow ? `?flow=${flow}` : ''}`); + const result = await resp.json(); + if (result?.data?.secret && options?.autoConfirm) + setTimeout(() => { + fetch(`${relayerUrl}/email-vault/confirm-key/${email}/${result.data.key}/${result.data.secret}`); + }, 2000); + if (!result.success) + throw new Error(`magicLink: error getting magic link: ${result.message}`); + return result.data; +} +//# sourceMappingURL=magicLink.js.map \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.js.map b/dist/src/libs/magicLink/magicLink.js.map new file mode 100644 index 000000000..abbbf9498 --- /dev/null +++ b/dist/src/libs/magicLink/magicLink.js.map @@ -0,0 +1 @@ +{"version":3,"file":"magicLink.js","sourceRoot":"","sources":["../../../../src/libs/magicLink/magicLink.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAAkB,EAClB,KAAY,EACZ,OAAyD;IAEzD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;IAE1B,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,UAAU,4BAA4B,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAA;IACD,MAAM,MAAM,GAA2B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACxD,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,EAAE,WAAW;QAC9C,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CACH,GAAG,UAAU,4BAA4B,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAC1F,CAAA;QACH,CAAC,EAAE,IAAI,CAAC,CAAA;IAEV,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9F,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC","sourcesContent":["import { MagicLinkFlow } from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport interface MagicLinkData {\n key: string\n secret?: String // this will not be return in prod mode\n expiry: number\n}\n\nexport interface RequestMagicLinkResult {\n success: Boolean\n data: MagicLinkData\n message: String\n}\n\nexport async function requestMagicLink(\n email: String,\n relayerUrl: String,\n fetch: Fetch,\n options?: { autoConfirm?: boolean; flow?: MagicLinkFlow }\n): Promise {\n const flow = options?.flow\n\n const resp = await fetch(\n `${relayerUrl}/email-vault/request-key/${email}${flow ? `?flow=${flow}` : ''}`\n )\n const result: RequestMagicLinkResult = await resp.json()\n if (result?.data?.secret && options?.autoConfirm)\n setTimeout(() => {\n fetch(\n `${relayerUrl}/email-vault/confirm-key/${email}/${result.data.key}/${result.data.secret}`\n )\n }, 2000)\n\n if (!result.success) throw new Error(`magicLink: error getting magic link: ${result.message}`)\n return result.data\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/main/main.d.ts b/dist/src/libs/main/main.d.ts new file mode 100644 index 000000000..35e1fb4b8 --- /dev/null +++ b/dist/src/libs/main/main.d.ts @@ -0,0 +1,38 @@ +import { AccountOpAction, Action } from '../../controllers/actions/actions'; +import { Account, AccountId } from '../../interfaces/account'; +import { DappProviderRequest } from '../../interfaces/dapp'; +import { Network, NetworkId } from '../../interfaces/network'; +import { DappUserRequest, UserRequest } from '../../interfaces/userRequest'; +import { AccountOp } from '../accountOp/accountOp'; +import { Call } from '../accountOp/types'; +export declare const batchCallsFromUserRequests: ({ accountAddr, networkId, userRequests }: { + accountAddr: AccountId; + networkId: NetworkId; + userRequests: UserRequest[]; +}) => Call[]; +export declare const ACCOUNT_SWITCH_USER_REQUEST = "ACCOUNT_SWITCH_USER_REQUEST"; +export declare const buildSwitchAccountUserRequest: ({ nextUserRequest, selectedAccountAddr, networkId, session, dappPromise }: { + nextUserRequest: UserRequest; + selectedAccountAddr: string; + networkId: Network['id']; + session: DappProviderRequest['session']; + dappPromise: DappUserRequest['dappPromise']; +}) => UserRequest; +export declare const makeSmartAccountOpAction: ({ account, networkId, nonce, actionsQueue, userRequests, entryPointAuthorizationSignature }: { + account: Account; + networkId: string; + nonce: bigint | null; + actionsQueue: Action[]; + userRequests: UserRequest[]; + entryPointAuthorizationSignature?: string | undefined; +}) => AccountOpAction; +export declare const makeBasicAccountOpAction: ({ account, networkId, nonce, userRequest }: { + account: Account; + networkId: string; + nonce: bigint | null; + userRequest: UserRequest; +}) => AccountOpAction; +export declare const getAccountOpsForSimulation: (account: Account, visibleActionsQueue: Action[], network?: Network, op?: AccountOp | null) => { + [key: string]: AccountOp[]; +}; +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/main/main.d.ts.map b/dist/src/libs/main/main.d.ts.map new file mode 100644 index 000000000..69a747724 --- /dev/null +++ b/dist/src/libs/main/main.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../src/libs/main/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAS,eAAe,EAAmB,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAGnG,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAIzC,eAAO,MAAM,0BAA0B;iBAKxB,SAAS;eACX,SAAS;kBACN,WAAW,EAAE;MACzB,IAAI,EAWP,CAAA;AAED,eAAO,MAAM,2BAA2B,gCAAgC,CAAA;AAExE,eAAO,MAAM,6BAA6B;qBAOvB,WAAW;yBACP,MAAM;eAChB,OAAO,CAAC,IAAI,CAAC;aACf,mBAAmB,CAAC,SAAS,CAAC;iBAC1B,eAAe,CAAC,aAAa,CAAC;MACzC,WAqBH,CAAA;AAED,eAAO,MAAM,wBAAwB;aAQ1B,OAAO;eACL,MAAM;WACV,MAAM,GAAG,IAAI;kBACN,MAAM,EAAE;kBACR,WAAW,EAAE;;MAEzB,eAyDH,CAAA;AAED,eAAO,MAAM,wBAAwB;aAM1B,OAAO;eACL,MAAM;WACV,MAAM,GAAG,IAAI;iBACP,WAAW;MACtB,eAqBH,CAAA;AAED,eAAO,MAAM,0BAA0B,YAC5B,OAAO,uBACK,MAAM,EAAE,YACnB,OAAO,OACZ,SAAS,GAAG,IAAI;;CActB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/main/main.js b/dist/src/libs/main/main.js new file mode 100644 index 000000000..63823e02c --- /dev/null +++ b/dist/src/libs/main/main.js @@ -0,0 +1,118 @@ +import generateSpoofSig from '../../utils/generateSpoofSig'; +import { isSmartAccount } from '../account/account'; +import { getAccountOpsByNetwork } from '../actions/actions'; +import { adjustEntryPointAuthorization } from '../signMessage/signMessage'; +export const batchCallsFromUserRequests = ({ accountAddr, networkId, userRequests }) => { + return userRequests.filter((r) => r.action.kind === 'calls').reduce((uCalls, req) => { + if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) { + const { calls } = req.action; + calls.forEach((call) => uCalls.push({ ...call, fromUserRequestId: req.id })); + } + return uCalls; + }, []); +}; +export const ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'; +export const buildSwitchAccountUserRequest = ({ nextUserRequest, selectedAccountAddr, networkId, session, dappPromise }) => { + return { + id: ACCOUNT_SWITCH_USER_REQUEST, + action: { + kind: 'switchAccount', + params: { + accountAddr: selectedAccountAddr, + switchToAccountAddr: nextUserRequest.meta.accountAddr, + nextRequestType: nextUserRequest.action.kind, + networkId + } + }, + session, + meta: { + isSignAction: false + }, + dappPromise: { + ...dappPromise, + resolve: () => { } + } + }; +}; +export const makeSmartAccountOpAction = ({ account, networkId, nonce, actionsQueue, userRequests, entryPointAuthorizationSignature }) => { + const accountOpAction = actionsQueue.find((a) => a.type === 'accountOp' && a.id === `${account.addr}-${networkId}`); + if (accountOpAction) { + accountOpAction.accountOp.calls = batchCallsFromUserRequests({ + accountAddr: account.addr, + networkId, + userRequests + }); + // the nonce might have changed during estimation because of + // a nonce discrepancy issue. This makes sure we're with the + // latest nonce should the user decide to batch + accountOpAction.accountOp.nonce = nonce; + return accountOpAction; + } + // find the user request with a paymaster service + const userReqWithPaymasterService = userRequests.find((req) => req.meta.accountAddr === account.addr && + req.meta.networkId === networkId && + req.meta.paymasterService); + const paymasterService = userReqWithPaymasterService + ? userReqWithPaymasterService.meta.paymasterService + : undefined; + const accountOp = { + accountAddr: account.addr, + networkId, + signingKeyAddr: null, + signingKeyType: null, + gasLimit: null, + gasFeePayment: null, + nonce, + signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null, + accountOpToExecuteBefore: null, + calls: batchCallsFromUserRequests({ + accountAddr: account.addr, + networkId, + userRequests + }), + meta: { + entryPointAuthorization: entryPointAuthorizationSignature + ? adjustEntryPointAuthorization(entryPointAuthorizationSignature) + : undefined, + paymasterService + } + }; + return { + id: `${account.addr}-${networkId}`, + type: 'accountOp', + accountOp + }; +}; +export const makeBasicAccountOpAction = ({ account, networkId, nonce, userRequest }) => { + const { calls } = userRequest.action; + const accountOp = { + accountAddr: account.addr, + networkId, + signingKeyAddr: null, + signingKeyType: null, + gasLimit: null, + gasFeePayment: null, + nonce, + signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null, + accountOpToExecuteBefore: null, + calls: calls.map((call) => ({ ...call, fromUserRequestId: userRequest.id })) + }; + return { + // BA accountOpAction id same as the userRequest's id because for each call we have an action + id: userRequest.id, + type: 'accountOp', + accountOp + }; +}; +export const getAccountOpsForSimulation = (account, visibleActionsQueue, network, op) => { + const isSmart = isSmartAccount(account); + // if there's an op and the account is either smart or the network supports + // state override, we pass it along. We do not support simulation for + // EOAs on networks without state override (but it works for SA) + if (op && (isSmart || (network && !network.rpcNoStateOverride))) + return { [op.networkId]: [op] }; + if (isSmart) + return getAccountOpsByNetwork(account.addr, visibleActionsQueue) || {}; + return {}; +}; +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/src/libs/main/main.js.map b/dist/src/libs/main/main.js.map new file mode 100644 index 000000000..aaee1632b --- /dev/null +++ b/dist/src/libs/main/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/libs/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport generateSpoofSig from '../../utils/generateSpoofSig'\nimport { isSmartAccount } from '../account/account'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getAccountOpsByNetwork } from '../actions/actions'\nimport { adjustEntryPointAuthorization } from '../signMessage/signMessage'\n\nexport const batchCallsFromUserRequests = ({\n accountAddr,\n networkId,\n userRequests\n}: {\n accountAddr: AccountId\n networkId: NetworkId\n userRequests: UserRequest[]\n}): Call[] => {\n return (userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.forEach((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n}\n\nexport const ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'\n\nexport const buildSwitchAccountUserRequest = ({\n nextUserRequest,\n selectedAccountAddr,\n networkId,\n session,\n dappPromise\n}: {\n nextUserRequest: UserRequest\n selectedAccountAddr: string\n networkId: Network['id']\n session: DappProviderRequest['session']\n dappPromise: DappUserRequest['dappPromise']\n}): UserRequest => {\n return {\n id: ACCOUNT_SWITCH_USER_REQUEST,\n action: {\n kind: 'switchAccount',\n params: {\n accountAddr: selectedAccountAddr,\n switchToAccountAddr: nextUserRequest.meta.accountAddr,\n nextRequestType: nextUserRequest.action.kind,\n networkId\n }\n },\n session,\n meta: {\n isSignAction: false\n },\n dappPromise: {\n ...dappPromise,\n resolve: () => {}\n }\n }\n}\n\nexport const makeSmartAccountOpAction = ({\n account,\n networkId,\n nonce,\n actionsQueue,\n userRequests,\n entryPointAuthorizationSignature\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n actionsQueue: Action[]\n userRequests: UserRequest[]\n entryPointAuthorizationSignature?: string\n}): AccountOpAction => {\n const accountOpAction = actionsQueue.find(\n (a) => a.type === 'accountOp' && a.id === `${account.addr}-${networkId}`\n ) as AccountOpAction | undefined\n\n if (accountOpAction) {\n accountOpAction.accountOp.calls = batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n })\n // the nonce might have changed during estimation because of\n // a nonce discrepancy issue. This makes sure we're with the\n // latest nonce should the user decide to batch\n accountOpAction.accountOp.nonce = nonce\n return accountOpAction\n }\n\n // find the user request with a paymaster service\n const userReqWithPaymasterService = userRequests.find(\n (req) =>\n req.meta.accountAddr === account.addr &&\n req.meta.networkId === networkId &&\n req.meta.paymasterService\n )\n const paymasterService = userReqWithPaymasterService\n ? userReqWithPaymasterService.meta.paymasterService\n : undefined\n\n const accountOp: AccountOpAction['accountOp'] = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n }),\n meta: {\n entryPointAuthorization: entryPointAuthorizationSignature\n ? adjustEntryPointAuthorization(entryPointAuthorizationSignature)\n : undefined,\n paymasterService\n }\n }\n\n return {\n id: `${account.addr}-${networkId}`, // SA accountOpAction id\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const makeBasicAccountOpAction = ({\n account,\n networkId,\n nonce,\n userRequest\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n userRequest: UserRequest\n}): AccountOpAction => {\n const { calls } = userRequest.action as Calls\n const accountOp = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: calls.map((call) => ({ ...call, fromUserRequestId: userRequest.id }))\n }\n\n return {\n // BA accountOpAction id same as the userRequest's id because for each call we have an action\n id: userRequest.id,\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const getAccountOpsForSimulation = (\n account: Account,\n visibleActionsQueue: Action[],\n network?: Network,\n op?: AccountOp | null\n): {\n [key: string]: AccountOp[]\n} => {\n const isSmart = isSmartAccount(account)\n\n // if there's an op and the account is either smart or the network supports\n // state override, we pass it along. We do not support simulation for\n // EOAs on networks without state override (but it works for SA)\n if (op && (isSmart || (network && !network.rpcNoStateOverride))) return { [op.networkId]: [op] }\n\n if (isSmart) return getAccountOpsByNetwork(account.addr, visibleActionsQueue) || {}\n\n return {}\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/networks/networks.d.ts b/dist/src/libs/networks/networks.d.ts new file mode 100644 index 000000000..e12c8f56d --- /dev/null +++ b/dist/src/libs/networks/networks.d.ts @@ -0,0 +1,24 @@ +import { Fetch } from '../../interfaces/fetch'; +import { Network, NetworkFeature, NetworkId, NetworkInfo, NetworkInfoLoading } from '../../interfaces/network'; +import { RPCProviders } from '../../interfaces/provider'; +export declare const relayerAdditionalNetworks: { + chainId: bigint; + name: string; +}[]; +export declare function is4337Enabled(hasBundlerSupport: boolean, network?: Network, force4337?: boolean): boolean; +export declare const getNetworksWithFailedRPC: ({ providers }: { + providers: RPCProviders; +}) => string[]; +export declare function getNetworkInfo(fetch: Fetch, rpcUrl: string, chainId: bigint, callback: (networkInfo: NetworkInfoLoading) => void, optionalArgs?: { + force4337?: boolean; +}): Promise; +export declare function getFeaturesByNetworkProperties(networkInfo: NetworkInfo | NetworkInfoLoading | undefined): NetworkFeature[]; +export declare function getFeatures(networkInfo: NetworkInfoLoading | undefined): NetworkFeature[]; +export declare function migrateNetworkPreferencesToNetworks(networkPreferences: { + [key: NetworkId]: Partial; +}): Promise<{ + [key: string]: Network; +}>; +export declare function canForce4337(network?: Network): boolean | undefined; +export declare function hasRelayerSupport(network: Network): boolean; +//# sourceMappingURL=networks.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/networks/networks.d.ts.map b/dist/src/libs/networks/networks.d.ts.map new file mode 100644 index 000000000..883bc439c --- /dev/null +++ b/dist/src/libs/networks/networks.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../../../src/libs/networks/networks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAEL,OAAO,EACP,cAAc,EACd,SAAS,EACT,WAAW,EACX,kBAAkB,EACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAMxD,eAAO,MAAM,yBAAyB;;;GAiBrC,CAAA;AAQD,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,OAAO,EAC1B,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAWT;AAED,eAAO,MAAM,wBAAwB;eAAgC,YAAY;MAAK,MAAM,EAK3F,CAAA;AAgBD,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,KAAK,IAAI,EAChE,YAAY,CAAC,EAAE;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,iBA4HF;AAGD,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS,GACrE,cAAc,EAAE,CA2IlB;AAID,wBAAgB,WAAW,CACzB,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS,GACvD,cAAc,EAAE,CAElB;AASD,wBAAsB,mCAAmC,CAAC,kBAAkB,EAAE;IAC5E,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACnC;;GA0CA;AAGD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,uBAE7C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,WAIjD"} \ No newline at end of file diff --git a/dist/src/libs/networks/networks.js b/dist/src/libs/networks/networks.js new file mode 100644 index 000000000..f74b4712e --- /dev/null +++ b/dist/src/libs/networks/networks.js @@ -0,0 +1,323 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { AMBIRE_ACCOUNT_FACTORY, OPTIMISTIC_ORACLE, SINGLETON } from '../../consts/deploy'; +import { networks as predefinedNetworks } from '../../consts/networks'; +import { Bundler } from '../../services/bundlers/bundler'; +import { getRpcProvider } from '../../services/provider'; +import { getSASupport } from '../deployless/simulateDeployCall'; +// bnb, gnosis, fantom, metis +export const relayerAdditionalNetworks = [ + { + chainId: 56n, + name: 'binance-smart-chain' + }, + { + chainId: 100n, + name: 'gnosis' + }, + { + chainId: 250n, + name: 'fantom' + }, + { + chainId: 1088n, + name: 'andromeda' + } +]; +// 4337 network support +// if it is supported on the network (hasBundlerSupport), +// we check if the user has specifically enabled it through settings (force4337) +// if he has not, we check if the network is predefinedNetwork and we +// have specifically disabled 4337 +// finally, we fallback to the bundler support +export function is4337Enabled(hasBundlerSupport, network, force4337) { + if (!hasBundlerSupport) + return false; + // the user has chosen to use 4337 + if (force4337 !== undefined) + return force4337; + // if we have set it specifically + if (network && network.predefined) + return network.erc4337.enabled; + // this will be true in this case + return hasBundlerSupport; +} +export const getNetworksWithFailedRPC = ({ providers }) => { + return Object.keys(providers).filter((networkId) => typeof providers[networkId].isWorking === 'boolean' && !providers[networkId].isWorking); +}; +async function retryRequest(init, counter = 0) { + if (counter >= 2) { + throw new Error('flagged'); + } + const promise = init(); + const result = await promise.catch(async () => { + const retryRes = await retryRequest(init, counter + 1); + return retryRes; + }); + return result; +} +export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalArgs) { + let networkInfo = { + force4337: optionalArgs?.force4337, + chainId, + isSAEnabled: 'LOADING', + hasSingleton: 'LOADING', + isOptimistic: 'LOADING', + rpcNoStateOverride: 'LOADING', + erc4337: 'LOADING', + areContractsDeployed: 'LOADING', + feeOptions: 'LOADING', + platformId: 'LOADING', + nativeAssetId: 'LOADING', + flagged: 'LOADING' + }; + callback(networkInfo); + const timeout = (time = 30000) => { + return new Promise((resolve) => { + setTimeout(resolve, time, 'timeout reached'); + }); + }; + let flagged = false; + const provider = getRpcProvider([rpcUrl], chainId); + const raiseFlagged = (e, returnData) => { + if (e.message === 'flagged') { + flagged = true; + } + return returnData; + }; + const info = await Promise.race([ + Promise.all([ + (async () => { + const responses = await Promise.all([ + retryRequest(() => provider.getCode(SINGLETON)), + retryRequest(() => provider.getCode(AMBIRE_ACCOUNT_FACTORY)), + retryRequest(() => getSASupport(provider)), + Bundler.isNetworkSupported(fetch, chainId).catch(() => false) + // retryRequest(() => provider.getCode(ERC_4337_ENTRYPOINT)), + ]).catch((e) => raiseFlagged(e, ['0x', '0x', { addressMatches: false, supportsStateOverride: false }])); + const [singletonCode, factoryCode, saSupport, hasBundlerSupport] = responses; + const areContractsDeployed = factoryCode !== '0x'; + // const has4337 = entryPointCode !== '0x' && hasBundler + const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId); + // Ambire support is as follows: + // - either the addresses match after simulation, that's perfect + // - or we can't do the simulation with this RPC but we have the factory + // deployed on the network + const supportsAmbire = saSupport.addressMatches || (!saSupport.supportsStateOverride && areContractsDeployed); + networkInfo = { + ...networkInfo, + hasSingleton: singletonCode !== '0x', + isSAEnabled: supportsAmbire && singletonCode !== '0x', + areContractsDeployed, + rpcNoStateOverride: predefinedNetwork && predefinedNetwork.rpcNoStateOverride === true + ? true + : !saSupport.supportsStateOverride, + erc4337: { + enabled: is4337Enabled(hasBundlerSupport, predefinedNetwork, optionalArgs?.force4337), + hasPaymaster: predefinedNetwork ? predefinedNetwork.erc4337.hasPaymaster : false, + hasBundlerSupport + } + }; + callback(networkInfo); + })(), + (async () => { + const oracleCode = await retryRequest(() => provider.getCode(OPTIMISTIC_ORACLE)).catch((e) => raiseFlagged(e, '0x')); + const isOptimistic = oracleCode !== '0x'; + networkInfo = { ...networkInfo, isOptimistic }; + callback(networkInfo); + })(), + (async () => { + const block = await retryRequest(() => provider.getBlock('latest')).catch((e) => raiseFlagged(e, null)); + const feeOptions = { is1559: block?.baseFeePerGas !== null }; + networkInfo = { ...networkInfo, feeOptions }; + callback(networkInfo); + })(), + (async () => { + const coingeckoRequest = await fetch(`https://cena.ambire.com/api/v3/platform/${Number(chainId)}`).catch(() => ({ + error: 'currently, we cannot fetch the coingecko information' + })); + // set the coingecko info + let platformId = null; + let nativeAssetId = null; + if (!('error' in coingeckoRequest)) { + const coingeckoInfo = await coingeckoRequest.json(); + if (!coingeckoInfo.error) { + platformId = coingeckoInfo.platformId; + nativeAssetId = coingeckoInfo.nativeAssetId; + } + } + networkInfo = { ...networkInfo, platformId, nativeAssetId }; + callback(networkInfo); + })() + ]), + timeout() + ]); + networkInfo = { ...networkInfo, flagged: flagged || info === 'timeout reached' }; + callback(networkInfo); + provider.destroy(); +} +// call this if you have the network props already calculated +export function getFeaturesByNetworkProperties(networkInfo) { + const features = [ + { + id: 'saSupport', + title: 'Ambire Smart Accounts', + level: 'loading' + }, + { + id: 'simulation', + title: 'Transaction simulation', + level: 'loading' + }, + { + id: 'prices', + title: 'Token prices', + level: 'loading' + } + ]; + if (!networkInfo) + return features.map((f) => ({ ...f, level: 'initial' })); + const { flagged, isSAEnabled, areContractsDeployed, erc4337, rpcNoStateOverride, nativeAssetId, chainId, hasSingleton, force4337 } = networkInfo; + const updateFeature = (id, update) => { + const foundFeature = features.find((f) => f.id === id); + if (foundFeature) { + Object.assign(foundFeature, update); + } + }; + if (flagged && flagged !== 'LOADING') { + return [ + { + id: 'flagged', + title: 'RPC error', + level: 'danger', + msg: 'We were unable to fetch the network information with the provided RPC. Try choosing a different RPC.' + } + ]; + } + if ([isSAEnabled, areContractsDeployed, erc4337, hasSingleton, force4337].every((p) => p !== 'LOADING')) { + if (!isSAEnabled) { + updateFeature('saSupport', { + level: 'danger', + title: 'Smart contract wallets are not supported', + msg: hasSingleton + ? 'We were unable to detect Smart Account support on the network with the provided RPC. Try choosing a different RPC.' + : 'Unfortunately, this network doesn’t support Smart Accounts. It can be used only with Basic Accounts (EOAs).' + }); + } + const predefinedNetSettings = predefinedNetworks.find((net) => net.chainId === chainId); + const erc4337Settings = { + enabled: is4337Enabled(erc4337.enabled, predefinedNetSettings, force4337), + hasPaymaster: predefinedNetSettings + ? predefinedNetSettings.erc4337.hasPaymaster + : erc4337.hasPaymaster + }; + const title = erc4337Settings?.enabled + ? 'Ambire Smart Accounts via ERC-4337 (Account Abstraction)' + : 'Ambire Smart Accounts'; + if (isSAEnabled && areContractsDeployed) { + updateFeature('saSupport', { + title, + level: 'success', + msg: "This network supports Smart Accounts, and Ambire Wallet's smart contracts are deployed." + }); + } + else if (isSAEnabled && !areContractsDeployed) { + updateFeature('saSupport', { + title, + level: 'warning', + msg: "This network supports Smart Accounts, but Ambire Wallet's contracts have not yet been deployed. You can deploy them by using a Basic Account and the Deploy contracts option to unlock the Smart Accounts feature. Otherwise, only Basic Accounts (EOAs) can be used on this network." + }); + } + } + if ([rpcNoStateOverride].every((p) => p !== 'LOADING')) { + const isPredefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId); + if (!rpcNoStateOverride && isPredefinedNetwork) { + updateFeature('simulation', { + level: 'success', + title: 'Transaction simulation is fully supported', + msg: 'Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security.' + }); + } + else if (!rpcNoStateOverride) { + updateFeature('simulation', { + level: 'warning', + title: 'Transaction simulation is partially supported', + msg: 'Transaction simulation, one of our security features that predicts the outcome of a transaction before it is broadcast to the blockchain, is not fully functioning on this chain. The reasons might be network or RPC limitations. Try choosing a different RPC.' + }); + } + else { + updateFeature('simulation', { + level: 'danger', + title: 'Transaction simulation is not supported', + msg: "Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security. Unfortunately, this feature isn't available for the current network or RPC. Try choosing a different RPC." + }); + } + } + if (nativeAssetId !== 'LOADING') { + const hasNativeAssetId = nativeAssetId && nativeAssetId !== ''; + updateFeature('prices', { + level: hasNativeAssetId ? 'success' : 'danger', + msg: hasNativeAssetId + ? 'We pull token price information in real-time using third-party providers.' + : "Our third-party providers don't support this network yet, so we cannot show token prices." + }); + } + return features; +} +// call this if you have only the rpcUrls and chainId +// this method makes an RPC request, calculates the network info and returns the features +export function getFeatures(networkInfo) { + return getFeaturesByNetworkProperties(networkInfo); +} +// Since v4.24.0, a new Network interface has been introduced, +// that replaces the old NetworkDescriptor, NetworkPreference, and CustomNetwork. +// Previously, only NetworkPreferences were stored, with other network properties +// being calculated in a getter each time the networks were needed. +// Now, all network properties are pre-calculated and stored in a structured format: { [key: NetworkId]: Network } in the storage. +// This function migrates the data from the old NetworkPreferences to the new structure +// to ensure compatibility and prevent breaking the extension after updating to v4.24.0 +export async function migrateNetworkPreferencesToNetworks(networkPreferences) { + const predefinedNetworkIds = predefinedNetworks.map((n) => n.id); + const customNetworkIds = Object.keys(networkPreferences).filter((k) => !predefinedNetworkIds.includes(k)); + const networksToStore = {}; + predefinedNetworks.forEach((n) => { + networksToStore[n.id] = n; + }); + customNetworkIds.forEach((networkId) => { + const preference = networkPreferences[networkId]; + const networkInfo = { + chainId: preference.chainId, + isSAEnabled: preference.isSAEnabled ?? false, + isOptimistic: preference.isOptimistic ?? false, + rpcNoStateOverride: preference.rpcNoStateOverride ?? true, + erc4337: preference.erc4337 ?? { + enabled: false, + hasPaymaster: false, + hasBundlerSupport: false + }, + areContractsDeployed: preference.areContractsDeployed ?? false, + feeOptions: { is1559: preference.is1559 ?? false }, + platformId: preference.platformId ?? '', + nativeAssetId: preference.nativeAssetId ?? '', + flagged: preference.flagged ?? false, + hasSingleton: preference.hasSingleton ?? false + }; + delete preference.is1559; + networksToStore[networkId] = { + id: networkId, + ...preference, + ...networkInfo, + features: getFeaturesByNetworkProperties(networkInfo), + hasRelayer: !!relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId), + predefined: false + }; + }); + return networksToStore; +} +// is the user allowed to change the network settings to 4337 +export function canForce4337(network) { + return network && network.allowForce4337; +} +export function hasRelayerSupport(network) { + return (network.hasRelayer || !!relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)); +} +//# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/libs/networks/networks.js.map b/dist/src/libs/networks/networks.js.map new file mode 100644 index 000000000..b30d9e885 --- /dev/null +++ b/dist/src/libs/networks/networks.js.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/libs/networks/networks.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nimport { AMBIRE_ACCOUNT_FACTORY, OPTIMISTIC_ORACLE, SINGLETON } from '../../consts/deploy'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n Erc4337settings,\n Network,\n NetworkFeature,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSASupport } from '../deployless/simulateDeployCall'\n\n// bnb, gnosis, fantom, metis\nexport const relayerAdditionalNetworks = [\n {\n chainId: 56n,\n name: 'binance-smart-chain'\n },\n {\n chainId: 100n,\n name: 'gnosis'\n },\n {\n chainId: 250n,\n name: 'fantom'\n },\n {\n chainId: 1088n,\n name: 'andromeda'\n }\n]\n\n// 4337 network support\n// if it is supported on the network (hasBundlerSupport),\n// we check if the user has specifically enabled it through settings (force4337)\n// if he has not, we check if the network is predefinedNetwork and we\n// have specifically disabled 4337\n// finally, we fallback to the bundler support\nexport function is4337Enabled(\n hasBundlerSupport: boolean,\n network?: Network,\n force4337?: boolean\n): boolean {\n if (!hasBundlerSupport) return false\n\n // the user has chosen to use 4337\n if (force4337 !== undefined) return force4337 as boolean\n\n // if we have set it specifically\n if (network && network.predefined) return network.erc4337.enabled\n\n // this will be true in this case\n return hasBundlerSupport\n}\n\nexport const getNetworksWithFailedRPC = ({ providers }: { providers: RPCProviders }): string[] => {\n return Object.keys(providers).filter(\n (networkId) =>\n typeof providers[networkId].isWorking === 'boolean' && !providers[networkId].isWorking\n )\n}\n\nasync function retryRequest(init: Function, counter = 0): Promise {\n if (counter >= 2) {\n throw new Error('flagged')\n }\n\n const promise: Promise = init()\n const result = await promise.catch(async () => {\n const retryRes = await retryRequest(init, counter + 1)\n return retryRes\n })\n\n return result\n}\n\nexport async function getNetworkInfo(\n fetch: Fetch,\n rpcUrl: string,\n chainId: bigint,\n callback: (networkInfo: NetworkInfoLoading) => void,\n optionalArgs?: {\n force4337?: boolean\n }\n) {\n let networkInfo: NetworkInfoLoading = {\n force4337: optionalArgs?.force4337,\n chainId,\n isSAEnabled: 'LOADING',\n hasSingleton: 'LOADING',\n isOptimistic: 'LOADING',\n rpcNoStateOverride: 'LOADING',\n erc4337: 'LOADING',\n areContractsDeployed: 'LOADING',\n feeOptions: 'LOADING',\n platformId: 'LOADING',\n nativeAssetId: 'LOADING',\n flagged: 'LOADING'\n }\n callback(networkInfo)\n\n const timeout = (time: number = 30000): Promise<'timeout reached'> => {\n return new Promise((resolve) => {\n setTimeout(resolve, time, 'timeout reached')\n }) as unknown as Promise<'timeout reached'>\n }\n\n let flagged = false\n const provider = getRpcProvider([rpcUrl], chainId)\n\n const raiseFlagged = (e: Error, returnData: any): any => {\n if (e.message === 'flagged') {\n flagged = true\n }\n\n return returnData\n }\n\n const info = await Promise.race([\n Promise.all([\n (async () => {\n const responses = await Promise.all([\n retryRequest(() => provider.getCode(SINGLETON)),\n retryRequest(() => provider.getCode(AMBIRE_ACCOUNT_FACTORY)),\n retryRequest(() => getSASupport(provider)),\n Bundler.isNetworkSupported(fetch, chainId).catch(() => false)\n // retryRequest(() => provider.getCode(ERC_4337_ENTRYPOINT)),\n ]).catch((e: Error) =>\n raiseFlagged(e, ['0x', '0x', { addressMatches: false, supportsStateOverride: false }])\n )\n const [singletonCode, factoryCode, saSupport, hasBundlerSupport] = responses\n const areContractsDeployed = factoryCode !== '0x'\n // const has4337 = entryPointCode !== '0x' && hasBundler\n const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n\n // Ambire support is as follows:\n // - either the addresses match after simulation, that's perfect\n // - or we can't do the simulation with this RPC but we have the factory\n // deployed on the network\n const supportsAmbire =\n saSupport.addressMatches || (!saSupport.supportsStateOverride && areContractsDeployed)\n networkInfo = {\n ...networkInfo,\n hasSingleton: singletonCode !== '0x',\n isSAEnabled: supportsAmbire && singletonCode !== '0x',\n areContractsDeployed,\n rpcNoStateOverride:\n predefinedNetwork && predefinedNetwork.rpcNoStateOverride === true\n ? true\n : !saSupport.supportsStateOverride,\n erc4337: {\n enabled: is4337Enabled(hasBundlerSupport, predefinedNetwork, optionalArgs?.force4337),\n hasPaymaster: predefinedNetwork ? predefinedNetwork.erc4337.hasPaymaster : false,\n hasBundlerSupport\n }\n }\n\n callback(networkInfo)\n })(),\n (async () => {\n const oracleCode = await retryRequest(() => provider.getCode(OPTIMISTIC_ORACLE)).catch(\n (e: Error) => raiseFlagged(e, '0x')\n )\n const isOptimistic = oracleCode !== '0x'\n\n networkInfo = { ...networkInfo, isOptimistic }\n\n callback(networkInfo)\n })(),\n (async () => {\n const block = await retryRequest(() => provider.getBlock('latest')).catch((e: Error) =>\n raiseFlagged(e, null)\n )\n const feeOptions = { is1559: block?.baseFeePerGas !== null }\n\n networkInfo = { ...networkInfo, feeOptions }\n\n callback(networkInfo)\n })(),\n (async () => {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n // set the coingecko info\n let platformId = null\n let nativeAssetId = null\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n networkInfo = { ...networkInfo, platformId, nativeAssetId }\n\n callback(networkInfo)\n })()\n ]),\n timeout()\n ])\n\n networkInfo = { ...networkInfo, flagged: flagged || info === 'timeout reached' }\n callback(networkInfo)\n\n provider.destroy()\n}\n\n// call this if you have the network props already calculated\nexport function getFeaturesByNetworkProperties(\n networkInfo: NetworkInfo | NetworkInfoLoading | undefined\n): NetworkFeature[] {\n const features: NetworkFeature[] = [\n {\n id: 'saSupport',\n title: 'Ambire Smart Accounts',\n level: 'loading'\n },\n {\n id: 'simulation',\n title: 'Transaction simulation',\n level: 'loading'\n },\n {\n id: 'prices',\n title: 'Token prices',\n level: 'loading'\n }\n ]\n\n if (!networkInfo) return features.map((f) => ({ ...f, level: 'initial' }))\n\n const {\n flagged,\n isSAEnabled,\n areContractsDeployed,\n erc4337,\n rpcNoStateOverride,\n nativeAssetId,\n chainId,\n hasSingleton,\n force4337\n } = networkInfo\n\n const updateFeature = (\n id: string,\n update: {\n msg: string\n title?: string\n level: 'success' | 'danger' | 'warning' | 'loading'\n }\n ) => {\n const foundFeature = features.find((f) => f.id === id)\n\n if (foundFeature) {\n Object.assign(foundFeature, update)\n }\n }\n if (flagged && flagged !== 'LOADING') {\n return [\n {\n id: 'flagged',\n title: 'RPC error',\n level: 'danger',\n msg: 'We were unable to fetch the network information with the provided RPC. Try choosing a different RPC.'\n }\n ]\n }\n\n if (\n [isSAEnabled, areContractsDeployed, erc4337, hasSingleton, force4337].every(\n (p) => p !== 'LOADING'\n )\n ) {\n if (!isSAEnabled) {\n updateFeature('saSupport', {\n level: 'danger',\n title: 'Smart contract wallets are not supported',\n msg: hasSingleton\n ? 'We were unable to detect Smart Account support on the network with the provided RPC. Try choosing a different RPC.'\n : 'Unfortunately, this network doesn’t support Smart Accounts. It can be used only with Basic Accounts (EOAs).'\n })\n }\n\n const predefinedNetSettings = predefinedNetworks.find((net) => net.chainId === chainId)\n\n const erc4337Settings = {\n enabled: is4337Enabled(\n (erc4337 as Erc4337settings).enabled,\n predefinedNetSettings,\n force4337 as boolean | undefined\n ),\n hasPaymaster: predefinedNetSettings\n ? predefinedNetSettings.erc4337.hasPaymaster\n : (erc4337 as Erc4337settings).hasPaymaster\n }\n\n const title = (erc4337Settings as any)?.enabled\n ? 'Ambire Smart Accounts via ERC-4337 (Account Abstraction)'\n : 'Ambire Smart Accounts'\n\n if (isSAEnabled && areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'success',\n msg: \"This network supports Smart Accounts, and Ambire Wallet's smart contracts are deployed.\"\n })\n } else if (isSAEnabled && !areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'warning',\n msg: \"This network supports Smart Accounts, but Ambire Wallet's contracts have not yet been deployed. You can deploy them by using a Basic Account and the Deploy contracts option to unlock the Smart Accounts feature. Otherwise, only Basic Accounts (EOAs) can be used on this network.\"\n })\n }\n }\n\n if ([rpcNoStateOverride].every((p) => p !== 'LOADING')) {\n const isPredefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n if (!rpcNoStateOverride && isPredefinedNetwork) {\n updateFeature('simulation', {\n level: 'success',\n title: 'Transaction simulation is fully supported',\n msg: 'Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security.'\n })\n } else if (!rpcNoStateOverride) {\n updateFeature('simulation', {\n level: 'warning',\n title: 'Transaction simulation is partially supported',\n msg: 'Transaction simulation, one of our security features that predicts the outcome of a transaction before it is broadcast to the blockchain, is not fully functioning on this chain. The reasons might be network or RPC limitations. Try choosing a different RPC.'\n })\n } else {\n updateFeature('simulation', {\n level: 'danger',\n title: 'Transaction simulation is not supported',\n msg: \"Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security. Unfortunately, this feature isn't available for the current network or RPC. Try choosing a different RPC.\"\n })\n }\n }\n\n if (nativeAssetId !== 'LOADING') {\n const hasNativeAssetId = nativeAssetId && nativeAssetId !== ''\n updateFeature('prices', {\n level: hasNativeAssetId ? 'success' : 'danger',\n msg: hasNativeAssetId\n ? 'We pull token price information in real-time using third-party providers.'\n : \"Our third-party providers don't support this network yet, so we cannot show token prices.\"\n })\n }\n\n return features\n}\n\n// call this if you have only the rpcUrls and chainId\n// this method makes an RPC request, calculates the network info and returns the features\nexport function getFeatures(\n networkInfo: NetworkInfoLoading | undefined\n): NetworkFeature[] {\n return getFeaturesByNetworkProperties(networkInfo)\n}\n\n// Since v4.24.0, a new Network interface has been introduced,\n// that replaces the old NetworkDescriptor, NetworkPreference, and CustomNetwork.\n// Previously, only NetworkPreferences were stored, with other network properties\n// being calculated in a getter each time the networks were needed.\n// Now, all network properties are pre-calculated and stored in a structured format: { [key: NetworkId]: Network } in the storage.\n// This function migrates the data from the old NetworkPreferences to the new structure\n// to ensure compatibility and prevent breaking the extension after updating to v4.24.0\nexport async function migrateNetworkPreferencesToNetworks(networkPreferences: {\n [key: NetworkId]: Partial\n}) {\n const predefinedNetworkIds = predefinedNetworks.map((n) => n.id)\n const customNetworkIds = Object.keys(networkPreferences).filter(\n (k) => !predefinedNetworkIds.includes(k)\n )\n\n const networksToStore: { [key: NetworkId]: Network } = {}\n\n predefinedNetworks.forEach((n) => {\n networksToStore[n.id] = n\n })\n customNetworkIds.forEach((networkId: NetworkId) => {\n const preference = networkPreferences[networkId]\n const networkInfo = {\n chainId: preference.chainId!,\n isSAEnabled: preference.isSAEnabled ?? false,\n isOptimistic: preference.isOptimistic ?? false,\n rpcNoStateOverride: preference.rpcNoStateOverride ?? true,\n erc4337: preference.erc4337 ?? {\n enabled: false,\n hasPaymaster: false,\n hasBundlerSupport: false\n },\n areContractsDeployed: preference.areContractsDeployed ?? false,\n feeOptions: { is1559: (preference as any).is1559 ?? false },\n platformId: preference.platformId ?? '',\n nativeAssetId: preference.nativeAssetId ?? '',\n flagged: preference.flagged ?? false,\n hasSingleton: preference.hasSingleton ?? false\n }\n delete (preference as any).is1559\n networksToStore[networkId] = {\n id: networkId,\n ...preference,\n ...networkInfo,\n features: getFeaturesByNetworkProperties(networkInfo),\n hasRelayer: !!relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId!),\n predefined: false\n } as Network\n })\n\n return networksToStore\n}\n\n// is the user allowed to change the network settings to 4337\nexport function canForce4337(network?: Network) {\n return network && network.allowForce4337\n}\n\nexport function hasRelayerSupport(network: Network) {\n return (\n network.hasRelayer || !!relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n )\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.d.ts b/dist/src/libs/paymaster/abstractPaymaster.d.ts new file mode 100644 index 000000000..b68f8194a --- /dev/null +++ b/dist/src/libs/paymaster/abstractPaymaster.d.ts @@ -0,0 +1,21 @@ +import { Account } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { AccountOp } from '../accountOp/accountOp'; +import { Call } from '../accountOp/types'; +import { PaymasterErrorReponse, PaymasterEstimationData, PaymasterSuccessReponse } from '../erc7677/types'; +import { TokenResult } from '../portfolio'; +import { UserOperation } from '../userOperation/types'; +/** + * Use this mainly as a typehint to prevent dependancy cicles + */ +export declare abstract class AbstractPaymaster { + abstract init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): void; + abstract shouldIncludePayment(): boolean; + abstract getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined; + abstract getEstimationData(): PaymasterEstimationData | null; + abstract isSponsored(): boolean; + abstract isUsable(): boolean; + abstract call(acc: Account, op: AccountOp, userOp: UserOperation, network: Network): Promise; +} +//# sourceMappingURL=abstractPaymaster.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.d.ts.map b/dist/src/libs/paymaster/abstractPaymaster.d.ts.map new file mode 100644 index 000000000..02473bb04 --- /dev/null +++ b/dist/src/libs/paymaster/abstractPaymaster.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"abstractPaymaster.d.ts","sourceRoot":"","sources":["../../../../src/libs/paymaster/abstractPaymaster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD;;GAEG;AACH,8BAAsB,iBAAiB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAElG,QAAQ,CAAC,oBAAoB,IAAI,OAAO;IAExC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS;IAE5E,QAAQ,CAAC,iBAAiB,IAAI,uBAAuB,GAAG,IAAI;IAE5D,QAAQ,CAAC,WAAW,IAAI,OAAO;IAE/B,QAAQ,CAAC,QAAQ,IAAI,OAAO;IAE5B,QAAQ,CAAC,IAAI,CACX,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,uBAAuB,GAAG,qBAAqB,CAAC;CAC5D"} \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.js b/dist/src/libs/paymaster/abstractPaymaster.js new file mode 100644 index 000000000..a31566002 --- /dev/null +++ b/dist/src/libs/paymaster/abstractPaymaster.js @@ -0,0 +1,6 @@ +/** + * Use this mainly as a typehint to prevent dependancy cicles + */ +export class AbstractPaymaster { +} +//# sourceMappingURL=abstractPaymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.js.map b/dist/src/libs/paymaster/abstractPaymaster.js.map new file mode 100644 index 000000000..e95a9ad3c --- /dev/null +++ b/dist/src/libs/paymaster/abstractPaymaster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"abstractPaymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/abstractPaymaster.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,OAAgB,iBAAiB;CAmBtC","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\n\n/**\n * Use this mainly as a typehint to prevent dependancy cicles\n */\nexport abstract class AbstractPaymaster {\n abstract init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): void\n\n abstract shouldIncludePayment(): boolean\n\n abstract getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined\n\n abstract getEstimationData(): PaymasterEstimationData | null\n\n abstract isSponsored(): boolean\n\n abstract isUsable(): boolean\n\n abstract call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.d.ts b/dist/src/libs/paymaster/paymaster.d.ts new file mode 100644 index 000000000..ff1ec45c4 --- /dev/null +++ b/dist/src/libs/paymaster/paymaster.d.ts @@ -0,0 +1,31 @@ +import { Account } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { AccountOp } from '../accountOp/accountOp'; +import { Call } from '../accountOp/types'; +import { PaymasterErrorReponse, PaymasterEstimationData, PaymasterService, PaymasterSuccessReponse } from '../erc7677/types'; +import { TokenResult } from '../portfolio'; +import { UserOperation } from '../userOperation/types'; +import { AbstractPaymaster } from './abstractPaymaster'; +type PaymasterType = 'Ambire' | 'ERC7677' | 'None'; +export declare function getPaymasterDataForEstimate(): PaymasterEstimationData; +export declare class Paymaster extends AbstractPaymaster { + #private; + callRelayer: Function; + type: PaymasterType; + sponsorDataEstimation: PaymasterEstimationData | undefined; + paymasterService: PaymasterService | null; + network: Network | null; + provider: RPCProvider | null; + errorCallback: Function | undefined; + constructor(callRelayer: Function, errorCallback: Function); + init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): Promise; + shouldIncludePayment(): boolean; + getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined; + getEstimationData(): PaymasterEstimationData | null; + isSponsored(): boolean; + isUsable(): boolean; + call(acc: Account, op: AccountOp, userOp: UserOperation, network: Network): Promise; +} +export {}; +//# sourceMappingURL=paymaster.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.d.ts.map b/dist/src/libs/paymaster/paymaster.d.ts.map new file mode 100644 index 000000000..a1ad90bf3 --- /dev/null +++ b/dist/src/libs/paymaster/paymaster.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"paymaster.d.ts","sourceRoot":"","sources":["../../../../src/libs/paymaster/paymaster.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAGzC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;AAElD,wBAAgB,2BAA2B,IAAI,uBAAuB,CAWrE;AAED,qBAAa,SAAU,SAAQ,iBAAiB;;IAC9C,WAAW,EAAE,QAAQ,CAAA;IAErB,IAAI,EAAE,aAAa,CAAS;IAE5B,qBAAqB,EAAE,uBAAuB,GAAG,SAAS,CAAA;IAE1D,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAO;IAEhD,OAAO,EAAE,OAAO,GAAG,IAAI,CAAO;IAE9B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAO;IAEnC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAY;gBAEnC,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ;IAMpD,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW;IAsDxF,oBAAoB,IAAI,OAAO;IAI/B,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS;IAuBnE,iBAAiB,IAAI,uBAAuB,GAAG,IAAI;IAQnD,WAAW,IAAI,OAAO;IAItB,QAAQ;IAgHF,IAAI,CACR,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,uBAAuB,GAAG,qBAAqB,CAAC;CAO5D"} \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.js b/dist/src/libs/paymaster/paymaster.js new file mode 100644 index 000000000..dba28c4be --- /dev/null +++ b/dist/src/libs/paymaster/paymaster.js @@ -0,0 +1,220 @@ +/* eslint-disable no-console */ +import { AbiCoder, Contract, toBeHex } from 'ethers'; +import entryPointAbi from '../../../contracts/compiled/EntryPoint.json'; +import { FEE_COLLECTOR } from '../../consts/addresses'; +import { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +import { failedPaymasters } from '../../services/paymaster/FailedPaymasters'; +import { getFeeCall } from '../calls/calls'; +import { getPaymasterData, getPaymasterStubData } from '../erc7677/erc7677'; +import { RelayerPaymasterError, SponsorshipPaymasterError } from '../errorDecoder/customErrors'; +import { getHumanReadableBroadcastError } from '../errorHumanizer'; +import { PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE } from '../errorHumanizer/broadcastErrorHumanizer'; +import { getFeeTokenForEstimate } from '../estimate/estimateHelpers'; +import { getCleanUserOp, getSigForCalculations } from '../userOperation/userOperation'; +import { AbstractPaymaster } from './abstractPaymaster'; +export function getPaymasterDataForEstimate() { + const abiCoder = new AbiCoder(); + return { + paymaster: AMBIRE_PAYMASTER, + paymasterVerificationGasLimit: toBeHex(100000), + paymasterPostOpGasLimit: toBeHex(0), + paymasterData: abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, getSigForCalculations()]) + }; +} +export class Paymaster extends AbstractPaymaster { + callRelayer; + type = 'None'; + sponsorDataEstimation; + paymasterService = null; + network = null; + provider = null; + errorCallback = undefined; + constructor(callRelayer, errorCallback) { + super(); + this.callRelayer = callRelayer; + this.errorCallback = errorCallback; + } + async init(op, userOp, network, provider) { + this.network = network; + this.provider = provider; + if (op.meta?.paymasterService && !op.meta?.paymasterService.failed) { + try { + this.paymasterService = op.meta.paymasterService; + const response = await Promise.race([ + getPaymasterStubData(op.meta.paymasterService, userOp, network), + new Promise((_resolve, reject) => { + setTimeout(() => reject(new Error('Sponsorship error, request too slow')), 5000); + }) + ]); + this.sponsorDataEstimation = response; + this.type = 'ERC7677'; + return; + } + catch (e) { + // TODO: error handling + console.log(e); + } + } + // has the paymaster dried up + const seenInsufficientFunds = failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]; + if (network.erc4337.hasPaymaster && !seenInsufficientFunds) { + this.type = 'Ambire'; + return; + } + // for custom networks, check if the paymaster there has balance + if (!network.predefined || seenInsufficientFunds) { + try { + const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider); + const paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER); + // if the network paymaster has failed because of insufficient funds, + // disable it before getting a top up + const minBalance = seenInsufficientFunds ? seenInsufficientFunds.lastSeenBalance : 0n; + if (paymasterBalance > minBalance) { + this.type = 'Ambire'; + if (seenInsufficientFunds) + failedPaymasters.removeInsufficientFunds(network); + return; + } + } + catch (e) { + console.log('failed to retrieve the balance of the paymaster'); + console.error(e); + } + } + this.type = 'None'; + } + shouldIncludePayment() { + return this.type === 'Ambire' || this.type === 'ERC7677'; + } + getFeeCallForEstimation(feeTokens) { + if (!this.network) + throw new Error('network not set, did you call init?'); + if (this.type === 'Ambire') { + const feeToken = getFeeTokenForEstimate(feeTokens, this.network); + if (!feeToken) + return undefined; + return getFeeCall(feeToken); + } + // hardcode USDC gas tank 0 for sponsorships + if (this.type === 'ERC7677') { + const abiCoder = new AbiCoder(); + return { + to: FEE_COLLECTOR, + value: 0n, + data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC']) + }; + } + return undefined; + } + getEstimationData() { + if (this.type === 'ERC7677') + return this.sponsorDataEstimation; + if (this.type === 'Ambire') + return getPaymasterDataForEstimate(); + return null; + } + isSponsored() { + return this.type === 'ERC7677'; + } + isUsable() { + return this.type !== 'None'; + } + async #retryPaymasterRequest(apiCall, counter = 0) { + // retry the request 3 times before declaring it a failure + if (counter >= 3) { + const e = new Error('Ambire relayer error timeout'); + const convertedError = new RelayerPaymasterError(e); + const { message } = getHumanReadableBroadcastError(convertedError); + return { + success: false, + message, + error: e + }; + } + try { + const response = await Promise.race([ + apiCall(), + new Promise((_resolve, reject) => { + setTimeout(() => reject(new Error('Ambire relayer error timeout')), 8000); + }) + ]); + return { + success: true, + paymaster: this.type === 'Ambire' ? AMBIRE_PAYMASTER : response.paymaster, + paymasterData: this.type === 'Ambire' ? response.data.paymasterData : response.paymasterData + }; + } + catch (e) { + if (e.message === 'Ambire relayer error timeout') { + if (this.errorCallback) { + this.errorCallback({ + level: 'major', + message: 'Paymaster is not responding. Retrying...', + error: new Error('Paymaster call timeout') + }); + } + const increment = counter + 1; + return this.#retryPaymasterRequest(apiCall, increment); + } + const convertedError = this.type === 'ERC7677' ? new SponsorshipPaymasterError() : new RelayerPaymasterError(e); + const { message } = getHumanReadableBroadcastError(convertedError); + return { + success: false, + message, + error: e + }; + } + } + async #ambireCall(acc, op, userOp) { + if (!this.provider) + throw new Error('provider not set, did you call init?'); + if (!this.network) + throw new Error('network not set, did you call init?'); + // request the paymaster with a timeout window + const localUserOp = { ...userOp }; + localUserOp.paymaster = AMBIRE_PAYMASTER; + return this.#retryPaymasterRequest(() => { + return this.callRelayer(`/v2/paymaster/${op.networkId}/sign`, 'POST', { + userOperation: getCleanUserOp(localUserOp)[0], + paymaster: AMBIRE_PAYMASTER, + bytecode: acc.creation.bytecode, + salt: acc.creation.salt, + key: acc.associatedKeys[0], + // eslint-disable-next-line no-underscore-dangle + rpcUrl: this.provider._getConnection().url, + bundler: userOp.bundler + }); + }); + } + async #erc7677Call(op, userOp, network) { + const sponsorData = this.sponsorDataEstimation; + // no need to do an extra call if the dapp has already provided sponsorship + if ('isFinal' in sponsorData && sponsorData.isFinal) + return { + success: true, + paymaster: sponsorData.paymaster, + paymasterData: sponsorData.paymasterData + }; + const localUserOp = { ...userOp }; + localUserOp.paymaster = sponsorData.paymaster; + localUserOp.paymasterData = sponsorData.paymasterData; + const response = await this.#retryPaymasterRequest(() => { + return getPaymasterData(this.paymasterService, localUserOp, network); + }); + if (!response.success && + response.message !== PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE && + op.meta && + op.meta.paymasterService) { + failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id); + } + return response; + } + async call(acc, op, userOp, network) { + if (this.type === 'Ambire') + return this.#ambireCall(acc, op, userOp); + if (this.type === 'ERC7677') + return this.#erc7677Call(op, userOp, network); + throw new Error('Paymaster not configured. Please contact support'); + } +} +//# sourceMappingURL=paymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.js.map b/dist/src/libs/paymaster/paymaster.js.map new file mode 100644 index 000000000..fc1f62be6 --- /dev/null +++ b/dist/src/libs/paymaster/paymaster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/paymaster.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { AbiCoder, Contract, toBeHex } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { getPaymasterData, getPaymasterStubData } from '../erc7677/erc7677'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterService,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { RelayerPaymasterError, SponsorshipPaymasterError } from '../errorDecoder/customErrors'\nimport { getHumanReadableBroadcastError } from '../errorHumanizer'\nimport { PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE } from '../errorHumanizer/broadcastErrorHumanizer'\nimport { getFeeTokenForEstimate } from '../estimate/estimateHelpers'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp, getSigForCalculations } from '../userOperation/userOperation'\nimport { AbstractPaymaster } from './abstractPaymaster'\n\ntype PaymasterType = 'Ambire' | 'ERC7677' | 'None'\n\nexport function getPaymasterDataForEstimate(): PaymasterEstimationData {\n const abiCoder = new AbiCoder()\n return {\n paymaster: AMBIRE_PAYMASTER,\n paymasterVerificationGasLimit: toBeHex(100000) as Hex,\n paymasterPostOpGasLimit: toBeHex(0) as Hex,\n paymasterData: abiCoder.encode(\n ['uint48', 'uint48', 'bytes'],\n [0, 0, getSigForCalculations()]\n ) as Hex\n }\n}\n\nexport class Paymaster extends AbstractPaymaster {\n callRelayer: Function\n\n type: PaymasterType = 'None'\n\n sponsorDataEstimation: PaymasterEstimationData | undefined\n\n paymasterService: PaymasterService | null = null\n\n network: Network | null = null\n\n provider: RPCProvider | null = null\n\n errorCallback: Function | undefined = undefined\n\n constructor(callRelayer: Function, errorCallback: Function) {\n super()\n this.callRelayer = callRelayer\n this.errorCallback = errorCallback\n }\n\n async init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider) {\n this.network = network\n this.provider = provider\n\n if (op.meta?.paymasterService && !op.meta?.paymasterService.failed) {\n try {\n this.paymasterService = op.meta.paymasterService\n const response = await Promise.race([\n getPaymasterStubData(op.meta.paymasterService, userOp, network),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Sponsorship error, request too slow')), 5000)\n })\n ])\n this.sponsorDataEstimation = response as PaymasterEstimationData\n this.type = 'ERC7677'\n return\n } catch (e) {\n // TODO: error handling\n console.log(e)\n }\n }\n\n // has the paymaster dried up\n const seenInsufficientFunds =\n failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]\n\n if (network.erc4337.hasPaymaster && !seenInsufficientFunds) {\n this.type = 'Ambire'\n return\n }\n\n // for custom networks, check if the paymaster there has balance\n if (!network.predefined || seenInsufficientFunds) {\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n const paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n\n // if the network paymaster has failed because of insufficient funds,\n // disable it before getting a top up\n const minBalance = seenInsufficientFunds ? seenInsufficientFunds.lastSeenBalance : 0n\n if (paymasterBalance > minBalance) {\n this.type = 'Ambire'\n if (seenInsufficientFunds) failedPaymasters.removeInsufficientFunds(network)\n return\n }\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n }\n\n this.type = 'None'\n }\n\n shouldIncludePayment(): boolean {\n return this.type === 'Ambire' || this.type === 'ERC7677'\n }\n\n getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined {\n if (!this.network) throw new Error('network not set, did you call init?')\n\n if (this.type === 'Ambire') {\n const feeToken = getFeeTokenForEstimate(feeTokens, this.network)\n if (!feeToken) return undefined\n\n return getFeeCall(feeToken)\n }\n\n // hardcode USDC gas tank 0 for sponsorships\n if (this.type === 'ERC7677') {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n }\n\n return undefined\n }\n\n getEstimationData(): PaymasterEstimationData | null {\n if (this.type === 'ERC7677') return this.sponsorDataEstimation as PaymasterEstimationData\n\n if (this.type === 'Ambire') return getPaymasterDataForEstimate()\n\n return null\n }\n\n isSponsored(): boolean {\n return this.type === 'ERC7677'\n }\n\n isUsable() {\n return this.type !== 'None'\n }\n\n async #retryPaymasterRequest(\n apiCall: Function,\n counter = 0\n ): Promise {\n // retry the request 3 times before declaring it a failure\n if (counter >= 3) {\n const e = new Error('Ambire relayer error timeout')\n const convertedError = new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n\n try {\n const response = await Promise.race([\n apiCall(),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Ambire relayer error timeout')), 8000)\n })\n ])\n\n return {\n success: true,\n paymaster: this.type === 'Ambire' ? AMBIRE_PAYMASTER : response.paymaster,\n paymasterData: this.type === 'Ambire' ? response.data.paymasterData : response.paymasterData\n }\n } catch (e: any) {\n if (e.message === 'Ambire relayer error timeout') {\n if (this.errorCallback) {\n this.errorCallback({\n level: 'major',\n message: 'Paymaster is not responding. Retrying...',\n error: new Error('Paymaster call timeout')\n })\n }\n const increment = counter + 1\n return this.#retryPaymasterRequest(apiCall, increment)\n }\n\n const convertedError =\n this.type === 'ERC7677' ? new SponsorshipPaymasterError() : new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n }\n\n async #ambireCall(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation\n ): Promise {\n if (!this.provider) throw new Error('provider not set, did you call init?')\n if (!this.network) throw new Error('network not set, did you call init?')\n\n // request the paymaster with a timeout window\n const localUserOp = { ...userOp }\n localUserOp.paymaster = AMBIRE_PAYMASTER\n return this.#retryPaymasterRequest(() => {\n return this.callRelayer(`/v2/paymaster/${op.networkId}/sign`, 'POST', {\n userOperation: getCleanUserOp(localUserOp)[0],\n paymaster: AMBIRE_PAYMASTER,\n bytecode: acc.creation!.bytecode,\n salt: acc.creation!.salt,\n key: acc.associatedKeys[0],\n // eslint-disable-next-line no-underscore-dangle\n rpcUrl: this.provider!._getConnection().url,\n bundler: userOp.bundler\n })\n })\n }\n\n async #erc7677Call(op: AccountOp, userOp: UserOperation, network: Network) {\n const sponsorData = this.sponsorDataEstimation as PaymasterEstimationData\n\n // no need to do an extra call if the dapp has already provided sponsorship\n if ('isFinal' in sponsorData && sponsorData.isFinal)\n return {\n success: true,\n paymaster: sponsorData.paymaster,\n paymasterData: sponsorData.paymasterData\n }\n\n const localUserOp = { ...userOp }\n localUserOp.paymaster = sponsorData.paymaster\n localUserOp.paymasterData = sponsorData.paymasterData\n const response = await this.#retryPaymasterRequest(() => {\n return getPaymasterData(this.paymasterService as PaymasterService, localUserOp, network)\n })\n\n if (\n !response.success &&\n (response as PaymasterErrorReponse).message !== PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE &&\n op.meta &&\n op.meta.paymasterService\n ) {\n failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id)\n }\n\n return response\n }\n\n async call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise {\n if (this.type === 'Ambire') return this.#ambireCall(acc, op, userOp)\n\n if (this.type === 'ERC7677') return this.#erc7677Call(op, userOp, network)\n\n throw new Error('Paymaster not configured. Please contact support')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/polling/polling.d.ts b/dist/src/libs/polling/polling.d.ts new file mode 100644 index 000000000..768abcee6 --- /dev/null +++ b/dist/src/libs/polling/polling.d.ts @@ -0,0 +1,13 @@ +import EventEmitter from '../../controllers/eventEmitter/eventEmitter'; +export declare class Polling extends EventEmitter { + state: { + isError: boolean; + error?: any; + }; + defaultTimeout: number; + allowableErrors: number[]; + startTime: number; + constructor(allowableErrors?: number[]); + exec(fn: Function, params: any, cleanup: Function | null, shouldStop: Function | null, timeout?: number, pollingtime?: number): Promise; +} +//# sourceMappingURL=polling.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/polling/polling.d.ts.map b/dist/src/libs/polling/polling.d.ts.map new file mode 100644 index 000000000..a264bc563 --- /dev/null +++ b/dist/src/libs/polling/polling.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../../../src/libs/polling/polling.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,6CAA6C,CAAA;AAMtE,qBAAa,OAAQ,SAAQ,YAAY;IACvC,KAAK,EAAE;QACL,OAAO,EAAE,OAAO,CAAA;QAChB,KAAK,CAAC,EAAE,GAAG,CAAA;KACZ,CAAA;IAED,cAAc,EAAE,MAAM,CAAO;IAE7B,eAAe,EAAE,MAAM,EAAE,CAAQ;IAEjC,SAAS,EAAE,MAAM,CAAuB;gBAE5B,eAAe,CAAC,EAAE,MAAM,EAAE;IAQhC,IAAI,CAAC,CAAC,EACV,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,QAAQ,GAAG,IAAI,EACxB,UAAU,EAAE,QAAQ,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAyCrB"} \ No newline at end of file diff --git a/dist/src/libs/polling/polling.js b/dist/src/libs/polling/polling.js new file mode 100644 index 000000000..30c97d3fa --- /dev/null +++ b/dist/src/libs/polling/polling.js @@ -0,0 +1,51 @@ +import EventEmitter from '../../controllers/eventEmitter/eventEmitter'; +const DEFAULT_TIMEOUT = 60000; +// DOCS +// the purpouse ofthis class is to make requests until a specific case is satisfied, unallowed error occures or the time runs out +// used for checking if the magicLink, sent to the email, has been clicked, making the emailAddress confirmed and eligible for email vult +export class Polling extends EventEmitter { + state; + defaultTimeout = 2000; + allowableErrors = [401]; + startTime = new Date().getTime(); + constructor(allowableErrors) { + super(); + this.state = { + isError: false + }; + if (allowableErrors) + this.allowableErrors = allowableErrors; + } + async exec(fn, params, cleanup, shouldStop, timeout, pollingtime) { + const execTimeout = pollingtime || 0; + const promise = await new Promise((resolve) => + // eslint-disable-next-line no-promise-executor-return + setTimeout(async () => { + this.state = { + isError: false, + error: {} + }; + if (shouldStop && shouldStop()) + return resolve(null); + const result = await fn(...params) + .catch((error) => ({ isError: true, error })) + .then((res) => ({ isError: false, ...res })); + if (result.isError && this.allowableErrors.includes(result?.error?.output?.res?.status)) { + this.state = result; + this.emitUpdate(); + } + else if (result.isError) { + return resolve(result); + } + if (new Date().getTime() - this.startTime >= (timeout || DEFAULT_TIMEOUT)) { + return resolve({ ...result, error: new Error('timeout') }); + } + if (!result.isError) + return resolve(result); + return resolve(await this.exec(fn, params, () => null, shouldStop, timeout || DEFAULT_TIMEOUT, this.defaultTimeout)); + }, execTimeout)); + cleanup && cleanup(); + return promise; + } +} +//# sourceMappingURL=polling.js.map \ No newline at end of file diff --git a/dist/src/libs/polling/polling.js.map b/dist/src/libs/polling/polling.js.map new file mode 100644 index 000000000..497dd2b32 --- /dev/null +++ b/dist/src/libs/polling/polling.js.map @@ -0,0 +1 @@ +{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../../../src/libs/polling/polling.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,6CAA6C,CAAA;AAEtE,MAAM,eAAe,GAAG,KAAK,CAAA;AAC7B,OAAO;AACP,iIAAiI;AACjI,yIAAyI;AACzI,MAAM,OAAO,OAAQ,SAAQ,YAAY;IACvC,KAAK,CAGJ;IAED,cAAc,GAAW,IAAI,CAAA;IAE7B,eAAe,GAAa,CAAC,GAAG,CAAC,CAAA;IAEjC,SAAS,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAExC,YAAY,eAA0B;QACpC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,KAAK;SACf,CAAA;QACD,IAAI,eAAe;YAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAY,EACZ,MAAW,EACX,OAAwB,EACxB,UAA2B,EAC3B,OAAgB,EAChB,WAAoB;QAEpB,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,CAAA;QACpC,MAAM,OAAO,GAAa,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,sDAAsD;QACtD,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,KAAK,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;aACV,CAAA;YACD,IAAI,UAAU,IAAI,UAAU,EAAE;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;iBAC/B,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;iBACjD,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;YACnD,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;gBACvF,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;gBACnB,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE;gBACzB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;aACvB;YAED,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,EAAE;gBACzE,OAAO,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;aAC3D;YAED,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;YAE3C,OAAO,OAAO,CACZ,MAAM,IAAI,CAAC,IAAI,CACb,EAAE,EACF,MAAM,EACN,GAAG,EAAE,CAAC,IAAI,EACV,UAAU,EACV,OAAO,IAAI,eAAe,EAC1B,IAAI,CAAC,cAAc,CACpB,CACF,CAAA;QACH,CAAC,EAAE,WAAW,CAAC,CAChB,CAAA;QACD,OAAO,IAAI,OAAO,EAAE,CAAA;QACpB,OAAO,OAAO,CAAA;IAChB,CAAC;CACF","sourcesContent":["import EventEmitter from '../../controllers/eventEmitter/eventEmitter'\n\nconst DEFAULT_TIMEOUT = 60000\n// DOCS\n// the purpouse ofthis class is to make requests until a specific case is satisfied, unallowed error occures or the time runs out\n// used for checking if the magicLink, sent to the email, has been clicked, making the emailAddress confirmed and eligible for email vult\nexport class Polling extends EventEmitter {\n state: {\n isError: boolean\n error?: any\n }\n\n defaultTimeout: number = 2000\n\n allowableErrors: number[] = [401]\n\n startTime: number = new Date().getTime()\n\n constructor(allowableErrors?: number[]) {\n super()\n this.state = {\n isError: false\n }\n if (allowableErrors) this.allowableErrors = allowableErrors\n }\n\n async exec(\n fn: Function,\n params: any,\n cleanup: Function | null,\n shouldStop: Function | null,\n timeout?: number,\n pollingtime?: number\n ): Promise {\n const execTimeout = pollingtime || 0\n const promise: T | null = await new Promise((resolve) =>\n // eslint-disable-next-line no-promise-executor-return\n setTimeout(async () => {\n this.state = {\n isError: false,\n error: {}\n }\n if (shouldStop && shouldStop()) return resolve(null)\n const result = await fn(...params)\n .catch((error: any) => ({ isError: true, error }))\n .then((res: any) => ({ isError: false, ...res }))\n if (result.isError && this.allowableErrors.includes(result?.error?.output?.res?.status)) {\n this.state = result\n this.emitUpdate()\n } else if (result.isError) {\n return resolve(result)\n }\n\n if (new Date().getTime() - this.startTime >= (timeout || DEFAULT_TIMEOUT)) {\n return resolve({ ...result, error: new Error('timeout') })\n }\n\n if (!result.isError) return resolve(result)\n\n return resolve(\n await this.exec(\n fn,\n params,\n () => null,\n shouldStop,\n timeout || DEFAULT_TIMEOUT,\n this.defaultTimeout\n )\n )\n }, execTimeout)\n )\n cleanup && cleanup()\n return promise\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.d.ts b/dist/src/libs/portfolio/batcher.d.ts new file mode 100644 index 000000000..aa5685b4a --- /dev/null +++ b/dist/src/libs/portfolio/batcher.d.ts @@ -0,0 +1,17 @@ +import { Fetch } from '../../interfaces/fetch'; +export interface QueueElement { + resolve: Function; + reject: Function; + fetch: Fetch; + data: any; +} +export interface Request { + url: string; + queueSegment: QueueElement[]; +} +export type RequestGenerator = (queue: QueueElement[]) => Request[]; +export default function batcher(fetch: Fetch, requestGenerator: RequestGenerator, timeoutSettings?: { + timeoutAfter: number; + timeoutErrorMessage: string; +}, batchDebounce?: number): Function; +//# sourceMappingURL=batcher.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.d.ts.map b/dist/src/libs/portfolio/batcher.d.ts.map new file mode 100644 index 000000000..1a2016afb --- /dev/null +++ b/dist/src/libs/portfolio/batcher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"batcher.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/batcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,EAAE,QAAQ,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,GAAG,CAAA;CACV;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,CAAA;AAEnE,MAAM,CAAC,OAAO,UAAU,OAAO,CAC7B,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,CAAC,EAAE;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,EACD,aAAa,GAAE,MAAU,GACxB,QAAQ,CAyDV"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.js b/dist/src/libs/portfolio/batcher.js index cd864404d..08ca2fea1 100644 --- a/dist/src/libs/portfolio/batcher.js +++ b/dist/src/libs/portfolio/batcher.js @@ -1,6 +1,4 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -function batcher(fetch, requestGenerator, batchDebounce = 0) { +export default function batcher(fetch, requestGenerator, timeoutSettings, batchDebounce = 0) { let queue = []; async function resolveQueue() { // Note: intentionally just using the first values in the queue @@ -15,26 +13,41 @@ function batcher(fetch, requestGenerator, batchDebounce = 0) { // useful also if the API is limited to a certain # and we want to paginate requestGenerator(queueCopy).map(async ({ url, queueSegment }) => { try { - const resp = await fetch(url); - const body = await resp.json(); - if (resp.status !== 200) - throw body; - if (body.hasOwnProperty('message')) - throw body; - if (body.hasOwnProperty('error')) - throw body; - if (Array.isArray(body)) { - if (body.length !== queueSegment.length) - throw new Error('internal error: queue length and response length mismatch'); - queueSegment.forEach(({ resolve }, i) => resolve(body[i])); + const fetchPromise = fetch(url).then(async (resp) => { + const body = await resp.json(); + if (resp.status !== 200) + throw body; + if (body.hasOwnProperty('message')) + throw body; + if (body.hasOwnProperty('error')) + throw body; + if (Array.isArray(body)) { + if (body.length !== queueSegment.length) + throw new Error('internal error: queue length and response length mismatch'); + queueSegment.forEach(({ resolve }, i) => resolve(body[i])); + } + else if (queueSegment.every((x) => typeof x.data.responseIdentifier === 'string')) { + queueSegment.forEach(({ resolve, data }) => resolve(body[data.responseIdentifier])); + } + else + throw body; + }); + if (timeoutSettings) { + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Request timed out')); + }, timeoutSettings.timeoutAfter); + }); + await Promise.race([fetchPromise, timeoutPromise]); } - else if (queueSegment.every((x) => typeof x.data['responseIdentifier'] === 'string')) { - queueSegment.forEach(({ resolve, data }) => resolve(body[data.responseIdentifier])); + else { + await fetchPromise; } - else - throw body; } catch (e) { + if (e.message === 'Request timed out' && timeoutSettings) { + console.error(timeoutSettings.timeoutErrorMessage); + } queueSegment.forEach(({ reject }) => reject(e)); } })); @@ -42,8 +55,9 @@ function batcher(fetch, requestGenerator, batchDebounce = 0) { return async (data) => { // always do the setTimeout - if it's a second or third batchedCall within a tick, all setTimeouts will fire but only the first will perform work setTimeout(resolveQueue, batchDebounce); - return new Promise((resolve, reject) => queue.push({ resolve, reject, fetch, data })); + return new Promise((resolve, reject) => { + queue.push({ resolve, reject, fetch, data }); + }); }; } -exports.default = batcher; //# sourceMappingURL=batcher.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.js.map b/dist/src/libs/portfolio/batcher.js.map index cd7b14808..a66f4c80d 100644 --- a/dist/src/libs/portfolio/batcher.js.map +++ b/dist/src/libs/portfolio/batcher.js.map @@ -1 +1 @@ -{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/batcher.ts"],"names":[],"mappings":";;AAcA,SAAwB,OAAO,CAC7B,KAAe,EACf,gBAAkC,EAClC,gBAAwB,CAAC;IAEzB,IAAI,KAAK,GAAmB,EAAE,CAAA;IAC9B,KAAK,UAAU,YAAY;QACzB,+DAA+D;QAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAA;QACvB,KAAK,GAAG,EAAE,CAAA;QACV,MAAM,OAAO,CAAC,GAAG;QACf,wGAAwG;QACxG,4HAA4H;QAC5H,8BAA8B;QAC9B,2EAA2E;QAC3E,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;YAC9D,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;oBAAE,MAAM,IAAI,CAAA;gBACnC,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;oBAAE,MAAM,IAAI,CAAA;gBAC9C,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;oBAAE,MAAM,IAAI,CAAA;gBAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvB,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;wBACrC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;oBAC9E,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;iBAC3D;qBAAM,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,QAAQ,CAAC,EAAE;oBACtF,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAA4B,CAAC,CAAC,CACjD,CAAA;iBACF;;oBAAM,MAAM,IAAI,CAAA;aAClB;YAAC,OAAO,CAAC,EAAE;gBACV,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;aAChD;QACH,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO,KAAK,EAAE,IAAS,EAAgB,EAAE;QACvC,iJAAiJ;QACjJ,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;QACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACvF,CAAC,CAAA;AACH,CAAC;AA3CD,0BA2CC"} \ No newline at end of file +{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/batcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport interface QueueElement {\n resolve: Function\n reject: Function\n fetch: Fetch\n data: any\n}\n\nexport interface Request {\n url: string\n queueSegment: QueueElement[]\n}\n\nexport type RequestGenerator = (queue: QueueElement[]) => Request[]\n\nexport default function batcher(\n fetch: Fetch,\n requestGenerator: RequestGenerator,\n timeoutSettings?: {\n timeoutAfter: number\n timeoutErrorMessage: string\n },\n batchDebounce: number = 0\n): Function {\n let queue: QueueElement[] = []\n\n async function resolveQueue() {\n // Note: intentionally just using the first values in the queue\n if (queue.length === 0) return\n const queueCopy = queue\n queue = []\n await Promise.all(\n // we let the requestGenerator split the queue into parts, each of it will be resolved with it's own url\n // this allows the possibility of one queue being resolved with multiple requests, for example if the API needs to be called\n // separately for each network\n // useful also if the API is limited to a certain # and we want to paginate\n requestGenerator(queueCopy).map(async ({ url, queueSegment }) => {\n try {\n const fetchPromise = fetch(url).then(async (resp) => {\n const body = await resp.json()\n if (resp.status !== 200) throw body\n if (body.hasOwnProperty('message')) throw body\n if (body.hasOwnProperty('error')) throw body\n if (Array.isArray(body)) {\n if (body.length !== queueSegment.length)\n throw new Error('internal error: queue length and response length mismatch')\n queueSegment.forEach(({ resolve }, i) => resolve(body[i]))\n } else if (queueSegment.every((x) => typeof x.data.responseIdentifier === 'string')) {\n queueSegment.forEach(({ resolve, data }) =>\n resolve(body[data.responseIdentifier as string])\n )\n } else throw body\n })\n\n if (timeoutSettings) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('Request timed out'))\n }, timeoutSettings.timeoutAfter)\n })\n await Promise.race([fetchPromise, timeoutPromise])\n } else {\n await fetchPromise\n }\n } catch (e: any) {\n if (e.message === 'Request timed out' && timeoutSettings) {\n console.error(timeoutSettings.timeoutErrorMessage)\n }\n queueSegment.forEach(({ reject }) => reject(e))\n }\n })\n )\n }\n return async (data: any): Promise => {\n // always do the setTimeout - if it's a second or third batchedCall within a tick, all setTimeouts will fire but only the first will perform work\n setTimeout(resolveQueue, batchDebounce)\n return new Promise((resolve, reject) => {\n queue.push({ resolve, reject, fetch, data })\n })\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/customToken.d.ts b/dist/src/libs/portfolio/customToken.d.ts new file mode 100644 index 000000000..aff0b0177 --- /dev/null +++ b/dist/src/libs/portfolio/customToken.d.ts @@ -0,0 +1,17 @@ +import { NetworkId } from '../../interfaces/network'; +export interface CustomToken { + address: string; + networkId: NetworkId; + standard: 'ERC20' | 'ERC721'; +} +export interface TokenPreference { + address: string; + networkId: NetworkId; + isHidden?: boolean; +} +export type LegacyTokenPreference = TokenPreference & { + symbol: string; + decimals: number; + standard: 'ERC20' | 'ERC721'; +}; +//# sourceMappingURL=customToken.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/customToken.d.ts.map b/dist/src/libs/portfolio/customToken.d.ts.map new file mode 100644 index 000000000..b1ad89fac --- /dev/null +++ b/dist/src/libs/portfolio/customToken.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"customToken.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/customToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG;IACpD,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC7B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/customToken.js b/dist/src/libs/portfolio/customToken.js index 2adf580fc..e37e91ffb 100644 --- a/dist/src/libs/portfolio/customToken.js +++ b/dist/src/libs/portfolio/customToken.js @@ -1,3 +1,2 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +export {}; //# sourceMappingURL=customToken.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/customToken.js.map b/dist/src/libs/portfolio/customToken.js.map index 1f5f5441d..0c424509b 100644 --- a/dist/src/libs/portfolio/customToken.js.map +++ b/dist/src/libs/portfolio/customToken.js.map @@ -1 +1 @@ -{"version":3,"file":"customToken.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/customToken.ts"],"names":[],"mappings":""} \ No newline at end of file +{"version":3,"file":"customToken.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/customToken.ts"],"names":[],"mappings":"","sourcesContent":["import { NetworkId } from '../../interfaces/network'\n\nexport interface CustomToken {\n address: string\n networkId: NetworkId\n standard: 'ERC20' | 'ERC721'\n}\n\nexport interface TokenPreference {\n address: string\n networkId: NetworkId\n isHidden?: boolean\n}\n\nexport type LegacyTokenPreference = TokenPreference & {\n symbol: string\n decimals: number\n standard: 'ERC20' | 'ERC721'\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.d.ts b/dist/src/libs/portfolio/gecko.d.ts new file mode 100644 index 000000000..2afc864e4 --- /dev/null +++ b/dist/src/libs/portfolio/gecko.d.ts @@ -0,0 +1,5 @@ +import { Network } from '../../interfaces/network'; +import { QueueElement, Request } from './batcher'; +export declare function geckoResponseIdentifier(tokenAddr: string, network: Network): string; +export declare function geckoRequestBatcher(queue: QueueElement[]): Request[]; +//# sourceMappingURL=gecko.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.d.ts.map b/dist/src/libs/portfolio/gecko.d.ts.map new file mode 100644 index 000000000..3437c75f9 --- /dev/null +++ b/dist/src/libs/portfolio/gecko.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gecko.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/gecko.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQjD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAEnF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CA8CpE"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.js b/dist/src/libs/portfolio/gecko.js index 9c6cd6fa0..53ed0c57d 100644 --- a/dist/src/libs/portfolio/gecko.js +++ b/dist/src/libs/portfolio/gecko.js @@ -1,23 +1,28 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.geckoRequestBatcher = exports.geckoResponseIdentifier = void 0; -const pagination_1 = require("./pagination"); -const coingecko_1 = require("../../consts/coingecko"); +import dotenv from 'dotenv'; +import { geckoIdMapper } from '../../consts/coingecko'; +import { paginate } from './pagination'; +dotenv.config(); // max tokens per request; we seem to have faster results when it's lower const BATCH_LIMIT = 40; -function geckoResponseIdentifier(tokenAddr, networkId) { - return (0, coingecko_1.geckoIdMapper)(tokenAddr, networkId) || tokenAddr.toLowerCase(); +export function geckoResponseIdentifier(tokenAddr, network) { + return geckoIdMapper(tokenAddr, network) || tokenAddr.toLowerCase(); } -exports.geckoResponseIdentifier = geckoResponseIdentifier; -function geckoRequestBatcher(queue) { +export function geckoRequestBatcher(queue) { const segments = {}; + // eslint-disable-next-line no-restricted-syntax for (const queueItem of queue) { + const geckoId = geckoIdMapper(queueItem.data.address, queueItem.data.network); + // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com) + // since it would return nothing. + // This can happen when adding a custom network that doesn't have a CoinGecko platform ID. + // eslint-disable-next-line no-continue + if (!geckoId && !queueItem.data.network.platformId) + continue; let segmentId = queueItem.data.baseCurrency; - const geckoId = (0, coingecko_1.geckoIdMapper)(queueItem.data.address, queueItem.data.networkId); if (geckoId) segmentId += ':natives'; else - segmentId += `:${queueItem.data.networkId}`; + segmentId += `:${queueItem.data.network.id}`; if (!segments[segmentId]) segments[segmentId] = []; segments[segmentId].push(queueItem); @@ -25,22 +30,20 @@ function geckoRequestBatcher(queue) { // deduplicating is OK because we use a key-based mapping (responseIdentifier) to map the responses // @TODO deduplication should happen BEFORE the pagination but without dropping items from queueSegment const pages = Object.entries(segments) - .map(([key, queueSegment]) => (0, pagination_1.paginate)(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))) + .map(([key, queueSegment]) => paginate(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))) .flat(1); const dedup = (x) => x.filter((y, i) => x.indexOf(y) === i); return pages.map(({ key, queueSegment }) => { // This is OK because we're segmented by baseCurrency const baseCurrency = queueSegment[0].data.baseCurrency; - const geckoPlatform = (0, coingecko_1.geckoNetworkIdMapper)(queueSegment[0].data.networkId); - // @TODO API key, customizable - const apiKeyString = ''; //`x_cg_pro_api_key=` + const geckoPlatform = queueSegment[0].data.network.platformId; + const mainApiUrl = 'https://cena.ambire.com'; let url; if (key.endsWith('natives')) - url = `https://api.coingecko.com/api/v3/simple/price?ids=${dedup(queueSegment.map((x) => (0, coingecko_1.geckoIdMapper)(x.data.address, x.data.networkId))).join('%2C')}&vs_currencies=${baseCurrency}${apiKeyString}`; + url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(queueSegment.map((x) => geckoIdMapper(x.data.address, x.data.network))).join('%2C')}&vs_currencies=${baseCurrency}`; else - url = `https://api.coingecko.com/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(queueSegment.map((x) => x.data.address)).join('%2C')}&vs_currencies=${baseCurrency}${apiKeyString}`; + url = `${mainApiUrl}/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(queueSegment.map((x) => x.data.address)).join('%2C')}&vs_currencies=${baseCurrency}`; return { url, queueSegment }; }); } -exports.geckoRequestBatcher = geckoRequestBatcher; //# sourceMappingURL=gecko.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.js.map b/dist/src/libs/portfolio/gecko.js.map index 7757abcc0..3fab8de39 100644 --- a/dist/src/libs/portfolio/gecko.js.map +++ b/dist/src/libs/portfolio/gecko.js.map @@ -1 +1 @@ -{"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/gecko.ts"],"names":[],"mappings":";;;AACA,6CAAuC;AACvC,sDAA4E;AAE5E,yEAAyE;AACzE,MAAM,WAAW,GAAG,EAAE,CAAA;AAEtB,SAAgB,uBAAuB,CAAC,SAAiB,EAAE,SAAiB;IAC1E,OAAO,IAAA,yBAAa,EAAC,SAAS,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAA;AACvE,CAAC;AAFD,0DAEC;AAED,SAAgB,mBAAmB,CAAC,KAAqB;IACvD,MAAM,QAAQ,GAA6B,EAAE,CAAA;IAC7C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE;QAC7B,IAAI,SAAS,GAAW,SAAS,CAAC,IAAI,CAAC,YAAY,CAAA;QACnD,MAAM,OAAO,GAAG,IAAA,yBAAa,EAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/E,IAAI,OAAO;YAAE,SAAS,IAAI,UAAU,CAAA;;YAC/B,SAAS,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAA;QAClD,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;KACpC;IACD,mGAAmG;IACnG,uGAAuG;IACvG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,CAC3B,IAAA,qBAAQ,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CACjF;SACA,IAAI,CAAC,CAAC,CAAC,CAAA;IACV,MAAM,KAAK,GAAG,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;QACzC,qDAAqD;QACrD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,YAAY,CAAA;QACvD,MAAM,aAAa,GAAG,IAAA,gCAAoB,EAAC,YAAY,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3E,8BAA8B;QAC9B,MAAM,YAAY,GAAG,EAAE,CAAA,CAAC,qBAAqB;QAC7C,IAAI,GAAG,CAAA;QACP,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YACzB,GAAG,GAAG,qDAAqD,KAAK,CAC9D,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,yBAAa,EAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACzE,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,YAAY,GAAG,YAAY,EAAE,CAAA;;YAE5D,GAAG,GAAG,uDAAuD,aAAa,uBAAuB,KAAK,CACpG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CACxC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,YAAY,GAAG,YAAY,EAAE,CAAA;QAC9D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;AACJ,CAAC;AAnCD,kDAmCC"} \ No newline at end of file +{"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/gecko.ts"],"names":[],"mappings":"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","sourcesContent":["import dotenv from 'dotenv'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Network } from '../../interfaces/network'\nimport { QueueElement, Request } from './batcher'\nimport { paginate } from './pagination'\n\ndotenv.config()\n\n// max tokens per request; we seem to have faster results when it's lower\nconst BATCH_LIMIT = 40\n\nexport function geckoResponseIdentifier(tokenAddr: string, network: Network): string {\n return geckoIdMapper(tokenAddr, network) || tokenAddr.toLowerCase()\n}\n\nexport function geckoRequestBatcher(queue: QueueElement[]): Request[] {\n const segments: { [key: string]: any[] } = {}\n\n // eslint-disable-next-line no-restricted-syntax\n for (const queueItem of queue) {\n const geckoId = geckoIdMapper(queueItem.data.address, queueItem.data.network)\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n // eslint-disable-next-line no-continue\n if (!geckoId && !queueItem.data.network.platformId) continue\n\n let segmentId: string = queueItem.data.baseCurrency\n\n if (geckoId) segmentId += ':natives'\n else segmentId += `:${queueItem.data.network.id}`\n\n if (!segments[segmentId]) segments[segmentId] = []\n segments[segmentId].push(queueItem)\n }\n // deduplicating is OK because we use a key-based mapping (responseIdentifier) to map the responses\n // @TODO deduplication should happen BEFORE the pagination but without dropping items from queueSegment\n const pages = Object.entries(segments)\n .map(([key, queueSegment]) =>\n paginate(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))\n )\n .flat(1)\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n return pages.map(({ key, queueSegment }) => {\n // This is OK because we're segmented by baseCurrency\n const baseCurrency = queueSegment[0]!.data.baseCurrency\n const geckoPlatform = queueSegment[0]!.data.network.platformId\n\n const mainApiUrl = 'https://cena.ambire.com'\n\n let url\n if (key.endsWith('natives'))\n url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(\n queueSegment.map((x) => geckoIdMapper(x.data.address, x.data.network))\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n else\n url = `${mainApiUrl}/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(\n queueSegment.map((x) => x.data.address)\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n return { url, queueSegment }\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.d.ts b/dist/src/libs/portfolio/getNetworksWithAssets.d.ts new file mode 100644 index 000000000..c890909c4 --- /dev/null +++ b/dist/src/libs/portfolio/getNetworksWithAssets.d.ts @@ -0,0 +1,8 @@ +import { AccountId } from '../../interfaces/account'; +import { RPCProviders } from '../../interfaces/provider'; +import { AccountAssetsState, AccountState } from './interfaces'; +declare const getAccountNetworksWithAssets: (accountId: AccountId, accountState: AccountState, storageStateByAccount: { + [accountId: string]: AccountAssetsState; +}, providers: RPCProviders) => AccountAssetsState; +export default getAccountNetworksWithAssets; +//# sourceMappingURL=getNetworksWithAssets.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.d.ts.map b/dist/src/libs/portfolio/getNetworksWithAssets.d.ts.map new file mode 100644 index 000000000..618abdca1 --- /dev/null +++ b/dist/src/libs/portfolio/getNetworksWithAssets.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getNetworksWithAssets.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/getNetworksWithAssets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE/D,QAAA,MAAM,4BAA4B,cACrB,SAAS,gBACN,YAAY;;cAIf,YAAY,KACtB,kBAqBF,CAAA;AAED,eAAe,4BAA4B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.js b/dist/src/libs/portfolio/getNetworksWithAssets.js new file mode 100644 index 000000000..776b91a55 --- /dev/null +++ b/dist/src/libs/portfolio/getNetworksWithAssets.js @@ -0,0 +1,20 @@ +const getAccountNetworksWithAssets = (accountId, accountState, storageStateByAccount, providers) => { + const networksWithAssets = { ...storageStateByAccount[accountId] }; + Object.keys(accountState).forEach((networkId) => { + if (!providers[networkId]) + return; + const isRPCDown = !providers[networkId].isWorking; + const result = accountState[networkId]?.result; + // RPC is down or an error occurred + if (!result || isRPCDown) + return; + // RPC is up and we have a result + const nonZeroTokens = result.tokens.filter(({ amount }) => Number(amount) !== 0); + const hasCollectibles = result.collections && result.collections.length > 0; + // The account has assets on this network + networksWithAssets[networkId] = !!nonZeroTokens.length || !!hasCollectibles; + }); + return networksWithAssets; +}; +export default getAccountNetworksWithAssets; +//# sourceMappingURL=getNetworksWithAssets.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.js.map b/dist/src/libs/portfolio/getNetworksWithAssets.js.map new file mode 100644 index 000000000..6357725f3 --- /dev/null +++ b/dist/src/libs/portfolio/getNetworksWithAssets.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getNetworksWithAssets.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getNetworksWithAssets.ts"],"names":[],"mappings":"AAIA,MAAM,4BAA4B,GAAG,CACnC,SAAoB,EACpB,YAA0B,EAC1B,qBAEC,EACD,SAAuB,EACH,EAAE;IACtB,MAAM,kBAAkB,GAAG,EAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAA;IAElE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAE9C,mCAAmC;QACnC,IAAI,CAAC,MAAM,IAAI,SAAS;YAAE,OAAM;QAEhC,iCAAiC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAChF,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QAE3E,yCAAyC;QACzC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC,eAAe,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,eAAe,4BAA4B,CAAA","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { AccountAssetsState, AccountState } from './interfaces'\n\nconst getAccountNetworksWithAssets = (\n accountId: AccountId,\n accountState: AccountState,\n storageStateByAccount: {\n [accountId: string]: AccountAssetsState\n },\n providers: RPCProviders\n): AccountAssetsState => {\n const networksWithAssets = { ...storageStateByAccount[accountId] }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const result = accountState[networkId]?.result\n\n // RPC is down or an error occurred\n if (!result || isRPCDown) return\n\n // RPC is up and we have a result\n const nonZeroTokens = result.tokens.filter(({ amount }) => Number(amount) !== 0)\n const hasCollectibles = result.collections && result.collections.length > 0\n\n // The account has assets on this network\n networksWithAssets[networkId] = !!nonZeroTokens.length || !!hasCollectibles\n })\n\n return networksWithAssets\n}\n\nexport default getAccountNetworksWithAssets\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.d.ts b/dist/src/libs/portfolio/getOnchainBalances.d.ts new file mode 100644 index 000000000..b1b6f13f0 --- /dev/null +++ b/dist/src/libs/portfolio/getOnchainBalances.d.ts @@ -0,0 +1,19 @@ +import { Network } from '../../interfaces/network'; +import { Deployless, DeploylessMode } from '../deployless/deployless'; +import { CollectionResult, GetOptions, LimitsOptions, MetaData, TokenError, TokenResult } from './interfaces'; +export declare function getDeploylessOpts(accountAddr: string, supportsStateOverride: boolean, opts: Partial): { + blockTag: string | number | undefined; + from: string; + mode: DeploylessMode; + stateToOverride: { + [x: string]: { + code: string; + stateDiff: { + [x: string]: string; + }; + }; + } | null; +}; +export declare function getNFTs(network: Network, deployless: Deployless, opts: Partial, accountAddr: string, tokenAddrs: [string, any][], limits: LimitsOptions): Promise<[[TokenError, CollectionResult][], {}][]>; +export declare function getTokens(network: Network, deployless: Deployless, opts: Partial, accountAddr: string, tokenAddrs: string[]): Promise<[[TokenError, TokenResult][], MetaData][]>; +//# sourceMappingURL=getOnchainBalances.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.d.ts.map b/dist/src/libs/portfolio/getOnchainBalances.d.ts.map new file mode 100644 index 000000000..1091ec142 --- /dev/null +++ b/dist/src/libs/portfolio/getOnchainBalances.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getOnchainBalances.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/getOnchainBalances.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAY,MAAM,0BAA0B,CAAA;AAE/E,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,QAAQ,EACR,UAAU,EACV,WAAW,EACZ,MAAM,cAAc,CAAA;AA6DrB,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,OAAO,EAC9B,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;;;;;;;;;;;;EAU1B;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CA0GnD;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAgGpD"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.js b/dist/src/libs/portfolio/getOnchainBalances.js index 735c0d232..4a92c6f8f 100644 --- a/dist/src/libs/portfolio/getOnchainBalances.js +++ b/dist/src/libs/portfolio/getOnchainBalances.js @@ -1,20 +1,14 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getTokens = exports.getNFTs = exports.EOA_SIMULATION_NONCE = void 0; -const ethers_1 = require("ethers"); -const AmbireAccount_json_1 = __importDefault(require("../../../contracts/compiled/AmbireAccount.json")); -const deploy_1 = require("../../consts/deploy"); -const account_1 = require("../account/account"); -const accountOp_1 = require("../accountOp/accountOp"); -const deployless_1 = require("../deployless/deployless"); -const deploy_2 = require("../proxyDeploy/deploy"); -const helpers_1 = require("./helpers"); -// fake nonce for EOA simulation -exports.EOA_SIMULATION_NONCE = '0x1000000000000000000000000000000000000000000000000000000000000000'; +import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; +import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; +import { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'; +import { getAccountDeployParams, isSmartAccount } from '../account/account'; +import { callToTuple, toSingletonCall } from '../accountOp/accountOp'; +import { DeploylessMode, parseErr } from '../deployless/deployless'; +import { getFlags, overrideSymbol } from './helpers'; class SimulationError extends Error { + simulationErrorMsg; + beforeNonce; + afterNonce; constructor(message, beforeNonce, afterNonce) { super(`simulation error: ${message}`); this.simulationErrorMsg = message; @@ -24,7 +18,7 @@ class SimulationError extends Error { } function handleSimulationError(error, beforeNonce, afterNonce, simulationOps) { if (error !== '0x') - throw new SimulationError((0, deployless_1.parseErr)(error) || error, beforeNonce, afterNonce); + throw new SimulationError(parseErr(error) || error, beforeNonce, afterNonce); // If the afterNonce is 0, it means that we reverted, even if the error is empty // In both BalanceOracle and NFTOracle, afterSimulation and therefore afterNonce will be left empty if (afterNonce === 0n) @@ -38,33 +32,27 @@ function handleSimulationError(error, beforeNonce, afterNonce, simulationOps) { const nonces = simulationOps .map((op) => op.nonce ?? -1n) .filter((nonce) => nonce !== -1n) - .sort(); + .sort((a, b) => { + if (a === b) + return 0; + if (a > b) + return 1; + return -1; + }); if (nonces.length && afterNonce < nonces[nonces.length - 1] + 1n) { throw new SimulationError('Failed to increment the nonce to the final account op nonce', beforeNonce, afterNonce); } } -function getDeploylessOpts(accountAddr, opts) { +export function getDeploylessOpts(accountAddr, supportsStateOverride, opts) { return { blockTag: opts.blockTag, - from: deploy_1.DEPLOYLESS_SIMULATION_FROM, - mode: opts.isEOA ? deployless_1.DeploylessMode.StateOverride : deployless_1.DeploylessMode.Detect, - stateToOverride: opts.isEOA - ? { - [accountAddr]: { - code: AmbireAccount_json_1.default.binRuntime, - stateDiff: { - // if we use 0x00...01 we get a geth bug: "invalid argument 2: hex number with leading zero digits\" - on some RPC providers - [`0x${(0, deploy_2.privSlot)(0, 'address', accountAddr, 'bytes32')}`]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - // any number with leading zeros is not supported on some RPCs - [(0, ethers_1.toBeHex)(1, 32)]: exports.EOA_SIMULATION_NONCE - } - } - } - : null + from: DEPLOYLESS_SIMULATION_FROM, + mode: supportsStateOverride && opts.isEOA ? DeploylessMode.StateOverride : DeploylessMode.Detect, + stateToOverride: supportsStateOverride && opts.isEOA ? getEoaSimulationStateOverride(accountAddr) : null }; } -async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limits) { - const deploylessOpts = getDeploylessOpts(accountAddr, opts); +export async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limits) { + const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts); const mapToken = (token) => { return { name: token.name, @@ -82,16 +70,16 @@ async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limit tokenAddrs.map(([, x]) => x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput)), limits.erc721Tokens ], deploylessOpts))[0]; - return collections.map((token) => [token.error, mapToken(token)]); + return [collections.map((token) => [token.error, mapToken(token)]), {}]; } const { accountOps, account } = opts.simulation; - const [factory, factoryCalldata] = (0, account_1.getAccountDeployParams)(account); - const simulationOps = accountOps.map(({ nonce, calls }) => ({ + const [factory, factoryCalldata] = getAccountDeployParams(account); + const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({ // EOA starts from a fake, specified nonce - nonce: (0, account_1.isSmartAccount)(account) ? nonce : BigInt(exports.EOA_SIMULATION_NONCE), - calls: calls.map(accountOp_1.callToTuple) + nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx), + calls: calls.map(toSingletonCall).map(callToTuple) })); - const [before, after, simulationErr] = await deployless.call('simulateAndGetAllNFTs', [ + const [before, after, simulationErr, , , deltaAddressesMapping] = await deployless.call('simulateAndGetAllNFTs', [ accountAddr, account.associatedKeys, tokenAddrs.map(([address]) => address), @@ -104,15 +92,47 @@ async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limit const beforeNonce = before[1]; const afterNonce = after[1]; handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps); - // no simulation was performed if the nonce is the same - const postSimulationAmounts = (after[1] === before[1] ? before[0] : after[0]).map(mapToken); - return before[0].map((token, i) => [ - token.error, - { ...mapToken(token), amountPostSimulation: postSimulationAmounts[i].amount } - ]); + // simulation was performed if the nonce is changed + const hasSimulation = afterNonce !== beforeNonce; + const simulationTokens = hasSimulation + ? after[0].map((simulationToken, tokenIndex) => ({ + ...mapToken(simulationToken), + addr: deltaAddressesMapping[tokenIndex] + })) + : null; + return [ + before[0].map((beforeToken, i) => { + const simulationToken = simulationTokens + ? simulationTokens.find((token) => token.addr.toLowerCase() === tokenAddrs[i][0].toLowerCase()) + : null; + const token = mapToken(beforeToken); + const receiving = []; + const sending = []; + token.collectibles.forEach((oldCollectible) => { + // the first check is required because if there are no changes we will always have !undefined from the second check + if (simulationToken?.collectibles && + !simulationToken?.collectibles?.includes(oldCollectible)) + sending.push(oldCollectible); + }); + simulationToken?.collectibles?.forEach((newCollectible) => { + if (!token.collectibles.includes(newCollectible)) + receiving.push(newCollectible); + }); + return [ + beforeToken.error, + { + ...token, + // Please refer to getTokens() for more info regarding `amountBeforeSimulation` calc + simulationAmount: simulationToken ? simulationToken.amount - token.amount : undefined, + amountPostSimulation: simulationToken ? simulationToken.amount : token.amount, + postSimulation: { receiving, sending } + } + ]; + }), + {} + ]; } -exports.getNFTs = getNFTs; -async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { +export async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { const mapToken = (token, address) => { return { amount: token.amount, @@ -120,24 +140,29 @@ async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { decimals: Number(token.decimals), symbol: address === '0x0000000000000000000000000000000000000000' ? network.nativeAssetSymbol - : (0, helpers_1.overrideSymbol)(address, network.id, token.symbol), + : overrideSymbol(address, network.id, token.symbol), address, - flags: (0, helpers_1.getFlags)({}, network.id, network.id, address) + flags: getFlags({}, network.id, network.id, address) }; }; - const deploylessOpts = getDeploylessOpts(accountAddr, opts); + const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts); if (!opts.simulation) { - const [results] = await deployless.call('getBalances', [accountAddr, tokenAddrs], deploylessOpts); - return results.map((token, i) => [token.error, mapToken(token, tokenAddrs[i])]); + const [results, blockNumber] = await deployless.call('getBalances', [accountAddr, tokenAddrs], deploylessOpts); + return [ + results.map((token, i) => [token.error, mapToken(token, tokenAddrs[i])]), + { + blockNumber + } + ]; } const { accountOps, account } = opts.simulation; - const simulationOps = accountOps.map(({ nonce, calls }) => ({ + const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({ // EOA starts from a fake, specified nonce - nonce: (0, account_1.isSmartAccount)(account) ? nonce : BigInt(exports.EOA_SIMULATION_NONCE), - calls: calls.map(accountOp_1.callToTuple) + nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx), + calls: calls.map(toSingletonCall).map(callToTuple) })); - const [factory, factoryCalldata] = (0, account_1.getAccountDeployParams)(account); - const [before, after, simulationErr] = await deployless.call('simulateAndGetBalances', [ + const [factory, factoryCalldata] = getAccountDeployParams(account); + const [before, after, simulationErr, , blockNumber, deltaAddressesMapping] = await deployless.call('simulateAndGetBalances', [ accountAddr, account.associatedKeys, tokenAddrs, @@ -148,15 +173,45 @@ async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { const beforeNonce = before[1]; const afterNonce = after[1]; handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps); - // no simulation was performed if the nonce is the same - const postSimulationAmounts = afterNonce === beforeNonce ? before[0] : after[0]; - return before[0].map((token, i) => [ - token.error, + // simulation was performed if the nonce is changed + const hasSimulation = afterNonce !== beforeNonce; + const simulationTokens = hasSimulation + ? after[0].map((simulationToken, tokenIndex) => ({ + ...simulationToken, + amount: simulationToken.amount, + addr: deltaAddressesMapping[tokenIndex] + })) + : null; + return [ + before[0].map((token, i) => { + const simulation = simulationTokens + ? simulationTokens.find((simulationToken) => simulationToken.addr === tokenAddrs[i]) + : null; + // Here's the math before `simulationAmount` and `amountPostSimulation`. + // AccountA initial balance: 10 USDC. + // AccountA attempts to transfer 5 USDC (not signed yet). + // An external entity sends 3 USDC to AccountA on-chain. + // Deployless simulation contract processing: + // - Balance before simulation (before[0]): 10 USDC + 3 USDC = 13 USDC. + // - Balance after simulation (after[0]): 10 USDC - 5 USDC + 3 USDC = 8 USDC. + // Simulation-only balance displayed on the Sign Screen (we will call it `simulationAmount`): + // - difference between after simulation and before: 8 USDC - 13 USDC = -5 USDC + // Final balance displayed on the Dashboard (we will call it `amountPostSimulation`): + // - after[0], 8 USDC. + return [ + token.error, + { + ...mapToken(token, tokenAddrs[i]), + simulationAmount: simulation ? simulation.amount - token.amount : undefined, + amountPostSimulation: simulation ? simulation.amount : token.amount + } + ]; + }), { - ...mapToken(token, tokenAddrs[i]), - amountPostSimulation: postSimulationAmounts[i].amount + blockNumber, + beforeNonce, + afterNonce } - ]); + ]; } -exports.getTokens = getTokens; //# sourceMappingURL=getOnchainBalances.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.js.map b/dist/src/libs/portfolio/getOnchainBalances.js.map index a51b744eb..e17c205c7 100644 --- a/dist/src/libs/portfolio/getOnchainBalances.js.map +++ b/dist/src/libs/portfolio/getOnchainBalances.js.map @@ -1 +1 @@ -{"version":3,"file":"getOnchainBalances.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getOnchainBalances.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"getOnchainBalances.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getOnchainBalances.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { callToTuple, toSingletonCall } from '../accountOp/accountOp'\nimport { Deployless, DeploylessMode, parseErr } from '../deployless/deployless'\nimport { getFlags, overrideSymbol } from './helpers'\nimport {\n CollectionResult,\n GetOptions,\n LimitsOptions,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nclass SimulationError extends Error {\n public simulationErrorMsg: string\n\n public beforeNonce: bigint\n\n public afterNonce: bigint\n\n constructor(message: string, beforeNonce: bigint, afterNonce: bigint) {\n super(`simulation error: ${message}`)\n this.simulationErrorMsg = message\n this.beforeNonce = beforeNonce\n this.afterNonce = afterNonce\n }\n}\n\nfunction handleSimulationError(\n error: string,\n beforeNonce: bigint,\n afterNonce: bigint,\n simulationOps: { nonce: bigint | null; calls: [string, string, string][] }[]\n) {\n if (error !== '0x') throw new SimulationError(parseErr(error) || error, beforeNonce, afterNonce)\n\n // If the afterNonce is 0, it means that we reverted, even if the error is empty\n // In both BalanceOracle and NFTOracle, afterSimulation and therefore afterNonce will be left empty\n if (afterNonce === 0n) throw new SimulationError('Simulation reverted', beforeNonce, afterNonce)\n\n if (afterNonce < beforeNonce)\n throw new SimulationError(\n 'lower \"after\" nonce, should not be possible',\n beforeNonce,\n afterNonce\n )\n if (simulationOps.length && afterNonce === beforeNonce)\n throw new SimulationError(\n 'Account op passed for simulation but the nonce did not increment. Perhaps wrong nonce set in Account op',\n beforeNonce,\n afterNonce\n )\n\n // make sure the afterNonce (after all the accOps execution) is\n // at least the same as the final nonce in the simulationOps\n const nonces: bigint[] = simulationOps\n .map((op) => op.nonce ?? -1n)\n .filter((nonce) => nonce !== -1n)\n .sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n if (nonces.length && afterNonce < nonces[nonces.length - 1] + 1n) {\n throw new SimulationError(\n 'Failed to increment the nonce to the final account op nonce',\n beforeNonce,\n afterNonce\n )\n }\n}\n\nexport function getDeploylessOpts(\n accountAddr: string,\n supportsStateOverride: boolean,\n opts: Partial\n) {\n return {\n blockTag: opts.blockTag,\n from: DEPLOYLESS_SIMULATION_FROM,\n mode:\n supportsStateOverride && opts.isEOA ? DeploylessMode.StateOverride : DeploylessMode.Detect,\n stateToOverride:\n supportsStateOverride && opts.isEOA ? getEoaSimulationStateOverride(accountAddr) : null\n }\n}\n\nexport async function getNFTs(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: [string, any][],\n limits: LimitsOptions\n): Promise<[[TokenError, CollectionResult][], {}][]> {\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n const mapToken = (token: any) => {\n return {\n name: token.name,\n networkId: network.id,\n symbol: token.symbol,\n amount: BigInt(token.nfts.length),\n decimals: 1,\n collectibles: [...token.nfts]\n } as CollectionResult\n }\n\n if (!opts.simulation) {\n const collections = (\n await deployless.call(\n 'getAllNFTs',\n [\n accountAddr,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) =>\n x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput)\n ),\n limits.erc721Tokens\n ],\n deploylessOpts\n )\n )[0]\n\n return [collections.map((token: any) => [token.error, mapToken(token)]), {}]\n }\n\n const { accountOps, account } = opts.simulation\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [before, after, simulationErr, , , deltaAddressesMapping] = await deployless.call(\n 'simulateAndGetAllNFTs',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) => (x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput))),\n limits.erc721Tokens,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens: (CollectionResult & { addr: any })[] | null = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...mapToken(simulationToken),\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n\n return [\n before[0].map((beforeToken: any, i: number) => {\n const simulationToken = simulationTokens\n ? simulationTokens.find(\n (token: any) => token.addr.toLowerCase() === tokenAddrs[i][0].toLowerCase()\n )\n : null\n\n const token = mapToken(beforeToken)\n const receiving: bigint[] = []\n const sending: bigint[] = []\n\n token.collectibles.forEach((oldCollectible: bigint) => {\n // the first check is required because if there are no changes we will always have !undefined from the second check\n if (\n simulationToken?.collectibles &&\n !simulationToken?.collectibles?.includes(oldCollectible)\n )\n sending.push(oldCollectible)\n })\n simulationToken?.collectibles?.forEach((newCollectible: bigint) => {\n if (!token.collectibles.includes(newCollectible)) receiving.push(newCollectible)\n })\n\n return [\n beforeToken.error,\n {\n ...token,\n // Please refer to getTokens() for more info regarding `amountBeforeSimulation` calc\n simulationAmount: simulationToken ? simulationToken.amount - token.amount : undefined,\n amountPostSimulation: simulationToken ? simulationToken.amount : token.amount,\n postSimulation: { receiving, sending }\n }\n ]\n }),\n {}\n ]\n}\n\nexport async function getTokens(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: string[]\n): Promise<[[TokenError, TokenResult][], MetaData][]> {\n const mapToken = (token: any, address: string) => {\n return {\n amount: token.amount,\n networkId: network.id,\n decimals: Number(token.decimals),\n symbol:\n address === '0x0000000000000000000000000000000000000000'\n ? network.nativeAssetSymbol\n : overrideSymbol(address, network.id, token.symbol),\n address,\n flags: getFlags({}, network.id, network.id, address)\n } as TokenResult\n }\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n if (!opts.simulation) {\n const [results, blockNumber] = await deployless.call(\n 'getBalances',\n [accountAddr, tokenAddrs],\n deploylessOpts\n )\n\n return [\n results.map((token: any, i: number) => [token.error, mapToken(token, tokenAddrs[i])]),\n {\n blockNumber\n }\n ]\n }\n const { accountOps, account } = opts.simulation\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const [before, after, simulationErr, , blockNumber, deltaAddressesMapping] =\n await deployless.call(\n 'simulateAndGetBalances',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...simulationToken,\n amount: simulationToken.amount,\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n return [\n before[0].map((token: any, i: number) => {\n const simulation = simulationTokens\n ? simulationTokens.find((simulationToken: any) => simulationToken.addr === tokenAddrs[i])\n : null\n\n // Here's the math before `simulationAmount` and `amountPostSimulation`.\n // AccountA initial balance: 10 USDC.\n // AccountA attempts to transfer 5 USDC (not signed yet).\n // An external entity sends 3 USDC to AccountA on-chain.\n // Deployless simulation contract processing:\n // - Balance before simulation (before[0]): 10 USDC + 3 USDC = 13 USDC.\n // - Balance after simulation (after[0]): 10 USDC - 5 USDC + 3 USDC = 8 USDC.\n // Simulation-only balance displayed on the Sign Screen (we will call it `simulationAmount`):\n // - difference between after simulation and before: 8 USDC - 13 USDC = -5 USDC\n // Final balance displayed on the Dashboard (we will call it `amountPostSimulation`):\n // - after[0], 8 USDC.\n return [\n token.error,\n {\n ...mapToken(token, tokenAddrs[i]),\n simulationAmount: simulation ? simulation.amount - token.amount : undefined,\n amountPostSimulation: simulation ? simulation.amount : token.amount\n }\n ]\n }),\n {\n blockNumber,\n beforeNonce,\n afterNonce\n }\n ]\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.d.ts b/dist/src/libs/portfolio/helpers.d.ts new file mode 100644 index 000000000..b9b95d2d1 --- /dev/null +++ b/dist/src/libs/portfolio/helpers.d.ts @@ -0,0 +1,42 @@ +import { Account, AccountId } from '../../interfaces/account'; +import { Network, NetworkId } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { CustomToken, TokenPreference } from './customToken'; +import { AccountState, AdditionalPortfolioNetworkResult, PreviousHintsStorage, StrippedExternalHintsAPIResponse, TokenResult } from './interfaces'; +export declare function overrideSymbol(address: string, networkId: string, symbol: string): string; +export declare function getFlags(networkData: any, networkId: NetworkId, tokenNetwork: NetworkId, address: string): { + onGasTank: boolean; + rewardsType: string | null; + canTopUpGasTank: boolean | undefined; + isFeeToken: boolean; +}; +export declare const validateERC20Token: (token: { + address: string; + networkId: NetworkId; +}, accountId: string, provider: RPCProvider) => Promise<(string | boolean)[]>; +export declare const shouldGetAdditionalPortfolio: (account: Account) => boolean; +export declare const getTokenAmount: (token: TokenResult) => bigint; +export declare const getTokenBalanceInUSD: (token: TokenResult) => number; +export declare const getTotal: (t: TokenResult[], excludeHiddenTokens?: boolean) => { + [key: string]: number; +}; +export declare const addHiddenTokenValueToTotal: (totalWithoutHiddenTokens: number, tokens: TokenResult[]) => number; +export declare const getAccountPortfolioTotal: (accountPortfolio: AccountState, excludeNetworks?: Network['id'][], excludeHiddenTokens?: boolean) => number; +export declare const getPinnedGasTankTokens: (availableGasTankAssets: TokenResult[], hasNonZeroTokens: boolean, accountId: AccountId, gasTankTokens: TokenResult[]) => TokenResult[]; +export declare const stripExternalHintsAPIResponse: (response: StrippedExternalHintsAPIResponse | null) => StrippedExternalHintsAPIResponse | null; +/** + * Tasks: + * - updates the external hints for [network:account] with the latest from the external API + * - cleans the learned tokens by removing non-ERC20 items + * - updates the timestamp of learned tokens + * - returns the updated hints + */ +export declare function getUpdatedHints(latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null, tokens: TokenResult[], tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'], networkId: NetworkId, storagePreviousHints: PreviousHintsStorage, key: string, customTokens: CustomToken[]): PreviousHintsStorage; +export declare const getTokensReadyToLearn: (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => string[]; +export declare const tokenFilter: (token: TokenResult, nativeToken: TokenResult, network: Network, hasNonZeroTokens: boolean, additionalHints: string[] | undefined, isTokenPreference: boolean) => boolean; +/** + * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details) + * and set the token.flags.isHidden flag. + */ +export declare const processTokens: (tokenResults: TokenResult[], network: Network, hasNonZeroTokens: boolean, additionalHints: string[] | undefined, tokenPreferences: TokenPreference[]) => TokenResult[]; +//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.d.ts.map b/dist/src/libs/portfolio/helpers.d.ts.map new file mode 100644 index 000000000..0c2166f05 --- /dev/null +++ b/dist/src/libs/portfolio/helpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,YAAY,EACZ,gCAAgC,EAChC,oBAAoB,EACpB,gCAAgC,EAChC,WAAW,EACZ,MAAM,cAAc,CAAA;AAUrB,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAOhF;AAED,wBAAgB,QAAQ,CACtB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,MAAM;;;;;EA8BhB;AAED,eAAO,MAAM,kBAAkB,UACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,aACrC,MAAM,YACP,WAAW,kCAiCtB,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,OAAO,YAE5D,CAAA;AAID,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,MAEnD,CAAA;AAED,eAAO,MAAM,oBAAoB,UAAW,WAAW,WAQtD,CAAA;AAED,eAAO,MAAM,QAAQ,MAAO,WAAW,EAAE,wBAAuB,OAAO;;CAa/D,CAAA;AAER,eAAO,MAAM,0BAA0B,6BACX,MAAM,UACxB,WAAW,EAAE,WAOtB,CAAA;AAED,eAAO,MAAM,wBAAwB,qBACjB,YAAY,oBACb,OAAO,CAAC,IAAI,CAAC,EAAE,0CAkBjC,CAAA;AAED,eAAO,MAAM,sBAAsB,2BACT,WAAW,EAAE,oBACnB,OAAO,aACd,SAAS,iBACL,WAAW,EAAE,kBA+C7B,CAAA;AAED,eAAO,MAAM,6BAA6B,aAC9B,gCAAgC,GAAG,IAAI,KAChD,gCAAgC,GAAG,IAUrC,CAAA;AAUD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAE7B,0BAA0B,EAAE,gCAAgC,GAAG,IAAI,EACnE,MAAM,EAAE,WAAW,EAAE,EACrB,WAAW,EAAE,gCAAgC,CAAC,aAAa,CAAC,EAC5D,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,WAAW,EAAE,GAC1B,oBAAoB,CA2FtB;AAED,eAAO,MAAM,qBAAqB,sBAAuB,MAAM,EAAE,gBAAgB,WAAW,EAAE,aAO7F,CAAA;AAED,eAAO,MAAM,WAAW,UACf,WAAW,eACL,WAAW,WACf,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,qBAClB,OAAO,KACzB,OAkCF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,iBACV,WAAW,EAAE,WAClB,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,oBACnB,eAAe,EAAE,KAClC,WAAW,EAqBb,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.js b/dist/src/libs/portfolio/helpers.js index 1a50dea24..61a2cec7d 100644 --- a/dist/src/libs/portfolio/helpers.js +++ b/dist/src/libs/portfolio/helpers.js @@ -1,14 +1,8 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.tokenFilter = exports.getUpdatedHints = exports.getPinnedGasTankTokens = exports.getTotal = exports.getTokenAmount = exports.shouldGetAdditionalPortfolio = exports.validateERC20Token = exports.getFlags = exports.overrideSymbol = void 0; -const ethers_1 = require("ethers"); -const IERC20_json_1 = __importDefault(require("../../../contracts/compiled/IERC20.json")); -const gasTankFeeTokens_1 = __importDefault(require("../../consts/gasTankFeeTokens")); -const pinnedTokens_1 = require("../../consts/pinnedTokens"); -const account_1 = require("../account/account"); +import { Contract, formatUnits, ZeroAddress } from 'ethers'; +import IERC20 from '../../../contracts/compiled/IERC20.json'; +import gasTankFeeTokens from '../../consts/gasTankFeeTokens'; +import { PINNED_TOKENS } from '../../consts/pinnedTokens'; +import { isSmartAccount } from '../account/account'; const usdcEMapping = { avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664', moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3', @@ -16,15 +10,14 @@ const usdcEMapping = { polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607' }; -function overrideSymbol(address, networkId, symbol) { +export function overrideSymbol(address, networkId, symbol) { // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) { return 'USDC.E'; } return symbol; } -exports.overrideSymbol = overrideSymbol; -function getFlags(networkData, networkId, tokenNetwork, address) { +export function getFlags(networkData, networkId, tokenNetwork, address) { const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId); const onGasTank = networkId === 'gasTank'; let rewardsType = null; @@ -32,10 +25,13 @@ function getFlags(networkData, networkId, tokenNetwork, address) { rewardsType = 'wallet-rewards'; if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase()) rewardsType = 'wallet-vesting'; - const foundFeeToken = gasTankFeeTokens_1.default.find((t) => t.address.toLowerCase() === address.toLowerCase() && + const foundFeeToken = gasTankFeeTokens.find((t) => t.address.toLowerCase() === address.toLowerCase() && (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)); - const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit; - const isFeeToken = address === ethers_1.ZeroAddress || !!foundFeeToken; + const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType; + const isFeeToken = address === ZeroAddress || + // disable if not in gas tank + (foundFeeToken && !foundFeeToken.disableAsFeeToken) || + networkId === 'gasTank'; return { onGasTank, rewardsType, @@ -43,9 +39,8 @@ function getFlags(networkData, networkId, tokenNetwork, address) { isFeeToken }; } -exports.getFlags = getFlags; -const validateERC20Token = async (token, accountId, provider) => { - const erc20 = new ethers_1.Contract(token?.address, IERC20_json_1.default.abi, provider); +export const validateERC20Token = async (token, accountId, provider) => { + const erc20 = new Contract(token?.address, IERC20.abi, provider); const type = 'erc20'; let isValid = true; let hasError = false; @@ -71,31 +66,56 @@ const validateERC20Token = async (token, accountId, provider) => { isValid = isValid && !hasError; return [isValid, type]; }; -exports.validateERC20Token = validateERC20Token; -const shouldGetAdditionalPortfolio = (account) => { - return (0, account_1.isSmartAccount)(account); +export const shouldGetAdditionalPortfolio = (account) => { + return isSmartAccount(account); }; -exports.shouldGetAdditionalPortfolio = shouldGetAdditionalPortfolio; // fetch the amountPostSimulation for the token if set // otherwise, the token.amount -const getTokenAmount = (token) => { +export const getTokenAmount = (token) => { return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount; }; -exports.getTokenAmount = getTokenAmount; -const getTotal = (t) => t.reduce((cur, token) => { +export const getTokenBalanceInUSD = (token) => { + const amount = getTokenAmount(token); + const { decimals, priceIn } = token; + const balance = parseFloat(formatUnits(amount, decimals)); + const price = priceIn.find(({ baseCurrency }) => baseCurrency === 'usd')?.price || 0; + return balance * price; +}; +export const getTotal = (t, excludeHiddenTokens = true) => t.reduce((cur, token) => { const localCur = cur; // Add index signature to the type of localCur - if (token.isHidden) + if (token.flags.isHidden && excludeHiddenTokens) return localCur; // eslint-disable-next-line no-restricted-syntax for (const x of token.priceIn) { const currentAmount = localCur[x.baseCurrency] || 0; - const tokenAmount = Number((0, exports.getTokenAmount)(token)) / 10 ** token.decimals; + const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals; localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price; } return localCur; }, {}); -exports.getTotal = getTotal; -const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) => { +export const addHiddenTokenValueToTotal = (totalWithoutHiddenTokens, tokens) => { + return tokens.reduce((cur, token) => { + if (!token.flags.isHidden) + return cur; + return cur + getTokenBalanceInUSD(token); + }, totalWithoutHiddenTokens); +}; +export const getAccountPortfolioTotal = (accountPortfolio, excludeNetworks = [], excludeHiddenTokens = true) => { + if (!accountPortfolio) + return 0; + return Object.keys(accountPortfolio).reduce((acc, key) => { + if (excludeNetworks.includes(key)) + return acc; + const networkData = accountPortfolio[key]; + const tokenList = networkData?.result?.tokens || []; + let networkTotalAmountUSD = networkData?.result?.total.usd || 0; + if (!excludeHiddenTokens) { + networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList); + } + return acc + networkTotalAmountUSD; + }, 0); +}; +export const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) => { if (!availableGasTankAssets) return []; // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens @@ -106,7 +126,7 @@ const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accoun const isAlreadyPinned = !!acc.find((accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()); if (isGasTankToken || isAlreadyPinned) return acc; - const correspondingPinnedToken = pinnedTokens_1.PINNED_TOKENS.find((pinnedToken) => (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) && + const correspondingPinnedToken = PINNED_TOKENS.find((pinnedToken) => (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) && pinnedToken.address === token.address && pinnedToken.networkId === token.network); if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) { @@ -133,56 +153,147 @@ const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accoun return acc; }, []); }; -exports.getPinnedGasTankTokens = getPinnedGasTankTokens; -// Updates the previous hints storage with the latest portfolio get result. -function getUpdatedHints(result, networkId, storagePreviousHints, key, tokenPreferences) { - const hints = { ...storagePreviousHints }; - if (!hints.fromExternalAPI) - hints.fromExternalAPI = {}; - if (!hints.learnedTokens) - hints.learnedTokens = {}; - const erc20s = result.tokens.filter((token) => token.amount > 0n).map((token) => token.address); - const erc721s = Object.fromEntries(result.collections.map((collection) => [ - collection.address, - result.hints.erc721s[collection.address] - ])); - const previousHintsFromExternalAPI = (hints.fromExternalAPI && hints.fromExternalAPI[key] && hints.fromExternalAPI[key]?.erc20s) || - []; - hints.fromExternalAPI[key] = { erc20s, erc721s }; - if (Object.keys(previousHintsFromExternalAPI).length > 0) { +export const stripExternalHintsAPIResponse = (response) => { + if (!response) + return null; + const { erc20s, erc721s, lastUpdate } = response; + return { + erc20s, + erc721s, + lastUpdate + }; +}; +const getLowercaseAddressArrayForNetwork = (array, networkId) => array + .filter((item) => !networkId || item.networkId === networkId) + .map((item) => item.address.toLowerCase()); +/** + * Tasks: + * - updates the external hints for [network:account] with the latest from the external API + * - cleans the learned tokens by removing non-ERC20 items + * - updates the timestamp of learned tokens + * - returns the updated hints + */ +export function getUpdatedHints( +// Can only be null in case of no external api hints +latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints, key, customTokens) { + const previousHints = { ...storagePreviousHints }; + if (!previousHints.fromExternalAPI) + previousHints.fromExternalAPI = {}; + if (!previousHints.learnedTokens) + previousHints.learnedTokens = {}; + const { learnedTokens, learnedNfts } = previousHints; + const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []; + const networkLearnedTokens = learnedTokens[networkId] || {}; + // The keys in learnedTokens are addresses of tokens + const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens); + // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens. + // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens. + // For instance, a SmartContract address can be passed as a learned token. + // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio. + // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance, + // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`. + // Note: + // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter). + // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen, + // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway. + const unknownBalanceError = '0x756e6b6e'; + const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter((tokenAddress) => { + const hasError = !!tokenErrors?.find((errorToken) => errorToken.address.toLowerCase() === tokenAddress.toLowerCase() && + errorToken.error === unknownBalanceError); + return hasError; + }); + if (networkLearnedTokenAddresses.length) { + // Lowercase all addresses outside of the loop for better performance + const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(PINNED_TOKENS, networkId); + const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId); + const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n); + const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(networkTokensWithBalance, networkId); + const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) => hint.toLowerCase()); + // Update the timestamp of learned tokens + // and self-clean non-ERC20 items. // eslint-disable-next-line no-restricted-syntax - for (const address of erc20s) { - const isPinned = pinnedTokens_1.PINNED_TOKENS.some((pinned) => pinned.address.toLowerCase() === address.toLowerCase() && pinned.networkId === networkId); - const isTokenPreference = tokenPreferences.some((preference) => preference.address.toLowerCase() === address.toLowerCase() && - preference.networkId === networkId); - if (!previousHintsFromExternalAPI.includes(address) && !isPinned && !isTokenPreference) { - if (!hints.learnedTokens[networkId]) - hints.learnedTokens[networkId] = {}; - hints.learnedTokens[networkId][address] = Date.now().toString(); + for (const address of networkLearnedTokenAddresses) { + const lowercaseAddress = address.toLowerCase(); + // Delete non-ERC20 items from the learned tokens + if (networkLearnedTokenAddressesHavingError.find((errorToken) => errorToken.toLowerCase() === lowercaseAddress)) { + delete learnedTokens[networkId][lowercaseAddress]; + // eslint-disable-next-line no-continue + continue; + } + const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress); + const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress); + const isTokenInExternalAPIHints = lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress); + const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress); + if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) { + // Don't set the timestamp back to null if the account doesn't have balance for the token + // as learnedTokens aren't account specific and one account can have balance for the token + // while other don't + learnedTokens[networkId][address] = Date.now().toString(); } } } - return hints; + // Update the external hints for [network:account] with the latest from the external API + previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI; + return { + fromExternalAPI: previousHints.fromExternalAPI, + learnedTokens, + learnedNfts + }; } -exports.getUpdatedHints = getUpdatedHints; -const tokenFilter = (token, network, hasNonZeroTokens, additionalHints, tokenPreferences) => { - const isTokenPreference = tokenPreferences?.find((tokenPreference) => { - return tokenPreference.address === token.address && tokenPreference.networkId === network.id; - }); - if (isTokenPreference) { - token.isHidden = isTokenPreference.isHidden; - } +export const getTokensReadyToLearn = (toBeLearnedTokens, resultTokens) => { + if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length) + return []; + return toBeLearnedTokens.filter((address) => resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)); +}; +export const tokenFilter = (token, nativeToken, network, hasNonZeroTokens, additionalHints, isTokenPreference) => { + // Never add ERC20 tokens that represent the network's native token. + // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`. + // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard. + // From a user's perspective, the token is duplicated and counted twice in the balance. + const isERC20NativeRepresentation = (token.symbol === nativeToken?.symbol || + network.oldNativeAssetSymbols?.includes(token.symbol)) && + token.amount === nativeToken.amount && + token.address !== ZeroAddress; + if (isERC20NativeRepresentation) + return false; + // always include tokens added as a preference + if (isTokenPreference) + return true; // always include > 0 amount and native token - if (token.amount > 0 || token.address === ethers_1.ZeroAddress) + if (token.amount > 0 || token.address === ZeroAddress) return true; - const isPinned = !!pinnedTokens_1.PINNED_TOKENS.find((pinnedToken) => { + const isPinned = !!PINNED_TOKENS.find((pinnedToken) => { return pinnedToken.networkId === network.id && pinnedToken.address === token.address; }); - const isInAdditionalHints = additionalHints?.includes(token.address); + // make the comparison to lowercase as otherwise, it doesn't work + const hintsLowerCase = additionalHints + ? additionalHints.map((hint) => hint.toLowerCase()) + : undefined; + const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase()); // if the amount is 0 // return the token if it's pinned and requested const pinnedRequested = isPinned && !hasNonZeroTokens; - return !!isTokenPreference || isInAdditionalHints || pinnedRequested; + return isInAdditionalHints || pinnedRequested; +}; +/** + * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details) + * and set the token.flags.isHidden flag. + */ +export const processTokens = (tokenResults, network, hasNonZeroTokens, additionalHints, tokenPreferences) => { + // We need to know the native token in order to execute our filtration logic in tokenFilter. + // For performance reasons, we define it here once, instead of during every single iteration in the reduce method. + const nativeToken = tokenResults.find((token) => token.address === ZeroAddress); + return tokenResults.reduce((tokens, tokenResult) => { + const token = { ...tokenResult }; + const preference = tokenPreferences?.find((tokenPreference) => { + return tokenPreference.address === token.address && tokenPreference.networkId === network.id; + }); + if (preference) { + token.flags.isHidden = preference.isHidden; + } + if (tokenFilter(token, nativeToken, network, hasNonZeroTokens, additionalHints, !!preference)) + tokens.push(token); + return tokens; + }, []); }; -exports.tokenFilter = tokenFilter; //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.js.map b/dist/src/libs/portfolio/helpers.js.map index eba1dfc9d..4841f7d74 100644 --- a/dist/src/libs/portfolio/helpers.js.map +++ b/dist/src/libs/portfolio/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, formatUnits, ZeroAddress } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { isSmartAccount } from '../account/account'\nimport { CustomToken, TokenPreference } from './customToken'\nimport {\n AccountState,\n AdditionalPortfolioNetworkResult,\n PreviousHintsStorage,\n StrippedExternalHintsAPIResponse,\n TokenResult\n} from './interfaces'\n\nconst usdcEMapping: { [key: string]: string } = {\n avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',\n moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3',\n arbitrum: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607'\n}\n\nexport function overrideSymbol(address: string, networkId: string, symbol: string) {\n // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol\n if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) {\n return 'USDC.E'\n }\n\n return symbol\n}\n\nexport function getFlags(\n networkData: any,\n networkId: NetworkId,\n tokenNetwork: NetworkId,\n address: string\n) {\n const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId)\n const onGasTank = networkId === 'gasTank'\n\n let rewardsType = null\n if (networkData?.xWalletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-rewards'\n if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-vesting'\n\n const foundFeeToken = gasTankFeeTokens.find(\n (t) =>\n t.address.toLowerCase() === address.toLowerCase() &&\n (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)\n )\n\n const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType\n const isFeeToken =\n address === ZeroAddress ||\n // disable if not in gas tank\n (foundFeeToken && !foundFeeToken.disableAsFeeToken) ||\n networkId === 'gasTank'\n\n return {\n onGasTank,\n rewardsType,\n canTopUpGasTank,\n isFeeToken\n }\n}\n\nexport const validateERC20Token = async (\n token: { address: string; networkId: NetworkId },\n accountId: string,\n provider: RPCProvider\n) => {\n const erc20 = new Contract(token?.address, IERC20.abi, provider)\n\n const type = 'erc20'\n let isValid = true\n let hasError = false\n\n const [balance, symbol, decimals] = (await Promise.all([\n erc20.balanceOf(accountId).catch(() => {\n hasError = true\n }),\n erc20.symbol().catch(() => {\n hasError = true\n }),\n erc20.decimals().catch(() => {\n hasError = true\n })\n ]).catch(() => {\n hasError = true\n isValid = false\n })) || [undefined, undefined, undefined]\n\n if (\n typeof balance === 'undefined' ||\n typeof symbol === 'undefined' ||\n typeof decimals === 'undefined'\n ) {\n isValid = false\n }\n\n isValid = isValid && !hasError\n return [isValid, type]\n}\n\nexport const shouldGetAdditionalPortfolio = (account: Account) => {\n return isSmartAccount(account)\n}\n\n// fetch the amountPostSimulation for the token if set\n// otherwise, the token.amount\nexport const getTokenAmount = (token: TokenResult): bigint => {\n return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount\n}\n\nexport const getTokenBalanceInUSD = (token: TokenResult) => {\n const amount = getTokenAmount(token)\n const { decimals, priceIn } = token\n const balance = parseFloat(formatUnits(amount, decimals))\n const price =\n priceIn.find(({ baseCurrency }: { baseCurrency: string }) => baseCurrency === 'usd')?.price || 0\n\n return balance * price\n}\n\nexport const getTotal = (t: TokenResult[], excludeHiddenTokens: boolean = true) =>\n t.reduce((cur: { [key: string]: number }, token: TokenResult) => {\n const localCur = cur // Add index signature to the type of localCur\n if (token.flags.isHidden && excludeHiddenTokens) return localCur\n // eslint-disable-next-line no-restricted-syntax\n for (const x of token.priceIn) {\n const currentAmount = localCur[x.baseCurrency] || 0\n\n const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals\n localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price\n }\n\n return localCur\n }, {})\n\nexport const addHiddenTokenValueToTotal = (\n totalWithoutHiddenTokens: number,\n tokens: TokenResult[]\n) => {\n return tokens.reduce((cur: number, token: TokenResult) => {\n if (!token.flags.isHidden) return cur\n\n return cur + getTokenBalanceInUSD(token)\n }, totalWithoutHiddenTokens)\n}\n\nexport const getAccountPortfolioTotal = (\n accountPortfolio: AccountState,\n excludeNetworks: Network['id'][] = [],\n excludeHiddenTokens = true\n) => {\n if (!accountPortfolio) return 0\n\n return Object.keys(accountPortfolio).reduce((acc, key) => {\n if (excludeNetworks.includes(key)) return acc\n\n const networkData = accountPortfolio[key]\n const tokenList = networkData?.result?.tokens || []\n let networkTotalAmountUSD = networkData?.result?.total.usd || 0\n\n if (!excludeHiddenTokens) {\n networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList)\n }\n\n return acc + networkTotalAmountUSD\n }, 0)\n}\n\nexport const getPinnedGasTankTokens = (\n availableGasTankAssets: TokenResult[],\n hasNonZeroTokens: boolean,\n accountId: AccountId,\n gasTankTokens: TokenResult[]\n) => {\n if (!availableGasTankAssets) return []\n // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens\n if (hasNonZeroTokens) return []\n\n return availableGasTankAssets.reduce((acc: TokenResult[], token: any) => {\n const isGasTankToken = !!gasTankTokens.find(\n (gasTankToken: TokenResult) =>\n gasTankToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n const isAlreadyPinned = !!acc.find(\n (accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n\n if (isGasTankToken || isAlreadyPinned) return acc\n\n const correspondingPinnedToken = PINNED_TOKENS.find(\n (pinnedToken) =>\n (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) &&\n pinnedToken.address === token.address &&\n pinnedToken.networkId === token.network\n )\n\n if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) {\n acc.push({\n address: token.address,\n symbol: token.symbol.toUpperCase(),\n amount: 0n,\n networkId: correspondingPinnedToken.networkId,\n decimals: token.decimals,\n priceIn: [\n {\n baseCurrency: 'usd',\n price: token.price\n }\n ],\n flags: {\n rewardsType: null,\n canTopUpGasTank: true,\n isFeeToken: true,\n onGasTank: true\n }\n })\n }\n return acc\n }, [])\n}\n\nexport const stripExternalHintsAPIResponse = (\n response: StrippedExternalHintsAPIResponse | null\n): StrippedExternalHintsAPIResponse | null => {\n if (!response) return null\n\n const { erc20s, erc721s, lastUpdate } = response\n\n return {\n erc20s,\n erc721s,\n lastUpdate\n }\n}\n\nconst getLowercaseAddressArrayForNetwork = (\n array: { address: string; networkId?: NetworkId }[],\n networkId: NetworkId\n) =>\n array\n .filter((item) => !networkId || item.networkId === networkId)\n .map((item) => item.address.toLowerCase())\n\n/**\n * Tasks:\n * - updates the external hints for [network:account] with the latest from the external API\n * - cleans the learned tokens by removing non-ERC20 items\n * - updates the timestamp of learned tokens\n * - returns the updated hints\n */\nexport function getUpdatedHints(\n // Can only be null in case of no external api hints\n latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null,\n tokens: TokenResult[],\n tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'],\n networkId: NetworkId,\n storagePreviousHints: PreviousHintsStorage,\n key: string,\n customTokens: CustomToken[]\n): PreviousHintsStorage {\n const previousHints = { ...storagePreviousHints }\n\n if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}\n if (!previousHints.learnedTokens) previousHints.learnedTokens = {}\n\n const { learnedTokens, learnedNfts } = previousHints\n const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []\n const networkLearnedTokens = learnedTokens[networkId] || {}\n\n // The keys in learnedTokens are addresses of tokens\n const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens)\n\n // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens.\n // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens.\n // For instance, a SmartContract address can be passed as a learned token.\n // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio.\n // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance,\n // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`.\n // Note:\n // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter).\n // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen,\n // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway.\n const unknownBalanceError = '0x756e6b6e'\n const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter(\n (tokenAddress) => {\n const hasError = !!tokenErrors?.find(\n (errorToken) =>\n errorToken.address.toLowerCase() === tokenAddress.toLowerCase() &&\n errorToken.error === unknownBalanceError\n )\n\n return hasError\n }\n )\n\n if (networkLearnedTokenAddresses.length) {\n // Lowercase all addresses outside of the loop for better performance\n const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(\n PINNED_TOKENS,\n networkId\n )\n const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId)\n const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n)\n const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(\n networkTokensWithBalance,\n networkId\n )\n const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) =>\n hint.toLowerCase()\n )\n\n // Update the timestamp of learned tokens\n // and self-clean non-ERC20 items.\n // eslint-disable-next-line no-restricted-syntax\n for (const address of networkLearnedTokenAddresses) {\n const lowercaseAddress = address.toLowerCase()\n\n // Delete non-ERC20 items from the learned tokens\n if (\n networkLearnedTokenAddressesHavingError.find(\n (errorToken) => errorToken.toLowerCase() === lowercaseAddress\n )\n ) {\n delete learnedTokens[networkId][lowercaseAddress]\n // eslint-disable-next-line no-continue\n continue\n }\n\n const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress)\n const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress)\n const isTokenInExternalAPIHints =\n lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress)\n const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress)\n\n if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) {\n // Don't set the timestamp back to null if the account doesn't have balance for the token\n // as learnedTokens aren't account specific and one account can have balance for the token\n // while other don't\n learnedTokens[networkId][address] = Date.now().toString()\n }\n }\n }\n // Update the external hints for [network:account] with the latest from the external API\n previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI\n\n return {\n fromExternalAPI: previousHints.fromExternalAPI,\n learnedTokens,\n learnedNfts\n }\n}\n\nexport const getTokensReadyToLearn = (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => {\n if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length)\n return []\n\n return toBeLearnedTokens.filter((address) =>\n resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)\n )\n}\n\nexport const tokenFilter = (\n token: TokenResult,\n nativeToken: TokenResult,\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n isTokenPreference: boolean\n): boolean => {\n // Never add ERC20 tokens that represent the network's native token.\n // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`.\n // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard.\n // From a user's perspective, the token is duplicated and counted twice in the balance.\n const isERC20NativeRepresentation =\n (token.symbol === nativeToken?.symbol ||\n network.oldNativeAssetSymbols?.includes(token.symbol)) &&\n token.amount === nativeToken.amount &&\n token.address !== ZeroAddress\n\n if (isERC20NativeRepresentation) return false\n\n // always include tokens added as a preference\n if (isTokenPreference) return true\n\n // always include > 0 amount and native token\n if (token.amount > 0 || token.address === ZeroAddress) return true\n\n const isPinned = !!PINNED_TOKENS.find((pinnedToken) => {\n return pinnedToken.networkId === network.id && pinnedToken.address === token.address\n })\n\n // make the comparison to lowercase as otherwise, it doesn't work\n const hintsLowerCase = additionalHints\n ? additionalHints.map((hint) => hint.toLowerCase())\n : undefined\n const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase())\n\n // if the amount is 0\n // return the token if it's pinned and requested\n const pinnedRequested = isPinned && !hasNonZeroTokens\n\n return isInAdditionalHints || pinnedRequested\n}\n\n/**\n * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details)\n * and set the token.flags.isHidden flag.\n */\nexport const processTokens = (\n tokenResults: TokenResult[],\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n tokenPreferences: TokenPreference[]\n): TokenResult[] => {\n // We need to know the native token in order to execute our filtration logic in tokenFilter.\n // For performance reasons, we define it here once, instead of during every single iteration in the reduce method.\n const nativeToken = tokenResults.find((token) => token.address === ZeroAddress)\n\n return tokenResults.reduce((tokens, tokenResult) => {\n const token = { ...tokenResult }\n\n const preference = tokenPreferences?.find((tokenPreference) => {\n return tokenPreference.address === token.address && tokenPreference.networkId === network.id\n })\n\n if (preference) {\n token.flags.isHidden = preference.isHidden\n }\n\n if (tokenFilter(token, nativeToken!, network, hasNonZeroTokens, additionalHints, !!preference))\n tokens.push(token)\n\n return tokens\n }, [] as TokenResult[])\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.d.ts b/dist/src/libs/portfolio/icons.d.ts new file mode 100644 index 000000000..61aea06da --- /dev/null +++ b/dist/src/libs/portfolio/icons.d.ts @@ -0,0 +1,4 @@ +export declare function getIconId(networkId: string, address: string): string; +export declare function getHardcodedIcon(address: string): string | null; +export declare function getZapperIcon(networkId: string, address: string): string; +//# sourceMappingURL=icons.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.d.ts.map b/dist/src/libs/portfolio/icons.d.ts.map new file mode 100644 index 000000000..6f595a940 --- /dev/null +++ b/dist/src/libs/portfolio/icons.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/icons.ts"],"names":[],"mappings":"AAuBA,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE/D"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.js b/dist/src/libs/portfolio/icons.js new file mode 100644 index 000000000..bb659c089 --- /dev/null +++ b/dist/src/libs/portfolio/icons.js @@ -0,0 +1,22 @@ +/* eslint-disable import/no-extraneous-dependencies */ +const customIcons = { + '0xb468a1e5596cfbcdf561f21a10490d99b4bb7b68': 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg/220px-Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg', + '0x88800092ff476844f74dc2fc427974bbee2794ae': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/ambire_logo_white_bg_250x250.png', + '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', + '0xb6456b57f03352be48bf101b46c1752a0813491a': 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/vaporwave-adex-2.png', + '0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c': 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/ADX-loyalty%40256x256.png', + '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', + '0xe9415e904143e42007865e6864f7f632bd054a08': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png', + '0xade00c28244d5ce17d72e40330b1c318cd12b7c3': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/official-logos/Ambire-AdEx/Ambire_AdEx_Symbol_color_white_bg.png' // ADX-TOKEN +}; +const zapperStorageTokenIcons = 'https://storage.googleapis.com/zapper-fi-assets/tokens'; +export function getIconId(networkId, address) { + return `${networkId.toLowerCase()}:${address.toLowerCase()}`; +} +export function getHardcodedIcon(address) { + return customIcons[address.toLowerCase()] || null; +} +export function getZapperIcon(networkId, address) { + return `${zapperStorageTokenIcons}/${networkId.toLowerCase()}/${address.toLowerCase()}.png`; +} +//# sourceMappingURL=icons.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.js.map b/dist/src/libs/portfolio/icons.js.map new file mode 100644 index 000000000..af5db31f6 --- /dev/null +++ b/dist/src/libs/portfolio/icons.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/icons.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,MAAM,WAAW,GAAQ;IACvB,4CAA4C,EAC1C,2KAA2K;IAC7K,4CAA4C,EAC1C,uGAAuG;IACzG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,2FAA2F;IAC7F,4CAA4C,EAC1C,gGAAgG;IAClG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,8FAA8F;IAChG,4CAA4C,EAC1C,iIAAiI,CAAC,YAAY;CACjJ,CAAA;AAED,MAAM,uBAAuB,GAAG,wDAAwD,CAAA;AAExF,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,OAAe;IAC1D,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,OAAe;IAC9D,OAAO,GAAG,uBAAuB,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM,CAAA;AAC7F,CAAC","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nconst customIcons: any = {\n '0xb468a1e5596cfbcdf561f21a10490d99b4bb7b68':\n 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg/220px-Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg', // TEST Polygon ELMO token,\n '0x88800092ff476844f74dc2fc427974bbee2794ae':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/ambire_logo_white_bg_250x250.png', // Ambire Wallet Token\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // xWallet\n '0xb6456b57f03352be48bf101b46c1752a0813491a':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/vaporwave-adex-2.png', // ADX-STAKING\n '0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/ADX-loyalty%40256x256.png', // ADX-LOYALTY\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // Polygons test xWallet\n '0xe9415e904143e42007865e6864f7f632bd054a08':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png', // Polygons test Wallet\n '0xade00c28244d5ce17d72e40330b1c318cd12b7c3':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/official-logos/Ambire-AdEx/Ambire_AdEx_Symbol_color_white_bg.png' // ADX-TOKEN\n}\n\nconst zapperStorageTokenIcons = 'https://storage.googleapis.com/zapper-fi-assets/tokens'\n\nexport function getIconId(networkId: string, address: string): string {\n return `${networkId.toLowerCase()}:${address.toLowerCase()}`\n}\n\nexport function getHardcodedIcon(address: string): string | null {\n return customIcons[address.toLowerCase()] || null\n}\n\nexport function getZapperIcon(networkId: string, address: string) {\n return `${zapperStorageTokenIcons}/${networkId.toLowerCase()}/${address.toLowerCase()}.png`\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.d.ts b/dist/src/libs/portfolio/index.d.ts new file mode 100644 index 000000000..da1aa52bb --- /dev/null +++ b/dist/src/libs/portfolio/index.d.ts @@ -0,0 +1,5 @@ +import { AddrVestingData, ClaimableRewardsData, CollectionResult, GetOptions, Price, TokenResult } from './interfaces'; +import { Portfolio } from './portfolio'; +export { Portfolio }; +export type { Price, TokenResult, ClaimableRewardsData, AddrVestingData, CollectionResult, GetOptions }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.d.ts.map b/dist/src/libs/portfolio/index.d.ts.map new file mode 100644 index 000000000..9a324b2fb --- /dev/null +++ b/dist/src/libs/portfolio/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,WAAW,EACZ,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,CAAA;AAEpB,YAAY,EACV,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACX,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.js b/dist/src/libs/portfolio/index.js new file mode 100644 index 000000000..849b5b12a --- /dev/null +++ b/dist/src/libs/portfolio/index.js @@ -0,0 +1,3 @@ +import { Portfolio } from './portfolio'; +export { Portfolio }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.js.map b/dist/src/libs/portfolio/index.js.map new file mode 100644 index 000000000..d16031619 --- /dev/null +++ b/dist/src/libs/portfolio/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,CAAA","sourcesContent":["import {\n AddrVestingData,\n ClaimableRewardsData,\n CollectionResult,\n GetOptions,\n Price,\n TokenResult\n} from './interfaces'\nimport { Portfolio } from './portfolio'\n\nexport { Portfolio }\n\nexport type {\n Price,\n TokenResult,\n ClaimableRewardsData,\n AddrVestingData,\n CollectionResult,\n GetOptions\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.d.ts b/dist/src/libs/portfolio/interfaces.d.ts new file mode 100644 index 000000000..3f3450bc3 --- /dev/null +++ b/dist/src/libs/portfolio/interfaces.d.ts @@ -0,0 +1,213 @@ +import { Account, AccountId } from '../../interfaces/account'; +import { NetworkId } from '../../interfaces/network'; +import { AccountOp } from '../accountOp/accountOp'; +export interface Price { + baseCurrency: string; + price: number; +} +export interface GetOptionsSimulation { + accountOps: AccountOp[]; + account: Account; +} +export type TokenError = string | '0x'; +export type AccountAssetsState = { + [networkId: NetworkId]: boolean; +}; +export type TokenResult = { + symbol: string; + decimals: number; + address: string; + networkId: NetworkId; + amount: bigint; + simulationAmount?: bigint; + amountPostSimulation?: bigint; + priceIn: Price[]; + flags: { + onGasTank: boolean; + rewardsType: 'wallet-vesting' | 'wallet-rewards' | null; + canTopUpGasTank: boolean; + isFeeToken: boolean; + isDefiToken?: boolean; + isHidden?: boolean; + }; +}; +export interface CollectionResult extends TokenResult { + name: string; + collectibles: bigint[]; + postSimulation?: { + sending?: bigint[]; + receiving?: bigint[]; + }; +} +export type PriceCache = Map; +export type MetaData = { + blockNumber?: number; + beforeNonce?: bigint; + afterNonce?: bigint; +}; +export interface ERC721Enumerable { + isKnown: boolean; + enumerable: boolean; +} +export interface ERC721Innumerable { + isKnown: boolean; + tokens: string[]; +} +export interface ERC721s { + [name: string]: ERC721Enumerable | ERC721Innumerable; +} +export interface Hints { + erc20s: string[]; + erc721s: ERC721s; +} +export interface ExternalHintsAPIResponse extends Hints { + lastUpdate: number; + networkId: string; + accountAddr: string; + prices: { + [name: string]: Price; + }; + hasHints: boolean; + error?: string; +} +export type StrippedExternalHintsAPIResponse = Pick; +export interface ExtendedError extends Error { + simulationErrorMsg?: string; +} +type ExtendedErrorWithLevel = ExtendedError & { + level: 'critical' | 'warning' | 'silent'; +}; +export interface PortfolioLibGetResult { + updateStarted: number; + discoveryTime: number; + oracleCallTime: number; + priceUpdateTime: number; + priceCache: PriceCache; + tokens: TokenResult[]; + feeTokens: TokenResult[]; + tokenErrors: { + error: string; + address: string; + }[]; + collections: CollectionResult[]; + hintsFromExternalAPI: StrippedExternalHintsAPIResponse | null; + errors: ExtendedErrorWithLevel[]; + blockNumber: number; + beforeNonce: bigint; + afterNonce: bigint; +} +interface Total { + [currency: string]: number; +} +type AdditionalPortfolioProperties = 'updateStarted' | 'tokens'; +export type ClaimableRewardsData = { + addr: string; + fromBalanceClaimable: number; + fromADXClaimable: number; + totalClaimable: string; + leaf: string; + proof: string[]; + root: string; + signedRoot: string; +}; +export type AddrVestingData = { + addr: string; + rate: string; + start: string; + end: string; +}; +export type AdditionalPortfolioNetworkResult = Partial & Pick & { + lastSuccessfulUpdate: number; + total: Total; + claimableRewardsData?: ClaimableRewardsData; + addrVestingData?: AddrVestingData; +}; +type PortfolioNetworkResult = Required; +export type NetworkState = { + isReady: boolean; + isLoading: boolean; + criticalError?: ExtendedError; + errors: ExtendedErrorWithLevel[]; + result?: PortfolioNetworkResult | AdditionalPortfolioNetworkResult; + accountOps?: AccountOp[]; +}; +export type AccountState = { + [networkId: string]: NetworkState | undefined; +}; +export type PortfolioControllerState = { + [accountId: string]: AccountState; +}; +export interface LimitsOptions { + erc20: number; + erc721: number; + erc721TokensInput: number; + erc721Tokens: number; +} +export interface Limits { + deploylessProxyMode: LimitsOptions; + deploylessStateOverrideMode: LimitsOptions; +} +export type PinnedTokens = { + networkId: NetworkId; + address: string; + onGasTank: boolean; + accountId?: AccountId; +}[]; +export type TemporaryTokens = { + [networkId: NetworkId]: { + isLoading: boolean; + errors: { + error: string; + address: string; + }[]; + result: { + tokens: PortfolioLibGetResult['tokens']; + }; + }; +}; +export interface GetOptions { + baseCurrency: string; + blockTag: string | number; + simulation?: GetOptionsSimulation; + priceCache?: PriceCache; + priceRecency: number; + previousHintsFromExternalAPI?: StrippedExternalHintsAPIResponse | null; + isEOA: boolean; + fetchPinned: boolean; + additionalErc20Hints?: Hints['erc20s']; + additionalErc721Hints?: Hints['erc721s']; + disableAutoDiscovery?: boolean; +} +export interface PreviousHintsStorage { + learnedTokens: { + [network in NetworkId]: { + [tokenAddress: string]: string | null; + }; + }; + learnedNfts: { + [network in NetworkId]: { + [nftAddress: string]: bigint[]; + }; + }; + fromExternalAPI: { + [networkAndAccountKey: string]: GetOptions['previousHintsFromExternalAPI']; + }; +} +export interface NetworkSimulatedAccountOp { + [networkId: NetworkId]: AccountOp; +} +export type PendingAmounts = { + isPending: boolean; + pendingBalance: bigint; + pendingToBeSigned?: bigint; + pendingToBeConfirmed?: bigint; +}; +export type FormattedPendingAmounts = Omit & { + pendingBalance: string; + pendingBalanceFormatted: string; + pendingBalanceUSDFormatted?: string; + pendingToBeSignedFormatted?: string; + pendingToBeConfirmedFormatted?: string; +}; +export {}; +//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.d.ts.map b/dist/src/libs/portfolio/interfaces.d.ts.map new file mode 100644 index 000000000..8a1958c12 --- /dev/null +++ b/dist/src/libs/portfolio/interfaces.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.js b/dist/src/libs/portfolio/interfaces.js index db9191150..c30bb68c1 100644 --- a/dist/src/libs/portfolio/interfaces.js +++ b/dist/src/libs/portfolio/interfaces.js @@ -1,3 +1,2 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +export {}; //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.js.map b/dist/src/libs/portfolio/interfaces.js.map index 465080181..aa1ff7394 100644 --- a/dist/src/libs/portfolio/interfaces.js.map +++ b/dist/src/libs/portfolio/interfaces.js.map @@ -1 +1 @@ -{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":""} \ No newline at end of file +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport interface Price {\n baseCurrency: string\n price: number\n}\n\nexport interface GetOptionsSimulation {\n accountOps: AccountOp[]\n account: Account\n}\nexport type TokenError = string | '0x'\n\nexport type AccountAssetsState = { [networkId: NetworkId]: boolean }\n\nexport type TokenResult = {\n symbol: string\n decimals: number\n address: string\n networkId: NetworkId\n amount: bigint\n simulationAmount?: bigint\n amountPostSimulation?: bigint\n priceIn: Price[]\n flags: {\n onGasTank: boolean\n rewardsType: 'wallet-vesting' | 'wallet-rewards' | null\n canTopUpGasTank: boolean\n isFeeToken: boolean\n isDefiToken?: boolean\n isHidden?: boolean\n }\n}\n\nexport interface CollectionResult extends TokenResult {\n name: string\n collectibles: bigint[]\n postSimulation?: {\n sending?: bigint[]\n receiving?: bigint[]\n }\n}\n\nexport type PriceCache = Map\n\nexport type MetaData = { blockNumber?: number; beforeNonce?: bigint; afterNonce?: bigint }\n\nexport interface ERC721Enumerable {\n isKnown: boolean\n enumerable: boolean\n}\nexport interface ERC721Innumerable {\n isKnown: boolean\n tokens: string[]\n}\n\nexport interface ERC721s {\n [name: string]: ERC721Enumerable | ERC721Innumerable\n}\n\nexport interface Hints {\n erc20s: string[]\n erc721s: ERC721s\n}\n\nexport interface ExternalHintsAPIResponse extends Hints {\n lastUpdate: number\n networkId: string\n accountAddr: string\n prices: {\n [name: string]: Price\n }\n hasHints: boolean\n // Attached by the application error handling logic.\n // All other props, are provided by Velcro Discovery request.\n error?: string\n}\n\nexport type StrippedExternalHintsAPIResponse = Pick<\n ExternalHintsAPIResponse,\n 'erc20s' | 'erc721s' | 'lastUpdate'\n>\n\nexport interface ExtendedError extends Error {\n simulationErrorMsg?: string\n}\n\ntype ExtendedErrorWithLevel = ExtendedError & {\n level: 'critical' | 'warning' | 'silent'\n}\n\nexport interface PortfolioLibGetResult {\n updateStarted: number\n discoveryTime: number\n oracleCallTime: number\n priceUpdateTime: number\n priceCache: PriceCache\n tokens: TokenResult[]\n feeTokens: TokenResult[]\n tokenErrors: { error: string; address: string }[]\n collections: CollectionResult[]\n hintsFromExternalAPI: StrippedExternalHintsAPIResponse | null\n errors: ExtendedErrorWithLevel[]\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n}\n\ninterface Total {\n [currency: string]: number\n}\n\ntype AdditionalPortfolioProperties = 'updateStarted' | 'tokens'\n\nexport type ClaimableRewardsData = {\n addr: string\n fromBalanceClaimable: number\n fromADXClaimable: number\n totalClaimable: string\n leaf: string\n proof: string[]\n root: string\n signedRoot: string\n}\n\nexport type AddrVestingData = {\n addr: string\n rate: string\n start: string\n end: string\n}\n\n// Create the final type with some properties optional\nexport type AdditionalPortfolioNetworkResult = Partial &\n Pick & {\n lastSuccessfulUpdate: number\n total: Total\n claimableRewardsData?: ClaimableRewardsData\n addrVestingData?: AddrVestingData\n }\n\ntype PortfolioNetworkResult = Required\n\nexport type NetworkState = {\n isReady: boolean\n isLoading: boolean\n criticalError?: ExtendedError\n errors: ExtendedErrorWithLevel[]\n result?: PortfolioNetworkResult | AdditionalPortfolioNetworkResult\n // We store the previously simulated AccountOps only for the pending state.\n // Prior to triggering a pending state update, we compare the newly passed AccountOp[] (updateSelectedAccount) with the cached version.\n // If there are no differences, the update is canceled unless the `forceUpdate` flag is set.\n accountOps?: AccountOp[]\n}\n\nexport type AccountState = {\n [networkId: string]: NetworkState | undefined\n}\n\nexport type PortfolioControllerState = {\n // accountId:networkId:NetworkState\n [accountId: string]: AccountState\n}\n\nexport interface LimitsOptions {\n erc20: number\n erc721: number\n erc721TokensInput: number\n erc721Tokens: number\n}\n\nexport interface Limits {\n deploylessProxyMode: LimitsOptions\n deploylessStateOverrideMode: LimitsOptions\n}\n\nexport type PinnedTokens = {\n networkId: NetworkId\n address: string\n onGasTank: boolean\n accountId?: AccountId\n}[]\n\nexport type TemporaryTokens = {\n [networkId: NetworkId]: {\n isLoading: boolean\n errors: { error: string; address: string }[]\n result: { tokens: PortfolioLibGetResult['tokens'] }\n }\n}\n\nexport interface GetOptions {\n baseCurrency: string\n blockTag: string | number\n simulation?: GetOptionsSimulation\n priceCache?: PriceCache\n priceRecency: number\n previousHintsFromExternalAPI?: StrippedExternalHintsAPIResponse | null\n isEOA: boolean\n fetchPinned: boolean\n additionalErc20Hints?: Hints['erc20s']\n additionalErc721Hints?: Hints['erc721s']\n disableAutoDiscovery?: boolean\n}\n\nexport interface PreviousHintsStorage {\n learnedTokens: { [network in NetworkId]: { [tokenAddress: string]: string | null } }\n learnedNfts: { [network in NetworkId]: { [nftAddress: string]: bigint[] } }\n fromExternalAPI: {\n [networkAndAccountKey: string]: GetOptions['previousHintsFromExternalAPI']\n }\n}\n\nexport interface NetworkSimulatedAccountOp {\n [networkId: NetworkId]: AccountOp\n}\n\nexport type PendingAmounts = {\n isPending: boolean\n pendingBalance: bigint\n pendingToBeSigned?: bigint\n pendingToBeConfirmed?: bigint\n}\n\nexport type FormattedPendingAmounts = Omit & {\n pendingBalance: string\n pendingBalanceFormatted: string\n pendingBalanceUSDFormatted?: string\n pendingToBeSignedFormatted?: string\n pendingToBeConfirmedFormatted?: string\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts b/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts new file mode 100644 index 000000000..816232c24 --- /dev/null +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts @@ -0,0 +1,24 @@ +import { CustomToken, LegacyTokenPreference } from '../customToken'; +/** + * Migrates legacy token preferences to token preferences and custom tokens + * if necessary. + */ +declare const migrateTokenPreferences: (tokenPreferences: LegacyTokenPreference[], customTokens?: CustomToken[]) => { + tokenPreferences: { + address: string; + networkId: string; + isHidden: boolean | undefined; + }[]; + customTokens: { + address: string; + standard: "ERC20" | "ERC721"; + networkId: string; + }[]; + shouldUpdateStorage: boolean; +} | { + tokenPreferences: LegacyTokenPreference[]; + customTokens: CustomToken[]; + shouldUpdateStorage: boolean; +}; +export { migrateTokenPreferences }; +//# sourceMappingURL=tokenPreferences.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts.map b/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts.map new file mode 100644 index 000000000..445c089d3 --- /dev/null +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"tokenPreferences.d.ts","sourceRoot":"","sources":["../../../../../src/libs/portfolio/migrations/tokenPreferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AA8BnE;;;GAGG;AACH,QAAA,MAAM,uBAAuB,qBACT,qBAAqB,EAAE,iBAC1B,WAAW,EAAE;;;;;;;;;;;;;;;;CAkB7B,CAAA;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.js b/dist/src/libs/portfolio/migrations/tokenPreferences.js new file mode 100644 index 000000000..e4a6c0412 --- /dev/null +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.js @@ -0,0 +1,46 @@ +const inferStorageVersion = (tokenPreferences) => { + if (tokenPreferences.some(({ symbol, decimals }) => !!symbol || !!decimals)) { + return 1; + } + return 2; +}; +const migrateHiddenTokens = (tokenPreferences) => { + return tokenPreferences + .filter(({ isHidden }) => isHidden) + .map(({ address, networkId, isHidden }) => ({ + address, + networkId, + isHidden + })); +}; +const migrateCustomTokens = (tokenPreferences) => { + return tokenPreferences + .filter(({ standard }) => !!standard) + .map(({ address, standard, networkId }) => ({ + address, + standard, + networkId + })); +}; +/** + * Migrates legacy token preferences to token preferences and custom tokens + * if necessary. + */ +const migrateTokenPreferences = (tokenPreferences, customTokens) => { + const storageVersion = inferStorageVersion(tokenPreferences); + // Migrate + if (storageVersion === 1) { + return { + tokenPreferences: migrateHiddenTokens(tokenPreferences), + customTokens: migrateCustomTokens(tokenPreferences), + shouldUpdateStorage: true + }; + } + return { + tokenPreferences, + customTokens: customTokens || [], + shouldUpdateStorage: false + }; +}; +export { migrateTokenPreferences }; +//# sourceMappingURL=tokenPreferences.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.js.map b/dist/src/libs/portfolio/migrations/tokenPreferences.js.map new file mode 100644 index 000000000..ea85e99f4 --- /dev/null +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tokenPreferences.js","sourceRoot":"","sources":["../../../../../src/libs/portfolio/migrations/tokenPreferences.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC3E,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,SAAS;QACT,QAAQ;KACT,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACpC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,QAAQ;QACR,SAAS;KACV,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,uBAAuB,GAAG,CAC9B,gBAAyC,EACzC,YAA4B,EAC5B,EAAE;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAE5D,UAAU;IACV,IAAI,cAAc,KAAK,CAAC,EAAE;QACxB,OAAO;YACL,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACvD,YAAY,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACnD,mBAAmB,EAAE,IAAI;SAC1B,CAAA;KACF;IAED,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE,YAAY,IAAI,EAAE;QAChC,mBAAmB,EAAE,KAAK;KAC3B,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAA","sourcesContent":["import { CustomToken, LegacyTokenPreference } from '../customToken'\n\nconst inferStorageVersion = (tokenPreferences: LegacyTokenPreference[]) => {\n if (tokenPreferences.some(({ symbol, decimals }) => !!symbol || !!decimals)) {\n return 1\n }\n\n return 2\n}\n\nconst migrateHiddenTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ isHidden }) => isHidden)\n .map(({ address, networkId, isHidden }) => ({\n address,\n networkId,\n isHidden\n }))\n}\n\nconst migrateCustomTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ standard }) => !!standard)\n .map(({ address, standard, networkId }) => ({\n address,\n standard,\n networkId\n }))\n}\n\n/**\n * Migrates legacy token preferences to token preferences and custom tokens\n * if necessary.\n */\nconst migrateTokenPreferences = (\n tokenPreferences: LegacyTokenPreference[],\n customTokens?: CustomToken[]\n) => {\n const storageVersion = inferStorageVersion(tokenPreferences)\n\n // Migrate\n if (storageVersion === 1) {\n return {\n tokenPreferences: migrateHiddenTokens(tokenPreferences),\n customTokens: migrateCustomTokens(tokenPreferences),\n shouldUpdateStorage: true\n }\n }\n\n return {\n tokenPreferences,\n customTokens: customTokens || [],\n shouldUpdateStorage: false\n }\n}\n\nexport { migrateTokenPreferences }\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.d.ts b/dist/src/libs/portfolio/pagination.d.ts new file mode 100644 index 000000000..57cf34f8b --- /dev/null +++ b/dist/src/libs/portfolio/pagination.d.ts @@ -0,0 +1,4 @@ +import { CollectionResult, ERC721Enumerable, ERC721Innumerable, MetaData, TokenError, TokenResult } from './interfaces'; +export declare function paginate(input: string[] | [string, ERC721Enumerable | ERC721Innumerable][], limit: number): any[][]; +export declare function flattenResults(everything: Promise<[[string, TokenResult | CollectionResult][], MetaData][]>[]): Promise<[[TokenError, TokenResult | CollectionResult][], MetaData | {}]>; +//# sourceMappingURL=pagination.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.d.ts.map b/dist/src/libs/portfolio/pagination.d.ts.map new file mode 100644 index 000000000..722665b2c --- /dev/null +++ b/dist/src/libs/portfolio/pagination.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,WAAW,EACZ,MAAM,cAAc,CAAA;AAErB,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,EAAE,EAClE,KAAK,EAAE,MAAM,GACZ,GAAG,EAAE,EAAE,CAQT;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,GAC9E,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,GAAG,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC,CAwB1E"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.js b/dist/src/libs/portfolio/pagination.js index bf2c07607..f55229d76 100644 --- a/dist/src/libs/portfolio/pagination.js +++ b/dist/src/libs/portfolio/pagination.js @@ -1,8 +1,5 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.flattenResults = exports.paginate = void 0; -function paginate(input, limit) { - let pages = []; +export function paginate(input, limit) { + const pages = []; let from = 0; for (let i = 1; i <= Math.ceil(input.length / limit); i++) { pages.push(input.slice(from, i * limit)); @@ -10,9 +7,25 @@ function paginate(input, limit) { } return pages; } -exports.paginate = paginate; -async function flattenResults(everything) { - return Promise.all(everything).then((results) => results.flat()); +export function flattenResults(everything) { + return Promise.all(everything).then((results) => { + if (!results || !results.length) { + return [[], {}]; + } + const allTokens = []; + let metadata = {}; + results.forEach((result) => { + if (Array.isArray(result) && result.length > 0) { + const [hintsArray, meta] = result; + if (Array.isArray(hintsArray)) { + allTokens.push(...hintsArray); + } + if (Object.keys(metadata).length === 0) { + metadata = { ...meta }; + } + } + }); + return [allTokens, metadata]; + }); } -exports.flattenResults = flattenResults; //# sourceMappingURL=pagination.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.js.map b/dist/src/libs/portfolio/pagination.js.map index bfaaf7039..66232aa07 100644 --- a/dist/src/libs/portfolio/pagination.js.map +++ b/dist/src/libs/portfolio/pagination.js.map @@ -1 +1 @@ -{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pagination.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAC,KAAY,EAAE,KAAa;IAClD,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AARD,4BAQC;AAEM,KAAK,UAAU,cAAc,CAAC,UAA4B;IAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClE,CAAC;AAFD,wCAEC"} \ No newline at end of file +{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pagination.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,QAAQ,CACtB,KAAkE,EAClE,KAAa;IAEb,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAA+E;IAE/E,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAC/B,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;SAChB;QAED,MAAM,SAAS,GAAU,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAa,EAAE,CAAA;QAE3B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9C,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,CAAA;gBAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;oBAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;iBAC9B;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtC,QAAQ,GAAG,EAAE,GAAI,IAAiB,EAAE,CAAA;iBACrC;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {\n CollectionResult,\n ERC721Enumerable,\n ERC721Innumerable,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nexport function paginate(\n input: string[] | [string, ERC721Enumerable | ERC721Innumerable][],\n limit: number\n): any[][] {\n const pages = []\n let from = 0\n for (let i = 1; i <= Math.ceil(input.length / limit); i++) {\n pages.push(input.slice(from, i * limit))\n from += limit\n }\n return pages\n}\n\nexport function flattenResults(\n everything: Promise<[[string, TokenResult | CollectionResult][], MetaData][]>[]\n): Promise<[[TokenError, TokenResult | CollectionResult][], MetaData | {}]> {\n return Promise.all(everything).then((results) => {\n if (!results || !results.length) {\n return [[], {}]\n }\n\n const allTokens: any[] = []\n let metadata: MetaData = {}\n\n results.forEach((result) => {\n if (Array.isArray(result) && result.length > 0) {\n const [hintsArray, meta] = result\n\n if (Array.isArray(hintsArray)) {\n allTokens.push(...hintsArray)\n }\n if (Object.keys(metadata).length === 0) {\n metadata = { ...(meta as MetaData) }\n }\n }\n })\n\n return [allTokens, metadata]\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.d.ts b/dist/src/libs/portfolio/pendingAmountsHelper.d.ts new file mode 100644 index 000000000..4a6a6f8c1 --- /dev/null +++ b/dist/src/libs/portfolio/pendingAmountsHelper.d.ts @@ -0,0 +1,42 @@ +import { AccountOp } from '../accountOp/accountOp'; +import { PendingAmounts } from './interfaces'; +/** + * Function for calculating the pending balance and the delta amounts + * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token. + * + * While calculating the balance is a routine operation, + * calculating the pending delta and determining its state (whether it needs to be signed or confirmed) + * can be quite challenging. + * + * We use this function's output to display PendingToBeSigned, PendingToBeConfirmed, or both badges on the Dashboard. + * + * Here's the main mechanism for handling the pending state and simulation: + * 1. Once we have an AccountOp, we perform a simulation against the pending block. The `PendingToBeSigned` badge is shown. + * 2. After broadcasting the AccountOp, we update its status to `PendingToBeConfirmed`. The `PendingToBeConfirmed` badge appears. + * 3. After broadcasting, we ensure the AccountPortfolio is not updated immediately to avoid losing the simulation and badge. + * 4. Even if we try updating with the previous simulation, it won't work as the account nonce will already be incremented. + * 5. Once the transaction is confirmed, the AccountPortfolio is updated. The simulation and the `PendingToBeConfirmed` badge clear. + * 6. If the user refreshes or the transaction delays, the portfolio updates automatically, clearing the simulation. This is acceptable. + * + * Let's review the main scenarios where we encounter simulation (simulatedAccountOp), followed by a discussion of corner cases. + * + * Main scenarios: + * 1. If there is an AccOp that has not yet been signed, we return the `pendingToBeSigned` amount. + * 2. If there is an AccOp that has been signed and broadcasted (but not yet confirmed), + * we display the `pendingToBeConfirmed` badge, reflecting the corresponding amount. + * 3. If we detect a delta between the pending and latest token amounts, it indicates that there is something awaiting confirmation. + * In this case, we also return the `pendingToBeConfirmed` amount. + * For example, if someone sends you tokens outside of the extension, the extension will show the `pendingToBeConfirmed` amount. + * + * Rare scenarios: + * 1. It is possible to have both `pendingToBeSigned` and `pendingToBeConfirmed` badges in the following scenario: + * - If someone sends you tokens, the `latestPendingDelta` is triggered. + * At the same time, if you have an AccOp waiting to be signed, both badges will be displayed, + * and the amounts for `pendingToBeSigned` and `pendingToBeConfirmed` will be calculated. + * 2. If you sign and broadcast an AccOp while the `latestPendingDelta` also has a value, + * the `pendingToBeConfirmed` badge will be displayed, representing the sum of both `simulationDelta` and `pendingLatestDelta`. + * - This is similar to the previous case, but here the AccOp has been broadcasted. + * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount. + */ +export declare const calculatePendingAmounts: (latestAmount: bigint, pendingAmount: bigint, amountPostSimulation?: bigint, simulationDelta?: bigint, simulatedAccountOp?: AccountOp) => PendingAmounts | null; +//# sourceMappingURL=pendingAmountsHelper.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.d.ts.map b/dist/src/libs/portfolio/pendingAmountsHelper.d.ts.map new file mode 100644 index 000000000..645bd4ed8 --- /dev/null +++ b/dist/src/libs/portfolio/pendingAmountsHelper.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pendingAmountsHelper.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/pendingAmountsHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,uBAAuB,iBACpB,MAAM,iBACL,MAAM,yBACE,MAAM,oBACX,MAAM,uBACH,SAAS,KAC7B,cAAc,GAAG,IAgEnB,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.js b/dist/src/libs/portfolio/pendingAmountsHelper.js new file mode 100644 index 000000000..7f11a3bc3 --- /dev/null +++ b/dist/src/libs/portfolio/pendingAmountsHelper.js @@ -0,0 +1,97 @@ +import { AccountOpStatus } from '../accountOp/accountOp'; +/** + * Function for calculating the pending balance and the delta amounts + * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token. + * + * While calculating the balance is a routine operation, + * calculating the pending delta and determining its state (whether it needs to be signed or confirmed) + * can be quite challenging. + * + * We use this function's output to display PendingToBeSigned, PendingToBeConfirmed, or both badges on the Dashboard. + * + * Here's the main mechanism for handling the pending state and simulation: + * 1. Once we have an AccountOp, we perform a simulation against the pending block. The `PendingToBeSigned` badge is shown. + * 2. After broadcasting the AccountOp, we update its status to `PendingToBeConfirmed`. The `PendingToBeConfirmed` badge appears. + * 3. After broadcasting, we ensure the AccountPortfolio is not updated immediately to avoid losing the simulation and badge. + * 4. Even if we try updating with the previous simulation, it won't work as the account nonce will already be incremented. + * 5. Once the transaction is confirmed, the AccountPortfolio is updated. The simulation and the `PendingToBeConfirmed` badge clear. + * 6. If the user refreshes or the transaction delays, the portfolio updates automatically, clearing the simulation. This is acceptable. + * + * Let's review the main scenarios where we encounter simulation (simulatedAccountOp), followed by a discussion of corner cases. + * + * Main scenarios: + * 1. If there is an AccOp that has not yet been signed, we return the `pendingToBeSigned` amount. + * 2. If there is an AccOp that has been signed and broadcasted (but not yet confirmed), + * we display the `pendingToBeConfirmed` badge, reflecting the corresponding amount. + * 3. If we detect a delta between the pending and latest token amounts, it indicates that there is something awaiting confirmation. + * In this case, we also return the `pendingToBeConfirmed` amount. + * For example, if someone sends you tokens outside of the extension, the extension will show the `pendingToBeConfirmed` amount. + * + * Rare scenarios: + * 1. It is possible to have both `pendingToBeSigned` and `pendingToBeConfirmed` badges in the following scenario: + * - If someone sends you tokens, the `latestPendingDelta` is triggered. + * At the same time, if you have an AccOp waiting to be signed, both badges will be displayed, + * and the amounts for `pendingToBeSigned` and `pendingToBeConfirmed` will be calculated. + * 2. If you sign and broadcast an AccOp while the `latestPendingDelta` also has a value, + * the `pendingToBeConfirmed` badge will be displayed, representing the sum of both `simulationDelta` and `pendingLatestDelta`. + * - This is similar to the previous case, but here the AccOp has been broadcasted. + * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount. + */ +export const calculatePendingAmounts = (latestAmount, pendingAmount, amountPostSimulation, simulationDelta, // pending delta (this is the amount of the simulation itself) +simulatedAccountOp) => { + let latestPendingDelta = pendingAmount - latestAmount; + // Dynamically calculate the threshold as 0.0001% of the pendingAmount + // Use a minimum threshold of 10000n to avoid a zero threshold + const threshold = pendingAmount > 0n ? pendingAmount / 1000000n : 10000n; + // Check if the change in latestPendingDelta is significant (>= threshold or <= -threshold). + // This helps to avoid processing insignificant changes in the pending balance. + // This is important for handling tokens with pending balances, such as those deposited into AAVE. + // With AAVE each block generates a small amount of interest or rewards, + // which is constantly displaying on dashboard as pending to be confirmed. + // The percentage change helps determine if the change in pending balance is significant enough to consider. + const significantChange = Math.abs(Number(latestPendingDelta)) >= Number(threshold); + // Ignore changes without significant difference + if (!significantChange) { + latestPendingDelta = 0n; + } + // There is no Pending state changes + if (latestPendingDelta === 0n && !simulationDelta) + return null; + let pendingBalance; + // If there is a latest/pending block delta, but there is no a simulation, + // set the pending token's balance to equal to the pending block amount. + if (latestPendingDelta && !amountPostSimulation) { + pendingBalance = pendingAmount; + } + else { + // Otherwise, if we have a simulation, the pending balance is equal to the simulation amount + pendingBalance = amountPostSimulation; + } + // Okay, we already know that we have a pending state, + // but in the following lines, we need to set the pendingToBeSigned and pendingToBeConfirmed states. + const result = { + isPending: true, + pendingBalance + }; + if (simulationDelta) { + // When we broadcast the AccountOp, we set the status of the simulated AccountOp to `BroadcastedButNotConfirmed` + // until the transaction is confirmed or the user forcefully refreshes their portfolio balance and clears the simulation. + // When the SimulatedAccountOp has the status `BroadcastedButNotConfirmed`, we know that the pending badge is `pendingToBeConfirmed`. + const hasPendingToBeConfirmed = simulatedAccountOp?.status === AccountOpStatus.BroadcastedButNotConfirmed; + if (hasPendingToBeConfirmed) { + // Main scenario #2. + result.pendingToBeConfirmed = simulationDelta; + } + else { + // Main scenario #1. + result.pendingToBeSigned = simulationDelta; + } + } + if (latestPendingDelta) { + result.pendingToBeConfirmed = result.pendingToBeConfirmed + ? result.pendingToBeConfirmed + latestPendingDelta // Rare scenario #2. + : latestPendingDelta; // Main scenario #3. + } + return result; +}; +//# sourceMappingURL=pendingAmountsHelper.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.js.map b/dist/src/libs/portfolio/pendingAmountsHelper.js.map new file mode 100644 index 000000000..b396da9ff --- /dev/null +++ b/dist/src/libs/portfolio/pendingAmountsHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pendingAmountsHelper.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pendingAmountsHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,YAAoB,EACpB,aAAqB,EACrB,oBAA6B,EAC7B,eAAwB,EAAE,8DAA8D;AACxF,kBAA8B,EACP,EAAE;IACzB,IAAI,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAA;IAErD,sEAAsE;IACtE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,QAAU,CAAC,CAAC,CAAC,MAAM,CAAA;IAE1E,4FAA4F;IAC5F,+EAA+E;IAC/E,kGAAkG;IAClG,wEAAwE;IACxE,0EAA0E;IAC1E,4GAA4G;IAC5G,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAA;IAEnF,gDAAgD;IAChD,IAAI,CAAC,iBAAiB,EAAE;QACtB,kBAAkB,GAAG,EAAE,CAAA;KACxB;IAED,oCAAoC;IACpC,IAAI,kBAAkB,KAAK,EAAE,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAA;IAE9D,IAAI,cAAc,CAAA;IAElB,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,kBAAkB,IAAI,CAAC,oBAAoB,EAAE;QAC/C,cAAc,GAAG,aAAa,CAAA;KAC/B;SAAM;QACL,4FAA4F;QAC5F,cAAc,GAAG,oBAAqB,CAAA;KACvC;IAED,sDAAsD;IACtD,oGAAoG;IACpG,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,IAAI;QACf,cAAc;KACf,CAAA;IAED,IAAI,eAAe,EAAE;QACnB,gHAAgH;QAChH,yHAAyH;QACzH,qIAAqI;QACrI,MAAM,uBAAuB,GAC3B,kBAAkB,EAAE,MAAM,KAAK,eAAe,CAAC,0BAA0B,CAAA;QAE3E,IAAI,uBAAuB,EAAE;YAC3B,oBAAoB;YACpB,MAAM,CAAC,oBAAoB,GAAG,eAAe,CAAA;SAC9C;aAAM;YACL,oBAAoB;YACpB,MAAM,CAAC,iBAAiB,GAAG,eAAe,CAAA;SAC3C;KACF;IAED,IAAI,kBAAkB,EAAE;QACtB,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB;YACvD,CAAC,CAAC,MAAM,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,oBAAoB;YACvE,CAAC,CAAC,kBAAkB,CAAA,CAAC,oBAAoB;KAC5C;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { AccountOp, AccountOpStatus } from '../accountOp/accountOp'\nimport { PendingAmounts } from './interfaces'\n\n/**\n * Function for calculating the pending balance and the delta amounts\n * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token.\n *\n * While calculating the balance is a routine operation,\n * calculating the pending delta and determining its state (whether it needs to be signed or confirmed)\n * can be quite challenging.\n *\n * We use this function's output to display PendingToBeSigned, PendingToBeConfirmed, or both badges on the Dashboard.\n *\n * Here's the main mechanism for handling the pending state and simulation:\n * 1. Once we have an AccountOp, we perform a simulation against the pending block. The `PendingToBeSigned` badge is shown.\n * 2. After broadcasting the AccountOp, we update its status to `PendingToBeConfirmed`. The `PendingToBeConfirmed` badge appears.\n * 3. After broadcasting, we ensure the AccountPortfolio is not updated immediately to avoid losing the simulation and badge.\n * 4. Even if we try updating with the previous simulation, it won't work as the account nonce will already be incremented.\n * 5. Once the transaction is confirmed, the AccountPortfolio is updated. The simulation and the `PendingToBeConfirmed` badge clear.\n * 6. If the user refreshes or the transaction delays, the portfolio updates automatically, clearing the simulation. This is acceptable.\n *\n * Let's review the main scenarios where we encounter simulation (simulatedAccountOp), followed by a discussion of corner cases.\n *\n * Main scenarios:\n * 1. If there is an AccOp that has not yet been signed, we return the `pendingToBeSigned` amount.\n * 2. If there is an AccOp that has been signed and broadcasted (but not yet confirmed),\n * we display the `pendingToBeConfirmed` badge, reflecting the corresponding amount.\n * 3. If we detect a delta between the pending and latest token amounts, it indicates that there is something awaiting confirmation.\n * In this case, we also return the `pendingToBeConfirmed` amount.\n * For example, if someone sends you tokens outside of the extension, the extension will show the `pendingToBeConfirmed` amount.\n *\n * Rare scenarios:\n * 1. It is possible to have both `pendingToBeSigned` and `pendingToBeConfirmed` badges in the following scenario:\n * - If someone sends you tokens, the `latestPendingDelta` is triggered.\n * At the same time, if you have an AccOp waiting to be signed, both badges will be displayed,\n * and the amounts for `pendingToBeSigned` and `pendingToBeConfirmed` will be calculated.\n * 2. If you sign and broadcast an AccOp while the `latestPendingDelta` also has a value,\n * the `pendingToBeConfirmed` badge will be displayed, representing the sum of both `simulationDelta` and `pendingLatestDelta`.\n * - This is similar to the previous case, but here the AccOp has been broadcasted.\n * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount.\n */\nexport const calculatePendingAmounts = (\n latestAmount: bigint,\n pendingAmount: bigint,\n amountPostSimulation?: bigint,\n simulationDelta?: bigint, // pending delta (this is the amount of the simulation itself)\n simulatedAccountOp?: AccountOp\n): PendingAmounts | null => {\n let latestPendingDelta = pendingAmount - latestAmount\n\n // Dynamically calculate the threshold as 0.0001% of the pendingAmount\n // Use a minimum threshold of 10000n to avoid a zero threshold\n const threshold = pendingAmount > 0n ? pendingAmount / 1_000_000n : 10000n\n\n // Check if the change in latestPendingDelta is significant (>= threshold or <= -threshold).\n // This helps to avoid processing insignificant changes in the pending balance.\n // This is important for handling tokens with pending balances, such as those deposited into AAVE.\n // With AAVE each block generates a small amount of interest or rewards,\n // which is constantly displaying on dashboard as pending to be confirmed.\n // The percentage change helps determine if the change in pending balance is significant enough to consider.\n const significantChange = Math.abs(Number(latestPendingDelta)) >= Number(threshold)\n\n // Ignore changes without significant difference\n if (!significantChange) {\n latestPendingDelta = 0n\n }\n\n // There is no Pending state changes\n if (latestPendingDelta === 0n && !simulationDelta) return null\n\n let pendingBalance\n\n // If there is a latest/pending block delta, but there is no a simulation,\n // set the pending token's balance to equal to the pending block amount.\n if (latestPendingDelta && !amountPostSimulation) {\n pendingBalance = pendingAmount\n } else {\n // Otherwise, if we have a simulation, the pending balance is equal to the simulation amount\n pendingBalance = amountPostSimulation!\n }\n\n // Okay, we already know that we have a pending state,\n // but in the following lines, we need to set the pendingToBeSigned and pendingToBeConfirmed states.\n const result: PendingAmounts = {\n isPending: true,\n pendingBalance\n }\n\n if (simulationDelta) {\n // When we broadcast the AccountOp, we set the status of the simulated AccountOp to `BroadcastedButNotConfirmed`\n // until the transaction is confirmed or the user forcefully refreshes their portfolio balance and clears the simulation.\n // When the SimulatedAccountOp has the status `BroadcastedButNotConfirmed`, we know that the pending badge is `pendingToBeConfirmed`.\n const hasPendingToBeConfirmed =\n simulatedAccountOp?.status === AccountOpStatus.BroadcastedButNotConfirmed\n\n if (hasPendingToBeConfirmed) {\n // Main scenario #2.\n result.pendingToBeConfirmed = simulationDelta\n } else {\n // Main scenario #1.\n result.pendingToBeSigned = simulationDelta\n }\n }\n\n if (latestPendingDelta) {\n result.pendingToBeConfirmed = result.pendingToBeConfirmed\n ? result.pendingToBeConfirmed + latestPendingDelta // Rare scenario #2.\n : latestPendingDelta // Main scenario #3.\n }\n\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.d.ts b/dist/src/libs/portfolio/portfolio.d.ts new file mode 100644 index 000000000..32646fe06 --- /dev/null +++ b/dist/src/libs/portfolio/portfolio.d.ts @@ -0,0 +1,26 @@ +import { JsonRpcProvider, Provider } from 'ethers'; +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { GetOptions, Hints, Limits, PortfolioLibGetResult } from './interfaces'; +export declare const LIMITS: Limits; +export declare const PORTFOLIO_LIB_ERROR_NAMES: { + /** External hints API (Velcro) request failed but fallback is sufficient */ + NonCriticalApiHintsError: string; + /** External API (Velcro) hints are older than X minutes */ + StaleApiHintsError: string; + /** No external API (Velcro) hints are available- the request failed without fallback */ + NoApiHintsError: string; + /** One or more cena request has failed */ + PriceFetchError: string; +}; +export declare const getEmptyHints: () => Hints; +export declare class Portfolio { + network: Network; + private batchedVelcroDiscovery; + private batchedGecko; + private deploylessTokens; + private deploylessNfts; + constructor(fetch: Fetch, provider: Provider | JsonRpcProvider, network: Network, velcroUrl?: string); + get(accountAddr: string, opts?: Partial): Promise; +} +//# sourceMappingURL=portfolio.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.d.ts.map b/dist/src/libs/portfolio/portfolio.d.ts.map new file mode 100644 index 000000000..0e0eced90 --- /dev/null +++ b/dist/src/libs/portfolio/portfolio.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/portfolio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,eAAe,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAA;AAM3E,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAMlD,OAAO,EAGL,UAAU,EACV,KAAK,EACL,MAAM,EAEN,qBAAqB,EAItB,MAAM,cAAc,CAAA;AAGrB,eAAO,MAAM,MAAM,EAAE,MAWpB,CAAA;AAED,eAAO,MAAM,yBAAyB;IACpC,4EAA4E;;IAE5E,2DAA2D;;IAE3D,wFAAwF;;IAExF,0CAA0C;;CAE3C,CAAA;AAED,eAAO,MAAM,aAAa,QAAO,KAG/B,CAAA;AAWF,qBAAa,SAAS;IACpB,OAAO,EAAE,OAAO,CAAA;IAEhB,OAAO,CAAC,sBAAsB,CAAU;IAExC,OAAO,CAAC,YAAY,CAAU;IAE9B,OAAO,CAAC,gBAAgB,CAAY;IAEpC,OAAO,CAAC,cAAc,CAAY;gBAGhC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,GAAG,eAAe,EACpC,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM;IA8Bd,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAiR/F"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.js b/dist/src/libs/portfolio/portfolio.js index 234ab205c..7646b475e 100644 --- a/dist/src/libs/portfolio/portfolio.js +++ b/dist/src/libs/portfolio/portfolio.js @@ -1,100 +1,176 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Portfolio = exports.getEmptyHints = void 0; -const deployless_1 = require("../deployless/deployless"); -const NFTGetter_json_1 = __importDefault(require("../../../contracts/compiled/NFTGetter.json")); -const BalanceGetter_json_1 = __importDefault(require("../../../contracts/compiled/BalanceGetter.json")); -const batcher_1 = __importDefault(require("./batcher")); -const gecko_1 = require("./gecko"); -const pagination_1 = require("./pagination"); -const getOnchainBalances_1 = require("./getOnchainBalances"); -const LIMITS = { +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ +import { getAddress, ZeroAddress } from 'ethers'; +import BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'; +import NFTGetter from '../../../contracts/compiled/NFTGetter.json'; +import gasTankFeeTokens from '../../consts/gasTankFeeTokens'; +import { PINNED_TOKENS } from '../../consts/pinnedTokens'; +import { fromDescriptor } from '../deployless/deployless'; +import batcher from './batcher'; +import { geckoRequestBatcher, geckoResponseIdentifier } from './gecko'; +import { getNFTs, getTokens } from './getOnchainBalances'; +import { stripExternalHintsAPIResponse } from './helpers'; +import { flattenResults, paginate } from './pagination'; +export const LIMITS = { // we have to be conservative with erc721Tokens because if we pass 30x20 (worst case) tokenIds, that's 30x20 extra words which is 19kb // proxy mode input is limited to 24kb deploylessProxyMode: { erc20: 100, erc721: 30, erc721TokensInput: 20, erc721Tokens: 50 }, // theoretical capacity is 1666/450 deploylessStateOverrideMode: { - erc20: 500, - erc721: 100, - erc721TokensInput: 100, - erc721Tokens: 100 + erc20: 350, + erc721: 70, + erc721TokensInput: 70, + erc721Tokens: 70 } }; -const getEmptyHints = (networkId, accountAddr) => ({ - networkId: networkId, - accountAddr: accountAddr, +export const PORTFOLIO_LIB_ERROR_NAMES = { + /** External hints API (Velcro) request failed but fallback is sufficient */ + NonCriticalApiHintsError: 'NonCriticalApiHintsError', + /** External API (Velcro) hints are older than X minutes */ + StaleApiHintsError: 'StaleApiHintsError', + /** No external API (Velcro) hints are available- the request failed without fallback */ + NoApiHintsError: 'NoApiHintsError', + /** One or more cena request has failed */ + PriceFetchError: 'PriceFetchError' +}; +export const getEmptyHints = () => ({ erc20s: [], - erc721s: {}, - prices: {}, - hasHints: false + erc721s: {} }); -exports.getEmptyHints = getEmptyHints; const defaultOptions = { baseCurrency: 'usd', blockTag: 'latest', - priceRecency: 0 + priceRecency: 0, + previousHintsFromExternalAPI: null, + fetchPinned: true, + isEOA: false }; -class Portfolio { - constructor(fetch, provider, network) { - this.batchedVelcroDiscovery = (0, batcher_1.default)(fetch, (queue) => { +export class Portfolio { + network; + batchedVelcroDiscovery; + batchedGecko; + deploylessTokens; + deploylessNfts; + constructor(fetch, provider, network, velcroUrl) { + this.batchedVelcroDiscovery = batcher(fetch, (queue) => { const baseCurrencies = [...new Set(queue.map((x) => x.data.baseCurrency))]; return baseCurrencies.map((baseCurrency) => { const queueSegment = queue.filter((x) => x.data.baseCurrency === baseCurrency); - const url = `https://relayer.ambire.com/velcro-v3/multi-hints?networks=${queueSegment + const url = `${velcroUrl}/multi-hints?networks=${queueSegment .map((x) => x.data.networkId) .join(',')}&accounts=${queueSegment .map((x) => x.data.accountAddr) .join(',')}&baseCurrency=${baseCurrency}`; return { queueSegment, url }; }); + }, { + timeoutAfter: 3000, + timeoutErrorMessage: `Velcro discovery timed out on ${network.id}` + }); + this.batchedGecko = batcher(fetch, geckoRequestBatcher, { + timeoutAfter: 3000, + timeoutErrorMessage: `Cena request timed out on ${network.id}` }); - this.batchedGecko = (0, batcher_1.default)(fetch, gecko_1.geckoRequestBatcher); this.network = network; - this.deploylessTokens = (0, deployless_1.fromDescriptor)(provider, BalanceGetter_json_1.default, !network.rpcNoStateOverride); - this.deploylessNfts = (0, deployless_1.fromDescriptor)(provider, NFTGetter_json_1.default, !network.rpcNoStateOverride); + this.deploylessTokens = fromDescriptor(provider, BalanceGetter, !network.rpcNoStateOverride); + this.deploylessNfts = fromDescriptor(provider, NFTGetter, !network.rpcNoStateOverride); } async get(accountAddr, opts = {}) { - opts = { ...defaultOptions, ...opts }; - const { baseCurrency } = opts; - if (opts.simulation && opts.simulation.account.addr !== accountAddr) + const errors = []; + const localOpts = { ...defaultOptions, ...opts }; + const disableAutoDiscovery = localOpts.disableAutoDiscovery || false; + const { baseCurrency } = localOpts; + if (localOpts.simulation && localOpts.simulation.account.addr !== accountAddr) throw new Error('wrong account passed'); // Get hints (addresses to check on-chain) via Velcro const start = Date.now(); const networkId = this.network.id; // Make sure portfolio lib still works, even in the case Velcro discovery fails. // Because of this, we fall back to Velcro default response. - let hints; + let hints = getEmptyHints(); + let hintsFromExternalAPI = null; try { - hints = await this.batchedVelcroDiscovery({ networkId, accountAddr, baseCurrency }); + // if the network doesn't have a relayer, velcro will not work + // but we should not record an error if such is the case + if (this.network.hasRelayer && !disableAutoDiscovery) { + hintsFromExternalAPI = await this.batchedVelcroDiscovery({ + networkId, + accountAddr, + baseCurrency + }); + if (hintsFromExternalAPI) { + hintsFromExternalAPI.lastUpdate = Date.now(); + hints = stripExternalHintsAPIResponse(hintsFromExternalAPI); + } + } } catch (error) { - hints = { - ...(0, exports.getEmptyHints)(networkId, accountAddr), - error - }; + const errorMesssage = `Failed to fetch hints from Velcro for networkId (${networkId}): ${error.message}`; + if (localOpts.previousHintsFromExternalAPI) { + hints = { ...localOpts.previousHintsFromExternalAPI }; + const TEN_MINUTES = 10 * 60 * 1000; + const lastUpdate = localOpts.previousHintsFromExternalAPI.lastUpdate; + const isLastUpdateTooOld = Date.now() - lastUpdate > TEN_MINUTES; + errors.push({ + name: isLastUpdateTooOld + ? PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError + : PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError, + message: errorMesssage, + level: 'critical' + }); + } + else { + errors.push({ + name: PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError, + message: errorMesssage, + level: 'silent' + }); + } + // It's important for DX to see this error + // eslint-disable-next-line no-console + console.error(errorMesssage); } - // Enrich hints with the previously found and cached hints, especially in the case the Velcro discovery fails. - if (opts.previousHints) { - hints = { - ...hints, - // Unique list of previously discovered and currently discovered erc20s - erc20s: [...new Set([...opts.previousHints.erc20s, ...hints.erc20s])], - // Please note 2 things: - // 1. Velcro hints data takes advantage over previous hints because, in most cases, Velcro data is more up-to-date than the previously cached hints. - // 2. There is only one use-case where the previous hints data is more recent, and that is when we find an NFT token via a pending simulation. - // In order to support it, we have to apply a complex deep merging algorithm (which may become problematic if the Velcro API changes) - // and also have to introduce an algorithm for self-cleaning outdated/previous NFT tokens. - // However, we have chosen to keep it as simple as possible and disregard this rare case. - erc721s: { ...opts.previousHints.erc721s, ...hints.erc721s } - }; + // Please note 2 things: + // 1. Velcro hints data takes advantage over previous hints because, in most cases, Velcro data is more up-to-date than the previously cached hints. + // 2. There is only one use-case where the previous hints data is more recent, and that is when we find an NFT token via a pending simulation. + // In order to support it, we have to apply a complex deep merging algorithm (which may become problematic if the Velcro API changes) + // and also have to introduce an algorithm for self-cleaning outdated/previous NFT tokens. + // However, we have chosen to keep it as simple as possible and disregard this rare case. + if (localOpts.additionalErc721Hints) { + hints.erc721s = { ...localOpts.additionalErc721Hints, ...hints.erc721s }; + } + if (localOpts.additionalErc20Hints) { + hints.erc20s = [...hints.erc20s, ...localOpts.additionalErc20Hints]; } + if (localOpts.fetchPinned) { + hints.erc20s = [...hints.erc20s, ...PINNED_TOKENS.map((x) => x.address)]; + } + // add the fee tokens + hints.erc20s = [ + ...hints.erc20s, + ...gasTankFeeTokens.filter((x) => x.networkId === this.network.id).map((x) => x.address) + ]; + const checksummedErc20Hints = hints.erc20s + .map((address) => { + try { + // getAddress may throw an error. This will break the portfolio + // if the error isn't caught + return getAddress(address); + } + catch { + return null; + } + }) + .filter(Boolean); + // Remove duplicates and always add ZeroAddress + hints.erc20s = [...new Set(checksummedErc20Hints.concat(ZeroAddress))]; // This also allows getting prices, this is used for more exotic tokens that cannot be retrieved via Coingecko - const priceCache = opts.priceCache || new Map(); - for (const addr in hints.prices || {}) { - const priceHint = hints.prices[addr]; + const priceCache = localOpts.priceCache || new Map(); + for (const addr in hintsFromExternalAPI?.prices || {}) { + const priceHint = hintsFromExternalAPI?.prices[addr]; + // eslint-disable-next-line no-continue + if (!priceHint) + continue; // @TODO consider validating the external response here, before doing the .set; or validating the whole velcro response priceCache.set(addr, [start, Array.isArray(priceHint) ? priceHint : [priceHint]]); } @@ -105,9 +181,12 @@ class Portfolio { : LIMITS.deploylessStateOverrideMode; const collectionsHints = Object.entries(hints.erc721s); const [tokensWithErr, collectionsWithErr] = await Promise.all([ - (0, pagination_1.flattenResults)((0, pagination_1.paginate)(hints.erc20s, limits.erc20).map((page) => (0, getOnchainBalances_1.getTokens)(this.network, this.deploylessTokens, opts, accountAddr, page))), - (0, pagination_1.flattenResults)((0, pagination_1.paginate)(collectionsHints, limits.erc721).map((page) => (0, getOnchainBalances_1.getNFTs)(this.deploylessNfts, opts, accountAddr, page, limits))) + flattenResults(paginate(hints.erc20s, limits.erc20).map((page) => getTokens(this.network, this.deploylessTokens, localOpts, accountAddr, page))), + flattenResults(paginate(collectionsHints, limits.erc721).map((page) => getNFTs(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits))) ]); + const [tokensWithErrResult, metaData] = tokensWithErr; + const { blockNumber, beforeNonce, afterNonce } = metaData; + const [collectionsWithErrResult] = collectionsWithErr; // Re-map/filter into our format const getPriceFromCache = (address) => { const cached = priceCache.get(address); @@ -117,68 +196,106 @@ class Portfolio { const eligible = entry.filter((x) => x.baseCurrency === baseCurrency); // by using `start` instead of `Date.now()`, we make sure that prices updated from Velcro will not be updated again // even if priceRecency is 0 - if (start - timestamp <= opts.priceRecency && eligible.length) + if (start - timestamp <= localOpts.priceRecency && eligible.length) return eligible; return null; }; - const tokenFilter = ([error, result]) => result.amount > 0 && error == '0x' && result.symbol !== ''; - const tokens = tokensWithErr.filter(tokenFilter).map(([_, result]) => result); - const collections = collectionsWithErr.filter(tokenFilter).map(([_, x], i) => { + const tokenFilter = ([error, result]) => error === '0x' && !!result.symbol; + const tokensWithoutPrices = tokensWithErrResult + .filter((_tokensWithErrResult) => tokenFilter(_tokensWithErrResult)) + .map(([, result]) => result); + const unfilteredCollections = collectionsWithErrResult.map(([error, x], i) => { const address = collectionsHints[i][0]; - return { - ...x, - address: address, - priceIn: getPriceFromCache(address) || [] - }; + return [ + error, + { + ...x, + address, + priceIn: getPriceFromCache(address) || [] + } + ]; }); + const collections = unfilteredCollections + .filter((preFilterCollection) => tokenFilter(preFilterCollection)) + .map(([, collection]) => collection); const oracleCallDone = Date.now(); - // Update prices - await Promise.all(tokens.map(async (token) => { + // Update prices and set the priceIn for each token by reference, + // updating the final tokens array as a result + const tokensWithPrices = await Promise.all(tokensWithoutPrices.map(async (token) => { + let priceIn = []; const cachedPriceIn = getPriceFromCache(token.address); if (cachedPriceIn) { - token.priceIn = cachedPriceIn; - return; + priceIn = cachedPriceIn; + return { + ...token, + priceIn + }; + } + if (!this.network.platformId) { + return { + ...token, + priceIn + }; + } + try { + const priceData = await this.batchedGecko({ + ...token, + network: this.network, + baseCurrency, + // this is what to look for in the coingecko response object + responseIdentifier: geckoResponseIdentifier(token.address, this.network) + }); + priceIn = Object.entries(priceData || {}).map(([baseCurr, price]) => ({ + baseCurrency: baseCurr, + price: price + })); + if (priceIn.length) + priceCache.set(token.address, [Date.now(), priceIn]); } - const priceData = await this.batchedGecko({ + catch (error) { + const errorMessage = error?.message || 'Unknown error'; + priceIn = []; + // Avoid duplicate errors, because this.bachedGecko is called for each token and if + // there is an error it will most likely be the same for all tokens + if (!errors.find((x) => x.name === PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage)) { + errors.push({ + name: PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError, + message: errorMessage, + level: 'warning' + }); + } + } + return { ...token, - networkId, - baseCurrency, - // this is what to look for in the coingecko response object - responseIdentifier: (0, gecko_1.geckoResponseIdentifier)(token.address, networkId) - }); - const priceIn = Object.entries(priceData || {}).map(([baseCurrency, price]) => ({ - baseCurrency, - price: price - })); - if (priceIn.length) - priceCache.set(token.address, [Date.now(), priceIn]); - token.priceIn = priceIn; + priceIn + }; })); const priceUpdateDone = Date.now(); return { - // Raw hints response - hints, + hintsFromExternalAPI: stripExternalHintsAPIResponse(hintsFromExternalAPI), + errors, updateStarted: start, discoveryTime: discoveryDone - start, oracleCallTime: oracleCallDone - discoveryDone, priceUpdateTime: priceUpdateDone - oracleCallDone, priceCache, - tokens, - tokenErrors: tokensWithErr + tokens: tokensWithPrices, + feeTokens: tokensWithPrices.filter((t) => { + // return the native token + if (t.address === ZeroAddress && + t.networkId.toLowerCase() === this.network.id.toLowerCase()) + return true; + return gasTankFeeTokens.find((gasTankT) => gasTankT.address.toLowerCase() === t.address.toLowerCase() && + gasTankT.networkId.toLowerCase() === t.networkId.toLowerCase()); + }), + beforeNonce, + afterNonce, + blockNumber, + tokenErrors: tokensWithErrResult .filter(([error, result]) => error !== '0x' || result.symbol === '') .map(([error, result]) => ({ error, address: result.address })), - collections: collections.filter((x) => x.collectibles?.length), - total: tokens.reduce((cur, token) => { - for (const x of token.priceIn) { - cur[x.baseCurrency] = - (cur[x.baseCurrency] || 0) + (Number(token.amount) / 10 ** token.decimals) * x.price; - } - return cur; - }, {}), - // Add error field conditionally - ...(hints.error && { hintsError: hints.error }) + collections }; } } -exports.Portfolio = Portfolio; //# sourceMappingURL=portfolio.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.js.map b/dist/src/libs/portfolio/portfolio.js.map index 888309922..2ac1602d6 100644 --- a/dist/src/libs/portfolio/portfolio.js.map +++ b/dist/src/libs/portfolio/portfolio.js.map @@ -1 +1 @@ -{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/portfolio.ts"],"names":[],"mappings":";;;;;;AACA,yDAAqE;AAErE,gGAAkE;AAClE,wGAA0E;AAC1E,wDAA+B;AAC/B,mCAAsE;AACtE,6CAAuD;AAWvD,6DAAyD;AAEzD,MAAM,MAAM,GAAW;IACrB,sIAAsI;IACtI,sCAAsC;IACtC,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IACxF,mCAAmC;IACnC,2BAA2B,EAAE;QAC3B,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,iBAAiB,EAAE,GAAG;QACtB,YAAY,EAAE,GAAG;KAClB;CACF,CAAA;AAEM,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,WAAmB,EAAS,EAAE,CAAC,CAAC;IAC/E,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,WAAW;IACxB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAA;AAPW,QAAA,aAAa,iBAOxB;AAcF,MAAM,cAAc,GAAe;IACjC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,QAAQ;IAClB,YAAY,EAAE,CAAC;CAChB,CAAA;AAED,MAAa,SAAS;IAOpB,YAAY,KAAe,EAAE,QAAoC,EAAE,OAA0B;QAC3F,IAAI,CAAC,sBAAsB,GAAG,IAAA,iBAAO,EAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACrD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC1E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;gBACzC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;gBAC9E,MAAM,GAAG,GAAG,6DAA6D,YAAY;qBAClF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;qBAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,YAAY;qBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC9B,IAAI,CAAC,GAAG,CAAC,iBAAiB,YAAY,EAAE,CAAA;gBAC3C,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;YAC9B,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,GAAG,IAAA,iBAAO,EAAC,KAAK,EAAE,2BAAmB,CAAC,CAAA;QACvD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAA,2BAAc,EAAC,QAAQ,EAAE,4BAAa,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAC5F,IAAI,CAAC,cAAc,GAAG,IAAA,2BAAc,EAAC,QAAQ,EAAE,wBAAS,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,OAA4B,EAAE;QAC3D,IAAI,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,CAAA;QACrC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;QAC7B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YACjE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAEzC,qDAAqD;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QAEjC,gFAAgF;QAChF,4DAA4D;QAC5D,IAAI,KAAY,CAAA;QAChB,IAAI;YACF,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAA;SACpF;QAAC,OAAO,KAAU,EAAE;YACnB,KAAK,GAAG;gBACN,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,WAAW,CAAC;gBACxC,KAAK;aACN,CAAA;SACF;QAED,8GAA8G;QAC9G,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,KAAK,GAAG;gBACN,GAAG,KAAK;gBACR,uEAAuE;gBACvE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBACrE,wBAAwB;gBACxB,oJAAoJ;gBACpJ,8IAA8I;gBAC9I,qIAAqI;gBACrI,0FAA0F;gBAC1F,yFAAyF;gBACzF,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;aAC7D,CAAA;SACF;QAED,8GAA8G;QAC9G,MAAM,UAAU,GAAe,IAAI,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,CAAA;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACpC,uHAAuH;YACvH,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;SAClF;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEhC,wFAAwF;QACxF,MAAM,MAAM,GAAkB,IAAI,CAAC,gBAAgB,CAAC,mBAAmB;YACrE,CAAC,CAAC,MAAM,CAAC,mBAAmB;YAC5B,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAA;QACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEtD,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5D,IAAA,2BAAc,EACZ,IAAA,qBAAQ,EAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,IAAA,8BAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CACxE,CACF;YACD,IAAA,2BAAc,EACZ,IAAA,qBAAQ,EAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,IAAA,4BAAO,EAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAC9D,CACF;SACF,CAAC,CAAA;QAEF,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAA;YACxB,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,CAAA;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;YACrE,mHAAmH;YACnH,4BAA4B;YAC5B,IAAI,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,YAAa,IAAI,QAAQ,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAA;YAC/E,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAwB,EAAW,EAAE,CACtE,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAA;QAE5D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;QAE7E,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3E,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAsB,CAAA;YAC3D,OAAO;gBACL,GAAG,CAAC;gBACJ,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE;aAC3B,CAAA;QAClB,CAAC,CAAC,CAAA;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEjC,gBAAgB;QAChB,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACzB,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtD,IAAI,aAAa,EAAE;gBACjB,KAAK,CAAC,OAAO,GAAG,aAAa,CAAA;gBAC7B,OAAM;aACP;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;gBACxC,GAAG,KAAK;gBACR,SAAS;gBACT,YAAY;gBACZ,4DAA4D;gBAC5D,kBAAkB,EAAE,IAAA,+BAAuB,EAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;aACtE,CAAC,CAAA;YACF,MAAM,OAAO,GAAY,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvF,YAAY;gBACZ,KAAK,EAAE,KAAe;aACvB,CAAC,CAAC,CAAA;YACH,IAAI,OAAO,CAAC,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;YACxE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACzB,CAAC,CAAC,CACH,CAAA;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAElC,OAAO;YACL,qBAAqB;YACrB,KAAK;YACL,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,aAAa,GAAG,KAAK;YACpC,cAAc,EAAE,cAAc,GAAG,aAAa;YAC9C,eAAe,EAAE,eAAe,GAAG,cAAc;YACjD,UAAU;YACV,MAAM;YACN,WAAW,EAAE,aAAa;iBACvB,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;iBACnE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9D,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;oBAC7B,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;wBACjB,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;iBACvF;gBACD,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,EAAE,CAAC;YACN,gCAAgC;YAChC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;SAChD,CAAA;IACH,CAAC;CACF;AAzKD,8BAyKC"} \ No newline at end of file +{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/portfolio.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,iCAAiC;AAEjC,OAAO,EAAE,UAAU,EAA6B,WAAW,EAAE,MAAM,QAAQ,CAAA;AAE3E,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,SAAS,MAAM,4CAA4C,CAAA;AAClE,OAAO,gBAAgB,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAGzD,OAAO,EAAc,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAA;AAazD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvD,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,sIAAsI;IACtI,sCAAsC;IACtC,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IACxF,mCAAmC;IACnC,2BAA2B,EAAE;QAC3B,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,EAAE;QACV,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACjB;CACF,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,4EAA4E;IAC5E,wBAAwB,EAAE,0BAA0B;IACpD,2DAA2D;IAC3D,kBAAkB,EAAE,oBAAoB;IACxC,wFAAwF;IACxF,eAAe,EAAE,iBAAiB;IAClC,0CAA0C;IAC1C,eAAe,EAAE,iBAAiB;CACnC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,GAAU,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC,CAAA;AAEF,MAAM,cAAc,GAAe;IACjC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,QAAQ;IAClB,YAAY,EAAE,CAAC;IACf,4BAA4B,EAAE,IAAI;IAClC,WAAW,EAAE,IAAI;IACjB,KAAK,EAAE,KAAK;CACb,CAAA;AAED,MAAM,OAAO,SAAS;IACpB,OAAO,CAAS;IAER,sBAAsB,CAAU;IAEhC,YAAY,CAAU;IAEtB,gBAAgB,CAAY;IAE5B,cAAc,CAAY;IAElC,YACE,KAAY,EACZ,QAAoC,EACpC,OAAgB,EAChB,SAAkB;QAElB,IAAI,CAAC,sBAAsB,GAAG,OAAO,CACnC,KAAK,EACL,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC1E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;gBACzC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;gBAC9E,MAAM,GAAG,GAAG,GAAG,SAAS,yBAAyB,YAAY;qBAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;qBAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,YAAY;qBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC9B,IAAI,CAAC,GAAG,CAAC,iBAAiB,YAAY,EAAE,CAAA;gBAC3C,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;YAC9B,CAAC,CAAC,CAAA;QACJ,CAAC,EACD;YACE,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,iCAAiC,OAAO,CAAC,EAAE,EAAE;SACnE,CACF,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE;YACtD,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,6BAA6B,OAAO,CAAC,EAAE,EAAE;SAC/D,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAC5F,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,OAA4B,EAAE;QAC3D,MAAM,MAAM,GAAoC,EAAE,CAAA;QAClD,MAAM,SAAS,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,CAAA;QAChD,MAAM,oBAAoB,GAAG,SAAS,CAAC,oBAAoB,IAAI,KAAK,CAAA;QACpE,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;QAClC,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAC3E,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAEzC,qDAAqD;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QAEjC,gFAAgF;QAChF,4DAA4D;QAC5D,IAAI,KAAK,GAAU,aAAa,EAAE,CAAA;QAClC,IAAI,oBAAoB,GAAoC,IAAI,CAAA;QAEhE,IAAI;YACF,8DAA8D;YAC9D,wDAAwD;YACxD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,oBAAoB,EAAE;gBACpD,oBAAoB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC;oBACvD,SAAS;oBACT,WAAW;oBACX,YAAY;iBACb,CAAC,CAAA;gBAEF,IAAI,oBAAoB,EAAE;oBACxB,oBAAoB,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;oBAC5C,KAAK,GAAG,6BAA6B,CAAC,oBAAoB,CAAU,CAAA;iBACrE;aACF;SACF;QAAC,OAAO,KAAU,EAAE;YACnB,MAAM,aAAa,GAAG,oDAAoD,SAAS,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YACxG,IAAI,SAAS,CAAC,4BAA4B,EAAE;gBAC1C,KAAK,GAAG,EAAE,GAAG,SAAS,CAAC,4BAA4B,EAAE,CAAA;gBACrD,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;gBAClC,MAAM,UAAU,GAAG,SAAS,CAAC,4BAA4B,CAAC,UAAU,CAAA;gBACpE,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,WAAW,CAAA;gBAEhE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;wBACtB,CAAC,CAAC,yBAAyB,CAAC,kBAAkB;wBAC9C,CAAC,CAAC,yBAAyB,CAAC,wBAAwB;oBACtD,OAAO,EAAE,aAAa;oBACtB,KAAK,EAAE,UAAU;iBAClB,CAAC,CAAA;aACH;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,yBAAyB,CAAC,eAAe;oBAC/C,OAAO,EAAE,aAAa;oBACtB,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAA;aACH;YAED,0CAA0C;YAC1C,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;SAC7B;QAED,wBAAwB;QACxB,oJAAoJ;QACpJ,8IAA8I;QAC9I,qIAAqI;QACrI,0FAA0F;QAC1F,yFAAyF;QACzF,IAAI,SAAS,CAAC,qBAAqB,EAAE;YACnC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,qBAAqB,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;SACzE;QAED,IAAI,SAAS,CAAC,oBAAoB,EAAE;YAClC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAA;SACpE;QAED,IAAI,SAAS,CAAC,WAAW,EAAE;YACzB,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;SACzE;QAED,qBAAqB;QACrB,KAAK,CAAC,MAAM,GAAG;YACb,GAAG,KAAK,CAAC,MAAM;YACf,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SACzF,CAAA;QAED,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM;aACvC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,IAAI;gBACF,+DAA+D;gBAC/D,4BAA4B;gBAC5B,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;aAC3B;YAAC,MAAM;gBACN,OAAO,IAAI,CAAA;aACZ;QACH,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAa,CAAA;QAE9B,+CAA+C;QAC/C,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAEtE,8GAA8G;QAC9G,MAAM,UAAU,GAAe,SAAS,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,CAAA;QAChE,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,MAAM,IAAI,EAAE,EAAE;YACrD,MAAM,SAAS,GAAG,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACpD,uCAAuC;YACvC,IAAI,CAAC,SAAS;gBAAE,SAAQ;YACxB,uHAAuH;YACvH,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;SAClF;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEhC,wFAAwF;QACxF,MAAM,MAAM,GAAkB,IAAI,CAAC,gBAAgB,CAAC,mBAAmB;YACrE,CAAC,CAAC,MAAM,CAAC,mBAAmB;YAC5B,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAA;QACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtD,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5D,cAAc,CACZ,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAC7E,CACF;YACD,cAAc,CACZ,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CACjF,CACF;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAA;QACrD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,QAIhD,CAAA;QACD,MAAM,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CAAA;QAErD,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAA;YACxB,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,CAAA;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;YACrE,mHAAmH;YACnH,4BAA4B;YAC5B,IAAI,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,YAAa,IAAI,QAAQ,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAA;YACpF,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAA4B,EAAW,EAAE,CAC1E,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;QAEnC,MAAM,mBAAmB,GAAG,mBAAmB;aAC5C,MAAM,CAAC,CAAC,oBAA+C,EAAE,EAAE,CAC1D,WAAW,CAAC,oBAAoB,CAAC,CAClC;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;QAElD,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3E,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAsB,CAAA;YAC3D,OAAO;gBACL,KAAK;gBACL;oBACE,GAAG,CAAC;oBACJ,OAAO;oBACP,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE;iBAC1C;aAC4B,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,qBAAqB;aACtC,MAAM,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA;QAEtC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEjC,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,gBAAgB,GAAkB,MAAM,OAAO,CAAC,GAAG,CACvD,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,KAA0B,EAAE,EAAE;YAC3D,IAAI,OAAO,GAA2B,EAAE,CAAA;YACxC,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAEtD,IAAI,aAAa,EAAE;gBACjB,OAAO,GAAG,aAAa,CAAA;gBAEvB,OAAO;oBACL,GAAI,KAAqB;oBACzB,OAAO;iBACR,CAAA;aACF;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;gBAC5B,OAAO;oBACL,GAAI,KAAqB;oBACzB,OAAO;iBACR,CAAA;aACF;YAED,IAAI;gBACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;oBACxC,GAAG,KAAK;oBACR,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,YAAY;oBACZ,4DAA4D;oBAC5D,kBAAkB,EAAE,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;iBACzE,CAAC,CAAA;gBAEF,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpE,YAAY,EAAE,QAAQ;oBACtB,KAAK,EAAE,KAAe;iBACvB,CAAC,CAAC,CAAA;gBACH,IAAI,OAAO,CAAC,MAAM;oBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;aACzE;YAAC,OAAO,KAAU,EAAE;gBACnB,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,eAAe,CAAA;gBACtD,OAAO,GAAG,EAAE,CAAA;gBAEZ,mFAAmF;gBACnF,mEAAmE;gBACnE,IACE,CAAC,MAAM,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAAC,eAAe,IAAI,CAAC,CAAC,OAAO,KAAK,YAAY,CACrF,EACD;oBACA,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,yBAAyB,CAAC,eAAe;wBAC/C,OAAO,EAAE,YAAY;wBACrB,KAAK,EAAE,SAAS;qBACjB,CAAC,CAAA;iBACH;aACF;YAED,OAAO;gBACL,GAAI,KAAqB;gBACzB,OAAO;aACR,CAAA;QACH,CAAC,CAAC,CACH,CAAA;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAElC,OAAO;YACL,oBAAoB,EAAE,6BAA6B,CAAC,oBAAoB,CAAC;YACzE,MAAM;YACN,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,aAAa,GAAG,KAAK;YACpC,cAAc,EAAE,cAAc,GAAG,aAAa;YAC9C,eAAe,EAAE,eAAe,GAAG,cAAc;YACjD,UAAU;YACV,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvC,0BAA0B;gBAC1B,IACE,CAAC,CAAC,OAAO,KAAK,WAAW;oBACzB,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE;oBAE3D,OAAO,IAAI,CAAA;gBAEb,OAAO,gBAAgB,CAAC,IAAI,CAC1B,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE;oBAC1D,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CACjE,CAAA;YACH,CAAC,CAAC;YACF,WAAW;YACX,UAAU;YACV,WAAW;YACX,WAAW,EAAE,mBAAmB;iBAC7B,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAwB,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;iBAC1F,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAwB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,WAAW;SACZ,CAAA;IACH,CAAC;CACF","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable guard-for-in */\n\nimport { getAddress, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Deployless, fromDescriptor } from '../deployless/deployless'\nimport batcher from './batcher'\nimport { geckoRequestBatcher, geckoResponseIdentifier } from './gecko'\nimport { getNFTs, getTokens } from './getOnchainBalances'\nimport { stripExternalHintsAPIResponse } from './helpers'\nimport {\n CollectionResult,\n ExternalHintsAPIResponse,\n GetOptions,\n Hints,\n Limits,\n LimitsOptions,\n PortfolioLibGetResult,\n PriceCache,\n TokenError,\n TokenResult\n} from './interfaces'\nimport { flattenResults, paginate } from './pagination'\n\nexport const LIMITS: Limits = {\n // we have to be conservative with erc721Tokens because if we pass 30x20 (worst case) tokenIds, that's 30x20 extra words which is 19kb\n // proxy mode input is limited to 24kb\n deploylessProxyMode: { erc20: 100, erc721: 30, erc721TokensInput: 20, erc721Tokens: 50 },\n // theoretical capacity is 1666/450\n deploylessStateOverrideMode: {\n erc20: 350,\n erc721: 70,\n erc721TokensInput: 70,\n erc721Tokens: 70\n }\n}\n\nexport const PORTFOLIO_LIB_ERROR_NAMES = {\n /** External hints API (Velcro) request failed but fallback is sufficient */\n NonCriticalApiHintsError: 'NonCriticalApiHintsError',\n /** External API (Velcro) hints are older than X minutes */\n StaleApiHintsError: 'StaleApiHintsError',\n /** No external API (Velcro) hints are available- the request failed without fallback */\n NoApiHintsError: 'NoApiHintsError',\n /** One or more cena request has failed */\n PriceFetchError: 'PriceFetchError'\n}\n\nexport const getEmptyHints = (): Hints => ({\n erc20s: [],\n erc721s: {}\n})\n\nconst defaultOptions: GetOptions = {\n baseCurrency: 'usd',\n blockTag: 'latest',\n priceRecency: 0,\n previousHintsFromExternalAPI: null,\n fetchPinned: true,\n isEOA: false\n}\n\nexport class Portfolio {\n network: Network\n\n private batchedVelcroDiscovery: Function\n\n private batchedGecko: Function\n\n private deploylessTokens: Deployless\n\n private deploylessNfts: Deployless\n\n constructor(\n fetch: Fetch,\n provider: Provider | JsonRpcProvider,\n network: Network,\n velcroUrl?: string\n ) {\n this.batchedVelcroDiscovery = batcher(\n fetch,\n (queue) => {\n const baseCurrencies = [...new Set(queue.map((x) => x.data.baseCurrency))]\n return baseCurrencies.map((baseCurrency) => {\n const queueSegment = queue.filter((x) => x.data.baseCurrency === baseCurrency)\n const url = `${velcroUrl}/multi-hints?networks=${queueSegment\n .map((x) => x.data.networkId)\n .join(',')}&accounts=${queueSegment\n .map((x) => x.data.accountAddr)\n .join(',')}&baseCurrency=${baseCurrency}`\n return { queueSegment, url }\n })\n },\n {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Velcro discovery timed out on ${network.id}`\n }\n )\n this.batchedGecko = batcher(fetch, geckoRequestBatcher, {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Cena request timed out on ${network.id}`\n })\n this.network = network\n this.deploylessTokens = fromDescriptor(provider, BalanceGetter, !network.rpcNoStateOverride)\n this.deploylessNfts = fromDescriptor(provider, NFTGetter, !network.rpcNoStateOverride)\n }\n\n async get(accountAddr: string, opts: Partial = {}): Promise {\n const errors: PortfolioLibGetResult['errors'] = []\n const localOpts = { ...defaultOptions, ...opts }\n const disableAutoDiscovery = localOpts.disableAutoDiscovery || false\n const { baseCurrency } = localOpts\n if (localOpts.simulation && localOpts.simulation.account.addr !== accountAddr)\n throw new Error('wrong account passed')\n\n // Get hints (addresses to check on-chain) via Velcro\n const start = Date.now()\n const networkId = this.network.id\n\n // Make sure portfolio lib still works, even in the case Velcro discovery fails.\n // Because of this, we fall back to Velcro default response.\n let hints: Hints = getEmptyHints()\n let hintsFromExternalAPI: ExternalHintsAPIResponse | null = null\n\n try {\n // if the network doesn't have a relayer, velcro will not work\n // but we should not record an error if such is the case\n if (this.network.hasRelayer && !disableAutoDiscovery) {\n hintsFromExternalAPI = await this.batchedVelcroDiscovery({\n networkId,\n accountAddr,\n baseCurrency\n })\n\n if (hintsFromExternalAPI) {\n hintsFromExternalAPI.lastUpdate = Date.now()\n hints = stripExternalHintsAPIResponse(hintsFromExternalAPI) as Hints\n }\n }\n } catch (error: any) {\n const errorMesssage = `Failed to fetch hints from Velcro for networkId (${networkId}): ${error.message}`\n if (localOpts.previousHintsFromExternalAPI) {\n hints = { ...localOpts.previousHintsFromExternalAPI }\n const TEN_MINUTES = 10 * 60 * 1000\n const lastUpdate = localOpts.previousHintsFromExternalAPI.lastUpdate\n const isLastUpdateTooOld = Date.now() - lastUpdate > TEN_MINUTES\n\n errors.push({\n name: isLastUpdateTooOld\n ? PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError\n : PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError,\n message: errorMesssage,\n level: 'critical'\n })\n } else {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError,\n message: errorMesssage,\n level: 'silent'\n })\n }\n\n // It's important for DX to see this error\n // eslint-disable-next-line no-console\n console.error(errorMesssage)\n }\n\n // Please note 2 things:\n // 1. Velcro hints data takes advantage over previous hints because, in most cases, Velcro data is more up-to-date than the previously cached hints.\n // 2. There is only one use-case where the previous hints data is more recent, and that is when we find an NFT token via a pending simulation.\n // In order to support it, we have to apply a complex deep merging algorithm (which may become problematic if the Velcro API changes)\n // and also have to introduce an algorithm for self-cleaning outdated/previous NFT tokens.\n // However, we have chosen to keep it as simple as possible and disregard this rare case.\n if (localOpts.additionalErc721Hints) {\n hints.erc721s = { ...localOpts.additionalErc721Hints, ...hints.erc721s }\n }\n\n if (localOpts.additionalErc20Hints) {\n hints.erc20s = [...hints.erc20s, ...localOpts.additionalErc20Hints]\n }\n\n if (localOpts.fetchPinned) {\n hints.erc20s = [...hints.erc20s, ...PINNED_TOKENS.map((x) => x.address)]\n }\n\n // add the fee tokens\n hints.erc20s = [\n ...hints.erc20s,\n ...gasTankFeeTokens.filter((x) => x.networkId === this.network.id).map((x) => x.address)\n ]\n\n const checksummedErc20Hints = hints.erc20s\n .map((address) => {\n try {\n // getAddress may throw an error. This will break the portfolio\n // if the error isn't caught\n return getAddress(address)\n } catch {\n return null\n }\n })\n .filter(Boolean) as string[]\n\n // Remove duplicates and always add ZeroAddress\n hints.erc20s = [...new Set(checksummedErc20Hints.concat(ZeroAddress))]\n\n // This also allows getting prices, this is used for more exotic tokens that cannot be retrieved via Coingecko\n const priceCache: PriceCache = localOpts.priceCache || new Map()\n for (const addr in hintsFromExternalAPI?.prices || {}) {\n const priceHint = hintsFromExternalAPI?.prices[addr]\n // eslint-disable-next-line no-continue\n if (!priceHint) continue\n // @TODO consider validating the external response here, before doing the .set; or validating the whole velcro response\n priceCache.set(addr, [start, Array.isArray(priceHint) ? priceHint : [priceHint]])\n }\n const discoveryDone = Date.now()\n\n // .isLimitedAt24kbData should be the same for both instances; @TODO more elegant check?\n const limits: LimitsOptions = this.deploylessTokens.isLimitedAt24kbData\n ? LIMITS.deploylessProxyMode\n : LIMITS.deploylessStateOverrideMode\n const collectionsHints = Object.entries(hints.erc721s)\n const [tokensWithErr, collectionsWithErr] = await Promise.all([\n flattenResults(\n paginate(hints.erc20s, limits.erc20).map((page) =>\n getTokens(this.network, this.deploylessTokens, localOpts, accountAddr, page)\n )\n ),\n flattenResults(\n paginate(collectionsHints, limits.erc721).map((page) =>\n getNFTs(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits)\n )\n )\n ])\n\n const [tokensWithErrResult, metaData] = tokensWithErr\n const { blockNumber, beforeNonce, afterNonce } = metaData as {\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n }\n const [collectionsWithErrResult] = collectionsWithErr\n\n // Re-map/filter into our format\n const getPriceFromCache = (address: string) => {\n const cached = priceCache.get(address)\n if (!cached) return null\n const [timestamp, entry] = cached\n const eligible = entry.filter((x) => x.baseCurrency === baseCurrency)\n // by using `start` instead of `Date.now()`, we make sure that prices updated from Velcro will not be updated again\n // even if priceRecency is 0\n if (start - timestamp <= localOpts.priceRecency! && eligible.length) return eligible\n return null\n }\n\n const tokenFilter = ([error, result]: [TokenError, TokenResult]): boolean =>\n error === '0x' && !!result.symbol\n\n const tokensWithoutPrices = tokensWithErrResult\n .filter((_tokensWithErrResult: [TokenError, TokenResult]) =>\n tokenFilter(_tokensWithErrResult)\n )\n .map(([, result]: [any, TokenResult]) => result)\n\n const unfilteredCollections = collectionsWithErrResult.map(([error, x], i) => {\n const address = collectionsHints[i][0] as unknown as string\n return [\n error,\n {\n ...x,\n address,\n priceIn: getPriceFromCache(address) || []\n }\n ] as [string, CollectionResult]\n })\n\n const collections = unfilteredCollections\n .filter((preFilterCollection) => tokenFilter(preFilterCollection))\n .map(([, collection]) => collection)\n\n const oracleCallDone = Date.now()\n\n // Update prices and set the priceIn for each token by reference,\n // updating the final tokens array as a result\n const tokensWithPrices: TokenResult[] = await Promise.all(\n tokensWithoutPrices.map(async (token: { address: string }) => {\n let priceIn: TokenResult['priceIn'] = []\n const cachedPriceIn = getPriceFromCache(token.address)\n\n if (cachedPriceIn) {\n priceIn = cachedPriceIn\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n if (!this.network.platformId) {\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n try {\n const priceData = await this.batchedGecko({\n ...token,\n network: this.network,\n baseCurrency,\n // this is what to look for in the coingecko response object\n responseIdentifier: geckoResponseIdentifier(token.address, this.network)\n })\n\n priceIn = Object.entries(priceData || {}).map(([baseCurr, price]) => ({\n baseCurrency: baseCurr,\n price: price as number\n }))\n if (priceIn.length) priceCache.set(token.address, [Date.now(), priceIn])\n } catch (error: any) {\n const errorMessage = error?.message || 'Unknown error'\n priceIn = []\n\n // Avoid duplicate errors, because this.bachedGecko is called for each token and if\n // there is an error it will most likely be the same for all tokens\n if (\n !errors.find(\n (x) =>\n x.name === PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage\n )\n ) {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError,\n message: errorMessage,\n level: 'warning'\n })\n }\n }\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n })\n )\n\n const priceUpdateDone = Date.now()\n\n return {\n hintsFromExternalAPI: stripExternalHintsAPIResponse(hintsFromExternalAPI),\n errors,\n updateStarted: start,\n discoveryTime: discoveryDone - start,\n oracleCallTime: oracleCallDone - discoveryDone,\n priceUpdateTime: priceUpdateDone - oracleCallDone,\n priceCache,\n tokens: tokensWithPrices,\n feeTokens: tokensWithPrices.filter((t) => {\n // return the native token\n if (\n t.address === ZeroAddress &&\n t.networkId.toLowerCase() === this.network.id.toLowerCase()\n )\n return true\n\n return gasTankFeeTokens.find(\n (gasTankT) =>\n gasTankT.address.toLowerCase() === t.address.toLowerCase() &&\n gasTankT.networkId.toLowerCase() === t.networkId.toLowerCase()\n )\n }),\n beforeNonce,\n afterNonce,\n blockNumber,\n tokenErrors: tokensWithErrResult\n .filter(([error, result]: [string, TokenResult]) => error !== '0x' || result.symbol === '')\n .map(([error, result]: [string, TokenResult]) => ({ error, address: result.address })),\n collections\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.d.ts b/dist/src/libs/proxyDeploy/bytecode.d.ts new file mode 100644 index 000000000..6e65b5283 --- /dev/null +++ b/dist/src/libs/proxyDeploy/bytecode.d.ts @@ -0,0 +1,5 @@ +import { Network } from '../../interfaces/network'; +import { PrivLevels } from './deploy'; +export declare function getBytecode(priLevels: PrivLevels[]): Promise; +export declare function get4437Bytecode(network: Network, priLevels: PrivLevels[]): Promise; +//# sourceMappingURL=bytecode.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.d.ts.map b/dist/src/libs/proxyDeploy/bytecode.d.ts.map new file mode 100644 index 000000000..013540d06 --- /dev/null +++ b/dist/src/libs/proxyDeploy/bytecode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bytecode.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/bytecode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAuD,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1F,wBAAsB,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AACD,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAShG"} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.js b/dist/src/libs/proxyDeploy/bytecode.js index 2e7846c61..89d0c85dc 100644 --- a/dist/src/libs/proxyDeploy/bytecode.js +++ b/dist/src/libs/proxyDeploy/bytecode.js @@ -1,18 +1,20 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getBytecode = void 0; -const deploy_1 = require("./deploy"); -const ethers_1 = require("ethers"); -const deploy_2 = require("../../consts/deploy"); -async function getBytecode(network, priLevels) { - const provider = new ethers_1.JsonRpcProvider(network.rpcUrl); - const code = await provider.getCode(deploy_2.PROXY_AMBIRE_ACCOUNT); +import { PROXY_AMBIRE_4337_ACCOUNT, PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'; +import { getRpcProvider } from '../../services/provider'; +import { getProxyDeployBytecode, getStorageSlotsFromArtifact } from './deploy'; +export async function getBytecode(priLevels) { + // get the bytecode and deploy it + return getProxyDeployBytecode(PROXY_AMBIRE_ACCOUNT, priLevels, { + ...getStorageSlotsFromArtifact(null) + }); +} +export async function get4437Bytecode(network, priLevels) { + const provider = getRpcProvider(network.rpcUrls, network.chainId); + const code = await provider.getCode(PROXY_AMBIRE_4337_ACCOUNT); if (code === '0x') throw new Error('No proxy ambire account mined for the specified network'); // get the bytecode and deploy it - return (0, deploy_1.getProxyDeployBytecode)(deploy_2.PROXY_AMBIRE_ACCOUNT, priLevels, { - ...(0, deploy_1.getStorageSlotsFromArtifact)(null) + return getProxyDeployBytecode(PROXY_AMBIRE_4337_ACCOUNT, priLevels, { + ...getStorageSlotsFromArtifact(null) }); } -exports.getBytecode = getBytecode; //# sourceMappingURL=bytecode.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.js.map b/dist/src/libs/proxyDeploy/bytecode.js.map index c684665c7..bb75a0e44 100644 --- a/dist/src/libs/proxyDeploy/bytecode.js.map +++ b/dist/src/libs/proxyDeploy/bytecode.js.map @@ -1 +1 @@ -{"version":3,"file":"bytecode.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/bytecode.ts"],"names":[],"mappings":";;;AACA,qCAA0F;AAC1F,mCAAwC;AACxC,gDAAqF;AAE9E,KAAK,UAAU,WAAW,CAC/B,OAA0B,EAC1B,SAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,wBAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,6BAAoB,CAAC,CAAA;IACzD,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAE7F,iCAAiC;IACjC,OAAO,IAAA,+BAAsB,EAAC,6BAAoB,EAAE,SAAS,EAAE;QAC7D,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AAZD,kCAYC;AAED,qBAAqB;AACd,KAAK,UAAU,eAAe,CACnC,OAA0B,EAC1B,SAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,wBAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,kCAAyB,CAAC,CAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAE7F,iCAAiC;IACjC,OAAO,IAAA,+BAAsB,EAAC,kCAAyB,EAAE,SAAS,EAAE;QAClE,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AAZD,0CAYC"} \ No newline at end of file +{"version":3,"file":"bytecode.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/bytecode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAErF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAc,MAAM,UAAU,CAAA;AAE1F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAuB;IACvD,iCAAiC;IACjC,OAAO,sBAAsB,CAAC,oBAAoB,EAAE,SAAS,EAAE;QAC7D,GAAG,2BAA2B,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,SAAuB;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAE7F,iCAAiC;IACjC,OAAO,sBAAsB,CAAC,yBAAyB,EAAE,SAAS,EAAE;QAClE,GAAG,2BAA2B,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { PROXY_AMBIRE_4337_ACCOUNT, PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getProxyDeployBytecode, getStorageSlotsFromArtifact, PrivLevels } from './deploy'\n\nexport async function getBytecode(priLevels: PrivLevels[]): Promise {\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\nexport async function get4437Bytecode(network: Network, priLevels: PrivLevels[]): Promise {\n const provider = getRpcProvider(network.rpcUrls, network.chainId)\n const code = await provider.getCode(PROXY_AMBIRE_4337_ACCOUNT)\n if (code === '0x') throw new Error('No proxy ambire account mined for the specified network')\n\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_4337_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.d.ts b/dist/src/libs/proxyDeploy/deploy.d.ts new file mode 100644 index 000000000..76071b454 --- /dev/null +++ b/dist/src/libs/proxyDeploy/deploy.d.ts @@ -0,0 +1,12 @@ +export declare function privSlot(slotNumber: any, keyType: any, key: any, valueType: any): any; +export interface PrivLevels { + addr: string; + hash: string; +} +export declare function getProxyDeployBytecode(masterContractAddr: string, privLevels: PrivLevels[], opts?: { + privSlot: number; +}): string; +export declare function getStorageSlotsFromArtifact(buildInfo: any): { + privSlot: any; +}; +//# sourceMappingURL=deploy.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.d.ts.map b/dist/src/libs/proxyDeploy/deploy.d.ts.map new file mode 100644 index 000000000..f6608b060 --- /dev/null +++ b/dist/src/libs/proxyDeploy/deploy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAcA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAG/E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CACpC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,IAAI;;CAAkB,UAoBvB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,GAAG;;EAazD"} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js b/dist/src/libs/proxyDeploy/deploy.js index b1668f236..5ed134b91 100644 --- a/dist/src/libs/proxyDeploy/deploy.js +++ b/dist/src/libs/proxyDeploy/deploy.js @@ -1,8 +1,6 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getStorageSlotsFromArtifact = exports.getProxyDeployBytecode = void 0; const abi = require('ethereumjs-abi'); const keccak256 = require('js-sha3').keccak256; +// @TODO: fix the any function evmPush(data) { if (data.length < 1) throw new Error('evmPush: no data'); @@ -13,24 +11,26 @@ function evmPush(data) { opCodeBuf.writeUInt8(opCode, 0); return Buffer.concat([opCodeBuf, data]); } -function sstoreCode(slotNumber, keyType, key, valueType, valueBuf) { +// @TODO: fix the any +export function privSlot(slotNumber, keyType, key, valueType) { const buf = abi.rawEncode([keyType, valueType], [key, slotNumber]); - const slot = keccak256(buf); + return keccak256(buf); +} +// @TODO: fix the any +function sstoreCode(slotNumber, keyType, key, valueType, valueBuf) { + // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless + const slot = privSlot(slotNumber, keyType, key, valueType); return Buffer.concat([ evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf), evmPush(Buffer.from(slot, 'hex')), Buffer.from('55', 'hex') ]); } -function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlot: 0 }) { - const { privSlot = 0 } = opts; +export function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlot: 0 }) { + const slotNumber = opts.privSlot ?? 0; if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels'); - const storage = Buffer.concat(privLevels.map(({ addr, hash }) => { - return hash !== true - ? sstoreCode(privSlot, 'address', addr, 'bytes32', hash) - : sstoreCode(privSlot, 'address', addr, 'bool', Buffer.from('01', 'hex')); - })); + const storage = Buffer.concat(privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))); const initial = Buffer.from('3d602d80', 'hex'); // NOTE: this means we can't support offset>256 // @TODO solve this case; this will remove the "max 3 privLevels" restriction @@ -44,8 +44,7 @@ function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlo throw new Error('invalid address'); return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(masterAddrBuf).toString('hex')}5af43d82803e903d91602b57fd5bf3`; } -exports.getProxyDeployBytecode = getProxyDeployBytecode; -function getStorageSlotsFromArtifact(buildInfo) { +export function getStorageSlotsFromArtifact(buildInfo) { if (!buildInfo) return { privSlot: 0 }; const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']; @@ -53,8 +52,7 @@ function getStorageSlotsFromArtifact(buildInfo) { return { privSlot: 0 }; const identityNode = ambireAccountArtifact.ast.nodes.find((el) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'); const storageVariableNodes = identityNode.nodes.filter((n) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable); - const privSlot = storageVariableNodes.findIndex((x) => x.name === 'privileges'); - return { privSlot }; + const slotNumber = storageVariableNodes.findIndex((x) => x.name === 'privileges'); + return { privSlot: slotNumber }; } -exports.getStorageSlotsFromArtifact = getStorageSlotsFromArtifact; //# sourceMappingURL=deploy.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js.map b/dist/src/libs/proxyDeploy/deploy.js.map index 86db5a632..a5ac85102 100644 --- a/dist/src/libs/proxyDeploy/deploy.js.map +++ b/dist/src/libs/proxyDeploy/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":";;;AAAA,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;AAE9C,SAAS,OAAO,CAAC,IAAS;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACxD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,UAAe,EAAE,OAAY,EAAE,GAAQ,EAAE,SAAc,EAAE,QAAa;IACxF,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAA;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;KACzB,CAAC,CAAA;AACJ,CAAC;AAOD,SAAgB,sBAAsB,CACpC,kBAA0B,EAC1B,UAAwB,EACxB,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE;IAEtB,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAA;IAC7B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAChC,OAAO,IAAI,KAAK,IAAI;YAClB,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;YACxD,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IAC7E,CAAC,CAAC,CACH,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,+CAA+C;IAC/C,6EAA6E;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA,CAAC,iDAAiD;IACpG,IAAI,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IAE3F,4DAA4D;IAC5D,IAAI,aAAa,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACjE,OAAO,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,OAAO,CACzE,aAAa,CACd,CAAC,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAA;AACnD,CAAC;AA3BD,wDA2BC;AAED,SAAgB,2BAA2B,CAAC,SAAc;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,qBAAqB,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACrF,IAAI,CAAC,qBAAqB;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAClD,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CACvD,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,oBAAoB,IAAI,EAAE,CAAC,IAAI,KAAK,eAAe,CACjF,CAAA;IACD,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,qBAAqB,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,aAAa,CACnF,CAAA;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;IAEpF,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAbD,kEAaC"} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;AAE9C,qBAAqB;AACrB,SAAS,OAAO,CAAC,IAAS;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACxD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,QAAQ,CAAC,UAAe,EAAE,OAAY,EAAE,GAAQ,EAAE,SAAc;IAC9E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAA;IAClE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC;AAED,qBAAqB;AACrB,SAAS,UAAU,CAAC,UAAe,EAAE,OAAY,EAAE,GAAQ,EAAE,SAAc,EAAE,QAAa;IACxF,qHAAqH;IACrH,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;KACzB,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,UAAU,sBAAsB,CACpC,kBAA0B,EAC1B,UAAwB,EACxB,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE;IAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA;IACrC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAC7F,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,+CAA+C;IAC/C,6EAA6E;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA,CAAC,iDAAiD;IACpG,IAAI,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IAE3F,4DAA4D;IAC5D,IAAI,aAAa,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACjE,OAAO,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,OAAO,CACzE,aAAa,CACd,CAAC,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAc;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,qBAAqB,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACrF,IAAI,CAAC,qBAAqB;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAClD,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CACvD,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,oBAAoB,IAAI,EAAE,CAAC,IAAI,KAAK,eAAe,CACjF,CAAA;IACD,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,qBAAqB,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,aAAa,CACnF,CAAA;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;IAEtF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;AACjC,CAAC","sourcesContent":["const abi = require('ethereumjs-abi')\nconst keccak256 = require('js-sha3').keccak256\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const buf = abi.rawEncode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts new file mode 100644 index 000000000..c15bcdabf --- /dev/null +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts @@ -0,0 +1,2 @@ +export declare function getAmbireAccountAddress(factoryAddress: string, bytecode: string): string; +//# sourceMappingURL=getAmbireAddressTwo.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts.map b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts.map new file mode 100644 index 000000000..e4bb1ce76 --- /dev/null +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getAmbireAddressTwo.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/getAmbireAddressTwo.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAE/E"} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js index eba1eb319..87956f3e0 100644 --- a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js @@ -1,9 +1,5 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getAmbireAccountAddress = void 0; -const ethers_1 = require("ethers"); -function getAmbireAccountAddress(factoryAddress, bytecode) { - return ethers_1.ethers.getCreate2Address(factoryAddress, ethers_1.ethers.toBeHex(0, 32), ethers_1.ethers.keccak256(bytecode)); +import { getCreate2Address, keccak256, toBeHex } from 'ethers'; +export function getAmbireAccountAddress(factoryAddress, bytecode) { + return getCreate2Address(factoryAddress, toBeHex(0, 32), keccak256(bytecode)); } -exports.getAmbireAccountAddress = getAmbireAccountAddress; //# sourceMappingURL=getAmbireAddressTwo.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map index b3f5a6fc1..822742604 100644 --- a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map @@ -1 +1 @@ -{"version":3,"file":"getAmbireAddressTwo.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/getAmbireAddressTwo.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,SAAgB,uBAAuB,CAAC,cAAsB,EAAE,QAAgB;IAC9E,OAAO,eAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,eAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,eAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpG,CAAC;AAFD,0DAEC"} \ No newline at end of file +{"version":3,"file":"getAmbireAddressTwo.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/getAmbireAddressTwo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAE9D,MAAM,UAAU,uBAAuB,CAAC,cAAsB,EAAE,QAAgB;IAC9E,OAAO,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC/E,CAAC","sourcesContent":["import { getCreate2Address, keccak256, toBeHex } from 'ethers'\n\nexport function getAmbireAccountAddress(factoryAddress: string, bytecode: string) {\n return getCreate2Address(factoryAddress, toBeHex(0, 32), keccak256(bytecode))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.d.ts b/dist/src/libs/relayerCall/relayerCall.d.ts new file mode 100644 index 000000000..df3f9cc95 --- /dev/null +++ b/dist/src/libs/relayerCall/relayerCall.d.ts @@ -0,0 +1,13 @@ +import { Fetch } from '../../interfaces/fetch'; +export declare class RelayerError extends Error { + input: any; + output: any; + constructor(message: string, input: any, output: any); +} +export declare const RELAYER_DOWN_MESSAGE = "Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later"; +export declare function relayerCallUncaught(url: string, fetch: Fetch, method?: string, body?: any, headers?: any): Promise; +export declare function relayerCall(this: { + url: string; + fetch: Fetch; +}, path: string, method?: string, body?: any, headers?: any): Promise; +//# sourceMappingURL=relayerCall.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.d.ts.map b/dist/src/libs/relayerCall/relayerCall.d.ts.map new file mode 100644 index 000000000..a599ffed3 --- /dev/null +++ b/dist/src/libs/relayerCall/relayerCall.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"relayerCall.d.ts","sourceRoot":"","sources":["../../../../src/libs/relayerCall/relayerCall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAG9C,qBAAa,YAAa,SAAQ,KAAK;IAC9B,KAAK,EAAE,GAAG,CAAA;IAEV,MAAM,EAAE,GAAG,CAAA;gBAEN,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;CAKrD;AACD,eAAO,MAAM,oBAAoB,qGACmE,CAAA;AAEpG,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,MAAM,GAAE,MAAc,EACtB,IAAI,GAAE,GAAU,EAChB,OAAO,GAAE,GAAU,gBAiCpB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb,EACD,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAc,EACtB,IAAI,GAAE,GAAU,EAChB,OAAO,GAAE,GAAU,GAClB,OAAO,CAAC,GAAG,CAAC,CAQd"} \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.js b/dist/src/libs/relayerCall/relayerCall.js new file mode 100644 index 000000000..beac9d263 --- /dev/null +++ b/dist/src/libs/relayerCall/relayerCall.js @@ -0,0 +1,53 @@ +import { parse, stringify } from '../richJson/richJson'; +export class RelayerError extends Error { + input; + output; + constructor(message, input, output) { + super(message); + this.input = input; + this.output = output; + } +} +export const RELAYER_DOWN_MESSAGE = 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'; +export async function relayerCallUncaught(url, fetch, method = 'GET', body = null, headers = null) { + if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method)) + return { success: false, message: 'bad method' }; + if (!url) + return { success: false, message: 'no url or path' }; + if (body && ['GET', 'DELETE', 'HEAD'].includes(method)) + return { success: false, message: 'should not have a body' }; + const res = await fetch(url, { + method, + headers: { + 'Content-Type': 'application/json', + ...headers + }, + body: body ? stringify(body) : undefined + }); + const text = await res.text(); + const isStatusOk = res.status < 300 && res.status >= 200; + try { + const json = parse(text); + if (!json.hasOwnProperty('success')) { + return { success: isStatusOk, ...json, status: res.status }; + } + return { ...json, success: json.success && isStatusOk, status: res.status }; + } + catch (e) { + return { + success: false, + data: text, + status: res.status, + message: RELAYER_DOWN_MESSAGE + }; + } +} +export async function relayerCall(path, method = 'GET', body = null, headers = null) { + const res = await relayerCallUncaught(this.url + path, this.fetch, method, body, headers); + if (!res.success) { + const firstError = res.errorState && res.errorState.length ? res.errorState[0].message : res.message; + throw new RelayerError(firstError, { url: this.url, path, method, body, headers }, { res }); + } + return res; +} +//# sourceMappingURL=relayerCall.js.map \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.js.map b/dist/src/libs/relayerCall/relayerCall.js.map new file mode 100644 index 000000000..ad68caff3 --- /dev/null +++ b/dist/src/libs/relayerCall/relayerCall.js.map @@ -0,0 +1 @@ +{"version":3,"file":"relayerCall.js","sourceRoot":"","sources":["../../../../src/libs/relayerCall/relayerCall.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-prototype-builtins */\nimport { Fetch } from '../../interfaces/fetch'\nimport { parse, stringify } from '../richJson/richJson'\n\nexport class RelayerError extends Error {\n public input: any\n\n public output: any\n\n constructor(message: string, input: any, output: any) {\n super(message)\n this.input = input\n this.output = output\n }\n}\nexport const RELAYER_DOWN_MESSAGE =\n 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'\n\nexport async function relayerCallUncaught(\n url: string,\n fetch: Fetch,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n) {\n if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method))\n return { success: false, message: 'bad method' }\n if (!url) return { success: false, message: 'no url or path' }\n if (body && ['GET', 'DELETE', 'HEAD'].includes(method))\n return { success: false, message: 'should not have a body' }\n\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: body ? stringify(body) : undefined\n })\n\n const text = await res.text()\n const isStatusOk = res.status < 300 && res.status >= 200\n try {\n const json = parse(text)\n if (!json.hasOwnProperty('success')) {\n return { success: isStatusOk, ...json, status: res.status }\n }\n return { ...json, success: json.success && isStatusOk, status: res.status }\n } catch (e) {\n return {\n success: false,\n data: text,\n status: res.status,\n message: RELAYER_DOWN_MESSAGE\n }\n }\n}\n\nexport async function relayerCall(\n this: {\n url: string\n fetch: Fetch\n },\n path: string,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n): Promise {\n const res = await relayerCallUncaught(this.url + path, this.fetch, method, body, headers)\n if (!res.success) {\n const firstError =\n res.errorState && res.errorState.length ? res.errorState[0].message : res.message\n throw new RelayerError(firstError, { url: this.url, path, method, body, headers }, { res })\n }\n return res\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.d.ts b/dist/src/libs/richJson/richJson.d.ts new file mode 100644 index 000000000..7957cba55 --- /dev/null +++ b/dist/src/libs/richJson/richJson.d.ts @@ -0,0 +1,18 @@ +/** + * + * richJson lib + * + * JSON.serialize and JSON.parse don't support BigInt values. + * To address this limitation, we have created this small library that adds support for BigInt numbers + * during JSON serialization and parsing. + * + * Limitations: The library does not currently support BigInt values in new Map, Set, or Uint8Array. + * However, extending and adding support can be easily accomplished if needed. + * @credits: https://dev.to/benlesh/bigint-and-json-stringify-json-parse-2m8p + * + * + * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well. + */ +export declare function stringify(obj: any): string; +export declare function parse(json: string): any; +//# sourceMappingURL=richJson.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.d.ts.map b/dist/src/libs/richJson/richJson.d.ts.map new file mode 100644 index 000000000..1777855cb --- /dev/null +++ b/dist/src/libs/richJson/richJson.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"richJson.d.ts","sourceRoot":"","sources":["../../../../src/libs/richJson/richJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAmB1C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,OAoBjC"} \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.js b/dist/src/libs/richJson/richJson.js new file mode 100644 index 000000000..3ede266ed --- /dev/null +++ b/dist/src/libs/richJson/richJson.js @@ -0,0 +1,50 @@ +/** + * + * richJson lib + * + * JSON.serialize and JSON.parse don't support BigInt values. + * To address this limitation, we have created this small library that adds support for BigInt numbers + * during JSON serialization and parsing. + * + * Limitations: The library does not currently support BigInt values in new Map, Set, or Uint8Array. + * However, extending and adding support can be easily accomplished if needed. + * @credits: https://dev.to/benlesh/bigint-and-json-stringify-json-parse-2m8p + * + * + * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well. + */ +export function stringify(obj) { + return JSON.stringify(obj, (key, value) => { + if (typeof value === 'bigint') { + return { $bigint: value.toString() }; + } + if (value instanceof Error) { + const error = {}; + Object.getOwnPropertyNames(value).forEach((propName) => { + // @ts-ignore + error[propName] = value[propName]; + }); + return error; + } + return value; + }); +} +export function parse(json) { + return JSON.parse(json, (key, value) => { + if (value?.$bigint) { + return BigInt(value.$bigint); + } + if (value?.stack?.startsWith('Error')) { + const error = new Error(value.message); + Object.getOwnPropertyNames(value).forEach((propName) => { + if (propName !== 'message') { + // @ts-ignore + error[propName] = value[propName]; + } + }); + return error; + } + return value; + }); +} +//# sourceMappingURL=richJson.js.map \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.js.map b/dist/src/libs/richJson/richJson.js.map new file mode 100644 index 000000000..2775ebf60 --- /dev/null +++ b/dist/src/libs/richJson/richJson.js.map @@ -0,0 +1 @@ +{"version":3,"file":"richJson.js","sourceRoot":"","sources":["../../../../src/libs/richJson/richJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAA;SACrC;QAED,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,MAAM,KAAK,GAAQ,EAAE,CAAA;YAErB,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,aAAa;gBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACrC,IAAI,KAAK,EAAE,OAAO,EAAE;YAClB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SAC7B;QAED,IAAI,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,IAAI,QAAQ,KAAK,SAAS,EAAE;oBAC1B,aAAa;oBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;iBAClC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n *\n * richJson lib\n *\n * JSON.serialize and JSON.parse don't support BigInt values.\n * To address this limitation, we have created this small library that adds support for BigInt numbers\n * during JSON serialization and parsing.\n *\n * Limitations: The library does not currently support BigInt values in new Map, Set, or Uint8Array.\n * However, extending and adding support can be easily accomplished if needed.\n * @credits: https://dev.to/benlesh/bigint-and-json-stringify-json-parse-2m8p\n *\n *\n * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well.\n */\n\nexport function stringify(obj: any): string {\n return JSON.stringify(obj, (key, value) => {\n if (typeof value === 'bigint') {\n return { $bigint: value.toString() }\n }\n\n if (value instanceof Error) {\n const error: any = {}\n\n Object.getOwnPropertyNames(value).forEach((propName) => {\n // @ts-ignore\n error[propName] = value[propName]\n })\n\n return error\n }\n\n return value\n })\n}\n\nexport function parse(json: string) {\n return JSON.parse(json, (key, value) => {\n if (value?.$bigint) {\n return BigInt(value.$bigint)\n }\n\n if (value?.stack?.startsWith('Error')) {\n const error = new Error(value.message)\n Object.getOwnPropertyNames(value).forEach((propName) => {\n if (propName !== 'message') {\n // @ts-ignore\n error[propName] = value[propName]\n }\n })\n\n return error\n }\n\n return value\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.d.ts b/dist/src/libs/selectedAccount/errors.d.ts new file mode 100644 index 000000000..c6c4025ad --- /dev/null +++ b/dist/src/libs/selectedAccount/errors.d.ts @@ -0,0 +1,37 @@ +import { Network, NetworkId } from '../../interfaces/network'; +import { RPCProviders } from '../../interfaces/provider'; +import { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'; +import { AccountState as DefiPositionsAccountState, NetworksWithPositions } from '../defiPositions/types'; +import { AccountAssetsState } from '../portfolio/interfaces'; +export type Action = { + label: 'Select'; + actionName: 'select-rpc-url'; + meta: { + network: Network; + }; +}; +export type SelectedAccountBalanceError = { + id: string; + networkIds: NetworkId[]; + type: 'error' | 'warning'; + title: string; + text?: string; + actions?: Action[]; +}; +export declare const getNetworksWithFailedRPCErrors: ({ providers, networks, networksWithAssets }: { + providers: RPCProviders; + networks: Network[]; + networksWithAssets: AccountAssetsState; +}) => SelectedAccountBalanceError[]; +export declare const getNetworksWithPortfolioErrorErrors: ({ networks, selectedAccountLatest, providers }: { + networks: Network[]; + selectedAccountLatest: SelectedAccountPortfolioState; + providers: RPCProviders; +}) => SelectedAccountBalanceError[]; +export declare const getNetworksWithDeFiPositionsErrorErrors: ({ networks, currentAccountState, providers, networksWithPositions }: { + networks: Network[]; + currentAccountState: DefiPositionsAccountState; + providers: RPCProviders; + networksWithPositions: NetworksWithPositions; +}) => SelectedAccountBalanceError[]; +//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.d.ts.map b/dist/src/libs/selectedAccount/errors.d.ts.map new file mode 100644 index 000000000..ada6d2831 --- /dev/null +++ b/dist/src/libs/selectedAccount/errors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;AAChF,OAAO,EACL,YAAY,IAAI,yBAAyB,EAEzC,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAK5D,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,QAAQ,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,8BAA8B;eAK9B,YAAY;cACb,OAAO,EAAE;wBACC,kBAAkB;MACpC,2BAA2B,EAqD9B,CAAA;AAwDD,eAAO,MAAM,mCAAmC;cAKpC,OAAO,EAAE;2BACI,6BAA6B;eACzC,YAAY;MACrB,2BAA2B,EA2D9B,CAAA;AAED,eAAO,MAAM,uCAAuC;cAMxC,OAAO,EAAE;yBACE,yBAAyB;eACnC,YAAY;2BACA,qBAAqB;mCAyG7C,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.js b/dist/src/libs/selectedAccount/errors.js new file mode 100644 index 000000000..75c214529 --- /dev/null +++ b/dist/src/libs/selectedAccount/errors.js @@ -0,0 +1,226 @@ +import { DeFiPositionsError } from '../defiPositions/types'; +import { getNetworksWithFailedRPC } from '../networks/networks'; +import { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'; +const TEN_MINUTES = 10 * 60 * 1000; +export const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAssets }) => { + const errors = []; + const networkIds = getNetworksWithFailedRPC({ providers }).filter((networkId) => (Object.keys(networksWithAssets).includes(networkId) && + networksWithAssets[networkId] === true) || + !Object.keys(networksWithAssets).includes(networkId)); + const networksData = networkIds.map((id) => networks.find((n) => n.id === id)); + const allFailed = networksData.length === networks.length; + const networksWithMultipleRpcUrls = allFailed + ? [] + : networksData.filter((n) => n?.rpcUrls?.length > 1); + const networksToGroupInSingleBanner = allFailed + ? networksData + : networksData.filter((n) => n?.rpcUrls?.length <= 1); + if (!networksData.length) + return errors; + networksWithMultipleRpcUrls.forEach((n) => { + errors.push({ + id: `custom-rpcs-down-${n.id}`, + networkIds: [n.id], + type: 'error', + title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`, + text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.', + actions: [ + { + label: 'Select', + actionName: 'select-rpc-url', + meta: { network: n } + } + ] + }); + }); + if (!networksToGroupInSingleBanner.length) + return errors; + errors.push({ + id: 'rpcs-down', + networkIds: networksToGroupInSingleBanner.map((n) => n.id), + type: 'error', + title: `Failed to retrieve network data for ${networksToGroupInSingleBanner + .map((n) => n.name) + .join(', ')} (RPC malfunction)`, + text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.' + }); + return errors; +}; +const addPortfolioError = (errors, networkId, newError) => { + const newErrors = [...errors]; + const existingError = newErrors.find((error) => error.id === newError); + if (existingError) { + existingError.networkIds.push(networkId); + } + else { + let title = ''; + let text = ''; + let type = 'error'; + switch (newError) { + case 'portfolio-critical': + title = 'Failed to retrieve the portfolio data'; + text = 'Account balance and visible assets may be inaccurate.'; + break; + case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError: + title = 'Failed to retrieve prices'; + text = 'Account balance and asset prices may be inaccurate.'; + type = 'warning'; + break; + case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError: + title = 'Automatic asset discovery is temporarily unavailable'; + text = + 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'; + break; + case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError: + title = 'Automatic asset discovery is temporarily unavailable'; + text = + 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'; + type = 'warning'; + break; + default: + break; + } + if (!title) + return newErrors; + newErrors.push({ + id: newError, + networkIds: [networkId], + type, + title, + text + }); + } + return newErrors; +}; +export const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountLatest, providers }) => { + let errors = []; + const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => { + const portfolioForNetwork = selectedAccountLatest[network]; + return portfolioForNetwork?.isLoading; + }); + // Otherwise networks are appended to the banner one by one, which looks weird + if (portfolioLoading) + return []; + if (!Object.keys(selectedAccountLatest).length) + return []; + Object.keys(selectedAccountLatest).forEach((network) => { + const portfolioForNetwork = selectedAccountLatest[network]; + const criticalError = portfolioForNetwork?.criticalError; + const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate; + // Don't display an error banner if the last successful update was less than 10 minutes ago + if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES) + return; + if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) + return; + // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed. + // In case of additional networks don't check the RPC as there isn't one + if (criticalError && + (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)) { + errors = addPortfolioError(errors, network, 'portfolio-critical'); + return; + } + portfolioForNetwork?.errors.forEach((err) => { + errors = addPortfolioError(errors, network, err.name); + }); + }); + return errors.map(({ title, networkIds, ...rest }) => { + const networkNames = networkIds.reduce((acc, id, index) => { + let networkName = networks.find((n) => n.id === id)?.name; + const isLast = index === networkIds.length - 1; + const isOnly = networkIds.length === 1; + if (id === 'gasTank') + networkName = 'Gas Tank'; + else if (id === 'rewards') + networkName = 'Rewards'; + if (!networkName) + return acc; + return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`; + }, ''); + return { + ...rest, + title: `${title} on ${networkNames}`, + networkIds + }; + }); +}; +export const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState, providers, networksWithPositions }) => { + const isLoading = Object.keys(currentAccountState).some((networkId) => { + const networkState = currentAccountState[networkId]; + return networkState.isLoading; + }); + if (isLoading) + return []; + const networkNamesWithUnknownCriticalError = []; + const networkNamesWithAssetPriceCriticalError = []; + const providersWithErrors = {}; + Object.keys(currentAccountState).forEach((networkId) => { + const providersWithPositions = networksWithPositions[networkId]; + // Ignore networks that don't have positions + // but ensure that we have a successful response stored (the network key is present) + if (providersWithPositions && !providersWithPositions.length) + return; + const networkState = currentAccountState[networkId]; + const network = networks.find((n) => n.id === networkId); + const rpcProvider = providers[networkId]; + const lastSuccessfulUpdate = networkState.updatedAt; + if (!network || + !networkState || + (typeof lastSuccessfulUpdate === 'number' && + Date.now() - lastSuccessfulUpdate < TEN_MINUTES) || + // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed. + (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)) + return; + if (networkState.error) { + if (networkState.error === DeFiPositionsError.AssetPriceError) { + networkNamesWithAssetPriceCriticalError.push(network.name); + } + else if (networkState.error === DeFiPositionsError.CriticalError) { + networkNamesWithUnknownCriticalError.push(network.name); + } + } + const providerNamesWithErrors = networkState.providerErrors + ?.filter(({ providerName }) => { + // Display all errors if there hasn't been a successful update + // for the network. + if (!networksWithPositions[networkId]) + return true; + // Exclude providers without positions + return networksWithPositions[networkId].includes(providerName); + }) + .map((e) => e.providerName) || []; + if (providerNamesWithErrors.length) { + providerNamesWithErrors.forEach((providerName) => { + if (!providersWithErrors[providerName]) + providersWithErrors[providerName] = []; + providersWithErrors[providerName].push(network.name); + }); + } + }); + const providerErrors = Object.entries(providersWithErrors).map(([providerName, networkNames]) => { + return { + id: `${providerName}-defi-positions-error`, + type: 'error', + networkIds: networkNames.map((n) => networks.find((network) => network.name === n)?.id), + title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}` + }; + }); + const errors = providerErrors; + if (networkNamesWithUnknownCriticalError.length) { + errors.push({ + id: 'defi-critical', + type: 'error', + title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(', ')}`, + networkIds: networkNamesWithUnknownCriticalError.map((n) => networks.find((network) => network.name === n)?.id) + }); + } + if (networkNamesWithAssetPriceCriticalError.length) { + errors.push({ + id: 'defi-prices', + type: 'warning', + title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(', ')}`, + networkIds: networkNamesWithAssetPriceCriticalError.map((n) => networks.find((network) => network.name === n)?.id) + }); + } + return errors; +}; +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.js.map b/dist/src/libs/selectedAccount/errors.js.map new file mode 100644 index 000000000..9c3ac9d92 --- /dev/null +++ b/dist/src/libs/selectedAccount/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\n\nconst TEN_MINUTES = 10 * 60 * 1000\n\nexport type Action = {\n label: 'Select'\n actionName: 'select-rpc-url'\n meta: { network: Network }\n}\n\nexport type SelectedAccountBalanceError = {\n id: string\n networkIds: NetworkId[]\n type: 'error' | 'warning'\n title: string\n text?: string\n actions?: Action[]\n}\n\nexport const getNetworksWithFailedRPCErrors = ({\n providers,\n networks,\n networksWithAssets\n}: {\n providers: RPCProviders\n networks: Network[]\n networksWithAssets: AccountAssetsState\n}): SelectedAccountBalanceError[] => {\n const errors: SelectedAccountBalanceError[] = []\n const networkIds = getNetworksWithFailedRPC({ providers }).filter(\n (networkId) =>\n (Object.keys(networksWithAssets).includes(networkId) &&\n networksWithAssets[networkId] === true) ||\n !Object.keys(networksWithAssets).includes(networkId)\n )\n\n const networksData = networkIds.map((id) => networks.find((n: Network) => n.id === id)!)\n\n const allFailed = networksData.length === networks.length\n\n const networksWithMultipleRpcUrls = allFailed\n ? []\n : networksData.filter((n) => n?.rpcUrls?.length > 1)\n\n const networksToGroupInSingleBanner = allFailed\n ? networksData\n : networksData.filter((n) => n?.rpcUrls?.length <= 1)\n\n if (!networksData.length) return errors\n\n networksWithMultipleRpcUrls.forEach((n) => {\n errors.push({\n id: `custom-rpcs-down-${n.id}`,\n networkIds: [n.id],\n type: 'error',\n title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.',\n actions: [\n {\n label: 'Select',\n actionName: 'select-rpc-url',\n meta: { network: n }\n }\n ]\n })\n })\n\n if (!networksToGroupInSingleBanner.length) return errors\n\n errors.push({\n id: 'rpcs-down',\n networkIds: networksToGroupInSingleBanner.map((n) => n.id),\n type: 'error',\n title: `Failed to retrieve network data for ${networksToGroupInSingleBanner\n .map((n) => n.name)\n .join(', ')} (RPC malfunction)`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.'\n })\n\n return errors\n}\n\nconst addPortfolioError = (\n errors: SelectedAccountBalanceError[],\n networkId: NetworkId,\n newError: keyof typeof PORTFOLIO_LIB_ERROR_NAMES | 'portfolio-critical'\n) => {\n const newErrors = [...errors]\n const existingError = newErrors.find((error) => error.id === newError)\n\n if (existingError) {\n existingError.networkIds.push(networkId)\n } else {\n let title = ''\n let text = ''\n let type: 'error' | 'warning' = 'error'\n\n switch (newError) {\n case 'portfolio-critical':\n title = 'Failed to retrieve the portfolio data'\n text = 'Account balance and visible assets may be inaccurate.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError:\n title = 'Failed to retrieve prices'\n text = 'Account balance and asset prices may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'\n type = 'warning'\n break\n default:\n break\n }\n\n if (!title) return newErrors\n\n newErrors.push({\n id: newError,\n networkIds: [networkId],\n type,\n title,\n text\n })\n }\n\n return newErrors\n}\n\nexport const getNetworksWithPortfolioErrorErrors = ({\n networks,\n selectedAccountLatest,\n providers\n}: {\n networks: Network[]\n selectedAccountLatest: SelectedAccountPortfolioState\n providers: RPCProviders\n}): SelectedAccountBalanceError[] => {\n let errors: SelectedAccountBalanceError[] = []\n\n const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n\n return portfolioForNetwork?.isLoading\n })\n\n // Otherwise networks are appended to the banner one by one, which looks weird\n if (portfolioLoading) return []\n\n if (!Object.keys(selectedAccountLatest).length) return []\n\n Object.keys(selectedAccountLatest).forEach((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n const criticalError = portfolioForNetwork?.criticalError\n const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate\n\n // Don't display an error banner if the last successful update was less than 10 minutes ago\n if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES)\n return\n\n if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) return\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n // In case of additional networks don't check the RPC as there isn't one\n if (\n criticalError &&\n (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)\n ) {\n errors = addPortfolioError(errors, network, 'portfolio-critical')\n return\n }\n\n portfolioForNetwork?.errors.forEach((err: any) => {\n errors = addPortfolioError(errors, network, err.name)\n })\n })\n\n return errors.map(({ title, networkIds, ...rest }) => {\n const networkNames = networkIds.reduce((acc, id, index) => {\n let networkName = networks.find((n) => n.id === id)?.name\n const isLast = index === networkIds.length - 1\n const isOnly = networkIds.length === 1\n\n if (id === 'gasTank') networkName = 'Gas Tank'\n else if (id === 'rewards') networkName = 'Rewards'\n\n if (!networkName) return acc\n\n return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`\n }, '')\n\n return {\n ...rest,\n title: `${title} on ${networkNames}`,\n networkIds\n }\n })\n}\n\nexport const getNetworksWithDeFiPositionsErrorErrors = ({\n networks,\n currentAccountState,\n providers,\n networksWithPositions\n}: {\n networks: Network[]\n currentAccountState: DefiPositionsAccountState\n providers: RPCProviders\n networksWithPositions: NetworksWithPositions\n}) => {\n const isLoading = Object.keys(currentAccountState).some((networkId) => {\n const networkState = currentAccountState[networkId]\n return networkState.isLoading\n })\n\n if (isLoading) return []\n\n const networkNamesWithUnknownCriticalError: string[] = []\n const networkNamesWithAssetPriceCriticalError: string[] = []\n const providersWithErrors: {\n [providerName: string]: string[]\n } = {}\n\n Object.keys(currentAccountState).forEach((networkId) => {\n const providersWithPositions = networksWithPositions[networkId]\n // Ignore networks that don't have positions\n // but ensure that we have a successful response stored (the network key is present)\n if (providersWithPositions && !providersWithPositions.length) return\n\n const networkState = currentAccountState[networkId]\n const network = networks.find((n) => n.id === networkId)\n const rpcProvider = providers[networkId]\n const lastSuccessfulUpdate = networkState.updatedAt\n\n if (\n !network ||\n !networkState ||\n (typeof lastSuccessfulUpdate === 'number' &&\n Date.now() - lastSuccessfulUpdate < TEN_MINUTES) ||\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)\n )\n return\n\n if (networkState.error) {\n if (networkState.error === DeFiPositionsError.AssetPriceError) {\n networkNamesWithAssetPriceCriticalError.push(network.name)\n } else if (networkState.error === DeFiPositionsError.CriticalError) {\n networkNamesWithUnknownCriticalError.push(network.name)\n }\n }\n\n const providerNamesWithErrors =\n networkState.providerErrors\n ?.filter(({ providerName }) => {\n // Display all errors if there hasn't been a successful update\n // for the network.\n if (!networksWithPositions[networkId]) return true\n // Exclude providers without positions\n return networksWithPositions[networkId].includes(providerName)\n })\n .map((e) => e.providerName) || []\n\n if (providerNamesWithErrors.length) {\n providerNamesWithErrors.forEach((providerName) => {\n if (!providersWithErrors[providerName]) providersWithErrors[providerName] = []\n\n providersWithErrors[providerName].push(network.name)\n })\n }\n })\n\n const providerErrors: SelectedAccountBalanceError[] = Object.entries(providersWithErrors).map(\n ([providerName, networkNames]) => {\n return {\n id: `${providerName}-defi-positions-error`,\n type: 'error',\n networkIds: networkNames.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n ),\n title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}`\n }\n }\n )\n\n const errors = providerErrors\n\n if (networkNamesWithUnknownCriticalError.length) {\n errors.push({\n id: 'defi-critical',\n type: 'error',\n title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithUnknownCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n if (networkNamesWithAssetPriceCriticalError.length) {\n errors.push({\n id: 'defi-prices',\n type: 'warning',\n title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithAssetPriceCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n\n return errors\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.d.ts b/dist/src/libs/selectedAccount/selectedAccount.d.ts new file mode 100644 index 000000000..3cbaa4415 --- /dev/null +++ b/dist/src/libs/selectedAccount/selectedAccount.d.ts @@ -0,0 +1,7 @@ +import { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'; +import { AccountState as DefiPositionsAccountState } from '../defiPositions/types'; +import { AccountState, NetworkState } from '../portfolio/interfaces'; +export declare const updatePortfolioStateWithDefiPositions: (portfolioAccountState: AccountState, defiPositionsAccountState: DefiPositionsAccountState, areDefiPositionsLoading: boolean) => AccountState; +export declare const isNetworkReady: (networkData: NetworkState | undefined) => boolean | undefined; +export declare function calculateSelectedAccountPortfolio(latestStateSelectedAccount: AccountState, pendingStateSelectedAccount: AccountState, accountPortfolio: SelectedAccountPortfolio | null, hasSignAccountOp?: boolean): SelectedAccountPortfolio; +//# sourceMappingURL=selectedAccount.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.d.ts.map b/dist/src/libs/selectedAccount/selectedAccount.d.ts.map new file mode 100644 index 000000000..b4e888530 --- /dev/null +++ b/dist/src/libs/selectedAccount/selectedAccount.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EAGzB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,YAAY,IAAI,yBAAyB,EAG1C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,YAAY,EAGZ,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,qCAAqC,0BACzB,YAAY,6BACR,yBAAyB,2BAC3B,OAAO,iBA+FjC,CAAA;AA2BD,eAAO,MAAM,cAAc,gBAAiB,YAAY,GAAG,SAAS,wBAInE,CAAA;AAoCD,wBAAgB,iCAAiC,CAC/C,0BAA0B,EAAE,YAAY,EACxC,2BAA2B,EAAE,YAAY,EACzC,gBAAgB,EAAE,wBAAwB,GAAG,IAAI,EACjD,gBAAgB,CAAC,EAAE,OAAO,4BAkG3B"} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.js b/dist/src/libs/selectedAccount/selectedAccount.js new file mode 100644 index 000000000..cebbca543 --- /dev/null +++ b/dist/src/libs/selectedAccount/selectedAccount.js @@ -0,0 +1,192 @@ +import { getAddress } from 'ethers'; +import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'; +import { AssetType } from '../defiPositions/types'; +export const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositionsAccountState, areDefiPositionsLoading) => { + if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading) + return portfolioAccountState; + Object.keys(portfolioAccountState).forEach((networkId) => { + const networkState = portfolioAccountState[networkId]; + if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) + return; + let tokens = networkState.result.tokens || []; + let networkBalance = networkState.result.total?.usd || 0; + const positions = defiPositionsAccountState[networkId] || {}; + positions.positionsByProvider?.forEach((posByProv) => { + if (posByProv.type === 'liquidity-pool') { + networkBalance += posByProv.positionInUSD || 0; + return; + } + posByProv.positions.forEach((pos) => { + pos.assets + .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset) + .forEach((a) => { + const tokenInPortfolioIndex = tokens.findIndex((t) => { + return (getAddress(t.address) === getAddress(a.protocolAsset.address) && + t.networkId === networkId); + }); + if (tokenInPortfolioIndex !== -1) { + const tokenInPortfolio = tokens[tokenInPortfolioIndex]; + const priceUSD = tokenInPortfolio.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; + const tokenBalanceUSD = priceUSD + ? Number(safeTokenAmountAndNumberMultiplication(BigInt(tokenInPortfolio.amount), tokenInPortfolio.decimals, priceUSD)) + : undefined; + networkBalance -= tokenBalanceUSD || 0; // deduct portfolio token balance + tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex); + } + // Add only the balance of the collateral tokens to the network balance + if (a.type === AssetType.Collateral) { + const protocolPriceUSD = a.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; + const protocolTokenBalanceUSD = protocolPriceUSD + ? Number(safeTokenAmountAndNumberMultiplication(BigInt(a.amount), Number(a.protocolAsset.decimals), protocolPriceUSD)) + : undefined; + networkBalance += protocolTokenBalanceUSD || 0; + } + tokens.push({ + amount: a.amount, + // Only list the borrowed asset with no price + priceIn: a.type === AssetType.Collateral ? a.priceIn : [], + decimals: Number(a.protocolAsset.decimals), + address: a.protocolAsset.address, + symbol: a.protocolAsset.symbol, + networkId, + flags: { + canTopUpGasTank: false, + isFeeToken: false, + onGasTank: false, + rewardsType: null + } + }); + }); + }); + }); + // eslint-disable-next-line no-param-reassign + portfolioAccountState[networkId].result.total.usd = networkBalance; + // eslint-disable-next-line no-param-reassign + portfolioAccountState[networkId].result.tokens = tokens; + }); + return portfolioAccountState; +}; +const stripPortfolioState = (portfolioState) => { + const strippedState = {}; + Object.keys(portfolioState).forEach((networkId) => { + const networkState = portfolioState[networkId]; + if (!networkState) + return; + if (!networkState.result) { + strippedState[networkId] = networkState; + return; + } + // A trick to exclude specific keys + const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } = networkState.result; + strippedState[networkId] = { + ...networkState, + result + }; + }); + return strippedState; +}; +export const isNetworkReady = (networkData) => { + return (networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading); +}; +const calculateTokenArray = (networkId, latestTokens, pendingTokens, isPendingValid) => { + if (networkId === 'gasTank' || networkId === 'rewards') { + return latestTokens; + } + // If the pending state is older or there are no pending tokens + // we shouldn't trust it to build the tokens array + if (isPendingValid && pendingTokens.length) { + return pendingTokens.map((pendingToken) => { + const latestToken = latestTokens.find((latest) => { + return latest.address === pendingToken.address; + }); + return { + ...pendingToken, + latestAmount: latestToken?.amount, + pendingAmount: pendingToken.amount + }; + }); + } + // Add only latestAmount to the tokens + return latestTokens.map((token) => { + return { + ...token, + latestAmount: token.amount + }; + }); +}; +export function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingStateSelectedAccount, accountPortfolio, hasSignAccountOp) { + const collections = []; + const tokens = []; + let newTotalBalance = 0; + const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length; + let allReady = !!hasLatest; + const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length; + if (!hasLatest && !hasPending) { + return { + tokens: accountPortfolio?.tokens || [], + collections: accountPortfolio?.collections || [], + totalBalance: accountPortfolio?.totalBalance || 0, + isAllReady: false, + networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {}, + latest: latestStateSelectedAccount, + pending: pendingStateSelectedAccount + }; + } + let selectedAccountData = latestStateSelectedAccount; + /** + * Replaces the latest state if the following conditions are true: + * - There is no critical error in the pending state. + * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation). + */ + const validSelectedAccountPendingState = {}; + const simulatedAccountOps = {}; + Object.keys(pendingStateSelectedAccount).forEach((network) => { + const pendingNetworkData = pendingStateSelectedAccount[network]; + const latestNetworkData = latestStateSelectedAccount[network]; + // Compare the block numbers to determine if the pending state is newer + if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) { + const isPendingNewer = pendingNetworkData.result.blockNumber >= latestNetworkData.result.blockNumber; + if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) { + validSelectedAccountPendingState[network] = pendingNetworkData; + } + } + // Store the simulated account op + const accountOp = pendingNetworkData?.accountOps?.[0]; + if (accountOp) { + simulatedAccountOps[network] = accountOp; + } + }); + if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) { + selectedAccountData = { + ...selectedAccountData, + ...validSelectedAccountPendingState + }; + } + Object.keys(selectedAccountData).forEach((network) => { + const networkData = selectedAccountData[network]; + const result = networkData?.result; + if (networkData && isNetworkReady(networkData) && result) { + const networkTotal = Number(result?.total?.usd) || 0; + newTotalBalance += networkTotal; + const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []; + const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []; + const networkCollections = result?.collections || []; + const tokensArray = calculateTokenArray(network, latestTokens, pendingTokens, !!validSelectedAccountPendingState[network]); + tokens.push(...tokensArray); + collections.push(...networkCollections); + } + if (!isNetworkReady(networkData)) { + allReady = false; + } + }); + return { + totalBalance: newTotalBalance, + tokens, + collections, + isAllReady: allReady, + networkSimulatedAccountOp: simulatedAccountOps, + latest: stripPortfolioState(latestStateSelectedAccount), + pending: stripPortfolioState(pendingStateSelectedAccount) + }; +} +//# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.js.map b/dist/src/libs/selectedAccount/selectedAccount.js.map new file mode 100644 index 000000000..e6e388b70 --- /dev/null +++ b/dist/src/libs/selectedAccount/selectedAccount.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport {\n SelectedAccountPortfolio,\n SelectedAccountPortfolioState,\n SelectedAccountPortfolioTokenResult\n} from '../../interfaces/selectedAccount'\nimport { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport {\n AccountState as DefiPositionsAccountState,\n AssetType,\n PositionsByProvider\n} from '../defiPositions/types'\nimport {\n AccountState,\n CollectionResult,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult\n} from '../portfolio/interfaces'\n\nexport const updatePortfolioStateWithDefiPositions = (\n portfolioAccountState: AccountState,\n defiPositionsAccountState: DefiPositionsAccountState,\n areDefiPositionsLoading: boolean\n) => {\n if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading)\n return portfolioAccountState\n\n Object.keys(portfolioAccountState).forEach((networkId) => {\n const networkState = portfolioAccountState[networkId]\n\n if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return\n\n let tokens = networkState.result.tokens || []\n let networkBalance = networkState.result.total?.usd || 0\n\n const positions = defiPositionsAccountState[networkId] || {}\n\n positions.positionsByProvider?.forEach((posByProv: PositionsByProvider) => {\n if (posByProv.type === 'liquidity-pool') {\n networkBalance += posByProv.positionInUSD || 0\n return\n }\n\n posByProv.positions.forEach((pos) => {\n pos.assets\n .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset)\n .forEach((a) => {\n const tokenInPortfolioIndex = tokens.findIndex((t) => {\n return (\n getAddress(t.address) === getAddress(a.protocolAsset!.address) &&\n t.networkId === networkId\n )\n })\n\n if (tokenInPortfolioIndex !== -1) {\n const tokenInPortfolio = tokens[tokenInPortfolioIndex]\n const priceUSD = tokenInPortfolio.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n const tokenBalanceUSD = priceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio.amount),\n tokenInPortfolio.decimals,\n priceUSD\n )\n )\n : undefined\n\n networkBalance -= tokenBalanceUSD || 0 // deduct portfolio token balance\n tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex)\n }\n\n // Add only the balance of the collateral tokens to the network balance\n if (a.type === AssetType.Collateral) {\n const protocolPriceUSD = a.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const protocolTokenBalanceUSD = protocolPriceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(a.amount),\n Number(a.protocolAsset!.decimals),\n protocolPriceUSD\n )\n )\n : undefined\n\n networkBalance += protocolTokenBalanceUSD || 0\n }\n tokens.push({\n amount: a.amount,\n // Only list the borrowed asset with no price\n priceIn: a.type === AssetType.Collateral ? a.priceIn : [],\n decimals: Number(a.protocolAsset!.decimals),\n address: a.protocolAsset!.address,\n symbol: a.protocolAsset!.symbol,\n networkId,\n flags: {\n canTopUpGasTank: false,\n isFeeToken: false,\n onGasTank: false,\n rewardsType: null\n }\n })\n })\n })\n })\n\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.total.usd = networkBalance\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.tokens = tokens\n })\n\n return portfolioAccountState\n}\n\nconst stripPortfolioState = (portfolioState: AccountState) => {\n const strippedState: SelectedAccountPortfolioState = {}\n\n Object.keys(portfolioState).forEach((networkId) => {\n const networkState = portfolioState[networkId]\n if (!networkState) return\n\n if (!networkState.result) {\n strippedState[networkId] = networkState\n return\n }\n\n // A trick to exclude specific keys\n const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } =\n networkState.result\n\n strippedState[networkId] = {\n ...networkState,\n result\n }\n })\n\n return strippedState\n}\n\nexport const isNetworkReady = (networkData: NetworkState | undefined) => {\n return (\n networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading\n )\n}\n\nconst calculateTokenArray = (\n networkId: string,\n latestTokens: TokenResult[],\n pendingTokens: TokenResult[],\n isPendingValid: boolean\n) => {\n if (networkId === 'gasTank' || networkId === 'rewards') {\n return latestTokens\n }\n // If the pending state is older or there are no pending tokens\n // we shouldn't trust it to build the tokens array\n if (isPendingValid && pendingTokens.length) {\n return pendingTokens.map((pendingToken) => {\n const latestToken = latestTokens.find((latest) => {\n return latest.address === pendingToken.address\n })\n\n return {\n ...pendingToken,\n latestAmount: latestToken?.amount,\n pendingAmount: pendingToken.amount\n }\n })\n }\n\n // Add only latestAmount to the tokens\n return latestTokens.map((token) => {\n return {\n ...token,\n latestAmount: token.amount\n }\n })\n}\n\nexport function calculateSelectedAccountPortfolio(\n latestStateSelectedAccount: AccountState,\n pendingStateSelectedAccount: AccountState,\n accountPortfolio: SelectedAccountPortfolio | null,\n hasSignAccountOp?: boolean\n) {\n const collections: CollectionResult[] = []\n const tokens: SelectedAccountPortfolioTokenResult[] = []\n\n let newTotalBalance: number = 0\n\n const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length\n let allReady = !!hasLatest\n\n const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length\n if (!hasLatest && !hasPending) {\n return {\n tokens: accountPortfolio?.tokens || [],\n collections: accountPortfolio?.collections || [],\n totalBalance: accountPortfolio?.totalBalance || 0,\n isAllReady: false,\n networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {},\n latest: latestStateSelectedAccount,\n pending: pendingStateSelectedAccount\n } as SelectedAccountPortfolio\n }\n\n let selectedAccountData = latestStateSelectedAccount\n\n /**\n * Replaces the latest state if the following conditions are true:\n * - There is no critical error in the pending state.\n * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation).\n */\n const validSelectedAccountPendingState: AccountState = {}\n const simulatedAccountOps: NetworkSimulatedAccountOp = {}\n\n Object.keys(pendingStateSelectedAccount).forEach((network) => {\n const pendingNetworkData = pendingStateSelectedAccount[network]\n const latestNetworkData = latestStateSelectedAccount[network]\n\n // Compare the block numbers to determine if the pending state is newer\n if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) {\n const isPendingNewer =\n pendingNetworkData.result.blockNumber! >= latestNetworkData.result.blockNumber!\n\n if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) {\n validSelectedAccountPendingState[network] = pendingNetworkData\n }\n }\n\n // Store the simulated account op\n const accountOp = pendingNetworkData?.accountOps?.[0]\n\n if (accountOp) {\n simulatedAccountOps[network] = accountOp\n }\n })\n\n if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) {\n selectedAccountData = {\n ...selectedAccountData,\n ...validSelectedAccountPendingState\n }\n }\n\n Object.keys(selectedAccountData).forEach((network: string) => {\n const networkData = selectedAccountData[network]\n const result = networkData?.result\n if (networkData && isNetworkReady(networkData) && result) {\n const networkTotal = Number(result?.total?.usd) || 0\n newTotalBalance += networkTotal\n\n const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []\n const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []\n const networkCollections = result?.collections || []\n\n const tokensArray = calculateTokenArray(\n network,\n latestTokens,\n pendingTokens,\n !!validSelectedAccountPendingState[network]\n )\n\n tokens.push(...tokensArray)\n collections.push(...networkCollections)\n }\n\n if (!isNetworkReady(networkData)) {\n allReady = false\n }\n })\n\n return {\n totalBalance: newTotalBalance,\n tokens,\n collections,\n isAllReady: allReady,\n networkSimulatedAccountOp: simulatedAccountOps,\n latest: stripPortfolioState(latestStateSelectedAccount),\n pending: stripPortfolioState(pendingStateSelectedAccount)\n } as SelectedAccountPortfolio\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.d.ts b/dist/src/libs/signMessage/signMessage.d.ts new file mode 100644 index 000000000..c1c95b117 --- /dev/null +++ b/dist/src/libs/signMessage/signMessage.d.ts @@ -0,0 +1,82 @@ +import { JsonRpcProvider, TypedDataDomain, TypedDataField } from 'ethers'; +import { Account, AccountCreation, AccountId, AccountOnchainState } from '../../interfaces/account'; +import { Hex } from '../../interfaces/hex'; +import { KeystoreSigner } from '../../interfaces/keystore'; +import { Network } from '../../interfaces/network'; +import { TypedMessage } from '../../interfaces/userRequest'; +import { AccountOp } from '../accountOp/accountOp'; +export declare const EIP_1271_NOT_SUPPORTED_BY: string[]; +/** + * For Unprotected signatures, we need to append 00 at the end + * for ambire to recognize it + */ +export declare const wrapUnprotected: (signature: string) => string; +/** + * For EIP-712 signatures, we need to append 01 at the end + * for ambire to recognize it. + * For v1 contracts, we do ETH sign at the 01 slot, which we'll + * call standard from now on + */ +export declare const wrapStandard: (signature: string) => string; +/** + * For v2 accounts acting as signers, we need to append the v2 wallet + * addr that's the signer and a 02 mode at the end to indicate it's a wallet: + * {sig+mode}{wallet_32bytes}{mode} + */ +export declare const wrapWallet: (signature: string, walletAddr: string) => string; +interface AmbireReadableOperation { + addr: Hex; + chainId: bigint; + nonce: bigint; + calls: { + to: Hex; + value: bigint; + data: Hex; + }[]; +} +export declare const getAmbireReadableTypedData: (chainId: bigint, verifyingAddr: string, v1Execute: AmbireReadableOperation) => TypedMessage; +/** + * Return the typed data for EIP-712 sign + */ +export declare const getTypedData: (chainId: bigint, verifyingAddr: string, msgHash: string) => TypedMessage; +/** + * Produce EIP6492 signature for Predeploy Contracts + * + * More info: https://eips.ethereum.org/EIPS/eip-6492 + * + * @param {string} signature - origin ERC-1271 signature + * @param {object} account + * @returns {string} - EIP6492 signature + */ +export declare const wrapCounterfactualSign: (signature: string, creation: AccountCreation) => string; +export declare function mapSignatureV(sigRaw: string): string; +type Props = { + network?: Network; + provider?: JsonRpcProvider; + signer?: string; + signature: string | Uint8Array; + message?: string | Uint8Array; + typedData?: { + domain: TypedDataDomain; + types: Record>; + message: Record; + }; + finalDigest?: string; +}; +/** + * Verifies the signature of a message using the provided signer and signature + * via a "magic" universal validator contract using the provided provider to + * verify the signature on-chain. The contract deploys itself within the + * `eth_call`, tries to verify the signature using ERC-6492, ERC-1271, and + * `ecrecover`, and returns the value to the function. + * + * Note: you only need to pass one of: typedData, finalDigest, message + */ +export declare function verifyMessage({ network, provider, signer, signature, message, typedData, finalDigest }: (Required> | Required> | Required>) & Props): Promise; +export declare function getExecuteSignature(network: Network, accountOp: AccountOp, accountState: AccountOnchainState, signer: KeystoreSigner): Promise; +export declare function getPlainTextSignature(message: string | Uint8Array, network: Network, account: Account, accountState: AccountOnchainState, signer: KeystoreSigner): Promise; +export declare function getEIP712Signature(message: TypedMessage, account: Account, accountState: AccountOnchainState, signer: KeystoreSigner, network: Network): Promise; +export declare function getEntryPointAuthorization(addr: AccountId, chainId: bigint, nonce: bigint): Promise; +export declare function adjustEntryPointAuthorization(signature: string): string; +export {}; +//# sourceMappingURL=signMessage.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.d.ts.map b/dist/src/libs/signMessage/signMessage.d.ts.map new file mode 100644 index 000000000..3e3add372 --- /dev/null +++ b/dist/src/libs/signMessage/signMessage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"signMessage.d.ts","sourceRoot":"","sources":["../../../../src/libs/signMessage/signMessage.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.js b/dist/src/libs/signMessage/signMessage.js new file mode 100644 index 000000000..7763ce41e --- /dev/null +++ b/dist/src/libs/signMessage/signMessage.js @@ -0,0 +1,376 @@ +/* eslint-disable no-param-reassign */ +import { AbiCoder, getAddress, getBytes, hashMessage, hexlify, Interface, isHexString, toBeHex, toUtf8Bytes, TypedDataEncoder } from 'ethers'; +import UniversalSigValidator from '../../../contracts/compiled/UniversalSigValidator.json'; +import { PERMIT_2_ADDRESS, UNISWAP_UNIVERSAL_ROUTERS } from '../../consts/addresses'; +import hexStringToUint8Array from '../../utils/hexStringToUint8Array'; +import isSameAddr from '../../utils/isSameAddr'; +import { stripHexPrefix } from '../../utils/stripHexPrefix'; +import { accountOpSignableHash, callToTuple, getSignableHash } from '../accountOp/accountOp'; +import { fromDescriptor } from '../deployless/deployless'; +import { relayerAdditionalNetworks } from '../networks/networks'; +import { getActivatorCall } from '../userOperation/userOperation'; +// EIP6492 signature ends in magicBytes, which ends with a 0x92, +// which makes it is impossible for it to collide with a valid ecrecover signature if packed in the r,s,v format, +// as 0x92 is not a valid value for v. +const magicBytes = '6492649264926492649264926492649264926492649264926492649264926492'; +export const EIP_1271_NOT_SUPPORTED_BY = [ + 'opensea.io', + 'paraswap.xyz', + 'blur.io', + 'aevo.xyz', + 'socialscan.io', + 'tally.xyz', + 'questn.com' +]; +/** + * For Unprotected signatures, we need to append 00 at the end + * for ambire to recognize it + */ +export const wrapUnprotected = (signature) => { + return `${signature}00`; +}; +/** + * For EIP-712 signatures, we need to append 01 at the end + * for ambire to recognize it. + * For v1 contracts, we do ETH sign at the 01 slot, which we'll + * call standard from now on + */ +export const wrapStandard = (signature) => { + return `${signature}01`; +}; +/** + * For v2 accounts acting as signers, we need to append the v2 wallet + * addr that's the signer and a 02 mode at the end to indicate it's a wallet: + * {sig+mode}{wallet_32bytes}{mode} + */ +export const wrapWallet = (signature, walletAddr) => { + const wallet32bytes = `${stripHexPrefix(toBeHex(0, 12))}${stripHexPrefix(walletAddr)}`; + return `${signature}${wallet32bytes}02`; +}; +export const getAmbireReadableTypedData = (chainId, verifyingAddr, v1Execute) => { + const domain = { + name: 'Ambire', + version: '1', + chainId: chainId.toString(), + verifyingContract: verifyingAddr, + salt: toBeHex(0, 32) + }; + const types = { + EIP712Domain: [ + { + name: 'name', + type: 'string' + }, + { + name: 'version', + type: 'string' + }, + { + name: 'chainId', + type: 'uint256' + }, + { + name: 'verifyingContract', + type: 'address' + }, + { + name: 'salt', + type: 'bytes32' + } + ], + Calls: [ + { name: 'to', type: 'address' }, + { name: 'value', type: 'uint256' }, + { name: 'data', type: 'bytes' } + ], + AmbireReadableOperation: [ + { name: 'account', type: 'address' }, + { name: 'chainId', type: 'uint256' }, + { name: 'nonce', type: 'uint256' }, + { name: 'calls', type: 'Calls[]' } + ] + }; + return { + kind: 'typedMessage', + domain, + types, + message: v1Execute, + primaryType: 'AmbireOperation' + }; +}; +/** + * Return the typed data for EIP-712 sign + */ +export const getTypedData = (chainId, verifyingAddr, msgHash) => { + const domain = { + name: 'Ambire', + version: '1', + chainId: chainId.toString(), + verifyingContract: verifyingAddr, + salt: toBeHex(0, 32) + }; + const types = { + EIP712Domain: [ + { + name: 'name', + type: 'string' + }, + { + name: 'version', + type: 'string' + }, + { + name: 'chainId', + type: 'uint256' + }, + { + name: 'verifyingContract', + type: 'address' + }, + { + name: 'salt', + type: 'bytes32' + } + ], + AmbireOperation: [ + { name: 'account', type: 'address' }, + { name: 'hash', type: 'bytes32' } + ] + }; + const message = { + account: verifyingAddr, + hash: msgHash + }; + return { + kind: 'typedMessage', + domain, + types, + message, + primaryType: 'AmbireOperation' + }; +}; +/** + * Produce EIP6492 signature for Predeploy Contracts + * + * More info: https://eips.ethereum.org/EIPS/eip-6492 + * + * @param {string} signature - origin ERC-1271 signature + * @param {object} account + * @returns {string} - EIP6492 signature + */ +export const wrapCounterfactualSign = (signature, creation) => { + const ABI = ['function deploy(bytes code, uint256 salt)']; + const iface = new Interface(ABI); + const factoryCallData = iface.encodeFunctionData('deploy', [creation.bytecode, creation.salt]); + const coder = new AbiCoder(); + // EIP6492 signature + return (coder.encode(['address', 'bytes', 'bytes'], [creation.factoryAddr, factoryCallData, signature]) + magicBytes); +}; +export function mapSignatureV(sigRaw) { + const sig = hexStringToUint8Array(sigRaw); + if (sig[64] < 27) + sig[64] += 27; + return hexlify(sig); +} +/** + * Verifies the signature of a message using the provided signer and signature + * via a "magic" universal validator contract using the provided provider to + * verify the signature on-chain. The contract deploys itself within the + * `eth_call`, tries to verify the signature using ERC-6492, ERC-1271, and + * `ecrecover`, and returns the value to the function. + * + * Note: you only need to pass one of: typedData, finalDigest, message + */ +export async function verifyMessage({ network, provider, signer, signature, message, typedData, finalDigest }) { + if (message) { + try { + finalDigest = hashMessage(message); + if (!finalDigest) + throw Error('Hashing the message returned no (falsy) result.'); + } + catch (e) { + throw Error(`Preparing the just signed (standard) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${e?.message || 'missing'}`); + } + } + else if (typedData) { + // To resolve the "ambiguous primary types or unused types" error, remove + // the `EIP712Domain` from `types` object. The domain type is inbuilt in + // the EIP712 standard and hence TypedDataEncoder so you do not need to + // specify it in the types, see: + // {@link https://ethereum.stackexchange.com/a/151930} + const typesWithoutEIP712Domain = { ...typedData.types }; + if (typesWithoutEIP712Domain.EIP712Domain) { + // eslint-disable-next-line no-param-reassign + delete typesWithoutEIP712Domain.EIP712Domain; + } + try { + // the final digest for AmbireReadableOperation is the execute hash + // as it's wrapped in mode.standard and onchain gets transformed to + // an AmbireOperation + if ('AmbireReadableOperation' in typedData.types) { + const ambireReadableOperation = typedData.message; + finalDigest = hexlify(getSignableHash(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(callToTuple))); + } + else { + finalDigest = TypedDataEncoder.hash(typedData.domain, typesWithoutEIP712Domain, typedData.message); + } + if (!finalDigest) + throw Error('Hashing the typedData returned no (falsy) result.'); + } + catch (e) { + throw Error(`Preparing the just signed (typed data) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${e?.message || 'missing'}`); + } + } + // this 'magic' universal validator contract will deploy itself within the eth_call, try to verify the signature using + // ERC-6492, ERC-1271 and ecrecover, and return the value to us + const coder = new AbiCoder(); + let callResult; + try { + const deploylessVerify = fromDescriptor(provider, UniversalSigValidator, !network.rpcNoStateOverride); + const deploylessRes = await deploylessVerify.call('isValidSigWithSideEffects', [ + signer, + finalDigest, + signature + ]); + if (deploylessRes[0] === true) + callResult = '0x01'; + else if (deploylessRes[0] === false) + callResult = '0x00'; + else + callResult = deploylessRes[0]; + } + catch (e) { + throw new Error(`Validating the just signed message failed. Please try again or contact Ambire support if the issue persists. Error details: UniversalValidator call failed, more details: ${ + // TODO: Use the `reason` from the decodeError(e) instead, when this case is better handled in there + e?.message || 'missing'}`); + } + if (callResult === '0x01') + return true; + if (callResult === '0x00') + return false; + if (callResult.startsWith('0x08c379a0')) + throw new Error(`Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details:: ${coder.decode(['string'], `0x${callResult.slice(10)}`)[0]}`); + throw new Error(`Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details: unexpected result from the UniversalValidator: ${callResult}`); +} +// Authorize the execute calls according to the version of the smart account +export async function getExecuteSignature(network, accountOp, accountState, signer) { + // if we're authorizing calls for a v1 contract, we do a sign message + // on the hash of the calls + if (!accountState.isV2) { + const message = hexlify(accountOpSignableHash(accountOp, network.chainId)); + return wrapStandard(await signer.signMessage(message)); + } + // txns for v2 contracts are always eip-712 so we put the hash of the calls + // in eip-712 format + const typedData = getTypedData(network.chainId, accountState.accountAddr, hexlify(accountOpSignableHash(accountOp, network.chainId))); + return wrapStandard(await signer.signTypedData(typedData)); +} +export async function getPlainTextSignature(message, network, account, accountState, signer) { + const dedicatedToOneSA = signer.key.dedicatedToOneSA; + let messageHex; + if (message instanceof Uint8Array) { + messageHex = hexlify(message); + } + else if (!isHexString(message)) { + messageHex = hexlify(toUtf8Bytes(message)); + } + else { + messageHex = message; + } + if (!account.creation) { + const signature = await signer.signMessage(messageHex); + return signature; + } + if (!accountState.isV2) { + const lowercaseHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.toLowerCase().slice(2))); + const checksummedHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.slice(2))); + const asciiAddrLowerCase = account.addr.toLowerCase(); + const humanReadableMsg = message instanceof Uint8Array ? hexlify(message) : message; + const isAsciiAddressInMessage = humanReadableMsg.toLowerCase().includes(asciiAddrLowerCase); + const isLowercaseHexAddressInMessage = humanReadableMsg.includes(lowercaseHexAddrWithout0x.slice(2)); + const isChecksummedHexAddressInMessage = humanReadableMsg.includes(checksummedHexAddrWithout0x.slice(2)); + if (!network.predefined && + !relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)) { + throw new Error(`Signing messages is disallowed for v1 accounts on ${network.name}`); + } + if (isAsciiAddressInMessage || + isLowercaseHexAddressInMessage || + isChecksummedHexAddressInMessage) { + return wrapUnprotected(await signer.signMessage(messageHex)); + } + throw new Error('Signing messages is disallowed for v1 accounts. Please contact support to proceed'); + } + // if it's safe, we proceed + if (dedicatedToOneSA) { + return wrapUnprotected(await signer.signMessage(messageHex)); + } + // in case of only_standard priv key, we transform the data + // for signing to EIP-712. This is because the key is not labeled safe + // and it should inform the user that he's performing an Ambire Op. + // This is important as this key could be a metamask one and someone + // could be phishing him into approving an Ambire Op without him + // knowing + const typedData = getTypedData(network.chainId, account.addr, hashMessage(getBytes(messageHex))); + return wrapStandard(await signer.signTypedData(typedData)); +} +export async function getEIP712Signature(message, account, accountState, signer, network) { + if (!message.types.EIP712Domain) { + throw new Error('Ambire only supports signing EIP712 typed data messages. Please try again with a valid EIP712 message.'); + } + if (!message.primaryType) { + throw new Error('The primaryType is missing in the typed data message incoming. Please try again with a valid EIP712 message.'); + } + if (!account.creation) { + const signature = await signer.signTypedData(message); + return signature; + } + if (!accountState.isV2) { + const asString = JSON.stringify(message).toLowerCase(); + if (asString.indexOf(account.addr.toLowerCase()) !== -1 || + (message.domain.name === 'Permit2' && + message.domain.verifyingContract && + getAddress(message.domain.verifyingContract) === PERMIT_2_ADDRESS && + message.message && + message.message.spender && + UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] && + UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === getAddress(message.message.spender))) { + return wrapUnprotected(await signer.signTypedData(message)); + } + throw new Error('Signing this eip-712 message is disallowed for v1 accounts as it does not contain the smart account address and therefore deemed unsafe'); + } + // we do not allow signers who are not dedicated to one account to sign eip-712 + // messsages in v2 as it could lead to reusing that key from + const dedicatedToOneSA = signer.key.dedicatedToOneSA; + if (!dedicatedToOneSA) { + throw new Error(`Signer with address ${signer.key.addr} does not have privileges to execute this operation. Please choose a different signer and try again`); + } + if ('AmbireReadableOperation' in message.types) { + const ambireReadableOperation = message.message; + if (isSameAddr(ambireReadableOperation.addr, account.addr)) { + throw new Error('signature error: trying to sign an AmbireReadableOperation for the same address. Please contact support'); + } + const hash = hexlify(getSignableHash(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(callToTuple))); + const ambireOperation = getTypedData(ambireReadableOperation.chainId, account.addr, hash); + const signature = wrapStandard(await signer.signTypedData(ambireOperation)); + return wrapWallet(signature, account.addr); + } + return wrapUnprotected(await signer.signTypedData(message)); +} +// get the typedData for the first ERC-4337 deploy txn +export async function getEntryPointAuthorization(addr, chainId, nonce) { + const hash = getSignableHash(addr, chainId, nonce, [callToTuple(getActivatorCall(addr))]); + return getTypedData(chainId, addr, hexlify(hash)); +} +export function adjustEntryPointAuthorization(signature) { + let entryPointSig = signature; + // if thet signature is wrapepd in magicBytes because of eip-6492, unwrap it + if (signature.endsWith(magicBytes)) { + const coder = new AbiCoder(); + const decoded = coder.decode(['address', 'bytes', 'bytes'], signature.substring(0, signature.length - magicBytes.length)); + entryPointSig = decoded[2]; + } + // since normally when we sign an EIP-712 request, we wrap it in Unprotected, + // we adjust the entry point authorization signature so we could execute a txn + return wrapStandard(entryPointSig.substring(0, entryPointSig.length - 2)); +} +//# sourceMappingURL=signMessage.js.map \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.js.map b/dist/src/libs/signMessage/signMessage.js.map new file mode 100644 index 000000000..3cd452dea --- /dev/null +++ b/dist/src/libs/signMessage/signMessage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/libs/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n AbiCoder,\n getAddress,\n getBytes,\n hashMessage,\n hexlify,\n Interface,\n isHexString,\n JsonRpcProvider,\n toBeHex,\n toUtf8Bytes,\n TypedDataDomain,\n TypedDataEncoder,\n TypedDataField\n} from 'ethers'\n\nimport UniversalSigValidator from '../../../contracts/compiled/UniversalSigValidator.json'\nimport { PERMIT_2_ADDRESS, UNISWAP_UNIVERSAL_ROUTERS } from '../../consts/addresses'\nimport { Account, AccountCreation, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { KeystoreSigner } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { TypedMessage } from '../../interfaces/userRequest'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport isSameAddr from '../../utils/isSameAddr'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix'\nimport {\n AccountOp,\n accountOpSignableHash,\n callToTuple,\n getSignableHash\n} from '../accountOp/accountOp'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { relayerAdditionalNetworks } from '../networks/networks'\nimport { getActivatorCall } from '../userOperation/userOperation'\n\n// EIP6492 signature ends in magicBytes, which ends with a 0x92,\n// which makes it is impossible for it to collide with a valid ecrecover signature if packed in the r,s,v format,\n// as 0x92 is not a valid value for v.\nconst magicBytes = '6492649264926492649264926492649264926492649264926492649264926492'\n\nexport const EIP_1271_NOT_SUPPORTED_BY = [\n 'opensea.io',\n 'paraswap.xyz',\n 'blur.io',\n 'aevo.xyz',\n 'socialscan.io',\n 'tally.xyz',\n 'questn.com'\n]\n\n/**\n * For Unprotected signatures, we need to append 00 at the end\n * for ambire to recognize it\n */\nexport const wrapUnprotected = (signature: string) => {\n return `${signature}00`\n}\n\n/**\n * For EIP-712 signatures, we need to append 01 at the end\n * for ambire to recognize it.\n * For v1 contracts, we do ETH sign at the 01 slot, which we'll\n * call standard from now on\n */\nexport const wrapStandard = (signature: string) => {\n return `${signature}01`\n}\n\n/**\n * For v2 accounts acting as signers, we need to append the v2 wallet\n * addr that's the signer and a 02 mode at the end to indicate it's a wallet:\n * {sig+mode}{wallet_32bytes}{mode}\n */\nexport const wrapWallet = (signature: string, walletAddr: string) => {\n const wallet32bytes = `${stripHexPrefix(toBeHex(0, 12))}${stripHexPrefix(walletAddr)}`\n return `${signature}${wallet32bytes}02`\n}\n\n// allow v1 accounts to have v2 signers\ninterface AmbireReadableOperation {\n addr: Hex\n chainId: bigint\n nonce: bigint\n calls: { to: Hex; value: bigint; data: Hex }[]\n}\n\nexport const getAmbireReadableTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n v1Execute: AmbireReadableOperation\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n Calls: [\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' }\n ],\n AmbireReadableOperation: [\n { name: 'account', type: 'address' },\n { name: 'chainId', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'calls', type: 'Calls[]' }\n ]\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message: v1Execute,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Return the typed data for EIP-712 sign\n */\nexport const getTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n msgHash: string\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n AmbireOperation: [\n { name: 'account', type: 'address' },\n { name: 'hash', type: 'bytes32' }\n ]\n }\n const message = {\n account: verifyingAddr,\n hash: msgHash\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Produce EIP6492 signature for Predeploy Contracts\n *\n * More info: https://eips.ethereum.org/EIPS/eip-6492\n *\n * @param {string} signature - origin ERC-1271 signature\n * @param {object} account\n * @returns {string} - EIP6492 signature\n */\nexport const wrapCounterfactualSign = (signature: string, creation: AccountCreation) => {\n const ABI = ['function deploy(bytes code, uint256 salt)']\n const iface = new Interface(ABI)\n const factoryCallData = iface.encodeFunctionData('deploy', [creation.bytecode, creation.salt])\n\n const coder = new AbiCoder()\n\n // EIP6492 signature\n return (\n coder.encode(\n ['address', 'bytes', 'bytes'],\n [creation.factoryAddr, factoryCallData, signature]\n ) + magicBytes\n )\n}\n\nexport function mapSignatureV(sigRaw: string) {\n const sig = hexStringToUint8Array(sigRaw)\n if (sig[64] < 27) sig[64] += 27\n return hexlify(sig)\n}\n\ntype Props = {\n network?: Network\n provider?: JsonRpcProvider\n signer?: string\n signature: string | Uint8Array\n message?: string | Uint8Array\n typedData?: {\n domain: TypedDataDomain\n types: Record>\n message: Record\n }\n finalDigest?: string\n}\n\n/**\n * Verifies the signature of a message using the provided signer and signature\n * via a \"magic\" universal validator contract using the provided provider to\n * verify the signature on-chain. The contract deploys itself within the\n * `eth_call`, tries to verify the signature using ERC-6492, ERC-1271, and\n * `ecrecover`, and returns the value to the function.\n *\n * Note: you only need to pass one of: typedData, finalDigest, message\n */\nexport async function verifyMessage({\n network,\n provider,\n signer,\n signature,\n message,\n typedData,\n finalDigest\n}: (\n | Required>\n | Required>\n | Required>\n) &\n Props): Promise {\n if (message) {\n try {\n finalDigest = hashMessage(message)\n if (!finalDigest) throw Error('Hashing the message returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (standard) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n } else if (typedData) {\n // To resolve the \"ambiguous primary types or unused types\" error, remove\n // the `EIP712Domain` from `types` object. The domain type is inbuilt in\n // the EIP712 standard and hence TypedDataEncoder so you do not need to\n // specify it in the types, see:\n // {@link https://ethereum.stackexchange.com/a/151930}\n const typesWithoutEIP712Domain = { ...typedData.types }\n if (typesWithoutEIP712Domain.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typesWithoutEIP712Domain.EIP712Domain\n }\n\n try {\n // the final digest for AmbireReadableOperation is the execute hash\n // as it's wrapped in mode.standard and onchain gets transformed to\n // an AmbireOperation\n if ('AmbireReadableOperation' in typedData.types) {\n const ambireReadableOperation = typedData.message as AmbireReadableOperation\n finalDigest = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n } else {\n finalDigest = TypedDataEncoder.hash(\n typedData.domain,\n typesWithoutEIP712Domain,\n typedData.message\n )\n }\n\n if (!finalDigest) throw Error('Hashing the typedData returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (typed data) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n }\n\n // this 'magic' universal validator contract will deploy itself within the eth_call, try to verify the signature using\n // ERC-6492, ERC-1271 and ecrecover, and return the value to us\n const coder = new AbiCoder()\n let callResult\n try {\n const deploylessVerify = fromDescriptor(\n provider!,\n UniversalSigValidator,\n !network!.rpcNoStateOverride\n )\n const deploylessRes = await deploylessVerify.call('isValidSigWithSideEffects', [\n signer,\n finalDigest,\n signature\n ])\n if (deploylessRes[0] === true) callResult = '0x01'\n else if (deploylessRes[0] === false) callResult = '0x00'\n else callResult = deploylessRes[0]\n } catch (e: any) {\n throw new Error(\n `Validating the just signed message failed. Please try again or contact Ambire support if the issue persists. Error details: UniversalValidator call failed, more details: ${\n // TODO: Use the `reason` from the decodeError(e) instead, when this case is better handled in there\n e?.message || 'missing'\n }`\n )\n }\n\n if (callResult === '0x01') return true\n if (callResult === '0x00') return false\n if (callResult.startsWith('0x08c379a0'))\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details:: ${\n coder.decode(['string'], `0x${callResult.slice(10)}`)[0]\n }`\n )\n\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details: unexpected result from the UniversalValidator: ${callResult}`\n )\n}\n\n// Authorize the execute calls according to the version of the smart account\nexport async function getExecuteSignature(\n network: Network,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n) {\n // if we're authorizing calls for a v1 contract, we do a sign message\n // on the hash of the calls\n if (!accountState.isV2) {\n const message = hexlify(accountOpSignableHash(accountOp, network.chainId))\n return wrapStandard(await signer.signMessage(message))\n }\n\n // txns for v2 contracts are always eip-712 so we put the hash of the calls\n // in eip-712 format\n const typedData = getTypedData(\n network.chainId,\n accountState.accountAddr,\n hexlify(accountOpSignableHash(accountOp, network.chainId))\n )\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getPlainTextSignature(\n message: string | Uint8Array,\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n): Promise {\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n\n let messageHex\n if (message instanceof Uint8Array) {\n messageHex = hexlify(message)\n } else if (!isHexString(message)) {\n messageHex = hexlify(toUtf8Bytes(message))\n } else {\n messageHex = message\n }\n\n if (!account.creation) {\n const signature = await signer.signMessage(messageHex)\n return signature\n }\n\n if (!accountState.isV2) {\n const lowercaseHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.toLowerCase().slice(2)))\n const checksummedHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.slice(2)))\n const asciiAddrLowerCase = account.addr.toLowerCase()\n const humanReadableMsg = message instanceof Uint8Array ? hexlify(message) : message\n\n const isAsciiAddressInMessage = humanReadableMsg.toLowerCase().includes(asciiAddrLowerCase)\n const isLowercaseHexAddressInMessage = humanReadableMsg.includes(\n lowercaseHexAddrWithout0x.slice(2)\n )\n const isChecksummedHexAddressInMessage = humanReadableMsg.includes(\n checksummedHexAddrWithout0x.slice(2)\n )\n\n if (\n !network.predefined &&\n !relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n ) {\n throw new Error(`Signing messages is disallowed for v1 accounts on ${network.name}`)\n }\n\n if (\n isAsciiAddressInMessage ||\n isLowercaseHexAddressInMessage ||\n isChecksummedHexAddressInMessage\n ) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n throw new Error(\n 'Signing messages is disallowed for v1 accounts. Please contact support to proceed'\n )\n }\n\n // if it's safe, we proceed\n if (dedicatedToOneSA) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n // in case of only_standard priv key, we transform the data\n // for signing to EIP-712. This is because the key is not labeled safe\n // and it should inform the user that he's performing an Ambire Op.\n // This is important as this key could be a metamask one and someone\n // could be phishing him into approving an Ambire Op without him\n // knowing\n const typedData = getTypedData(network!.chainId, account.addr, hashMessage(getBytes(messageHex)))\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getEIP712Signature(\n message: TypedMessage,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner,\n network: Network\n): Promise {\n if (!message.types.EIP712Domain) {\n throw new Error(\n 'Ambire only supports signing EIP712 typed data messages. Please try again with a valid EIP712 message.'\n )\n }\n if (!message.primaryType) {\n throw new Error(\n 'The primaryType is missing in the typed data message incoming. Please try again with a valid EIP712 message.'\n )\n }\n\n if (!account.creation) {\n const signature = await signer.signTypedData(message)\n return signature\n }\n\n if (!accountState.isV2) {\n const asString = JSON.stringify(message).toLowerCase()\n if (\n asString.indexOf(account.addr.toLowerCase()) !== -1 ||\n (message.domain.name === 'Permit2' &&\n message.domain.verifyingContract &&\n getAddress(message.domain.verifyingContract) === PERMIT_2_ADDRESS &&\n message.message &&\n message.message.spender &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === getAddress(message.message.spender))\n ) {\n return wrapUnprotected(await signer.signTypedData(message))\n }\n\n throw new Error(\n 'Signing this eip-712 message is disallowed for v1 accounts as it does not contain the smart account address and therefore deemed unsafe'\n )\n }\n\n // we do not allow signers who are not dedicated to one account to sign eip-712\n // messsages in v2 as it could lead to reusing that key from\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n if (!dedicatedToOneSA) {\n throw new Error(\n `Signer with address ${signer.key.addr} does not have privileges to execute this operation. Please choose a different signer and try again`\n )\n }\n\n if ('AmbireReadableOperation' in message.types) {\n const ambireReadableOperation = message.message as AmbireReadableOperation\n if (isSameAddr(ambireReadableOperation.addr, account.addr)) {\n throw new Error(\n 'signature error: trying to sign an AmbireReadableOperation for the same address. Please contact support'\n )\n }\n\n const hash = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n const ambireOperation = getTypedData(ambireReadableOperation.chainId, account.addr, hash)\n const signature = wrapStandard(await signer.signTypedData(ambireOperation))\n return wrapWallet(signature, account.addr)\n }\n\n return wrapUnprotected(await signer.signTypedData(message))\n}\n\n// get the typedData for the first ERC-4337 deploy txn\nexport async function getEntryPointAuthorization(addr: AccountId, chainId: bigint, nonce: bigint) {\n const hash = getSignableHash(addr, chainId, nonce, [callToTuple(getActivatorCall(addr))])\n return getTypedData(chainId, addr, hexlify(hash))\n}\n\nexport function adjustEntryPointAuthorization(signature: string): string {\n let entryPointSig = signature\n\n // if thet signature is wrapepd in magicBytes because of eip-6492, unwrap it\n if (signature.endsWith(magicBytes)) {\n const coder = new AbiCoder()\n const decoded = coder.decode(\n ['address', 'bytes', 'bytes'],\n signature.substring(0, signature.length - magicBytes.length)\n )\n entryPointSig = decoded[2]\n }\n\n // since normally when we sign an EIP-712 request, we wrap it in Unprotected,\n // we adjust the entry point authorization signature so we could execute a txn\n return wrapStandard(entryPointSig.substring(0, entryPointSig.length - 2))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.d.ts b/dist/src/libs/singleton/singleton.d.ts new file mode 100644 index 000000000..7c8529c73 --- /dev/null +++ b/dist/src/libs/singleton/singleton.d.ts @@ -0,0 +1,2 @@ +export declare function getGasUsed(gasUsed: bigint): bigint; +//# sourceMappingURL=singleton.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.d.ts.map b/dist/src/libs/singleton/singleton.d.ts.map new file mode 100644 index 000000000..11047aa45 --- /dev/null +++ b/dist/src/libs/singleton/singleton.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../../../src/libs/singleton/singleton.ts"],"names":[],"mappings":"AAmBA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD"} \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.js b/dist/src/libs/singleton/singleton.js new file mode 100644 index 000000000..e39838a1c --- /dev/null +++ b/dist/src/libs/singleton/singleton.js @@ -0,0 +1,27 @@ +// Special exception for the singleton deployer: +// Estimation on various networks depends entirely on the RPC +// implementation of eth_estimateGas. On ethereum, the RPC tends +// to return ~6kk for our deploy contracts call, which is great as +// the txn will pass (it needs about 4kk). +// +// On polygon though, it returns ~600k, meaning the txn will fail with +// out of gas without any warnings to the user. That's why we need +// to manually up the gasUsed to at least 4500000n, +// +// Then come networks with wild gas estimations above 10m (Arbitrum, Mantle) +// Because of the blob updates, networks fees on this networks have lowered +// dramatically. But no RPC can estimate correctly how much gas is need to +// correctly deploy on the network. That's why we do a multiplication by 5 +// and hope for the best. +// +// The backside to this is that txns to the singleton can overestimate. +// Overestimation is now so bad, though. If the real gas is lower, the funds +// will not be taken from the user. Underestimation is worse as txn fails. +export function getGasUsed(gasUsed) { + if (gasUsed < 4500000n) + return 4500000n; + if (gasUsed > 10000000n) + return gasUsed * 5n; + return gasUsed; +} +//# sourceMappingURL=singleton.js.map \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.js.map b/dist/src/libs/singleton/singleton.js.map new file mode 100644 index 000000000..da9b0d0c1 --- /dev/null +++ b/dist/src/libs/singleton/singleton.js.map @@ -0,0 +1 @@ +{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../../../src/libs/singleton/singleton.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,6DAA6D;AAC7D,gEAAgE;AAChE,kEAAkE;AAClE,0CAA0C;AAC1C,EAAE;AACF,sEAAsE;AACtE,kEAAkE;AAClE,mDAAmD;AACnD,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,yBAAyB;AACzB,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAEvC,IAAI,OAAO,GAAG,SAAS;QAAE,OAAO,OAAO,GAAG,EAAE,CAAA;IAE5C,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["// Special exception for the singleton deployer:\n// Estimation on various networks depends entirely on the RPC\n// implementation of eth_estimateGas. On ethereum, the RPC tends\n// to return ~6kk for our deploy contracts call, which is great as\n// the txn will pass (it needs about 4kk).\n//\n// On polygon though, it returns ~600k, meaning the txn will fail with\n// out of gas without any warnings to the user. That's why we need\n// to manually up the gasUsed to at least 4500000n,\n//\n// Then come networks with wild gas estimations above 10m (Arbitrum, Mantle)\n// Because of the blob updates, networks fees on this networks have lowered\n// dramatically. But no RPC can estimate correctly how much gas is need to\n// correctly deploy on the network. That's why we do a multiplication by 5\n// and hope for the best.\n//\n// The backside to this is that txns to the singleton can overestimate.\n// Overestimation is now so bad, though. If the real gas is lower, the funds\n// will not be taken from the user. Underestimation is worse as txn fails.\nexport function getGasUsed(gasUsed: bigint): bigint {\n if (gasUsed < 4500000n) return 4500000n\n\n if (gasUsed > 10000000n) return gasUsed * 5n\n\n return gasUsed\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.d.ts b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts new file mode 100644 index 000000000..affff8338 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts @@ -0,0 +1,27 @@ +import { Account } from '../../interfaces/account'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { ActiveRoute, SocketAPISendTransactionRequest, SocketAPIStep, SocketAPIToken, SocketAPIUserTx, SwapAndBridgeToToken } from '../../interfaces/swapAndBridge'; +import { SignUserRequest } from '../../interfaces/userRequest'; +import { TokenResult } from '../portfolio'; +export declare const sortTokenListResponse: (tokenListResponse: SwapAndBridgeToToken[], accountPortfolioTokenList: TokenResult[]) => SwapAndBridgeToToken[]; +export declare const sortPortfolioTokenList: (accountPortfolioTokenList: TokenResult[]) => TokenResult[]; +/** + * Determines if a token is eligible for swapping and bridging. + * Not all tokens in the portfolio are eligible. + */ +export declare const getIsTokenEligibleForSwapAndBridge: (token: TokenResult) => boolean; +export declare const convertPortfolioTokenToSocketAPIToken: (portfolioToken: TokenResult, chainId: number) => SocketAPIToken; +declare const getQuoteRouteSteps: (userTxs: SocketAPIUserTx[]) => SocketAPIStep[]; +declare const getActiveRoutesLowestServiceTime: (activeRoutes: ActiveRoute[]) => number; +declare const getActiveRoutesUpdateInterval: (minServiceTime?: number) => 5000 | 8000 | 15000 | 6000 | 7000 | 12000; +declare const buildSwapAndBridgeUserRequests: (userTx: SocketAPISendTransactionRequest, networkId: string, account: Account, provider: RPCProvider) => Promise; +export declare const getIsBridgeTxn: (userTxType: SocketAPIUserTx['userTxType']) => boolean; +/** + * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0 + * there are 16 networks supported, so user could have (many) custom networks that are not. + */ +export declare const getIsNetworkSupported: (supportedChainIds: Network['chainId'][], network?: Network) => boolean; +declare const getActiveRoutesForAccount: (accountAddress: string, activeRoutes: ActiveRoute[]) => ActiveRoute[]; +export { getQuoteRouteSteps, getActiveRoutesLowestServiceTime, getActiveRoutesUpdateInterval, buildSwapAndBridgeUserRequests, getActiveRoutesForAccount }; +//# sourceMappingURL=swapAndBridge.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.d.ts.map b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts.map new file mode 100644 index 000000000..4ba9dd0d1 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.d.ts","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EACL,WAAW,EAEX,+BAA+B,EAC/B,aAAa,EACb,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAqB1C,eAAO,MAAM,qBAAqB,sBACb,oBAAoB,EAAE,6BACd,WAAW,EAAE,2BAkBzC,CAAA;AAED,eAAO,MAAM,sBAAsB,8BAA+B,WAAW,EAAE,kBAQ9E,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kCAAkC,UAAW,WAAW,YAgBpE,CAAA;AAED,eAAO,MAAM,qCAAqC,mBAChC,WAAW,WAClB,MAAM,KACd,cAUF,CAAA;AAED,QAAA,MAAM,kBAAkB,YAAa,eAAe,EAAE,oBAsBrD,CAAA;AAED,QAAA,MAAM,gCAAgC,iBAAkB,WAAW,EAAE,WAYpE,CAAA;AAED,QAAA,MAAM,6BAA6B,oBAAqB,MAAM,8CAS7D,CAAA;AAwCD,QAAA,MAAM,8BAA8B,WAC1B,+BAA+B,aAC5B,MAAM,WACR,OAAO,YACN,WAAW,+BAwItB,CAAA;AAED,eAAO,MAAM,cAAc,eAAgB,eAAe,CAAC,YAAY,CAAC,YAC5C,CAAA;AAE5B;;;GAGG;AACH,eAAO,MAAM,qBAAqB,sBACb,OAAO,CAAC,SAAS,CAAC,EAAE,YAC7B,OAAO,YAOlB,CAAA;AAED,QAAA,MAAM,yBAAyB,mBAAoB,MAAM,gBAAgB,WAAW,EAAE,kBAIrF,CAAA;AAED,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,EAC1B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.js b/dist/src/libs/swapAndBridge/swapAndBridge.js new file mode 100644 index 000000000..863947429 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridge.js @@ -0,0 +1,295 @@ +import { Contract, getAddress, Interface, MaxUint256 } from 'ethers'; +import ERC20 from '../../../contracts/compiled/IERC20.json'; +import { isSmartAccount } from '../account/account'; +import { getTokenBalanceInUSD } from '../portfolio/helpers'; +const sortTokensByPendingAndBalance = (a, b) => { + // Pending tokens go on top + const isAPending = typeof a.amountPostSimulation === 'bigint' && a.amountPostSimulation !== BigInt(a.amount); + const isBPending = typeof b.amountPostSimulation === 'bigint' && b.amountPostSimulation !== BigInt(b.amount); + if (isAPending && !isBPending) + return -1; + if (!isAPending && isBPending) + return 1; + // Otherwise, higher balance comes first + const aBalanceUSD = getTokenBalanceInUSD(a); + const bBalanceUSD = getTokenBalanceInUSD(b); + if (aBalanceUSD !== bBalanceUSD) + return bBalanceUSD - aBalanceUSD; + return 0; +}; +export const sortTokenListResponse = (tokenListResponse, accountPortfolioTokenList) => { + return tokenListResponse.sort((a, b) => { + const aInPortfolio = accountPortfolioTokenList.find((t) => t.address === a.address); + const bInPortfolio = accountPortfolioTokenList.find((t) => t.address === b.address); + // Tokens in portfolio should come first + if (aInPortfolio && !bInPortfolio) + return -1; + if (!aInPortfolio && bInPortfolio) + return 1; + if (aInPortfolio && bInPortfolio) { + const comparisonResult = sortTokensByPendingAndBalance(aInPortfolio, bInPortfolio); + if (comparisonResult !== 0) + return comparisonResult; + } + // Otherwise, just alphabetical + return (a.name || '').localeCompare(b.name || ''); + }); +}; +export const sortPortfolioTokenList = (accountPortfolioTokenList) => { + return accountPortfolioTokenList.sort((a, b) => { + const comparisonResult = sortTokensByPendingAndBalance(a, b); + if (comparisonResult !== 0) + return comparisonResult; + // Otherwise, just alphabetical + return (a.symbol || '').localeCompare(b.symbol || ''); + }); +}; +/** + * Determines if a token is eligible for swapping and bridging. + * Not all tokens in the portfolio are eligible. + */ +export const getIsTokenEligibleForSwapAndBridge = (token) => { + // Prevent filtering out tokens with amountPostSimulation = 0 if the actual amount is positive. + // This ensures the token remains in the list when sending the full amount of it + const amount = token.amountPostSimulation === 0n && token.amount > 0n + ? token.amount + : token.amountPostSimulation ?? token.amount; + const hasPositiveBalance = Number(amount) > 0; + return ( + // The same token can be in the Gas Tank (or as a Reward) and in the portfolio. + // Exclude the one in the Gas Tank (swapping Gas Tank tokens is not supported). + !token.flags.onGasTank && + // And exclude the rewards ones (swapping rewards is not supported). + !token.flags.rewardsType && + hasPositiveBalance); +}; +export const convertPortfolioTokenToSocketAPIToken = (portfolioToken, chainId) => { + const { address, decimals, symbol } = portfolioToken; + // Although name and symbol will be the same, it's better than having "No name" in the UI (valid use-case) + const name = symbol; + // Fine for not having both icon props, because this would fallback to the + // icon discovery method used for the portfolio tokens + const icon = ''; + const logoURI = ''; + return { address, chainId, decimals, symbol, name, icon, logoURI }; +}; +const getQuoteRouteSteps = (userTxs) => { + return userTxs.reduce((stepsAcc, tx) => { + if (tx.userTxType === 'fund-movr') { + tx.steps.forEach((s) => stepsAcc.push({ ...s, userTxIndex: tx.userTxIndex })); + } + if (tx.userTxType === 'dex-swap') { + stepsAcc.push({ + chainId: tx.chainId, + fromAmount: tx.fromAmount, + fromAsset: tx.fromAsset, + gasFees: tx.gasFees, + minAmountOut: tx.minAmountOut, + protocol: tx.protocol, + swapSlippage: tx.swapSlippage, + toAmount: tx.toAmount, + toAsset: tx.toAsset, + type: 'swap', + userTxIndex: tx.userTxIndex + }); + } + return stepsAcc; + }, []); +}; +const getActiveRoutesLowestServiceTime = (activeRoutes) => { + const serviceTimes = []; + activeRoutes.forEach((r) => r.route.userTxs.forEach((tx) => { + if (tx.serviceTime) { + serviceTimes.push(tx.serviceTime); + } + })); + return serviceTimes.sort((a, b) => a - b)[0]; +}; +const getActiveRoutesUpdateInterval = (minServiceTime) => { + if (!minServiceTime) + return 7000; + if (minServiceTime < 60) + return 5000; + if (minServiceTime <= 180) + return 6000; + if (minServiceTime <= 300) + return 8000; + if (minServiceTime <= 600) + return 12000; + return 15000; +}; +const buildRevokeApprovalIfNeeded = async (userTx, account, provider) => { + if (!userTx.approvalData) + return; + const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider); + const requiredAmount = isSmartAccount(account) + ? BigInt(userTx.approvalData.minimumApprovalAmount) + : MaxUint256; + const approveCallData = erc20Contract.interface.encodeFunctionData('approve', [ + userTx.approvalData.allowanceTarget, + requiredAmount + ]); + let fails = false; + try { + await provider.call({ + from: account.addr, + to: userTx.approvalData.approvalTokenAddress, + data: approveCallData + }); + } + catch (e) { + fails = true; + } + if (!fails) + return; + return { + to: userTx.approvalData.approvalTokenAddress, + value: BigInt('0'), + data: erc20Contract.interface.encodeFunctionData('approve', [ + userTx.approvalData.allowanceTarget, + BigInt(0) + ]) + }; +}; +const buildSwapAndBridgeUserRequests = async (userTx, networkId, account, provider) => { + if (isSmartAccount(account)) { + const calls = []; + if (userTx.approvalData) { + const erc20Interface = new Interface(ERC20.abi); + const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider); + if (revokeApproval) + calls.push(revokeApproval); + calls.push({ + to: userTx.approvalData.approvalTokenAddress, + value: BigInt('0'), + data: erc20Interface.encodeFunctionData('approve', [ + userTx.approvalData.allowanceTarget, + BigInt(userTx.approvalData.minimumApprovalAmount) + ]), + fromUserRequestId: userTx.activeRouteId + }); + } + calls.push({ + to: userTx.txTarget, + value: BigInt(userTx.value), + data: userTx.txData, + fromUserRequestId: userTx.activeRouteId + }); + return [ + { + id: userTx.activeRouteId, + action: { + kind: 'calls', + calls + }, + meta: { + isSignAction: true, + networkId, + accountAddr: account.addr, + activeRouteId: userTx.activeRouteId, + isSwapAndBridgeCall: true + } + } + ]; + } + const requests = []; + let shouldBuildSwapOrBridgeTx = true; + if (userTx.approvalData) { + const erc20Interface = new Interface(ERC20.abi); + let shouldApprove = true; + try { + const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider); + const allowance = await erc20Contract.allowance(userTx.approvalData.owner, userTx.approvalData.allowanceTarget); + // check if an approval already exists + if (BigInt(allowance) >= BigInt(userTx.approvalData.minimumApprovalAmount)) + shouldApprove = false; + } + catch (error) { + console.error(error); + } + if (shouldApprove) { + const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider); + if (revokeApproval) { + requests.push({ + id: `${userTx.activeRouteId}-revoke-approval`, + action: { kind: 'calls', calls: [revokeApproval] }, + meta: { + isSignAction: true, + networkId, + accountAddr: account.addr, + isSwapAndBridgeCall: true, + activeRouteId: userTx.activeRouteId + } + }); + } + requests.push({ + id: `${userTx.activeRouteId}-approval`, + action: { + kind: 'calls', + calls: [ + { + to: userTx.approvalData.approvalTokenAddress, + value: BigInt('0'), + data: erc20Interface.encodeFunctionData('approve', [ + userTx.approvalData.allowanceTarget, + MaxUint256 // approve the max possible amount for better UX on BA + ]), + fromUserRequestId: `${userTx.activeRouteId}-approval` + } + ] + }, + meta: { + isSignAction: true, + networkId, + accountAddr: account.addr, + isSwapAndBridgeCall: true, + activeRouteId: userTx.activeRouteId + } + }); + // first build only the approval tx and then when confirmed this func will be called a second time + // and then only the swap or bridge tx will be created + shouldBuildSwapOrBridgeTx = false; + } + } + if (shouldBuildSwapOrBridgeTx) { + requests.push({ + id: userTx.activeRouteId, + action: { + kind: 'calls', + calls: [ + { + to: userTx.txTarget, + value: BigInt(userTx.value), + data: userTx.txData, + fromUserRequestId: userTx.activeRouteId + } + ] + }, + meta: { + isSignAction: true, + networkId, + accountAddr: account.addr, + isSwapAndBridgeCall: true, + activeRouteId: userTx.activeRouteId + } + }); + } + return requests; +}; +export const getIsBridgeTxn = (userTxType) => userTxType === 'fund-movr'; +/** + * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0 + * there are 16 networks supported, so user could have (many) custom networks that are not. + */ +export const getIsNetworkSupported = (supportedChainIds, network) => { + // Assume supported if missing (and receive no results when attempting to use + // a not-supported network) than the alternative - blocking the UI. + if (!supportedChainIds.length || !network) + return true; + return supportedChainIds.includes(network.chainId); +}; +const getActiveRoutesForAccount = (accountAddress, activeRoutes) => { + return activeRoutes.filter((r) => getAddress(r.route.sender || r.route.userAddress) === accountAddress); +}; +export { getQuoteRouteSteps, getActiveRoutesLowestServiceTime, getActiveRoutesUpdateInterval, buildSwapAndBridgeUserRequests, getActiveRoutesForAccount }; +//# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.js.map b/dist/src/libs/swapAndBridge/swapAndBridge.js.map new file mode 100644 index 000000000..ba329cb34 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridge.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, getAddress, Interface, MaxUint256 } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport {\n ActiveRoute,\n SocketAPIBridgeUserTx,\n SocketAPISendTransactionRequest,\n SocketAPIStep,\n SocketAPIToken,\n SocketAPIUserTx,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { SignUserRequest } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../account/account'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\nimport { getTokenBalanceInUSD } from '../portfolio/helpers'\n\nconst sortTokensByPendingAndBalance = (a: TokenResult, b: TokenResult) => {\n // Pending tokens go on top\n const isAPending =\n typeof a.amountPostSimulation === 'bigint' && a.amountPostSimulation !== BigInt(a.amount)\n const isBPending =\n typeof b.amountPostSimulation === 'bigint' && b.amountPostSimulation !== BigInt(b.amount)\n\n if (isAPending && !isBPending) return -1\n if (!isAPending && isBPending) return 1\n\n // Otherwise, higher balance comes first\n const aBalanceUSD = getTokenBalanceInUSD(a)\n const bBalanceUSD = getTokenBalanceInUSD(b)\n if (aBalanceUSD !== bBalanceUSD) return bBalanceUSD - aBalanceUSD\n\n return 0\n}\n\nexport const sortTokenListResponse = (\n tokenListResponse: SwapAndBridgeToToken[],\n accountPortfolioTokenList: TokenResult[]\n) => {\n return tokenListResponse.sort((a: SocketAPIToken, b: SocketAPIToken) => {\n const aInPortfolio = accountPortfolioTokenList.find((t) => t.address === a.address)\n const bInPortfolio = accountPortfolioTokenList.find((t) => t.address === b.address)\n\n // Tokens in portfolio should come first\n if (aInPortfolio && !bInPortfolio) return -1\n if (!aInPortfolio && bInPortfolio) return 1\n\n if (aInPortfolio && bInPortfolio) {\n const comparisonResult = sortTokensByPendingAndBalance(aInPortfolio, bInPortfolio)\n if (comparisonResult !== 0) return comparisonResult\n }\n\n // Otherwise, just alphabetical\n return (a.name || '').localeCompare(b.name || '')\n })\n}\n\nexport const sortPortfolioTokenList = (accountPortfolioTokenList: TokenResult[]) => {\n return accountPortfolioTokenList.sort((a, b) => {\n const comparisonResult = sortTokensByPendingAndBalance(a, b)\n if (comparisonResult !== 0) return comparisonResult\n\n // Otherwise, just alphabetical\n return (a.symbol || '').localeCompare(b.symbol || '')\n })\n}\n\n/**\n * Determines if a token is eligible for swapping and bridging.\n * Not all tokens in the portfolio are eligible.\n */\nexport const getIsTokenEligibleForSwapAndBridge = (token: TokenResult) => {\n // Prevent filtering out tokens with amountPostSimulation = 0 if the actual amount is positive.\n // This ensures the token remains in the list when sending the full amount of it\n const amount =\n token.amountPostSimulation === 0n && token.amount > 0n\n ? token.amount\n : token.amountPostSimulation ?? token.amount\n const hasPositiveBalance = Number(amount) > 0\n return (\n // The same token can be in the Gas Tank (or as a Reward) and in the portfolio.\n // Exclude the one in the Gas Tank (swapping Gas Tank tokens is not supported).\n !token.flags.onGasTank &&\n // And exclude the rewards ones (swapping rewards is not supported).\n !token.flags.rewardsType &&\n hasPositiveBalance\n )\n}\n\nexport const convertPortfolioTokenToSocketAPIToken = (\n portfolioToken: TokenResult,\n chainId: number\n): SocketAPIToken => {\n const { address, decimals, symbol } = portfolioToken\n // Although name and symbol will be the same, it's better than having \"No name\" in the UI (valid use-case)\n const name = symbol\n // Fine for not having both icon props, because this would fallback to the\n // icon discovery method used for the portfolio tokens\n const icon = ''\n const logoURI = ''\n\n return { address, chainId, decimals, symbol, name, icon, logoURI }\n}\n\nconst getQuoteRouteSteps = (userTxs: SocketAPIUserTx[]) => {\n return userTxs.reduce((stepsAcc: SocketAPIStep[], tx) => {\n if (tx.userTxType === 'fund-movr') {\n tx.steps.forEach((s) => stepsAcc.push({ ...s, userTxIndex: tx.userTxIndex }))\n }\n if (tx.userTxType === 'dex-swap') {\n stepsAcc.push({\n chainId: tx.chainId,\n fromAmount: tx.fromAmount,\n fromAsset: tx.fromAsset,\n gasFees: tx.gasFees,\n minAmountOut: tx.minAmountOut,\n protocol: tx.protocol,\n swapSlippage: tx.swapSlippage,\n toAmount: tx.toAmount,\n toAsset: tx.toAsset,\n type: 'swap',\n userTxIndex: tx.userTxIndex\n })\n }\n return stepsAcc\n }, [])\n}\n\nconst getActiveRoutesLowestServiceTime = (activeRoutes: ActiveRoute[]) => {\n const serviceTimes: number[] = []\n\n activeRoutes.forEach((r) =>\n r.route.userTxs.forEach((tx) => {\n if ((tx as SocketAPIBridgeUserTx).serviceTime) {\n serviceTimes.push((tx as SocketAPIBridgeUserTx).serviceTime)\n }\n })\n )\n\n return serviceTimes.sort((a, b) => a - b)[0]\n}\n\nconst getActiveRoutesUpdateInterval = (minServiceTime?: number) => {\n if (!minServiceTime) return 7000\n\n if (minServiceTime < 60) return 5000\n if (minServiceTime <= 180) return 6000\n if (minServiceTime <= 300) return 8000\n if (minServiceTime <= 600) return 12000\n\n return 15000\n}\n\nconst buildRevokeApprovalIfNeeded = async (\n userTx: SocketAPISendTransactionRequest,\n account: Account,\n provider: RPCProvider\n): Promise => {\n if (!userTx.approvalData) return\n const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider)\n const requiredAmount = isSmartAccount(account)\n ? BigInt(userTx.approvalData.minimumApprovalAmount)\n : MaxUint256\n const approveCallData = erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n requiredAmount\n ])\n\n let fails = false\n try {\n await provider.call({\n from: account.addr,\n to: userTx.approvalData.approvalTokenAddress,\n data: approveCallData\n })\n } catch (e) {\n fails = true\n }\n\n if (!fails) return\n\n return {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(0)\n ])\n }\n}\n\nconst buildSwapAndBridgeUserRequests = async (\n userTx: SocketAPISendTransactionRequest,\n networkId: string,\n account: Account,\n provider: RPCProvider\n) => {\n if (isSmartAccount(account)) {\n const calls: Call[] = []\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) calls.push(revokeApproval)\n\n calls.push({\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(userTx.approvalData.minimumApprovalAmount)\n ]),\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n }\n\n calls.push({\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n\n return [\n {\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n activeRouteId: userTx.activeRouteId,\n isSwapAndBridgeCall: true\n }\n } as SignUserRequest\n ]\n }\n const requests: SignUserRequest[] = []\n let shouldBuildSwapOrBridgeTx = true\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n let shouldApprove = true\n try {\n const erc20Contract = new Contract(\n userTx.approvalData.approvalTokenAddress,\n ERC20.abi,\n provider\n )\n const allowance = await erc20Contract.allowance(\n userTx.approvalData.owner,\n userTx.approvalData.allowanceTarget\n )\n // check if an approval already exists\n if (BigInt(allowance) >= BigInt(userTx.approvalData.minimumApprovalAmount))\n shouldApprove = false\n } catch (error) {\n console.error(error)\n }\n\n if (shouldApprove) {\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) {\n requests.push({\n id: `${userTx.activeRouteId}-revoke-approval`,\n action: { kind: 'calls' as const, calls: [revokeApproval] },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n requests.push({\n id: `${userTx.activeRouteId}-approval`,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n MaxUint256 // approve the max possible amount for better UX on BA\n ]),\n fromUserRequestId: `${userTx.activeRouteId}-approval`\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n // first build only the approval tx and then when confirmed this func will be called a second time\n // and then only the swap or bridge tx will be created\n shouldBuildSwapOrBridgeTx = false\n }\n }\n\n if (shouldBuildSwapOrBridgeTx) {\n requests.push({\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n return requests\n}\n\nexport const getIsBridgeTxn = (userTxType: SocketAPIUserTx['userTxType']) =>\n userTxType === 'fund-movr'\n\n/**\n * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0\n * there are 16 networks supported, so user could have (many) custom networks that are not.\n */\nexport const getIsNetworkSupported = (\n supportedChainIds: Network['chainId'][],\n network?: Network\n) => {\n // Assume supported if missing (and receive no results when attempting to use\n // a not-supported network) than the alternative - blocking the UI.\n if (!supportedChainIds.length || !network) return true\n\n return supportedChainIds.includes(network.chainId)\n}\n\nconst getActiveRoutesForAccount = (accountAddress: string, activeRoutes: ActiveRoute[]) => {\n return activeRoutes.filter(\n (r) => getAddress(r.route.sender || r.route.userAddress) === accountAddress\n )\n}\n\nexport {\n getQuoteRouteSteps,\n getActiveRoutesLowestServiceTime,\n getActiveRoutesUpdateInterval,\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts new file mode 100644 index 000000000..7de52085a --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts @@ -0,0 +1,5 @@ +import EmittableError from '../../classes/EmittableError'; +import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; +import SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'; +export declare function getHumanReadableSwapAndBridgeError(e: EmittableError | SwapAndBridgeProviderApiError | SwapAndBridgeError | Error | any): Error; +//# sourceMappingURL=swapAndBridgeErrorHumanizer.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts.map b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts.map new file mode 100644 index 000000000..e9f0cd733 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridgeErrorHumanizer.d.ts","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,kBAAkB,MAAM,kCAAkC,CAAA;AACjE,OAAO,6BAA6B,MAAM,6CAA6C,CAAA;AAIvF,wBAAgB,kCAAkC,CAChD,CAAC,EAAE,cAAc,GAAG,6BAA6B,GAAG,kBAAkB,GAAG,KAAK,GAAG,GAAG,SAmBrF"} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js new file mode 100644 index 000000000..d51657c22 --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js @@ -0,0 +1,21 @@ +import EmittableError from '../../classes/EmittableError'; +import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; +import SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'; +const MSG_MAX_LENGTH = 225; +export function getHumanReadableSwapAndBridgeError(e) { + // These errors should be thrown as they are + // as they are already human-readable + if (e instanceof EmittableError || + e instanceof SwapAndBridgeProviderApiError || + e instanceof SwapAndBridgeError) { + return e; + } + // Last resort (fallback) error handling + let message = e?.message || 'no details'; + // Protection against crazy long error messages + if (message.length > MSG_MAX_LENGTH) + message = `${message.substring(0, MSG_MAX_LENGTH)}...`; + const errorMessage = `Unexpected error happened in the Swap & Bridge flow. Try again later or contact Ambire support. Details: <${message}>`; + return new Error(errorMessage); +} +//# sourceMappingURL=swapAndBridgeErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map new file mode 100644 index 000000000..2c689f78c --- /dev/null +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swapAndBridgeErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,kBAAkB,MAAM,kCAAkC,CAAA;AACjE,OAAO,6BAA6B,MAAM,6CAA6C,CAAA;AAEvF,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,MAAM,UAAU,kCAAkC,CAChD,CAAoF;IAEpF,4CAA4C;IAC5C,qCAAqC;IACrC,IACE,CAAC,YAAY,cAAc;QAC3B,CAAC,YAAY,6BAA6B;QAC1C,CAAC,YAAY,kBAAkB,EAC/B;QACA,OAAO,CAAC,CAAA;KACT;IAED,wCAAwC;IACxC,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;IACxC,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc;QAAE,OAAO,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAA;IAC3F,MAAM,YAAY,GAAG,6GAA6G,OAAO,GAAG,CAAA;IAE5I,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;AAChC,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\n\nconst MSG_MAX_LENGTH = 225\n\nexport function getHumanReadableSwapAndBridgeError(\n e: EmittableError | SwapAndBridgeProviderApiError | SwapAndBridgeError | Error | any\n) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (\n e instanceof EmittableError ||\n e instanceof SwapAndBridgeProviderApiError ||\n e instanceof SwapAndBridgeError\n ) {\n return e\n }\n\n // Last resort (fallback) error handling\n let message = e?.message || 'no details'\n // Protection against crazy long error messages\n if (message.length > MSG_MAX_LENGTH) message = `${message.substring(0, MSG_MAX_LENGTH)}...`\n const errorMessage = `Unexpected error happened in the Swap & Bridge flow. Try again later or contact Ambire support. Details: <${message}>`\n\n return new Error(errorMessage)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.d.ts b/dist/src/libs/tracer/debugTraceCall.d.ts new file mode 100644 index 000000000..da8e8a3dd --- /dev/null +++ b/dist/src/libs/tracer/debugTraceCall.d.ts @@ -0,0 +1,9 @@ +import { JsonRpcProvider } from 'ethers'; +import { Account, AccountOnchainState } from '../../interfaces/account'; +import { AccountOp } from '../accountOp/accountOp'; +import { GasRecommendation } from '../gasPrice/gasPrice'; +export declare function debugTraceCall(account: Account, op: AccountOp, provider: JsonRpcProvider, accountState: AccountOnchainState, gasUsed: bigint, gasPrices: GasRecommendation[], supportsStateOverride: boolean, overrideData?: any): Promise<{ + tokens: string[]; + nfts: [string, bigint[]][]; +}>; +//# sourceMappingURL=debugTraceCall.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.d.ts.map b/dist/src/libs/tracer/debugTraceCall.d.ts.map new file mode 100644 index 000000000..2340298d9 --- /dev/null +++ b/dist/src/libs/tracer/debugTraceCall.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"debugTraceCall.d.ts","sourceRoot":"","sources":["../../../../src/libs/tracer/debugTraceCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAc,MAAM,QAAQ,CAAA;AAQ3E,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEvE,OAAO,EAAE,SAAS,EAAiC,MAAM,wBAAwB,CAAA;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAqCxD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,eAAe,EACzB,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,iBAAiB,EAAE,EAC9B,qBAAqB,EAAE,OAAO,EAC9B,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC,CA0H3D"} \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.js b/dist/src/libs/tracer/debugTraceCall.js new file mode 100644 index 000000000..d13150775 --- /dev/null +++ b/dist/src/libs/tracer/debugTraceCall.js @@ -0,0 +1,150 @@ +import { getAddress, Interface, toQuantity } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'; +import NFTGetter from '../../../contracts/compiled/NFTGetter.json'; +import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; +import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; +import { getAccountDeployParams, getSpoof, isSmartAccount } from '../account/account'; +import { callToTuple, getSignableCalls } from '../accountOp/accountOp'; +import { DeploylessMode, fromDescriptor } from '../deployless/deployless'; +import { getDeploylessOpts } from '../portfolio/getOnchainBalances'; +const NFT_COLLECTION_LIMIT = 100; +// if using EOA, use the first and only call of the account op +// if it's SA, make the data execute or deployAndExecute, +// set the spoof+addr and pass all the calls +function getFunctionParams(account, op, accountState) { + if (!account.creation) { + const call = op.calls[0]; + return { + to: call.to, + value: toQuantity(call.value.toString()), + data: call.data, + from: op.accountAddr + }; + } + const saAbi = new Interface(AmbireAccount.abi); + const factoryAbi = new Interface(AmbireFactory.abi); + const callData = accountState.isDeployed + ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)]) + : factoryAbi.encodeFunctionData('deployAndExecute', [ + account.creation.bytecode, + account.creation.salt, + getSignableCalls(op), + getSpoof(account) + ]); + return { + from: DEPLOYLESS_SIMULATION_FROM, + to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, + value: 0, + data: callData + }; +} +export async function debugTraceCall(account, op, provider, accountState, gasUsed, gasPrices, supportsStateOverride, overrideData) { + const opts = { + blockTag: 'latest', + from: DEPLOYLESS_SIMULATION_FROM, + mode: DeploylessMode.ProxyContract, + isEOA: !isSmartAccount(account) + }; + const deploylessOpts = getDeploylessOpts(account.addr, supportsStateOverride, opts); + const [factory, factoryCalldata] = getAccountDeployParams(account); + const simulationOps = [ + [isSmartAccount(account) ? op.nonce : BigInt(EOA_SIMULATION_NONCE), op.calls.map(callToTuple)] + ]; + const fast = gasPrices.find((gas) => gas.name === 'fast'); + if (!fast) + return { tokens: [], nfts: [] }; + const gasPrice = 'gasPrice' in fast ? fast.gasPrice : fast.baseFeePerGas + fast.maxPriorityFeePerGas; + const params = getFunctionParams(account, op, accountState); + const results = await provider.send('debug_traceCall', [ + { + to: params.to, + value: toQuantity(params.value.toString()), + data: params.data, + from: params.from, + gasPrice: toQuantity(gasPrice.toString()), + gas: toQuantity(gasUsed.toString()) + }, + 'latest', + { + tracer: `{ + discovered: [], + fault: function (log) {}, + step: function (log) { + const found = this.discovered.map(ob => ob.address) + if (log.contract && log.contract.getAddress() && found.indexOf(toHex(log.contract.getAddress())) === -1) { + this.discovered.push({ + erc: 20, + address: toHex(log.contract.getAddress()) + }) + } + if (log.op.toString() === 'LOG4') { + this.discovered.push({ + erc: 721, + address: toHex(log.contract.getAddress()), + tokenId: '0x' + log.stack.peek(5).toString(16) + }) + } + }, + result: function () { + return this.discovered + } + }`, + enableMemory: false, + enableReturnData: true, + disableStorage: true, + stateOverrides: supportsStateOverride + ? { + [params.from]: { + balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + }, + ...overrideData + } + : {} + } + ]); + const foundTokens = [ + ...new Set(results.filter((i) => i?.erc === 20).map((i) => getAddress(i.address))) + ]; + const foundNftTransfersObject = results + .filter((i) => i?.erc === 721) + .reduce((res, i) => { + if (!res[i?.address]) + res[i?.address] = new Set(); + res[i.address].add(i.tokenId); + return res; + }, {}); + const foundNftTransfers = Object.entries(foundNftTransfersObject).map(([address, id]) => [getAddress(address), Array.from(id).map((i) => BigInt(i))]); + // we set the 3rd param to "true" as we don't need state override + const deploylessTokens = fromDescriptor(provider, BalanceGetter, true); + const deploylessNfts = fromDescriptor(provider, NFTGetter, true); + const getNftsPromise = deploylessNfts.call('simulateAndGetAllNFTs', [ + op.accountAddr, + account.associatedKeys, + foundNftTransfers.map(([address]) => address), + foundNftTransfers.map(([, x]) => x), + NFT_COLLECTION_LIMIT, + factory, + factoryCalldata, + simulationOps + ], deploylessOpts); + const [[tokensWithErr], [before, after, , , , deltaAddressesMapping]] = await Promise.all([ + deploylessTokens.call('getBalances', [op.accountAddr, foundTokens], opts), + getNftsPromise + ]); + const beforeNftCollections = before[0]; + const afterNftCollections = after[0]; + return { + tokens: foundTokens.filter((addr, i) => tokensWithErr[i].error === '0x'), + nfts: foundNftTransfers.filter((nft, i) => { + if (beforeNftCollections[i][3] === '0x') + return true; + const foundAfterToken = afterNftCollections.find((t, j) => deltaAddressesMapping[j].toLowerCase() === foundNftTransfers[i][0].toLowerCase()); + if (!foundAfterToken || !foundAfterToken[0]) + return false; + return foundAfterToken[0][3] === '0x'; + }) + }; +} +//# sourceMappingURL=debugTraceCall.js.map \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.js.map b/dist/src/libs/tracer/debugTraceCall.js.map new file mode 100644 index 000000000..3bac861be --- /dev/null +++ b/dist/src/libs/tracer/debugTraceCall.js.map @@ -0,0 +1 @@ +{"version":3,"file":"debugTraceCall.js","sourceRoot":"","sources":["../../../../src/libs/tracer/debugTraceCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, JsonRpcProvider, toQuantity } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { getAccountDeployParams, getSpoof, isSmartAccount } from '../account/account'\nimport { AccountOp, callToTuple, getSignableCalls } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { GasRecommendation } from '../gasPrice/gasPrice'\nimport { getDeploylessOpts } from '../portfolio/getOnchainBalances'\n\nconst NFT_COLLECTION_LIMIT = 100\n// if using EOA, use the first and only call of the account op\n// if it's SA, make the data execute or deployAndExecute,\n// set the spoof+addr and pass all the calls\nfunction getFunctionParams(account: Account, op: AccountOp, accountState: AccountOnchainState) {\n if (!account.creation) {\n const call = op.calls[0]\n return {\n to: call.to,\n value: toQuantity(call.value.toString()),\n data: call.data,\n from: op.accountAddr\n }\n }\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n return {\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData\n }\n}\n\nexport async function debugTraceCall(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider,\n accountState: AccountOnchainState,\n gasUsed: bigint,\n gasPrices: GasRecommendation[],\n supportsStateOverride: boolean,\n overrideData?: any\n): Promise<{ tokens: string[]; nfts: [string, bigint[]][] }> {\n const opts = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n mode: DeploylessMode.ProxyContract,\n isEOA: !isSmartAccount(account)\n }\n const deploylessOpts = getDeploylessOpts(account.addr, supportsStateOverride, opts)\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const simulationOps = [\n [isSmartAccount(account) ? op.nonce : BigInt(EOA_SIMULATION_NONCE), op.calls.map(callToTuple)]\n ]\n const fast = gasPrices.find((gas: any) => gas.name === 'fast')\n if (!fast) return { tokens: [], nfts: [] }\n\n const gasPrice =\n 'gasPrice' in fast ? fast.gasPrice : fast.baseFeePerGas + fast.maxPriorityFeePerGas\n\n const params = getFunctionParams(account, op, accountState)\n const results: ({ erc: 20; address: string } | { erc: 721; address: string; tokenId: string })[] =\n await provider.send('debug_traceCall', [\n {\n to: params.to,\n value: toQuantity(params.value.toString()),\n data: params.data,\n from: params.from,\n gasPrice: toQuantity(gasPrice.toString()),\n gas: toQuantity(gasUsed.toString())\n },\n 'latest',\n {\n tracer: `{\n discovered: [],\n fault: function (log) {},\n step: function (log) {\n const found = this.discovered.map(ob => ob.address)\n if (log.contract && log.contract.getAddress() && found.indexOf(toHex(log.contract.getAddress())) === -1) {\n this.discovered.push({\n erc: 20,\n address: toHex(log.contract.getAddress())\n })\n }\n if (log.op.toString() === 'LOG4') {\n this.discovered.push({\n erc: 721,\n address: toHex(log.contract.getAddress()),\n tokenId: '0x' + log.stack.peek(5).toString(16)\n })\n }\n },\n result: function () {\n return this.discovered\n }\n }`,\n\n enableMemory: false,\n enableReturnData: true,\n disableStorage: true,\n stateOverrides: supportsStateOverride\n ? {\n [params.from]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n },\n ...overrideData\n }\n : {}\n }\n ])\n\n const foundTokens = [\n ...new Set(results.filter((i) => i?.erc === 20).map((i) => getAddress(i.address)))\n ]\n const foundNftTransfersObject = results\n .filter((i) => i?.erc === 721)\n .reduce((res: { [address: string]: Set }, i: any) => {\n if (!res[i?.address]) res[i?.address] = new Set()\n res[i.address].add(i.tokenId)\n return res\n }, {})\n const foundNftTransfers: [string, bigint[]][] = Object.entries(foundNftTransfersObject).map(\n ([address, id]) => [getAddress(address), Array.from(id).map((i) => BigInt(i))]\n )\n\n // we set the 3rd param to \"true\" as we don't need state override\n const deploylessTokens = fromDescriptor(provider, BalanceGetter, true)\n const deploylessNfts = fromDescriptor(provider, NFTGetter, true)\n\n const getNftsPromise = deploylessNfts.call(\n 'simulateAndGetAllNFTs',\n [\n op.accountAddr,\n account.associatedKeys,\n foundNftTransfers.map(([address]) => address),\n foundNftTransfers.map(([, x]) => x),\n NFT_COLLECTION_LIMIT,\n factory,\n factoryCalldata,\n simulationOps\n ],\n deploylessOpts\n )\n\n const [[tokensWithErr], [before, after, , , , deltaAddressesMapping]] = await Promise.all([\n deploylessTokens.call('getBalances', [op.accountAddr, foundTokens], opts),\n getNftsPromise\n ])\n\n const beforeNftCollections = before[0]\n const afterNftCollections = after[0]\n return {\n tokens: foundTokens.filter((addr, i) => tokensWithErr[i].error === '0x'),\n nfts: foundNftTransfers.filter((nft, i) => {\n if (beforeNftCollections[i][3] === '0x') return true\n const foundAfterToken = afterNftCollections.find(\n (t: any, j: number) =>\n deltaAddressesMapping[j].toLowerCase() === foundNftTransfers[i][0].toLowerCase()\n )\n if (!foundAfterToken || !foundAfterToken[0]) return false\n\n return foundAfterToken[0][3] === '0x'\n })\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.d.ts b/dist/src/libs/transfer/amount.d.ts new file mode 100644 index 000000000..fdd601874 --- /dev/null +++ b/dist/src/libs/transfer/amount.d.ts @@ -0,0 +1,7 @@ +/** + * Removes any extra decimals from the amount. + * @example getSanitizedAmount('1.123456', 2) => '1.12' + */ +declare const getSanitizedAmount: (amount: string, decimals: number) => string; +export { getSanitizedAmount }; +//# sourceMappingURL=amount.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.d.ts.map b/dist/src/libs/transfer/amount.d.ts.map new file mode 100644 index 000000000..b7f2f79a9 --- /dev/null +++ b/dist/src/libs/transfer/amount.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../../../../src/libs/transfer/amount.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,QAAA,MAAM,kBAAkB,WAAY,MAAM,YAAY,MAAM,KAAG,MAM9D,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.js b/dist/src/libs/transfer/amount.js new file mode 100644 index 000000000..7bb1a563c --- /dev/null +++ b/dist/src/libs/transfer/amount.js @@ -0,0 +1,12 @@ +/** + * Removes any extra decimals from the amount. + * @example getSanitizedAmount('1.123456', 2) => '1.12' + */ +const getSanitizedAmount = (amount, decimals) => { + const sanitizedAmount = amount.split('.'); + if (sanitizedAmount[1]) + sanitizedAmount[1] = sanitizedAmount[1].slice(0, decimals); + return sanitizedAmount.join('.'); +}; +export { getSanitizedAmount }; +//# sourceMappingURL=amount.js.map \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.js.map b/dist/src/libs/transfer/amount.js.map new file mode 100644 index 000000000..4238f65db --- /dev/null +++ b/dist/src/libs/transfer/amount.js.map @@ -0,0 +1 @@ +{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../src/libs/transfer/amount.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IACtE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEzC,IAAI,eAAe,CAAC,CAAC,CAAC;QAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAElF,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA","sourcesContent":["/**\n * Removes any extra decimals from the amount.\n * @example getSanitizedAmount('1.123456', 2) => '1.12'\n */\nconst getSanitizedAmount = (amount: string, decimals: number): string => {\n const sanitizedAmount = amount.split('.')\n\n if (sanitizedAmount[1]) sanitizedAmount[1] = sanitizedAmount[1].slice(0, decimals)\n\n return sanitizedAmount.join('.')\n}\n\nexport { getSanitizedAmount }\n"]} \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.d.ts b/dist/src/libs/transfer/userRequest.d.ts new file mode 100644 index 000000000..3f8f23bc1 --- /dev/null +++ b/dist/src/libs/transfer/userRequest.d.ts @@ -0,0 +1,21 @@ +import { SignUserRequest } from '../../interfaces/userRequest'; +import { AddrVestingData, ClaimableRewardsData, TokenResult } from '../portfolio'; +interface BuildUserRequestParams { + amount: string; + selectedToken: TokenResult; + selectedAccount: string; + recipientAddress: string; +} +declare function buildMintVestingRequest({ selectedAccount, selectedToken, addrVestingData }: { + selectedAccount: string; + selectedToken: TokenResult; + addrVestingData: AddrVestingData; +}): SignUserRequest; +declare function buildClaimWalletRequest({ selectedAccount, selectedToken, claimableRewardsData }: { + selectedAccount: string; + selectedToken: TokenResult; + claimableRewardsData: ClaimableRewardsData; +}): SignUserRequest; +declare function buildTransferUserRequest({ amount, selectedToken, selectedAccount, recipientAddress: _recipientAddress }: BuildUserRequestParams): SignUserRequest | null; +export { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }; +//# sourceMappingURL=userRequest.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.d.ts.map b/dist/src/libs/transfer/userRequest.d.ts.map new file mode 100644 index 000000000..7c8725af4 --- /dev/null +++ b/dist/src/libs/transfer/userRequest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"userRequest.d.ts","sourceRoot":"","sources":["../../../../src/libs/transfer/userRequest.ts"],"names":[],"mappings":"AAOA,OAAO,EAAS,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAMjF,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,WAAW,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,iBAAS,uBAAuB,CAAC,EAC/B,eAAe,EACf,aAAa,EACb,eAAe,EAChB,EAAE;IACD,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,WAAW,CAAA;IAC1B,eAAe,EAAE,eAAe,CAAA;CACjC,GAAG,eAAe,CAwBlB;AAED,iBAAS,uBAAuB,CAAC,EAC/B,eAAe,EACf,aAAa,EACb,oBAAoB,EACrB,EAAE;IACD,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,WAAW,CAAA;IAC1B,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C,GAAG,eAAe,CA2BlB;AAED,iBAAS,wBAAwB,CAAC,EAChC,MAAM,EACN,aAAa,EACb,eAAe,EACf,gBAAgB,EAAE,iBAAiB,EACpC,EAAE,sBAAsB,GAAG,eAAe,GAAG,IAAI,CAqFjD;AAED,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.js b/dist/src/libs/transfer/userRequest.js new file mode 100644 index 000000000..f0f2ed758 --- /dev/null +++ b/dist/src/libs/transfer/userRequest.js @@ -0,0 +1,141 @@ +import { Interface, parseUnits } from 'ethers'; +import IERC20 from '../../../contracts/compiled/IERC20.json'; +import WALLETSupplyControllerABI from '../../../contracts/compiled/WALLETSupplyController.json'; +import WETH from '../../../contracts/compiled/WETH.json'; +import { FEE_COLLECTOR, SUPPLY_CONTROLLER_ADDR, WALLET_STAKING_ADDR } from '../../consts/addresses'; +import { networks } from '../../consts/networks'; +import { getSanitizedAmount } from './amount'; +const ERC20 = new Interface(IERC20.abi); +const supplyControllerInterface = new Interface(WALLETSupplyControllerABI); +function buildMintVestingRequest({ selectedAccount, selectedToken, addrVestingData }) { + const txn = { + kind: 'calls', + calls: [ + { + to: SUPPLY_CONTROLLER_ADDR, + value: BigInt(0), + data: supplyControllerInterface.encodeFunctionData('mintVesting', [ + addrVestingData?.addr, + addrVestingData?.end, + addrVestingData?.rate + ]) + } + ] + }; + return { + id: new Date().getTime(), + action: txn, + meta: { + isSignAction: true, + networkId: selectedToken.networkId, + accountAddr: selectedAccount + } + }; +} +function buildClaimWalletRequest({ selectedAccount, selectedToken, claimableRewardsData }) { + const txn = { + kind: 'calls', + calls: [ + { + to: SUPPLY_CONTROLLER_ADDR, + value: BigInt(0), + data: supplyControllerInterface.encodeFunctionData('claimWithRootUpdate', [ + claimableRewardsData?.totalClaimable, + claimableRewardsData?.proof, + 0, + WALLET_STAKING_ADDR, + claimableRewardsData?.root, + claimableRewardsData?.signedRoot + ]) + } + ] + }; + return { + id: new Date().getTime(), + action: txn, + meta: { + isSignAction: true, + networkId: selectedToken.networkId, + accountAddr: selectedAccount + } + }; +} +function buildTransferUserRequest({ amount, selectedToken, selectedAccount, recipientAddress: _recipientAddress }) { + if (!selectedToken || !selectedAccount || !_recipientAddress) + return null; + // if the request is a top up, the recipient is the relayer + const recipientAddress = _recipientAddress?.toLowerCase(); + const sanitizedAmount = getSanitizedAmount(amount, selectedToken.decimals); + const bigNumberHexAmount = `0x${parseUnits(sanitizedAmount, Number(selectedToken.decimals)).toString(16)}`; + // if the top up is a native one, we should wrap the native before sending it + // as otherwise a Transfer event is not emitted and the top up will not be + // recorded + const isNativeTopUp = Number(selectedToken.address) === 0 && + recipientAddress.toLowerCase() === FEE_COLLECTOR.toLowerCase(); + if (isNativeTopUp) { + // if not predefined network, we cannot make a native top up + const network = networks.find((net) => net.id === selectedToken.networkId); + if (!network) + return null; + // if a wrapped addr is not specified, we cannot make a native top up + const wrappedAddr = network.wrappedAddr; + if (!wrappedAddr) + return null; + const wrapped = new Interface(WETH); + const deposit = wrapped.encodeFunctionData('deposit'); + const calls = { + kind: 'calls', + calls: [ + { + to: wrappedAddr, + value: BigInt(bigNumberHexAmount), + data: deposit + }, + { + to: wrappedAddr, + value: BigInt(0), + data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount]) + } + ] + }; + return { + id: new Date().getTime(), + action: calls, + meta: { + isSignAction: true, + networkId: selectedToken.networkId, + accountAddr: selectedAccount + } + }; + } + const txn = { + kind: 'calls', + calls: [ + { + to: selectedToken.address, + value: BigInt(0), + data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount]) + } + ] + }; + if (Number(selectedToken.address) === 0) { + txn.calls = [ + { + to: recipientAddress, + value: BigInt(bigNumberHexAmount), + data: '0x' + } + ]; + } + return { + id: new Date().getTime(), + action: txn, + meta: { + isSignAction: true, + networkId: selectedToken.networkId, + accountAddr: selectedAccount + } + }; +} +export { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }; +//# sourceMappingURL=userRequest.js.map \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.js.map b/dist/src/libs/transfer/userRequest.js.map new file mode 100644 index 000000000..73d29038b --- /dev/null +++ b/dist/src/libs/transfer/userRequest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../../src/libs/transfer/userRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, parseUnits } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport WALLETSupplyControllerABI from '../../../contracts/compiled/WALLETSupplyController.json'\nimport WETH from '../../../contracts/compiled/WETH.json'\nimport { FEE_COLLECTOR, SUPPLY_CONTROLLER_ADDR, WALLET_STAKING_ADDR } from '../../consts/addresses'\nimport { networks } from '../../consts/networks'\nimport { Calls, SignUserRequest } from '../../interfaces/userRequest'\nimport { AddrVestingData, ClaimableRewardsData, TokenResult } from '../portfolio'\nimport { getSanitizedAmount } from './amount'\n\nconst ERC20 = new Interface(IERC20.abi)\nconst supplyControllerInterface = new Interface(WALLETSupplyControllerABI)\n\ninterface BuildUserRequestParams {\n amount: string\n selectedToken: TokenResult\n selectedAccount: string\n recipientAddress: string\n}\n\nfunction buildMintVestingRequest({\n selectedAccount,\n selectedToken,\n addrVestingData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n addrVestingData: AddrVestingData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('mintVesting', [\n addrVestingData?.addr,\n addrVestingData?.end,\n addrVestingData?.rate\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildClaimWalletRequest({\n selectedAccount,\n selectedToken,\n claimableRewardsData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n claimableRewardsData: ClaimableRewardsData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('claimWithRootUpdate', [\n claimableRewardsData?.totalClaimable,\n claimableRewardsData?.proof,\n 0, // penalty bps, at the moment we run with 0; it's a safety feature to hardcode it\n WALLET_STAKING_ADDR, // staking pool addr\n claimableRewardsData?.root,\n claimableRewardsData?.signedRoot\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildTransferUserRequest({\n amount,\n selectedToken,\n selectedAccount,\n recipientAddress: _recipientAddress\n}: BuildUserRequestParams): SignUserRequest | null {\n if (!selectedToken || !selectedAccount || !_recipientAddress) return null\n\n // if the request is a top up, the recipient is the relayer\n const recipientAddress = _recipientAddress?.toLowerCase()\n const sanitizedAmount = getSanitizedAmount(amount, selectedToken.decimals)\n\n const bigNumberHexAmount = `0x${parseUnits(\n sanitizedAmount,\n Number(selectedToken.decimals)\n ).toString(16)}`\n\n // if the top up is a native one, we should wrap the native before sending it\n // as otherwise a Transfer event is not emitted and the top up will not be\n // recorded\n const isNativeTopUp =\n Number(selectedToken.address) === 0 &&\n recipientAddress.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n if (isNativeTopUp) {\n // if not predefined network, we cannot make a native top up\n const network = networks.find((net) => net.id === selectedToken.networkId)\n if (!network) return null\n\n // if a wrapped addr is not specified, we cannot make a native top up\n const wrappedAddr = network.wrappedAddr\n if (!wrappedAddr) return null\n\n const wrapped = new Interface(WETH)\n const deposit = wrapped.encodeFunctionData('deposit')\n const calls: Calls = {\n kind: 'calls' as const,\n calls: [\n {\n to: wrappedAddr,\n value: BigInt(bigNumberHexAmount),\n data: deposit\n },\n {\n to: wrappedAddr,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: calls,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n }\n\n const txn = {\n kind: 'calls' as const,\n calls: [\n {\n to: selectedToken.address,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n\n if (Number(selectedToken.address) === 0) {\n txn.calls = [\n {\n to: recipientAddress,\n value: BigInt(bigNumberHexAmount),\n data: '0x'\n }\n ]\n }\n\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nexport { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }\n"]} \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.d.ts b/dist/src/libs/trezor/trezor.d.ts new file mode 100644 index 000000000..885340c64 --- /dev/null +++ b/dist/src/libs/trezor/trezor.d.ts @@ -0,0 +1,13 @@ +/** + * Used to "translate" error codes returned by the Trezor device into a + * human-readable messages. Although there is a message incoming from Trezor, + * it's not self-explanatory and can be difficult for the end users to understand. + */ +export declare const getMessageFromTrezorErrorCode: (errorCode?: string, errorMsg?: string) => string; +/** + * Used to "translate" errors thrown by the Trezor device into a human-readable + * messages. Some of them are not self-explanatory and can be difficult for the + * end users to understand. + */ +export declare const normalizeTrezorMessage: (error?: string) => string; +//# sourceMappingURL=trezor.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.d.ts.map b/dist/src/libs/trezor/trezor.d.ts.map new file mode 100644 index 000000000..dac7f0d55 --- /dev/null +++ b/dist/src/libs/trezor/trezor.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"trezor.d.ts","sourceRoot":"","sources":["../../../../src/libs/trezor/trezor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,eAAgB,MAAM,aAAa,MAAM,KAAG,MAerF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,WAAY,MAAM,KAAG,MAMvD,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.js b/dist/src/libs/trezor/trezor.js new file mode 100644 index 000000000..b40a93998 --- /dev/null +++ b/dist/src/libs/trezor/trezor.js @@ -0,0 +1,29 @@ +/** + * Used to "translate" error codes returned by the Trezor device into a + * human-readable messages. Although there is a message incoming from Trezor, + * it's not self-explanatory and can be difficult for the end users to understand. + */ +export const getMessageFromTrezorErrorCode = (errorCode, errorMsg) => { + if (!errorCode && !errorMsg) + return 'Could not connect to your Trezor device. Please try again.'; + if (errorCode === 'Method_Interrupted') + return 'Closing the Trezor popup interrupted the connection.'; + if (errorCode === 'Failure_ActionCancelled') + return 'Rejected by your Trezor device.'; + if (errorMsg?.toLowerCase()?.includes('device disconnected during action') || + errorCode === 'Device_Disconnected') + return 'Trezor device got disconnected.'; + return `${errorMsg} (${errorCode ?? 'no error code incoming'})`; +}; +/** + * Used to "translate" errors thrown by the Trezor device into a human-readable + * messages. Some of them are not self-explanatory and can be difficult for the + * end users to understand. + */ +export const normalizeTrezorMessage = (error) => { + if (!error || error?.includes('handshake failed')) { + return 'Could not connect to your Trezor device. Please try again.'; + } + return error; +}; +//# sourceMappingURL=trezor.js.map \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.js.map b/dist/src/libs/trezor/trezor.js.map new file mode 100644 index 000000000..9e23e673e --- /dev/null +++ b/dist/src/libs/trezor/trezor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"trezor.js","sourceRoot":"","sources":["../../../../src/libs/trezor/trezor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAkB,EAAE,QAAiB,EAAU,EAAE;IAC7F,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,4DAA4D,CAAA;IAEhG,IAAI,SAAS,KAAK,oBAAoB;QACpC,OAAO,sDAAsD,CAAA;IAE/D,IAAI,SAAS,KAAK,yBAAyB;QAAE,OAAO,iCAAiC,CAAA;IAErF,IACE,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,mCAAmC,CAAC;QACtE,SAAS,KAAK,qBAAqB;QAEnC,OAAO,iCAAiC,CAAA;IAE1C,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,wBAAwB,GAAG,CAAA;AACjE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QACjD,OAAO,4DAA4D,CAAA;KACpE;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["/**\n * Used to \"translate\" error codes returned by the Trezor device into a\n * human-readable messages. Although there is a message incoming from Trezor,\n * it's not self-explanatory and can be difficult for the end users to understand.\n */\nexport const getMessageFromTrezorErrorCode = (errorCode?: string, errorMsg?: string): string => {\n if (!errorCode && !errorMsg) return 'Could not connect to your Trezor device. Please try again.'\n\n if (errorCode === 'Method_Interrupted')\n return 'Closing the Trezor popup interrupted the connection.'\n\n if (errorCode === 'Failure_ActionCancelled') return 'Rejected by your Trezor device.'\n\n if (\n errorMsg?.toLowerCase()?.includes('device disconnected during action') ||\n errorCode === 'Device_Disconnected'\n )\n return 'Trezor device got disconnected.'\n\n return `${errorMsg} (${errorCode ?? 'no error code incoming'})`\n}\n\n/**\n * Used to \"translate\" errors thrown by the Trezor device into a human-readable\n * messages. Some of them are not self-explanatory and can be difficult for the\n * end users to understand.\n */\nexport const normalizeTrezorMessage = (error?: string): string => {\n if (!error || error?.includes('handshake failed')) {\n return 'Could not connect to your Trezor device. Please try again.'\n }\n\n return error\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/userOperation/types.d.ts b/dist/src/libs/userOperation/types.d.ts new file mode 100644 index 000000000..6055381ed --- /dev/null +++ b/dist/src/libs/userOperation/types.d.ts @@ -0,0 +1,28 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Call } from '../accountOp/types'; +export type UserOpRequestType = 'standard' | 'activator' | 'recovery'; +export interface UserOperation { + sender: string; + nonce: string; + factory?: string; + factoryData?: string; + callData: string; + callGasLimit: string; + verificationGasLimit: string; + preVerificationGas: string; + maxFeePerGas: string; + maxPriorityFeePerGas: string; + paymaster?: string; + paymasterVerificationGasLimit?: string; + paymasterPostOpGasLimit?: string; + paymasterData?: string; + signature: string; + requestType: UserOpRequestType; + activatorCall?: Call; + bundler: BUNDLER; +} +export interface UserOperationEventData { + nonce: Number; + success: boolean; +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/types.d.ts.map b/dist/src/libs/userOperation/types.d.ts.map new file mode 100644 index 000000000..1469a2f7b --- /dev/null +++ b/dist/src/libs/userOperation/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/userOperation/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAA;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IAEjB,WAAW,EAAE,iBAAiB,CAAA;IAC9B,aAAa,CAAC,EAAE,IAAI,CAAA;IAGpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB"} \ No newline at end of file diff --git a/dist/src/libs/userOperation/types.js b/dist/src/libs/userOperation/types.js new file mode 100644 index 000000000..718fd38ae --- /dev/null +++ b/dist/src/libs/userOperation/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/types.js.map b/dist/src/libs/userOperation/types.js.map new file mode 100644 index 000000000..ff1fbdacd --- /dev/null +++ b/dist/src/libs/userOperation/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/types.ts"],"names":[],"mappings":"","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Call } from '../accountOp/types'\n\nexport type UserOpRequestType = 'standard' | 'activator' | 'recovery'\n\nexport interface UserOperation {\n sender: string\n nonce: string\n factory?: string // hex string\n factoryData?: string // hex string\n callData: string // hex string\n callGasLimit: string\n verificationGasLimit: string\n preVerificationGas: string\n maxFeePerGas: string\n maxPriorityFeePerGas: string\n paymaster?: string // hex string\n paymasterVerificationGasLimit?: string\n paymasterPostOpGasLimit?: string\n paymasterData?: string // hex string\n signature: string // hex string\n // https://github.com/AmbireTech/ambire-app/wiki/Ambire-Flows-(wrap,-sign,-payment,-broadcast)#erc-4337-edge-case\n requestType: UserOpRequestType\n activatorCall?: Call\n // which bundler is responsible for submitting and fetching info\n // about this userOp\n bundler: BUNDLER\n}\n\nexport interface UserOperationEventData {\n nonce: Number\n success: boolean\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.d.ts b/dist/src/libs/userOperation/userOperation.d.ts new file mode 100644 index 000000000..fde8a9e82 --- /dev/null +++ b/dist/src/libs/userOperation/userOperation.d.ts @@ -0,0 +1,56 @@ +import { Log } from 'ethers'; +import { Network } from 'interfaces/network'; +import { BUNDLER } from '../../consts/bundlers'; +import { Account, AccountId, AccountOnchainState } from '../../interfaces/account'; +import { AccountOp } from '../accountOp/accountOp'; +import { UserOperation, UserOperationEventData, UserOpRequestType } from './types'; +export declare function calculateCallDataCost(callData: string): bigint; +export declare function getPaymasterSpoof(): string; +export declare function getSigForCalculations(): string; +export declare function getActivatorCall(addr: AccountId): { + to: string; + value: bigint; + data: string; +}; +/** + * When we use abi.encode or send the user operation to the bundler, + * we need to strip it of the specific ambire-common properties that we use + * + * @param UserOperation userOp + * @returns EntryPoint userOp + */ +export declare function getCleanUserOp(userOp: UserOperation): { + sender: string; + nonce: string; + factory?: string | undefined; + factoryData?: string | undefined; + callData: string; + callGasLimit: string; + verificationGasLimit: string; + preVerificationGas: string; + maxFeePerGas: string; + maxPriorityFeePerGas: string; + paymaster?: string | undefined; + paymasterVerificationGasLimit?: string | undefined; + paymasterPostOpGasLimit?: string | undefined; + paymasterData?: string | undefined; + signature: string; +}[]; +/** + * Get the nonce we're expecting in validateUserOp + * when we're going through the activation | recovery + * + * @param UserOperation userOperation + * @returns hex string + */ +export declare function getOneTimeNonce(userOperation: UserOperation): string; +export declare function getRequestType(accountState: AccountOnchainState): UserOpRequestType; +export declare function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean; +export declare function getUserOperation(account: Account, accountState: AccountOnchainState, accountOp: AccountOp, bundler: BUNDLER, entryPointSig?: string): UserOperation; +export declare function isErc4337Broadcast(acc: Account, network: Network, accountState: AccountOnchainState): boolean; +export declare function shouldIncludeActivatorCall(network: Network, account: Account, accountState: AccountOnchainState, is4337Broadcast?: boolean): boolean | null; +export declare function shouldAskForEntryPointAuthorization(network: Network, account: Account, accountState: AccountOnchainState, alreadySigned: boolean): boolean | null; +export declare const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = "ENTRY_POINT_AUTHORIZATION_REQUEST_ID"; +export declare function getUserOpHash(userOp: UserOperation, chainId: bigint): string; +export declare const parseLogs: (logs: readonly Log[], userOpHash: string, userOpsLength?: number) => UserOperationEventData | null; +//# sourceMappingURL=userOperation.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.d.ts.map b/dist/src/libs/userOperation/userOperation.d.ts.map new file mode 100644 index 000000000..6f2814f73 --- /dev/null +++ b/dist/src/libs/userOperation/userOperation.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"userOperation.d.ts","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+D,GAAG,EAAW,MAAM,QAAQ,CAAA;AAClG,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAS/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAElF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAgB,iBAAiB,WAKhC;AAED,wBAAgB,qBAAqB,WAEpC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS;;;;EAW/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;IAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,aAAa,UAqC3D;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,mBAAmB,GAAG,iBAAiB,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAEhF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,CAmCf;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAgBT;AAID,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,eAAe,UAAO,kBAUvB;AAMD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,OAAO,kBAYvB;AAED,eAAO,MAAM,oCAAoC,yCAAyC,CAAA;AAE1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAuCnE;AAID,eAAO,MAAM,SAAS,SACd,SAAS,GAAG,EAAE,cACR,MAAM,kBACF,MAAM,KACrB,sBAAsB,GAAG,IA0B3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.js b/dist/src/libs/userOperation/userOperation.js new file mode 100644 index 000000000..01a033c58 --- /dev/null +++ b/dist/src/libs/userOperation/userOperation.js @@ -0,0 +1,225 @@ +import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, toBeHex } from 'ethers'; +import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; +import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; +import { AMBIRE_ACCOUNT_FACTORY, AMBIRE_PAYMASTER, AMBIRE_PAYMASTER_SIGNER, ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +import { SPOOF_SIGTYPE } from '../../consts/signatures'; +import { callToTuple } from '../accountOp/accountOp'; +export function calculateCallDataCost(callData) { + if (callData === '0x') + return 0n; + const bytes = Buffer.from(callData.substring(2)); + const nonZeroBytes = BigInt(bytes.filter((b) => b).length); + const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes); + return zeroBytes * 4n + nonZeroBytes * 16n; +} +export function getPaymasterSpoof() { + const abiCoder = new AbiCoder(); + const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE; + const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig]); + return hexlify(concat([AMBIRE_PAYMASTER, simulationData])); +} +export function getSigForCalculations() { + return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'; +} +// get the call to give privileges to the entry point +export function getActivatorCall(addr) { + const saAbi = new Interface(AmbireAccount.abi); + const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [ + ERC_4337_ENTRYPOINT, + ENTRY_POINT_MARKER + ]); + return { + to: addr, + value: 0n, + data: givePermsToEntryPointData + }; +} +/** + * When we use abi.encode or send the user operation to the bundler, + * we need to strip it of the specific ambire-common properties that we use + * + * @param UserOperation userOp + * @returns EntryPoint userOp + */ +export function getCleanUserOp(userOp) { + return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]; +} +/** + * Get the nonce we're expecting in validateUserOp + * when we're going through the activation | recovery + * + * @param UserOperation userOperation + * @returns hex string + */ +export function getOneTimeNonce(userOperation) { + if (!userOperation.paymaster || + !userOperation.paymasterVerificationGasLimit || + !userOperation.paymasterPostOpGasLimit || + !userOperation.paymasterData) { + throw new Error('One time nonce could not be encoded because paymaster data is missing'); + } + const abiCoder = new AbiCoder(); + return `0x${keccak256(abiCoder.encode(['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'], [ + userOperation.factory && userOperation.factoryData + ? concat([userOperation.factory, userOperation.factoryData]) + : '0x', + userOperation.callData, + concat([ + toBeHex(userOperation.verificationGasLimit, 16), + toBeHex(userOperation.callGasLimit, 16) + ]), + userOperation.preVerificationGas, + concat([ + toBeHex(userOperation.maxPriorityFeePerGas, 16), + toBeHex(userOperation.maxFeePerGas, 16) + ]), + concat([ + userOperation.paymaster, + toBeHex(userOperation.paymasterVerificationGasLimit, 16), + toBeHex(userOperation.paymasterPostOpGasLimit, 16), + userOperation.paymasterData + ]) + ])).substring(18)}${toBeHex(0, 8).substring(2)}`; +} +export function getRequestType(accountState) { + return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'; +} +export function shouldUseOneTimeNonce(accountState) { + return getRequestType(accountState) !== 'standard'; +} +export function getUserOperation(account, accountState, accountOp, bundler, entryPointSig) { + const userOp = { + sender: accountOp.accountAddr, + nonce: toBeHex(accountState.erc4337Nonce), + callData: '0x', + callGasLimit: toBeHex(0), + verificationGasLimit: toBeHex(0), + preVerificationGas: toBeHex(0), + maxFeePerGas: toBeHex(1), + maxPriorityFeePerGas: toBeHex(1), + signature: '0x', + requestType: getRequestType(accountState), + bundler + }; + // if the account is not deployed, prepare the deploy in the initCode + if (!accountState.isDeployed) { + if (!account.creation) + throw new Error('Account creation properties are missing'); + if (!entryPointSig) + throw new Error('No entry point authorization signature provided'); + const factoryInterface = new Interface(AmbireFactory.abi); + userOp.factory = account.creation.factoryAddr; + userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [ + account.creation.bytecode, + account.creation.salt, + [callToTuple(getActivatorCall(accountOp.accountAddr))], + entryPointSig + ]); + } + // if the request type is activator, add the activator call + if (userOp.requestType === 'activator') + userOp.activatorCall = getActivatorCall(accountOp.accountAddr); + return userOp; +} +export function isErc4337Broadcast(acc, network, accountState) { + // a special exception for gnosis which was a hardcoded chain but + // now it's not. The bundler doesn't support state override on gnosis + // so if the account IS deployed AND does NOT have 4337 privileges, + // it won't be able to use the edge case as the bundler will block + // the estimation. That's why we will use the relayer in this case + const canBroadcast4337 = network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed; + return (canBroadcast4337 && + network.erc4337.enabled && + accountState.isV2 && + !!acc.creation && + getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY); +} +// for special cases where we broadcast a 4337 operation with an EOA, +// add the activator call so the use has the entry point attached +export function shouldIncludeActivatorCall(network, account, accountState, is4337Broadcast = true) { + return (account.creation && + account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY && + accountState.isV2 && + network.erc4337.enabled && + !accountState.isErc4337Enabled && + (accountState.isDeployed || !is4337Broadcast)); +} +// if the account is v2 and the network is 4337 and the account hasn't +// authorized the entry point, he should be asked to do so +// +// addition: if the account is the 0.7.0 one +export function shouldAskForEntryPointAuthorization(network, account, accountState, alreadySigned) { + if (alreadySigned) + return false; + return (account.creation && + account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY && + accountState.isV2 && + !accountState.isDeployed && + network.erc4337.enabled && + !accountState.isErc4337Enabled); +} +export const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'; +export function getUserOpHash(userOp, chainId) { + const abiCoder = new AbiCoder(); + const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData]) : '0x'; + const hashInitCode = keccak256(initCode); + const hashCallData = keccak256(userOp.callData); + const accountGasLimits = concat([ + toBeHex(userOp.verificationGasLimit.toString(), 16), + toBeHex(userOp.callGasLimit.toString(), 16) + ]); + const gasFees = concat([ + toBeHex(userOp.maxPriorityFeePerGas.toString(), 16), + toBeHex(userOp.maxFeePerGas.toString(), 16) + ]); + const paymasterAndData = userOp.paymaster + ? concat([ + userOp.paymaster, + toBeHex(userOp.paymasterVerificationGasLimit.toString(), 16), + toBeHex(userOp.paymasterPostOpGasLimit.toString(), 16), + userOp.paymasterData + ]) + : '0x'; + const hashPaymasterAndData = keccak256(paymasterAndData); + const packed = abiCoder.encode(['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'], [ + userOp.sender, + userOp.nonce, + hashInitCode, + hashCallData, + accountGasLimits, + userOp.preVerificationGas, + gasFees, + hashPaymasterAndData + ]); + const packedHash = keccak256(packed); + return keccak256(abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])); +} +// try to parse the UserOperationEvent to understand whether +// the user op is a success or a failure +export const parseLogs = (logs, userOpHash, userOpsLength // benzina only +) => { + if (userOpHash === '' && userOpsLength !== 1) + return null; + let userOpLog = null; + logs.forEach((log) => { + try { + if (log.topics.length === 4 && + (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)) { + // decode data for UserOperationEvent: + // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)' + const coder = new AbiCoder(); + userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data); + } + } + catch (e) { + /* silence is bitcoin */ + } + }); + if (!userOpLog) + return null; + return { + nonce: userOpLog[0], + success: userOpLog[1] + }; +}; +//# sourceMappingURL=userOperation.js.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.js.map b/dist/src/libs/userOperation/userOperation.js.map new file mode 100644 index 000000000..749d5bfe1 --- /dev/null +++ b/dist/src/libs/userOperation/userOperation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"userOperation.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers'\nimport { Network } from 'interfaces/network'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { BUNDLER } from '../../consts/bundlers'\nimport {\n AMBIRE_ACCOUNT_FACTORY,\n AMBIRE_PAYMASTER,\n AMBIRE_PAYMASTER_SIGNER,\n ENTRY_POINT_MARKER,\n ERC_4337_ENTRYPOINT\n} from '../../consts/deploy'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport { Account, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { AccountOp, callToTuple } from '../accountOp/accountOp'\nimport { UserOperation, UserOperationEventData, UserOpRequestType } from './types'\n\nexport function calculateCallDataCost(callData: string): bigint {\n if (callData === '0x') return 0n\n const bytes = Buffer.from(callData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n return zeroBytes * 4n + nonZeroBytes * 16n\n}\n\nexport function getPaymasterSpoof() {\n const abiCoder = new AbiCoder()\n const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE\n const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig])\n return hexlify(concat([AMBIRE_PAYMASTER, simulationData]))\n}\n\nexport function getSigForCalculations() {\n return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n}\n\n// get the call to give privileges to the entry point\nexport function getActivatorCall(addr: AccountId) {\n const saAbi = new Interface(AmbireAccount.abi)\n const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [\n ERC_4337_ENTRYPOINT,\n ENTRY_POINT_MARKER\n ])\n return {\n to: addr,\n value: 0n,\n data: givePermsToEntryPointData\n }\n}\n\n/**\n * When we use abi.encode or send the user operation to the bundler,\n * we need to strip it of the specific ambire-common properties that we use\n *\n * @param UserOperation userOp\n * @returns EntryPoint userOp\n */\nexport function getCleanUserOp(userOp: UserOperation) {\n return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]\n}\n\n/**\n * Get the nonce we're expecting in validateUserOp\n * when we're going through the activation | recovery\n *\n * @param UserOperation userOperation\n * @returns hex string\n */\nexport function getOneTimeNonce(userOperation: UserOperation) {\n if (\n !userOperation.paymaster ||\n !userOperation.paymasterVerificationGasLimit ||\n !userOperation.paymasterPostOpGasLimit ||\n !userOperation.paymasterData\n ) {\n throw new Error('One time nonce could not be encoded because paymaster data is missing')\n }\n\n const abiCoder = new AbiCoder()\n return `0x${keccak256(\n abiCoder.encode(\n ['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'],\n [\n userOperation.factory && userOperation.factoryData\n ? concat([userOperation.factory, userOperation.factoryData])\n : '0x',\n userOperation.callData,\n concat([\n toBeHex(userOperation.verificationGasLimit, 16),\n toBeHex(userOperation.callGasLimit, 16)\n ]),\n userOperation.preVerificationGas,\n concat([\n toBeHex(userOperation.maxPriorityFeePerGas, 16),\n toBeHex(userOperation.maxFeePerGas, 16)\n ]),\n concat([\n userOperation.paymaster,\n toBeHex(userOperation.paymasterVerificationGasLimit, 16),\n toBeHex(userOperation.paymasterPostOpGasLimit, 16),\n userOperation.paymasterData\n ])\n ]\n )\n ).substring(18)}${toBeHex(0, 8).substring(2)}`\n}\n\nexport function getRequestType(accountState: AccountOnchainState): UserOpRequestType {\n return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'\n}\n\nexport function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean {\n return getRequestType(accountState) !== 'standard'\n}\n\nexport function getUserOperation(\n account: Account,\n accountState: AccountOnchainState,\n accountOp: AccountOp,\n bundler: BUNDLER,\n entryPointSig?: string\n): UserOperation {\n const userOp: UserOperation = {\n sender: accountOp.accountAddr,\n nonce: toBeHex(accountState.erc4337Nonce),\n callData: '0x',\n callGasLimit: toBeHex(0),\n verificationGasLimit: toBeHex(0),\n preVerificationGas: toBeHex(0),\n maxFeePerGas: toBeHex(1),\n maxPriorityFeePerGas: toBeHex(1),\n signature: '0x',\n requestType: getRequestType(accountState),\n bundler\n }\n\n // if the account is not deployed, prepare the deploy in the initCode\n if (!accountState.isDeployed) {\n if (!account.creation) throw new Error('Account creation properties are missing')\n if (!entryPointSig) throw new Error('No entry point authorization signature provided')\n\n const factoryInterface = new Interface(AmbireFactory.abi)\n userOp.factory = account.creation.factoryAddr\n userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n [callToTuple(getActivatorCall(accountOp.accountAddr))],\n entryPointSig\n ])\n }\n\n // if the request type is activator, add the activator call\n if (userOp.requestType === 'activator')\n userOp.activatorCall = getActivatorCall(accountOp.accountAddr)\n\n return userOp\n}\n\nexport function isErc4337Broadcast(\n acc: Account,\n network: Network,\n accountState: AccountOnchainState\n): boolean {\n // a special exception for gnosis which was a hardcoded chain but\n // now it's not. The bundler doesn't support state override on gnosis\n // so if the account IS deployed AND does NOT have 4337 privileges,\n // it won't be able to use the edge case as the bundler will block\n // the estimation. That's why we will use the relayer in this case\n const canBroadcast4337 =\n network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed\n\n return (\n canBroadcast4337 &&\n network.erc4337.enabled &&\n accountState.isV2 &&\n !!acc.creation &&\n getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n}\n\n// for special cases where we broadcast a 4337 operation with an EOA,\n// add the activator call so the use has the entry point attached\nexport function shouldIncludeActivatorCall(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n is4337Broadcast = true\n) {\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled &&\n (accountState.isDeployed || !is4337Broadcast)\n )\n}\n\n// if the account is v2 and the network is 4337 and the account hasn't\n// authorized the entry point, he should be asked to do so\n//\n// addition: if the account is the 0.7.0 one\nexport function shouldAskForEntryPointAuthorization(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n alreadySigned: boolean\n) {\n if (alreadySigned) return false\n\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n !accountState.isDeployed &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled\n )\n}\n\nexport const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'\n\nexport function getUserOpHash(userOp: UserOperation, chainId: bigint) {\n const abiCoder = new AbiCoder()\n const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData!]) : '0x'\n const hashInitCode = keccak256(initCode)\n const hashCallData = keccak256(userOp.callData)\n const accountGasLimits = concat([\n toBeHex(userOp.verificationGasLimit.toString(), 16),\n toBeHex(userOp.callGasLimit.toString(), 16)\n ])\n const gasFees = concat([\n toBeHex(userOp.maxPriorityFeePerGas.toString(), 16),\n toBeHex(userOp.maxFeePerGas.toString(), 16)\n ])\n const paymasterAndData = userOp.paymaster\n ? concat([\n userOp.paymaster,\n toBeHex(userOp.paymasterVerificationGasLimit!.toString(), 16),\n toBeHex(userOp.paymasterPostOpGasLimit!.toString(), 16),\n userOp.paymasterData!\n ])\n : '0x'\n const hashPaymasterAndData = keccak256(paymasterAndData)\n const packed = abiCoder.encode(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'],\n [\n userOp.sender,\n userOp.nonce,\n hashInitCode,\n hashCallData,\n accountGasLimits,\n userOp.preVerificationGas,\n gasFees,\n hashPaymasterAndData\n ]\n )\n const packedHash = keccak256(packed)\n return keccak256(\n abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])\n )\n}\n\n// try to parse the UserOperationEvent to understand whether\n// the user op is a success or a failure\nexport const parseLogs = (\n logs: readonly Log[],\n userOpHash: string,\n userOpsLength?: number // benzina only\n): UserOperationEventData | null => {\n if (userOpHash === '' && userOpsLength !== 1) return null\n\n let userOpLog = null\n logs.forEach((log: Log) => {\n try {\n if (\n log.topics.length === 4 &&\n (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)\n ) {\n // decode data for UserOperationEvent:\n // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n const coder = new AbiCoder()\n userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data)\n }\n } catch (e: any) {\n /* silence is bitcoin */\n }\n })\n\n if (!userOpLog) return null\n\n return {\n nonce: userOpLog[0],\n success: userOpLog[1]\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/address/address.d.ts b/dist/src/services/address/address.d.ts new file mode 100644 index 000000000..4ede72899 --- /dev/null +++ b/dist/src/services/address/address.d.ts @@ -0,0 +1,5 @@ +import { HumanizerInfoType } from '../../../v1/hooks/useConstants'; +declare const isValidAddress: (address: string) => boolean; +declare const isHumanizerKnownTokenOrSmartContract: (humanizerInfo: HumanizerInfoType, _address: string) => boolean; +export { isValidAddress, isHumanizerKnownTokenOrSmartContract }; +//# sourceMappingURL=address.d.ts.map \ No newline at end of file diff --git a/dist/src/services/address/address.d.ts.map b/dist/src/services/address/address.d.ts.map new file mode 100644 index 000000000..0340b6aaa --- /dev/null +++ b/dist/src/services/address/address.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../src/services/address/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGlE,QAAA,MAAM,cAAc,YAAa,MAAM,YAAwC,CAAA;AAE/E,QAAA,MAAM,oCAAoC,kBACzB,iBAAiB,YACtB,MAAM,YAajB,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,oCAAoC,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/services/address/address.js b/dist/src/services/address/address.js new file mode 100644 index 000000000..1f6ae52c7 --- /dev/null +++ b/dist/src/services/address/address.js @@ -0,0 +1,15 @@ +import { FEE_COLLECTOR } from '../../consts/addresses'; +const isValidAddress = (address) => /^0x[a-fA-F0-9]{40}$/.test(address); +const isHumanizerKnownTokenOrSmartContract = (humanizerInfo, _address) => { + const address = _address.toLowerCase(); // humanizer keys (addresses) are lowercase + // In order to humanize the fee collector as "Gas Tank", it is included in the + // "names" in the humanizer (all others are smart contract addresses). But the + // fee collector is not a smart contract (or token). It is an EOA. + if (address === FEE_COLLECTOR.toLowerCase()) + return false; + return (Object.keys(humanizerInfo.tokens).includes(address) || // token addresses + Object.keys(humanizerInfo.names).includes(address) // smart contract addresses + ); +}; +export { isValidAddress, isHumanizerKnownTokenOrSmartContract }; +//# sourceMappingURL=address.js.map \ No newline at end of file diff --git a/dist/src/services/address/address.js.map b/dist/src/services/address/address.js.map new file mode 100644 index 000000000..de710f433 --- /dev/null +++ b/dist/src/services/address/address.js.map @@ -0,0 +1 @@ +{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../../src/services/address/address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAE/E,MAAM,oCAAoC,GAAG,CAC3C,aAAgC,EAChC,QAAgB,EAChB,EAAE;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAC,2CAA2C;IAElF,8EAA8E;IAC9E,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,OAAO,KAAK,aAAa,CAAC,WAAW,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,kBAAkB;QACzE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,2BAA2B;KAC/E,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,oCAAoC,EAAE,CAAA","sourcesContent":["import { HumanizerInfoType } from '../../../v1/hooks/useConstants'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\n\nconst isValidAddress = (address: string) => /^0x[a-fA-F0-9]{40}$/.test(address)\n\nconst isHumanizerKnownTokenOrSmartContract = (\n humanizerInfo: HumanizerInfoType,\n _address: string\n) => {\n const address = _address.toLowerCase() // humanizer keys (addresses) are lowercase\n\n // In order to humanize the fee collector as \"Gas Tank\", it is included in the\n // \"names\" in the humanizer (all others are smart contract addresses). But the\n // fee collector is not a smart contract (or token). It is an EOA.\n if (address === FEE_COLLECTOR.toLowerCase()) return false\n\n return (\n Object.keys(humanizerInfo.tokens).includes(address) || // token addresses\n Object.keys(humanizerInfo.names).includes(address) // smart contract addresses\n )\n}\n\nexport { isValidAddress, isHumanizerKnownTokenOrSmartContract }\n"]} \ No newline at end of file diff --git a/dist/src/services/address/index.d.ts b/dist/src/services/address/index.d.ts new file mode 100644 index 000000000..feb67b540 --- /dev/null +++ b/dist/src/services/address/index.d.ts @@ -0,0 +1,2 @@ +export * from './address'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/address/index.d.ts.map b/dist/src/services/address/index.d.ts.map new file mode 100644 index 000000000..1959292a5 --- /dev/null +++ b/dist/src/services/address/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/address/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"} \ No newline at end of file diff --git a/dist/src/services/address/index.js b/dist/src/services/address/index.js new file mode 100644 index 000000000..1db1e7d56 --- /dev/null +++ b/dist/src/services/address/index.js @@ -0,0 +1,2 @@ +export * from './address'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/address/index.js.map b/dist/src/services/address/index.js.map new file mode 100644 index 000000000..29da07908 --- /dev/null +++ b/dist/src/services/address/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/address/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA","sourcesContent":["export * from './address'\n"]} \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.d.ts b/dist/src/services/assetInfo/assetInfo.d.ts new file mode 100644 index 000000000..68176fd4a --- /dev/null +++ b/dist/src/services/assetInfo/assetInfo.d.ts @@ -0,0 +1,15 @@ +import { Network } from '../../interfaces/network'; +export declare function executeBatchedFetch(network: Network): Promise; +/** + * Resolves symbol and decimals for tokens or name for nfts. + */ +export declare function resolveAssetInfo(address: string, network: Network, callback: (arg: { + tokenInfo?: { + decimals: number; + symbol: string; + }; + nftInfo?: { + name: string; + }; +}) => void): Promise; +//# sourceMappingURL=assetInfo.d.ts.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.d.ts.map b/dist/src/services/assetInfo/assetInfo.d.ts.map new file mode 100644 index 000000000..2ba4b7039 --- /dev/null +++ b/dist/src/services/assetInfo/assetInfo.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"assetInfo.d.ts","sourceRoot":"","sources":["../../../../src/services/assetInfo/assetInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAa,MAAM,0BAA0B,CAAA;AAW7D,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE;IACd,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3B,KAAK,IAAI,GACT,OAAO,CAAC,IAAI,CAAC,CAiBf"} \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.js b/dist/src/services/assetInfo/assetInfo.js new file mode 100644 index 000000000..758f126e9 --- /dev/null +++ b/dist/src/services/assetInfo/assetInfo.js @@ -0,0 +1,51 @@ +import { JsonRpcProvider } from 'ethers'; +import { Portfolio } from '../../libs/portfolio'; +const RANDOM_ADDRESS = '0x0000000000000000000000000000000000000001'; +const scheduledActions = {}; +export async function executeBatchedFetch(network) { + const provider = new JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0]); + const allAddresses = Array.from(new Set(scheduledActions[network.id]?.data.map((i) => i.address))) || []; + const portfolio = new Portfolio(fetch, provider, network); + const options = { + disableAutoDiscovery: true, + additionalErc20Hints: allAddresses, + additionalErc721Hints: Object.fromEntries(allAddresses.map((i) => [ + i, + { + tokens: ['1'], + isKnown: false + } + ])) + }; + const portfolioResponse = await portfolio.get(RANDOM_ADDRESS, options); + scheduledActions[network.id]?.data.forEach((i) => { + const tokenInfo = (i.address, + portfolioResponse.tokens.find((t) => t.address.toLocaleLowerCase() === i.address.toLowerCase())); + const nftInfo = (i.address, + portfolioResponse.collections.find((t) => t.address.toLocaleLowerCase() === i.address.toLowerCase())); + i.callback({ tokenInfo, nftInfo }); + }); +} +/** + * Resolves symbol and decimals for tokens or name for nfts. + */ +export async function resolveAssetInfo(address, network, callback) { + if (!scheduledActions[network.id]?.data?.length) { + scheduledActions[network.id] = { + promise: new Promise((resolve, reject) => { + setTimeout(async () => { + await executeBatchedFetch(network).catch(reject); + scheduledActions[network.id] = undefined; + resolve(0); + }, 500); + }), + data: [{ address, callback }] + }; + } + else { + scheduledActions[network.id]?.data.push({ address, callback }); + } + // we are returning a promise so we can await the full execution + return scheduledActions[network.id]?.promise; +} +//# sourceMappingURL=assetInfo.js.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.js.map b/dist/src/services/assetInfo/assetInfo.js.map new file mode 100644 index 000000000..7f97ee116 --- /dev/null +++ b/dist/src/services/assetInfo/assetInfo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assetInfo.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/assetInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { GetOptions, Portfolio } from '../../libs/portfolio'\n\nconst RANDOM_ADDRESS = '0x0000000000000000000000000000000000000001'\nconst scheduledActions: {\n [network in NetworkId]?: {\n promise: Promise\n data: { callback: Function; address: string }[]\n }\n} = {}\n\nexport async function executeBatchedFetch(network: Network): Promise {\n const provider = new JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0])\n const allAddresses =\n Array.from(new Set(scheduledActions[network.id]?.data.map((i) => i.address))) || []\n const portfolio = new Portfolio(fetch as any, provider, network)\n const options: Partial = {\n disableAutoDiscovery: true,\n additionalErc20Hints: allAddresses,\n additionalErc721Hints: Object.fromEntries(\n allAddresses.map((i) => [\n i,\n {\n tokens: ['1'],\n isKnown: false\n }\n ])\n )\n }\n const portfolioResponse = await portfolio.get(RANDOM_ADDRESS, options)\n\n scheduledActions[network.id]?.data.forEach((i) => {\n const tokenInfo =\n (i.address,\n portfolioResponse.tokens.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n const nftInfo =\n (i.address,\n portfolioResponse.collections.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n\n i.callback({ tokenInfo, nftInfo })\n })\n}\n\n/**\n * Resolves symbol and decimals for tokens or name for nfts.\n */\nexport async function resolveAssetInfo(\n address: string,\n network: Network,\n callback: (arg: {\n tokenInfo?: { decimals: number; symbol: string }\n nftInfo?: { name: string }\n }) => void\n): Promise {\n if (!scheduledActions[network.id]?.data?.length) {\n scheduledActions[network.id] = {\n promise: new Promise((resolve, reject) => {\n setTimeout(async () => {\n await executeBatchedFetch(network).catch(reject)\n scheduledActions[network.id] = undefined\n resolve(0)\n }, 500)\n }),\n data: [{ address, callback }]\n }\n } else {\n scheduledActions[network.id]?.data.push({ address, callback })\n }\n // we are returning a promise so we can await the full execution\n return scheduledActions[network.id]?.promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.d.ts b/dist/src/services/assetInfo/index.d.ts new file mode 100644 index 000000000..d31dc57ff --- /dev/null +++ b/dist/src/services/assetInfo/index.d.ts @@ -0,0 +1,2 @@ +export * from './assetInfo'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.d.ts.map b/dist/src/services/assetInfo/index.d.ts.map new file mode 100644 index 000000000..05f6e94f5 --- /dev/null +++ b/dist/src/services/assetInfo/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/assetInfo/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"} \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.js b/dist/src/services/assetInfo/index.js new file mode 100644 index 000000000..88a1baecb --- /dev/null +++ b/dist/src/services/assetInfo/index.js @@ -0,0 +1,2 @@ +export * from './assetInfo'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.js.map b/dist/src/services/assetInfo/index.js.map new file mode 100644 index 000000000..c12ceac20 --- /dev/null +++ b/dist/src/services/assetInfo/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA","sourcesContent":["export * from './assetInfo'\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.d.ts b/dist/src/services/bundlers/DevBundlerSwitcher.d.ts new file mode 100644 index 000000000..9dbd4d2d5 --- /dev/null +++ b/dist/src/services/bundlers/DevBundlerSwitcher.d.ts @@ -0,0 +1,12 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Network } from '../../interfaces/network'; +import { BundlerSwitcher } from './bundlerSwitcher'; +/** + * DANGER + * This class is made only for testing purposes where we forcefully + * set a broken bundler as the main one to test if fallback is working + */ +export declare class DevBundlerSwitcher extends BundlerSwitcher { + constructor(network: Network, getSignAccountOpStatus: Function, noStateUpdateStatuses: any[], usedBundlers?: BUNDLER[]); +} +//# sourceMappingURL=DevBundlerSwitcher.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.d.ts.map b/dist/src/services/bundlers/DevBundlerSwitcher.d.ts.map new file mode 100644 index 000000000..8fdd95a57 --- /dev/null +++ b/dist/src/services/bundlers/DevBundlerSwitcher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"DevBundlerSwitcher.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/DevBundlerSwitcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;gBAEnD,OAAO,EAAE,OAAO,EAChB,sBAAsB,EAAE,QAAQ,EAChC,qBAAqB,EAAE,GAAG,EAAE,EAC5B,YAAY,CAAC,EAAE,OAAO,EAAE;CAM3B"} \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.js b/dist/src/services/bundlers/DevBundlerSwitcher.js new file mode 100644 index 000000000..4760d62d0 --- /dev/null +++ b/dist/src/services/bundlers/DevBundlerSwitcher.js @@ -0,0 +1,16 @@ +import { BrokenBiconomyBroadcast } from './brokenBiconomyBroadcast'; +import { BundlerSwitcher } from './bundlerSwitcher'; +/** + * DANGER + * This class is made only for testing purposes where we forcefully + * set a broken bundler as the main one to test if fallback is working + */ +export class DevBundlerSwitcher extends BundlerSwitcher { + constructor(network, getSignAccountOpStatus, noStateUpdateStatuses, usedBundlers) { + super(network, getSignAccountOpStatus, noStateUpdateStatuses); + this.bundler = new BrokenBiconomyBroadcast(); + if (usedBundlers) + this.usedBundlers.push(...usedBundlers); + } +} +//# sourceMappingURL=DevBundlerSwitcher.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.js.map b/dist/src/services/bundlers/DevBundlerSwitcher.js.map new file mode 100644 index 000000000..f49da51f5 --- /dev/null +++ b/dist/src/services/bundlers/DevBundlerSwitcher.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DevBundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/DevBundlerSwitcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,YACE,OAAgB,EAChB,sBAAgC,EAChC,qBAA4B,EAC5B,YAAwB;QAExB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAA;QAC5C,IAAI,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAA;IAC3D,CAAC;CACF","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { BrokenBiconomyBroadcast } from './brokenBiconomyBroadcast'\nimport { BundlerSwitcher } from './bundlerSwitcher'\n\n/**\n * DANGER\n * This class is made only for testing purposes where we forcefully\n * set a broken bundler as the main one to test if fallback is working\n */\nexport class DevBundlerSwitcher extends BundlerSwitcher {\n constructor(\n network: Network,\n getSignAccountOpStatus: Function,\n noStateUpdateStatuses: any[],\n usedBundlers?: BUNDLER[]\n ) {\n super(network, getSignAccountOpStatus, noStateUpdateStatuses)\n this.bundler = new BrokenBiconomyBroadcast()\n if (usedBundlers) this.usedBundlers.push(...usedBundlers)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.d.ts b/dist/src/services/bundlers/biconomy.d.ts new file mode 100644 index 000000000..ff4d6d1e8 --- /dev/null +++ b/dist/src/services/bundlers/biconomy.d.ts @@ -0,0 +1,11 @@ +import { Network } from 'interfaces/network'; +import { BUNDLER } from '../../consts/bundlers'; +import { Bundler } from './bundler'; +import { GasSpeeds, UserOpStatus } from './types'; +export declare class Biconomy extends Bundler { + protected getUrl(network: Network): string; + protected getGasPrice(network: Network): Promise; + getStatus(network: Network, userOpHash: string): Promise; + getName(): BUNDLER; +} +//# sourceMappingURL=biconomy.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.d.ts.map b/dist/src/services/bundlers/biconomy.d.ts.map new file mode 100644 index 000000000..b2821fe59 --- /dev/null +++ b/dist/src/services/bundlers/biconomy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"biconomy.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAG5C,OAAO,EAAY,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,QAAS,SAAQ,OAAO;IACnC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA8D5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.js b/dist/src/services/bundlers/biconomy.js new file mode 100644 index 000000000..fbce2c4f7 --- /dev/null +++ b/dist/src/services/bundlers/biconomy.js @@ -0,0 +1,73 @@ +/* eslint-disable class-methods-use-this */ +import { BICONOMY } from '../../consts/bundlers'; +import { Bundler } from './bundler'; +export class Biconomy extends Bundler { + getUrl(network) { + return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`; + } + async getGasPrice(network) { + const provider = this.getProvider(network); + const prices = await provider.send('biconomy_getGasFeeValues', []); + prices.medium = prices.standard; + prices.ape = prices.fast; + delete prices.standard; + return prices; + } + async getStatus(network, userOpHash) { + const provider = this.getProvider(network); + const result = await provider + .send('biconomy_getUserOperationStatus', [userOpHash]) + .catch((e) => { + console.log('biconomy_getUserOperationStatus returned an error'); + console.log(e); + return { + state: 'NOT_FOUND' + }; + }); + let userOpStatus = { + status: 'not_found' + }; + if (result.state) { + switch (result.state) { + case 'NOT_FOUND': + userOpStatus = { + status: 'not_found' + }; + break; + // currently, we don't handle the middle stage called bundler mempool + // it can be treated the same way as not_found - which means it will + // query the bundler again until it has a txnId + case 'BUNDLER_MEMPOOL': + userOpStatus = { + status: 'not_found' + }; + break; + case 'DROPPED_FROM_BUNDLER_MEMPOOL': + userOpStatus = { + status: 'rejected' + }; + break; + case 'SUBMITTED': + case 'FAILED': + userOpStatus = { + status: 'found', + transactionHash: result.transactionHash + }; + break; + case 'CONFIRMED': + userOpStatus = { + status: 'found', + transactionHash: result.transactionHash + }; + break; + default: + break; + } + } + return userOpStatus; + } + getName() { + return BICONOMY; + } +} +//# sourceMappingURL=biconomy.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.js.map b/dist/src/services/bundlers/biconomy.js.map new file mode 100644 index 000000000..5e9e85c07 --- /dev/null +++ b/dist/src/services/bundlers/biconomy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":"AAGA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAW,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,OAAO,QAAS,SAAQ,OAAO;IACzB,MAAM,CAAC,OAAgB;QAC/B,OAAO,sCAAsC,OAAO,CAAC,OAAO,iDAAiD,CAAA;IAC/G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ;aAC1B,IAAI,CAAC,iCAAiC,EAAE,CAAC,UAAU,CAAC,CAAC;aACrD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEd,OAAO;gBACL,KAAK,EAAE,WAAW;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,IAAI,YAAY,GAAiB;YAC/B,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,QAAQ,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,KAAK,iBAAiB;oBACpB,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,KAAK,8BAA8B;oBACjC,YAAY,GAAG;wBACb,MAAM,EAAE,UAAU;qBACnB,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP;oBACE,MAAK;aACR;SACF;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF","sourcesContent":["/* eslint-disable no-console */\nimport { Network } from 'interfaces/network'\n\n/* eslint-disable class-methods-use-this */\nimport { BICONOMY, BUNDLER } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Biconomy extends Bundler {\n protected getUrl(network: Network): string {\n return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('biconomy_getGasFeeValues', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n const result = await provider\n .send('biconomy_getUserOperationStatus', [userOpHash])\n .catch((e) => {\n console.log('biconomy_getUserOperationStatus returned an error')\n console.log(e)\n\n return {\n state: 'NOT_FOUND'\n }\n })\n\n let userOpStatus: UserOpStatus = {\n status: 'not_found'\n }\n if (result.state) {\n switch (result.state) {\n case 'NOT_FOUND':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n // currently, we don't handle the middle stage called bundler mempool\n // it can be treated the same way as not_found - which means it will\n // query the bundler again until it has a txnId\n case 'BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n case 'DROPPED_FROM_BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'rejected'\n }\n break\n\n case 'SUBMITTED':\n case 'FAILED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n case 'CONFIRMED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n default:\n break\n }\n }\n\n return userOpStatus\n }\n\n public getName(): BUNDLER {\n return BICONOMY\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts b/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts new file mode 100644 index 000000000..bb753eed5 --- /dev/null +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts @@ -0,0 +1,14 @@ +import { Network } from '../../interfaces/network'; +import { UserOperation } from '../../libs/userOperation/types'; +import { Biconomy } from './biconomy'; +/** + * DANGER + * This class is made purely for the intention of using it for tests + * where the broadcast fails but everything else should work. + * When broadcast fails, estimation should switch to pimlico + * and continue on + */ +export declare class BrokenBiconomyBroadcast extends Biconomy { + broadcast(userOperation: UserOperation, network: Network): Promise; +} +//# sourceMappingURL=brokenBiconomyBroadcast.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts.map b/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts.map new file mode 100644 index 000000000..1dfeeae37 --- /dev/null +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"brokenBiconomyBroadcast.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenBiconomyBroadcast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,SAAS,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAG3E"} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.js b/dist/src/services/bundlers/brokenBiconomyBroadcast.js new file mode 100644 index 000000000..b61dbbd40 --- /dev/null +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.js @@ -0,0 +1,16 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Biconomy } from './biconomy'; +/** + * DANGER + * This class is made purely for the intention of using it for tests + * where the broadcast fails but everything else should work. + * When broadcast fails, estimation should switch to pimlico + * and continue on + */ +export class BrokenBiconomyBroadcast extends Biconomy { + broadcast(userOperation, network) { + throw new Error('Internal error from bundler'); + } +} +//# sourceMappingURL=brokenBiconomyBroadcast.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map b/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map new file mode 100644 index 000000000..5739e212a --- /dev/null +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brokenBiconomyBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenBiconomyBroadcast.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sDAAsD;AAItD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,OAAO,uBAAwB,SAAQ,QAAQ;IACnD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Biconomy } from './biconomy'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to pimlico\n * and continue on\n */\nexport class BrokenBiconomyBroadcast extends Biconomy {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts b/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts new file mode 100644 index 000000000..643a247a2 --- /dev/null +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts @@ -0,0 +1,14 @@ +import { Network } from '../../interfaces/network'; +import { UserOperation } from '../../libs/userOperation/types'; +import { Pimlico } from './pimlico'; +/** + * DANGER + * This class is made purely for the intention of using it for tests + * where the broadcast fails but everything else should work. + * When broadcast fails, estimation should switch to biconomy + * and continue on + */ +export declare class BrokenPimlicoBroadcast extends Pimlico { + broadcast(userOperation: UserOperation, network: Network): Promise; +} +//# sourceMappingURL=brokenPimlicoBroadcast.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts.map b/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts.map new file mode 100644 index 000000000..5562d6ff1 --- /dev/null +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"brokenPimlicoBroadcast.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenPimlicoBroadcast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;;GAMG;AACH,qBAAa,sBAAuB,SAAQ,OAAO;IACjD,SAAS,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAG3E"} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.js b/dist/src/services/bundlers/brokenPimlicoBroadcast.js new file mode 100644 index 000000000..49edc33ff --- /dev/null +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.js @@ -0,0 +1,16 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Pimlico } from './pimlico'; +/** + * DANGER + * This class is made purely for the intention of using it for tests + * where the broadcast fails but everything else should work. + * When broadcast fails, estimation should switch to biconomy + * and continue on + */ +export class BrokenPimlicoBroadcast extends Pimlico { + broadcast(userOperation, network) { + throw new Error('Internal error from bundler'); + } +} +//# sourceMappingURL=brokenPimlicoBroadcast.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map b/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map new file mode 100644 index 000000000..9e4605d86 --- /dev/null +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brokenPimlicoBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenPimlicoBroadcast.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sDAAsD;AAItD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;;GAMG;AACH,MAAM,OAAO,sBAAuB,SAAQ,OAAO;IACjD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Pimlico } from './pimlico'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to biconomy\n * and continue on\n */\nexport class BrokenPimlicoBroadcast extends Pimlico {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.d.ts b/dist/src/services/bundlers/bundler.d.ts new file mode 100644 index 000000000..ab9d65890 --- /dev/null +++ b/dist/src/services/bundlers/bundler.d.ts @@ -0,0 +1,58 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { DecodedError } from '../../libs/errorDecoder/types'; +import { BundlerEstimateResult } from '../../libs/estimate/interfaces'; +import { UserOperation } from '../../libs/userOperation/types'; +import { GasSpeeds, UserOpStatus } from './types'; +export declare abstract class Bundler { + /** + * The default pollWaitTime. This is used to determine + * how many milliseconds to wait until before another request to the + * bundler for the receipt is sent + */ + pollWaitTime: number; + /** + * Define the bundler URL + */ + protected abstract getUrl(network: Network): string; + /** + * Each bundler has their own gas prices. Define and fetch them + */ + protected abstract getGasPrice(network: Network): Promise; + /** + * Each bundler has it's own handler for giving information back + */ + abstract getStatus(network: Network, userOpHash: string): Promise; + /** + * Each bundler needs to return its own na,e + */ + abstract getName(): BUNDLER; + /** + * Get the bundler RPC + * + * @param network + */ + protected getProvider(network: Network): RPCProvider; + private sendEstimateReq; + estimate(userOperation: UserOperation, network: Network, shouldStateOverride?: boolean): Promise; + /** + * Get the transaction receipt from the userOperationHash if ready + * + * @param userOperationHash + * @returns Receipt | null + */ + getReceipt(userOperationHash: string, network: Network): Promise; + /** + * Broadcast a userOperation to the specified bundler and get a userOperationHash in return + * + * @param UserOperation userOperation + * @returns userOperationHash + */ + broadcast(userOperation: UserOperation, network: Network): Promise; + static isNetworkSupported(fetch: Fetch, chainId: bigint): Promise; + fetchGasPrices(network: Network, errorCallback: Function, counter?: number): Promise; + decodeBundlerError(e: Error): DecodedError; +} +//# sourceMappingURL=bundler.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.d.ts.map b/dist/src/services/bundlers/bundler.d.ts.map new file mode 100644 index 000000000..f45d57352 --- /dev/null +++ b/dist/src/services/bundlers/bundler.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAG9D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AASjD,8BAAsB,OAAO;IAC3B;;;;OAIG;IACI,YAAY,SAAO;IAE1B;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAEnD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAEpE;;OAEG;aACa,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAEtF;;OAEG;aACa,OAAO,IAAI,OAAO;IAElC;;;;OAIG;IACH,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW;YAItC,eAAe;IA4BvB,QAAQ,CACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,mBAAmB,UAAQ,GAC1B,OAAO,CAAC,qBAAqB,CAAC;IAWjC;;;;;OAKG;IACG,UAAU,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAK5D;;;;;OAKG;IACG,SAAS,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;WASnE,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;IAMvD,cAAc,CAClB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,QAAQ,EACvB,OAAO,GAAE,MAAU,GAClB,OAAO,CAAC,SAAS,CAAC;IAoDrB,kBAAkB,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY;CAI3C"} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.js b/dist/src/services/bundlers/bundler.js new file mode 100644 index 000000000..9a1736364 --- /dev/null +++ b/dist/src/services/bundlers/bundler.js @@ -0,0 +1,141 @@ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable class-methods-use-this */ +import { toBeHex } from 'ethers'; +import { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +import { decodeError } from '../../libs/errorDecoder'; +import { BundlerError } from '../../libs/errorDecoder/customErrors'; +import { privSlot } from '../../libs/proxyDeploy/deploy'; +import { getCleanUserOp } from '../../libs/userOperation/userOperation'; +import { getRpcProvider } from '../provider'; +require('dotenv').config(); +function addExtra(gasInWei, percentageIncrease) { + const percent = 100n / percentageIncrease; + return toBeHex(gasInWei + gasInWei / percent); +} +export class Bundler { + /** + * The default pollWaitTime. This is used to determine + * how many milliseconds to wait until before another request to the + * bundler for the receipt is sent + */ + pollWaitTime = 1500; + /** + * Get the bundler RPC + * + * @param network + */ + getProvider(network) { + return getRpcProvider([this.getUrl(network)], network.chainId); + } + async sendEstimateReq(userOperation, network, shouldStateOverride = false) { + const provider = this.getProvider(network); + if (shouldStateOverride) { + return provider.send('eth_estimateUserOperationGas', [ + getCleanUserOp(userOperation)[0], + ERC_4337_ENTRYPOINT, + { + [userOperation.sender]: { + stateDiff: { + // add privileges to the entry point + [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER + } + } + } + ]); + } + return provider.send('eth_estimateUserOperationGas', [ + getCleanUserOp(userOperation)[0], + ERC_4337_ENTRYPOINT + ]); + } + async estimate(userOperation, network, shouldStateOverride = false) { + const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride); + return { + preVerificationGas: toBeHex(estimatiton.preVerificationGas), + verificationGasLimit: toBeHex(estimatiton.verificationGasLimit), + callGasLimit: toBeHex(estimatiton.callGasLimit), + paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit), + paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) + }; + } + /** + * Get the transaction receipt from the userOperationHash if ready + * + * @param userOperationHash + * @returns Receipt | null + */ + async getReceipt(userOperationHash, network) { + const provider = this.getProvider(network); + return provider.send('eth_getUserOperationReceipt', [userOperationHash]); + } + /** + * Broadcast a userOperation to the specified bundler and get a userOperationHash in return + * + * @param UserOperation userOperation + * @returns userOperationHash + */ + async broadcast(userOperation, network) { + const provider = this.getProvider(network); + return provider.send('eth_sendUserOperation', [ + getCleanUserOp(userOperation)[0], + ERC_4337_ENTRYPOINT + ]); + } + // use this request to check if the bundler supports the network + static async isNetworkSupported(fetch, chainId) { + const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`; + const result = await fetch(url); + return result.status === 200; + } + async fetchGasPrices(network, errorCallback, counter = 0) { + const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1; + if (counter >= (hasFallback ? 2 : 5)) + throw new Error("Couldn't fetch gas prices"); + let response; + try { + response = await Promise.race([ + this.getGasPrice(network), + new Promise((_resolve, reject) => { + setTimeout(() => reject(new Error('fetching bundler gas prices failed, request too slow')), hasFallback ? 4500 : 6000); + }) + ]); + } + catch (e) { + // report the error back only if there's no fallback + if (!hasFallback) { + errorCallback({ + level: 'major', + message: 'Estimating gas prices from the bundler timed out. Retrying...', + error: new Error('Budler gas prices estimation timeout') + }); + } + const increment = counter + 1; + return this.fetchGasPrices(network, errorCallback, increment); + } + const results = response; + return { + slow: { + maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n), + maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n) + }, + medium: { + maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n), + maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n) + }, + fast: { + maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n), + maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n) + }, + ape: { + maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n), + maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n) + } + }; + } + // used when catching errors from bundler requests + decodeBundlerError(e) { + const error = new BundlerError(e.message, this.getName()); + return decodeError(error); + } +} +//# sourceMappingURL=bundler.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.js.map b/dist/src/services/bundlers/bundler.js.map new file mode 100644 index 000000000..6778fb227 --- /dev/null +++ b/dist/src/services/bundlers/bundler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable class-methods-use-this */\nimport { toBeHex } from 'ethers'\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { decodeError } from '../../libs/errorDecoder'\nimport { BundlerError } from '../../libs/errorDecoder/customErrors'\nimport { DecodedError } from '../../libs/errorDecoder/types'\nimport { BundlerEstimateResult } from '../../libs/estimate/interfaces'\nimport { privSlot } from '../../libs/proxyDeploy/deploy'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { getCleanUserOp } from '../../libs/userOperation/userOperation'\nimport { getRpcProvider } from '../provider'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nrequire('dotenv').config()\n\nfunction addExtra(gasInWei: bigint, percentageIncrease: bigint): Hex {\n const percent = 100n / percentageIncrease\n return toBeHex(gasInWei + gasInWei / percent) as Hex\n}\n\nexport abstract class Bundler {\n /**\n * The default pollWaitTime. This is used to determine\n * how many milliseconds to wait until before another request to the\n * bundler for the receipt is sent\n */\n public pollWaitTime = 1500\n\n /**\n * Define the bundler URL\n */\n protected abstract getUrl(network: Network): string\n\n /**\n * Each bundler has their own gas prices. Define and fetch them\n */\n protected abstract getGasPrice(network: Network): Promise\n\n /**\n * Each bundler has it's own handler for giving information back\n */\n public abstract getStatus(network: Network, userOpHash: string): Promise\n\n /**\n * Each bundler needs to return its own na,e\n */\n public abstract getName(): BUNDLER\n\n /**\n * Get the bundler RPC\n *\n * @param network\n */\n protected getProvider(network: Network): RPCProvider {\n return getRpcProvider([this.getUrl(network)], network.chainId)\n }\n\n private async sendEstimateReq(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const provider = this.getProvider(network)\n\n if (shouldStateOverride) {\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT,\n {\n [userOperation.sender]: {\n stateDiff: {\n // add privileges to the entry point\n [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER\n }\n }\n }\n ])\n }\n\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n async estimate(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride)\n return {\n preVerificationGas: toBeHex(estimatiton.preVerificationGas) as Hex,\n verificationGasLimit: toBeHex(estimatiton.verificationGasLimit) as Hex,\n callGasLimit: toBeHex(estimatiton.callGasLimit) as Hex,\n paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit) as Hex,\n paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) as Hex\n }\n }\n\n /**\n * Get the transaction receipt from the userOperationHash if ready\n *\n * @param userOperationHash\n * @returns Receipt | null\n */\n async getReceipt(userOperationHash: string, network: Network) {\n const provider = this.getProvider(network)\n return provider.send('eth_getUserOperationReceipt', [userOperationHash])\n }\n\n /**\n * Broadcast a userOperation to the specified bundler and get a userOperationHash in return\n *\n * @param UserOperation userOperation\n * @returns userOperationHash\n */\n async broadcast(userOperation: UserOperation, network: Network): Promise {\n const provider = this.getProvider(network)\n return provider.send('eth_sendUserOperation', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n // use this request to check if the bundler supports the network\n static async isNetworkSupported(fetch: Fetch, chainId: bigint) {\n const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`\n const result = await fetch(url)\n return result.status === 200\n }\n\n async fetchGasPrices(\n network: Network,\n errorCallback: Function,\n counter: number = 0\n ): Promise {\n const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1\n if (counter >= (hasFallback ? 2 : 5)) throw new Error(\"Couldn't fetch gas prices\")\n\n let response\n\n try {\n response = await Promise.race([\n this.getGasPrice(network),\n new Promise((_resolve, reject) => {\n setTimeout(\n () => reject(new Error('fetching bundler gas prices failed, request too slow')),\n hasFallback ? 4500 : 6000\n )\n })\n ])\n } catch (e: any) {\n // report the error back only if there's no fallback\n if (!hasFallback) {\n errorCallback({\n level: 'major',\n message: 'Estimating gas prices from the bundler timed out. Retrying...',\n error: new Error('Budler gas prices estimation timeout')\n })\n }\n\n const increment = counter + 1\n return this.fetchGasPrices(network, errorCallback, increment)\n }\n\n const results = response as GasSpeeds\n return {\n slow: {\n maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n),\n maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n)\n },\n medium: {\n maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n),\n maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n)\n },\n fast: {\n maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n),\n maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n)\n },\n ape: {\n maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n),\n maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n)\n }\n }\n }\n\n // used when catching errors from bundler requests\n decodeBundlerError(e: Error): DecodedError {\n const error = new BundlerError(e.message, this.getName())\n return decodeError(error)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.d.ts b/dist/src/services/bundlers/bundlerSwitcher.d.ts new file mode 100644 index 000000000..fe2174ce7 --- /dev/null +++ b/dist/src/services/bundlers/bundlerSwitcher.d.ts @@ -0,0 +1,17 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Network } from '../../interfaces/network'; +import { Bundler } from './bundler'; +export declare class BundlerSwitcher { + protected network: Network; + protected bundler: Bundler; + protected usedBundlers: BUNDLER[]; + protected getSignAccountOpStatus: Function; + protected noStateUpdateStatuses: any[]; + constructor(network: Network, getSignAccountOpStatus: Function, noStateUpdateStatuses: any[]); + protected hasBundlers(): boolean | undefined; + getBundler(): Bundler; + userHasCommitted(): boolean; + canSwitch(bundlerError: Error | null): boolean; + switch(): Bundler; +} +//# sourceMappingURL=bundlerSwitcher.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.d.ts.map b/dist/src/services/bundlers/bundlerSwitcher.d.ts.map new file mode 100644 index 000000000..154f7415f --- /dev/null +++ b/dist/src/services/bundlers/bundlerSwitcher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bundlerSwitcher.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/bundlerSwitcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,qBAAa,eAAe;IAC1B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAA;IAE1B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAA;IAE1B,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,CAAK;IAGtC,SAAS,CAAC,sBAAsB,EAAE,QAAQ,CAAA;IAM1C,SAAS,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAK;gBAE/B,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE;IAQ5F,SAAS,CAAC,WAAW;IAKrB,UAAU,IAAI,OAAO;IAIrB,gBAAgB,IAAI,OAAO;IAI3B,SAAS,CAAC,YAAY,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO;IAmB9C,MAAM,IAAI,OAAO;CAYlB"} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.js b/dist/src/services/bundlers/bundlerSwitcher.js new file mode 100644 index 000000000..f739834b2 --- /dev/null +++ b/dist/src/services/bundlers/bundlerSwitcher.js @@ -0,0 +1,58 @@ +/* eslint-disable class-methods-use-this */ +import { getBundlerByName, getDefaultBundler } from './getBundler'; +export class BundlerSwitcher { + network; + bundler; + usedBundlers = []; + // a function to retrieve the current sign account op state + getSignAccountOpStatus; + // TODO: + // no typehints here as importing typehints from signAccountOp causes + // a dependancy cicle. Types should be removed from signAccountOp in + // a different file before proceeding to fix this + noStateUpdateStatuses = []; + constructor(network, getSignAccountOpStatus, noStateUpdateStatuses) { + this.network = network; + this.bundler = getDefaultBundler(network); + this.usedBundlers.push(this.bundler.getName()); + this.getSignAccountOpStatus = getSignAccountOpStatus; + this.noStateUpdateStatuses = noStateUpdateStatuses; + } + hasBundlers() { + const bundlers = this.network.erc4337.bundlers; + return bundlers && bundlers.length > 1; + } + getBundler() { + return this.bundler; + } + userHasCommitted() { + return this.noStateUpdateStatuses.includes(this.getSignAccountOpStatus()); + } + canSwitch(bundlerError) { + // don't switch the bundler if the account op is in a state of signing + if (this.userHasCommitted()) + return false; + if (!this.hasBundlers()) + return false; + const availableBundlers = this.network.erc4337.bundlers.filter((bundler) => { + return this.usedBundlers.indexOf(bundler) === -1; + }); + if (availableBundlers.length === 0) + return false; + return (!bundlerError || + bundlerError.cause === 'biconomy: 400' || + bundlerError.cause === 'pimlico: 500'); + } + switch() { + if (!this.hasBundlers()) { + throw new Error('no available bundlers to switch'); + } + const availableBundlers = this.network.erc4337.bundlers.filter((bundler) => { + return this.usedBundlers.indexOf(bundler) === -1; + }); + this.bundler = getBundlerByName(availableBundlers[0]); + this.usedBundlers.push(this.bundler.getName()); + return this.bundler; + } +} +//# sourceMappingURL=bundlerSwitcher.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.js.map b/dist/src/services/bundlers/bundlerSwitcher.js.map new file mode 100644 index 000000000..79f20e521 --- /dev/null +++ b/dist/src/services/bundlers/bundlerSwitcher.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundlerSwitcher.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAK3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAElE,MAAM,OAAO,eAAe;IAChB,OAAO,CAAS;IAEhB,OAAO,CAAS;IAEhB,YAAY,GAAc,EAAE,CAAA;IAEtC,2DAA2D;IACjD,sBAAsB,CAAU;IAE1C,QAAQ;IACR,qEAAqE;IACrE,oEAAoE;IACpE,iDAAiD;IACvC,qBAAqB,GAAU,EAAE,CAAA;IAE3C,YAAY,OAAgB,EAAE,sBAAgC,EAAE,qBAA4B;QAC1F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QACpD,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;IACpD,CAAC;IAES,WAAW;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAA;QAC9C,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,SAAS,CAAC,YAA0B;QAClC,sEAAsE;QACtE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAAE,OAAO,KAAK,CAAA;QAEzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAA;QAErC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAEhD,OAAO,CACL,CAAC,YAAY;YACb,YAAY,CAAC,KAAK,KAAK,eAAe;YACtC,YAAY,CAAC,KAAK,KAAK,cAAc,CACtC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;SACnD;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Bundler } from './bundler'\nimport { getBundlerByName, getDefaultBundler } from './getBundler'\n\nexport class BundlerSwitcher {\n protected network: Network\n\n protected bundler: Bundler\n\n protected usedBundlers: BUNDLER[] = []\n\n // a function to retrieve the current sign account op state\n protected getSignAccountOpStatus: Function\n\n // TODO:\n // no typehints here as importing typehints from signAccountOp causes\n // a dependancy cicle. Types should be removed from signAccountOp in\n // a different file before proceeding to fix this\n protected noStateUpdateStatuses: any[] = []\n\n constructor(network: Network, getSignAccountOpStatus: Function, noStateUpdateStatuses: any[]) {\n this.network = network\n this.bundler = getDefaultBundler(network)\n this.usedBundlers.push(this.bundler.getName())\n this.getSignAccountOpStatus = getSignAccountOpStatus\n this.noStateUpdateStatuses = noStateUpdateStatuses\n }\n\n protected hasBundlers() {\n const bundlers = this.network.erc4337.bundlers\n return bundlers && bundlers.length > 1\n }\n\n getBundler(): Bundler {\n return this.bundler\n }\n\n userHasCommitted(): boolean {\n return this.noStateUpdateStatuses.includes(this.getSignAccountOpStatus())\n }\n\n canSwitch(bundlerError: Error | null): boolean {\n // don't switch the bundler if the account op is in a state of signing\n if (this.userHasCommitted()) return false\n\n if (!this.hasBundlers()) return false\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n\n if (availableBundlers.length === 0) return false\n\n return (\n !bundlerError ||\n bundlerError.cause === 'biconomy: 400' ||\n bundlerError.cause === 'pimlico: 500'\n )\n }\n\n switch(): Bundler {\n if (!this.hasBundlers()) {\n throw new Error('no available bundlers to switch')\n }\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n this.bundler = getBundlerByName(availableBundlers[0])\n this.usedBundlers.push(this.bundler.getName())\n return this.bundler\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.d.ts b/dist/src/services/bundlers/getBundler.d.ts new file mode 100644 index 000000000..5b3952cac --- /dev/null +++ b/dist/src/services/bundlers/getBundler.d.ts @@ -0,0 +1,10 @@ +import { BUNDLER } from '../../consts/bundlers'; +import { Network } from '../../interfaces/network'; +import { Bundler } from './bundler'; +export declare function getBundlerByName(bundlerName: BUNDLER): Bundler; +/** + * Get the default bundler for the network without any extra logic. + * If it's set, get it. If not, use pimlico + */ +export declare function getDefaultBundler(network: Network): Bundler; +//# sourceMappingURL=getBundler.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.d.ts.map b/dist/src/services/bundlers/getBundler.d.ts.map new file mode 100644 index 000000000..05ccb20e1 --- /dev/null +++ b/dist/src/services/bundlers/getBundler.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getBundler.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/getBundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAW,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAW9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAG3D"} \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.js b/dist/src/services/bundlers/getBundler.js new file mode 100644 index 000000000..fd1896c2c --- /dev/null +++ b/dist/src/services/bundlers/getBundler.js @@ -0,0 +1,22 @@ +import { BICONOMY, PIMLICO } from '../../consts/bundlers'; +import { Biconomy } from './biconomy'; +import { Pimlico } from './pimlico'; +export function getBundlerByName(bundlerName) { + switch (bundlerName) { + case PIMLICO: + return new Pimlico(); + case BICONOMY: + return new Biconomy(); + default: + throw new Error('Bundler settings error'); + } +} +/** + * Get the default bundler for the network without any extra logic. + * If it's set, get it. If not, use pimlico + */ +export function getDefaultBundler(network) { + const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : PIMLICO; + return getBundlerByName(bundlerName); +} +//# sourceMappingURL=getBundler.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.js.map b/dist/src/services/bundlers/getBundler.js.map new file mode 100644 index 000000000..a17318d81 --- /dev/null +++ b/dist/src/services/bundlers/getBundler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getBundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/getBundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAW,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,QAAQ,WAAW,EAAE;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,OAAO,EAAE,CAAA;QAEtB,KAAK,QAAQ;YACX,OAAO,IAAI,QAAQ,EAAE,CAAA;QAEvB;YACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC5C;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAA;IAC7F,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC","sourcesContent":["import { BICONOMY, BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Biconomy } from './biconomy'\nimport { Bundler } from './bundler'\nimport { Pimlico } from './pimlico'\n\nexport function getBundlerByName(bundlerName: BUNDLER): Bundler {\n switch (bundlerName) {\n case PIMLICO:\n return new Pimlico()\n\n case BICONOMY:\n return new Biconomy()\n\n default:\n throw new Error('Bundler settings error')\n }\n}\n\n/**\n * Get the default bundler for the network without any extra logic.\n * If it's set, get it. If not, use pimlico\n */\nexport function getDefaultBundler(network: Network): Bundler {\n const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : PIMLICO\n return getBundlerByName(bundlerName)\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.d.ts b/dist/src/services/bundlers/pimlico.d.ts new file mode 100644 index 000000000..f89249249 --- /dev/null +++ b/dist/src/services/bundlers/pimlico.d.ts @@ -0,0 +1,11 @@ +import { Network } from 'interfaces/network'; +import { BUNDLER } from '../../consts/bundlers'; +import { Bundler } from './bundler'; +import { GasSpeeds, UserOpStatus } from './types'; +export declare class Pimlico extends Bundler { + protected getUrl(network: Network): string; + protected getGasPrice(network: Network): Promise; + getStatus(network: Network, userOpHash: string): Promise; + getName(): BUNDLER; +} +//# sourceMappingURL=pimlico.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.d.ts.map b/dist/src/services/bundlers/pimlico.d.ts.map new file mode 100644 index 000000000..5a5610cba --- /dev/null +++ b/dist/src/services/bundlers/pimlico.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pimlico.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAW,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,OAAQ,SAAQ,OAAO;IAClC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.js b/dist/src/services/bundlers/pimlico.js new file mode 100644 index 000000000..c61f44230 --- /dev/null +++ b/dist/src/services/bundlers/pimlico.js @@ -0,0 +1,23 @@ +import { PIMLICO } from '../../consts/bundlers'; +import { Bundler } from './bundler'; +export class Pimlico extends Bundler { + getUrl(network) { + return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`; + } + async getGasPrice(network) { + const provider = this.getProvider(network); + const prices = await provider.send('pimlico_getUserOperationGasPrice', []); + prices.medium = prices.standard; + prices.ape = prices.fast; + delete prices.standard; + return prices; + } + async getStatus(network, userOpHash) { + const provider = this.getProvider(network); + return provider.send('pimlico_getUserOperationStatus', [userOpHash]); + } + getName() { + return PIMLICO; + } +} +//# sourceMappingURL=pimlico.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.js.map b/dist/src/services/bundlers/pimlico.js.map new file mode 100644 index 000000000..81a2ffe9f --- /dev/null +++ b/dist/src/services/bundlers/pimlico.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,OAAO,OAAQ,SAAQ,OAAO;IACxB,MAAM,CAAC,OAAgB;QAC/B,OAAO,6BAA6B,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAA;IAC3G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,OAAO;QACZ,OAAO,OAAO,CAAA;IAChB,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { Network } from 'interfaces/network'\n\nimport { BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Pimlico extends Bundler {\n protected getUrl(network: Network): string {\n return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('pimlico_getUserOperationGasPrice', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n return provider.send('pimlico_getUserOperationStatus', [userOpHash])\n }\n\n public getName(): BUNDLER {\n return PIMLICO\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/types.d.ts b/dist/src/services/bundlers/types.d.ts new file mode 100644 index 000000000..0696512bc --- /dev/null +++ b/dist/src/services/bundlers/types.d.ts @@ -0,0 +1,16 @@ +import { Hex } from '../../interfaces/hex'; +export interface Gas { + maxFeePerGas: Hex; + maxPriorityFeePerGas: Hex; +} +export interface GasSpeeds { + slow: Gas; + medium: Gas; + fast: Gas; + ape: Gas; +} +export interface UserOpStatus { + status: 'rejected' | 'not_found' | 'found'; + transactionHash?: Hex; +} +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/src/services/bundlers/types.d.ts.map b/dist/src/services/bundlers/types.d.ts.map new file mode 100644 index 000000000..07c360cda --- /dev/null +++ b/dist/src/services/bundlers/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,MAAM,WAAW,GAAG;IAClB,YAAY,EAAE,GAAG,CAAA;IACjB,oBAAoB,EAAE,GAAG,CAAA;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,GAAG,CAAA;IACT,MAAM,EAAE,GAAG,CAAA;IACX,IAAI,EAAE,GAAG,CAAA;IACT,GAAG,EAAE,GAAG,CAAA;CACT;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAA;IAC1C,eAAe,CAAC,EAAE,GAAG,CAAA;CACtB"} \ No newline at end of file diff --git a/dist/src/services/bundlers/types.js b/dist/src/services/bundlers/types.js new file mode 100644 index 000000000..718fd38ae --- /dev/null +++ b/dist/src/services/bundlers/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/types.js.map b/dist/src/services/bundlers/types.js.map new file mode 100644 index 000000000..a3bcc7769 --- /dev/null +++ b/dist/src/services/bundlers/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/bundlers/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Hex } from '../../interfaces/hex'\n\nexport interface Gas {\n maxFeePerGas: Hex\n maxPriorityFeePerGas: Hex\n}\n\nexport interface GasSpeeds {\n slow: Gas\n medium: Gas\n fast: Gas\n ape: Gas\n}\n\nexport interface UserOpStatus {\n status: 'rejected' | 'not_found' | 'found'\n transactionHash?: Hex\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.d.ts b/dist/src/services/ensDomains/ensDomains.d.ts new file mode 100644 index 000000000..fd076b6a7 --- /dev/null +++ b/dist/src/services/ensDomains/ensDomains.d.ts @@ -0,0 +1,7 @@ +import { RPCProvider } from '../../interfaces/provider'; +export declare function isCorrectAddress(address: string): boolean; +declare function resolveENSDomain(domain: string, bip44Item?: number[][]): Promise; +declare function getBip44Items(coinTicker: string): any; +declare function reverseLookupEns(address: string, provider: RPCProvider): Promise; +export { resolveENSDomain, getBip44Items, reverseLookupEns }; +//# sourceMappingURL=ensDomains.d.ts.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.d.ts.map b/dist/src/services/ensDomains/ensDomains.d.ts.map new file mode 100644 index 000000000..f9a93b069 --- /dev/null +++ b/dist/src/services/ensDomains/ensDomains.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ensDomains.d.ts","sourceRoot":"","sources":["../../../../src/services/ensDomains/ensDomains.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AA2BvD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,WAE/C;AAGD,iBAAe,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvF;AAED,iBAAS,aAAa,CAAC,UAAU,EAAE,MAAM,OAGxC;AAED,iBAAe,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,0BAErE;AAED,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.js b/dist/src/services/ensDomains/ensDomains.js new file mode 100644 index 000000000..1768d975c --- /dev/null +++ b/dist/src/services/ensDomains/ensDomains.js @@ -0,0 +1,70 @@ +// @ts-ignore +import constants from 'bip44-constants'; +import { isAddress } from 'ethers'; +// @ts-ignore +import { normalize } from '@ensdomains/eth-ens-namehash'; +import { networks } from '../../consts/networks'; +import { getRpcProvider } from '../provider'; +const BIP44_BASE_VALUE = 2147483648; +const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'; +const normalizeDomain = (domain) => { + try { + return normalize(domain); + } + catch (e) { + return null; + } +}; +function getNormalisedCoinType(bip44Item) { + return bip44Item[0].length ? bip44Item[0][0] - BIP44_BASE_VALUE : null; +} +async function resolveForCoin(resolver, bip44Item) { + if (bip44Item && bip44Item.length === 1) { + const coinType = getNormalisedCoinType(bip44Item); + if (!coinType) + return null; + return resolver.getAddress(coinType); + } + return resolver.getAddress(); +} +export function isCorrectAddress(address) { + return !(ADDRESS_ZERO === address) && isAddress(address); +} +// @TODO: Get RPC provider url from settings controller +async function resolveENSDomain(domain, bip44Item) { + const normalizedDomainName = normalizeDomain(domain); + if (!normalizedDomainName) + return ''; + const ethereum = networks.find((x) => x.id === 'ethereum'); + const provider = getRpcProvider(ethereum.rpcUrls, ethereum.chainId); + const resolver = await provider.getResolver(normalizedDomainName); + if (!resolver) + return ''; + try { + const ethAddress = await resolver.getAddress(); + const addressForCoin = await resolveForCoin(resolver, bip44Item).catch(() => null); + return isCorrectAddress(addressForCoin) ? addressForCoin : ethAddress; + } + catch (e) { + // If the error comes from an internal server error don't + // show it to the user, because it happens when a domain + // doesn't exist and we already show a message for that. + // https://dnssec-oracle.ens.domains/ 500 (ISE) + if (e.message?.includes('500_SERVER_ERROR')) + return ''; + throw e; + } + finally { + provider?.destroy(); + } +} +function getBip44Items(coinTicker) { + if (!coinTicker) + return null; + return constants.filter((item) => item[1] === coinTicker); +} +async function reverseLookupEns(address, provider) { + return provider.lookupAddress(address); +} +export { resolveENSDomain, getBip44Items, reverseLookupEns }; +//# sourceMappingURL=ensDomains.js.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.js.map b/dist/src/services/ensDomains/ensDomains.js.map new file mode 100644 index 000000000..fe8aabba6 --- /dev/null +++ b/dist/src/services/ensDomains/ensDomains.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ensDomains.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/ensDomains.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore\nimport constants from 'bip44-constants'\nimport { isAddress } from 'ethers'\n\n// @ts-ignore\nimport { normalize } from '@ensdomains/eth-ens-namehash'\n\nimport { networks } from '../../consts/networks'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { getRpcProvider } from '../provider'\n\nconst BIP44_BASE_VALUE = 2147483648\nconst ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'\n\nconst normalizeDomain = (domain: string) => {\n try {\n return normalize(domain)\n } catch (e) {\n return null\n }\n}\n\nfunction getNormalisedCoinType(bip44Item: number[][]) {\n return bip44Item[0].length ? bip44Item[0][0] - BIP44_BASE_VALUE : null\n}\n\nasync function resolveForCoin(resolver: any, bip44Item?: number[][]) {\n if (bip44Item && bip44Item.length === 1) {\n const coinType = getNormalisedCoinType(bip44Item)\n if (!coinType) return null\n return resolver.getAddress(coinType)\n }\n return resolver.getAddress()\n}\n\nexport function isCorrectAddress(address: string) {\n return !(ADDRESS_ZERO === address) && isAddress(address)\n}\n\n// @TODO: Get RPC provider url from settings controller\nasync function resolveENSDomain(domain: string, bip44Item?: number[][]): Promise {\n const normalizedDomainName = normalizeDomain(domain)\n if (!normalizedDomainName) return ''\n const ethereum = networks.find((x) => x.id === 'ethereum')!\n const provider = getRpcProvider(ethereum.rpcUrls, ethereum.chainId)\n const resolver = await provider.getResolver(normalizedDomainName)\n if (!resolver) return ''\n try {\n const ethAddress = await resolver.getAddress()\n const addressForCoin = await resolveForCoin(resolver, bip44Item).catch(() => null)\n return isCorrectAddress(addressForCoin) ? addressForCoin : ethAddress\n } catch (e: any) {\n // If the error comes from an internal server error don't\n // show it to the user, because it happens when a domain\n // doesn't exist and we already show a message for that.\n // https://dnssec-oracle.ens.domains/ 500 (ISE)\n if (e.message?.includes('500_SERVER_ERROR')) return ''\n\n throw e\n } finally {\n provider?.destroy()\n }\n}\n\nfunction getBip44Items(coinTicker: string) {\n if (!coinTicker) return null\n return constants.filter((item: string[]) => item[1] === coinTicker)\n}\n\nasync function reverseLookupEns(address: string, provider: RPCProvider) {\n return provider.lookupAddress(address)\n}\n\nexport { resolveENSDomain, getBip44Items, reverseLookupEns }\n"]} \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.d.ts b/dist/src/services/ensDomains/index.d.ts new file mode 100644 index 000000000..4980d8c4a --- /dev/null +++ b/dist/src/services/ensDomains/index.d.ts @@ -0,0 +1,2 @@ +export * from './ensDomains'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.d.ts.map b/dist/src/services/ensDomains/index.d.ts.map new file mode 100644 index 000000000..284223e13 --- /dev/null +++ b/dist/src/services/ensDomains/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/ensDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA"} \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.js b/dist/src/services/ensDomains/index.js new file mode 100644 index 000000000..8a4e0c12e --- /dev/null +++ b/dist/src/services/ensDomains/index.js @@ -0,0 +1,2 @@ +export * from './ensDomains'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.js.map b/dist/src/services/ensDomains/index.js.map new file mode 100644 index 000000000..f1342d1ea --- /dev/null +++ b/dist/src/services/ensDomains/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA","sourcesContent":["export * from './ensDomains'\n"]} \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.d.ts b/dist/src/services/explorers/jiffyscan.d.ts new file mode 100644 index 000000000..4348cd274 --- /dev/null +++ b/dist/src/services/explorers/jiffyscan.d.ts @@ -0,0 +1,3 @@ +import { Fetch } from '../../interfaces/fetch'; +export declare function fetchUserOp(userOpHash: string, fetchFn: Fetch): Promise; +//# sourceMappingURL=jiffyscan.d.ts.map \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.d.ts.map b/dist/src/services/explorers/jiffyscan.d.ts.map new file mode 100644 index 000000000..cf1d71158 --- /dev/null +++ b/dist/src/services/explorers/jiffyscan.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"jiffyscan.d.ts","sourceRoot":"","sources":["../../../../src/services/explorers/jiffyscan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,oBAkBnE"} \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.js b/dist/src/services/explorers/jiffyscan.js new file mode 100644 index 000000000..ed10e4241 --- /dev/null +++ b/dist/src/services/explorers/jiffyscan.js @@ -0,0 +1,19 @@ +export async function fetchUserOp(userOpHash, fetchFn) { + const url = `https://api.jiffyscan.xyz/v0/getUserOp?hash=${userOpHash}`; + return Promise.race([ + fetchFn(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'x-api-key': process.env.REACT_APP_JIFFYSCAN_API_KEY || '' + } + }), + new Promise((_resolve, reject) => { + setTimeout(() => reject(new Error('jiffy scan timeout')), 2500); + }) + ]).catch((e) => { + console.log(e); + return null; + }); +} +//# sourceMappingURL=jiffyscan.js.map \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.js.map b/dist/src/services/explorers/jiffyscan.js.map new file mode 100644 index 000000000..a24884361 --- /dev/null +++ b/dist/src/services/explorers/jiffyscan.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jiffyscan.js","sourceRoot":"","sources":["../../../../src/services/explorers/jiffyscan.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,OAAc;IAClE,MAAM,GAAG,GAAG,+CAA+C,UAAU,EAAE,CAAA;IAEvE,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,EAAE;YACX,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE;aAC3D;SACF,CAAC;QACF,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC,CAAC;KACH,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport async function fetchUserOp(userOpHash: string, fetchFn: Fetch) {\n const url = `https://api.jiffyscan.xyz/v0/getUserOp?hash=${userOpHash}`\n\n return Promise.race([\n fetchFn(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': process.env.REACT_APP_JIFFYSCAN_API_KEY || ''\n }\n }),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('jiffy scan timeout')), 2500)\n })\n ]).catch((e) => {\n console.log(e)\n return null\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.d.ts b/dist/src/services/paymaster/FailedPaymasters.d.ts new file mode 100644 index 000000000..dc0fcfbfc --- /dev/null +++ b/dist/src/services/paymaster/FailedPaymasters.d.ts @@ -0,0 +1,17 @@ +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +export declare class FailedPaymasters { + failedSponsorshipIds: number[]; + insufficientFundsNetworks: { + [chainId: number]: { + lastSeenBalance: bigint; + }; + }; + addFailedSponsorship(id: number): void; + hasFailedSponsorship(id: number): boolean; + addInsufficientFunds(provider: RPCProvider, network: Network): Promise; + hasInsufficientFunds(network: Network): boolean; + removeInsufficientFunds(network: Network): void; +} +export declare const failedPaymasters: FailedPaymasters; +//# sourceMappingURL=FailedPaymasters.d.ts.map \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.d.ts.map b/dist/src/services/paymaster/FailedPaymasters.d.ts.map new file mode 100644 index 000000000..113dfa222 --- /dev/null +++ b/dist/src/services/paymaster/FailedPaymasters.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"FailedPaymasters.d.ts","sourceRoot":"","sources":["../../../../src/services/paymaster/FailedPaymasters.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAGvD,qBAAa,gBAAgB;IAC3B,oBAAoB,EAAE,MAAM,EAAE,CAAK;IAEnC,yBAAyB,EAAE;QACzB,CAAC,OAAO,EAAE,MAAM,GAAG;YACjB,eAAe,EAAE,MAAM,CAAA;SACxB,CAAA;KACF,CAAK;IAEN,oBAAoB,CAAC,EAAE,EAAE,MAAM;IAI/B,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAInC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO;IAelE,oBAAoB,CAAC,OAAO,EAAE,OAAO;IAIrC,uBAAuB,CAAC,OAAO,EAAE,OAAO;CAGzC;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAA"} \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.js b/dist/src/services/paymaster/FailedPaymasters.js new file mode 100644 index 000000000..0ac2db903 --- /dev/null +++ b/dist/src/services/paymaster/FailedPaymasters.js @@ -0,0 +1,40 @@ +/* eslint-disable no-console */ +/* + * a singleton for recording failed paymaster requests + */ +import { Contract } from 'ethers'; +import entryPointAbi from '../../../contracts/compiled/EntryPoint.json'; +import { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +// so the app can fallback to a standard Paymaster if a sponsorship fails +export class FailedPaymasters { + failedSponsorshipIds = []; + insufficientFundsNetworks = {}; + addFailedSponsorship(id) { + this.failedSponsorshipIds.push(id); + } + hasFailedSponsorship(id) { + return this.failedSponsorshipIds.includes(id); + } + async addInsufficientFunds(provider, network) { + let paymasterBalance = 0n; + try { + const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider); + paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER); + } + catch (e) { + console.log('failed to retrieve the balance of the paymaster'); + console.error(e); + } + this.insufficientFundsNetworks[Number(network.chainId)] = { + lastSeenBalance: paymasterBalance + }; + } + hasInsufficientFunds(network) { + return !!this.insufficientFundsNetworks[Number(network.chainId)]; + } + removeInsufficientFunds(network) { + delete this.insufficientFundsNetworks[Number(network.chainId)]; + } +} +export const failedPaymasters = new FailedPaymasters(); +//# sourceMappingURL=FailedPaymasters.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.js.map b/dist/src/services/paymaster/FailedPaymasters.js.map new file mode 100644 index 000000000..9a7dbf4a2 --- /dev/null +++ b/dist/src/services/paymaster/FailedPaymasters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"FailedPaymasters.js","sourceRoot":"","sources":["../../../../src/services/paymaster/FailedPaymasters.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,aAAa,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAI3E,yEAAyE;AACzE,MAAM,OAAO,gBAAgB;IAC3B,oBAAoB,GAAa,EAAE,CAAA;IAEnC,yBAAyB,GAIrB,EAAE,CAAA;IAEN,oBAAoB,CAAC,EAAU;QAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,oBAAoB,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAqB,EAAE,OAAgB;QAChE,IAAI,gBAAgB,GAAG,EAAE,CAAA;QACzB,IAAI;YACF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAA;YACrE,gBAAgB,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;SACxD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAC9D,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;SACjB;QAED,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG;YACxD,eAAe,EAAE,gBAAgB;SAClC,CAAA;IACH,CAAC;IAED,oBAAoB,CAAC,OAAgB;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,uBAAuB,CAAC,OAAgB;QACtC,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["/* eslint-disable no-console */\n\n/*\n * a singleton for recording failed paymaster requests\n */\nimport { Contract } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\n\n// so the app can fallback to a standard Paymaster if a sponsorship fails\nexport class FailedPaymasters {\n failedSponsorshipIds: number[] = []\n\n insufficientFundsNetworks: {\n [chainId: number]: {\n lastSeenBalance: bigint\n }\n } = {}\n\n addFailedSponsorship(id: number) {\n this.failedSponsorshipIds.push(id)\n }\n\n hasFailedSponsorship(id: number): boolean {\n return this.failedSponsorshipIds.includes(id)\n }\n\n async addInsufficientFunds(provider: RPCProvider, network: Network) {\n let paymasterBalance = 0n\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n\n this.insufficientFundsNetworks[Number(network.chainId)] = {\n lastSeenBalance: paymasterBalance\n }\n }\n\n hasInsufficientFunds(network: Network) {\n return !!this.insufficientFundsNetworks[Number(network.chainId)]\n }\n\n removeInsufficientFunds(network: Network) {\n delete this.insufficientFundsNetworks[Number(network.chainId)]\n }\n}\n\nexport const failedPaymasters = new FailedPaymasters()\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.d.ts b/dist/src/services/paymaster/PaymasterFactory.d.ts new file mode 100644 index 000000000..d224bd7ed --- /dev/null +++ b/dist/src/services/paymaster/PaymasterFactory.d.ts @@ -0,0 +1,13 @@ +import { Fetch } from '../../interfaces/fetch'; +import { Network } from '../../interfaces/network'; +import { RPCProvider } from '../../interfaces/provider'; +import { AccountOp } from '../../libs/accountOp/accountOp'; +import { AbstractPaymaster } from '../../libs/paymaster/abstractPaymaster'; +import { UserOperation } from '../../libs/userOperation/types'; +export declare class PaymasterFactory { + callRelayer: Function | undefined; + errorCallback: Function | undefined; + init(relayerUrl: string, fetch: Fetch, errorCallback: Function): void; + create(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): Promise; +} +//# sourceMappingURL=PaymasterFactory.d.ts.map \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.d.ts.map b/dist/src/services/paymaster/PaymasterFactory.d.ts.map new file mode 100644 index 000000000..bf6d2c529 --- /dev/null +++ b/dist/src/services/paymaster/PaymasterFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PaymasterFactory.d.ts","sourceRoot":"","sources":["../../../../src/services/paymaster/PaymasterFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAA;AAG1E,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAQ9D,qBAAa,gBAAgB;IAC3B,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAY;IAE7C,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAY;IAE/C,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ;IAKxD,MAAM,CACV,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,iBAAiB,CAAC;CAgB9B"} \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.js b/dist/src/services/paymaster/PaymasterFactory.js new file mode 100644 index 000000000..f044a5c8f --- /dev/null +++ b/dist/src/services/paymaster/PaymasterFactory.js @@ -0,0 +1,32 @@ +import { Paymaster } from '../../libs/paymaster/paymaster'; +import { relayerCall } from '../../libs/relayerCall/relayerCall'; +import { failedPaymasters } from './FailedPaymasters'; +// a factory for creating paymaster objects +// this is needed as we'd like to create paymasters at will with easy +// access to app properties like relayerUrl and Fetch +// so we init the PaymasterFactory in the main controller and use it +// throught the app as a singleton +export class PaymasterFactory { + callRelayer = undefined; + errorCallback = undefined; + init(relayerUrl, fetch, errorCallback) { + this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.errorCallback = errorCallback; + } + async create(op, userOp, network, provider) { + if (this.callRelayer === undefined || this.errorCallback === undefined) + throw new Error('call init first'); + // check whether the sponsorship has failed and if it has, + // mark it like so in the meta for the paymaster to know + const localOp = { ...op }; + const paymasterServiceId = op.meta?.paymasterService?.id; + if (paymasterServiceId && failedPaymasters.hasFailedSponsorship(paymasterServiceId)) { + if (localOp.meta && localOp.meta.paymasterService) + localOp.meta.paymasterService.failed = true; + } + const paymaster = new Paymaster(this.callRelayer, this.errorCallback); + await paymaster.init(localOp, userOp, network, provider); + return paymaster; + } +} +//# sourceMappingURL=PaymasterFactory.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.js.map b/dist/src/services/paymaster/PaymasterFactory.js.map new file mode 100644 index 000000000..9c093a811 --- /dev/null +++ b/dist/src/services/paymaster/PaymasterFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PaymasterFactory.js","sourceRoot":"","sources":["../../../../src/services/paymaster/PaymasterFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,2CAA2C;AAC3C,qEAAqE;AACrE,qDAAqD;AACrD,oEAAoE;AACpE,kCAAkC;AAClC,MAAM,OAAO,gBAAgB;IAC3B,WAAW,GAAyB,SAAS,CAAA;IAE7C,aAAa,GAAyB,SAAS,CAAA;IAE/C,IAAI,CAAC,UAAkB,EAAE,KAAY,EAAE,aAAuB;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAa,EACb,MAAqB,EACrB,OAAgB,EAChB,QAAqB;QAErB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YACpE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAEpC,0DAA0D;QAC1D,wDAAwD;QACxD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,CAAA;QACzB,MAAM,kBAAkB,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAA;QACxD,IAAI,kBAAkB,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;YACnF,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAA;SAC/F;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACrE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QACxD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../../libs/accountOp/accountOp'\nimport { AbstractPaymaster } from '../../libs/paymaster/abstractPaymaster'\nimport { Paymaster } from '../../libs/paymaster/paymaster'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { failedPaymasters } from './FailedPaymasters'\n\n// a factory for creating paymaster objects\n// this is needed as we'd like to create paymasters at will with easy\n// access to app properties like relayerUrl and Fetch\n// so we init the PaymasterFactory in the main controller and use it\n// throught the app as a singleton\nexport class PaymasterFactory {\n callRelayer: Function | undefined = undefined\n\n errorCallback: Function | undefined = undefined\n\n init(relayerUrl: string, fetch: Fetch, errorCallback: Function) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.errorCallback = errorCallback\n }\n\n async create(\n op: AccountOp,\n userOp: UserOperation,\n network: Network,\n provider: RPCProvider\n ): Promise {\n if (this.callRelayer === undefined || this.errorCallback === undefined)\n throw new Error('call init first')\n\n // check whether the sponsorship has failed and if it has,\n // mark it like so in the meta for the paymaster to know\n const localOp = { ...op }\n const paymasterServiceId = op.meta?.paymasterService?.id\n if (paymasterServiceId && failedPaymasters.hasFailedSponsorship(paymasterServiceId)) {\n if (localOp.meta && localOp.meta.paymasterService) localOp.meta.paymasterService.failed = true\n }\n\n const paymaster = new Paymaster(this.callRelayer, this.errorCallback)\n await paymaster.init(localOp, userOp, network, provider)\n return paymaster\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/index.d.ts b/dist/src/services/paymaster/index.d.ts new file mode 100644 index 000000000..07e6ed9f0 --- /dev/null +++ b/dist/src/services/paymaster/index.d.ts @@ -0,0 +1,3 @@ +import { PaymasterFactory } from './PaymasterFactory'; +export declare const paymasterFactory: PaymasterFactory; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/paymaster/index.d.ts.map b/dist/src/services/paymaster/index.d.ts.map new file mode 100644 index 000000000..211d9ebf7 --- /dev/null +++ b/dist/src/services/paymaster/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/paymaster/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAO,MAAM,gBAAgB,kBAAyB,CAAA"} \ No newline at end of file diff --git a/dist/src/services/paymaster/index.js b/dist/src/services/paymaster/index.js new file mode 100644 index 000000000..001f51370 --- /dev/null +++ b/dist/src/services/paymaster/index.js @@ -0,0 +1,3 @@ +import { PaymasterFactory } from './PaymasterFactory'; +export const paymasterFactory = new PaymasterFactory(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/index.js.map b/dist/src/services/paymaster/index.js.map new file mode 100644 index 000000000..016b57f77 --- /dev/null +++ b/dist/src/services/paymaster/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/paymaster/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["import { PaymasterFactory } from './PaymasterFactory'\n\nexport const paymasterFactory = new PaymasterFactory()\n"]} \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.d.ts b/dist/src/services/provider/getRpcProvider.d.ts new file mode 100644 index 000000000..cf76e92df --- /dev/null +++ b/dist/src/services/provider/getRpcProvider.d.ts @@ -0,0 +1,8 @@ +import { JsonRpcProvider } from 'ethers'; +import { Network as NetworkInterface } from '../../interfaces/network'; +interface ProviderOptions { + batchMaxCount: number; +} +declare const getRpcProvider: (rpcUrls: NetworkInterface['rpcUrls'], chainId?: bigint | number, selectedRpcUrl?: string, options?: ProviderOptions) => JsonRpcProvider; +export { getRpcProvider }; +//# sourceMappingURL=getRpcProvider.d.ts.map \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.d.ts.map b/dist/src/services/provider/getRpcProvider.d.ts.map new file mode 100644 index 000000000..e61f46ebd --- /dev/null +++ b/dist/src/services/provider/getRpcProvider.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getRpcProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/provider/getRpcProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAW,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEtE,UAAU,eAAe;IACvB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,QAAA,MAAM,cAAc,YACT,gBAAgB,CAAC,SAAS,CAAC,YAC1B,MAAM,GAAG,MAAM,mBACR,MAAM,YACb,eAAe,oBAsB1B,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.js b/dist/src/services/provider/getRpcProvider.js new file mode 100644 index 000000000..75047ac35 --- /dev/null +++ b/dist/src/services/provider/getRpcProvider.js @@ -0,0 +1,21 @@ +import { JsonRpcProvider, Network } from 'ethers'; +const getRpcProvider = (rpcUrls, chainId, selectedRpcUrl, options) => { + if (!rpcUrls.length) { + throw new Error('rpcUrls must be a non-empty array'); + } + let rpcUrl = rpcUrls[0]; + if (selectedRpcUrl) { + const prefUrl = rpcUrls.find((u) => u === selectedRpcUrl); + if (prefUrl) + rpcUrl = prefUrl; + } + if (chainId) { + const staticNetwork = Network.from(Number(chainId)); + if (staticNetwork) { + return new JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options }); + } + } + return new JsonRpcProvider(rpcUrl); +}; +export { getRpcProvider }; +//# sourceMappingURL=getRpcProvider.js.map \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.js.map b/dist/src/services/provider/getRpcProvider.js.map new file mode 100644 index 000000000..a92913a0d --- /dev/null +++ b/dist/src/services/provider/getRpcProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getRpcProvider.js","sourceRoot":"","sources":["../../../../src/services/provider/getRpcProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAQjD,MAAM,cAAc,GAAG,CACrB,OAAoC,EACpC,OAAyB,EACzB,cAAuB,EACvB,OAAyB,EACzB,EAAE;IACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;KACrD;IAED,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAEvB,IAAI,cAAc,EAAE;QAClB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAA;QACzD,IAAI,OAAO;YAAE,MAAM,GAAG,OAAO,CAAA;KAC9B;IAED,IAAI,OAAO,EAAE;QACX,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAEnD,IAAI,aAAa,EAAE;YACjB,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;SACjF;KACF;IAED,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA","sourcesContent":["import { JsonRpcProvider, Network } from 'ethers'\n\nimport { Network as NetworkInterface } from '../../interfaces/network'\n\ninterface ProviderOptions {\n batchMaxCount: number\n}\n\nconst getRpcProvider = (\n rpcUrls: NetworkInterface['rpcUrls'],\n chainId?: bigint | number,\n selectedRpcUrl?: string,\n options?: ProviderOptions\n) => {\n if (!rpcUrls.length) {\n throw new Error('rpcUrls must be a non-empty array')\n }\n\n let rpcUrl = rpcUrls[0]\n\n if (selectedRpcUrl) {\n const prefUrl = rpcUrls.find((u) => u === selectedRpcUrl)\n if (prefUrl) rpcUrl = prefUrl\n }\n\n if (chainId) {\n const staticNetwork = Network.from(Number(chainId))\n\n if (staticNetwork) {\n return new JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options })\n }\n }\n\n return new JsonRpcProvider(rpcUrl)\n}\n\nexport { getRpcProvider }\n"]} \ No newline at end of file diff --git a/dist/src/services/provider/index.d.ts b/dist/src/services/provider/index.d.ts new file mode 100644 index 000000000..df7b25610 --- /dev/null +++ b/dist/src/services/provider/index.d.ts @@ -0,0 +1,2 @@ +export * from './getRpcProvider'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/provider/index.d.ts.map b/dist/src/services/provider/index.d.ts.map new file mode 100644 index 000000000..860f525be --- /dev/null +++ b/dist/src/services/provider/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA"} \ No newline at end of file diff --git a/dist/src/services/provider/index.js b/dist/src/services/provider/index.js new file mode 100644 index 000000000..99cc98294 --- /dev/null +++ b/dist/src/services/provider/index.js @@ -0,0 +1,2 @@ +export * from './getRpcProvider'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/provider/index.js.map b/dist/src/services/provider/index.js.map new file mode 100644 index 000000000..fad17be69 --- /dev/null +++ b/dist/src/services/provider/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA","sourcesContent":["export * from './getRpcProvider'\n"]} \ No newline at end of file diff --git a/dist/src/services/socket/api.d.ts b/dist/src/services/socket/api.d.ts new file mode 100644 index 000000000..595e75031 --- /dev/null +++ b/dist/src/services/socket/api.d.ts @@ -0,0 +1,59 @@ +import { InviteController } from '../../controllers/invite/invite'; +import { Fetch } from '../../interfaces/fetch'; +import { SocketAPIActiveRoutes, SocketAPIQuote, SocketAPISendTransactionRequest, SocketAPISupportedChain, SocketAPIToken, SocketRouteStatus } from '../../interfaces/swapAndBridge'; +export declare const normalizeIncomingSocketToken: (token: SocketAPIToken) => { + address: string; + chainId: number; + decimals: number; + icon: string; + logoURI: string; + name: string; + symbol: string; +}; +export declare class SocketAPI { + #private; + isHealthy: boolean | null; + constructor({ fetch, apiKey }: { + fetch: Fetch; + apiKey: string; + }); + getHealth(): Promise; + updateHealth(): Promise; + updateHealthIfNeeded(): Promise; + resetHealth(): void; + getSupportedChains(): Promise; + getToTokenList({ fromChainId, toChainId }: { + fromChainId: number; + toChainId: number; + }): Promise; + getToken({ address, chainId }: { + address: string; + chainId: number; + }): Promise; + quote({ fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmount, userAddress, isSmartAccount, sort, isOG }: { + fromChainId: number; + fromTokenAddress: string; + toChainId: number; + toTokenAddress: string; + fromAmount: bigint; + userAddress: string; + isSmartAccount: boolean; + sort: 'time' | 'output'; + isOG: InviteController['isOG']; + }): Promise; + startRoute({ fromChainId, toChainId, fromAssetAddress, toAssetAddress, route }: { + fromChainId: number; + toChainId: number; + fromAssetAddress: string; + toAssetAddress: string; + route: SocketAPIQuote['selectedRoute']; + }): Promise; + getRouteStatus({ activeRouteId, userTxIndex, txHash }: { + activeRouteId: SocketAPISendTransactionRequest['activeRouteId']; + userTxIndex: SocketAPISendTransactionRequest['userTxIndex']; + txHash: string; + }): Promise; + updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']): Promise; + getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']): Promise; +} +//# sourceMappingURL=api.d.ts.map \ No newline at end of file diff --git a/dist/src/services/socket/api.d.ts.map b/dist/src/services/socket/api.d.ts.map new file mode 100644 index 000000000..7ea2f6aa2 --- /dev/null +++ b/dist/src/services/socket/api.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAkB,KAAK,EAAgC,MAAM,wBAAwB,CAAA;AAC5F,OAAO,EACL,qBAAqB,EACrB,cAAc,EAEd,+BAA+B,EAC/B,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AAuBvC,eAAO,MAAM,4BAA4B,UAAW,cAAc;;;;;;;;CAGhE,CAAA;AAaF,qBAAa,SAAS;;IAOpB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAO;gBAEpB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzD,SAAS;IAYT,YAAY;IAIZ,oBAAoB;IAO1B,WAAW;IA0DL,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAYxD,cAAc,CAAC,EACnB,WAAW,EACX,SAAS,EACV,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqCvB,QAAQ,CAAC,EACb,OAAO,EACP,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiB5B,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,IAAI,EACJ,IAAI,EACL,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,gBAAgB,EAAE,MAAM,CAAA;QACxB,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,OAAO,CAAA;QACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;QACvB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;KAC/B,GAAG,OAAO,CAAC,cAAc,CAAC;IAuDrB,UAAU,CAAC,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,KAAK,EACN,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KACvC;IA0CK,cAAc,CAAC,EACnB,aAAa,EACb,WAAW,EACX,MAAM,EACP,EAAE;QACD,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,CAAA;QAC/D,WAAW,EAAE,+BAA+B,CAAC,aAAa,CAAC,CAAA;QAC3D,MAAM,EAAE,MAAM,CAAA;KACf;IAgBK,iBAAiB,CACrB,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,GAC9D,OAAO,CAAC,qBAAqB,CAAC;IA8B3B,kBAAkB,CAAC,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC;CAWzF"} \ No newline at end of file diff --git a/dist/src/services/socket/api.js b/dist/src/services/socket/api.js new file mode 100644 index 000000000..0009118d1 --- /dev/null +++ b/dist/src/services/socket/api.js @@ -0,0 +1,298 @@ +import { getAddress } from 'ethers'; +import SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'; +import { AMBIRE_FEE_TAKER_ADDRESSES, AMBIRE_WALLET_TOKEN_ON_BASE, AMBIRE_WALLET_TOKEN_ON_ETHEREUM, ETH_ON_OPTIMISM_LEGACY_ADDRESS, FEE_PERCENT, NULL_ADDRESS, ZERO_ADDRESS } from './constants'; +const convertZeroAddressToNullAddressIfNeeded = (addr) => addr === ZERO_ADDRESS ? NULL_ADDRESS : addr; +const convertNullAddressToZeroAddressIfNeeded = (addr) => addr === NULL_ADDRESS ? ZERO_ADDRESS : addr; +const normalizeIncomingSocketTokenAddress = (address) => +// incoming token addresses from Socket are all lowercased +getAddress( +// native token addresses come as null address instead of the zero address +convertNullAddressToZeroAddressIfNeeded(address)); +export const normalizeIncomingSocketToken = (token) => ({ + ...token, + address: normalizeIncomingSocketTokenAddress(token.address) +}); +const normalizeOutgoingSocketTokenAddress = (address) => +// Socket expects to receive null address instead of the zero address for native tokens. +convertZeroAddressToNullAddressIfNeeded( +// Socket works only with all lowercased token addresses, otherwise, bad request +address.toLocaleLowerCase()); +const normalizeOutgoingSocketToken = (token) => ({ + ...token, + address: normalizeOutgoingSocketTokenAddress(token.address) +}); +export class SocketAPI { + #fetch; + #baseUrl = 'https://api.socket.tech/v2'; + #headers; + isHealthy = null; + constructor({ fetch, apiKey }) { + this.#fetch = fetch; + this.#headers = { + 'API-KEY': apiKey, + Accept: 'application/json', + 'Content-Type': 'application/json' + }; + } + async getHealth() { + try { + const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers }); + if (!response.ok) + return false; + const body = await response.json(); + return !!body.ok; + } + catch { + return false; + } + } + async updateHealth() { + this.isHealthy = await this.getHealth(); + } + async updateHealthIfNeeded() { + // Update health status only if previously unhealthy + if (this.isHealthy) + return; + await this.updateHealth(); + } + resetHealth() { + this.isHealthy = null; + } + /** + * Processes Socket API responses and throws custom errors for various + * failures, including handling the API's unique response structure. + */ + async #handleResponse({ fetchPromise, errorPrefix }) { + let response; + try { + response = await fetchPromise; + } + catch (e) { + const message = e?.message || 'no message'; + const status = e?.status ? `, status: <${e.status}>` : ''; + const error = `${errorPrefix} Upstream error: <${message}>${status}`; + throw new SwapAndBridgeProviderApiError(error); + } + let responseBody; + try { + responseBody = await response.json(); + } + catch (e) { + const message = e?.message || 'no message'; + const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`; + throw new SwapAndBridgeProviderApiError(error); + } + // Socket API returns 500 status code with a message in the body, even + // in case of a bad request. Not necessarily an internal server error. + if (!response.ok || !responseBody?.success) { + // API returns 2 types of errors, a generic one, on the top level: + const genericErrorMessage = responseBody?.message?.error || 'no message'; + // ... and a detailed one, nested in the `details` object: + const specificError = responseBody?.message?.details?.error?.message; + const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''; + const specificErrorCode = responseBody?.message?.details?.error?.code; + const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''; + const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`; + throw new SwapAndBridgeProviderApiError(error); + } + // Always attempt to update health status (if needed) when a response was + // successful, in case the API was previously unhealthy (to recover). + // Do not wait on purpose, to not block or delay the response + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.updateHealthIfNeeded(); + return responseBody.result; + } + async getSupportedChains() { + const url = `${this.#baseUrl}/supported/chains`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.' + }); + return response; + } + async getToTokenList({ fromChainId, toChainId }) { + const params = new URLSearchParams({ + fromChainId: fromChainId.toString(), + toChainId: toChainId.toString(), + // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens), + // which makes serialization and deserialization of this controller computationally expensive. + isShortList: 'true' + }); + const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`; + let response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to retrieve the list of supported receive tokens. Please reload to try again.' + }); + // Exception for Optimism, strip out the legacy ETH address + // TODO: Remove when Socket removes the legacy ETH address from their response + if (toChainId === 10) + response = response.filter((token) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS); + // Exception for Ethereum, duplicate ETH tokens are incoming from the API. + // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH. + // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest. + if (toChainId === 1) + response = response.filter((token) => token.address !== ZERO_ADDRESS); + // Since v4.41.0 we request the shortlist from Socket, which does not include + // the Ambire $WALLET token. So adding it manually on the supported chains. + if (toChainId === 1) + response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM); + if (toChainId === 8453) + response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE); + return response.map(normalizeIncomingSocketToken); + } + async getToken({ address, chainId }) { + const params = new URLSearchParams({ + address: address.toString(), + chainId: chainId.toString() + }); + const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to retrieve token information by address.' + }); + if (!response.isSupported || !response.token) + return null; + return normalizeIncomingSocketToken(response.token); + } + async quote({ fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmount, userAddress, isSmartAccount, sort, isOG }) { + const params = new URLSearchParams({ + fromChainId: fromChainId.toString(), + fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress), + toChainId: toChainId.toString(), + toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress), + fromAmount: fromAmount.toString(), + userAddress, + isContractCall: isSmartAccount.toString(), + sort, + singleTxOnly: 'false', + defaultSwapSlippage: '1', + uniqueRoutesPerBridge: 'true' + }); + const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]; + const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG; + if (shouldIncludeConvenienceFee) { + params.append('feeTakerAddress', feeTakerAddress); + params.append('feePercent', FEE_PERCENT.toString()); + } + // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as + // batching is currently not not supported by Mayan (and funds get lost). + if (isSmartAccount) + params.append('excludeBridges', ['mayan'].join(',')); + const url = `${this.#baseUrl}/quote?${params.toString()}`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to fetch the quote.' + }); + return { + ...response, + fromAsset: normalizeIncomingSocketToken(response.fromAsset), + toAsset: normalizeIncomingSocketToken(response.toAsset), + routes: response.routes.map((route) => ({ + ...route, + userTxs: route.userTxs.map((userTx) => ({ + ...userTx, + ...('fromAsset' in userTx && { + fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) + }), + toAsset: normalizeIncomingSocketToken(userTx.toAsset), + ...('steps' in userTx && { + steps: userTx.steps.map((step) => ({ + ...step, + fromAsset: normalizeIncomingSocketToken(step.fromAsset), + toAsset: normalizeIncomingSocketToken(step.toAsset) + })) + }) + })) + })) + }; + } + async startRoute({ fromChainId, toChainId, fromAssetAddress, toAssetAddress, route }) { + const params = { + fromChainId, + toChainId, + fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress), + toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress), + includeFirstTxDetails: true, + route: { + ...route, + userTxs: route.userTxs.map((userTx) => ({ + ...userTx, + // @ts-ignore fromAsset exists on one of the two userTx sub-types + fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined, + toAsset: { + ...userTx.toAsset, + address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address) + }, + // @ts-ignore fromAsset exists on one of the two userTx sub-types + steps: userTx.steps + ? // @ts-ignore fromAsset exists on one of the two userTx sub-types + userTx.steps.map((step) => ({ + ...step, + fromAsset: normalizeOutgoingSocketToken(step.fromAsset), + toAsset: normalizeOutgoingSocketToken(step.toAsset) + })) + : undefined + })) + } + }; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, { + method: 'POST', + headers: this.#headers, + body: JSON.stringify(params) + }), + errorPrefix: 'Unable to start the route.' + }); + return response; + } + async getRouteStatus({ activeRouteId, userTxIndex, txHash }) { + const params = new URLSearchParams({ + activeRouteId: activeRouteId.toString(), + userTxIndex: userTxIndex.toString(), + txHash + }); + const url = `${this.#baseUrl}/route/prepare?${params.toString()}`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to get the route status. Please check back later to proceed.' + }); + return response; + } + async updateActiveRoute(activeRouteId) { + const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() }); + const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to update the active route.' + }); + return { + ...response, + fromAsset: normalizeIncomingSocketToken(response.fromAsset), + fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress), + toAsset: normalizeIncomingSocketToken(response.toAsset), + toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress), + userTxs: response.userTxs.map((userTx) => ({ + ...userTx, + ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }), + toAsset: normalizeIncomingSocketToken(userTx.toAsset), + ...('steps' in userTx && { + steps: userTx.steps.map((step) => ({ + ...step, + fromAsset: normalizeIncomingSocketToken(step.fromAsset), + toAsset: normalizeIncomingSocketToken(step.toAsset) + })) + }) + })) + }; + } + async getNextRouteUserTx(activeRouteId) { + const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() }); + const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`; + const response = await this.#handleResponse({ + fetchPromise: this.#fetch(url, { headers: this.#headers }), + errorPrefix: 'Unable to start the next step.' + }); + return response; + } +} +//# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/dist/src/services/socket/api.js.map b/dist/src/services/socket/api.js.map new file mode 100644 index 000000000..cb9281f29 --- /dev/null +++ b/dist/src/services/socket/api.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,6BAA6B,MAAM,6CAA6C,CAAA;AAYvF,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAA;AAEpB,MAAM,uCAAuC,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/D,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7C,MAAM,uCAAuC,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/D,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7C,MAAM,mCAAmC,GAAG,CAAC,OAAe,EAAE,EAAE;AAC9D,0DAA0D;AAC1D,UAAU;AACR,0EAA0E;AAC1E,uCAAuC,CAAC,OAAO,CAAC,CACjD,CAAA;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC;IACtE,GAAG,KAAK;IACR,OAAO,EAAE,mCAAmC,CAAC,KAAK,CAAC,OAAO,CAAC;CAC5D,CAAC,CAAA;AAEF,MAAM,mCAAmC,GAAG,CAAC,OAAe,EAAE,EAAE;AAC9D,wFAAwF;AACxF,uCAAuC;AACrC,gFAAgF;AAChF,OAAO,CAAC,iBAAiB,EAAE,CAC5B,CAAA;AACH,MAAM,4BAA4B,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC;IAC/D,GAAG,KAAK;IACR,OAAO,EAAE,mCAAmC,CAAC,KAAK,CAAC,OAAO,CAAC;CAC5D,CAAC,CAAA;AAEF,MAAM,OAAO,SAAS;IACpB,MAAM,CAAO;IAEb,QAAQ,GAAG,4BAA4B,CAAA;IAEvC,QAAQ,CAAyC;IAEjD,SAAS,GAAmB,IAAI,CAAA;IAEhC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAoC;QAC7D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QAEnB,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAA;YAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;SACjB;QAAC,MAAM;YACN,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,oDAAoD;QACpD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAE1B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;IAC3B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAI,EACvB,YAAY,EACZ,WAAW,EAIZ;QACC,IAAI,QAAwB,CAAA;QAE5B,IAAI;YACF,QAAQ,GAAG,MAAM,YAAY,CAAA;SAC9B;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;YAC1C,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACzD,MAAM,KAAK,GAAG,GAAG,WAAW,qBAAqB,OAAO,IAAI,MAAM,EAAE,CAAA;YACpE,MAAM,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,IAAI,YAAkC,CAAA;QACtC,IAAI;YACF,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;SACrC;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;YAC1C,MAAM,KAAK,GAAG,GAAG,WAAW,qFAAqF,OAAO,GAAG,CAAA;YAC3H,MAAM,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;YAC1C,kEAAkE;YAClE,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,IAAI,YAAY,CAAA;YACxE,0DAA0D;YAC1D,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAA;YACpE,MAAM,oBAAoB,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACjF,MAAM,iBAAiB,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAA;YACrE,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,CAAC,CAAC,YAAY,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1F,MAAM,KAAK,GAAG,GAAG,WAAW,0CAA0C,mBAAmB,IAAI,oBAAoB,GAAG,wBAAwB,EAAE,CAAA;YAC9I,MAAM,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,yEAAyE;QACzE,qEAAqE;QACrE,6DAA6D;QAC7D,mEAAmE;QACnE,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE3B,OAAO,YAAY,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,mBAAmB,CAAA;QAE/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAA4B;YACrE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EACT,0FAA0F;SAC7F,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EACnB,WAAW,EACX,SAAS,EAIV;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC/B,8EAA8E;YAC9E,8FAA8F;YAC9F,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,8BAA8B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAE7E,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAmB;YAC1D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EACT,sFAAsF;SACzF,CAAC,CAAA;QAEF,2DAA2D;QAC3D,8EAA8E;QAC9E,IAAI,SAAS,KAAK,EAAE;YAClB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,8BAA8B,CAC5E,CAAA;QAEH,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,SAAS,KAAK,CAAC;YACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAA;QAEvF,6EAA6E;QAC7E,2EAA2E;QAC3E,IAAI,SAAS,KAAK,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAA;QACtE,IAAI,SAAS,KAAK,IAAI;YAAE,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAA;QAErE,OAAO,QAAQ,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EACb,OAAO,EACP,OAAO,EAIR;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;SAC5B,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,4BAA4B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkD;YAC3F,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,kDAAkD;SAChE,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEzD,OAAO,4BAA4B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,IAAI,EACJ,IAAI,EAWL;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,gBAAgB,EAAE,mCAAmC,CAAC,gBAAgB,CAAC;YACvE,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC/B,cAAc,EAAE,mCAAmC,CAAC,cAAc,CAAC;YACnE,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;YACjC,WAAW;YACX,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;YACzC,IAAI;YACJ,YAAY,EAAE,OAAO;YACrB,mBAAmB,EAAE,GAAG;YACxB,qBAAqB,EAAE,MAAM;SAC9B,CAAC,CAAA;QACF,MAAM,eAAe,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;QAC/D,MAAM,2BAA2B,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,CAAA;QAC9D,IAAI,2BAA2B,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;SACpD;QACD,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,cAAc;YAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAExE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,UAAU,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAiB;YAC1D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,4BAA4B;SAC1C,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS,EAAE,4BAA4B,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3D,OAAO,EAAE,4BAA4B,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtC,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACtC,GAAG,MAAM;oBACT,GAAG,CAAC,WAAW,IAAI,MAAM,IAAI;wBAC3B,SAAS,EAAE,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC;qBAC1D,CAAC;oBACF,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,OAAO,CAAC;oBACrD,GAAG,CAAC,OAAO,IAAI,MAAM,IAAI;wBACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BACjC,GAAG,IAAI;4BACP,SAAS,EAAE,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;4BACvD,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;yBACpD,CAAC,CAAC;qBACJ,CAAC;iBACH,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,KAAK,EAON;QACC,MAAM,MAAM,GAAG;YACb,WAAW;YACX,SAAS;YACT,gBAAgB,EAAE,mCAAmC,CAAC,gBAAgB,CAAC;YACvE,cAAc,EAAE,mCAAmC,CAAC,cAAc,CAAC;YACnE,qBAAqB,EAAE,IAAI;YAC3B,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACtC,GAAG,MAAM;oBACT,iEAAiE;oBACjE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;oBACzF,OAAO,EAAE;wBACP,GAAG,MAAM,CAAC,OAAO;wBACjB,OAAO,EAAE,mCAAmC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBACrE;oBACD,iEAAiE;oBACjE,KAAK,EAAE,MAAM,CAAC,KAAK;wBACjB,CAAC,CAAC,iEAAiE;4BACjE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gCAC1B,GAAG,IAAI;gCACP,SAAS,EAAE,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;gCACvD,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;6BACpD,CAAC,CAAC;wBACL,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;aACJ;SACF,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkC;YAC3E,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,cAAc,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;aAC7B,CAAC;YACF,WAAW,EAAE,4BAA4B;SAC1C,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EACnB,aAAa,EACb,WAAW,EACX,MAAM,EAKP;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE;YACvC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,MAAM;SACP,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAoB;YAC7D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,qEAAqE;SACnF,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,aAA+D;QAE/D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,wBAAwB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAwB;YACjE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,oCAAoC;SAClD,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS,EAAE,4BAA4B,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3D,gBAAgB,EAAE,mCAAmC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAChF,OAAO,EAAE,4BAA4B,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvD,cAAc,EAAE,mCAAmC,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5E,OAAO,EAAG,QAAQ,CAAC,OAA4C,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC/E,GAAG,MAAM;gBACT,GAAG,CAAC,WAAW,IAAI,MAAM,IAAI,EAAE,SAAS,EAAE,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3F,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,OAAO,CAAC;gBACrD,GAAG,CAAC,OAAO,IAAI,MAAM,IAAI;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACjC,GAAG,IAAI;wBACP,SAAS,EAAE,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;wBACvD,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;qBACpD,CAAC,CAAC;iBACJ,CAAC;aACH,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,aAA+D;QACtF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,wBAAwB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkC;YAC3E,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,gCAAgC;SAC9C,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF","sourcesContent":["import { getAddress } from 'ethers'\n\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\nimport { InviteController } from '../../controllers/invite/invite'\nimport { CustomResponse, Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIActiveRoutes,\n SocketAPIQuote,\n SocketAPIResponse,\n SocketAPISendTransactionRequest,\n SocketAPISupportedChain,\n SocketAPIToken,\n SocketRouteStatus\n} from '../../interfaces/swapAndBridge'\nimport {\n AMBIRE_FEE_TAKER_ADDRESSES,\n AMBIRE_WALLET_TOKEN_ON_BASE,\n AMBIRE_WALLET_TOKEN_ON_ETHEREUM,\n ETH_ON_OPTIMISM_LEGACY_ADDRESS,\n FEE_PERCENT,\n NULL_ADDRESS,\n ZERO_ADDRESS\n} from './constants'\n\nconst convertZeroAddressToNullAddressIfNeeded = (addr: string) =>\n addr === ZERO_ADDRESS ? NULL_ADDRESS : addr\n\nconst convertNullAddressToZeroAddressIfNeeded = (addr: string) =>\n addr === NULL_ADDRESS ? ZERO_ADDRESS : addr\n\nconst normalizeIncomingSocketTokenAddress = (address: string) =>\n // incoming token addresses from Socket are all lowercased\n getAddress(\n // native token addresses come as null address instead of the zero address\n convertNullAddressToZeroAddressIfNeeded(address)\n )\nexport const normalizeIncomingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeIncomingSocketTokenAddress(token.address)\n})\n\nconst normalizeOutgoingSocketTokenAddress = (address: string) =>\n // Socket expects to receive null address instead of the zero address for native tokens.\n convertZeroAddressToNullAddressIfNeeded(\n // Socket works only with all lowercased token addresses, otherwise, bad request\n address.toLocaleLowerCase()\n )\nconst normalizeOutgoingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeOutgoingSocketTokenAddress(token.address)\n})\n\nexport class SocketAPI {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n try {\n const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers })\n if (!response.ok) return false\n\n const body = await response.json()\n return !!body.ok\n } catch {\n return false\n }\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n async updateHealthIfNeeded() {\n // Update health status only if previously unhealthy\n if (this.isHealthy) return\n\n await this.updateHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n /**\n * Processes Socket API responses and throws custom errors for various\n * failures, including handling the API's unique response structure.\n */\n async #handleResponse({\n fetchPromise,\n errorPrefix\n }: {\n fetchPromise: Promise\n errorPrefix: string\n }): Promise {\n let response: CustomResponse\n\n try {\n response = await fetchPromise\n } catch (e: any) {\n const message = e?.message || 'no message'\n const status = e?.status ? `, status: <${e.status}>` : ''\n const error = `${errorPrefix} Upstream error: <${message}>${status}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n let responseBody: SocketAPIResponse\n try {\n responseBody = await response.json()\n } catch (e: any) {\n const message = e?.message || 'no message'\n const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Socket API returns 500 status code with a message in the body, even\n // in case of a bad request. Not necessarily an internal server error.\n if (!response.ok || !responseBody?.success) {\n // API returns 2 types of errors, a generic one, on the top level:\n const genericErrorMessage = responseBody?.message?.error || 'no message'\n // ... and a detailed one, nested in the `details` object:\n const specificError = responseBody?.message?.details?.error?.message\n const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''\n const specificErrorCode = responseBody?.message?.details?.error?.code\n const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''\n const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Always attempt to update health status (if needed) when a response was\n // successful, in case the API was previously unhealthy (to recover).\n // Do not wait on purpose, to not block or delay the response\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateHealthIfNeeded()\n\n return responseBody.result\n }\n\n async getSupportedChains(): Promise {\n const url = `${this.#baseUrl}/supported/chains`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.'\n })\n\n return response\n }\n\n async getToTokenList({\n fromChainId,\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n toChainId: toChainId.toString(),\n // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens),\n // which makes serialization and deserialization of this controller computationally expensive.\n isShortList: 'true'\n })\n const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`\n\n let response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported receive tokens. Please reload to try again.'\n })\n\n // Exception for Optimism, strip out the legacy ETH address\n // TODO: Remove when Socket removes the legacy ETH address from their response\n if (toChainId === 10)\n response = response.filter(\n (token: SocketAPIToken) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS\n )\n\n // Exception for Ethereum, duplicate ETH tokens are incoming from the API.\n // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH.\n // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest.\n if (toChainId === 1)\n response = response.filter((token: SocketAPIToken) => token.address !== ZERO_ADDRESS)\n\n // Since v4.41.0 we request the shortlist from Socket, which does not include\n // the Ambire $WALLET token. So adding it manually on the supported chains.\n if (toChainId === 1) response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM)\n if (toChainId === 8453) response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE)\n\n return response.map(normalizeIncomingSocketToken)\n }\n\n async getToken({\n address,\n chainId\n }: {\n address: string\n chainId: number\n }): Promise {\n const params = new URLSearchParams({\n address: address.toString(),\n chainId: chainId.toString()\n })\n const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`\n\n const response = await this.#handleResponse<{ isSupported: boolean; token: SocketAPIToken }>({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to retrieve token information by address.'\n })\n\n if (!response.isSupported || !response.token) return null\n\n return normalizeIncomingSocketToken(response.token)\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress,\n isSmartAccount,\n sort,\n isOG\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n isOG: InviteController['isOG']\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress),\n toChainId: toChainId.toString(),\n toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress),\n fromAmount: fromAmount.toString(),\n userAddress,\n isContractCall: isSmartAccount.toString(), // only get quotes with that are compatible with contracts\n sort,\n singleTxOnly: 'false',\n defaultSwapSlippage: '1',\n uniqueRoutesPerBridge: 'true'\n })\n const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]\n const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG\n if (shouldIncludeConvenienceFee) {\n params.append('feeTakerAddress', feeTakerAddress)\n params.append('feePercent', FEE_PERCENT.toString())\n }\n // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as\n // batching is currently not not supported by Mayan (and funds get lost).\n if (isSmartAccount) params.append('excludeBridges', ['mayan'].join(','))\n\n const url = `${this.#baseUrl}/quote?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to fetch the quote.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n routes: response.routes.map((route) => ({\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && {\n fromAsset: normalizeIncomingSocketToken(userTx.fromAsset)\n }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }))\n }\n }\n\n async startRoute({\n fromChainId,\n toChainId,\n fromAssetAddress,\n toAssetAddress,\n route\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n const params = {\n fromChainId,\n toChainId,\n fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress),\n toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress),\n includeFirstTxDetails: true,\n route: {\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined,\n toAsset: {\n ...userTx.toAsset,\n address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address)\n },\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n steps: userTx.steps\n ? // @ts-ignore fromAsset exists on one of the two userTx sub-types\n userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeOutgoingSocketToken(step.fromAsset),\n toAsset: normalizeOutgoingSocketToken(step.toAsset)\n }))\n : undefined\n }))\n }\n }\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(params)\n }),\n errorPrefix: 'Unable to start the route.'\n })\n\n return response\n }\n\n async getRouteStatus({\n activeRouteId,\n userTxIndex,\n txHash\n }: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n const params = new URLSearchParams({\n activeRouteId: activeRouteId.toString(),\n userTxIndex: userTxIndex.toString(),\n txHash\n })\n const url = `${this.#baseUrl}/route/prepare?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to get the route status. Please check back later to proceed.'\n })\n\n return response\n }\n\n async updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n ): Promise {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to update the active route.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress),\n userTxs: (response.userTxs as SocketAPIActiveRoutes['userTxs']).map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to start the next step.'\n })\n\n return response\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/socket/constants.d.ts b/dist/src/services/socket/constants.d.ts new file mode 100644 index 000000000..207cb78dc --- /dev/null +++ b/dist/src/services/socket/constants.d.ts @@ -0,0 +1,30 @@ +export declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; +export declare const NULL_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; +export declare const ETH_ON_OPTIMISM_LEGACY_ADDRESS = "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000"; +/** + * The % of fee to be cut from the source input token amount. + * Can be up to three decimal places and cannot be more than 5%. + */ +export declare const FEE_PERCENT = 0.25; +export declare const AMBIRE_WALLET_TOKEN_ON_ETHEREUM: { + name: string; + symbol: string; + decimals: number; + logoURI: string; + icon: string; + chainId: number; + address: string; +}; +export declare const AMBIRE_WALLET_TOKEN_ON_BASE: { + name: string; + symbol: string; + decimals: number; + logoURI: string; + icon: string; + chainId: number; + address: string; +}; +export declare const AMBIRE_FEE_TAKER_ADDRESSES: { + [chainId: number]: string; +}; +//# sourceMappingURL=constants.d.ts.map \ No newline at end of file diff --git a/dist/src/services/socket/constants.d.ts.map b/dist/src/services/socket/constants.d.ts.map new file mode 100644 index 000000000..a60c1134a --- /dev/null +++ b/dist/src/services/socket/constants.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/services/socket/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,+CAA+C,CAAA;AAGxE,eAAO,MAAM,YAAY,+CAA+C,CAAA;AAExE,eAAO,MAAM,8BAA8B,+CAA+C,CAAA;AAE1F;;;GAGG;AACH,eAAO,MAAM,WAAW,OAAO,CAAA;AAU/B,eAAO,MAAM,+BAA+B;;;;;;;;CAI3C,CAAA;AAED,eAAO,MAAM,2BAA2B;;;;;;;;CAIvC,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAkBnE,CAAA"} \ No newline at end of file diff --git a/dist/src/services/socket/constants.js b/dist/src/services/socket/constants.js new file mode 100644 index 000000000..0769d7366 --- /dev/null +++ b/dist/src/services/socket/constants.js @@ -0,0 +1,47 @@ +export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; +// Some services (like Socket) use the null token address to represent the +// native token as the ZERO_ADDRESS is not standard for it. +export const NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; +export const ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'; +/** + * The % of fee to be cut from the source input token amount. + * Can be up to three decimal places and cannot be more than 5%. + */ +export const FEE_PERCENT = 0.25; +const AMBIRE_WALLET_TOKEN_COMMON_PROPS = { + name: 'Ambire Wallet', + symbol: 'WALLET', + decimals: 18, + logoURI: 'https://media.socket.tech/tokens/all/WALLET', + icon: '' // will fallback to get the icon from the same place as the portfolio +}; +export const AMBIRE_WALLET_TOKEN_ON_ETHEREUM = { + chainId: 1, + address: '0x88800092fF476844f74dC2FC427974BBee2794Ae', + ...AMBIRE_WALLET_TOKEN_COMMON_PROPS +}; +export const AMBIRE_WALLET_TOKEN_ON_BASE = { + chainId: 8453, + address: '0x0BbbEad62f7647AE8323d2cb243A0DB74B7C2b80', + ...AMBIRE_WALLET_TOKEN_COMMON_PROPS +}; +export const AMBIRE_FEE_TAKER_ADDRESSES = { + 324: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 1101: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 5000: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 34443: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 43114: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 59144: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 534352: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 1313161554: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 81457: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', + 1: '0xDCe4f65Aa650B3FaFEa9892E807C1770d6e9c618', + 10: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 137: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 8453: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 56: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 42161: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 100: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001', + 7777777: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001' +}; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/dist/src/services/socket/constants.js.map b/dist/src/services/socket/constants.js.map new file mode 100644 index 000000000..1a4650ce1 --- /dev/null +++ b/dist/src/services/socket/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/services/socket/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AACxE,0EAA0E;AAC1E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AAExE,MAAM,CAAC,MAAM,8BAA8B,GAAG,4CAA4C,CAAA;AAE1F;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAA;AAE/B,MAAM,gCAAgC,GAAG;IACvC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE,EAAE,CAAC,qEAAqE;CAC/E,CAAA;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAkC;IACvE,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,CAAC,EAAE,4CAA4C;IAC/C,EAAE,EAAE,4CAA4C;IAChD,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;CACtD,CAAA","sourcesContent":["export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n// Some services (like Socket) use the null token address to represent the\n// native token as the ZERO_ADDRESS is not standard for it.\nexport const NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'\n\n/**\n * The % of fee to be cut from the source input token amount.\n * Can be up to three decimal places and cannot be more than 5%.\n */\nexport const FEE_PERCENT = 0.25\n\nconst AMBIRE_WALLET_TOKEN_COMMON_PROPS = {\n name: 'Ambire Wallet',\n symbol: 'WALLET',\n decimals: 18,\n logoURI: 'https://media.socket.tech/tokens/all/WALLET',\n icon: '' // will fallback to get the icon from the same place as the portfolio\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_ETHEREUM = {\n chainId: 1,\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_BASE = {\n chainId: 8453,\n address: '0x0BbbEad62f7647AE8323d2cb243A0DB74B7C2b80',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_FEE_TAKER_ADDRESSES: { [chainId: number]: string } = {\n 324: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1101: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 5000: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 34443: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 43114: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 59144: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 534352: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1313161554: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 81457: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1: '0xDCe4f65Aa650B3FaFEa9892E807C1770d6e9c618',\n 10: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 137: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 8453: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 56: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 42161: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 100: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 7777777: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001'\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.d.ts b/dist/src/services/unstoppableDomains/index.d.ts new file mode 100644 index 000000000..05d602f30 --- /dev/null +++ b/dist/src/services/unstoppableDomains/index.d.ts @@ -0,0 +1,2 @@ +export * from './unstoppableDomains'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.d.ts.map b/dist/src/services/unstoppableDomains/index.d.ts.map new file mode 100644 index 000000000..0d19f63f4 --- /dev/null +++ b/dist/src/services/unstoppableDomains/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.js b/dist/src/services/unstoppableDomains/index.js new file mode 100644 index 000000000..b44b58d28 --- /dev/null +++ b/dist/src/services/unstoppableDomains/index.js @@ -0,0 +1,2 @@ +export * from './unstoppableDomains'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.js.map b/dist/src/services/unstoppableDomains/index.js.map new file mode 100644 index 000000000..1d64c3787 --- /dev/null +++ b/dist/src/services/unstoppableDomains/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA","sourcesContent":["export * from './unstoppableDomains'\n"]} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts b/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts new file mode 100644 index 000000000..10a951f4e --- /dev/null +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts @@ -0,0 +1,4 @@ +declare function resolveUDomain(domain: string, currency?: any, chain?: any): Promise; +declare function reverseLookupUD(address: string): Promise; +export { resolveUDomain, reverseLookupUD }; +//# sourceMappingURL=unstoppableDomains.d.ts.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts.map b/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts.map new file mode 100644 index 000000000..a2fc0123a --- /dev/null +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"unstoppableDomains.d.ts","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/unstoppableDomains.ts"],"names":[],"mappings":"AA4CA,iBAAe,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1F;AAED,iBAAe,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEtE;AAED,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.js b/dist/src/services/unstoppableDomains/unstoppableDomains.js new file mode 100644 index 000000000..d3165ee68 --- /dev/null +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.js @@ -0,0 +1,60 @@ +import { Resolution } from '@unstoppabledomains/resolution'; +import { networks } from '../../consts/networks'; +// @TODO: Get RPC urls from settings controller +const resolution = new Resolution({ + sourceConfig: { + uns: { + locations: { + Layer1: { + url: networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '', + network: 'mainnet' + }, + Layer2: { + url: networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '', + network: 'polygon-mainnet' + } + } + } + } +}); +function getMessage(e) { + if (e === 'UnregisteredDomain') + return 'Domain is not registered'; + if (e === 'RecordNotFound') + return 'Crypto record is not found (or empty)'; + if (e === 'UnspecifiedResolver') + return 'Domain is not configured (empty resolver)'; + if (e === 'UnsupportedDomain') + return 'Domain is not supported'; + return 'Domain is not registered'; +} +async function resolveAddress(domain) { + return resolution + .addr(domain, 'ETH') + .then((addr) => ({ success: true, address: addr })) + .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) })); +} +async function resolveAddressMultiChain(domain, currency, chain) { + return resolution + .multiChainAddr(domain, currency, chain) + .then((addr) => ({ success: true, address: addr })) + .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) })); +} +async function resolveUDomain(domain, currency, chain) { + const [nativeUDAddress, customUDAddress] = await Promise.all([ + resolveAddress(domain), + resolveAddressMultiChain(domain, currency, chain) + ]); + if (customUDAddress.success && 'address' in customUDAddress && customUDAddress.address) { + return customUDAddress.address; + } + if (nativeUDAddress.success && 'address' in nativeUDAddress && nativeUDAddress.address) { + return nativeUDAddress.address; + } + return ''; +} +async function reverseLookupUD(address) { + return resolution.reverse(address); +} +export { resolveUDomain, reverseLookupUD }; +//# sourceMappingURL=unstoppableDomains.js.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.js.map b/dist/src/services/unstoppableDomains/unstoppableDomains.js.map new file mode 100644 index 000000000..d79f6d567 --- /dev/null +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unstoppableDomains.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/unstoppableDomains.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolution } from '@unstoppabledomains/resolution'\n\nimport { networks } from '../../consts/networks'\n\n// @TODO: Get RPC urls from settings controller\nconst resolution = new Resolution({\n sourceConfig: {\n uns: {\n locations: {\n Layer1: {\n url: networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '',\n network: 'mainnet'\n },\n Layer2: {\n url: networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '',\n network: 'polygon-mainnet'\n }\n }\n }\n }\n})\n\nfunction getMessage(e?: string) {\n if (e === 'UnregisteredDomain') return 'Domain is not registered'\n if (e === 'RecordNotFound') return 'Crypto record is not found (or empty)'\n if (e === 'UnspecifiedResolver') return 'Domain is not configured (empty resolver)'\n if (e === 'UnsupportedDomain') return 'Domain is not supported'\n return 'Domain is not registered'\n}\n\nasync function resolveAddress(domain: string) {\n return resolution\n .addr(domain, 'ETH')\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveAddressMultiChain(domain: string, currency: string, chain: string) {\n return resolution\n .multiChainAddr(domain, currency, chain)\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveUDomain(domain: string, currency?: any, chain?: any): Promise {\n const [nativeUDAddress, customUDAddress] = await Promise.all([\n resolveAddress(domain),\n resolveAddressMultiChain(domain, currency, chain)\n ])\n\n if (customUDAddress.success && 'address' in customUDAddress && customUDAddress.address) {\n return customUDAddress.address\n }\n\n if (nativeUDAddress.success && 'address' in nativeUDAddress && nativeUDAddress.address) {\n return nativeUDAddress.address\n }\n\n return ''\n}\n\nasync function reverseLookupUD(address: string): Promise {\n return resolution.reverse(address)\n}\n\nexport { resolveUDomain, reverseLookupUD }\n"]} \ No newline at end of file diff --git a/dist/src/services/validations/index.d.ts b/dist/src/services/validations/index.d.ts new file mode 100644 index 000000000..6dd3c99c1 --- /dev/null +++ b/dist/src/services/validations/index.d.ts @@ -0,0 +1,2 @@ +export * from './validate'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/src/services/validations/index.d.ts.map b/dist/src/services/validations/index.d.ts.map new file mode 100644 index 000000000..3c541791f --- /dev/null +++ b/dist/src/services/validations/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/validations/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"} \ No newline at end of file diff --git a/dist/src/services/validations/index.js b/dist/src/services/validations/index.js new file mode 100644 index 000000000..d85c63e49 --- /dev/null +++ b/dist/src/services/validations/index.js @@ -0,0 +1,2 @@ +export * from './validate'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/validations/index.js.map b/dist/src/services/validations/index.js.map new file mode 100644 index 000000000..96b3e4f71 --- /dev/null +++ b/dist/src/services/validations/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/validations/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA","sourcesContent":["export * from './validate'\n"]} \ No newline at end of file diff --git a/dist/src/services/validations/validate.d.ts b/dist/src/services/validations/validate.d.ts new file mode 100644 index 000000000..9d8d094e4 --- /dev/null +++ b/dist/src/services/validations/validate.d.ts @@ -0,0 +1,15 @@ +import isEmail from 'validator/es/lib/isEmail'; +import { TokenResult } from '../../libs/portfolio'; +type ValidateReturnType = { + success: boolean; + message: string; +}; +declare const validateAddAuthSignerAddress: (address: string, selectedAcc: any) => ValidateReturnType; +declare const validateSendTransferAddress: (address: string, selectedAcc: string, addressConfirmed: any, isRecipientAddressUnknown: boolean, isRecipientHumanizerKnownTokenOrSmartContract: boolean, isUDAddress: boolean, isEnsAddress: boolean, isRecipientDomainResolving: boolean, isSWWarningVisible?: boolean, isSWWarningAgreed?: boolean) => ValidateReturnType; +declare const validateSendTransferAmount: (amount: string, maxAmount: number, maxAmountInFiat: number, selectedAsset: TokenResult) => ValidateReturnType; +declare const validateSendNftAddress: (address: string, selectedAcc: any, addressConfirmed: any, isRecipientAddressUnknown: boolean, isRecipientHumanizerKnownTokenOrSmartContract: boolean, metadata: any, selectedNetwork: any, network: any, isUDAddress: boolean, isEnsAddress: boolean, isRecipientDomainResolving: boolean) => ValidateReturnType; +declare const isValidCode: (code: string) => boolean; +declare const isValidPassword: (password: string) => boolean; +declare function isValidURL(url: string): boolean; +export { isEmail, validateAddAuthSignerAddress, validateSendTransferAddress, validateSendTransferAmount, validateSendNftAddress, isValidCode, isValidPassword, isValidURL }; +//# sourceMappingURL=validate.d.ts.map \ No newline at end of file diff --git a/dist/src/services/validations/validate.d.ts.map b/dist/src/services/validations/validate.d.ts.map new file mode 100644 index 000000000..bf9a45165 --- /dev/null +++ b/dist/src/services/validations/validate.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/services/validations/validate.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,0BAA0B,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKlD,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AA6BD,QAAA,MAAM,4BAA4B,YAAa,MAAM,eAAe,GAAG,KAAG,kBAYzE,CAAA;AAED,QAAA,MAAM,2BAA2B,YACtB,MAAM,eACF,MAAM,oBACD,GAAG,6BACM,OAAO,iDACa,OAAO,eACzC,OAAO,gBACN,OAAO,8BACO,OAAO,uBACd,OAAO,sBACR,OAAO,KAC1B,kBA0DF,CAAA;AAED,QAAA,MAAM,0BAA0B,WACtB,MAAM,aACH,MAAM,mBACA,MAAM,iBACR,WAAW,KACzB,kBA8CF,CAAA;AAED,QAAA,MAAM,sBAAsB,YACjB,MAAM,eACF,GAAG,oBACE,GAAG,6BACM,OAAO,iDACa,OAAO,YAC5C,GAAG,mBACI,GAAG,WACX,GAAG,eACC,OAAO,gBACN,OAAO,8BACO,OAAO,KAClC,kBAgCF,CAAA;AAED,QAAA,MAAM,WAAW,SAAU,MAAM,YAAsB,CAAA;AAEvD,QAAA,MAAM,eAAe,aAAc,MAAM,YAAyB,CAAA;AAElE,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,WAK9B;AAED,OAAO,EACL,OAAO,EACP,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,UAAU,EACX,CAAA"} \ No newline at end of file diff --git a/dist/src/services/validations/validate.js b/dist/src/services/validations/validate.js new file mode 100644 index 000000000..17941e6c5 --- /dev/null +++ b/dist/src/services/validations/validate.js @@ -0,0 +1,156 @@ +import { getAddress, parseUnits } from 'ethers'; +import isEmail from 'validator/es/lib/isEmail'; +import { getTokenAmount } from '../../libs/portfolio/helpers'; +import { getSanitizedAmount } from '../../libs/transfer/amount'; +import { isValidAddress } from '../address'; +const validateAddress = (address) => { + if (!(address && address.length)) { + return { + success: false, + message: '' + }; + } + if (!(address && isValidAddress(address))) { + return { + success: false, + message: 'Invalid address.' + }; + } + try { + getAddress(address); + } + catch { + return { + success: false, + message: 'Invalid checksum. Verify the address and try again.' + }; + } + return { success: true, message: '' }; +}; +const validateAddAuthSignerAddress = (address, selectedAcc) => { + const isValidAddr = validateAddress(address); + if (!isValidAddr.success) + return isValidAddr; + if (address && selectedAcc && address === selectedAcc) { + return { + success: false, + message: 'The entered address should be different than your own account address.' + }; + } + return { success: true, message: '' }; +}; +const validateSendTransferAddress = (address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, isRecipientDomainResolving, isSWWarningVisible, isSWWarningAgreed) => { + // Basic validation is handled in the AddressInput component and we don't want to overwrite it. + if (!isValidAddress(address) || isRecipientDomainResolving) { + return { + success: true, + message: '' + }; + } + if (selectedAcc && address.toLowerCase() === selectedAcc.toLowerCase()) { + return { + success: false, + message: 'The entered address should be different than the your own account address.' + }; + } + if (isRecipientHumanizerKnownTokenOrSmartContract) { + return { + success: false, + message: 'You are trying to send tokens to a smart contract. Doing so would burn them.' + }; + } + if (isRecipientAddressUnknown && + !addressConfirmed && + !isUDAddress && + !isEnsAddress && + !isRecipientDomainResolving) { + return { + success: false, + message: "You're trying to send to an unknown address. If you're really sure, confirm using the checkbox below." + }; + } + if (isRecipientAddressUnknown && + !addressConfirmed && + (isUDAddress || isEnsAddress) && + !isRecipientDomainResolving) { + const name = isUDAddress ? 'Unstoppable domain' : 'Ethereum Name Service'; + return { + success: false, + message: `You're trying to send to an unknown ${name}. If you really trust the person who gave it to you, confirm using the checkbox below.` + }; + } + if (isRecipientAddressUnknown && addressConfirmed && isSWWarningVisible && !isSWWarningAgreed) { + return { + success: false, + message: 'Please confirm that the recipient address is not an exchange.' + }; + } + return { success: true, message: '' }; +}; +const validateSendTransferAmount = (amount, maxAmount, maxAmountInFiat, selectedAsset) => { + const sanitizedAmount = getSanitizedAmount(amount, selectedAsset.decimals); + if (!(sanitizedAmount && sanitizedAmount.length)) { + return { + success: false, + message: '' + }; + } + if (!(sanitizedAmount && Number(sanitizedAmount) > 0)) { + return { + success: false, + message: 'The amount must be greater than 0.' + }; + } + try { + if (sanitizedAmount && selectedAsset && selectedAsset.decimals) { + if (Number(sanitizedAmount) < 1 / 10 ** selectedAsset.decimals) + return { + success: false, + message: 'Token amount too low.' + }; + const currentAmount = parseUnits(sanitizedAmount, selectedAsset.decimals); + if (currentAmount > getTokenAmount(selectedAsset)) { + return { + success: false, + message: `The amount is greater than the asset's balance: ${Number(maxAmount) || 0} ${selectedAsset?.symbol}${maxAmountInFiat ? `/ ${Number(maxAmountInFiat)} USD.` : ''}` + }; + } + } + } + catch (e) { + console.error(e); + return { + success: false, + message: 'Invalid amount.' + }; + } + return { success: true, message: '' }; +}; +const validateSendNftAddress = (address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, metadata, selectedNetwork, network, isUDAddress, isEnsAddress, isRecipientDomainResolving) => { + const isValidAddr = validateSendTransferAddress(address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, isRecipientDomainResolving); + if (!isValidAddr.success) + return isValidAddr; + if (metadata && + selectedAcc && + metadata.owner?.address.toLowerCase() !== selectedAcc.toLowerCase()) { + return { + success: false, + message: "The NFT you're trying to send is not owned by you!" + }; + } + if (selectedNetwork && network && selectedNetwork.id !== network) { + return { + success: false, + message: 'The selected network is not the correct one.' + }; + } + return { success: true, message: '' }; +}; +const isValidCode = (code) => code.length === 6; +const isValidPassword = (password) => password.length >= 8; +function isValidURL(url) { + const urlRegex = /^(?:https?|ftp):\/\/(?:\w+:{0,1}\w*@)?(?:\S+)(?::\d+)?(?:\/|\/(?:[\w#!:.?+=&%@!\-\/]))?$/; + return urlRegex.test(url); +} +export { isEmail, validateAddAuthSignerAddress, validateSendTransferAddress, validateSendTransferAmount, validateSendNftAddress, isValidCode, isValidPassword, isValidURL }; +//# sourceMappingURL=validate.js.map \ No newline at end of file diff --git a/dist/src/services/validations/validate.js.map b/dist/src/services/validations/validate.js.map new file mode 100644 index 000000000..7b9c8c3c3 --- /dev/null +++ b/dist/src/services/validations/validate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/services/validations/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, parseUnits } from 'ethers'\nimport isEmail from 'validator/es/lib/isEmail'\n\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { isValidAddress } from '../address'\n\ntype ValidateReturnType = {\n success: boolean\n message: string\n}\n\nconst validateAddress = (address: string): ValidateReturnType => {\n if (!(address && address.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(address && isValidAddress(address))) {\n return {\n success: false,\n message: 'Invalid address.'\n }\n }\n\n try {\n getAddress(address)\n } catch {\n return {\n success: false,\n message: 'Invalid checksum. Verify the address and try again.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateAddAuthSignerAddress = (address: string, selectedAcc: any): ValidateReturnType => {\n const isValidAddr = validateAddress(address)\n if (!isValidAddr.success) return isValidAddr\n\n if (address && selectedAcc && address === selectedAcc) {\n return {\n success: false,\n message: 'The entered address should be different than your own account address.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAddress = (\n address: string,\n selectedAcc: string,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean,\n isSWWarningVisible?: boolean,\n isSWWarningAgreed?: boolean\n): ValidateReturnType => {\n // Basic validation is handled in the AddressInput component and we don't want to overwrite it.\n if (!isValidAddress(address) || isRecipientDomainResolving) {\n return {\n success: true,\n message: ''\n }\n }\n\n if (selectedAcc && address.toLowerCase() === selectedAcc.toLowerCase()) {\n return {\n success: false,\n message: 'The entered address should be different than the your own account address.'\n }\n }\n\n if (isRecipientHumanizerKnownTokenOrSmartContract) {\n return {\n success: false,\n message: 'You are trying to send tokens to a smart contract. Doing so would burn them.'\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n !isUDAddress &&\n !isEnsAddress &&\n !isRecipientDomainResolving\n ) {\n return {\n success: false,\n message:\n \"You're trying to send to an unknown address. If you're really sure, confirm using the checkbox below.\"\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n (isUDAddress || isEnsAddress) &&\n !isRecipientDomainResolving\n ) {\n const name = isUDAddress ? 'Unstoppable domain' : 'Ethereum Name Service'\n return {\n success: false,\n message: `You're trying to send to an unknown ${name}. If you really trust the person who gave it to you, confirm using the checkbox below.`\n }\n }\n\n if (isRecipientAddressUnknown && addressConfirmed && isSWWarningVisible && !isSWWarningAgreed) {\n return {\n success: false,\n message: 'Please confirm that the recipient address is not an exchange.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAmount = (\n amount: string,\n maxAmount: number,\n maxAmountInFiat: number,\n selectedAsset: TokenResult\n): ValidateReturnType => {\n const sanitizedAmount = getSanitizedAmount(amount, selectedAsset.decimals)\n\n if (!(sanitizedAmount && sanitizedAmount.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(sanitizedAmount && Number(sanitizedAmount) > 0)) {\n return {\n success: false,\n message: 'The amount must be greater than 0.'\n }\n }\n\n try {\n if (sanitizedAmount && selectedAsset && selectedAsset.decimals) {\n if (Number(sanitizedAmount) < 1 / 10 ** selectedAsset.decimals)\n return {\n success: false,\n message: 'Token amount too low.'\n }\n\n const currentAmount: bigint = parseUnits(sanitizedAmount, selectedAsset.decimals)\n\n if (currentAmount > getTokenAmount(selectedAsset)) {\n return {\n success: false,\n message: `The amount is greater than the asset's balance: ${Number(maxAmount) || 0} ${\n selectedAsset?.symbol\n }${maxAmountInFiat ? `/ ${Number(maxAmountInFiat)} USD.` : ''}`\n }\n }\n }\n } catch (e) {\n console.error(e)\n\n return {\n success: false,\n message: 'Invalid amount.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendNftAddress = (\n address: string,\n selectedAcc: any,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n metadata: any,\n selectedNetwork: any,\n network: any,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean\n): ValidateReturnType => {\n const isValidAddr = validateSendTransferAddress(\n address,\n selectedAcc,\n addressConfirmed,\n isRecipientAddressUnknown,\n isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n isRecipientDomainResolving\n )\n if (!isValidAddr.success) return isValidAddr\n\n if (\n metadata &&\n selectedAcc &&\n metadata.owner?.address.toLowerCase() !== selectedAcc.toLowerCase()\n ) {\n return {\n success: false,\n message: \"The NFT you're trying to send is not owned by you!\"\n }\n }\n\n if (selectedNetwork && network && selectedNetwork.id !== network) {\n return {\n success: false,\n message: 'The selected network is not the correct one.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst isValidCode = (code: string) => code.length === 6\n\nconst isValidPassword = (password: string) => password.length >= 8\n\nfunction isValidURL(url: string) {\n const urlRegex =\n /^(?:https?|ftp):\\/\\/(?:\\w+:{0,1}\\w*@)?(?:\\S+)(?::\\d+)?(?:\\/|\\/(?:[\\w#!:.?+=&%@!\\-\\/]))?$/\n\n return urlRegex.test(url)\n}\n\nexport {\n isEmail,\n validateAddAuthSignerAddress,\n validateSendTransferAddress,\n validateSendTransferAmount,\n validateSendNftAddress,\n isValidCode,\n isValidPassword,\n isValidURL\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/accounts.d.ts b/dist/src/utils/accounts.d.ts new file mode 100644 index 000000000..8e2b34992 --- /dev/null +++ b/dist/src/utils/accounts.d.ts @@ -0,0 +1,4 @@ +import { Key } from 'interfaces/keystore'; +declare const getIsViewOnly: (keys: Key[], accountKeys: string[]) => boolean; +export { getIsViewOnly }; +//# sourceMappingURL=accounts.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/accounts.d.ts.map b/dist/src/utils/accounts.d.ts.map new file mode 100644 index 000000000..6e4afc441 --- /dev/null +++ b/dist/src/utils/accounts.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,QAAA,MAAM,aAAa,SAAU,GAAG,EAAE,eAAe,MAAM,EAAE,YAExD,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/accounts.js b/dist/src/utils/accounts.js new file mode 100644 index 000000000..60db53655 --- /dev/null +++ b/dist/src/utils/accounts.js @@ -0,0 +1,5 @@ +const getIsViewOnly = (keys, accountKeys) => { + return keys.every((k) => !accountKeys.includes(k.addr)); +}; +export { getIsViewOnly }; +//# sourceMappingURL=accounts.js.map \ No newline at end of file diff --git a/dist/src/utils/accounts.js.map b/dist/src/utils/accounts.js.map new file mode 100644 index 000000000..e6ea4ebf7 --- /dev/null +++ b/dist/src/utils/accounts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,WAAqB,EAAE,EAAE;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,CAAA","sourcesContent":["import { Key } from 'interfaces/keystore'\n\nconst getIsViewOnly = (keys: Key[], accountKeys: string[]) => {\n return keys.every((k) => !accountKeys.includes(k.addr))\n}\n\nexport { getIsViewOnly }\n"]} \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.d.ts b/dist/src/utils/addHexPrefix.d.ts new file mode 100644 index 000000000..63636ad96 --- /dev/null +++ b/dist/src/utils/addHexPrefix.d.ts @@ -0,0 +1,5 @@ +/** + * Adds "0x" to a given `String` if it does not already start with "0x". + */ +export declare const addHexPrefix: (str: string) => string; +//# sourceMappingURL=addHexPrefix.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.d.ts.map b/dist/src/utils/addHexPrefix.d.ts.map new file mode 100644 index 000000000..7286913af --- /dev/null +++ b/dist/src/utils/addHexPrefix.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"addHexPrefix.d.ts","sourceRoot":"","sources":["../../../src/utils/addHexPrefix.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,YAAY,QAAS,MAAM,WAMvC,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.js b/dist/src/utils/addHexPrefix.js new file mode 100644 index 000000000..bfeac9e0f --- /dev/null +++ b/dist/src/utils/addHexPrefix.js @@ -0,0 +1,11 @@ +import { isHexPrefixed } from './isHexPrefixed'; +/** + * Adds "0x" to a given `String` if it does not already start with "0x". + */ +export const addHexPrefix = (str) => { + if (typeof str !== 'string') { + return str; + } + return isHexPrefixed(str) ? str : `0x${str}`; +}; +//# sourceMappingURL=addHexPrefix.js.map \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.js.map b/dist/src/utils/addHexPrefix.js.map new file mode 100644 index 000000000..f6daa5537 --- /dev/null +++ b/dist/src/utils/addHexPrefix.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/addHexPrefix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,OAAO,GAAG,CAAA;KACX;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Adds \"0x\" to a given `String` if it does not already start with \"0x\".\n */\nexport const addHexPrefix = (str: string) => {\n if (typeof str !== 'string') {\n return str\n }\n\n return isHexPrefixed(str) ? str : `0x${str}`\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/benzin.d.ts b/dist/src/utils/benzin.d.ts new file mode 100644 index 000000000..ebc78ef39 --- /dev/null +++ b/dist/src/utils/benzin.d.ts @@ -0,0 +1,9 @@ +import { AccountOpIdentifiedBy } from '../libs/accountOp/submittedAccountOp'; +declare const getBenzinUrlParams: ({ chainId, txnId, identifiedBy, isInternal }: { + chainId?: string | number | bigint | undefined; + txnId?: string | null | undefined; + identifiedBy?: AccountOpIdentifiedBy | undefined; + isInternal?: boolean | undefined; +}) => string; +export { getBenzinUrlParams }; +//# sourceMappingURL=benzin.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/benzin.d.ts.map b/dist/src/utils/benzin.d.ts.map new file mode 100644 index 000000000..4fa38b3a9 --- /dev/null +++ b/dist/src/utils/benzin.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"benzin.d.ts","sourceRoot":"","sources":["../../../src/utils/benzin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGtB,MAAM,sCAAsC,CAAA;AAE7C,QAAA,MAAM,kBAAkB;;;;;MAUpB,MAYH,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/benzin.js b/dist/src/utils/benzin.js new file mode 100644 index 000000000..d76cedc93 --- /dev/null +++ b/dist/src/utils/benzin.js @@ -0,0 +1,8 @@ +import { isIdentifiedByRelayer, isIdentifiedByUserOpHash } from '../libs/accountOp/submittedAccountOp'; +const getBenzinUrlParams = ({ chainId, txnId, identifiedBy, isInternal }) => { + const userOpHash = identifiedBy && isIdentifiedByUserOpHash(identifiedBy) ? identifiedBy.identifier : undefined; + const relayerId = identifiedBy && isIdentifiedByRelayer(identifiedBy) ? identifiedBy.identifier : undefined; + return `?chainId=${String(chainId)}${txnId ? `&txnId=${txnId}` : ''}${userOpHash ? `&userOpHash=${userOpHash}` : ''}${relayerId ? `&relayerId=${relayerId}` : ''}${identifiedBy?.bundler ? `&bundler=${identifiedBy?.bundler}` : ''}${isInternal ? '&isInternal' : ''}`; +}; +export { getBenzinUrlParams }; +//# sourceMappingURL=benzin.js.map \ No newline at end of file diff --git a/dist/src/utils/benzin.js.map b/dist/src/utils/benzin.js.map new file mode 100644 index 000000000..ff73292e7 --- /dev/null +++ b/dist/src/utils/benzin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"benzin.js","sourceRoot":"","sources":["../../../src/utils/benzin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,sCAAsC,CAAA;AAE7C,MAAM,kBAAkB,GAAG,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EAMX,EAAU,EAAE;IACX,MAAM,UAAU,GACd,YAAY,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE9F,MAAM,SAAS,GACb,YAAY,IAAI,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3F,OAAO,YAAY,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GACjE,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC,CAAC,EAC7C,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAC3C,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAChE,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACtC,CAAC,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA","sourcesContent":["import {\n AccountOpIdentifiedBy,\n isIdentifiedByRelayer,\n isIdentifiedByUserOpHash\n} from '../libs/accountOp/submittedAccountOp'\n\nconst getBenzinUrlParams = ({\n chainId,\n txnId,\n identifiedBy,\n isInternal\n}: {\n chainId?: string | number | bigint\n txnId?: string | null\n identifiedBy?: AccountOpIdentifiedBy\n isInternal?: boolean\n}): string => {\n const userOpHash =\n identifiedBy && isIdentifiedByUserOpHash(identifiedBy) ? identifiedBy.identifier : undefined\n\n const relayerId =\n identifiedBy && isIdentifiedByRelayer(identifiedBy) ? identifiedBy.identifier : undefined\n\n return `?chainId=${String(chainId)}${txnId ? `&txnId=${txnId}` : ''}${\n userOpHash ? `&userOpHash=${userOpHash}` : ''\n }${relayerId ? `&relayerId=${relayerId}` : ''}${\n identifiedBy?.bundler ? `&bundler=${identifiedBy?.bundler}` : ''\n }${isInternal ? '&isInternal' : ''}`\n}\n\nexport { getBenzinUrlParams }\n"]} \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.d.ts b/dist/src/utils/formatDecimals/formatDecimals.d.ts new file mode 100644 index 000000000..6b795120a --- /dev/null +++ b/dist/src/utils/formatDecimals/formatDecimals.d.ts @@ -0,0 +1,4 @@ +type FormatType = 'value' | 'price' | 'amount' | 'default' | 'precise'; +declare const formatDecimals: (value?: number | undefined, type?: FormatType) => string; +export default formatDecimals; +//# sourceMappingURL=formatDecimals.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.d.ts.map b/dist/src/utils/formatDecimals/formatDecimals.d.ts.map new file mode 100644 index 000000000..5c93c72ad --- /dev/null +++ b/dist/src/utils/formatDecimals/formatDecimals.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"formatDecimals.d.ts","sourceRoot":"","sources":["../../../../src/utils/formatDecimals/formatDecimals.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AA2FtE,QAAA,MAAM,cAAc,WAAW,MAAM,GAAG,SAAS,SAAoB,UAAU,WAkC9E,CAAA;AAED,eAAe,cAAc,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.js b/dist/src/utils/formatDecimals/formatDecimals.js new file mode 100644 index 000000000..10cb46fe3 --- /dev/null +++ b/dist/src/utils/formatDecimals/formatDecimals.js @@ -0,0 +1,99 @@ +const DEFAULT_DECIMALS = 2; +const DECIMAL_RULES = { + value: { + min: 2, + max: 2 + }, + price: { + min: 2, + max: 2 + }, + amount: { + min: 0, + max: 2 + }, + default: { + min: 0, + max: 2 + }, + precise: { + min: 0, + max: 8 + } +}; +const TYPES_WITH_DOLLAR_PREFIX = ['value', 'price']; +/** + * Removes trailing zeros from a decimal string. + * @example + * removeTrailingZeros('1.0500') // '1.05' + */ +const removeTrailingZeros = (decimalStr, minDecimals = 0) => { + if (!decimalStr.includes('.')) + return decimalStr; // If there's no decimal point, return the original string + let result = decimalStr; + // Loop from the end of the string until a non-zero character is found + while (result.endsWith('0') && + (!minDecimals || result.length - 1 - result.indexOf('.') > minDecimals)) { + result = result.slice(0, -1); // Remove the last character + } + // If the string ends with a decimal point after removing zeros, remove it + if (result.endsWith('.')) { + result = result.slice(0, -1); + } + return result; +}; +const getIndexOfFirstNonZeroInDecimals = (value, type) => { + // Fixes scientific notation when converting to string + const decimalValue = value.toFixed(value < 1 ? 16 : 2); + const valueString = decimalValue.toString(); + const indexOfDot = valueString.indexOf('.'); + if (indexOfDot === -1) + return 0; + const decimals = valueString.slice(indexOfDot + 1); + const indexOfFirstNonZero = decimals.split('').findIndex((char) => char !== '0'); + return indexOfFirstNonZero === -1 ? DECIMAL_RULES[type].min : indexOfFirstNonZero; +}; +const getPrefix = (widthDollarPrefix) => (widthDollarPrefix ? '$' : ''); +const formatNumber = (value, withDollarPrefix, decimals, sign, type) => { + const stringValue = value.toFixed(16); + const [integer, decimal] = stringValue.split('.'); + // Display the number with the determined number of decimals + const decimalFormatted = decimal.slice(0, decimals); + // Add commas to the integer part of the number. E.g. 1000 -> 1,000 + const integerFormatted = Number(integer).toLocaleString('en-US', { maximumFractionDigits: 0 }); + const reconstructedStringValue = `${integerFormatted}.${decimalFormatted}`; + const stringValueWithoutTrailingZeros = removeTrailingZeros(reconstructedStringValue, type ? DECIMAL_RULES[type].min : undefined); + return `${sign}${getPrefix(withDollarPrefix)}${stringValueWithoutTrailingZeros}`; +}; +// A function that formats a number to a string with a specific number of decimals. +// Based on the passed type it will add a dollar sign prefix. +const formatDecimals = (value = undefined, type = 'default') => { + const withDollarPrefix = TYPES_WITH_DOLLAR_PREFIX.includes(type || ''); + if (value === 0) { + if (type === 'amount') + return `${getPrefix(withDollarPrefix)}0`; + return `${getPrefix(withDollarPrefix)}0.00`; + } + if (!value || Number.isNaN(value)) + return `${getPrefix(withDollarPrefix)}-`; + // The absolute value is used to determine the number of decimals and + // then the actual value is formatted with the determined number of decimals. + const absoluteValue = Math.abs(value); + const sign = value < 0 ? '-' : ''; + if (type === 'value') { + if (absoluteValue < 0.01) { + return `${sign}<$0.01`; + } + return formatNumber(absoluteValue, withDollarPrefix, DEFAULT_DECIMALS, sign, type); + } + if (type === 'amount') { + if (absoluteValue < 0.00001) { + return `${sign}<0.00001`; + } + } + const indexOfFirstNonZero = getIndexOfFirstNonZeroInDecimals(value, type); + const decimals = indexOfFirstNonZero + DECIMAL_RULES[type].max; + return formatNumber(absoluteValue, withDollarPrefix, decimals, sign, type); +}; +export default formatDecimals; +//# sourceMappingURL=formatDecimals.js.map \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.js.map b/dist/src/utils/formatDecimals/formatDecimals.js.map new file mode 100644 index 000000000..b8dd047c1 --- /dev/null +++ b/dist/src/utils/formatDecimals/formatDecimals.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formatDecimals.js","sourceRoot":"","sources":["../../../../src/utils/formatDecimals/formatDecimals.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAC1B,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;CACF,CAAA;AACD,MAAM,wBAAwB,GAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAEjE;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAE,cAAsB,CAAC,EAAE,EAAE;IAC1E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAA,CAAC,0DAA0D;IAE3G,IAAI,MAAM,GAAG,UAAU,CAAA;IAEvB,sEAAsE;IACtE,OACE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EACvE;QACA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,4BAA4B;KAC1D;IAED,0EAA0E;IAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;KAC7B;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,gCAAgC,GAAG,CAAC,KAAa,EAAE,IAAgB,EAAE,EAAE;IAC3E,sDAAsD;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3C,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;IAEhF,OAAO,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAA;AACnF,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,iBAA0B,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAEhF,MAAM,YAAY,GAAG,CACnB,KAAa,EACb,gBAAyB,EACzB,QAAgB,EAChB,IAAY,EACZ,IAAgB,EAChB,EAAE;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACrC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjD,4DAA4D;IAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACnD,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9F,MAAM,wBAAwB,GAAG,GAAG,gBAAgB,IAAI,gBAAgB,EAAE,CAAA;IAC1E,MAAM,+BAA+B,GAAG,mBAAmB,CACzD,wBAAwB,EACxB,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;IAED,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,+BAA+B,EAAE,CAAA;AAClF,CAAC,CAAA;AAED,mFAAmF;AACnF,6DAA6D;AAC7D,MAAM,cAAc,GAAG,CAAC,QAA4B,SAAS,EAAE,OAAmB,SAAS,EAAE,EAAE;IAC7F,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAEtE,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAA;QAE/D,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAA;KAC5C;IACD,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAA;IAE3E,qEAAqE;IACrE,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAEjC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,IAAI,aAAa,GAAG,IAAI,EAAE;YACxB,OAAO,GAAG,IAAI,QAAQ,CAAA;SACvB;QAED,OAAO,YAAY,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;KACnF;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,IAAI,aAAa,GAAG,OAAO,EAAE;YAC3B,OAAO,GAAG,IAAI,UAAU,CAAA;SACzB;KACF;IAED,MAAM,mBAAmB,GAAG,gCAAgC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAEzE,MAAM,QAAQ,GAAG,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IAE9D,OAAO,YAAY,CAAC,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC5E,CAAC,CAAA;AAED,eAAe,cAAc,CAAA","sourcesContent":["type FormatType = 'value' | 'price' | 'amount' | 'default' | 'precise'\n\nconst DEFAULT_DECIMALS = 2\nconst DECIMAL_RULES = {\n value: {\n min: 2,\n max: 2\n },\n price: {\n min: 2,\n max: 2\n },\n amount: {\n min: 0,\n max: 2\n },\n default: {\n min: 0,\n max: 2\n },\n precise: {\n min: 0,\n max: 8\n }\n}\nconst TYPES_WITH_DOLLAR_PREFIX: FormatType[] = ['value', 'price']\n\n/**\n * Removes trailing zeros from a decimal string.\n * @example\n * removeTrailingZeros('1.0500') // '1.05'\n */\nconst removeTrailingZeros = (decimalStr: string, minDecimals: number = 0) => {\n if (!decimalStr.includes('.')) return decimalStr // If there's no decimal point, return the original string\n\n let result = decimalStr\n\n // Loop from the end of the string until a non-zero character is found\n while (\n result.endsWith('0') &&\n (!minDecimals || result.length - 1 - result.indexOf('.') > minDecimals)\n ) {\n result = result.slice(0, -1) // Remove the last character\n }\n\n // If the string ends with a decimal point after removing zeros, remove it\n if (result.endsWith('.')) {\n result = result.slice(0, -1)\n }\n\n return result\n}\n\nconst getIndexOfFirstNonZeroInDecimals = (value: number, type: FormatType) => {\n // Fixes scientific notation when converting to string\n const decimalValue = value.toFixed(value < 1 ? 16 : 2)\n const valueString = decimalValue.toString()\n const indexOfDot = valueString.indexOf('.')\n if (indexOfDot === -1) return 0\n const decimals = valueString.slice(indexOfDot + 1)\n const indexOfFirstNonZero = decimals.split('').findIndex((char) => char !== '0')\n\n return indexOfFirstNonZero === -1 ? DECIMAL_RULES[type].min : indexOfFirstNonZero\n}\n\nconst getPrefix = (widthDollarPrefix: boolean) => (widthDollarPrefix ? '$' : '')\n\nconst formatNumber = (\n value: number,\n withDollarPrefix: boolean,\n decimals: number,\n sign: string,\n type: FormatType\n) => {\n const stringValue = value.toFixed(16)\n const [integer, decimal] = stringValue.split('.')\n // Display the number with the determined number of decimals\n const decimalFormatted = decimal.slice(0, decimals)\n // Add commas to the integer part of the number. E.g. 1000 -> 1,000\n const integerFormatted = Number(integer).toLocaleString('en-US', { maximumFractionDigits: 0 })\n const reconstructedStringValue = `${integerFormatted}.${decimalFormatted}`\n const stringValueWithoutTrailingZeros = removeTrailingZeros(\n reconstructedStringValue,\n type ? DECIMAL_RULES[type].min : undefined\n )\n\n return `${sign}${getPrefix(withDollarPrefix)}${stringValueWithoutTrailingZeros}`\n}\n\n// A function that formats a number to a string with a specific number of decimals.\n// Based on the passed type it will add a dollar sign prefix.\nconst formatDecimals = (value: number | undefined = undefined, type: FormatType = 'default') => {\n const withDollarPrefix = TYPES_WITH_DOLLAR_PREFIX.includes(type || '')\n\n if (value === 0) {\n if (type === 'amount') return `${getPrefix(withDollarPrefix)}0`\n\n return `${getPrefix(withDollarPrefix)}0.00`\n }\n if (!value || Number.isNaN(value)) return `${getPrefix(withDollarPrefix)}-`\n\n // The absolute value is used to determine the number of decimals and\n // then the actual value is formatted with the determined number of decimals.\n const absoluteValue = Math.abs(value)\n const sign = value < 0 ? '-' : ''\n\n if (type === 'value') {\n if (absoluteValue < 0.01) {\n return `${sign}<$0.01`\n }\n\n return formatNumber(absoluteValue, withDollarPrefix, DEFAULT_DECIMALS, sign, type)\n }\n\n if (type === 'amount') {\n if (absoluteValue < 0.00001) {\n return `${sign}<0.00001`\n }\n }\n\n const indexOfFirstNonZero = getIndexOfFirstNonZeroInDecimals(value, type)\n\n const decimals = indexOfFirstNonZero + DECIMAL_RULES[type].max\n\n return formatNumber(absoluteValue, withDollarPrefix, decimals, sign, type)\n}\n\nexport default formatDecimals\n"]} \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.d.ts b/dist/src/utils/generateSpoofSig.d.ts new file mode 100644 index 000000000..8753d1092 --- /dev/null +++ b/dist/src/utils/generateSpoofSig.d.ts @@ -0,0 +1,3 @@ +declare const generateSpoofSig: (signer: string) => string; +export default generateSpoofSig; +//# sourceMappingURL=generateSpoofSig.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.d.ts.map b/dist/src/utils/generateSpoofSig.d.ts.map new file mode 100644 index 000000000..7409dba7c --- /dev/null +++ b/dist/src/utils/generateSpoofSig.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"generateSpoofSig.d.ts","sourceRoot":"","sources":["../../../src/utils/generateSpoofSig.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,gBAAgB,WAAY,MAAM,WAMvC,CAAA;AAED,eAAe,gBAAgB,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.js b/dist/src/utils/generateSpoofSig.js new file mode 100644 index 000000000..3dc6ec5b5 --- /dev/null +++ b/dist/src/utils/generateSpoofSig.js @@ -0,0 +1,9 @@ +import { AbiCoder } from 'ethers'; +const generateSpoofSig = (signer) => { + const SPOOF_SIGTYPE = '03'; + const abiCoder = new AbiCoder(); + const signature = abiCoder.encode(['address'], [signer]) + SPOOF_SIGTYPE; + return signature; +}; +export default generateSpoofSig; +//# sourceMappingURL=generateSpoofSig.js.map \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.js.map b/dist/src/utils/generateSpoofSig.js.map new file mode 100644 index 000000000..5897d34e1 --- /dev/null +++ b/dist/src/utils/generateSpoofSig.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generateSpoofSig.js","sourceRoot":"","sources":["../../../src/utils/generateSpoofSig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAA;IAC1B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAA;IAExE,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,eAAe,gBAAgB,CAAA","sourcesContent":["import { AbiCoder } from 'ethers'\n\nconst generateSpoofSig = (signer: string) => {\n const SPOOF_SIGTYPE = '03'\n const abiCoder = new AbiCoder()\n const signature = abiCoder.encode(['address'], [signer]) + SPOOF_SIGTYPE\n\n return signature\n}\n\nexport default generateSpoofSig\n"]} \ No newline at end of file diff --git a/dist/src/utils/hdPath.d.ts b/dist/src/utils/hdPath.d.ts new file mode 100644 index 000000000..0ba742081 --- /dev/null +++ b/dist/src/utils/hdPath.d.ts @@ -0,0 +1,4 @@ +import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'; +export declare const getHdPathFromTemplate: (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, index: number) => string; +export declare const getHDPathIndices: (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, insertIdx?: number) => number[]; +//# sourceMappingURL=hdPath.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/hdPath.d.ts.map b/dist/src/utils/hdPath.d.ts.map new file mode 100644 index 000000000..6db56a0dc --- /dev/null +++ b/dist/src/utils/hdPath.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"hdPath.d.ts","sourceRoot":"","sources":["../../../src/utils/hdPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,eAAO,MAAM,qBAAqB,mBAAoB,qBAAqB,SAAS,MAAM,WAEzF,CAAA;AAGD,eAAO,MAAM,gBAAgB,mBAAoB,qBAAqB,iCA6BrE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/hdPath.js b/dist/src/utils/hdPath.js new file mode 100644 index 000000000..e71205d8e --- /dev/null +++ b/dist/src/utils/hdPath.js @@ -0,0 +1,38 @@ +export const getHdPathFromTemplate = (hdPathTemplate, index) => { + return hdPathTemplate.replace('', index.toString()); +}; +const HARDENED_OFFSET = 0x80000000; +export const getHDPathIndices = (hdPathTemplate, insertIdx = 0) => { + const path = hdPathTemplate.split('/').slice(1); + const indices = []; + let usedX = false; + path.forEach((_idx) => { + const isHardened = _idx[_idx.length - 1] === "'"; + let idx = isHardened ? HARDENED_OFFSET : 0; + // If there is an `` in the path string, we will use it to insert our + // index. This is useful for e.g. Ledger Live path. Most paths have the + // changing index as the last one, so having an `` in the path isn't + // usually necessary. + if (_idx.indexOf('') > -1) { + idx += insertIdx; + usedX = true; + } + else if (isHardened) { + idx += Number(_idx.slice(0, _idx.length - 1)); + } + else { + idx += Number(_idx); + } + indices.push(idx); + }); + // If this path string does not include an ``, we just append the index + // to the end of the extracted set + if (usedX === false) { + indices.push(insertIdx); + } + // Sanity check -- Lattice firmware will throw an error for large paths + if (indices.length > 5) + throw new Error('Only HD paths with up to 5 indices are allowed.'); + return indices; +}; +//# sourceMappingURL=hdPath.js.map \ No newline at end of file diff --git a/dist/src/utils/hdPath.js.map b/dist/src/utils/hdPath.js.map new file mode 100644 index 000000000..046fa1506 --- /dev/null +++ b/dist/src/utils/hdPath.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hdPath.js","sourceRoot":"","sources":["../../../src/utils/hdPath.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,cAAqC,EAAE,KAAa,EAAE,EAAE;IAC5F,OAAO,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,UAAU,CAAA;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,cAAqC,EAAE,SAAS,GAAG,CAAC,EAAE,EAAE;IACvF,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAA;QAChD,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,8EAA8E;QAC9E,uEAAuE;QACvE,6EAA6E;QAC7E,qBAAqB;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE;YAClC,GAAG,IAAI,SAAS,CAAA;YAChB,KAAK,GAAG,IAAI,CAAA;SACb;aAAM,IAAI,UAAU,EAAE;YACrB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;SAC9C;aAAM;YACL,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;SACpB;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,gFAAgF;IAChF,kCAAkC;IAClC,IAAI,KAAK,KAAK,KAAK,EAAE;QACnB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;KACxB;IACD,uEAAuE;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC1F,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\n\nexport const getHdPathFromTemplate = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, index: number) => {\n return hdPathTemplate.replace('', index.toString())\n}\n\nconst HARDENED_OFFSET = 0x80000000\nexport const getHDPathIndices = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, insertIdx = 0) => {\n const path = hdPathTemplate.split('/').slice(1)\n const indices = []\n let usedX = false\n path.forEach((_idx) => {\n const isHardened = _idx[_idx.length - 1] === \"'\"\n let idx = isHardened ? HARDENED_OFFSET : 0\n // If there is an `` in the path string, we will use it to insert our\n // index. This is useful for e.g. Ledger Live path. Most paths have the\n // changing index as the last one, so having an `` in the path isn't\n // usually necessary.\n if (_idx.indexOf('') > -1) {\n idx += insertIdx\n usedX = true\n } else if (isHardened) {\n idx += Number(_idx.slice(0, _idx.length - 1))\n } else {\n idx += Number(_idx)\n }\n indices.push(idx)\n })\n // If this path string does not include an ``, we just append the index\n // to the end of the extracted set\n if (usedX === false) {\n indices.push(insertIdx)\n }\n // Sanity check -- Lattice firmware will throw an error for large paths\n if (indices.length > 5) throw new Error('Only HD paths with up to 5 indices are allowed.')\n return indices\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.d.ts b/dist/src/utils/hexStringToUint8Array.d.ts new file mode 100644 index 000000000..265e92427 --- /dev/null +++ b/dist/src/utils/hexStringToUint8Array.d.ts @@ -0,0 +1,3 @@ +declare function hexStringToUint8Array(hexString: string): Uint8Array; +export default hexStringToUint8Array; +//# sourceMappingURL=hexStringToUint8Array.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.d.ts.map b/dist/src/utils/hexStringToUint8Array.d.ts.map new file mode 100644 index 000000000..2fb949ac7 --- /dev/null +++ b/dist/src/utils/hexStringToUint8Array.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"hexStringToUint8Array.d.ts","sourceRoot":"","sources":["../../../src/utils/hexStringToUint8Array.ts"],"names":[],"mappings":"AAAA,iBAAS,qBAAqB,CAAC,SAAS,EAAE,MAAM,cAoB/C;AAED,eAAe,qBAAqB,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.js b/dist/src/utils/hexStringToUint8Array.js new file mode 100644 index 000000000..66cfdf525 --- /dev/null +++ b/dist/src/utils/hexStringToUint8Array.js @@ -0,0 +1,19 @@ +function hexStringToUint8Array(hexString) { + // Remove '0x' prefix if present + if (hexString.startsWith('0x')) { + // eslint-disable-next-line no-param-reassign + hexString = hexString.slice(2); + } + // Ensure the hex string has an even length + if (hexString.length % 2 !== 0) { + throw new Error('Hex string must have an even number of characters'); + } + const uint8Array = new Uint8Array(hexString.length / 2); + for (let i = 0; i < hexString.length; i += 2) { + const byteValue = parseInt(hexString.substr(i, 2), 16); + uint8Array[i / 2] = byteValue; + } + return uint8Array; +} +export default hexStringToUint8Array; +//# sourceMappingURL=hexStringToUint8Array.js.map \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.js.map b/dist/src/utils/hexStringToUint8Array.js.map new file mode 100644 index 000000000..852cade2b --- /dev/null +++ b/dist/src/utils/hexStringToUint8Array.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hexStringToUint8Array.js","sourceRoot":"","sources":["../../../src/utils/hexStringToUint8Array.ts"],"names":[],"mappings":"AAAA,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC9B,6CAA6C;QAC7C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KAC/B;IAED,2CAA2C;IAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;KACrE;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAA;KAC9B;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,eAAe,qBAAqB,CAAA","sourcesContent":["function hexStringToUint8Array(hexString: string) {\n // Remove '0x' prefix if present\n if (hexString.startsWith('0x')) {\n // eslint-disable-next-line no-param-reassign\n hexString = hexString.slice(2)\n }\n\n // Ensure the hex string has an even length\n if (hexString.length % 2 !== 0) {\n throw new Error('Hex string must have an even number of characters')\n }\n\n const uint8Array = new Uint8Array(hexString.length / 2)\n\n for (let i = 0; i < hexString.length; i += 2) {\n const byteValue = parseInt(hexString.substr(i, 2), 16)\n uint8Array[i / 2] = byteValue\n }\n\n return uint8Array\n}\n\nexport default hexStringToUint8Array\n"]} \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.d.ts b/dist/src/utils/isHexPrefixed.d.ts new file mode 100644 index 000000000..22f984501 --- /dev/null +++ b/dist/src/utils/isHexPrefixed.d.ts @@ -0,0 +1,5 @@ +/** + * Returns a `Boolean` on whether or not the a `String` starts with '0x' + */ +export declare const isHexPrefixed: (str: string) => boolean; +//# sourceMappingURL=isHexPrefixed.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.d.ts.map b/dist/src/utils/isHexPrefixed.d.ts.map new file mode 100644 index 000000000..4a3dee12b --- /dev/null +++ b/dist/src/utils/isHexPrefixed.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"isHexPrefixed.d.ts","sourceRoot":"","sources":["../../../src/utils/isHexPrefixed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,QAAS,MAAM,YAQxC,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.js b/dist/src/utils/isHexPrefixed.js new file mode 100644 index 000000000..1bf5a286a --- /dev/null +++ b/dist/src/utils/isHexPrefixed.js @@ -0,0 +1,10 @@ +/** + * Returns a `Boolean` on whether or not the a `String` starts with '0x' + */ +export const isHexPrefixed = (str) => { + if (typeof str !== 'string') { + throw new Error(`isHexPrefixed \`str\` value must be type 'string', is currently type ${typeof str}`); + } + return str.slice(0, 2) === '0x'; +}; +//# sourceMappingURL=isHexPrefixed.js.map \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.js.map b/dist/src/utils/isHexPrefixed.js.map new file mode 100644 index 000000000..1ce48c12e --- /dev/null +++ b/dist/src/utils/isHexPrefixed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"isHexPrefixed.js","sourceRoot":"","sources":["../../../src/utils/isHexPrefixed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CACb,wEAAwE,OAAO,GAAG,EAAE,CACrF,CAAA;KACF;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;AACjC,CAAC,CAAA","sourcesContent":["/**\n * Returns a `Boolean` on whether or not the a `String` starts with '0x'\n */\nexport const isHexPrefixed = (str: string) => {\n if (typeof str !== 'string') {\n throw new Error(\n `isHexPrefixed \\`str\\` value must be type 'string', is currently type ${typeof str}`\n )\n }\n\n return str.slice(0, 2) === '0x'\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.d.ts b/dist/src/utils/isSameAddr.d.ts new file mode 100644 index 000000000..6cc1d0bad --- /dev/null +++ b/dist/src/utils/isSameAddr.d.ts @@ -0,0 +1,3 @@ +declare const isSameAddr: (one: string, two: string) => boolean; +export default isSameAddr; +//# sourceMappingURL=isSameAddr.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.d.ts.map b/dist/src/utils/isSameAddr.d.ts.map new file mode 100644 index 000000000..71b5460c2 --- /dev/null +++ b/dist/src/utils/isSameAddr.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"isSameAddr.d.ts","sourceRoot":"","sources":["../../../src/utils/isSameAddr.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,QAAS,MAAM,OAAO,MAAM,YAE3C,CAAA;AAED,eAAe,UAAU,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.js b/dist/src/utils/isSameAddr.js new file mode 100644 index 000000000..e0a06580f --- /dev/null +++ b/dist/src/utils/isSameAddr.js @@ -0,0 +1,6 @@ +import { getAddress } from 'ethers'; +const isSameAddr = (one, two) => { + return getAddress(one) === getAddress(two); +}; +export default isSameAddr; +//# sourceMappingURL=isSameAddr.js.map \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.js.map b/dist/src/utils/isSameAddr.js.map new file mode 100644 index 000000000..ce2779c28 --- /dev/null +++ b/dist/src/utils/isSameAddr.js.map @@ -0,0 +1 @@ +{"version":3,"file":"isSameAddr.js","sourceRoot":"","sources":["../../../src/utils/isSameAddr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;IAC9C,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { getAddress } from 'ethers'\n\nconst isSameAddr = (one: string, two: string) => {\n return getAddress(one) === getAddress(two)\n}\n\nexport default isSameAddr\n"]} \ No newline at end of file diff --git a/dist/src/utils/networks.d.ts b/dist/src/utils/networks.d.ts new file mode 100644 index 000000000..637ae34c7 --- /dev/null +++ b/dist/src/utils/networks.d.ts @@ -0,0 +1,6 @@ +import { ChainlistNetwork, Network } from '../interfaces/network'; +declare const checkIsRpcUrlWorking: (rpcUrl: string) => Promise; +declare const rollProviderUrlsAndFindWorking: (rpcUrls: string[], index: number) => Promise; +declare const convertToAmbireNetworkFormat: (network: ChainlistNetwork) => Promise; +export { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }; +//# sourceMappingURL=networks.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/networks.d.ts.map b/dist/src/utils/networks.d.ts.map new file mode 100644 index 000000000..85d77a698 --- /dev/null +++ b/dist/src/utils/networks.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../../src/utils/networks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEjE,QAAA,MAAM,oBAAoB,WAAkB,MAAM,qBAajD,CAAA;AAED,QAAA,MAAM,8BAA8B,YACzB,MAAM,EAAE,SACV,MAAM,KACZ,QAAQ,MAAM,GAAG,IAAI,CAcvB,CAAA;AAED,QAAA,MAAM,4BAA4B,YAAmB,gBAAgB,KAAG,QAAQ,OAAO,CA4DtF,CAAA;AAED,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/networks.js b/dist/src/utils/networks.js new file mode 100644 index 000000000..5273f1cdc --- /dev/null +++ b/dist/src/utils/networks.js @@ -0,0 +1,79 @@ +import { JsonRpcProvider } from 'ethers'; +const checkIsRpcUrlWorking = async (rpcUrl) => { + const provider = new JsonRpcProvider(rpcUrl); + try { + await provider.getBlockNumber(); + } + catch { + provider?.destroy(); + return false; + } + provider.destroy(); + return true; +}; +const rollProviderUrlsAndFindWorking = async (rpcUrls, index) => { + const isProviderWorking = await checkIsRpcUrlWorking(rpcUrls[index]); + if (isProviderWorking) { + return rpcUrls[index]; + } + const nextIndex = index + 1; + if (rpcUrls.length > nextIndex) { + return rollProviderUrlsAndFindWorking(rpcUrls, nextIndex); + } + return null; +}; +const convertToAmbireNetworkFormat = async (network) => { + const freeHttpRpcUrls = network.rpc.filter((rpcUrl) => { + const isHttpOrHttps = rpcUrl.startsWith('http'); + if (!isHttpOrHttps) + return false; + const isApiKeyRequired = /${.+}/.test(rpcUrl); + return !isApiKeyRequired; + }); + const workingRpcUrl = await rollProviderUrlsAndFindWorking(freeHttpRpcUrls, 0); + let platformId = null; + let nativeAssetId = null; + try { + const coingeckoRequest = await fetch(`https://cena.ambire.com/api/v3/platform/${Number(network.chainId)}`).catch(() => ({ + error: 'currently, we cannot fetch the coingecko information' + })); + // set the coingecko info + if (!('error' in coingeckoRequest)) { + const coingeckoInfo = await coingeckoRequest.json(); + if (!coingeckoInfo.error) { + platformId = coingeckoInfo.platformId; + nativeAssetId = coingeckoInfo.nativeAssetId; + } + } + } + catch (e) { + console.error(e); + // do nothing + } + return { + id: network.name.toLowerCase(), + name: network.name, + chainId: BigInt(network.chainId), + rpcUrls: [workingRpcUrl ?? network.rpc[0]], + explorerUrl: network.explorers[0].url, + selectedRpcUrl: workingRpcUrl || '', + platformId, + nativeAssetId, + nativeAssetSymbol: network.nativeCurrency.symbol, + // Not needed for benzin + hasRelayer: false, + rpcNoStateOverride: false, + reestimateOn: 0, + areContractsDeployed: false, + features: [], + feeOptions: { is1559: false }, + flagged: false, + hasSingleton: false, + iconUrls: [], + erc4337: { enabled: false, hasPaymaster: false }, + isSAEnabled: false, + predefined: false + }; +}; +export { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }; +//# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/utils/networks.js.map b/dist/src/utils/networks.js.map new file mode 100644 index 000000000..097731874 --- /dev/null +++ b/dist/src/utils/networks.js.map @@ -0,0 +1 @@ +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/utils/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { ChainlistNetwork, Network } from '../interfaces/network'\n\nconst checkIsRpcUrlWorking = async (rpcUrl: string) => {\n const provider = new JsonRpcProvider(rpcUrl)\n\n try {\n await provider.getBlockNumber()\n } catch {\n provider?.destroy()\n return false\n }\n\n provider.destroy()\n\n return true\n}\n\nconst rollProviderUrlsAndFindWorking = async (\n rpcUrls: string[],\n index: number\n): Promise => {\n const isProviderWorking = await checkIsRpcUrlWorking(rpcUrls[index])\n\n if (isProviderWorking) {\n return rpcUrls[index]\n }\n\n const nextIndex = index + 1\n\n if (rpcUrls.length > nextIndex) {\n return rollProviderUrlsAndFindWorking(rpcUrls, nextIndex)\n }\n\n return null\n}\n\nconst convertToAmbireNetworkFormat = async (network: ChainlistNetwork): Promise => {\n const freeHttpRpcUrls = network.rpc.filter((rpcUrl: string) => {\n const isHttpOrHttps = rpcUrl.startsWith('http')\n\n if (!isHttpOrHttps) return false\n\n const isApiKeyRequired = /${.+}/.test(rpcUrl)\n\n return !isApiKeyRequired\n })\n const workingRpcUrl = await rollProviderUrlsAndFindWorking(freeHttpRpcUrls, 0)\n\n let platformId = null\n let nativeAssetId = null\n\n try {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(network.chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n\n // set the coingecko info\n\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n } catch (e) {\n console.error(e)\n // do nothing\n }\n\n return {\n id: network.name.toLowerCase(),\n name: network.name,\n chainId: BigInt(network.chainId),\n rpcUrls: [workingRpcUrl ?? network.rpc[0]],\n explorerUrl: network.explorers[0].url,\n selectedRpcUrl: workingRpcUrl || '',\n platformId,\n nativeAssetId,\n nativeAssetSymbol: network.nativeCurrency.symbol,\n // Not needed for benzin\n hasRelayer: false,\n rpcNoStateOverride: false, // TODO\n reestimateOn: 0,\n areContractsDeployed: false, // TODO\n features: [],\n feeOptions: { is1559: false },\n flagged: false,\n hasSingleton: false,\n iconUrls: [],\n erc4337: { enabled: false, hasPaymaster: false },\n isSAEnabled: false,\n predefined: false\n }\n}\n\nexport { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }\n"]} \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.d.ts b/dist/src/utils/numbers/formatters.d.ts new file mode 100644 index 000000000..fa24fcb51 --- /dev/null +++ b/dist/src/utils/numbers/formatters.d.ts @@ -0,0 +1,10 @@ +/** + * Converts floating point token price to big int + */ +declare const convertTokenPriceToBigInt: (tokenPrice: number) => { + tokenPriceBigInt: bigint; + tokenPriceDecimals: number; +}; +declare const safeTokenAmountAndNumberMultiplication: (amount: bigint, decimals: number, tokenPrice: number) => string; +export { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }; +//# sourceMappingURL=formatters.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.d.ts.map b/dist/src/utils/numbers/formatters.d.ts.map new file mode 100644 index 000000000..aea11ea72 --- /dev/null +++ b/dist/src/utils/numbers/formatters.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../../src/utils/numbers/formatters.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,QAAA,MAAM,yBAAyB,eACjB,MAAM;sBAEA,MAAM;wBACJ,MAAM;CAwB3B,CAAA;AAED,QAAA,MAAM,sCAAsC,WAClC,MAAM,YACJ,MAAM,cACJ,MAAM,WASnB,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,sCAAsC,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.js b/dist/src/utils/numbers/formatters.js new file mode 100644 index 000000000..c6ca45778 --- /dev/null +++ b/dist/src/utils/numbers/formatters.js @@ -0,0 +1,29 @@ +import { formatUnits, parseUnits } from 'ethers'; +/** + * Converts floating point token price to big int + */ +const convertTokenPriceToBigInt = (tokenPrice) => { + const tokenPriceString = String(tokenPrice); + // Scientific notation handling + if (tokenPriceString.includes('e')) { + const [base, rawExponent] = tokenPriceString.split('e'); + const exponent = Math.abs(Number(rawExponent)); + const { tokenPriceBigInt, tokenPriceDecimals: baseDecimals } = convertTokenPriceToBigInt(Number(base)); + return { + tokenPriceBigInt, + tokenPriceDecimals: baseDecimals + exponent + }; + } + // Regular number handling + const tokenPriceDecimals = tokenPriceString.split('.')[1]?.length || 0; + const tokenPriceBigInt = parseUnits(tokenPriceString, tokenPriceDecimals); + return { tokenPriceBigInt, tokenPriceDecimals }; +}; +const safeTokenAmountAndNumberMultiplication = (amount, decimals, tokenPrice) => { + const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + return formatUnits(amount * tokenPriceBigInt, + // Shift the decimal point by the number of decimals in the token price + decimals + tokenPriceDecimals); +}; +export { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }; +//# sourceMappingURL=formatters.js.map \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.js.map b/dist/src/utils/numbers/formatters.js.map new file mode 100644 index 000000000..516d6c5a5 --- /dev/null +++ b/dist/src/utils/numbers/formatters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../src/utils/numbers/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEhD;;GAEG;AACH,MAAM,yBAAyB,GAAG,CAChC,UAAkB,EAIlB,EAAE;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAE3C,+BAA+B;IAC/B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAClC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAE9C,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,yBAAyB,CACtF,MAAM,CAAC,IAAI,CAAC,CACb,CAAA;QAED,OAAO;YACL,gBAAgB;YAChB,kBAAkB,EAAE,YAAY,GAAG,QAAQ;SAC5C,CAAA;KACF;IAED,0BAA0B;IAC1B,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAA;IACtE,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;IAEzE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,sCAAsC,GAAG,CAC7C,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,EAAE;IACF,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAEtF,OAAO,WAAW,CAChB,MAAM,GAAG,gBAAgB;IACzB,uEAAuE;IACvE,QAAQ,GAAG,kBAAkB,CAC9B,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,sCAAsC,EAAE,CAAA","sourcesContent":["import { formatUnits, parseUnits } from 'ethers'\n\n/**\n * Converts floating point token price to big int\n */\nconst convertTokenPriceToBigInt = (\n tokenPrice: number\n): {\n tokenPriceBigInt: bigint\n tokenPriceDecimals: number\n} => {\n const tokenPriceString = String(tokenPrice)\n\n // Scientific notation handling\n if (tokenPriceString.includes('e')) {\n const [base, rawExponent] = tokenPriceString.split('e')\n const exponent = Math.abs(Number(rawExponent))\n\n const { tokenPriceBigInt, tokenPriceDecimals: baseDecimals } = convertTokenPriceToBigInt(\n Number(base)\n )\n\n return {\n tokenPriceBigInt,\n tokenPriceDecimals: baseDecimals + exponent\n }\n }\n\n // Regular number handling\n const tokenPriceDecimals = tokenPriceString.split('.')[1]?.length || 0\n const tokenPriceBigInt = parseUnits(tokenPriceString, tokenPriceDecimals)\n\n return { tokenPriceBigInt, tokenPriceDecimals }\n}\n\nconst safeTokenAmountAndNumberMultiplication = (\n amount: bigint,\n decimals: number,\n tokenPrice: number\n) => {\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n return formatUnits(\n amount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n decimals + tokenPriceDecimals\n )\n}\n\nexport { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }\n"]} \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.d.ts b/dist/src/utils/shortenAddress.d.ts new file mode 100644 index 000000000..a68a9a71b --- /dev/null +++ b/dist/src/utils/shortenAddress.d.ts @@ -0,0 +1,3 @@ +declare const shortenAddress: (address: string, maxLength?: number) => string; +export default shortenAddress; +//# sourceMappingURL=shortenAddress.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.d.ts.map b/dist/src/utils/shortenAddress.d.ts.map new file mode 100644 index 000000000..32b905176 --- /dev/null +++ b/dist/src/utils/shortenAddress.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"shortenAddress.d.ts","sourceRoot":"","sources":["../../../src/utils/shortenAddress.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,YAAa,MAAM,cAAa,MAAM,KAAQ,MAGmB,CAAA;AAErF,eAAe,cAAc,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.js b/dist/src/utils/shortenAddress.js new file mode 100644 index 000000000..30572ca0f --- /dev/null +++ b/dist/src/utils/shortenAddress.js @@ -0,0 +1,5 @@ +const shortenAddress = (address, maxLength = 30) => address.length <= maxLength + ? address + : `${address.slice(0, maxLength / 2 - 1)}...${address.slice(-maxLength / 2 + 2)}`; +export default shortenAddress; +//# sourceMappingURL=shortenAddress.js.map \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.js.map b/dist/src/utils/shortenAddress.js.map new file mode 100644 index 000000000..f60c34a4e --- /dev/null +++ b/dist/src/utils/shortenAddress.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shortenAddress.js","sourceRoot":"","sources":["../../../src/utils/shortenAddress.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,YAAoB,EAAE,EAAU,EAAE,CACzE,OAAO,CAAC,MAAM,IAAI,SAAS;IACzB,CAAC,CAAC,OAAO;IACT,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;AAErF,eAAe,cAAc,CAAA","sourcesContent":["const shortenAddress = (address: string, maxLength: number = 30): string =>\n address.length <= maxLength\n ? address\n : `${address.slice(0, maxLength / 2 - 1)}...${address.slice(-maxLength / 2 + 2)}`\n\nexport default shortenAddress\n"]} \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.d.ts b/dist/src/utils/simulationStateOverride.d.ts new file mode 100644 index 000000000..272337c50 --- /dev/null +++ b/dist/src/utils/simulationStateOverride.d.ts @@ -0,0 +1,14 @@ +/** + * + * @param accountAddr account address + * @returns the state override object required for transaction simulation and estimation + */ +export declare function getEoaSimulationStateOverride(accountAddr: string): { + [x: string]: { + code: string; + stateDiff: { + [x: string]: string; + }; + }; +}; +//# sourceMappingURL=simulationStateOverride.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.d.ts.map b/dist/src/utils/simulationStateOverride.d.ts.map new file mode 100644 index 000000000..3a67c42f7 --- /dev/null +++ b/dist/src/utils/simulationStateOverride.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"simulationStateOverride.d.ts","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM;;;;;;;EAahE"} \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.js b/dist/src/utils/simulationStateOverride.js new file mode 100644 index 000000000..e709394ff --- /dev/null +++ b/dist/src/utils/simulationStateOverride.js @@ -0,0 +1,23 @@ +import { toBeHex } from 'ethers'; +import AmbireAccount from '../../contracts/compiled/AmbireAccount.json'; +import { EOA_SIMULATION_NONCE } from '../consts/deployless'; +import { privSlot } from '../libs/proxyDeploy/deploy'; +/** + * + * @param accountAddr account address + * @returns the state override object required for transaction simulation and estimation + */ +export function getEoaSimulationStateOverride(accountAddr) { + return { + [accountAddr]: { + code: AmbireAccount.binRuntime, + stateDiff: { + // if we use 0x00...01 we get a geth bug: "invalid argument 2: hex number with leading zero digits\" - on some RPC providers + [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + // any number with leading zeros is not supported on some RPCs + [toBeHex(1, 32)]: EOA_SIMULATION_NONCE + } + } + }; +} +//# sourceMappingURL=simulationStateOverride.js.map \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.js.map b/dist/src/utils/simulationStateOverride.js.map new file mode 100644 index 000000000..4ace4a3c6 --- /dev/null +++ b/dist/src/utils/simulationStateOverride.js.map @@ -0,0 +1 @@ +{"version":3,"file":"simulationStateOverride.js","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,aAAa,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,OAAO;QACL,CAAC,WAAW,CAAC,EAAE;YACb,IAAI,EAAE,aAAa,CAAC,UAAU;YAC9B,SAAS,EAAE;gBACT,4HAA4H;gBAC5H,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,EACrD,oEAAoE;gBACtE,8DAA8D;gBAC9D,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB;aACvC;SACF;KACF,CAAA;AACH,CAAC","sourcesContent":["import { toBeHex } from 'ethers'\n\nimport AmbireAccount from '../../contracts/compiled/AmbireAccount.json'\nimport { EOA_SIMULATION_NONCE } from '../consts/deployless'\nimport { privSlot } from '../libs/proxyDeploy/deploy'\n\n/**\n *\n * @param accountAddr account address\n * @returns the state override object required for transaction simulation and estimation\n */\nexport function getEoaSimulationStateOverride(accountAddr: string) {\n return {\n [accountAddr]: {\n code: AmbireAccount.binRuntime,\n stateDiff: {\n // if we use 0x00...01 we get a geth bug: \"invalid argument 2: hex number with leading zero digits\\\" - on some RPC providers\n [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]:\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',\n // any number with leading zeros is not supported on some RPCs\n [toBeHex(1, 32)]: EOA_SIMULATION_NONCE\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.d.ts b/dist/src/utils/stripHexPrefix.d.ts new file mode 100644 index 000000000..8ad772f1d --- /dev/null +++ b/dist/src/utils/stripHexPrefix.d.ts @@ -0,0 +1,5 @@ +/** + * Removes '0x' from a given `String` if present + */ +export declare const stripHexPrefix: (str: string) => string; +//# sourceMappingURL=stripHexPrefix.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.d.ts.map b/dist/src/utils/stripHexPrefix.d.ts.map new file mode 100644 index 000000000..cff8b9f5e --- /dev/null +++ b/dist/src/utils/stripHexPrefix.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"stripHexPrefix.d.ts","sourceRoot":"","sources":["../../../src/utils/stripHexPrefix.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,cAAc,QAAS,MAAM,WAIzC,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.js b/dist/src/utils/stripHexPrefix.js new file mode 100644 index 000000000..b7bc41d00 --- /dev/null +++ b/dist/src/utils/stripHexPrefix.js @@ -0,0 +1,10 @@ +import { isHexPrefixed } from './isHexPrefixed'; +/** + * Removes '0x' from a given `String` if present + */ +export const stripHexPrefix = (str) => { + if (typeof str !== 'string') + return str; + return isHexPrefixed(str) ? str.slice(2) : str; +}; +//# sourceMappingURL=stripHexPrefix.js.map \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.js.map b/dist/src/utils/stripHexPrefix.js.map new file mode 100644 index 000000000..bde7ee38c --- /dev/null +++ b/dist/src/utils/stripHexPrefix.js.map @@ -0,0 +1 @@ +{"version":3,"file":"stripHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/stripHexPrefix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IAEvC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAChD,CAAC,CAAA","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Removes '0x' from a given `String` if present\n */\nexport const stripHexPrefix = (str: string) => {\n if (typeof str !== 'string') return str\n\n return isHexPrefixed(str) ? str.slice(2) : str\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/wait.d.ts b/dist/src/utils/wait.d.ts new file mode 100644 index 000000000..6a2a88e5e --- /dev/null +++ b/dist/src/utils/wait.d.ts @@ -0,0 +1,3 @@ +declare function wait(ms: number): Promise; +export default wait; +//# sourceMappingURL=wait.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/wait.d.ts.map b/dist/src/utils/wait.d.ts.map new file mode 100644 index 000000000..aa70a5aa9 --- /dev/null +++ b/dist/src/utils/wait.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/utils/wait.ts"],"names":[],"mappings":"AACA,iBAAS,IAAI,CAAC,EAAE,EAAE,MAAM,oBAEvB;AAED,eAAe,IAAI,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/wait.js b/dist/src/utils/wait.js new file mode 100644 index 000000000..e0d69e466 --- /dev/null +++ b/dist/src/utils/wait.js @@ -0,0 +1,6 @@ +/* eslint-disable no-promise-executor-return */ +function wait(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +export default wait; +//# sourceMappingURL=wait.js.map \ No newline at end of file diff --git a/dist/src/utils/wait.js.map b/dist/src/utils/wait.js.map new file mode 100644 index 000000000..920d23c4f --- /dev/null +++ b/dist/src/utils/wait.js.map @@ -0,0 +1 @@ +{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/utils/wait.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,eAAe,IAAI,CAAA","sourcesContent":["/* eslint-disable no-promise-executor-return */\nfunction wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport default wait\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.d.ts b/dist/v1/hooks/useConstants/index.d.ts new file mode 100644 index 000000000..c1c798cee --- /dev/null +++ b/dist/v1/hooks/useConstants/index.d.ts @@ -0,0 +1,4 @@ +import useConstants from './useConstants'; +export * from './types'; +export default useConstants; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.d.ts.map b/dist/v1/hooks/useConstants/index.d.ts.map new file mode 100644 index 000000000..9525734b3 --- /dev/null +++ b/dist/v1/hooks/useConstants/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC,cAAc,SAAS,CAAA;AACvB,eAAe,YAAY,CAAA"} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.js b/dist/v1/hooks/useConstants/index.js new file mode 100644 index 000000000..a4ed64d41 --- /dev/null +++ b/dist/v1/hooks/useConstants/index.js @@ -0,0 +1,4 @@ +import useConstants from './useConstants'; +export * from './types'; +export default useConstants; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.js.map b/dist/v1/hooks/useConstants/index.js.map new file mode 100644 index 000000000..4344082e3 --- /dev/null +++ b/dist/v1/hooks/useConstants/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC,cAAc,SAAS,CAAA;AACvB,eAAe,YAAY,CAAA","sourcesContent":["import useConstants from './useConstants'\n\nexport * from './types'\nexport default useConstants\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.d.ts b/dist/v1/hooks/useConstants/types.d.ts new file mode 100644 index 000000000..4c1ec51de --- /dev/null +++ b/dist/v1/hooks/useConstants/types.d.ts @@ -0,0 +1,144 @@ +export interface UseConstantsProps { + fetch: any; + endpoint: string; +} +export interface UseConstantsReturnType { + constants: ConstantsType | null; + isLoading: boolean; + retryFetch: () => void; + getAdexToStakingTransfersLogs: () => Promise; + hasError: boolean; +} +export interface AdexToStakingTransfersLogsType { + jsonrpc: string; + id: number; + result: object[]; +} +export interface ResultEndpointResponse { + tokenList: ConstantsType['tokenList']; + humanizerInfo: ConstantsType['humanizerInfo']; + customTokens: ConstantsType['customTokens']; +} +export interface ConstantsType { + tokenList: { + [key: string]: TokenList[]; + }; + humanizerInfo: HumanizerInfoType; + lastFetched: number; + customTokens: CustomToken[]; +} +interface CustomToken { + id: string; + customPrice: boolean; + symbol: string; + name: string; + image: { + [key: string]: string; + }; + platforms: { + [key: string]: string; + }; + contract_address: string; + baseToken: string; + decimals: number; + abi: string; + abiFunction: string; +} +interface TokenList { + address: string; + symbol: string; + coingeckoId?: null | string; + decimals?: number; + decmals?: number; +} +export interface HumanizerInfoType { + abis: HumanizerInfoAbisType; + tokens: { + [key: string]: Array; + }; + names: { + [address: string]: string; + }; + yearnVaults: Vault[]; + tesseractVaults: Vault[]; +} +interface Vault { + name: string; + network: 'ethereum' | 'polygon'; + addr: string; + baseToken: string; + decimals?: number; + abiName?: string; +} +declare enum AbiType { + Constructor = "constructor", + Event = "event", + Fallback = "fallback", + Function = "function", + Receive = "receive" +} +interface Input { + indexed?: boolean; + internalType?: string; + name: string; + type: InputType; + components?: Input[]; +} +interface Output { + name: string; + type: InputType; +} +declare enum InputType { + Address = "address", + Address14 = "address[14]", + Address20 = "address[20]", + Address7 = "address[7]", + Bool = "bool", + Bytes = "bytes", + Bytes32 = "bytes32", + Bytes325 = "bytes32[5]", + Bytes4 = "bytes4", + Int24 = "int24", + Int256 = "int256", + String = "string", + Tuple = "tuple", + TypeAddress = "address[]", + TypeBytes = "bytes[]", + TypeTuple = "tuple[]", + TypeUint128 = "uint128[]", + TypeUint256 = "uint256[]", + Uint128 = "uint128", + Uint16 = "uint16", + Uint160 = "uint160", + Uint24 = "uint24", + Uint256 = "uint256", + Uint25618 = "uint256[18]", + Uint2569 = "uint256[9]", + Uint32 = "uint32", + Uint40 = "uint40", + Uint8 = "uint8", + Uint82 = "uint8[2]", + Uint88 = "uint8[8]" +} +declare enum StateMutability { + Nonpayable = "nonpayable", + Payable = "payable", + Pure = "pure", + View = "view" +} +interface HumanizerInfoAbiType { + constant?: boolean; + payable?: boolean; + anonymous?: boolean; + outputs?: Output[]; + inputs?: Input[]; + stateMutability?: StateMutability; + type: AbiType; + gas?: number; +} +type HumanizerInfoAbisKeysType = 'AaveWethGatewayV2' | 'PancakeRouter' | 'UniV2Router' | 'UniV3Router' | 'UniV3Router2' | 'WETH' | 'AaveLendingPoolV2' | 'MovrRouter' | 'MovrAnyswap' | 'ERC721' | 'YearnVault' | 'IdentityFactory' | 'Batcher' | 'StakingPool' | 'WyvernExchange' | 'Swappin' | 'ERC20' | 'SwappinOwn'; +type HumanizerInfoAbisType = { + [key in HumanizerInfoAbisKeysType]: HumanizerInfoAbiType[]; +}; +export {}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.d.ts.map b/dist/v1/hooks/useConstants/types.d.ts.map new file mode 100644 index 000000000..ced9c26c7 --- /dev/null +++ b/dist/v1/hooks/useConstants/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.js b/dist/v1/hooks/useConstants/types.js new file mode 100644 index 000000000..afc796d2a --- /dev/null +++ b/dist/v1/hooks/useConstants/types.js @@ -0,0 +1,50 @@ +var AbiType; +(function (AbiType) { + AbiType["Constructor"] = "constructor"; + AbiType["Event"] = "event"; + AbiType["Fallback"] = "fallback"; + AbiType["Function"] = "function"; + AbiType["Receive"] = "receive"; +})(AbiType || (AbiType = {})); +var InputType; +(function (InputType) { + InputType["Address"] = "address"; + InputType["Address14"] = "address[14]"; + InputType["Address20"] = "address[20]"; + InputType["Address7"] = "address[7]"; + InputType["Bool"] = "bool"; + InputType["Bytes"] = "bytes"; + InputType["Bytes32"] = "bytes32"; + InputType["Bytes325"] = "bytes32[5]"; + InputType["Bytes4"] = "bytes4"; + InputType["Int24"] = "int24"; + InputType["Int256"] = "int256"; + InputType["String"] = "string"; + InputType["Tuple"] = "tuple"; + InputType["TypeAddress"] = "address[]"; + InputType["TypeBytes"] = "bytes[]"; + InputType["TypeTuple"] = "tuple[]"; + InputType["TypeUint128"] = "uint128[]"; + InputType["TypeUint256"] = "uint256[]"; + InputType["Uint128"] = "uint128"; + InputType["Uint16"] = "uint16"; + InputType["Uint160"] = "uint160"; + InputType["Uint24"] = "uint24"; + InputType["Uint256"] = "uint256"; + InputType["Uint25618"] = "uint256[18]"; + InputType["Uint2569"] = "uint256[9]"; + InputType["Uint32"] = "uint32"; + InputType["Uint40"] = "uint40"; + InputType["Uint8"] = "uint8"; + InputType["Uint82"] = "uint8[2]"; + InputType["Uint88"] = "uint8[8]"; +})(InputType || (InputType = {})); +var StateMutability; +(function (StateMutability) { + StateMutability["Nonpayable"] = "nonpayable"; + StateMutability["Payable"] = "payable"; + StateMutability["Pure"] = "pure"; + StateMutability["View"] = "view"; +})(StateMutability || (StateMutability = {})); +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.js.map b/dist/v1/hooks/useConstants/types.js.map new file mode 100644 index 000000000..4a095390d --- /dev/null +++ b/dist/v1/hooks/useConstants/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/types.ts"],"names":[],"mappings":"AAiFA,IAAK,OAMJ;AAND,WAAK,OAAO;IACV,sCAA2B,CAAA;IAC3B,0BAAe,CAAA;IACf,gCAAqB,CAAA;IACrB,gCAAqB,CAAA;IACrB,8BAAmB,CAAA;AACrB,CAAC,EANI,OAAO,KAAP,OAAO,QAMX;AAeD,IAAK,SA+BJ;AA/BD,WAAK,SAAS;IACZ,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,sCAAyB,CAAA;IACzB,kCAAqB,CAAA;IACrB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;AACrB,CAAC,EA/BI,SAAS,KAAT,SAAS,QA+Bb;AAED,IAAK,eAKJ;AALD,WAAK,eAAe;IAClB,4CAAyB,CAAA;IACzB,sCAAmB,CAAA;IACnB,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EALI,eAAe,KAAf,eAAe,QAKnB","sourcesContent":["export interface UseConstantsProps {\n fetch: any\n endpoint: string\n}\n\nexport interface UseConstantsReturnType {\n constants: ConstantsType | null\n isLoading: boolean\n retryFetch: () => void\n getAdexToStakingTransfersLogs: () => Promise\n hasError: boolean\n}\n\nexport interface AdexToStakingTransfersLogsType {\n jsonrpc: string\n id: number\n result: object[]\n}\n\nexport interface ResultEndpointResponse {\n tokenList: ConstantsType['tokenList']\n humanizerInfo: ConstantsType['humanizerInfo']\n customTokens: ConstantsType['customTokens']\n}\n\n// All the below types are generated with the help of QuickType app.\n// However, they are not directly copy-pasted, but manually wired-up,\n// because the raw generated types were a bit misleading and too specific\n// (expecially for the `HumanizerInfoAbisType`).\n// {@link https://app.quicktype.io/}\nexport interface ConstantsType {\n tokenList: { [key: string]: TokenList[] }\n humanizerInfo: HumanizerInfoType\n lastFetched: number\n customTokens: CustomToken[]\n}\n\ninterface CustomToken {\n id: string\n customPrice: boolean\n symbol: string\n name: string\n image: {\n [key: string]: string\n }\n platforms: {\n [key: string]: string\n }\n contract_address: string\n baseToken: string\n decimals: number\n abi: string\n abiFunction: string\n}\n\ninterface TokenList {\n address: string\n symbol: string\n coingeckoId?: null | string\n decimals?: number\n decmals?: number\n}\n\n// @NOTE humanizer library uses different structure\nexport interface HumanizerInfoType {\n abis: HumanizerInfoAbisType\n tokens: { [key: string]: Array }\n names: { [address: string]: string }\n yearnVaults: Vault[]\n tesseractVaults: Vault[]\n}\n\ninterface Vault {\n name: string\n network: 'ethereum' | 'polygon'\n addr: string\n baseToken: string\n decimals?: number\n abiName?: string\n}\n\nenum AbiType {\n Constructor = 'constructor',\n Event = 'event',\n Fallback = 'fallback',\n Function = 'function',\n Receive = 'receive'\n}\n\ninterface Input {\n indexed?: boolean\n internalType?: string\n name: string\n type: InputType\n components?: Input[]\n}\n\ninterface Output {\n name: string\n type: InputType\n}\n\nenum InputType {\n Address = 'address',\n Address14 = 'address[14]',\n Address20 = 'address[20]',\n Address7 = 'address[7]',\n Bool = 'bool',\n Bytes = 'bytes',\n Bytes32 = 'bytes32',\n Bytes325 = 'bytes32[5]',\n Bytes4 = 'bytes4',\n Int24 = 'int24',\n Int256 = 'int256',\n String = 'string',\n Tuple = 'tuple',\n TypeAddress = 'address[]',\n TypeBytes = 'bytes[]',\n TypeTuple = 'tuple[]',\n TypeUint128 = 'uint128[]',\n TypeUint256 = 'uint256[]',\n Uint128 = 'uint128',\n Uint16 = 'uint16',\n Uint160 = 'uint160',\n Uint24 = 'uint24',\n Uint256 = 'uint256',\n Uint25618 = 'uint256[18]',\n Uint2569 = 'uint256[9]',\n Uint32 = 'uint32',\n Uint40 = 'uint40',\n Uint8 = 'uint8',\n Uint82 = 'uint8[2]',\n Uint88 = 'uint8[8]'\n}\n\nenum StateMutability {\n Nonpayable = 'nonpayable',\n Payable = 'payable',\n Pure = 'pure',\n View = 'view'\n}\n\ninterface HumanizerInfoAbiType {\n constant?: boolean\n payable?: boolean\n anonymous?: boolean\n outputs?: Output[]\n inputs?: Input[]\n stateMutability?: StateMutability\n type: AbiType\n gas?: number\n}\n\ntype HumanizerInfoAbisKeysType =\n | 'AaveWethGatewayV2'\n | 'PancakeRouter'\n | 'UniV2Router'\n | 'UniV3Router'\n | 'UniV3Router2'\n | 'WETH'\n | 'AaveLendingPoolV2'\n | 'MovrRouter'\n | 'MovrAnyswap'\n | 'ERC721'\n | 'YearnVault'\n | 'IdentityFactory'\n | 'Batcher'\n | 'StakingPool'\n | 'WyvernExchange'\n | 'Swappin'\n | 'ERC20'\n | 'SwappinOwn'\n\ntype HumanizerInfoAbisType = {\n [key in HumanizerInfoAbisKeysType]: HumanizerInfoAbiType[]\n}\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.d.ts b/dist/v1/hooks/useConstants/useConstants.d.ts new file mode 100644 index 000000000..7eb0e4f78 --- /dev/null +++ b/dist/v1/hooks/useConstants/useConstants.d.ts @@ -0,0 +1,4 @@ +import { UseConstantsProps, UseConstantsReturnType } from './types'; +declare const useConstants: ({ fetch, endpoint }: UseConstantsProps) => UseConstantsReturnType; +export default useConstants; +//# sourceMappingURL=useConstants.d.ts.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.d.ts.map b/dist/v1/hooks/useConstants/useConstants.d.ts.map new file mode 100644 index 000000000..9da2e376b --- /dev/null +++ b/dist/v1/hooks/useConstants/useConstants.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"useConstants.d.ts","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/useConstants.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,SAAS,CAAA;AAEhB,QAAA,MAAM,YAAY,wBAAyB,iBAAiB,KAAG,sBA8D9D,CAAA;AAED,eAAe,YAAY,CAAA"} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.js b/dist/v1/hooks/useConstants/useConstants.js new file mode 100644 index 000000000..fbb5f12d0 --- /dev/null +++ b/dist/v1/hooks/useConstants/useConstants.js @@ -0,0 +1,55 @@ +import { useCallback, useEffect, useState } from 'react'; +import { fetchCaught } from '../../services/fetch'; +const useConstants = ({ fetch, endpoint }) => { + const [data, setData] = useState(null); + const [adexToStakingTransfers, setAdexToStakingTransfers] = useState(null); + const [hasError, setHasError] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const fetchConstants = useCallback(async () => { + try { + const response = await fetchCaught(fetch, `${endpoint}/result.json`).then((res) => res.body); + if (!response) + throw new Error('Failed to get the constants.'); + const { tokenList, humanizerInfo, customTokens } = response; + setIsLoading(() => { + setData({ + tokenList, + humanizerInfo, + customTokens, + lastFetched: Date.now() + }); + setHasError(false); + return false; + }); + } + catch (e) { + setHasError(true); + setData(null); + setIsLoading(false); + } + }, [fetch, endpoint]); + useEffect(() => { + fetchConstants(); + }, [fetchConstants]); + const getAdexToStakingTransfersLogs = async () => { + if (adexToStakingTransfers) + return adexToStakingTransfers; + try { + const adexToStakingTransfersLogs = await fetchCaught(fetch, `${endpoint}/adexToStakingTransfers.json`).then((res) => res.body || null); + setAdexToStakingTransfers(adexToStakingTransfersLogs); + return adexToStakingTransfersLogs; + } + catch (e) { + return null; + } + }; + return { + constants: data, + getAdexToStakingTransfersLogs, + isLoading, + retryFetch: fetchConstants, + hasError + }; +}; +export default useConstants; +//# sourceMappingURL=useConstants.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.js.map b/dist/v1/hooks/useConstants/useConstants.js.map new file mode 100644 index 000000000..d8f1a0545 --- /dev/null +++ b/dist/v1/hooks/useConstants/useConstants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"useConstants.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/useConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AASlD,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB,EAA0B,EAAE;IACtF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAA;IAC5D,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GACvD,QAAQ,CAAwC,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAA;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAA;IAEzD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,KAAK,EACL,GAAG,QAAQ,cAAc,CAC1B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAEzB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAE9D,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAA;YAE3D,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC;oBACN,SAAS;oBACT,aAAa;oBACb,YAAY;oBACZ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;iBACxB,CAAC,CAAA;gBACF,WAAW,CAAC,KAAK,CAAC,CAAA;gBAClB,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;SACH;QAAC,OAAO,CAAC,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,CAAA;YACjB,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,YAAY,CAAC,KAAK,CAAC,CAAA;SACpB;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAA;IAClB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAEpB,MAAM,6BAA6B,GAAG,KAAK,IAAI,EAAE;QAC/C,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QAEzD,IAAI;YACF,MAAM,0BAA0B,GAAG,MAAM,WAAW,CAClD,KAAK,EACL,GAAG,QAAQ,8BAA8B,CAC1C,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;YAEjC,yBAAyB,CAAC,0BAA0B,CAAC,CAAA;YACrD,OAAO,0BAA0B,CAAA;SAClC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,IAAI,CAAA;SACZ;IACH,CAAC,CAAA;IAED,OAAO;QACL,SAAS,EAAE,IAAI;QACf,6BAA6B;QAC7B,SAAS;QACT,UAAU,EAAE,cAAc;QAC1B,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AAED,eAAe,YAAY,CAAA","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\n\nimport { fetchCaught } from '../../services/fetch'\nimport {\n AdexToStakingTransfersLogsType,\n ConstantsType,\n ResultEndpointResponse,\n UseConstantsProps,\n UseConstantsReturnType\n} from './types'\n\nconst useConstants = ({ fetch, endpoint }: UseConstantsProps): UseConstantsReturnType => {\n const [data, setData] = useState(null)\n const [adexToStakingTransfers, setAdexToStakingTransfers] =\n useState(null)\n const [hasError, setHasError] = useState(false)\n const [isLoading, setIsLoading] = useState(true)\n\n const fetchConstants = useCallback(async () => {\n try {\n const response = await fetchCaught(\n fetch,\n `${endpoint}/result.json`\n ).then((res) => res.body)\n\n if (!response) throw new Error('Failed to get the constants.')\n\n const { tokenList, humanizerInfo, customTokens } = response\n\n setIsLoading(() => {\n setData({\n tokenList,\n humanizerInfo,\n customTokens,\n lastFetched: Date.now()\n })\n setHasError(false)\n return false\n })\n } catch (e) {\n setHasError(true)\n setData(null)\n setIsLoading(false)\n }\n }, [fetch, endpoint])\n\n useEffect(() => {\n fetchConstants()\n }, [fetchConstants])\n\n const getAdexToStakingTransfersLogs = async () => {\n if (adexToStakingTransfers) return adexToStakingTransfers\n\n try {\n const adexToStakingTransfersLogs = await fetchCaught(\n fetch,\n `${endpoint}/adexToStakingTransfers.json`\n ).then((res) => res.body || null)\n\n setAdexToStakingTransfers(adexToStakingTransfersLogs)\n return adexToStakingTransfersLogs\n } catch (e) {\n return null\n }\n }\n\n return {\n constants: data,\n getAdexToStakingTransfersLogs,\n isLoading,\n retryFetch: fetchConstants,\n hasError\n }\n}\n\nexport default useConstants\n"]} \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.d.ts b/dist/v1/services/fetch/fetch.d.ts new file mode 100644 index 000000000..69c8eaac9 --- /dev/null +++ b/dist/v1/services/fetch/fetch.d.ts @@ -0,0 +1,8 @@ +export declare function fetchPost(_fetch: any, url: string, body: any): Promise; +export declare function fetchGet(_fetch: any, url: string): Promise; +export declare function fetchCaught(_fetch: any, url: any, params?: any): Promise<{ + body?: R; + resp?: any; + errMsg: string; +}>; +//# sourceMappingURL=fetch.d.ts.map \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.d.ts.map b/dist/v1/services/fetch/fetch.d.ts.map new file mode 100644 index 000000000..e7d712c4e --- /dev/null +++ b/dist/v1/services/fetch/fetch.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../v1/services/fetch/fetch.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,gBAOlE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAStD;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,GAAG,EACR,MAAM,CAAC,EAAE,GAAG,GACX,OAAO,CAAC;IACT,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;CACf,CAAC,CAgBD"} \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.js b/dist/v1/services/fetch/fetch.js new file mode 100644 index 000000000..94363a0b1 --- /dev/null +++ b/dist/v1/services/fetch/fetch.js @@ -0,0 +1,39 @@ +export async function fetchPost(_fetch, url, body) { + const r = await _fetch(url, { + headers: { 'content-type': 'application/json' }, + method: 'POST', + body: JSON.stringify(body) + }); + return r.json(); +} +export async function fetchGet(_fetch, url) { + const response = await _fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }); + if (response.status !== 200) + throw new Error('Failed to fetch'); + return response.json(); +} +export async function fetchCaught(_fetch, url, params) { + let resp; + try { + resp = await _fetch(url, params); + } + catch (e) { + console.error(e); + return { errMsg: `Unexpected error: ${e && e.message}` }; + } + let body; + try { + body = await resp.json(); + } + catch (e) { + console.error(e); + return { errMsg: `Unexpected error: ${resp.status}, ${e && e.message}`, resp }; + } + return { body, resp, errMsg: '' }; +} +//# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.js.map b/dist/v1/services/fetch/fetch.js.map new file mode 100644 index 000000000..61b66a613 --- /dev/null +++ b/dist/v1/services/fetch/fetch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../v1/services/fetch/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAW,EAAE,GAAW,EAAE,IAAS;IACjE,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IACF,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAW,EAAE,GAAW;IACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAW,EACX,GAAQ,EACR,MAAY;IAMZ,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;KACjC;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAA;KACzD;IACD,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;KACzB;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAA;KAC/E;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACnC,CAAC","sourcesContent":["export async function fetchPost(_fetch: any, url: string, body: any) {\n const r = await _fetch(url, {\n headers: { 'content-type': 'application/json' },\n method: 'POST',\n body: JSON.stringify(body)\n })\n return r.json()\n}\n\nexport async function fetchGet(_fetch: any, url: string) {\n const response = await _fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (response.status !== 200) throw new Error('Failed to fetch')\n return response.json()\n}\n\nexport async function fetchCaught(\n _fetch: any,\n url: any,\n params?: any\n): Promise<{\n body?: R\n resp?: any\n errMsg: string\n}> {\n let resp\n try {\n resp = await _fetch(url, params)\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${e && e.message}` }\n }\n let body\n try {\n body = await resp.json()\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${resp.status}, ${e && e.message}`, resp }\n }\n return { body, resp, errMsg: '' }\n}\n"]} \ No newline at end of file diff --git a/dist/v1/services/fetch/index.d.ts b/dist/v1/services/fetch/index.d.ts new file mode 100644 index 000000000..6b2fcc070 --- /dev/null +++ b/dist/v1/services/fetch/index.d.ts @@ -0,0 +1,2 @@ +export * from './fetch'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/v1/services/fetch/index.d.ts.map b/dist/v1/services/fetch/index.d.ts.map new file mode 100644 index 000000000..e07240390 --- /dev/null +++ b/dist/v1/services/fetch/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../v1/services/fetch/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"} \ No newline at end of file diff --git a/dist/v1/services/fetch/index.js b/dist/v1/services/fetch/index.js new file mode 100644 index 000000000..20e81ff75 --- /dev/null +++ b/dist/v1/services/fetch/index.js @@ -0,0 +1,2 @@ +export * from './fetch'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/v1/services/fetch/index.js.map b/dist/v1/services/fetch/index.js.map new file mode 100644 index 000000000..72d6bef64 --- /dev/null +++ b/dist/v1/services/fetch/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/services/fetch/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA","sourcesContent":["export * from './fetch'\n"]} \ No newline at end of file From e6bead3ffa84ca5d37394ac7bf8f734ab3d42c3c Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Wed, 5 Feb 2025 12:43:38 +0200 Subject: [PATCH 4/8] Update dist code --- dist/consts/deploy.js | 11 --- dist/consts/deploy.js.map | 1 - dist/consts/networks.js | 74 ------------------- dist/consts/networks.js.map | 1 - .../compiled/AmbireAccountFactory.json | 1 - dist/interfaces/networkDescriptor.js | 3 - dist/interfaces/networkDescriptor.js.map | 1 - dist/src/interfaces/networkDescriptor.js | 3 - dist/src/interfaces/networkDescriptor.js.map | 1 - 9 files changed, 96 deletions(-) delete mode 100644 dist/consts/deploy.js delete mode 100644 dist/consts/deploy.js.map delete mode 100644 dist/consts/networks.js delete mode 100644 dist/consts/networks.js.map delete mode 100644 dist/contracts/compiled/AmbireAccountFactory.json delete mode 100644 dist/interfaces/networkDescriptor.js delete mode 100644 dist/interfaces/networkDescriptor.js.map delete mode 100644 dist/src/interfaces/networkDescriptor.js delete mode 100644 dist/src/interfaces/networkDescriptor.js.map diff --git a/dist/consts/deploy.js b/dist/consts/deploy.js deleted file mode 100644 index 492205543..000000000 --- a/dist/consts/deploy.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MAX_UINT256 = exports.ENTRY_POINT_MARKER = exports.ERC_4337_ENTRYPOINT = exports.AMBIRE_PAYMASTER_SIGNER = exports.AMBIRE_PAYMASTER = exports.AMBIRE_ACCOUNT_FACTORY = exports.PROXY_AMBIRE_ACCOUNT = void 0; -exports.PROXY_AMBIRE_ACCOUNT = '0x53a31973EBCC225E219BB0d7C0c9324773f5B3E9'; -exports.AMBIRE_ACCOUNT_FACTORY = '0x052c548af0377ec562508ceae6d98a0b61c612e6'; -exports.AMBIRE_PAYMASTER = '0x072E06b7d416f94C33eCa162E5726920f5006e82'; -exports.AMBIRE_PAYMASTER_SIGNER = '0x706431177041C87BEb1C25Fa29b92057Cb3c7089'; -exports.ERC_4337_ENTRYPOINT = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789'; -exports.ENTRY_POINT_MARKER = '0x0000000000000000000000000000000000000000000000000000000000007171'; -exports.MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; -//# sourceMappingURL=deploy.js.map \ No newline at end of file diff --git a/dist/consts/deploy.js.map b/dist/consts/deploy.js.map deleted file mode 100644 index ce4307270..000000000 --- a/dist/consts/deploy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/consts/deploy.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,4CAA4C,CAAA;AACnE,QAAA,sBAAsB,GAAG,4CAA4C,CAAA;AACrE,QAAA,gBAAgB,GAAG,4CAA4C,CAAA;AAC/D,QAAA,uBAAuB,GAAG,4CAA4C,CAAA;AACtE,QAAA,mBAAmB,GAAG,4CAA4C,CAAA;AAClE,QAAA,kBAAkB,GAC7B,oEAAoE,CAAA;AACzD,QAAA,WAAW,GACtB,+EAA+E,CAAA"} \ No newline at end of file diff --git a/dist/consts/networks.js b/dist/consts/networks.js deleted file mode 100644 index dd2af74fc..000000000 --- a/dist/consts/networks.js +++ /dev/null @@ -1,74 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.networks = void 0; -const deploy_1 = require("./deploy"); -const networks = [ - { - id: 'ethereum', - name: 'Ethereum', - nativeAssetSymbol: 'ETH', - rpcUrl: 'https://rpc.ankr.com/eth/5c7b8f0ac82c95161753873289e1a4f39aa69019b905b8032d76909962719be9', - rpcNoStateOverride: false, - chainId: 1n, - explorerUrl: 'https://etherscan.io', - erc4337: null, - unstoppableDomainsChain: 'ERC20' - }, - { - id: 'polygon', - name: 'Polygon', - nativeAssetSymbol: 'MATIC', - rpcUrl: 'https://rpc.ankr.com/polygon/5c7b8f0ac82c95161753873289e1a4f39aa69019b905b8032d76909962719be9', - rpcNoStateOverride: false, - chainId: 137n, - explorerUrl: 'https://polygonscan.com', - erc4337: { - // TODO: temp disabled (only while testing) - enabled: false, - entryPointAddr: deploy_1.ERC_4337_ENTRYPOINT, - hasPaymaster: true - }, - unstoppableDomainsChain: 'MATIC' - }, - { - id: 'optimism', - name: 'Optimism', - nativeAssetSymbol: 'ETH', - rpcUrl: 'https://rpc.ankr.com/optimism/5c7b8f0ac82c95161753873289e1a4f39aa69019b905b8032d76909962719be9', - rpcNoStateOverride: false, - chainId: 10n, - explorerUrl: 'https://optimistic.etherscan.io', - erc4337: { - enabled: false, - entryPointAddr: deploy_1.ERC_4337_ENTRYPOINT, - hasPaymaster: false - }, - unstoppableDomainsChain: 'ERC20' - }, - { - id: 'avalanche', - name: 'Avalanche', - nativeAssetSymbol: 'AVAX', - rpcUrl: 'https://api.avax.network/ext/bc/C/rpc', - rpcNoStateOverride: false, - chainId: 43114n, - explorerUrl: 'https://snowtrace.io', - erc4337: { - enabled: true, - entryPointAddr: deploy_1.ERC_4337_ENTRYPOINT, - hasPaymaster: true - }, - unstoppableDomainsChain: 'ERC20' - } - // This breaks the background service of the extension - // { - // id: 'hardhat', - // name: 'hardhat', - // nativeAssetSymbol: 'ETH', - // rpcUrl: '', - // rpcNoStateOverride: true, - // chainId: 31337n - // } -]; -exports.networks = networks; -//# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/consts/networks.js.map b/dist/consts/networks.js.map deleted file mode 100644 index 5c26ba105..000000000 --- a/dist/consts/networks.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../src/consts/networks.ts"],"names":[],"mappings":";;;AACA,qCAAkE;AAElE,MAAM,QAAQ,GAAwB;IACpC;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EACJ,2FAA2F;QAC7F,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,IAAI;QACb,uBAAuB,EAAE,OAAO;KACjC;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;QACf,iBAAiB,EAAE,OAAO;QAC1B,MAAM,EACJ,+FAA+F;QACjG,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE;YACP,2CAA2C;YAC3C,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,4BAAmB;YACnC,gBAAgB,EAAE,2BAAkB;YACpC,YAAY,EAAE,IAAI;SACnB;QACD,uBAAuB,EAAE,OAAO;KACjC;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EACJ,gGAAgG;QAClG,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE;YACP,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,4BAAmB;YACnC,gBAAgB,EAAE,2BAAkB;YACpC,YAAY,EAAE,KAAK;SACpB;QACD,uBAAuB,EAAE,OAAO;KACjC;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,iBAAiB,EAAE,MAAM;QACzB,MAAM,EACJ,uCAAuC;QACzC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,4BAAmB;YACnC,gBAAgB,EAAE,2BAAkB;YACpC,YAAY,EAAE,IAAI;SACnB;QACD,uBAAuB,EAAE,OAAO;KACjC;IACD,sDAAsD;IACtD,IAAI;IACJ,mBAAmB;IACnB,qBAAqB;IACrB,8BAA8B;IAC9B,gBAAgB;IAChB,8BAA8B;IAC9B,oBAAoB;IACpB,IAAI;CACL,CAAA;AAEQ,4BAAQ"} \ No newline at end of file diff --git a/dist/contracts/compiled/AmbireAccountFactory.json b/dist/contracts/compiled/AmbireAccountFactory.json deleted file mode 100644 index bb922270e..000000000 --- a/dist/contracts/compiled/AmbireAccountFactory.json +++ /dev/null @@ -1 +0,0 @@ -{ "abi": [{ "inputs": [{ "internalType": "address", "name": "allowed", "type": "address" }], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [{ "indexed": false, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "salt", "type": "uint256" }], "name": "LogDeployed", "type": "event" }, { "inputs": [], "name": "allowedToDrain", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "gas", "type": "uint256" }], "name": "call", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "code", "type": "bytes" }, { "internalType": "uint256", "name": "salt", "type": "uint256" }], "name": "deploy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "bytes", "name": "code", "type": "bytes" }, { "internalType": "uint256", "name": "salt", "type": "uint256" }, { "components": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "internalType": "struct AmbireAccount.Transaction[]", "name": "txns", "type": "tuple[]" }, { "internalType": "bytes", "name": "signature", "type": "bytes" }], "name": "deployAndExecute", "outputs": [], "stateMutability": "nonpayable", "type": "function" }], "bin": "0x60a03461007157601f61082b38819003918201601f19168301916001600160401b038311848410176100765780849260209460405283398101031261007157516001600160a01b03811681036100715760805260405161079e908161008d823960805181818161011401526101ea0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c9081631ce6236f146100fa5781631e86da2a14610055575080634e4a0c821461005057639c4ae2d01461004b57600080fd5b6102ad565b6101a5565b346100f75760803660031901126100f75767ffffffffffffffff6004358181116100f35761008790369060040161014d565b604492919235908282116100ef57366023830112156100ef578160040135908382116100eb573660248360051b850101116100eb576064359384116100eb576100e8946100da602495369060040161014d565b9590940191602435916103fe565b80f35b8580fd5b8480fd5b8280fd5b80fd5b346100f757806003193601126100f7576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261014857565b600080fd5b9181601f840112156101485782359167ffffffffffffffff8311610148576020838186019501011161014857565b600435906001600160a01b038216820361014857565b35906001600160a01b038216820361014857565b34610148576080366003190112610148576101be61017b565b60443567ffffffffffffffff8111610148576101de90369060040161014d565b91906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610269576100e89183604051948593843782019060009485938385809552039160243590606435f13d15610261573d906102458261037e565b91610253604051938461035c565b82523d84602084013e610567565b606090610567565b606460405162461bcd60e51b815260206004820152600f60248201527f4f4e4c595f415554484f52495a454400000000000000000000000000000000006044820152fd5b346101485760403660031901126101485760043567ffffffffffffffff8111610148576102f16102e46102f692369060040161014d565b919060243592369161039a565b610664565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161033b57604052565b6102f8565b6080810190811067ffffffffffffffff82111761033b57604052565b90601f8019910116810190811067ffffffffffffffff82111761033b57604052565b67ffffffffffffffff811161033b57601f01601f191660200190565b9291926103a68261037e565b916103b4604051938461035c565b829481845281830111610148578281602093846000960137010152565b908060209392818452848401376000828201840152601f01601f1916010190565b6040513d6000823e3d90fd5b959293949161041c906102f16001600160a01b03988994369161039a565b1693843b15610148579492919060409283519687957f6171d1c900000000000000000000000000000000000000000000000000000000875281604488018760048a015252606487019260648360051b8901019681946000925b8584106104cb5750505050505050836104a060009694829488946003198584030160248601526103d1565b03925af180156104c6576104b15750565b806104be6104c492610327565b8061013d565b565b6103f2565b919395995091939596976063198c82030183528935605e1983360301811215610148578201866104fa82610191565b168252602090818101358284015285810135601e1982360301811215610148570181813591019267ffffffffffffffff821161014857813603841361014857600193839261055192606090818b82015201916103d1565b9b019301940191949290938b9998979694610475565b1561056f5750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b8285106105b5575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610592565b156105d557565b606460405162461bcd60e51b815260206004820152601060248201527f4641494c45445f4445504c4f59494e47000000000000000000000000000000006044820152fd5b1561062057565b606460405162461bcd60e51b815260206004820152600c60248201527f4641494c45445f4d4154434800000000000000000000000000000000000000006044820152fd5b908151906106eb6106df6020850193842060405160208101917fff0000000000000000000000000000000000000000000000000000000000000083526bffffffffffffffffffffffff193060601b1660218301528560358301526055820152605581526106d081610340565b5190206001600160a01b031690565b6001600160a01b031690565b92833b156106fa575b50505090565b7fecef66cbb4d4c8dd18157def75d46290ddc298395ea46f7ff64321c1a912cbad92829151906000f56107456001600160a01b038083169061073d8215156105ce565b861614610619565b604080516001600160a01b039290921682526020820192909252a13880806106f456fea2646970667358221220bf93d2faf18389a8d31729ca4fff041a3b9a1e8639519c21e381779d050130aa64736f6c63430008130033", "binRuntime": "0x6080604052600436101561001257600080fd5b6000803560e01c9081631ce6236f146100fa5781631e86da2a14610055575080634e4a0c821461005057639c4ae2d01461004b57600080fd5b6102ad565b6101a5565b346100f75760803660031901126100f75767ffffffffffffffff6004358181116100f35761008790369060040161014d565b604492919235908282116100ef57366023830112156100ef578160040135908382116100eb573660248360051b850101116100eb576064359384116100eb576100e8946100da602495369060040161014d565b9590940191602435916103fe565b80f35b8580fd5b8480fd5b8280fd5b80fd5b346100f757806003193601126100f7576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261014857565b600080fd5b9181601f840112156101485782359167ffffffffffffffff8311610148576020838186019501011161014857565b600435906001600160a01b038216820361014857565b35906001600160a01b038216820361014857565b34610148576080366003190112610148576101be61017b565b60443567ffffffffffffffff8111610148576101de90369060040161014d565b91906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610269576100e89183604051948593843782019060009485938385809552039160243590606435f13d15610261573d906102458261037e565b91610253604051938461035c565b82523d84602084013e610567565b606090610567565b606460405162461bcd60e51b815260206004820152600f60248201527f4f4e4c595f415554484f52495a454400000000000000000000000000000000006044820152fd5b346101485760403660031901126101485760043567ffffffffffffffff8111610148576102f16102e46102f692369060040161014d565b919060243592369161039a565b610664565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161033b57604052565b6102f8565b6080810190811067ffffffffffffffff82111761033b57604052565b90601f8019910116810190811067ffffffffffffffff82111761033b57604052565b67ffffffffffffffff811161033b57601f01601f191660200190565b9291926103a68261037e565b916103b4604051938461035c565b829481845281830111610148578281602093846000960137010152565b908060209392818452848401376000828201840152601f01601f1916010190565b6040513d6000823e3d90fd5b959293949161041c906102f16001600160a01b03988994369161039a565b1693843b15610148579492919060409283519687957f6171d1c900000000000000000000000000000000000000000000000000000000875281604488018760048a015252606487019260648360051b8901019681946000925b8584106104cb5750505050505050836104a060009694829488946003198584030160248601526103d1565b03925af180156104c6576104b15750565b806104be6104c492610327565b8061013d565b565b6103f2565b919395995091939596976063198c82030183528935605e1983360301811215610148578201866104fa82610191565b168252602090818101358284015285810135601e1982360301811215610148570181813591019267ffffffffffffffff821161014857813603841361014857600193839261055192606090818b82015201916103d1565b9b019301940191949290938b9998979694610475565b1561056f5750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b8285106105b5575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610592565b156105d557565b606460405162461bcd60e51b815260206004820152601060248201527f4641494c45445f4445504c4f59494e47000000000000000000000000000000006044820152fd5b1561062057565b606460405162461bcd60e51b815260206004820152600c60248201527f4641494c45445f4d4154434800000000000000000000000000000000000000006044820152fd5b908151906106eb6106df6020850193842060405160208101917fff0000000000000000000000000000000000000000000000000000000000000083526bffffffffffffffffffffffff193060601b1660218301528560358301526055820152605581526106d081610340565b5190206001600160a01b031690565b6001600160a01b031690565b92833b156106fa575b50505090565b7fecef66cbb4d4c8dd18157def75d46290ddc298395ea46f7ff64321c1a912cbad92829151906000f56107456001600160a01b038083169061073d8215156105ce565b861614610619565b604080516001600160a01b039290921682526020820192909252a13880806106f456fea2646970667358221220bf93d2faf18389a8d31729ca4fff041a3b9a1e8639519c21e381779d050130aa64736f6c63430008130033" } diff --git a/dist/interfaces/networkDescriptor.js b/dist/interfaces/networkDescriptor.js deleted file mode 100644 index d44dde848..000000000 --- a/dist/interfaces/networkDescriptor.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=networkDescriptor.js.map \ No newline at end of file diff --git a/dist/interfaces/networkDescriptor.js.map b/dist/interfaces/networkDescriptor.js.map deleted file mode 100644 index ea99b3ae4..000000000 --- a/dist/interfaces/networkDescriptor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"networkDescriptor.js","sourceRoot":"","sources":["../../src/interfaces/networkDescriptor.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/src/interfaces/networkDescriptor.js b/dist/src/interfaces/networkDescriptor.js deleted file mode 100644 index d44dde848..000000000 --- a/dist/src/interfaces/networkDescriptor.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=networkDescriptor.js.map \ No newline at end of file diff --git a/dist/src/interfaces/networkDescriptor.js.map b/dist/src/interfaces/networkDescriptor.js.map deleted file mode 100644 index 9b52e6b08..000000000 --- a/dist/src/interfaces/networkDescriptor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"networkDescriptor.js","sourceRoot":"","sources":["../../../src/interfaces/networkDescriptor.ts"],"names":[],"mappings":""} \ No newline at end of file From e0e5ad4e4cfc6c75a149a458f8eb82e794016f6d Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Wed, 5 Feb 2025 13:04:19 +0200 Subject: [PATCH 5/8] Update moduleResolution and module to nodenext. Add updated build --- dist/src/classes/EmittableError.js | 5 +- dist/src/classes/EmittableError.js.map | 2 +- dist/src/classes/ExternalSignerError.js | 5 +- dist/src/classes/ExternalSignerError.js.map | 2 +- dist/src/classes/SwapAndBridgeError.js | 5 +- dist/src/classes/SwapAndBridgeError.js.map | 2 +- .../classes/SwapAndBridgeProviderApiError.js | 5 +- .../SwapAndBridgeProviderApiError.js.map | 2 +- dist/src/classes/session.js | 6 +- dist/src/classes/session.js.map | 2 +- dist/src/consts/account.js | 5 +- dist/src/consts/account.js.map | 2 +- dist/src/consts/addresses.js | 25 +- dist/src/consts/addresses.js.map | 2 +- dist/src/consts/bundlers.js | 9 +- dist/src/consts/bundlers.js.map | 2 +- dist/src/consts/coingecko.js | 27 +- dist/src/consts/coingecko.js.map | 2 +- dist/src/consts/dappCommunication.js | 5 +- dist/src/consts/dappCommunication.js.map | 2 +- dist/src/consts/deploy.js | 27 +- dist/src/consts/deploy.js.map | 2 +- dist/src/consts/deployless.js | 5 +- dist/src/consts/deployless.js.map | 2 +- dist/src/consts/derivation.js | 19 +- dist/src/consts/derivation.js.map | 2 +- dist/src/consts/feeTokens.js | 4 +- dist/src/consts/feeTokens.js.map | 2 +- dist/src/consts/gasTankFeeTokens.js | 4 +- dist/src/consts/gasTankFeeTokens.js.map | 2 +- dist/src/consts/intervals.js | 19 +- dist/src/consts/intervals.js.map | 2 +- dist/src/consts/networks.js | 23 +- dist/src/consts/networks.js.map | 2 +- dist/src/consts/pinnedTokens.js | 5 +- dist/src/consts/pinnedTokens.js.map | 2 +- .../src/consts/signAccountOp/errorHandling.js | 7 +- .../consts/signAccountOp/errorHandling.js.map | 2 +- dist/src/consts/signAccountOp/gas.js | 7 +- dist/src/consts/signAccountOp/gas.js.map | 2 +- dist/src/consts/signatures.js | 5 +- dist/src/consts/signatures.js.map | 2 +- .../controllers/accountAdder/accountAdder.js | 109 ++--- .../accountAdder/accountAdder.js.map | 2 +- dist/src/controllers/accounts/accounts.js | 29 +- dist/src/controllers/accounts/accounts.js.map | 2 +- dist/src/controllers/actions/actions.js | 25 +- dist/src/controllers/actions/actions.js.map | 2 +- dist/src/controllers/activity/activity.js | 47 +- dist/src/controllers/activity/activity.js.map | 2 +- .../controllers/addressBook/addressBook.js | 13 +- .../addressBook/addressBook.js.map | 2 +- dist/src/controllers/dapps/dapps.js | 21 +- dist/src/controllers/dapps/dapps.js.map | 2 +- .../defiPositions/defiPositions.js | 29 +- .../defiPositions/defiPositions.js.map | 2 +- dist/src/controllers/domains/domains.js | 21 +- dist/src/controllers/domains/domains.js.map | 2 +- dist/src/controllers/emailVault/emailVault.js | 45 +- .../controllers/emailVault/emailVault.js.map | 2 +- .../controllers/eventEmitter/eventEmitter.js | 10 +- .../eventEmitter/eventEmitter.js.map | 2 +- dist/src/controllers/invite/invite.js | 17 +- dist/src/controllers/invite/invite.js.map | 2 +- dist/src/controllers/keystore/keystore.js | 167 ++++---- dist/src/controllers/keystore/keystore.js.map | 2 +- dist/src/controllers/main/main.js | 401 +++++++++--------- dist/src/controllers/main/main.js.map | 2 +- dist/src/controllers/networks/networks.js | 37 +- dist/src/controllers/networks/networks.js.map | 2 +- dist/src/controllers/portfolio/portfolio.js | 75 ++-- .../controllers/portfolio/portfolio.js.map | 2 +- dist/src/controllers/providers/providers.js | 13 +- .../controllers/providers/providers.js.map | 2 +- .../selectedAccount/selectedAccount.js | 49 ++- .../selectedAccount/selectedAccount.js.map | 2 +- dist/src/controllers/signAccountOp/helper.js | 28 +- .../controllers/signAccountOp/helper.js.map | 2 +- .../signAccountOp/signAccountOp.js | 181 ++++---- .../signAccountOp/signAccountOp.js.map | 2 +- .../controllers/signMessage/signMessage.js | 39 +- .../signMessage/signMessage.js.map | 2 +- .../swapAndBridge/socketApiMock.js | 6 +- .../swapAndBridge/socketApiMock.js.map | 2 +- .../swapAndBridge/swapAndBridge.js | 165 +++---- .../swapAndBridge/swapAndBridge.js.map | 2 +- dist/src/controllers/transfer/transfer.js | 65 +-- dist/src/controllers/transfer/transfer.js.map | 2 +- dist/src/interfaces/account.js | 7 +- dist/src/interfaces/account.js.map | 2 +- dist/src/interfaces/actions.js | 3 +- dist/src/interfaces/banner.js | 3 +- dist/src/interfaces/dapp.js | 3 +- dist/src/interfaces/domains.js | 3 +- dist/src/interfaces/emailVault.js | 11 +- dist/src/interfaces/emailVault.js.map | 2 +- dist/src/interfaces/fetch.js | 3 +- dist/src/interfaces/hex.js | 3 +- dist/src/interfaces/keyIterator.js | 3 +- dist/src/interfaces/keystore.js | 7 +- dist/src/interfaces/keystore.js.map | 2 +- dist/src/interfaces/messenger.js | 3 +- dist/src/interfaces/network.js | 3 +- dist/src/interfaces/notification.js | 3 +- dist/src/interfaces/provider.js | 3 +- dist/src/interfaces/selectedAccount.js | 3 +- dist/src/interfaces/signAccountOp.js | 3 +- dist/src/interfaces/storage.js | 3 +- dist/src/interfaces/swapAndBridge.js | 3 +- dist/src/interfaces/transfer.js | 3 +- dist/src/interfaces/userRequest.js | 3 +- dist/src/interfaces/window.js | 3 +- dist/src/libs/account/account.js | 122 +++--- dist/src/libs/account/account.js.map | 2 +- dist/src/libs/accountAdder/accountAdder.js | 10 +- .../src/libs/accountAdder/accountAdder.js.map | 2 +- dist/src/libs/accountOp/accountOp.js | 49 ++- dist/src/libs/accountOp/accountOp.js.map | 2 +- dist/src/libs/accountOp/submittedAccountOp.js | 31 +- .../libs/accountOp/submittedAccountOp.js.map | 2 +- dist/src/libs/accountOp/types.js | 3 +- dist/src/libs/accountState/accountState.js | 33 +- .../src/libs/accountState/accountState.js.map | 2 +- dist/src/libs/actions/actions.js | 18 +- dist/src/libs/actions/actions.js.map | 2 +- dist/src/libs/banners/banners.js | 23 +- dist/src/libs/banners/banners.js.map | 2 +- dist/src/libs/calls/calls.js | 27 +- dist/src/libs/calls/calls.js.map | 2 +- dist/src/libs/defiPositions/defiAddresses.js | 7 +- .../libs/defiPositions/defiAddresses.js.map | 2 +- dist/src/libs/defiPositions/helpers.js | 10 +- dist/src/libs/defiPositions/helpers.js.map | 2 +- .../libs/defiPositions/providers/aaveV3.js | 39 +- .../defiPositions/providers/aaveV3.js.map | 2 +- .../helpers/networksWithPositions.js | 4 +- .../helpers/networksWithPositions.js.map | 2 +- .../providers/helpers/univ3Math.js | 6 +- .../providers/helpers/univ3Math.js.map | 2 +- .../src/libs/defiPositions/providers/index.js | 10 +- .../libs/defiPositions/providers/index.js.map | 2 +- .../src/libs/defiPositions/providers/uniV3.js | 29 +- .../libs/defiPositions/providers/uniV3.js.map | 2 +- dist/src/libs/defiPositions/types.js | 11 +- dist/src/libs/defiPositions/types.js.map | 2 +- dist/src/libs/deployless/compile.js | 17 +- dist/src/libs/deployless/compile.js.map | 2 +- dist/src/libs/deployless/deployless.js | 41 +- dist/src/libs/deployless/deployless.js.map | 2 +- .../src/libs/deployless/simulateDeployCall.js | 39 +- .../libs/deployless/simulateDeployCall.js.map | 2 +- dist/src/libs/dkim/getPublicKey.js | 9 +- dist/src/libs/dkim/getPublicKey.js.map | 2 +- dist/src/libs/dkim/isDKIM.js | 5 +- dist/src/libs/dkim/isDKIM.js.map | 2 +- dist/src/libs/dkim/parse.js | 13 +- dist/src/libs/dkim/parse.js.map | 2 +- dist/src/libs/dkim/parseEmail.js | 28 +- dist/src/libs/dkim/parseEmail.js.map | 2 +- dist/src/libs/dkim/publicKeyToComponents.js | 5 +- .../libs/dkim/publicKeyToComponents.js.map | 2 +- dist/src/libs/dkim/recovery.js | 22 +- dist/src/libs/dkim/recovery.js.map | 2 +- dist/src/libs/dkim/toSolidity.js | 5 +- dist/src/libs/dkim/toSolidity.js.map | 2 +- dist/src/libs/dns/lookup.js | 5 +- dist/src/libs/dns/lookup.js.map | 2 +- dist/src/libs/emailVault/emailVault.js | 10 +- dist/src/libs/emailVault/emailVault.js.map | 2 +- dist/src/libs/erc7677/erc7677.js | 40 +- dist/src/libs/erc7677/erc7677.js.map | 2 +- dist/src/libs/erc7677/types.js | 3 +- dist/src/libs/errorDecoder/constants.js | 7 +- dist/src/libs/errorDecoder/constants.js.map | 2 +- dist/src/libs/errorDecoder/customErrors.js | 12 +- .../src/libs/errorDecoder/customErrors.js.map | 2 +- dist/src/libs/errorDecoder/errorDecoder.js | 53 +-- .../src/libs/errorDecoder/errorDecoder.js.map | 2 +- .../libs/errorDecoder/handlers/biconomy.js | 12 +- .../errorDecoder/handlers/biconomy.js.map | 2 +- .../src/libs/errorDecoder/handlers/bundler.js | 8 +- .../libs/errorDecoder/handlers/bundler.js.map | 2 +- dist/src/libs/errorDecoder/handlers/custom.js | 14 +- .../libs/errorDecoder/handlers/custom.js.map | 2 +- dist/src/libs/errorDecoder/handlers/index.js | 29 +- .../libs/errorDecoder/handlers/index.js.map | 2 +- .../errorDecoder/handlers/innerCallFailure.js | 8 +- .../handlers/innerCallFailure.js.map | 2 +- dist/src/libs/errorDecoder/handlers/panic.js | 26 +- .../libs/errorDecoder/handlers/panic.js.map | 2 +- .../libs/errorDecoder/handlers/paymaster.js | 8 +- .../errorDecoder/handlers/paymaster.js.map | 2 +- .../src/libs/errorDecoder/handlers/pimlico.js | 12 +- .../libs/errorDecoder/handlers/pimlico.js.map | 2 +- .../src/libs/errorDecoder/handlers/relayer.js | 22 +- .../libs/errorDecoder/handlers/relayer.js.map | 2 +- dist/src/libs/errorDecoder/handlers/revert.js | 22 +- .../libs/errorDecoder/handlers/revert.js.map | 2 +- dist/src/libs/errorDecoder/handlers/rpc.js | 21 +- .../src/libs/errorDecoder/handlers/rpc.js.map | 2 +- .../errorDecoder/handlers/userRejection.js | 17 +- .../handlers/userRejection.js.map | 2 +- dist/src/libs/errorDecoder/helpers.js | 23 +- dist/src/libs/errorDecoder/helpers.js.map | 2 +- dist/src/libs/errorDecoder/index.js | 7 +- dist/src/libs/errorDecoder/index.js.map | 2 +- dist/src/libs/errorDecoder/types.js | 7 +- dist/src/libs/errorDecoder/types.js.map | 2 +- .../errorHumanizer/broadcastErrorHumanizer.js | 37 +- .../broadcastErrorHumanizer.js.map | 2 +- dist/src/libs/errorHumanizer/errors.js | 20 +- dist/src/libs/errorHumanizer/errors.js.map | 2 +- .../estimationErrorHumanizer.js | 35 +- .../estimationErrorHumanizer.js.map | 2 +- dist/src/libs/errorHumanizer/helpers.js | 34 +- dist/src/libs/errorHumanizer/helpers.js.map | 2 +- .../errorHumanizer/humanizeCommonCases.js | 9 +- .../errorHumanizer/humanizeCommonCases.js.map | 2 +- dist/src/libs/errorHumanizer/index.js | 10 +- dist/src/libs/errorHumanizer/index.js.map | 2 +- dist/src/libs/errorHumanizer/types.js | 3 +- dist/src/libs/estimate/errors.js | 6 +- dist/src/libs/estimate/errors.js.map | 2 +- dist/src/libs/estimate/estimate.js | 130 +++--- dist/src/libs/estimate/estimate.js.map | 2 +- dist/src/libs/estimate/estimateBundler.js | 43 +- dist/src/libs/estimate/estimateBundler.js.map | 2 +- dist/src/libs/estimate/estimateEOA.js | 59 +-- dist/src/libs/estimate/estimateEOA.js.map | 2 +- dist/src/libs/estimate/estimateGas.js | 39 +- dist/src/libs/estimate/estimateGas.js.map | 2 +- dist/src/libs/estimate/estimateHelpers.js | 12 +- dist/src/libs/estimate/estimateHelpers.js.map | 2 +- dist/src/libs/estimate/estimateWithRetries.js | 6 +- .../libs/estimate/estimateWithRetries.js.map | 2 +- dist/src/libs/estimate/interfaces.js | 3 +- dist/src/libs/estimate/refund.js | 17 +- dist/src/libs/estimate/refund.js.map | 2 +- dist/src/libs/gasPrice/gasPrice.js | 36 +- dist/src/libs/gasPrice/gasPrice.js.map | 2 +- dist/src/libs/humanizer/const/abis/1Inch.js | 5 +- .../libs/humanizer/const/abis/1Inch.js.map | 2 +- dist/src/libs/humanizer/const/abis/Aave.js | 9 +- .../src/libs/humanizer/const/abis/Aave.js.map | 2 +- dist/src/libs/humanizer/const/abis/Across.js | 5 +- .../libs/humanizer/const/abis/Across.js.map | 2 +- .../humanizer/const/abis/AmbireAccount.js | 5 +- .../humanizer/const/abis/AmbireAccount.js.map | 2 +- dist/src/libs/humanizer/const/abis/Curve.js | 5 +- .../libs/humanizer/const/abis/Curve.js.map | 2 +- .../libs/humanizer/const/abis/KyberSwap.js | 5 +- .../humanizer/const/abis/KyberSwap.js.map | 2 +- dist/src/libs/humanizer/const/abis/Legends.js | 5 +- .../libs/humanizer/const/abis/Legends.js.map | 2 +- dist/src/libs/humanizer/const/abis/Lido.js | 7 +- .../src/libs/humanizer/const/abis/Lido.js.map | 2 +- dist/src/libs/humanizer/const/abis/Sushi.js | 5 +- .../libs/humanizer/const/abis/Sushi.js.map | 2 +- dist/src/libs/humanizer/const/abis/Tokens.js | 9 +- .../libs/humanizer/const/abis/Tokens.js.map | 2 +- .../libs/humanizer/const/abis/TraderJoe.js | 5 +- .../humanizer/const/abis/TraderJoe.js.map | 2 +- dist/src/libs/humanizer/const/abis/Uniswap.js | 11 +- .../libs/humanizer/const/abis/Uniswap.js.map | 2 +- dist/src/libs/humanizer/const/abis/Wallet.js | 5 +- .../libs/humanizer/const/abis/Wallet.js.map | 2 +- dist/src/libs/humanizer/const/abis/index.js | 44 +- .../libs/humanizer/const/abis/index.js.map | 2 +- dist/src/libs/humanizer/const/abis/socket.js | 5 +- .../libs/humanizer/const/abis/socket.js.map | 2 +- .../libs/humanizer/const/abis/stkWallet.js | 5 +- .../humanizer/const/abis/stkWallet.js.map | 2 +- dist/src/libs/humanizer/const/coinType.js | 5 +- dist/src/libs/humanizer/const/coinType.js.map | 2 +- dist/src/libs/humanizer/index.js | 144 ++++--- dist/src/libs/humanizer/index.js.map | 2 +- dist/src/libs/humanizer/interfaces.js | 3 +- .../humanizer/messageModules/ensModule.js | 16 +- .../humanizer/messageModules/ensModule.js.map | 2 +- .../messageModules/entryPointModule.js | 18 +- .../messageModules/entryPointModule.js.map | 2 +- .../humanizer/messageModules/erc20Module.js | 30 +- .../messageModules/erc20Module.js.map | 2 +- .../humanizer/messageModules/erc721Module.js | 20 +- .../messageModules/erc721Module.js.map | 2 +- .../libs/humanizer/messageModules/index.js | 25 +- .../humanizer/messageModules/index.js.map | 2 +- .../humanizer/messageModules/legendsModule.js | 24 +- .../messageModules/legendsModule.js.map | 2 +- .../humanizer/messageModules/openseaModule.js | 26 +- .../messageModules/openseaModule.js.map | 2 +- .../humanizer/messageModules/permit2Module.js | 32 +- .../messageModules/permit2Module.js.map | 2 +- .../src/libs/humanizer/modules/1Inch/index.js | 54 +-- .../libs/humanizer/modules/1Inch/index.js.map | 2 +- .../modules/Aave/aaveLendingPoolV2.js | 52 +-- .../modules/Aave/aaveLendingPoolV2.js.map | 2 +- .../src/libs/humanizer/modules/Aave/aaveV3.js | 62 +-- .../libs/humanizer/modules/Aave/aaveV3.js.map | 2 +- .../modules/Aave/aaveWethGatewayV2.js | 52 +-- .../modules/Aave/aaveWethGatewayV2.js.map | 2 +- dist/src/libs/humanizer/modules/Aave/index.js | 18 +- .../libs/humanizer/modules/Aave/index.js.map | 2 +- .../libs/humanizer/modules/Across/index.js | 48 ++- .../humanizer/modules/Across/index.js.map | 2 +- .../libs/humanizer/modules/Airdrops/index.js | 14 +- .../humanizer/modules/Airdrops/index.js.map | 2 +- .../modules/AsciiModule/asciiModule.js | 24 +- .../modules/AsciiModule/asciiModule.js.map | 2 +- .../humanizer/modules/AsciiModule/index.js | 6 +- .../modules/AsciiModule/index.js.map | 2 +- .../src/libs/humanizer/modules/Curve/index.js | 24 +- .../libs/humanizer/modules/Curve/index.js.map | 2 +- .../humanizer/modules/Deployment/index.js | 10 +- .../humanizer/modules/Deployment/index.js.map | 2 +- dist/src/libs/humanizer/modules/ENS/index.js | 72 ++-- .../libs/humanizer/modules/ENS/index.js.map | 2 +- .../FallbackHumanizer/fallBackHumanizer.js | 30 +- .../fallBackHumanizer.js.map | 2 +- .../modules/FallbackHumanizer/index.js | 6 +- .../modules/FallbackHumanizer/index.js.map | 2 +- .../modules/GasTankModule/gasTankModule.js | 24 +- .../GasTankModule/gasTankModule.js.map | 2 +- .../humanizer/modules/GasTankModule/index.js | 6 +- .../modules/GasTankModule/index.js.map | 2 +- .../libs/humanizer/modules/KyberSwap/index.js | 28 +- .../humanizer/modules/KyberSwap/index.js.map | 2 +- .../libs/humanizer/modules/Legends/index.js | 46 +- .../humanizer/modules/Legends/index.js.map | 2 +- dist/src/libs/humanizer/modules/Lido/index.js | 40 +- .../libs/humanizer/modules/Lido/index.js.map | 2 +- .../libs/humanizer/modules/OpenSea/index.js | 44 +- .../humanizer/modules/OpenSea/index.js.map | 2 +- .../humanizer/modules/PostProcessing/index.js | 6 +- .../modules/PostProcessing/index.js.map | 2 +- .../PostProcessing/postProcessModule.js | 14 +- .../PostProcessing/postProcessModule.js.map | 2 +- .../humanizer/modules/PreProcess/index.js | 6 +- .../humanizer/modules/PreProcess/index.js.map | 2 +- .../modules/PreProcess/preProcessModule.js | 6 +- .../PreProcess/preProcessModule.js.map | 2 +- .../humanizer/modules/Privileges/index.js | 6 +- .../humanizer/modules/Privileges/index.js.map | 2 +- .../modules/Privileges/privileges.js | 37 +- .../modules/Privileges/privileges.js.map | 2 +- .../modules/SingletonFactory/index.js | 6 +- .../modules/SingletonFactory/index.js.map | 2 +- .../SingletonFactory/singletonFactory.js | 20 +- .../SingletonFactory/singletonFactory.js.map | 2 +- .../libs/humanizer/modules/Socket/index.js | 7 +- .../humanizer/modules/Socket/index.js.map | 2 +- .../humanizer/modules/Socket/socketModules.js | 370 ++++++++-------- .../modules/Socket/socketModules.js.map | 2 +- .../libs/humanizer/modules/Sushiswap/index.js | 6 +- .../humanizer/modules/Sushiswap/index.js.map | 2 +- .../modules/Sushiswap/sushiSwapModule.js | 28 +- .../modules/Sushiswap/sushiSwapModule.js.map | 2 +- .../libs/humanizer/modules/Tokens/index.js | 8 +- .../humanizer/modules/Tokens/index.js.map | 2 +- .../libs/humanizer/modules/Tokens/tokens.js | 139 +++--- .../humanizer/modules/Tokens/tokens.js.map | 2 +- .../libs/humanizer/modules/TraderJoe/index.js | 84 ++-- .../humanizer/modules/TraderJoe/index.js.map | 2 +- .../humanizer/modules/Uniswap/Commands.js | 7 +- .../humanizer/modules/Uniswap/Commands.js.map | 2 +- .../libs/humanizer/modules/Uniswap/index.js | 20 +- .../humanizer/modules/Uniswap/index.js.map | 2 +- .../humanizer/modules/Uniswap/interfaces.js | 3 +- .../modules/Uniswap/uniUniversalRouter.js | 148 +++---- .../modules/Uniswap/uniUniversalRouter.js.map | 2 +- .../libs/humanizer/modules/Uniswap/uniV2.js | 139 +++--- .../humanizer/modules/Uniswap/uniV2.js.map | 2 +- .../libs/humanizer/modules/Uniswap/uniV3.js | 262 ++++++------ .../humanizer/modules/Uniswap/uniV3.js.map | 2 +- .../libs/humanizer/modules/Uniswap/utils.js | 29 +- .../humanizer/modules/Uniswap/utils.js.map | 2 +- .../modules/WALLET/WALLETSupplyController.js | 25 +- .../WALLET/WALLETSupplyController.js.map | 2 +- .../libs/humanizer/modules/WALLET/index.js | 62 +-- .../humanizer/modules/WALLET/index.js.map | 2 +- .../humanizer/modules/WALLET/stakingPools.js | 46 +- .../modules/WALLET/stakingPools.js.map | 2 +- .../libs/humanizer/modules/Wrapping/index.js | 6 +- .../humanizer/modules/Wrapping/index.js.map | 2 +- .../humanizer/modules/Wrapping/wrapping.js | 20 +- .../modules/Wrapping/wrapping.js.map | 2 +- .../embeddedAmbireOperationHumanizer/index.js | 22 +- .../index.js.map | 2 +- dist/src/libs/humanizer/testHelpers.js | 9 +- dist/src/libs/humanizer/testHelpers.js.map | 2 +- dist/src/libs/humanizer/utils.js | 100 +++-- dist/src/libs/humanizer/utils.js.map | 2 +- dist/src/libs/keyIterator/keyIterator.js | 60 +-- dist/src/libs/keyIterator/keyIterator.js.map | 2 +- dist/src/libs/keys/keys.js | 33 +- dist/src/libs/keys/keys.js.map | 2 +- .../src/libs/keystoreSigner/keystoreSigner.js | 14 +- .../libs/keystoreSigner/keystoreSigner.js.map | 2 +- dist/src/libs/ledger/ledger.js | 6 +- dist/src/libs/ledger/ledger.js.map | 2 +- dist/src/libs/magicLink/magicLink.js | 6 +- dist/src/libs/magicLink/magicLink.js.map | 2 +- dist/src/libs/main/main.js | 45 +- dist/src/libs/main/main.js.map | 2 +- dist/src/libs/networks/networks.js | 65 +-- dist/src/libs/networks/networks.js.map | 2 +- dist/src/libs/paymaster/abstractPaymaster.js | 6 +- .../libs/paymaster/abstractPaymaster.js.map | 2 +- dist/src/libs/paymaster/paymaster.js | 86 ++-- dist/src/libs/paymaster/paymaster.js.map | 2 +- dist/src/libs/polling/polling.js | 9 +- dist/src/libs/polling/polling.js.map | 2 +- dist/src/libs/portfolio/batcher.js | 5 +- dist/src/libs/portfolio/batcher.js.map | 2 +- dist/src/libs/portfolio/customToken.js | 3 +- dist/src/libs/portfolio/gecko.js | 26 +- dist/src/libs/portfolio/gecko.js.map | 2 +- .../libs/portfolio/getNetworksWithAssets.js | 4 +- .../portfolio/getNetworksWithAssets.js.map | 2 +- dist/src/libs/portfolio/getOnchainBalances.js | 50 ++- .../libs/portfolio/getOnchainBalances.js.map | 2 +- dist/src/libs/portfolio/helpers.js | 91 ++-- dist/src/libs/portfolio/helpers.js.map | 2 +- dist/src/libs/portfolio/icons.js | 12 +- dist/src/libs/portfolio/icons.js.map | 2 +- dist/src/libs/portfolio/index.js | 7 +- dist/src/libs/portfolio/index.js.map | 2 +- dist/src/libs/portfolio/interfaces.js | 3 +- .../portfolio/migrations/tokenPreferences.js | 5 +- .../migrations/tokenPreferences.js.map | 2 +- dist/src/libs/portfolio/pagination.js | 9 +- dist/src/libs/portfolio/pagination.js.map | 2 +- .../libs/portfolio/pendingAmountsHelper.js | 10 +- .../portfolio/pendingAmountsHelper.js.map | 2 +- dist/src/libs/portfolio/portfolio.js | 82 ++-- dist/src/libs/portfolio/portfolio.js.map | 2 +- dist/src/libs/proxyDeploy/bytecode.js | 27 +- dist/src/libs/proxyDeploy/bytecode.js.map | 2 +- dist/src/libs/proxyDeploy/deploy.js | 12 +- dist/src/libs/proxyDeploy/deploy.js.map | 2 +- .../libs/proxyDeploy/getAmbireAddressTwo.js | 10 +- .../proxyDeploy/getAmbireAddressTwo.js.map | 2 +- dist/src/libs/relayerCall/relayerCall.js | 22 +- dist/src/libs/relayerCall/relayerCall.js.map | 2 +- dist/src/libs/richJson/richJson.js | 9 +- dist/src/libs/richJson/richJson.js.map | 2 +- dist/src/libs/selectedAccount/errors.js | 30 +- dist/src/libs/selectedAccount/errors.js.map | 2 +- .../libs/selectedAccount/selectedAccount.js | 34 +- .../selectedAccount/selectedAccount.js.map | 2 +- dist/src/libs/signMessage/signMessage.js | 147 ++++--- dist/src/libs/signMessage/signMessage.js.map | 2 +- dist/src/libs/singleton/singleton.js | 6 +- dist/src/libs/singleton/singleton.js.map | 2 +- dist/src/libs/swapAndBridge/swapAndBridge.js | 58 ++- .../libs/swapAndBridge/swapAndBridge.js.map | 2 +- .../swapAndBridgeErrorHumanizer.js | 19 +- .../swapAndBridgeErrorHumanizer.js.map | 2 +- dist/src/libs/tracer/debugTraceCall.js | 69 +-- dist/src/libs/tracer/debugTraceCall.js.map | 2 +- dist/src/libs/transfer/amount.js | 5 +- dist/src/libs/transfer/amount.js.map | 2 +- dist/src/libs/transfer/userRequest.js | 42 +- dist/src/libs/transfer/userRequest.js.map | 2 +- dist/src/libs/trezor/trezor.js | 9 +- dist/src/libs/trezor/trezor.js.map | 2 +- dist/src/libs/userOperation/types.js | 3 +- dist/src/libs/userOperation/userOperation.js | 154 ++++--- .../libs/userOperation/userOperation.js.map | 2 +- dist/src/services/address/address.js | 10 +- dist/src/services/address/address.js.map | 2 +- dist/src/services/address/index.js | 5 +- dist/src/services/address/index.js.map | 2 +- dist/src/services/assetInfo/assetInfo.js | 17 +- dist/src/services/assetInfo/assetInfo.js.map | 2 +- dist/src/services/assetInfo/index.js | 5 +- dist/src/services/assetInfo/index.js.map | 2 +- .../services/bundlers/DevBundlerSwitcher.js | 12 +- .../bundlers/DevBundlerSwitcher.js.map | 2 +- dist/src/services/bundlers/biconomy.js | 12 +- dist/src/services/bundlers/biconomy.js.map | 2 +- .../bundlers/brokenBiconomyBroadcast.js | 8 +- .../bundlers/brokenBiconomyBroadcast.js.map | 2 +- .../bundlers/brokenPimlicoBroadcast.js | 8 +- .../bundlers/brokenPimlicoBroadcast.js.map | 2 +- dist/src/services/bundlers/bundler.js | 52 +-- dist/src/services/bundlers/bundler.js.map | 2 +- dist/src/services/bundlers/bundlerSwitcher.js | 12 +- .../services/bundlers/bundlerSwitcher.js.map | 2 +- dist/src/services/bundlers/getBundler.js | 25 +- dist/src/services/bundlers/getBundler.js.map | 2 +- dist/src/services/bundlers/pimlico.js | 12 +- dist/src/services/bundlers/pimlico.js.map | 2 +- dist/src/services/bundlers/types.js | 3 +- dist/src/services/ensDomains/ensDomains.js | 31 +- .../src/services/ensDomains/ensDomains.js.map | 2 +- dist/src/services/ensDomains/index.js | 5 +- dist/src/services/ensDomains/index.js.map | 2 +- dist/src/services/explorers/jiffyscan.js | 6 +- dist/src/services/explorers/jiffyscan.js.map | 2 +- .../services/paymaster/FailedPaymasters.js | 19 +- .../paymaster/FailedPaymasters.js.map | 2 +- .../services/paymaster/PaymasterFactory.js | 18 +- .../paymaster/PaymasterFactory.js.map | 2 +- dist/src/services/paymaster/index.js | 7 +- dist/src/services/paymaster/index.js.map | 2 +- dist/src/services/provider/getRpcProvider.js | 13 +- .../services/provider/getRpcProvider.js.map | 2 +- dist/src/services/provider/index.js | 5 +- dist/src/services/provider/index.js.map | 2 +- dist/src/services/socket/api.js | 68 +-- dist/src/services/socket/api.js.map | 2 +- dist/src/services/socket/constants.js | 17 +- dist/src/services/socket/constants.js.map | 2 +- dist/src/services/unstoppableDomains/index.js | 5 +- .../services/unstoppableDomains/index.js.map | 2 +- .../unstoppableDomains/unstoppableDomains.js | 16 +- .../unstoppableDomains.js.map | 2 +- dist/src/services/validations/index.js | 5 +- dist/src/services/validations/index.js.map | 2 +- dist/src/services/validations/validate.js | 35 +- dist/src/services/validations/validate.js.map | 2 +- dist/src/utils/accounts.js | 5 +- dist/src/utils/accounts.js.map | 2 +- dist/src/utils/addHexPrefix.js | 10 +- dist/src/utils/addHexPrefix.js.map | 2 +- dist/src/utils/benzin.js | 11 +- dist/src/utils/benzin.js.map | 2 +- .../utils/formatDecimals/formatDecimals.js | 4 +- .../formatDecimals/formatDecimals.js.map | 2 +- dist/src/utils/generateSpoofSig.js | 8 +- dist/src/utils/generateSpoofSig.js.map | 2 +- dist/src/utils/hdPath.js | 9 +- dist/src/utils/hdPath.js.map | 2 +- dist/src/utils/hexStringToUint8Array.js | 4 +- dist/src/utils/hexStringToUint8Array.js.map | 2 +- dist/src/utils/isHexPrefixed.js | 6 +- dist/src/utils/isHexPrefixed.js.map | 2 +- dist/src/utils/isSameAddr.js | 8 +- dist/src/utils/isSameAddr.js.map | 2 +- dist/src/utils/networks.js | 11 +- dist/src/utils/networks.js.map | 2 +- dist/src/utils/numbers/formatters.js | 12 +- dist/src/utils/numbers/formatters.js.map | 2 +- dist/src/utils/shortenAddress.js | 4 +- dist/src/utils/shortenAddress.js.map | 2 +- dist/src/utils/simulationStateOverride.js | 21 +- dist/src/utils/simulationStateOverride.js.map | 2 +- dist/src/utils/stripHexPrefix.js | 10 +- dist/src/utils/stripHexPrefix.js.map | 2 +- dist/src/utils/wait.js | 4 +- dist/src/utils/wait.js.map | 2 +- dist/v1/hooks/useConstants/index.js | 9 +- dist/v1/hooks/useConstants/index.js.map | 2 +- dist/v1/hooks/useConstants/types.js | 3 +- dist/v1/hooks/useConstants/types.js.map | 2 +- dist/v1/hooks/useConstants/useConstants.js | 24 +- .../v1/hooks/useConstants/useConstants.js.map | 2 +- dist/v1/services/fetch/fetch.js | 12 +- dist/v1/services/fetch/fetch.js.map | 2 +- dist/v1/services/fetch/index.js | 5 +- dist/v1/services/fetch/index.js.map | 2 +- tsconfig.json | 3 +- 563 files changed, 4911 insertions(+), 3683 deletions(-) diff --git a/dist/src/classes/EmittableError.js b/dist/src/classes/EmittableError.js index 03fc5738f..3923028d2 100644 --- a/dist/src/classes/EmittableError.js +++ b/dist/src/classes/EmittableError.js @@ -1,4 +1,6 @@ -export default class EmittableError extends Error { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class EmittableError extends Error { level; message; error; @@ -15,4 +17,5 @@ export default class EmittableError extends Error { } } } +exports.default = EmittableError; //# sourceMappingURL=EmittableError.js.map \ No newline at end of file diff --git a/dist/src/classes/EmittableError.js.map b/dist/src/classes/EmittableError.js.map index 0629b0a54..b53f68f89 100644 --- a/dist/src/classes/EmittableError.js.map +++ b/dist/src/classes/EmittableError.js.map @@ -1 +1 @@ -{"version":3,"file":"EmittableError.js","sourceRoot":"","sources":["../../../src/classes/EmittableError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,KAAK;IAC/C,KAAK,CAAmB;IAExB,OAAO,CAAqB;IAE5B,KAAK,CAAO;IAEZ,YAAY,QAAmF;QAC7F,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAE3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;SACzC;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;SAC5B;IACH,CAAC;CACF","sourcesContent":["import { ErrorRef } from '../controllers/eventEmitter/eventEmitter'\n\nexport default class EmittableError extends Error {\n level: ErrorRef['level']\n\n message: ErrorRef['message']\n\n error: Error\n\n constructor(errorRef: { message: ErrorRef['message']; level: ErrorRef['level']; error?: Error }) {\n super()\n this.message = errorRef.message\n this.name = 'EmittableError'\n this.level = errorRef.level\n\n if (!errorRef.error) {\n this.error = new Error(errorRef.message)\n } else {\n this.error = errorRef.error\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"EmittableError.js","sourceRoot":"","sources":["../../../src/classes/EmittableError.ts"],"names":[],"mappings":";;AAEA,MAAqB,cAAe,SAAQ,KAAK;IAC/C,KAAK,CAAmB;IAExB,OAAO,CAAqB;IAE5B,KAAK,CAAO;IAEZ,YAAY,QAAmF;QAC7F,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAE3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;SACzC;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;SAC5B;IACH,CAAC;CACF;AAnBD,iCAmBC","sourcesContent":["import { ErrorRef } from '../controllers/eventEmitter/eventEmitter'\n\nexport default class EmittableError extends Error {\n level: ErrorRef['level']\n\n message: ErrorRef['message']\n\n error: Error\n\n constructor(errorRef: { message: ErrorRef['message']; level: ErrorRef['level']; error?: Error }) {\n super()\n this.message = errorRef.message\n this.name = 'EmittableError'\n this.level = errorRef.level\n\n if (!errorRef.error) {\n this.error = new Error(errorRef.message)\n } else {\n this.error = errorRef.error\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.js b/dist/src/classes/ExternalSignerError.js index 0d39f1155..cc603852e 100644 --- a/dist/src/classes/ExternalSignerError.js +++ b/dist/src/classes/ExternalSignerError.js @@ -1,8 +1,11 @@ -export default class ExternalSignerError extends Error { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ExternalSignerError extends Error { constructor(message) { super(); this.name = 'ExternalSignerError'; this.message = message; } } +exports.default = ExternalSignerError; //# sourceMappingURL=ExternalSignerError.js.map \ No newline at end of file diff --git a/dist/src/classes/ExternalSignerError.js.map b/dist/src/classes/ExternalSignerError.js.map index fd7e830b3..16d99b769 100644 --- a/dist/src/classes/ExternalSignerError.js.map +++ b/dist/src/classes/ExternalSignerError.js.map @@ -1 +1 @@ -{"version":3,"file":"ExternalSignerError.js","sourceRoot":"","sources":["../../../src/classes/ExternalSignerError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class ExternalSignerError extends Error {\n constructor(message: string) {\n super()\n this.name = 'ExternalSignerError'\n this.message = message\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ExternalSignerError.js","sourceRoot":"","sources":["../../../src/classes/ExternalSignerError.ts"],"names":[],"mappings":";;AAAA,MAAqB,mBAAoB,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAND,sCAMC","sourcesContent":["export default class ExternalSignerError extends Error {\n constructor(message: string) {\n super()\n this.name = 'ExternalSignerError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.js b/dist/src/classes/SwapAndBridgeError.js index 0fdecee15..af3986aa0 100644 --- a/dist/src/classes/SwapAndBridgeError.js +++ b/dist/src/classes/SwapAndBridgeError.js @@ -1,8 +1,11 @@ -export default class SwapAndBridgeError extends Error { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class SwapAndBridgeError extends Error { constructor(message) { super(); this.name = 'SwapAndBridgeError'; this.message = message; } } +exports.default = SwapAndBridgeError; //# sourceMappingURL=SwapAndBridgeError.js.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeError.js.map b/dist/src/classes/SwapAndBridgeError.js.map index 7c10c9bc2..c7e7beae6 100644 --- a/dist/src/classes/SwapAndBridgeError.js.map +++ b/dist/src/classes/SwapAndBridgeError.js.map @@ -1 +1 @@ -{"version":3,"file":"SwapAndBridgeError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,KAAK;IACnD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class SwapAndBridgeError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeError'\n this.message = message\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SwapAndBridgeError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeError.ts"],"names":[],"mappings":";;AAAA,MAAqB,kBAAmB,SAAQ,KAAK;IACnD,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAND,qCAMC","sourcesContent":["export default class SwapAndBridgeError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.js b/dist/src/classes/SwapAndBridgeProviderApiError.js index 3c6ad531d..24ea74517 100644 --- a/dist/src/classes/SwapAndBridgeProviderApiError.js +++ b/dist/src/classes/SwapAndBridgeProviderApiError.js @@ -1,8 +1,11 @@ -export default class SwapAndBridgeProviderApiError extends Error { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class SwapAndBridgeProviderApiError extends Error { constructor(message) { super(); this.name = 'SwapAndBridgeProviderApiError'; this.message = message; } } +exports.default = SwapAndBridgeProviderApiError; //# sourceMappingURL=SwapAndBridgeProviderApiError.js.map \ No newline at end of file diff --git a/dist/src/classes/SwapAndBridgeProviderApiError.js.map b/dist/src/classes/SwapAndBridgeProviderApiError.js.map index cdb22820c..b329f1977 100644 --- a/dist/src/classes/SwapAndBridgeProviderApiError.js.map +++ b/dist/src/classes/SwapAndBridgeProviderApiError.js.map @@ -1 +1 @@ -{"version":3,"file":"SwapAndBridgeProviderApiError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeProviderApiError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,KAAK;IAC9D,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF","sourcesContent":["export default class SwapAndBridgeProviderApiError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeProviderApiError'\n this.message = message\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SwapAndBridgeProviderApiError.js","sourceRoot":"","sources":["../../../src/classes/SwapAndBridgeProviderApiError.ts"],"names":[],"mappings":";;AAAA,MAAqB,6BAA8B,SAAQ,KAAK;IAC9D,YAAY,OAAe;QACzB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAND,gDAMC","sourcesContent":["export default class SwapAndBridgeProviderApiError extends Error {\n constructor(message: string) {\n super()\n this.name = 'SwapAndBridgeProviderApiError'\n this.message = message\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/classes/session.js b/dist/src/classes/session.js index 4b5a09734..9dcdd6227 100644 --- a/dist/src/classes/session.js +++ b/dist/src/classes/session.js @@ -1,6 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Session = void 0; // Each instance of a Session represents an active connection between a dApp and the wallet. // For more details on how to use it, refer to the DappsController. -export class Session { +class Session { origin = ''; icon = ''; name = ''; @@ -37,4 +40,5 @@ export class Session { }; } } +exports.Session = Session; //# sourceMappingURL=session.js.map \ No newline at end of file diff --git a/dist/src/classes/session.js.map b/dist/src/classes/session.js.map index e9c448516..4adf9e8e6 100644 --- a/dist/src/classes/session.js.map +++ b/dist/src/classes/session.js.map @@ -1 +1 @@ -{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/classes/session.ts"],"names":[],"mappings":"AASA,4FAA4F;AAC5F,mEAAmE;AACnE,MAAM,OAAO,OAAO;IAClB,MAAM,GAAW,EAAE,CAAA;IAEnB,IAAI,GAAW,EAAE,CAAA;IAEjB,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,GAAkB,IAAI,CAAA;IAE3B,SAAS,GAAqB,IAAI,CAAA;IAElC,WAAW,CAAC,KAAU,EAAE,IAAS;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;SACzE;IACH,CAAC;IAED,YAAY,IAAiB;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAe;QAChD,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAChC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAA;IACvC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IACH,CAAC;CACF","sourcesContent":["import { Messenger } from '../interfaces/messenger'\n\nexport interface SessionProp {\n origin?: string\n icon?: string\n name?: string\n tabId?: number\n}\n\n// Each instance of a Session represents an active connection between a dApp and the wallet.\n// For more details on how to use it, refer to the DappsController.\nexport class Session {\n origin: string = ''\n\n icon: string = ''\n\n name: string = ''\n\n tabId: number | null = null\n\n messenger: Messenger | null = null\n\n sendMessage(event: any, data: any) {\n if (this.messenger) {\n this.messenger.send('broadcast', { event, data }, { tabId: this.tabId })\n }\n }\n\n constructor(data: SessionProp) {\n this.setProp(data)\n }\n\n setMessenger(messenger: Messenger) {\n this.messenger = messenger\n }\n\n setProp({ origin, icon, name, tabId }: SessionProp) {\n if (origin) this.origin = origin\n if (icon) this.icon = icon\n if (name) this.name = name\n if (tabId) this.tabId = tabId\n }\n\n get sessionId() {\n return `${this.tabId}-${this.origin}`\n }\n\n toJSON() {\n return {\n ...this,\n sessionId: this.sessionId\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/classes/session.ts"],"names":[],"mappings":";;;AASA,4FAA4F;AAC5F,mEAAmE;AACnE,MAAa,OAAO;IAClB,MAAM,GAAW,EAAE,CAAA;IAEnB,IAAI,GAAW,EAAE,CAAA;IAEjB,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,GAAkB,IAAI,CAAA;IAE3B,SAAS,GAAqB,IAAI,CAAA;IAElC,WAAW,CAAC,KAAU,EAAE,IAAS;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;SACzE;IACH,CAAC;IAED,YAAY,IAAiB;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAe;QAChD,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAChC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAC1B,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAA;IACvC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IACH,CAAC;CACF;AA1CD,0BA0CC","sourcesContent":["import { Messenger } from '../interfaces/messenger'\n\nexport interface SessionProp {\n origin?: string\n icon?: string\n name?: string\n tabId?: number\n}\n\n// Each instance of a Session represents an active connection between a dApp and the wallet.\n// For more details on how to use it, refer to the DappsController.\nexport class Session {\n origin: string = ''\n\n icon: string = ''\n\n name: string = ''\n\n tabId: number | null = null\n\n messenger: Messenger | null = null\n\n sendMessage(event: any, data: any) {\n if (this.messenger) {\n this.messenger.send('broadcast', { event, data }, { tabId: this.tabId })\n }\n }\n\n constructor(data: SessionProp) {\n this.setProp(data)\n }\n\n setMessenger(messenger: Messenger) {\n this.messenger = messenger\n }\n\n setProp({ origin, icon, name, tabId }: SessionProp) {\n if (origin) this.origin = origin\n if (icon) this.icon = icon\n if (name) this.name = name\n if (tabId) this.tabId = tabId\n }\n\n get sessionId() {\n return `${this.tabId}-${this.origin}`\n }\n\n toJSON() {\n return {\n ...this,\n sessionId: this.sessionId\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/consts/account.js b/dist/src/consts/account.js index 73637d220..2e32300f6 100644 --- a/dist/src/consts/account.js +++ b/dist/src/consts/account.js @@ -1,2 +1,5 @@ -export const DEFAULT_ACCOUNT_LABEL = 'Account'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_ACCOUNT_LABEL = void 0; +exports.DEFAULT_ACCOUNT_LABEL = 'Account'; //# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/consts/account.js.map b/dist/src/consts/account.js.map index b37a7cb42..0095a9ef5 100644 --- a/dist/src/consts/account.js.map +++ b/dist/src/consts/account.js.map @@ -1 +1 @@ -{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/consts/account.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAA","sourcesContent":["export const DEFAULT_ACCOUNT_LABEL = 'Account'\n"]} \ No newline at end of file +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/consts/account.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,SAAS,CAAA","sourcesContent":["export const DEFAULT_ACCOUNT_LABEL = 'Account'\n"]} \ No newline at end of file diff --git a/dist/src/consts/addresses.js b/dist/src/consts/addresses.js index 8ddad2af6..69593a75d 100644 --- a/dist/src/consts/addresses.js +++ b/dist/src/consts/addresses.js @@ -1,7 +1,10 @@ -export const FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'; -export const PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'; -export const AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'; -export const UNISWAP_UNIVERSAL_ROUTERS = { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PORTFOLIO_TESTS_V2 = exports.STAGING_RELAYER_EXECUTOR_ADDRESSES = exports.RELAYER_EXECUTOR_ADDRESSES = exports.WALLET_TOKEN = exports.STK_WALLET = exports.WALLET_STAKING_ADDR = exports.SUPPLY_CONTROLLER_ADDR = exports.UNISWAP_UNIVERSAL_ROUTERS = exports.AMBIRE_V1_QUICK_ACC_MANAGER = exports.PERMIT_2_ADDRESS = exports.FEE_COLLECTOR = void 0; +exports.FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'; +exports.PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'; +exports.AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'; +exports.UNISWAP_UNIVERSAL_ROUTERS = { 1: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', 11155111: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', 8453: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', @@ -16,16 +19,16 @@ export const UNISWAP_UNIVERSAL_ROUTERS = { 42220: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4', 81457: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4' }; -export const SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'; -export const WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'; -export const STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'; -export const WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'; -export const RELAYER_EXECUTOR_ADDRESSES = [ +exports.SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'; +exports.WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'; +exports.STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'; +exports.WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'; +exports.RELAYER_EXECUTOR_ADDRESSES = [ '0x942f9CE5D9a33a82F88D233AEb3292E680230348', '0xCFaFC6BdD1B92E510D5409EE460bb1A712165AA8' ]; -export const STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']; -export const PORTFOLIO_TESTS_V2 = { +exports.STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']; +exports.PORTFOLIO_TESTS_V2 = { addr: '0xae376B42699fDB0D80e9ceE068A4f75ae6d70d85', key: '0xD5Cdb05Df16FB0f84a02ebff3405f80e441d7D57', factory: '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d', diff --git a/dist/src/consts/addresses.js.map b/dist/src/consts/addresses.js.map index 338f091ad..4a8e51b61 100644 --- a/dist/src/consts/addresses.js.map +++ b/dist/src/consts/addresses.js.map @@ -1 +1 @@ -{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/consts/addresses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,4CAA4C,CAAA;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4CAA4C,CAAA;AAC5E,MAAM,CAAC,MAAM,2BAA2B,GAAG,4CAA4C,CAAA;AACvF,MAAM,CAAC,MAAM,yBAAyB,GAAQ;IAC5C,CAAC,EAAE,4CAA4C;IAC/C,QAAQ,EAAE,4CAA4C;IACtD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,EAAE,EAAE,4CAA4C;IAChD,QAAQ,EAAE,4CAA4C;IACtD,GAAG,EAAE,4CAA4C;IACjD,KAAK,EAAE,4CAA4C;IACnD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;CACpD,CAAA;AACD,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C,CAAA;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,4CAA4C,CAAA;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA;AACD,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,4CAA4C,CAAC,CAAA;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,4CAA4C;IAClD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EACN,wPAAwP;IAC1P,IAAI,EAAE,oEAAoE;CAC3E,CAAA","sourcesContent":["export const FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'\nexport const PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\nexport const AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'\nexport const UNISWAP_UNIVERSAL_ROUTERS: any = {\n 1: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 8453: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0x5E325eDA8064b456f4781070C0738d849c824258',\n 421614: '0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2',\n 10: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',\n 11155420: '0xD5bBa708b39537d33F2812E5Ea032622456F1A95',\n 137: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',\n 84532: '0x050E797f3625EC8785265e1d9BDd4799b97528A1',\n 56: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 43114: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 42220: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',\n 81457: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4'\n}\nexport const SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'\nexport const WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'\nexport const STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'\nexport const WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'\nexport const RELAYER_EXECUTOR_ADDRESSES = [\n '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n '0xCFaFC6BdD1B92E510D5409EE460bb1A712165AA8'\n]\nexport const STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']\nexport const PORTFOLIO_TESTS_V2 = {\n addr: '0xae376B42699fDB0D80e9ceE068A4f75ae6d70d85',\n key: '0xD5Cdb05Df16FB0f84a02ebff3405f80e441d7D57',\n factory: '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d',\n bytecode:\n '0x7f00000000000000000000000000000000000000000000000000000000000000027fa85abbdf4f476f0727ae1450f282935c0d57708ae82c281b3fa758db2e21c89b553d602d80604d3d3981f3363d3d373d3d3d363d730f2aa7bcda3d9d210df69a394b6965cb2566c8285af43d82803e903d91602b57fd5bf3',\n salt: '0x0000000000000000000000000000000000000000000000000000000000000000'\n}\n"]} \ No newline at end of file +{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/consts/addresses.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,4CAA4C,CAAA;AAC5D,QAAA,gBAAgB,GAAG,4CAA4C,CAAA;AAC/D,QAAA,2BAA2B,GAAG,4CAA4C,CAAA;AAC1E,QAAA,yBAAyB,GAAQ;IAC5C,CAAC,EAAE,4CAA4C;IAC/C,QAAQ,EAAE,4CAA4C;IACtD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,EAAE,EAAE,4CAA4C;IAChD,QAAQ,EAAE,4CAA4C;IACtD,GAAG,EAAE,4CAA4C;IACjD,KAAK,EAAE,4CAA4C;IACnD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;CACpD,CAAA;AACY,QAAA,sBAAsB,GAAG,4CAA4C,CAAA;AACrE,QAAA,mBAAmB,GAAG,4CAA4C,CAAA;AAClE,QAAA,UAAU,GAAG,4CAA4C,CAAA;AACzD,QAAA,YAAY,GAAG,4CAA4C,CAAA;AAC3D,QAAA,0BAA0B,GAAG;IACxC,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA;AACY,QAAA,kCAAkC,GAAG,CAAC,4CAA4C,CAAC,CAAA;AACnF,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,4CAA4C;IAClD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EACN,wPAAwP;IAC1P,IAAI,EAAE,oEAAoE;CAC3E,CAAA","sourcesContent":["export const FEE_COLLECTOR = '0x942f9CE5D9a33a82F88D233AEb3292E680230348'\nexport const PERMIT_2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\nexport const AMBIRE_V1_QUICK_ACC_MANAGER = '0xfF3f6D14DF43c112aB98834Ee1F82083E07c26BF'\nexport const UNISWAP_UNIVERSAL_ROUTERS: any = {\n 1: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 8453: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0x5E325eDA8064b456f4781070C0738d849c824258',\n 421614: '0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2',\n 10: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',\n 11155420: '0xD5bBa708b39537d33F2812E5Ea032622456F1A95',\n 137: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',\n 84532: '0x050E797f3625EC8785265e1d9BDd4799b97528A1',\n 56: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 43114: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n 42220: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',\n 81457: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4'\n}\nexport const SUPPLY_CONTROLLER_ADDR = '0xA69B8074CE03A33B13057B1e9D37DCDE0024Aaff'\nexport const WALLET_STAKING_ADDR = '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935'\nexport const STK_WALLET = '0x1c9475B4e3A712a582F29a2A503a8CBe0c97EE78'\nexport const WALLET_TOKEN = '0x88800092fF476844f74dC2FC427974BBee2794Ae'\nexport const RELAYER_EXECUTOR_ADDRESSES = [\n '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n '0xCFaFC6BdD1B92E510D5409EE460bb1A712165AA8'\n]\nexport const STAGING_RELAYER_EXECUTOR_ADDRESSES = ['0x706431177041C87BEb1C25Fa29b92057Cb3c7089']\nexport const PORTFOLIO_TESTS_V2 = {\n addr: '0xae376B42699fDB0D80e9ceE068A4f75ae6d70d85',\n key: '0xD5Cdb05Df16FB0f84a02ebff3405f80e441d7D57',\n factory: '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d',\n bytecode:\n '0x7f00000000000000000000000000000000000000000000000000000000000000027fa85abbdf4f476f0727ae1450f282935c0d57708ae82c281b3fa758db2e21c89b553d602d80604d3d3981f3363d3d373d3d3d363d730f2aa7bcda3d9d210df69a394b6965cb2566c8285af43d82803e903d91602b57fd5bf3',\n salt: '0x0000000000000000000000000000000000000000000000000000000000000000'\n}\n"]} \ No newline at end of file diff --git a/dist/src/consts/bundlers.js b/dist/src/consts/bundlers.js index 9a12eb9e0..7ba3cc665 100644 --- a/dist/src/consts/bundlers.js +++ b/dist/src/consts/bundlers.js @@ -1,4 +1,7 @@ -export const PIMLICO = 'pimlico'; -export const BICONOMY = 'biconomy'; -export const allBundlers = [PIMLICO, BICONOMY]; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.allBundlers = exports.BICONOMY = exports.PIMLICO = void 0; +exports.PIMLICO = 'pimlico'; +exports.BICONOMY = 'biconomy'; +exports.allBundlers = [exports.PIMLICO, exports.BICONOMY]; //# sourceMappingURL=bundlers.js.map \ No newline at end of file diff --git a/dist/src/consts/bundlers.js.map b/dist/src/consts/bundlers.js.map index 1c040e01c..4806b251f 100644 --- a/dist/src/consts/bundlers.js.map +++ b/dist/src/consts/bundlers.js.map @@ -1 +1 @@ -{"version":3,"file":"bundlers.js","sourceRoot":"","sources":["../../../src/consts/bundlers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAA;AAChC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAIlC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA","sourcesContent":["export const PIMLICO = 'pimlico'\nexport const BICONOMY = 'biconomy'\n\nexport type BUNDLER = typeof PIMLICO | typeof BICONOMY\n\nexport const allBundlers = [PIMLICO, BICONOMY]\n"]} \ No newline at end of file +{"version":3,"file":"bundlers.js","sourceRoot":"","sources":["../../../src/consts/bundlers.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,SAAS,CAAA;AACnB,QAAA,QAAQ,GAAG,UAAU,CAAA;AAIrB,QAAA,WAAW,GAAG,CAAC,eAAO,EAAE,gBAAQ,CAAC,CAAA","sourcesContent":["export const PIMLICO = 'pimlico'\nexport const BICONOMY = 'biconomy'\n\nexport type BUNDLER = typeof PIMLICO | typeof BICONOMY\n\nexport const allBundlers = [PIMLICO, BICONOMY]\n"]} \ No newline at end of file diff --git a/dist/src/consts/coingecko.js b/dist/src/consts/coingecko.js index add73f536..ce1873aa3 100644 --- a/dist/src/consts/coingecko.js +++ b/dist/src/consts/coingecko.js @@ -1,39 +1,46 @@ -import { ZeroAddress } from 'ethers'; -import { WALLET_STAKING_ADDR, WALLET_TOKEN } from './addresses'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getCoinGeckoTokenUrl = exports.getCoinGeckoTokenApiUrl = exports.geckoTokenAddressMapper = exports.geckoIdMapper = void 0; +const ethers_1 = require("ethers"); +const addresses_1 = require("./addresses"); const COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3/coins/'; const COINGECKO_BASE_URL = 'https://www.coingecko.com/en/coins/'; // @TODO some form of a constants list -export function geckoIdMapper(address, network) { - if (address === ZeroAddress) +function geckoIdMapper(address, network) { + if (address === ethers_1.ZeroAddress) return network.nativeAssetId; // we currently can't map aave so we're leaving this if (address === '0x4da27a545c0c5B758a6BA100e3a049001de870f5') return 'aave'; return null; } +exports.geckoIdMapper = geckoIdMapper; /** * Maps specific token addresses to alternative addresses if they are missing on * CoinGecko (so that they are aliased to existing tokens). */ -export function geckoTokenAddressMapper(address) { +function geckoTokenAddressMapper(address) { // xWALLET is missing on CoinGecko, so alias it to WALLET token (that exists on CoinGecko) - if (address === WALLET_STAKING_ADDR) - return WALLET_TOKEN; + if (address === addresses_1.WALLET_STAKING_ADDR) + return addresses_1.WALLET_TOKEN; return address; } +exports.geckoTokenAddressMapper = geckoTokenAddressMapper; /** * Constructs the CoinGecko API URL for a given token address and network ID. * Handles special cases where the CoinGecko API handles differently certain * tokens like the native tokens. */ -export function getCoinGeckoTokenApiUrl({ tokenAddr, geckoChainId, geckoNativeCoinId }) { +function getCoinGeckoTokenApiUrl({ tokenAddr, geckoChainId, geckoNativeCoinId }) { // CoinGecko does not handle native assets (ETH, MATIC, BNB...) via the /contract endpoint. // Instead, native assets are identified by URL with the `nativeAssetId` directly. - if (tokenAddr === ZeroAddress) + if (tokenAddr === ethers_1.ZeroAddress) return `${COINGECKO_API_BASE_URL}${geckoNativeCoinId}`; const geckoTokenAddress = geckoTokenAddressMapper(tokenAddr); return `${COINGECKO_API_BASE_URL}${geckoChainId}/contract/${geckoTokenAddress}`; } +exports.getCoinGeckoTokenApiUrl = getCoinGeckoTokenApiUrl; /** Constructs the CoinGecko URL for a given token slug. */ -export const getCoinGeckoTokenUrl = (slug) => `${COINGECKO_BASE_URL}${slug}`; +const getCoinGeckoTokenUrl = (slug) => `${COINGECKO_BASE_URL}${slug}`; +exports.getCoinGeckoTokenUrl = getCoinGeckoTokenUrl; //# sourceMappingURL=coingecko.js.map \ No newline at end of file diff --git a/dist/src/consts/coingecko.js.map b/dist/src/consts/coingecko.js.map index 9adeec460..7b2993802 100644 --- a/dist/src/consts/coingecko.js.map +++ b/dist/src/consts/coingecko.js.map @@ -1 +1 @@ -{"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../../src/consts/coingecko.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAGpC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,sBAAsB,GAAG,yCAAyC,CAAA;AACxE,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AAEhE,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAgB;IAC7D,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,aAAa,CAAA;IAEzD,oDAAoD;IACpD,IAAI,OAAO,KAAK,4CAA4C;QAAE,OAAO,MAAM,CAAA;IAE3E,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,0FAA0F;IAC1F,IAAI,OAAO,KAAK,mBAAmB;QAAE,OAAO,YAAY,CAAA;IAExD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,SAAS,EACT,YAAY,EACZ,iBAAiB,EAKlB;IACC,2FAA2F;IAC3F,kFAAkF;IAClF,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,GAAG,sBAAsB,GAAG,iBAAiB,EAAE,CAAA;IAErF,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAC5D,OAAO,GAAG,sBAAsB,GAAG,YAAY,aAAa,iBAAiB,EAAE,CAAA;AACjF,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,IAAI,EAAE,CAAA","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../interfaces/network'\nimport { WALLET_STAKING_ADDR, WALLET_TOKEN } from './addresses'\n\nconst COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3/coins/'\nconst COINGECKO_BASE_URL = 'https://www.coingecko.com/en/coins/'\n\n// @TODO some form of a constants list\nexport function geckoIdMapper(address: string, network: Network): string | null {\n if (address === ZeroAddress) return network.nativeAssetId\n\n // we currently can't map aave so we're leaving this\n if (address === '0x4da27a545c0c5B758a6BA100e3a049001de870f5') return 'aave'\n\n return null\n}\n\n/**\n * Maps specific token addresses to alternative addresses if they are missing on\n * CoinGecko (so that they are aliased to existing tokens).\n */\nexport function geckoTokenAddressMapper(address: string) {\n // xWALLET is missing on CoinGecko, so alias it to WALLET token (that exists on CoinGecko)\n if (address === WALLET_STAKING_ADDR) return WALLET_TOKEN\n\n return address\n}\n\n/**\n * Constructs the CoinGecko API URL for a given token address and network ID.\n * Handles special cases where the CoinGecko API handles differently certain\n * tokens like the native tokens.\n */\nexport function getCoinGeckoTokenApiUrl({\n tokenAddr,\n geckoChainId,\n geckoNativeCoinId\n}: {\n tokenAddr: string\n geckoChainId: string\n geckoNativeCoinId: string\n}) {\n // CoinGecko does not handle native assets (ETH, MATIC, BNB...) via the /contract endpoint.\n // Instead, native assets are identified by URL with the `nativeAssetId` directly.\n if (tokenAddr === ZeroAddress) return `${COINGECKO_API_BASE_URL}${geckoNativeCoinId}`\n\n const geckoTokenAddress = geckoTokenAddressMapper(tokenAddr)\n return `${COINGECKO_API_BASE_URL}${geckoChainId}/contract/${geckoTokenAddress}`\n}\n\n/** Constructs the CoinGecko URL for a given token slug. */\nexport const getCoinGeckoTokenUrl = (slug: string) => `${COINGECKO_BASE_URL}${slug}`\n"]} \ No newline at end of file +{"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../../src/consts/coingecko.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC,2CAA+D;AAE/D,MAAM,sBAAsB,GAAG,yCAAyC,CAAA;AACxE,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AAEhE,sCAAsC;AACtC,SAAgB,aAAa,CAAC,OAAe,EAAE,OAAgB;IAC7D,IAAI,OAAO,KAAK,oBAAW;QAAE,OAAO,OAAO,CAAC,aAAa,CAAA;IAEzD,oDAAoD;IACpD,IAAI,OAAO,KAAK,4CAA4C;QAAE,OAAO,MAAM,CAAA;IAE3E,OAAO,IAAI,CAAA;AACb,CAAC;AAPD,sCAOC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,0FAA0F;IAC1F,IAAI,OAAO,KAAK,+BAAmB;QAAE,OAAO,wBAAY,CAAA;IAExD,OAAO,OAAO,CAAA;AAChB,CAAC;AALD,0DAKC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,EACtC,SAAS,EACT,YAAY,EACZ,iBAAiB,EAKlB;IACC,2FAA2F;IAC3F,kFAAkF;IAClF,IAAI,SAAS,KAAK,oBAAW;QAAE,OAAO,GAAG,sBAAsB,GAAG,iBAAiB,EAAE,CAAA;IAErF,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAC5D,OAAO,GAAG,sBAAsB,GAAG,YAAY,aAAa,iBAAiB,EAAE,CAAA;AACjF,CAAC;AAfD,0DAeC;AAED,2DAA2D;AACpD,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,IAAI,EAAE,CAAA;AAAvE,QAAA,oBAAoB,wBAAmD","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../interfaces/network'\nimport { WALLET_STAKING_ADDR, WALLET_TOKEN } from './addresses'\n\nconst COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3/coins/'\nconst COINGECKO_BASE_URL = 'https://www.coingecko.com/en/coins/'\n\n// @TODO some form of a constants list\nexport function geckoIdMapper(address: string, network: Network): string | null {\n if (address === ZeroAddress) return network.nativeAssetId\n\n // we currently can't map aave so we're leaving this\n if (address === '0x4da27a545c0c5B758a6BA100e3a049001de870f5') return 'aave'\n\n return null\n}\n\n/**\n * Maps specific token addresses to alternative addresses if they are missing on\n * CoinGecko (so that they are aliased to existing tokens).\n */\nexport function geckoTokenAddressMapper(address: string) {\n // xWALLET is missing on CoinGecko, so alias it to WALLET token (that exists on CoinGecko)\n if (address === WALLET_STAKING_ADDR) return WALLET_TOKEN\n\n return address\n}\n\n/**\n * Constructs the CoinGecko API URL for a given token address and network ID.\n * Handles special cases where the CoinGecko API handles differently certain\n * tokens like the native tokens.\n */\nexport function getCoinGeckoTokenApiUrl({\n tokenAddr,\n geckoChainId,\n geckoNativeCoinId\n}: {\n tokenAddr: string\n geckoChainId: string\n geckoNativeCoinId: string\n}) {\n // CoinGecko does not handle native assets (ETH, MATIC, BNB...) via the /contract endpoint.\n // Instead, native assets are identified by URL with the `nativeAssetId` directly.\n if (tokenAddr === ZeroAddress) return `${COINGECKO_API_BASE_URL}${geckoNativeCoinId}`\n\n const geckoTokenAddress = geckoTokenAddressMapper(tokenAddr)\n return `${COINGECKO_API_BASE_URL}${geckoChainId}/contract/${geckoTokenAddress}`\n}\n\n/** Constructs the CoinGecko URL for a given token slug. */\nexport const getCoinGeckoTokenUrl = (slug: string) => `${COINGECKO_BASE_URL}${slug}`\n"]} \ No newline at end of file diff --git a/dist/src/consts/dappCommunication.js b/dist/src/consts/dappCommunication.js index 16376a094..168b6146a 100644 --- a/dist/src/consts/dappCommunication.js +++ b/dist/src/consts/dappCommunication.js @@ -1,8 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = void 0; const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = [ 'https://legends.ambire.com', 'https://legends-staging.ambire.com', 'http://localhost:19006', 'http://localhost:19007' ]; -export { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }; +exports.ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS; //# sourceMappingURL=dappCommunication.js.map \ No newline at end of file diff --git a/dist/src/consts/dappCommunication.js.map b/dist/src/consts/dappCommunication.js.map index 80e7237de..a54a27ff8 100644 --- a/dist/src/consts/dappCommunication.js.map +++ b/dist/src/consts/dappCommunication.js.map @@ -1 +1 @@ -{"version":3,"file":"dappCommunication.js","sourceRoot":"","sources":["../../../src/consts/dappCommunication.ts"],"names":[],"mappings":"AAAA,MAAM,mCAAmC,GAAG;IAC1C,4BAA4B;IAC5B,oCAAoC;IACpC,wBAAwB;IACxB,wBAAwB;CACzB,CAAA;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAA","sourcesContent":["const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = [\n 'https://legends.ambire.com',\n 'https://legends-staging.ambire.com',\n 'http://localhost:19006',\n 'http://localhost:19007'\n]\n\nexport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }\n"]} \ No newline at end of file +{"version":3,"file":"dappCommunication.js","sourceRoot":"","sources":["../../../src/consts/dappCommunication.ts"],"names":[],"mappings":";;;AAAA,MAAM,mCAAmC,GAAG;IAC1C,4BAA4B;IAC5B,oCAAoC;IACpC,wBAAwB;IACxB,wBAAwB;CACzB,CAAA;AAEQ,kFAAmC","sourcesContent":["const ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS = [\n 'https://legends.ambire.com',\n 'https://legends-staging.ambire.com',\n 'http://localhost:19006',\n 'http://localhost:19007'\n]\n\nexport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS }\n"]} \ No newline at end of file diff --git a/dist/src/consts/deploy.js b/dist/src/consts/deploy.js index 0511fe6a5..6193cc7ca 100644 --- a/dist/src/consts/deploy.js +++ b/dist/src/consts/deploy.js @@ -1,14 +1,17 @@ -export const PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'; -export const AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'; -export const AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'; -export const AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'; -export const ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'; -export const ENTRY_POINT_MARKER = '0x0000000000000000000000000000000000000000000000000000000000007171'; -export const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; -export const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n; -export const PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'; -export const SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'; -export const OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEPLOYLESS_SIMULATION_FROM = exports.OPTIMISTIC_ORACLE = exports.SINGLETON = exports.PROXY_AMBIRE_4337_ACCOUNT = exports.MAX_UINT160 = exports.MAX_UINT256 = exports.ENTRY_POINT_MARKER = exports.ERC_4337_ENTRYPOINT = exports.AMBIRE_PAYMASTER_SIGNER = exports.AMBIRE_PAYMASTER = exports.AMBIRE_ACCOUNT_FACTORY = exports.PROXY_AMBIRE_ACCOUNT = void 0; +exports.PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'; +exports.AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'; +exports.AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'; +exports.AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'; +exports.ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'; +exports.ENTRY_POINT_MARKER = '0x0000000000000000000000000000000000000000000000000000000000007171'; +exports.MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; +exports.MAX_UINT160 = 1461501637330902918203684832716283019655932542975n; +exports.PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'; +exports.SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'; +exports.OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'; // 0x00..01 is the address from which simulation signatures are valid -export const DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'; +exports.DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'; //# sourceMappingURL=deploy.js.map \ No newline at end of file diff --git a/dist/src/consts/deploy.js.map b/dist/src/consts/deploy.js.map index 727965bb1..11f22226e 100644 --- a/dist/src/consts/deploy.js.map +++ b/dist/src/consts/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/consts/deploy.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,4CAA4C,CAAA;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,4CAA4C,CAAA;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAA4C,CAAA;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,oEAAoE,CAAA;AACtE,MAAM,CAAC,MAAM,WAAW,GACtB,+EAA+E,CAAA;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,kDAAkD,CAAA;AAE7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,4CAA4C,CAAA;AACrF,MAAM,CAAC,MAAM,SAAS,GAAG,4CAA4C,CAAA;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAC7E,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAA4C,CAAA","sourcesContent":["export const PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'\nexport const AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'\nexport const AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'\nexport const AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'\nexport const ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'\nexport const ENTRY_POINT_MARKER =\n '0x0000000000000000000000000000000000000000000000000000000000007171'\nexport const MAX_UINT256 =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\nexport const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n\n\nexport const PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'\nexport const SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'\n// 0x00..01 is the address from which simulation signatures are valid\nexport const DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'\n"]} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/consts/deploy.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,4CAA4C,CAAA;AACnE,QAAA,sBAAsB,GAAG,4CAA4C,CAAA;AACrE,QAAA,gBAAgB,GAAG,4CAA4C,CAAA;AAC/D,QAAA,uBAAuB,GAAG,4CAA4C,CAAA;AACtE,QAAA,mBAAmB,GAAG,4CAA4C,CAAA;AAClE,QAAA,kBAAkB,GAC7B,oEAAoE,CAAA;AACzD,QAAA,WAAW,GACtB,+EAA+E,CAAA;AACpE,QAAA,WAAW,GAAG,kDAAkD,CAAA;AAEhE,QAAA,yBAAyB,GAAG,4CAA4C,CAAA;AACxE,QAAA,SAAS,GAAG,4CAA4C,CAAA;AACxD,QAAA,iBAAiB,GAAG,4CAA4C,CAAA;AAC7E,qEAAqE;AACxD,QAAA,0BAA0B,GAAG,4CAA4C,CAAA","sourcesContent":["export const PROXY_AMBIRE_ACCOUNT = '0x0F2AA7bcda3d9D210dF69a394b6965CB2566c828'\nexport const AMBIRE_ACCOUNT_FACTORY = '0x26cE6745A633030A6faC5e64e41D21fb6246dc2d'\nexport const AMBIRE_PAYMASTER = '0xA8B267C68715FA1Dca055993149f30217B572Cf0'\nexport const AMBIRE_PAYMASTER_SIGNER = '0x39f1B4be409F2DFC8FCB84C1196537728df727f3'\nexport const ERC_4337_ENTRYPOINT = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'\nexport const ENTRY_POINT_MARKER =\n '0x0000000000000000000000000000000000000000000000000000000000007171'\nexport const MAX_UINT256 =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\nexport const MAX_UINT160 = 1461501637330902918203684832716283019655932542975n\n\nexport const PROXY_AMBIRE_4337_ACCOUNT = '0xd590a2aBA89a590b15De795DE559e7166aC293eA'\nexport const SINGLETON = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const OPTIMISTIC_ORACLE = '0x420000000000000000000000000000000000000F'\n// 0x00..01 is the address from which simulation signatures are valid\nexport const DEPLOYLESS_SIMULATION_FROM = '0x0000000000000000000000000000000000000001'\n"]} \ No newline at end of file diff --git a/dist/src/consts/deployless.js b/dist/src/consts/deployless.js index 5dd380f13..cbfc63747 100644 --- a/dist/src/consts/deployless.js +++ b/dist/src/consts/deployless.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EOA_SIMULATION_NONCE = void 0; // fake nonce for EOA simulation -export const EOA_SIMULATION_NONCE = '0x1000000000000000000000000000000000000000000000000000000000000000'; +exports.EOA_SIMULATION_NONCE = '0x1000000000000000000000000000000000000000000000000000000000000000'; //# sourceMappingURL=deployless.js.map \ No newline at end of file diff --git a/dist/src/consts/deployless.js.map b/dist/src/consts/deployless.js.map index 71bbd763a..cfcbe5cde 100644 --- a/dist/src/consts/deployless.js.map +++ b/dist/src/consts/deployless.js.map @@ -1 +1 @@ -{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../src/consts/deployless.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["// fake nonce for EOA simulation\nexport const EOA_SIMULATION_NONCE =\n '0x1000000000000000000000000000000000000000000000000000000000000000'\n"]} \ No newline at end of file +{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../src/consts/deployless.ts"],"names":[],"mappings":";;;AAAA,gCAAgC;AACnB,QAAA,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["// fake nonce for EOA simulation\nexport const EOA_SIMULATION_NONCE =\n '0x1000000000000000000000000000000000000000000000000000000000000000'\n"]} \ No newline at end of file diff --git a/dist/src/consts/derivation.js b/dist/src/consts/derivation.js index 0d1cbf338..0f6e55a90 100644 --- a/dist/src/consts/derivation.js +++ b/dist/src/consts/derivation.js @@ -1,15 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = exports.DERIVATION_OPTIONS = exports.LEGACY_POPULAR_DERIVATION_TEMPLATE = exports.BIP44_LEDGER_DERIVATION_TEMPLATE = exports.BIP44_STANDARD_DERIVATION_TEMPLATE = void 0; /** * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS), * iterating over the `address_index` path out of the 5 levels in BIP44: * m / purpose' / coin_type' / account' / change / address_index */ -export const BIP44_STANDARD_DERIVATION_TEMPLATE = "m/44'/60'/0'/0/"; +exports.BIP44_STANDARD_DERIVATION_TEMPLATE = "m/44'/60'/0'/0/"; /** * BIP44 as Ledger (Live) currently implements it. They iterate over the * `account'` path out of the 5 levels in BIP44: * m / purpose' / coin_type' / account' / change / address_index */ -export const BIP44_LEDGER_DERIVATION_TEMPLATE = "m/44'/60'/'/0/0"; +exports.BIP44_LEDGER_DERIVATION_TEMPLATE = "m/44'/60'/'/0/0"; /** * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and * there is no standard that describes it. Closely related to the BIP44 @@ -17,13 +20,13 @@ export const BIP44_LEDGER_DERIVATION_TEMPLATE = "m/44'/60'/'/0/0"; * distinguish between addresses (change addresses). Used previously by * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto. */ -export const LEGACY_POPULAR_DERIVATION_TEMPLATE = "m/44'/60'/0'/"; -export const DERIVATION_OPTIONS = [ - { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: BIP44_STANDARD_DERIVATION_TEMPLATE }, - { label: 'BIP44 Ledger Live', value: BIP44_LEDGER_DERIVATION_TEMPLATE }, +exports.LEGACY_POPULAR_DERIVATION_TEMPLATE = "m/44'/60'/0'/"; +exports.DERIVATION_OPTIONS = [ + { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: exports.BIP44_STANDARD_DERIVATION_TEMPLATE }, + { label: 'BIP44 Ledger Live', value: exports.BIP44_LEDGER_DERIVATION_TEMPLATE }, { label: 'Legacy (Ledger, MyEtherWallet, MyCrypto)', - value: LEGACY_POPULAR_DERIVATION_TEMPLATE + value: exports.LEGACY_POPULAR_DERIVATION_TEMPLATE } ]; /** @@ -31,5 +34,5 @@ export const DERIVATION_OPTIONS = [ * address at index N + x, where N is this derivation offset (this constant), * and x is the given index in the derivation (template) path. */ -export const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000; +exports.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000; //# sourceMappingURL=derivation.js.map \ No newline at end of file diff --git a/dist/src/consts/derivation.js.map b/dist/src/consts/derivation.js.map index a282e305e..667eaddd1 100644 --- a/dist/src/consts/derivation.js.map +++ b/dist/src/consts/derivation.js.map @@ -1 +1 @@ -{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../../src/consts/derivation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,0BAA0B,CAAA;AAC5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,0BAA0B,CAAA;AAC1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,wBAAwB,CAAA;AAa1E,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,kCAAkC,EAAE;IAChG,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,gCAAgC,EAAE;IACvE;QACE,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE,kCAAkC;KAC1C;CACF,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG,MAAM,CAAA","sourcesContent":["/**\n * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS),\n * iterating over the `address_index` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_STANDARD_DERIVATION_TEMPLATE = \"m/44'/60'/0'/0/\"\n/**\n * BIP44 as Ledger (Live) currently implements it. They iterate over the\n * `account'` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_LEDGER_DERIVATION_TEMPLATE = \"m/44'/60'/'/0/0\"\n/**\n * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and\n * there is no standard that describes it. Closely related to the BIP44\n * standard, but it does not include the last \"/0\" which is typically used to\n * distinguish between addresses (change addresses). Used previously by\n * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto.\n */\nexport const LEGACY_POPULAR_DERIVATION_TEMPLATE = \"m/44'/60'/0'/\"\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type HD_PATH_TEMPLATE_TYPE =\n | typeof BIP44_STANDARD_DERIVATION_TEMPLATE\n | typeof BIP44_LEDGER_DERIVATION_TEMPLATE\n | typeof LEGACY_POPULAR_DERIVATION_TEMPLATE\n\nexport interface DerivationOption {\n label: string\n value: HD_PATH_TEMPLATE_TYPE\n}\n\nexport const DERIVATION_OPTIONS: DerivationOption[] = [\n { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: BIP44_STANDARD_DERIVATION_TEMPLATE },\n { label: 'BIP44 Ledger Live', value: BIP44_LEDGER_DERIVATION_TEMPLATE },\n {\n label: 'Legacy (Ledger, MyEtherWallet, MyCrypto)',\n value: LEGACY_POPULAR_DERIVATION_TEMPLATE\n }\n]\n\n/**\n * For basic (EOA) accounts that are Ambire smart account keys use the derived\n * address at index N + x, where N is this derivation offset (this constant),\n * and x is the given index in the derivation (template) path.\n */\nexport const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000\n"]} \ No newline at end of file +{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../../src/consts/derivation.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,kCAAkC,GAAG,0BAA0B,CAAA;AAC5E;;;;GAIG;AACU,QAAA,gCAAgC,GAAG,0BAA0B,CAAA;AAC1E;;;;;;GAMG;AACU,QAAA,kCAAkC,GAAG,wBAAwB,CAAA;AAa7D,QAAA,kBAAkB,GAAuB;IACpD,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,0CAAkC,EAAE;IAChG,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,wCAAgC,EAAE;IACvE;QACE,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE,0CAAkC;KAC1C;CACF,CAAA;AAED;;;;GAIG;AACU,QAAA,0CAA0C,GAAG,MAAM,CAAA","sourcesContent":["/**\n * BIP44 as everyone implements it (MetaMask, Trezor, Lattice, EthersJS),\n * iterating over the `address_index` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_STANDARD_DERIVATION_TEMPLATE = \"m/44'/60'/0'/0/\"\n/**\n * BIP44 as Ledger (Live) currently implements it. They iterate over the\n * `account'` path out of the 5 levels in BIP44:\n * m / purpose' / coin_type' / account' / change / address_index\n */\nexport const BIP44_LEDGER_DERIVATION_TEMPLATE = \"m/44'/60'/'/0/0\"\n/**\n * Legacy (but popular) one, which is BIP44-like, but not BIP44 exactly and\n * there is no standard that describes it. Closely related to the BIP44\n * standard, but it does not include the last \"/0\" which is typically used to\n * distinguish between addresses (change addresses). Used previously by\n * Ledger and by other Ethereum wallets like MyEtherWallet (MEW) and MyCrypto.\n */\nexport const LEGACY_POPULAR_DERIVATION_TEMPLATE = \"m/44'/60'/0'/\"\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type HD_PATH_TEMPLATE_TYPE =\n | typeof BIP44_STANDARD_DERIVATION_TEMPLATE\n | typeof BIP44_LEDGER_DERIVATION_TEMPLATE\n | typeof LEGACY_POPULAR_DERIVATION_TEMPLATE\n\nexport interface DerivationOption {\n label: string\n value: HD_PATH_TEMPLATE_TYPE\n}\n\nexport const DERIVATION_OPTIONS: DerivationOption[] = [\n { label: 'BIP44 Standard (MetaMask, Trezor, Grid+)', value: BIP44_STANDARD_DERIVATION_TEMPLATE },\n { label: 'BIP44 Ledger Live', value: BIP44_LEDGER_DERIVATION_TEMPLATE },\n {\n label: 'Legacy (Ledger, MyEtherWallet, MyCrypto)',\n value: LEGACY_POPULAR_DERIVATION_TEMPLATE\n }\n]\n\n/**\n * For basic (EOA) accounts that are Ambire smart account keys use the derived\n * address at index N + x, where N is this derivation offset (this constant),\n * and x is the given index in the derivation (template) path.\n */\nexport const SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET = 100000\n"]} \ No newline at end of file diff --git a/dist/src/consts/feeTokens.js b/dist/src/consts/feeTokens.js index f3220ef62..ab480acac 100644 --- a/dist/src/consts/feeTokens.js +++ b/dist/src/consts/feeTokens.js @@ -1,7 +1,9 @@ +"use strict"; // When adding a token to this list, please consider the following: // 1. Open a block explorer and confirm the address is legit // 2. Check if the token address exists on the relayer side -export default [ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = [ { // wrapped eth address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', diff --git a/dist/src/consts/feeTokens.js.map b/dist/src/consts/feeTokens.js.map index 8944e8adb..cd7be9197 100644 --- a/dist/src/consts/feeTokens.js.map +++ b/dist/src/consts/feeTokens.js.map @@ -1 +1 @@ -{"version":3,"file":"feeTokens.js","sourceRoot":"","sources":["../../../src/consts/feeTokens.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,4DAA4D;AAC5D,2DAA2D;AAE3D,eAAe;IACb;QACE,cAAc;QACd,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,4BAA4B;QAC5B,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;CACF,CAAA","sourcesContent":["// When adding a token to this list, please consider the following:\n// 1. Open a block explorer and confirm the address is legit\n// 2. Check if the token address exists on the relayer side\n\nexport default [\n {\n // wrapped eth\n address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n networkId: 'ethereum'\n },\n {\n // USDT\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n networkId: 'ethereum'\n },\n {\n // DAI\n address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n networkId: 'ethereum'\n },\n {\n // wBTC\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n networkId: 'ethereum'\n },\n {\n // WALLET\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDC (aUSDC)\n address: '0xbcca60bb61934080951369a648fb03df4f96263c',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDT (aUSDT)\n address: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WBTC (aWBTC)\n address: '0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WETH (aWETH)\n address: '0x030ba81f1c18d280636f32af80b9aad02cf0854e',\n networkId: 'ethereum'\n },\n {\n // Fulcrum DAI iToken (iDAI)\n address: '0x493c57c4763932315a328269e1adad09653b9081',\n networkId: 'ethereum'\n },\n {\n // BNT\n address: '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n networkId: 'avalanche'\n },\n {\n // USDC\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n networkId: 'polygon'\n },\n {\n // USDC.e\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n networkId: 'polygon'\n },\n {\n // USDT\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n networkId: 'polygon'\n },\n {\n // USDT.e\n address: '0xc7198437980c041c805a1edcba50c1ce5db95118',\n networkId: 'avalanche'\n },\n {\n // USDT\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n networkId: 'optimism'\n },\n {\n // USDC.e\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n networkId: 'optimism'\n },\n {\n // USDC\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n networkId: 'optimism'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'optimism'\n },\n {\n // USDT\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n networkId: 'arbitrum'\n },\n {\n // USDC.e\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n networkId: 'arbitrum'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'arbitrum'\n },\n {\n // USDC\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n networkId: 'arbitrum'\n }\n]\n"]} \ No newline at end of file +{"version":3,"file":"feeTokens.js","sourceRoot":"","sources":["../../../src/consts/feeTokens.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,4DAA4D;AAC5D,2DAA2D;;AAE3D,kBAAe;IACb;QACE,cAAc;QACd,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,qCAAqC;QACrC,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,4BAA4B;QAC5B,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,WAAW;KACvB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,SAAS;QACT,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,MAAM;QACN,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;IACD;QACE,OAAO;QACP,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,UAAU;KACtB;CACF,CAAA","sourcesContent":["// When adding a token to this list, please consider the following:\n// 1. Open a block explorer and confirm the address is legit\n// 2. Check if the token address exists on the relayer side\n\nexport default [\n {\n // wrapped eth\n address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n networkId: 'ethereum'\n },\n {\n // USDT\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n networkId: 'ethereum'\n },\n {\n // DAI\n address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n networkId: 'ethereum'\n },\n {\n // wBTC\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n networkId: 'ethereum'\n },\n {\n // WALLET\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDC (aUSDC)\n address: '0xbcca60bb61934080951369a648fb03df4f96263c',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing USDT (aUSDT)\n address: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WBTC (aWBTC)\n address: '0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656',\n networkId: 'ethereum'\n },\n {\n // Aave interest bearing WETH (aWETH)\n address: '0x030ba81f1c18d280636f32af80b9aad02cf0854e',\n networkId: 'ethereum'\n },\n {\n // Fulcrum DAI iToken (iDAI)\n address: '0x493c57c4763932315a328269e1adad09653b9081',\n networkId: 'ethereum'\n },\n {\n // BNT\n address: '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c',\n networkId: 'ethereum'\n },\n {\n // USDC\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n networkId: 'avalanche'\n },\n {\n // USDC\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n networkId: 'polygon'\n },\n {\n // USDC.e\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n networkId: 'polygon'\n },\n {\n // USDT\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n networkId: 'polygon'\n },\n {\n // USDT.e\n address: '0xc7198437980c041c805a1edcba50c1ce5db95118',\n networkId: 'avalanche'\n },\n {\n // USDT\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n networkId: 'optimism'\n },\n {\n // USDC.e\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n networkId: 'optimism'\n },\n {\n // USDC\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n networkId: 'optimism'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'optimism'\n },\n {\n // USDT\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n networkId: 'arbitrum'\n },\n {\n // USDC.e\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n networkId: 'arbitrum'\n },\n {\n // DAI\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n networkId: 'arbitrum'\n },\n {\n // USDC\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n networkId: 'arbitrum'\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/gasTankFeeTokens.js b/dist/src/consts/gasTankFeeTokens.js index a2d696542..69e1d6412 100644 --- a/dist/src/consts/gasTankFeeTokens.js +++ b/dist/src/consts/gasTankFeeTokens.js @@ -1,4 +1,6 @@ -export default [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = [ { address: '0x0000000000000000000000000000000000000000', symbol: 'eth', diff --git a/dist/src/consts/gasTankFeeTokens.js.map b/dist/src/consts/gasTankFeeTokens.js.map index 06e03906b..e43ef8655 100644 --- a/dist/src/consts/gasTankFeeTokens.js.map +++ b/dist/src/consts/gasTankFeeTokens.js.map @@ -1 +1 @@ -{"version":3,"file":"gasTankFeeTokens.js","sourceRoot":"","sources":["../../../src/consts/gasTankFeeTokens.ts"],"names":[],"mappings":"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","sourcesContent":["export default [\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'pol',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'ftm',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4001/large/Fantom.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'bnb',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/825/large/bnb-icon2_2x.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'avax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/12559/large/coin-round-red.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'aeth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'metis',\n networkId: 'andromeda',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15595/large/metis.PNG'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'glmr',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/22459/large/glmr.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'movr',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17984/large/9285.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'xdai',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/11062/large/Identity-Primary-DarkBG.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'kcs',\n networkId: 'kucoin',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/1047/large/sa9z79.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x4200000000000000000000000000000000000006',\n symbol: 'weth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'okt',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13708/large/WeChat_Image_20220118095654.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'matic',\n networkId: 'mumbai',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'sepolia',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'weth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n symbol: 'stETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13442/standard/steth_logo.png'\n },\n {\n address: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n symbol: 'wstETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'usdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'usdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'dai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x4Fabb145d64652a948d72533023f6E7A623C7C53',\n symbol: 'busd',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'wbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n symbol: 'wallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png'\n },\n {\n address: '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935',\n disableGasTankDeposit: true,\n // disable if not in gas tank\n disableAsFeeToken: true,\n symbol: 'xwallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png'\n },\n {\n address: '0x028171bCA77440897B824Ca71D1c56caC55b68A3',\n baseToken: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'adai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0xBcca60bB61934080951369a648Fb03DF4F96263C',\n baseToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'ausdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811',\n baseToken: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'ausdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x9ff58f4fFB29fA2266Ab25e75e2A8b3503311656',\n baseToken: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'awbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x030bA81f1c18d280636F32af80b9AAd02Cf0854e',\n baseToken: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'aweth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'wmatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/14073/small/matic.png'\n },\n {\n address: '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n symbol: 'wstETH',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'wbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'weth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'dai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'usdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'usdc.e',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n symbol: 'usdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8dF3aad3a84da6b69A4DA8aeC3eA40d9091B2Ac4',\n baseToken: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'ammatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17267/small/amWMATIC_2x.png'\n },\n {\n address: '0x27F8D03b3a2196956ED754baDc28D73be8830A6e',\n baseToken: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'amdai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x1a13F4Ca1d028320A707D99520AbFefca3998b7F',\n baseToken: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'amusdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x60D55F02A771d515e077c9C2403a1ef324885CeC',\n baseToken: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'amusdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x5c2ed810328349100A66B82b78a1791B101C9D61',\n baseToken: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'amwbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x28424507fefb6f7f8E9D3860F56504E4e5f5f390',\n baseToken: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'amweth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n symbol: 'busd',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x55d398326f99059fF775485246999027B3197955',\n symbol: 'usdt',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n symbol: 'usdc',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x049d68029688eAbF473097a2fC38ef61633A3C7A',\n symbol: 'usdt',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75',\n symbol: 'usdc',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E',\n symbol: 'dai',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n symbol: 'wavax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15075/small/wrapped-avax.png'\n },\n {\n address: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'dai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'usdc.e',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'weth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'usdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'wbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE',\n baseToken: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'aavadai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x625E7708f30cA75bfd92586e17077590C60eb4cD',\n baseToken: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'aavausdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x6ab707Aca953eDAeFBc4fD23bA73294241490620',\n baseToken: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'aavausdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x078f358208685046a11C85e8ad32895DED33A249',\n baseToken: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'aavawbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8',\n baseToken: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'aavaweth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73',\n symbol: 'usdt',\n networkId: 'moonbeam',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x765277EebeCA2e31912C9946eAe1021199B39C61',\n symbol: 'dai',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xB44a9B6905aF7c801311e8F4E76932ee959c663C',\n symbol: 'usdt',\n networkId: 'moonriver',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x80A16016cC4A2E6a2CACA8a4a498b1699fF0f844',\n symbol: 'dai',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC',\n symbol: 'usdt',\n networkId: 'andromeda',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83',\n symbol: 'usdc',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x4ECaBa5870353805a9F068101A40E0f32ed605C6',\n symbol: 'usdt',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xcB444e90D8198415266c6a2724b7900fb12FC56E',\n symbol: 'eure',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/23354/standard/eur.png'\n },\n {\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n symbol: 'usdt',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n symbol: 'usdc.e',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n symbol: 'usdc',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n symbol: 'wstETH',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n symbol: 'usdt',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n symbol: 'usdc.e',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n symbol: 'usdc',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n symbol: 'weth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x5979d7b546e38e414f7e9822514be443a4800529',\n symbol: 'wstETH',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x382bB369d343125BfB2117af9c149795C6C65C50',\n symbol: 'usdc',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc946DAf81b08146B1C7A8Da2A851Ddf2B3EAaf85',\n symbol: 'usdt',\n networkId: 'okc',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xEF71CA2EE68F45B9Ad6F72fbdb33d707b872315C',\n symbol: 'ethk',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18537/small/0xef71ca2ee68f45b9ad6f72fbdb33d707b872315c.png'\n },\n {\n address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n symbol: 'usdbc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n symbol: 'wstETH',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n symbol: 'usdc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb',\n symbol: 'dai',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n networkId: 'scroll',\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n symbol: 'USDC',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n networkId: 'scroll',\n address: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df',\n symbol: 'USDT',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/32610/small/usdt_%281%29.png'\n },\n {\n networkId: 'scroll',\n address: '0x5300000000000000000000000000000000000004',\n symbol: 'WETH',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/32315/small/weth_%281%29.png?1697365181'\n },\n {\n networkId: 'scroll',\n address: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32',\n symbol: 'wstETH',\n decimals: 18,\n icon: 'https://coin-images.coingecko.com/coins/images/18834/small/wstETH.png'\n }\n]\n"]} \ No newline at end of file +{"version":3,"file":"gasTankFeeTokens.js","sourceRoot":"","sources":["../../../src/consts/gasTankFeeTokens.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,2EAA2E;KAClF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,sEAAsE;KAC7E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,qBAAqB,EAAE,IAAI;QAC3B,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,mFAAmF;KAC1F;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,uFAAuF;KAC9F;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,2EAA2E;KAClF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,yEAAyE;KAChF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,8FAA8F;KACrG;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,qBAAqB,EAAE,IAAI;QAC3B,6BAA6B;QAC7B,iBAAiB,EAAE,IAAI;QACvB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0FAA0F;KACjG;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,iEAAiE;KACxE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,qBAAqB;QAChC,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,0EAA0E;KACjF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,+EAA+E;KACtF;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,uEAAuE;KAC9E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,qBAAqB,EAAE,IAAI;QAC3B,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,qBAAqB,EAAE,IAAI;QAC3B,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,QAAQ;QACnB,qBAAqB,EAAE,IAAI;QAC3B,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,kEAAkE;KACzE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,sGAAsG;KAC7G;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,qEAAqE;KAC5E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,+DAA+D;KACtE;IACD;QACE,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,wEAAwE;KAC/E;IACD;QACE,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,mFAAmF;KAC1F;IACD;QACE,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,4CAA4C;QACrD,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,uEAAuE;KAC9E;CACF,CAAA","sourcesContent":["export default [\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'pol',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'ftm',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4001/large/Fantom.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'bnb',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/825/large/bnb-icon2_2x.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'avax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/12559/large/coin-round-red.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'aeth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'metis',\n networkId: 'andromeda',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15595/large/metis.PNG'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'glmr',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/22459/large/glmr.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'movr',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17984/large/9285.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'xdai',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/11062/large/Identity-Primary-DarkBG.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'kcs',\n networkId: 'kucoin',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/1047/large/sa9z79.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0x4200000000000000000000000000000000000006',\n symbol: 'weth',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'okt',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13708/large/WeChat_Image_20220118095654.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'matic',\n networkId: 'mumbai',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/4713/large/matic-token-icon.png'\n },\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: 'eth',\n networkId: 'sepolia',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/279/large/ethereum.png'\n },\n {\n address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'weth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n symbol: 'stETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/13442/standard/steth_logo.png'\n },\n {\n address: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n symbol: 'wstETH',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'usdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'usdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'dai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x4Fabb145d64652a948d72533023f6E7A623C7C53',\n symbol: 'busd',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'wbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n symbol: 'wallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png'\n },\n {\n address: '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935',\n disableGasTankDeposit: true,\n // disable if not in gas tank\n disableAsFeeToken: true,\n symbol: 'xwallet',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png'\n },\n {\n address: '0x028171bCA77440897B824Ca71D1c56caC55b68A3',\n baseToken: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n symbol: 'adai',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0xBcca60bB61934080951369a648Fb03DF4F96263C',\n baseToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n symbol: 'ausdc',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811',\n baseToken: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n symbol: 'ausdt',\n networkId: 'ethereum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x9ff58f4fFB29fA2266Ab25e75e2A8b3503311656',\n baseToken: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n symbol: 'awbtc',\n networkId: 'ethereum',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x030bA81f1c18d280636F32af80b9AAd02Cf0854e',\n baseToken: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n symbol: 'aweth',\n networkId: 'ethereum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'wmatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/14073/small/matic.png'\n },\n {\n address: '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n symbol: 'wstETH',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'wbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'weth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'dai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'usdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'usdc.e',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n symbol: 'usdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8dF3aad3a84da6b69A4DA8aeC3eA40d9091B2Ac4',\n baseToken: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n symbol: 'ammatic',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17267/small/amWMATIC_2x.png'\n },\n {\n address: '0x27F8D03b3a2196956ED754baDc28D73be8830A6e',\n baseToken: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n symbol: 'amdai',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x1a13F4Ca1d028320A707D99520AbFefca3998b7F',\n baseToken: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n symbol: 'amusdc',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x60D55F02A771d515e077c9C2403a1ef324885CeC',\n baseToken: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n symbol: 'amusdt',\n networkId: 'polygon',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x5c2ed810328349100A66B82b78a1791B101C9D61',\n baseToken: '0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6',\n symbol: 'amwbtc',\n networkId: 'polygon',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0x28424507fefb6f7f8E9D3860F56504E4e5f5f390',\n baseToken: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n symbol: 'amweth',\n networkId: 'polygon',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n symbol: 'busd',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9576/small/BUSD.png'\n },\n {\n address: '0x55d398326f99059fF775485246999027B3197955',\n symbol: 'usdt',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n symbol: 'usdc',\n networkId: 'binance-smart-chain',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x049d68029688eAbF473097a2fC38ef61633A3C7A',\n symbol: 'usdt',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75',\n symbol: 'usdc',\n networkId: 'fantom',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E',\n symbol: 'dai',\n networkId: 'fantom',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n symbol: 'wavax',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/15075/small/wrapped-avax.png'\n },\n {\n address: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'dai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'usdc.e',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'weth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295'\n },\n {\n address: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'usdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'wbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png'\n },\n {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n symbol: 'usdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE',\n baseToken: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n symbol: 'aavadai',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/10843/small/aDAI.png'\n },\n {\n address: '0x625E7708f30cA75bfd92586e17077590C60eb4cD',\n baseToken: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n symbol: 'aavausdc',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17226/small/aAMMUSDC_2x.png'\n },\n {\n address: '0x6ab707Aca953eDAeFBc4fD23bA73294241490620',\n baseToken: '0xc7198437980c041c805A1EDcbA50c1Ce5db95118',\n symbol: 'aavausdt',\n networkId: 'avalanche',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/17264/small/amUSDT_2x.png'\n },\n {\n address: '0x078f358208685046a11C85e8ad32895DED33A249',\n baseToken: '0x50b7545627a5162F82A992c33b87aDc75187B218',\n symbol: 'aavawbtc',\n networkId: 'avalanche',\n decimals: 8,\n icon: 'https://assets.coingecko.com/coins/images/17265/small/amWBTC_2x.png'\n },\n {\n address: '0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8',\n baseToken: '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB',\n symbol: 'aavaweth',\n networkId: 'avalanche',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/17266/small/amWETH_2x.png'\n },\n {\n address: '0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73',\n symbol: 'usdt',\n networkId: 'moonbeam',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x765277EebeCA2e31912C9946eAe1021199B39C61',\n symbol: 'dai',\n networkId: 'moonbeam',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xB44a9B6905aF7c801311e8F4E76932ee959c663C',\n symbol: 'usdt',\n networkId: 'moonriver',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x80A16016cC4A2E6a2CACA8a4a498b1699fF0f844',\n symbol: 'dai',\n networkId: 'moonriver',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC',\n symbol: 'usdt',\n networkId: 'andromeda',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83',\n symbol: 'usdc',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x4ECaBa5870353805a9F068101A40E0f32ed605C6',\n symbol: 'usdt',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xcB444e90D8198415266c6a2724b7900fb12FC56E',\n symbol: 'eure',\n networkId: 'gnosis',\n disableGasTankDeposit: true,\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/23354/standard/eur.png'\n },\n {\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n symbol: 'usdt',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n symbol: 'usdc.e',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n symbol: 'usdc',\n networkId: 'optimism',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n symbol: 'wstETH',\n networkId: 'optimism',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n symbol: 'usdt',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n symbol: 'usdc.e',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n symbol: 'usdc',\n networkId: 'arbitrum',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n symbol: 'dai',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n symbol: 'weth',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/2518/small/weth.png'\n },\n {\n address: '0x5979d7b546e38e414f7e9822514be443a4800529',\n symbol: 'wstETH',\n networkId: 'arbitrum',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x382bB369d343125BfB2117af9c149795C6C65C50',\n symbol: 'usdc',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc946DAf81b08146B1C7A8Da2A851Ddf2B3EAaf85',\n symbol: 'usdt',\n networkId: 'okc',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/325/small/Tether-logo.png'\n },\n {\n address: '0xEF71CA2EE68F45B9Ad6F72fbdb33d707b872315C',\n symbol: 'ethk',\n networkId: 'okc',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18537/small/0xef71ca2ee68f45b9ad6f72fbdb33d707b872315c.png'\n },\n {\n address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n symbol: 'usdbc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n symbol: 'wstETH',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/18834/standard/wstETH.png'\n },\n {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n symbol: 'usdc',\n networkId: 'base',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n address: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb',\n symbol: 'dai',\n networkId: 'base',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/9956/small/4943.png'\n },\n {\n networkId: 'scroll',\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n symbol: 'USDC',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png'\n },\n {\n networkId: 'scroll',\n address: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df',\n symbol: 'USDT',\n decimals: 6,\n icon: 'https://assets.coingecko.com/coins/images/32610/small/usdt_%281%29.png'\n },\n {\n networkId: 'scroll',\n address: '0x5300000000000000000000000000000000000004',\n symbol: 'WETH',\n decimals: 18,\n icon: 'https://assets.coingecko.com/coins/images/32315/small/weth_%281%29.png?1697365181'\n },\n {\n networkId: 'scroll',\n address: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32',\n symbol: 'wstETH',\n decimals: 18,\n icon: 'https://coin-images.coingecko.com/coins/images/18834/small/wstETH.png'\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/intervals.js b/dist/src/consts/intervals.js index 1cbefdc75..3e419f017 100644 --- a/dist/src/consts/intervals.js +++ b/dist/src/consts/intervals.js @@ -1,9 +1,12 @@ -export const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000; // 1 minute -export const ACTIVITY_REFRESH_INTERVAL = 5000; // 5 seconds -export const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000; // 3 minutes -export const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000; // 10 minutes -export const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000; // 1 minute -export const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000; // 10 minutes -export const ACCOUNT_STATE_PENDING_INTERVAL = 8000; // 8 seconds -export const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000; // 5 minutes +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ACCOUNT_STATE_STAND_BY_INTERVAL = exports.ACCOUNT_STATE_PENDING_INTERVAL = exports.INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = exports.ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = exports.INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = exports.ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = exports.ACTIVITY_REFRESH_INTERVAL = exports.UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = void 0; +exports.UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000; // 1 minute +exports.ACTIVITY_REFRESH_INTERVAL = 5000; // 5 seconds +exports.ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000; // 3 minutes +exports.INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000; // 10 minutes +exports.ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000; // 1 minute +exports.INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000; // 10 minutes +exports.ACCOUNT_STATE_PENDING_INTERVAL = 8000; // 8 seconds +exports.ACCOUNT_STATE_STAND_BY_INTERVAL = 300000; // 5 minutes //# sourceMappingURL=intervals.js.map \ No newline at end of file diff --git a/dist/src/consts/intervals.js.map b/dist/src/consts/intervals.js.map index 16b313a10..311590716 100644 --- a/dist/src/consts/intervals.js.map +++ b/dist/src/consts/intervals.js.map @@ -1 +1 @@ -{"version":3,"file":"intervals.js","sourceRoot":"","sources":["../../../src/consts/intervals.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qCAAqC,GAAG,KAAK,CAAA,CAAC,WAAW;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAA,CAAC,YAAY;AAC1D,MAAM,CAAC,MAAM,+CAA+C,GAAG,MAAM,CAAA,CAAC,YAAY;AAClF,MAAM,CAAC,MAAM,gDAAgD,GAAG,MAAM,CAAA,CAAC,aAAa;AACpF,MAAM,CAAC,MAAM,0CAA0C,GAAG,KAAK,CAAA,CAAC,WAAW;AAC3E,MAAM,CAAC,MAAM,4CAA4C,GAAG,MAAM,CAAA,CAAC,aAAa;AAChF,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAA,CAAC,YAAY;AAC/D,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAA,CAAC,YAAY","sourcesContent":["export const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000 // 1 minute\nexport const ACTIVITY_REFRESH_INTERVAL = 5000 // 5 seconds\nexport const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000 // 3 minutes\nexport const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000 // 1 minute\nexport const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACCOUNT_STATE_PENDING_INTERVAL = 8000 // 8 seconds\nexport const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000 // 5 minutes\n"]} \ No newline at end of file +{"version":3,"file":"intervals.js","sourceRoot":"","sources":["../../../src/consts/intervals.ts"],"names":[],"mappings":";;;AAAa,QAAA,qCAAqC,GAAG,KAAK,CAAA,CAAC,WAAW;AACzD,QAAA,yBAAyB,GAAG,IAAI,CAAA,CAAC,YAAY;AAC7C,QAAA,+CAA+C,GAAG,MAAM,CAAA,CAAC,YAAY;AACrE,QAAA,gDAAgD,GAAG,MAAM,CAAA,CAAC,aAAa;AACvE,QAAA,0CAA0C,GAAG,KAAK,CAAA,CAAC,WAAW;AAC9D,QAAA,4CAA4C,GAAG,MAAM,CAAA,CAAC,aAAa;AACnE,QAAA,8BAA8B,GAAG,IAAI,CAAA,CAAC,YAAY;AAClD,QAAA,+BAA+B,GAAG,MAAM,CAAA,CAAC,YAAY","sourcesContent":["export const UPDATE_SWAP_AND_BRIDGE_QUOTE_INTERVAL = 60000 // 1 minute\nexport const ACTIVITY_REFRESH_INTERVAL = 5000 // 5 seconds\nexport const ACTIVE_EXTENSION_DEFI_POSITIONS_UPDATE_INTERVAL = 180000 // 3 minutes\nexport const INACTIVE_EXTENSION_DEFI_POSITION_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 60000 // 1 minute\nexport const INACTIVE_EXTENSION_PORTFOLIO_UPDATE_INTERVAL = 600000 // 10 minutes\nexport const ACCOUNT_STATE_PENDING_INTERVAL = 8000 // 8 seconds\nexport const ACCOUNT_STATE_STAND_BY_INTERVAL = 300000 // 5 minutes\n"]} \ No newline at end of file diff --git a/dist/src/consts/networks.js b/dist/src/consts/networks.js index 9e03103a9..eab9b5db6 100644 --- a/dist/src/consts/networks.js +++ b/dist/src/consts/networks.js @@ -1,4 +1,7 @@ -import { BICONOMY, PIMLICO } from './bundlers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.networks = void 0; +const bundlers_1 = require("./bundlers"); const networks = [ { id: 'ethereum', @@ -36,8 +39,8 @@ const networks = [ enabled: false, hasPaymaster: true, hasBundlerSupport: true, - bundlers: [PIMLICO, BICONOMY], - defaultBundler: PIMLICO + bundlers: [bundlers_1.PIMLICO, bundlers_1.BICONOMY], + defaultBundler: bundlers_1.PIMLICO }, isSAEnabled: true, areContractsDeployed: true, @@ -66,8 +69,8 @@ const networks = [ enabled: true, hasPaymaster: true, hasBundlerSupport: true, - bundlers: [PIMLICO, BICONOMY], - defaultBundler: BICONOMY + bundlers: [bundlers_1.PIMLICO, bundlers_1.BICONOMY], + defaultBundler: bundlers_1.BICONOMY }, isSAEnabled: true, areContractsDeployed: true, @@ -128,8 +131,8 @@ const networks = [ enabled: true, hasPaymaster: true, hasBundlerSupport: true, - bundlers: [PIMLICO, BICONOMY], - defaultBundler: PIMLICO + bundlers: [bundlers_1.PIMLICO, bundlers_1.BICONOMY], + defaultBundler: bundlers_1.PIMLICO }, isSAEnabled: true, areContractsDeployed: true, @@ -158,8 +161,8 @@ const networks = [ enabled: true, hasPaymaster: true, hasBundlerSupport: true, - bundlers: [PIMLICO, BICONOMY], - defaultBundler: PIMLICO + bundlers: [bundlers_1.PIMLICO, bundlers_1.BICONOMY], + defaultBundler: bundlers_1.PIMLICO }, isSAEnabled: true, areContractsDeployed: true, @@ -205,5 +208,5 @@ const networks = [ allowForce4337: true } ]; -export { networks }; +exports.networks = networks; //# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/consts/networks.js.map b/dist/src/consts/networks.js.map index 40f111f27..9a38bba6e 100644 --- a/dist/src/consts/networks.js.map +++ b/dist/src/consts/networks.js.map @@ -1 +1 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/consts/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network } from '../interfaces/network'\nimport { BICONOMY, PIMLICO } from './bundlers'\n\nconst networks: Network[] = [\n {\n id: 'ethereum',\n name: 'Ethereum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/ethereum'],\n selectedRpcUrl: 'https://invictus.ambire.com/ethereum',\n rpcNoStateOverride: false,\n chainId: 1n,\n explorerUrl: 'https://etherscan.io',\n erc4337: { enabled: false, hasPaymaster: true, hasBundlerSupport: true },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: true },\n predefined: true,\n wrappedAddr: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'polygon',\n name: 'Polygon',\n nativeAssetSymbol: 'POL',\n rpcUrls: ['https://invictus.ambire.com/polygon'],\n selectedRpcUrl: 'https://invictus.ambire.com/polygon',\n rpcNoStateOverride: false,\n chainId: 137n,\n explorerUrl: 'https://polygonscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'polygon-pos',\n nativeAssetId: 'matic-network',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false, feeIncrease: 10n },\n predefined: true,\n wrappedAddr: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n oldNativeAssetSymbols: ['MATIC'],\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'optimism',\n name: 'Optimism',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/optimism'],\n selectedRpcUrl: 'https://invictus.ambire.com/optimism',\n rpcNoStateOverride: false,\n chainId: 10n,\n explorerUrl: 'https://optimistic.etherscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: BICONOMY\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'optimistic-ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n elasticityMultiplier: 6n,\n baseFeeMaxChangeDenominator: 50n\n },\n isOptimistic: true,\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'avalanche',\n name: 'Avalanche',\n nativeAssetSymbol: 'AVAX',\n rpcUrls: ['https://invictus.ambire.com/avalanche'],\n selectedRpcUrl: 'https://invictus.ambire.com/avalanche',\n rpcNoStateOverride: false,\n chainId: 43114n,\n explorerUrl: 'https://snowtrace.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'avalanche',\n nativeAssetId: 'avalanche-2',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 25000000000n // 25 gwei\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'\n },\n {\n id: 'arbitrum',\n name: 'Arbitrum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/arbitrum'],\n selectedRpcUrl: 'https://invictus.ambire.com/arbitrum',\n rpcNoStateOverride: false,\n chainId: 42161n,\n explorerUrl: 'https://arbiscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'arbitrum-one',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 100000000n // 1 gwei\n },\n predefined: true,\n wrappedAddr: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'\n },\n {\n id: 'base',\n name: 'Base',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/base'],\n selectedRpcUrl: 'https://invictus.ambire.com/base',\n rpcNoStateOverride: false,\n chainId: 8453n,\n explorerUrl: 'https://basescan.org',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'base',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n isOptimistic: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFeeEqualToLastBlock: true\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'scroll',\n name: 'Scroll',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/scroll'],\n selectedRpcUrl: 'https://invictus.ambire.com/scroll',\n rpcNoStateOverride: false,\n chainId: 534352n,\n explorerUrl: 'https://scrollscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'scroll',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x5300000000000000000000000000000000000004',\n allowForce4337: true\n }\n]\nexport { networks }\n"]} \ No newline at end of file +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/consts/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network } from '../interfaces/network'\nimport { BICONOMY, PIMLICO } from './bundlers'\n\nconst networks: Network[] = [\n {\n id: 'ethereum',\n name: 'Ethereum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/ethereum'],\n selectedRpcUrl: 'https://invictus.ambire.com/ethereum',\n rpcNoStateOverride: false,\n chainId: 1n,\n explorerUrl: 'https://etherscan.io',\n erc4337: { enabled: false, hasPaymaster: true, hasBundlerSupport: true },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: true },\n predefined: true,\n wrappedAddr: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'polygon',\n name: 'Polygon',\n nativeAssetSymbol: 'POL',\n rpcUrls: ['https://invictus.ambire.com/polygon'],\n selectedRpcUrl: 'https://invictus.ambire.com/polygon',\n rpcNoStateOverride: false,\n chainId: 137n,\n explorerUrl: 'https://polygonscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'polygon-pos',\n nativeAssetId: 'matic-network',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false, feeIncrease: 10n },\n predefined: true,\n wrappedAddr: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n oldNativeAssetSymbols: ['MATIC'],\n disableEstimateGas: true,\n allowForce4337: true\n },\n {\n id: 'optimism',\n name: 'Optimism',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/optimism'],\n selectedRpcUrl: 'https://invictus.ambire.com/optimism',\n rpcNoStateOverride: false,\n chainId: 10n,\n explorerUrl: 'https://optimistic.etherscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: BICONOMY\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'optimistic-ethereum',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n elasticityMultiplier: 6n,\n baseFeeMaxChangeDenominator: 50n\n },\n isOptimistic: true,\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'avalanche',\n name: 'Avalanche',\n nativeAssetSymbol: 'AVAX',\n rpcUrls: ['https://invictus.ambire.com/avalanche'],\n selectedRpcUrl: 'https://invictus.ambire.com/avalanche',\n rpcNoStateOverride: false,\n chainId: 43114n,\n explorerUrl: 'https://snowtrace.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'avalanche',\n nativeAssetId: 'avalanche-2',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 25000000000n // 25 gwei\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'\n },\n {\n id: 'arbitrum',\n name: 'Arbitrum',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/arbitrum'],\n selectedRpcUrl: 'https://invictus.ambire.com/arbitrum',\n rpcNoStateOverride: false,\n chainId: 42161n,\n explorerUrl: 'https://arbiscan.io',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'arbitrum-one',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFee: 100000000n // 1 gwei\n },\n predefined: true,\n wrappedAddr: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'\n },\n {\n id: 'base',\n name: 'Base',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/base'],\n selectedRpcUrl: 'https://invictus.ambire.com/base',\n rpcNoStateOverride: false,\n chainId: 8453n,\n explorerUrl: 'https://basescan.org',\n erc4337: {\n enabled: true,\n hasPaymaster: true,\n hasBundlerSupport: true,\n bundlers: [PIMLICO, BICONOMY],\n defaultBundler: PIMLICO\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'base',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n isOptimistic: true,\n features: [],\n feeOptions: {\n is1559: true,\n minBaseFeeEqualToLastBlock: true\n },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x4200000000000000000000000000000000000006'\n },\n {\n id: 'scroll',\n name: 'Scroll',\n nativeAssetSymbol: 'ETH',\n rpcUrls: ['https://invictus.ambire.com/scroll'],\n selectedRpcUrl: 'https://invictus.ambire.com/scroll',\n rpcNoStateOverride: false,\n chainId: 534352n,\n explorerUrl: 'https://scrollscan.com',\n erc4337: {\n enabled: false,\n hasPaymaster: true,\n hasBundlerSupport: true\n },\n isSAEnabled: true,\n areContractsDeployed: true,\n hasRelayer: true,\n platformId: 'scroll',\n nativeAssetId: 'ethereum',\n hasSingleton: true,\n features: [],\n feeOptions: { is1559: false },\n predefined: true,\n disableEstimateGas: true,\n wrappedAddr: '0x5300000000000000000000000000000000000004',\n allowForce4337: true\n }\n]\nexport { networks }\n"]} \ No newline at end of file diff --git a/dist/src/consts/pinnedTokens.js b/dist/src/consts/pinnedTokens.js index d936bcd56..2f709f3f6 100644 --- a/dist/src/consts/pinnedTokens.js +++ b/dist/src/consts/pinnedTokens.js @@ -1,9 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PINNED_TOKENS = void 0; // Rules: // 1. Pinned gas tank tokens with the same address are shared between networks. This means // that if ETH is pinned on Ethereum and onGasTank is true, the same token shouldn't be // onGasTank on Optimism. // 2. Addresses must be checksummed. -export const PINNED_TOKENS = [ +exports.PINNED_TOKENS = [ // $ETH { networkId: 'ethereum', diff --git a/dist/src/consts/pinnedTokens.js.map b/dist/src/consts/pinnedTokens.js.map index 59189c7a8..c896b4761 100644 --- a/dist/src/consts/pinnedTokens.js.map +++ b/dist/src/consts/pinnedTokens.js.map @@ -1 +1 @@ -{"version":3,"file":"pinnedTokens.js","sourceRoot":"","sources":["../../../src/consts/pinnedTokens.ts"],"names":[],"mappings":"AAEA,SAAS;AACT,0FAA0F;AAC1F,uFAAuF;AACvF,yBAAyB;AACzB,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,OAAO;IACP;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,UAAU;IACV;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ;IACR;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;CACF,CAAA","sourcesContent":["import { PinnedTokens } from '../libs/portfolio/interfaces'\n\n// Rules:\n// 1. Pinned gas tank tokens with the same address are shared between networks. This means\n// that if ETH is pinned on Ethereum and onGasTank is true, the same token shouldn't be\n// onGasTank on Optimism.\n// 2. Addresses must be checksummed.\nexport const PINNED_TOKENS: PinnedTokens = [\n // $ETH\n {\n networkId: 'ethereum',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: false\n },\n // $WALLET\n {\n networkId: 'ethereum',\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n onGasTank: false\n },\n // $USDC\n {\n networkId: 'ethereum',\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n onGasTank: true\n }\n]\n"]} \ No newline at end of file +{"version":3,"file":"pinnedTokens.js","sourceRoot":"","sources":["../../../src/consts/pinnedTokens.ts"],"names":[],"mappings":";;;AAEA,SAAS;AACT,0FAA0F;AAC1F,uFAAuF;AACvF,yBAAyB;AACzB,oCAAoC;AACvB,QAAA,aAAa,GAAiB;IACzC,OAAO;IACP;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,UAAU;IACV;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ;IACR;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,4CAA4C;QACrD,SAAS,EAAE,IAAI;KAChB;CACF,CAAA","sourcesContent":["import { PinnedTokens } from '../libs/portfolio/interfaces'\n\n// Rules:\n// 1. Pinned gas tank tokens with the same address are shared between networks. This means\n// that if ETH is pinned on Ethereum and onGasTank is true, the same token shouldn't be\n// onGasTank on Optimism.\n// 2. Addresses must be checksummed.\nexport const PINNED_TOKENS: PinnedTokens = [\n // $ETH\n {\n networkId: 'ethereum',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0000000000000000000000000000000000000000',\n onGasTank: false\n },\n // $WALLET\n {\n networkId: 'ethereum',\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n onGasTank: false\n },\n // $USDC\n {\n networkId: 'ethereum',\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n onGasTank: true\n },\n {\n networkId: 'optimism',\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n onGasTank: true\n }\n]\n"]} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.js b/dist/src/consts/signAccountOp/errorHandling.js index 16316277a..30cd34145 100644 --- a/dist/src/consts/signAccountOp/errorHandling.js +++ b/dist/src/consts/signAccountOp/errorHandling.js @@ -1,6 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RETRY_TO_INIT_ACCOUNT_OP_MSG = exports.WARNINGS = exports.ERRORS = void 0; const ERRORS = { eoaInsufficientFunds: 'Insufficient funds to cover the fee.' }; +exports.ERRORS = ERRORS; const WARNINGS = { significantBalanceDecrease: { id: 'significantBalanceDecrease', @@ -16,6 +20,7 @@ const WARNINGS = { displayBeforeSign: true } }; +exports.WARNINGS = WARNINGS; const RETRY_TO_INIT_ACCOUNT_OP_MSG = 'Please attempt to initiate the transaction again or contact Ambire support.'; -export { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }; +exports.RETRY_TO_INIT_ACCOUNT_OP_MSG = RETRY_TO_INIT_ACCOUNT_OP_MSG; //# sourceMappingURL=errorHandling.js.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/errorHandling.js.map b/dist/src/consts/signAccountOp/errorHandling.js.map index f631fd712..6bdbdef65 100644 --- a/dist/src/consts/signAccountOp/errorHandling.js.map +++ b/dist/src/consts/signAccountOp/errorHandling.js.map @@ -1 +1 @@ -{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/errorHandling.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG;IACb,oBAAoB,EAAE,sCAAsC;CAC7D,CAAA;AAED,MAAM,QAAQ,GAA+B;IAC3C,0BAA0B,EAAE;QAC1B,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,sCAAsC;QAC7C,IAAI,EAAE,0IAA0I;QAChJ,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;KACxB;IACD,wBAAwB,EAAE;QACxB,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,gDAAgD;QACvD,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,IAAI;KACxB;CACF,CAAA;AAED,MAAM,4BAA4B,GAChC,6EAA6E,CAAA;AAE/E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAA","sourcesContent":["import { Warning } from '../../interfaces/signAccountOp'\n\nconst ERRORS = {\n eoaInsufficientFunds: 'Insufficient funds to cover the fee.'\n}\n\nconst WARNINGS: { [key: string]: Warning } = {\n significantBalanceDecrease: {\n id: 'significantBalanceDecrease',\n title: 'Significant Account Balance Decrease',\n text: 'The transaction you are about to sign will significantly decrease your account balance. Please review the transaction details carefully.',\n promptBeforeSign: true,\n displayBeforeSign: true\n },\n feeTokenPriceUnavailable: {\n id: 'feeTokenPriceUnavailable',\n title: 'Unable to estimate the transaction fee in USD.',\n promptBeforeSign: false,\n displayBeforeSign: true\n }\n}\n\nconst RETRY_TO_INIT_ACCOUNT_OP_MSG =\n 'Please attempt to initiate the transaction again or contact Ambire support.'\n\nexport { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }\n"]} \ No newline at end of file +{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/errorHandling.ts"],"names":[],"mappings":";;;AAEA,MAAM,MAAM,GAAG;IACb,oBAAoB,EAAE,sCAAsC;CAC7D,CAAA;AAqBQ,wBAAM;AAnBf,MAAM,QAAQ,GAA+B;IAC3C,0BAA0B,EAAE;QAC1B,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,sCAAsC;QAC7C,IAAI,EAAE,0IAA0I;QAChJ,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;KACxB;IACD,wBAAwB,EAAE;QACxB,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,gDAAgD;QACvD,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,IAAI;KACxB;CACF,CAAA;AAKgB,4BAAQ;AAHzB,MAAM,4BAA4B,GAChC,6EAA6E,CAAA;AAEpD,oEAA4B","sourcesContent":["import { Warning } from '../../interfaces/signAccountOp'\n\nconst ERRORS = {\n eoaInsufficientFunds: 'Insufficient funds to cover the fee.'\n}\n\nconst WARNINGS: { [key: string]: Warning } = {\n significantBalanceDecrease: {\n id: 'significantBalanceDecrease',\n title: 'Significant Account Balance Decrease',\n text: 'The transaction you are about to sign will significantly decrease your account balance. Please review the transaction details carefully.',\n promptBeforeSign: true,\n displayBeforeSign: true\n },\n feeTokenPriceUnavailable: {\n id: 'feeTokenPriceUnavailable',\n title: 'Unable to estimate the transaction fee in USD.',\n promptBeforeSign: false,\n displayBeforeSign: true\n }\n}\n\nconst RETRY_TO_INIT_ACCOUNT_OP_MSG =\n 'Please attempt to initiate the transaction again or contact Ambire support.'\n\nexport { ERRORS, WARNINGS, RETRY_TO_INIT_ACCOUNT_OP_MSG }\n"]} \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.js b/dist/src/consts/signAccountOp/gas.js index ebb0cc510..d4d27fc7f 100644 --- a/dist/src/consts/signAccountOp/gas.js +++ b/dist/src/consts/signAccountOp/gas.js @@ -1,5 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GAS_TANK_TRANSFER_GAS_USED = exports.SA_ERC20_TRANSFER_GAS_USED = exports.SA_NATIVE_TRANSFER_GAS_USED = void 0; const SA_NATIVE_TRANSFER_GAS_USED = 12000n; +exports.SA_NATIVE_TRANSFER_GAS_USED = SA_NATIVE_TRANSFER_GAS_USED; const SA_ERC20_TRANSFER_GAS_USED = 18000n; +exports.SA_ERC20_TRANSFER_GAS_USED = SA_ERC20_TRANSFER_GAS_USED; const GAS_TANK_TRANSFER_GAS_USED = 5000n; -export { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }; +exports.GAS_TANK_TRANSFER_GAS_USED = GAS_TANK_TRANSFER_GAS_USED; //# sourceMappingURL=gas.js.map \ No newline at end of file diff --git a/dist/src/consts/signAccountOp/gas.js.map b/dist/src/consts/signAccountOp/gas.js.map index 2ceb4464a..a34b1c83f 100644 --- a/dist/src/consts/signAccountOp/gas.js.map +++ b/dist/src/consts/signAccountOp/gas.js.map @@ -1 +1 @@ -{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/gas.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAC1C,MAAM,0BAA0B,GAAG,MAAM,CAAA;AACzC,MAAM,0BAA0B,GAAG,KAAK,CAAA;AAExC,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,CAAA","sourcesContent":["const SA_NATIVE_TRANSFER_GAS_USED = 12000n\nconst SA_ERC20_TRANSFER_GAS_USED = 18000n\nconst GAS_TANK_TRANSFER_GAS_USED = 5000n\n\nexport { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }\n"]} \ No newline at end of file +{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../src/consts/signAccountOp/gas.ts"],"names":[],"mappings":";;;AAAA,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAIjC,kEAA2B;AAHpC,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAGH,gEAA0B;AAFhE,MAAM,0BAA0B,GAAG,KAAK,CAAA;AAE0B,gEAA0B","sourcesContent":["const SA_NATIVE_TRANSFER_GAS_USED = 12000n\nconst SA_ERC20_TRANSFER_GAS_USED = 18000n\nconst GAS_TANK_TRANSFER_GAS_USED = 5000n\n\nexport { SA_NATIVE_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, GAS_TANK_TRANSFER_GAS_USED }\n"]} \ No newline at end of file diff --git a/dist/src/consts/signatures.js b/dist/src/consts/signatures.js index 8c4a09a08..47bfea244 100644 --- a/dist/src/consts/signatures.js +++ b/dist/src/consts/signatures.js @@ -1,2 +1,5 @@ -export const SPOOF_SIGTYPE = '03'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SPOOF_SIGTYPE = void 0; +exports.SPOOF_SIGTYPE = '03'; //# sourceMappingURL=signatures.js.map \ No newline at end of file diff --git a/dist/src/consts/signatures.js.map b/dist/src/consts/signatures.js.map index 6bd3aaa86..e1e5e1ec5 100644 --- a/dist/src/consts/signatures.js.map +++ b/dist/src/consts/signatures.js.map @@ -1 +1 @@ -{"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/consts/signatures.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA","sourcesContent":["export const SPOOF_SIGTYPE = '03'\n"]} \ No newline at end of file +{"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/consts/signatures.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,IAAI,CAAA","sourcesContent":["export const SPOOF_SIGTYPE = '03'\n"]} \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.js b/dist/src/controllers/accountAdder/accountAdder.js index 61312df23..5ece23820 100644 --- a/dist/src/controllers/accountAdder/accountAdder.js +++ b/dist/src/controllers/accountAdder/accountAdder.js @@ -1,15 +1,19 @@ -import { getCreate2Address, keccak256 } from 'ethers'; -import ExternalSignerError from '../../classes/ExternalSignerError'; -import { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'; -import { PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'; -import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; -import { dedicatedToOneSAPriv } from '../../interfaces/keystore'; -import { getAccountImportStatus, getBasicAccount, getDefaultAccountPreferences, getEmailAccount, getSmartAccount, isAmbireV1LinkedAccount, isDerivedForSmartAccountKeyOnly, isSmartAccount } from '../../libs/account/account'; -import { getAccountState } from '../../libs/accountState/accountState'; -import { relayerCall } from '../../libs/relayerCall/relayerCall'; -import EventEmitter from '../eventEmitter/eventEmitter'; -export const DEFAULT_PAGE = 1; -export const DEFAULT_PAGE_SIZE = 5; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AccountAdderController = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const ExternalSignerError_1 = tslib_1.__importDefault(require("../../classes/ExternalSignerError")); +const account_1 = require("../../consts/account"); +const deploy_1 = require("../../consts/deploy"); +const derivation_1 = require("../../consts/derivation"); +const keystore_1 = require("../../interfaces/keystore"); +const account_2 = require("../../libs/account/account"); +const accountState_1 = require("../../libs/accountState/accountState"); +const relayerCall_1 = require("../../libs/relayerCall/relayerCall"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +exports.DEFAULT_PAGE = 1; +exports.DEFAULT_PAGE_SIZE = 5; const DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS = true; const DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true; /** @@ -19,7 +23,7 @@ const DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true; * It uses a KeyIterator interface allow iterating all the keys in a specific * underlying store such as a hardware device or an object holding a seed. */ -export class AccountAdderController extends EventEmitter { +class AccountAdderController extends eventEmitter_1.default { #callRelayer; #accounts; #keystore; @@ -32,9 +36,9 @@ export class AccountAdderController extends EventEmitter { shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS; shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS; /* This is only the index of the current page */ - page = DEFAULT_PAGE; + page = exports.DEFAULT_PAGE; /* The number of accounts to be displayed on a single page */ - pageSize = DEFAULT_PAGE_SIZE; + pageSize = exports.DEFAULT_PAGE_SIZE; /* State to indicate the page requested fails to load (and the reason why) */ pageError = null; selectedAccounts = []; @@ -62,20 +66,20 @@ export class AccountAdderController extends EventEmitter { this.#keystore = keystore; this.#networks = networks; this.#providers = providers; - this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.#callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch }); } get accountsOnPage() { const processedAccounts = this.#derivedAccounts // The displayed (visible) accounts on page should not include the derived // EOA (basic) accounts only used as smart account keys, they should not // be visible nor importable (or selectable). - .filter((x) => !isDerivedForSmartAccountKeyOnly(x.index)) + .filter((x) => !(0, account_2.isDerivedForSmartAccountKeyOnly)(x.index)) .flatMap((derivedAccount) => { - const associatedLinkedAccounts = this.#linkedAccounts.filter((linkedAcc) => !isSmartAccount(derivedAccount.account) && + const associatedLinkedAccounts = this.#linkedAccounts.filter((linkedAcc) => !(0, account_2.isSmartAccount)(derivedAccount.account) && linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)); - const correspondingSmartAccount = this.#derivedAccounts.find((acc) => isSmartAccount(acc.account) && acc.slot === derivedAccount.slot); + const correspondingSmartAccount = this.#derivedAccounts.find((acc) => (0, account_2.isSmartAccount)(acc.account) && acc.slot === derivedAccount.slot); let accountsToReturn = []; - if (!isSmartAccount(derivedAccount.account)) { + if (!(0, account_2.isSmartAccount)(derivedAccount.account)) { accountsToReturn.push(derivedAccount); const duplicate = associatedLinkedAccounts.find((linkedAcc) => linkedAcc.account.addr === correspondingSmartAccount?.account?.addr); // The derived smart account that matches the relayer's linked account @@ -118,7 +122,7 @@ export class AccountAdderController extends EventEmitter { const mergedAccounts = [...processedAccounts, ...unprocessedLinkedAccounts]; mergedAccounts.sort((a, b) => { const prioritizeAccountType = (item) => { - if (!isSmartAccount(item.account)) + if (!(0, account_2.isSmartAccount)(item.account)) return -1; if (item.isLinked) return 1; @@ -128,7 +132,7 @@ export class AccountAdderController extends EventEmitter { }); return mergedAccounts.map((acc) => ({ ...acc, - importStatus: getAccountImportStatus({ + importStatus: (0, account_2.getAccountImportStatus)({ account: acc.account, alreadyImportedAccounts: this.#alreadyImportedAccountsOnControllerInit, keys: this.#keystore.keys, @@ -157,8 +161,8 @@ export class AccountAdderController extends EventEmitter { this.#keyIterator = keyIterator; if (!this.#keyIterator) return this.#throwMissingKeyIterator(); - this.page = page || DEFAULT_PAGE; - this.pageSize = pageSize || DEFAULT_PAGE_SIZE; + this.page = page || exports.DEFAULT_PAGE; + this.pageSize = pageSize || exports.DEFAULT_PAGE_SIZE; this.isInitializedWithSavedSeed = await this.#isKeyIteratorInitializedWithTheSavedSeed(); this.hdPathTemplate = await this.#getInitialHdPathTemplate(hdPathTemplate); this.isInitialized = true; @@ -176,8 +180,8 @@ export class AccountAdderController extends EventEmitter { reset() { this.#keyIterator = null; this.selectedAccounts = []; - this.page = DEFAULT_PAGE; - this.pageSize = DEFAULT_PAGE_SIZE; + this.page = exports.DEFAULT_PAGE; + this.pageSize = exports.DEFAULT_PAGE_SIZE; this.hdPathTemplate = undefined; this.shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS; this.shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS; @@ -197,7 +201,7 @@ export class AccountAdderController extends EventEmitter { // accounts, as of v4.32.0, we don't store their hd path. When import // completes, only the latest hd path of the controller is stored. this.selectedAccounts = []; - await this.setPage({ page: DEFAULT_PAGE }); // takes the user back on the first page + await this.setPage({ page: exports.DEFAULT_PAGE }); // takes the user back on the first page } #getAccountKeys(account, accountsOnPageWithThisAcc) { // should never happen @@ -206,20 +210,20 @@ export class AccountAdderController extends EventEmitter { return []; } // Case 1: The account is a Basic account - const isBasicAcc = !isSmartAccount(account); + const isBasicAcc = !(0, account_2.isSmartAccount)(account); // The key of the Basic account is the basic account itself if (isBasicAcc) return accountsOnPageWithThisAcc; // Case 2: The account is a Smart account, but not a linked one - const isSmartAccountAndNotLinked = isSmartAccount(account) && + const isSmartAccountAndNotLinked = (0, account_2.isSmartAccount)(account) && accountsOnPageWithThisAcc.length === 1 && accountsOnPageWithThisAcc[0].isLinked === false; if (isSmartAccountAndNotLinked) { // The key of the smart account is the Basic account on the same slot // that is explicitly derived for a smart account key only. const basicAccOnThisSlotDerivedForSmartAccKey = this.#derivedAccounts.find((a) => a.slot === accountsOnPageWithThisAcc[0].slot && - !isSmartAccount(a.account) && - isDerivedForSmartAccountKeyOnly(a.index)); + !(0, account_2.isSmartAccount)(a.account) && + (0, account_2.isDerivedForSmartAccountKeyOnly)(a.index)); return basicAccOnThisSlotDerivedForSmartAccKey ? [basicAccOnThisSlotDerivedForSmartAccKey] : []; @@ -230,10 +234,10 @@ export class AccountAdderController extends EventEmitter { .map((a) => a.slot) .flatMap((slot) => { const basicAccOnThisSlot = this.#derivedAccounts.find((a) => a.slot === slot && - !isSmartAccount(a.account) && + !(0, account_2.isSmartAccount)(a.account) && // The key of the linked account is always the EOA (basic) account // on the same slot that is not explicitly used for smart account keys only. - !isDerivedForSmartAccountKeyOnly(a.index)); + !(0, account_2.isDerivedForSmartAccountKeyOnly)(a.index)); return basicAccOnThisSlot ? [basicAccOnThisSlot] : []; }); return basicAccOnEverySlotWhereThisAddrIsFound; @@ -332,7 +336,7 @@ export class AccountAdderController extends EventEmitter { this.emitUpdate(); if (page <= 0) { this.pageError = `Unexpected page was requested (page ${page}). Please try again or contact support for help.`; - this.page = DEFAULT_PAGE; // fallback to the default (initial) page + this.page = exports.DEFAULT_PAGE; // fallback to the default (initial) page this.emitUpdate(); return; } @@ -351,7 +355,7 @@ export class AccountAdderController extends EventEmitter { } catch (e) { const fallbackMessage = `Failed to retrieve accounts on page ${this.page}. Please try again or contact support for assistance. Error details: ${e?.message}.`; - this.pageError = e instanceof ExternalSignerError ? e.message : fallbackMessage; + this.pageError = e instanceof ExternalSignerError_1.default ? e.message : fallbackMessage; } this.accountsLoading = false; this.emitUpdate(); @@ -361,12 +365,12 @@ export class AccountAdderController extends EventEmitter { // Search for linked accounts to the basic (EOA) accounts only. // Searching for linked accounts to another Ambire smart accounts // is a feature that Ambire is yet to support. - !isSmartAccount(acc.account) && + !(0, account_2.isSmartAccount)(acc.account) && // Skip searching for linked accounts to the derived EOA (basic) // accounts that are used for smart account keys only. They are // solely purposed to manage 1 particular (smart) account, // not at all for linking. - !isDerivedForSmartAccountKeyOnly(acc.index)) + !(0, account_2.isDerivedForSmartAccountKeyOnly)(acc.index)) .map((acc) => acc.account) }); } @@ -394,9 +398,9 @@ export class AccountAdderController extends EventEmitter { let newlyCreatedAccounts = []; const accountsToAddOnRelayer = accounts // Identity only for the smart accounts must be created on the Relayer - .filter((x) => isSmartAccount(x.account)) + .filter((x) => (0, account_2.isSmartAccount)(x.account)) // Skip creating identity for Ambire v1 smart accounts - .filter((x) => !isAmbireV1LinkedAccount(x.account.creation?.factoryAddr)); + .filter((x) => !(0, account_2.isAmbireV1LinkedAccount)(x.account.creation?.factoryAddr)); if (accountsToAddOnRelayer.length) { const body = accountsToAddOnRelayer.map(({ account }) => ({ addr: account.addr, @@ -405,7 +409,7 @@ export class AccountAdderController extends EventEmitter { creation: { factoryAddr: account.creation.factoryAddr, salt: account.creation.salt, - baseIdentityAddr: PROXY_AMBIRE_ACCOUNT + baseIdentityAddr: deploy_1.PROXY_AMBIRE_ACCOUNT } })); try { @@ -441,7 +445,7 @@ export class AccountAdderController extends EventEmitter { // re-importing the same account via different key type(s) would reset them. preferences: alreadyImportedAcc ? alreadyImportedAcc.preferences - : getDefaultAccountPreferences(x.account.addr, this.#accounts.accounts, i), + : (0, account_2.getDefaultAccountPreferences)(x.account.addr, this.#accounts.accounts, i), newlyCreated: newlyCreatedAccounts.includes(x.account.addr) }; }) @@ -460,7 +464,7 @@ export class AccountAdderController extends EventEmitter { if (!this.#keyIterator) return this.#throwMissingKeyIterator(); const keyPublicAddress = (await this.#keyIterator.retrieve([{ from: 0, to: 1 }]))[0]; - const emailSmartAccount = await getEmailAccount({ + const emailSmartAccount = await (0, account_2.getEmailAccount)({ emailFrom: email, secondaryKey: recoveryKey.addr }, keyPublicAddress); @@ -502,8 +506,8 @@ export class AccountAdderController extends EventEmitter { if (shouldRetrieveSmartAccountIndices) { // Indices for the smart accounts. indicesToRetrieve.push({ - from: startIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET, - to: endIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET + from: startIdx + derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET, + to: endIdx + derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET }); } // Combine the requests for all accounts in one call to the keyIterator. @@ -520,11 +524,11 @@ export class AccountAdderController extends EventEmitter { for (const [index, smartAccKey] of smartAccKeys.entries()) { const slot = startIdx + (index + 1); // The derived EOA (basic) account which is the key for the smart account - const account = getBasicAccount(smartAccKey, this.#accounts.accounts); - const indexWithOffset = slot - 1 + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + const account = (0, account_2.getBasicAccount)(smartAccKey, this.#accounts.accounts); + const indexWithOffset = slot - 1 + derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; accounts.push({ account, isLinked: false, slot, index: indexWithOffset }); // Derive the Ambire (smart) account - smartAccountsPromises.push(getSmartAccount([{ addr: smartAccKey, hash: dedicatedToOneSAPriv }], this.#accounts.accounts) + smartAccountsPromises.push((0, account_2.getSmartAccount)([{ addr: smartAccKey, hash: keystore_1.dedicatedToOneSAPriv }], this.#accounts.accounts) .then((smartAccount) => { return { account: smartAccount, isLinked: false, slot, index: slot - 1 }; }) @@ -543,7 +547,7 @@ export class AccountAdderController extends EventEmitter { for (const [index, basicAccKey] of basicAccKeys.entries()) { const slot = startIdx + (index + 1); // The EOA (basic) account on this slot - const account = getBasicAccount(basicAccKey, this.#accounts.accounts); + const account = (0, account_2.getBasicAccount)(basicAccKey, this.#accounts.accounts); accounts.push({ account, isLinked: false, slot, index: slot - 1 }); } const accountsWithNetworks = await this.#getAccountsUsedOnNetworks({ accounts }); @@ -563,7 +567,7 @@ export class AccountAdderController extends EventEmitter { const promises = Object.keys(this.#providers.providers).map(async (providerKey) => { const network = networkLookup[providerKey]; if (network) { - const accountState = await getAccountState(this.#providers.providers[providerKey], network, accounts.map((acc) => acc.account)).catch(() => { + const accountState = await (0, accountState_1.getAccountState)(this.#providers.providers[providerKey], network, accounts.map((acc) => acc.account)).catch(() => { console.error('accountAdder: failed to get account state on ', providerKey); if (this.networksWithAccountStateError.includes(providerKey)) return; @@ -634,7 +638,7 @@ export class AccountAdderController extends EventEmitter { const { factoryAddr, bytecode, salt, associatedKeys } = data.accounts[addr]; // Checks whether the account.addr matches the addr generated from the // factory. Should never happen, but could be a possible attack vector. - const isInvalidAddress = getCreate2Address(factoryAddr, salt, keccak256(bytecode)).toLowerCase() !== + const isInvalidAddress = (0, ethers_1.getCreate2Address)(factoryAddr, salt, (0, ethers_1.keccak256)(bytecode)).toLowerCase() !== addr.toLowerCase(); if (isInvalidAddress) { const message = `The address ${addr} can't be verified to be a smart account address.`; @@ -658,7 +662,7 @@ export class AccountAdderController extends EventEmitter { salt }, preferences: { - label: existingAccount?.preferences.label || DEFAULT_ACCOUNT_LABEL, + label: existingAccount?.preferences.label || account_1.DEFAULT_ACCOUNT_LABEL, pfp: existingAccount?.preferences?.pfp || addr } }, @@ -733,5 +737,6 @@ export class AccountAdderController extends EventEmitter { }; } } -export default AccountAdderController; +exports.AccountAdderController = AccountAdderController; +exports.default = AccountAdderController; //# sourceMappingURL=accountAdder.js.map \ No newline at end of file diff --git a/dist/src/controllers/accountAdder/accountAdder.js.map b/dist/src/controllers/accountAdder/accountAdder.js.map index 25fdc47d4..e4d6bca6b 100644 --- a/dist/src/controllers/accountAdder/accountAdder.js.map +++ b/dist/src/controllers/accountAdder/accountAdder.js.map @@ -1 +1 @@ -{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/controllers/accountAdder/accountAdder.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCreate2Address, keccak256 } from 'ethers'\n\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport {\n Account,\n AccountOnchainState,\n AccountOnPage,\n AccountWithNetworkMeta,\n DerivedAccount,\n DerivedAccountWithoutNetworkMeta,\n SelectedAccountForImport\n} from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { dedicatedToOneSAPriv, ReadyToAddKeys } from '../../interfaces/keystore'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport {\n getAccountImportStatus,\n getBasicAccount,\n getDefaultAccountPreferences,\n getEmailAccount,\n getSmartAccount,\n isAmbireV1LinkedAccount,\n isDerivedForSmartAccountKeyOnly,\n isSmartAccount\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_PAGE = 1\nexport const DEFAULT_PAGE_SIZE = 5\nconst DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS = true\nconst DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true\n\n/**\n * Account Adder Controller\n * is responsible for listing accounts that can be selected for adding, and for\n * adding (creating) identity for the smart accounts (if needed) on the Relayer.\n * It uses a KeyIterator interface allow iterating all the keys in a specific\n * underlying store such as a hardware device or an object holding a seed.\n */\nexport class AccountAdderController extends EventEmitter {\n #callRelayer: Function\n\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n #keyIterator?: KeyIterator | null\n\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n\n isInitialized: boolean = false\n\n isInitializedWithSavedSeed: boolean = false\n\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n /* This is only the index of the current page */\n page: number = DEFAULT_PAGE\n\n /* The number of accounts to be displayed on a single page */\n pageSize: number = DEFAULT_PAGE_SIZE\n\n /* State to indicate the page requested fails to load (and the reason why) */\n pageError: null | string = null\n\n selectedAccounts: SelectedAccountForImport[] = []\n\n // Accounts which identity is created on the Relayer (if needed), and are ready\n // to be added to the user's account list by the Main Controller\n readyToAddAccounts: Account[] = []\n\n // The keys for the `readyToAddAccounts`, that are ready to be added to the\n // user's keystore by the Main Controller\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n\n // Identity for the smart accounts must be created on the Relayer, this\n // represents the status of the operation, needed managing UI state\n addAccountsStatus: 'LOADING' | 'SUCCESS' | 'INITIAL' = 'INITIAL'\n\n accountsLoading: boolean = false\n\n linkedAccountsLoading: boolean = false\n\n networksWithAccountStateError: NetworkId[] = []\n\n #derivedAccounts: DerivedAccount[] = []\n\n #linkedAccounts: { account: AccountWithNetworkMeta; isLinked: boolean }[] = []\n\n // This prevents the recalculation of getters that use accounts during the execution of addAccounts.\n // Without this, the controller incorrectly identifies newly added accounts as those from a previous session,\n // leading to unpredictable behavior on the AccountAdderScreen\n #alreadyImportedAccountsOnControllerInit: Account[] = []\n\n constructor({\n accounts,\n keystore,\n networks,\n providers,\n relayerUrl,\n fetch\n }: {\n accounts: AccountsController\n keystore: KeystoreController\n networks: NetworksController\n providers: ProvidersController\n relayerUrl: string\n fetch: Fetch\n }) {\n super()\n this.#accounts = accounts\n this.#keystore = keystore\n this.#networks = networks\n this.#providers = providers\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n get accountsOnPage(): AccountOnPage[] {\n const processedAccounts = this.#derivedAccounts\n // The displayed (visible) accounts on page should not include the derived\n // EOA (basic) accounts only used as smart account keys, they should not\n // be visible nor importable (or selectable).\n .filter((x) => !isDerivedForSmartAccountKeyOnly(x.index))\n .flatMap((derivedAccount) => {\n const associatedLinkedAccounts = this.#linkedAccounts.filter(\n (linkedAcc) =>\n !isSmartAccount(derivedAccount.account) &&\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n const correspondingSmartAccount = this.#derivedAccounts.find(\n (acc) => isSmartAccount(acc.account) && acc.slot === derivedAccount.slot\n )\n\n let accountsToReturn: Omit[] = []\n\n if (!isSmartAccount(derivedAccount.account)) {\n accountsToReturn.push(derivedAccount)\n\n const duplicate = associatedLinkedAccounts.find(\n (linkedAcc) => linkedAcc.account.addr === correspondingSmartAccount?.account?.addr\n )\n\n // The derived smart account that matches the relayer's linked account\n // should not be displayed as linked account. Use this cycle to mark it.\n if (duplicate) duplicate.isLinked = false\n\n if (!duplicate && correspondingSmartAccount) {\n accountsToReturn.push(correspondingSmartAccount)\n }\n }\n\n accountsToReturn = accountsToReturn.concat(\n associatedLinkedAccounts.map((linkedAcc) => ({\n ...linkedAcc,\n slot: derivedAccount.slot,\n index: derivedAccount.index\n }))\n )\n\n return accountsToReturn\n })\n\n const unprocessedLinkedAccounts = this.#linkedAccounts\n .filter(\n (linkedAcc) =>\n !processedAccounts.find(\n (processedAcc) => processedAcc?.account.addr === linkedAcc.account.addr\n )\n )\n // Use `flatMap` instead of `map` in order to auto remove missing values.\n // The `flatMap` has a built-in mechanism to flatten the array and remove\n // null or undefined values (by returning empty array).\n .flatMap((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found, except when\n // something is wrong with the data we have stored on the Relayer.\n // The this.#verifyLinkedAndDerivedAccounts() method should have\n // already emitted an error in that case. Do not emit here, since\n // this is a getter method (and emitting here is a no-go).\n if (!correspondingDerivedAccount) return []\n\n return [\n {\n ...linkedAcc,\n slot: correspondingDerivedAccount.slot,\n index: correspondingDerivedAccount.index\n }\n ]\n })\n\n const mergedAccounts = [...processedAccounts, ...unprocessedLinkedAccounts]\n\n mergedAccounts.sort((a, b) => {\n const prioritizeAccountType = (item: any) => {\n if (!isSmartAccount(item.account)) return -1\n if (item.isLinked) return 1\n\n return 0\n }\n\n return prioritizeAccountType(a) - prioritizeAccountType(b) || a.slot - b.slot\n })\n\n return mergedAccounts.map((acc) => ({\n ...acc,\n importStatus: getAccountImportStatus({\n account: acc.account,\n alreadyImportedAccounts: this.#alreadyImportedAccountsOnControllerInit,\n keys: this.#keystore.keys,\n accountsOnPage: mergedAccounts,\n keyIteratorType: this.#keyIterator?.type\n })\n }))\n }\n\n async #isKeyIteratorInitializedWithTheSavedSeed() {\n if (this.#keyIterator?.subType !== 'seed') return false\n\n if (!this.#keystore.hasKeystoreSavedSeed) return false\n\n const savedSeed = await this.#keystore.getSavedSeed()\n if (!savedSeed) return false\n\n return !!this.#keyIterator?.isSeedMatching?.(savedSeed.seed)\n }\n\n async #getInitialHdPathTemplate(defaultHdPathTemplate: HD_PATH_TEMPLATE_TYPE) {\n if (!this.isInitializedWithSavedSeed) return defaultHdPathTemplate\n\n const savedSeed = await this.#keystore.getSavedSeed()\n return savedSeed.hdPathTemplate || defaultHdPathTemplate\n }\n\n async init({\n keyIterator,\n page,\n pageSize,\n hdPathTemplate,\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS,\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n }: {\n keyIterator: KeyIterator | null\n page?: number\n pageSize?: number\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n shouldSearchForLinkedAccounts?: boolean\n shouldGetAccountsUsedOnNetworks?: boolean\n }) {\n this.#keyIterator = keyIterator\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page || DEFAULT_PAGE\n this.pageSize = pageSize || DEFAULT_PAGE_SIZE\n this.isInitializedWithSavedSeed = await this.#isKeyIteratorInitializedWithTheSavedSeed()\n this.hdPathTemplate = await this.#getInitialHdPathTemplate(hdPathTemplate)\n this.isInitialized = true\n this.#alreadyImportedAccountsOnControllerInit = this.#accounts.accounts\n this.shouldSearchForLinkedAccounts = shouldSearchForLinkedAccounts\n this.shouldGetAccountsUsedOnNetworks = shouldGetAccountsUsedOnNetworks\n\n this.emitUpdate()\n }\n\n get type() {\n return this.#keyIterator?.type\n }\n\n get subType() {\n return this.#keyIterator?.subType\n }\n\n reset() {\n this.#keyIterator = null\n this.selectedAccounts = []\n this.page = DEFAULT_PAGE\n this.pageSize = DEFAULT_PAGE_SIZE\n this.hdPathTemplate = undefined\n this.shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n this.shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n this.addAccountsStatus = 'INITIAL'\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.readyToAddAccounts = []\n this.networksWithAccountStateError = []\n this.readyToAddKeys = { internal: [], external: [] }\n this.isInitialized = false\n this.isInitializedWithSavedSeed = false\n\n this.emitUpdate()\n }\n\n async setHDPathTemplate({ hdPathTemplate }: { hdPathTemplate: HD_PATH_TEMPLATE_TYPE }) {\n this.hdPathTemplate = hdPathTemplate\n\n // Reset the currently selected accounts, because for the keys of these\n // accounts, as of v4.32.0, we don't store their hd path. When import\n // completes, only the latest hd path of the controller is stored.\n this.selectedAccounts = []\n\n await this.setPage({ page: DEFAULT_PAGE }) // takes the user back on the first page\n }\n\n #getAccountKeys(account: Account, accountsOnPageWithThisAcc: AccountOnPage[]) {\n // should never happen\n if (accountsOnPageWithThisAcc.length === 0) {\n console.error(`accountAdder: account ${account.addr} was not found in the accountsOnPage.`)\n return []\n }\n\n // Case 1: The account is a Basic account\n const isBasicAcc = !isSmartAccount(account)\n // The key of the Basic account is the basic account itself\n if (isBasicAcc) return accountsOnPageWithThisAcc\n\n // Case 2: The account is a Smart account, but not a linked one\n const isSmartAccountAndNotLinked =\n isSmartAccount(account) &&\n accountsOnPageWithThisAcc.length === 1 &&\n accountsOnPageWithThisAcc[0].isLinked === false\n\n if (isSmartAccountAndNotLinked) {\n // The key of the smart account is the Basic account on the same slot\n // that is explicitly derived for a smart account key only.\n const basicAccOnThisSlotDerivedForSmartAccKey = this.#derivedAccounts.find(\n (a) =>\n a.slot === accountsOnPageWithThisAcc[0].slot &&\n !isSmartAccount(a.account) &&\n isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlotDerivedForSmartAccKey\n ? [basicAccOnThisSlotDerivedForSmartAccKey]\n : []\n }\n\n // Case 3: The account is a Smart account and a linked one. For this case,\n // there could exist multiple keys (basic accounts) found on different slots.\n const basicAccOnEverySlotWhereThisAddrIsFound = accountsOnPageWithThisAcc\n .map((a) => a.slot)\n .flatMap((slot) => {\n const basicAccOnThisSlot = this.#derivedAccounts.find(\n (a) =>\n a.slot === slot &&\n !isSmartAccount(a.account) &&\n // The key of the linked account is always the EOA (basic) account\n // on the same slot that is not explicitly used for smart account keys only.\n !isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlot ? [basicAccOnThisSlot] : []\n })\n\n return basicAccOnEverySlotWhereThisAddrIsFound\n }\n\n selectAccount(_account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n // Needed, because linked accounts could have multiple keys (basic accounts),\n // and therefore - same linked account could be found on different slots.\n const accountsOnPageWithThisAcc = this.accountsOnPage.filter(\n (accOnPage) => accOnPage.account.addr === _account.addr\n )\n const accountKeys = this.#getAccountKeys(_account, accountsOnPageWithThisAcc)\n if (!accountKeys.length)\n return this.emitError({\n level: 'major',\n message: `Selecting ${_account.addr} account failed because the details for this account are missing. Please try again or contact support if the problem persists.`,\n error: new Error(\n `Trying to select ${_account.addr} account, but this account was not found in the accountsOnPage or it's keys were not found.`\n )\n })\n\n const nextSelectedAccount = {\n account: _account,\n // If the account has more than 1 key, it is for sure linked account,\n // since Basic accounts have only 1 key and smart accounts with more than\n // one key present should always be found as linked accounts anyways.\n isLinked: accountKeys.length > 1,\n accountKeys: accountKeys.map((a) => ({\n addr: a.account.addr,\n slot: a.slot,\n index: a.index\n }))\n }\n\n const accountExists = this.selectedAccounts.some(\n (x) => x.account.addr === nextSelectedAccount.account.addr\n )\n if (accountExists) {\n // If the account exists, replace it with the new one, to make sure\n // the latest data is used. We could add one more sub-step to skip this,\n // if we do a deep comparison, but that would probably be an overkill.\n this.selectedAccounts = this.selectedAccounts.map((x) =>\n x.account.addr === nextSelectedAccount.account.addr ? nextSelectedAccount : x\n )\n } else {\n this.selectedAccounts.push(nextSelectedAccount)\n }\n\n this.emitUpdate()\n }\n\n deselectAccount(account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const accIdx = this.selectedAccounts.findIndex((x) => x.account.addr === account.addr)\n\n if (accIdx !== -1) {\n this.selectedAccounts = this.selectedAccounts.filter((_, i) => i !== accIdx)\n this.emitUpdate()\n } else {\n return this.emitError({\n level: 'major',\n message: 'This account cannot be deselected. Please reload and try again.',\n error: new Error('accountAdder: account not found. Cannot deselect.')\n })\n }\n }\n\n /**\n * For internal keys only! Returns the ready to be added internal (private)\n * keys of the currently selected accounts.\n */\n retrieveInternalKeysOfSelectedAccounts() {\n if (!this.hdPathTemplate) {\n this.#throwMissingHdPath()\n return []\n }\n\n if (!this.#keyIterator?.retrieveInternalKeys) {\n this.#throwMissingKeyIteratorRetrieveInternalKeysMethod()\n return []\n }\n\n return this.#keyIterator?.retrieveInternalKeys(\n this.selectedAccounts,\n this.hdPathTemplate,\n this.#keystore.keys\n )\n }\n\n /**\n * Prevents requesting the next page before the current one is fully loaded.\n * This avoids race conditions where the user requests the next page before\n * linked accounts are fully loaded, causing misleadingly failing `#verifyLinkedAccounts` checks.\n */\n get isPageLocked() {\n return this.accountsLoading || this.linkedAccountsLoading\n }\n\n async setPage({ page = this.page }: { page: number }): Promise {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page\n this.pageError = null\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.accountsLoading = true\n this.networksWithAccountStateError = []\n this.emitUpdate()\n\n if (page <= 0) {\n this.pageError = `Unexpected page was requested (page ${page}). Please try again or contact support for help.`\n this.page = DEFAULT_PAGE // fallback to the default (initial) page\n this.emitUpdate()\n return\n }\n\n try {\n this.#derivedAccounts = await this.#deriveAccounts()\n\n if (this.#keyIterator?.type === 'internal' && this.#keyIterator?.subType === 'private-key') {\n const accountsOnPageWithoutTheLinked = this.accountsOnPage.filter((acc) => !acc.isLinked)\n const usedAccounts = accountsOnPageWithoutTheLinked.filter(\n (acc) => acc.account.usedOnNetworks.length\n )\n\n // If at least one account is used - preselect all accounts on the page\n // (except the linked ones). Usually there are are two accounts\n // (since the private key flow gas `pageSize` of 1)\n if (usedAccounts.length) {\n accountsOnPageWithoutTheLinked.forEach((acc) => this.selectAccount(acc.account))\n }\n }\n } catch (e: any) {\n const fallbackMessage = `Failed to retrieve accounts on page ${this.page}. Please try again or contact support for assistance. Error details: ${e?.message}.`\n this.pageError = e instanceof ExternalSignerError ? e.message : fallbackMessage\n }\n this.accountsLoading = false\n this.emitUpdate()\n\n await this.#findAndSetLinkedAccounts({\n accounts: this.#derivedAccounts\n .filter(\n (acc) =>\n // Search for linked accounts to the basic (EOA) accounts only.\n // Searching for linked accounts to another Ambire smart accounts\n // is a feature that Ambire is yet to support.\n !isSmartAccount(acc.account) &&\n // Skip searching for linked accounts to the derived EOA (basic)\n // accounts that are used for smart account keys only. They are\n // solely purposed to manage 1 particular (smart) account,\n // not at all for linking.\n !isDerivedForSmartAccountKeyOnly(acc.index)\n )\n .map((acc) => acc.account)\n })\n }\n\n /**\n * Triggers the process of adding accounts via the AccountAdder flow by\n * creating identity for the smart accounts (if needed) on the Relayer.\n * Then the `onAccountAdderSuccess` listener in the Main Controller gets\n * triggered, which uses the `readyToAdd...` properties to further set\n * the newly added accounts data (like preferences, keys and others)\n */\n async addAccounts(\n accounts: SelectedAccountForImport[] = [],\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n ) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n if (!accounts.length) {\n return this.emitError({\n level: 'minor',\n message:\n 'Trying to add accounts, but no accounts are selected. Please select at least one account.',\n error: new Error(\n 'accountAdder: requested method `addAccounts`, but the accounts param is empty'\n )\n })\n }\n\n this.addAccountsStatus = 'LOADING'\n await this.forceEmitUpdate()\n\n let newlyCreatedAccounts: Account['addr'][] = []\n const accountsToAddOnRelayer: SelectedAccountForImport[] = accounts\n // Identity only for the smart accounts must be created on the Relayer\n .filter((x) => isSmartAccount(x.account))\n // Skip creating identity for Ambire v1 smart accounts\n .filter((x) => !isAmbireV1LinkedAccount(x.account.creation?.factoryAddr))\n\n if (accountsToAddOnRelayer.length) {\n const body = accountsToAddOnRelayer.map(({ account }: SelectedAccountForImport) => ({\n addr: account.addr,\n ...(account.email ? { email: account.email } : {}),\n associatedKeys: account.initialPrivileges,\n creation: {\n factoryAddr: account.creation!.factoryAddr,\n salt: account.creation!.salt,\n baseIdentityAddr: PROXY_AMBIRE_ACCOUNT\n }\n }))\n\n try {\n const res = await this.#callRelayer('/v2/identity/create-multiple', 'POST', {\n accounts: body\n })\n\n if (!res.success) {\n throw new Error(res?.message || 'No response received from the Ambire Relayer.')\n }\n\n type AccResType = {\n identity: string\n status: {\n created: boolean\n reason?: string\n }\n }\n\n type BodyType = AccResType[]\n if (res.body) {\n newlyCreatedAccounts = (res.body as BodyType)\n .filter((acc: AccResType) => acc.status.created)\n .map((acc: AccResType) => acc.identity)\n }\n } catch (e: any) {\n this.emitError({\n level: 'major',\n message:\n 'Error when adding accounts on the Ambire Relayer. Please try again later or contact support if the problem persists.',\n error: new Error(e?.message)\n })\n\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n return\n }\n }\n\n this.readyToAddAccounts = [\n ...accounts.map((x, i) => {\n const alreadyImportedAcc = this.#accounts.accounts.find((a) => a.addr === x.account.addr)\n\n return {\n ...x.account,\n // Persist the already imported account preferences on purpose, otherwise,\n // re-importing the same account via different key type(s) would reset them.\n preferences: alreadyImportedAcc\n ? alreadyImportedAcc.preferences\n : getDefaultAccountPreferences(x.account.addr, this.#accounts.accounts, i),\n newlyCreated: newlyCreatedAccounts.includes(x.account.addr)\n }\n })\n ]\n this.readyToAddKeys = readyToAddKeys\n this.addAccountsStatus = 'SUCCESS'\n await this.forceEmitUpdate()\n\n // reset the addAccountsStatus in the next tick to ensure the FE receives the 'SUCCESS' state\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n async createAndAddEmailAccount(selectedAccount: SelectedAccountForImport) {\n const {\n account: { email },\n accountKeys: [recoveryKey]\n } = selectedAccount\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const keyPublicAddress: string = (await this.#keyIterator.retrieve([{ from: 0, to: 1 }]))[0]\n\n const emailSmartAccount = await getEmailAccount(\n {\n emailFrom: email!,\n secondaryKey: recoveryKey.addr\n },\n keyPublicAddress\n )\n\n await this.addAccounts([{ ...selectedAccount, account: { ...emailSmartAccount, email } }])\n }\n\n // updates the account adder state so the main ctrl receives the readyToAddAccounts\n // that should be added to the storage of the app\n async addExistingEmailAccounts(accounts: Account[]) {\n // There is no need to call the addAccounts method in order to add that\n // account to the relayer because this func will be called only for accounts returned\n // from relayer that only need to be stored in the storage of the app\n this.readyToAddAccounts = accounts\n this.addAccountsStatus = 'SUCCESS'\n this.emitUpdate()\n }\n\n removeNetworkData(id: Network['id']) {\n this.networksWithAccountStateError = this.networksWithAccountStateError.filter((x) => x !== id)\n this.emitUpdate()\n }\n\n async #deriveAccounts(): Promise {\n // Should never happen, because before the #deriveAccounts method gets\n // called - there is a check if the #keyIterator exists.\n if (!this.#keyIterator) {\n console.error('accountAdder: missing keyIterator')\n return []\n }\n\n const accounts: DerivedAccountWithoutNetworkMeta[] = []\n\n const startIdx = (this.page - 1) * this.pageSize\n const endIdx = (this.page - 1) * this.pageSize + (this.pageSize - 1)\n\n const indicesToRetrieve = [\n { from: startIdx, to: endIdx } // Indices for the basic (EOA) accounts\n ]\n // Since v4.31.0, do not retrieve smart accounts for the private key\n // type. That's because we can't use the common derivation offset\n // (SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET), and deriving smart\n // accounts out of the private key (with another approach - salt and\n // extra entropy) was creating confusion.\n const shouldRetrieveSmartAccountIndices = this.#keyIterator.type !== 'private-key'\n if (shouldRetrieveSmartAccountIndices) {\n // Indices for the smart accounts.\n indicesToRetrieve.push({\n from: startIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET,\n to: endIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n })\n }\n // Combine the requests for all accounts in one call to the keyIterator.\n // That's optimization primarily focused on hardware wallets, to reduce the\n // number of calls to the hardware device. This is important, especially\n // for Trezor, because it fires a confirmation popup for each call.\n const combinedBasicAndSmartAccKeys = await this.#keyIterator.retrieve(\n indicesToRetrieve,\n this.hdPathTemplate\n )\n\n const basicAccKeys = combinedBasicAndSmartAccKeys.slice(0, this.pageSize)\n const smartAccKeys = combinedBasicAndSmartAccKeys.slice(\n this.pageSize,\n combinedBasicAndSmartAccKeys.length\n )\n\n const smartAccountsPromises: Promise[] = []\n // Replace the parallel getKeys with foreach to prevent issues with Ledger,\n // which can only handle one request at a time.\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, smartAccKey] of smartAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The derived EOA (basic) account which is the key for the smart account\n const account = getBasicAccount(smartAccKey, this.#accounts.accounts)\n const indexWithOffset = slot - 1 + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n accounts.push({ account, isLinked: false, slot, index: indexWithOffset })\n\n // Derive the Ambire (smart) account\n smartAccountsPromises.push(\n getSmartAccount(\n [{ addr: smartAccKey, hash: dedicatedToOneSAPriv }],\n this.#accounts.accounts\n )\n .then((smartAccount) => {\n return { account: smartAccount, isLinked: false, slot, index: slot - 1 }\n })\n // If the error isn't caught here and the promise is rejected, Promise.all\n // will be rejected entirely.\n .catch(() => {\n // No need for emitting an error here, because a relevant error is already\n // emitted in the method #getAccountsUsedOnNetworks\n return null\n })\n )\n }\n\n const unfilteredSmartAccountsList = await Promise.all(smartAccountsPromises)\n const smartAccounts = unfilteredSmartAccountsList.filter(\n (x) => x !== null\n ) as DerivedAccountWithoutNetworkMeta[]\n\n accounts.push(...smartAccounts)\n\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, basicAccKey] of basicAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The EOA (basic) account on this slot\n const account = getBasicAccount(basicAccKey, this.#accounts.accounts)\n accounts.push({ account, isLinked: false, slot, index: slot - 1 })\n }\n\n const accountsWithNetworks = await this.#getAccountsUsedOnNetworks({ accounts })\n\n return accountsWithNetworks\n }\n\n // inner func\n // eslint-disable-next-line class-methods-use-this\n async #getAccountsUsedOnNetworks({\n accounts\n }: {\n accounts: DerivedAccountWithoutNetworkMeta[]\n }): Promise {\n if (!this.shouldGetAccountsUsedOnNetworks) {\n return accounts.map((a) => ({ ...a, account: { ...a.account, usedOnNetworks: [] } }))\n }\n\n const accountsObj: { [key: Account['addr']]: DerivedAccount } = Object.fromEntries(\n accounts.map((a) => [a.account.addr, { ...a, account: { ...a.account, usedOnNetworks: [] } }])\n )\n\n const networkLookup: { [key: NetworkId]: Network } = {}\n this.#networks.networks.forEach((network) => {\n networkLookup[network.id] = network\n })\n\n const promises = Object.keys(this.#providers.providers).map(async (providerKey: NetworkId) => {\n const network = networkLookup[providerKey]\n if (network) {\n const accountState = await getAccountState(\n this.#providers.providers[providerKey],\n network,\n accounts.map((acc) => acc.account)\n ).catch(() => {\n console.error('accountAdder: failed to get account state on ', providerKey)\n if (this.networksWithAccountStateError.includes(providerKey)) return\n this.networksWithAccountStateError.push(providerKey)\n })\n\n if (!accountState) return\n\n accountState.forEach((acc: AccountOnchainState) => {\n const isUsedOnThisNetwork =\n // Known limitation: checks only the native token balance. If this\n // account has any other tokens than native ones, this check will\n // fail to detect that the account was used on this network.\n acc.balance > BigInt(0) ||\n (acc.isEOA\n ? acc.nonce > BigInt(0)\n : // For smart accounts, check for 'isDeployed' instead because in\n // the erc-4337 scenario many cases might be missed with checking\n // the `acc.nonce`. For instance, `acc.nonce` could be 0, but user\n // might be actively using the account. This is because in erc-4337,\n // we use the entry point nonce. However, detecting the entry point\n // nonce is also not okay, because for various cases we do not use\n // sequential nonce - i.e., the entry point nonce could still be 0,\n // but the account is deployed. So the 'isDeployed' check is the\n // only reliable way to detect if account is used on network.\n acc.isDeployed)\n if (isUsedOnThisNetwork) {\n accountsObj[acc.accountAddr].account.usedOnNetworks.push(network)\n }\n })\n }\n })\n\n await Promise.all(promises)\n\n const finalAccountsWithNetworksArray = Object.values(accountsObj)\n\n // Preserve the original order of networks based on usedOnNetworks\n const sortedAccountsWithNetworksArray = finalAccountsWithNetworksArray.sort((a, b) => {\n const networkIdsA = a.account.usedOnNetworks.map((network) => network.id)\n const networkIdsB = b.account.usedOnNetworks.map((network) => network.id)\n const networkIndexA = this.#networks.networks.findIndex((network) =>\n networkIdsA.includes(network.id)\n )\n const networkIndexB = this.#networks.networks.findIndex((network) =>\n networkIdsB.includes(network.id)\n )\n return networkIndexA - networkIndexB\n })\n\n return sortedAccountsWithNetworksArray\n }\n\n async #findAndSetLinkedAccounts({ accounts }: { accounts: Account[] }) {\n if (!this.shouldSearchForLinkedAccounts) return\n\n if (accounts.length === 0) return\n\n this.linkedAccountsLoading = true\n this.emitUpdate()\n\n const keys = accounts.map((acc) => `keys[]=${acc.addr}`).join('&')\n const url = `/v2/account-by-key/linked/accounts?${keys}`\n\n const { data } = await this.#callRelayer(url)\n const linkedAccounts: { account: Account; isLinked: boolean }[] = Object.keys(\n data.accounts\n ).flatMap((addr: string) => {\n // In extremely rare cases, on the Relayer, the identity data could be\n // missing in the identities table but could exist in the logs table.\n // When this happens, the account data will be `null`.\n const isIdentityDataMissing = !data.accounts[addr]\n if (isIdentityDataMissing) {\n // Same error for both cases, because most prob\n this.emitError({\n level: 'minor',\n message: `The address ${addr} is not linked to an Ambire account. Please try again later or contact support if the problem persists.`,\n error: new Error(\n `The address ${addr} is not linked to an Ambire account. This could be because the identity data is missing in the identities table but could exist in the logs table.`\n )\n })\n\n return []\n }\n\n const { factoryAddr, bytecode, salt, associatedKeys } = data.accounts[addr]\n // Checks whether the account.addr matches the addr generated from the\n // factory. Should never happen, but could be a possible attack vector.\n const isInvalidAddress =\n getCreate2Address(factoryAddr, salt, keccak256(bytecode)).toLowerCase() !==\n addr.toLowerCase()\n if (isInvalidAddress) {\n const message = `The address ${addr} can't be verified to be a smart account address.`\n this.emitError({ level: 'minor', message, error: new Error(message) })\n\n return []\n }\n\n const existingAccount = this.#accounts.accounts.find((acc) => acc.addr === addr)\n return [\n {\n account: {\n addr,\n associatedKeys: Object.keys(associatedKeys),\n initialPrivileges: data.accounts[addr].initialPrivilegesAddrs.map((address: string) => [\n address,\n // this is a default privilege hex we add on account creation\n '0x0000000000000000000000000000000000000000000000000000000000000001'\n ]),\n creation: {\n factoryAddr,\n bytecode,\n salt\n },\n preferences: {\n label: existingAccount?.preferences.label || DEFAULT_ACCOUNT_LABEL,\n pfp: existingAccount?.preferences?.pfp || addr\n }\n },\n isLinked: true\n }\n ]\n })\n\n const linkedAccountsWithNetworks = await this.#getAccountsUsedOnNetworks({\n accounts: linkedAccounts as any\n })\n\n this.#linkedAccounts = linkedAccountsWithNetworks\n this.#verifyLinkedAccounts()\n\n this.linkedAccountsLoading = false\n this.emitUpdate()\n }\n\n /**\n * The corresponding derived account for the linked accounts should always be found,\n * except when something is wrong with the data we have stored on the Relayer.\n * Also, could be an attack vector. So indicate to the user that something is wrong.\n */\n #verifyLinkedAccounts() {\n this.#linkedAccounts.forEach((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found,\n // except something is wrong with the data we have stored on the Relayer\n if (!correspondingDerivedAccount) {\n this.emitError({\n level: 'major',\n message: `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}. Please start the process again. If the problem persists, contact support.`,\n error: new Error(\n `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}.`\n )\n })\n }\n })\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error(\n 'accountAdder: requested a method of the AccountAdder controller, but the controller was not initialized'\n )\n })\n }\n\n #throwMissingKeyIterator() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error('accountAdder: missing keyIterator')\n })\n }\n\n #throwMissingKeyIteratorRetrieveInternalKeysMethod() {\n this.emitError({\n level: 'major',\n message:\n 'Retrieving internal keys failed. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing retrieveInternalKeys method')\n })\n }\n\n #throwMissingHdPath() {\n this.emitError({\n level: 'major',\n message:\n 'The HD path template is missing. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing hdPathTemplate')\n })\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n // includes the getter in the stringified instance\n accountsOnPage: this.accountsOnPage,\n type: this.type,\n subType: this.subType,\n isPageLocked: this.isPageLocked\n }\n }\n}\n\nexport default AccountAdderController\n"]} \ No newline at end of file +{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/controllers/accountAdder/accountAdder.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCreate2Address, keccak256 } from 'ethers'\n\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport {\n Account,\n AccountOnchainState,\n AccountOnPage,\n AccountWithNetworkMeta,\n DerivedAccount,\n DerivedAccountWithoutNetworkMeta,\n SelectedAccountForImport\n} from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { dedicatedToOneSAPriv, ReadyToAddKeys } from '../../interfaces/keystore'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport {\n getAccountImportStatus,\n getBasicAccount,\n getDefaultAccountPreferences,\n getEmailAccount,\n getSmartAccount,\n isAmbireV1LinkedAccount,\n isDerivedForSmartAccountKeyOnly,\n isSmartAccount\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_PAGE = 1\nexport const DEFAULT_PAGE_SIZE = 5\nconst DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS = true\nconst DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS = true\n\n/**\n * Account Adder Controller\n * is responsible for listing accounts that can be selected for adding, and for\n * adding (creating) identity for the smart accounts (if needed) on the Relayer.\n * It uses a KeyIterator interface allow iterating all the keys in a specific\n * underlying store such as a hardware device or an object holding a seed.\n */\nexport class AccountAdderController extends EventEmitter {\n #callRelayer: Function\n\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n #keyIterator?: KeyIterator | null\n\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n\n isInitialized: boolean = false\n\n isInitializedWithSavedSeed: boolean = false\n\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n /* This is only the index of the current page */\n page: number = DEFAULT_PAGE\n\n /* The number of accounts to be displayed on a single page */\n pageSize: number = DEFAULT_PAGE_SIZE\n\n /* State to indicate the page requested fails to load (and the reason why) */\n pageError: null | string = null\n\n selectedAccounts: SelectedAccountForImport[] = []\n\n // Accounts which identity is created on the Relayer (if needed), and are ready\n // to be added to the user's account list by the Main Controller\n readyToAddAccounts: Account[] = []\n\n // The keys for the `readyToAddAccounts`, that are ready to be added to the\n // user's keystore by the Main Controller\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n\n // Identity for the smart accounts must be created on the Relayer, this\n // represents the status of the operation, needed managing UI state\n addAccountsStatus: 'LOADING' | 'SUCCESS' | 'INITIAL' = 'INITIAL'\n\n accountsLoading: boolean = false\n\n linkedAccountsLoading: boolean = false\n\n networksWithAccountStateError: NetworkId[] = []\n\n #derivedAccounts: DerivedAccount[] = []\n\n #linkedAccounts: { account: AccountWithNetworkMeta; isLinked: boolean }[] = []\n\n // This prevents the recalculation of getters that use accounts during the execution of addAccounts.\n // Without this, the controller incorrectly identifies newly added accounts as those from a previous session,\n // leading to unpredictable behavior on the AccountAdderScreen\n #alreadyImportedAccountsOnControllerInit: Account[] = []\n\n constructor({\n accounts,\n keystore,\n networks,\n providers,\n relayerUrl,\n fetch\n }: {\n accounts: AccountsController\n keystore: KeystoreController\n networks: NetworksController\n providers: ProvidersController\n relayerUrl: string\n fetch: Fetch\n }) {\n super()\n this.#accounts = accounts\n this.#keystore = keystore\n this.#networks = networks\n this.#providers = providers\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n get accountsOnPage(): AccountOnPage[] {\n const processedAccounts = this.#derivedAccounts\n // The displayed (visible) accounts on page should not include the derived\n // EOA (basic) accounts only used as smart account keys, they should not\n // be visible nor importable (or selectable).\n .filter((x) => !isDerivedForSmartAccountKeyOnly(x.index))\n .flatMap((derivedAccount) => {\n const associatedLinkedAccounts = this.#linkedAccounts.filter(\n (linkedAcc) =>\n !isSmartAccount(derivedAccount.account) &&\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n const correspondingSmartAccount = this.#derivedAccounts.find(\n (acc) => isSmartAccount(acc.account) && acc.slot === derivedAccount.slot\n )\n\n let accountsToReturn: Omit[] = []\n\n if (!isSmartAccount(derivedAccount.account)) {\n accountsToReturn.push(derivedAccount)\n\n const duplicate = associatedLinkedAccounts.find(\n (linkedAcc) => linkedAcc.account.addr === correspondingSmartAccount?.account?.addr\n )\n\n // The derived smart account that matches the relayer's linked account\n // should not be displayed as linked account. Use this cycle to mark it.\n if (duplicate) duplicate.isLinked = false\n\n if (!duplicate && correspondingSmartAccount) {\n accountsToReturn.push(correspondingSmartAccount)\n }\n }\n\n accountsToReturn = accountsToReturn.concat(\n associatedLinkedAccounts.map((linkedAcc) => ({\n ...linkedAcc,\n slot: derivedAccount.slot,\n index: derivedAccount.index\n }))\n )\n\n return accountsToReturn\n })\n\n const unprocessedLinkedAccounts = this.#linkedAccounts\n .filter(\n (linkedAcc) =>\n !processedAccounts.find(\n (processedAcc) => processedAcc?.account.addr === linkedAcc.account.addr\n )\n )\n // Use `flatMap` instead of `map` in order to auto remove missing values.\n // The `flatMap` has a built-in mechanism to flatten the array and remove\n // null or undefined values (by returning empty array).\n .flatMap((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found, except when\n // something is wrong with the data we have stored on the Relayer.\n // The this.#verifyLinkedAndDerivedAccounts() method should have\n // already emitted an error in that case. Do not emit here, since\n // this is a getter method (and emitting here is a no-go).\n if (!correspondingDerivedAccount) return []\n\n return [\n {\n ...linkedAcc,\n slot: correspondingDerivedAccount.slot,\n index: correspondingDerivedAccount.index\n }\n ]\n })\n\n const mergedAccounts = [...processedAccounts, ...unprocessedLinkedAccounts]\n\n mergedAccounts.sort((a, b) => {\n const prioritizeAccountType = (item: any) => {\n if (!isSmartAccount(item.account)) return -1\n if (item.isLinked) return 1\n\n return 0\n }\n\n return prioritizeAccountType(a) - prioritizeAccountType(b) || a.slot - b.slot\n })\n\n return mergedAccounts.map((acc) => ({\n ...acc,\n importStatus: getAccountImportStatus({\n account: acc.account,\n alreadyImportedAccounts: this.#alreadyImportedAccountsOnControllerInit,\n keys: this.#keystore.keys,\n accountsOnPage: mergedAccounts,\n keyIteratorType: this.#keyIterator?.type\n })\n }))\n }\n\n async #isKeyIteratorInitializedWithTheSavedSeed() {\n if (this.#keyIterator?.subType !== 'seed') return false\n\n if (!this.#keystore.hasKeystoreSavedSeed) return false\n\n const savedSeed = await this.#keystore.getSavedSeed()\n if (!savedSeed) return false\n\n return !!this.#keyIterator?.isSeedMatching?.(savedSeed.seed)\n }\n\n async #getInitialHdPathTemplate(defaultHdPathTemplate: HD_PATH_TEMPLATE_TYPE) {\n if (!this.isInitializedWithSavedSeed) return defaultHdPathTemplate\n\n const savedSeed = await this.#keystore.getSavedSeed()\n return savedSeed.hdPathTemplate || defaultHdPathTemplate\n }\n\n async init({\n keyIterator,\n page,\n pageSize,\n hdPathTemplate,\n shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS,\n shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n }: {\n keyIterator: KeyIterator | null\n page?: number\n pageSize?: number\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n shouldSearchForLinkedAccounts?: boolean\n shouldGetAccountsUsedOnNetworks?: boolean\n }) {\n this.#keyIterator = keyIterator\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page || DEFAULT_PAGE\n this.pageSize = pageSize || DEFAULT_PAGE_SIZE\n this.isInitializedWithSavedSeed = await this.#isKeyIteratorInitializedWithTheSavedSeed()\n this.hdPathTemplate = await this.#getInitialHdPathTemplate(hdPathTemplate)\n this.isInitialized = true\n this.#alreadyImportedAccountsOnControllerInit = this.#accounts.accounts\n this.shouldSearchForLinkedAccounts = shouldSearchForLinkedAccounts\n this.shouldGetAccountsUsedOnNetworks = shouldGetAccountsUsedOnNetworks\n\n this.emitUpdate()\n }\n\n get type() {\n return this.#keyIterator?.type\n }\n\n get subType() {\n return this.#keyIterator?.subType\n }\n\n reset() {\n this.#keyIterator = null\n this.selectedAccounts = []\n this.page = DEFAULT_PAGE\n this.pageSize = DEFAULT_PAGE_SIZE\n this.hdPathTemplate = undefined\n this.shouldSearchForLinkedAccounts = DEFAULT_SHOULD_SEARCH_FOR_LINKED_ACCOUNTS\n this.shouldGetAccountsUsedOnNetworks = DEFAULT_SHOULD_GET_ACCOUNTS_USED_ON_NETWORKS\n\n this.addAccountsStatus = 'INITIAL'\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.readyToAddAccounts = []\n this.networksWithAccountStateError = []\n this.readyToAddKeys = { internal: [], external: [] }\n this.isInitialized = false\n this.isInitializedWithSavedSeed = false\n\n this.emitUpdate()\n }\n\n async setHDPathTemplate({ hdPathTemplate }: { hdPathTemplate: HD_PATH_TEMPLATE_TYPE }) {\n this.hdPathTemplate = hdPathTemplate\n\n // Reset the currently selected accounts, because for the keys of these\n // accounts, as of v4.32.0, we don't store their hd path. When import\n // completes, only the latest hd path of the controller is stored.\n this.selectedAccounts = []\n\n await this.setPage({ page: DEFAULT_PAGE }) // takes the user back on the first page\n }\n\n #getAccountKeys(account: Account, accountsOnPageWithThisAcc: AccountOnPage[]) {\n // should never happen\n if (accountsOnPageWithThisAcc.length === 0) {\n console.error(`accountAdder: account ${account.addr} was not found in the accountsOnPage.`)\n return []\n }\n\n // Case 1: The account is a Basic account\n const isBasicAcc = !isSmartAccount(account)\n // The key of the Basic account is the basic account itself\n if (isBasicAcc) return accountsOnPageWithThisAcc\n\n // Case 2: The account is a Smart account, but not a linked one\n const isSmartAccountAndNotLinked =\n isSmartAccount(account) &&\n accountsOnPageWithThisAcc.length === 1 &&\n accountsOnPageWithThisAcc[0].isLinked === false\n\n if (isSmartAccountAndNotLinked) {\n // The key of the smart account is the Basic account on the same slot\n // that is explicitly derived for a smart account key only.\n const basicAccOnThisSlotDerivedForSmartAccKey = this.#derivedAccounts.find(\n (a) =>\n a.slot === accountsOnPageWithThisAcc[0].slot &&\n !isSmartAccount(a.account) &&\n isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlotDerivedForSmartAccKey\n ? [basicAccOnThisSlotDerivedForSmartAccKey]\n : []\n }\n\n // Case 3: The account is a Smart account and a linked one. For this case,\n // there could exist multiple keys (basic accounts) found on different slots.\n const basicAccOnEverySlotWhereThisAddrIsFound = accountsOnPageWithThisAcc\n .map((a) => a.slot)\n .flatMap((slot) => {\n const basicAccOnThisSlot = this.#derivedAccounts.find(\n (a) =>\n a.slot === slot &&\n !isSmartAccount(a.account) &&\n // The key of the linked account is always the EOA (basic) account\n // on the same slot that is not explicitly used for smart account keys only.\n !isDerivedForSmartAccountKeyOnly(a.index)\n )\n\n return basicAccOnThisSlot ? [basicAccOnThisSlot] : []\n })\n\n return basicAccOnEverySlotWhereThisAddrIsFound\n }\n\n selectAccount(_account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n // Needed, because linked accounts could have multiple keys (basic accounts),\n // and therefore - same linked account could be found on different slots.\n const accountsOnPageWithThisAcc = this.accountsOnPage.filter(\n (accOnPage) => accOnPage.account.addr === _account.addr\n )\n const accountKeys = this.#getAccountKeys(_account, accountsOnPageWithThisAcc)\n if (!accountKeys.length)\n return this.emitError({\n level: 'major',\n message: `Selecting ${_account.addr} account failed because the details for this account are missing. Please try again or contact support if the problem persists.`,\n error: new Error(\n `Trying to select ${_account.addr} account, but this account was not found in the accountsOnPage or it's keys were not found.`\n )\n })\n\n const nextSelectedAccount = {\n account: _account,\n // If the account has more than 1 key, it is for sure linked account,\n // since Basic accounts have only 1 key and smart accounts with more than\n // one key present should always be found as linked accounts anyways.\n isLinked: accountKeys.length > 1,\n accountKeys: accountKeys.map((a) => ({\n addr: a.account.addr,\n slot: a.slot,\n index: a.index\n }))\n }\n\n const accountExists = this.selectedAccounts.some(\n (x) => x.account.addr === nextSelectedAccount.account.addr\n )\n if (accountExists) {\n // If the account exists, replace it with the new one, to make sure\n // the latest data is used. We could add one more sub-step to skip this,\n // if we do a deep comparison, but that would probably be an overkill.\n this.selectedAccounts = this.selectedAccounts.map((x) =>\n x.account.addr === nextSelectedAccount.account.addr ? nextSelectedAccount : x\n )\n } else {\n this.selectedAccounts.push(nextSelectedAccount)\n }\n\n this.emitUpdate()\n }\n\n deselectAccount(account: Account) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const accIdx = this.selectedAccounts.findIndex((x) => x.account.addr === account.addr)\n\n if (accIdx !== -1) {\n this.selectedAccounts = this.selectedAccounts.filter((_, i) => i !== accIdx)\n this.emitUpdate()\n } else {\n return this.emitError({\n level: 'major',\n message: 'This account cannot be deselected. Please reload and try again.',\n error: new Error('accountAdder: account not found. Cannot deselect.')\n })\n }\n }\n\n /**\n * For internal keys only! Returns the ready to be added internal (private)\n * keys of the currently selected accounts.\n */\n retrieveInternalKeysOfSelectedAccounts() {\n if (!this.hdPathTemplate) {\n this.#throwMissingHdPath()\n return []\n }\n\n if (!this.#keyIterator?.retrieveInternalKeys) {\n this.#throwMissingKeyIteratorRetrieveInternalKeysMethod()\n return []\n }\n\n return this.#keyIterator?.retrieveInternalKeys(\n this.selectedAccounts,\n this.hdPathTemplate,\n this.#keystore.keys\n )\n }\n\n /**\n * Prevents requesting the next page before the current one is fully loaded.\n * This avoids race conditions where the user requests the next page before\n * linked accounts are fully loaded, causing misleadingly failing `#verifyLinkedAccounts` checks.\n */\n get isPageLocked() {\n return this.accountsLoading || this.linkedAccountsLoading\n }\n\n async setPage({ page = this.page }: { page: number }): Promise {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n this.page = page\n this.pageError = null\n this.#derivedAccounts = []\n this.#linkedAccounts = []\n this.accountsLoading = true\n this.networksWithAccountStateError = []\n this.emitUpdate()\n\n if (page <= 0) {\n this.pageError = `Unexpected page was requested (page ${page}). Please try again or contact support for help.`\n this.page = DEFAULT_PAGE // fallback to the default (initial) page\n this.emitUpdate()\n return\n }\n\n try {\n this.#derivedAccounts = await this.#deriveAccounts()\n\n if (this.#keyIterator?.type === 'internal' && this.#keyIterator?.subType === 'private-key') {\n const accountsOnPageWithoutTheLinked = this.accountsOnPage.filter((acc) => !acc.isLinked)\n const usedAccounts = accountsOnPageWithoutTheLinked.filter(\n (acc) => acc.account.usedOnNetworks.length\n )\n\n // If at least one account is used - preselect all accounts on the page\n // (except the linked ones). Usually there are are two accounts\n // (since the private key flow gas `pageSize` of 1)\n if (usedAccounts.length) {\n accountsOnPageWithoutTheLinked.forEach((acc) => this.selectAccount(acc.account))\n }\n }\n } catch (e: any) {\n const fallbackMessage = `Failed to retrieve accounts on page ${this.page}. Please try again or contact support for assistance. Error details: ${e?.message}.`\n this.pageError = e instanceof ExternalSignerError ? e.message : fallbackMessage\n }\n this.accountsLoading = false\n this.emitUpdate()\n\n await this.#findAndSetLinkedAccounts({\n accounts: this.#derivedAccounts\n .filter(\n (acc) =>\n // Search for linked accounts to the basic (EOA) accounts only.\n // Searching for linked accounts to another Ambire smart accounts\n // is a feature that Ambire is yet to support.\n !isSmartAccount(acc.account) &&\n // Skip searching for linked accounts to the derived EOA (basic)\n // accounts that are used for smart account keys only. They are\n // solely purposed to manage 1 particular (smart) account,\n // not at all for linking.\n !isDerivedForSmartAccountKeyOnly(acc.index)\n )\n .map((acc) => acc.account)\n })\n }\n\n /**\n * Triggers the process of adding accounts via the AccountAdder flow by\n * creating identity for the smart accounts (if needed) on the Relayer.\n * Then the `onAccountAdderSuccess` listener in the Main Controller gets\n * triggered, which uses the `readyToAdd...` properties to further set\n * the newly added accounts data (like preferences, keys and others)\n */\n async addAccounts(\n accounts: SelectedAccountForImport[] = [],\n readyToAddKeys: ReadyToAddKeys = { internal: [], external: [] }\n ) {\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n if (!accounts.length) {\n return this.emitError({\n level: 'minor',\n message:\n 'Trying to add accounts, but no accounts are selected. Please select at least one account.',\n error: new Error(\n 'accountAdder: requested method `addAccounts`, but the accounts param is empty'\n )\n })\n }\n\n this.addAccountsStatus = 'LOADING'\n await this.forceEmitUpdate()\n\n let newlyCreatedAccounts: Account['addr'][] = []\n const accountsToAddOnRelayer: SelectedAccountForImport[] = accounts\n // Identity only for the smart accounts must be created on the Relayer\n .filter((x) => isSmartAccount(x.account))\n // Skip creating identity for Ambire v1 smart accounts\n .filter((x) => !isAmbireV1LinkedAccount(x.account.creation?.factoryAddr))\n\n if (accountsToAddOnRelayer.length) {\n const body = accountsToAddOnRelayer.map(({ account }: SelectedAccountForImport) => ({\n addr: account.addr,\n ...(account.email ? { email: account.email } : {}),\n associatedKeys: account.initialPrivileges,\n creation: {\n factoryAddr: account.creation!.factoryAddr,\n salt: account.creation!.salt,\n baseIdentityAddr: PROXY_AMBIRE_ACCOUNT\n }\n }))\n\n try {\n const res = await this.#callRelayer('/v2/identity/create-multiple', 'POST', {\n accounts: body\n })\n\n if (!res.success) {\n throw new Error(res?.message || 'No response received from the Ambire Relayer.')\n }\n\n type AccResType = {\n identity: string\n status: {\n created: boolean\n reason?: string\n }\n }\n\n type BodyType = AccResType[]\n if (res.body) {\n newlyCreatedAccounts = (res.body as BodyType)\n .filter((acc: AccResType) => acc.status.created)\n .map((acc: AccResType) => acc.identity)\n }\n } catch (e: any) {\n this.emitError({\n level: 'major',\n message:\n 'Error when adding accounts on the Ambire Relayer. Please try again later or contact support if the problem persists.',\n error: new Error(e?.message)\n })\n\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n return\n }\n }\n\n this.readyToAddAccounts = [\n ...accounts.map((x, i) => {\n const alreadyImportedAcc = this.#accounts.accounts.find((a) => a.addr === x.account.addr)\n\n return {\n ...x.account,\n // Persist the already imported account preferences on purpose, otherwise,\n // re-importing the same account via different key type(s) would reset them.\n preferences: alreadyImportedAcc\n ? alreadyImportedAcc.preferences\n : getDefaultAccountPreferences(x.account.addr, this.#accounts.accounts, i),\n newlyCreated: newlyCreatedAccounts.includes(x.account.addr)\n }\n })\n ]\n this.readyToAddKeys = readyToAddKeys\n this.addAccountsStatus = 'SUCCESS'\n await this.forceEmitUpdate()\n\n // reset the addAccountsStatus in the next tick to ensure the FE receives the 'SUCCESS' state\n this.addAccountsStatus = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n async createAndAddEmailAccount(selectedAccount: SelectedAccountForImport) {\n const {\n account: { email },\n accountKeys: [recoveryKey]\n } = selectedAccount\n if (!this.isInitialized) return this.#throwNotInitialized()\n if (!this.#keyIterator) return this.#throwMissingKeyIterator()\n\n const keyPublicAddress: string = (await this.#keyIterator.retrieve([{ from: 0, to: 1 }]))[0]\n\n const emailSmartAccount = await getEmailAccount(\n {\n emailFrom: email!,\n secondaryKey: recoveryKey.addr\n },\n keyPublicAddress\n )\n\n await this.addAccounts([{ ...selectedAccount, account: { ...emailSmartAccount, email } }])\n }\n\n // updates the account adder state so the main ctrl receives the readyToAddAccounts\n // that should be added to the storage of the app\n async addExistingEmailAccounts(accounts: Account[]) {\n // There is no need to call the addAccounts method in order to add that\n // account to the relayer because this func will be called only for accounts returned\n // from relayer that only need to be stored in the storage of the app\n this.readyToAddAccounts = accounts\n this.addAccountsStatus = 'SUCCESS'\n this.emitUpdate()\n }\n\n removeNetworkData(id: Network['id']) {\n this.networksWithAccountStateError = this.networksWithAccountStateError.filter((x) => x !== id)\n this.emitUpdate()\n }\n\n async #deriveAccounts(): Promise {\n // Should never happen, because before the #deriveAccounts method gets\n // called - there is a check if the #keyIterator exists.\n if (!this.#keyIterator) {\n console.error('accountAdder: missing keyIterator')\n return []\n }\n\n const accounts: DerivedAccountWithoutNetworkMeta[] = []\n\n const startIdx = (this.page - 1) * this.pageSize\n const endIdx = (this.page - 1) * this.pageSize + (this.pageSize - 1)\n\n const indicesToRetrieve = [\n { from: startIdx, to: endIdx } // Indices for the basic (EOA) accounts\n ]\n // Since v4.31.0, do not retrieve smart accounts for the private key\n // type. That's because we can't use the common derivation offset\n // (SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET), and deriving smart\n // accounts out of the private key (with another approach - salt and\n // extra entropy) was creating confusion.\n const shouldRetrieveSmartAccountIndices = this.#keyIterator.type !== 'private-key'\n if (shouldRetrieveSmartAccountIndices) {\n // Indices for the smart accounts.\n indicesToRetrieve.push({\n from: startIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET,\n to: endIdx + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n })\n }\n // Combine the requests for all accounts in one call to the keyIterator.\n // That's optimization primarily focused on hardware wallets, to reduce the\n // number of calls to the hardware device. This is important, especially\n // for Trezor, because it fires a confirmation popup for each call.\n const combinedBasicAndSmartAccKeys = await this.#keyIterator.retrieve(\n indicesToRetrieve,\n this.hdPathTemplate\n )\n\n const basicAccKeys = combinedBasicAndSmartAccKeys.slice(0, this.pageSize)\n const smartAccKeys = combinedBasicAndSmartAccKeys.slice(\n this.pageSize,\n combinedBasicAndSmartAccKeys.length\n )\n\n const smartAccountsPromises: Promise[] = []\n // Replace the parallel getKeys with foreach to prevent issues with Ledger,\n // which can only handle one request at a time.\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, smartAccKey] of smartAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The derived EOA (basic) account which is the key for the smart account\n const account = getBasicAccount(smartAccKey, this.#accounts.accounts)\n const indexWithOffset = slot - 1 + SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n accounts.push({ account, isLinked: false, slot, index: indexWithOffset })\n\n // Derive the Ambire (smart) account\n smartAccountsPromises.push(\n getSmartAccount(\n [{ addr: smartAccKey, hash: dedicatedToOneSAPriv }],\n this.#accounts.accounts\n )\n .then((smartAccount) => {\n return { account: smartAccount, isLinked: false, slot, index: slot - 1 }\n })\n // If the error isn't caught here and the promise is rejected, Promise.all\n // will be rejected entirely.\n .catch(() => {\n // No need for emitting an error here, because a relevant error is already\n // emitted in the method #getAccountsUsedOnNetworks\n return null\n })\n )\n }\n\n const unfilteredSmartAccountsList = await Promise.all(smartAccountsPromises)\n const smartAccounts = unfilteredSmartAccountsList.filter(\n (x) => x !== null\n ) as DerivedAccountWithoutNetworkMeta[]\n\n accounts.push(...smartAccounts)\n\n // eslint-disable-next-line no-restricted-syntax\n for (const [index, basicAccKey] of basicAccKeys.entries()) {\n const slot = startIdx + (index + 1)\n\n // The EOA (basic) account on this slot\n const account = getBasicAccount(basicAccKey, this.#accounts.accounts)\n accounts.push({ account, isLinked: false, slot, index: slot - 1 })\n }\n\n const accountsWithNetworks = await this.#getAccountsUsedOnNetworks({ accounts })\n\n return accountsWithNetworks\n }\n\n // inner func\n // eslint-disable-next-line class-methods-use-this\n async #getAccountsUsedOnNetworks({\n accounts\n }: {\n accounts: DerivedAccountWithoutNetworkMeta[]\n }): Promise {\n if (!this.shouldGetAccountsUsedOnNetworks) {\n return accounts.map((a) => ({ ...a, account: { ...a.account, usedOnNetworks: [] } }))\n }\n\n const accountsObj: { [key: Account['addr']]: DerivedAccount } = Object.fromEntries(\n accounts.map((a) => [a.account.addr, { ...a, account: { ...a.account, usedOnNetworks: [] } }])\n )\n\n const networkLookup: { [key: NetworkId]: Network } = {}\n this.#networks.networks.forEach((network) => {\n networkLookup[network.id] = network\n })\n\n const promises = Object.keys(this.#providers.providers).map(async (providerKey: NetworkId) => {\n const network = networkLookup[providerKey]\n if (network) {\n const accountState = await getAccountState(\n this.#providers.providers[providerKey],\n network,\n accounts.map((acc) => acc.account)\n ).catch(() => {\n console.error('accountAdder: failed to get account state on ', providerKey)\n if (this.networksWithAccountStateError.includes(providerKey)) return\n this.networksWithAccountStateError.push(providerKey)\n })\n\n if (!accountState) return\n\n accountState.forEach((acc: AccountOnchainState) => {\n const isUsedOnThisNetwork =\n // Known limitation: checks only the native token balance. If this\n // account has any other tokens than native ones, this check will\n // fail to detect that the account was used on this network.\n acc.balance > BigInt(0) ||\n (acc.isEOA\n ? acc.nonce > BigInt(0)\n : // For smart accounts, check for 'isDeployed' instead because in\n // the erc-4337 scenario many cases might be missed with checking\n // the `acc.nonce`. For instance, `acc.nonce` could be 0, but user\n // might be actively using the account. This is because in erc-4337,\n // we use the entry point nonce. However, detecting the entry point\n // nonce is also not okay, because for various cases we do not use\n // sequential nonce - i.e., the entry point nonce could still be 0,\n // but the account is deployed. So the 'isDeployed' check is the\n // only reliable way to detect if account is used on network.\n acc.isDeployed)\n if (isUsedOnThisNetwork) {\n accountsObj[acc.accountAddr].account.usedOnNetworks.push(network)\n }\n })\n }\n })\n\n await Promise.all(promises)\n\n const finalAccountsWithNetworksArray = Object.values(accountsObj)\n\n // Preserve the original order of networks based on usedOnNetworks\n const sortedAccountsWithNetworksArray = finalAccountsWithNetworksArray.sort((a, b) => {\n const networkIdsA = a.account.usedOnNetworks.map((network) => network.id)\n const networkIdsB = b.account.usedOnNetworks.map((network) => network.id)\n const networkIndexA = this.#networks.networks.findIndex((network) =>\n networkIdsA.includes(network.id)\n )\n const networkIndexB = this.#networks.networks.findIndex((network) =>\n networkIdsB.includes(network.id)\n )\n return networkIndexA - networkIndexB\n })\n\n return sortedAccountsWithNetworksArray\n }\n\n async #findAndSetLinkedAccounts({ accounts }: { accounts: Account[] }) {\n if (!this.shouldSearchForLinkedAccounts) return\n\n if (accounts.length === 0) return\n\n this.linkedAccountsLoading = true\n this.emitUpdate()\n\n const keys = accounts.map((acc) => `keys[]=${acc.addr}`).join('&')\n const url = `/v2/account-by-key/linked/accounts?${keys}`\n\n const { data } = await this.#callRelayer(url)\n const linkedAccounts: { account: Account; isLinked: boolean }[] = Object.keys(\n data.accounts\n ).flatMap((addr: string) => {\n // In extremely rare cases, on the Relayer, the identity data could be\n // missing in the identities table but could exist in the logs table.\n // When this happens, the account data will be `null`.\n const isIdentityDataMissing = !data.accounts[addr]\n if (isIdentityDataMissing) {\n // Same error for both cases, because most prob\n this.emitError({\n level: 'minor',\n message: `The address ${addr} is not linked to an Ambire account. Please try again later or contact support if the problem persists.`,\n error: new Error(\n `The address ${addr} is not linked to an Ambire account. This could be because the identity data is missing in the identities table but could exist in the logs table.`\n )\n })\n\n return []\n }\n\n const { factoryAddr, bytecode, salt, associatedKeys } = data.accounts[addr]\n // Checks whether the account.addr matches the addr generated from the\n // factory. Should never happen, but could be a possible attack vector.\n const isInvalidAddress =\n getCreate2Address(factoryAddr, salt, keccak256(bytecode)).toLowerCase() !==\n addr.toLowerCase()\n if (isInvalidAddress) {\n const message = `The address ${addr} can't be verified to be a smart account address.`\n this.emitError({ level: 'minor', message, error: new Error(message) })\n\n return []\n }\n\n const existingAccount = this.#accounts.accounts.find((acc) => acc.addr === addr)\n return [\n {\n account: {\n addr,\n associatedKeys: Object.keys(associatedKeys),\n initialPrivileges: data.accounts[addr].initialPrivilegesAddrs.map((address: string) => [\n address,\n // this is a default privilege hex we add on account creation\n '0x0000000000000000000000000000000000000000000000000000000000000001'\n ]),\n creation: {\n factoryAddr,\n bytecode,\n salt\n },\n preferences: {\n label: existingAccount?.preferences.label || DEFAULT_ACCOUNT_LABEL,\n pfp: existingAccount?.preferences?.pfp || addr\n }\n },\n isLinked: true\n }\n ]\n })\n\n const linkedAccountsWithNetworks = await this.#getAccountsUsedOnNetworks({\n accounts: linkedAccounts as any\n })\n\n this.#linkedAccounts = linkedAccountsWithNetworks\n this.#verifyLinkedAccounts()\n\n this.linkedAccountsLoading = false\n this.emitUpdate()\n }\n\n /**\n * The corresponding derived account for the linked accounts should always be found,\n * except when something is wrong with the data we have stored on the Relayer.\n * Also, could be an attack vector. So indicate to the user that something is wrong.\n */\n #verifyLinkedAccounts() {\n this.#linkedAccounts.forEach((linkedAcc) => {\n const correspondingDerivedAccount = this.#derivedAccounts.find((derivedAccount) =>\n linkedAcc.account.associatedKeys.includes(derivedAccount.account.addr)\n )\n\n // The `correspondingDerivedAccount` should always be found,\n // except something is wrong with the data we have stored on the Relayer\n if (!correspondingDerivedAccount) {\n this.emitError({\n level: 'major',\n message: `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}. Please start the process again. If the problem persists, contact support.`,\n error: new Error(\n `Something went wrong with finding the corresponding account in the associated keys of the linked account with address ${linkedAcc.account.addr}.`\n )\n })\n }\n })\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error(\n 'accountAdder: requested a method of the AccountAdder controller, but the controller was not initialized'\n )\n })\n }\n\n #throwMissingKeyIterator() {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong with deriving the accounts. Please start the process again. If the problem persists, contact support.',\n error: new Error('accountAdder: missing keyIterator')\n })\n }\n\n #throwMissingKeyIteratorRetrieveInternalKeysMethod() {\n this.emitError({\n level: 'major',\n message:\n 'Retrieving internal keys failed. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing retrieveInternalKeys method')\n })\n }\n\n #throwMissingHdPath() {\n this.emitError({\n level: 'major',\n message:\n 'The HD path template is missing. Please try to start the process of selecting accounts again. If the problem persist, please contact support.',\n error: new Error('accountAdder: missing hdPathTemplate')\n })\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n // includes the getter in the stringified instance\n accountsOnPage: this.accountsOnPage,\n type: this.type,\n subType: this.subType,\n isPageLocked: this.isPageLocked\n }\n }\n}\n\nexport default AccountAdderController\n"]} \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.js b/dist/src/controllers/accounts/accounts.js index c84fc0b2b..bea475205 100644 --- a/dist/src/controllers/accounts/accounts.js +++ b/dist/src/controllers/accounts/accounts.js @@ -1,12 +1,16 @@ -import { getAddress, isAddress } from 'ethers'; -import { getUniqueAccountsArray, migrateAccountPreferencesToAccounts } from '../../libs/account/account'; -import { getAccountState } from '../../libs/accountState/accountState'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AccountsController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const account_1 = require("../../libs/account/account"); +const accountState_1 = require("../../libs/accountState/accountState"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const STATUS_WRAPPED_METHODS = { selectAccount: 'INITIAL', updateAccountPreferences: 'INITIAL' }; -export class AccountsController extends EventEmitter { +class AccountsController extends eventEmitter_1.default { #storage; #networks; #providers; @@ -38,12 +42,12 @@ export class AccountsController extends EventEmitter { this.#storage.get('accountPreferences', undefined) ]); if (accountPreferences) { - this.accounts = getUniqueAccountsArray(migrateAccountPreferencesToAccounts(accountPreferences, accounts)); + this.accounts = (0, account_1.getUniqueAccountsArray)((0, account_1.migrateAccountPreferencesToAccounts)(accountPreferences, accounts)); await this.#storage.set('accounts', this.accounts); await this.#storage.remove('accountPreferences'); } else { - this.accounts = getUniqueAccountsArray(accounts); + this.accounts = (0, account_1.getUniqueAccountsArray)(accounts); } // Emit an update before updating account states as the first state update may take some time this.emitUpdate(); @@ -77,7 +81,7 @@ export class AccountsController extends EventEmitter { this.emitUpdate(); await Promise.all(networksToUpdate.map(async (network) => { try { - const networkAccountStates = await getAccountState(this.#providers.providers[network.id], network, accounts, blockTag); + const networkAccountStates = await (0, accountState_1.getAccountState)(this.#providers.providers[network.id], network, accounts, blockTag); this.#updateProviderIsWorking(network.id, true); networkAccountStates.forEach((accountState) => { const addr = accountState.accountAddr; @@ -102,7 +106,7 @@ export class AccountsController extends EventEmitter { if (!accounts.length) return; // eslint-disable-next-line no-param-reassign - accounts = accounts.map((a) => ({ ...a, addr: getAddress(a.addr) })); + accounts = accounts.map((a) => ({ ...a, addr: (0, ethers_1.getAddress)(a.addr) })); const alreadyAddedAddressSet = new Set(this.accounts.map((account) => account.addr)); const newAccountsNotAddedYet = accounts.filter((acc) => !alreadyAddedAddressSet.has(acc.addr)); const newAccountsAlreadyAdded = accounts.filter((acc) => alreadyAddedAddressSet.has(acc.addr)); @@ -125,7 +129,7 @@ export class AccountsController extends EventEmitter { })), ...newAccountsNotAddedYet.map((a) => ({ ...a, newlyAdded: true })) ]; - this.accounts = getUniqueAccountsArray(nextAccounts); + this.accounts = (0, account_1.getUniqueAccountsArray)(nextAccounts); await this.#storage.set('accounts', this.accounts); this.#onAddAccounts(accounts); // update the state of new accounts. Otherwise, the user needs to restart his extension @@ -146,8 +150,8 @@ export class AccountsController extends EventEmitter { const account = accounts.find((a) => a.addr === acc.addr); if (!account) return acc; - if (isAddress(account.preferences.pfp)) { - account.preferences.pfp = getAddress(account.preferences.pfp); + if ((0, ethers_1.isAddress)(account.preferences.pfp)) { + account.preferences.pfp = (0, ethers_1.getAddress)(account.preferences.pfp); } return { ...acc, preferences: account.preferences, newlyAdded: false }; }); @@ -165,4 +169,5 @@ export class AccountsController extends EventEmitter { }; } } +exports.AccountsController = AccountsController; //# sourceMappingURL=accounts.js.map \ No newline at end of file diff --git a/dist/src/controllers/accounts/accounts.js.map b/dist/src/controllers/accounts/accounts.js.map index 51082ef86..69404845a 100644 --- a/dist/src/controllers/accounts/accounts.js.map +++ b/dist/src/controllers/accounts/accounts.js.map @@ -1 +1 @@ -{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/controllers/accounts/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { Account, AccountPreferences, AccountStates } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getUniqueAccountsArray,\n migrateAccountPreferencesToAccounts\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n selectAccount: 'INITIAL',\n updateAccountPreferences: 'INITIAL'\n} as const\n\nexport class AccountsController extends EventEmitter {\n #storage: Storage\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n accounts: Account[] = []\n\n accountStates: AccountStates = {}\n\n accountStatesLoadingState: {\n [networkId: string]: boolean\n } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #onAddAccounts: (accounts: Account[]) => void\n\n #updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void\n\n #onAccountStateUpdate: () => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n providers: ProvidersController,\n networks: NetworksController,\n onAddAccounts: (accounts: Account[]) => void,\n updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void,\n onAccountStateUpdate: () => void\n ) {\n super()\n this.#storage = storage\n this.#providers = providers\n this.#networks = networks\n this.#onAddAccounts = onAddAccounts\n this.#updateProviderIsWorking = updateProviderIsWorking\n this.#onAccountStateUpdate = onAccountStateUpdate\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#providers.initialLoadPromise\n const [accounts, accountPreferences] = await Promise.all([\n this.#storage.get('accounts', []),\n this.#storage.get('accountPreferences', undefined)\n ])\n if (accountPreferences) {\n this.accounts = getUniqueAccountsArray(\n migrateAccountPreferencesToAccounts(accountPreferences, accounts)\n )\n await this.#storage.set('accounts', this.accounts)\n await this.#storage.remove('accountPreferences')\n } else {\n this.accounts = getUniqueAccountsArray(accounts)\n }\n\n // Emit an update before updating account states as the first state update may take some time\n this.emitUpdate()\n // Don't await this. Networks should update one by one\n // NOTE: YOU MUST USE waitForAccountsCtrlFirstLoad IN TESTS\n // TO ENSURE ACCOUNT STATE IS LOADED\n this.#updateAccountStates(this.accounts)\n }\n\n async updateAccountStates(blockTag: string | number = 'latest', networks: NetworkId[] = []) {\n await this.#updateAccountStates(this.accounts, blockTag, networks)\n }\n\n async updateAccountState(\n accountAddr: Account['addr'],\n blockTag: 'pending' | 'latest' = 'latest',\n networks: NetworkId[] = []\n ) {\n const accountData = this.accounts.find((account) => account.addr === accountAddr)\n\n if (!accountData) return\n\n await this.#updateAccountStates([accountData], blockTag, networks)\n }\n\n async #updateAccountStates(\n accounts: Account[],\n blockTag: string | number = 'latest',\n updateOnlyNetworksWithIds: NetworkId[] = []\n ) {\n // if any, update the account state only for the passed networks; else - all\n const updateOnlyPassedNetworks = updateOnlyNetworksWithIds.length\n const networksToUpdate = this.#networks.networks.filter((network) => {\n if (this.accountStatesLoadingState[network.id]) return false\n if (!updateOnlyPassedNetworks) return true\n\n return updateOnlyNetworksWithIds.includes(network.id)\n })\n\n networksToUpdate.forEach((network) => {\n this.accountStatesLoadingState[network.id] = true\n })\n this.emitUpdate()\n\n await Promise.all(\n networksToUpdate.map(async (network) => {\n try {\n const networkAccountStates = await getAccountState(\n this.#providers.providers[network.id],\n network,\n accounts,\n blockTag\n )\n\n this.#updateProviderIsWorking(network.id, true)\n\n networkAccountStates.forEach((accountState) => {\n const addr = accountState.accountAddr\n\n if (!this.accountStates[addr]) {\n this.accountStates[addr] = {}\n }\n\n this.accountStates[addr][network.id] = accountState\n })\n } catch (err) {\n console.error(`account state update error for ${network.name}: `, err)\n this.#updateProviderIsWorking(network.id, false)\n } finally {\n this.accountStatesLoadingState[network.id] = false\n }\n this.emitUpdate()\n })\n )\n\n this.#onAccountStateUpdate()\n }\n\n async addAccounts(accounts: Account[] = []) {\n if (!accounts.length) return\n // eslint-disable-next-line no-param-reassign\n accounts = accounts.map((a) => ({ ...a, addr: getAddress(a.addr) }))\n const alreadyAddedAddressSet = new Set(this.accounts.map((account) => account.addr))\n const newAccountsNotAddedYet = accounts.filter((acc) => !alreadyAddedAddressSet.has(acc.addr))\n const newAccountsAlreadyAdded = accounts.filter((acc) => alreadyAddedAddressSet.has(acc.addr))\n\n const nextAccounts = [\n ...this.accounts.map((acc) => ({\n ...acc,\n // reset the `newlyCreated` state for all already added accounts\n newlyCreated: false,\n // reset the `newlyAdded` state for all accounts added on prev sessions\n newlyAdded: false,\n // Merge the existing and new associated keys for the account (if the\n // account was already imported). This ensures up-to-date keys,\n // considering changes post-import (associated keys of the smart\n // accounts can change) or incomplete initial data (during the initial\n // import, not all associated keys could have been fetched (for privacy).\n associatedKeys: Array.from(\n new Set([\n ...acc.associatedKeys,\n ...(newAccountsAlreadyAdded.find((x) => x.addr === acc.addr)?.associatedKeys || [])\n ])\n )\n })),\n ...newAccountsNotAddedYet.map((a) => ({ ...a, newlyAdded: true }))\n ]\n\n this.accounts = getUniqueAccountsArray(nextAccounts)\n await this.#storage.set('accounts', this.accounts)\n\n this.#onAddAccounts(accounts)\n\n // update the state of new accounts. Otherwise, the user needs to restart his extension\n this.#updateAccountStates(newAccountsNotAddedYet)\n\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n this.accounts = this.accounts.filter((acc) => acc.addr !== address)\n\n delete this.accountStates[address]\n this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n async updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n await this.withStatus(\n 'updateAccountPreferences',\n async () => this.#updateAccountPreferences(accounts),\n true\n )\n }\n\n async #updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n this.accounts = this.accounts.map((acc) => {\n const account = accounts.find((a) => a.addr === acc.addr)\n if (!account) return acc\n if (isAddress(account.preferences.pfp)) {\n account.preferences.pfp = getAddress(account.preferences.pfp)\n }\n return { ...acc, preferences: account.preferences, newlyAdded: false }\n })\n\n await this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n get areAccountStatesLoading() {\n return Object.values(this.accountStatesLoadingState).some((isLoading) => isLoading)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n areAccountStatesLoading: this.areAccountStatesLoading\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/controllers/accounts/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { Account, AccountPreferences, AccountStates } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getUniqueAccountsArray,\n migrateAccountPreferencesToAccounts\n} from '../../libs/account/account'\nimport { getAccountState } from '../../libs/accountState/accountState'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n selectAccount: 'INITIAL',\n updateAccountPreferences: 'INITIAL'\n} as const\n\nexport class AccountsController extends EventEmitter {\n #storage: Storage\n\n #networks: NetworksController\n\n #providers: ProvidersController\n\n accounts: Account[] = []\n\n accountStates: AccountStates = {}\n\n accountStatesLoadingState: {\n [networkId: string]: boolean\n } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #onAddAccounts: (accounts: Account[]) => void\n\n #updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void\n\n #onAccountStateUpdate: () => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n providers: ProvidersController,\n networks: NetworksController,\n onAddAccounts: (accounts: Account[]) => void,\n updateProviderIsWorking: (networkId: NetworkId, isWorking: boolean) => void,\n onAccountStateUpdate: () => void\n ) {\n super()\n this.#storage = storage\n this.#providers = providers\n this.#networks = networks\n this.#onAddAccounts = onAddAccounts\n this.#updateProviderIsWorking = updateProviderIsWorking\n this.#onAccountStateUpdate = onAccountStateUpdate\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#providers.initialLoadPromise\n const [accounts, accountPreferences] = await Promise.all([\n this.#storage.get('accounts', []),\n this.#storage.get('accountPreferences', undefined)\n ])\n if (accountPreferences) {\n this.accounts = getUniqueAccountsArray(\n migrateAccountPreferencesToAccounts(accountPreferences, accounts)\n )\n await this.#storage.set('accounts', this.accounts)\n await this.#storage.remove('accountPreferences')\n } else {\n this.accounts = getUniqueAccountsArray(accounts)\n }\n\n // Emit an update before updating account states as the first state update may take some time\n this.emitUpdate()\n // Don't await this. Networks should update one by one\n // NOTE: YOU MUST USE waitForAccountsCtrlFirstLoad IN TESTS\n // TO ENSURE ACCOUNT STATE IS LOADED\n this.#updateAccountStates(this.accounts)\n }\n\n async updateAccountStates(blockTag: string | number = 'latest', networks: NetworkId[] = []) {\n await this.#updateAccountStates(this.accounts, blockTag, networks)\n }\n\n async updateAccountState(\n accountAddr: Account['addr'],\n blockTag: 'pending' | 'latest' = 'latest',\n networks: NetworkId[] = []\n ) {\n const accountData = this.accounts.find((account) => account.addr === accountAddr)\n\n if (!accountData) return\n\n await this.#updateAccountStates([accountData], blockTag, networks)\n }\n\n async #updateAccountStates(\n accounts: Account[],\n blockTag: string | number = 'latest',\n updateOnlyNetworksWithIds: NetworkId[] = []\n ) {\n // if any, update the account state only for the passed networks; else - all\n const updateOnlyPassedNetworks = updateOnlyNetworksWithIds.length\n const networksToUpdate = this.#networks.networks.filter((network) => {\n if (this.accountStatesLoadingState[network.id]) return false\n if (!updateOnlyPassedNetworks) return true\n\n return updateOnlyNetworksWithIds.includes(network.id)\n })\n\n networksToUpdate.forEach((network) => {\n this.accountStatesLoadingState[network.id] = true\n })\n this.emitUpdate()\n\n await Promise.all(\n networksToUpdate.map(async (network) => {\n try {\n const networkAccountStates = await getAccountState(\n this.#providers.providers[network.id],\n network,\n accounts,\n blockTag\n )\n\n this.#updateProviderIsWorking(network.id, true)\n\n networkAccountStates.forEach((accountState) => {\n const addr = accountState.accountAddr\n\n if (!this.accountStates[addr]) {\n this.accountStates[addr] = {}\n }\n\n this.accountStates[addr][network.id] = accountState\n })\n } catch (err) {\n console.error(`account state update error for ${network.name}: `, err)\n this.#updateProviderIsWorking(network.id, false)\n } finally {\n this.accountStatesLoadingState[network.id] = false\n }\n this.emitUpdate()\n })\n )\n\n this.#onAccountStateUpdate()\n }\n\n async addAccounts(accounts: Account[] = []) {\n if (!accounts.length) return\n // eslint-disable-next-line no-param-reassign\n accounts = accounts.map((a) => ({ ...a, addr: getAddress(a.addr) }))\n const alreadyAddedAddressSet = new Set(this.accounts.map((account) => account.addr))\n const newAccountsNotAddedYet = accounts.filter((acc) => !alreadyAddedAddressSet.has(acc.addr))\n const newAccountsAlreadyAdded = accounts.filter((acc) => alreadyAddedAddressSet.has(acc.addr))\n\n const nextAccounts = [\n ...this.accounts.map((acc) => ({\n ...acc,\n // reset the `newlyCreated` state for all already added accounts\n newlyCreated: false,\n // reset the `newlyAdded` state for all accounts added on prev sessions\n newlyAdded: false,\n // Merge the existing and new associated keys for the account (if the\n // account was already imported). This ensures up-to-date keys,\n // considering changes post-import (associated keys of the smart\n // accounts can change) or incomplete initial data (during the initial\n // import, not all associated keys could have been fetched (for privacy).\n associatedKeys: Array.from(\n new Set([\n ...acc.associatedKeys,\n ...(newAccountsAlreadyAdded.find((x) => x.addr === acc.addr)?.associatedKeys || [])\n ])\n )\n })),\n ...newAccountsNotAddedYet.map((a) => ({ ...a, newlyAdded: true }))\n ]\n\n this.accounts = getUniqueAccountsArray(nextAccounts)\n await this.#storage.set('accounts', this.accounts)\n\n this.#onAddAccounts(accounts)\n\n // update the state of new accounts. Otherwise, the user needs to restart his extension\n this.#updateAccountStates(newAccountsNotAddedYet)\n\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n this.accounts = this.accounts.filter((acc) => acc.addr !== address)\n\n delete this.accountStates[address]\n this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n async updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n await this.withStatus(\n 'updateAccountPreferences',\n async () => this.#updateAccountPreferences(accounts),\n true\n )\n }\n\n async #updateAccountPreferences(accounts: { addr: string; preferences: AccountPreferences }[]) {\n this.accounts = this.accounts.map((acc) => {\n const account = accounts.find((a) => a.addr === acc.addr)\n if (!account) return acc\n if (isAddress(account.preferences.pfp)) {\n account.preferences.pfp = getAddress(account.preferences.pfp)\n }\n return { ...acc, preferences: account.preferences, newlyAdded: false }\n })\n\n await this.#storage.set('accounts', this.accounts)\n this.emitUpdate()\n }\n\n get areAccountStatesLoading() {\n return Object.values(this.accountStatesLoadingState).some((isLoading) => isLoading)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n areAccountStatesLoading: this.areAccountStatesLoading\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.js b/dist/src/controllers/actions/actions.js index 57bfc6782..265ef7f8f 100644 --- a/dist/src/controllers/actions/actions.js +++ b/dist/src/controllers/actions/actions.js @@ -1,9 +1,13 @@ +"use strict"; /* eslint-disable @typescript-eslint/no-floating-promises */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ActionsController = void 0; +const tslib_1 = require("tslib"); // eslint-disable-next-line import/no-cycle -import { messageOnNewAction } from '../../libs/actions/actions'; -import { getDappActionRequestsBanners } from '../../libs/banners/banners'; -import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'; -import EventEmitter from '../eventEmitter/eventEmitter'; +const actions_1 = require("../../libs/actions/actions"); +const banners_1 = require("../../libs/banners/banners"); +const userOperation_1 = require("../../libs/userOperation/userOperation"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); /** * The ActionsController is responsible for storing the converted userRequests * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue @@ -15,7 +19,7 @@ import EventEmitter from '../eventEmitter/eventEmitter'; * or until the user forcefully closes the window using the system close icon (X). * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen. */ -export class ActionsController extends EventEmitter { +class ActionsController extends eventEmitter_1.default { #selectedAccount; #windowManager; #notificationManager; @@ -156,7 +160,7 @@ export class ActionsController extends EventEmitter { setCurrentActionById(actionId) { const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString()); if (!action) { - const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID); if (entryPointAction) this.#setCurrentAction(entryPointAction); return; @@ -166,7 +170,7 @@ export class ActionsController extends EventEmitter { setCurrentActionByIndex(actionIndex) { const action = this.visibleActionsQueue[actionIndex]; if (!action) { - const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + const entryPointAction = this.visibleActionsQueue.find((a) => a.id.toString() === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID); if (entryPointAction) this.#setCurrentAction(entryPointAction); return; @@ -176,12 +180,12 @@ export class ActionsController extends EventEmitter { sendNewActionMessage(newAction, type) { if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') { if (this.actionWindow.loaded) { - const message = messageOnNewAction(newAction, type); + const message = (0, actions_1.messageOnNewAction)(newAction, type); if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' }); } else { - const message = messageOnNewAction(newAction, type); + const message = (0, actions_1.messageOnNewAction)(newAction, type); if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }; } @@ -257,7 +261,7 @@ export class ActionsController extends EventEmitter { this.emitUpdate(); } get banners() { - return getDappActionRequestsBanners(this.visibleActionsQueue); + return (0, banners_1.getDappActionRequestsBanners)(this.visibleActionsQueue); } toJSON() { return { @@ -268,4 +272,5 @@ export class ActionsController extends EventEmitter { }; } } +exports.ActionsController = ActionsController; //# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/controllers/actions/actions.js.map b/dist/src/controllers/actions/actions.js.map index c1536ec4e..f35e0beb6 100644 --- a/dist/src/controllers/actions/actions.js.map +++ b/dist/src/controllers/actions/actions.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { Account } from '../../interfaces/account'\nimport {\n AccountOpAction,\n Action,\n BenzinAction,\n DappRequestAction,\n SignMessageAction,\n SwitchAccountAction\n} from '../../interfaces/actions'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { WindowManager, WindowProps } from '../../interfaces/window'\n// eslint-disable-next-line import/no-cycle\nimport { messageOnNewAction } from '../../libs/actions/actions'\nimport { getDappActionRequestsBanners } from '../../libs/banners/banners'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n// Kind of inevitable, the AccountsController has SelectedAccountController, which has ActionsController\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\n// TODO: Temporarily. Refactor imports across the codebase to ref /interfaces/actions instead.\nexport type {\n SwitchAccountAction,\n Action,\n AccountOpAction,\n SignMessageAction,\n BenzinAction,\n DappRequestAction\n}\n\nexport type ActionPosition = 'first' | 'last'\n\nexport type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'\n\n/**\n * The ActionsController is responsible for storing the converted userRequests\n * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue\n * For most userRequests, there is a corresponding action in the actionsQueue\n * containing the details of the userRequest needed for displaying it to the user.\n * However, some userRequests can be batched together, resulting in a single action created for multiple requests.\n *\n * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected,\n * or until the user forcefully closes the window using the system close icon (X).\n * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen.\n */\nexport class ActionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n actionWindow: {\n windowProps: WindowProps\n openWindowPromise?: Promise\n focusWindowPromise?: Promise\n loaded: boolean\n pendingMessage: {\n message: string\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n } | null\n } = {\n windowProps: null,\n loaded: false,\n pendingMessage: null\n }\n\n actionsQueue: Action[] = []\n\n currentAction: Action | null = null\n\n #onActionWindowClose: () => void\n\n get visibleActionsQueue(): Action[] {\n return this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr\n }\n\n return true\n })\n }\n\n constructor({\n selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose\n }: {\n selectedAccount: SelectedAccountController\n windowManager: WindowManager\n notificationManager: NotificationManager\n onActionWindowClose: () => void\n }) {\n super()\n\n this.#selectedAccount = selectedAccount\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n this.#onActionWindowClose = onActionWindowClose\n\n this.#windowManager.event.on('windowRemoved', async (winId: number) => {\n if (\n winId === this.actionWindow.windowProps?.id ||\n (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)\n ) {\n this.actionWindow.windowProps = null\n this.actionWindow.loaded = false\n this.actionWindow.pendingMessage = null\n this.currentAction = null\n\n this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp')\n if (this.visibleActionsQueue.length) {\n await this.#notificationManager.create({\n title:\n this.actionsQueue.length > 1\n ? `${this.actionsQueue.length} transactions queued`\n : 'Transaction queued',\n message: 'Queued pending transactions are available on your Dashboard.'\n })\n }\n this.#onActionWindowClose()\n this.emitUpdate()\n }\n })\n\n this.#windowManager.event.on('windowFocusChange', async (winId: number) => {\n if (this.actionWindow.windowProps) {\n if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) {\n this.actionWindow.windowProps.focused = true\n this.emitUpdate()\n } else if (\n this.actionWindow.windowProps.id !== winId &&\n this.actionWindow.windowProps.focused\n ) {\n this.actionWindow.windowProps.focused = false\n this.emitUpdate()\n }\n }\n })\n }\n\n addOrUpdateAction(\n newAction: Action,\n position: ActionPosition = 'last',\n executionType: ActionExecutionType = 'open-action-window'\n ) {\n // remove the benzin action if a new actions is added\n this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin')\n if (this.currentAction && this.currentAction.type === 'benzin') {\n this.currentAction = null\n }\n\n const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id)\n if (actionIndex !== -1) {\n this.actionsQueue[actionIndex] = newAction\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n this.sendNewActionMessage(newAction, 'updated')\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n return\n }\n\n if (position === 'first') {\n this.actionsQueue.unshift(newAction)\n } else {\n this.actionsQueue.push(newAction)\n }\n\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n }\n\n removeAction(actionId: Action['id'], shouldOpenNextAction: boolean = true) {\n this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId)\n if (shouldOpenNextAction) {\n this.#setCurrentAction(this.visibleActionsQueue[0] || null)\n }\n }\n\n #setCurrentAction(nextAction: Action | null) {\n if (nextAction && nextAction.id === this.currentAction?.id) {\n this.openActionWindow()\n this.emitUpdate()\n return\n }\n\n this.currentAction = nextAction\n\n if (!this.currentAction) {\n !!this.actionWindow.windowProps?.id &&\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n } else {\n this.openActionWindow()\n }\n\n this.emitUpdate()\n }\n\n setCurrentActionById(actionId: Action['id']) {\n const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString())\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n setCurrentActionByIndex(actionIndex: number) {\n const action = this.visibleActionsQueue[actionIndex]\n\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n sendNewActionMessage(newAction: Action, type: 'queued' | 'updated') {\n if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') {\n if (this.actionWindow.loaded) {\n const message = messageOnNewAction(newAction, type)\n if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' })\n } else {\n const message = messageOnNewAction(newAction, type)\n if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }\n }\n }\n }\n\n async openActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (this.actionWindow.windowProps) {\n this.focusActionWindow()\n } else {\n try {\n this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => {\n this.actionWindow.openWindowPromise = undefined\n })\n this.actionWindow.windowProps = await this.actionWindow.openWindowPromise\n this.emitUpdate()\n } catch (err) {\n console.error('Error opening action window:', err)\n }\n }\n }\n\n async focusActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps)\n return\n try {\n this.actionWindow.focusWindowPromise = this.#windowManager\n .focus(this.actionWindow.windowProps)\n .finally(() => {\n this.actionWindow.focusWindowPromise = undefined\n })\n this.emitUpdate()\n } catch (err) {\n console.error('Error focusing action window:', err)\n }\n }\n\n closeActionWindow() {\n if (!this.actionWindow.windowProps) return\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n }\n\n setWindowLoaded() {\n if (!this.actionWindow.windowProps) return\n this.actionWindow.loaded = true\n\n if (this.actionWindow.pendingMessage) {\n this.#windowManager.sendWindowToastMessage(\n this.actionWindow.pendingMessage.message,\n this.actionWindow.pendingMessage.options\n )\n this.actionWindow.pendingMessage = null\n }\n this.emitUpdate()\n }\n\n removeAccountData(address: Account['addr']) {\n this.actionsQueue = this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr !== address\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== address\n }\n\n return true\n })\n\n this.emitUpdate()\n }\n\n get banners() {\n return getDappActionRequestsBanners(this.visibleActionsQueue)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n visibleActionsQueue: this.visibleActionsQueue,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":";AAAA,4DAA4D;;;;AAa5D,2CAA2C;AAC3C,wDAA+D;AAC/D,wDAAyE;AACzE,0EAA6F;AAC7F,wFAAuD;AAmBvD;;;;;;;;;;GAUG;AACH,MAAa,iBAAkB,SAAQ,sBAAY;IACjD,gBAAgB,CAA2B;IAE3C,cAAc,CAAe;IAE7B,oBAAoB,CAAqB;IAEzC,YAAY,GAaR;QACF,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,IAAI;KACrB,CAAA;IAED,YAAY,GAAa,EAAE,CAAA;IAE3B,aAAa,GAAkB,IAAI,CAAA;IAEnC,oBAAoB,CAAY;IAEhC,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE;gBAC1B,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,KAAK,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAA;aACvE;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;gBAC5B,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAA;aAC9E;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACvB,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAA;aAC9E;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE;gBAC9B,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAA;aACtF;YAED,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY,EACV,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EAMpB;QACC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;QACvC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QACnC,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAA;QAC/C,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAA;QAE/C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YACpE,IACE,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;gBAC3C,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EACzF;gBACA,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAA;gBACpC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,KAAK,CAAA;gBAChC,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAA;gBACvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;gBAEzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;gBAC3E,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;oBACnC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;wBACrC,KAAK,EACH,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;4BAC1B,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,sBAAsB;4BACnD,CAAC,CAAC,oBAAoB;wBAC1B,OAAO,EAAE,8DAA8D;qBACxE,CAAC,CAAA;iBACH;gBACD,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC3B,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YACxE,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBACjC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE;oBACxF,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAA;oBAC5C,IAAI,CAAC,UAAU,EAAE,CAAA;iBAClB;qBAAM,IACL,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,KAAK;oBAC1C,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EACrC;oBACA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAA;oBAC7C,IAAI,CAAC,UAAU,EAAE,CAAA;iBAClB;aACF;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB,CACf,SAAiB,EACjB,WAA2B,MAAM,EACjC,gBAAqC,oBAAoB;QAEzD,qDAAqD;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QACxE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;SAC1B;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAA;QAC7E,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;YACtB,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;YAC1C,IAAI,aAAa,KAAK,OAAO,EAAE;gBAC7B,IAAI,aAAa,GAAG,IAAI,CAAA;gBACxB,IAAI,aAAa,KAAK,oBAAoB,EAAE;oBAC1C,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;oBAC/C,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;iBACpF;qBAAM,IAAI,aAAa,KAAK,8BAA8B,EAAE;oBAC3D,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;oBAC9C,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;iBAC1E;gBACD,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAA;aACtC;iBAAM;gBACL,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;YACD,OAAM;SACP;QAED,IAAI,QAAQ,KAAK,OAAO,EAAE;YACxB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;SAClC;QAED,IAAI,aAAa,KAAK,OAAO,EAAE;YAC7B,IAAI,aAAa,GAAG,IAAI,CAAA;YACxB,IAAI,aAAa,KAAK,oBAAoB,EAAE;gBAC1C,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;aACpF;iBAAM,IAAI,aAAa,KAAK,8BAA8B,EAAE;gBAC3D,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;gBAC9C,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;aAC1E;YACD,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAA;SACtC;aAAM;YACL,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;IACH,CAAC;IAED,YAAY,CAAC,QAAsB,EAAE,uBAAgC,IAAI;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACtE,IAAI,oBAAoB,EAAE;YACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;SAC5D;IACH,CAAC;IAED,iBAAiB,CAAC,UAAyB;QACzC,IAAI,UAAU,IAAI,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE;YAC1D,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACvB,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;SACP;QAED,IAAI,CAAC,aAAa,GAAG,UAAU,CAAA;QAE/B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;gBACjC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;SAC/D;aAAM;YACL,IAAI,CAAC,gBAAgB,EAAE,CAAA;SACxB;QAED,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,oBAAoB,CAAC,QAAsB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5F,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,oDAAoC,CAChE,CAAA;YAED,IAAI,gBAAgB;gBAAE,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;YAE9D,OAAM;SACP;QAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,uBAAuB,CAAC,WAAmB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;QAEpD,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,oDAAoC,CAChE,CAAA;YACD,IAAI,gBAAgB;gBAAE,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;YAE9D,OAAM;SACP;QAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,oBAAoB,CAAC,SAAiB,EAAE,IAA0B;QAChE,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;YACtE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;gBAC5B,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBACnD,IAAI,OAAO;oBAAE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;aACtF;iBAAM;gBACL,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBACnD,IAAI,OAAO;oBAAE,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAA;aAC1F;SACF;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAA;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAA;QACzC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;YACjC,IAAI,CAAC,iBAAiB,EAAE,CAAA;SACzB;aAAM;YACL,IAAI;gBACF,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC5E,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG,SAAS,CAAA;gBACjD,CAAC,CAAC,CAAA;gBACF,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAA;gBACzE,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAA;aACnD;SACF;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAA;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAA;QACzC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW;YAC3F,OAAM;QACR,IAAI;YACF,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc;iBACvD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;iBACpC,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,SAAS,CAAA;YAClD,CAAC,CAAC,CAAA;YACJ,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;SACpD;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW;YAAE,OAAM;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW;YAAE,OAAM;QAC1C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAA;QAE/B,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;YACpC,IAAI,CAAC,cAAc,CAAC,sBAAsB,CACxC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,EACxC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CACzC,CAAA;YACD,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAA;SACxC;QACD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,iBAAiB,CAAC,OAAwB;QACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE;gBAC1B,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,KAAK,OAAO,CAAA;aAC3C;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;gBAC5B,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAA;aAClD;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACvB,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAA;aAClD;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE;gBAC9B,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,KAAK,OAAO,CAAA;aAC1D;YAED,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAA,sCAA4B,EAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/D,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF;AA3TD,8CA2TC","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { Account } from '../../interfaces/account'\nimport {\n AccountOpAction,\n Action,\n BenzinAction,\n DappRequestAction,\n SignMessageAction,\n SwitchAccountAction\n} from '../../interfaces/actions'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { WindowManager, WindowProps } from '../../interfaces/window'\n// eslint-disable-next-line import/no-cycle\nimport { messageOnNewAction } from '../../libs/actions/actions'\nimport { getDappActionRequestsBanners } from '../../libs/banners/banners'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n// Kind of inevitable, the AccountsController has SelectedAccountController, which has ActionsController\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\n// TODO: Temporarily. Refactor imports across the codebase to ref /interfaces/actions instead.\nexport type {\n SwitchAccountAction,\n Action,\n AccountOpAction,\n SignMessageAction,\n BenzinAction,\n DappRequestAction\n}\n\nexport type ActionPosition = 'first' | 'last'\n\nexport type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'\n\n/**\n * The ActionsController is responsible for storing the converted userRequests\n * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue\n * For most userRequests, there is a corresponding action in the actionsQueue\n * containing the details of the userRequest needed for displaying it to the user.\n * However, some userRequests can be batched together, resulting in a single action created for multiple requests.\n *\n * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected,\n * or until the user forcefully closes the window using the system close icon (X).\n * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen.\n */\nexport class ActionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n actionWindow: {\n windowProps: WindowProps\n openWindowPromise?: Promise\n focusWindowPromise?: Promise\n loaded: boolean\n pendingMessage: {\n message: string\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n } | null\n } = {\n windowProps: null,\n loaded: false,\n pendingMessage: null\n }\n\n actionsQueue: Action[] = []\n\n currentAction: Action | null = null\n\n #onActionWindowClose: () => void\n\n get visibleActionsQueue(): Action[] {\n return this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr\n }\n\n return true\n })\n }\n\n constructor({\n selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose\n }: {\n selectedAccount: SelectedAccountController\n windowManager: WindowManager\n notificationManager: NotificationManager\n onActionWindowClose: () => void\n }) {\n super()\n\n this.#selectedAccount = selectedAccount\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n this.#onActionWindowClose = onActionWindowClose\n\n this.#windowManager.event.on('windowRemoved', async (winId: number) => {\n if (\n winId === this.actionWindow.windowProps?.id ||\n (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)\n ) {\n this.actionWindow.windowProps = null\n this.actionWindow.loaded = false\n this.actionWindow.pendingMessage = null\n this.currentAction = null\n\n this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp')\n if (this.visibleActionsQueue.length) {\n await this.#notificationManager.create({\n title:\n this.actionsQueue.length > 1\n ? `${this.actionsQueue.length} transactions queued`\n : 'Transaction queued',\n message: 'Queued pending transactions are available on your Dashboard.'\n })\n }\n this.#onActionWindowClose()\n this.emitUpdate()\n }\n })\n\n this.#windowManager.event.on('windowFocusChange', async (winId: number) => {\n if (this.actionWindow.windowProps) {\n if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) {\n this.actionWindow.windowProps.focused = true\n this.emitUpdate()\n } else if (\n this.actionWindow.windowProps.id !== winId &&\n this.actionWindow.windowProps.focused\n ) {\n this.actionWindow.windowProps.focused = false\n this.emitUpdate()\n }\n }\n })\n }\n\n addOrUpdateAction(\n newAction: Action,\n position: ActionPosition = 'last',\n executionType: ActionExecutionType = 'open-action-window'\n ) {\n // remove the benzin action if a new actions is added\n this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin')\n if (this.currentAction && this.currentAction.type === 'benzin') {\n this.currentAction = null\n }\n\n const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id)\n if (actionIndex !== -1) {\n this.actionsQueue[actionIndex] = newAction\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n this.sendNewActionMessage(newAction, 'updated')\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n return\n }\n\n if (position === 'first') {\n this.actionsQueue.unshift(newAction)\n } else {\n this.actionsQueue.push(newAction)\n }\n\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n }\n\n removeAction(actionId: Action['id'], shouldOpenNextAction: boolean = true) {\n this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId)\n if (shouldOpenNextAction) {\n this.#setCurrentAction(this.visibleActionsQueue[0] || null)\n }\n }\n\n #setCurrentAction(nextAction: Action | null) {\n if (nextAction && nextAction.id === this.currentAction?.id) {\n this.openActionWindow()\n this.emitUpdate()\n return\n }\n\n this.currentAction = nextAction\n\n if (!this.currentAction) {\n !!this.actionWindow.windowProps?.id &&\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n } else {\n this.openActionWindow()\n }\n\n this.emitUpdate()\n }\n\n setCurrentActionById(actionId: Action['id']) {\n const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString())\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n setCurrentActionByIndex(actionIndex: number) {\n const action = this.visibleActionsQueue[actionIndex]\n\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n sendNewActionMessage(newAction: Action, type: 'queued' | 'updated') {\n if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') {\n if (this.actionWindow.loaded) {\n const message = messageOnNewAction(newAction, type)\n if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' })\n } else {\n const message = messageOnNewAction(newAction, type)\n if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }\n }\n }\n }\n\n async openActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (this.actionWindow.windowProps) {\n this.focusActionWindow()\n } else {\n try {\n this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => {\n this.actionWindow.openWindowPromise = undefined\n })\n this.actionWindow.windowProps = await this.actionWindow.openWindowPromise\n this.emitUpdate()\n } catch (err) {\n console.error('Error opening action window:', err)\n }\n }\n }\n\n async focusActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps)\n return\n try {\n this.actionWindow.focusWindowPromise = this.#windowManager\n .focus(this.actionWindow.windowProps)\n .finally(() => {\n this.actionWindow.focusWindowPromise = undefined\n })\n this.emitUpdate()\n } catch (err) {\n console.error('Error focusing action window:', err)\n }\n }\n\n closeActionWindow() {\n if (!this.actionWindow.windowProps) return\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n }\n\n setWindowLoaded() {\n if (!this.actionWindow.windowProps) return\n this.actionWindow.loaded = true\n\n if (this.actionWindow.pendingMessage) {\n this.#windowManager.sendWindowToastMessage(\n this.actionWindow.pendingMessage.message,\n this.actionWindow.pendingMessage.options\n )\n this.actionWindow.pendingMessage = null\n }\n this.emitUpdate()\n }\n\n removeAccountData(address: Account['addr']) {\n this.actionsQueue = this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr !== address\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== address\n }\n\n return true\n })\n\n this.emitUpdate()\n }\n\n get banners() {\n return getDappActionRequestsBanners(this.visibleActionsQueue)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n visibleActionsQueue: this.visibleActionsQueue,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.js b/dist/src/controllers/activity/activity.js index 9333307a6..0c522d7bb 100644 --- a/dist/src/controllers/activity/activity.js +++ b/dist/src/controllers/activity/activity.js @@ -1,10 +1,14 @@ -import { isSmartAccount } from '../../libs/account/account'; -import { AccountOpStatus } from '../../libs/accountOp/accountOp'; -import { fetchTxnId } from '../../libs/accountOp/submittedAccountOp'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ActivityController = void 0; +const tslib_1 = require("tslib"); +const account_1 = require("../../libs/account/account"); +const accountOp_1 = require("../../libs/accountOp/accountOp"); +const submittedAccountOp_1 = require("../../libs/accountOp/submittedAccountOp"); /* eslint-disable import/no-extraneous-dependencies */ -import { parseLogs } from '../../libs/userOperation/userOperation'; -import { getBenzinUrlParams } from '../../utils/benzin'; -import EventEmitter from '../eventEmitter/eventEmitter'; +const userOperation_1 = require("../../libs/userOperation/userOperation"); +const benzin_1 = require("../../utils/benzin"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); // We are limiting items array to include no more than 1000 records, // as we trim out the oldest ones (in the beginning of the items array). // We do this to maintain optimal storage and performance. @@ -49,7 +53,7 @@ const paginate = (items, fromPage, itemsPerPage) => { * 💡 For performance, items per account and network are limited to 1000. * Older items are trimmed, keeping the most recent ones. */ -export class ActivityController extends EventEmitter { +class ActivityController extends eventEmitter_1.default { #storage; #fetch; #initialLoadPromise; @@ -62,7 +66,7 @@ export class ActivityController extends EventEmitter { #providers; #networks; #onContractsDeployed; - #rbfStatuses = [AccountOpStatus.BroadcastedButNotConfirmed, AccountOpStatus.BroadcastButStuck]; + #rbfStatuses = [accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed, accountOp_1.AccountOpStatus.BroadcastButStuck]; #callRelayer; constructor(storage, fetch, callRelayer, accounts, selectedAccount, providers, networks, onContractsDeployed) { super(); @@ -203,7 +207,7 @@ export class ActivityController extends EventEmitter { return Promise.all(this.#accountsOps[selectedAccount][networkId].map(async (accountOp, accountOpIndex) => { // Don't update the current network account ops statuses, // as the statuses are already updated in the previous calls. - if (accountOp.status !== AccountOpStatus.BroadcastedButNotConfirmed) + if (accountOp.status !== accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed) return; shouldEmitUpdate = true; if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) { @@ -215,14 +219,14 @@ export class ActivityController extends EventEmitter { const aQuaterHasPassed = accountOpDate < new Date(); if (aQuaterHasPassed) { this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = - AccountOpStatus.BroadcastButStuck; + accountOp_1.AccountOpStatus.BroadcastButStuck; updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); } }; - const fetchTxnIdResult = await fetchTxnId(accountOp.identifiedBy, network, this.#fetch, this.#callRelayer, accountOp); + const fetchTxnIdResult = await (0, submittedAccountOp_1.fetchTxnId)(accountOp.identifiedBy, network, this.#fetch, this.#callRelayer, accountOp); if (fetchTxnIdResult.status === 'rejected') { this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = - AccountOpStatus.Rejected; + accountOp_1.AccountOpStatus.Rejected; updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); return; } @@ -238,7 +242,7 @@ export class ActivityController extends EventEmitter { // if this is an user op, we have to check the logs let isSuccess; if (accountOp.identifiedBy.type === 'UserOperation') { - const userOpEventLog = parseLogs(receipt.logs, accountOp.identifiedBy.identifier); + const userOpEventLog = (0, userOperation_1.parseLogs)(receipt.logs, accountOp.identifiedBy.identifier); if (userOpEventLog) isSuccess = userOpEventLog.success; } @@ -246,8 +250,8 @@ export class ActivityController extends EventEmitter { if (isSuccess === undefined) isSuccess = !!receipt.status; this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = isSuccess - ? AccountOpStatus.Success - : AccountOpStatus.Failure; + ? accountOp_1.AccountOpStatus.Success + : accountOp_1.AccountOpStatus.Failure; updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); if (receipt.status) { shouldUpdatePortfolio = true; @@ -277,10 +281,10 @@ export class ActivityController extends EventEmitter { accountOp.gasFeePayment && accOp.gasFeePayment.paidBy === accountOp.gasFeePayment.paidBy && accOp.nonce.toString() === accountOp.nonce.toString()); - const confirmedSameNonceTxns = sameNonceTxns.find((accOp) => accOp.status === AccountOpStatus.Success || accOp.status === AccountOpStatus.Failure); + const confirmedSameNonceTxns = sameNonceTxns.find((accOp) => accOp.status === accountOp_1.AccountOpStatus.Success || accOp.status === accountOp_1.AccountOpStatus.Failure); if (sameNonceTxns.length > 1 && !!confirmedSameNonceTxns) { this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = - AccountOpStatus.UnknownButPastNonce; + accountOp_1.AccountOpStatus.UnknownButPastNonce; updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex]); shouldUpdatePortfolio = true; } @@ -344,7 +348,7 @@ export class ActivityController extends EventEmitter { return []; return Object.values(this.#accountsOps[this.#selectedAccount.account.addr]) .flat() - .filter((accountOp) => accountOp.status === AccountOpStatus.BroadcastedButNotConfirmed); + .filter((accountOp) => accountOp.status === accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed); } get banners() { if (!this.#networks.isInitialized) @@ -354,7 +358,7 @@ export class ActivityController extends EventEmitter { .filter((op) => !(op.flags && op.flags.hideActivityBanner)) .map((accountOp) => { const network = this.#networks.networks.find((x) => x.id === accountOp.networkId); - const url = `https://benzin.ambire.com/${getBenzinUrlParams({ + const url = `https://benzin.ambire.com/${(0, benzin_1.getBenzinUrlParams)({ chainId: network.chainId, txnId: accountOp.txnId, identifiedBy: accountOp.identifiedBy @@ -398,7 +402,7 @@ export class ActivityController extends EventEmitter { // if the broadcasting account is a smart account, it means relayer // broadcast => it's in this.#accountsOps[acc.addr][networkId] // disregard erc-4337 txns as they shouldn't have an RBF - const isSA = isSmartAccount(acc); + const isSA = (0, account_1.isSmartAccount)(acc); if (isSA) { if (!this.#accountsOps[acc.addr] || !this.#accountsOps[acc.addr][networkId]) return null; @@ -408,7 +412,7 @@ export class ActivityController extends EventEmitter { } // if the account is an EOA, we have to go through all the smart accounts // to check whether the EOA has made a broadcast for them - const theEOAandSAaccounts = this.#accounts.accounts.filter((oneA) => isSmartAccount(oneA) || oneA.addr === accId); + const theEOAandSAaccounts = this.#accounts.accounts.filter((oneA) => (0, account_1.isSmartAccount)(oneA) || oneA.addr === accId); const ops = []; theEOAandSAaccounts.forEach((oneA) => { if (!this.#accountsOps[oneA.addr] || !this.#accountsOps[oneA.addr][networkId]) @@ -443,4 +447,5 @@ export class ActivityController extends EventEmitter { }; } } +exports.ActivityController = ActivityController; //# sourceMappingURL=activity.js.map \ No newline at end of file diff --git a/dist/src/controllers/activity/activity.js.map b/dist/src/controllers/activity/activity.js.map index 89d0696d8..058343993 100644 --- a/dist/src/controllers/activity/activity.js.map +++ b/dist/src/controllers/activity/activity.js.map @@ -1 +1 @@ -{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/controllers/activity/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { fetchTxnId, SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\n/* eslint-disable import/no-extraneous-dependencies */\nimport { parseLogs } from '../../libs/userOperation/userOperation'\nimport { getBenzinUrlParams } from '../../utils/benzin'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport interface Pagination {\n fromPage: number\n itemsPerPage: number\n}\n\ninterface PaginationResult {\n items: T[]\n itemsTotal: number\n currentPage: number\n maxPages: number\n}\n\nexport interface SignedMessage extends Message {\n dapp: {\n name: string\n icon: string\n } | null\n timestamp: number\n}\n\ninterface AccountsOps extends PaginationResult {}\ninterface MessagesToBeSigned extends PaginationResult {}\n\nexport interface Filters {\n account: string\n network?: string\n}\n\ninterface InternalAccountsOps {\n // account => network => SubmittedAccountOp[]\n [key: string]: { [key: string]: SubmittedAccountOp[] }\n}\n\ninterface InternalSignedMessages {\n // account => Message[]\n [key: string]: SignedMessage[]\n}\n\n// We are limiting items array to include no more than 1000 records,\n// as we trim out the oldest ones (in the beginning of the items array).\n// We do this to maintain optimal storage and performance.\nconst trim = (items: T[], maxSize = 1000): void => {\n if (items.length > maxSize) {\n // If the array size is greater than maxSize, remove the last (oldest) item\n // newest items are added to the beginning of the array so oldest will be at the end (thats why we .pop())\n items.pop()\n }\n}\n\nconst paginate = (items: any[], fromPage: number, itemsPerPage: number) => {\n return {\n items: items.slice(fromPage * itemsPerPage, fromPage * itemsPerPage + itemsPerPage),\n itemsTotal: items.length,\n currentPage: fromPage, // zero/index based\n maxPages: Math.ceil(items.length / itemsPerPage)\n }\n}\n\n/**\n * Activity Controller\n * Manages signed AccountsOps and Messages in controller memory and browser storage.\n *\n * Raw, unfiltered data is stored in private properties `ActivityController.#accountsOps` and\n * `ActivityController.#signedMessages`.\n *\n * Public methods and properties are exposed for retrieving data with filtering and pagination.\n *\n * To apply filters or pagination, call `filterAccountsOps()` or `filterSignedMessages()` with the\n * required parameters. Filtered items are stored in `ActivityController.accountsOps` and\n * `ActivityController.signedMessages` by session ID.\n *\n * Sessions ensure that each page manages its own filters and pagination independently. For example,\n * filters in \"Settings -> Transactions History\" and \"Dashboard -> Activity Tab\" are isolated per session.\n *\n * After adding or removing an AccountOp or SignedMessage, call `syncFilteredAccountsOps()` or\n * `syncFilteredSignedMessages()` to synchronize filtered data with the source data.\n *\n * The frontend is responsible for clearing filtered items for a session when a component unmounts\n * by calling `resetAccountsOpsFilters()` or `resetSignedMessagesFilters()`. If not cleared, all\n * sessions will be automatically removed when the browser is closed or the controller terminates.\n *\n * 💡 For performance, items per account and network are limited to 1000.\n * Older items are trimmed, keeping the most recent ones.\n */\nexport class ActivityController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n #accountsOps: InternalAccountsOps = {}\n\n accountsOps: {\n [sessionId: string]: {\n result: AccountsOps\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #signedMessages: InternalSignedMessages = {}\n\n signedMessages: {\n [sessionId: string]: {\n result: MessagesToBeSigned\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #onContractsDeployed: (network: Network) => Promise\n\n #rbfStatuses = [AccountOpStatus.BroadcastedButNotConfirmed, AccountOpStatus.BroadcastButStuck]\n\n #callRelayer: Function\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n callRelayer: Function,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController,\n providers: ProvidersController,\n networks: NetworksController,\n onContractsDeployed: (network: Network) => Promise\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = callRelayer\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n this.#onContractsDeployed = onContractsDeployed\n this.#initialLoadPromise = this.#load()\n }\n\n async #load(): Promise {\n await this.#accounts.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n const [accountsOps, signedMessages] = await Promise.all([\n this.#storage.get('accountsOps', {}),\n this.#storage.get('signedMessages', {})\n ])\n\n this.#accountsOps = accountsOps\n this.#signedMessages = signedMessages\n\n this.emitUpdate()\n }\n\n async filterAccountsOps(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n let filteredItems\n\n if (filters.network) {\n filteredItems = this.#accountsOps[filters.account]?.[filters.network] || []\n } else {\n filteredItems = Object.values(this.#accountsOps[filters.account] || []).flat()\n // By default, #accountsOps are grouped by network and sorted in descending order.\n // However, when the network filter is omitted, #accountsOps from different networks are mixed,\n // requiring additional sorting to ensure they are also in descending order.\n filteredItems.sort((a, b) => b.timestamp - a.timestamp)\n }\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.accountsOps[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered AccountsOps session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered accounts ops and we\n // free the memory calling this method.\n resetAccountsOpsFilters(sessionId: string) {\n delete this.accountsOps[sessionId]\n }\n\n // Everytime we add/remove an AccOp, we should run this method in order to keep the filtered and internal accounts ops in sync.\n private async syncFilteredAccountsOps() {\n const promises = Object.keys(this.accountsOps).map(async (sessionId) => {\n await this.filterAccountsOps(\n sessionId,\n this.accountsOps[sessionId].filters,\n this.accountsOps[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async filterSignedMessages(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n const filteredItems = this.#signedMessages[filters.account] || []\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.signedMessages[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered Messages session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered messages and we\n // free the memory calling this method.\n resetSignedMessagesFilters(sessionId: string) {\n delete this.signedMessages[sessionId]\n }\n\n // Everytime we add/remove a Message, we should run this method in order to keep the filtered and internal messages in sync.\n private async syncSignedMessages() {\n const promises = Object.keys(this.signedMessages).map(async (sessionId) => {\n await this.filterSignedMessages(\n sessionId,\n this.signedMessages[sessionId].filters,\n this.signedMessages[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async addAccountOp(accountOp: SubmittedAccountOp) {\n await this.#initialLoadPromise\n\n const { accountAddr, networkId } = accountOp\n\n if (!this.#accountsOps[accountAddr]) this.#accountsOps[accountAddr] = {}\n if (!this.#accountsOps[accountAddr][networkId]) this.#accountsOps[accountAddr][networkId] = []\n\n // newest SubmittedAccountOp goes first in the list\n this.#accountsOps[accountAddr][networkId].unshift({ ...accountOp })\n trim(this.#accountsOps[accountAddr][networkId])\n\n await this.syncFilteredAccountsOps()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n this.emitUpdate()\n }\n\n /**\n * Update AccountsOps statuses (inner and public state, and storage)\n *\n * Here is the algorithm:\n * 0. Once we broadcast an AccountOp, we are adding it to ActivityController via `addAccountOp`,\n * and are setting its status to AccountOpStatus.BroadcastedButNotConfirmed.\n * 1. Here, we firstly rely on `getTransactionReceipt` for determining the status (success or failure).\n * 2. If we don't manage to determine its status, we are comparing AccountOp and Account nonce.\n * If Account nonce is greater than AccountOp, then we know that AccountOp has past nonce (AccountOpStatus.UnknownButPastNonce).\n */\n async updateAccountsOpsStatuses(): Promise<{\n shouldEmitUpdate: boolean\n shouldUpdatePortfolio: boolean\n updatedAccountsOps: SubmittedAccountOp[]\n newestOpTimestamp: number\n }> {\n await this.#initialLoadPromise\n\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return {\n shouldEmitUpdate: false,\n shouldUpdatePortfolio: false,\n updatedAccountsOps: [],\n newestOpTimestamp: 0\n }\n\n // This flag tracks the changes to AccountsOps statuses\n // and optimizes the number of the emitted updates and storage/state updates.\n let shouldEmitUpdate = false\n\n let shouldUpdatePortfolio = false\n const updatedAccountsOps: SubmittedAccountOp[] = []\n\n // Use this flag to make the auto-refresh slower with the passege of time.\n // implementation is in background.ts\n let newestOpTimestamp: number = 0\n\n await Promise.all(\n Object.keys(this.#accountsOps[this.#selectedAccount.account.addr]).map(async (networkId) => {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n if (!network) return\n const provider = this.#providers.providers[network.id]\n\n const selectedAccount = this.#selectedAccount.account?.addr\n\n if (!selectedAccount) return\n\n return Promise.all(\n this.#accountsOps[selectedAccount][networkId].map(async (accountOp, accountOpIndex) => {\n // Don't update the current network account ops statuses,\n // as the statuses are already updated in the previous calls.\n if (accountOp.status !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n shouldEmitUpdate = true\n\n if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) {\n newestOpTimestamp = accountOp.timestamp\n }\n\n const declareStuckIfQuaterPassed = (op: SubmittedAccountOp) => {\n const accountOpDate = new Date(op.timestamp)\n accountOpDate.setMinutes(accountOpDate.getMinutes() + 15)\n const aQuaterHasPassed = accountOpDate < new Date()\n if (aQuaterHasPassed) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.BroadcastButStuck\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n }\n }\n\n const fetchTxnIdResult = await fetchTxnId(\n accountOp.identifiedBy,\n network,\n this.#fetch,\n this.#callRelayer,\n accountOp\n )\n if (fetchTxnIdResult.status === 'rejected') {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.Rejected\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n return\n }\n if (fetchTxnIdResult.status === 'not_found') {\n declareStuckIfQuaterPassed(accountOp)\n return\n }\n\n const txnId = fetchTxnIdResult.txnId as string\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].txnId = txnId\n\n try {\n const receipt = await provider.getTransactionReceipt(txnId)\n if (receipt) {\n // if this is an user op, we have to check the logs\n let isSuccess: boolean | undefined\n if (accountOp.identifiedBy.type === 'UserOperation') {\n const userOpEventLog = parseLogs(receipt.logs, accountOp.identifiedBy.identifier)\n if (userOpEventLog) isSuccess = userOpEventLog.success\n }\n\n // if it's not an userOp or it is, but isSuccess was not found\n if (isSuccess === undefined) isSuccess = !!receipt.status\n\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = isSuccess\n ? AccountOpStatus.Success\n : AccountOpStatus.Failure\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n\n if (receipt.status) {\n shouldUpdatePortfolio = true\n }\n\n if (accountOp.isSingletonDeploy && receipt.status) {\n await this.#onContractsDeployed(network)\n }\n return\n }\n\n // if there's no receipt, confirm there's a txn\n // if there's no txn and 15 minutes have passed, declare it a failure\n const txn = await provider.getTransaction(txnId)\n if (txn) return\n declareStuckIfQuaterPassed(accountOp)\n } catch {\n this.emitError({\n level: 'silent',\n message: `Failed to determine transaction status on ${accountOp.networkId} for ${accountOp.txnId}.`,\n error: new Error(\n `activity: failed to get transaction receipt for ${accountOp.txnId}`\n )\n })\n }\n\n // if there are more than 1 txns with the same nonce and payer,\n // we can conclude this one is replaced by fee\n const sameNonceTxns = this.#accountsOps[selectedAccount][networkId].filter(\n (accOp) =>\n accOp.gasFeePayment &&\n accountOp.gasFeePayment &&\n accOp.gasFeePayment.paidBy === accountOp.gasFeePayment.paidBy &&\n accOp.nonce.toString() === accountOp.nonce.toString()\n )\n const confirmedSameNonceTxns = sameNonceTxns.find(\n (accOp) =>\n accOp.status === AccountOpStatus.Success || accOp.status === AccountOpStatus.Failure\n )\n if (sameNonceTxns.length > 1 && !!confirmedSameNonceTxns) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.UnknownButPastNonce\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n shouldUpdatePortfolio = true\n }\n })\n )\n })\n )\n\n if (shouldEmitUpdate) {\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.syncFilteredAccountsOps()\n this.emitUpdate()\n }\n\n return { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp }\n }\n\n async addSignedMessage(signedMessage: SignedMessage, account: string) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) this.#signedMessages[account] = []\n\n // newest SignedMessage goes first in the list\n this.#signedMessages[account].unshift(signedMessage)\n trim(this.#signedMessages[account])\n await this.syncSignedMessages()\n\n await this.#storage.set('signedMessages', this.#signedMessages)\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n await this.#initialLoadPromise\n\n delete this.#accountsOps[address]\n delete this.#signedMessages[address]\n\n await this.syncFilteredAccountsOps()\n await this.syncSignedMessages()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.#storage.set('signedMessages', this.#signedMessages)\n\n this.emitUpdate()\n }\n\n async hideBanner({\n addr,\n network,\n timestamp\n }: {\n addr: string\n network: string\n timestamp: number\n }) {\n await this.#initialLoadPromise\n\n // shouldn't happen\n if (!this.#accountsOps[addr]) return\n if (!this.#accountsOps[addr][network]) return\n\n // find the op we want to update\n const op = this.#accountsOps[addr][network].find((accOp) => accOp.timestamp === timestamp)\n if (!op) return\n\n // update by reference\n if (!op.flags) op.flags = {}\n op.flags.hideActivityBanner = true\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n\n this.emitUpdate()\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n \"Looks like your activity couldn't be processed. Retry, or contact support if issue persists.\",\n error: new Error('activity: controller not initialized')\n })\n }\n\n get broadcastedButNotConfirmed(): SubmittedAccountOp[] {\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return []\n\n return Object.values(this.#accountsOps[this.#selectedAccount.account.addr])\n .flat()\n .filter((accountOp) => accountOp.status === AccountOpStatus.BroadcastedButNotConfirmed)\n }\n\n get banners(): Banner[] {\n if (!this.#networks.isInitialized) return []\n return (\n this.broadcastedButNotConfirmed\n // do not show a banner for forcefully hidden banners\n .filter((op) => !(op.flags && op.flags.hideActivityBanner))\n .map((accountOp) => {\n const network = this.#networks.networks.find((x) => x.id === accountOp.networkId)!\n\n const url = `https://benzin.ambire.com/${getBenzinUrlParams({\n chainId: network.chainId,\n txnId: accountOp.txnId,\n identifiedBy: accountOp.identifiedBy\n })}`\n\n return {\n id: accountOp.txnId,\n type: 'success',\n category: 'pending-to-be-confirmed-acc-op',\n title: 'Transaction successfully signed and sent!\\nCheck it out on the block explorer!',\n text: '',\n actions: [\n {\n label: 'Close',\n actionName: 'hide-activity-banner',\n meta: {\n addr: accountOp.accountAddr,\n network: accountOp.networkId,\n timestamp: accountOp.timestamp,\n isHideStyle: true\n }\n },\n {\n label: 'Check',\n actionName: 'open-external-url',\n meta: { url }\n }\n ]\n } as Banner\n })\n )\n }\n\n /**\n * A not confirmed account op can actually be with a status of BroadcastButNotConfirmed\n * and BroadcastButStuck. Typically, it becomes BroadcastButStuck if not confirmed\n * in a 15 minutes interval after becoming BroadcastButNotConfirmed. We need two\n * statuses to hide the banner of BroadcastButNotConfirmed from the dashboard.\n */\n getNotConfirmedOpIfAny(accId: AccountId, networkId: Network['id']): SubmittedAccountOp | null {\n const acc = this.#accounts.accounts.find((oneA) => oneA.addr === accId)\n if (!acc) return null\n\n // if the broadcasting account is a smart account, it means relayer\n // broadcast => it's in this.#accountsOps[acc.addr][networkId]\n // disregard erc-4337 txns as they shouldn't have an RBF\n const isSA = isSmartAccount(acc)\n if (isSA) {\n if (!this.#accountsOps[acc.addr] || !this.#accountsOps[acc.addr][networkId]) return null\n if (!this.#rbfStatuses.includes(this.#accountsOps[acc.addr][networkId][0].status!))\n return null\n\n return this.#accountsOps[acc.addr][networkId][0]\n }\n\n // if the account is an EOA, we have to go through all the smart accounts\n // to check whether the EOA has made a broadcast for them\n const theEOAandSAaccounts = this.#accounts.accounts.filter(\n (oneA) => isSmartAccount(oneA) || oneA.addr === accId\n )\n const ops: SubmittedAccountOp[] = []\n theEOAandSAaccounts.forEach((oneA) => {\n if (!this.#accountsOps[oneA.addr] || !this.#accountsOps[oneA.addr][networkId]) return\n const op = this.#accountsOps[oneA.addr][networkId].find(\n (oneOp) =>\n this.#rbfStatuses.includes(this.#accountsOps[oneA.addr][networkId][0].status!) &&\n oneOp.gasFeePayment?.paidBy === oneA.addr\n )\n if (!op) return\n ops.push(op)\n })\n return !ops.length ? null : ops.reduce((m, e) => (e.nonce > m.nonce ? e : m))\n }\n\n getLastTxn(networkId: Network['id']): SubmittedAccountOp | null {\n if (\n !this.#selectedAccount.account ||\n !this.#accountsOps[this.#selectedAccount.account.addr] ||\n !this.#accountsOps[this.#selectedAccount.account.addr][networkId]\n )\n return null\n\n return this.#accountsOps[this.#selectedAccount.account.addr][networkId][0]\n }\n\n async findMessage(account: string, filter: (item: SignedMessage) => boolean) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) return null\n\n return this.#signedMessages[account].find(filter)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n broadcastedButNotConfirmed: this.broadcastedButNotConfirmed, // includes the getter in the stringified instance\n banners: this.banners // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/controllers/activity/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { fetchTxnId, SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\n/* eslint-disable import/no-extraneous-dependencies */\nimport { parseLogs } from '../../libs/userOperation/userOperation'\nimport { getBenzinUrlParams } from '../../utils/benzin'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport interface Pagination {\n fromPage: number\n itemsPerPage: number\n}\n\ninterface PaginationResult {\n items: T[]\n itemsTotal: number\n currentPage: number\n maxPages: number\n}\n\nexport interface SignedMessage extends Message {\n dapp: {\n name: string\n icon: string\n } | null\n timestamp: number\n}\n\ninterface AccountsOps extends PaginationResult {}\ninterface MessagesToBeSigned extends PaginationResult {}\n\nexport interface Filters {\n account: string\n network?: string\n}\n\ninterface InternalAccountsOps {\n // account => network => SubmittedAccountOp[]\n [key: string]: { [key: string]: SubmittedAccountOp[] }\n}\n\ninterface InternalSignedMessages {\n // account => Message[]\n [key: string]: SignedMessage[]\n}\n\n// We are limiting items array to include no more than 1000 records,\n// as we trim out the oldest ones (in the beginning of the items array).\n// We do this to maintain optimal storage and performance.\nconst trim = (items: T[], maxSize = 1000): void => {\n if (items.length > maxSize) {\n // If the array size is greater than maxSize, remove the last (oldest) item\n // newest items are added to the beginning of the array so oldest will be at the end (thats why we .pop())\n items.pop()\n }\n}\n\nconst paginate = (items: any[], fromPage: number, itemsPerPage: number) => {\n return {\n items: items.slice(fromPage * itemsPerPage, fromPage * itemsPerPage + itemsPerPage),\n itemsTotal: items.length,\n currentPage: fromPage, // zero/index based\n maxPages: Math.ceil(items.length / itemsPerPage)\n }\n}\n\n/**\n * Activity Controller\n * Manages signed AccountsOps and Messages in controller memory and browser storage.\n *\n * Raw, unfiltered data is stored in private properties `ActivityController.#accountsOps` and\n * `ActivityController.#signedMessages`.\n *\n * Public methods and properties are exposed for retrieving data with filtering and pagination.\n *\n * To apply filters or pagination, call `filterAccountsOps()` or `filterSignedMessages()` with the\n * required parameters. Filtered items are stored in `ActivityController.accountsOps` and\n * `ActivityController.signedMessages` by session ID.\n *\n * Sessions ensure that each page manages its own filters and pagination independently. For example,\n * filters in \"Settings -> Transactions History\" and \"Dashboard -> Activity Tab\" are isolated per session.\n *\n * After adding or removing an AccountOp or SignedMessage, call `syncFilteredAccountsOps()` or\n * `syncFilteredSignedMessages()` to synchronize filtered data with the source data.\n *\n * The frontend is responsible for clearing filtered items for a session when a component unmounts\n * by calling `resetAccountsOpsFilters()` or `resetSignedMessagesFilters()`. If not cleared, all\n * sessions will be automatically removed when the browser is closed or the controller terminates.\n *\n * 💡 For performance, items per account and network are limited to 1000.\n * Older items are trimmed, keeping the most recent ones.\n */\nexport class ActivityController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n #accountsOps: InternalAccountsOps = {}\n\n accountsOps: {\n [sessionId: string]: {\n result: AccountsOps\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #signedMessages: InternalSignedMessages = {}\n\n signedMessages: {\n [sessionId: string]: {\n result: MessagesToBeSigned\n filters: Filters\n pagination: Pagination\n }\n } = {}\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #onContractsDeployed: (network: Network) => Promise\n\n #rbfStatuses = [AccountOpStatus.BroadcastedButNotConfirmed, AccountOpStatus.BroadcastButStuck]\n\n #callRelayer: Function\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n callRelayer: Function,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController,\n providers: ProvidersController,\n networks: NetworksController,\n onContractsDeployed: (network: Network) => Promise\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = callRelayer\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n this.#onContractsDeployed = onContractsDeployed\n this.#initialLoadPromise = this.#load()\n }\n\n async #load(): Promise {\n await this.#accounts.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n const [accountsOps, signedMessages] = await Promise.all([\n this.#storage.get('accountsOps', {}),\n this.#storage.get('signedMessages', {})\n ])\n\n this.#accountsOps = accountsOps\n this.#signedMessages = signedMessages\n\n this.emitUpdate()\n }\n\n async filterAccountsOps(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n let filteredItems\n\n if (filters.network) {\n filteredItems = this.#accountsOps[filters.account]?.[filters.network] || []\n } else {\n filteredItems = Object.values(this.#accountsOps[filters.account] || []).flat()\n // By default, #accountsOps are grouped by network and sorted in descending order.\n // However, when the network filter is omitted, #accountsOps from different networks are mixed,\n // requiring additional sorting to ensure they are also in descending order.\n filteredItems.sort((a, b) => b.timestamp - a.timestamp)\n }\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.accountsOps[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered AccountsOps session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered accounts ops and we\n // free the memory calling this method.\n resetAccountsOpsFilters(sessionId: string) {\n delete this.accountsOps[sessionId]\n }\n\n // Everytime we add/remove an AccOp, we should run this method in order to keep the filtered and internal accounts ops in sync.\n private async syncFilteredAccountsOps() {\n const promises = Object.keys(this.accountsOps).map(async (sessionId) => {\n await this.filterAccountsOps(\n sessionId,\n this.accountsOps[sessionId].filters,\n this.accountsOps[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async filterSignedMessages(\n sessionId: string,\n filters: Filters,\n pagination: Pagination = {\n fromPage: 0,\n itemsPerPage: 10\n }\n ) {\n await this.#initialLoadPromise\n\n const filteredItems = this.#signedMessages[filters.account] || []\n\n const result = paginate(filteredItems, pagination.fromPage, pagination.itemsPerPage)\n\n this.signedMessages[sessionId] = {\n result,\n filters,\n pagination\n }\n\n this.emitUpdate()\n }\n\n // Reset filtered Messages session.\n // Example: when a FE component is being unmounted, we don't need anymore the filtered messages and we\n // free the memory calling this method.\n resetSignedMessagesFilters(sessionId: string) {\n delete this.signedMessages[sessionId]\n }\n\n // Everytime we add/remove a Message, we should run this method in order to keep the filtered and internal messages in sync.\n private async syncSignedMessages() {\n const promises = Object.keys(this.signedMessages).map(async (sessionId) => {\n await this.filterSignedMessages(\n sessionId,\n this.signedMessages[sessionId].filters,\n this.signedMessages[sessionId].pagination\n )\n })\n\n await Promise.all(promises)\n }\n\n async addAccountOp(accountOp: SubmittedAccountOp) {\n await this.#initialLoadPromise\n\n const { accountAddr, networkId } = accountOp\n\n if (!this.#accountsOps[accountAddr]) this.#accountsOps[accountAddr] = {}\n if (!this.#accountsOps[accountAddr][networkId]) this.#accountsOps[accountAddr][networkId] = []\n\n // newest SubmittedAccountOp goes first in the list\n this.#accountsOps[accountAddr][networkId].unshift({ ...accountOp })\n trim(this.#accountsOps[accountAddr][networkId])\n\n await this.syncFilteredAccountsOps()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n this.emitUpdate()\n }\n\n /**\n * Update AccountsOps statuses (inner and public state, and storage)\n *\n * Here is the algorithm:\n * 0. Once we broadcast an AccountOp, we are adding it to ActivityController via `addAccountOp`,\n * and are setting its status to AccountOpStatus.BroadcastedButNotConfirmed.\n * 1. Here, we firstly rely on `getTransactionReceipt` for determining the status (success or failure).\n * 2. If we don't manage to determine its status, we are comparing AccountOp and Account nonce.\n * If Account nonce is greater than AccountOp, then we know that AccountOp has past nonce (AccountOpStatus.UnknownButPastNonce).\n */\n async updateAccountsOpsStatuses(): Promise<{\n shouldEmitUpdate: boolean\n shouldUpdatePortfolio: boolean\n updatedAccountsOps: SubmittedAccountOp[]\n newestOpTimestamp: number\n }> {\n await this.#initialLoadPromise\n\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return {\n shouldEmitUpdate: false,\n shouldUpdatePortfolio: false,\n updatedAccountsOps: [],\n newestOpTimestamp: 0\n }\n\n // This flag tracks the changes to AccountsOps statuses\n // and optimizes the number of the emitted updates and storage/state updates.\n let shouldEmitUpdate = false\n\n let shouldUpdatePortfolio = false\n const updatedAccountsOps: SubmittedAccountOp[] = []\n\n // Use this flag to make the auto-refresh slower with the passege of time.\n // implementation is in background.ts\n let newestOpTimestamp: number = 0\n\n await Promise.all(\n Object.keys(this.#accountsOps[this.#selectedAccount.account.addr]).map(async (networkId) => {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n if (!network) return\n const provider = this.#providers.providers[network.id]\n\n const selectedAccount = this.#selectedAccount.account?.addr\n\n if (!selectedAccount) return\n\n return Promise.all(\n this.#accountsOps[selectedAccount][networkId].map(async (accountOp, accountOpIndex) => {\n // Don't update the current network account ops statuses,\n // as the statuses are already updated in the previous calls.\n if (accountOp.status !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n shouldEmitUpdate = true\n\n if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) {\n newestOpTimestamp = accountOp.timestamp\n }\n\n const declareStuckIfQuaterPassed = (op: SubmittedAccountOp) => {\n const accountOpDate = new Date(op.timestamp)\n accountOpDate.setMinutes(accountOpDate.getMinutes() + 15)\n const aQuaterHasPassed = accountOpDate < new Date()\n if (aQuaterHasPassed) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.BroadcastButStuck\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n }\n }\n\n const fetchTxnIdResult = await fetchTxnId(\n accountOp.identifiedBy,\n network,\n this.#fetch,\n this.#callRelayer,\n accountOp\n )\n if (fetchTxnIdResult.status === 'rejected') {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.Rejected\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n return\n }\n if (fetchTxnIdResult.status === 'not_found') {\n declareStuckIfQuaterPassed(accountOp)\n return\n }\n\n const txnId = fetchTxnIdResult.txnId as string\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].txnId = txnId\n\n try {\n const receipt = await provider.getTransactionReceipt(txnId)\n if (receipt) {\n // if this is an user op, we have to check the logs\n let isSuccess: boolean | undefined\n if (accountOp.identifiedBy.type === 'UserOperation') {\n const userOpEventLog = parseLogs(receipt.logs, accountOp.identifiedBy.identifier)\n if (userOpEventLog) isSuccess = userOpEventLog.success\n }\n\n // if it's not an userOp or it is, but isSuccess was not found\n if (isSuccess === undefined) isSuccess = !!receipt.status\n\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status = isSuccess\n ? AccountOpStatus.Success\n : AccountOpStatus.Failure\n updatedAccountsOps.push(\n this.#accountsOps[selectedAccount][networkId][accountOpIndex]\n )\n\n if (receipt.status) {\n shouldUpdatePortfolio = true\n }\n\n if (accountOp.isSingletonDeploy && receipt.status) {\n await this.#onContractsDeployed(network)\n }\n return\n }\n\n // if there's no receipt, confirm there's a txn\n // if there's no txn and 15 minutes have passed, declare it a failure\n const txn = await provider.getTransaction(txnId)\n if (txn) return\n declareStuckIfQuaterPassed(accountOp)\n } catch {\n this.emitError({\n level: 'silent',\n message: `Failed to determine transaction status on ${accountOp.networkId} for ${accountOp.txnId}.`,\n error: new Error(\n `activity: failed to get transaction receipt for ${accountOp.txnId}`\n )\n })\n }\n\n // if there are more than 1 txns with the same nonce and payer,\n // we can conclude this one is replaced by fee\n const sameNonceTxns = this.#accountsOps[selectedAccount][networkId].filter(\n (accOp) =>\n accOp.gasFeePayment &&\n accountOp.gasFeePayment &&\n accOp.gasFeePayment.paidBy === accountOp.gasFeePayment.paidBy &&\n accOp.nonce.toString() === accountOp.nonce.toString()\n )\n const confirmedSameNonceTxns = sameNonceTxns.find(\n (accOp) =>\n accOp.status === AccountOpStatus.Success || accOp.status === AccountOpStatus.Failure\n )\n if (sameNonceTxns.length > 1 && !!confirmedSameNonceTxns) {\n this.#accountsOps[selectedAccount][networkId][accountOpIndex].status =\n AccountOpStatus.UnknownButPastNonce\n updatedAccountsOps.push(this.#accountsOps[selectedAccount][networkId][accountOpIndex])\n shouldUpdatePortfolio = true\n }\n })\n )\n })\n )\n\n if (shouldEmitUpdate) {\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.syncFilteredAccountsOps()\n this.emitUpdate()\n }\n\n return { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp }\n }\n\n async addSignedMessage(signedMessage: SignedMessage, account: string) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) this.#signedMessages[account] = []\n\n // newest SignedMessage goes first in the list\n this.#signedMessages[account].unshift(signedMessage)\n trim(this.#signedMessages[account])\n await this.syncSignedMessages()\n\n await this.#storage.set('signedMessages', this.#signedMessages)\n this.emitUpdate()\n }\n\n async removeAccountData(address: Account['addr']) {\n await this.#initialLoadPromise\n\n delete this.#accountsOps[address]\n delete this.#signedMessages[address]\n\n await this.syncFilteredAccountsOps()\n await this.syncSignedMessages()\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n await this.#storage.set('signedMessages', this.#signedMessages)\n\n this.emitUpdate()\n }\n\n async hideBanner({\n addr,\n network,\n timestamp\n }: {\n addr: string\n network: string\n timestamp: number\n }) {\n await this.#initialLoadPromise\n\n // shouldn't happen\n if (!this.#accountsOps[addr]) return\n if (!this.#accountsOps[addr][network]) return\n\n // find the op we want to update\n const op = this.#accountsOps[addr][network].find((accOp) => accOp.timestamp === timestamp)\n if (!op) return\n\n // update by reference\n if (!op.flags) op.flags = {}\n op.flags.hideActivityBanner = true\n\n await this.#storage.set('accountsOps', this.#accountsOps)\n\n this.emitUpdate()\n }\n\n #throwNotInitialized() {\n this.emitError({\n level: 'major',\n message:\n \"Looks like your activity couldn't be processed. Retry, or contact support if issue persists.\",\n error: new Error('activity: controller not initialized')\n })\n }\n\n get broadcastedButNotConfirmed(): SubmittedAccountOp[] {\n if (!this.#selectedAccount.account || !this.#accountsOps[this.#selectedAccount.account.addr])\n return []\n\n return Object.values(this.#accountsOps[this.#selectedAccount.account.addr])\n .flat()\n .filter((accountOp) => accountOp.status === AccountOpStatus.BroadcastedButNotConfirmed)\n }\n\n get banners(): Banner[] {\n if (!this.#networks.isInitialized) return []\n return (\n this.broadcastedButNotConfirmed\n // do not show a banner for forcefully hidden banners\n .filter((op) => !(op.flags && op.flags.hideActivityBanner))\n .map((accountOp) => {\n const network = this.#networks.networks.find((x) => x.id === accountOp.networkId)!\n\n const url = `https://benzin.ambire.com/${getBenzinUrlParams({\n chainId: network.chainId,\n txnId: accountOp.txnId,\n identifiedBy: accountOp.identifiedBy\n })}`\n\n return {\n id: accountOp.txnId,\n type: 'success',\n category: 'pending-to-be-confirmed-acc-op',\n title: 'Transaction successfully signed and sent!\\nCheck it out on the block explorer!',\n text: '',\n actions: [\n {\n label: 'Close',\n actionName: 'hide-activity-banner',\n meta: {\n addr: accountOp.accountAddr,\n network: accountOp.networkId,\n timestamp: accountOp.timestamp,\n isHideStyle: true\n }\n },\n {\n label: 'Check',\n actionName: 'open-external-url',\n meta: { url }\n }\n ]\n } as Banner\n })\n )\n }\n\n /**\n * A not confirmed account op can actually be with a status of BroadcastButNotConfirmed\n * and BroadcastButStuck. Typically, it becomes BroadcastButStuck if not confirmed\n * in a 15 minutes interval after becoming BroadcastButNotConfirmed. We need two\n * statuses to hide the banner of BroadcastButNotConfirmed from the dashboard.\n */\n getNotConfirmedOpIfAny(accId: AccountId, networkId: Network['id']): SubmittedAccountOp | null {\n const acc = this.#accounts.accounts.find((oneA) => oneA.addr === accId)\n if (!acc) return null\n\n // if the broadcasting account is a smart account, it means relayer\n // broadcast => it's in this.#accountsOps[acc.addr][networkId]\n // disregard erc-4337 txns as they shouldn't have an RBF\n const isSA = isSmartAccount(acc)\n if (isSA) {\n if (!this.#accountsOps[acc.addr] || !this.#accountsOps[acc.addr][networkId]) return null\n if (!this.#rbfStatuses.includes(this.#accountsOps[acc.addr][networkId][0].status!))\n return null\n\n return this.#accountsOps[acc.addr][networkId][0]\n }\n\n // if the account is an EOA, we have to go through all the smart accounts\n // to check whether the EOA has made a broadcast for them\n const theEOAandSAaccounts = this.#accounts.accounts.filter(\n (oneA) => isSmartAccount(oneA) || oneA.addr === accId\n )\n const ops: SubmittedAccountOp[] = []\n theEOAandSAaccounts.forEach((oneA) => {\n if (!this.#accountsOps[oneA.addr] || !this.#accountsOps[oneA.addr][networkId]) return\n const op = this.#accountsOps[oneA.addr][networkId].find(\n (oneOp) =>\n this.#rbfStatuses.includes(this.#accountsOps[oneA.addr][networkId][0].status!) &&\n oneOp.gasFeePayment?.paidBy === oneA.addr\n )\n if (!op) return\n ops.push(op)\n })\n return !ops.length ? null : ops.reduce((m, e) => (e.nonce > m.nonce ? e : m))\n }\n\n getLastTxn(networkId: Network['id']): SubmittedAccountOp | null {\n if (\n !this.#selectedAccount.account ||\n !this.#accountsOps[this.#selectedAccount.account.addr] ||\n !this.#accountsOps[this.#selectedAccount.account.addr][networkId]\n )\n return null\n\n return this.#accountsOps[this.#selectedAccount.account.addr][networkId][0]\n }\n\n async findMessage(account: string, filter: (item: SignedMessage) => boolean) {\n await this.#initialLoadPromise\n\n if (!this.#signedMessages[account]) return null\n\n return this.#signedMessages[account].find(filter)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n broadcastedButNotConfirmed: this.broadcastedButNotConfirmed, // includes the getter in the stringified instance\n banners: this.banners // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.js b/dist/src/controllers/addressBook/addressBook.js index 4801eef64..6e79961cb 100644 --- a/dist/src/controllers/addressBook/addressBook.js +++ b/dist/src/controllers/addressBook/addressBook.js @@ -1,12 +1,16 @@ -import { getAddress } from 'ethers'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AddressBookController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); /** * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book: * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller. * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one. * Both types of contacts are combined and returned as a single array of contacts. */ -export class AddressBookController extends EventEmitter { +class AddressBookController extends eventEmitter_1.default { // Manually added contact (stored in storage) #manuallyAddedContacts = []; #storage; @@ -60,7 +64,7 @@ export class AddressBookController extends EventEmitter { } #getChecksummedAddress(address) { try { - return getAddress(address); + return (0, ethers_1.getAddress)(address); } catch { this.emitError({ @@ -132,4 +136,5 @@ export class AddressBookController extends EventEmitter { }; } } +exports.AddressBookController = AddressBookController; //# sourceMappingURL=addressBook.js.map \ No newline at end of file diff --git a/dist/src/controllers/addressBook/addressBook.js.map b/dist/src/controllers/addressBook/addressBook.js.map index ab0b7127e..e8f98bceb 100644 --- a/dist/src/controllers/addressBook/addressBook.js.map +++ b/dist/src/controllers/addressBook/addressBook.js.map @@ -1 +1 @@ -{"version":3,"file":"addressBook.js","sourceRoot":"","sources":["../../../../src/controllers/addressBook/addressBook.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { Account } from '../../interfaces/account'\nimport { Storage } from '../../interfaces/storage'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport type Contact = {\n name: string\n address: Account['addr']\n isWalletAccount?: boolean\n createdAt?: number\n updatedAt?: number\n}\n\nexport type Contacts = Array\n\n/**\n * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book:\n * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller.\n * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one.\n * Both types of contacts are combined and returned as a single array of contacts.\n */\n\nexport class AddressBookController extends EventEmitter {\n // Manually added contact (stored in storage)\n #manuallyAddedContacts: Contacts = []\n\n #storage: Storage\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n constructor(\n storage: Storage,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController\n ) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n\n this.#initialLoadPromise = this.#load()\n }\n\n // Contacts, generated on the fly from the accounts in the wallet (not stored in storage)\n get #walletAccountsSourcedContacts() {\n return this.#accounts.accounts.map((account) => ({\n name: account.preferences.label,\n address: account.addr,\n isWalletAccount: true\n }))\n }\n\n get contacts() {\n if (!this.#selectedAccount.account) return []\n\n return [...this.#manuallyAddedContacts, ...this.#walletAccountsSourcedContacts].filter(\n ({ address }) => address !== this.#selectedAccount.account!.addr\n )\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n try {\n this.#manuallyAddedContacts = await this.#storage.get('contacts', [])\n this.emitUpdate()\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Address Book. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('Address Book: failed to load contacts from the Address Book')\n })\n }\n }\n\n #handleManuallyAddedContactsChange() {\n this.emitUpdate()\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('contacts', this.#manuallyAddedContacts)\n }\n\n #findManuallyAddedContactWithAddress(address: string) {\n return this.#manuallyAddedContacts.find(\n (contact) => contact.address.toLowerCase() === address.toLowerCase()\n )\n }\n\n #findContactWithAddress(address: string) {\n return !this.contacts.some((contact) => contact.address.toLowerCase() === address.toLowerCase())\n }\n\n #getChecksummedAddress(address: string) {\n try {\n return getAddress(address)\n } catch {\n this.emitError({\n message: 'Invalid address',\n level: 'minor',\n error: new Error('Address Book: invalid address')\n })\n return ''\n }\n }\n\n async addContact(name: string, address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedName = name.trim()\n\n if (!this.#findContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: 'Contact with this address already exists in the Address Book',\n level: 'minor',\n error: new Error(\n 'Address Book: contact with this address already exists in the Address Book'\n )\n })\n return\n }\n\n this.#manuallyAddedContacts.push({\n name: trimmedName,\n address: checksummedAddress,\n createdAt: Date.now(),\n updatedAt: Date.now()\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async renameManuallyAddedContact(address: string, newName: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedNewName = newName.trim()\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't rename contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't rename contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.map((contact) => {\n if (contact.address.toLowerCase() === address.toLowerCase()) {\n return { ...contact, name: trimmedNewName, updatedAt: Date.now() }\n }\n\n return contact\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async removeManuallyAddedContact(address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't remove contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't remove contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.filter(\n (contact) => contact.address.toLowerCase() !== address.toLowerCase()\n )\n\n this.#handleManuallyAddedContactsChange()\n }\n\n toJSON() {\n return {\n ...this,\n contacts: this.contacts\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"addressBook.js","sourceRoot":"","sources":["../../../../src/controllers/addressBook/addressBook.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { Account } from '../../interfaces/account'\nimport { Storage } from '../../interfaces/storage'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport type Contact = {\n name: string\n address: Account['addr']\n isWalletAccount?: boolean\n createdAt?: number\n updatedAt?: number\n}\n\nexport type Contacts = Array\n\n/**\n * AddressBook controller- responsible for managing contacts in the Address Book. There are two internal types of contacts in the Address Book:\n * 1. Manually added contacts (stored in storage)- can be added, renamed and removed using this controller.\n * 2. Contacts, generated on the fly from the accounts in the wallet (not stored in storage)- can be managed via other controllers and are read-only in this one.\n * Both types of contacts are combined and returned as a single array of contacts.\n */\n\nexport class AddressBookController extends EventEmitter {\n // Manually added contact (stored in storage)\n #manuallyAddedContacts: Contacts = []\n\n #storage: Storage\n\n #initialLoadPromise: Promise\n\n #accounts: AccountsController\n\n #selectedAccount: SelectedAccountController\n\n constructor(\n storage: Storage,\n accounts: AccountsController,\n selectedAccount: SelectedAccountController\n ) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n this.#selectedAccount = selectedAccount\n\n this.#initialLoadPromise = this.#load()\n }\n\n // Contacts, generated on the fly from the accounts in the wallet (not stored in storage)\n get #walletAccountsSourcedContacts() {\n return this.#accounts.accounts.map((account) => ({\n name: account.preferences.label,\n address: account.addr,\n isWalletAccount: true\n }))\n }\n\n get contacts() {\n if (!this.#selectedAccount.account) return []\n\n return [...this.#manuallyAddedContacts, ...this.#walletAccountsSourcedContacts].filter(\n ({ address }) => address !== this.#selectedAccount.account!.addr\n )\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n try {\n this.#manuallyAddedContacts = await this.#storage.get('contacts', [])\n this.emitUpdate()\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Address Book. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('Address Book: failed to load contacts from the Address Book')\n })\n }\n }\n\n #handleManuallyAddedContactsChange() {\n this.emitUpdate()\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('contacts', this.#manuallyAddedContacts)\n }\n\n #findManuallyAddedContactWithAddress(address: string) {\n return this.#manuallyAddedContacts.find(\n (contact) => contact.address.toLowerCase() === address.toLowerCase()\n )\n }\n\n #findContactWithAddress(address: string) {\n return !this.contacts.some((contact) => contact.address.toLowerCase() === address.toLowerCase())\n }\n\n #getChecksummedAddress(address: string) {\n try {\n return getAddress(address)\n } catch {\n this.emitError({\n message: 'Invalid address',\n level: 'minor',\n error: new Error('Address Book: invalid address')\n })\n return ''\n }\n }\n\n async addContact(name: string, address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedName = name.trim()\n\n if (!this.#findContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: 'Contact with this address already exists in the Address Book',\n level: 'minor',\n error: new Error(\n 'Address Book: contact with this address already exists in the Address Book'\n )\n })\n return\n }\n\n this.#manuallyAddedContacts.push({\n name: trimmedName,\n address: checksummedAddress,\n createdAt: Date.now(),\n updatedAt: Date.now()\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async renameManuallyAddedContact(address: string, newName: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n const trimmedNewName = newName.trim()\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't rename contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't rename contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.map((contact) => {\n if (contact.address.toLowerCase() === address.toLowerCase()) {\n return { ...contact, name: trimmedNewName, updatedAt: Date.now() }\n }\n\n return contact\n })\n\n this.#handleManuallyAddedContactsChange()\n }\n\n async removeManuallyAddedContact(address: string) {\n await this.#initialLoadPromise\n const checksummedAddress = this.#getChecksummedAddress(address)\n\n if (!this.#findManuallyAddedContactWithAddress(checksummedAddress)) {\n this.emitError({\n message: \"Can't remove contact that doesn't exist in the Address Book\",\n level: 'minor',\n error: new Error(\n \"Address Book: can't remove contact that doesn't exist in the Address Book\"\n )\n })\n return\n }\n\n this.#manuallyAddedContacts = this.#manuallyAddedContacts.filter(\n (contact) => contact.address.toLowerCase() !== address.toLowerCase()\n )\n\n this.#handleManuallyAddedContactsChange()\n }\n\n toJSON() {\n return {\n ...this,\n contacts: this.contacts\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.js b/dist/src/controllers/dapps/dapps.js index c04df5607..1348931f2 100644 --- a/dist/src/controllers/dapps/dapps.js +++ b/dist/src/controllers/dapps/dapps.js @@ -1,12 +1,16 @@ -import { Session } from '../../classes/session'; -import predefinedDapps from '../../consts/dappCatalog.json'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DappsController = void 0; +const tslib_1 = require("tslib"); +const session_1 = require("../../classes/session"); +const dappCatalog_json_1 = tslib_1.__importDefault(require("../../consts/dappCatalog.json")); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); // The DappsController is responsible for the following tasks: // 1. Managing the dApp catalog // 2. Handling active sessions between dApps and the wallet // 3. Broadcasting events from the wallet to connected dApps via the Session // The possible events include: accountsChanged, chainChanged, disconnect, lock, unlock, and connect. -export class DappsController extends EventEmitter { +class DappsController extends eventEmitter_1.default { #dapps = []; #storage; dappSessions = {}; @@ -22,7 +26,7 @@ export class DappsController extends EventEmitter { return !!this.dapps; } get dapps() { - const predefinedDappsParsed = predefinedDapps.map(({ url, name, icon, description }) => ({ + const predefinedDappsParsed = dappCatalog_json_1.default.map(({ url, name, icon, description }) => ({ name, description, url, @@ -50,7 +54,7 @@ export class DappsController extends EventEmitter { ]); this.#dapps = storedDapps; Object.keys(dappSessions).forEach((sessionId) => { - const session = new Session(dappSessions[sessionId]); + const session = new session_1.Session(dappSessions[sessionId]); this.dappSessions[sessionId] = session; }); this.emitUpdate(); @@ -64,7 +68,7 @@ export class DappsController extends EventEmitter { this.#storage.set('dappSessions', this.dappSessions); } #createDappSession = (data) => { - const dappSession = new Session(data); + const dappSession = new session_1.Session(data); this.#dappSessionsSet(dappSession.sessionId, dappSession); this.emitUpdate(); return dappSession; @@ -141,7 +145,7 @@ export class DappsController extends EventEmitter { if (!this.isReady) return; // do not remove predefined dapps - if (predefinedDapps.find((d) => d.url === url)) + if (dappCatalog_json_1.default.find((d) => d.url === url)) return; this.dapps = this.dapps.filter((d) => d.url !== url); this.emitUpdate(); @@ -166,4 +170,5 @@ export class DappsController extends EventEmitter { }; } } +exports.DappsController = DappsController; //# sourceMappingURL=dapps.js.map \ No newline at end of file diff --git a/dist/src/controllers/dapps/dapps.js.map b/dist/src/controllers/dapps/dapps.js.map index b9d9edf68..da41f46ab 100644 --- a/dist/src/controllers/dapps/dapps.js.map +++ b/dist/src/controllers/dapps/dapps.js.map @@ -1 +1 @@ -{"version":3,"file":"dapps.js","sourceRoot":"","sources":["../../../../src/controllers/dapps/dapps.ts"],"names":[],"mappings":"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","sourcesContent":["import { Session, SessionProp } from '../../classes/session'\nimport predefinedDapps from '../../consts/dappCatalog.json'\nimport { Dapp } from '../../interfaces/dapp'\nimport { Messenger } from '../../interfaces/messenger'\nimport { Storage } from '../../interfaces/storage'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// The DappsController is responsible for the following tasks:\n// 1. Managing the dApp catalog\n// 2. Handling active sessions between dApps and the wallet\n// 3. Broadcasting events from the wallet to connected dApps via the Session\n\n// The possible events include: accountsChanged, chainChanged, disconnect, lock, unlock, and connect.\n\nexport class DappsController extends EventEmitter {\n #dapps: Dapp[] = []\n\n #storage: Storage\n\n dappSessions: { [key: string]: Session } = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(_storage: Storage) {\n super()\n\n this.#storage = _storage\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isReady() {\n return !!this.dapps\n }\n\n get dapps(): Dapp[] {\n const predefinedDappsParsed = predefinedDapps.map(\n ({ url, name, icon, description }): Dapp => ({\n name,\n description,\n url,\n icon,\n isConnected: false,\n chainId: 1,\n favorite: false\n })\n )\n\n return [...this.#dapps, ...predefinedDappsParsed].reduce((acc: Dapp[], curr: Dapp): Dapp[] => {\n if (!acc.some(({ url }) => url === curr.url)) return [...acc, curr]\n return acc\n }, [])\n }\n\n set dapps(updatedDapps: Dapp[]) {\n this.#dapps = updatedDapps\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('dapps', updatedDapps)\n }\n\n async #load() {\n // eslint-disable-next-line prefer-const\n let [storedDapps, dappSessions] = await Promise.all([\n this.#storage.get('dapps', []),\n this.#storage.get('dappSessions', {})\n ])\n\n this.#dapps = storedDapps\n Object.keys(dappSessions).forEach((sessionId) => {\n const session = new Session(dappSessions[sessionId])\n this.dappSessions[sessionId] = session\n })\n this.emitUpdate()\n }\n\n #dappSessionsSet(sessionId: string, session: Session) {\n this.dappSessions[sessionId] = session\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #dappSessionsDelete(sessionId: string) {\n delete this.dappSessions[sessionId]\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #createDappSession = (data: SessionProp) => {\n const dappSession = new Session(data)\n this.#dappSessionsSet(dappSession.sessionId, dappSession)\n this.emitUpdate()\n\n return dappSession\n }\n\n getOrCreateDappSession = (data: SessionProp) => {\n if (!data.tabId || !data.origin)\n throw new Error('Invalid props passed to getOrCreateDappSession')\n\n if (this.dappSessions[`${data.tabId}-${data.origin}`]) {\n return this.dappSessions[`${data.tabId}-${data.origin}`]\n }\n\n return this.#createDappSession(data)\n }\n\n setSessionMessenger = (key: string, messenger: Messenger) => {\n this.dappSessions[key].setMessenger(messenger)\n }\n\n setSessionProp = (key: string, props: SessionProp) => {\n this.dappSessions[key].setProp(props)\n }\n\n deleteDappSession = (key: string) => {\n this.#dappSessionsDelete(key)\n this.emitUpdate()\n }\n\n broadcastDappSessionEvent = (ev: any, data?: any, origin?: string) => {\n let dappSessions: { key: string; data: Session }[] = []\n Object.keys(this.dappSessions).forEach((key) => {\n if (this.dappSessions[key] && this.hasPermission(this.dappSessions[key].origin)) {\n dappSessions.push({\n key,\n data: this.dappSessions[key]\n })\n }\n })\n\n if (origin) {\n dappSessions = dappSessions.filter((dappSession) => dappSession.data.origin === origin)\n }\n\n dappSessions.forEach((dappSession) => {\n try {\n dappSession.data.sendMessage?.(ev, data)\n } catch (e) {\n if (this.dappSessions[dappSession.key]) {\n this.deleteDappSession(dappSession.key)\n }\n }\n })\n this.emitUpdate()\n }\n\n addDapp(dapp: Dapp) {\n if (!this.isReady) return\n\n const doesAlreadyExist = this.dapps.find((d) => d.url === dapp.url)\n if (doesAlreadyExist) {\n this.updateDapp(dapp.url, {\n chainId: dapp.chainId,\n isConnected: dapp.isConnected,\n favorite: dapp.favorite\n })\n return\n }\n this.dapps = [...this.dapps, dapp]\n this.emitUpdate()\n }\n\n updateDapp(url: string, dapp: Partial) {\n if (!this.isReady) return\n\n this.dapps = this.dapps.map((d) => {\n if (d.url === url) return { ...d, ...dapp }\n return d\n })\n this.emitUpdate()\n }\n\n removeDapp(url: string) {\n if (!this.isReady) return\n\n // do not remove predefined dapps\n if (predefinedDapps.find((d) => d.url === url)) return\n\n this.dapps = this.dapps.filter((d) => d.url !== url)\n this.emitUpdate()\n }\n\n hasPermission(url: string) {\n const dapp = this.dapps.find((d) => d.url === url)\n if (!dapp) return false\n\n return dapp.isConnected\n }\n\n getDapp(url: string) {\n if (!this.isReady) return\n\n return this.dapps.find((d) => d.url === url)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n dapps: this.dapps,\n isReady: this.isReady\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"dapps.js","sourceRoot":"","sources":["../../../../src/controllers/dapps/dapps.ts"],"names":[],"mappings":";;;;AAAA,mDAA4D;AAC5D,6FAA2D;AAI3D,wFAAuD;AAEvD,8DAA8D;AAC9D,+BAA+B;AAC/B,2DAA2D;AAC3D,4EAA4E;AAE5E,qGAAqG;AAErG,MAAa,eAAgB,SAAQ,sBAAY;IAC/C,MAAM,GAAW,EAAE,CAAA;IAEnB,QAAQ,CAAS;IAEjB,YAAY,GAA+B,EAAE,CAAA;IAE7C,0EAA0E;IAC1E,kBAAkB,CAAe;IAEjC,YAAY,QAAiB;QAC3B,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,mEAAmE;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IAED,IAAI,KAAK;QACP,MAAM,qBAAqB,GAAG,0BAAe,CAAC,GAAG,CAC/C,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAQ,EAAE,CAAC,CAAC;YAC3C,IAAI;YACJ,WAAW;YACX,GAAG;YACH,IAAI;YACJ,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,KAAK;SAChB,CAAC,CACH,CAAA;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,IAAU,EAAU,EAAE;YAC3F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAA;YACnE,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAED,IAAI,KAAK,CAAC,YAAoB;QAC5B,IAAI,CAAC,MAAM,GAAG,YAAY,CAAA;QAC1B,mEAAmE;QACnE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,wCAAwC;QACxC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;SACtC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,GAAG,WAAW,CAAA;QACzB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC9C,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,OAAO,CAAA;QACxC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,OAAgB;QAClD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,OAAO,CAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACtD,CAAC;IAED,mBAAmB,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACtD,CAAC;IAED,kBAAkB,GAAG,CAAC,IAAiB,EAAE,EAAE;QACzC,MAAM,WAAW,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACzD,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,OAAO,WAAW,CAAA;IACpB,CAAC,CAAA;IAED,sBAAsB,GAAG,CAAC,IAAiB,EAAE,EAAE;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;YAC7B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAEnE,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YACrD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;SACzD;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC,CAAA;IAED,mBAAmB,GAAG,CAAC,GAAW,EAAE,SAAoB,EAAE,EAAE;QAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IAChD,CAAC,CAAA;IAED,cAAc,GAAG,CAAC,GAAW,EAAE,KAAkB,EAAE,EAAE;QACnD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE;QAClC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC,CAAA;IAED,yBAAyB,GAAG,CAAC,EAAO,EAAE,IAAU,EAAE,MAAe,EAAE,EAAE;QACnE,IAAI,YAAY,GAAqC,EAAE,CAAA;QACvD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE;gBAC/E,YAAY,CAAC,IAAI,CAAC;oBAChB,GAAG;oBACH,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;iBAC7B,CAAC,CAAA;aACH;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE;YACV,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;SACxF;QAED,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACnC,IAAI;gBACF,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;aACzC;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;oBACtC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;iBACxC;aACF;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC,CAAA;IAED,OAAO,CAAC,IAAU;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAA;QACnE,IAAI,gBAAgB,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;gBACxB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAA;YACF,OAAM;SACP;QACD,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAClC,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,IAAmB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAA;YAC3C,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEzB,iCAAiC;QACjC,IAAI,0BAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;YAAE,OAAM;QAEtD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;QACpD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QAEvB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF;AA7LD,0CA6LC","sourcesContent":["import { Session, SessionProp } from '../../classes/session'\nimport predefinedDapps from '../../consts/dappCatalog.json'\nimport { Dapp } from '../../interfaces/dapp'\nimport { Messenger } from '../../interfaces/messenger'\nimport { Storage } from '../../interfaces/storage'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// The DappsController is responsible for the following tasks:\n// 1. Managing the dApp catalog\n// 2. Handling active sessions between dApps and the wallet\n// 3. Broadcasting events from the wallet to connected dApps via the Session\n\n// The possible events include: accountsChanged, chainChanged, disconnect, lock, unlock, and connect.\n\nexport class DappsController extends EventEmitter {\n #dapps: Dapp[] = []\n\n #storage: Storage\n\n dappSessions: { [key: string]: Session } = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(_storage: Storage) {\n super()\n\n this.#storage = _storage\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isReady() {\n return !!this.dapps\n }\n\n get dapps(): Dapp[] {\n const predefinedDappsParsed = predefinedDapps.map(\n ({ url, name, icon, description }): Dapp => ({\n name,\n description,\n url,\n icon,\n isConnected: false,\n chainId: 1,\n favorite: false\n })\n )\n\n return [...this.#dapps, ...predefinedDappsParsed].reduce((acc: Dapp[], curr: Dapp): Dapp[] => {\n if (!acc.some(({ url }) => url === curr.url)) return [...acc, curr]\n return acc\n }, [])\n }\n\n set dapps(updatedDapps: Dapp[]) {\n this.#dapps = updatedDapps\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('dapps', updatedDapps)\n }\n\n async #load() {\n // eslint-disable-next-line prefer-const\n let [storedDapps, dappSessions] = await Promise.all([\n this.#storage.get('dapps', []),\n this.#storage.get('dappSessions', {})\n ])\n\n this.#dapps = storedDapps\n Object.keys(dappSessions).forEach((sessionId) => {\n const session = new Session(dappSessions[sessionId])\n this.dappSessions[sessionId] = session\n })\n this.emitUpdate()\n }\n\n #dappSessionsSet(sessionId: string, session: Session) {\n this.dappSessions[sessionId] = session\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #dappSessionsDelete(sessionId: string) {\n delete this.dappSessions[sessionId]\n this.#storage.set('dappSessions', this.dappSessions)\n }\n\n #createDappSession = (data: SessionProp) => {\n const dappSession = new Session(data)\n this.#dappSessionsSet(dappSession.sessionId, dappSession)\n this.emitUpdate()\n\n return dappSession\n }\n\n getOrCreateDappSession = (data: SessionProp) => {\n if (!data.tabId || !data.origin)\n throw new Error('Invalid props passed to getOrCreateDappSession')\n\n if (this.dappSessions[`${data.tabId}-${data.origin}`]) {\n return this.dappSessions[`${data.tabId}-${data.origin}`]\n }\n\n return this.#createDappSession(data)\n }\n\n setSessionMessenger = (key: string, messenger: Messenger) => {\n this.dappSessions[key].setMessenger(messenger)\n }\n\n setSessionProp = (key: string, props: SessionProp) => {\n this.dappSessions[key].setProp(props)\n }\n\n deleteDappSession = (key: string) => {\n this.#dappSessionsDelete(key)\n this.emitUpdate()\n }\n\n broadcastDappSessionEvent = (ev: any, data?: any, origin?: string) => {\n let dappSessions: { key: string; data: Session }[] = []\n Object.keys(this.dappSessions).forEach((key) => {\n if (this.dappSessions[key] && this.hasPermission(this.dappSessions[key].origin)) {\n dappSessions.push({\n key,\n data: this.dappSessions[key]\n })\n }\n })\n\n if (origin) {\n dappSessions = dappSessions.filter((dappSession) => dappSession.data.origin === origin)\n }\n\n dappSessions.forEach((dappSession) => {\n try {\n dappSession.data.sendMessage?.(ev, data)\n } catch (e) {\n if (this.dappSessions[dappSession.key]) {\n this.deleteDappSession(dappSession.key)\n }\n }\n })\n this.emitUpdate()\n }\n\n addDapp(dapp: Dapp) {\n if (!this.isReady) return\n\n const doesAlreadyExist = this.dapps.find((d) => d.url === dapp.url)\n if (doesAlreadyExist) {\n this.updateDapp(dapp.url, {\n chainId: dapp.chainId,\n isConnected: dapp.isConnected,\n favorite: dapp.favorite\n })\n return\n }\n this.dapps = [...this.dapps, dapp]\n this.emitUpdate()\n }\n\n updateDapp(url: string, dapp: Partial) {\n if (!this.isReady) return\n\n this.dapps = this.dapps.map((d) => {\n if (d.url === url) return { ...d, ...dapp }\n return d\n })\n this.emitUpdate()\n }\n\n removeDapp(url: string) {\n if (!this.isReady) return\n\n // do not remove predefined dapps\n if (predefinedDapps.find((d) => d.url === url)) return\n\n this.dapps = this.dapps.filter((d) => d.url !== url)\n this.emitUpdate()\n }\n\n hasPermission(url: string) {\n const dapp = this.dapps.find((d) => d.url === url)\n if (!dapp) return false\n\n return dapp.isConnected\n }\n\n getDapp(url: string) {\n if (!this.isReady) return\n\n return this.dapps.find((d) => d.url === url)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n dapps: this.dapps,\n isReady: this.isReady\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.js b/dist/src/controllers/defiPositions/defiPositions.js index 7cbb6c6e6..098fa89c9 100644 --- a/dist/src/controllers/defiPositions/defiPositions.js +++ b/dist/src/controllers/defiPositions/defiPositions.js @@ -1,9 +1,13 @@ -import { getAssetValue } from '../../libs/defiPositions/helpers'; -import { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'; -import getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'; -import { DeFiPositionsError } from '../../libs/defiPositions/types'; -import EventEmitter from '../eventEmitter/eventEmitter'; -export class DefiPositionsController extends EventEmitter { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DefiPositionsController = void 0; +const tslib_1 = require("tslib"); +const helpers_1 = require("../../libs/defiPositions/helpers"); +const providers_1 = require("../../libs/defiPositions/providers"); +const networksWithPositions_1 = tslib_1.__importDefault(require("../../libs/defiPositions/providers/helpers/networksWithPositions")); +const types_1 = require("../../libs/defiPositions/types"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +class DefiPositionsController extends eventEmitter_1.default { #selectedAccount; #providers; #networks; @@ -38,7 +42,7 @@ export class DefiPositionsController extends EventEmitter { } async #updateNetworksWithPositions(accountId, accountState) { const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {}); - this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(accountId, accountState, storageStateByAccount, this.#providers.providers); + this.#networksWithPositionsByAccounts[accountId] = (0, networksWithPositions_1.default)(accountId, accountState, storageStateByAccount, this.#providers.providers); this.emitUpdate(); await this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts); } @@ -74,7 +78,7 @@ export class DefiPositionsController extends EventEmitter { try { const previousPositions = networkState.positionsByProvider; const [aavePositions, uniV3Positions] = await Promise.all([ - getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { + (0, providers_1.getAAVEPositions)(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { console.error('getAAVEPositions error:', e); this.#setProviderError(selectedAccountAddr, n.id, 'AAVE v3', e?.message || 'Unknown error'); // We should consider changing the structure of positions in a way @@ -82,7 +86,7 @@ export class DefiPositionsController extends EventEmitter { // old data can still be displayed return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null; }), - getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { + (0, providers_1.getUniV3Positions)(selectedAccountAddr, this.#providers.providers[n.id], n).catch((e) => { console.error('getUniV3Positions error:', e); this.#setProviderError(selectedAccountAddr, n.id, 'Uniswap V3', e?.message || 'Unknown error'); // We should consider changing the structure of positions in a way @@ -100,7 +104,7 @@ export class DefiPositionsController extends EventEmitter { }; await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => { console.error('#setAssetPrices error:', e); - this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError; + this.#state[selectedAccountAddr][n.id].error = types_1.DeFiPositionsError.AssetPriceError; }); } catch (e) { @@ -108,7 +112,7 @@ export class DefiPositionsController extends EventEmitter { this.#state[selectedAccountAddr][n.id] = { isLoading: false, positionsByProvider: prevPositionsByProvider || [], - error: DeFiPositionsError.CriticalError + error: types_1.DeFiPositionsError.CriticalError }; console.error(`updatePositions error on ${n.id}`, e); } @@ -159,7 +163,7 @@ export class DefiPositionsController extends EventEmitter { baseCurrency: currency, price: price })); - const value = getAssetValue(asset.amount, asset.decimals, priceIn); + const value = (0, helpers_1.getAssetValue)(asset.amount, asset.decimals, priceIn); positionInUSD += value; return { ...asset, @@ -209,4 +213,5 @@ export class DefiPositionsController extends EventEmitter { }; } } +exports.DefiPositionsController = DefiPositionsController; //# sourceMappingURL=defiPositions.js.map \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.js.map b/dist/src/controllers/defiPositions/defiPositions.js.map index 67c3b1233..f24df34db 100644 --- a/dist/src/controllers/defiPositions/defiPositions.js.map +++ b/dist/src/controllers/defiPositions/defiPositions.js.map @@ -1 +1 @@ -{"version":3,"file":"defiPositions.js","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { getAssetValue } from '../../libs/defiPositions/helpers'\nimport { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'\nimport getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'\nimport {\n AccountState,\n DeFiPositionsError,\n DeFiPositionsState,\n NetworksWithPositionsByAccounts,\n PositionsByProvider,\n ProviderName\n} from '../../libs/defiPositions/types'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport class DefiPositionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #fetch: Fetch\n\n #storage: Storage\n\n #minUpdateInterval: number = 60 * 1000 // 1 minute\n\n #state: DeFiPositionsState = {}\n\n #networksWithPositionsByAccounts: NetworksWithPositionsByAccounts = {}\n\n constructor({\n fetch,\n storage,\n selectedAccount,\n providers,\n networks\n }: {\n fetch: Fetch\n storage: Storage\n selectedAccount: SelectedAccountController\n providers: ProvidersController\n networks: NetworksController\n }) {\n super()\n\n this.#fetch = fetch\n this.#storage = storage\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n }\n\n #setProviderError(\n accountAddr: string,\n networkId: string,\n providerName: ProviderName,\n errorMessage: string\n ) {\n if (!this.#state[accountAddr][networkId].providerErrors) {\n this.#state[accountAddr][networkId].providerErrors = []\n }\n\n this.#state[accountAddr][networkId].providerErrors!.push({\n providerName,\n error: errorMessage\n })\n }\n\n #getCanSkipUpdate(accountAddr: string, networkId: string) {\n const networkState = this.#state[accountAddr][networkId]\n\n if (networkState.error || networkState.providerErrors?.length) return false\n const isWithinMinUpdateInterval =\n networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n async #updateNetworksWithPositions(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {})\n\n this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set(\n 'networksWithPositionsByAccounts',\n this.#networksWithPositionsByAccounts\n )\n }\n\n async updatePositions(networkId?: NetworkId) {\n if (!this.#selectedAccount.account) return\n\n const selectedAccountAddr = this.#selectedAccount.account.addr\n const networksToUpdate = networkId\n ? this.#networks.networks.filter((n) => n.id === networkId)\n : this.#networks.networks\n\n if (!this.#state[selectedAccountAddr]) {\n this.#state[selectedAccountAddr] = {}\n }\n\n await Promise.all(\n networksToUpdate.map(async (n) => {\n if (!this.#state[selectedAccountAddr][n.id]) {\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: [],\n updatedAt: undefined\n }\n }\n\n if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) {\n // Emit an update so that the current account data getter is updated\n this.emitUpdate()\n return\n }\n\n this.#state[selectedAccountAddr][n.id].isLoading = true\n this.emitUpdate()\n\n const networkState = this.#state[selectedAccountAddr][n.id]\n // Reset provider errors before updating\n networkState.providerErrors = []\n networkState.error = undefined\n\n try {\n const previousPositions = networkState.positionsByProvider\n const [aavePositions, uniV3Positions] = await Promise.all([\n getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getAAVEPositions error:', e)\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'AAVE v3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null\n }\n ),\n getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getUniV3Positions error:', e)\n\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'Uniswap V3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null\n }\n )\n ])\n\n const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length\n\n this.#state[selectedAccountAddr][n.id] = {\n ...networkState,\n isLoading: false,\n positionsByProvider: [aavePositions, uniV3Positions].filter(\n Boolean\n ) as PositionsByProvider[],\n updatedAt: hasErrors ? networkState.updatedAt : Date.now()\n }\n await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => {\n console.error('#setAssetPrices error:', e)\n this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError\n })\n } catch (e: any) {\n const prevPositionsByProvider = networkState.positionsByProvider\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: prevPositionsByProvider || [],\n error: DeFiPositionsError.CriticalError\n }\n console.error(`updatePositions error on ${n.id}`, e)\n } finally {\n this.emitUpdate()\n }\n })\n )\n\n await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr])\n }\n\n async #setAssetPrices(accountAddr: string, networkId: string) {\n const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId\n\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n if (!platformId) throw new Error('Missing `platformId`')\n\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n\n const networkState = this.#state[accountAddr][networkId]\n\n const addresses: string[] = []\n\n networkState.positionsByProvider.forEach((providerPos) => {\n providerPos.positions.forEach((p) => {\n p.assets.forEach((a) => {\n addresses.push(a.address)\n })\n })\n })\n\n const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(\n addresses\n ).join('%2C')}&vs_currencies=usd`\n\n const resp = await this.#fetch(cenaUrl)\n const body = await resp.json()\n if (resp.status !== 200) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('message')) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('error')) throw body\n\n const positionsByProviderWithPrices = this.#state[accountAddr][\n networkId\n ].positionsByProvider.map((positionsByProvider) => {\n if (positionsByProvider.providerName.toLowerCase().includes('aave'))\n return positionsByProvider\n\n const updatedPositions = positionsByProvider.positions.map((position) => {\n let positionInUSD = position.additionalData.positionInUSD || 0\n\n const updatedAssets = position.assets.map((asset) => {\n const priceData = body[asset.address.toLowerCase()]\n if (!priceData) return asset\n\n const priceIn = Object.entries(priceData).map(([currency, price]) => ({\n baseCurrency: currency,\n price: price as number\n }))\n\n const value = getAssetValue(asset.amount, asset.decimals, priceIn)\n\n positionInUSD += value\n\n return {\n ...asset,\n value,\n priceIn\n }\n })\n\n return {\n ...position,\n assets: updatedAssets,\n additionalData: { ...position.additionalData, positionInUSD }\n }\n })\n\n let positionInUSD = positionsByProvider.positionInUSD\n\n // Already set in the corresponding lib\n if (!positionInUSD) {\n positionInUSD = updatedPositions.reduce((prevPositionValue, position) => {\n return prevPositionValue + (position.additionalData.positionInUSD || 0)\n }, 0)\n }\n\n return { ...positionsByProvider, positions: updatedPositions, positionInUSD }\n })\n\n this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices\n }\n\n removeNetworkData(networkId: NetworkId) {\n Object.keys(this.#state).forEach((accountId) => {\n delete this.#state[accountId][networkId]\n })\n this.emitUpdate()\n }\n\n getDefiPositionsState(accountAddr: string) {\n return this.#state[accountAddr] || {}\n }\n\n getNetworksWithPositions(accountAddr: string) {\n return this.#networksWithPositionsByAccounts[accountAddr] || []\n }\n\n removeAccountData(accountAddr: string) {\n delete this.#state[accountAddr]\n delete this.#networksWithPositionsByAccounts[accountAddr]\n this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts)\n\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"defiPositions.js","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { getAssetValue } from '../../libs/defiPositions/helpers'\nimport { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'\nimport getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'\nimport {\n AccountState,\n DeFiPositionsError,\n DeFiPositionsState,\n NetworksWithPositionsByAccounts,\n PositionsByProvider,\n ProviderName\n} from '../../libs/defiPositions/types'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport class DefiPositionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #fetch: Fetch\n\n #storage: Storage\n\n #minUpdateInterval: number = 60 * 1000 // 1 minute\n\n #state: DeFiPositionsState = {}\n\n #networksWithPositionsByAccounts: NetworksWithPositionsByAccounts = {}\n\n constructor({\n fetch,\n storage,\n selectedAccount,\n providers,\n networks\n }: {\n fetch: Fetch\n storage: Storage\n selectedAccount: SelectedAccountController\n providers: ProvidersController\n networks: NetworksController\n }) {\n super()\n\n this.#fetch = fetch\n this.#storage = storage\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n }\n\n #setProviderError(\n accountAddr: string,\n networkId: string,\n providerName: ProviderName,\n errorMessage: string\n ) {\n if (!this.#state[accountAddr][networkId].providerErrors) {\n this.#state[accountAddr][networkId].providerErrors = []\n }\n\n this.#state[accountAddr][networkId].providerErrors!.push({\n providerName,\n error: errorMessage\n })\n }\n\n #getCanSkipUpdate(accountAddr: string, networkId: string) {\n const networkState = this.#state[accountAddr][networkId]\n\n if (networkState.error || networkState.providerErrors?.length) return false\n const isWithinMinUpdateInterval =\n networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n async #updateNetworksWithPositions(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {})\n\n this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set(\n 'networksWithPositionsByAccounts',\n this.#networksWithPositionsByAccounts\n )\n }\n\n async updatePositions(networkId?: NetworkId) {\n if (!this.#selectedAccount.account) return\n\n const selectedAccountAddr = this.#selectedAccount.account.addr\n const networksToUpdate = networkId\n ? this.#networks.networks.filter((n) => n.id === networkId)\n : this.#networks.networks\n\n if (!this.#state[selectedAccountAddr]) {\n this.#state[selectedAccountAddr] = {}\n }\n\n await Promise.all(\n networksToUpdate.map(async (n) => {\n if (!this.#state[selectedAccountAddr][n.id]) {\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: [],\n updatedAt: undefined\n }\n }\n\n if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) {\n // Emit an update so that the current account data getter is updated\n this.emitUpdate()\n return\n }\n\n this.#state[selectedAccountAddr][n.id].isLoading = true\n this.emitUpdate()\n\n const networkState = this.#state[selectedAccountAddr][n.id]\n // Reset provider errors before updating\n networkState.providerErrors = []\n networkState.error = undefined\n\n try {\n const previousPositions = networkState.positionsByProvider\n const [aavePositions, uniV3Positions] = await Promise.all([\n getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getAAVEPositions error:', e)\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'AAVE v3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null\n }\n ),\n getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getUniV3Positions error:', e)\n\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'Uniswap V3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null\n }\n )\n ])\n\n const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length\n\n this.#state[selectedAccountAddr][n.id] = {\n ...networkState,\n isLoading: false,\n positionsByProvider: [aavePositions, uniV3Positions].filter(\n Boolean\n ) as PositionsByProvider[],\n updatedAt: hasErrors ? networkState.updatedAt : Date.now()\n }\n await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => {\n console.error('#setAssetPrices error:', e)\n this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError\n })\n } catch (e: any) {\n const prevPositionsByProvider = networkState.positionsByProvider\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: prevPositionsByProvider || [],\n error: DeFiPositionsError.CriticalError\n }\n console.error(`updatePositions error on ${n.id}`, e)\n } finally {\n this.emitUpdate()\n }\n })\n )\n\n await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr])\n }\n\n async #setAssetPrices(accountAddr: string, networkId: string) {\n const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId\n\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n if (!platformId) throw new Error('Missing `platformId`')\n\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n\n const networkState = this.#state[accountAddr][networkId]\n\n const addresses: string[] = []\n\n networkState.positionsByProvider.forEach((providerPos) => {\n providerPos.positions.forEach((p) => {\n p.assets.forEach((a) => {\n addresses.push(a.address)\n })\n })\n })\n\n const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(\n addresses\n ).join('%2C')}&vs_currencies=usd`\n\n const resp = await this.#fetch(cenaUrl)\n const body = await resp.json()\n if (resp.status !== 200) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('message')) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('error')) throw body\n\n const positionsByProviderWithPrices = this.#state[accountAddr][\n networkId\n ].positionsByProvider.map((positionsByProvider) => {\n if (positionsByProvider.providerName.toLowerCase().includes('aave'))\n return positionsByProvider\n\n const updatedPositions = positionsByProvider.positions.map((position) => {\n let positionInUSD = position.additionalData.positionInUSD || 0\n\n const updatedAssets = position.assets.map((asset) => {\n const priceData = body[asset.address.toLowerCase()]\n if (!priceData) return asset\n\n const priceIn = Object.entries(priceData).map(([currency, price]) => ({\n baseCurrency: currency,\n price: price as number\n }))\n\n const value = getAssetValue(asset.amount, asset.decimals, priceIn)\n\n positionInUSD += value\n\n return {\n ...asset,\n value,\n priceIn\n }\n })\n\n return {\n ...position,\n assets: updatedAssets,\n additionalData: { ...position.additionalData, positionInUSD }\n }\n })\n\n let positionInUSD = positionsByProvider.positionInUSD\n\n // Already set in the corresponding lib\n if (!positionInUSD) {\n positionInUSD = updatedPositions.reduce((prevPositionValue, position) => {\n return prevPositionValue + (position.additionalData.positionInUSD || 0)\n }, 0)\n }\n\n return { ...positionsByProvider, positions: updatedPositions, positionInUSD }\n })\n\n this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices\n }\n\n removeNetworkData(networkId: NetworkId) {\n Object.keys(this.#state).forEach((accountId) => {\n delete this.#state[accountId][networkId]\n })\n this.emitUpdate()\n }\n\n getDefiPositionsState(accountAddr: string) {\n return this.#state[accountAddr] || {}\n }\n\n getNetworksWithPositions(accountAddr: string) {\n return this.#networksWithPositionsByAccounts[accountAddr] || []\n }\n\n removeAccountData(accountAddr: string) {\n delete this.#state[accountAddr]\n delete this.#networksWithPositionsByAccounts[accountAddr]\n this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts)\n\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.js b/dist/src/controllers/domains/domains.js index cede9418e..0e8bec602 100644 --- a/dist/src/controllers/domains/domains.js +++ b/dist/src/controllers/domains/domains.js @@ -1,7 +1,11 @@ -import { getAddress, isAddress } from 'ethers'; -import { reverseLookupEns } from '../../services/ensDomains'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DomainsController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const ensDomains_1 = require("../../services/ensDomains"); // import { reverseLookupUD } from '../../services/unstoppableDomains' -import EventEmitter from '../eventEmitter/eventEmitter'; +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); // 15 minutes const PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000; // const EXPECTED_UD_ERROR_MESSAGES = [ @@ -13,7 +17,7 @@ const PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000; * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names. * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups. */ -export class DomainsController extends EventEmitter { +class DomainsController extends eventEmitter_1.default { #providers = {}; domains = {}; loadingAddresses = []; @@ -22,7 +26,7 @@ export class DomainsController extends EventEmitter { this.#providers = providers; } async batchReverseLookup(addresses) { - const filteredAddresses = addresses.filter((address) => isAddress(address)); + const filteredAddresses = addresses.filter((address) => (0, ethers_1.isAddress)(address)); await Promise.all(filteredAddresses.map((address) => this.reverseLookup(address, false))); this.emitUpdate(); } @@ -30,7 +34,7 @@ export class DomainsController extends EventEmitter { *Saves an already resolved ENS or UD name for an address. */ saveResolvedReverseLookup({ address, name, type }) { - const checksummedAddress = getAddress(address); + const checksummedAddress = (0, ethers_1.getAddress)(address); const { ens: oldEns, ud: oldUd } = this.domains[checksummedAddress] || { ens: null, ud: null }; this.domains[checksummedAddress] = { ens: type === 'ens' ? name : oldEns, @@ -51,7 +55,7 @@ export class DomainsController extends EventEmitter { }); return; } - const checksummedAddress = getAddress(address); + const checksummedAddress = (0, ethers_1.getAddress)(address); const isAlreadyResolved = !!this.domains[checksummedAddress]; const isExpired = isAlreadyResolved && Date.now() - this.domains[checksummedAddress].savedAt > PERSIST_DOMAIN_FOR_IN_MS; @@ -61,7 +65,7 @@ export class DomainsController extends EventEmitter { this.emitUpdate(); let ensName = null; try { - ensName = (await reverseLookupEns(checksummedAddress, this.#providers.ethereum)) || null; + ensName = (await (0, ensDomains_1.reverseLookupEns)(checksummedAddress, this.#providers.ethereum)) || null; } catch (e) { console.error('ENS reverse lookup unexpected error', e); @@ -88,4 +92,5 @@ export class DomainsController extends EventEmitter { this.emitUpdate(); } } +exports.DomainsController = DomainsController; //# sourceMappingURL=domains.js.map \ No newline at end of file diff --git a/dist/src/controllers/domains/domains.js.map b/dist/src/controllers/domains/domains.js.map index 6f610271a..9fbe3367e 100644 --- a/dist/src/controllers/domains/domains.js.map +++ b/dist/src/controllers/domains/domains.js.map @@ -1 +1 @@ -{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../../../src/controllers/domains/domains.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { RPCProviders } from '../../interfaces/provider'\nimport { reverseLookupEns } from '../../services/ensDomains'\n// import { reverseLookupUD } from '../../services/unstoppableDomains'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\ninterface Domains {\n [address: string]: {\n ens: string | null\n ud: string | null\n savedAt: number\n }\n}\n\n// 15 minutes\nconst PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000\n\n// const EXPECTED_UD_ERROR_MESSAGES = [\n// 'Only absolute URLs are supported',\n// 'unexpected character at line 1 column 1 of the JSON data',\n// 'Unexpected token'\n// ]\n\n/**\n * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names.\n * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups.\n */\nexport class DomainsController extends EventEmitter {\n #providers: RPCProviders = {}\n\n domains: Domains = {}\n\n loadingAddresses: string[] = []\n\n constructor(providers: RPCProviders) {\n super()\n this.#providers = providers\n }\n\n async batchReverseLookup(addresses: string[]) {\n const filteredAddresses = addresses.filter((address) => isAddress(address))\n await Promise.all(filteredAddresses.map((address) => this.reverseLookup(address, false)))\n\n this.emitUpdate()\n }\n\n /**\n *Saves an already resolved ENS or UD name for an address.\n */\n saveResolvedReverseLookup({\n address,\n name,\n type\n }: {\n address: string\n name: string\n type: 'ens' | 'ud'\n }) {\n const checksummedAddress = getAddress(address)\n const { ens: oldEns, ud: oldUd } = this.domains[checksummedAddress] || { ens: null, ud: null }\n\n this.domains[checksummedAddress] = {\n ens: type === 'ens' ? name : oldEns,\n ud: type === 'ud' ? name : oldUd,\n savedAt: Date.now()\n }\n this.emitUpdate()\n }\n\n /**\n * Resolves the ENS and UD names for an address if such exist.\n */\n async reverseLookup(address: string, emitUpdate = true) {\n if (!('ethereum' in this.#providers)) {\n this.emitError({\n error: new Error('domains.reverseLookup: Ethereum provider is not available'),\n message: 'The RPC provider for Ethereum is not available.',\n level: 'major'\n })\n return\n }\n const checksummedAddress = getAddress(address)\n const isAlreadyResolved = !!this.domains[checksummedAddress]\n const isExpired =\n isAlreadyResolved &&\n Date.now() - this.domains[checksummedAddress].savedAt > PERSIST_DOMAIN_FOR_IN_MS\n\n if ((isAlreadyResolved && !isExpired) || this.loadingAddresses.includes(checksummedAddress))\n return\n\n this.loadingAddresses.push(checksummedAddress)\n this.emitUpdate()\n\n let ensName = null\n\n try {\n ensName = (await reverseLookupEns(checksummedAddress, this.#providers.ethereum)) || null\n } catch (e) {\n console.error('ENS reverse lookup unexpected error', e)\n }\n\n // Don't reverse lookup UD names for now\n // https://github.com/AmbireTech/ambire-app/issues/2681#issuecomment-2299460748\n // If UD is ever needed, rewrite using Promise.all\n // try {\n // udName = (await reverseLookupUD(checksummedAddress)) || null\n // } catch (e: any) {\n // if (\n // !EXPECTED_UD_ERROR_MESSAGES.some((expectedMessage) => e.message.includes(expectedMessage))\n // ) {\n // console.error('UD reverse lookup unexpected error', e)\n // }\n // }\n\n this.domains[checksummedAddress] = {\n ens: ensName,\n ud: null,\n savedAt: Date.now()\n }\n\n this.loadingAddresses = this.loadingAddresses.filter(\n (loadingAddress) => loadingAddress !== checksummedAddress\n )\n\n if (emitUpdate) this.emitUpdate()\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../../../src/controllers/domains/domains.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, isAddress } from 'ethers'\n\nimport { RPCProviders } from '../../interfaces/provider'\nimport { reverseLookupEns } from '../../services/ensDomains'\n// import { reverseLookupUD } from '../../services/unstoppableDomains'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\ninterface Domains {\n [address: string]: {\n ens: string | null\n ud: string | null\n savedAt: number\n }\n}\n\n// 15 minutes\nconst PERSIST_DOMAIN_FOR_IN_MS = 15 * 60 * 1000\n\n// const EXPECTED_UD_ERROR_MESSAGES = [\n// 'Only absolute URLs are supported',\n// 'unexpected character at line 1 column 1 of the JSON data',\n// 'Unexpected token'\n// ]\n\n/**\n * Domains controller- responsible for handling the reverse lookup of addresses to ENS and UD names.\n * Resolved names are saved in `domains` for a short period of time(15 minutes) to avoid unnecessary lookups.\n */\nexport class DomainsController extends EventEmitter {\n #providers: RPCProviders = {}\n\n domains: Domains = {}\n\n loadingAddresses: string[] = []\n\n constructor(providers: RPCProviders) {\n super()\n this.#providers = providers\n }\n\n async batchReverseLookup(addresses: string[]) {\n const filteredAddresses = addresses.filter((address) => isAddress(address))\n await Promise.all(filteredAddresses.map((address) => this.reverseLookup(address, false)))\n\n this.emitUpdate()\n }\n\n /**\n *Saves an already resolved ENS or UD name for an address.\n */\n saveResolvedReverseLookup({\n address,\n name,\n type\n }: {\n address: string\n name: string\n type: 'ens' | 'ud'\n }) {\n const checksummedAddress = getAddress(address)\n const { ens: oldEns, ud: oldUd } = this.domains[checksummedAddress] || { ens: null, ud: null }\n\n this.domains[checksummedAddress] = {\n ens: type === 'ens' ? name : oldEns,\n ud: type === 'ud' ? name : oldUd,\n savedAt: Date.now()\n }\n this.emitUpdate()\n }\n\n /**\n * Resolves the ENS and UD names for an address if such exist.\n */\n async reverseLookup(address: string, emitUpdate = true) {\n if (!('ethereum' in this.#providers)) {\n this.emitError({\n error: new Error('domains.reverseLookup: Ethereum provider is not available'),\n message: 'The RPC provider for Ethereum is not available.',\n level: 'major'\n })\n return\n }\n const checksummedAddress = getAddress(address)\n const isAlreadyResolved = !!this.domains[checksummedAddress]\n const isExpired =\n isAlreadyResolved &&\n Date.now() - this.domains[checksummedAddress].savedAt > PERSIST_DOMAIN_FOR_IN_MS\n\n if ((isAlreadyResolved && !isExpired) || this.loadingAddresses.includes(checksummedAddress))\n return\n\n this.loadingAddresses.push(checksummedAddress)\n this.emitUpdate()\n\n let ensName = null\n\n try {\n ensName = (await reverseLookupEns(checksummedAddress, this.#providers.ethereum)) || null\n } catch (e) {\n console.error('ENS reverse lookup unexpected error', e)\n }\n\n // Don't reverse lookup UD names for now\n // https://github.com/AmbireTech/ambire-app/issues/2681#issuecomment-2299460748\n // If UD is ever needed, rewrite using Promise.all\n // try {\n // udName = (await reverseLookupUD(checksummedAddress)) || null\n // } catch (e: any) {\n // if (\n // !EXPECTED_UD_ERROR_MESSAGES.some((expectedMessage) => e.message.includes(expectedMessage))\n // ) {\n // console.error('UD reverse lookup unexpected error', e)\n // }\n // }\n\n this.domains[checksummedAddress] = {\n ens: ensName,\n ud: null,\n savedAt: Date.now()\n }\n\n this.loadingAddresses = this.loadingAddresses.filter(\n (loadingAddress) => loadingAddress !== checksummedAddress\n )\n\n if (emitUpdate) this.emitUpdate()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.js b/dist/src/controllers/emailVault/emailVault.js index 5bc6029cb..f8e9d8a26 100644 --- a/dist/src/controllers/emailVault/emailVault.js +++ b/dist/src/controllers/emailVault/emailVault.js @@ -1,20 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailVaultController = exports.EmailVaultState = void 0; +const tslib_1 = require("tslib"); /* eslint-disable class-methods-use-this */ /* eslint-disable no-await-in-loop */ -import crypto from 'crypto'; -import { OperationRequestType, SecretType } from '../../interfaces/emailVault'; -import { getKeySyncBanner } from '../../libs/banners/banners'; -import { EmailVault } from '../../libs/emailVault/emailVault'; -import { requestMagicLink } from '../../libs/magicLink/magicLink'; -import { Polling } from '../../libs/polling/polling'; -import wait from '../../utils/wait'; -import EventEmitter from '../eventEmitter/eventEmitter'; -export var EmailVaultState; +const crypto_1 = tslib_1.__importDefault(require("crypto")); +const emailVault_1 = require("../../interfaces/emailVault"); +const banners_1 = require("../../libs/banners/banners"); +const emailVault_2 = require("../../libs/emailVault/emailVault"); +const magicLink_1 = require("../../libs/magicLink/magicLink"); +const polling_1 = require("../../libs/polling/polling"); +const wait_1 = tslib_1.__importDefault(require("../../utils/wait")); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +var EmailVaultState; (function (EmailVaultState) { EmailVaultState["Loading"] = "loading"; EmailVaultState["WaitingEmailConfirmation"] = "WaitingEmailConfirmation"; EmailVaultState["UploadingSecret"] = "UploadingSecret"; EmailVaultState["Ready"] = "Ready"; -})(EmailVaultState || (EmailVaultState = {})); +})(EmailVaultState = exports.EmailVaultState || (exports.EmailVaultState = {})); const RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'; const EMAIL_VAULT_STORAGE_KEY = 'emailVault'; const MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'; @@ -38,7 +42,7 @@ const STATUS_WRAPPED_METHODS = { * Extended documentation about the EV and its internal mechanisms * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation */ -export class EmailVaultController extends EventEmitter { +class EmailVaultController extends eventEmitter_1.default { storage; initialLoadPromise; #isWaitingEmailConfirmation = false; @@ -62,7 +66,7 @@ export class EmailVaultController extends EventEmitter { this.#fetch = fetch; this.#relayerUrl = relayerUrl; this.storage = storage; - this.#emailVault = new EmailVault(fetch, relayerUrl); + this.#emailVault = new emailVault_2.EmailVault(fetch, relayerUrl); this.#keyStore = keyStore; this.initialLoadPromise = this.load(); this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false; @@ -72,7 +76,7 @@ export class EmailVaultController extends EventEmitter { // #load is called in the constructor which is synchronous // we await (1 ms/next tick) for the constructor to extend the EventEmitter class // and then we call it's methods - await wait(1); + await (0, wait_1.default)(1); this.emitUpdate(); const [emailVaultState, magicLinkKey] = await Promise.all([ this.storage.get(EMAIL_VAULT_STORAGE_KEY, { @@ -118,11 +122,11 @@ export class EmailVaultController extends EventEmitter { this.#isWaitingEmailConfirmation = true; this.#shouldStopConfirmationPolling = false; this.emitUpdate(); - const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, { + const newKey = await (0, magicLink_1.requestMagicLink)(email, this.#relayerUrl, this.#fetch, { autoConfirm: this.#autoConfirmMagicLink, flow }); - const polling = new Polling(); + const polling = new polling_1.Polling(); polling.onUpdate(async () => { if (polling.state.isError && polling.state.error.output.res.status === 401) { this.#isWaitingEmailConfirmation = true; @@ -244,7 +248,7 @@ export class EmailVaultController extends EventEmitter { } if (magicKey?.key) { this.#isUploadingSecret = true; - const randomBytes = crypto.randomBytes(32); + const randomBytes = crypto_1.default.randomBytes(32); // toString('base64url') doesn't work for some reason in the browser extension const newSecret = base64UrlEncode(randomBytes.toString('base64')); await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false); @@ -292,7 +296,7 @@ export class EmailVaultController extends EventEmitter { }); return; } - if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) { + if (state.email[email].availableSecrets[uid].type !== emailVault_1.SecretType.KeyStore) { this.emitError({ message: `Resetting the password on this device is not enabled for ${email}.`, level: 'major', @@ -355,7 +359,7 @@ export class EmailVaultController extends EventEmitter { this.#keyStore.getKeyStoreUid() ]); const operations = keys.map((key) => ({ - type: OperationRequestType.requestKeySync, + type: emailVault_1.OperationRequestType.requestKeySync, requester: keyStoreUid, key })); @@ -468,7 +472,7 @@ export class EmailVaultController extends EventEmitter { return; return EVEmails.find((email) => { return (this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type === - SecretType.KeyStore); + emailVault_1.SecretType.KeyStore); }); } get hasKeystoreRecovery() { @@ -506,7 +510,7 @@ export class EmailVaultController extends EventEmitter { const keystoreKeys = this.#keyStore.keys.filter((key) => accInfo.associatedKeys.includes(key.addr)); if (keystoreKeys.length) return; - banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys)); + banners.push((0, banners_1.getKeySyncBanner)(accInfo.addr, email, accInfo.associatedKeys)); }); }); return banners; @@ -523,4 +527,5 @@ export class EmailVaultController extends EventEmitter { }; } } +exports.EmailVaultController = EmailVaultController; //# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.js.map b/dist/src/controllers/emailVault/emailVault.js.map index 9ab959894..e596d0737 100644 --- a/dist/src/controllers/emailVault/emailVault.js.map +++ b/dist/src/controllers/emailVault/emailVault.js.map @@ -1 +1 @@ -{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable no-await-in-loop */\nimport crypto from 'crypto'\n\nimport { Banner } from '../../interfaces/banner'\nimport {\n EmailVaultData,\n EmailVaultOperation,\n MagicLinkFlow,\n OperationRequestType,\n SecretType\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { getKeySyncBanner } from '../../libs/banners/banners'\nimport { EmailVault } from '../../libs/emailVault/emailVault'\nimport { requestMagicLink } from '../../libs/magicLink/magicLink'\nimport { Polling } from '../../libs/polling/polling'\nimport wait from '../../utils/wait'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\n\nexport enum EmailVaultState {\n Loading = 'loading',\n WaitingEmailConfirmation = 'WaitingEmailConfirmation',\n UploadingSecret = 'UploadingSecret',\n Ready = 'Ready'\n}\n\nexport type MagicLinkKey = {\n key: string\n expiry: Date\n confirmed: boolean\n}\n\nconst RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'\nconst EMAIL_VAULT_STORAGE_KEY = 'emailVault'\nconst MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'\nconst SESSION_KEYS_STORAGE_KEY = 'sessionKeys'\n\nexport type MagicLinkKeys = {\n [email: string]: MagicLinkKey\n}\n\nexport type SessionKeys = {\n [email: string]: string\n}\n\nfunction base64UrlEncode(str: string) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nconst STATUS_WRAPPED_METHODS = {\n getEmailVaultInfo: 'INITIAL',\n uploadKeyStoreSecret: 'INITIAL',\n recoverKeyStore: 'INITIAL',\n requestKeysSync: 'INITIAL',\n finalizeSyncKeys: 'INITIAL'\n} as const\n\n/**\n * EmailVaultController\n * @class\n * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries\n * The most important thing it achieves is handling magicLink and session keys with polling.\n * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc.\n * Extended documentation about the EV and its internal mechanisms\n * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation\n */\nexport class EmailVaultController extends EventEmitter {\n private storage: Storage\n\n private initialLoadPromise: Promise\n\n #isWaitingEmailConfirmation: boolean = false\n\n #isUploadingSecret: boolean = false\n\n #emailVault: EmailVault\n\n #magicLinkKeys: MagicLinkKeys = {}\n\n #sessionKeys: SessionKeys = {}\n\n #shouldStopConfirmationPolling: boolean = false\n\n #autoConfirmMagicLink: boolean = false\n\n #fetch: Fetch\n\n #relayerUrl: string\n\n #keyStore: KeystoreController\n\n isReady: boolean = false\n\n lastUpdate: Date = new Date()\n\n emailVaultStates: {\n email: { [email: string]: EmailVaultData }\n criticalError?: Error\n errors?: Error[]\n } = {\n email: {}\n }\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n relayerUrl: string,\n keyStore: KeystoreController,\n options?: { autoConfirmMagicLink?: boolean }\n ) {\n super()\n this.#fetch = fetch\n this.#relayerUrl = relayerUrl\n this.storage = storage\n this.#emailVault = new EmailVault(fetch, relayerUrl)\n this.#keyStore = keyStore\n this.initialLoadPromise = this.load()\n this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false\n }\n\n private async load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n const [emailVaultState, magicLinkKey] = await Promise.all([\n this.storage.get(EMAIL_VAULT_STORAGE_KEY, {\n email: {}\n }),\n this.storage.get(MAGIC_LINK_STORAGE_KEY, {})\n ])\n\n this.emailVaultStates = emailVaultState\n this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey)\n\n this.lastUpdate = new Date()\n this.isReady = true\n this.emitUpdate()\n }\n\n get currentState(): EmailVaultState {\n if (!this.isReady) return EmailVaultState.Loading\n if (this.#isWaitingEmailConfirmation) return EmailVaultState.WaitingEmailConfirmation\n if (this.#isUploadingSecret) return EmailVaultState.UploadingSecret\n\n return EmailVaultState.Ready\n }\n\n async #requestSessionKey(email: string) {\n // if magicLinkKey => get sessionKey\n const key = (await this.#getMagicLinkKey(email))?.key\n if (!key) return\n this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key)\n\n // store magicLinkKey and sessionKey\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n }\n\n async handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow) {\n await this.initialLoadPromise\n const currentKey = (await this.#getMagicLinkKey(email))?.key\n if (currentKey) {\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n return\n }\n\n this.#isWaitingEmailConfirmation = true\n this.#shouldStopConfirmationPolling = false\n this.emitUpdate()\n\n const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, {\n autoConfirm: this.#autoConfirmMagicLink,\n flow\n })\n\n const polling = new Polling()\n polling.onUpdate(async () => {\n if (polling.state.isError && polling.state.error.output.res.status === 401) {\n this.#isWaitingEmailConfirmation = true\n this.emitUpdate()\n } else if (polling.state.isError) {\n this.emitError({\n message: `Can't request magic link for email ${email}: ${polling.state.error.message}`,\n level: 'major',\n error: new Error(\n `Can't request magic link for email ${email}: ${polling.state.error.message}`\n )\n })\n this.emailVaultStates.errors = [polling.state.error]\n this.emitUpdate()\n }\n })\n\n const ev: (EmailVaultData & { error?: any; canceled?: boolean }) | null = await polling.exec(\n this.#emailVault.getEmailVaultInfo.bind(this.#emailVault),\n [email, newKey.key],\n () => {\n this.#isWaitingEmailConfirmation = false\n },\n () => this.#shouldStopConfirmationPolling,\n 3 * 60 * 1000,\n 1000\n )\n\n if (this.#shouldStopConfirmationPolling) {\n this.emitUpdate()\n return\n }\n\n if (ev && !ev.error) {\n this.#isWaitingEmailConfirmation = false\n this.#magicLinkKeys[email] = {\n key: newKey.key,\n expiry: new Date(newKey.expiry),\n confirmed: true\n }\n fn && (await fn())\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys)\n this.#requestSessionKey(email)\n } else {\n this.emitError({\n message: `Unexpected error getting email vault for ${email}`,\n level: 'major',\n error: new Error(`Unexpected error getting email vault for ${email}`)\n })\n }\n this.emitUpdate()\n }\n\n async #getSessionKey(email: string): Promise {\n await this.initialLoadPromise\n return this.#sessionKeys[email]\n }\n\n getMagicLinkKeyByEmail(email: string): MagicLinkKey | null {\n const result = this.#magicLinkKeys[email]\n if (!result || !result.confirmed) return null\n if (Date.now() >= result.expiry.getTime()) return null\n return result\n }\n\n async #getMagicLinkKey(email: string): Promise {\n // if we have valid magicLinkKey => returns it else null\n await this.initialLoadPromise\n\n return this.getMagicLinkKeyByEmail(email)\n }\n\n #parseMagicLinkKeys(mks: any): MagicLinkKeys {\n return Object.fromEntries(\n Object.keys(mks).map((email) => [\n email,\n { ...mks[email], expiry: new Date(mks[email].expiry) }\n ])\n )\n }\n\n async getEmailVaultInfo(email: string, flow?: MagicLinkFlow) {\n await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow))\n }\n\n async #getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise {\n const [existsSessionKey, magicLinkKey] = await Promise.all([\n this.#getSessionKey(email),\n this.#getMagicLinkKey(email)\n ])\n const key = existsSessionKey || magicLinkKey?.key\n\n let emailVault: EmailVaultData | null = null\n if (key) {\n emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e: any) => {\n this.emitError({\n message: `Error getting email vault for ${email} ${e.message}`,\n level: 'major',\n error: new Error(`Error getting email vault for ${email} ${e.message}`)\n })\n this.emailVaultStates.errors = []\n this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]\n\n return null\n })\n } else {\n await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow)\n }\n\n if (emailVault) {\n this.emailVaultStates.email[email] = emailVault\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n if (!existsSessionKey) {\n await this.#requestSessionKey(email)\n }\n }\n\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n async uploadKeyStoreSecret(email: string) {\n await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email))\n }\n\n async #uploadKeyStoreSecret(email: string) {\n if (!this.emailVaultStates.email[email]) {\n await this.#getEmailVaultInfo(email, 'setup')\n }\n\n let result: Boolean | null = false\n let magicKey = await this.#getMagicLinkKey(email)\n\n if (!magicKey?.key && !this.#shouldStopConfirmationPolling) {\n await this.handleMagicLinkKey(\n email,\n async () => {\n magicKey = await this.#getMagicLinkKey(email)\n },\n 'setup'\n )\n }\n\n if (this.#shouldStopConfirmationPolling) {\n this.#isUploadingSecret = false\n // Set status to ERROR, but don't emit an error message\n throw new Error('')\n }\n\n if (magicKey?.key) {\n this.#isUploadingSecret = true\n const randomBytes = crypto.randomBytes(32)\n // toString('base64url') doesn't work for some reason in the browser extension\n const newSecret = base64UrlEncode(randomBytes.toString('base64'))\n await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false)\n const keyStoreUid = await this.#keyStore.getKeyStoreUid()\n result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret)\n } else\n this.emitError({\n message: 'Email key not confirmed',\n level: 'minor',\n error: new Error('uploadKeyStoreSecret: not confirmed magic link key')\n })\n\n if (result) {\n await this.#getEmailVaultInfo(email, 'setup')\n } else {\n this.emitError({\n level: 'minor',\n message: 'Error upload keyStore to email vault',\n error: new Error('error upload keyStore to email vault')\n })\n }\n\n this.#isUploadingSecret = false\n this.emitUpdate()\n }\n\n async recoverKeyStore(email: string, newPassword: string) {\n await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword))\n }\n\n async #recoverKeyStore(email: string, newPassword: string): Promise {\n const uid = await this.#keyStore.getKeyStoreUid()\n const state = this.emailVaultStates\n if (!state.email[email]) {\n this.emitError({\n message: `You are not logged in with ${email} on this device.`,\n level: 'major',\n error: new Error(`Keystore recovery: email ${email} not imported`)\n })\n return\n }\n\n if (!state.email[email].availableSecrets[uid]) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error('Keystore recovery: no keystore secret for this device')\n })\n return\n }\n if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error(`Keystore recovery: no keystore secret for email ${email}`)\n })\n return\n }\n\n if (email !== this.keystoreRecoveryEmail) {\n return\n }\n const emitExpiredMagicLinkError = () => {\n this.emitError({\n message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`,\n level: 'major',\n error: new Error(`Keystore recovery: magic link expired for ${email}`)\n })\n\n // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated.\n // The application relies on this flag to make decisions regarding\n // which step the user should be in during the Forgotten Password flow.\n this.emitUpdate()\n }\n\n const key = (await this.#getMagicLinkKey(email))?.key\n\n if (!key) {\n emitExpiredMagicLinkError()\n return\n }\n\n let result\n try {\n result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid)\n } catch (e: any) {\n if (e?.output?.res?.message === 'invalid key') {\n emitExpiredMagicLinkError()\n return\n }\n }\n\n if (!result || !result.value) {\n this.emitError({\n message:\n 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support',\n level: 'major',\n error: new Error(\n \"Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.\"\n )\n })\n\n return\n }\n\n // Once we are here - it means we pass all the above validations,\n // and we are ready to change the keystore password secret\n this.emailVaultStates.email[email].availableSecrets[result.key] = result\n\n await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value)\n await this.#keyStore.removeSecret('password')\n await this.#keyStore.addSecret('password', newPassword, '', false)\n\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n this.emitUpdate()\n }\n\n async requestKeysSync(email: string, keys: string[]) {\n await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys))\n }\n\n async #requestKeysSync(email: string, keys: string[]) {\n const [magicLinkKey, keyStoreUid] = await Promise.all([\n this.#getMagicLinkKey(email),\n this.#keyStore.getKeyStoreUid()\n ])\n\n const operations: EmailVaultOperation[] = keys.map((key) => ({\n type: OperationRequestType.requestKeySync,\n requester: keyStoreUid,\n key\n }))\n if (magicLinkKey) {\n const newOperations = (await this.#emailVault.operations(\n email,\n magicLinkKey.key,\n operations\n ))!\n this.emailVaultStates.email[email].operations = newOperations\n this.emitUpdate()\n }\n await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys))\n }\n\n async #finalizeSyncKeys(email: string, operations: EmailVaultOperation[]) {\n const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (authKey) {\n const cloudOperations = await this.#emailVault\n .getOperations(email, authKey, operations)\n .catch((e) => {\n this.emitError({\n message: `Can't pull operations: ${e}`,\n level: 'major',\n error: new Error(`Can't pull operations: ${e}`)\n })\n })\n if (!cloudOperations) {\n this.emitError({\n message: \"Can't pull operations\",\n level: 'major',\n error: new Error(\"Can't pull operations\")\n })\n }\n\n // Promise.all makes race conditions\n for (let i = 0; i < cloudOperations!.length; i++) {\n const op = cloudOperations![i]\n if (op.type === 'requestKeySync' && op.value) {\n const { privateKey } = JSON.parse(op.value || '{}')\n await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true)\n }\n }\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations))\n }\n }\n\n async finalizeSyncKeys(email: string, keys: string[], password: string) {\n const operations: any[] = keys\n .map((key) => {\n const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key)\n if (!res) {\n this.emitError({\n message: `No sync request for key ${key}`,\n level: 'major',\n error: new Error(`No sync request for key ${key}`)\n })\n return null\n }\n return { ...res, password }\n })\n .filter((x) => x)\n await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations))\n }\n\n // DOCS\n // this function:\n // - checks if there are sync requests via the operations route of the relayer\n // - exports the encrypted private key and sends it back to the relayer (fulfills)\n // @TODO add password\n async fulfillSyncRequests(email: string, password: string) {\n await this.#getEmailVaultInfo(email)\n const operations = this.emailVaultStates.email[email].operations\n const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (key) {\n // pull keys from keystore for every operation\n const newOperations: EmailVaultOperation[] = await Promise.all(\n operations.map(async (op): Promise => {\n if (op.type === 'requestKeySync') {\n return {\n ...op,\n value: JSON.stringify({\n privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(\n op.key,\n op.requester\n )\n }),\n password\n }\n }\n return op\n })\n )\n await this.#emailVault.operations(email, key, newOperations)\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password))\n }\n this.emitUpdate()\n }\n\n async cleanMagicAndSessionKeys() {\n this.#magicLinkKeys = {}\n this.#sessionKeys = {}\n\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n\n this.emitUpdate()\n }\n\n cancelEmailConfirmation() {\n this.#shouldStopConfirmationPolling = true\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n get keystoreRecoveryEmail(): string | undefined {\n const keyStoreUid = this.#keyStore.keyStoreUid\n const EVEmails = Object.keys(this.emailVaultStates.email)\n\n if (!keyStoreUid || !EVEmails.length) return\n\n return EVEmails.find((email) => {\n return (\n this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type ===\n SecretType.KeyStore\n )\n })\n }\n\n get hasKeystoreRecovery() {\n return !!this.keystoreRecoveryEmail\n }\n\n get hasConfirmedRecoveryEmail(): boolean {\n if (!this.isReady) return false\n\n const recoveryEmail = this.keystoreRecoveryEmail\n\n if (!recoveryEmail) return false\n\n return !!this.getMagicLinkKeyByEmail(recoveryEmail)\n }\n\n get banners(): Banner[] {\n const banners: Banner[] = []\n\n // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore)\n // and if the keystore secret backup is not enabled already\n if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) {\n banners.push({\n id: 'keystore-secret-backup',\n type: 'info',\n title: 'Enable device password reset via email',\n text: \"Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.\",\n actions: [\n {\n label: 'Enable',\n actionName: 'backup-keystore-secret'\n }\n ]\n })\n }\n\n Object.keys(this.emailVaultStates.email).forEach((email) => {\n const emailVaultData = this.emailVaultStates?.email?.[email]\n Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => {\n const keystoreKeys = this.#keyStore.keys.filter((key) =>\n accInfo.associatedKeys.includes(key.addr)\n )\n\n if (keystoreKeys.length) return\n banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys))\n })\n })\n\n return banners\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n currentState: this.currentState, // includes the getter in the stringified instance\n hasKeystoreRecovery: this.hasKeystoreRecovery,\n hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail,\n banners: this.banners, // includes the getter in the stringified instance,\n keystoreRecoveryEmail: this.keystoreRecoveryEmail\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable no-await-in-loop */\nimport crypto from 'crypto'\n\nimport { Banner } from '../../interfaces/banner'\nimport {\n EmailVaultData,\n EmailVaultOperation,\n MagicLinkFlow,\n OperationRequestType,\n SecretType\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { getKeySyncBanner } from '../../libs/banners/banners'\nimport { EmailVault } from '../../libs/emailVault/emailVault'\nimport { requestMagicLink } from '../../libs/magicLink/magicLink'\nimport { Polling } from '../../libs/polling/polling'\nimport wait from '../../utils/wait'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\n\nexport enum EmailVaultState {\n Loading = 'loading',\n WaitingEmailConfirmation = 'WaitingEmailConfirmation',\n UploadingSecret = 'UploadingSecret',\n Ready = 'Ready'\n}\n\nexport type MagicLinkKey = {\n key: string\n expiry: Date\n confirmed: boolean\n}\n\nconst RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'\nconst EMAIL_VAULT_STORAGE_KEY = 'emailVault'\nconst MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'\nconst SESSION_KEYS_STORAGE_KEY = 'sessionKeys'\n\nexport type MagicLinkKeys = {\n [email: string]: MagicLinkKey\n}\n\nexport type SessionKeys = {\n [email: string]: string\n}\n\nfunction base64UrlEncode(str: string) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nconst STATUS_WRAPPED_METHODS = {\n getEmailVaultInfo: 'INITIAL',\n uploadKeyStoreSecret: 'INITIAL',\n recoverKeyStore: 'INITIAL',\n requestKeysSync: 'INITIAL',\n finalizeSyncKeys: 'INITIAL'\n} as const\n\n/**\n * EmailVaultController\n * @class\n * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries\n * The most important thing it achieves is handling magicLink and session keys with polling.\n * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc.\n * Extended documentation about the EV and its internal mechanisms\n * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation\n */\nexport class EmailVaultController extends EventEmitter {\n private storage: Storage\n\n private initialLoadPromise: Promise\n\n #isWaitingEmailConfirmation: boolean = false\n\n #isUploadingSecret: boolean = false\n\n #emailVault: EmailVault\n\n #magicLinkKeys: MagicLinkKeys = {}\n\n #sessionKeys: SessionKeys = {}\n\n #shouldStopConfirmationPolling: boolean = false\n\n #autoConfirmMagicLink: boolean = false\n\n #fetch: Fetch\n\n #relayerUrl: string\n\n #keyStore: KeystoreController\n\n isReady: boolean = false\n\n lastUpdate: Date = new Date()\n\n emailVaultStates: {\n email: { [email: string]: EmailVaultData }\n criticalError?: Error\n errors?: Error[]\n } = {\n email: {}\n }\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n relayerUrl: string,\n keyStore: KeystoreController,\n options?: { autoConfirmMagicLink?: boolean }\n ) {\n super()\n this.#fetch = fetch\n this.#relayerUrl = relayerUrl\n this.storage = storage\n this.#emailVault = new EmailVault(fetch, relayerUrl)\n this.#keyStore = keyStore\n this.initialLoadPromise = this.load()\n this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false\n }\n\n private async load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n const [emailVaultState, magicLinkKey] = await Promise.all([\n this.storage.get(EMAIL_VAULT_STORAGE_KEY, {\n email: {}\n }),\n this.storage.get(MAGIC_LINK_STORAGE_KEY, {})\n ])\n\n this.emailVaultStates = emailVaultState\n this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey)\n\n this.lastUpdate = new Date()\n this.isReady = true\n this.emitUpdate()\n }\n\n get currentState(): EmailVaultState {\n if (!this.isReady) return EmailVaultState.Loading\n if (this.#isWaitingEmailConfirmation) return EmailVaultState.WaitingEmailConfirmation\n if (this.#isUploadingSecret) return EmailVaultState.UploadingSecret\n\n return EmailVaultState.Ready\n }\n\n async #requestSessionKey(email: string) {\n // if magicLinkKey => get sessionKey\n const key = (await this.#getMagicLinkKey(email))?.key\n if (!key) return\n this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key)\n\n // store magicLinkKey and sessionKey\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n }\n\n async handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow) {\n await this.initialLoadPromise\n const currentKey = (await this.#getMagicLinkKey(email))?.key\n if (currentKey) {\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n return\n }\n\n this.#isWaitingEmailConfirmation = true\n this.#shouldStopConfirmationPolling = false\n this.emitUpdate()\n\n const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, {\n autoConfirm: this.#autoConfirmMagicLink,\n flow\n })\n\n const polling = new Polling()\n polling.onUpdate(async () => {\n if (polling.state.isError && polling.state.error.output.res.status === 401) {\n this.#isWaitingEmailConfirmation = true\n this.emitUpdate()\n } else if (polling.state.isError) {\n this.emitError({\n message: `Can't request magic link for email ${email}: ${polling.state.error.message}`,\n level: 'major',\n error: new Error(\n `Can't request magic link for email ${email}: ${polling.state.error.message}`\n )\n })\n this.emailVaultStates.errors = [polling.state.error]\n this.emitUpdate()\n }\n })\n\n const ev: (EmailVaultData & { error?: any; canceled?: boolean }) | null = await polling.exec(\n this.#emailVault.getEmailVaultInfo.bind(this.#emailVault),\n [email, newKey.key],\n () => {\n this.#isWaitingEmailConfirmation = false\n },\n () => this.#shouldStopConfirmationPolling,\n 3 * 60 * 1000,\n 1000\n )\n\n if (this.#shouldStopConfirmationPolling) {\n this.emitUpdate()\n return\n }\n\n if (ev && !ev.error) {\n this.#isWaitingEmailConfirmation = false\n this.#magicLinkKeys[email] = {\n key: newKey.key,\n expiry: new Date(newKey.expiry),\n confirmed: true\n }\n fn && (await fn())\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys)\n this.#requestSessionKey(email)\n } else {\n this.emitError({\n message: `Unexpected error getting email vault for ${email}`,\n level: 'major',\n error: new Error(`Unexpected error getting email vault for ${email}`)\n })\n }\n this.emitUpdate()\n }\n\n async #getSessionKey(email: string): Promise {\n await this.initialLoadPromise\n return this.#sessionKeys[email]\n }\n\n getMagicLinkKeyByEmail(email: string): MagicLinkKey | null {\n const result = this.#magicLinkKeys[email]\n if (!result || !result.confirmed) return null\n if (Date.now() >= result.expiry.getTime()) return null\n return result\n }\n\n async #getMagicLinkKey(email: string): Promise {\n // if we have valid magicLinkKey => returns it else null\n await this.initialLoadPromise\n\n return this.getMagicLinkKeyByEmail(email)\n }\n\n #parseMagicLinkKeys(mks: any): MagicLinkKeys {\n return Object.fromEntries(\n Object.keys(mks).map((email) => [\n email,\n { ...mks[email], expiry: new Date(mks[email].expiry) }\n ])\n )\n }\n\n async getEmailVaultInfo(email: string, flow?: MagicLinkFlow) {\n await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow))\n }\n\n async #getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise {\n const [existsSessionKey, magicLinkKey] = await Promise.all([\n this.#getSessionKey(email),\n this.#getMagicLinkKey(email)\n ])\n const key = existsSessionKey || magicLinkKey?.key\n\n let emailVault: EmailVaultData | null = null\n if (key) {\n emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e: any) => {\n this.emitError({\n message: `Error getting email vault for ${email} ${e.message}`,\n level: 'major',\n error: new Error(`Error getting email vault for ${email} ${e.message}`)\n })\n this.emailVaultStates.errors = []\n this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]\n\n return null\n })\n } else {\n await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow)\n }\n\n if (emailVault) {\n this.emailVaultStates.email[email] = emailVault\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n if (!existsSessionKey) {\n await this.#requestSessionKey(email)\n }\n }\n\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n async uploadKeyStoreSecret(email: string) {\n await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email))\n }\n\n async #uploadKeyStoreSecret(email: string) {\n if (!this.emailVaultStates.email[email]) {\n await this.#getEmailVaultInfo(email, 'setup')\n }\n\n let result: Boolean | null = false\n let magicKey = await this.#getMagicLinkKey(email)\n\n if (!magicKey?.key && !this.#shouldStopConfirmationPolling) {\n await this.handleMagicLinkKey(\n email,\n async () => {\n magicKey = await this.#getMagicLinkKey(email)\n },\n 'setup'\n )\n }\n\n if (this.#shouldStopConfirmationPolling) {\n this.#isUploadingSecret = false\n // Set status to ERROR, but don't emit an error message\n throw new Error('')\n }\n\n if (magicKey?.key) {\n this.#isUploadingSecret = true\n const randomBytes = crypto.randomBytes(32)\n // toString('base64url') doesn't work for some reason in the browser extension\n const newSecret = base64UrlEncode(randomBytes.toString('base64'))\n await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false)\n const keyStoreUid = await this.#keyStore.getKeyStoreUid()\n result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret)\n } else\n this.emitError({\n message: 'Email key not confirmed',\n level: 'minor',\n error: new Error('uploadKeyStoreSecret: not confirmed magic link key')\n })\n\n if (result) {\n await this.#getEmailVaultInfo(email, 'setup')\n } else {\n this.emitError({\n level: 'minor',\n message: 'Error upload keyStore to email vault',\n error: new Error('error upload keyStore to email vault')\n })\n }\n\n this.#isUploadingSecret = false\n this.emitUpdate()\n }\n\n async recoverKeyStore(email: string, newPassword: string) {\n await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword))\n }\n\n async #recoverKeyStore(email: string, newPassword: string): Promise {\n const uid = await this.#keyStore.getKeyStoreUid()\n const state = this.emailVaultStates\n if (!state.email[email]) {\n this.emitError({\n message: `You are not logged in with ${email} on this device.`,\n level: 'major',\n error: new Error(`Keystore recovery: email ${email} not imported`)\n })\n return\n }\n\n if (!state.email[email].availableSecrets[uid]) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error('Keystore recovery: no keystore secret for this device')\n })\n return\n }\n if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error(`Keystore recovery: no keystore secret for email ${email}`)\n })\n return\n }\n\n if (email !== this.keystoreRecoveryEmail) {\n return\n }\n const emitExpiredMagicLinkError = () => {\n this.emitError({\n message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`,\n level: 'major',\n error: new Error(`Keystore recovery: magic link expired for ${email}`)\n })\n\n // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated.\n // The application relies on this flag to make decisions regarding\n // which step the user should be in during the Forgotten Password flow.\n this.emitUpdate()\n }\n\n const key = (await this.#getMagicLinkKey(email))?.key\n\n if (!key) {\n emitExpiredMagicLinkError()\n return\n }\n\n let result\n try {\n result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid)\n } catch (e: any) {\n if (e?.output?.res?.message === 'invalid key') {\n emitExpiredMagicLinkError()\n return\n }\n }\n\n if (!result || !result.value) {\n this.emitError({\n message:\n 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support',\n level: 'major',\n error: new Error(\n \"Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.\"\n )\n })\n\n return\n }\n\n // Once we are here - it means we pass all the above validations,\n // and we are ready to change the keystore password secret\n this.emailVaultStates.email[email].availableSecrets[result.key] = result\n\n await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value)\n await this.#keyStore.removeSecret('password')\n await this.#keyStore.addSecret('password', newPassword, '', false)\n\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n this.emitUpdate()\n }\n\n async requestKeysSync(email: string, keys: string[]) {\n await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys))\n }\n\n async #requestKeysSync(email: string, keys: string[]) {\n const [magicLinkKey, keyStoreUid] = await Promise.all([\n this.#getMagicLinkKey(email),\n this.#keyStore.getKeyStoreUid()\n ])\n\n const operations: EmailVaultOperation[] = keys.map((key) => ({\n type: OperationRequestType.requestKeySync,\n requester: keyStoreUid,\n key\n }))\n if (magicLinkKey) {\n const newOperations = (await this.#emailVault.operations(\n email,\n magicLinkKey.key,\n operations\n ))!\n this.emailVaultStates.email[email].operations = newOperations\n this.emitUpdate()\n }\n await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys))\n }\n\n async #finalizeSyncKeys(email: string, operations: EmailVaultOperation[]) {\n const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (authKey) {\n const cloudOperations = await this.#emailVault\n .getOperations(email, authKey, operations)\n .catch((e) => {\n this.emitError({\n message: `Can't pull operations: ${e}`,\n level: 'major',\n error: new Error(`Can't pull operations: ${e}`)\n })\n })\n if (!cloudOperations) {\n this.emitError({\n message: \"Can't pull operations\",\n level: 'major',\n error: new Error(\"Can't pull operations\")\n })\n }\n\n // Promise.all makes race conditions\n for (let i = 0; i < cloudOperations!.length; i++) {\n const op = cloudOperations![i]\n if (op.type === 'requestKeySync' && op.value) {\n const { privateKey } = JSON.parse(op.value || '{}')\n await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true)\n }\n }\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations))\n }\n }\n\n async finalizeSyncKeys(email: string, keys: string[], password: string) {\n const operations: any[] = keys\n .map((key) => {\n const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key)\n if (!res) {\n this.emitError({\n message: `No sync request for key ${key}`,\n level: 'major',\n error: new Error(`No sync request for key ${key}`)\n })\n return null\n }\n return { ...res, password }\n })\n .filter((x) => x)\n await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations))\n }\n\n // DOCS\n // this function:\n // - checks if there are sync requests via the operations route of the relayer\n // - exports the encrypted private key and sends it back to the relayer (fulfills)\n // @TODO add password\n async fulfillSyncRequests(email: string, password: string) {\n await this.#getEmailVaultInfo(email)\n const operations = this.emailVaultStates.email[email].operations\n const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (key) {\n // pull keys from keystore for every operation\n const newOperations: EmailVaultOperation[] = await Promise.all(\n operations.map(async (op): Promise => {\n if (op.type === 'requestKeySync') {\n return {\n ...op,\n value: JSON.stringify({\n privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(\n op.key,\n op.requester\n )\n }),\n password\n }\n }\n return op\n })\n )\n await this.#emailVault.operations(email, key, newOperations)\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password))\n }\n this.emitUpdate()\n }\n\n async cleanMagicAndSessionKeys() {\n this.#magicLinkKeys = {}\n this.#sessionKeys = {}\n\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n\n this.emitUpdate()\n }\n\n cancelEmailConfirmation() {\n this.#shouldStopConfirmationPolling = true\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n get keystoreRecoveryEmail(): string | undefined {\n const keyStoreUid = this.#keyStore.keyStoreUid\n const EVEmails = Object.keys(this.emailVaultStates.email)\n\n if (!keyStoreUid || !EVEmails.length) return\n\n return EVEmails.find((email) => {\n return (\n this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type ===\n SecretType.KeyStore\n )\n })\n }\n\n get hasKeystoreRecovery() {\n return !!this.keystoreRecoveryEmail\n }\n\n get hasConfirmedRecoveryEmail(): boolean {\n if (!this.isReady) return false\n\n const recoveryEmail = this.keystoreRecoveryEmail\n\n if (!recoveryEmail) return false\n\n return !!this.getMagicLinkKeyByEmail(recoveryEmail)\n }\n\n get banners(): Banner[] {\n const banners: Banner[] = []\n\n // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore)\n // and if the keystore secret backup is not enabled already\n if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) {\n banners.push({\n id: 'keystore-secret-backup',\n type: 'info',\n title: 'Enable device password reset via email',\n text: \"Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.\",\n actions: [\n {\n label: 'Enable',\n actionName: 'backup-keystore-secret'\n }\n ]\n })\n }\n\n Object.keys(this.emailVaultStates.email).forEach((email) => {\n const emailVaultData = this.emailVaultStates?.email?.[email]\n Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => {\n const keystoreKeys = this.#keyStore.keys.filter((key) =>\n accInfo.associatedKeys.includes(key.addr)\n )\n\n if (keystoreKeys.length) return\n banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys))\n })\n })\n\n return banners\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n currentState: this.currentState, // includes the getter in the stringified instance\n hasKeystoreRecovery: this.hasKeystoreRecovery,\n hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail,\n banners: this.banners, // includes the getter in the stringified instance,\n keystoreRecoveryEmail: this.keystoreRecoveryEmail\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.js b/dist/src/controllers/eventEmitter/eventEmitter.js index 9ccf41466..685b6c4ca 100644 --- a/dist/src/controllers/eventEmitter/eventEmitter.js +++ b/dist/src/controllers/eventEmitter/eventEmitter.js @@ -1,7 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); /* eslint-disable no-restricted-syntax */ -import wait from '../../utils/wait'; +const wait_1 = tslib_1.__importDefault(require("../../utils/wait")); const LIMIT_ON_THE_NUMBER_OF_ERRORS = 100; -export default class EventEmitter { +class EventEmitter { #callbacksWithId = []; #callbacks = []; #errorCallbacksWithId = []; @@ -28,7 +31,7 @@ export default class EventEmitter { * batching the ones in between. */ async forceEmitUpdate() { - await wait(1); + await (0, wait_1.default)(1); // eslint-disable-next-line no-restricted-syntax for (const i of this.#callbacksWithId) i.cb(true); @@ -153,4 +156,5 @@ export default class EventEmitter { }; } } +exports.default = EventEmitter; //# sourceMappingURL=eventEmitter.js.map \ No newline at end of file diff --git a/dist/src/controllers/eventEmitter/eventEmitter.js.map b/dist/src/controllers/eventEmitter/eventEmitter.js.map index e2898ba85..92a91ae62 100644 --- a/dist/src/controllers/eventEmitter/eventEmitter.js.map +++ b/dist/src/controllers/eventEmitter/eventEmitter.js.map @@ -1 +1 @@ -{"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../../../src/controllers/eventEmitter/eventEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\nimport wait from '../../utils/wait'\n\nconst LIMIT_ON_THE_NUMBER_OF_ERRORS = 100\n\nexport type ErrorRef = {\n // user-friendly message, ideally containing call to action\n message: string\n // error level, used for filtering\n level: 'fatal' | 'major' | 'minor' | 'silent'\n // error containing technical details and stack trace\n error: Error\n}\n\nexport type Statuses = {\n [key in T]: 'INITIAL' | 'LOADING' | 'SUCCESS' | 'ERROR'\n}\n\nexport default class EventEmitter {\n #callbacksWithId: {\n id: string | null\n cb: (forceEmit?: true) => void\n }[] = []\n\n #callbacks: ((forceEmit?: true) => void)[] = []\n\n #errorCallbacksWithId: {\n id: string | null\n cb: (error: ErrorRef) => void\n }[] = []\n\n #errorCallbacks: ((error: ErrorRef) => void)[] = []\n\n #errors: ErrorRef[] = []\n\n statuses: Statuses = {}\n\n get onUpdateIds() {\n return this.#callbacksWithId.map((item) => item.id)\n }\n\n get onErrorIds() {\n return this.#errorCallbacksWithId.map((item) => item.id)\n }\n\n // called emittedErrors and not just errors because some of the other controllers\n // that extend this one have errors defined already\n get emittedErrors() {\n return this.#errors\n }\n\n /**\n * Using this function to emit an update bypasses both background and React batching,\n * ensuring that the state update is immediately applied at the application level (React/Extension).\n *\n * This is particularly handy when multiple status flags are being updated rapidly.\n * Without the `forceEmitUpdate` option, the application will only render the very first and last status updates,\n * batching the ones in between.\n */\n async forceEmitUpdate() {\n await wait(1)\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb(true)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb(true)\n }\n\n protected emitUpdate() {\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb()\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb()\n }\n\n protected emitError(error: ErrorRef) {\n this.#errors.push(error)\n this.#trimErrorsIfNeeded()\n console.log(\n `[Еmitted error in controller ${this.constructor.name}] ${error.message}`,\n this.#errors\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#errorCallbacksWithId) i.cb(error)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#errorCallbacks) cb(error)\n }\n\n protected async withStatus(\n callName: string,\n fn: Function,\n allowConcurrentActions = false,\n // Silence this error in prod to avoid displaying wired error messages.\n // The only benefit of displaying it is for devs to see when an action is dispatched twice.\n // TODO: If this happens on PROD, ideally we should get an error report somehow somewhere.\n errorLevel: ErrorRef['level'] = process.env.APP_ENV === 'production' &&\n process.env.IS_TESTING !== 'true'\n ? 'silent'\n : 'minor'\n ) {\n const someStatusIsLoading = Object.values(this.statuses).some((status) => status !== 'INITIAL')\n\n if (!this.statuses[callName]) {\n console.error(`${callName} is not defined in \"statuses\".`)\n }\n\n // By default, concurrent actions are disallowed to maintain consistency, particularly within sub-controllers where\n // simultaneous actions can lead to unintended side effects. The 'allowConcurrentActions' flag is provided to enable\n // concurrent execution at the main controller level. This is useful when multiple actions need to modify the state\n // of different sub-controllers simultaneously.\n if ((someStatusIsLoading && !allowConcurrentActions) || this.statuses[callName] !== 'INITIAL') {\n this.emitError({\n level: errorLevel,\n message: `Please wait for the completion of the previous action before initiating another one.', ${callName}`,\n error: new Error(\n 'Another function is already being handled by withStatus refrain from invoking a second function.'\n )\n })\n\n return\n }\n\n this.statuses[callName] = 'LOADING'\n await this.forceEmitUpdate()\n\n try {\n await fn()\n\n this.statuses[callName] = 'SUCCESS'\n await this.forceEmitUpdate()\n } catch (error: any) {\n this.statuses[callName] = 'ERROR'\n if ('message' in error && 'level' in error && 'error' in error) {\n this.emitError(error)\n\n // Sometimes we don't want to show an error message to the user. For example, if the user cancels a request\n // we don't want to go through the SUCCESS state, but we also don't want to show an error message.\n } else if (error?.message) {\n this.emitError({\n message: error?.message || 'An unexpected error occurred',\n level: 'major',\n error\n })\n }\n await this.forceEmitUpdate()\n }\n\n this.statuses[callName] = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n // Prevents memory leaks and storing huge amount of errors\n #trimErrorsIfNeeded() {\n if (this.#errors.length > LIMIT_ON_THE_NUMBER_OF_ERRORS) {\n const excessErrors = this.#errors.length - LIMIT_ON_THE_NUMBER_OF_ERRORS\n this.#errors = this.#errors.slice(excessErrors)\n }\n }\n\n // returns an unsub function\n onUpdate(cb: (forceUpdate?: boolean) => void, id?: string): () => void {\n if (id) {\n this.#callbacksWithId.push({ id, cb })\n } else {\n this.#callbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#callbacksWithId = this.#callbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#callbacks.splice(this.#callbacks.indexOf(cb), 1)\n }\n }\n }\n\n // returns an unsub function for error events\n onError(cb: (error: ErrorRef) => void, id?: string): () => void {\n if (id) {\n this.#errorCallbacksWithId.push({ id, cb })\n } else {\n this.#errorCallbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#errorCallbacksWithId = this.#errorCallbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#errorCallbacks.splice(this.#errorCallbacks.indexOf(cb), 1)\n }\n }\n }\n\n toJSON() {\n return {\n ...this,\n emittedErrors: this.emittedErrors // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../../../src/controllers/eventEmitter/eventEmitter.ts"],"names":[],"mappings":";;;AAAA,yCAAyC;AACzC,oEAAmC;AAEnC,MAAM,6BAA6B,GAAG,GAAG,CAAA;AAezC,MAAqB,YAAY;IAC/B,gBAAgB,GAGV,EAAE,CAAA;IAER,UAAU,GAAmC,EAAE,CAAA;IAE/C,qBAAqB,GAGf,EAAE,CAAA;IAER,eAAe,GAAkC,EAAE,CAAA;IAEnD,OAAO,GAAe,EAAE,CAAA;IAExB,QAAQ,GAAqB,EAAE,CAAA;IAE/B,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,iFAAiF;IACjF,mDAAmD;IACnD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,IAAA,cAAI,EAAC,CAAC,CAAC,CAAA;QACb,gDAAgD;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB;YAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACjD,gDAAgD;QAChD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU;YAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAES,UAAU;QAClB,gDAAgD;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB;YAAE,CAAC,CAAC,EAAE,EAAE,CAAA;QAC7C,gDAAgD;QAChD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU;YAAE,EAAE,EAAE,CAAA;IACxC,CAAC;IAES,SAAS,CAAC,KAAe;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC1B,OAAO,CAAC,GAAG,CACT,gCAAgC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EACzE,IAAI,CAAC,OAAO,CACb,CAAA;QAED,gDAAgD;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,qBAAqB;YAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACvD,gDAAgD;QAChD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe;YAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,QAAgB,EAChB,EAAY,EACZ,sBAAsB,GAAG,KAAK;IAC9B,uEAAuE;IACvE,2FAA2F;IAC3F,0FAA0F;IAC1F,aAAgC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY;QACpE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM;QAC/B,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,OAAO;QAEX,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;QAE/F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,gCAAgC,CAAC,CAAA;SAC3D;QAED,mHAAmH;QACnH,oHAAoH;QACpH,mHAAmH;QACnH,+CAA+C;QAC/C,IAAI,CAAC,mBAAmB,IAAI,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;YAC7F,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,0FAA0F,QAAQ,EAAE;gBAC7G,KAAK,EAAE,IAAI,KAAK,CACd,kGAAkG,CACnG;aACF,CAAC,CAAA;YAEF,OAAM;SACP;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;QACnC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAE5B,IAAI;YACF,MAAM,EAAE,EAAE,CAAA;YAEV,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;YACnC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;SAC7B;QAAC,OAAO,KAAU,EAAE;YACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;YACjC,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;gBAC9D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;gBAErB,2GAA2G;gBAC3G,kGAAkG;aACnG;iBAAM,IAAI,KAAK,EAAE,OAAO,EAAE;gBACzB,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,8BAA8B;oBACzD,KAAK,EAAE,OAAO;oBACd,KAAK;iBACN,CAAC,CAAA;aACH;YACD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;SAC7B;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;QACnC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;IAC9B,CAAC;IAED,0DAA0D;IAC1D,mBAAmB;QACjB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,6BAA6B,EAAE;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,6BAA6B,CAAA;YACxE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;SAChD;IACH,CAAC;IAED,4BAA4B;IAC5B,QAAQ,CAAC,EAAmC,EAAE,EAAW;QACvD,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;SACvC;aAAM;YACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SACzB;QAED,OAAO,GAAG,EAAE;YACV,IAAI,EAAE,EAAE;gBACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAClD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CACzC,CAAA;aACF;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;aACvD;QACH,CAAC,CAAA;IACH,CAAC;IAED,6CAA6C;IAC7C,OAAO,CAAC,EAA6B,EAAE,EAAW;QAChD,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;SAC5C;aAAM;YACL,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SAC9B;QAED,OAAO,GAAG,EAAE;YACV,IAAI,EAAE,EAAE;gBACN,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAC5D,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CACzC,CAAA;aACF;iBAAM;gBACL,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;aACjE;QACH,CAAC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,kDAAkD;SACrF,CAAA;IACH,CAAC;CACF;AAzLD,+BAyLC","sourcesContent":["/* eslint-disable no-restricted-syntax */\nimport wait from '../../utils/wait'\n\nconst LIMIT_ON_THE_NUMBER_OF_ERRORS = 100\n\nexport type ErrorRef = {\n // user-friendly message, ideally containing call to action\n message: string\n // error level, used for filtering\n level: 'fatal' | 'major' | 'minor' | 'silent'\n // error containing technical details and stack trace\n error: Error\n}\n\nexport type Statuses = {\n [key in T]: 'INITIAL' | 'LOADING' | 'SUCCESS' | 'ERROR'\n}\n\nexport default class EventEmitter {\n #callbacksWithId: {\n id: string | null\n cb: (forceEmit?: true) => void\n }[] = []\n\n #callbacks: ((forceEmit?: true) => void)[] = []\n\n #errorCallbacksWithId: {\n id: string | null\n cb: (error: ErrorRef) => void\n }[] = []\n\n #errorCallbacks: ((error: ErrorRef) => void)[] = []\n\n #errors: ErrorRef[] = []\n\n statuses: Statuses = {}\n\n get onUpdateIds() {\n return this.#callbacksWithId.map((item) => item.id)\n }\n\n get onErrorIds() {\n return this.#errorCallbacksWithId.map((item) => item.id)\n }\n\n // called emittedErrors and not just errors because some of the other controllers\n // that extend this one have errors defined already\n get emittedErrors() {\n return this.#errors\n }\n\n /**\n * Using this function to emit an update bypasses both background and React batching,\n * ensuring that the state update is immediately applied at the application level (React/Extension).\n *\n * This is particularly handy when multiple status flags are being updated rapidly.\n * Without the `forceEmitUpdate` option, the application will only render the very first and last status updates,\n * batching the ones in between.\n */\n async forceEmitUpdate() {\n await wait(1)\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb(true)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb(true)\n }\n\n protected emitUpdate() {\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#callbacksWithId) i.cb()\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#callbacks) cb()\n }\n\n protected emitError(error: ErrorRef) {\n this.#errors.push(error)\n this.#trimErrorsIfNeeded()\n console.log(\n `[Еmitted error in controller ${this.constructor.name}] ${error.message}`,\n this.#errors\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const i of this.#errorCallbacksWithId) i.cb(error)\n // eslint-disable-next-line no-restricted-syntax\n for (const cb of this.#errorCallbacks) cb(error)\n }\n\n protected async withStatus(\n callName: string,\n fn: Function,\n allowConcurrentActions = false,\n // Silence this error in prod to avoid displaying wired error messages.\n // The only benefit of displaying it is for devs to see when an action is dispatched twice.\n // TODO: If this happens on PROD, ideally we should get an error report somehow somewhere.\n errorLevel: ErrorRef['level'] = process.env.APP_ENV === 'production' &&\n process.env.IS_TESTING !== 'true'\n ? 'silent'\n : 'minor'\n ) {\n const someStatusIsLoading = Object.values(this.statuses).some((status) => status !== 'INITIAL')\n\n if (!this.statuses[callName]) {\n console.error(`${callName} is not defined in \"statuses\".`)\n }\n\n // By default, concurrent actions are disallowed to maintain consistency, particularly within sub-controllers where\n // simultaneous actions can lead to unintended side effects. The 'allowConcurrentActions' flag is provided to enable\n // concurrent execution at the main controller level. This is useful when multiple actions need to modify the state\n // of different sub-controllers simultaneously.\n if ((someStatusIsLoading && !allowConcurrentActions) || this.statuses[callName] !== 'INITIAL') {\n this.emitError({\n level: errorLevel,\n message: `Please wait for the completion of the previous action before initiating another one.', ${callName}`,\n error: new Error(\n 'Another function is already being handled by withStatus refrain from invoking a second function.'\n )\n })\n\n return\n }\n\n this.statuses[callName] = 'LOADING'\n await this.forceEmitUpdate()\n\n try {\n await fn()\n\n this.statuses[callName] = 'SUCCESS'\n await this.forceEmitUpdate()\n } catch (error: any) {\n this.statuses[callName] = 'ERROR'\n if ('message' in error && 'level' in error && 'error' in error) {\n this.emitError(error)\n\n // Sometimes we don't want to show an error message to the user. For example, if the user cancels a request\n // we don't want to go through the SUCCESS state, but we also don't want to show an error message.\n } else if (error?.message) {\n this.emitError({\n message: error?.message || 'An unexpected error occurred',\n level: 'major',\n error\n })\n }\n await this.forceEmitUpdate()\n }\n\n this.statuses[callName] = 'INITIAL'\n await this.forceEmitUpdate()\n }\n\n // Prevents memory leaks and storing huge amount of errors\n #trimErrorsIfNeeded() {\n if (this.#errors.length > LIMIT_ON_THE_NUMBER_OF_ERRORS) {\n const excessErrors = this.#errors.length - LIMIT_ON_THE_NUMBER_OF_ERRORS\n this.#errors = this.#errors.slice(excessErrors)\n }\n }\n\n // returns an unsub function\n onUpdate(cb: (forceUpdate?: boolean) => void, id?: string): () => void {\n if (id) {\n this.#callbacksWithId.push({ id, cb })\n } else {\n this.#callbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#callbacksWithId = this.#callbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#callbacks.splice(this.#callbacks.indexOf(cb), 1)\n }\n }\n }\n\n // returns an unsub function for error events\n onError(cb: (error: ErrorRef) => void, id?: string): () => void {\n if (id) {\n this.#errorCallbacksWithId.push({ id, cb })\n } else {\n this.#errorCallbacks.push(cb)\n }\n\n return () => {\n if (id) {\n this.#errorCallbacksWithId = this.#errorCallbacksWithId.filter(\n (callbackItem) => callbackItem.id !== id\n )\n } else {\n this.#errorCallbacks.splice(this.#errorCallbacks.indexOf(cb), 1)\n }\n }\n }\n\n toJSON() {\n return {\n ...this,\n emittedErrors: this.emittedErrors // includes the getter in the stringified instance\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.js b/dist/src/controllers/invite/invite.js index 09558bb41..2a3003af3 100644 --- a/dist/src/controllers/invite/invite.js +++ b/dist/src/controllers/invite/invite.js @@ -1,11 +1,15 @@ -import { relayerCall } from '../../libs/relayerCall/relayerCall'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InviteController = exports.INVITE_STATUS = void 0; +const tslib_1 = require("tslib"); +const relayerCall_1 = require("../../libs/relayerCall/relayerCall"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); // eslint-disable-next-line @typescript-eslint/naming-convention -export var INVITE_STATUS; +var INVITE_STATUS; (function (INVITE_STATUS) { INVITE_STATUS["UNVERIFIED"] = "UNVERIFIED"; INVITE_STATUS["VERIFIED"] = "VERIFIED"; -})(INVITE_STATUS || (INVITE_STATUS = {})); +})(INVITE_STATUS = exports.INVITE_STATUS || (exports.INVITE_STATUS = {})); const DEFAULT_STATE = { status: INVITE_STATUS.UNVERIFIED, verifiedAt: null, @@ -18,7 +22,7 @@ const DEFAULT_STATE = { * code before they can use the Ambire extension. This controller manages the * verification of these invite codes and persisting the current invite status. */ -export class InviteController extends EventEmitter { +class InviteController extends eventEmitter_1.default { #storage; #callRelayer; #state = DEFAULT_STATE; @@ -33,7 +37,7 @@ export class InviteController extends EventEmitter { constructor({ relayerUrl, fetch, storage }) { super(); this.#storage = storage; - this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.#callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch }); this.#initialLoadPromise = this.#load(); } async #load() { @@ -83,4 +87,5 @@ export class InviteController extends EventEmitter { this.emitUpdate(); } } +exports.InviteController = InviteController; //# sourceMappingURL=invite.js.map \ No newline at end of file diff --git a/dist/src/controllers/invite/invite.js.map b/dist/src/controllers/invite/invite.js.map index cd98f62e8..0e9ce138a 100644 --- a/dist/src/controllers/invite/invite.js.map +++ b/dist/src/controllers/invite/invite.js.map @@ -1 +1 @@ -{"version":3,"file":"invite.js","sourceRoot":"","sources":["../../../../src/controllers/invite/invite.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport enum INVITE_STATUS {\n UNVERIFIED = 'UNVERIFIED',\n VERIFIED = 'VERIFIED'\n}\n\ntype InviteState = {\n status: INVITE_STATUS\n verifiedAt: null | number // timestamp\n verifiedCode: null | string\n becameOGAt: null // timestamp\n}\n\nconst DEFAULT_STATE = {\n status: INVITE_STATUS.UNVERIFIED,\n verifiedAt: null,\n verifiedCode: null,\n becameOGAt: null\n}\n\n/**\n * As of v4.20.0, an invite verification flow is introduced as a first step upon\n * extension installation. This flow requires users to provide a valid invite\n * code before they can use the Ambire extension. This controller manages the\n * verification of these invite codes and persisting the current invite status.\n */\nexport class InviteController extends EventEmitter {\n #storage: Storage\n\n #callRelayer: Function\n\n #state: InviteState = DEFAULT_STATE\n\n inviteStatus: InviteState['status'] = INVITE_STATUS.UNVERIFIED\n\n verifiedCode: InviteState['verifiedCode'] = null\n\n /**\n * Whether the user has become an Ambire OG (Original Gangster), a status that\n * comes with specific privileges (e.g. early access to new or experimental features).\n */\n isOG: boolean = false\n\n #initialLoadPromise: Promise\n\n constructor({\n relayerUrl,\n fetch,\n storage\n }: {\n relayerUrl: string\n fetch: Fetch\n storage: Storage\n }) {\n super()\n\n this.#storage = storage\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n const nextState = await this.#storage.get('invite', this.#state)\n this.#state = { ...DEFAULT_STATE, ...nextState }\n\n this.inviteStatus = this.#state.status\n this.verifiedCode = this.#state.verifiedCode\n this.isOG = !!this.#state.becameOGAt\n this.emitUpdate()\n }\n\n /**\n * Verifies an invite code and if verified successfully, persists the invite\n * status (and some meta information) in the storage.\n */\n async verify(code: string) {\n await this.#initialLoadPromise\n\n try {\n const res = await this.#callRelayer(`/promotions/extension-key/${code}`, 'GET')\n\n if (!res.success) throw new Error(res.message || \"Couldn't verify the invite code\")\n\n this.inviteStatus = INVITE_STATUS.VERIFIED\n this.verifiedCode = code\n this.emitUpdate()\n\n const verifiedAt = Date.now()\n await this.#storage.set('invite', {\n ...this.#state,\n status: INVITE_STATUS.VERIFIED,\n verifiedAt,\n verifiedCode: code\n })\n } catch (error: any) {\n this.emitError(error)\n }\n }\n\n async becomeOG() {\n await this.#initialLoadPromise\n\n const becameOGAt = Date.now()\n await this.#storage.set('invite', { ...this.#state, becameOGAt })\n\n this.isOG = true\n this.emitUpdate()\n }\n\n async revokeOG() {\n await this.#initialLoadPromise\n\n await this.#storage.set('invite', { ...this.#state, becameOGAt: null })\n\n this.isOG = false\n this.emitUpdate()\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"invite.js","sourceRoot":"","sources":["../../../../src/controllers/invite/invite.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport enum INVITE_STATUS {\n UNVERIFIED = 'UNVERIFIED',\n VERIFIED = 'VERIFIED'\n}\n\ntype InviteState = {\n status: INVITE_STATUS\n verifiedAt: null | number // timestamp\n verifiedCode: null | string\n becameOGAt: null // timestamp\n}\n\nconst DEFAULT_STATE = {\n status: INVITE_STATUS.UNVERIFIED,\n verifiedAt: null,\n verifiedCode: null,\n becameOGAt: null\n}\n\n/**\n * As of v4.20.0, an invite verification flow is introduced as a first step upon\n * extension installation. This flow requires users to provide a valid invite\n * code before they can use the Ambire extension. This controller manages the\n * verification of these invite codes and persisting the current invite status.\n */\nexport class InviteController extends EventEmitter {\n #storage: Storage\n\n #callRelayer: Function\n\n #state: InviteState = DEFAULT_STATE\n\n inviteStatus: InviteState['status'] = INVITE_STATUS.UNVERIFIED\n\n verifiedCode: InviteState['verifiedCode'] = null\n\n /**\n * Whether the user has become an Ambire OG (Original Gangster), a status that\n * comes with specific privileges (e.g. early access to new or experimental features).\n */\n isOG: boolean = false\n\n #initialLoadPromise: Promise\n\n constructor({\n relayerUrl,\n fetch,\n storage\n }: {\n relayerUrl: string\n fetch: Fetch\n storage: Storage\n }) {\n super()\n\n this.#storage = storage\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n const nextState = await this.#storage.get('invite', this.#state)\n this.#state = { ...DEFAULT_STATE, ...nextState }\n\n this.inviteStatus = this.#state.status\n this.verifiedCode = this.#state.verifiedCode\n this.isOG = !!this.#state.becameOGAt\n this.emitUpdate()\n }\n\n /**\n * Verifies an invite code and if verified successfully, persists the invite\n * status (and some meta information) in the storage.\n */\n async verify(code: string) {\n await this.#initialLoadPromise\n\n try {\n const res = await this.#callRelayer(`/promotions/extension-key/${code}`, 'GET')\n\n if (!res.success) throw new Error(res.message || \"Couldn't verify the invite code\")\n\n this.inviteStatus = INVITE_STATUS.VERIFIED\n this.verifiedCode = code\n this.emitUpdate()\n\n const verifiedAt = Date.now()\n await this.#storage.set('invite', {\n ...this.#state,\n status: INVITE_STATUS.VERIFIED,\n verifiedAt,\n verifiedCode: code\n })\n } catch (error: any) {\n this.emitError(error)\n }\n }\n\n async becomeOG() {\n await this.#initialLoadPromise\n\n const becameOGAt = Date.now()\n await this.#storage.set('invite', { ...this.#state, becameOGAt })\n\n this.isOG = true\n this.emitUpdate()\n }\n\n async revokeOG() {\n await this.#initialLoadPromise\n\n await this.#storage.set('invite', { ...this.#state, becameOGAt: null })\n\n this.isOG = false\n this.emitUpdate()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.js b/dist/src/controllers/keystore/keystore.js index 9ee11da66..52c86a68b 100644 --- a/dist/src/controllers/keystore/keystore.js +++ b/dist/src/controllers/keystore/keystore.js @@ -1,15 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KeystoreController = void 0; +const tslib_1 = require("tslib"); /* eslint-disable class-methods-use-this */ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-shadow */ -import aes from 'aes-js'; +const aes_js_1 = tslib_1.__importDefault(require("aes-js")); // import { entropyToMnemonic } from 'bip39' -import { decryptWithPrivateKey, encryptWithPublicKey, publicKeyByPrivateKey } from 'eth-crypto'; -import { concat, getBytes, hexlify, keccak256, Mnemonic, randomBytes, toUtf8Bytes, Wallet } from 'ethers'; -import scrypt from 'scrypt-js'; -import EmittableError from '../../classes/EmittableError'; -import { DERIVATION_OPTIONS } from '../../consts/derivation'; -import { getDefaultKeyLabel, getShouldMigrateKeyMetaNullToKeyMetaCreatedAt, getShouldMigrateKeystoreSeedsWithoutHdPath, migrateKeyMetaNullToKeyMetaCreatedAt, migrateKeyPreferencesToKeystoreKeys, migrateKeystoreSeedsWithoutHdPathTemplate } from '../../libs/keys/keys'; -import EventEmitter from '../eventEmitter/eventEmitter'; +const eth_crypto_1 = require("eth-crypto"); +const ethers_1 = require("ethers"); +const scrypt_js_1 = tslib_1.__importDefault(require("scrypt-js")); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const derivation_1 = require("../../consts/derivation"); +const keys_1 = require("../../libs/keys/keys"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }; const CIPHER = 'aes-128-ctr'; const KEYSTORE_UNEXPECTED_ERROR_MESSAGE = 'Keystore unexpected error. If the problem persists, please contact support.'; @@ -27,7 +31,7 @@ const STATUS_WRAPPED_METHODS = { }; function getBytesForSecret(secret) { // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24 - return toUtf8Bytes(secret, 'NFKC'); + return (0, ethers_1.toUtf8Bytes)(secret, 'NFKC'); } /** * The KeystoreController is a class that manages a collection of encrypted keys. @@ -53,7 +57,7 @@ function getBytesForSecret(secret) { * the web SDKs we "outsource" this to the HW wallet software itself; * this may not be true on mobile */ -export class KeystoreController extends EventEmitter { +class KeystoreController extends eventEmitter_1.default { #mainKey; // Secrets are strings that are used to encrypt the mainKey. // The mainKey could be encrypted with many secrets. @@ -92,10 +96,10 @@ export class KeystoreController extends EventEmitter { this.#storage.get('keyPreferences', []) ]); this.keyStoreUid = keyStoreUid; - if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) { + if ((0, keys_1.getShouldMigrateKeystoreSeedsWithoutHdPath)(keystoreSeeds)) { // Cast to the old type (string[]) to avoid TS errors const preMigrationKeystoreSeeds = keystoreSeeds; - this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds); + this.#keystoreSeeds = (0, keys_1.migrateKeystoreSeedsWithoutHdPathTemplate)(preMigrationKeystoreSeeds); await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); } else { @@ -103,15 +107,15 @@ export class KeystoreController extends EventEmitter { } const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0; if (shouldMigrateKeyPreferencesToKeystoreKeys) { - this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys); + this.#keystoreKeys = (0, keys_1.migrateKeyPreferencesToKeystoreKeys)(keyPreferences, keystoreKeys); await this.#storage.set('keystoreKeys', this.#keystoreKeys); await this.#storage.remove('keyPreferences'); } else { this.#keystoreKeys = keystoreKeys; } - if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) { - this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys); + if ((0, keys_1.getShouldMigrateKeyMetaNullToKeyMetaCreatedAt)(this.#keystoreKeys)) { + this.#keystoreKeys = (0, keys_1.migrateKeyMetaNullToKeyMetaCreatedAt)(this.#keystoreKeys); await this.#storage.set('keystoreKeys', this.#keystoreKeys); } } @@ -155,7 +159,7 @@ export class KeystoreController extends EventEmitter { await this.#initialLoadPromise; // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct if (!this.#keystoreSecrets.length) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.', level: 'major', error: new Error('keystore: no secrets yet') @@ -163,7 +167,7 @@ export class KeystoreController extends EventEmitter { } const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId); if (!secretEntry) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.', level: 'major', error: new Error('keystore: secret not found') @@ -171,28 +175,28 @@ export class KeystoreController extends EventEmitter { } const { scryptParams, aesEncrypted } = secretEntry; if (aesEncrypted.cipherType !== CIPHER) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.', level: 'major', error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`) }); } // @TODO: progressCallback? - const key = await scrypt.scrypt(getBytesForSecret(secret), getBytes(scryptParams.salt), scryptParams.N, scryptParams.r, scryptParams.p, scryptParams.dkLen, () => { }); - const iv = getBytes(aesEncrypted.iv); + const key = await scrypt_js_1.default.scrypt(getBytesForSecret(secret), (0, ethers_1.getBytes)(scryptParams.salt), scryptParams.N, scryptParams.r, scryptParams.p, scryptParams.dkLen, () => { }); + const iv = (0, ethers_1.getBytes)(aesEncrypted.iv); const derivedKey = key.slice(0, 16); const macPrefix = key.slice(16, 32); - const counter = new aes.Counter(iv); - const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter); - const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext])); + const counter = new aes_js_1.default.Counter(iv); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter); + const mac = (0, ethers_1.keccak256)((0, ethers_1.concat)([macPrefix, aesEncrypted.ciphertext])); if (mac !== aesEncrypted.mac) { this.errorMessage = 'Incorrect password. Please try again.'; this.emitUpdate(); const error = new Error(this.errorMessage); - throw new EmittableError({ level: 'silent', message: this.errorMessage, error }); + throw new EmittableError_1.default({ level: 'silent', message: this.errorMessage, error }); } this.errorMessage = ''; - const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext)); + const decrypted = aesCtr.decrypt((0, ethers_1.getBytes)(aesEncrypted.ciphertext)); this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }; } async unlockWithSecret(secretId, secret) { @@ -202,7 +206,7 @@ export class KeystoreController extends EventEmitter { await this.#initialLoadPromise; // @TODO test if (this.#keystoreSecrets.find((x) => x.id === secretId)) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error(`keystore: trying to add duplicate secret ${secretId}`) @@ -211,14 +215,14 @@ export class KeystoreController extends EventEmitter { // We are not unlocked if (!mainKey) { if (!this.#keystoreSecrets.length) { - const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(0, 16); + const key = (0, ethers_1.getBytes)((0, ethers_1.keccak256)((0, ethers_1.concat)([(0, ethers_1.randomBytes)(32), (0, ethers_1.toUtf8Bytes)(extraEntropy)]))).slice(0, 16); mainKey = { key, - iv: randomBytes(16) + iv: (0, ethers_1.randomBytes)(16) }; } else - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error('keystore: must unlock keystore before adding secret') @@ -227,30 +231,30 @@ export class KeystoreController extends EventEmitter { this.#mainKey = mainKey; } } - const salt = randomBytes(32); - const key = await scrypt.scrypt(getBytesForSecret(secret), salt, scryptDefaults.N, scryptDefaults.r, scryptDefaults.p, scryptDefaults.dkLen, () => { }); - const iv = randomBytes(16); + const salt = (0, ethers_1.randomBytes)(32); + const key = await scrypt_js_1.default.scrypt(getBytesForSecret(secret), salt, scryptDefaults.N, scryptDefaults.r, scryptDefaults.p, scryptDefaults.dkLen, () => { }); + const iv = (0, ethers_1.randomBytes)(16); const derivedKey = key.slice(0, 16); const macPrefix = key.slice(16, 32); - const counter = new aes.Counter(iv); - const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter); - const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv]))); - const mac = keccak256(concat([macPrefix, ciphertext])); + const counter = new aes_js_1.default.Counter(iv); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter); + const ciphertext = aesCtr.encrypt((0, ethers_1.getBytes)((0, ethers_1.concat)([mainKey.key, mainKey.iv]))); + const mac = (0, ethers_1.keccak256)((0, ethers_1.concat)([macPrefix, ciphertext])); this.#keystoreSecrets.push({ id: secretId, - scryptParams: { salt: hexlify(salt), ...scryptDefaults }, + scryptParams: { salt: (0, ethers_1.hexlify)(salt), ...scryptDefaults }, aesEncrypted: { cipherType: CIPHER, - ciphertext: hexlify(ciphertext), - iv: hexlify(iv), - mac: hexlify(mac) + ciphertext: (0, ethers_1.hexlify)(ciphertext), + iv: (0, ethers_1.hexlify)(iv), + mac: (0, ethers_1.hexlify)(mac) } }); // Persist the new secrets await this.#storage.set('keystoreSecrets', this.#keystoreSecrets); // produce uid if one doesn't exist (should be created when the first secret is added) if (!this.keyStoreUid) { - const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv])))); + const uid = (0, eth_crypto_1.publicKeyByPrivateKey)((0, ethers_1.hexlify)((0, ethers_1.getBytes)((0, ethers_1.concat)([mainKey.key, mainKey.iv])))); this.keyStoreUid = uid; await this.#storage.set('keyStoreUid', uid); } @@ -262,7 +266,7 @@ export class KeystoreController extends EventEmitter { async #removeSecret(secretId) { await this.#initialLoadPromise; if (!this.#keystoreSecrets.find((x) => x.id === secretId)) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error(`keystore: secret$ ${secretId} not found`) @@ -301,13 +305,13 @@ export class KeystoreController extends EventEmitter { async #getEncryptedSeed(seed) { await this.#initialLoadPromise; if (this.#mainKey === null) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error('keystore: needs to be unlocked') }); - if (!Mnemonic.isValidMnemonic(seed)) { - throw new EmittableError({ + if (!ethers_1.Mnemonic.isValidMnemonic(seed)) { + throw new EmittableError_1.default({ message: 'You are trying to store an invalid seed phrase.', level: 'major', error: new Error('keystore: trying to add an invalid seed phrase') @@ -316,21 +320,21 @@ export class KeystoreController extends EventEmitter { // Currently we support only one seed phrase to be added to the keystore // this fist seed phrase will become the saved seed phrase of the wallet if (this.#keystoreSeeds.length) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'You can have only one saved seed in the extension', level: 'major', error: new Error('keystore: seed phase already added. Storing multiple seed phrases not supported yet') }); } // Set up the cipher - const counter = new aes.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above\ - return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed))); + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above\ + return (0, ethers_1.hexlify)(aesCtr.encrypt(new TextEncoder().encode(seed))); } async addSeedToTemp({ seed, hdPathTemplate }) { - const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate); + const validHdPath = derivation_1.DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate); if (!validHdPath) - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Incorrect derivation path when trying to update the temp seed. Please contact support', level: 'major', error: new Error('keystore: hd path to temp seed incorrect') @@ -348,7 +352,7 @@ export class KeystoreController extends EventEmitter { } async #moveTempSeedToKeystoreSeeds() { if (this.#mainKey === null) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error('keystore: needs to be unlocked') @@ -356,14 +360,14 @@ export class KeystoreController extends EventEmitter { // Currently we support only one seed phrase to be added to the keystore // this fist seed phrase will become the saved seed phrase of the wallet if (this.#keystoreSeeds.length) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'You can have only one saved seed in the extension', level: 'major', error: new Error('keystore: seed phase already added. Storing multiple seed phrases not supported yet') }); } if (!this.#tempSeed) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Imported seed no longer exists in the extension. If you want to save it, please re-import it', level: 'major', error: new Error('keystore: imported seed deleted although a request to save it was made') @@ -460,7 +464,7 @@ export class KeystoreController extends EventEmitter { if (!keysToAdd.length) return; if (this.#mainKey === null) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error('keystore: needs to be unlocked') @@ -482,14 +486,14 @@ export class KeystoreController extends EventEmitter { // eslint-disable-next-line no-param-reassign privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey; // Set up the cipher - const counter = new aes.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above return { addr, type, label, dedicatedToOneSA, - privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), + privKey: (0, ethers_1.hexlify)(aesCtr.encrypt(aes_js_1.default.utils.hex.toBytes(privateKey))), meta }; }) @@ -507,14 +511,14 @@ export class KeystoreController extends EventEmitter { async removeKey(addr, type) { await this.#initialLoadPromise; if (!this.isUnlocked) - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Extension not unlocked. Please try again or contact support if the problem persists.', level: 'major', error: new Error('keystore: not unlocked') }); const keys = this.#keystoreKeys; if (!keys.find((x) => x.addr === addr && x.type === type)) - throw new EmittableError({ + throw new EmittableError_1.default({ message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE, level: 'major', error: new Error(`keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`) @@ -535,12 +539,12 @@ export class KeystoreController extends EventEmitter { throw new Error('keystore: key not found'); if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey'); - const encryptedBytes = getBytes(storedKey.privKey); - const counter = new aes.Counter(this.#mainKey.iv); - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const encryptedBytes = (0, ethers_1.getBytes)(storedKey.privKey); + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); const decryptedBytes = aesCtr.decrypt(encryptedBytes); - const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes); - const wallet = new Wallet(decryptedPrivateKey); + const decryptedPrivateKey = aes_js_1.default.utils.hex.fromBytes(decryptedBytes); + const wallet = new ethers_1.Wallet(decryptedPrivateKey); const keyBackup = await wallet.encrypt(passphrase); return JSON.stringify(keyBackup); } @@ -563,12 +567,12 @@ export class KeystoreController extends EventEmitter { if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey'); // decrypt the pk of keyAddress with the keystore's key - const encryptedBytes = getBytes(storedKey.privKey); - const counter = new aes.Counter(this.#mainKey.iv); - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const encryptedBytes = (0, ethers_1.getBytes)(storedKey.privKey); + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); // encrypt the pk of keyAddress with publicKey const decryptedBytes = aesCtr.decrypt(encryptedBytes); - return aes.utils.hex.fromBytes(decryptedBytes); + return aes_js_1.default.utils.hex.fromBytes(decryptedBytes); } /** * Export with public key encrypt @@ -579,19 +583,19 @@ export class KeystoreController extends EventEmitter { */ async exportKeyWithPublicKeyEncryption(keyAddress, publicKey) { const decryptedPrivateKey = await this.#getPrivateKey(keyAddress); - const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey); + const result = await (0, eth_crypto_1.encryptWithPublicKey)(publicKey, decryptedPrivateKey); return result; } async importKeyWithPublicKeyEncryption(encryptedSk, dedicatedToOneSA) { if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked'); - const privateKey = await decryptWithPrivateKey(hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))), encryptedSk); + const privateKey = await (0, eth_crypto_1.decryptWithPrivateKey)((0, ethers_1.hexlify)((0, ethers_1.getBytes)((0, ethers_1.concat)([this.#mainKey.key, this.#mainKey.iv]))), encryptedSk); if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key'); const keyToAdd = { - addr: new Wallet(privateKey).address, + addr: new ethers_1.Wallet(privateKey).address, privateKey, - label: getDefaultKeyLabel(this.keys, 0), + label: (0, keys_1.getDefaultKeyLabel)(this.keys, 0), type: 'internal', dedicatedToOneSA, meta: { @@ -621,13 +625,13 @@ export class KeystoreController extends EventEmitter { if (key.type === 'internal') { if (!this.isUnlocked) throw new Error('keystore: not unlocked'); - const encryptedBytes = getBytes(storedKey.privKey); + const encryptedBytes = (0, ethers_1.getBytes)(storedKey.privKey); // @ts-ignore - const counter = new aes.Counter(this.#mainKey.iv); + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); // @ts-ignore - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); const decryptedBytes = aesCtr.decrypt(encryptedBytes); - const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes); + const decryptedPrivateKey = aes_js_1.default.utils.hex.fromBytes(decryptedBytes); // @ts-ignore TODO: Figure out the correct type definition return new SignerInitializer(key, decryptedPrivateKey); } @@ -641,11 +645,11 @@ export class KeystoreController extends EventEmitter { if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet'); const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate; - const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed); + const encryptedSeedBytes = (0, ethers_1.getBytes)(this.#keystoreSeeds[0].seed); // @ts-ignore - const counter = new aes.Counter(this.#mainKey.iv); + const counter = new aes_js_1.default.Counter(this.#mainKey.iv); // @ts-ignore - const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter); + const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes); const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes); return { seed: decryptedSeed, hdPathTemplate }; @@ -672,7 +676,7 @@ export class KeystoreController extends EventEmitter { if (oldSecret) await this.#unlockWithSecret('password', oldSecret); if (!this.isUnlocked) - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'App not unlocked. Please try again or contact support if the problem persists.', level: 'major', error: new Error('keystore: not unlocked') @@ -750,4 +754,5 @@ export class KeystoreController extends EventEmitter { }; } } +exports.KeystoreController = KeystoreController; //# sourceMappingURL=keystore.js.map \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.js.map b/dist/src/controllers/keystore/keystore.js.map index 935a1402e..4913d7251 100644 --- a/dist/src/controllers/keystore/keystore.js.map +++ b/dist/src/controllers/keystore/keystore.js.map @@ -1 +1 @@ -{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable new-cap */\n/* eslint-disable @typescript-eslint/no-shadow */\nimport aes from 'aes-js'\n// import { entropyToMnemonic } from 'bip39'\nimport {\n decryptWithPrivateKey,\n Encrypted,\n encryptWithPublicKey,\n publicKeyByPrivateKey\n} from 'eth-crypto'\nimport {\n concat,\n getBytes,\n hexlify,\n keccak256,\n Mnemonic,\n randomBytes,\n toUtf8Bytes,\n Wallet\n} from 'ethers'\nimport scrypt from 'scrypt-js'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { DERIVATION_OPTIONS, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Banner } from '../../interfaces/banner'\nimport {\n ExternalKey,\n InternalKey,\n Key,\n KeyPreferences,\n KeystoreSeed,\n KeystoreSignerType,\n MainKey,\n MainKeyEncryptedWithSecret,\n ReadyToAddKeys,\n StoredKey\n} from '../../interfaces/keystore'\nimport { Storage } from '../../interfaces/storage'\nimport { WindowManager } from '../../interfaces/window'\nimport {\n getDefaultKeyLabel,\n getShouldMigrateKeyMetaNullToKeyMetaCreatedAt,\n getShouldMigrateKeystoreSeedsWithoutHdPath,\n migrateKeyMetaNullToKeyMetaCreatedAt,\n migrateKeyPreferencesToKeystoreKeys,\n migrateKeystoreSeedsWithoutHdPathTemplate\n} from '../../libs/keys/keys'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }\nconst CIPHER = 'aes-128-ctr'\nconst KEYSTORE_UNEXPECTED_ERROR_MESSAGE =\n 'Keystore unexpected error. If the problem persists, please contact support.'\n\nconst STATUS_WRAPPED_METHODS = {\n unlockWithSecret: 'INITIAL',\n addSecret: 'INITIAL',\n addSeed: 'INITIAL',\n moveTempSeedToKeystoreSeeds: 'INITIAL',\n deleteSavedSeed: 'INITIAL',\n removeSecret: 'INITIAL',\n addKeys: 'INITIAL',\n addKeysExternallyStored: 'INITIAL',\n changeKeystorePassword: 'INITIAL',\n updateKeyPreferences: 'INITIAL'\n} as const\n\nfunction getBytesForSecret(secret: string): ArrayLike {\n // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24\n return toUtf8Bytes(secret, 'NFKC')\n}\n\n/**\n * The KeystoreController is a class that manages a collection of encrypted keys.\n * It provides methods for adding, removing, and retrieving keys. The keys are\n * encrypted using a main key, which is itself encrypted using one or more secrets.\n *\n * Docs:\n * - Secrets are strings that are used to encrypt the mainKey; the mainKey\n * could be encrypted with many secrets\n * - All individual keys are encrypted with the mainKey\n * - The mainKey is kept in memory, but only for the unlockedTime\n * Design decisions:\n * - decided to store all keys in the Keystore, even if the private key itself\n * is not stored there; simply because it's called a Keystore and the name\n * implies the functionality\n * - handle HW wallets in it, so that we handle everything uniformly with a\n * single API; also, it allows future flexibility to have the concept of\n * optional unlocking built-in; if we have interactivity, we can add\n * `keystore.signExtraInputRequired(key)` which returns what we need from the user\n * - `signWithkey` is presumed to be non-interactive at least from `Keystore`\n * point of view (requiring no extra user inputs). This could be wrong, if\n * hardware wallets require extra input - they normally always do, but with\n * the web SDKs we \"outsource\" this to the HW wallet software itself;\n * this may not be true on mobile\n */\nexport class KeystoreController extends EventEmitter {\n #mainKey: MainKey | null\n\n // Secrets are strings that are used to encrypt the mainKey.\n // The mainKey could be encrypted with many secrets.\n #keystoreSecrets: MainKeyEncryptedWithSecret[] = []\n\n #storage: Storage\n\n #keystoreSeeds: KeystoreSeed[] = []\n\n // when importing a seed, save it temporary here before deciding\n // whether to place it in #keystoreSeeds or delete it\n //\n // this should be done only if there isn't a saved seed already\n #tempSeed: KeystoreSeed | null = null\n\n #keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n\n #keystoreKeys: StoredKey[] = []\n\n keyStoreUid: string | null\n\n isReadyToStoreKeys: boolean = false\n\n errorMessage: string = ''\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #windowManager: WindowManager\n\n constructor(\n _storage: Storage,\n _keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>,\n windowManager: WindowManager\n ) {\n super()\n this.#storage = _storage\n this.#keystoreSigners = _keystoreSigners\n this.#mainKey = null\n this.keyStoreUid = null\n this.#windowManager = windowManager\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([\n this.#storage.get('keystoreSeeds', []),\n this.#storage.get('keyStoreUid', null),\n this.#storage.get('keystoreKeys', []),\n this.#storage.get('keyPreferences', [])\n ])\n this.keyStoreUid = keyStoreUid\n\n if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) {\n // Cast to the old type (string[]) to avoid TS errors\n const preMigrationKeystoreSeeds = keystoreSeeds as unknown as string[]\n this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n } else {\n this.#keystoreSeeds = keystoreSeeds\n }\n\n const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0\n if (shouldMigrateKeyPreferencesToKeystoreKeys) {\n this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n await this.#storage.remove('keyPreferences')\n } else {\n this.#keystoreKeys = keystoreKeys\n }\n\n if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) {\n this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to pull keys from storage')\n })\n }\n\n try {\n this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', [])\n this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n lock() {\n this.#mainKey = null\n if (this.#tempSeed) this.deleteTempSeed(false)\n this.emitUpdate()\n }\n\n get isUnlocked() {\n return !!this.#mainKey\n }\n\n async getKeyStoreUid() {\n const uid = this.keyStoreUid\n if (!uid) throw new Error('keystore: adding secret before get uid')\n\n return uid\n }\n\n // @TODO time before unlocking\n async #unlockWithSecret(secretId: string, secret: string) {\n await this.#initialLoadPromise\n\n // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct\n if (!this.#keystoreSecrets.length) {\n throw new EmittableError({\n message:\n 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: no secrets yet')\n })\n }\n\n const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId)\n if (!secretEntry) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: secret not found')\n })\n }\n\n const { scryptParams, aesEncrypted } = secretEntry\n if (aesEncrypted.cipherType !== CIPHER) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`)\n })\n }\n // @TODO: progressCallback?\n\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n getBytes(scryptParams.salt),\n scryptParams.N,\n scryptParams.r,\n scryptParams.p,\n scryptParams.dkLen,\n () => {}\n )\n const iv = getBytes(aesEncrypted.iv)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext]))\n if (mac !== aesEncrypted.mac) {\n this.errorMessage = 'Incorrect password. Please try again.'\n this.emitUpdate()\n\n const error = new Error(this.errorMessage)\n throw new EmittableError({ level: 'silent', message: this.errorMessage, error })\n }\n this.errorMessage = ''\n\n const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext))\n this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }\n }\n\n async unlockWithSecret(secretId: string, secret: string) {\n await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret))\n }\n\n async #addSecret(\n secretId: string,\n secret: string,\n extraEntropy: string = '',\n leaveUnlocked: boolean = false\n ) {\n await this.#initialLoadPromise\n\n // @TODO test\n if (this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: trying to add duplicate secret ${secretId}`)\n })\n\n let mainKey: MainKey | null = this.#mainKey\n // We are not unlocked\n if (!mainKey) {\n if (!this.#keystoreSecrets.length) {\n const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(\n 0,\n 16\n )\n mainKey = {\n key,\n iv: randomBytes(16)\n }\n } else\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: must unlock keystore before adding secret')\n })\n\n if (leaveUnlocked) {\n this.#mainKey = mainKey\n }\n }\n\n const salt = randomBytes(32)\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n salt,\n scryptDefaults.N,\n scryptDefaults.r,\n scryptDefaults.p,\n scryptDefaults.dkLen,\n () => {}\n )\n const iv = randomBytes(16)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv])))\n const mac = keccak256(concat([macPrefix, ciphertext]))\n\n this.#keystoreSecrets.push({\n id: secretId,\n scryptParams: { salt: hexlify(salt), ...scryptDefaults },\n aesEncrypted: {\n cipherType: CIPHER,\n ciphertext: hexlify(ciphertext),\n iv: hexlify(iv),\n mac: hexlify(mac)\n }\n })\n // Persist the new secrets\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n\n // produce uid if one doesn't exist (should be created when the first secret is added)\n if (!this.keyStoreUid) {\n const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv]))))\n this.keyStoreUid = uid\n await this.#storage.set('keyStoreUid', uid)\n }\n\n this.isReadyToStoreKeys = true\n }\n\n async addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean) {\n await this.withStatus('addSecret', () =>\n this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)\n )\n }\n\n async #removeSecret(secretId: string) {\n await this.#initialLoadPromise\n\n if (!this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: secret$ ${secretId} not found`)\n })\n\n this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId)\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n }\n\n async removeSecret(secretId: string) {\n await this.withStatus('removeSecret', () => this.#removeSecret(secretId))\n }\n\n get keys(): Key[] {\n return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => {\n // Written with this 'internal' type guard (if) on purpose, because this\n // way TypeScript will be able to narrow down the types properly and infer\n // the return type of the map function correctly.\n if (type === 'internal') {\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: false\n }\n }\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta: meta as ExternalKey['meta'],\n isExternallyStored: true\n }\n })\n }\n\n async #getEncryptedSeed(seed: KeystoreSeed['seed']): Promise {\n await this.#initialLoadPromise\n\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n if (!Mnemonic.isValidMnemonic(seed)) {\n throw new EmittableError({\n message: 'You are trying to store an invalid seed phrase.',\n level: 'major',\n error: new Error('keystore: trying to add an invalid seed phrase')\n })\n }\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\\\n return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed)))\n }\n\n async addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed) {\n const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate)\n if (!validHdPath)\n throw new EmittableError({\n message:\n 'Incorrect derivation path when trying to update the temp seed. Please contact support',\n level: 'major',\n error: new Error('keystore: hd path to temp seed incorrect')\n })\n\n this.#tempSeed = {\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n }\n\n this.emitUpdate()\n }\n\n deleteTempSeed(shouldUpdate = true) {\n this.#tempSeed = null\n if (shouldUpdate) this.emitUpdate()\n }\n\n async #moveTempSeedToKeystoreSeeds() {\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n if (!this.#tempSeed) {\n throw new EmittableError({\n message:\n 'Imported seed no longer exists in the extension. If you want to save it, please re-import it',\n level: 'major',\n error: new Error('keystore: imported seed deleted although a request to save it was made')\n })\n }\n\n this.#keystoreSeeds.push(this.#tempSeed)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n this.#tempSeed = null\n this.emitUpdate()\n }\n\n async moveTempSeedToKeystoreSeeds() {\n await this.#initialLoadPromise\n await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds())\n }\n\n async #addSeed({ seed, hdPathTemplate }: KeystoreSeed) {\n this.#keystoreSeeds.push({\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n })\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async addSeed(keystoreSeed: KeystoreSeed) {\n await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed))\n }\n\n async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#tempSeed) throw new Error('keystore: no temp seed at the moment')\n\n const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n this.#tempSeed.hdPathTemplate = nextHdPathTemplate\n\n this.emitUpdate()\n }\n\n async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore\n this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async #addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.#initialLoadPromise\n\n if (!keysToAdd.length) return\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniqueKeys: { addr: Key['addr']; type: Key['type'] }[] = []\n const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => {\n if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) {\n return false\n }\n\n uniqueKeys.push({ addr, type })\n return true\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys = uniqueKeysToAdd\n .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n privKey: null\n }))\n // No need to re-add keys that are already added (with the same type / device)\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd))\n }\n\n async #addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.#initialLoadPromise\n if (!keysToAdd.length) return\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniquePrivateKeysToAddSet = new Set()\n const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => {\n if (!uniquePrivateKeysToAddSet.has(privateKey)) {\n uniquePrivateKeysToAddSet.add(privateKey)\n return true\n }\n return false\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys: StoredKey[] = uniqueKeysToAdd\n .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => {\n // eslint-disable-next-line no-param-reassign\n privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), // TODO: consider a MAC?\n meta\n }\n })\n // No need to re-add keys that are already added, private key never changes\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.withStatus('addKeys', () => this.#addKeys(keysToAdd))\n }\n\n async removeKey(addr: Key['addr'], type: Key['type']) {\n await this.#initialLoadPromise\n if (!this.isUnlocked)\n throw new EmittableError({\n message:\n 'Extension not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n const keys = this.#keystoreKeys\n if (!keys.find((x) => x.addr === addr && x.type === type))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(\n `keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`\n )\n })\n\n this.#keystoreKeys = keys.filter((key) => {\n const isMatching = key.addr === addr && key.type === type\n\n return !isMatching\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n\n async exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string) {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n const wallet = new Wallet(decryptedPrivateKey)\n const keyBackup = await wallet.encrypt(passphrase)\n return JSON.stringify(keyBackup)\n }\n\n async sendPrivateKeyToUi(keyAddress: string) {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` })\n }\n\n async sendSeedToUi() {\n const decrypted = await this.getSavedSeed()\n this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed })\n }\n\n async #getPrivateKey(keyAddress: string): Promise {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress)\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n // decrypt the pk of keyAddress with the keystore's key\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n // encrypt the pk of keyAddress with publicKey\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n return aes.utils.hex.fromBytes(decryptedBytes)\n }\n\n /**\n * Export with public key encrypt\n *\n * @param keyAddress string - the address of the key you want to export\n * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId)\n * @returns Encrypted\n */\n async exportKeyWithPublicKeyEncryption(\n keyAddress: string,\n publicKey: string\n ): Promise {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey)\n\n return result\n }\n\n async importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean) {\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const privateKey: string = await decryptWithPrivateKey(\n hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))),\n encryptedSk\n )\n if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key')\n\n const keyToAdd: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n } = {\n addr: new Wallet(privateKey).address,\n privateKey,\n label: getDefaultKeyLabel(this.keys, 0),\n type: 'internal',\n dedicatedToOneSA,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n\n await this.addKeys([keyToAdd])\n }\n\n async getSigner(keyAddress: Key['addr'], keyType: Key['type']) {\n await this.#initialLoadPromise\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n const { addr, type, label, dedicatedToOneSA, meta } = storedKey\n\n const key = {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: type !== 'internal'\n }\n\n const SignerInitializer = this.#keystoreSigners[key.type]\n if (!SignerInitializer) throw new Error('keystore: unsupported signer type')\n\n if (key.type === 'internal') {\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key, decryptedPrivateKey)\n }\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key)\n }\n\n async getSavedSeed() {\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate\n const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes)\n const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes)\n return { seed: decryptedSeed, hdPathTemplate }\n }\n\n async #changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.#initialLoadPromise\n\n // In the case the user wants to change their device password,\n // they should also provide the previous password (oldSecret).\n //\n // However, in the case of KeyStore recovery, the user may have already forgotten the password,\n // but the Keystore is already unlocked with the recovery secret.\n // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it.\n //\n // However, there is one problem if we leave it that way:\n //\n // 1. If the user recovers and unlocks the Keystore.\n // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab).\n // 3. And later decides to change the old password from Settings.\n // 4. Then they would not be able to do it because they don't know the old password.\n //\n // We are going to discuss it in the next meeting, but for now, we are leaving it as it is.\n // The long-term solution would be to refactor EmailVault recovery logic\n // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase.\n if (oldSecret) await this.#unlockWithSecret('password', oldSecret)\n\n if (!this.isUnlocked)\n throw new EmittableError({\n message: 'App not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n\n await this.#removeSecret('password')\n await this.#addSecret('password', newSecret, '', true)\n }\n\n async changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.withStatus('changeKeystorePassword', () =>\n this.#changeKeystorePassword(newSecret, oldSecret)\n )\n }\n\n async updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys))\n }\n\n async #updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => {\n const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type)\n\n if (!key) return keystoreKey\n\n return { ...keystoreKey, ...key.preferences }\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n this.emitUpdate()\n }\n\n async deleteSavedSeed() {\n await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed())\n }\n\n async #deleteSavedSeed() {\n await this.#initialLoadPromise\n\n this.#keystoreSeeds = []\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n resetErrorState() {\n this.errorMessage = ''\n this.emitUpdate()\n }\n\n get hasPasswordSecret() {\n return this.#keystoreSecrets.some((x) => x.id === 'password')\n }\n\n get hasKeystoreSavedSeed() {\n return !!this.#keystoreSeeds.length\n }\n\n get hasKeystoreTempSeed() {\n return !!this.#tempSeed\n }\n\n get banners(): Banner[] {\n if (!this.#tempSeed) return []\n\n return [\n {\n id: 'tempSeed',\n type: 'warning',\n category: 'temp-seed-not-confirmed',\n title: 'You have an unsaved imported seed',\n text: '',\n actions: [\n {\n label: 'Check',\n actionName: 'confirm-temp-seed'\n }\n ]\n }\n ]\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isUnlocked: this.isUnlocked, // includes the getter in the stringified instance\n keys: this.keys,\n hasPasswordSecret: this.hasPasswordSecret,\n hasKeystoreSavedSeed: this.hasKeystoreSavedSeed,\n hasKeystoreTempSeed: this.hasKeystoreTempSeed,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable new-cap */\n/* eslint-disable @typescript-eslint/no-shadow */\nimport aes from 'aes-js'\n// import { entropyToMnemonic } from 'bip39'\nimport {\n decryptWithPrivateKey,\n Encrypted,\n encryptWithPublicKey,\n publicKeyByPrivateKey\n} from 'eth-crypto'\nimport {\n concat,\n getBytes,\n hexlify,\n keccak256,\n Mnemonic,\n randomBytes,\n toUtf8Bytes,\n Wallet\n} from 'ethers'\nimport scrypt from 'scrypt-js'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { DERIVATION_OPTIONS, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Banner } from '../../interfaces/banner'\nimport {\n ExternalKey,\n InternalKey,\n Key,\n KeyPreferences,\n KeystoreSeed,\n KeystoreSignerType,\n MainKey,\n MainKeyEncryptedWithSecret,\n ReadyToAddKeys,\n StoredKey\n} from '../../interfaces/keystore'\nimport { Storage } from '../../interfaces/storage'\nimport { WindowManager } from '../../interfaces/window'\nimport {\n getDefaultKeyLabel,\n getShouldMigrateKeyMetaNullToKeyMetaCreatedAt,\n getShouldMigrateKeystoreSeedsWithoutHdPath,\n migrateKeyMetaNullToKeyMetaCreatedAt,\n migrateKeyPreferencesToKeystoreKeys,\n migrateKeystoreSeedsWithoutHdPathTemplate\n} from '../../libs/keys/keys'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }\nconst CIPHER = 'aes-128-ctr'\nconst KEYSTORE_UNEXPECTED_ERROR_MESSAGE =\n 'Keystore unexpected error. If the problem persists, please contact support.'\n\nconst STATUS_WRAPPED_METHODS = {\n unlockWithSecret: 'INITIAL',\n addSecret: 'INITIAL',\n addSeed: 'INITIAL',\n moveTempSeedToKeystoreSeeds: 'INITIAL',\n deleteSavedSeed: 'INITIAL',\n removeSecret: 'INITIAL',\n addKeys: 'INITIAL',\n addKeysExternallyStored: 'INITIAL',\n changeKeystorePassword: 'INITIAL',\n updateKeyPreferences: 'INITIAL'\n} as const\n\nfunction getBytesForSecret(secret: string): ArrayLike {\n // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24\n return toUtf8Bytes(secret, 'NFKC')\n}\n\n/**\n * The KeystoreController is a class that manages a collection of encrypted keys.\n * It provides methods for adding, removing, and retrieving keys. The keys are\n * encrypted using a main key, which is itself encrypted using one or more secrets.\n *\n * Docs:\n * - Secrets are strings that are used to encrypt the mainKey; the mainKey\n * could be encrypted with many secrets\n * - All individual keys are encrypted with the mainKey\n * - The mainKey is kept in memory, but only for the unlockedTime\n * Design decisions:\n * - decided to store all keys in the Keystore, even if the private key itself\n * is not stored there; simply because it's called a Keystore and the name\n * implies the functionality\n * - handle HW wallets in it, so that we handle everything uniformly with a\n * single API; also, it allows future flexibility to have the concept of\n * optional unlocking built-in; if we have interactivity, we can add\n * `keystore.signExtraInputRequired(key)` which returns what we need from the user\n * - `signWithkey` is presumed to be non-interactive at least from `Keystore`\n * point of view (requiring no extra user inputs). This could be wrong, if\n * hardware wallets require extra input - they normally always do, but with\n * the web SDKs we \"outsource\" this to the HW wallet software itself;\n * this may not be true on mobile\n */\nexport class KeystoreController extends EventEmitter {\n #mainKey: MainKey | null\n\n // Secrets are strings that are used to encrypt the mainKey.\n // The mainKey could be encrypted with many secrets.\n #keystoreSecrets: MainKeyEncryptedWithSecret[] = []\n\n #storage: Storage\n\n #keystoreSeeds: KeystoreSeed[] = []\n\n // when importing a seed, save it temporary here before deciding\n // whether to place it in #keystoreSeeds or delete it\n //\n // this should be done only if there isn't a saved seed already\n #tempSeed: KeystoreSeed | null = null\n\n #keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n\n #keystoreKeys: StoredKey[] = []\n\n keyStoreUid: string | null\n\n isReadyToStoreKeys: boolean = false\n\n errorMessage: string = ''\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #windowManager: WindowManager\n\n constructor(\n _storage: Storage,\n _keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>,\n windowManager: WindowManager\n ) {\n super()\n this.#storage = _storage\n this.#keystoreSigners = _keystoreSigners\n this.#mainKey = null\n this.keyStoreUid = null\n this.#windowManager = windowManager\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([\n this.#storage.get('keystoreSeeds', []),\n this.#storage.get('keyStoreUid', null),\n this.#storage.get('keystoreKeys', []),\n this.#storage.get('keyPreferences', [])\n ])\n this.keyStoreUid = keyStoreUid\n\n if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) {\n // Cast to the old type (string[]) to avoid TS errors\n const preMigrationKeystoreSeeds = keystoreSeeds as unknown as string[]\n this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n } else {\n this.#keystoreSeeds = keystoreSeeds\n }\n\n const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0\n if (shouldMigrateKeyPreferencesToKeystoreKeys) {\n this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n await this.#storage.remove('keyPreferences')\n } else {\n this.#keystoreKeys = keystoreKeys\n }\n\n if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) {\n this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to pull keys from storage')\n })\n }\n\n try {\n this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', [])\n this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n lock() {\n this.#mainKey = null\n if (this.#tempSeed) this.deleteTempSeed(false)\n this.emitUpdate()\n }\n\n get isUnlocked() {\n return !!this.#mainKey\n }\n\n async getKeyStoreUid() {\n const uid = this.keyStoreUid\n if (!uid) throw new Error('keystore: adding secret before get uid')\n\n return uid\n }\n\n // @TODO time before unlocking\n async #unlockWithSecret(secretId: string, secret: string) {\n await this.#initialLoadPromise\n\n // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct\n if (!this.#keystoreSecrets.length) {\n throw new EmittableError({\n message:\n 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: no secrets yet')\n })\n }\n\n const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId)\n if (!secretEntry) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: secret not found')\n })\n }\n\n const { scryptParams, aesEncrypted } = secretEntry\n if (aesEncrypted.cipherType !== CIPHER) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`)\n })\n }\n // @TODO: progressCallback?\n\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n getBytes(scryptParams.salt),\n scryptParams.N,\n scryptParams.r,\n scryptParams.p,\n scryptParams.dkLen,\n () => {}\n )\n const iv = getBytes(aesEncrypted.iv)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext]))\n if (mac !== aesEncrypted.mac) {\n this.errorMessage = 'Incorrect password. Please try again.'\n this.emitUpdate()\n\n const error = new Error(this.errorMessage)\n throw new EmittableError({ level: 'silent', message: this.errorMessage, error })\n }\n this.errorMessage = ''\n\n const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext))\n this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }\n }\n\n async unlockWithSecret(secretId: string, secret: string) {\n await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret))\n }\n\n async #addSecret(\n secretId: string,\n secret: string,\n extraEntropy: string = '',\n leaveUnlocked: boolean = false\n ) {\n await this.#initialLoadPromise\n\n // @TODO test\n if (this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: trying to add duplicate secret ${secretId}`)\n })\n\n let mainKey: MainKey | null = this.#mainKey\n // We are not unlocked\n if (!mainKey) {\n if (!this.#keystoreSecrets.length) {\n const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(\n 0,\n 16\n )\n mainKey = {\n key,\n iv: randomBytes(16)\n }\n } else\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: must unlock keystore before adding secret')\n })\n\n if (leaveUnlocked) {\n this.#mainKey = mainKey\n }\n }\n\n const salt = randomBytes(32)\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n salt,\n scryptDefaults.N,\n scryptDefaults.r,\n scryptDefaults.p,\n scryptDefaults.dkLen,\n () => {}\n )\n const iv = randomBytes(16)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv])))\n const mac = keccak256(concat([macPrefix, ciphertext]))\n\n this.#keystoreSecrets.push({\n id: secretId,\n scryptParams: { salt: hexlify(salt), ...scryptDefaults },\n aesEncrypted: {\n cipherType: CIPHER,\n ciphertext: hexlify(ciphertext),\n iv: hexlify(iv),\n mac: hexlify(mac)\n }\n })\n // Persist the new secrets\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n\n // produce uid if one doesn't exist (should be created when the first secret is added)\n if (!this.keyStoreUid) {\n const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv]))))\n this.keyStoreUid = uid\n await this.#storage.set('keyStoreUid', uid)\n }\n\n this.isReadyToStoreKeys = true\n }\n\n async addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean) {\n await this.withStatus('addSecret', () =>\n this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)\n )\n }\n\n async #removeSecret(secretId: string) {\n await this.#initialLoadPromise\n\n if (!this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: secret$ ${secretId} not found`)\n })\n\n this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId)\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n }\n\n async removeSecret(secretId: string) {\n await this.withStatus('removeSecret', () => this.#removeSecret(secretId))\n }\n\n get keys(): Key[] {\n return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => {\n // Written with this 'internal' type guard (if) on purpose, because this\n // way TypeScript will be able to narrow down the types properly and infer\n // the return type of the map function correctly.\n if (type === 'internal') {\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: false\n }\n }\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta: meta as ExternalKey['meta'],\n isExternallyStored: true\n }\n })\n }\n\n async #getEncryptedSeed(seed: KeystoreSeed['seed']): Promise {\n await this.#initialLoadPromise\n\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n if (!Mnemonic.isValidMnemonic(seed)) {\n throw new EmittableError({\n message: 'You are trying to store an invalid seed phrase.',\n level: 'major',\n error: new Error('keystore: trying to add an invalid seed phrase')\n })\n }\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\\\n return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed)))\n }\n\n async addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed) {\n const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate)\n if (!validHdPath)\n throw new EmittableError({\n message:\n 'Incorrect derivation path when trying to update the temp seed. Please contact support',\n level: 'major',\n error: new Error('keystore: hd path to temp seed incorrect')\n })\n\n this.#tempSeed = {\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n }\n\n this.emitUpdate()\n }\n\n deleteTempSeed(shouldUpdate = true) {\n this.#tempSeed = null\n if (shouldUpdate) this.emitUpdate()\n }\n\n async #moveTempSeedToKeystoreSeeds() {\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n if (!this.#tempSeed) {\n throw new EmittableError({\n message:\n 'Imported seed no longer exists in the extension. If you want to save it, please re-import it',\n level: 'major',\n error: new Error('keystore: imported seed deleted although a request to save it was made')\n })\n }\n\n this.#keystoreSeeds.push(this.#tempSeed)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n this.#tempSeed = null\n this.emitUpdate()\n }\n\n async moveTempSeedToKeystoreSeeds() {\n await this.#initialLoadPromise\n await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds())\n }\n\n async #addSeed({ seed, hdPathTemplate }: KeystoreSeed) {\n this.#keystoreSeeds.push({\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n })\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async addSeed(keystoreSeed: KeystoreSeed) {\n await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed))\n }\n\n async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#tempSeed) throw new Error('keystore: no temp seed at the moment')\n\n const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n this.#tempSeed.hdPathTemplate = nextHdPathTemplate\n\n this.emitUpdate()\n }\n\n async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore\n this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async #addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.#initialLoadPromise\n\n if (!keysToAdd.length) return\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniqueKeys: { addr: Key['addr']; type: Key['type'] }[] = []\n const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => {\n if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) {\n return false\n }\n\n uniqueKeys.push({ addr, type })\n return true\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys = uniqueKeysToAdd\n .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n privKey: null\n }))\n // No need to re-add keys that are already added (with the same type / device)\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd))\n }\n\n async #addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.#initialLoadPromise\n if (!keysToAdd.length) return\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniquePrivateKeysToAddSet = new Set()\n const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => {\n if (!uniquePrivateKeysToAddSet.has(privateKey)) {\n uniquePrivateKeysToAddSet.add(privateKey)\n return true\n }\n return false\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys: StoredKey[] = uniqueKeysToAdd\n .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => {\n // eslint-disable-next-line no-param-reassign\n privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), // TODO: consider a MAC?\n meta\n }\n })\n // No need to re-add keys that are already added, private key never changes\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.withStatus('addKeys', () => this.#addKeys(keysToAdd))\n }\n\n async removeKey(addr: Key['addr'], type: Key['type']) {\n await this.#initialLoadPromise\n if (!this.isUnlocked)\n throw new EmittableError({\n message:\n 'Extension not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n const keys = this.#keystoreKeys\n if (!keys.find((x) => x.addr === addr && x.type === type))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(\n `keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`\n )\n })\n\n this.#keystoreKeys = keys.filter((key) => {\n const isMatching = key.addr === addr && key.type === type\n\n return !isMatching\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n\n async exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string) {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n const wallet = new Wallet(decryptedPrivateKey)\n const keyBackup = await wallet.encrypt(passphrase)\n return JSON.stringify(keyBackup)\n }\n\n async sendPrivateKeyToUi(keyAddress: string) {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` })\n }\n\n async sendSeedToUi() {\n const decrypted = await this.getSavedSeed()\n this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed })\n }\n\n async #getPrivateKey(keyAddress: string): Promise {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress)\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n // decrypt the pk of keyAddress with the keystore's key\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n // encrypt the pk of keyAddress with publicKey\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n return aes.utils.hex.fromBytes(decryptedBytes)\n }\n\n /**\n * Export with public key encrypt\n *\n * @param keyAddress string - the address of the key you want to export\n * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId)\n * @returns Encrypted\n */\n async exportKeyWithPublicKeyEncryption(\n keyAddress: string,\n publicKey: string\n ): Promise {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey)\n\n return result\n }\n\n async importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean) {\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const privateKey: string = await decryptWithPrivateKey(\n hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))),\n encryptedSk\n )\n if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key')\n\n const keyToAdd: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n } = {\n addr: new Wallet(privateKey).address,\n privateKey,\n label: getDefaultKeyLabel(this.keys, 0),\n type: 'internal',\n dedicatedToOneSA,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n\n await this.addKeys([keyToAdd])\n }\n\n async getSigner(keyAddress: Key['addr'], keyType: Key['type']) {\n await this.#initialLoadPromise\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n const { addr, type, label, dedicatedToOneSA, meta } = storedKey\n\n const key = {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: type !== 'internal'\n }\n\n const SignerInitializer = this.#keystoreSigners[key.type]\n if (!SignerInitializer) throw new Error('keystore: unsupported signer type')\n\n if (key.type === 'internal') {\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key, decryptedPrivateKey)\n }\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key)\n }\n\n async getSavedSeed() {\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate\n const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes)\n const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes)\n return { seed: decryptedSeed, hdPathTemplate }\n }\n\n async #changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.#initialLoadPromise\n\n // In the case the user wants to change their device password,\n // they should also provide the previous password (oldSecret).\n //\n // However, in the case of KeyStore recovery, the user may have already forgotten the password,\n // but the Keystore is already unlocked with the recovery secret.\n // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it.\n //\n // However, there is one problem if we leave it that way:\n //\n // 1. If the user recovers and unlocks the Keystore.\n // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab).\n // 3. And later decides to change the old password from Settings.\n // 4. Then they would not be able to do it because they don't know the old password.\n //\n // We are going to discuss it in the next meeting, but for now, we are leaving it as it is.\n // The long-term solution would be to refactor EmailVault recovery logic\n // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase.\n if (oldSecret) await this.#unlockWithSecret('password', oldSecret)\n\n if (!this.isUnlocked)\n throw new EmittableError({\n message: 'App not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n\n await this.#removeSecret('password')\n await this.#addSecret('password', newSecret, '', true)\n }\n\n async changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.withStatus('changeKeystorePassword', () =>\n this.#changeKeystorePassword(newSecret, oldSecret)\n )\n }\n\n async updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys))\n }\n\n async #updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => {\n const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type)\n\n if (!key) return keystoreKey\n\n return { ...keystoreKey, ...key.preferences }\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n this.emitUpdate()\n }\n\n async deleteSavedSeed() {\n await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed())\n }\n\n async #deleteSavedSeed() {\n await this.#initialLoadPromise\n\n this.#keystoreSeeds = []\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n resetErrorState() {\n this.errorMessage = ''\n this.emitUpdate()\n }\n\n get hasPasswordSecret() {\n return this.#keystoreSecrets.some((x) => x.id === 'password')\n }\n\n get hasKeystoreSavedSeed() {\n return !!this.#keystoreSeeds.length\n }\n\n get hasKeystoreTempSeed() {\n return !!this.#tempSeed\n }\n\n get banners(): Banner[] {\n if (!this.#tempSeed) return []\n\n return [\n {\n id: 'tempSeed',\n type: 'warning',\n category: 'temp-seed-not-confirmed',\n title: 'You have an unsaved imported seed',\n text: '',\n actions: [\n {\n label: 'Check',\n actionName: 'confirm-temp-seed'\n }\n ]\n }\n ]\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isUnlocked: this.isUnlocked, // includes the getter in the stringified instance\n keys: this.keys,\n hasPasswordSecret: this.hasPasswordSecret,\n hasKeystoreSavedSeed: this.hasKeystoreSavedSeed,\n hasKeystoreTempSeed: this.hasKeystoreTempSeed,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/main/main.js b/dist/src/controllers/main/main.js index 99b1ecaac..7a47b184e 100644 --- a/dist/src/controllers/main/main.js +++ b/dist/src/controllers/main/main.js @@ -1,63 +1,67 @@ +"use strict"; /* eslint-disable @typescript-eslint/brace-style */ -import { ethErrors } from 'eth-rpc-errors'; -import { getAddress, getBigInt, Interface, isAddress } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import EmittableError from '../../classes/EmittableError'; -import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; -import { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'; -import { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'; -import { BIP44_LEDGER_DERIVATION_TEMPLATE, BIP44_STANDARD_DERIVATION_TEMPLATE } from '../../consts/derivation'; -import { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'; -import { AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'; -import { getDappIdentifier, pollTxnId } from '../../libs/accountOp/submittedAccountOp'; -import { dappRequestMethodToActionKind, getAccountOpActionsByNetwork, getAccountOpFromAction } from '../../libs/actions/actions'; -import { getAccountOpBanners } from '../../libs/banners/banners'; -import { getPaymasterService } from '../../libs/erc7677/erc7677'; -import { getHumanReadableBroadcastError, getHumanReadableEstimationError } from '../../libs/errorHumanizer'; -import { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'; -import { estimate } from '../../libs/estimate/estimate'; -import { getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'; -import { humanizeAccountOp } from '../../libs/humanizer'; -import { KeyIterator } from '../../libs/keyIterator/keyIterator'; -import { ACCOUNT_SWITCH_USER_REQUEST, buildSwitchAccountUserRequest, getAccountOpsForSimulation, makeBasicAccountOpAction, makeSmartAccountOpAction } from '../../libs/main/main'; -import { relayerAdditionalNetworks } from '../../libs/networks/networks'; -import { relayerCall } from '../../libs/relayerCall/relayerCall'; -import { parse } from '../../libs/richJson/richJson'; -import { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'; -import { adjustEntryPointAuthorization, getEntryPointAuthorization } from '../../libs/signMessage/signMessage'; -import { buildSwapAndBridgeUserRequests, getActiveRoutesForAccount } from '../../libs/swapAndBridge/swapAndBridge'; -import { debugTraceCall } from '../../libs/tracer/debugTraceCall'; -import { buildClaimWalletRequest, buildMintVestingRequest, buildTransferUserRequest } from '../../libs/transfer/userRequest'; -import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID, isErc4337Broadcast, shouldAskForEntryPointAuthorization } from '../../libs/userOperation/userOperation'; -import { getDefaultBundler } from '../../services/bundlers/getBundler'; -import { paymasterFactory } from '../../services/paymaster'; -import { failedPaymasters } from '../../services/paymaster/FailedPaymasters'; -import { SocketAPI } from '../../services/socket/api'; -import { getIsViewOnly } from '../../utils/accounts'; -import shortenAddress from '../../utils/shortenAddress'; -import wait from '../../utils/wait'; -import { AccountAdderController } from '../accountAdder/accountAdder'; -import { AccountsController } from '../accounts/accounts'; -import { ActionsController } from '../actions/actions'; -import { ActivityController } from '../activity/activity'; -import { AddressBookController } from '../addressBook/addressBook'; -import { DappsController } from '../dapps/dapps'; -import { DefiPositionsController } from '../defiPositions/defiPositions'; -import { DomainsController } from '../domains/domains'; -import { EmailVaultController } from '../emailVault/emailVault'; -import EventEmitter from '../eventEmitter/eventEmitter'; -import { InviteController } from '../invite/invite'; -import { KeystoreController } from '../keystore/keystore'; -import { NetworksController } from '../networks/networks'; -import { PortfolioController } from '../portfolio/portfolio'; -import { ProvidersController } from '../providers/providers'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MainController = void 0; +const tslib_1 = require("tslib"); +const eth_rpc_errors_1 = require("eth-rpc-errors"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const SwapAndBridgeError_1 = tslib_1.__importDefault(require("../../classes/SwapAndBridgeError")); +const dappCommunication_1 = require("../../consts/dappCommunication"); +const deploy_1 = require("../../consts/deploy"); +const derivation_1 = require("../../consts/derivation"); +const account_1 = require("../../libs/account/account"); +const accountOp_1 = require("../../libs/accountOp/accountOp"); +const submittedAccountOp_1 = require("../../libs/accountOp/submittedAccountOp"); +const actions_1 = require("../../libs/actions/actions"); +const banners_1 = require("../../libs/banners/banners"); +const erc7677_1 = require("../../libs/erc7677/erc7677"); +const errorHumanizer_1 = require("../../libs/errorHumanizer"); +const errors_1 = require("../../libs/errorHumanizer/errors"); +const estimate_1 = require("../../libs/estimate/estimate"); +const gasPrice_1 = require("../../libs/gasPrice/gasPrice"); +const humanizer_1 = require("../../libs/humanizer"); +const keyIterator_1 = require("../../libs/keyIterator/keyIterator"); +const main_1 = require("../../libs/main/main"); +const networks_1 = require("../../libs/networks/networks"); +const relayerCall_1 = require("../../libs/relayerCall/relayerCall"); +const richJson_1 = require("../../libs/richJson/richJson"); +const selectedAccount_1 = require("../../libs/selectedAccount/selectedAccount"); +const signMessage_1 = require("../../libs/signMessage/signMessage"); +const swapAndBridge_1 = require("../../libs/swapAndBridge/swapAndBridge"); +const debugTraceCall_1 = require("../../libs/tracer/debugTraceCall"); +const userRequest_1 = require("../../libs/transfer/userRequest"); +const userOperation_1 = require("../../libs/userOperation/userOperation"); +const getBundler_1 = require("../../services/bundlers/getBundler"); +const paymaster_1 = require("../../services/paymaster"); +const FailedPaymasters_1 = require("../../services/paymaster/FailedPaymasters"); +const api_1 = require("../../services/socket/api"); +const accounts_1 = require("../../utils/accounts"); +const shortenAddress_1 = tslib_1.__importDefault(require("../../utils/shortenAddress")); +const wait_1 = tslib_1.__importDefault(require("../../utils/wait")); +const accountAdder_1 = require("../accountAdder/accountAdder"); +const accounts_2 = require("../accounts/accounts"); +const actions_2 = require("../actions/actions"); +const activity_1 = require("../activity/activity"); +const addressBook_1 = require("../addressBook/addressBook"); +const dapps_1 = require("../dapps/dapps"); +const defiPositions_1 = require("../defiPositions/defiPositions"); +const domains_1 = require("../domains/domains"); +const emailVault_1 = require("../emailVault/emailVault"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +const invite_1 = require("../invite/invite"); +const keystore_1 = require("../keystore/keystore"); +const networks_2 = require("../networks/networks"); +const portfolio_1 = require("../portfolio/portfolio"); +const providers_1 = require("../providers/providers"); /* eslint-disable @typescript-eslint/no-floating-promises */ -import { SelectedAccountController } from '../selectedAccount/selectedAccount'; +const selectedAccount_2 = require("../selectedAccount/selectedAccount"); /* eslint-disable no-underscore-dangle */ -import { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'; -import { SignMessageController } from '../signMessage/signMessage'; -import { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'; +const signAccountOp_1 = require("../signAccountOp/signAccountOp"); +const signMessage_2 = require("../signMessage/signMessage"); +const swapAndBridge_2 = require("../swapAndBridge/swapAndBridge"); const STATUS_WRAPPED_METHODS = { onAccountAdderSuccess: 'INITIAL', signAccountOp: 'INITIAL', @@ -70,7 +74,7 @@ const STATUS_WRAPPED_METHODS = { importSmartAccountFromSavedSeed: 'INITIAL', selectAccount: 'INITIAL' }; -export class MainController extends EventEmitter { +class MainController extends eventEmitter_1.default { #storage; fetch; // Holds the initial load promise, so that one can wait until it completes @@ -127,36 +131,36 @@ export class MainController extends EventEmitter { this.fetch = fetch; this.#windowManager = windowManager; this.#notificationManager = notificationManager; - this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage }); - this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager); + this.invite = new invite_1.InviteController({ relayerUrl, fetch, storage: this.#storage }); + this.keystore = new keystore_1.KeystoreController(this.#storage, keystoreSigners, windowManager); this.#externalSignerControllers = externalSignerControllers; - this.networks = new NetworksController(this.#storage, this.fetch, async (network) => { + this.networks = new networks_2.NetworksController(this.#storage, this.fetch, async (network) => { this.providers.setProvider(network); await this.reloadSelectedAccount({ networkId: network.id }); }, (networkId) => { this.providers.removeProvider(networkId); }); - this.providers = new ProvidersController(this.networks); - this.accounts = new AccountsController(this.#storage, this.providers, this.networks, async (accounts) => { - const defaultSelectedAccount = getDefaultSelectedAccount(accounts); + this.providers = new providers_1.ProvidersController(this.networks); + this.accounts = new accounts_2.AccountsController(this.#storage, this.providers, this.networks, async (accounts) => { + const defaultSelectedAccount = (0, account_1.getDefaultSelectedAccount)(accounts); if (defaultSelectedAccount) { await this.#selectAccount(defaultSelectedAccount.addr); } }, this.providers.updateProviderIsWorking.bind(this.providers), this.#updateIsOffline.bind(this)); - this.selectedAccount = new SelectedAccountController({ + this.selectedAccount = new selectedAccount_2.SelectedAccountController({ storage: this.#storage, accounts: this.accounts }); - this.portfolio = new PortfolioController(this.#storage, this.fetch, this.providers, this.networks, this.accounts, relayerUrl, velcroUrl); - this.defiPositions = new DefiPositionsController({ + this.portfolio = new portfolio_1.PortfolioController(this.#storage, this.fetch, this.providers, this.networks, this.accounts, relayerUrl, velcroUrl); + this.defiPositions = new defiPositions_1.DefiPositionsController({ fetch: this.fetch, storage, selectedAccount: this.selectedAccount, networks: this.networks, providers: this.providers }); - this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore); - this.accountAdder = new AccountAdderController({ + this.emailVault = new emailVault_1.EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore); + this.accountAdder = new accountAdder_1.AccountAdderController({ accounts: this.accounts, keystore: this.keystore, networks: this.networks, @@ -164,17 +168,17 @@ export class MainController extends EventEmitter { relayerUrl, fetch: this.fetch }); - this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount); - this.signMessage = new SignMessageController(this.keystore, this.providers, this.networks, this.accounts, this.#externalSignerControllers); - const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch }); - this.dapps = new DappsController(this.#storage); - this.actions = new ActionsController({ + this.addressBook = new addressBook_1.AddressBookController(this.#storage, this.accounts, this.selectedAccount); + this.signMessage = new signMessage_2.SignMessageController(this.keystore, this.providers, this.networks, this.accounts, this.#externalSignerControllers); + const socketAPI = new api_1.SocketAPI({ apiKey: socketApiKey, fetch: this.fetch }); + this.dapps = new dapps_1.DappsController(this.#storage); + this.actions = new actions_2.ActionsController({ selectedAccount: this.selectedAccount, windowManager, notificationManager, onActionWindowClose: () => { const userRequestsToRejectOnWindowClose = this.userRequests.filter((r) => r.action.kind !== 'calls'); - userRequestsToRejectOnWindowClose.forEach((r) => r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())); + userRequestsToRejectOnWindowClose.forEach((r) => r.dappPromise?.reject(eth_rpc_errors_1.ethErrors.provider.userRejectedRequest())); this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls'); this.userRequestWaitingAccountSwitch = []; this.emitUpdate(); @@ -187,11 +191,11 @@ export class MainController extends EventEmitter { networks: this.networks, providers: this.providers }); - this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch }); - this.activity = new ActivityController(this.#storage, this.fetch, this.callRelayer, this.accounts, this.selectedAccount, this.providers, this.networks, async (network) => { + this.callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch: this.fetch }); + this.activity = new activity_1.ActivityController(this.#storage, this.fetch, this.callRelayer, this.accounts, this.selectedAccount, this.providers, this.networks, async (network) => { await this.setContractsDeployedToTrueIfDeployed(network); }); - this.swapAndBridge = new SwapAndBridgeController({ + this.swapAndBridge = new swapAndBridge_2.SwapAndBridgeController({ selectedAccount: this.selectedAccount, networks: this.networks, activity: this.activity, @@ -200,9 +204,9 @@ export class MainController extends EventEmitter { storage: this.#storage, actions: this.actions }); - this.domains = new DomainsController(this.providers.providers); + this.domains = new domains_1.DomainsController(this.providers.providers); this.#initialLoadPromise = this.#load(); - paymasterFactory.init(relayerUrl, fetch, (e) => { + paymaster_1.paymasterFactory.init(relayerUrl, fetch, (e) => { if (!this.signAccountOp) return; this.emitError(e); @@ -232,7 +236,7 @@ export class MainController extends EventEmitter { // #load is called in the constructor which is synchronous // we await (1 ms/next tick) for the constructor to extend the EventEmitter class // and then we call it's methods - await wait(1); + await (0, wait_1.default)(1); this.emitUpdate(); await this.networks.initialLoadPromise; await this.providers.initialLoadPromise; @@ -321,17 +325,17 @@ export class MainController extends EventEmitter { if (this.accountAdder.isInitialized) this.accountAdder.reset(); if (seed && !this.keystore.hasKeystoreSavedSeed) { - await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE }); + await this.keystore.addSeed({ seed, hdPathTemplate: derivation_1.BIP44_STANDARD_DERIVATION_TEMPLATE }); } const savedSeed = await this.keystore.getSavedSeed(); if (!savedSeed) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.', level: 'major', error: new Error('failed to retrieve saved seed phrase from keystore') }); } - const keyIterator = new KeyIterator(savedSeed.seed); + const keyIterator = new keyIterator_1.KeyIterator(savedSeed.seed); await this.accountAdder.init({ keyIterator, hdPathTemplate: savedSeed.hdPathTemplate, @@ -346,7 +350,7 @@ export class MainController extends EventEmitter { do { // eslint-disable-next-line no-await-in-loop await this.accountAdder.setPage({ page: currentPage }); - nextSmartAccount = this.accountAdder.accountsOnPage.find(({ isLinked, account }) => !isLinked && isSmartAccount(account))?.account; + nextSmartAccount = this.accountAdder.accountsOnPage.find(({ isLinked, account }) => !isLinked && (0, account_1.isSmartAccount)(account))?.account; if (!nextSmartAccount) break; isAccountAlreadyAdded = !!this.accounts.accounts.find( @@ -357,7 +361,7 @@ export class MainController extends EventEmitter { }; await findNextSmartAccount(); if (!nextSmartAccount) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.', level: 'major', error: new Error('Internal error: Failed to find a smart account to add') @@ -372,7 +376,7 @@ export class MainController extends EventEmitter { }, true); } initSignAccOp(actionId) { - const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue); + const accountOp = (0, actions_1.getAccountOpFromAction)(actionId, this.actions.actionsQueue); if (!accountOp) { this.signAccOpInitError = 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'; @@ -398,7 +402,7 @@ export class MainController extends EventEmitter { if (state) accountOp.nonce = state.nonce; this.signAccOpInitError = null; - this.signAccountOp = new SignAccountOpController(this.accounts, this.keystore, this.portfolio, this.#externalSignerControllers, this.selectedAccount.account, network, actionId, accountOp, () => { + this.signAccountOp = new signAccountOp_1.SignAccountOpController(this.accounts, this.keystore, this.portfolio, this.#externalSignerControllers, this.selectedAccount.account, network, actionId, accountOp, () => { this.estimateSignAccountOp(); }, () => { return this.isSignRequestStillActive; @@ -409,7 +413,7 @@ export class MainController extends EventEmitter { } async handleSignAndBroadcastAccountOp() { await this.withStatus('signAccountOp', async () => { - const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done; + const wasAlreadySigned = this.signAccountOp?.status?.type === signAccountOp_1.SigningStatus.Done; if (wasAlreadySigned) return Promise.resolve(); if (!this.signAccountOp) { @@ -425,7 +429,7 @@ export class MainController extends EventEmitter { return this.#signAccountOpSigningPromise; }, true); // Error handling on the prev step will notify the user, it's fine to return here - if (this.signAccountOp?.status?.type !== SigningStatus.Done) + if (this.signAccountOp?.status?.type !== signAccountOp_1.SigningStatus.Done) return; return this.withStatus('broadcastSignedAccountOp', async () => { // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown @@ -457,13 +461,13 @@ export class MainController extends EventEmitter { const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]; const provider = this.providers.providers[network.id]; const gasPrice = this.gasPrices[network.id]; - const { tokens, nfts } = await debugTraceCall(account, accountOp, provider, state, estimation.gasUsed, gasPrice, !network.rpcNoStateOverride); + const { tokens, nfts } = await (0, debugTraceCall_1.debugTraceCall)(account, accountOp, provider, state, estimation.gasUsed, gasPrice, !network.rpcNoStateOverride); const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id); const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id); // update the portfolio only if new tokens were found through tracing if (learnedNewTokens || learnedNewNfts) { this.portfolio - .updateSelectedAccount(accountOp.accountAddr, network, getAccountOpsForSimulation(account, this.actions.visibleActionsQueue, network, accountOp), { forceUpdate: true }) + .updateSelectedAccount(accountOp.accountAddr, network, (0, main_1.getAccountOpsForSimulation)(account, this.actions.visibleActionsQueue, network, accountOp), { forceUpdate: true }) // fire an update request to refresh the warnings if any .then(() => this.signAccountOp?.update({})); } @@ -494,8 +498,8 @@ export class MainController extends EventEmitter { // Error handling on the prev step will notify the user, it's fine to return here if (!signedMessage) return; - if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { - const accountOpAction = makeSmartAccountOpAction({ + if (signedMessage.fromActionId === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { + const accountOpAction = (0, main_1.makeSmartAccountOpAction)({ account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0], networkId: signedMessage.networkId, nonce: this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce, @@ -504,7 +508,7 @@ export class MainController extends EventEmitter { }); if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}; - accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(signedMessage.signature); + accountOpAction.accountOp.meta.entryPointAuthorization = (0, signMessage_1.adjustEntryPointAuthorization)(signedMessage.signature); this.actions.addOrUpdateAction(accountOpAction, 'first'); } await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr); @@ -522,7 +526,7 @@ export class MainController extends EventEmitter { const ledgerCtrl = this.#externalSignerControllers.ledger; if (!ledgerCtrl) { const message = 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'; - throw new EmittableError({ message, level: 'major', error: new Error(message) }); + throw new EmittableError_1.default({ message, level: 'major', error: new Error(message) }); } // Once a session with the Ledger device gets initiated, the user might // use the device with another app. In this scenario, when coming back to @@ -532,11 +536,11 @@ export class MainController extends EventEmitter { // a new session when retrieving keys, in case there already is one. if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp(); - const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE; + const hdPathTemplate = derivation_1.BIP44_LEDGER_DERIVATION_TEMPLATE; await ledgerCtrl.unlock(hdPathTemplate); if (!ledgerCtrl.walletSDK) { const message = 'Could not establish connection with the Ledger device'; - throw new EmittableError({ message, level: 'major', error: new Error(message) }); + throw new EmittableError_1.default({ message, level: 'major', error: new Error(message) }); } const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl }); await this.accountAdder.init({ keyIterator, hdPathTemplate }); @@ -544,7 +548,7 @@ export class MainController extends EventEmitter { } catch (error) { const message = error?.message || 'Could not unlock the Ledger device. Please try again.'; - throw new EmittableError({ message, level: 'major', error }); + throw new EmittableError_1.default({ message, level: 'major', error }); } } async handleAccountAdderInitLedger(LedgerKeyIterator /* TODO: KeyIterator type mismatch */) { @@ -557,9 +561,9 @@ export class MainController extends EventEmitter { const latticeCtrl = this.#externalSignerControllers.lattice; if (!latticeCtrl) { const message = 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'; - throw new EmittableError({ message, level: 'major', error: new Error(message) }); + throw new EmittableError_1.default({ message, level: 'major', error: new Error(message) }); } - const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE; + const hdPathTemplate = derivation_1.BIP44_STANDARD_DERIVATION_TEMPLATE; await latticeCtrl.unlock(hdPathTemplate, undefined, true); const { walletSDK } = latticeCtrl; await this.accountAdder.init({ @@ -570,7 +574,7 @@ export class MainController extends EventEmitter { } catch (error) { const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'; - throw new EmittableError({ message, level: 'major', error }); + throw new EmittableError_1.default({ message, level: 'major', error }); } } async handleAccountAdderInitLattice(LatticeKeyIterator /* TODO: KeyIterator type mismatch */) { @@ -599,7 +603,7 @@ export class MainController extends EventEmitter { const provider = this.providers.providers[network.id]; if (!provider) return; - const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY); + const factoryCode = await provider.getCode(deploy_1.AMBIRE_ACCOUNT_FACTORY); if (factoryCode === '0x') return; await this.networks.updateNetwork({ areContractsDeployed: true }, network.id); @@ -616,7 +620,7 @@ export class MainController extends EventEmitter { // Remove account keys from the keystore solelyAccountKeys.forEach((key) => { this.keystore.removeKey(key.addr, key.type).catch((e) => { - throw new EmittableError({ + throw new EmittableError_1.default({ level: 'major', message: 'Failed to remove account key', error: e @@ -644,7 +648,7 @@ export class MainController extends EventEmitter { this.emitUpdate(); } catch (e) { - throw new EmittableError({ + throw new EmittableError_1.default({ level: 'major', message: 'Failed to remove account', error: e || new Error('Failed to remove account') @@ -717,7 +721,7 @@ export class MainController extends EventEmitter { const latestState = this.portfolio.getLatestPortfolioState(accountAddr); const latestStateKeys = Object.keys(latestState); const isAllReady = latestStateKeys.every((networkId) => { - return isNetworkReady(latestState[networkId]); + return (0, selectedAccount_1.isNetworkReady)(latestState[networkId]); }); if (!isAllReady) return; @@ -744,12 +748,12 @@ export class MainController extends EventEmitter { return; const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId; const networkData = network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId); - const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(this.selectedAccount.account, this.actions.visibleActionsQueue, networkData, this.signAccountOp?.accountOp); + const accountOpsToBeSimulatedByNetwork = (0, main_1.getAccountOpsForSimulation)(this.selectedAccount.account, this.actions.visibleActionsQueue, networkData, this.signAccountOp?.accountOp); await this.portfolio.updateSelectedAccount(this.selectedAccount.account.addr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate }); this.#updateIsOffline(); } #getUserRequestAccountError(dappOrigin, fromAccountAddr) { - if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) { + if (dappCommunication_1.ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) { const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr); if (isAddressInAccounts) return null; @@ -764,22 +768,22 @@ export class MainController extends EventEmitter { await this.#initialLoadPromise; let userRequest = null; let actionPosition = 'last'; - const kind = dappRequestMethodToActionKind(request.method); + const kind = (0, actions_1.dappRequestMethodToActionKind)(request.method); const dapp = this.dapps.getDapp(request.origin); if (kind === 'calls') { if (!this.selectedAccount.account) - throw ethErrors.rpc.internal(); + throw eth_rpc_errors_1.ethErrors.rpc.internal(); const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); if (!network) { - throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + throw eth_rpc_errors_1.ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); } const isWalletSendCalls = !!request.params[0].calls; - const accountAddr = getAddress(request.params[0].from); + const accountAddr = (0, ethers_1.getAddress)(request.params[0].from); const calls = isWalletSendCalls ? request.params[0].calls : [request.params[0]]; const paymasterService = isWalletSendCalls - ? getPaymasterService(network.chainId, request.params[0].capabilities) + ? (0, erc7677_1.getPaymasterService)(network.chainId, request.params[0].capabilities) : null; userRequest = { id: new Date().getTime(), @@ -788,7 +792,7 @@ export class MainController extends EventEmitter { calls: calls.map((call) => ({ to: call.to, data: call.data || '0x', - value: call.value ? getBigInt(call.value) : 0n + value: call.value ? (0, ethers_1.getBigInt)(call.value) : 0n })) }, meta: { @@ -809,15 +813,15 @@ export class MainController extends EventEmitter { } else if (kind === 'message') { if (!this.selectedAccount.account) - throw ethErrors.rpc.internal(); + throw eth_rpc_errors_1.ethErrors.rpc.internal(); const msg = request.params; if (!msg) { - throw ethErrors.rpc.invalidRequest('No msg request to sign'); + throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest('No msg request to sign'); } - const msgAddress = getAddress(msg?.[1]); + const msgAddress = (0, ethers_1.getAddress)(msg?.[1]); const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); if (!network) { - throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + throw eth_rpc_errors_1.ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); } userRequest = { id: new Date().getTime(), @@ -836,32 +840,32 @@ export class MainController extends EventEmitter { } else if (kind === 'typedMessage') { if (!this.selectedAccount.account) - throw ethErrors.rpc.internal(); + throw eth_rpc_errors_1.ethErrors.rpc.internal(); const msg = request.params; if (!msg) { - throw ethErrors.rpc.invalidRequest('No msg request to sign'); + throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest('No msg request to sign'); } - const msgAddress = getAddress(msg?.[0]); + const msgAddress = (0, ethers_1.getAddress)(msg?.[0]); const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); if (!network) { - throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + throw eth_rpc_errors_1.ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); } let typedData = msg?.[1]; try { - typedData = parse(typedData); + typedData = (0, richJson_1.parse)(typedData); } catch (error) { - throw ethErrors.rpc.invalidRequest('Invalid typedData provided'); + throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest('Invalid typedData provided'); } if (!typedData?.types || !typedData?.domain || !typedData?.message || !typedData?.primaryType) { - throw ethErrors.rpc.methodNotSupported('Invalid typedData format - only typedData v4 is supported'); + throw eth_rpc_errors_1.ethErrors.rpc.methodNotSupported('Invalid typedData format - only typedData v4 is supported'); } if (msgAddress === this.selectedAccount.account.addr && (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)) { - throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed'); + throw eth_rpc_errors_1.ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed'); } userRequest = { id: new Date().getTime(), @@ -903,22 +907,22 @@ export class MainController extends EventEmitter { // We can simply add the user request if it's not a sign operation // for another account if (!isASignOperationRequestedForAnotherAccount) { - await this.addUserRequest(userRequest, actionPosition, actionPosition === 'first' || isSmartAccount(this.selectedAccount.account) + await this.addUserRequest(userRequest, actionPosition, actionPosition === 'first' || (0, account_1.isSmartAccount)(this.selectedAccount.account) ? 'open-action-window' : 'queue-but-open-action-window'); return; } const accountError = this.#getUserRequestAccountError(dappPromise.session.origin, userRequest.meta.accountAddr); if (accountError) { - dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError)); + dappPromise.reject(eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(accountError)); return; } const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId)); if (!network) { - throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); + throw eth_rpc_errors_1.ethErrors.provider.chainDisconnected('Transaction failed - unknown network'); } this.userRequestWaitingAccountSwitch.push(userRequest); - await this.addUserRequest(buildSwitchAccountUserRequest({ + await this.addUserRequest((0, main_1.buildSwitchAccountUserRequest)({ nextUserRequest: userRequest, networkId: network.id, selectedAccountAddr: userRequest.meta.accountAddr, @@ -930,7 +934,7 @@ export class MainController extends EventEmitter { await this.#initialLoadPromise; if (!this.selectedAccount.account) return; - const userRequest = buildTransferUserRequest({ + const userRequest = (0, userRequest_1.buildTransferUserRequest)({ selectedAccount: this.selectedAccount.account.addr, amount, selectedToken, @@ -952,7 +956,7 @@ export class MainController extends EventEmitter { return; let transaction = null; const activeRoute = this.swapAndBridge.activeRoutes.find((r) => r.activeRouteId === activeRouteId); - if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) { + if (this.swapAndBridge.formStatus === swapAndBridge_2.SwapAndBridgeFormStatus.ReadyToSubmit) { transaction = await this.swapAndBridge.getRouteStartUserTx(); } if (activeRoute) { @@ -961,7 +965,7 @@ export class MainController extends EventEmitter { shouldOpenNextRequest: false }); this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined }); - if (!isSmartAccount(this.selectedAccount.account)) { + if (!(0, account_1.isSmartAccount)(this.selectedAccount.account)) { this.removeUserRequest(`${activeRouteId}-revoke-approval`, { shouldRemoveSwapAndBridgeRoute: false, shouldOpenNextRequest: false @@ -975,13 +979,13 @@ export class MainController extends EventEmitter { } if (!this.selectedAccount.account || !transaction) { const errorDetails = `missing ${this.selectedAccount.account ? 'selected account' : 'transaction'} info`; - const error = new SwapAndBridgeError(`Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`); - throw new EmittableError({ message: error.message, level: 'major', error }); + const error = new SwapAndBridgeError_1.default(`Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`); + throw new EmittableError_1.default({ message: error.message, level: 'major', error }); } const network = this.networks.networks.find((n) => Number(n.chainId) === transaction.chainId); // TODO: Consider refining the error handling in here, because this // swallows errors and doesn't provide any feedback to the user. - const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(transaction, network.id, this.selectedAccount.account, this.providers.providers[network.id]); + const swapAndBridgeUserRequests = await (0, swapAndBridge_1.buildSwapAndBridgeUserRequests)(transaction, network.id, this.selectedAccount.account, this.providers.providers[network.id]); for (let i = 0; i < swapAndBridgeUserRequests.length; i++) { if (i === 0) { this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window'); @@ -991,7 +995,7 @@ export class MainController extends EventEmitter { await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue'); } } - if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) { + if (this.swapAndBridge.formStatus === swapAndBridge_2.SwapAndBridgeFormStatus.ReadyToSubmit) { await this.swapAndBridge.addActiveRoute({ activeRouteId: transaction.activeRouteId, userTxIndex: transaction.userTxIndex @@ -1011,7 +1015,7 @@ export class MainController extends EventEmitter { const claimableRewardsData = this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData; if (!claimableRewardsData) return; - const userRequest = buildClaimWalletRequest({ + const userRequest = (0, userRequest_1.buildClaimWalletRequest)({ selectedAccount: this.selectedAccount.account.addr, selectedToken: token, claimableRewardsData @@ -1024,7 +1028,7 @@ export class MainController extends EventEmitter { const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData; if (!addrVestingData) return; - const userRequest = buildMintVestingRequest({ + const userRequest = (0, userRequest_1.buildMintVestingRequest)({ selectedAccount: this.selectedAccount.account.addr, selectedToken: token, addrVestingData @@ -1053,7 +1057,7 @@ export class MainController extends EventEmitter { const userRequest = this.userRequests.find((r) => r.id === requestId); if (!userRequest) return; - if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { + if (requestId === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID) { this.userRequests = this.userRequests.filter((r) => !(r.action.kind === 'calls' && r.meta.accountAddr === userRequest.meta.accountAddr && r.meta.networkId === userRequest.meta.networkId)); @@ -1063,13 +1067,13 @@ export class MainController extends EventEmitter { // this is valid scenario for a swap & bridge txs with a BA if (userRequest.action.kind === 'calls') { const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr); - if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) { + if (!(0, account_1.isSmartAccount)(acc) && userRequest.meta.isSwapAndBridgeCall) { this.removeUserRequest(userRequest.meta.activeRouteId); this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`); this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`); } } - userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err)); + userRequest.dappPromise?.reject(eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(err)); this.removeUserRequest(requestId); } rejectSignAccountOpCall(callId) { @@ -1088,7 +1092,7 @@ export class MainController extends EventEmitter { this.rejectUserRequest('User rejected the transaction request.', userRequest.id); } else { - const accountOpAction = makeSmartAccountOpAction({ + const accountOpAction = (0, main_1.makeSmartAccountOpAction)({ account: this.accounts.accounts.find((a) => a.addr === accountAddr), networkId, nonce: this.accounts.accountStates[accountAddr][networkId].nonce, @@ -1143,7 +1147,7 @@ export class MainController extends EventEmitter { // @TODO consider re-using this whole block in removeUserRequest await this.#ensureAccountInfo(meta.accountAddr, meta.networkId); if (this.signAccOpInitError) { - return req.dappPromise?.reject(ethErrors.provider.custom({ + return req.dappPromise?.reject(eth_rpc_errors_1.ethErrors.provider.custom({ code: 1001, message: this.signAccOpInitError })); @@ -1154,22 +1158,22 @@ export class MainController extends EventEmitter { await this.#signAccountOpBroadcastPromise; const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr); const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]; - if (isSmartAccount(account)) { + if ((0, account_1.isSmartAccount)(account)) { const network = this.networks.networks.find((n) => n.id === meta.networkId); // find me the accountOp for the network if any, it's always 1 for SA const currentAccountOpAction = this.actions.actionsQueue.find((a) => a.type === 'accountOp' && a.accountOp.accountAddr === account.addr && a.accountOp.networkId === network.id); - const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(account.addr, (message) => message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID && + const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(account.addr, (message) => message.fromActionId === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID && message.networkId === network.id); const hasAuthorized = !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization || !!entryPointAuthorizationMessageFromHistory; - if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) { + if ((0, userOperation_1.shouldAskForEntryPointAuthorization)(network, account, accountState, hasAuthorized)) { await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType); this.emitUpdate(); return; } - const accountOpAction = makeSmartAccountOpAction({ + const accountOpAction = (0, main_1.makeSmartAccountOpAction)({ account, networkId: meta.networkId, nonce: accountState.nonce, @@ -1191,7 +1195,7 @@ export class MainController extends EventEmitter { } } else { - const accountOpAction = makeBasicAccountOpAction({ + const accountOpAction = (0, main_1.makeBasicAccountOpAction)({ account, networkId: meta.networkId, nonce: accountState.nonce, @@ -1208,7 +1212,7 @@ export class MainController extends EventEmitter { const msgReq = this.userRequests.find((uReq) => uReq.id === id); if (!msgReq) return; - msgReq.dappPromise?.reject(ethErrors.provider.custom({ + msgReq.dappPromise?.reject(eth_rpc_errors_1.ethErrors.provider.custom({ code: 1001, message: 'Rejected: Please complete your pending message request before initiating a new one.' })); @@ -1248,7 +1252,7 @@ export class MainController extends EventEmitter { const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr); if (!account) throw new Error(`batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`); - if (isSmartAccount(account)) { + if ((0, account_1.isSmartAccount)(account)) { const accountOpIndex = this.actions.actionsQueue.findIndex((a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`); const accountOpAction = this.actions.actionsQueue[accountOpIndex]; // accountOp has just been rejected or broadcasted @@ -1290,7 +1294,7 @@ export class MainController extends EventEmitter { this.swapAndBridge.removeActiveRoute(meta.activeRouteId); } } - else if (id === ACCOUNT_SWITCH_USER_REQUEST) { + else if (id === main_1.ACCOUNT_SWITCH_USER_REQUEST) { const requestsToAdd = this.userRequestWaitingAccountSwitch.filter((r) => r.meta.accountAddr === this.selectedAccount.account.addr); this.actions.removeAction(id, this.selectedAccount.account?.addr !== action.params.switchToAccountAddr); (async () => { @@ -1308,14 +1312,14 @@ export class MainController extends EventEmitter { this.emitUpdate(); } async addEntryPointAuthorization(req, network, accountState, actionExecutionType = 'open-action-window') { - if (this.actions.visibleActionsQueue.find((a) => a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID && + if (this.actions.visibleActionsQueue.find((a) => a.id === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID && a.userRequest.meta.networkId === req.meta.networkId)) { - this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID); + this.actions.setCurrentActionById(userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID); return; } - const typedMessageAction = await getEntryPointAuthorization(req.meta.accountAddr, network.chainId, BigInt(accountState.nonce)); + const typedMessageAction = await (0, signMessage_1.getEntryPointAuthorization)(req.meta.accountAddr, network.chainId, BigInt(accountState.nonce)); await this.addUserRequest({ - id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID, + id: userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID, action: typedMessageAction, meta: { isSignAction: true, @@ -1374,7 +1378,7 @@ export class MainController extends EventEmitter { const walletSendCallsUserReq = this.userRequests.find((r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls); if (walletSendCallsUserReq) { walletSendCallsUserReq.dappPromise?.resolve({ - hash: getDappIdentifier(data.submittedAccountOp) + hash: (0, submittedAccountOp_1.getDappIdentifier)(data.submittedAccountOp) }); // eslint-disable-next-line no-await-in-loop this.removeUserRequest(walletSendCallsUserReq.id, { @@ -1389,7 +1393,7 @@ export class MainController extends EventEmitter { } } // Note: this may take a while! - const txnId = await pollTxnId(data.submittedAccountOp.identifiedBy, network, this.fetch, this.callRelayer); + const txnId = await (0, submittedAccountOp_1.pollTxnId)(data.submittedAccountOp.identifiedBy, network, this.fetch, this.callRelayer); // eslint-disable-next-line no-restricted-syntax for (const call of accountOp.calls) { const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId); @@ -1398,7 +1402,7 @@ export class MainController extends EventEmitter { uReq.dappPromise?.resolve({ hash: txnId }); } else { - uReq.dappPromise?.reject(ethErrors.rpc.transactionRejected({ + uReq.dappPromise?.reject(eth_rpc_errors_1.ethErrors.rpc.transactionRejected({ message: 'Transaction rejected by the bundler' })); } @@ -1444,10 +1448,10 @@ export class MainController extends EventEmitter { const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr); if (!account) return undefined; // shouldn't happen - const is4337 = isErc4337Broadcast(account, network, this.accounts.accountStates[accOp.accountAddr][accOp.networkId]); + const is4337 = (0, userOperation_1.isErc4337Broadcast)(account, network, this.accounts.accountStates[accOp.accountAddr][accOp.networkId]); const bundler = this.signAccountOp ? this.signAccountOp.bundlerSwitcher.getBundler() - : getDefaultBundler(network); + : (0, getBundler_1.getDefaultBundler)(network); const bundlerFetch = async () => { if (!is4337) return null; @@ -1465,7 +1469,7 @@ export class MainController extends EventEmitter { }); }; const [gasPriceData, bundlerGas] = await Promise.all([ - getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => { + (0, gasPrice_1.getGasPriceRecommendations)(this.providers.providers[network.id], network).catch((e) => { this.emitError({ level: 'major', message: `Unable to get gas price for ${network.id}`, @@ -1529,9 +1533,9 @@ export class MainController extends EventEmitter { // should not be present as the user cannot pay the fee with them (no key) const nativeToCheck = account?.creation ? this.accounts.accounts - .filter((acc) => !isSmartAccount(acc) && + .filter((acc) => !(0, account_1.isSmartAccount)(acc) && (acc.addr === localAccountOp.accountAddr || - !getIsViewOnly(this.keystore.keys, acc.associatedKeys))) + !(0, accounts_1.getIsViewOnly)(this.keystore.keys, acc.associatedKeys))) .map((acc) => acc.addr) : []; if (!account) @@ -1548,7 +1552,7 @@ export class MainController extends EventEmitter { ?.tokens ?? []; const feeTokens = [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []; // can be read from the UI - const humanization = humanizeAccountOp(localAccountOp, {}); + const humanization = (0, humanizer_1.humanizeAccountOp)(localAccountOp, {}); humanization.forEach((call) => { if (!call.fullVisualization) return; @@ -1561,26 +1565,26 @@ export class MainController extends EventEmitter { const additionalHints = humanization .map((call) => !call.fullVisualization ? [] - : call.fullVisualization.map((vis) => vis.address && isAddress(vis.address) ? getAddress(vis.address) : '')) + : call.fullVisualization.map((vis) => vis.address && (0, ethers_1.isAddress)(vis.address) ? (0, ethers_1.getAddress)(vis.address) : '')) .flat() - .filter((x) => isAddress(x)); + .filter((x) => (0, ethers_1.isAddress)(x)); this.portfolio.addTokensToBeLearned(additionalHints, network.id); - const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(account, this.actions.visibleActionsQueue, network, this.signAccountOp.accountOp); + const accountOpsToBeSimulatedByNetwork = (0, main_1.getAccountOpsForSimulation)(account, this.actions.visibleActionsQueue, network, this.signAccountOp.accountOp); const [, estimation] = await Promise.all([ // NOTE: we are not emitting an update here because the portfolio controller will do that // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as // it may have different needs this.portfolio.updateSelectedAccount(localAccountOp.accountAddr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate: true }), - estimate(this.providers.providers[localAccountOp.networkId], network, account, localAccountOp, this.accounts.accountStates, nativeToCheck, + (0, estimate_1.estimate)(this.providers.providers[localAccountOp.networkId], network, account, localAccountOp, this.accounts.accountStates, nativeToCheck, // @TODO - first time calling this, portfolio is still not loaded. feeTokens, (e) => { if (!this.signAccountOp) return; this.emitError(e); }, this.signAccountOp.bundlerSwitcher, { - is4337Broadcast: isErc4337Broadcast(account, network, this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]) + is4337Broadcast: (0, userOperation_1.isErc4337Broadcast)(account, network, this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]) }).catch((e) => { - const { message } = getHumanReadableEstimationError(e); + const { message } = (0, errorHumanizer_1.getHumanReadableEstimationError)(e); this.emitError({ level: 'major', message, @@ -1605,12 +1609,12 @@ export class MainController extends EventEmitter { } const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'; const lastTxn = this.activity.getLastTxn(localAccountOp.networkId); - const SAHasOldNonceOnARelayerNetwork = isSmartAccount(account) && + const SAHasOldNonceOnARelayerNetwork = (0, account_1.isSmartAccount)(account) && !network.erc4337.enabled && lastTxn && localAccountOp.nonce === lastTxn.nonce && lastTxn.success && - lastTxn.status === AccountOpStatus.Success; + lastTxn.status === accountOp_1.AccountOpStatus.Success; if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) { this.accounts .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId]) @@ -1721,7 +1725,7 @@ export class MainController extends EventEmitter { return this.throwBroadcastAccountOp({ message }); } if (!account) { - const addr = shortenAddress(accountOp.accountAddr, 13); + const addr = (0, shortenAddress_1.default)(accountOp.accountAddr, 13); const message = `Account with address ${addr} not found. ${contactSupportPrompt}`; return this.throwBroadcastAccountOp({ message }); } @@ -1732,7 +1736,7 @@ export class MainController extends EventEmitter { const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]; let transactionRes = null; // Basic account (EOA) - if (!isSmartAccount(account)) { + if (!(0, account_1.isSmartAccount)(account)) { try { const feePayerKeys = this.keystore.keys.filter((key) => key.addr === accountOp.gasFeePayment.paidBy); const feePayerKey = @@ -1740,8 +1744,8 @@ export class MainController extends EventEmitter { // TODO: Implement a way to choose the key type to broadcast with. feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]; if (!feePayerKey) { - const missingKeyAddr = shortenAddress(accountOp.gasFeePayment.paidBy, 13); - const accAddr = shortenAddress(accountOp.accountAddr, 13); + const missingKeyAddr = (0, shortenAddress_1.default)(accountOp.gasFeePayment.paidBy, 13); + const accAddr = (0, shortenAddress_1.default)(accountOp.accountAddr, 13); const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`; return await this.throwBroadcastAccountOp({ message, accountState }); } @@ -1795,8 +1799,8 @@ export class MainController extends EventEmitter { // TODO: Implement a way to choose the key type to broadcast with. feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]; if (!feePayerKey) { - const missingKeyAddr = shortenAddress(accountOp.gasFeePayment.paidBy, 13); - const accAddr = shortenAddress(accountOp.accountAddr, 13); + const missingKeyAddr = (0, shortenAddress_1.default)(accountOp.gasFeePayment.paidBy, 13); + const accAddr = (0, shortenAddress_1.default)(accountOp.accountAddr, 13); const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`; return this.throwBroadcastAccountOp({ message, accountState }); } @@ -1805,20 +1809,20 @@ export class MainController extends EventEmitter { let data; let to; if (accountState.isDeployed) { - const ambireAccount = new Interface(AmbireAccount.abi); + const ambireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); to = accountOp.accountAddr; data = ambireAccount.encodeFunctionData('execute', [ - getSignableCalls(accountOp), + (0, accountOp_1.getSignableCalls)(accountOp), accountOp.signature ]); } else { - const ambireFactory = new Interface(AmbireFactory.abi); + const ambireFactory = new ethers_1.Interface(AmbireFactory_json_1.default.abi); to = account.creation.factoryAddr; data = ambireFactory.encodeFunctionData('deployAndExecute', [ account.creation.bytecode, account.creation.salt, - getSignableCalls(accountOp), + (0, accountOp_1.getSignableCalls)(accountOp), accountOp.signature ]); } @@ -1865,7 +1869,7 @@ export class MainController extends EventEmitter { else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) { const userOperation = accountOp.asUserOperation; if (!userOperation) { - const accAddr = shortenAddress(accountOp.accountAddr, 13); + const accAddr = (0, shortenAddress_1.default)(accountOp.accountAddr, 13); const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`; return this.throwBroadcastAccountOp({ message, accountState }); } @@ -1882,9 +1886,9 @@ export class MainController extends EventEmitter { // TODO: explore more error case where we switch the bundler if (this.signAccountOp) { const decodedError = bundler.decodeBundlerError(e); - const humanReadable = getHumanReadableBroadcastError(decodedError); + const humanReadable = (0, errorHumanizer_1.getHumanReadableBroadcastError)(decodedError); const switcher = this.signAccountOp.bundlerSwitcher; - this.signAccountOp.updateStatus(SigningStatus.ReadyToSign); + this.signAccountOp.updateStatus(signAccountOp_1.SigningStatus.ReadyToSign); if (switcher.canSwitch(humanReadable)) { switcher.switch(); this.estimateSignAccountOp(); @@ -1919,12 +1923,12 @@ export class MainController extends EventEmitter { try { const body = { gasLimit: Number(accountOp.gasFeePayment.simulatedGasLimit), - txns: getSignableCalls(accountOp), + txns: (0, accountOp_1.getSignableCalls)(accountOp), signature: accountOp.signature, signer: { address: accountOp.signingKeyAddr }, nonce: Number(accountOp.nonce) }; - const additionalRelayerNetwork = relayerAdditionalNetworks.find((net) => net.chainId === network.chainId); + const additionalRelayerNetwork = networks_1.relayerAdditionalNetworks.find((net) => net.chainId === network.chainId); const relayerNetworkId = additionalRelayerNetwork ? additionalRelayerNetwork.name : accountOp.networkId; @@ -1951,12 +1955,12 @@ export class MainController extends EventEmitter { this.portfolio.markSimulationAsBroadcasted(account.addr, network.id); const submittedAccountOp = { ...accountOp, - status: AccountOpStatus.BroadcastedButNotConfirmed, + status: accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed, txnId: transactionRes.txnId, nonce: BigInt(transactionRes.nonce), identifiedBy: transactionRes.identifiedBy, timestamp: new Date().getTime(), - isSingletonDeploy: !!accountOp.calls.find((call) => call.to && getAddress(call.to) === SINGLETON) + isSingletonDeploy: !!accountOp.calls.find((call) => call.to && (0, ethers_1.getAddress)(call.to) === deploy_1.SINGLETON) }; await this.activity.addAccountOp(submittedAccountOp); this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp); @@ -1979,10 +1983,10 @@ export class MainController extends EventEmitter { get banners() { if (!this.selectedAccount.account || !this.networks.isInitialized) return []; - const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(this.selectedAccount.account.addr, this.swapAndBridge.activeRoutes); + const activeSwapAndBridgeRoutesForSelectedAccount = (0, swapAndBridge_1.getActiveRoutesForAccount)(this.selectedAccount.account.addr, this.swapAndBridge.activeRoutes); const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter((r) => r.routeStatus === 'ready'); - const accountOpBanners = getAccountOpBanners({ - accountOpActionsByNetwork: getAccountOpActionsByNetwork(this.selectedAccount.account.addr, this.actions.actionsQueue), + const accountOpBanners = (0, banners_1.getAccountOpBanners)({ + accountOpActionsByNetwork: (0, actions_1.getAccountOpActionsByNetwork)(this.selectedAccount.account.addr, this.actions.actionsQueue), selectedAccount: this.selectedAccount.account.addr, accounts: this.accounts.accounts, networks: this.networks.networks, @@ -2026,20 +2030,20 @@ export class MainController extends EventEmitter { } } if (!message) { - message = getHumanReadableBroadcastError(_err || new Error('')).message; + message = (0, errorHumanizer_1.getHumanReadableBroadcastError)(_err || new Error('')).message; // if the message states that the paymaster doesn't have sufficient amount, // add it to the failedPaymasters to disable it until a top-up is made - if (message.includes(insufficientPaymasterFunds) && provider && network) { - failedPaymasters.addInsufficientFunds(provider, network).then(() => { + if (message.includes(errors_1.insufficientPaymasterFunds) && provider && network) { + FailedPaymasters_1.failedPaymasters.addInsufficientFunds(provider, network).then(() => { this.estimateSignAccountOp(); }); } } // To enable another try for signing in case of broadcast fail // broadcast is called in the FE only after successful signing - this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow); + this.signAccountOp?.updateStatus(signAccountOp_1.SigningStatus.ReadyToSign, isReplacementFeeLow); this.feePayerKey = null; - return Promise.reject(new EmittableError({ level: 'major', message, error: _err || new Error(message) })); + return Promise.reject(new EmittableError_1.default({ level: 'major', message, error: _err || new Error(message) })); } get isSignRequestStillActive() { if (!this.signAccountOp) @@ -2056,4 +2060,5 @@ export class MainController extends EventEmitter { }; } } +exports.MainController = MainController; //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/src/controllers/main/main.js.map b/dist/src/controllers/main/main.js.map index aaa053c11..f14dcc60f 100644 --- a/dist/src/controllers/main/main.js.map +++ b/dist/src/controllers/main/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/brace-style */\n\nimport { ethErrors } from 'eth-rpc-errors'\nimport { getAddress, getBigInt, Interface, isAddress } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'\nimport { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'\nimport {\n BIP44_LEDGER_DERIVATION_TEMPLATE,\n BIP44_STANDARD_DERIVATION_TEMPLATE\n} from '../../consts/derivation'\nimport {\n Account,\n AccountId,\n AccountOnchainState,\n AccountWithNetworkMeta\n} from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n ExternalSignerControllers,\n Key,\n KeystoreSignerType,\n TxnRequest\n} from '../../interfaces/keystore'\nimport { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Storage } from '../../interfaces/storage'\nimport { SocketAPISendTransactionRequest } from '../../interfaces/swapAndBridge'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport { WindowManager } from '../../interfaces/window'\nimport { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport {\n AccountOpIdentifiedBy,\n getDappIdentifier,\n pollTxnId,\n SubmittedAccountOp\n} from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport {\n dappRequestMethodToActionKind,\n getAccountOpActionsByNetwork,\n getAccountOpFromAction\n} from '../../libs/actions/actions'\nimport { getAccountOpBanners } from '../../libs/banners/banners'\nimport { getPaymasterService } from '../../libs/erc7677/erc7677'\nimport {\n getHumanReadableBroadcastError,\n getHumanReadableEstimationError\n} from '../../libs/errorHumanizer'\nimport { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'\nimport { estimate } from '../../libs/estimate/estimate'\nimport { EstimateResult } from '../../libs/estimate/interfaces'\nimport { GasRecommendation, getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'\nimport { humanizeAccountOp } from '../../libs/humanizer'\nimport { KeyIterator } from '../../libs/keyIterator/keyIterator'\nimport {\n ACCOUNT_SWITCH_USER_REQUEST,\n buildSwitchAccountUserRequest,\n getAccountOpsForSimulation,\n makeBasicAccountOpAction,\n makeSmartAccountOpAction\n} from '../../libs/main/main'\nimport { relayerAdditionalNetworks } from '../../libs/networks/networks'\nimport { GetOptions, TokenResult } from '../../libs/portfolio/interfaces'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { parse } from '../../libs/richJson/richJson'\nimport { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'\nimport {\n adjustEntryPointAuthorization,\n getEntryPointAuthorization\n} from '../../libs/signMessage/signMessage'\nimport {\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { debugTraceCall } from '../../libs/tracer/debugTraceCall'\nimport {\n buildClaimWalletRequest,\n buildMintVestingRequest,\n buildTransferUserRequest\n} from '../../libs/transfer/userRequest'\nimport {\n ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n isErc4337Broadcast,\n shouldAskForEntryPointAuthorization\n} from '../../libs/userOperation/userOperation'\nimport { getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { SocketAPI } from '../../services/socket/api'\nimport { getIsViewOnly } from '../../utils/accounts'\nimport shortenAddress from '../../utils/shortenAddress'\nimport wait from '../../utils/wait'\nimport { AccountAdderController } from '../accountAdder/accountAdder'\nimport { AccountsController } from '../accounts/accounts'\nimport {\n AccountOpAction,\n ActionExecutionType,\n ActionPosition,\n ActionsController,\n SignMessageAction\n} from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport { AddressBookController } from '../addressBook/addressBook'\nimport { DappsController } from '../dapps/dapps'\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport { DomainsController } from '../domains/domains'\nimport { EmailVaultController } from '../emailVault/emailVault'\nimport EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n/* eslint-disable no-underscore-dangle */\nimport { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'\nimport { SignMessageController } from '../signMessage/signMessage'\nimport { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'\n\nconst STATUS_WRAPPED_METHODS = {\n onAccountAdderSuccess: 'INITIAL',\n signAccountOp: 'INITIAL',\n broadcastSignedAccountOp: 'INITIAL',\n removeAccount: 'INITIAL',\n handleAccountAdderInitLedger: 'INITIAL',\n handleAccountAdderInitLattice: 'INITIAL',\n importSmartAccountFromDefaultSeed: 'INITIAL',\n buildSwapAndBridgeUserRequest: 'INITIAL',\n importSmartAccountFromSavedSeed: 'INITIAL',\n selectAccount: 'INITIAL'\n} as const\n\nexport class MainController extends EventEmitter {\n #storage: Storage\n\n fetch: Fetch\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n callRelayer: Function\n\n isReady: boolean = false\n\n invite: InviteController\n\n keystore: KeystoreController\n\n /**\n * Hardware wallets (usually) need an additional (external signer) controller,\n * that is app-specific (web, mobile) and is used to interact with the device.\n * (example: LedgerController, TrezorController, LatticeController)\n */\n #externalSignerControllers: ExternalSignerControllers = {}\n\n // Subcontrollers\n networks: NetworksController\n\n providers: ProvidersController\n\n accountAdder: AccountAdderController\n\n portfolio: PortfolioController\n\n defiPositions: DefiPositionsController\n\n dapps: DappsController\n\n actions: ActionsController\n\n // Public sub-structures\n // @TODO emailVaults\n emailVault: EmailVaultController\n\n signMessage: SignMessageController\n\n swapAndBridge: SwapAndBridgeController\n\n signAccountOp: SignAccountOpController | null = null\n\n signAccOpInitError: string | null = null\n\n activity: ActivityController\n\n addressBook: AddressBookController\n\n domains: DomainsController\n\n accounts: AccountsController\n\n selectedAccount: SelectedAccountController\n\n userRequests: UserRequest[] = []\n\n userRequestWaitingAccountSwitch: UserRequest[] = []\n\n // network => GasRecommendation[]\n gasPrices: { [key: string]: GasRecommendation[] } = {}\n\n // network => BundlerGasPrice\n bundlerGasPrices: { [key: string]: { speeds: GasSpeeds; bundler: BUNDLER } } = {}\n\n accountOpsToBeConfirmed: { [key: string]: { [key: string]: AccountOp } } = {}\n\n // TODO: Temporary solution to expose the fee payer key during Account Op broadcast.\n feePayerKey: Key | null = null\n\n lastUpdate: Date = new Date()\n\n isOffline: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n #signAccountOpSigningPromise?: Promise\n\n #signAccountOpBroadcastPromise?: Promise\n\n constructor({\n storage,\n fetch,\n relayerUrl,\n velcroUrl,\n socketApiKey,\n keystoreSigners,\n externalSignerControllers,\n windowManager,\n notificationManager\n }: {\n storage: Storage\n fetch: Fetch\n relayerUrl: string\n velcroUrl: string\n socketApiKey: string\n keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n externalSignerControllers: ExternalSignerControllers\n windowManager: WindowManager\n notificationManager: NotificationManager\n }) {\n super()\n this.#storage = storage\n this.fetch = fetch\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n\n this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage })\n this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager)\n this.#externalSignerControllers = externalSignerControllers\n this.networks = new NetworksController(\n this.#storage,\n this.fetch,\n async (network: Network) => {\n this.providers.setProvider(network)\n await this.reloadSelectedAccount({ networkId: network.id })\n },\n (networkId: NetworkId) => {\n this.providers.removeProvider(networkId)\n }\n )\n this.providers = new ProvidersController(this.networks)\n this.accounts = new AccountsController(\n this.#storage,\n this.providers,\n this.networks,\n async (accounts) => {\n const defaultSelectedAccount = getDefaultSelectedAccount(accounts)\n if (defaultSelectedAccount) {\n await this.#selectAccount(defaultSelectedAccount.addr)\n }\n },\n this.providers.updateProviderIsWorking.bind(this.providers),\n this.#updateIsOffline.bind(this)\n )\n this.selectedAccount = new SelectedAccountController({\n storage: this.#storage,\n accounts: this.accounts\n })\n this.portfolio = new PortfolioController(\n this.#storage,\n this.fetch,\n this.providers,\n this.networks,\n this.accounts,\n relayerUrl,\n velcroUrl\n )\n this.defiPositions = new DefiPositionsController({\n fetch: this.fetch,\n storage,\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n providers: this.providers\n })\n this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore)\n this.accountAdder = new AccountAdderController({\n accounts: this.accounts,\n keystore: this.keystore,\n networks: this.networks,\n providers: this.providers,\n relayerUrl,\n fetch: this.fetch\n })\n this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount)\n this.signMessage = new SignMessageController(\n this.keystore,\n this.providers,\n this.networks,\n this.accounts,\n this.#externalSignerControllers\n )\n const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch })\n this.dapps = new DappsController(this.#storage)\n this.actions = new ActionsController({\n selectedAccount: this.selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose: () => {\n const userRequestsToRejectOnWindowClose = this.userRequests.filter(\n (r) => r.action.kind !== 'calls'\n )\n userRequestsToRejectOnWindowClose.forEach((r) =>\n r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())\n )\n this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls')\n this.userRequestWaitingAccountSwitch = []\n this.emitUpdate()\n }\n })\n this.selectedAccount.initControllers({\n portfolio: this.portfolio,\n defiPositions: this.defiPositions,\n actions: this.actions,\n networks: this.networks,\n providers: this.providers\n })\n\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch })\n this.activity = new ActivityController(\n this.#storage,\n this.fetch,\n this.callRelayer,\n this.accounts,\n this.selectedAccount,\n this.providers,\n this.networks,\n async (network: Network) => {\n await this.setContractsDeployedToTrueIfDeployed(network)\n }\n )\n this.swapAndBridge = new SwapAndBridgeController({\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n activity: this.activity,\n invite: this.invite,\n socketAPI,\n storage: this.#storage,\n actions: this.actions\n })\n this.domains = new DomainsController(this.providers.providers)\n this.#initialLoadPromise = this.#load()\n paymasterFactory.init(relayerUrl, fetch, (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n })\n }\n\n /**\n * - Updates the selected account's account state, portfolio and defi positions\n * - Calls batchReverseLookup for all accounts\n *\n * It's not a problem to call it many times consecutively as all methods have internal\n * caching mechanisms to prevent unnecessary calls.\n */\n onLoad(isFirstLoad: boolean = false) {\n const selectedAccountAddr = this.selectedAccount.account?.addr\n const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length\n this.defiPositions.updatePositions()\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n if (!hasBroadcastedButNotConfirmed) {\n this.updateSelectedAccountPortfolio()\n }\n // The first time the app loads, we update the account state elsewhere\n if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading)\n this.accounts.updateAccountState(selectedAccountAddr)\n }\n\n async #load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n await this.networks.initialLoadPromise\n await this.providers.initialLoadPromise\n await this.accounts.initialLoadPromise\n await this.selectedAccount.initialLoadPromise\n\n this.onLoad(true)\n /**\n * Listener that gets triggered as a finalization step of adding new\n * accounts via the AccountAdder controller flow.\n *\n * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these\n * changes are reflected for view-only accounts as well. Because the\n * view-only accounts import flow bypasses the AccountAdder, this method\n * won't click for them. Their on add success flow continues in the\n * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case.\n */\n const onAccountAdderSuccess = () => {\n if (this.accountAdder.addAccountsStatus !== 'SUCCESS') return\n\n return this.withStatus(\n 'onAccountAdderSuccess',\n async () => {\n // Add accounts first, because some of the next steps have validation\n // if accounts exists.\n await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts)\n\n // Then add keys, because some of the next steps could have validation\n // if keys exists. Should be separate (not combined in Promise.all,\n // since firing multiple keystore actions is not possible\n // (the #wrapKeystoreAction listens for the first one to finish and\n // skips the parallel one, if one is requested).\n\n await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal)\n await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external)\n\n // Update the saved seed `hdPathTemplate` if accounts were added from\n // the saved seed, so when user opts in to \"Import a new Smart Account\n // from the saved Seed Phrase\" the next account is derived based\n // on the latest `hdPathTemplate` chosen in the AccountAdder.\n if (this.accountAdder.isInitializedWithSavedSeed)\n this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n if (this.keystore.hasKeystoreTempSeed)\n this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n },\n true\n )\n }\n this.accountAdder.onUpdate(onAccountAdderSuccess)\n\n this.isReady = true\n this.emitUpdate()\n }\n\n lock() {\n this.keystore.lock()\n this.emailVault.cleanMagicAndSessionKeys()\n this.selectedAccount.setDashboardNetworkFilter(null)\n }\n\n async selectAccount(toAccountAddr: string) {\n await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true)\n }\n\n async #selectAccount(toAccountAddr: string | null) {\n await this.#initialLoadPromise\n if (!toAccountAddr) {\n await this.selectedAccount.setAccount(null)\n\n this.emitUpdate()\n return\n }\n\n const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr)\n if (!accountToSelect) {\n console.error(`Account with address ${toAccountAddr} does not exist`)\n return\n }\n\n this.isOffline = false\n // call closeActionWindow while still on the currently selected account to allow proper\n // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl...\n if (this.actions?.currentAction?.type !== 'switchAccount') {\n this.actions.closeActionWindow()\n }\n this.selectedAccount.setAccount(accountToSelect)\n this.swapAndBridge.onAccountChange()\n this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr])\n // forceEmitUpdate to update the getters in the FE state of the ctrl\n await this.forceEmitUpdate()\n await this.actions.forceEmitUpdate()\n await this.addressBook.forceEmitUpdate()\n // Don't await these as they are not critical for the account selection\n // and if the user decides to quickly change to another account withStatus\n // will block the UI until these are resolved.\n this.reloadSelectedAccount({ forceUpdate: false })\n this.emitUpdate()\n }\n\n async importSmartAccountFromSavedSeed(seed?: string) {\n await this.withStatus(\n 'importSmartAccountFromSavedSeed',\n async () => {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n if (seed && !this.keystore.hasKeystoreSavedSeed) {\n await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE })\n }\n\n const savedSeed = await this.keystore.getSavedSeed()\n if (!savedSeed) {\n throw new EmittableError({\n message:\n 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.',\n level: 'major',\n error: new Error('failed to retrieve saved seed phrase from keystore')\n })\n }\n\n const keyIterator = new KeyIterator(savedSeed.seed)\n await this.accountAdder.init({\n keyIterator,\n hdPathTemplate: savedSeed.hdPathTemplate,\n pageSize: 1,\n shouldGetAccountsUsedOnNetworks: false,\n shouldSearchForLinkedAccounts: false\n })\n\n let currentPage: number = 1\n let isAccountAlreadyAdded: boolean\n let nextSmartAccount: AccountWithNetworkMeta | undefined\n\n const findNextSmartAccount = async () => {\n do {\n // eslint-disable-next-line no-await-in-loop\n await this.accountAdder.setPage({ page: currentPage })\n\n nextSmartAccount = this.accountAdder.accountsOnPage.find(\n ({ isLinked, account }) => !isLinked && isSmartAccount(account)\n )?.account\n\n if (!nextSmartAccount) break\n\n isAccountAlreadyAdded = !!this.accounts.accounts.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n (a) => a.addr === nextSmartAccount!.addr\n )\n\n currentPage++\n } while (isAccountAlreadyAdded)\n }\n\n await findNextSmartAccount()\n\n if (!nextSmartAccount) {\n throw new EmittableError({\n message:\n 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.',\n level: 'major',\n error: new Error('Internal error: Failed to find a smart account to add')\n })\n }\n\n this.accountAdder.selectAccount(nextSmartAccount)\n\n const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts()\n\n await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, {\n internal: readyToAddKeys,\n external: []\n })\n },\n true\n )\n }\n\n initSignAccOp(actionId: AccountOpAction['id']): null | void {\n const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue)\n if (!accountOp) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'\n return null\n }\n\n const network = this.networks.networks.find((net) => net.id === accountOp.networkId)\n\n if (\n !this.selectedAccount.account ||\n this.selectedAccount.account.addr !== accountOp.accountAddr\n ) {\n this.signAccOpInitError =\n 'Attempting to initialize an accountOp for an account other than the currently selected one.'\n return null\n }\n\n if (!network) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process as we are unable to locate the specified network.'\n return null\n }\n\n // on init, set the accountOp nonce to the latest one we know\n // it could happen that the user inits a userRequest with an old\n // accountState and therefore caching the old nonce in the accountOp.\n // we make sure the latest nonce is set when initing signAccountOp\n const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]\n if (state) accountOp.nonce = state.nonce\n\n this.signAccOpInitError = null\n\n this.signAccountOp = new SignAccountOpController(\n this.accounts,\n this.keystore,\n this.portfolio,\n this.#externalSignerControllers,\n this.selectedAccount.account,\n network,\n actionId,\n accountOp,\n () => {\n this.estimateSignAccountOp()\n },\n () => {\n return this.isSignRequestStillActive\n }\n )\n\n this.emitUpdate()\n\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n }\n\n async handleSignAndBroadcastAccountOp() {\n await this.withStatus(\n 'signAccountOp',\n async () => {\n const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done\n if (wasAlreadySigned) return Promise.resolve()\n\n if (!this.signAccountOp) {\n const message =\n 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'\n const error = new Error('SignAccountOp is not initialized')\n this.emitError({ level: 'major', message, error })\n return Promise.reject(error)\n }\n\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => {\n this.#signAccountOpSigningPromise = undefined\n })\n\n return this.#signAccountOpSigningPromise\n },\n true\n )\n\n // Error handling on the prev step will notify the user, it's fine to return here\n if (this.signAccountOp?.status?.type !== SigningStatus.Done) return\n\n return this.withStatus(\n 'broadcastSignedAccountOp',\n async () => {\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => {\n this.#signAccountOpBroadcastPromise = undefined\n })\n return this.#signAccountOpBroadcastPromise\n },\n true\n )\n }\n\n destroySignAccOp() {\n if (!this.signAccountOp) return\n\n this.feePayerKey = null\n this.signAccountOp = null\n this.signAccOpInitError = null\n\n // NOTE: no need to update the portfolio here as an update is\n // fired upon removeUserRequest\n\n this.emitUpdate()\n }\n\n async traceCall(estimation: EstimateResult) {\n const accountOp = this.signAccountOp?.accountOp\n if (!accountOp) return\n\n const network = this.networks.networks.find((net) => net.id === accountOp?.networkId)\n if (!network) return\n\n try {\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)!\n const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n const provider = this.providers.providers[network.id]\n const gasPrice = this.gasPrices[network.id]\n const { tokens, nfts } = await debugTraceCall(\n account,\n accountOp,\n provider,\n state,\n estimation.gasUsed,\n gasPrice,\n !network.rpcNoStateOverride\n )\n const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id)\n const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id)\n // update the portfolio only if new tokens were found through tracing\n if (learnedNewTokens || learnedNewNfts) {\n this.portfolio\n .updateSelectedAccount(\n accountOp.accountAddr,\n network,\n getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n accountOp\n ),\n { forceUpdate: true }\n )\n // fire an update request to refresh the warnings if any\n .then(() => this.signAccountOp?.update({}))\n }\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: 'Error in main.traceCall',\n error: e\n })\n }\n }\n\n async handleSignMessage() {\n const accountAddr = this.signMessage.messageToSign?.accountAddr\n const networkId = this.signMessage.messageToSign?.networkId\n\n // Could (rarely) happen if not even a single account state is fetched yet\n const shouldForceUpdateAndWaitForAccountState =\n accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (shouldForceUpdateAndWaitForAccountState)\n await this.accounts.updateAccountState(accountAddr, 'latest', [networkId])\n\n const isAccountStateStillMissing =\n !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (isAccountStateStillMissing) {\n const message =\n 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'\n const error = new Error(\n `The account state of ${accountAddr} is missing for the network with id ${networkId}.`\n )\n return this.emitError({ level: 'major', message, error })\n }\n\n await this.signMessage.sign()\n\n const signedMessage = this.signMessage.signedMessage\n // Error handling on the prev step will notify the user, it's fine to return here\n if (!signedMessage) return\n\n if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0],\n networkId: signedMessage.networkId,\n nonce:\n this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}\n accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(\n signedMessage.signature as string\n )\n\n this.actions.addOrUpdateAction(accountOpAction, 'first')\n }\n\n await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr)\n await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId)\n\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The Message was successfully signed.'\n })\n }\n\n async #handleAccountAdderInitLedger(\n LedgerKeyIterator: any // TODO: KeyIterator type mismatch\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const ledgerCtrl = this.#externalSignerControllers.ledger\n if (!ledgerCtrl) {\n const message =\n 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n // Once a session with the Ledger device gets initiated, the user might\n // use the device with another app. In this scenario, when coming back to\n // Ambire (the second time a connection gets requested onwards),\n // the Ledger device throws with \"invalid channel\" error.\n // To overcome this, always make sure to clean up before starting\n // a new session when retrieving keys, in case there already is one.\n if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp()\n\n const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE\n await ledgerCtrl.unlock(hdPathTemplate)\n\n if (!ledgerCtrl.walletSDK) {\n const message = 'Could not establish connection with the Ledger device'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl })\n await this.accountAdder.init({ keyIterator, hdPathTemplate })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Ledger device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLedger(LedgerKeyIterator: any /* TODO: KeyIterator type mismatch */) {\n await this.withStatus('handleAccountAdderInitLedger', async () =>\n this.#handleAccountAdderInitLedger(LedgerKeyIterator)\n )\n }\n\n async #handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const latticeCtrl = this.#externalSignerControllers.lattice\n if (!latticeCtrl) {\n const message =\n 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE\n await latticeCtrl.unlock(hdPathTemplate, undefined, true)\n\n const { walletSDK } = latticeCtrl\n await this.accountAdder.init({\n keyIterator: new LatticeKeyIterator({ walletSDK }),\n hdPathTemplate\n })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n await this.withStatus('handleAccountAdderInitLattice', async () =>\n this.#handleAccountAdderInitLattice(LatticeKeyIterator)\n )\n }\n\n async updateAccountsOpsStatuses(): Promise<{ newestOpTimestamp: number }> {\n await this.#initialLoadPromise\n\n const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } =\n await this.activity.updateAccountsOpsStatuses()\n\n if (shouldEmitUpdate) {\n this.emitUpdate()\n\n if (shouldUpdatePortfolio) {\n this.updateSelectedAccountPortfolio(true)\n }\n }\n\n updatedAccountsOps.forEach((op) => {\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op)\n })\n\n return { newestOpTimestamp }\n }\n\n // call this function after a call to the singleton has been made\n // it will check if the factory has been deployed and update the network settings if it has been\n async setContractsDeployedToTrueIfDeployed(network: Network) {\n await this.#initialLoadPromise\n if (network.areContractsDeployed) return\n\n const provider = this.providers.providers[network.id]\n if (!provider) return\n\n const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY)\n if (factoryCode === '0x') return\n await this.networks.updateNetwork({ areContractsDeployed: true }, network.id)\n }\n\n #removeAccountKeyData(address: Account['addr']) {\n // Compute account keys that are only associated with this account\n const accountAssociatedKeys =\n this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []\n const keysInKeystore = this.keystore.keys\n const importedAccountKeys = keysInKeystore.filter((key) =>\n accountAssociatedKeys.includes(key.addr)\n )\n const solelyAccountKeys = importedAccountKeys.filter((key) => {\n const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some(\n (acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)\n )\n\n return !isKeyAssociatedWithOtherAccounts\n })\n\n // Remove account keys from the keystore\n solelyAccountKeys.forEach((key) => {\n this.keystore.removeKey(key.addr, key.type).catch((e) => {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account key',\n error: e\n })\n })\n })\n }\n\n async removeAccount(address: Account['addr']) {\n await this.withStatus('removeAccount', async () => {\n try {\n this.#removeAccountKeyData(address)\n // Remove account data from sub-controllers\n await this.accounts.removeAccountData(address)\n this.portfolio.removeAccountData(address)\n await this.activity.removeAccountData(address)\n this.actions.removeAccountData(address)\n this.signMessage.removeAccountData(address)\n this.defiPositions.removeAccountData(address)\n\n if (this.selectedAccount.account?.addr === address) {\n await this.#selectAccount(this.accounts.accounts[0]?.addr)\n }\n\n if (this.signAccountOp?.account.addr === address) {\n this.destroySignAccOp()\n }\n\n this.emitUpdate()\n } catch (e: any) {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account',\n error: e || new Error('Failed to remove account')\n })\n }\n })\n }\n\n async #ensureAccountInfo(accountAddr: AccountId, networkId: NetworkId) {\n await this.#initialLoadPromise\n // Initial sanity check: does this account even exist?\n if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) {\n this.signAccOpInitError = `Account ${accountAddr} does not exist`\n return\n }\n // If this still didn't work, re-load\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n await this.accounts.updateAccountState(accountAddr, 'pending', [networkId])\n // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`\n }\n\n #batchCallsFromUserRequests(accountAddr: AccountId, networkId: NetworkId): Call[] {\n // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind\n return (this.userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n }\n\n async reloadSelectedAccount(\n options: {\n forceUpdate?: boolean\n networkId?: NetworkId\n } = {\n forceUpdate: true,\n networkId: undefined\n }\n ) {\n const { forceUpdate, networkId } = options\n const networkToUpdate = networkId\n ? this.networks.networks.find((n) => n.id === networkId)\n : undefined\n if (!this.selectedAccount.account) return\n\n this.selectedAccount.resetSelectedAccountPortfolio()\n await Promise.all([\n // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon),\n // it's very likely that the account state is already in the process of being updated.\n // If we try to run the same action, `withStatus` validation will throw an error.\n // So, we perform this safety check to prevent the error.\n // However, even if we don't trigger an update here, it's not a big problem,\n // as the account state will be updated anyway, and its update will be very recent.\n !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr\n ? this.accounts.updateAccountState(\n this.selectedAccount.account.addr,\n 'pending',\n networkId ? [networkId] : undefined\n )\n : Promise.resolve(),\n // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally,\n // as the PortfolioController already exposes flags that are highly sufficient for the UX.\n // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard),\n // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper.\n this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate),\n this.defiPositions.updatePositions(networkId)\n ])\n }\n\n #updateIsOffline() {\n const oldIsOffline = this.isOffline\n const accountAddr = this.selectedAccount.account?.addr\n\n if (!accountAddr) return\n\n // We have to make calculations based on the state of the portfolio\n // and not the selected account portfolio the flag isOffline\n // and the errors of the selected account portfolio should\n // come in the same tick. Otherwise the UI may flash the wrong error.\n const latestState = this.portfolio.getLatestPortfolioState(accountAddr)\n const latestStateKeys = Object.keys(latestState)\n\n const isAllReady = latestStateKeys.every((networkId) => {\n return isNetworkReady(latestState[networkId])\n })\n\n if (!isAllReady) return\n\n const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => {\n const state = latestState[networkId]\n\n return !!state?.criticalError\n })\n\n const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => {\n const provider = this.providers.providers[networkId]\n const isWorking = provider.isWorking\n\n return typeof isWorking === 'boolean' && !isWorking\n })\n\n // Update isOffline if either all portfolio networks have errors or we've failed to fetch\n // the account state for every account. This is because either update may fail first.\n this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors\n\n if (oldIsOffline !== this.isOffline) {\n this.emitUpdate()\n }\n }\n\n // eslint-disable-next-line default-param-last\n async updateSelectedAccountPortfolio(forceUpdate: boolean = false, network?: Network) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId\n const networkData =\n network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n this.selectedAccount.account,\n this.actions.visibleActionsQueue,\n networkData,\n this.signAccountOp?.accountOp\n )\n\n await this.portfolio.updateSelectedAccount(\n this.selectedAccount.account.addr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate }\n )\n this.#updateIsOffline()\n }\n\n #getUserRequestAccountError(dappOrigin: string, fromAccountAddr: string): string | null {\n if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) {\n const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr)\n\n if (isAddressInAccounts) return null\n\n return 'The dApp is trying to sign using an address that is not imported in the extension.'\n }\n const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr\n\n if (isAddressSelected) return null\n\n return 'The dApp is trying to sign using an address that is not selected in the extension.'\n }\n\n async buildUserRequestFromDAppRequest(\n request: DappProviderRequest,\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n ) {\n await this.#initialLoadPromise\n let userRequest = null\n let actionPosition: ActionPosition = 'last'\n const kind = dappRequestMethodToActionKind(request.method)\n const dapp = this.dapps.getDapp(request.origin)\n\n if (kind === 'calls') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n const isWalletSendCalls = !!request.params[0].calls\n const accountAddr = getAddress(request.params[0].from)\n\n const calls: Calls['calls'] = isWalletSendCalls\n ? request.params[0].calls\n : [request.params[0]]\n const paymasterService = isWalletSendCalls\n ? getPaymasterService(network.chainId, request.params[0].capabilities)\n : null\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data || '0x',\n value: call.value ? getBigInt(call.value) : 0n\n }))\n },\n meta: {\n isSignAction: true,\n isWalletSendCalls,\n accountAddr,\n networkId: network.id,\n paymasterService\n },\n dappPromise\n } as SignUserRequest\n if (!this.selectedAccount.account.creation) {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n } else if (kind === 'message') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[1])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'message',\n message: msg[0]\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else if (kind === 'typedMessage') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[0])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n let typedData = msg?.[1]\n\n try {\n typedData = parse(typedData)\n } catch (error) {\n throw ethErrors.rpc.invalidRequest('Invalid typedData provided')\n }\n\n if (\n !typedData?.types ||\n !typedData?.domain ||\n !typedData?.message ||\n !typedData?.primaryType\n ) {\n throw ethErrors.rpc.methodNotSupported(\n 'Invalid typedData format - only typedData v4 is supported'\n )\n }\n\n if (\n msgAddress === this.selectedAccount.account.addr &&\n (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)\n ) {\n throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'typedMessage',\n types: typedData.types,\n domain: typedData.domain,\n message: typedData.message,\n primaryType: typedData.primaryType\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else {\n userRequest = {\n id: new Date().getTime(),\n session: request.session,\n action: { kind, params: request.params },\n meta: { isSignAction: false },\n dappPromise\n } as DappUserRequest\n }\n\n if (userRequest.action.kind !== 'calls') {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n\n if (!userRequest) return\n\n const isASignOperationRequestedForAnotherAccount =\n userRequest.meta.isSignAction &&\n userRequest.meta.accountAddr !== this.selectedAccount.account?.addr\n\n // We can simply add the user request if it's not a sign operation\n // for another account\n if (!isASignOperationRequestedForAnotherAccount) {\n await this.addUserRequest(\n userRequest,\n actionPosition,\n actionPosition === 'first' || isSmartAccount(this.selectedAccount.account)\n ? 'open-action-window'\n : 'queue-but-open-action-window'\n )\n return\n }\n\n const accountError = this.#getUserRequestAccountError(\n dappPromise.session.origin,\n userRequest.meta.accountAddr\n )\n\n if (accountError) {\n dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError))\n return\n }\n\n const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId))\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n this.userRequestWaitingAccountSwitch.push(userRequest)\n await this.addUserRequest(\n buildSwitchAccountUserRequest({\n nextUserRequest: userRequest,\n networkId: network.id,\n selectedAccountAddr: userRequest.meta.accountAddr,\n session: dappPromise.session,\n dappPromise\n }),\n 'last',\n 'open-action-window'\n )\n }\n\n async buildTransferUserRequest(\n amount: string,\n recipientAddress: string,\n selectedToken: TokenResult,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const userRequest = buildTransferUserRequest({\n selectedAccount: this.selectedAccount.account.addr,\n amount,\n selectedToken,\n recipientAddress\n })\n\n if (!userRequest) {\n this.emitError({\n level: 'major',\n message: 'Unexpected error while building transfer request',\n error: new Error(\n 'buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest'\n )\n })\n return\n }\n\n await this.addUserRequest(userRequest, 'last', actionExecutionType)\n }\n\n async buildSwapAndBridgeUserRequest(activeRouteId?: number) {\n await this.withStatus(\n 'buildSwapAndBridgeUserRequest',\n async () => {\n if (!this.selectedAccount.account) return\n let transaction: SocketAPISendTransactionRequest | null | undefined = null\n\n const activeRoute = this.swapAndBridge.activeRoutes.find(\n (r) => r.activeRouteId === activeRouteId\n )\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n transaction = await this.swapAndBridge.getRouteStartUserTx()\n }\n\n if (activeRoute) {\n this.removeUserRequest(activeRoute.activeRouteId, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined })\n if (!isSmartAccount(this.selectedAccount.account)) {\n this.removeUserRequest(`${activeRouteId}-revoke-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.removeUserRequest(`${activeRouteId}-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n }\n transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId)\n }\n\n if (!this.selectedAccount.account || !transaction) {\n const errorDetails = `missing ${\n this.selectedAccount.account ? 'selected account' : 'transaction'\n } info`\n const error = new SwapAndBridgeError(\n `Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`\n )\n throw new EmittableError({ message: error.message, level: 'major', error })\n }\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === transaction!.chainId\n )!\n\n // TODO: Consider refining the error handling in here, because this\n // swallows errors and doesn't provide any feedback to the user.\n const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(\n transaction,\n network.id,\n this.selectedAccount.account,\n this.providers.providers[network.id]\n )\n\n for (let i = 0; i < swapAndBridgeUserRequests.length; i++) {\n if (i === 0) {\n this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window')\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue')\n }\n }\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n await this.swapAndBridge.addActiveRoute({\n activeRouteId: transaction.activeRouteId,\n userTxIndex: transaction.userTxIndex\n })\n }\n\n if (activeRouteId) {\n this.swapAndBridge.updateActiveRoute(\n activeRouteId,\n {\n userTxIndex: transaction.userTxIndex,\n userTxHash: null\n },\n true\n )\n }\n },\n true\n )\n }\n\n buildClaimWalletUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const claimableRewardsData =\n this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData\n\n if (!claimableRewardsData) return\n\n const userRequest: UserRequest = buildClaimWalletRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n claimableRewardsData\n })\n\n this.addUserRequest(userRequest)\n }\n\n buildMintVestingUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData\n\n if (!addrVestingData) return\n const userRequest: UserRequest = buildMintVestingRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n addrVestingData\n })\n\n this.addUserRequest(userRequest)\n }\n\n resolveUserRequest(data: any, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return // TODO: emit error\n\n userRequest.dappPromise?.resolve(data)\n // These requests are transitionary initiated internally (not dApp requests) that block dApp requests\n // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives\n if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) {\n setTimeout(() => {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }, 300)\n } else {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }\n }\n\n rejectUserRequest(err: string, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return\n\n if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n this.userRequests = this.userRequests.filter(\n (r) =>\n !(\n r.action.kind === 'calls' &&\n r.meta.accountAddr === userRequest.meta.accountAddr &&\n r.meta.networkId === userRequest.meta.networkId\n )\n )\n }\n\n // if the userRequest that is about to be removed is an approval request\n // find and remove the associated pending transaction request if there is any\n // this is valid scenario for a swap & bridge txs with a BA\n if (userRequest.action.kind === 'calls') {\n const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr)!\n\n if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) {\n this.removeUserRequest(userRequest.meta.activeRouteId)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`)\n }\n }\n\n userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err))\n this.removeUserRequest(requestId)\n }\n\n rejectSignAccountOpCall(callId: string) {\n if (!this.signAccountOp) return\n\n const { calls, networkId, accountAddr } = this.signAccountOp.accountOp\n\n const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId\n if (requestId) {\n const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId)\n const userRequest = this.userRequests[userRequestIndex] as SignUserRequest\n if (userRequest.action.kind === 'calls') {\n ;(userRequest.action as Calls).calls = (userRequest.action as Calls).calls.filter(\n (c) => c.id !== callId\n )\n\n if (userRequest.action.calls.length === 0) {\n // the reject will remove the userRequest which will rebuild the action and update the signAccountOp\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.find((a) => a.addr === accountAddr)!,\n networkId,\n nonce: this.accounts.accountStates[accountAddr][networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n\n this.actions.addOrUpdateAction(accountOpAction)\n this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n }\n } else {\n this.emitError({\n message: 'Reject call: the call was not found or was not linked to a user request',\n level: 'major',\n error: new Error(\n `Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`\n )\n })\n }\n }\n\n removeActiveRoute(activeRouteId: number) {\n const userRequest = this.userRequests.find((r) =>\n [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(\n r.id\n )\n )\n\n if (userRequest) {\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n this.swapAndBridge.removeActiveRoute(activeRouteId)\n }\n }\n\n async addUserRequest(\n req: UserRequest,\n actionPosition: ActionPosition = 'last',\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (req.action.kind === 'calls') {\n ;(req.action as Calls).calls.forEach((_, i) => {\n ;(req.action as Calls).calls[i].id = `${req.id}-${i}`\n })\n }\n if (actionPosition === 'first') {\n this.userRequests.unshift(req)\n } else {\n this.userRequests.push(req)\n }\n\n const { id, action, meta } = req\n if (action.kind === 'calls') {\n // @TODO\n // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching\n // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network,\n // and be recalculated when one gets dismissed\n // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise;\n // 4) manage recalc on removeUserRequest too in order to handle EOAs\n // @TODO consider re-using this whole block in removeUserRequest\n await this.#ensureAccountInfo(meta.accountAddr, meta.networkId)\n if (this.signAccOpInitError) {\n return req.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message: this.signAccOpInitError\n })\n )\n }\n\n if (this.#signAccountOpSigningPromise) await this.#signAccountOpSigningPromise\n if (this.#signAccountOpBroadcastPromise) await this.#signAccountOpBroadcastPromise\n\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)!\n const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]\n\n if (isSmartAccount(account)) {\n const network = this.networks.networks.find((n) => n.id === meta.networkId)!\n\n // find me the accountOp for the network if any, it's always 1 for SA\n const currentAccountOpAction = this.actions.actionsQueue.find(\n (a) =>\n a.type === 'accountOp' &&\n a.accountOp.accountAddr === account.addr &&\n a.accountOp.networkId === network.id\n ) as AccountOpAction | undefined\n\n const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(\n account.addr,\n (message) =>\n message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n message.networkId === network.id\n )\n\n const hasAuthorized =\n !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization ||\n !!entryPointAuthorizationMessageFromHistory\n\n if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) {\n await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType)\n this.emitUpdate()\n return\n }\n\n const accountOpAction = makeSmartAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue,\n entryPointAuthorizationSignature:\n entryPointAuthorizationMessageFromHistory?.signature ?? undefined\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n if (this.signAccountOp) {\n if (this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n } else {\n // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation.\n // It's necessary to continue operating with the token `amountPostSimulation` amount.\n this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n const accountOpAction = makeBasicAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequest: req\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n }\n } else {\n let actionType: 'dappRequest' | 'benzin' | 'signMessage' | 'switchAccount' = 'dappRequest'\n\n if (req.action.kind === 'typedMessage' || req.action.kind === 'message') {\n actionType = 'signMessage'\n\n if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) {\n const msgReq = this.userRequests.find((uReq) => uReq.id === id)\n if (!msgReq) return\n msgReq.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message:\n 'Rejected: Please complete your pending message request before initiating a new one.'\n })\n )\n this.userRequests.splice(this.userRequests.indexOf(msgReq), 1)\n return\n }\n }\n if (req.action.kind === 'benzin') actionType = 'benzin'\n if (req.action.kind === 'switchAccount') actionType = 'switchAccount'\n\n this.actions.addOrUpdateAction(\n {\n id,\n type: actionType,\n userRequest: req as UserRequest as never\n },\n actionPosition,\n actionExecutionType\n )\n }\n\n this.emitUpdate()\n }\n\n // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations\n // first one sounds more reasonable\n // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue)\n removeUserRequest(\n id: UserRequest['id'],\n options: {\n shouldRemoveSwapAndBridgeRoute: boolean\n shouldUpdateAccount?: boolean\n shouldOpenNextRequest?: boolean\n } = {\n shouldRemoveSwapAndBridgeRoute: true,\n shouldUpdateAccount: true,\n shouldOpenNextRequest: true\n }\n ) {\n const req = this.userRequests.find((uReq) => uReq.id === id)\n if (!req) return\n\n // remove from the request queue\n this.userRequests.splice(this.userRequests.indexOf(req), 1)\n\n // update the pending stuff to be signed\n const { action, meta } = req\n if (action.kind === 'calls') {\n const network = this.networks.networks.find((net) => net.id === meta.networkId)!\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)\n if (!account)\n throw new Error(\n `batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`\n )\n\n if (isSmartAccount(account)) {\n const accountOpIndex = this.actions.actionsQueue.findIndex(\n (a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`\n )\n const accountOpAction = this.actions.actionsQueue[accountOpIndex] as\n | AccountOpAction\n | undefined\n // accountOp has just been rejected or broadcasted\n if (!accountOpAction) {\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n this.emitUpdate()\n return\n }\n\n accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(\n meta.accountAddr,\n meta.networkId\n )\n if (accountOpAction.accountOp.calls.length) {\n this.actions.addOrUpdateAction(accountOpAction)\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null })\n this.estimateSignAccountOp()\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(\n `${meta.accountAddr}-${meta.networkId}`,\n options.shouldOpenNextRequest\n )\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n } else if (id === ACCOUNT_SWITCH_USER_REQUEST) {\n const requestsToAdd = this.userRequestWaitingAccountSwitch.filter(\n (r) => r.meta.accountAddr === this.selectedAccount.account!.addr\n )\n this.actions.removeAction(\n id,\n this.selectedAccount.account?.addr !== (action as any).params!.switchToAccountAddr\n )\n ;(async () => {\n // eslint-disable-next-line no-restricted-syntax\n for (const r of requestsToAdd) {\n this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1)\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(r)\n }\n })()\n } else {\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n }\n this.emitUpdate()\n }\n\n async addEntryPointAuthorization(\n req: UserRequest,\n network: Network,\n accountState: AccountOnchainState,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (\n this.actions.visibleActionsQueue.find(\n (a) =>\n a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n (a as SignMessageAction).userRequest.meta.networkId === req.meta.networkId\n )\n ) {\n this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return\n }\n\n const typedMessageAction = await getEntryPointAuthorization(\n req.meta.accountAddr,\n network.chainId,\n BigInt(accountState.nonce)\n )\n await this.addUserRequest(\n {\n id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n action: typedMessageAction,\n meta: {\n isSignAction: true,\n accountAddr: req.meta.accountAddr,\n networkId: req.meta.networkId\n },\n session: req.session,\n dappPromise: req?.dappPromise\n ? { reject: req?.dappPromise?.reject, resolve: () => {} }\n : undefined\n } as SignUserRequest,\n 'first',\n actionExecutionType\n )\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.networks.addNetwork(network)\n await this.updateSelectedAccountPortfolio()\n }\n\n async removeNetwork(id: NetworkId) {\n await this.networks.removeNetwork(id)\n this.portfolio.removeNetworkData(id)\n this.defiPositions.removeNetworkData(id)\n this.accountAdder.removeNetworkData(id)\n }\n\n async resolveAccountOpAction(data: any, actionId: AccountOpAction['id']) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp } = accountOpAction as AccountOpAction\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!network) return\n\n const meta: SignUserRequest['meta'] = {\n isSignAction: true,\n accountAddr: accountOp.accountAddr,\n chainId: network.chainId,\n networkId: '',\n txnId: null,\n userOpHash: null\n }\n if (data.submittedAccountOp) {\n // can be undefined, check submittedAccountOp.ts\n meta.txnId = data.submittedAccountOp.txnId\n\n meta.identifiedBy = data.submittedAccountOp.identifiedBy\n meta.submittedAccountOp = data.submittedAccountOp\n }\n\n const benzinUserRequest: SignUserRequest = {\n id: new Date().getTime(),\n action: { kind: 'benzin' },\n meta\n }\n await this.addUserRequest(benzinUserRequest, 'first')\n\n this.actions.removeAction(actionId)\n\n // handle wallet_sendCalls before pollTxnId as 1) it's faster\n // 2) the identifier is different\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const walletSendCallsUserReq = this.userRequests.find(\n (r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls\n )\n if (walletSendCallsUserReq) {\n walletSendCallsUserReq.dappPromise?.resolve({\n hash: getDappIdentifier(data.submittedAccountOp)\n })\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(walletSendCallsUserReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n // Note: this may take a while!\n const txnId = await pollTxnId(\n data.submittedAccountOp.identifiedBy,\n network,\n this.fetch,\n this.callRelayer\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId)\n if (uReq) {\n if (txnId) {\n uReq.dappPromise?.resolve({ hash: txnId })\n } else {\n uReq.dappPromise?.reject(\n ethErrors.rpc.transactionRejected({\n message: 'Transaction rejected by the bundler'\n })\n )\n }\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(uReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n this.emitUpdate()\n }\n\n rejectAccountOpAction(\n err: string,\n actionId: AccountOpAction['id'],\n shouldOpenNextAction: boolean\n ) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp, id } = accountOpAction as AccountOpAction\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(actionId, shouldOpenNextAction)\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n if (call.fromUserRequestId) this.rejectUserRequest(err, call.fromUserRequestId)\n }\n\n this.emitUpdate()\n }\n\n async #updateGasPrice() {\n await this.#initialLoadPromise\n\n // if there's no signAccountOp initialized, we don't want to fetch gas\n const accOp = this.signAccountOp?.accountOp ?? null\n if (!accOp) return undefined\n\n const network = this.networks.networks.find((net) => net.id === accOp.networkId)\n if (!network) return undefined // shouldn't happen\n\n const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr)\n if (!account) return undefined // shouldn't happen\n\n const is4337 = isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[accOp.accountAddr][accOp.networkId]\n )\n const bundler = this.signAccountOp\n ? this.signAccountOp.bundlerSwitcher.getBundler()\n : getDefaultBundler(network)\n const bundlerFetch = async () => {\n if (!is4337) return null\n const errorCallback = (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n }\n return bundler.fetchGasPrices(network, errorCallback).catch((e) => {\n this.emitError({\n level: 'silent',\n message: \"Failed to fetch the bundler's gas price\",\n error: e\n })\n })\n }\n const [gasPriceData, bundlerGas] = await Promise.all([\n getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => {\n this.emitError({\n level: 'major',\n message: `Unable to get gas price for ${network.id}`,\n error: new Error(`Failed to fetch gas price: ${e?.message}`)\n })\n return null\n }),\n bundlerFetch()\n ])\n\n if (gasPriceData && gasPriceData.gasPrice) this.gasPrices[network.id] = gasPriceData.gasPrice\n if (bundlerGas)\n this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }\n\n return {\n blockGasLimit: gasPriceData?.blockGasLimit\n }\n }\n\n async updateSignAccountOpGasPrice() {\n if (!this.signAccountOp) return\n\n const accOp = this.signAccountOp.accountOp\n const gasData = await this.#updateGasPrice()\n\n // there's a chance signAccountOp gets destroyed between the time\n // the first \"if (!this.signAccountOp) return\" is performed and\n // the time we get here. To prevent issues, we check one more time\n if (!this.signAccountOp) return\n\n this.signAccountOp.update({\n gasPrices: this.gasPrices[accOp.networkId],\n bundlerGasPrices: this.bundlerGasPrices[accOp.networkId],\n blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined\n })\n this.emitUpdate()\n }\n\n // @TODO: protect this from race conditions/simultanous executions\n async estimateSignAccountOp() {\n try {\n if (!this.signAccountOp) return\n\n // make a local copy to avoid updating the main reference\n const localAccountOp: AccountOp = { ...this.signAccountOp.accountOp }\n\n await this.#initialLoadPromise\n // new accountOps should have spoof signatures so that they can be easily simulated\n // this is not used by the Estimator, because it iterates through all associatedKeys and\n // it knows which ones are authenticated, and it can generate it's own spoofSig\n // @TODO\n // accountOp.signature = `${}03`\n\n // TODO check if needed data in accountStates are available\n // this.accountStates[accountOp.accountAddr][accountOp.networkId].\n const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr)\n\n // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment.\n // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee.\n //\n // If the current account is an EOA, only this account can pay the fee,\n // and there's no need for checking other EOA accounts native balances.\n // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here.\n //\n // we're excluding the view only accounts from the natives to check\n // in all cases EXCEPT the case where we're making an estimation for\n // the view only account itself. In all other, view only accounts options\n // should not be present as the user cannot pay the fee with them (no key)\n const nativeToCheck = account?.creation\n ? this.accounts.accounts\n .filter(\n (acc) =>\n !isSmartAccount(acc) &&\n (acc.addr === localAccountOp.accountAddr ||\n !getIsViewOnly(this.keystore.keys, acc.associatedKeys))\n )\n .map((acc) => acc.addr)\n : []\n\n if (!account)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`\n )\n const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId)\n if (!network)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`\n )\n\n // Take the fee tokens from two places: the user's tokens and his gasTank\n // The gasTank tokens participate on each network as they belong everywhere\n // NOTE: at some point we should check all the \"?\" signs below and if\n // an error pops out, we should notify the user about it\n const networkFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[\n localAccountOp.networkId\n ]?.result?.feeTokens ?? []\n const gasTankFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result\n ?.tokens ?? []\n\n const feeTokens =\n [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []\n\n // can be read from the UI\n const humanization = humanizeAccountOp(localAccountOp, {})\n humanization.forEach((call: any) => {\n if (!call.fullVisualization) return\n\n call.fullVisualization.forEach(async (visualization: any) => {\n if (visualization.type !== 'address' || !visualization.address) return\n\n await this.domains.reverseLookup(visualization.address)\n })\n })\n\n const additionalHints: GetOptions['additionalErc20Hints'] = humanization\n .map((call: any) =>\n !call.fullVisualization\n ? []\n : call.fullVisualization.map((vis: any) =>\n vis.address && isAddress(vis.address) ? getAddress(vis.address) : ''\n )\n )\n .flat()\n .filter((x: any) => isAddress(x))\n\n this.portfolio.addTokensToBeLearned(additionalHints, network.id)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n this.signAccountOp.accountOp\n )\n\n const [, estimation] = await Promise.all([\n // NOTE: we are not emitting an update here because the portfolio controller will do that\n // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as\n // it may have different needs\n this.portfolio.updateSelectedAccount(\n localAccountOp.accountAddr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate: true }\n ),\n estimate(\n this.providers.providers[localAccountOp.networkId],\n network,\n account,\n localAccountOp,\n this.accounts.accountStates,\n nativeToCheck,\n // @TODO - first time calling this, portfolio is still not loaded.\n feeTokens,\n (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n },\n this.signAccountOp.bundlerSwitcher,\n {\n is4337Broadcast: isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]\n )\n }\n ).catch((e) => {\n const { message } = getHumanReadableEstimationError(e)\n\n this.emitError({\n level: 'major',\n message,\n error: e\n })\n return null\n })\n ])\n\n // @race\n // if the signAccountOp has been deleted, don't continue as the request has already finished\n if (!this.signAccountOp) return\n\n if (estimation) {\n const currentNonceAhead =\n BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n)\n\n // if the nonce from the estimation is bigger than the one in localAccountOp,\n // override the accountState and accountOp with the newly detected nonce\n if (currentNonceAhead) {\n localAccountOp.nonce = BigInt(estimation.currentAccountNonce)\n this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n\n if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId])\n this.accounts.accountStates[localAccountOp.accountAddr][\n localAccountOp.networkId\n ].nonce = localAccountOp.nonce\n }\n\n const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'\n const lastTxn = this.activity.getLastTxn(localAccountOp.networkId)\n const SAHasOldNonceOnARelayerNetwork =\n isSmartAccount(account) &&\n !network.erc4337.enabled &&\n lastTxn &&\n localAccountOp.nonce === lastTxn.nonce &&\n lastTxn.success &&\n lastTxn.status === AccountOpStatus.Success\n\n if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n return\n }\n }\n\n if (\n estimation &&\n estimation.nonFatalErrors &&\n estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') &&\n this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]\n ) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n\n // returning here means estimation will not be set => better UX as\n // the user will not see the warning but instead\n // just wait for the new estimation\n return\n }\n\n // check if an RBF should be applied for the incoming transaction\n // for SA conditions are: take the last broadcast but not confirmed accOp\n // and check if the nonce is the same as the current nonce (non 4337 txns)\n // for EOA: check the last broadcast but not confirmed txn across SA\n // as the EOA could've broadcast a txn there + it's own history and\n // compare the highest found nonce\n const rbfAccountOps: { [key: string]: SubmittedAccountOp | null } = {}\n nativeToCheck.push(localAccountOp.accountAddr)\n nativeToCheck.forEach((accId) => {\n const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId)\n\n // the accountState of the nativeToCheck may no be initialized\n const currentNonce =\n this.accounts.accountStates &&\n this.accounts.accountStates[accId] &&\n this.accounts.accountStates[accId][localAccountOp.networkId]\n ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce\n : null\n\n rbfAccountOps[accId] =\n notConfirmedOp &&\n !notConfirmedOp.gasFeePayment?.isERC4337 &&\n currentNonce &&\n currentNonce === notConfirmedOp.nonce\n ? notConfirmedOp\n : null\n })\n\n // if there's an estimation error, override the pending results\n if (estimation && estimation.error) {\n this.portfolio.overridePendingResults(localAccountOp)\n }\n // update the signAccountOp controller once estimation finishes;\n // this eliminates the infinite loading bug if the estimation comes slower\n if (this.signAccountOp && estimation) {\n this.signAccountOp.update({ estimation, rbfAccountOps })\n }\n } catch (error: any) {\n this.signAccountOp?.calculateWarnings()\n this.emitError({\n level: 'silent',\n message: 'Estimation error',\n error\n })\n }\n }\n\n /**\n * There are 4 ways to broadcast an AccountOp:\n * 1. For basic accounts (EOA), there is only one way to do that. After\n * signing the transaction, the serialized signed transaction object gets\n * send to the network.\n * 2. For smart accounts, when EOA pays the fee. Two signatures are needed\n * for this. The first one is the signature of the AccountOp itself. The\n * second one is the signature of the transaction that will be executed\n * by the smart account.\n * 3. For smart accounts that broadcast the ERC-4337 way.\n * 4. for smart accounts, when the Relayer does the broadcast.\n *\n */\n async #broadcastSignedAccountOp() {\n const accountOp = this.signAccountOp?.accountOp\n const estimation = this.signAccountOp?.estimation\n const actionId = this.signAccountOp?.fromActionId\n const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher\n const contactSupportPrompt = 'Please try again or contact support if the problem persists.'\n\n if (\n !accountOp ||\n !estimation ||\n !actionId ||\n !accountOp.signingKeyAddr ||\n !accountOp.signingKeyType ||\n !accountOp.signature ||\n !bundlerSwitcher\n ) {\n const message = `Missing mandatory transaction details. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const provider = this.providers.providers[accountOp.networkId]\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!provider) {\n const networkName = network?.name || `network with id ${accountOp.networkId}`\n const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!account) {\n const addr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Account with address ${addr} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!network) {\n const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n let transactionRes: {\n txnId?: string\n nonce: number\n identifiedBy: AccountOpIdentifiedBy\n } | null = null\n\n // Basic account (EOA)\n if (!isSmartAccount(account)) {\n try {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`\n return await this.throwBroadcastAccountOp({ message, accountState })\n }\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const gasFeePayment = accountOp.gasFeePayment!\n const { to, value, data } = accountOp.calls[0]\n const rawTxn: TxnRequest = {\n to: to ?? undefined,\n value,\n data,\n chainId: network!.chainId,\n nonce: await provider.getTransactionCount(accountOp.accountAddr),\n gasLimit: gasFeePayment.simulatedGasLimit\n }\n\n // if it's eip1559, send it as such. If no, go to legacy\n if (gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account but EOA pays the fee\n else if (\n account.creation &&\n accountOp.gasFeePayment &&\n accountOp.gasFeePayment.paidBy !== account.addr\n ) {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`\n\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n let data\n let to\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n to = accountOp.accountAddr\n data = ambireAccount.encodeFunctionData('execute', [\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n } else {\n const ambireFactory = new Interface(AmbireFactory.abi)\n to = account.creation.factoryAddr\n data = ambireFactory.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n }\n\n try {\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const rawTxn: TxnRequest = {\n to,\n data,\n // We ultimately do a smart contract call, which means we don't need\n // to send any `value` from the EOA address. The actual `value` will\n // get taken from the value encoded in the `data` field.\n value: BigInt(0),\n chainId: network.chainId,\n nonce: await provider.getTransactionCount(accountOp.gasFeePayment!.paidBy),\n gasLimit: accountOp.gasFeePayment.simulatedGasLimit\n }\n\n if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account, the ERC-4337 way\n else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) {\n const userOperation = accountOp.asUserOperation\n if (!userOperation) {\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n // broadcast through bundler's service\n let userOperationHash\n const bundler = bundlerSwitcher.getBundler()\n try {\n userOperationHash = await bundler.broadcast(userOperation, network)\n } catch (e: any) {\n let retryMsg\n\n // if the signAccountOp is still active (it should be)\n // try to switch the bundler and ask the user to try again\n // TODO: explore more error case where we switch the bundler\n if (this.signAccountOp) {\n const decodedError = bundler.decodeBundlerError(e)\n const humanReadable = getHumanReadableBroadcastError(decodedError)\n const switcher = this.signAccountOp.bundlerSwitcher\n this.signAccountOp.updateStatus(SigningStatus.ReadyToSign)\n\n if (switcher.canSwitch(humanReadable)) {\n switcher.switch()\n this.estimateSignAccountOp()\n this.#updateGasPrice()\n retryMsg = 'Broadcast failed because bundler was down. Please try again'\n }\n }\n\n return this.throwBroadcastAccountOp({\n error: e,\n accountState,\n provider,\n network,\n message: retryMsg\n })\n }\n if (!userOperationHash) {\n return this.throwBroadcastAccountOp({\n message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.'\n })\n }\n\n transactionRes = {\n nonce: Number(userOperation.nonce),\n identifiedBy: {\n type: 'UserOperation',\n identifier: userOperationHash,\n bundler: bundler.getName()\n }\n }\n }\n // Smart account, the Relayer way\n else {\n try {\n const body = {\n gasLimit: Number(accountOp.gasFeePayment!.simulatedGasLimit),\n txns: getSignableCalls(accountOp),\n signature: accountOp.signature,\n signer: { address: accountOp.signingKeyAddr },\n nonce: Number(accountOp.nonce)\n }\n const additionalRelayerNetwork = relayerAdditionalNetworks.find(\n (net) => net.chainId === network.chainId\n )\n const relayerNetworkId = additionalRelayerNetwork\n ? additionalRelayerNetwork.name\n : accountOp.networkId\n const response = await this.callRelayer(\n `/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`,\n 'POST',\n body\n )\n if (!response.success) throw new Error(response.message)\n\n transactionRes = {\n txnId: response.txId,\n nonce: Number(accountOp.nonce),\n identifiedBy: {\n type: 'Relayer',\n identifier: response.id\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true })\n }\n }\n\n if (!transactionRes)\n return this.throwBroadcastAccountOp({\n message: 'No transaction response received after being broadcasted.'\n })\n\n this.portfolio.markSimulationAsBroadcasted(account.addr, network.id)\n\n const submittedAccountOp: SubmittedAccountOp = {\n ...accountOp,\n status: AccountOpStatus.BroadcastedButNotConfirmed,\n txnId: transactionRes.txnId,\n nonce: BigInt(transactionRes.nonce),\n identifiedBy: transactionRes.identifiedBy,\n timestamp: new Date().getTime(),\n isSingletonDeploy: !!accountOp.calls.find(\n (call) => call.to && getAddress(call.to) === SINGLETON\n )\n }\n await this.activity.addAccountOp(submittedAccountOp)\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp)\n await this.resolveAccountOpAction(\n {\n networkId: network.id,\n isUserOp: !!accountOp?.asUserOperation,\n submittedAccountOp\n },\n actionId\n )\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The transaction was successfully signed and broadcasted to the network.'\n })\n return Promise.resolve(submittedAccountOp)\n }\n\n // ! IMPORTANT !\n // Banners that depend on async data from sub-controllers should be implemented\n // in the sub-controllers themselves. This is because updates in the sub-controllers\n // will not trigger emitUpdate in the MainController, therefore the banners will\n // remain the same until a subsequent update in the MainController.\n get banners(): Banner[] {\n if (!this.selectedAccount.account || !this.networks.isInitialized) return []\n\n const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.selectedAccount.account.addr,\n this.swapAndBridge.activeRoutes\n )\n const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter(\n (r) => r.routeStatus === 'ready'\n )\n\n const accountOpBanners = getAccountOpBanners({\n accountOpActionsByNetwork: getAccountOpActionsByNetwork(\n this.selectedAccount.account.addr,\n this.actions.actionsQueue\n ),\n selectedAccount: this.selectedAccount.account.addr,\n accounts: this.accounts.accounts,\n networks: this.networks.networks,\n swapAndBridgeRoutesPendingSignature\n })\n\n return [...accountOpBanners]\n }\n\n // Technically this is an anti-pattern, but it's the only way to\n // test the error handling in the method.\n protected throwBroadcastAccountOp({\n message: humanReadableMessage,\n error: _err,\n accountState,\n isRelayer = false,\n provider = undefined,\n network = undefined\n }: {\n message?: string\n error?: Error\n accountState?: AccountOnchainState\n isRelayer?: boolean\n provider?: RPCProvider\n network?: Network\n }) {\n const originalMessage = _err?.message\n let message = humanReadableMessage\n let isReplacementFeeLow = false\n\n if (originalMessage) {\n if (originalMessage.includes('replacement fee too low')) {\n message =\n 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'\n isReplacementFeeLow = true\n this.estimateSignAccountOp()\n } else if (\n originalMessage.includes('pimlico_getUserOperationGasPrice') ||\n originalMessage.includes('preVerificationGas')\n ) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n } else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) {\n message = `Signer key not supported on this network.${\n !accountState?.isV2\n ? 'You can add/change signers from the web wallet or contact support.'\n : 'Please contact support.'\n }`\n } else if (originalMessage.includes('underpriced')) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n } else if (originalMessage.includes('Failed to fetch') && isRelayer) {\n message =\n 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'\n }\n }\n\n if (!message) {\n message = getHumanReadableBroadcastError(_err || new Error('')).message\n\n // if the message states that the paymaster doesn't have sufficient amount,\n // add it to the failedPaymasters to disable it until a top-up is made\n if (message.includes(insufficientPaymasterFunds) && provider && network) {\n failedPaymasters.addInsufficientFunds(provider, network).then(() => {\n this.estimateSignAccountOp()\n })\n }\n }\n\n // To enable another try for signing in case of broadcast fail\n // broadcast is called in the FE only after successful signing\n this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow)\n this.feePayerKey = null\n\n return Promise.reject(\n new EmittableError({ level: 'major', message, error: _err || new Error(message) })\n )\n }\n\n get isSignRequestStillActive(): boolean {\n if (!this.signAccountOp) return false\n\n return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp!.fromActionId)\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n banners: this.banners,\n isSignRequestStillActive: this.isSignRequestStillActive\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/brace-style */\n\nimport { ethErrors } from 'eth-rpc-errors'\nimport { getAddress, getBigInt, Interface, isAddress } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'\nimport { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'\nimport {\n BIP44_LEDGER_DERIVATION_TEMPLATE,\n BIP44_STANDARD_DERIVATION_TEMPLATE\n} from '../../consts/derivation'\nimport {\n Account,\n AccountId,\n AccountOnchainState,\n AccountWithNetworkMeta\n} from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n ExternalSignerControllers,\n Key,\n KeystoreSignerType,\n TxnRequest\n} from '../../interfaces/keystore'\nimport { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Storage } from '../../interfaces/storage'\nimport { SocketAPISendTransactionRequest } from '../../interfaces/swapAndBridge'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport { WindowManager } from '../../interfaces/window'\nimport { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport {\n AccountOpIdentifiedBy,\n getDappIdentifier,\n pollTxnId,\n SubmittedAccountOp\n} from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport {\n dappRequestMethodToActionKind,\n getAccountOpActionsByNetwork,\n getAccountOpFromAction\n} from '../../libs/actions/actions'\nimport { getAccountOpBanners } from '../../libs/banners/banners'\nimport { getPaymasterService } from '../../libs/erc7677/erc7677'\nimport {\n getHumanReadableBroadcastError,\n getHumanReadableEstimationError\n} from '../../libs/errorHumanizer'\nimport { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'\nimport { estimate } from '../../libs/estimate/estimate'\nimport { EstimateResult } from '../../libs/estimate/interfaces'\nimport { GasRecommendation, getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'\nimport { humanizeAccountOp } from '../../libs/humanizer'\nimport { KeyIterator } from '../../libs/keyIterator/keyIterator'\nimport {\n ACCOUNT_SWITCH_USER_REQUEST,\n buildSwitchAccountUserRequest,\n getAccountOpsForSimulation,\n makeBasicAccountOpAction,\n makeSmartAccountOpAction\n} from '../../libs/main/main'\nimport { relayerAdditionalNetworks } from '../../libs/networks/networks'\nimport { GetOptions, TokenResult } from '../../libs/portfolio/interfaces'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { parse } from '../../libs/richJson/richJson'\nimport { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'\nimport {\n adjustEntryPointAuthorization,\n getEntryPointAuthorization\n} from '../../libs/signMessage/signMessage'\nimport {\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { debugTraceCall } from '../../libs/tracer/debugTraceCall'\nimport {\n buildClaimWalletRequest,\n buildMintVestingRequest,\n buildTransferUserRequest\n} from '../../libs/transfer/userRequest'\nimport {\n ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n isErc4337Broadcast,\n shouldAskForEntryPointAuthorization\n} from '../../libs/userOperation/userOperation'\nimport { getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { SocketAPI } from '../../services/socket/api'\nimport { getIsViewOnly } from '../../utils/accounts'\nimport shortenAddress from '../../utils/shortenAddress'\nimport wait from '../../utils/wait'\nimport { AccountAdderController } from '../accountAdder/accountAdder'\nimport { AccountsController } from '../accounts/accounts'\nimport {\n AccountOpAction,\n ActionExecutionType,\n ActionPosition,\n ActionsController,\n SignMessageAction\n} from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport { AddressBookController } from '../addressBook/addressBook'\nimport { DappsController } from '../dapps/dapps'\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport { DomainsController } from '../domains/domains'\nimport { EmailVaultController } from '../emailVault/emailVault'\nimport EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n/* eslint-disable no-underscore-dangle */\nimport { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'\nimport { SignMessageController } from '../signMessage/signMessage'\nimport { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'\n\nconst STATUS_WRAPPED_METHODS = {\n onAccountAdderSuccess: 'INITIAL',\n signAccountOp: 'INITIAL',\n broadcastSignedAccountOp: 'INITIAL',\n removeAccount: 'INITIAL',\n handleAccountAdderInitLedger: 'INITIAL',\n handleAccountAdderInitLattice: 'INITIAL',\n importSmartAccountFromDefaultSeed: 'INITIAL',\n buildSwapAndBridgeUserRequest: 'INITIAL',\n importSmartAccountFromSavedSeed: 'INITIAL',\n selectAccount: 'INITIAL'\n} as const\n\nexport class MainController extends EventEmitter {\n #storage: Storage\n\n fetch: Fetch\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n callRelayer: Function\n\n isReady: boolean = false\n\n invite: InviteController\n\n keystore: KeystoreController\n\n /**\n * Hardware wallets (usually) need an additional (external signer) controller,\n * that is app-specific (web, mobile) and is used to interact with the device.\n * (example: LedgerController, TrezorController, LatticeController)\n */\n #externalSignerControllers: ExternalSignerControllers = {}\n\n // Subcontrollers\n networks: NetworksController\n\n providers: ProvidersController\n\n accountAdder: AccountAdderController\n\n portfolio: PortfolioController\n\n defiPositions: DefiPositionsController\n\n dapps: DappsController\n\n actions: ActionsController\n\n // Public sub-structures\n // @TODO emailVaults\n emailVault: EmailVaultController\n\n signMessage: SignMessageController\n\n swapAndBridge: SwapAndBridgeController\n\n signAccountOp: SignAccountOpController | null = null\n\n signAccOpInitError: string | null = null\n\n activity: ActivityController\n\n addressBook: AddressBookController\n\n domains: DomainsController\n\n accounts: AccountsController\n\n selectedAccount: SelectedAccountController\n\n userRequests: UserRequest[] = []\n\n userRequestWaitingAccountSwitch: UserRequest[] = []\n\n // network => GasRecommendation[]\n gasPrices: { [key: string]: GasRecommendation[] } = {}\n\n // network => BundlerGasPrice\n bundlerGasPrices: { [key: string]: { speeds: GasSpeeds; bundler: BUNDLER } } = {}\n\n accountOpsToBeConfirmed: { [key: string]: { [key: string]: AccountOp } } = {}\n\n // TODO: Temporary solution to expose the fee payer key during Account Op broadcast.\n feePayerKey: Key | null = null\n\n lastUpdate: Date = new Date()\n\n isOffline: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n #signAccountOpSigningPromise?: Promise\n\n #signAccountOpBroadcastPromise?: Promise\n\n constructor({\n storage,\n fetch,\n relayerUrl,\n velcroUrl,\n socketApiKey,\n keystoreSigners,\n externalSignerControllers,\n windowManager,\n notificationManager\n }: {\n storage: Storage\n fetch: Fetch\n relayerUrl: string\n velcroUrl: string\n socketApiKey: string\n keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n externalSignerControllers: ExternalSignerControllers\n windowManager: WindowManager\n notificationManager: NotificationManager\n }) {\n super()\n this.#storage = storage\n this.fetch = fetch\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n\n this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage })\n this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager)\n this.#externalSignerControllers = externalSignerControllers\n this.networks = new NetworksController(\n this.#storage,\n this.fetch,\n async (network: Network) => {\n this.providers.setProvider(network)\n await this.reloadSelectedAccount({ networkId: network.id })\n },\n (networkId: NetworkId) => {\n this.providers.removeProvider(networkId)\n }\n )\n this.providers = new ProvidersController(this.networks)\n this.accounts = new AccountsController(\n this.#storage,\n this.providers,\n this.networks,\n async (accounts) => {\n const defaultSelectedAccount = getDefaultSelectedAccount(accounts)\n if (defaultSelectedAccount) {\n await this.#selectAccount(defaultSelectedAccount.addr)\n }\n },\n this.providers.updateProviderIsWorking.bind(this.providers),\n this.#updateIsOffline.bind(this)\n )\n this.selectedAccount = new SelectedAccountController({\n storage: this.#storage,\n accounts: this.accounts\n })\n this.portfolio = new PortfolioController(\n this.#storage,\n this.fetch,\n this.providers,\n this.networks,\n this.accounts,\n relayerUrl,\n velcroUrl\n )\n this.defiPositions = new DefiPositionsController({\n fetch: this.fetch,\n storage,\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n providers: this.providers\n })\n this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore)\n this.accountAdder = new AccountAdderController({\n accounts: this.accounts,\n keystore: this.keystore,\n networks: this.networks,\n providers: this.providers,\n relayerUrl,\n fetch: this.fetch\n })\n this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount)\n this.signMessage = new SignMessageController(\n this.keystore,\n this.providers,\n this.networks,\n this.accounts,\n this.#externalSignerControllers\n )\n const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch })\n this.dapps = new DappsController(this.#storage)\n this.actions = new ActionsController({\n selectedAccount: this.selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose: () => {\n const userRequestsToRejectOnWindowClose = this.userRequests.filter(\n (r) => r.action.kind !== 'calls'\n )\n userRequestsToRejectOnWindowClose.forEach((r) =>\n r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())\n )\n this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls')\n this.userRequestWaitingAccountSwitch = []\n this.emitUpdate()\n }\n })\n this.selectedAccount.initControllers({\n portfolio: this.portfolio,\n defiPositions: this.defiPositions,\n actions: this.actions,\n networks: this.networks,\n providers: this.providers\n })\n\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch })\n this.activity = new ActivityController(\n this.#storage,\n this.fetch,\n this.callRelayer,\n this.accounts,\n this.selectedAccount,\n this.providers,\n this.networks,\n async (network: Network) => {\n await this.setContractsDeployedToTrueIfDeployed(network)\n }\n )\n this.swapAndBridge = new SwapAndBridgeController({\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n activity: this.activity,\n invite: this.invite,\n socketAPI,\n storage: this.#storage,\n actions: this.actions\n })\n this.domains = new DomainsController(this.providers.providers)\n this.#initialLoadPromise = this.#load()\n paymasterFactory.init(relayerUrl, fetch, (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n })\n }\n\n /**\n * - Updates the selected account's account state, portfolio and defi positions\n * - Calls batchReverseLookup for all accounts\n *\n * It's not a problem to call it many times consecutively as all methods have internal\n * caching mechanisms to prevent unnecessary calls.\n */\n onLoad(isFirstLoad: boolean = false) {\n const selectedAccountAddr = this.selectedAccount.account?.addr\n const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length\n this.defiPositions.updatePositions()\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n if (!hasBroadcastedButNotConfirmed) {\n this.updateSelectedAccountPortfolio()\n }\n // The first time the app loads, we update the account state elsewhere\n if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading)\n this.accounts.updateAccountState(selectedAccountAddr)\n }\n\n async #load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n await this.networks.initialLoadPromise\n await this.providers.initialLoadPromise\n await this.accounts.initialLoadPromise\n await this.selectedAccount.initialLoadPromise\n\n this.onLoad(true)\n /**\n * Listener that gets triggered as a finalization step of adding new\n * accounts via the AccountAdder controller flow.\n *\n * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these\n * changes are reflected for view-only accounts as well. Because the\n * view-only accounts import flow bypasses the AccountAdder, this method\n * won't click for them. Their on add success flow continues in the\n * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case.\n */\n const onAccountAdderSuccess = () => {\n if (this.accountAdder.addAccountsStatus !== 'SUCCESS') return\n\n return this.withStatus(\n 'onAccountAdderSuccess',\n async () => {\n // Add accounts first, because some of the next steps have validation\n // if accounts exists.\n await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts)\n\n // Then add keys, because some of the next steps could have validation\n // if keys exists. Should be separate (not combined in Promise.all,\n // since firing multiple keystore actions is not possible\n // (the #wrapKeystoreAction listens for the first one to finish and\n // skips the parallel one, if one is requested).\n\n await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal)\n await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external)\n\n // Update the saved seed `hdPathTemplate` if accounts were added from\n // the saved seed, so when user opts in to \"Import a new Smart Account\n // from the saved Seed Phrase\" the next account is derived based\n // on the latest `hdPathTemplate` chosen in the AccountAdder.\n if (this.accountAdder.isInitializedWithSavedSeed)\n this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n if (this.keystore.hasKeystoreTempSeed)\n this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n },\n true\n )\n }\n this.accountAdder.onUpdate(onAccountAdderSuccess)\n\n this.isReady = true\n this.emitUpdate()\n }\n\n lock() {\n this.keystore.lock()\n this.emailVault.cleanMagicAndSessionKeys()\n this.selectedAccount.setDashboardNetworkFilter(null)\n }\n\n async selectAccount(toAccountAddr: string) {\n await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true)\n }\n\n async #selectAccount(toAccountAddr: string | null) {\n await this.#initialLoadPromise\n if (!toAccountAddr) {\n await this.selectedAccount.setAccount(null)\n\n this.emitUpdate()\n return\n }\n\n const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr)\n if (!accountToSelect) {\n console.error(`Account with address ${toAccountAddr} does not exist`)\n return\n }\n\n this.isOffline = false\n // call closeActionWindow while still on the currently selected account to allow proper\n // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl...\n if (this.actions?.currentAction?.type !== 'switchAccount') {\n this.actions.closeActionWindow()\n }\n this.selectedAccount.setAccount(accountToSelect)\n this.swapAndBridge.onAccountChange()\n this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr])\n // forceEmitUpdate to update the getters in the FE state of the ctrl\n await this.forceEmitUpdate()\n await this.actions.forceEmitUpdate()\n await this.addressBook.forceEmitUpdate()\n // Don't await these as they are not critical for the account selection\n // and if the user decides to quickly change to another account withStatus\n // will block the UI until these are resolved.\n this.reloadSelectedAccount({ forceUpdate: false })\n this.emitUpdate()\n }\n\n async importSmartAccountFromSavedSeed(seed?: string) {\n await this.withStatus(\n 'importSmartAccountFromSavedSeed',\n async () => {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n if (seed && !this.keystore.hasKeystoreSavedSeed) {\n await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE })\n }\n\n const savedSeed = await this.keystore.getSavedSeed()\n if (!savedSeed) {\n throw new EmittableError({\n message:\n 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.',\n level: 'major',\n error: new Error('failed to retrieve saved seed phrase from keystore')\n })\n }\n\n const keyIterator = new KeyIterator(savedSeed.seed)\n await this.accountAdder.init({\n keyIterator,\n hdPathTemplate: savedSeed.hdPathTemplate,\n pageSize: 1,\n shouldGetAccountsUsedOnNetworks: false,\n shouldSearchForLinkedAccounts: false\n })\n\n let currentPage: number = 1\n let isAccountAlreadyAdded: boolean\n let nextSmartAccount: AccountWithNetworkMeta | undefined\n\n const findNextSmartAccount = async () => {\n do {\n // eslint-disable-next-line no-await-in-loop\n await this.accountAdder.setPage({ page: currentPage })\n\n nextSmartAccount = this.accountAdder.accountsOnPage.find(\n ({ isLinked, account }) => !isLinked && isSmartAccount(account)\n )?.account\n\n if (!nextSmartAccount) break\n\n isAccountAlreadyAdded = !!this.accounts.accounts.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n (a) => a.addr === nextSmartAccount!.addr\n )\n\n currentPage++\n } while (isAccountAlreadyAdded)\n }\n\n await findNextSmartAccount()\n\n if (!nextSmartAccount) {\n throw new EmittableError({\n message:\n 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.',\n level: 'major',\n error: new Error('Internal error: Failed to find a smart account to add')\n })\n }\n\n this.accountAdder.selectAccount(nextSmartAccount)\n\n const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts()\n\n await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, {\n internal: readyToAddKeys,\n external: []\n })\n },\n true\n )\n }\n\n initSignAccOp(actionId: AccountOpAction['id']): null | void {\n const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue)\n if (!accountOp) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'\n return null\n }\n\n const network = this.networks.networks.find((net) => net.id === accountOp.networkId)\n\n if (\n !this.selectedAccount.account ||\n this.selectedAccount.account.addr !== accountOp.accountAddr\n ) {\n this.signAccOpInitError =\n 'Attempting to initialize an accountOp for an account other than the currently selected one.'\n return null\n }\n\n if (!network) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process as we are unable to locate the specified network.'\n return null\n }\n\n // on init, set the accountOp nonce to the latest one we know\n // it could happen that the user inits a userRequest with an old\n // accountState and therefore caching the old nonce in the accountOp.\n // we make sure the latest nonce is set when initing signAccountOp\n const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]\n if (state) accountOp.nonce = state.nonce\n\n this.signAccOpInitError = null\n\n this.signAccountOp = new SignAccountOpController(\n this.accounts,\n this.keystore,\n this.portfolio,\n this.#externalSignerControllers,\n this.selectedAccount.account,\n network,\n actionId,\n accountOp,\n () => {\n this.estimateSignAccountOp()\n },\n () => {\n return this.isSignRequestStillActive\n }\n )\n\n this.emitUpdate()\n\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n }\n\n async handleSignAndBroadcastAccountOp() {\n await this.withStatus(\n 'signAccountOp',\n async () => {\n const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done\n if (wasAlreadySigned) return Promise.resolve()\n\n if (!this.signAccountOp) {\n const message =\n 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'\n const error = new Error('SignAccountOp is not initialized')\n this.emitError({ level: 'major', message, error })\n return Promise.reject(error)\n }\n\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => {\n this.#signAccountOpSigningPromise = undefined\n })\n\n return this.#signAccountOpSigningPromise\n },\n true\n )\n\n // Error handling on the prev step will notify the user, it's fine to return here\n if (this.signAccountOp?.status?.type !== SigningStatus.Done) return\n\n return this.withStatus(\n 'broadcastSignedAccountOp',\n async () => {\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => {\n this.#signAccountOpBroadcastPromise = undefined\n })\n return this.#signAccountOpBroadcastPromise\n },\n true\n )\n }\n\n destroySignAccOp() {\n if (!this.signAccountOp) return\n\n this.feePayerKey = null\n this.signAccountOp = null\n this.signAccOpInitError = null\n\n // NOTE: no need to update the portfolio here as an update is\n // fired upon removeUserRequest\n\n this.emitUpdate()\n }\n\n async traceCall(estimation: EstimateResult) {\n const accountOp = this.signAccountOp?.accountOp\n if (!accountOp) return\n\n const network = this.networks.networks.find((net) => net.id === accountOp?.networkId)\n if (!network) return\n\n try {\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)!\n const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n const provider = this.providers.providers[network.id]\n const gasPrice = this.gasPrices[network.id]\n const { tokens, nfts } = await debugTraceCall(\n account,\n accountOp,\n provider,\n state,\n estimation.gasUsed,\n gasPrice,\n !network.rpcNoStateOverride\n )\n const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id)\n const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id)\n // update the portfolio only if new tokens were found through tracing\n if (learnedNewTokens || learnedNewNfts) {\n this.portfolio\n .updateSelectedAccount(\n accountOp.accountAddr,\n network,\n getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n accountOp\n ),\n { forceUpdate: true }\n )\n // fire an update request to refresh the warnings if any\n .then(() => this.signAccountOp?.update({}))\n }\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: 'Error in main.traceCall',\n error: e\n })\n }\n }\n\n async handleSignMessage() {\n const accountAddr = this.signMessage.messageToSign?.accountAddr\n const networkId = this.signMessage.messageToSign?.networkId\n\n // Could (rarely) happen if not even a single account state is fetched yet\n const shouldForceUpdateAndWaitForAccountState =\n accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (shouldForceUpdateAndWaitForAccountState)\n await this.accounts.updateAccountState(accountAddr, 'latest', [networkId])\n\n const isAccountStateStillMissing =\n !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (isAccountStateStillMissing) {\n const message =\n 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'\n const error = new Error(\n `The account state of ${accountAddr} is missing for the network with id ${networkId}.`\n )\n return this.emitError({ level: 'major', message, error })\n }\n\n await this.signMessage.sign()\n\n const signedMessage = this.signMessage.signedMessage\n // Error handling on the prev step will notify the user, it's fine to return here\n if (!signedMessage) return\n\n if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0],\n networkId: signedMessage.networkId,\n nonce:\n this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}\n accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(\n signedMessage.signature as string\n )\n\n this.actions.addOrUpdateAction(accountOpAction, 'first')\n }\n\n await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr)\n await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId)\n\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The Message was successfully signed.'\n })\n }\n\n async #handleAccountAdderInitLedger(\n LedgerKeyIterator: any // TODO: KeyIterator type mismatch\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const ledgerCtrl = this.#externalSignerControllers.ledger\n if (!ledgerCtrl) {\n const message =\n 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n // Once a session with the Ledger device gets initiated, the user might\n // use the device with another app. In this scenario, when coming back to\n // Ambire (the second time a connection gets requested onwards),\n // the Ledger device throws with \"invalid channel\" error.\n // To overcome this, always make sure to clean up before starting\n // a new session when retrieving keys, in case there already is one.\n if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp()\n\n const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE\n await ledgerCtrl.unlock(hdPathTemplate)\n\n if (!ledgerCtrl.walletSDK) {\n const message = 'Could not establish connection with the Ledger device'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl })\n await this.accountAdder.init({ keyIterator, hdPathTemplate })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Ledger device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLedger(LedgerKeyIterator: any /* TODO: KeyIterator type mismatch */) {\n await this.withStatus('handleAccountAdderInitLedger', async () =>\n this.#handleAccountAdderInitLedger(LedgerKeyIterator)\n )\n }\n\n async #handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const latticeCtrl = this.#externalSignerControllers.lattice\n if (!latticeCtrl) {\n const message =\n 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE\n await latticeCtrl.unlock(hdPathTemplate, undefined, true)\n\n const { walletSDK } = latticeCtrl\n await this.accountAdder.init({\n keyIterator: new LatticeKeyIterator({ walletSDK }),\n hdPathTemplate\n })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n await this.withStatus('handleAccountAdderInitLattice', async () =>\n this.#handleAccountAdderInitLattice(LatticeKeyIterator)\n )\n }\n\n async updateAccountsOpsStatuses(): Promise<{ newestOpTimestamp: number }> {\n await this.#initialLoadPromise\n\n const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } =\n await this.activity.updateAccountsOpsStatuses()\n\n if (shouldEmitUpdate) {\n this.emitUpdate()\n\n if (shouldUpdatePortfolio) {\n this.updateSelectedAccountPortfolio(true)\n }\n }\n\n updatedAccountsOps.forEach((op) => {\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op)\n })\n\n return { newestOpTimestamp }\n }\n\n // call this function after a call to the singleton has been made\n // it will check if the factory has been deployed and update the network settings if it has been\n async setContractsDeployedToTrueIfDeployed(network: Network) {\n await this.#initialLoadPromise\n if (network.areContractsDeployed) return\n\n const provider = this.providers.providers[network.id]\n if (!provider) return\n\n const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY)\n if (factoryCode === '0x') return\n await this.networks.updateNetwork({ areContractsDeployed: true }, network.id)\n }\n\n #removeAccountKeyData(address: Account['addr']) {\n // Compute account keys that are only associated with this account\n const accountAssociatedKeys =\n this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []\n const keysInKeystore = this.keystore.keys\n const importedAccountKeys = keysInKeystore.filter((key) =>\n accountAssociatedKeys.includes(key.addr)\n )\n const solelyAccountKeys = importedAccountKeys.filter((key) => {\n const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some(\n (acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)\n )\n\n return !isKeyAssociatedWithOtherAccounts\n })\n\n // Remove account keys from the keystore\n solelyAccountKeys.forEach((key) => {\n this.keystore.removeKey(key.addr, key.type).catch((e) => {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account key',\n error: e\n })\n })\n })\n }\n\n async removeAccount(address: Account['addr']) {\n await this.withStatus('removeAccount', async () => {\n try {\n this.#removeAccountKeyData(address)\n // Remove account data from sub-controllers\n await this.accounts.removeAccountData(address)\n this.portfolio.removeAccountData(address)\n await this.activity.removeAccountData(address)\n this.actions.removeAccountData(address)\n this.signMessage.removeAccountData(address)\n this.defiPositions.removeAccountData(address)\n\n if (this.selectedAccount.account?.addr === address) {\n await this.#selectAccount(this.accounts.accounts[0]?.addr)\n }\n\n if (this.signAccountOp?.account.addr === address) {\n this.destroySignAccOp()\n }\n\n this.emitUpdate()\n } catch (e: any) {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account',\n error: e || new Error('Failed to remove account')\n })\n }\n })\n }\n\n async #ensureAccountInfo(accountAddr: AccountId, networkId: NetworkId) {\n await this.#initialLoadPromise\n // Initial sanity check: does this account even exist?\n if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) {\n this.signAccOpInitError = `Account ${accountAddr} does not exist`\n return\n }\n // If this still didn't work, re-load\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n await this.accounts.updateAccountState(accountAddr, 'pending', [networkId])\n // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`\n }\n\n #batchCallsFromUserRequests(accountAddr: AccountId, networkId: NetworkId): Call[] {\n // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind\n return (this.userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n }\n\n async reloadSelectedAccount(\n options: {\n forceUpdate?: boolean\n networkId?: NetworkId\n } = {\n forceUpdate: true,\n networkId: undefined\n }\n ) {\n const { forceUpdate, networkId } = options\n const networkToUpdate = networkId\n ? this.networks.networks.find((n) => n.id === networkId)\n : undefined\n if (!this.selectedAccount.account) return\n\n this.selectedAccount.resetSelectedAccountPortfolio()\n await Promise.all([\n // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon),\n // it's very likely that the account state is already in the process of being updated.\n // If we try to run the same action, `withStatus` validation will throw an error.\n // So, we perform this safety check to prevent the error.\n // However, even if we don't trigger an update here, it's not a big problem,\n // as the account state will be updated anyway, and its update will be very recent.\n !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr\n ? this.accounts.updateAccountState(\n this.selectedAccount.account.addr,\n 'pending',\n networkId ? [networkId] : undefined\n )\n : Promise.resolve(),\n // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally,\n // as the PortfolioController already exposes flags that are highly sufficient for the UX.\n // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard),\n // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper.\n this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate),\n this.defiPositions.updatePositions(networkId)\n ])\n }\n\n #updateIsOffline() {\n const oldIsOffline = this.isOffline\n const accountAddr = this.selectedAccount.account?.addr\n\n if (!accountAddr) return\n\n // We have to make calculations based on the state of the portfolio\n // and not the selected account portfolio the flag isOffline\n // and the errors of the selected account portfolio should\n // come in the same tick. Otherwise the UI may flash the wrong error.\n const latestState = this.portfolio.getLatestPortfolioState(accountAddr)\n const latestStateKeys = Object.keys(latestState)\n\n const isAllReady = latestStateKeys.every((networkId) => {\n return isNetworkReady(latestState[networkId])\n })\n\n if (!isAllReady) return\n\n const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => {\n const state = latestState[networkId]\n\n return !!state?.criticalError\n })\n\n const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => {\n const provider = this.providers.providers[networkId]\n const isWorking = provider.isWorking\n\n return typeof isWorking === 'boolean' && !isWorking\n })\n\n // Update isOffline if either all portfolio networks have errors or we've failed to fetch\n // the account state for every account. This is because either update may fail first.\n this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors\n\n if (oldIsOffline !== this.isOffline) {\n this.emitUpdate()\n }\n }\n\n // eslint-disable-next-line default-param-last\n async updateSelectedAccountPortfolio(forceUpdate: boolean = false, network?: Network) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId\n const networkData =\n network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n this.selectedAccount.account,\n this.actions.visibleActionsQueue,\n networkData,\n this.signAccountOp?.accountOp\n )\n\n await this.portfolio.updateSelectedAccount(\n this.selectedAccount.account.addr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate }\n )\n this.#updateIsOffline()\n }\n\n #getUserRequestAccountError(dappOrigin: string, fromAccountAddr: string): string | null {\n if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) {\n const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr)\n\n if (isAddressInAccounts) return null\n\n return 'The dApp is trying to sign using an address that is not imported in the extension.'\n }\n const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr\n\n if (isAddressSelected) return null\n\n return 'The dApp is trying to sign using an address that is not selected in the extension.'\n }\n\n async buildUserRequestFromDAppRequest(\n request: DappProviderRequest,\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n ) {\n await this.#initialLoadPromise\n let userRequest = null\n let actionPosition: ActionPosition = 'last'\n const kind = dappRequestMethodToActionKind(request.method)\n const dapp = this.dapps.getDapp(request.origin)\n\n if (kind === 'calls') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n const isWalletSendCalls = !!request.params[0].calls\n const accountAddr = getAddress(request.params[0].from)\n\n const calls: Calls['calls'] = isWalletSendCalls\n ? request.params[0].calls\n : [request.params[0]]\n const paymasterService = isWalletSendCalls\n ? getPaymasterService(network.chainId, request.params[0].capabilities)\n : null\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data || '0x',\n value: call.value ? getBigInt(call.value) : 0n\n }))\n },\n meta: {\n isSignAction: true,\n isWalletSendCalls,\n accountAddr,\n networkId: network.id,\n paymasterService\n },\n dappPromise\n } as SignUserRequest\n if (!this.selectedAccount.account.creation) {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n } else if (kind === 'message') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[1])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'message',\n message: msg[0]\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else if (kind === 'typedMessage') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[0])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n let typedData = msg?.[1]\n\n try {\n typedData = parse(typedData)\n } catch (error) {\n throw ethErrors.rpc.invalidRequest('Invalid typedData provided')\n }\n\n if (\n !typedData?.types ||\n !typedData?.domain ||\n !typedData?.message ||\n !typedData?.primaryType\n ) {\n throw ethErrors.rpc.methodNotSupported(\n 'Invalid typedData format - only typedData v4 is supported'\n )\n }\n\n if (\n msgAddress === this.selectedAccount.account.addr &&\n (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)\n ) {\n throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'typedMessage',\n types: typedData.types,\n domain: typedData.domain,\n message: typedData.message,\n primaryType: typedData.primaryType\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else {\n userRequest = {\n id: new Date().getTime(),\n session: request.session,\n action: { kind, params: request.params },\n meta: { isSignAction: false },\n dappPromise\n } as DappUserRequest\n }\n\n if (userRequest.action.kind !== 'calls') {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n\n if (!userRequest) return\n\n const isASignOperationRequestedForAnotherAccount =\n userRequest.meta.isSignAction &&\n userRequest.meta.accountAddr !== this.selectedAccount.account?.addr\n\n // We can simply add the user request if it's not a sign operation\n // for another account\n if (!isASignOperationRequestedForAnotherAccount) {\n await this.addUserRequest(\n userRequest,\n actionPosition,\n actionPosition === 'first' || isSmartAccount(this.selectedAccount.account)\n ? 'open-action-window'\n : 'queue-but-open-action-window'\n )\n return\n }\n\n const accountError = this.#getUserRequestAccountError(\n dappPromise.session.origin,\n userRequest.meta.accountAddr\n )\n\n if (accountError) {\n dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError))\n return\n }\n\n const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId))\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n this.userRequestWaitingAccountSwitch.push(userRequest)\n await this.addUserRequest(\n buildSwitchAccountUserRequest({\n nextUserRequest: userRequest,\n networkId: network.id,\n selectedAccountAddr: userRequest.meta.accountAddr,\n session: dappPromise.session,\n dappPromise\n }),\n 'last',\n 'open-action-window'\n )\n }\n\n async buildTransferUserRequest(\n amount: string,\n recipientAddress: string,\n selectedToken: TokenResult,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const userRequest = buildTransferUserRequest({\n selectedAccount: this.selectedAccount.account.addr,\n amount,\n selectedToken,\n recipientAddress\n })\n\n if (!userRequest) {\n this.emitError({\n level: 'major',\n message: 'Unexpected error while building transfer request',\n error: new Error(\n 'buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest'\n )\n })\n return\n }\n\n await this.addUserRequest(userRequest, 'last', actionExecutionType)\n }\n\n async buildSwapAndBridgeUserRequest(activeRouteId?: number) {\n await this.withStatus(\n 'buildSwapAndBridgeUserRequest',\n async () => {\n if (!this.selectedAccount.account) return\n let transaction: SocketAPISendTransactionRequest | null | undefined = null\n\n const activeRoute = this.swapAndBridge.activeRoutes.find(\n (r) => r.activeRouteId === activeRouteId\n )\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n transaction = await this.swapAndBridge.getRouteStartUserTx()\n }\n\n if (activeRoute) {\n this.removeUserRequest(activeRoute.activeRouteId, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined })\n if (!isSmartAccount(this.selectedAccount.account)) {\n this.removeUserRequest(`${activeRouteId}-revoke-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.removeUserRequest(`${activeRouteId}-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n }\n transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId)\n }\n\n if (!this.selectedAccount.account || !transaction) {\n const errorDetails = `missing ${\n this.selectedAccount.account ? 'selected account' : 'transaction'\n } info`\n const error = new SwapAndBridgeError(\n `Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`\n )\n throw new EmittableError({ message: error.message, level: 'major', error })\n }\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === transaction!.chainId\n )!\n\n // TODO: Consider refining the error handling in here, because this\n // swallows errors and doesn't provide any feedback to the user.\n const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(\n transaction,\n network.id,\n this.selectedAccount.account,\n this.providers.providers[network.id]\n )\n\n for (let i = 0; i < swapAndBridgeUserRequests.length; i++) {\n if (i === 0) {\n this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window')\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue')\n }\n }\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n await this.swapAndBridge.addActiveRoute({\n activeRouteId: transaction.activeRouteId,\n userTxIndex: transaction.userTxIndex\n })\n }\n\n if (activeRouteId) {\n this.swapAndBridge.updateActiveRoute(\n activeRouteId,\n {\n userTxIndex: transaction.userTxIndex,\n userTxHash: null\n },\n true\n )\n }\n },\n true\n )\n }\n\n buildClaimWalletUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const claimableRewardsData =\n this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData\n\n if (!claimableRewardsData) return\n\n const userRequest: UserRequest = buildClaimWalletRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n claimableRewardsData\n })\n\n this.addUserRequest(userRequest)\n }\n\n buildMintVestingUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData\n\n if (!addrVestingData) return\n const userRequest: UserRequest = buildMintVestingRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n addrVestingData\n })\n\n this.addUserRequest(userRequest)\n }\n\n resolveUserRequest(data: any, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return // TODO: emit error\n\n userRequest.dappPromise?.resolve(data)\n // These requests are transitionary initiated internally (not dApp requests) that block dApp requests\n // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives\n if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) {\n setTimeout(() => {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }, 300)\n } else {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }\n }\n\n rejectUserRequest(err: string, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return\n\n if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n this.userRequests = this.userRequests.filter(\n (r) =>\n !(\n r.action.kind === 'calls' &&\n r.meta.accountAddr === userRequest.meta.accountAddr &&\n r.meta.networkId === userRequest.meta.networkId\n )\n )\n }\n\n // if the userRequest that is about to be removed is an approval request\n // find and remove the associated pending transaction request if there is any\n // this is valid scenario for a swap & bridge txs with a BA\n if (userRequest.action.kind === 'calls') {\n const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr)!\n\n if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) {\n this.removeUserRequest(userRequest.meta.activeRouteId)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`)\n }\n }\n\n userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err))\n this.removeUserRequest(requestId)\n }\n\n rejectSignAccountOpCall(callId: string) {\n if (!this.signAccountOp) return\n\n const { calls, networkId, accountAddr } = this.signAccountOp.accountOp\n\n const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId\n if (requestId) {\n const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId)\n const userRequest = this.userRequests[userRequestIndex] as SignUserRequest\n if (userRequest.action.kind === 'calls') {\n ;(userRequest.action as Calls).calls = (userRequest.action as Calls).calls.filter(\n (c) => c.id !== callId\n )\n\n if (userRequest.action.calls.length === 0) {\n // the reject will remove the userRequest which will rebuild the action and update the signAccountOp\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.find((a) => a.addr === accountAddr)!,\n networkId,\n nonce: this.accounts.accountStates[accountAddr][networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n\n this.actions.addOrUpdateAction(accountOpAction)\n this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n }\n } else {\n this.emitError({\n message: 'Reject call: the call was not found or was not linked to a user request',\n level: 'major',\n error: new Error(\n `Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`\n )\n })\n }\n }\n\n removeActiveRoute(activeRouteId: number) {\n const userRequest = this.userRequests.find((r) =>\n [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(\n r.id\n )\n )\n\n if (userRequest) {\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n this.swapAndBridge.removeActiveRoute(activeRouteId)\n }\n }\n\n async addUserRequest(\n req: UserRequest,\n actionPosition: ActionPosition = 'last',\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (req.action.kind === 'calls') {\n ;(req.action as Calls).calls.forEach((_, i) => {\n ;(req.action as Calls).calls[i].id = `${req.id}-${i}`\n })\n }\n if (actionPosition === 'first') {\n this.userRequests.unshift(req)\n } else {\n this.userRequests.push(req)\n }\n\n const { id, action, meta } = req\n if (action.kind === 'calls') {\n // @TODO\n // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching\n // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network,\n // and be recalculated when one gets dismissed\n // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise;\n // 4) manage recalc on removeUserRequest too in order to handle EOAs\n // @TODO consider re-using this whole block in removeUserRequest\n await this.#ensureAccountInfo(meta.accountAddr, meta.networkId)\n if (this.signAccOpInitError) {\n return req.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message: this.signAccOpInitError\n })\n )\n }\n\n if (this.#signAccountOpSigningPromise) await this.#signAccountOpSigningPromise\n if (this.#signAccountOpBroadcastPromise) await this.#signAccountOpBroadcastPromise\n\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)!\n const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]\n\n if (isSmartAccount(account)) {\n const network = this.networks.networks.find((n) => n.id === meta.networkId)!\n\n // find me the accountOp for the network if any, it's always 1 for SA\n const currentAccountOpAction = this.actions.actionsQueue.find(\n (a) =>\n a.type === 'accountOp' &&\n a.accountOp.accountAddr === account.addr &&\n a.accountOp.networkId === network.id\n ) as AccountOpAction | undefined\n\n const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(\n account.addr,\n (message) =>\n message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n message.networkId === network.id\n )\n\n const hasAuthorized =\n !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization ||\n !!entryPointAuthorizationMessageFromHistory\n\n if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) {\n await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType)\n this.emitUpdate()\n return\n }\n\n const accountOpAction = makeSmartAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue,\n entryPointAuthorizationSignature:\n entryPointAuthorizationMessageFromHistory?.signature ?? undefined\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n if (this.signAccountOp) {\n if (this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n } else {\n // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation.\n // It's necessary to continue operating with the token `amountPostSimulation` amount.\n this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n const accountOpAction = makeBasicAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequest: req\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n }\n } else {\n let actionType: 'dappRequest' | 'benzin' | 'signMessage' | 'switchAccount' = 'dappRequest'\n\n if (req.action.kind === 'typedMessage' || req.action.kind === 'message') {\n actionType = 'signMessage'\n\n if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) {\n const msgReq = this.userRequests.find((uReq) => uReq.id === id)\n if (!msgReq) return\n msgReq.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message:\n 'Rejected: Please complete your pending message request before initiating a new one.'\n })\n )\n this.userRequests.splice(this.userRequests.indexOf(msgReq), 1)\n return\n }\n }\n if (req.action.kind === 'benzin') actionType = 'benzin'\n if (req.action.kind === 'switchAccount') actionType = 'switchAccount'\n\n this.actions.addOrUpdateAction(\n {\n id,\n type: actionType,\n userRequest: req as UserRequest as never\n },\n actionPosition,\n actionExecutionType\n )\n }\n\n this.emitUpdate()\n }\n\n // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations\n // first one sounds more reasonable\n // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue)\n removeUserRequest(\n id: UserRequest['id'],\n options: {\n shouldRemoveSwapAndBridgeRoute: boolean\n shouldUpdateAccount?: boolean\n shouldOpenNextRequest?: boolean\n } = {\n shouldRemoveSwapAndBridgeRoute: true,\n shouldUpdateAccount: true,\n shouldOpenNextRequest: true\n }\n ) {\n const req = this.userRequests.find((uReq) => uReq.id === id)\n if (!req) return\n\n // remove from the request queue\n this.userRequests.splice(this.userRequests.indexOf(req), 1)\n\n // update the pending stuff to be signed\n const { action, meta } = req\n if (action.kind === 'calls') {\n const network = this.networks.networks.find((net) => net.id === meta.networkId)!\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)\n if (!account)\n throw new Error(\n `batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`\n )\n\n if (isSmartAccount(account)) {\n const accountOpIndex = this.actions.actionsQueue.findIndex(\n (a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`\n )\n const accountOpAction = this.actions.actionsQueue[accountOpIndex] as\n | AccountOpAction\n | undefined\n // accountOp has just been rejected or broadcasted\n if (!accountOpAction) {\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n this.emitUpdate()\n return\n }\n\n accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(\n meta.accountAddr,\n meta.networkId\n )\n if (accountOpAction.accountOp.calls.length) {\n this.actions.addOrUpdateAction(accountOpAction)\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null })\n this.estimateSignAccountOp()\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(\n `${meta.accountAddr}-${meta.networkId}`,\n options.shouldOpenNextRequest\n )\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n } else if (id === ACCOUNT_SWITCH_USER_REQUEST) {\n const requestsToAdd = this.userRequestWaitingAccountSwitch.filter(\n (r) => r.meta.accountAddr === this.selectedAccount.account!.addr\n )\n this.actions.removeAction(\n id,\n this.selectedAccount.account?.addr !== (action as any).params!.switchToAccountAddr\n )\n ;(async () => {\n // eslint-disable-next-line no-restricted-syntax\n for (const r of requestsToAdd) {\n this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1)\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(r)\n }\n })()\n } else {\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n }\n this.emitUpdate()\n }\n\n async addEntryPointAuthorization(\n req: UserRequest,\n network: Network,\n accountState: AccountOnchainState,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (\n this.actions.visibleActionsQueue.find(\n (a) =>\n a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n (a as SignMessageAction).userRequest.meta.networkId === req.meta.networkId\n )\n ) {\n this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return\n }\n\n const typedMessageAction = await getEntryPointAuthorization(\n req.meta.accountAddr,\n network.chainId,\n BigInt(accountState.nonce)\n )\n await this.addUserRequest(\n {\n id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n action: typedMessageAction,\n meta: {\n isSignAction: true,\n accountAddr: req.meta.accountAddr,\n networkId: req.meta.networkId\n },\n session: req.session,\n dappPromise: req?.dappPromise\n ? { reject: req?.dappPromise?.reject, resolve: () => {} }\n : undefined\n } as SignUserRequest,\n 'first',\n actionExecutionType\n )\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.networks.addNetwork(network)\n await this.updateSelectedAccountPortfolio()\n }\n\n async removeNetwork(id: NetworkId) {\n await this.networks.removeNetwork(id)\n this.portfolio.removeNetworkData(id)\n this.defiPositions.removeNetworkData(id)\n this.accountAdder.removeNetworkData(id)\n }\n\n async resolveAccountOpAction(data: any, actionId: AccountOpAction['id']) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp } = accountOpAction as AccountOpAction\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!network) return\n\n const meta: SignUserRequest['meta'] = {\n isSignAction: true,\n accountAddr: accountOp.accountAddr,\n chainId: network.chainId,\n networkId: '',\n txnId: null,\n userOpHash: null\n }\n if (data.submittedAccountOp) {\n // can be undefined, check submittedAccountOp.ts\n meta.txnId = data.submittedAccountOp.txnId\n\n meta.identifiedBy = data.submittedAccountOp.identifiedBy\n meta.submittedAccountOp = data.submittedAccountOp\n }\n\n const benzinUserRequest: SignUserRequest = {\n id: new Date().getTime(),\n action: { kind: 'benzin' },\n meta\n }\n await this.addUserRequest(benzinUserRequest, 'first')\n\n this.actions.removeAction(actionId)\n\n // handle wallet_sendCalls before pollTxnId as 1) it's faster\n // 2) the identifier is different\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const walletSendCallsUserReq = this.userRequests.find(\n (r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls\n )\n if (walletSendCallsUserReq) {\n walletSendCallsUserReq.dappPromise?.resolve({\n hash: getDappIdentifier(data.submittedAccountOp)\n })\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(walletSendCallsUserReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n // Note: this may take a while!\n const txnId = await pollTxnId(\n data.submittedAccountOp.identifiedBy,\n network,\n this.fetch,\n this.callRelayer\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId)\n if (uReq) {\n if (txnId) {\n uReq.dappPromise?.resolve({ hash: txnId })\n } else {\n uReq.dappPromise?.reject(\n ethErrors.rpc.transactionRejected({\n message: 'Transaction rejected by the bundler'\n })\n )\n }\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(uReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n this.emitUpdate()\n }\n\n rejectAccountOpAction(\n err: string,\n actionId: AccountOpAction['id'],\n shouldOpenNextAction: boolean\n ) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp, id } = accountOpAction as AccountOpAction\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(actionId, shouldOpenNextAction)\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n if (call.fromUserRequestId) this.rejectUserRequest(err, call.fromUserRequestId)\n }\n\n this.emitUpdate()\n }\n\n async #updateGasPrice() {\n await this.#initialLoadPromise\n\n // if there's no signAccountOp initialized, we don't want to fetch gas\n const accOp = this.signAccountOp?.accountOp ?? null\n if (!accOp) return undefined\n\n const network = this.networks.networks.find((net) => net.id === accOp.networkId)\n if (!network) return undefined // shouldn't happen\n\n const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr)\n if (!account) return undefined // shouldn't happen\n\n const is4337 = isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[accOp.accountAddr][accOp.networkId]\n )\n const bundler = this.signAccountOp\n ? this.signAccountOp.bundlerSwitcher.getBundler()\n : getDefaultBundler(network)\n const bundlerFetch = async () => {\n if (!is4337) return null\n const errorCallback = (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n }\n return bundler.fetchGasPrices(network, errorCallback).catch((e) => {\n this.emitError({\n level: 'silent',\n message: \"Failed to fetch the bundler's gas price\",\n error: e\n })\n })\n }\n const [gasPriceData, bundlerGas] = await Promise.all([\n getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => {\n this.emitError({\n level: 'major',\n message: `Unable to get gas price for ${network.id}`,\n error: new Error(`Failed to fetch gas price: ${e?.message}`)\n })\n return null\n }),\n bundlerFetch()\n ])\n\n if (gasPriceData && gasPriceData.gasPrice) this.gasPrices[network.id] = gasPriceData.gasPrice\n if (bundlerGas)\n this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }\n\n return {\n blockGasLimit: gasPriceData?.blockGasLimit\n }\n }\n\n async updateSignAccountOpGasPrice() {\n if (!this.signAccountOp) return\n\n const accOp = this.signAccountOp.accountOp\n const gasData = await this.#updateGasPrice()\n\n // there's a chance signAccountOp gets destroyed between the time\n // the first \"if (!this.signAccountOp) return\" is performed and\n // the time we get here. To prevent issues, we check one more time\n if (!this.signAccountOp) return\n\n this.signAccountOp.update({\n gasPrices: this.gasPrices[accOp.networkId],\n bundlerGasPrices: this.bundlerGasPrices[accOp.networkId],\n blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined\n })\n this.emitUpdate()\n }\n\n // @TODO: protect this from race conditions/simultanous executions\n async estimateSignAccountOp() {\n try {\n if (!this.signAccountOp) return\n\n // make a local copy to avoid updating the main reference\n const localAccountOp: AccountOp = { ...this.signAccountOp.accountOp }\n\n await this.#initialLoadPromise\n // new accountOps should have spoof signatures so that they can be easily simulated\n // this is not used by the Estimator, because it iterates through all associatedKeys and\n // it knows which ones are authenticated, and it can generate it's own spoofSig\n // @TODO\n // accountOp.signature = `${}03`\n\n // TODO check if needed data in accountStates are available\n // this.accountStates[accountOp.accountAddr][accountOp.networkId].\n const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr)\n\n // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment.\n // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee.\n //\n // If the current account is an EOA, only this account can pay the fee,\n // and there's no need for checking other EOA accounts native balances.\n // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here.\n //\n // we're excluding the view only accounts from the natives to check\n // in all cases EXCEPT the case where we're making an estimation for\n // the view only account itself. In all other, view only accounts options\n // should not be present as the user cannot pay the fee with them (no key)\n const nativeToCheck = account?.creation\n ? this.accounts.accounts\n .filter(\n (acc) =>\n !isSmartAccount(acc) &&\n (acc.addr === localAccountOp.accountAddr ||\n !getIsViewOnly(this.keystore.keys, acc.associatedKeys))\n )\n .map((acc) => acc.addr)\n : []\n\n if (!account)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`\n )\n const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId)\n if (!network)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`\n )\n\n // Take the fee tokens from two places: the user's tokens and his gasTank\n // The gasTank tokens participate on each network as they belong everywhere\n // NOTE: at some point we should check all the \"?\" signs below and if\n // an error pops out, we should notify the user about it\n const networkFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[\n localAccountOp.networkId\n ]?.result?.feeTokens ?? []\n const gasTankFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result\n ?.tokens ?? []\n\n const feeTokens =\n [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []\n\n // can be read from the UI\n const humanization = humanizeAccountOp(localAccountOp, {})\n humanization.forEach((call: any) => {\n if (!call.fullVisualization) return\n\n call.fullVisualization.forEach(async (visualization: any) => {\n if (visualization.type !== 'address' || !visualization.address) return\n\n await this.domains.reverseLookup(visualization.address)\n })\n })\n\n const additionalHints: GetOptions['additionalErc20Hints'] = humanization\n .map((call: any) =>\n !call.fullVisualization\n ? []\n : call.fullVisualization.map((vis: any) =>\n vis.address && isAddress(vis.address) ? getAddress(vis.address) : ''\n )\n )\n .flat()\n .filter((x: any) => isAddress(x))\n\n this.portfolio.addTokensToBeLearned(additionalHints, network.id)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n this.signAccountOp.accountOp\n )\n\n const [, estimation] = await Promise.all([\n // NOTE: we are not emitting an update here because the portfolio controller will do that\n // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as\n // it may have different needs\n this.portfolio.updateSelectedAccount(\n localAccountOp.accountAddr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate: true }\n ),\n estimate(\n this.providers.providers[localAccountOp.networkId],\n network,\n account,\n localAccountOp,\n this.accounts.accountStates,\n nativeToCheck,\n // @TODO - first time calling this, portfolio is still not loaded.\n feeTokens,\n (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n },\n this.signAccountOp.bundlerSwitcher,\n {\n is4337Broadcast: isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]\n )\n }\n ).catch((e) => {\n const { message } = getHumanReadableEstimationError(e)\n\n this.emitError({\n level: 'major',\n message,\n error: e\n })\n return null\n })\n ])\n\n // @race\n // if the signAccountOp has been deleted, don't continue as the request has already finished\n if (!this.signAccountOp) return\n\n if (estimation) {\n const currentNonceAhead =\n BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n)\n\n // if the nonce from the estimation is bigger than the one in localAccountOp,\n // override the accountState and accountOp with the newly detected nonce\n if (currentNonceAhead) {\n localAccountOp.nonce = BigInt(estimation.currentAccountNonce)\n this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n\n if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId])\n this.accounts.accountStates[localAccountOp.accountAddr][\n localAccountOp.networkId\n ].nonce = localAccountOp.nonce\n }\n\n const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'\n const lastTxn = this.activity.getLastTxn(localAccountOp.networkId)\n const SAHasOldNonceOnARelayerNetwork =\n isSmartAccount(account) &&\n !network.erc4337.enabled &&\n lastTxn &&\n localAccountOp.nonce === lastTxn.nonce &&\n lastTxn.success &&\n lastTxn.status === AccountOpStatus.Success\n\n if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n return\n }\n }\n\n if (\n estimation &&\n estimation.nonFatalErrors &&\n estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') &&\n this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]\n ) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n\n // returning here means estimation will not be set => better UX as\n // the user will not see the warning but instead\n // just wait for the new estimation\n return\n }\n\n // check if an RBF should be applied for the incoming transaction\n // for SA conditions are: take the last broadcast but not confirmed accOp\n // and check if the nonce is the same as the current nonce (non 4337 txns)\n // for EOA: check the last broadcast but not confirmed txn across SA\n // as the EOA could've broadcast a txn there + it's own history and\n // compare the highest found nonce\n const rbfAccountOps: { [key: string]: SubmittedAccountOp | null } = {}\n nativeToCheck.push(localAccountOp.accountAddr)\n nativeToCheck.forEach((accId) => {\n const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId)\n\n // the accountState of the nativeToCheck may no be initialized\n const currentNonce =\n this.accounts.accountStates &&\n this.accounts.accountStates[accId] &&\n this.accounts.accountStates[accId][localAccountOp.networkId]\n ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce\n : null\n\n rbfAccountOps[accId] =\n notConfirmedOp &&\n !notConfirmedOp.gasFeePayment?.isERC4337 &&\n currentNonce &&\n currentNonce === notConfirmedOp.nonce\n ? notConfirmedOp\n : null\n })\n\n // if there's an estimation error, override the pending results\n if (estimation && estimation.error) {\n this.portfolio.overridePendingResults(localAccountOp)\n }\n // update the signAccountOp controller once estimation finishes;\n // this eliminates the infinite loading bug if the estimation comes slower\n if (this.signAccountOp && estimation) {\n this.signAccountOp.update({ estimation, rbfAccountOps })\n }\n } catch (error: any) {\n this.signAccountOp?.calculateWarnings()\n this.emitError({\n level: 'silent',\n message: 'Estimation error',\n error\n })\n }\n }\n\n /**\n * There are 4 ways to broadcast an AccountOp:\n * 1. For basic accounts (EOA), there is only one way to do that. After\n * signing the transaction, the serialized signed transaction object gets\n * send to the network.\n * 2. For smart accounts, when EOA pays the fee. Two signatures are needed\n * for this. The first one is the signature of the AccountOp itself. The\n * second one is the signature of the transaction that will be executed\n * by the smart account.\n * 3. For smart accounts that broadcast the ERC-4337 way.\n * 4. for smart accounts, when the Relayer does the broadcast.\n *\n */\n async #broadcastSignedAccountOp() {\n const accountOp = this.signAccountOp?.accountOp\n const estimation = this.signAccountOp?.estimation\n const actionId = this.signAccountOp?.fromActionId\n const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher\n const contactSupportPrompt = 'Please try again or contact support if the problem persists.'\n\n if (\n !accountOp ||\n !estimation ||\n !actionId ||\n !accountOp.signingKeyAddr ||\n !accountOp.signingKeyType ||\n !accountOp.signature ||\n !bundlerSwitcher\n ) {\n const message = `Missing mandatory transaction details. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const provider = this.providers.providers[accountOp.networkId]\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!provider) {\n const networkName = network?.name || `network with id ${accountOp.networkId}`\n const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!account) {\n const addr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Account with address ${addr} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!network) {\n const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n let transactionRes: {\n txnId?: string\n nonce: number\n identifiedBy: AccountOpIdentifiedBy\n } | null = null\n\n // Basic account (EOA)\n if (!isSmartAccount(account)) {\n try {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`\n return await this.throwBroadcastAccountOp({ message, accountState })\n }\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const gasFeePayment = accountOp.gasFeePayment!\n const { to, value, data } = accountOp.calls[0]\n const rawTxn: TxnRequest = {\n to: to ?? undefined,\n value,\n data,\n chainId: network!.chainId,\n nonce: await provider.getTransactionCount(accountOp.accountAddr),\n gasLimit: gasFeePayment.simulatedGasLimit\n }\n\n // if it's eip1559, send it as such. If no, go to legacy\n if (gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account but EOA pays the fee\n else if (\n account.creation &&\n accountOp.gasFeePayment &&\n accountOp.gasFeePayment.paidBy !== account.addr\n ) {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`\n\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n let data\n let to\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n to = accountOp.accountAddr\n data = ambireAccount.encodeFunctionData('execute', [\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n } else {\n const ambireFactory = new Interface(AmbireFactory.abi)\n to = account.creation.factoryAddr\n data = ambireFactory.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n }\n\n try {\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const rawTxn: TxnRequest = {\n to,\n data,\n // We ultimately do a smart contract call, which means we don't need\n // to send any `value` from the EOA address. The actual `value` will\n // get taken from the value encoded in the `data` field.\n value: BigInt(0),\n chainId: network.chainId,\n nonce: await provider.getTransactionCount(accountOp.gasFeePayment!.paidBy),\n gasLimit: accountOp.gasFeePayment.simulatedGasLimit\n }\n\n if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account, the ERC-4337 way\n else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) {\n const userOperation = accountOp.asUserOperation\n if (!userOperation) {\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n // broadcast through bundler's service\n let userOperationHash\n const bundler = bundlerSwitcher.getBundler()\n try {\n userOperationHash = await bundler.broadcast(userOperation, network)\n } catch (e: any) {\n let retryMsg\n\n // if the signAccountOp is still active (it should be)\n // try to switch the bundler and ask the user to try again\n // TODO: explore more error case where we switch the bundler\n if (this.signAccountOp) {\n const decodedError = bundler.decodeBundlerError(e)\n const humanReadable = getHumanReadableBroadcastError(decodedError)\n const switcher = this.signAccountOp.bundlerSwitcher\n this.signAccountOp.updateStatus(SigningStatus.ReadyToSign)\n\n if (switcher.canSwitch(humanReadable)) {\n switcher.switch()\n this.estimateSignAccountOp()\n this.#updateGasPrice()\n retryMsg = 'Broadcast failed because bundler was down. Please try again'\n }\n }\n\n return this.throwBroadcastAccountOp({\n error: e,\n accountState,\n provider,\n network,\n message: retryMsg\n })\n }\n if (!userOperationHash) {\n return this.throwBroadcastAccountOp({\n message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.'\n })\n }\n\n transactionRes = {\n nonce: Number(userOperation.nonce),\n identifiedBy: {\n type: 'UserOperation',\n identifier: userOperationHash,\n bundler: bundler.getName()\n }\n }\n }\n // Smart account, the Relayer way\n else {\n try {\n const body = {\n gasLimit: Number(accountOp.gasFeePayment!.simulatedGasLimit),\n txns: getSignableCalls(accountOp),\n signature: accountOp.signature,\n signer: { address: accountOp.signingKeyAddr },\n nonce: Number(accountOp.nonce)\n }\n const additionalRelayerNetwork = relayerAdditionalNetworks.find(\n (net) => net.chainId === network.chainId\n )\n const relayerNetworkId = additionalRelayerNetwork\n ? additionalRelayerNetwork.name\n : accountOp.networkId\n const response = await this.callRelayer(\n `/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`,\n 'POST',\n body\n )\n if (!response.success) throw new Error(response.message)\n\n transactionRes = {\n txnId: response.txId,\n nonce: Number(accountOp.nonce),\n identifiedBy: {\n type: 'Relayer',\n identifier: response.id\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true })\n }\n }\n\n if (!transactionRes)\n return this.throwBroadcastAccountOp({\n message: 'No transaction response received after being broadcasted.'\n })\n\n this.portfolio.markSimulationAsBroadcasted(account.addr, network.id)\n\n const submittedAccountOp: SubmittedAccountOp = {\n ...accountOp,\n status: AccountOpStatus.BroadcastedButNotConfirmed,\n txnId: transactionRes.txnId,\n nonce: BigInt(transactionRes.nonce),\n identifiedBy: transactionRes.identifiedBy,\n timestamp: new Date().getTime(),\n isSingletonDeploy: !!accountOp.calls.find(\n (call) => call.to && getAddress(call.to) === SINGLETON\n )\n }\n await this.activity.addAccountOp(submittedAccountOp)\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp)\n await this.resolveAccountOpAction(\n {\n networkId: network.id,\n isUserOp: !!accountOp?.asUserOperation,\n submittedAccountOp\n },\n actionId\n )\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The transaction was successfully signed and broadcasted to the network.'\n })\n return Promise.resolve(submittedAccountOp)\n }\n\n // ! IMPORTANT !\n // Banners that depend on async data from sub-controllers should be implemented\n // in the sub-controllers themselves. This is because updates in the sub-controllers\n // will not trigger emitUpdate in the MainController, therefore the banners will\n // remain the same until a subsequent update in the MainController.\n get banners(): Banner[] {\n if (!this.selectedAccount.account || !this.networks.isInitialized) return []\n\n const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.selectedAccount.account.addr,\n this.swapAndBridge.activeRoutes\n )\n const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter(\n (r) => r.routeStatus === 'ready'\n )\n\n const accountOpBanners = getAccountOpBanners({\n accountOpActionsByNetwork: getAccountOpActionsByNetwork(\n this.selectedAccount.account.addr,\n this.actions.actionsQueue\n ),\n selectedAccount: this.selectedAccount.account.addr,\n accounts: this.accounts.accounts,\n networks: this.networks.networks,\n swapAndBridgeRoutesPendingSignature\n })\n\n return [...accountOpBanners]\n }\n\n // Technically this is an anti-pattern, but it's the only way to\n // test the error handling in the method.\n protected throwBroadcastAccountOp({\n message: humanReadableMessage,\n error: _err,\n accountState,\n isRelayer = false,\n provider = undefined,\n network = undefined\n }: {\n message?: string\n error?: Error\n accountState?: AccountOnchainState\n isRelayer?: boolean\n provider?: RPCProvider\n network?: Network\n }) {\n const originalMessage = _err?.message\n let message = humanReadableMessage\n let isReplacementFeeLow = false\n\n if (originalMessage) {\n if (originalMessage.includes('replacement fee too low')) {\n message =\n 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'\n isReplacementFeeLow = true\n this.estimateSignAccountOp()\n } else if (\n originalMessage.includes('pimlico_getUserOperationGasPrice') ||\n originalMessage.includes('preVerificationGas')\n ) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n } else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) {\n message = `Signer key not supported on this network.${\n !accountState?.isV2\n ? 'You can add/change signers from the web wallet or contact support.'\n : 'Please contact support.'\n }`\n } else if (originalMessage.includes('underpriced')) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n } else if (originalMessage.includes('Failed to fetch') && isRelayer) {\n message =\n 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'\n }\n }\n\n if (!message) {\n message = getHumanReadableBroadcastError(_err || new Error('')).message\n\n // if the message states that the paymaster doesn't have sufficient amount,\n // add it to the failedPaymasters to disable it until a top-up is made\n if (message.includes(insufficientPaymasterFunds) && provider && network) {\n failedPaymasters.addInsufficientFunds(provider, network).then(() => {\n this.estimateSignAccountOp()\n })\n }\n }\n\n // To enable another try for signing in case of broadcast fail\n // broadcast is called in the FE only after successful signing\n this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow)\n this.feePayerKey = null\n\n return Promise.reject(\n new EmittableError({ level: 'major', message, error: _err || new Error(message) })\n )\n }\n\n get isSignRequestStillActive(): boolean {\n if (!this.signAccountOp) return false\n\n return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp!.fromActionId)\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n banners: this.banners,\n isSignRequestStillActive: this.isSignRequestStillActive\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.js b/dist/src/controllers/networks/networks.js index 4a4c93026..88cc4f866 100644 --- a/dist/src/controllers/networks/networks.js +++ b/dist/src/controllers/networks/networks.js @@ -1,7 +1,11 @@ -import EmittableError from '../../classes/EmittableError'; -import { networks as predefinedNetworks } from '../../consts/networks'; -import { getFeaturesByNetworkProperties, getNetworkInfo, is4337Enabled, migrateNetworkPreferencesToNetworks } from '../../libs/networks/networks'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NetworksController = void 0; +const tslib_1 = require("tslib"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const networks_1 = require("../../consts/networks"); +const networks_2 = require("../../libs/networks/networks"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const STATUS_WRAPPED_METHODS = { addNetwork: 'INITIAL', updateNetwork: 'INITIAL' @@ -11,7 +15,7 @@ const STATUS_WRAPPED_METHODS = { * that users can add either through a dApp request or manually via the UI. This controller provides functions * for adding, updating, and removing networks. */ -export class NetworksController extends EventEmitter { +class NetworksController extends eventEmitter_1.default { #storage; #fetch; #networks = {}; @@ -35,13 +39,13 @@ export class NetworksController extends EventEmitter { } get networks() { if (!this.#networks) - return predefinedNetworks; + return networks_1.networks; const uniqueNetworksByChainId = Object.values(this.#networks) .sort((a, b) => +b.predefined - +a.predefined) // first predefined .filter((item, index, self) => self.findIndex((i) => i.chainId === item.chainId) === index); // unique by chainId (predefined with priority) return uniqueNetworksByChainId.map((network) => { // eslint-disable-next-line no-param-reassign - network.features = getFeaturesByNetworkProperties({ + network.features = (0, networks_2.getFeaturesByNetworkProperties)({ isSAEnabled: network.isSAEnabled, isOptimistic: network.isOptimistic ?? false, rpcNoStateOverride: network.rpcNoStateOverride, @@ -63,12 +67,12 @@ export class NetworksController extends EventEmitter { let storedNetworks; storedNetworks = await this.#storage.get('networks', {}); if (!Object.keys(storedNetworks).length && storedNetworkPreferences) { - storedNetworks = await migrateNetworkPreferencesToNetworks(storedNetworkPreferences); + storedNetworks = await (0, networks_2.migrateNetworkPreferencesToNetworks)(storedNetworkPreferences); await this.#storage.set('networks', storedNetworks); await this.#storage.remove('networkPreferences'); } this.#networks = storedNetworks; - predefinedNetworks.forEach((n) => { + networks_1.networks.forEach((n) => { this.#networks[n.id] = { ...n, ...(this.#networks[n.id] || {}), @@ -76,7 +80,7 @@ export class NetworksController extends EventEmitter { feeOptions: n.feeOptions, hasRelayer: n.hasRelayer, erc4337: { - enabled: is4337Enabled(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337), + enabled: (0, networks_2.is4337Enabled)(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337), hasPaymaster: n.erc4337.hasPaymaster, defaultBundler: n.erc4337.defaultBundler, bundlers: n.erc4337.bundlers @@ -87,7 +91,7 @@ export class NetworksController extends EventEmitter { }); // add predefined: false for each deleted network from predefined Object.keys(this.#networks).forEach((networkName) => { - const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === this.#networks[networkName].chainId); + const predefinedNetwork = networks_1.networks.find((net) => net.chainId === this.#networks[networkName].chainId); if (!predefinedNetwork) { this.#networks[networkName].predefined = false; } @@ -103,7 +107,7 @@ export class NetworksController extends EventEmitter { this.networkToAddOrUpdate = networkToAddOrUpdate; this.emitUpdate(); // eslint-disable-next-line @typescript-eslint/no-floating-promises - getNetworkInfo(this.#fetch, networkToAddOrUpdate.rpcUrl, networkToAddOrUpdate.chainId, (info) => { + (0, networks_2.getNetworkInfo)(this.#fetch, networkToAddOrUpdate.rpcUrl, networkToAddOrUpdate.chainId, (info) => { if (this.networkToAddOrUpdate) { this.networkToAddOrUpdate = { ...this.networkToAddOrUpdate, info }; this.emitUpdate(); @@ -126,7 +130,7 @@ export class NetworksController extends EventEmitter { const networkId = network.name.toLowerCase(); // make sure the id and chainId of the network are unique if (ids.indexOf(networkId) !== -1 || chainIds.indexOf(BigInt(network.chainId)) !== -1) { - throw new EmittableError({ + throw new EmittableError_1.default({ message: 'The network you are trying to add has already been added.', level: 'major', error: new Error('settings: addNetwork chain already added (duplicate id/chainId)') @@ -141,7 +145,7 @@ export class NetworksController extends EventEmitter { ...network, ...info, feeOptions, - features: getFeaturesByNetworkProperties(info), + features: (0, networks_2.getFeaturesByNetworkProperties)(info), hasRelayer: false, predefined: false }; @@ -170,7 +174,7 @@ export class NetworksController extends EventEmitter { this.#networks[networkId] = { ...this.#networks[networkId], ...changedNetwork }; // if force4337 is updated, we have to update the enabled flag as well if ('force4337' in changedNetwork) { - this.#networks[networkId].erc4337.enabled = is4337Enabled(true, this.#networks[networkId], changedNetwork.force4337); + this.#networks[networkId].erc4337.enabled = (0, networks_2.is4337Enabled)(true, this.#networks[networkId], changedNetwork.force4337); } this.#onAddOrUpdateNetwork(this.#networks[networkId]); await this.#storage.set('networks', this.#networks); @@ -192,7 +196,7 @@ export class NetworksController extends EventEmitter { return; } // eslint-disable-next-line @typescript-eslint/no-floating-promises - getNetworkInfo(this.#fetch, changedNetwork.selectedRpcUrl, this.#networks[networkId].chainId, async (info) => { + (0, networks_2.getNetworkInfo)(this.#fetch, changedNetwork.selectedRpcUrl, this.#networks[networkId].chainId, async (info) => { if (Object.values(info).some((prop) => prop === 'LOADING')) { return; } @@ -236,4 +240,5 @@ export class NetworksController extends EventEmitter { }; } } +exports.NetworksController = NetworksController; //# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/controllers/networks/networks.js.map b/dist/src/controllers/networks/networks.js.map index 6593f58fe..1bb7f9211 100644 --- a/dist/src/controllers/networks/networks.js.map +++ b/dist/src/controllers/networks/networks.js.map @@ -1 +1 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/controllers/networks/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n AddNetworkRequestParams,\n Network,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getFeaturesByNetworkProperties,\n getNetworkInfo,\n is4337Enabled,\n migrateNetworkPreferencesToNetworks\n} from '../../libs/networks/networks'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst STATUS_WRAPPED_METHODS = {\n addNetwork: 'INITIAL',\n updateNetwork: 'INITIAL'\n} as const\n\n/**\n * The NetworksController is responsible for managing networks. It handles both predefined networks and those\n * that users can add either through a dApp request or manually via the UI. This controller provides functions\n * for adding, updating, and removing networks.\n */\nexport class NetworksController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #networks: { [key: NetworkId]: Network } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n info?: NetworkInfoLoading\n } | null = null\n\n #onRemoveNetwork: (id: NetworkId) => void\n\n #onAddOrUpdateNetwork: (network: Network) => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n onAddOrUpdateNetwork: (network: Network) => void,\n onRemoveNetwork: (id: NetworkId) => void\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#onAddOrUpdateNetwork = onAddOrUpdateNetwork\n this.#onRemoveNetwork = onRemoveNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized(): boolean {\n return !!Object.keys(this.#networks).length\n }\n\n get networks(): Network[] {\n if (!this.#networks) return predefinedNetworks\n\n const uniqueNetworksByChainId = Object.values(this.#networks)\n .sort((a, b) => +b.predefined - +a.predefined) // first predefined\n .filter((item, index, self) => self.findIndex((i) => i.chainId === item.chainId) === index) // unique by chainId (predefined with priority)\n return uniqueNetworksByChainId.map((network) => {\n // eslint-disable-next-line no-param-reassign\n network.features = getFeaturesByNetworkProperties({\n isSAEnabled: network.isSAEnabled,\n isOptimistic: network.isOptimistic ?? false,\n rpcNoStateOverride: network.rpcNoStateOverride,\n erc4337: network.erc4337,\n areContractsDeployed: network.areContractsDeployed,\n feeOptions: network.feeOptions,\n platformId: network.platformId,\n nativeAssetId: network.nativeAssetId,\n flagged: network.flagged ?? false,\n chainId: network.chainId,\n hasSingleton: network.hasSingleton,\n force4337: network.force4337\n })\n return network\n })\n }\n\n async #load() {\n const storedNetworkPreferences: { [key: NetworkId]: Partial } | undefined =\n await this.#storage.get('networkPreferences', undefined)\n let storedNetworks: { [key: NetworkId]: Network }\n storedNetworks = await this.#storage.get('networks', {})\n if (!Object.keys(storedNetworks).length && storedNetworkPreferences) {\n storedNetworks = await migrateNetworkPreferencesToNetworks(storedNetworkPreferences)\n await this.#storage.set('networks', storedNetworks)\n await this.#storage.remove('networkPreferences')\n }\n this.#networks = storedNetworks\n\n predefinedNetworks.forEach((n) => {\n this.#networks[n.id] = {\n ...n, // add the latest structure of the predefined network to include the new props that are not in storage yet\n ...(this.#networks[n.id] || {}), // override with stored props\n // attributes that should take predefined priority\n feeOptions: n.feeOptions,\n hasRelayer: n.hasRelayer,\n erc4337: {\n enabled: is4337Enabled(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337),\n hasPaymaster: n.erc4337.hasPaymaster,\n defaultBundler: n.erc4337.defaultBundler,\n bundlers: n.erc4337.bundlers\n },\n nativeAssetId: n.nativeAssetId,\n nativeAssetSymbol: n.nativeAssetSymbol\n }\n })\n\n // add predefined: false for each deleted network from predefined\n Object.keys(this.#networks).forEach((networkName) => {\n const predefinedNetwork = predefinedNetworks.find(\n (net) => net.chainId === this.#networks[networkName].chainId\n )\n if (!predefinedNetwork) {\n this.#networks[networkName].predefined = false\n }\n })\n\n // without await to avoid performance impact on load\n // needed to keep the networks storage up to date with the latest from predefinedNetworks\n this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n\n async setNetworkToAddOrUpdate(\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n force4337?: boolean\n } | null = null\n ) {\n await this.initialLoadPromise\n if (networkToAddOrUpdate) {\n this.networkToAddOrUpdate = networkToAddOrUpdate\n this.emitUpdate()\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n networkToAddOrUpdate.rpcUrl,\n networkToAddOrUpdate.chainId,\n (info) => {\n if (this.networkToAddOrUpdate) {\n this.networkToAddOrUpdate = { ...this.networkToAddOrUpdate, info }\n this.emitUpdate()\n }\n },\n networkToAddOrUpdate.force4337 ? { force4337: networkToAddOrUpdate.force4337 } : undefined\n )\n } else {\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n }\n\n async #addNetwork(network: AddNetworkRequestParams) {\n await this.initialLoadPromise\n if (\n !this.networkToAddOrUpdate?.info ||\n Object.values(this.networkToAddOrUpdate.info).some((prop) => prop === 'LOADING')\n ) {\n return\n }\n const chainIds = this.networks.map((net) => net.chainId)\n const ids = this.networks.map((n) => n.id)\n const networkId = network.name.toLowerCase()\n\n // make sure the id and chainId of the network are unique\n if (ids.indexOf(networkId) !== -1 || chainIds.indexOf(BigInt(network.chainId)) !== -1) {\n throw new EmittableError({\n message: 'The network you are trying to add has already been added.',\n level: 'major',\n error: new Error('settings: addNetwork chain already added (duplicate id/chainId)')\n })\n }\n\n const info = { ...(this.networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // @ts-ignore\n delete info.feeOptions\n this.#networks[networkId] = {\n id: networkId,\n ...network,\n ...info,\n feeOptions,\n features: getFeaturesByNetworkProperties(info),\n hasRelayer: false,\n predefined: false\n }\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.withStatus('addNetwork', () => this.#addNetwork(network))\n }\n\n async #updateNetwork(network: Partial, networkId: NetworkId) {\n await this.initialLoadPromise\n if (!Object.keys(network).length) return\n\n const networkData = this.networks.find((n) => n.id === networkId)\n const changedNetwork: Network = Object.keys(network).reduce((acc, key) => {\n if (!networkData) return acc\n\n // No need to save unchanged networks. Here we filter the networks that are the same as the ones in the storage.\n if (network[key as keyof Network] === networkData[key as keyof Network]) return acc\n\n return { ...acc, [key]: network[key as keyof Network] }\n }, {} as Network)\n\n // Update the networks with the incoming new values\n this.#networks[networkId] = { ...this.#networks[networkId], ...changedNetwork }\n\n // if force4337 is updated, we have to update the enabled flag as well\n if ('force4337' in changedNetwork) {\n this.#networks[networkId].erc4337.enabled = is4337Enabled(\n true,\n this.#networks[networkId],\n changedNetwork.force4337\n )\n }\n\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n\n const checkRPC = async (\n networkToAddOrUpdate: {\n chainId: bigint\n rpcUrl: string\n info?: NetworkInfoLoading | undefined\n } | null\n ) => {\n if (changedNetwork.selectedRpcUrl) {\n if (\n networkToAddOrUpdate?.info &&\n Object.values(networkToAddOrUpdate.info).every((prop) => prop !== 'LOADING')\n ) {\n const info = { ...(networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...info,\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n changedNetwork.selectedRpcUrl,\n this.#networks[networkId].chainId!,\n async (info) => {\n if (Object.values(info).some((prop) => prop === 'LOADING')) {\n return\n }\n\n const { feeOptions } = info as NetworkInfo\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...(info as NetworkInfo),\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n )\n }\n }\n\n // Do not wait the rpc validation in order to complete the execution of updateNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n checkRPC(this.networkToAddOrUpdate)\n this.networkToAddOrUpdate = null\n\n this.emitUpdate()\n }\n\n async updateNetwork(network: Partial, networkId: NetworkId) {\n await this.withStatus('updateNetwork', () => this.#updateNetwork(network, networkId))\n }\n\n async removeNetwork(id: NetworkId) {\n await this.initialLoadPromise\n if (!this.#networks[id]) return\n\n delete this.#networks[id]\n this.#onRemoveNetwork(id)\n await this.#storage.set('networks', this.#networks)\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized,\n networks: this.networks\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/controllers/networks/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n AddNetworkRequestParams,\n Network,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n getFeaturesByNetworkProperties,\n getNetworkInfo,\n is4337Enabled,\n migrateNetworkPreferencesToNetworks\n} from '../../libs/networks/networks'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst STATUS_WRAPPED_METHODS = {\n addNetwork: 'INITIAL',\n updateNetwork: 'INITIAL'\n} as const\n\n/**\n * The NetworksController is responsible for managing networks. It handles both predefined networks and those\n * that users can add either through a dApp request or manually via the UI. This controller provides functions\n * for adding, updating, and removing networks.\n */\nexport class NetworksController extends EventEmitter {\n #storage: Storage\n\n #fetch: Fetch\n\n #networks: { [key: NetworkId]: Network } = {}\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n info?: NetworkInfoLoading\n } | null = null\n\n #onRemoveNetwork: (id: NetworkId) => void\n\n #onAddOrUpdateNetwork: (network: Network) => void\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n onAddOrUpdateNetwork: (network: Network) => void,\n onRemoveNetwork: (id: NetworkId) => void\n ) {\n super()\n this.#storage = storage\n this.#fetch = fetch\n this.#onAddOrUpdateNetwork = onAddOrUpdateNetwork\n this.#onRemoveNetwork = onRemoveNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized(): boolean {\n return !!Object.keys(this.#networks).length\n }\n\n get networks(): Network[] {\n if (!this.#networks) return predefinedNetworks\n\n const uniqueNetworksByChainId = Object.values(this.#networks)\n .sort((a, b) => +b.predefined - +a.predefined) // first predefined\n .filter((item, index, self) => self.findIndex((i) => i.chainId === item.chainId) === index) // unique by chainId (predefined with priority)\n return uniqueNetworksByChainId.map((network) => {\n // eslint-disable-next-line no-param-reassign\n network.features = getFeaturesByNetworkProperties({\n isSAEnabled: network.isSAEnabled,\n isOptimistic: network.isOptimistic ?? false,\n rpcNoStateOverride: network.rpcNoStateOverride,\n erc4337: network.erc4337,\n areContractsDeployed: network.areContractsDeployed,\n feeOptions: network.feeOptions,\n platformId: network.platformId,\n nativeAssetId: network.nativeAssetId,\n flagged: network.flagged ?? false,\n chainId: network.chainId,\n hasSingleton: network.hasSingleton,\n force4337: network.force4337\n })\n return network\n })\n }\n\n async #load() {\n const storedNetworkPreferences: { [key: NetworkId]: Partial } | undefined =\n await this.#storage.get('networkPreferences', undefined)\n let storedNetworks: { [key: NetworkId]: Network }\n storedNetworks = await this.#storage.get('networks', {})\n if (!Object.keys(storedNetworks).length && storedNetworkPreferences) {\n storedNetworks = await migrateNetworkPreferencesToNetworks(storedNetworkPreferences)\n await this.#storage.set('networks', storedNetworks)\n await this.#storage.remove('networkPreferences')\n }\n this.#networks = storedNetworks\n\n predefinedNetworks.forEach((n) => {\n this.#networks[n.id] = {\n ...n, // add the latest structure of the predefined network to include the new props that are not in storage yet\n ...(this.#networks[n.id] || {}), // override with stored props\n // attributes that should take predefined priority\n feeOptions: n.feeOptions,\n hasRelayer: n.hasRelayer,\n erc4337: {\n enabled: is4337Enabled(!!n.erc4337.hasBundlerSupport, n, this.#networks[n.id]?.force4337),\n hasPaymaster: n.erc4337.hasPaymaster,\n defaultBundler: n.erc4337.defaultBundler,\n bundlers: n.erc4337.bundlers\n },\n nativeAssetId: n.nativeAssetId,\n nativeAssetSymbol: n.nativeAssetSymbol\n }\n })\n\n // add predefined: false for each deleted network from predefined\n Object.keys(this.#networks).forEach((networkName) => {\n const predefinedNetwork = predefinedNetworks.find(\n (net) => net.chainId === this.#networks[networkName].chainId\n )\n if (!predefinedNetwork) {\n this.#networks[networkName].predefined = false\n }\n })\n\n // without await to avoid performance impact on load\n // needed to keep the networks storage up to date with the latest from predefinedNetworks\n this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n\n async setNetworkToAddOrUpdate(\n networkToAddOrUpdate: {\n chainId: Network['chainId']\n rpcUrl: string\n force4337?: boolean\n } | null = null\n ) {\n await this.initialLoadPromise\n if (networkToAddOrUpdate) {\n this.networkToAddOrUpdate = networkToAddOrUpdate\n this.emitUpdate()\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n networkToAddOrUpdate.rpcUrl,\n networkToAddOrUpdate.chainId,\n (info) => {\n if (this.networkToAddOrUpdate) {\n this.networkToAddOrUpdate = { ...this.networkToAddOrUpdate, info }\n this.emitUpdate()\n }\n },\n networkToAddOrUpdate.force4337 ? { force4337: networkToAddOrUpdate.force4337 } : undefined\n )\n } else {\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n }\n\n async #addNetwork(network: AddNetworkRequestParams) {\n await this.initialLoadPromise\n if (\n !this.networkToAddOrUpdate?.info ||\n Object.values(this.networkToAddOrUpdate.info).some((prop) => prop === 'LOADING')\n ) {\n return\n }\n const chainIds = this.networks.map((net) => net.chainId)\n const ids = this.networks.map((n) => n.id)\n const networkId = network.name.toLowerCase()\n\n // make sure the id and chainId of the network are unique\n if (ids.indexOf(networkId) !== -1 || chainIds.indexOf(BigInt(network.chainId)) !== -1) {\n throw new EmittableError({\n message: 'The network you are trying to add has already been added.',\n level: 'major',\n error: new Error('settings: addNetwork chain already added (duplicate id/chainId)')\n })\n }\n\n const info = { ...(this.networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // @ts-ignore\n delete info.feeOptions\n this.#networks[networkId] = {\n id: networkId,\n ...network,\n ...info,\n feeOptions,\n features: getFeaturesByNetworkProperties(info),\n hasRelayer: false,\n predefined: false\n }\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n this.networkToAddOrUpdate = null\n this.emitUpdate()\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.withStatus('addNetwork', () => this.#addNetwork(network))\n }\n\n async #updateNetwork(network: Partial, networkId: NetworkId) {\n await this.initialLoadPromise\n if (!Object.keys(network).length) return\n\n const networkData = this.networks.find((n) => n.id === networkId)\n const changedNetwork: Network = Object.keys(network).reduce((acc, key) => {\n if (!networkData) return acc\n\n // No need to save unchanged networks. Here we filter the networks that are the same as the ones in the storage.\n if (network[key as keyof Network] === networkData[key as keyof Network]) return acc\n\n return { ...acc, [key]: network[key as keyof Network] }\n }, {} as Network)\n\n // Update the networks with the incoming new values\n this.#networks[networkId] = { ...this.#networks[networkId], ...changedNetwork }\n\n // if force4337 is updated, we have to update the enabled flag as well\n if ('force4337' in changedNetwork) {\n this.#networks[networkId].erc4337.enabled = is4337Enabled(\n true,\n this.#networks[networkId],\n changedNetwork.force4337\n )\n }\n\n this.#onAddOrUpdateNetwork(this.#networks[networkId])\n await this.#storage.set('networks', this.#networks)\n\n const checkRPC = async (\n networkToAddOrUpdate: {\n chainId: bigint\n rpcUrl: string\n info?: NetworkInfoLoading | undefined\n } | null\n ) => {\n if (changedNetwork.selectedRpcUrl) {\n if (\n networkToAddOrUpdate?.info &&\n Object.values(networkToAddOrUpdate.info).every((prop) => prop !== 'LOADING')\n ) {\n const info = { ...(networkToAddOrUpdate.info as NetworkInfo) }\n const { feeOptions } = info\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...info,\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getNetworkInfo(\n this.#fetch,\n changedNetwork.selectedRpcUrl,\n this.#networks[networkId].chainId!,\n async (info) => {\n if (Object.values(info).some((prop) => prop === 'LOADING')) {\n return\n }\n\n const { feeOptions } = info as NetworkInfo\n\n // eslint-disable-next-line no-param-reassign\n delete (info as any).feeOptions\n this.#networks[networkId] = {\n ...this.#networks[networkId],\n ...(info as NetworkInfo),\n ...feeOptions\n }\n\n await this.#storage.set('networks', this.#networks)\n\n this.emitUpdate()\n }\n )\n }\n }\n\n // Do not wait the rpc validation in order to complete the execution of updateNetwork\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n checkRPC(this.networkToAddOrUpdate)\n this.networkToAddOrUpdate = null\n\n this.emitUpdate()\n }\n\n async updateNetwork(network: Partial, networkId: NetworkId) {\n await this.withStatus('updateNetwork', () => this.#updateNetwork(network, networkId))\n }\n\n async removeNetwork(id: NetworkId) {\n await this.initialLoadPromise\n if (!this.#networks[id]) return\n\n delete this.#networks[id]\n this.#onRemoveNetwork(id)\n await this.#storage.set('networks', this.#networks)\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized,\n networks: this.networks\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.js b/dist/src/controllers/portfolio/portfolio.js index 01fdc32ba..ab90607b8 100644 --- a/dist/src/controllers/portfolio/portfolio.js +++ b/dist/src/controllers/portfolio/portfolio.js @@ -1,15 +1,19 @@ -import { getAddress, ZeroAddress } from 'ethers'; -import { isSmartAccount } from '../../libs/account/account'; -import { AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'; -import { Portfolio } from '../../libs/portfolio'; -import getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'; -import { getFlags, getPinnedGasTankTokens, getTokensReadyToLearn, getTotal, getUpdatedHints, processTokens, shouldGetAdditionalPortfolio, validateERC20Token } from '../../libs/portfolio/helpers'; -import { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'; -import { relayerCall } from '../../libs/relayerCall/relayerCall'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PortfolioController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const account_1 = require("../../libs/account/account"); +const accountOp_1 = require("../../libs/accountOp/accountOp"); +const portfolio_1 = require("../../libs/portfolio"); +const getNetworksWithAssets_1 = tslib_1.__importDefault(require("../../libs/portfolio/getNetworksWithAssets")); +const helpers_1 = require("../../libs/portfolio/helpers"); +const tokenPreferences_1 = require("../../libs/portfolio/migrations/tokenPreferences"); +const relayerCall_1 = require("../../libs/relayerCall/relayerCall"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); /* eslint-disable @typescript-eslint/no-shadow */ const LEARNED_TOKENS_NETWORK_LIMIT = 50; -export class PortfolioController extends EventEmitter { +class PortfolioController extends eventEmitter_1.default { #latest; #pending; // A queue to prevent race conditions when calling `updateSelectedAccount`. @@ -56,7 +60,7 @@ export class PortfolioController extends EventEmitter { this.#portfolioLibs = new Map(); this.#storage = storage; this.#fetch = fetch; - this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.#callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch }); this.#velcroUrl = velcroUrl; this.#providers = providers; this.#networks = networks; @@ -71,7 +75,7 @@ export class PortfolioController extends EventEmitter { await this.#accounts.initialLoadPromise; const storageTokenPreferences = await this.#storage.get('tokenPreferences', []); const storageCustomTokens = await this.#storage.get('customTokens', []); - const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(storageTokenPreferences, storageCustomTokens); + const { tokenPreferences, customTokens, shouldUpdateStorage } = (0, tokenPreferences_1.migrateTokenPreferences)(storageTokenPreferences, storageCustomTokens); this.tokenPreferences = tokenPreferences; this.customTokens = customTokens; if (shouldUpdateStorage) { @@ -159,7 +163,7 @@ export class PortfolioController extends EventEmitter { } async #updateNetworksWithAssets(accountId, accountState) { const storageStateByAccount = this.#networksWithAssetsByAccounts; - this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(accountId, accountState, storageStateByAccount, this.#providers.providers); + this.#networksWithAssetsByAccounts[accountId] = (0, getNetworksWithAssets_1.default)(accountId, accountState, storageStateByAccount, this.#providers.providers); this.emitUpdate(); await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts); } @@ -198,7 +202,7 @@ export class PortfolioController extends EventEmitter { await this.#initialLoadPromise; if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return; - const [isValid, standard] = (await validateERC20Token(token, accountId, this.#providers.providers[token.networkId])); + const [isValid, standard] = (await (0, helpers_1.validateERC20Token)(token, accountId, this.#providers.providers[token.networkId])); this.validTokens[standard] = { ...this.validTokens[standard], [`${token.address}-${token.networkId}`]: isValid @@ -215,7 +219,7 @@ export class PortfolioController extends EventEmitter { this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !== // eslint-disable-next-line no-underscore-dangle providers[network.id]?._getConnection().url) { - this.#portfolioLibs.set(key, new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)); + this.#portfolioLibs.set(key, new portfolio_1.Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)); } return this.#portfolioLibs.get(key); } @@ -295,7 +299,7 @@ export class PortfolioController extends EventEmitter { .map((t) => ({ ...t, symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol, - flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address) + flags: (0, helpers_1.getFlags)(res.data.rewards, 'rewards', t.networkId, t.address) })); accountState.rewards = { isReady: true, @@ -306,12 +310,12 @@ export class PortfolioController extends EventEmitter { lastSuccessfulUpdate: Date.now(), updateStarted: start, tokens: rewardsTokens, - total: getTotal(rewardsTokens) + total: (0, helpers_1.getTotal)(rewardsTokens) } }; const gasTankTokens = res.data.gasTank.balance.map((t) => ({ ...t, - flags: getFlags(res.data, 'gasTank', t.networkId, t.address) + flags: (0, helpers_1.getFlags)(res.data, 'gasTank', t.networkId, t.address) })); accountState.gasTank = { isReady: true, @@ -322,9 +326,9 @@ export class PortfolioController extends EventEmitter { lastSuccessfulUpdate: Date.now(), tokens: [ ...gasTankTokens, - ...getPinnedGasTankTokens(res.data.gasTank.availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) + ...(0, helpers_1.getPinnedGasTankTokens)(res.data.gasTank.availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) ], - total: getTotal(gasTankTokens) + total: (0, helpers_1.getTotal)(gasTankTokens) } }; this.emitUpdate(); @@ -377,7 +381,7 @@ export class PortfolioController extends EventEmitter { // Update the last successful update only if there are no critical errors. lastSuccessfulUpdate = Date.now(); } - const processedTokens = processTokens(result.tokens, network, hasNonZeroTokens, additionalHintsErc20Hints, this.tokenPreferences); + const processedTokens = (0, helpers_1.processTokens)(result.tokens, network, hasNonZeroTokens, additionalHintsErc20Hints, this.tokenPreferences); accountState[network.id] = { isReady: true, isLoading: false, @@ -386,7 +390,7 @@ export class PortfolioController extends EventEmitter { ...result, lastSuccessfulUpdate, tokens: processedTokens, - total: getTotal(processedTokens) + total: (0, helpers_1.getTotal)(processedTokens) } }; this.emitUpdate(); @@ -429,7 +433,7 @@ export class PortfolioController extends EventEmitter { this.#pending[accountId] = {}; const accountState = this.#latest[accountId]; const pendingState = this.#pending[accountId]; - if (shouldGetAdditionalPortfolio(selectedAccount)) { + if ((0, helpers_1.shouldGetAdditionalPortfolio)(selectedAccount)) { this.#getAdditionalPortfolio(accountId, opts?.forceUpdate); } const networks = network ? [network] : this.#networks.networks; @@ -450,7 +454,7 @@ export class PortfolioController extends EventEmitter { // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object. // 2. No change occurs if both variables are undefined. const areAccountOpsChanged = currentAccountOps && simulatedAccountOps - ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps) + ? !(0, accountOp_1.isAccountOpsIntentEqual)(currentAccountOps, simulatedAccountOps) : currentAccountOps !== simulatedAccountOps; const forceUpdate = opts?.forceUpdate || areAccountOpsChanged; const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]; @@ -465,7 +469,7 @@ export class PortfolioController extends EventEmitter { ]; // TODO: Add custom ERC721 tokens to the hints const additionalErc721Hints = Object.fromEntries(Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [ - getAddress(k), + (0, ethers_1.getAddress)(k), { isKnown: false, tokens: v.map((i) => i.toString()) } ])); const allHints = { @@ -487,7 +491,7 @@ export class PortfolioController extends EventEmitter { accountOps: currentAccountOps } }), - isEOA: !isSmartAccount(selectedAccount), + isEOA: !(0, account_1.isSmartAccount)(selectedAccount), ...allHints }, forceUpdate) ]); @@ -496,14 +500,14 @@ export class PortfolioController extends EventEmitter { !areAccountOpsChanged && accountState[network.id]?.result) { const networkResult = accountState[network.id].result; - const readyToLearnTokens = getTokensReadyToLearn(this.#toBeLearnedTokens[network.id], networkResult.tokens); + const readyToLearnTokens = (0, helpers_1.getTokensReadyToLearn)(this.#toBeLearnedTokens[network.id], networkResult.tokens); if (readyToLearnTokens.length) { await this.learnTokens(readyToLearnTokens, network.id); } // Either a valid response or there is no external API to fetch hints from const isExternalHintsApiResponseValid = !!networkResult?.hintsFromExternalAPI || !network.hasRelayer; if (isExternalHintsApiResponseValid) { - const updatedStoragePreviousHints = getUpdatedHints(networkResult.hintsFromExternalAPI || null, networkResult.tokens, networkResult.tokenErrors, network.id, this.#previousHints, key, this.customTokens); + const updatedStoragePreviousHints = (0, helpers_1.getUpdatedHints)(networkResult.hintsFromExternalAPI || null, networkResult.tokens, networkResult.tokenErrors, network.id, this.#previousHints, key, this.customTokens); // Updating hints is only needed when the external API response is valid. // learnTokens and learnNfts update storage separately, so we don't need to update them here // if the external API response is invalid. @@ -532,7 +536,7 @@ export class PortfolioController extends EventEmitter { const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]; if (!simulation) return; - simulation.status = AccountOpStatus.BroadcastedButNotConfirmed; + simulation.status = accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed; this.emitUpdate(); } addTokensToBeLearned(tokenAddresses, networkId) { @@ -541,11 +545,11 @@ export class PortfolioController extends EventEmitter { if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []; let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]; - const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr)); + const alreadyLearned = networkToBeLearnedTokens.map((addr) => (0, ethers_1.getAddress)(addr)); const tokensToLearn = tokenAddresses.filter((address) => { let normalizedAddress; try { - normalizedAddress = getAddress(address); + normalizedAddress = (0, ethers_1.getAddress)(address); } catch (e) { console.error('Error while normalizing token address', e); @@ -566,11 +570,11 @@ export class PortfolioController extends EventEmitter { if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}; let networkLearnedTokens = this.#previousHints.learnedTokens[networkId] || {}; - const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr)); + const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => (0, ethers_1.getAddress)(addr)); const tokensToLearn = tokenAddresses.reduce((acc, address) => { - if (address === ZeroAddress) + if (address === ethers_1.ZeroAddress) return acc; - if (alreadyLearned.includes(getAddress(address))) + if (alreadyLearned.includes((0, ethers_1.getAddress)(address))) return acc; acc[address] = acc[address] || null; // Keep the timestamp of all learned tokens return acc; @@ -604,7 +608,7 @@ export class PortfolioController extends EventEmitter { if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false; nftsData.forEach(([addr, ids]) => { - if (addr === ZeroAddress) + if (addr === ethers_1.ZeroAddress) return; if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids; @@ -648,4 +652,5 @@ export class PortfolioController extends EventEmitter { }; } } +exports.PortfolioController = PortfolioController; //# sourceMappingURL=portfolio.js.map \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.js.map b/dist/src/controllers/portfolio/portfolio.js.map index 7b3cfe057..a5cd55b65 100644 --- a/dist/src/controllers/portfolio/portfolio.js.map +++ b/dist/src/controllers/portfolio/portfolio.js.map @@ -1 +1 @@ -{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, ZeroAddress } from 'ethers'\n\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network, NetworkId } from '../../interfaces/network'\n/* eslint-disable @typescript-eslint/no-shadow */\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'\nimport { Portfolio } from '../../libs/portfolio'\n/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'\nimport getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'\nimport {\n getFlags,\n getPinnedGasTankTokens,\n getTokensReadyToLearn,\n getTotal,\n getUpdatedHints,\n processTokens,\n shouldGetAdditionalPortfolio,\n validateERC20Token\n} from '../../libs/portfolio/helpers'\n/* eslint-disable no-restricted-syntax */\n// eslint-disable-next-line import/no-cycle\nimport {\n AccountAssetsState,\n AccountState,\n GetOptions,\n NetworkState,\n PortfolioControllerState,\n PreviousHintsStorage,\n TemporaryTokens,\n TokenResult\n} from '../../libs/portfolio/interfaces'\nimport { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\n/* eslint-disable @typescript-eslint/no-shadow */\n\nconst LEARNED_TOKENS_NETWORK_LIMIT = 50\n\nexport class PortfolioController extends EventEmitter {\n #latest: PortfolioControllerState\n\n #pending: PortfolioControllerState\n\n // A queue to prevent race conditions when calling `updateSelectedAccount`.\n // All calls are queued by network and account.\n // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue.\n // If a previous call is still running, the new call will be queued and executed only after the first one completes,\n // regardless of whether it succeeds or fails.\n // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause\n // the response of the latest call to be overwritten by a slower previous call.\n #queue: {\n [accountId: string]: {\n [networkId: NetworkId]: Promise\n }\n }\n\n #toBeLearnedTokens: { [network in NetworkId]: string[] }\n\n customTokens: CustomToken[] = []\n\n tokenPreferences: TokenPreference[] = []\n\n validTokens: any = { erc20: {}, erc721: {} }\n\n temporaryTokens: TemporaryTokens = {}\n\n #portfolioLibs: Map\n\n #storage: Storage\n\n #fetch: Fetch\n\n #callRelayer: Function\n\n #velcroUrl: string\n\n #networksWithAssetsByAccounts: {\n [accountId: string]: AccountAssetsState\n } = {}\n\n #minUpdateInterval: number = 20000 // 20 seconds\n\n /**\n * Hints stored in storage, divided into three categories:\n * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails.\n * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing.\n * - learnedNfts: Hints of learned NFTs.\n */\n #previousHints: PreviousHintsStorage = {\n fromExternalAPI: {},\n learnedTokens: {},\n learnedNfts: {}\n }\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #accounts: AccountsController\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n relayerUrl: string,\n velcroUrl: string\n ) {\n super()\n this.#latest = {}\n this.#pending = {}\n this.#queue = {}\n this.#portfolioLibs = new Map()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#velcroUrl = velcroUrl\n this.#providers = providers\n this.#networks = networks\n this.#accounts = accounts\n this.temporaryTokens = {}\n this.#toBeLearnedTokens = {}\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n await this.#networks.initialLoadPromise\n await this.#accounts.initialLoadPromise\n const storageTokenPreferences = await this.#storage.get('tokenPreferences', [])\n const storageCustomTokens = await this.#storage.get('customTokens', [])\n\n const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(\n storageTokenPreferences,\n storageCustomTokens\n )\n\n this.tokenPreferences = tokenPreferences\n this.customTokens = customTokens\n\n if (shouldUpdateStorage) {\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n this.#previousHints = await this.#storage.get('previousHints', {})\n const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {})\n const isOldStructure = Object.keys(networksWithAssets).every(\n (key) =>\n Array.isArray(networksWithAssets[key]) &&\n networksWithAssets[key].every((item: any) => typeof item === 'string')\n )\n if (!isOldStructure) {\n this.#networksWithAssetsByAccounts = networksWithAssets\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('portfolio: failed to pull keys from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n async #updatePortfolioOnTokenChange(networkId: NetworkId, selectedAccountAddr?: string) {\n // As this function currently only updates the portfolio we can skip it altogether\n // if skipPortfolioUpdate is set to true\n if (!selectedAccountAddr) return\n\n const networkData = this.#networks.networks.find(({ id }) => id === networkId)\n await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, {\n forceUpdate: true\n })\n }\n\n async addCustomToken(\n customToken: CustomToken,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n const isTokenAlreadyAdded = this.customTokens.some(\n ({ address, networkId }) =>\n address.toLowerCase() === customToken.address.toLowerCase() &&\n networkId === customToken.networkId\n )\n\n if (isTokenAlreadyAdded) return\n\n this.customTokens.push(customToken)\n\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n async removeCustomToken(\n customToken: Omit,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n this.customTokens = this.customTokens.filter(\n (token) =>\n !(\n token.address.toLowerCase() === customToken.address.toLowerCase() &&\n token.networkId === customToken.networkId\n )\n )\n const existingPreference = this.tokenPreferences.some(\n (pref) => pref.address === customToken.address && pref.networkId === customToken.networkId\n )\n\n // Delete custom token preference if it exists\n if (existingPreference) {\n await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio)\n await this.#storage.set('customTokens', this.customTokens)\n } else {\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n await this.#storage.set('customTokens', this.customTokens)\n }\n }\n\n async toggleHideToken(\n tokenPreference: TokenPreference,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n\n const existingPreference = this.tokenPreferences.find(\n ({ address, networkId }) =>\n address.toLowerCase() === tokenPreference.address.toLowerCase() &&\n networkId === tokenPreference.networkId\n )\n\n // Push the token as hidden\n if (!existingPreference) {\n this.tokenPreferences.push({ ...tokenPreference, isHidden: true })\n // Remove the token preference if the user decides to show it again\n } else if (existingPreference.isHidden) {\n this.tokenPreferences = this.tokenPreferences.filter(\n ({ address, networkId }) =>\n !(address === tokenPreference.address && networkId === tokenPreference.networkId)\n )\n } else {\n // Should happen only after migration\n existingPreference.isHidden = !existingPreference.isHidden\n }\n\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr)\n }\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n }\n\n async #updateNetworksWithAssets(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = this.#networksWithAssetsByAccounts\n\n this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n }\n\n #setNetworkLoading(\n accountId: AccountId,\n stateKey: 'latest' | 'pending',\n network: string,\n isLoading: boolean,\n error?: any\n ) {\n const states = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = states[stateKey][accountId]\n if (!accountState[network]) accountState[network] = { errors: [], isReady: false, isLoading }\n accountState[network]!.isLoading = isLoading\n if (error) accountState[network]!.criticalError = error\n }\n\n removeNetworkData(networkId: NetworkId) {\n for (const accountState of [this.#latest, this.#pending]) {\n for (const accountId of Object.keys(accountState)) {\n delete accountState[accountId][networkId]\n }\n }\n this.emitUpdate()\n }\n\n // make the pending results the same as the latest ones\n overridePendingResults(accountOp: AccountOp) {\n if (\n this.#pending[accountOp.accountAddr] &&\n this.#pending[accountOp.accountAddr][accountOp.networkId] &&\n this.#latest[accountOp.accountAddr] &&\n this.#latest[accountOp.accountAddr][accountOp.networkId]\n ) {\n this.#pending[accountOp.accountAddr][accountOp.networkId]!.result =\n this.#latest[accountOp.accountAddr][accountOp.networkId]!.result\n this.emitUpdate()\n }\n }\n\n async updateTokenValidationByStandard(\n token: { address: TokenResult['address']; networkId: TokenResult['networkId'] },\n accountId: AccountId\n ) {\n await this.#initialLoadPromise\n if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return\n\n const [isValid, standard]: [boolean, string] = (await validateERC20Token(\n token,\n accountId,\n this.#providers.providers[token.networkId]\n )) as [boolean, string]\n\n this.validTokens[standard] = {\n ...this.validTokens[standard],\n [`${token.address}-${token.networkId}`]: isValid\n }\n\n this.emitUpdate()\n }\n\n initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network) {\n const providers = this.#providers.providers\n const key = `${networkId}:${accountId}`\n // Initialize a new Portfolio lib if:\n // 1. It does not exist in the portfolioLibs map\n // 2. The network RPC URL has changed\n if (\n !this.#portfolioLibs.has(key) ||\n this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !==\n // eslint-disable-next-line no-underscore-dangle\n providers[network.id]?._getConnection().url\n ) {\n this.#portfolioLibs.set(\n key,\n new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)\n )\n }\n return this.#portfolioLibs.get(key)!\n }\n\n async getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string) {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n\n if (!network) throw new Error('network not found')\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network)\n\n const temporaryTokensToFetch =\n (this.temporaryTokens[network.id] &&\n this.temporaryTokens[network.id].result?.tokens.filter(\n (x) => x.address !== additionalHint\n )) ||\n []\n\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result\n }\n this.emitUpdate()\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)],\n disableAutoDiscovery: true\n })\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: {\n tokens: result.tokens\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n this.temporaryTokens[network.id].isLoading = false\n this.temporaryTokens[network.id].errors.push(e)\n this.emitUpdate()\n return false\n }\n }\n\n async #getAdditionalPortfolio(accountId: AccountId, forceUpdate?: boolean) {\n const rewardsOrGasTankState =\n this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank\n const canSkipUpdate = rewardsOrGasTankState\n ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate)\n : false\n\n if (canSkipUpdate) return\n\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n const start = Date.now()\n const accountState = this.#latest[accountId]\n\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', true)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', true)\n this.emitUpdate()\n\n let res: any\n try {\n res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`)\n } catch (e: any) {\n console.error('relayer error for portfolio additional')\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e)\n this.emitUpdate()\n return\n }\n\n if (!res) throw new Error('portfolio controller: no res, should never happen')\n\n const rewardsTokens = [\n res.data.rewards.xWalletClaimableBalance || [],\n res.data.rewards.walletClaimableBalance || []\n ]\n .flat()\n .map((t: any) => ({\n ...t,\n symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol,\n flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address)\n }))\n\n accountState.rewards = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n ...res.data.rewards,\n lastSuccessfulUpdate: Date.now(),\n updateStarted: start,\n tokens: rewardsTokens,\n total: getTotal(rewardsTokens)\n }\n }\n\n const gasTankTokens = res.data.gasTank.balance.map((t: any) => ({\n ...t,\n flags: getFlags(res.data, 'gasTank', t.networkId, t.address)\n }))\n\n accountState.gasTank = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n updateStarted: start,\n lastSuccessfulUpdate: Date.now(),\n tokens: [\n ...gasTankTokens,\n ...getPinnedGasTankTokens(\n res.data.gasTank.availableGasTankAssets,\n hasNonZeroTokens,\n accountId,\n gasTankTokens\n )\n ],\n total: getTotal(gasTankTokens)\n }\n }\n\n this.emitUpdate()\n }\n\n #getCanSkipUpdate(networkState?: NetworkState, forceUpdate?: boolean) {\n const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical')\n\n if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors)\n return false\n const updateStarted = networkState.result?.updateStarted || 0\n const isWithinMinUpdateInterval =\n !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n // By our convention, we always stick with private (#) instead of protected methods.\n // However, we made a compromise here to allow Jest tests to mock updatePortfolioState.\n protected async updatePortfolioState(\n accountId: string,\n network: Network,\n portfolioLib: Portfolio,\n portfolioProps: Partial & { blockTag: 'latest' | 'pending' },\n forceUpdate: boolean\n ): Promise {\n const blockTag = portfolioProps.blockTag\n const stateKeys = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = stateKeys[blockTag][accountId]\n if (!accountState[network.id]) {\n // isLoading must be false here, otherwise canSkipUpdate will return true\n // and portfolio will not be updated\n accountState[network.id] = { isLoading: false, isReady: false, errors: [] }\n }\n const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate)\n\n if (canSkipUpdate) return false\n\n this.#setNetworkLoading(accountId, blockTag, network.id, true)\n this.emitUpdate()\n\n const state = accountState[network.id]!\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n priceCache: state.result?.priceCache,\n fetchPinned: !hasNonZeroTokens,\n ...portfolioProps\n })\n\n const hasCriticalError = result.errors.some((e) => e.level === 'critical')\n const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []\n let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0\n\n // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user\n // is likely expecting a change in the portfolio.\n if (forceUpdate && hasCriticalError) {\n lastSuccessfulUpdate = 0\n } else if (!hasCriticalError) {\n // Update the last successful update only if there are no critical errors.\n lastSuccessfulUpdate = Date.now()\n }\n\n const processedTokens = processTokens(\n result.tokens,\n network,\n hasNonZeroTokens,\n additionalHintsErc20Hints,\n this.tokenPreferences\n )\n\n accountState[network.id] = {\n isReady: true,\n isLoading: false,\n errors: result.errors,\n result: {\n ...result,\n lastSuccessfulUpdate,\n tokens: processedTokens,\n total: getTotal(processedTokens)\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n state.isLoading = false\n state.criticalError = e\n if (forceUpdate && state.result) {\n // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user\n // is likely expecting a change in the portfolio.\n state.result.lastSuccessfulUpdate = 0\n }\n this.emitUpdate()\n\n return false\n }\n }\n\n // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this\n // controller doesn't have to update this controller every time that those are updated\n\n // The recommended behavior of the application that this API encourages is:\n // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount\n // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a\n // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance\n // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks\n // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations)\n\n // the purpose of this function is to call it when an account is selected or the queue of accountOps changes\n async updateSelectedAccount(\n accountId: AccountId,\n network?: Network,\n accountOps?: { [key: string]: AccountOp[] },\n opts?: { forceUpdate: boolean }\n ) {\n await this.#initialLoadPromise\n const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId)\n if (!selectedAccount) throw new Error('selected account does not exist')\n if (!this.#latest[accountId]) this.#latest[accountId] = {}\n if (!this.#pending[accountId]) this.#pending[accountId] = {}\n\n const accountState = this.#latest[accountId]\n const pendingState = this.#pending[accountId]\n\n if (shouldGetAdditionalPortfolio(selectedAccount)) {\n this.#getAdditionalPortfolio(accountId, opts?.forceUpdate)\n }\n\n const networks = network ? [network] : this.#networks.networks\n await Promise.all(\n networks.map(async (network) => {\n const key = `${network.id}:${accountId}`\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network)\n\n const currentAccountOps = accountOps?.[network.id]?.filter(\n (op) => op.accountAddr === accountId\n )\n const simulatedAccountOps = pendingState[network.id]?.accountOps\n\n if (!this.#queue?.[accountId]?.[network.id])\n this.#queue[accountId] = {\n ...this.#queue[accountId],\n [network.id]: Promise.resolve()\n }\n\n const updatePromise = async (): Promise => {\n // We are performing the following extended check because both (or one of both) variables may have an undefined value.\n // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent.\n // However, when one of the variables is not set, two cases arise:\n // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object.\n // 2. No change occurs if both variables are undefined.\n const areAccountOpsChanged =\n currentAccountOps && simulatedAccountOps\n ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps)\n : currentAccountOps !== simulatedAccountOps\n const forceUpdate = opts?.forceUpdate || areAccountOpsChanged\n\n const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]\n\n const additionalErc20Hints = [\n ...Object.keys(\n (this.#previousHints?.learnedTokens &&\n this.#previousHints?.learnedTokens[network.id]) ??\n {}\n ),\n ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []),\n ...this.customTokens\n .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20')\n .map(({ address }) => address)\n ]\n // TODO: Add custom ERC721 tokens to the hints\n const additionalErc721Hints = Object.fromEntries(\n Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [\n getAddress(k),\n { isKnown: false, tokens: v.map((i) => i.toString()) }\n ])\n )\n const allHints = {\n previousHintsFromExternalAPI,\n additionalErc20Hints,\n additionalErc721Hints\n }\n\n const [isSuccessfulLatestUpdate] = await Promise.all([\n // Latest state update\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'latest',\n ...allHints\n },\n forceUpdate\n ),\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'pending',\n ...(currentAccountOps && {\n simulation: {\n account: selectedAccount,\n accountOps: currentAccountOps\n }\n }),\n isEOA: !isSmartAccount(selectedAccount),\n ...allHints\n },\n forceUpdate\n )\n ])\n\n // Persist latest state in previousHints in the disk storage for further requests\n if (\n isSuccessfulLatestUpdate &&\n !areAccountOpsChanged &&\n accountState[network.id]?.result\n ) {\n const networkResult = accountState[network.id]!.result\n const readyToLearnTokens = getTokensReadyToLearn(\n this.#toBeLearnedTokens[network.id],\n networkResult!.tokens\n )\n\n if (readyToLearnTokens.length) {\n await this.learnTokens(readyToLearnTokens, network.id)\n }\n\n // Either a valid response or there is no external API to fetch hints from\n const isExternalHintsApiResponseValid =\n !!networkResult?.hintsFromExternalAPI || !network.hasRelayer\n\n if (isExternalHintsApiResponseValid) {\n const updatedStoragePreviousHints = getUpdatedHints(\n networkResult!.hintsFromExternalAPI || null,\n networkResult!.tokens,\n networkResult!.tokenErrors,\n network.id,\n this.#previousHints,\n key,\n this.customTokens\n )\n\n // Updating hints is only needed when the external API response is valid.\n // learnTokens and learnNfts update storage separately, so we don't need to update them here\n // if the external API response is invalid.\n this.#previousHints = updatedStoragePreviousHints\n await this.#storage.set('previousHints', updatedStoragePreviousHints)\n }\n }\n\n // We cache the previously simulated AccountOps\n // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState.\n // This allows us to identify any differences between the two.\n if (currentAccountOps) {\n pendingState[network.id]!.accountOps = currentAccountOps\n }\n }\n\n // Chain the new updatePromise to the current queue\n this.#queue[accountId][network.id] = this.#queue[accountId][network.id]\n .then(updatePromise)\n .catch(() => updatePromise())\n\n // Ensure the method waits for the entire queue to resolve\n await this.#queue[accountId][network.id]\n })\n )\n\n await this.#updateNetworksWithAssets(accountId, accountState)\n this.emitUpdate()\n }\n\n markSimulationAsBroadcasted(accountId: string, networkId: string) {\n const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]\n\n if (!simulation) return\n\n simulation.status = AccountOpStatus.BroadcastedButNotConfirmed\n\n this.emitUpdate()\n }\n\n addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId) {\n if (!tokenAddresses.length) return false\n if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []\n\n let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]\n\n const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.filter((address) => {\n let normalizedAddress\n try {\n normalizedAddress = getAddress(address)\n } catch (e) {\n console.error('Error while normalizing token address', e)\n }\n\n return normalizedAddress && !alreadyLearned.includes(normalizedAddress)\n })\n\n if (!tokensToLearn.length) return false\n\n networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]\n\n this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens\n return true\n }\n\n // Learn new tokens from humanizer and debug_traceCall\n // return: whether new tokens have been learned\n async learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise {\n if (!tokenAddresses) return false\n\n if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}\n\n let networkLearnedTokens: PreviousHintsStorage['learnedTokens'][''] =\n this.#previousHints.learnedTokens[networkId] || {}\n\n const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.reduce((acc: { [key: string]: null }, address) => {\n if (address === ZeroAddress) return acc\n if (alreadyLearned.includes(getAddress(address))) return acc\n\n acc[address] = acc[address] || null // Keep the timestamp of all learned tokens\n return acc\n }, {})\n\n if (!Object.keys(tokensToLearn).length) return false\n // Add new tokens in the beginning of the list\n networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }\n\n // Reached limit\n if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) {\n // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order.\n // This ensures that tokens with the most recent timestamps are prioritized for retention,\n // and tokens with the oldest timestamps are deleted last when the limit is exceeded.\n const learnedTokensArray = Object.entries(networkLearnedTokens).sort(\n (a, b) => Number(b[1]) - Number(a[1])\n )\n\n networkLearnedTokens = Object.fromEntries(\n learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)\n )\n }\n\n this.#previousHints.learnedTokens[networkId] = networkLearnedTokens\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n async learnNfts(\n nftsData: [string, bigint[]][] | undefined,\n networkId: NetworkId\n ): Promise {\n if (!nftsData?.length) return false\n if (!this.#previousHints.learnedNfts) this.#previousHints.learnedNfts = {}\n const networkLearnedNfts: PreviousHintsStorage['learnedNfts'][''] =\n this.#previousHints.learnedNfts[networkId] || {}\n\n const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat()\n const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts)\n .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`))\n .flat()\n if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false\n nftsData.forEach(([addr, ids]) => {\n if (addr === ZeroAddress) return\n if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids\n else networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]]))\n })\n\n this.#previousHints.learnedNfts[networkId] = networkLearnedNfts\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n removeAccountData(address: Account['addr']) {\n delete this.#latest[address]\n delete this.#pending[address]\n delete this.#networksWithAssetsByAccounts[address]\n\n this.#networks.networks.forEach((network) => {\n const key = `${network.id}:${address}`\n\n if (key in this.#previousHints.fromExternalAPI) {\n delete this.#previousHints.fromExternalAPI[key]\n }\n if (key in this.#portfolioLibs) {\n this.#portfolioLibs.delete(key)\n }\n })\n this.#storage.set('previousHints', this.#previousHints)\n this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n\n this.emitUpdate()\n }\n\n getLatestPortfolioState(accountAddr: string) {\n return this.#latest[accountAddr] || {}\n }\n\n getPendingPortfolioState(accountAddr: string) {\n return this.#pending[accountAddr] || {}\n }\n\n getNetworksWithAssets(accountAddr: string) {\n return this.#networksWithAssetsByAccounts[accountAddr] || []\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, ZeroAddress } from 'ethers'\n\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network, NetworkId } from '../../interfaces/network'\n/* eslint-disable @typescript-eslint/no-shadow */\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'\nimport { Portfolio } from '../../libs/portfolio'\n/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'\nimport getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'\nimport {\n getFlags,\n getPinnedGasTankTokens,\n getTokensReadyToLearn,\n getTotal,\n getUpdatedHints,\n processTokens,\n shouldGetAdditionalPortfolio,\n validateERC20Token\n} from '../../libs/portfolio/helpers'\n/* eslint-disable no-restricted-syntax */\n// eslint-disable-next-line import/no-cycle\nimport {\n AccountAssetsState,\n AccountState,\n GetOptions,\n NetworkState,\n PortfolioControllerState,\n PreviousHintsStorage,\n TemporaryTokens,\n TokenResult\n} from '../../libs/portfolio/interfaces'\nimport { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\n/* eslint-disable @typescript-eslint/no-shadow */\n\nconst LEARNED_TOKENS_NETWORK_LIMIT = 50\n\nexport class PortfolioController extends EventEmitter {\n #latest: PortfolioControllerState\n\n #pending: PortfolioControllerState\n\n // A queue to prevent race conditions when calling `updateSelectedAccount`.\n // All calls are queued by network and account.\n // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue.\n // If a previous call is still running, the new call will be queued and executed only after the first one completes,\n // regardless of whether it succeeds or fails.\n // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause\n // the response of the latest call to be overwritten by a slower previous call.\n #queue: {\n [accountId: string]: {\n [networkId: NetworkId]: Promise\n }\n }\n\n #toBeLearnedTokens: { [network in NetworkId]: string[] }\n\n customTokens: CustomToken[] = []\n\n tokenPreferences: TokenPreference[] = []\n\n validTokens: any = { erc20: {}, erc721: {} }\n\n temporaryTokens: TemporaryTokens = {}\n\n #portfolioLibs: Map\n\n #storage: Storage\n\n #fetch: Fetch\n\n #callRelayer: Function\n\n #velcroUrl: string\n\n #networksWithAssetsByAccounts: {\n [accountId: string]: AccountAssetsState\n } = {}\n\n #minUpdateInterval: number = 20000 // 20 seconds\n\n /**\n * Hints stored in storage, divided into three categories:\n * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails.\n * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing.\n * - learnedNfts: Hints of learned NFTs.\n */\n #previousHints: PreviousHintsStorage = {\n fromExternalAPI: {},\n learnedTokens: {},\n learnedNfts: {}\n }\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #accounts: AccountsController\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n relayerUrl: string,\n velcroUrl: string\n ) {\n super()\n this.#latest = {}\n this.#pending = {}\n this.#queue = {}\n this.#portfolioLibs = new Map()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#velcroUrl = velcroUrl\n this.#providers = providers\n this.#networks = networks\n this.#accounts = accounts\n this.temporaryTokens = {}\n this.#toBeLearnedTokens = {}\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n await this.#networks.initialLoadPromise\n await this.#accounts.initialLoadPromise\n const storageTokenPreferences = await this.#storage.get('tokenPreferences', [])\n const storageCustomTokens = await this.#storage.get('customTokens', [])\n\n const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(\n storageTokenPreferences,\n storageCustomTokens\n )\n\n this.tokenPreferences = tokenPreferences\n this.customTokens = customTokens\n\n if (shouldUpdateStorage) {\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n this.#previousHints = await this.#storage.get('previousHints', {})\n const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {})\n const isOldStructure = Object.keys(networksWithAssets).every(\n (key) =>\n Array.isArray(networksWithAssets[key]) &&\n networksWithAssets[key].every((item: any) => typeof item === 'string')\n )\n if (!isOldStructure) {\n this.#networksWithAssetsByAccounts = networksWithAssets\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('portfolio: failed to pull keys from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n async #updatePortfolioOnTokenChange(networkId: NetworkId, selectedAccountAddr?: string) {\n // As this function currently only updates the portfolio we can skip it altogether\n // if skipPortfolioUpdate is set to true\n if (!selectedAccountAddr) return\n\n const networkData = this.#networks.networks.find(({ id }) => id === networkId)\n await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, {\n forceUpdate: true\n })\n }\n\n async addCustomToken(\n customToken: CustomToken,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n const isTokenAlreadyAdded = this.customTokens.some(\n ({ address, networkId }) =>\n address.toLowerCase() === customToken.address.toLowerCase() &&\n networkId === customToken.networkId\n )\n\n if (isTokenAlreadyAdded) return\n\n this.customTokens.push(customToken)\n\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n async removeCustomToken(\n customToken: Omit,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n this.customTokens = this.customTokens.filter(\n (token) =>\n !(\n token.address.toLowerCase() === customToken.address.toLowerCase() &&\n token.networkId === customToken.networkId\n )\n )\n const existingPreference = this.tokenPreferences.some(\n (pref) => pref.address === customToken.address && pref.networkId === customToken.networkId\n )\n\n // Delete custom token preference if it exists\n if (existingPreference) {\n await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio)\n await this.#storage.set('customTokens', this.customTokens)\n } else {\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n await this.#storage.set('customTokens', this.customTokens)\n }\n }\n\n async toggleHideToken(\n tokenPreference: TokenPreference,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n\n const existingPreference = this.tokenPreferences.find(\n ({ address, networkId }) =>\n address.toLowerCase() === tokenPreference.address.toLowerCase() &&\n networkId === tokenPreference.networkId\n )\n\n // Push the token as hidden\n if (!existingPreference) {\n this.tokenPreferences.push({ ...tokenPreference, isHidden: true })\n // Remove the token preference if the user decides to show it again\n } else if (existingPreference.isHidden) {\n this.tokenPreferences = this.tokenPreferences.filter(\n ({ address, networkId }) =>\n !(address === tokenPreference.address && networkId === tokenPreference.networkId)\n )\n } else {\n // Should happen only after migration\n existingPreference.isHidden = !existingPreference.isHidden\n }\n\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr)\n }\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n }\n\n async #updateNetworksWithAssets(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = this.#networksWithAssetsByAccounts\n\n this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n }\n\n #setNetworkLoading(\n accountId: AccountId,\n stateKey: 'latest' | 'pending',\n network: string,\n isLoading: boolean,\n error?: any\n ) {\n const states = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = states[stateKey][accountId]\n if (!accountState[network]) accountState[network] = { errors: [], isReady: false, isLoading }\n accountState[network]!.isLoading = isLoading\n if (error) accountState[network]!.criticalError = error\n }\n\n removeNetworkData(networkId: NetworkId) {\n for (const accountState of [this.#latest, this.#pending]) {\n for (const accountId of Object.keys(accountState)) {\n delete accountState[accountId][networkId]\n }\n }\n this.emitUpdate()\n }\n\n // make the pending results the same as the latest ones\n overridePendingResults(accountOp: AccountOp) {\n if (\n this.#pending[accountOp.accountAddr] &&\n this.#pending[accountOp.accountAddr][accountOp.networkId] &&\n this.#latest[accountOp.accountAddr] &&\n this.#latest[accountOp.accountAddr][accountOp.networkId]\n ) {\n this.#pending[accountOp.accountAddr][accountOp.networkId]!.result =\n this.#latest[accountOp.accountAddr][accountOp.networkId]!.result\n this.emitUpdate()\n }\n }\n\n async updateTokenValidationByStandard(\n token: { address: TokenResult['address']; networkId: TokenResult['networkId'] },\n accountId: AccountId\n ) {\n await this.#initialLoadPromise\n if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return\n\n const [isValid, standard]: [boolean, string] = (await validateERC20Token(\n token,\n accountId,\n this.#providers.providers[token.networkId]\n )) as [boolean, string]\n\n this.validTokens[standard] = {\n ...this.validTokens[standard],\n [`${token.address}-${token.networkId}`]: isValid\n }\n\n this.emitUpdate()\n }\n\n initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network) {\n const providers = this.#providers.providers\n const key = `${networkId}:${accountId}`\n // Initialize a new Portfolio lib if:\n // 1. It does not exist in the portfolioLibs map\n // 2. The network RPC URL has changed\n if (\n !this.#portfolioLibs.has(key) ||\n this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !==\n // eslint-disable-next-line no-underscore-dangle\n providers[network.id]?._getConnection().url\n ) {\n this.#portfolioLibs.set(\n key,\n new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)\n )\n }\n return this.#portfolioLibs.get(key)!\n }\n\n async getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string) {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n\n if (!network) throw new Error('network not found')\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network)\n\n const temporaryTokensToFetch =\n (this.temporaryTokens[network.id] &&\n this.temporaryTokens[network.id].result?.tokens.filter(\n (x) => x.address !== additionalHint\n )) ||\n []\n\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result\n }\n this.emitUpdate()\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)],\n disableAutoDiscovery: true\n })\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: {\n tokens: result.tokens\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n this.temporaryTokens[network.id].isLoading = false\n this.temporaryTokens[network.id].errors.push(e)\n this.emitUpdate()\n return false\n }\n }\n\n async #getAdditionalPortfolio(accountId: AccountId, forceUpdate?: boolean) {\n const rewardsOrGasTankState =\n this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank\n const canSkipUpdate = rewardsOrGasTankState\n ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate)\n : false\n\n if (canSkipUpdate) return\n\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n const start = Date.now()\n const accountState = this.#latest[accountId]\n\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', true)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', true)\n this.emitUpdate()\n\n let res: any\n try {\n res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`)\n } catch (e: any) {\n console.error('relayer error for portfolio additional')\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e)\n this.emitUpdate()\n return\n }\n\n if (!res) throw new Error('portfolio controller: no res, should never happen')\n\n const rewardsTokens = [\n res.data.rewards.xWalletClaimableBalance || [],\n res.data.rewards.walletClaimableBalance || []\n ]\n .flat()\n .map((t: any) => ({\n ...t,\n symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol,\n flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address)\n }))\n\n accountState.rewards = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n ...res.data.rewards,\n lastSuccessfulUpdate: Date.now(),\n updateStarted: start,\n tokens: rewardsTokens,\n total: getTotal(rewardsTokens)\n }\n }\n\n const gasTankTokens = res.data.gasTank.balance.map((t: any) => ({\n ...t,\n flags: getFlags(res.data, 'gasTank', t.networkId, t.address)\n }))\n\n accountState.gasTank = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n updateStarted: start,\n lastSuccessfulUpdate: Date.now(),\n tokens: [\n ...gasTankTokens,\n ...getPinnedGasTankTokens(\n res.data.gasTank.availableGasTankAssets,\n hasNonZeroTokens,\n accountId,\n gasTankTokens\n )\n ],\n total: getTotal(gasTankTokens)\n }\n }\n\n this.emitUpdate()\n }\n\n #getCanSkipUpdate(networkState?: NetworkState, forceUpdate?: boolean) {\n const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical')\n\n if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors)\n return false\n const updateStarted = networkState.result?.updateStarted || 0\n const isWithinMinUpdateInterval =\n !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n // By our convention, we always stick with private (#) instead of protected methods.\n // However, we made a compromise here to allow Jest tests to mock updatePortfolioState.\n protected async updatePortfolioState(\n accountId: string,\n network: Network,\n portfolioLib: Portfolio,\n portfolioProps: Partial & { blockTag: 'latest' | 'pending' },\n forceUpdate: boolean\n ): Promise {\n const blockTag = portfolioProps.blockTag\n const stateKeys = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = stateKeys[blockTag][accountId]\n if (!accountState[network.id]) {\n // isLoading must be false here, otherwise canSkipUpdate will return true\n // and portfolio will not be updated\n accountState[network.id] = { isLoading: false, isReady: false, errors: [] }\n }\n const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate)\n\n if (canSkipUpdate) return false\n\n this.#setNetworkLoading(accountId, blockTag, network.id, true)\n this.emitUpdate()\n\n const state = accountState[network.id]!\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n priceCache: state.result?.priceCache,\n fetchPinned: !hasNonZeroTokens,\n ...portfolioProps\n })\n\n const hasCriticalError = result.errors.some((e) => e.level === 'critical')\n const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []\n let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0\n\n // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user\n // is likely expecting a change in the portfolio.\n if (forceUpdate && hasCriticalError) {\n lastSuccessfulUpdate = 0\n } else if (!hasCriticalError) {\n // Update the last successful update only if there are no critical errors.\n lastSuccessfulUpdate = Date.now()\n }\n\n const processedTokens = processTokens(\n result.tokens,\n network,\n hasNonZeroTokens,\n additionalHintsErc20Hints,\n this.tokenPreferences\n )\n\n accountState[network.id] = {\n isReady: true,\n isLoading: false,\n errors: result.errors,\n result: {\n ...result,\n lastSuccessfulUpdate,\n tokens: processedTokens,\n total: getTotal(processedTokens)\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n state.isLoading = false\n state.criticalError = e\n if (forceUpdate && state.result) {\n // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user\n // is likely expecting a change in the portfolio.\n state.result.lastSuccessfulUpdate = 0\n }\n this.emitUpdate()\n\n return false\n }\n }\n\n // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this\n // controller doesn't have to update this controller every time that those are updated\n\n // The recommended behavior of the application that this API encourages is:\n // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount\n // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a\n // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance\n // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks\n // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations)\n\n // the purpose of this function is to call it when an account is selected or the queue of accountOps changes\n async updateSelectedAccount(\n accountId: AccountId,\n network?: Network,\n accountOps?: { [key: string]: AccountOp[] },\n opts?: { forceUpdate: boolean }\n ) {\n await this.#initialLoadPromise\n const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId)\n if (!selectedAccount) throw new Error('selected account does not exist')\n if (!this.#latest[accountId]) this.#latest[accountId] = {}\n if (!this.#pending[accountId]) this.#pending[accountId] = {}\n\n const accountState = this.#latest[accountId]\n const pendingState = this.#pending[accountId]\n\n if (shouldGetAdditionalPortfolio(selectedAccount)) {\n this.#getAdditionalPortfolio(accountId, opts?.forceUpdate)\n }\n\n const networks = network ? [network] : this.#networks.networks\n await Promise.all(\n networks.map(async (network) => {\n const key = `${network.id}:${accountId}`\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network)\n\n const currentAccountOps = accountOps?.[network.id]?.filter(\n (op) => op.accountAddr === accountId\n )\n const simulatedAccountOps = pendingState[network.id]?.accountOps\n\n if (!this.#queue?.[accountId]?.[network.id])\n this.#queue[accountId] = {\n ...this.#queue[accountId],\n [network.id]: Promise.resolve()\n }\n\n const updatePromise = async (): Promise => {\n // We are performing the following extended check because both (or one of both) variables may have an undefined value.\n // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent.\n // However, when one of the variables is not set, two cases arise:\n // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object.\n // 2. No change occurs if both variables are undefined.\n const areAccountOpsChanged =\n currentAccountOps && simulatedAccountOps\n ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps)\n : currentAccountOps !== simulatedAccountOps\n const forceUpdate = opts?.forceUpdate || areAccountOpsChanged\n\n const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]\n\n const additionalErc20Hints = [\n ...Object.keys(\n (this.#previousHints?.learnedTokens &&\n this.#previousHints?.learnedTokens[network.id]) ??\n {}\n ),\n ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []),\n ...this.customTokens\n .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20')\n .map(({ address }) => address)\n ]\n // TODO: Add custom ERC721 tokens to the hints\n const additionalErc721Hints = Object.fromEntries(\n Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [\n getAddress(k),\n { isKnown: false, tokens: v.map((i) => i.toString()) }\n ])\n )\n const allHints = {\n previousHintsFromExternalAPI,\n additionalErc20Hints,\n additionalErc721Hints\n }\n\n const [isSuccessfulLatestUpdate] = await Promise.all([\n // Latest state update\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'latest',\n ...allHints\n },\n forceUpdate\n ),\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'pending',\n ...(currentAccountOps && {\n simulation: {\n account: selectedAccount,\n accountOps: currentAccountOps\n }\n }),\n isEOA: !isSmartAccount(selectedAccount),\n ...allHints\n },\n forceUpdate\n )\n ])\n\n // Persist latest state in previousHints in the disk storage for further requests\n if (\n isSuccessfulLatestUpdate &&\n !areAccountOpsChanged &&\n accountState[network.id]?.result\n ) {\n const networkResult = accountState[network.id]!.result\n const readyToLearnTokens = getTokensReadyToLearn(\n this.#toBeLearnedTokens[network.id],\n networkResult!.tokens\n )\n\n if (readyToLearnTokens.length) {\n await this.learnTokens(readyToLearnTokens, network.id)\n }\n\n // Either a valid response or there is no external API to fetch hints from\n const isExternalHintsApiResponseValid =\n !!networkResult?.hintsFromExternalAPI || !network.hasRelayer\n\n if (isExternalHintsApiResponseValid) {\n const updatedStoragePreviousHints = getUpdatedHints(\n networkResult!.hintsFromExternalAPI || null,\n networkResult!.tokens,\n networkResult!.tokenErrors,\n network.id,\n this.#previousHints,\n key,\n this.customTokens\n )\n\n // Updating hints is only needed when the external API response is valid.\n // learnTokens and learnNfts update storage separately, so we don't need to update them here\n // if the external API response is invalid.\n this.#previousHints = updatedStoragePreviousHints\n await this.#storage.set('previousHints', updatedStoragePreviousHints)\n }\n }\n\n // We cache the previously simulated AccountOps\n // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState.\n // This allows us to identify any differences between the two.\n if (currentAccountOps) {\n pendingState[network.id]!.accountOps = currentAccountOps\n }\n }\n\n // Chain the new updatePromise to the current queue\n this.#queue[accountId][network.id] = this.#queue[accountId][network.id]\n .then(updatePromise)\n .catch(() => updatePromise())\n\n // Ensure the method waits for the entire queue to resolve\n await this.#queue[accountId][network.id]\n })\n )\n\n await this.#updateNetworksWithAssets(accountId, accountState)\n this.emitUpdate()\n }\n\n markSimulationAsBroadcasted(accountId: string, networkId: string) {\n const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]\n\n if (!simulation) return\n\n simulation.status = AccountOpStatus.BroadcastedButNotConfirmed\n\n this.emitUpdate()\n }\n\n addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId) {\n if (!tokenAddresses.length) return false\n if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []\n\n let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]\n\n const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.filter((address) => {\n let normalizedAddress\n try {\n normalizedAddress = getAddress(address)\n } catch (e) {\n console.error('Error while normalizing token address', e)\n }\n\n return normalizedAddress && !alreadyLearned.includes(normalizedAddress)\n })\n\n if (!tokensToLearn.length) return false\n\n networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]\n\n this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens\n return true\n }\n\n // Learn new tokens from humanizer and debug_traceCall\n // return: whether new tokens have been learned\n async learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise {\n if (!tokenAddresses) return false\n\n if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}\n\n let networkLearnedTokens: PreviousHintsStorage['learnedTokens'][''] =\n this.#previousHints.learnedTokens[networkId] || {}\n\n const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.reduce((acc: { [key: string]: null }, address) => {\n if (address === ZeroAddress) return acc\n if (alreadyLearned.includes(getAddress(address))) return acc\n\n acc[address] = acc[address] || null // Keep the timestamp of all learned tokens\n return acc\n }, {})\n\n if (!Object.keys(tokensToLearn).length) return false\n // Add new tokens in the beginning of the list\n networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }\n\n // Reached limit\n if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) {\n // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order.\n // This ensures that tokens with the most recent timestamps are prioritized for retention,\n // and tokens with the oldest timestamps are deleted last when the limit is exceeded.\n const learnedTokensArray = Object.entries(networkLearnedTokens).sort(\n (a, b) => Number(b[1]) - Number(a[1])\n )\n\n networkLearnedTokens = Object.fromEntries(\n learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)\n )\n }\n\n this.#previousHints.learnedTokens[networkId] = networkLearnedTokens\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n async learnNfts(\n nftsData: [string, bigint[]][] | undefined,\n networkId: NetworkId\n ): Promise {\n if (!nftsData?.length) return false\n if (!this.#previousHints.learnedNfts) this.#previousHints.learnedNfts = {}\n const networkLearnedNfts: PreviousHintsStorage['learnedNfts'][''] =\n this.#previousHints.learnedNfts[networkId] || {}\n\n const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat()\n const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts)\n .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`))\n .flat()\n if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false\n nftsData.forEach(([addr, ids]) => {\n if (addr === ZeroAddress) return\n if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids\n else networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]]))\n })\n\n this.#previousHints.learnedNfts[networkId] = networkLearnedNfts\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n removeAccountData(address: Account['addr']) {\n delete this.#latest[address]\n delete this.#pending[address]\n delete this.#networksWithAssetsByAccounts[address]\n\n this.#networks.networks.forEach((network) => {\n const key = `${network.id}:${address}`\n\n if (key in this.#previousHints.fromExternalAPI) {\n delete this.#previousHints.fromExternalAPI[key]\n }\n if (key in this.#portfolioLibs) {\n this.#portfolioLibs.delete(key)\n }\n })\n this.#storage.set('previousHints', this.#previousHints)\n this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n\n this.emitUpdate()\n }\n\n getLatestPortfolioState(accountAddr: string) {\n return this.#latest[accountAddr] || {}\n }\n\n getPendingPortfolioState(accountAddr: string) {\n return this.#pending[accountAddr] || {}\n }\n\n getNetworksWithAssets(accountAddr: string) {\n return this.#networksWithAssetsByAccounts[accountAddr] || []\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.js b/dist/src/controllers/providers/providers.js index de494b1c3..e3e0db827 100644 --- a/dist/src/controllers/providers/providers.js +++ b/dist/src/controllers/providers/providers.js @@ -1,10 +1,14 @@ -import { getRpcProvider } from '../../services/provider'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProvidersController = void 0; +const tslib_1 = require("tslib"); +const provider_1 = require("../../services/provider"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); /** * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain. * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes. */ -export class ProvidersController extends EventEmitter { +class ProvidersController extends eventEmitter_1.default { #networks; providers = {}; // Holds the initial load promise, so that one can wait until it completes @@ -31,7 +35,7 @@ export class ProvidersController extends EventEmitter { // If an RPC fails once it will try to reconnect every second. If we don't destroy the old RPC it will keep trying to reconnect forever. if (oldRPC) oldRPC.destroy(); - this.providers[network.id] = getRpcProvider(network.rpcUrls, network.chainId, network.selectedRpcUrl); + this.providers[network.id] = (0, provider_1.getRpcProvider)(network.rpcUrls, network.chainId, network.selectedRpcUrl); } } updateProviderIsWorking(networkId, isWorking) { @@ -57,4 +61,5 @@ export class ProvidersController extends EventEmitter { }; } } +exports.ProvidersController = ProvidersController; //# sourceMappingURL=providers.js.map \ No newline at end of file diff --git a/dist/src/controllers/providers/providers.js.map b/dist/src/controllers/providers/providers.js.map index 6834b427e..5150deab1 100644 --- a/dist/src/controllers/providers/providers.js.map +++ b/dist/src/controllers/providers/providers.js.map @@ -1 +1 @@ -{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../src/controllers/providers/providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,YAAY,MAAM,8BAA8B,CAAA;AAGvD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,SAAS,CAAoB;IAE7B,SAAS,GAAiB,EAAE,CAAA;IAE5B,0EAA0E;IAC1E,kBAAkB,CAAe;IAEjC,YAAY,QAA4B;QACtC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,mEAAmE;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAA;QACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,OAAgB;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE3C,mHAAmH;QACnH,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,cAAc,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAEzC,wIAAwI;YACxI,IAAI,MAAM;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAA;YAE5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,cAAc,CACzC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,CACvB,CAAA;SACF;IACH,CAAC;IAED,uBAAuB,CAAC,SAAoB,EAAE,SAAkB;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,OAAM;QAE7D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,SAAS,CAAA;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,cAAc,CAAC,SAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAA;IACH,CAAC;CACF","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { getRpcProvider } from '../../services/provider'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n\n/**\n * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain.\n * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes.\n */\nexport class ProvidersController extends EventEmitter {\n #networks: NetworksController\n\n providers: RPCProviders = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(networks: NetworksController) {\n super()\n\n this.#networks = networks\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized() {\n return this.#networks.isInitialized && !!Object.keys(this.providers).length\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n this.#networks.networks.forEach((n) => this.setProvider(n))\n this.emitUpdate()\n }\n\n setProvider(network: Network) {\n const provider = this.providers[network.id]\n\n // Only update the RPC if the new RPC is different from the current one or if there is no RPC for this network yet.\n if (!provider || provider?._getConnection().url !== network.selectedRpcUrl) {\n const oldRPC = this.providers[network.id]\n\n // If an RPC fails once it will try to reconnect every second. If we don't destroy the old RPC it will keep trying to reconnect forever.\n if (oldRPC) oldRPC.destroy()\n\n this.providers[network.id] = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl\n )\n }\n }\n\n updateProviderIsWorking(networkId: NetworkId, isWorking: boolean) {\n if (!this.providers[networkId]) return\n if (this.providers[networkId].isWorking === isWorking) return\n\n this.providers[networkId].isWorking = isWorking\n this.emitUpdate()\n }\n\n removeProvider(networkId: NetworkId) {\n if (!this.providers[networkId]) return\n\n this.providers[networkId]?.destroy()\n delete this.providers[networkId]\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../src/controllers/providers/providers.ts"],"names":[],"mappings":";;;;AAGA,sDAAwD;AACxD,wFAAuD;AAGvD;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,sBAAY;IACnD,SAAS,CAAoB;IAE7B,SAAS,GAAiB,EAAE,CAAA;IAE5B,0EAA0E;IAC1E,kBAAkB,CAAe;IAEjC,YAAY,QAA4B;QACtC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,mEAAmE;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAA;QACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,OAAgB;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE3C,mHAAmH;QACnH,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,cAAc,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAEzC,wIAAwI;YACxI,IAAI,MAAM;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAA;YAE5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAA,yBAAc,EACzC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,CACvB,CAAA;SACF;IACH,CAAC;IAED,uBAAuB,CAAC,SAAoB,EAAE,SAAkB;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,OAAM;QAE7D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,SAAS,CAAA;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,cAAc,CAAC,SAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAA;IACH,CAAC;CACF;AAnED,kDAmEC","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { getRpcProvider } from '../../services/provider'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n\n/**\n * The ProvidersController manages RPC providers, enabling the extension to communicate with the blockchain.\n * Each network requires an initialized JsonRpcProvider, and the provider must be reinitialized whenever network.selectedRpcUrl changes.\n */\nexport class ProvidersController extends EventEmitter {\n #networks: NetworksController\n\n providers: RPCProviders = {}\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor(networks: NetworksController) {\n super()\n\n this.#networks = networks\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n get isInitialized() {\n return this.#networks.isInitialized && !!Object.keys(this.providers).length\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n this.#networks.networks.forEach((n) => this.setProvider(n))\n this.emitUpdate()\n }\n\n setProvider(network: Network) {\n const provider = this.providers[network.id]\n\n // Only update the RPC if the new RPC is different from the current one or if there is no RPC for this network yet.\n if (!provider || provider?._getConnection().url !== network.selectedRpcUrl) {\n const oldRPC = this.providers[network.id]\n\n // If an RPC fails once it will try to reconnect every second. If we don't destroy the old RPC it will keep trying to reconnect forever.\n if (oldRPC) oldRPC.destroy()\n\n this.providers[network.id] = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl\n )\n }\n }\n\n updateProviderIsWorking(networkId: NetworkId, isWorking: boolean) {\n if (!this.providers[networkId]) return\n if (this.providers[networkId].isWorking === isWorking) return\n\n this.providers[networkId].isWorking = isWorking\n this.emitUpdate()\n }\n\n removeProvider(networkId: NetworkId) {\n if (!this.providers[networkId]) return\n\n this.providers[networkId]?.destroy()\n delete this.providers[networkId]\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isInitialized: this.isInitialized\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js b/dist/src/controllers/selectedAccount/selectedAccount.js index 40136086c..a935ee259 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.js +++ b/dist/src/controllers/selectedAccount/selectedAccount.js @@ -1,12 +1,16 @@ -import { getAddress } from 'ethers'; -import { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'; -import { isSmartAccount } from '../../libs/account/account'; -import { sortByValue } from '../../libs/defiPositions/helpers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SelectedAccountController = exports.DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const deploy_1 = require("../../consts/deploy"); +const account_1 = require("../../libs/account/account"); +const helpers_1 = require("../../libs/defiPositions/helpers"); // eslint-disable-next-line import/no-cycle -import { getNetworksWithDeFiPositionsErrorErrors, getNetworksWithFailedRPCErrors, getNetworksWithPortfolioErrorErrors } from '../../libs/selectedAccount/errors'; -import { calculateSelectedAccountPortfolio, updatePortfolioStateWithDefiPositions } from '../../libs/selectedAccount/selectedAccount'; -import EventEmitter from '../eventEmitter/eventEmitter'; -export const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = { +const errors_1 = require("../../libs/selectedAccount/errors"); +const selectedAccount_1 = require("../../libs/selectedAccount/selectedAccount"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +exports.DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = { tokens: [], collections: [], tokenAmounts: [], @@ -16,7 +20,7 @@ export const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = { latest: {}, pending: {} }; -export class SelectedAccountController extends EventEmitter { +class SelectedAccountController extends eventEmitter_1.default { #storage; #accounts; #portfolio = null; @@ -25,7 +29,7 @@ export class SelectedAccountController extends EventEmitter { #networks = null; #providers = null; account = null; - portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; + portfolio = exports.DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; portfolioStartedLoadingAtTimestamp = null; dashboardNetworkFilter = null; #shouldDebounceFlags = {}; @@ -125,7 +129,7 @@ export class SelectedAccountController extends EventEmitter { this.emitUpdate(); } resetSelectedAccountPortfolio(skipUpdate) { - this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; + this.portfolio = exports.DEFAULT_SELECTED_ACCOUNT_PORTFOLIO; this.#portfolioErrors = []; if (!skipUpdate) { this.emitUpdate(); @@ -137,10 +141,10 @@ export class SelectedAccountController extends EventEmitter { const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); const latestStateSelectedAccount = structuredClone(this.#portfolio.getLatestPortfolioState(this.account.addr)); const pendingStateSelectedAccount = structuredClone(this.#portfolio.getPendingPortfolioState(this.account.addr)); - const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(latestStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); - const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(pendingStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); + const latestStateSelectedAccountWithDefiPositions = (0, selectedAccount_1.updatePortfolioStateWithDefiPositions)(latestStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); + const pendingStateSelectedAccountWithDefiPositions = (0, selectedAccount_1.updatePortfolioStateWithDefiPositions)(pendingStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter((action) => action.type === 'accountOp'); - const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(latestStateSelectedAccountWithDefiPositions, pendingStateSelectedAccountWithDefiPositions, this.portfolio, hasSignAccountOp); + const newSelectedAccountPortfolio = (0, selectedAccount_1.calculateSelectedAccountPortfolio)(latestStateSelectedAccountWithDefiPositions, pendingStateSelectedAccountWithDefiPositions, this.portfolio, hasSignAccountOp); if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) { this.portfolioStartedLoadingAtTimestamp = null; } @@ -170,13 +174,13 @@ export class SelectedAccountController extends EventEmitter { const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => { const positions = provider.positions .map((position) => { - const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value)); + const assets = position.assets.sort((a, b) => (0, helpers_1.sortByValue)(a.value, b.value)); return { ...position, assets }; }) - .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD)); + .sort((a, b) => (0, helpers_1.sortByValue)(a.additionalData.positionInUSD, b.additionalData.positionInUSD)); return { ...provider, positions }; }); - const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) => sortByValue(a.positionInUSD, b.positionInUSD)); + const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) => (0, helpers_1.sortByValue)(a.positionInUSD, b.positionInUSD)); this.defiPositions = sortedPositionsByProvider; if (!skipUpdate) { this.emitUpdate(); @@ -214,7 +218,7 @@ export class SelectedAccountController extends EventEmitter { return; } const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr); - const errorBanners = getNetworksWithDeFiPositionsErrorErrors({ + const errorBanners = (0, errors_1.getNetworksWithDeFiPositionsErrorErrors)({ networks: this.#networks.networks, currentAccountState: defiPositionsAccountState, providers: this.#providers.providers, @@ -237,12 +241,12 @@ export class SelectedAccountController extends EventEmitter { } return; } - const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({ + const networksWithFailedRPCBanners = (0, errors_1.getNetworksWithFailedRPCErrors)({ providers: this.#providers.providers, networks: this.#networks.networks, networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr) }); - const errorBanners = getNetworksWithPortfolioErrorErrors({ + const errorBanners = (0, errors_1.getNetworksWithPortfolioErrorErrors)({ networks: this.#networks.networks, selectedAccountLatest: this.portfolio.latest, providers: this.#providers.providers @@ -256,14 +260,14 @@ export class SelectedAccountController extends EventEmitter { return [...this.#portfolioErrors, ...this.#defiPositionsErrors]; } get deprecatedSmartAccountBanner() { - if (!this.account || !isSmartAccount(this.account)) + if (!this.account || !(0, account_1.isSmartAccount)(this.account)) return []; if (!this.#accounts.accountStates[this.account.addr] || !this.#accounts.accountStates[this.account.addr].ethereum || !this.#accounts.accountStates[this.account.addr].ethereum.isV2) return []; if (!this.account.creation || - getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY) + (0, ethers_1.getAddress)(this.account.creation.factoryAddr) === deploy_1.AMBIRE_ACCOUNT_FACTORY) return []; return [ { @@ -291,4 +295,5 @@ export class SelectedAccountController extends EventEmitter { }; } } +exports.SelectedAccountController = SelectedAccountController; //# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js.map b/dist/src/controllers/selectedAccount/selectedAccount.js.map index 7d1302fa0..94cbb7402 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.js.map +++ b/dist/src/controllers/selectedAccount/selectedAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { NetworkId } from '../../interfaces/network'\nimport { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { sortByValue } from '../../libs/defiPositions/helpers'\nimport { PositionsByProvider } from '../../libs/defiPositions/types'\n// eslint-disable-next-line import/no-cycle\nimport {\n getNetworksWithDeFiPositionsErrorErrors,\n getNetworksWithFailedRPCErrors,\n getNetworksWithPortfolioErrorErrors,\n SelectedAccountBalanceError\n} from '../../libs/selectedAccount/errors'\nimport {\n calculateSelectedAccountPortfolio,\n updatePortfolioStateWithDefiPositions\n} from '../../libs/selectedAccount/selectedAccount'\n// eslint-disable-next-line import/no-cycle\nimport { AccountsController } from '../accounts/accounts'\n// eslint-disable-next-line import/no-cycle\nimport { ActionsController } from '../actions/actions'\n// eslint-disable-next-line import/no-cycle\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n// eslint-disable-next-line import/no-cycle\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = {\n tokens: [],\n collections: [],\n tokenAmounts: [],\n totalBalance: 0,\n isAllReady: false,\n networkSimulatedAccountOp: {},\n latest: {},\n pending: {}\n}\n\nexport class SelectedAccountController extends EventEmitter {\n #storage: Storage\n\n #accounts: AccountsController\n\n #portfolio: PortfolioController | null = null\n\n #defiPositions: DefiPositionsController | null = null\n\n #actions: ActionsController | null = null\n\n #networks: NetworksController | null = null\n\n #providers: ProvidersController | null = null\n\n account: Account | null = null\n\n portfolio: SelectedAccountPortfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n\n portfolioStartedLoadingAtTimestamp: number | null = null\n\n dashboardNetworkFilter: NetworkId | null = null\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n defiPositions: PositionsByProvider[] = []\n\n #portfolioErrors: SelectedAccountBalanceError[] = []\n\n #defiPositionsErrors: SelectedAccountBalanceError[] = []\n\n isReady: boolean = false\n\n areControllersInitialized: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor({ storage, accounts }: { storage: Storage; accounts: AccountsController }) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n const selectedAccountAddress = await this.#storage.get('selectedAccount', null)\n\n const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress)\n\n this.account = selectedAccount || null\n this.isReady = true\n\n this.emitUpdate()\n }\n\n initControllers({\n portfolio,\n defiPositions,\n actions,\n networks,\n providers\n }: {\n portfolio: PortfolioController\n defiPositions: DefiPositionsController\n actions: ActionsController\n networks: NetworksController\n providers: ProvidersController\n }) {\n this.#portfolio = portfolio\n this.#defiPositions = defiPositions\n this.#actions = actions\n this.#networks = networks\n this.#providers = providers\n\n this.#updateSelectedAccountPortfolio(true)\n this.#updatePortfolioErrors(true)\n this.#updateSelectedAccountDefiPositions(true)\n this.#updateDefiPositionsErrors(true)\n\n this.#portfolio.onUpdate(async () => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => {\n this.#updateSelectedAccountPortfolio()\n })\n }, 'selectedAccount')\n\n this.#defiPositions.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => {\n this.#updateSelectedAccountDefiPositions()\n\n if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) {\n this.#updateSelectedAccountPortfolio(true)\n this.#updateDefiPositionsErrors()\n }\n })\n })\n\n this.#providers.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => {\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.#networks.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => {\n if (!this.dashboardNetworkFilter) return\n const dashboardFilteredNetwork = this.#networks!.networks.find(\n (n) => n.id === this.dashboardNetworkFilter\n )\n\n // reset the dashboardNetworkFilter if the network is removed\n if (!dashboardFilteredNetwork) this.setDashboardNetworkFilter(null)\n })\n })\n\n this.#accounts.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => {\n this.#updateSelectedAccount()\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.areControllersInitialized = true\n\n this.emitUpdate()\n }\n\n async setAccount(account: Account | null) {\n this.account = account\n this.#portfolioErrors = []\n this.#defiPositionsErrors = []\n this.resetSelectedAccountPortfolio(true)\n this.dashboardNetworkFilter = null\n\n if (!account) {\n await this.#storage.remove('selectedAccount')\n } else {\n await this.#storage.set('selectedAccount', account.addr)\n }\n\n this.emitUpdate()\n }\n\n #updateSelectedAccount() {\n if (!this.account) return\n\n const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account!.addr)\n if (!updatedAccount) return\n\n this.account = updatedAccount\n\n this.emitUpdate()\n }\n\n resetSelectedAccountPortfolio(skipUpdate?: boolean) {\n this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n this.#portfolioErrors = []\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updateSelectedAccountPortfolio(skipUpdate?: boolean) {\n if (!this.#portfolio || !this.#defiPositions || !this.account) return\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const latestStateSelectedAccount = structuredClone(\n this.#portfolio.getLatestPortfolioState(this.account.addr)\n )\n const pendingStateSelectedAccount = structuredClone(\n this.#portfolio.getPendingPortfolioState(this.account.addr)\n )\n\n const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n latestStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n pendingStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter(\n (action) => action.type === 'accountOp'\n )\n\n const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(\n latestStateSelectedAccountWithDefiPositions,\n pendingStateSelectedAccountWithDefiPositions,\n this.portfolio,\n hasSignAccountOp\n )\n\n if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = null\n }\n\n if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = Date.now()\n }\n\n if (\n newSelectedAccountPortfolio.isAllReady ||\n (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)\n ) {\n this.portfolio = newSelectedAccountPortfolio\n this.#updatePortfolioErrors(true)\n }\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get areDefiPositionsLoading() {\n if (!this.account || !this.#defiPositions) return false\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n return Object.values(defiPositionsAccountState).some((n) => n.isLoading)\n }\n\n #updateSelectedAccountDefiPositions(skipUpdate?: boolean) {\n if (!this.#defiPositions || !this.account) return\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const positionsByProvider = Object.values(defiPositionsAccountState).flatMap(\n (n) => n.positionsByProvider\n )\n\n const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => {\n const positions = provider.positions\n .map((position) => {\n const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value))\n\n return { ...position, assets }\n })\n .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD))\n\n return { ...provider, positions }\n })\n\n const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) =>\n sortByValue(a.positionInUSD, b.positionInUSD)\n )\n\n this.defiPositions = sortedPositionsByProvider\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: () => void) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n try {\n func()\n } catch (error: any) {\n this.emitError({\n level: 'minor',\n message: `The execution of ${funcName} in SelectedAccountController failed`,\n error\n })\n }\n }, 0)\n }\n\n #updateDefiPositionsErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#defiPositions ||\n this.areDefiPositionsLoading\n ) {\n this.#defiPositionsErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const errorBanners = getNetworksWithDeFiPositionsErrorErrors({\n networks: this.#networks.networks,\n currentAccountState: defiPositionsAccountState,\n providers: this.#providers.providers,\n networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr)\n })\n\n this.#defiPositionsErrors = errorBanners\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updatePortfolioErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#portfolio ||\n !this.portfolio.isAllReady\n ) {\n this.#portfolioErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({\n providers: this.#providers.providers,\n networks: this.#networks.networks,\n networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr)\n })\n\n const errorBanners = getNetworksWithPortfolioErrorErrors({\n networks: this.#networks.networks,\n selectedAccountLatest: this.portfolio.latest,\n providers: this.#providers.providers\n })\n\n this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get balanceAffectingErrors() {\n return [...this.#portfolioErrors, ...this.#defiPositionsErrors]\n }\n\n get deprecatedSmartAccountBanner(): Banner[] {\n if (!this.account || !isSmartAccount(this.account)) return []\n\n if (\n !this.#accounts.accountStates[this.account.addr] ||\n !this.#accounts.accountStates[this.account.addr].ethereum ||\n !this.#accounts.accountStates[this.account.addr].ethereum.isV2\n )\n return []\n\n if (\n !this.account.creation ||\n getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n return []\n\n return [\n {\n id: 'old-account',\n accountAddr: this.account.addr,\n type: 'warning',\n category: 'old-account',\n title: 'Old Ambire Account',\n text: \"The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support\",\n actions: []\n }\n ]\n }\n\n setDashboardNetworkFilter(networkFilter: NetworkId | null) {\n this.dashboardNetworkFilter = networkFilter\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner,\n areDefiPositionsLoading: this.areDefiPositionsLoading,\n balanceAffectingErrors: this.balanceAffectingErrors\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { NetworkId } from '../../interfaces/network'\nimport { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { sortByValue } from '../../libs/defiPositions/helpers'\nimport { PositionsByProvider } from '../../libs/defiPositions/types'\n// eslint-disable-next-line import/no-cycle\nimport {\n getNetworksWithDeFiPositionsErrorErrors,\n getNetworksWithFailedRPCErrors,\n getNetworksWithPortfolioErrorErrors,\n SelectedAccountBalanceError\n} from '../../libs/selectedAccount/errors'\nimport {\n calculateSelectedAccountPortfolio,\n updatePortfolioStateWithDefiPositions\n} from '../../libs/selectedAccount/selectedAccount'\n// eslint-disable-next-line import/no-cycle\nimport { AccountsController } from '../accounts/accounts'\n// eslint-disable-next-line import/no-cycle\nimport { ActionsController } from '../actions/actions'\n// eslint-disable-next-line import/no-cycle\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n// eslint-disable-next-line import/no-cycle\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = {\n tokens: [],\n collections: [],\n tokenAmounts: [],\n totalBalance: 0,\n isAllReady: false,\n networkSimulatedAccountOp: {},\n latest: {},\n pending: {}\n}\n\nexport class SelectedAccountController extends EventEmitter {\n #storage: Storage\n\n #accounts: AccountsController\n\n #portfolio: PortfolioController | null = null\n\n #defiPositions: DefiPositionsController | null = null\n\n #actions: ActionsController | null = null\n\n #networks: NetworksController | null = null\n\n #providers: ProvidersController | null = null\n\n account: Account | null = null\n\n portfolio: SelectedAccountPortfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n\n portfolioStartedLoadingAtTimestamp: number | null = null\n\n dashboardNetworkFilter: NetworkId | null = null\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n defiPositions: PositionsByProvider[] = []\n\n #portfolioErrors: SelectedAccountBalanceError[] = []\n\n #defiPositionsErrors: SelectedAccountBalanceError[] = []\n\n isReady: boolean = false\n\n areControllersInitialized: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor({ storage, accounts }: { storage: Storage; accounts: AccountsController }) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n const selectedAccountAddress = await this.#storage.get('selectedAccount', null)\n\n const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress)\n\n this.account = selectedAccount || null\n this.isReady = true\n\n this.emitUpdate()\n }\n\n initControllers({\n portfolio,\n defiPositions,\n actions,\n networks,\n providers\n }: {\n portfolio: PortfolioController\n defiPositions: DefiPositionsController\n actions: ActionsController\n networks: NetworksController\n providers: ProvidersController\n }) {\n this.#portfolio = portfolio\n this.#defiPositions = defiPositions\n this.#actions = actions\n this.#networks = networks\n this.#providers = providers\n\n this.#updateSelectedAccountPortfolio(true)\n this.#updatePortfolioErrors(true)\n this.#updateSelectedAccountDefiPositions(true)\n this.#updateDefiPositionsErrors(true)\n\n this.#portfolio.onUpdate(async () => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => {\n this.#updateSelectedAccountPortfolio()\n })\n }, 'selectedAccount')\n\n this.#defiPositions.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => {\n this.#updateSelectedAccountDefiPositions()\n\n if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) {\n this.#updateSelectedAccountPortfolio(true)\n this.#updateDefiPositionsErrors()\n }\n })\n })\n\n this.#providers.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => {\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.#networks.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => {\n if (!this.dashboardNetworkFilter) return\n const dashboardFilteredNetwork = this.#networks!.networks.find(\n (n) => n.id === this.dashboardNetworkFilter\n )\n\n // reset the dashboardNetworkFilter if the network is removed\n if (!dashboardFilteredNetwork) this.setDashboardNetworkFilter(null)\n })\n })\n\n this.#accounts.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => {\n this.#updateSelectedAccount()\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.areControllersInitialized = true\n\n this.emitUpdate()\n }\n\n async setAccount(account: Account | null) {\n this.account = account\n this.#portfolioErrors = []\n this.#defiPositionsErrors = []\n this.resetSelectedAccountPortfolio(true)\n this.dashboardNetworkFilter = null\n\n if (!account) {\n await this.#storage.remove('selectedAccount')\n } else {\n await this.#storage.set('selectedAccount', account.addr)\n }\n\n this.emitUpdate()\n }\n\n #updateSelectedAccount() {\n if (!this.account) return\n\n const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account!.addr)\n if (!updatedAccount) return\n\n this.account = updatedAccount\n\n this.emitUpdate()\n }\n\n resetSelectedAccountPortfolio(skipUpdate?: boolean) {\n this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n this.#portfolioErrors = []\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updateSelectedAccountPortfolio(skipUpdate?: boolean) {\n if (!this.#portfolio || !this.#defiPositions || !this.account) return\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const latestStateSelectedAccount = structuredClone(\n this.#portfolio.getLatestPortfolioState(this.account.addr)\n )\n const pendingStateSelectedAccount = structuredClone(\n this.#portfolio.getPendingPortfolioState(this.account.addr)\n )\n\n const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n latestStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n pendingStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter(\n (action) => action.type === 'accountOp'\n )\n\n const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(\n latestStateSelectedAccountWithDefiPositions,\n pendingStateSelectedAccountWithDefiPositions,\n this.portfolio,\n hasSignAccountOp\n )\n\n if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = null\n }\n\n if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = Date.now()\n }\n\n if (\n newSelectedAccountPortfolio.isAllReady ||\n (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)\n ) {\n this.portfolio = newSelectedAccountPortfolio\n this.#updatePortfolioErrors(true)\n }\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get areDefiPositionsLoading() {\n if (!this.account || !this.#defiPositions) return false\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n return Object.values(defiPositionsAccountState).some((n) => n.isLoading)\n }\n\n #updateSelectedAccountDefiPositions(skipUpdate?: boolean) {\n if (!this.#defiPositions || !this.account) return\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const positionsByProvider = Object.values(defiPositionsAccountState).flatMap(\n (n) => n.positionsByProvider\n )\n\n const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => {\n const positions = provider.positions\n .map((position) => {\n const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value))\n\n return { ...position, assets }\n })\n .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD))\n\n return { ...provider, positions }\n })\n\n const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) =>\n sortByValue(a.positionInUSD, b.positionInUSD)\n )\n\n this.defiPositions = sortedPositionsByProvider\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: () => void) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n try {\n func()\n } catch (error: any) {\n this.emitError({\n level: 'minor',\n message: `The execution of ${funcName} in SelectedAccountController failed`,\n error\n })\n }\n }, 0)\n }\n\n #updateDefiPositionsErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#defiPositions ||\n this.areDefiPositionsLoading\n ) {\n this.#defiPositionsErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const errorBanners = getNetworksWithDeFiPositionsErrorErrors({\n networks: this.#networks.networks,\n currentAccountState: defiPositionsAccountState,\n providers: this.#providers.providers,\n networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr)\n })\n\n this.#defiPositionsErrors = errorBanners\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updatePortfolioErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#portfolio ||\n !this.portfolio.isAllReady\n ) {\n this.#portfolioErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({\n providers: this.#providers.providers,\n networks: this.#networks.networks,\n networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr)\n })\n\n const errorBanners = getNetworksWithPortfolioErrorErrors({\n networks: this.#networks.networks,\n selectedAccountLatest: this.portfolio.latest,\n providers: this.#providers.providers\n })\n\n this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get balanceAffectingErrors() {\n return [...this.#portfolioErrors, ...this.#defiPositionsErrors]\n }\n\n get deprecatedSmartAccountBanner(): Banner[] {\n if (!this.account || !isSmartAccount(this.account)) return []\n\n if (\n !this.#accounts.accountStates[this.account.addr] ||\n !this.#accounts.accountStates[this.account.addr].ethereum ||\n !this.#accounts.accountStates[this.account.addr].ethereum.isV2\n )\n return []\n\n if (\n !this.account.creation ||\n getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n return []\n\n return [\n {\n id: 'old-account',\n accountAddr: this.account.addr,\n type: 'warning',\n category: 'old-account',\n title: 'Old Ambire Account',\n text: \"The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support\",\n actions: []\n }\n ]\n }\n\n setDashboardNetworkFilter(networkFilter: NetworkId | null) {\n this.dashboardNetworkFilter = networkFilter\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner,\n areDefiPositionsLoading: this.areDefiPositionsLoading,\n balanceAffectingErrors: this.balanceAffectingErrors\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.js b/dist/src/controllers/signAccountOp/helper.js index 6681b578c..53ffa32fe 100644 --- a/dist/src/controllers/signAccountOp/helper.js +++ b/dist/src/controllers/signAccountOp/helper.js @@ -1,13 +1,17 @@ -import { formatUnits, ZeroAddress } from 'ethers'; -import { WARNINGS } from '../../consts/signAccountOp/errorHandling'; -import { getAccountPortfolioTotal, getTotal } from '../../libs/portfolio/helpers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getFeeTokenPriceUnavailableWarning = exports.getSignificantBalanceDecreaseWarning = exports.getTokenUsdAmount = exports.getFeeSpeedIdentifier = void 0; +const ethers_1 = require("ethers"); +const errorHandling_1 = require("../../consts/signAccountOp/errorHandling"); +const helpers_1 = require("../../libs/portfolio/helpers"); function getFeeSpeedIdentifier(option, accountAddr, rbfAccountOp) { // if the token is native and we're paying with EOA, we do not need // a different identifier as the fee speed calculations will be the same // regardless of the EOA address - const paidBy = option.token.address === ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy; + const paidBy = option.token.address === ethers_1.ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy; return `${paidBy}:${option.token.address}:${option.token.symbol.toLowerCase()}:${option.token.flags.onGasTank ? 'gasTank' : 'feeToken'}${rbfAccountOp ? `rbf-${option.paidBy}` : ''}`; } +exports.getFeeSpeedIdentifier = getFeeSpeedIdentifier; function getTokenUsdAmount(token, gasAmount) { const isUsd = (price) => price.baseCurrency === 'usd'; const usdPrice = token.priceIn.find(isUsd)?.price; @@ -15,8 +19,9 @@ function getTokenUsdAmount(token, gasAmount) { return ''; const usdPriceFormatted = BigInt(usdPrice * 1e18); // 18 it's because we multiply usdPrice * 1e18 and here we need to deduct it - return formatUnits(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals); + return (0, ethers_1.formatUnits)(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals); } +exports.getTokenUsdAmount = getTokenUsdAmount; function getSignificantBalanceDecreaseWarning(latest, pending, networkId) { const latestNetworkData = latest?.[networkId]; const pendingNetworkData = pending?.[networkId]; @@ -25,20 +30,21 @@ function getSignificantBalanceDecreaseWarning(latest, pending, networkId) { pendingNetworkData && !pendingNetworkData.isLoading; if (canDetermineIfBalanceWillDecrease) { - const latestTotal = getAccountPortfolioTotal(latest, ['rewards', 'gasTank'], false); - const latestOnNetwork = getTotal(latestNetworkData.result?.tokens || []).usd; - const pendingOnNetwork = getTotal(pendingNetworkData.result?.tokens || []).usd; + const latestTotal = (0, helpers_1.getAccountPortfolioTotal)(latest, ['rewards', 'gasTank'], false); + const latestOnNetwork = (0, helpers_1.getTotal)(latestNetworkData.result?.tokens || []).usd; + const pendingOnNetwork = (0, helpers_1.getTotal)(pendingNetworkData.result?.tokens || []).usd; const willBalanceDecreaseByMoreThan10Percent = latestOnNetwork - pendingOnNetwork > latestTotal * 0.1; if (!willBalanceDecreaseByMoreThan10Percent) return null; - return WARNINGS.significantBalanceDecrease; + return errorHandling_1.WARNINGS.significantBalanceDecrease; } return null; } +exports.getSignificantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning; const getFeeTokenPriceUnavailableWarning = (hasSpeed, feeTokenHasPrice) => { if (!hasSpeed || feeTokenHasPrice) return null; - return WARNINGS.feeTokenPriceUnavailable; + return errorHandling_1.WARNINGS.feeTokenPriceUnavailable; }; -export { getFeeSpeedIdentifier, getTokenUsdAmount, getSignificantBalanceDecreaseWarning, getFeeTokenPriceUnavailableWarning }; +exports.getFeeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning; //# sourceMappingURL=helper.js.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/helper.js.map b/dist/src/controllers/signAccountOp/helper.js.map index 1a04562f5..6f4c864ab 100644 --- a/dist/src/controllers/signAccountOp/helper.js.map +++ b/dist/src/controllers/signAccountOp/helper.js.map @@ -1 +1 @@ -{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, ZeroAddress } from 'ethers'\n\nimport { WARNINGS } from '../../consts/signAccountOp/errorHandling'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { FeePaymentOption } from '../../libs/estimate/interfaces'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getAccountPortfolioTotal, getTotal } from '../../libs/portfolio/helpers'\nimport { AccountState } from '../../libs/portfolio/interfaces'\n\nfunction getFeeSpeedIdentifier(\n option: FeePaymentOption,\n accountAddr: string,\n rbfAccountOp: SubmittedAccountOp | null\n) {\n // if the token is native and we're paying with EOA, we do not need\n // a different identifier as the fee speed calculations will be the same\n // regardless of the EOA address\n const paidBy =\n option.token.address === ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy\n\n return `${paidBy}:${option.token.address}:${option.token.symbol.toLowerCase()}:${\n option.token.flags.onGasTank ? 'gasTank' : 'feeToken'\n }${rbfAccountOp ? `rbf-${option.paidBy}` : ''}`\n}\n\nfunction getTokenUsdAmount(token: TokenResult, gasAmount: bigint): string {\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n const usdPrice = token.priceIn.find(isUsd)?.price\n\n if (!usdPrice) return ''\n\n const usdPriceFormatted = BigInt(usdPrice * 1e18)\n\n // 18 it's because we multiply usdPrice * 1e18 and here we need to deduct it\n return formatUnits(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals)\n}\n\nfunction getSignificantBalanceDecreaseWarning(\n latest: AccountState,\n pending: AccountState,\n networkId: Network['id']\n): Warning | null {\n const latestNetworkData = latest?.[networkId]\n const pendingNetworkData = pending?.[networkId]\n const canDetermineIfBalanceWillDecrease =\n latestNetworkData &&\n !latestNetworkData.isLoading &&\n pendingNetworkData &&\n !pendingNetworkData.isLoading\n\n if (canDetermineIfBalanceWillDecrease) {\n const latestTotal = getAccountPortfolioTotal(latest, ['rewards', 'gasTank'], false)\n const latestOnNetwork = getTotal(latestNetworkData.result?.tokens || []).usd\n const pendingOnNetwork = getTotal(pendingNetworkData.result?.tokens || []).usd\n const willBalanceDecreaseByMoreThan10Percent =\n latestOnNetwork - pendingOnNetwork > latestTotal * 0.1\n\n if (!willBalanceDecreaseByMoreThan10Percent) return null\n\n return WARNINGS.significantBalanceDecrease\n }\n\n return null\n}\n\nconst getFeeTokenPriceUnavailableWarning = (\n hasSpeed: boolean,\n feeTokenHasPrice: boolean\n): Warning | null => {\n if (!hasSpeed || feeTokenHasPrice) return null\n\n return WARNINGS.feeTokenPriceUnavailable\n}\n\nexport {\n getFeeSpeedIdentifier,\n getTokenUsdAmount,\n getSignificantBalanceDecreaseWarning,\n getFeeTokenPriceUnavailableWarning\n}\n"]} \ No newline at end of file +{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/helper.ts"],"names":[],"mappings":";;;AAAA,mCAAiD;AAEjD,4EAAmE;AAMnE,0DAAiF;AAGjF,SAAS,qBAAqB,CAC5B,MAAwB,EACxB,WAAmB,EACnB,YAAuC;IAEvC,mEAAmE;IACnE,wEAAwE;IACxE,gCAAgC;IAChC,MAAM,MAAM,GACV,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAE/F,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAC3E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAC7C,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACjD,CAAC;AAoDC,sDAAqB;AAlDvB,SAAS,iBAAiB,CAAC,KAAkB,EAAE,SAAiB;IAC9D,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAA;IAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;IAEjD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IAExB,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAEjD,4EAA4E;IAC5E,OAAO,IAAA,oBAAW,EAAC,MAAM,CAAC,SAAS,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;AAChF,CAAC;AAyCC,8CAAiB;AAvCnB,SAAS,oCAAoC,CAC3C,MAAoB,EACpB,OAAqB,EACrB,SAAwB;IAExB,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,CAAA;IAC7C,MAAM,kBAAkB,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;IAC/C,MAAM,iCAAiC,GACrC,iBAAiB;QACjB,CAAC,iBAAiB,CAAC,SAAS;QAC5B,kBAAkB;QAClB,CAAC,kBAAkB,CAAC,SAAS,CAAA;IAE/B,IAAI,iCAAiC,EAAE;QACrC,MAAM,WAAW,GAAG,IAAA,kCAAwB,EAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAA;QACnF,MAAM,eAAe,GAAG,IAAA,kBAAQ,EAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAA;QAC5E,MAAM,gBAAgB,GAAG,IAAA,kBAAQ,EAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAA;QAC9E,MAAM,sCAAsC,GAC1C,eAAe,GAAG,gBAAgB,GAAG,WAAW,GAAG,GAAG,CAAA;QAExD,IAAI,CAAC,sCAAsC;YAAE,OAAO,IAAI,CAAA;QAExD,OAAO,wBAAQ,CAAC,0BAA0B,CAAA;KAC3C;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAcC,oFAAoC;AAZtC,MAAM,kCAAkC,GAAG,CACzC,QAAiB,EACjB,gBAAyB,EACT,EAAE;IAClB,IAAI,CAAC,QAAQ,IAAI,gBAAgB;QAAE,OAAO,IAAI,CAAA;IAE9C,OAAO,wBAAQ,CAAC,wBAAwB,CAAA;AAC1C,CAAC,CAAA;AAMC,gFAAkC","sourcesContent":["import { formatUnits, ZeroAddress } from 'ethers'\n\nimport { WARNINGS } from '../../consts/signAccountOp/errorHandling'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { FeePaymentOption } from '../../libs/estimate/interfaces'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getAccountPortfolioTotal, getTotal } from '../../libs/portfolio/helpers'\nimport { AccountState } from '../../libs/portfolio/interfaces'\n\nfunction getFeeSpeedIdentifier(\n option: FeePaymentOption,\n accountAddr: string,\n rbfAccountOp: SubmittedAccountOp | null\n) {\n // if the token is native and we're paying with EOA, we do not need\n // a different identifier as the fee speed calculations will be the same\n // regardless of the EOA address\n const paidBy =\n option.token.address === ZeroAddress && option.paidBy !== accountAddr ? 'EOA' : option.paidBy\n\n return `${paidBy}:${option.token.address}:${option.token.symbol.toLowerCase()}:${\n option.token.flags.onGasTank ? 'gasTank' : 'feeToken'\n }${rbfAccountOp ? `rbf-${option.paidBy}` : ''}`\n}\n\nfunction getTokenUsdAmount(token: TokenResult, gasAmount: bigint): string {\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n const usdPrice = token.priceIn.find(isUsd)?.price\n\n if (!usdPrice) return ''\n\n const usdPriceFormatted = BigInt(usdPrice * 1e18)\n\n // 18 it's because we multiply usdPrice * 1e18 and here we need to deduct it\n return formatUnits(BigInt(gasAmount) * usdPriceFormatted, 18 + token.decimals)\n}\n\nfunction getSignificantBalanceDecreaseWarning(\n latest: AccountState,\n pending: AccountState,\n networkId: Network['id']\n): Warning | null {\n const latestNetworkData = latest?.[networkId]\n const pendingNetworkData = pending?.[networkId]\n const canDetermineIfBalanceWillDecrease =\n latestNetworkData &&\n !latestNetworkData.isLoading &&\n pendingNetworkData &&\n !pendingNetworkData.isLoading\n\n if (canDetermineIfBalanceWillDecrease) {\n const latestTotal = getAccountPortfolioTotal(latest, ['rewards', 'gasTank'], false)\n const latestOnNetwork = getTotal(latestNetworkData.result?.tokens || []).usd\n const pendingOnNetwork = getTotal(pendingNetworkData.result?.tokens || []).usd\n const willBalanceDecreaseByMoreThan10Percent =\n latestOnNetwork - pendingOnNetwork > latestTotal * 0.1\n\n if (!willBalanceDecreaseByMoreThan10Percent) return null\n\n return WARNINGS.significantBalanceDecrease\n }\n\n return null\n}\n\nconst getFeeTokenPriceUnavailableWarning = (\n hasSpeed: boolean,\n feeTokenHasPrice: boolean\n): Warning | null => {\n if (!hasSpeed || feeTokenHasPrice) return null\n\n return WARNINGS.feeTokenPriceUnavailable\n}\n\nexport {\n getFeeSpeedIdentifier,\n getTokenUsdAmount,\n getSignificantBalanceDecreaseWarning,\n getFeeTokenPriceUnavailableWarning\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js b/dist/src/controllers/signAccountOp/signAccountOp.js index f5ae91b88..9b72100c5 100644 --- a/dist/src/controllers/signAccountOp/signAccountOp.js +++ b/dist/src/controllers/signAccountOp/signAccountOp.js @@ -1,23 +1,27 @@ -import { AbiCoder, formatEther, formatUnits, getAddress, Interface, toBeHex, ZeroAddress } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import ERC20 from '../../../contracts/compiled/IERC20.json'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { SINGLETON } from '../../consts/deploy'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SignAccountOpController = exports.noStateUpdateStatuses = exports.FeeSpeed = exports.SigningStatus = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const IERC20_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/IERC20.json")); +const addresses_1 = require("../../consts/addresses"); +const deploy_1 = require("../../consts/deploy"); /* eslint-disable no-restricted-syntax */ -import { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'; -import { GAS_TANK_TRANSFER_GAS_USED, SA_ERC20_TRANSFER_GAS_USED, SA_NATIVE_TRANSFER_GAS_USED } from '../../consts/signAccountOp/gas'; -import { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'; -import { getSignableCalls } from '../../libs/accountOp/accountOp'; -import { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'; -import { getProbableCallData } from '../../libs/gasPrice/gasPrice'; -import { hasRelayerSupport } from '../../libs/networks/networks'; -import { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'; -import { getGasUsed } from '../../libs/singleton/singleton'; -import { getActivatorCall, getOneTimeNonce, getUserOperation, getUserOpHash, isErc4337Broadcast, shouldIncludeActivatorCall, shouldUseOneTimeNonce } from '../../libs/userOperation/userOperation'; -import { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'; -import EventEmitter from '../eventEmitter/eventEmitter'; -import { getFeeSpeedIdentifier, getFeeTokenPriceUnavailableWarning, getSignificantBalanceDecreaseWarning, getTokenUsdAmount } from './helper'; -export var SigningStatus; +const errorHandling_1 = require("../../consts/signAccountOp/errorHandling"); +const gas_1 = require("../../consts/signAccountOp/gas"); +const account_1 = require("../../libs/account/account"); +const accountOp_1 = require("../../libs/accountOp/accountOp"); +const errorHumanizer_1 = require("../../libs/errorHumanizer"); +const gasPrice_1 = require("../../libs/gasPrice/gasPrice"); +const networks_1 = require("../../libs/networks/networks"); +const signMessage_1 = require("../../libs/signMessage/signMessage"); +const singleton_1 = require("../../libs/singleton/singleton"); +const userOperation_1 = require("../../libs/userOperation/userOperation"); +const bundlerSwitcher_1 = require("../../services/bundlers/bundlerSwitcher"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); +const helper_1 = require("./helper"); +var SigningStatus; (function (SigningStatus) { SigningStatus["EstimationError"] = "estimation-error"; SigningStatus["UnableToSign"] = "unable-to-sign"; @@ -30,22 +34,22 @@ export var SigningStatus; SigningStatus["InProgress"] = "in-progress"; SigningStatus["WaitingForPaymaster"] = "waiting-for-paymaster-response"; SigningStatus["Done"] = "done"; -})(SigningStatus || (SigningStatus = {})); -export var FeeSpeed; +})(SigningStatus = exports.SigningStatus || (exports.SigningStatus = {})); +var FeeSpeed; (function (FeeSpeed) { FeeSpeed["Slow"] = "slow"; FeeSpeed["Medium"] = "medium"; FeeSpeed["Fast"] = "fast"; FeeSpeed["Ape"] = "ape"; -})(FeeSpeed || (FeeSpeed = {})); +})(FeeSpeed = exports.FeeSpeed || (exports.FeeSpeed = {})); // declare the statuses we don't want state updates on -export const noStateUpdateStatuses = [ +exports.noStateUpdateStatuses = [ SigningStatus.InProgress, SigningStatus.Done, SigningStatus.UpdatesPaused, SigningStatus.WaitingForPaymaster ]; -export class SignAccountOpController extends EventEmitter { +class SignAccountOpController extends eventEmitter_1.default { #accounts; #keystore; #portfolio; @@ -94,9 +98,9 @@ export class SignAccountOpController extends EventEmitter { this.rbfAccountOps = {}; this.signedAccountOp = null; this.replacementFeeLow = false; - this.bundlerSwitcher = new BundlerSwitcher(network, () => { + this.bundlerSwitcher = new bundlerSwitcher_1.BundlerSwitcher(network, () => { return this.status ? this.status.type : null; - }, noStateUpdateStatuses); + }, exports.noStateUpdateStatuses); } get isInitialized() { return !!this.estimation; @@ -128,9 +132,9 @@ export class SignAccountOpController extends EventEmitter { getCallDataAdditionalByNetwork() { // no additional call data is required for arbitrum as the bytes are already // added in the calculation for the L1 fee - if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) + if (this.#network.id === 'arbitrum' || !(0, account_1.isSmartAccount)(this.account)) return 0n; - const estimationCallData = getProbableCallData(this.account, this.accountOp, this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId], this.#network); + const estimationCallData = (0, gasPrice_1.getProbableCallData)(this.account, this.accountOp, this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId], this.#network); const FIXED_OVERHEAD = 21000n; const bytes = Buffer.from(estimationCallData.substring(2)); const nonZeroBytes = BigInt(bytes.filter((b) => b).length); @@ -142,8 +146,8 @@ export class SignAccountOpController extends EventEmitter { const errors = []; if (!this.isInitialized) return errors; - const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr); - const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network); + const isAmbireV1 = (0, account_1.isAmbireV1LinkedAccount)(this.account?.creation?.factoryAddr); + const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !(0, networks_1.hasRelayerSupport)(this.#network); // This must be the first error check! if (isAmbireV1AndNetworkNotSupported) { errors.push('Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'); @@ -166,7 +170,7 @@ export class SignAccountOpController extends EventEmitter { } // this error should never happen as availableFeeOptions should always have the native option if (!this.isSponsored && !this.availableFeeOptions.length) - errors.push(ERRORS.eoaInsufficientFunds); + errors.push(errorHandling_1.ERRORS.eoaInsufficientFunds); // This error should not happen, as in the update method we are always setting a default signer. // It may occur, only if there are no available signer. if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr) @@ -182,7 +186,7 @@ export class SignAccountOpController extends EventEmitter { !this.accountOp.gasFeePayment && this.feeTokenResult && this.selectedOption) { - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); if (this.hasSpeeds(identifier)) errors.push('Please select a token and an account for paying the gas fee.'); } @@ -191,7 +195,7 @@ export class SignAccountOpController extends EventEmitter { this.accountOp.gasFeePayment && this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount) { const speedCoverage = []; - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); if (this.feeSpeeds[identifier]) { this.feeSpeeds[identifier].forEach((speed) => { if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount) @@ -199,9 +203,9 @@ export class SignAccountOpController extends EventEmitter { }); } if (speedCoverage.length === 0) { - errors.push(isSmartAccount(this.account) + errors.push((0, account_1.isSmartAccount)(this.account) ? "Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee." - : ERRORS.eoaInsufficientFunds); + : errorHandling_1.ERRORS.eoaInsufficientFunds); } else { errors.push('The selected speed is not available due to insufficient funds. Please select a slower speed.'); @@ -214,7 +218,7 @@ export class SignAccountOpController extends EventEmitter { errors.push(this.status.error); } if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) { - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); if (!this.hasSpeeds(identifier)) { if (!this.feeTokenResult?.priceIn.length) { errors.push(`Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`); @@ -246,11 +250,11 @@ export class SignAccountOpController extends EventEmitter { const warnings = []; const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr); const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr); - const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(latestState, pendingState, this.accountOp.networkId); + const significantBalanceDecreaseWarning = (0, helper_1.getSignificantBalanceDecreaseWarning)(latestState, pendingState, this.accountOp.networkId); if (this.selectedOption) { - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd); - const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(!!this.hasSpeeds(identifier), feeTokenHasPrice); + const feeTokenPriceUnavailableWarning = (0, helper_1.getFeeTokenPriceUnavailableWarning)(!!this.hasSpeeds(identifier), feeTokenHasPrice); // push the warning only if the txn is not sponsored if (!this.isSponsored && feeTokenPriceUnavailableWarning) warnings.push(feeTokenPriceUnavailableWarning); @@ -268,7 +272,7 @@ export class SignAccountOpController extends EventEmitter { // If we allow the estimation to affect the controller state during sign, // there could be discrepancy between what the user has agreed upon and what // we broadcast in the end - if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) { + if (this.status?.type && exports.noStateUpdateStatuses.indexOf(this.status?.type) !== -1) { return; } if (Array.isArray(calls)) @@ -504,7 +508,7 @@ export class SignAccountOpController extends EventEmitter { // EOA pays for SA is the most common case for this scenario // // addition: make sure there's no rbfAccountOps as well - const identifier = getFeeSpeedIdentifier(option, this.accountOp.accountAddr, this.rbfAccountOps[option.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(option, this.accountOp.accountAddr, this.rbfAccountOps[option.paidBy]); if (this.hasSpeeds(identifier)) { return; } @@ -529,8 +533,8 @@ export class SignAccountOpController extends EventEmitter { type: speed, simulatedGasLimit, amount, - amountFormatted: formatUnits(amount, Number(option.token.decimals)), - amountUsd: getTokenUsdAmount(option.token, amount), + amountFormatted: (0, ethers_1.formatUnits)(amount, Number(option.token.decimals)), + amountUsd: (0, helper_1.getTokenUsdAmount)(option.token, amount), gasPrice, maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas) }); @@ -563,10 +567,10 @@ export class SignAccountOpController extends EventEmitter { ? gasRecommendation.baseFeePerGas + maxPriorityFeePerGas : this.#rbfIncrease(option.paidBy, gasRecommendation.gasPrice, 'gasPrice', prevSpeed); // EOA - if (!isSmartAccount(this.account)) { + if (!(0, account_1.isSmartAccount)(this.account)) { simulatedGasLimit = gasUsed; - if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) { - simulatedGasLimit = getGasUsed(simulatedGasLimit); + if (this.accountOp.calls[0].to && (0, ethers_1.getAddress)(this.accountOp.calls[0].to) === deploy_1.SINGLETON) { + simulatedGasLimit = (0, singleton_1.getGasUsed)(simulatedGasLimit); } amount = simulatedGasLimit * gasPrice + option.addedNative; } @@ -585,8 +589,8 @@ export class SignAccountOpController extends EventEmitter { type: gasRecommendation.name, simulatedGasLimit, amount, - amountFormatted: formatUnits(amount, Number(option.token.decimals)), - amountUsd: getTokenUsdAmount(option.token, amount), + amountFormatted: (0, ethers_1.formatUnits)(amount, Number(option.token.decimals)), + amountUsd: (0, helper_1.getTokenUsdAmount)(option.token, amount), gasPrice, maxPriorityFeePerGas }; @@ -641,7 +645,7 @@ export class SignAccountOpController extends EventEmitter { // emit an error here but proceed and show an explanation to the user // in get errors() // check test: Signing [Relayer]: ... priceIn | native/Ratio - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); if (!this.feeSpeeds[identifier].length) { return null; } @@ -660,7 +664,7 @@ export class SignAccountOpController extends EventEmitter { // we're allowing EOAs to broadcast on 4337 networks as well // in that case, we don't do user operations isERC4337: this.paidBy === this.accountOp.accountAddr && - isErc4337Broadcast(this.account, this.#network, accountState), + (0, userOperation_1.isErc4337Broadcast)(this.account, this.#network, accountState), isGasTank: this.feeTokenResult.flags.onGasTank, inToken: this.feeTokenResult.address, feeTokenNetworkId: this.feeTokenResult.networkId, @@ -682,7 +686,7 @@ export class SignAccountOpController extends EventEmitter { // if the txn is sponsored, return the native option only // even if it's balance is 0 if (this.isSponsored) { - const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ZeroAddress); + const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ethers_1.ZeroAddress); return native ? [native] : []; } // FeeOptions having amount @@ -690,7 +694,7 @@ export class SignAccountOpController extends EventEmitter { if (withAmounts.length) return withAmounts; // if there are no fee options with amounts, return the native option - const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ZeroAddress); + const native = this.estimation.feePaymentOptions.find((feeOption) => feeOption.token.address === ethers_1.ZeroAddress); return native ? [native] : []; } get accountKeyStoreKeys() { @@ -703,7 +707,7 @@ export class SignAccountOpController extends EventEmitter { get gasSavedUSD() { if (!this.selectedOption?.token.flags.onGasTank) return null; - const identifier = getFeeSpeedIdentifier(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); + const identifier = (0, helper_1.getFeeSpeedIdentifier)(this.selectedOption, this.accountOp.accountAddr, this.rbfAccountOps[this.selectedOption.paidBy]); const selectedFeeSpeedData = this.feeSpeeds[identifier].find((speed) => speed.type === this.selectedFeeSpeed); const gasPrice = selectedFeeSpeedData?.gasPrice; if (!gasPrice) @@ -720,12 +724,12 @@ export class SignAccountOpController extends EventEmitter { // on the bundler for the estimation entirely => use hardcode value const gasUsedSelectedOption = this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n ? this.selectedOption.gasUsed - : GAS_TANK_TRANSFER_GAS_USED; - const isNativeSelected = this.selectedOption.token.address === ZeroAddress; - const gasUsedNative = this.availableFeeOptions.find((option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED; - const gasUsedERC20 = this.availableFeeOptions.find((option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || SA_ERC20_TRANSFER_GAS_USED; + : gas_1.GAS_TANK_TRANSFER_GAS_USED; + const isNativeSelected = this.selectedOption.token.address === ethers_1.ZeroAddress; + const gasUsedNative = this.availableFeeOptions.find((option) => option.token.address === ethers_1.ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || gas_1.SA_NATIVE_TRANSFER_GAS_USED; + const gasUsedERC20 = this.availableFeeOptions.find((option) => option.token.address !== ethers_1.ZeroAddress && !option.token.flags.onGasTank)?.gasUsed || gas_1.SA_ERC20_TRANSFER_GAS_USED; const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20; - const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice); + const gasSavedInNative = (0, ethers_1.formatEther)((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice); return Number(gasSavedInNative) * nativePrice; } #emitSigningErrorAndResetToReadyToSign(error) { @@ -735,10 +739,10 @@ export class SignAccountOpController extends EventEmitter { } #addFeePayment() { // In case of gas tank token fee payment, we need to include one more call to account op - const abiCoder = new AbiCoder(); + const abiCoder = new ethers_1.AbiCoder(); if (this.isSponsored) { this.accountOp.feeCall = { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: 0n, data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC']) }; @@ -746,7 +750,7 @@ export class SignAccountOpController extends EventEmitter { } if (this.accountOp.gasFeePayment.isGasTank) { this.accountOp.feeCall = { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: 0n, data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', this.accountOp.gasFeePayment.amount, this.feeTokenResult?.symbol]) }; @@ -755,19 +759,19 @@ export class SignAccountOpController extends EventEmitter { if (this.accountOp.gasFeePayment.inToken === '0x0000000000000000000000000000000000000000') { // native payment this.accountOp.feeCall = { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: this.accountOp.gasFeePayment.amount, data: '0x' }; } else { // token payment - const ERC20Interface = new Interface(ERC20.abi); + const ERC20Interface = new ethers_1.Interface(IERC20_json_1.default.abi); this.accountOp.feeCall = { to: this.accountOp.gasFeePayment.inToken, value: 0n, data: ERC20Interface.encodeFunctionData('transfer', [ - FEE_COLLECTOR, + addresses_1.FEE_COLLECTOR, this.accountOp.gasFeePayment.amount ]) }; @@ -775,28 +779,28 @@ export class SignAccountOpController extends EventEmitter { } async sign() { if (!this.readyToSign) { - const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`; return this.#emitSigningErrorAndResetToReadyToSign(message); } // when signing begings, we stop immediatelly state updates on the controller // by changing the status to InProgress. Check update() for more info this.status = { type: SigningStatus.InProgress }; if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) { - const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`; return this.#emitSigningErrorAndResetToReadyToSign(message); } if (!this.accountOp?.gasFeePayment || !this.selectedOption) { - const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`; return this.#emitSigningErrorAndResetToReadyToSign(message); } const signer = await this.#keystore.getSigner(this.accountOp.signingKeyAddr, this.accountOp.signingKeyType); if (!signer) { - const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`; return this.#emitSigningErrorAndResetToReadyToSign(message); } const accountState = this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]; const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable(); - const usesOneTimeNonce = shouldUseOneTimeNonce(accountState); + const usesOneTimeNonce = (0, userOperation_1.shouldUseOneTimeNonce)(accountState); if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) { this.status = { type: SigningStatus.WaitingForPaymaster }; } @@ -823,15 +827,15 @@ export class SignAccountOpController extends EventEmitter { // @EntryPoint activation // if we broadcast by an EOA, this is the only way to include // the entry point as a signer - if (shouldIncludeActivatorCall(this.#network, this.account, accountState, this.accountOp.gasFeePayment.isERC4337)) { - this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr); + if ((0, userOperation_1.shouldIncludeActivatorCall)(this.#network, this.account, accountState, this.accountOp.gasFeePayment.isERC4337)) { + this.accountOp.activatorCall = (0, userOperation_1.getActivatorCall)(this.accountOp.accountAddr); } try { // In case of EOA account - if (!isSmartAccount(this.account)) { + if (!(0, account_1.isSmartAccount)(this.account)) { if (this.accountOp.calls.length !== 1) { const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'; - const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`; + const message = `Unable to sign the transaction because it has ${callCount} calls. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`; return this.#emitSigningErrorAndResetToReadyToSign(message); } // In legacy mode, we sign the transaction directly. @@ -842,41 +846,41 @@ export class SignAccountOpController extends EventEmitter { else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) { // Smart account, but EOA pays the fee // EOA pays for execute() - relayerless - this.accountOp.signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + this.accountOp.signature = await (0, signMessage_1.getExecuteSignature)(this.#network, this.accountOp, accountState, signer); } else if (this.accountOp.gasFeePayment.isERC4337) { // if there's no entryPointAuthorization, the txn will fail if (!accountState.isDeployed && (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)) - return this.#emitSigningErrorAndResetToReadyToSign(`Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`); + return this.#emitSigningErrorAndResetToReadyToSign(`Unable to sign the transaction because entry point privileges were not granted. ${errorHandling_1.RETRY_TO_INIT_ACCOUNT_OP_MSG}`); const erc4337Estimation = this.estimation.erc4337GasLimits; - const userOperation = getUserOperation(this.account, accountState, this.accountOp, this.bundlerSwitcher.getBundler().getName(), !accountState.isDeployed ? this.accountOp.meta.entryPointAuthorization : undefined); + const userOperation = (0, userOperation_1.getUserOperation)(this.account, accountState, this.accountOp, this.bundlerSwitcher.getBundler().getName(), !accountState.isDeployed ? this.accountOp.meta.entryPointAuthorization : undefined); userOperation.preVerificationGas = erc4337Estimation.preVerificationGas; - userOperation.callGasLimit = toBeHex(BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)); + userOperation.callGasLimit = (0, ethers_1.toBeHex)(BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)); userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit; userOperation.paymasterVerificationGasLimit = erc4337Estimation.paymasterVerificationGasLimit; userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit; - userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice); - userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas); + userOperation.maxFeePerGas = (0, ethers_1.toBeHex)(gasFeePayment.gasPrice); + userOperation.maxPriorityFeePerGas = (0, ethers_1.toBeHex)(gasFeePayment.maxPriorityFeePerGas); const paymaster = erc4337Estimation.paymaster; if (paymaster.shouldIncludePayment()) this.#addFeePayment(); - const ambireAccount = new Interface(AmbireAccount.abi); + const ambireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); if (usesOneTimeNonce) { - const signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + const signature = await (0, signMessage_1.getExecuteSignature)(this.#network, this.accountOp, accountState, signer); // after signing has completed, we wait for the paymaster response // so we tell the user this.status = { type: SigningStatus.WaitingForPaymaster }; this.emitUpdate(); userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [ - [[getSignableCalls(this.accountOp), signature]] + [[(0, accountOp_1.getSignableCalls)(this.accountOp), signature]] ]); this.accountOp.signature = signature; } else { userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [ - getSignableCalls(this.accountOp) + (0, accountOp_1.getSignableCalls)(this.accountOp) ]); } if (paymaster.isUsable()) { @@ -888,7 +892,7 @@ export class SignAccountOpController extends EventEmitter { userOperation.paymaster = paymasterData.paymaster; userOperation.paymasterData = paymasterData.paymasterData; if (usesOneTimeNonce) - userOperation.nonce = getOneTimeNonce(userOperation); + userOperation.nonce = (0, userOperation_1.getOneTimeNonce)(userOperation); this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored(); } else { @@ -910,8 +914,8 @@ export class SignAccountOpController extends EventEmitter { if (!this.#isSignRequestStillActive()) return; if (userOperation.requestType === 'standard') { - const typedData = getTypedData(this.#network.chainId, this.accountOp.accountAddr, getUserOpHash(userOperation, this.#network.chainId)); - const signature = wrapStandard(await signer.signTypedData(typedData)); + const typedData = (0, signMessage_1.getTypedData)(this.#network.chainId, this.accountOp.accountAddr, (0, userOperation_1.getUserOpHash)(userOperation, this.#network.chainId)); + const signature = (0, signMessage_1.wrapStandard)(await signer.signTypedData(typedData)); userOperation.signature = signature; this.accountOp.signature = signature; } @@ -920,7 +924,7 @@ export class SignAccountOpController extends EventEmitter { else { // Relayer this.#addFeePayment(); - this.accountOp.signature = await getExecuteSignature(this.#network, this.accountOp, accountState, signer); + this.accountOp.signature = await (0, signMessage_1.getExecuteSignature)(this.#network, this.accountOp, accountState, signer); } this.status = { type: SigningStatus.Done }; this.signedAccountOp = structuredClone(this.accountOp); @@ -928,7 +932,7 @@ export class SignAccountOpController extends EventEmitter { return this.signedAccountOp; } catch (error) { - const { message } = getHumanReadableBroadcastError(error); + const { message } = (0, errorHumanizer_1.getHumanReadableBroadcastError)(error); this.#emitSigningErrorAndResetToReadyToSign(message); } } @@ -949,4 +953,5 @@ export class SignAccountOpController extends EventEmitter { }; } } +exports.SignAccountOpController = SignAccountOpController; //# sourceMappingURL=signAccountOp.js.map \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js.map b/dist/src/controllers/signAccountOp/signAccountOp.js.map index 4374f3821..20f09a86f 100644 --- a/dist/src/controllers/signAccountOp/signAccountOp.js.map +++ b/dist/src/controllers/signAccountOp/signAccountOp.js.map @@ -1 +1 @@ -{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AbiCoder,\n formatEther,\n formatUnits,\n getAddress,\n Interface,\n toBeHex,\n ZeroAddress\n} from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { SINGLETON } from '../../consts/deploy'\n/* eslint-disable no-restricted-syntax */\nimport { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'\nimport {\n GAS_TANK_TRANSFER_GAS_USED,\n SA_ERC20_TRANSFER_GAS_USED,\n SA_NATIVE_TRANSFER_GAS_USED\n} from '../../consts/signAccountOp/gas'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, GasFeePayment, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { PaymasterErrorReponse, PaymasterSuccessReponse, Sponsor } from '../../libs/erc7677/types'\nimport { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'\nimport { Erc4337GasLimits, EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'\nimport {\n Gas1559Recommendation,\n GasPriceRecommendation,\n GasRecommendation,\n getProbableCallData\n} from '../../libs/gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../../libs/networks/networks'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'\nimport { getGasUsed } from '../../libs/singleton/singleton'\nimport {\n getActivatorCall,\n getOneTimeNonce,\n getUserOperation,\n getUserOpHash,\n isErc4337Broadcast,\n shouldIncludeActivatorCall,\n shouldUseOneTimeNonce\n} from '../../libs/userOperation/userOperation'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\n/* eslint-disable no-restricted-syntax */\nimport { AccountsController } from '../accounts/accounts'\nimport { AccountOpAction } from '../actions/actions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport {\n getFeeSpeedIdentifier,\n getFeeTokenPriceUnavailableWarning,\n getSignificantBalanceDecreaseWarning,\n getTokenUsdAmount\n} from './helper'\n\nexport enum SigningStatus {\n EstimationError = 'estimation-error',\n UnableToSign = 'unable-to-sign',\n ReadyToSign = 'ready-to-sign',\n /**\n * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc.\n * Signing is allowed in this state, but the state of the controller should not change.\n */\n UpdatesPaused = 'updates-paused',\n InProgress = 'in-progress',\n WaitingForPaymaster = 'waiting-for-paymaster-response',\n Done = 'done'\n}\n\nexport type Status = {\n // @TODO: get rid of the object and just use the type\n type: SigningStatus\n}\n\nexport enum FeeSpeed {\n Slow = 'slow',\n Medium = 'medium',\n Fast = 'fast',\n Ape = 'ape'\n}\n\ntype SpeedCalc = {\n type: FeeSpeed\n amount: bigint\n simulatedGasLimit: bigint\n amountFormatted: string\n amountUsd: string\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n}\n\n// declare the statuses we don't want state updates on\nexport const noStateUpdateStatuses = [\n SigningStatus.InProgress,\n SigningStatus.Done,\n SigningStatus.UpdatesPaused,\n SigningStatus.WaitingForPaymaster\n]\n\nexport class SignAccountOpController extends EventEmitter {\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #portfolio: PortfolioController\n\n #externalSignerControllers: ExternalSignerControllers\n\n account: Account\n\n #network: Network\n\n #blockGasLimit: bigint | undefined = undefined\n\n fromActionId: AccountOpAction['id']\n\n accountOp: AccountOp\n\n gasPrices: GasRecommendation[] | null = null\n\n bundlerGasPrices: GasSpeeds | null = null\n\n estimation: EstimateResult | null = null\n\n feeSpeeds: {\n [identifier: string]: SpeedCalc[]\n } = {}\n\n paidBy: string | null = null\n\n feeTokenResult: TokenResult | null = null\n\n selectedFeeSpeed: FeeSpeed = FeeSpeed.Fast\n\n selectedOption: FeePaymentOption | undefined = undefined\n\n status: Status | null = null\n\n gasUsedTooHigh: boolean\n\n gasUsedTooHighAgreed: boolean\n\n #reEstimate: Function\n\n #isSignRequestStillActive: Function\n\n rbfAccountOps: { [key: string]: SubmittedAccountOp | null }\n\n signedAccountOp: AccountOp | null\n\n replacementFeeLow: boolean\n\n warnings: Warning[] = []\n\n // indicates whether the transaction gas is sponsored or not\n isSponsored: boolean = false\n\n // the sponsor data to be displayed, if any\n sponsor: Sponsor | undefined = undefined\n\n bundlerSwitcher: BundlerSwitcher\n\n constructor(\n accounts: AccountsController,\n keystore: KeystoreController,\n portfolio: PortfolioController,\n externalSignerControllers: ExternalSignerControllers,\n account: Account,\n network: Network,\n fromActionId: AccountOpAction['id'],\n accountOp: AccountOp,\n reEstimate: Function,\n isSignRequestStillActive: Function\n ) {\n super()\n\n this.#accounts = accounts\n this.#keystore = keystore\n this.#portfolio = portfolio\n this.#externalSignerControllers = externalSignerControllers\n this.account = account\n this.#network = network\n this.fromActionId = fromActionId\n this.accountOp = structuredClone(accountOp)\n this.#reEstimate = reEstimate\n this.#isSignRequestStillActive = isSignRequestStillActive\n\n this.gasUsedTooHigh = false\n this.gasUsedTooHighAgreed = false\n this.rbfAccountOps = {}\n this.signedAccountOp = null\n this.replacementFeeLow = false\n this.bundlerSwitcher = new BundlerSwitcher(\n network,\n () => {\n return this.status ? this.status.type : null\n },\n noStateUpdateStatuses\n )\n }\n\n get isInitialized(): boolean {\n return !!this.estimation\n }\n\n #setDefaults() {\n // Set the first signer as the default one.\n // If there are more available signers, the user will be able to select a different signer from the application.\n // The main benefit of having a default signer\n // is that it drastically simplifies the logic of determining whether the account is ready for signing.\n // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag.\n // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer.\n // In that case, on the application, we want the \"Sign\" button to be clickable/enabled,\n // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible.\n if (\n this.accountKeyStoreKeys.length &&\n (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)\n ) {\n this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr\n this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type\n }\n }\n\n #setGasFeePayment() {\n if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) {\n this.accountOp.gasFeePayment = this.#getGasFeePayment()\n }\n }\n\n // check if speeds are set for the given identifier\n hasSpeeds(identifier: string) {\n return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length\n }\n\n getCallDataAdditionalByNetwork(): bigint {\n // no additional call data is required for arbitrum as the bytes are already\n // added in the calculation for the L1 fee\n if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) return 0n\n\n const estimationCallData = getProbableCallData(\n this.account,\n this.accountOp,\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId],\n this.#network\n )\n const FIXED_OVERHEAD = 21000n\n const bytes = Buffer.from(estimationCallData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n\n return txDataGas + FIXED_OVERHEAD\n }\n\n get errors(): string[] {\n const errors: string[] = []\n\n if (!this.isInitialized) return errors\n\n const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr)\n const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network)\n\n // This must be the first error check!\n if (isAmbireV1AndNetworkNotSupported) {\n errors.push(\n 'Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'\n )\n\n // Don't show any other errors\n return errors\n }\n\n // if there's an estimation error, show it\n if (this.estimation?.error) {\n errors.push(this.estimation.error.message)\n }\n\n if (\n this.estimation?.gasUsed &&\n this.#blockGasLimit &&\n this.estimation?.gasUsed > this.#blockGasLimit\n ) {\n errors.push('Transaction reverted with estimation too high: above block limit')\n }\n\n if (\n this.#network.predefined &&\n this.estimation?.gasUsed &&\n this.estimation?.gasUsed > 500000000n\n ) {\n errors.push('Unreasonably high estimation. This transaction will probably fail')\n }\n\n // this error should never happen as availableFeeOptions should always have the native option\n if (!this.isSponsored && !this.availableFeeOptions.length)\n errors.push(ERRORS.eoaInsufficientFunds)\n\n // This error should not happen, as in the update method we are always setting a default signer.\n // It may occur, only if there are no available signer.\n if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr)\n errors.push('Please select a signer to sign the transaction.')\n\n const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]\n\n const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!this.isSponsored && !currentPortfolioNetworkNative)\n errors.push(\n 'Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'\n )\n\n // if there's no gasFeePayment calculate but there is: 1) feeTokenResult\n // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error\n if (\n !this.isSponsored &&\n !this.accountOp.gasFeePayment &&\n this.feeTokenResult &&\n this.selectedOption\n ) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (this.hasSpeeds(identifier))\n errors.push('Please select a token and an account for paying the gas fee.')\n }\n\n if (\n !this.isSponsored &&\n this.selectedOption &&\n this.accountOp.gasFeePayment &&\n this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount\n ) {\n const speedCoverage = []\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n\n if (this.feeSpeeds[identifier]) {\n this.feeSpeeds[identifier].forEach((speed) => {\n if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount)\n speedCoverage.push(speed.type)\n })\n }\n\n if (speedCoverage.length === 0) {\n errors.push(\n isSmartAccount(this.account)\n ? \"Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee.\"\n : ERRORS.eoaInsufficientFunds\n )\n } else {\n errors.push(\n 'The selected speed is not available due to insufficient funds. Please select a slower speed.'\n )\n }\n }\n\n // The signing might fail, tell the user why but allow the user to retry signing,\n // @ts-ignore fix TODO: type mismatch\n if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) {\n // @ts-ignore typescript complains, but the error being present gets checked above\n errors.push(this.status.error)\n }\n\n if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.hasSpeeds(identifier)) {\n if (!this.feeTokenResult?.priceIn.length) {\n errors.push(\n `Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`\n )\n } else {\n errors.push(\n 'Unable to estimate the transaction fee. Please try changing the fee token or contact support.'\n )\n }\n }\n }\n\n // if the gasFeePayment is gas tank but the user doesn't have funds, disable it\n let balance = 0\n Object.keys(currentPortfolio).forEach((networkName) => {\n const networkPortfolio = currentPortfolio[networkName]\n if (!networkPortfolio?.result?.total?.usd) return\n\n balance += networkPortfolio.result.total.usd\n })\n if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) {\n errors.push(\n \"Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account\"\n )\n }\n\n return errors\n }\n\n get readyToSign() {\n return (\n !!this.status &&\n (this.status?.type === SigningStatus.ReadyToSign ||\n this.status?.type === SigningStatus.UpdatesPaused)\n )\n }\n\n calculateWarnings() {\n const warnings: Warning[] = []\n\n const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr)\n\n const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(\n latestState,\n pendingState,\n this.accountOp.networkId\n )\n\n if (this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd)\n const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(\n !!this.hasSpeeds(identifier),\n feeTokenHasPrice\n )\n\n // push the warning only if the txn is not sponsored\n if (!this.isSponsored && feeTokenPriceUnavailableWarning)\n warnings.push(feeTokenPriceUnavailableWarning)\n }\n\n if (significantBalanceDecreaseWarning) warnings.push(significantBalanceDecreaseWarning)\n\n this.warnings = warnings\n\n this.emitUpdate()\n }\n\n update({\n gasPrices,\n estimation,\n feeToken,\n paidBy,\n speed,\n signingKeyAddr,\n signingKeyType,\n calls,\n gasUsedTooHighAgreed,\n rbfAccountOps,\n bundlerGasPrices,\n blockGasLimit\n }: {\n gasPrices?: GasRecommendation[]\n estimation?: EstimateResult | null\n feeToken?: TokenResult\n paidBy?: string\n speed?: FeeSpeed\n signingKeyAddr?: Key['addr']\n signingKeyType?: Key['type']\n calls?: AccountOp['calls']\n gasUsedTooHighAgreed?: boolean\n rbfAccountOps?: { [key: string]: SubmittedAccountOp | null }\n bundlerGasPrices?: { speeds: GasSpeeds; bundler: BUNDLER }\n blockGasLimit?: bigint\n }) {\n // once the user commits to the things he sees on his screen,\n // we need to be sure nothing changes afterwards.\n // For example, signing can be slow if it's done by a hardware wallet.\n // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism)\n // If we allow the estimation to affect the controller state during sign,\n // there could be discrepancy between what the user has agreed upon and what\n // we broadcast in the end\n if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) {\n return\n }\n\n if (Array.isArray(calls)) this.accountOp.calls = calls\n\n if (blockGasLimit) this.#blockGasLimit = blockGasLimit\n\n if (gasPrices) this.gasPrices = gasPrices\n\n if (estimation) {\n this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n)\n this.estimation = estimation\n // on each estimation update, set the newest account nonce\n this.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n }\n\n // if estimation is undefined, do not clear the estimation.\n // We do this only if strictly specified as null\n if (estimation === null) this.estimation = null\n\n if (feeToken && paidBy) {\n this.paidBy = paidBy\n this.feeTokenResult = feeToken\n }\n\n if (speed && this.isInitialized) {\n this.selectedFeeSpeed = speed\n }\n\n if (signingKeyAddr && signingKeyType && this.isInitialized) {\n this.accountOp.signingKeyAddr = signingKeyAddr\n this.accountOp.signingKeyType = signingKeyType\n }\n\n if (gasUsedTooHighAgreed !== undefined) this.gasUsedTooHighAgreed = gasUsedTooHighAgreed\n\n // set the rbf is != undefined\n if (rbfAccountOps) this.rbfAccountOps = rbfAccountOps\n\n // Set defaults, if some of the optional params are omitted\n this.#setDefaults()\n\n if (this.estimation && this.paidBy && this.feeTokenResult) {\n this.selectedOption = this.availableFeeOptions.find(\n (option) =>\n option.paidBy === this.paidBy &&\n option.token.address === this.feeTokenResult!.address &&\n option.token.symbol.toLocaleLowerCase() ===\n this.feeTokenResult!.symbol.toLocaleLowerCase() &&\n option.token.flags.onGasTank === this.feeTokenResult!.flags.onGasTank\n )\n }\n\n // update the bundler gas prices if the bundlers match\n if (\n this.estimation?.erc4337GasLimits &&\n bundlerGasPrices &&\n bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()\n ) {\n this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds\n }\n\n if (\n this.estimation &&\n this.estimation.erc4337GasLimits &&\n this.estimation.erc4337GasLimits.paymaster\n ) {\n // if it was sponsored but it no longer is (fallback case),\n // reset the selectedOption option as we use native for the sponsorship\n // but the user might not actually have any native\n const isSponsorshipFallback =\n this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored()\n\n this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored()\n this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor\n\n if (isSponsorshipFallback) {\n this.selectedOption = this.availableFeeOptions.length\n ? this.availableFeeOptions[0]\n : undefined\n }\n }\n\n // calculate the fee speeds if either there are no feeSpeeds\n // or any of properties for update is requested\n if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) {\n this.#updateFeeSpeeds()\n }\n\n // Here, we expect to have most of the fields set, so we can safely set GasFeePayment\n this.#setGasFeePayment()\n this.updateStatus()\n this.calculateWarnings()\n }\n\n updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow = false) {\n // use this to go back to ReadyToSign when a broadcasting error is emitted\n if (forceStatusChange) {\n this.status = { type: forceStatusChange }\n this.emitUpdate()\n return\n }\n\n // no status updates on these two\n const isInTheMiddleOfSigning =\n this.status?.type === SigningStatus.InProgress ||\n this.status?.type === SigningStatus.WaitingForPaymaster\n const isDone = this.status?.type === SigningStatus.Done\n if (isInTheMiddleOfSigning || isDone) return\n\n // if we have an estimation error, set the state so and return\n if (this.estimation?.error) {\n this.status = { type: SigningStatus.EstimationError }\n this.emitUpdate()\n return\n }\n\n if (this.errors.length) {\n this.status = { type: SigningStatus.UnableToSign }\n this.emitUpdate()\n return\n }\n\n if (\n this.isInitialized &&\n this.estimation &&\n this.accountOp?.signingKeyAddr &&\n this.accountOp?.signingKeyType &&\n this.accountOp?.gasFeePayment &&\n // if the gas used is too high, do not allow the user to sign\n // until he explicitly agrees to the risks\n (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)\n ) {\n this.status = { type: SigningStatus.ReadyToSign }\n\n // do not reset this once triggered\n if (replacementFeeLow) this.replacementFeeLow = replacementFeeLow\n this.emitUpdate()\n return\n }\n\n // reset the status if a valid state was not found\n this.status = null\n this.emitUpdate()\n }\n\n reset() {\n this.gasPrices = null\n this.estimation = null\n this.selectedFeeSpeed = FeeSpeed.Fast\n this.paidBy = null\n this.feeTokenResult = null\n this.status = null\n this.emitUpdate()\n }\n\n resetStatus() {\n this.status = null\n this.emitUpdate()\n }\n\n /**\n * Obtain the native token ratio in relation to a fee token.\n *\n * By knowing the USD value of the tokens in the portfolio,\n * we can calculate the ratio between a native token and a fee token.\n *\n * For example, 1 ETH = 8 BNB (ratio: 8).\n *\n * We require the ratio to be in a BigInt format since all the application values,\n * such as amount, gasLimit, etc., are also represented as BigInt numbers.\n */\n #getNativeToFeeTokenRatio(feeToken: TokenResult): bigint | null {\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n\n // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available.\n if (native.address === feeToken.address && native.networkId === feeToken.networkId)\n return BigInt(1 * 1e18)\n\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n\n const nativePrice = native.priceIn.find(isUsd)?.price\n const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price\n\n if (!nativePrice || !feeTokenPrice) return null\n\n const ratio = nativePrice / feeTokenPrice\n\n // Here we multiply it by 1e18, in order to keep the decimal precision.\n // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point.\n // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18.\n const ratio1e18 = ratio * 1e18\n const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0)\n return BigInt(toBigInt)\n }\n\n static getAmountAfterFeeTokenConvert(\n simulatedGasLimit: bigint,\n gasPrice: bigint,\n nativeRatio: bigint,\n feeTokenDecimals: number,\n addedNative: bigint\n ) {\n const amountInWei = simulatedGasLimit * gasPrice + addedNative\n\n // Let's break down the process of converting the amount into FeeToken:\n // 1. Initially, we multiply the amount in wei by the native to fee token ratio.\n // 2. Next, we address the decimal places:\n // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals).\n // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount.\n // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals.\n const extraDecimals = BigInt(10 ** 18)\n const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals))\n const pow = extraDecimals * feeTokenExtraDecimals\n return (amountInWei * nativeRatio) / pow\n }\n\n /**\n * Increase the fee we send to the feeCollector according to the specified\n * options in the network tab\n */\n #increaseFee(amount: bigint): bigint {\n if (!this.#network.feeOptions.feeIncrease) {\n return amount\n }\n\n return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n\n }\n\n /**\n * If the nonce of the current account op and the last account op are the same,\n * do an RBF increase or otherwise the user cannot broadcast the txn\n *\n * calculatedGas: it should be either the whole gasPrice if the network doesn't\n * support EIP-1559 OR it should the maxPriorityFeePerGas if the network\n * supports EIP-1559\n *\n * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas\n */\n #rbfIncrease(\n accId: string,\n calculatedGas: bigint,\n gasPropertyName: 'gasPrice' | 'maxPriorityFeePerGas',\n prevSpeed: SpeedCalc | null\n ): bigint {\n // ape speed gets 50% increase\n const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n\n\n // when doing an RBF, make sure the min gas for the current speed\n // is at least 12% bigger than the previous speed\n const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined\n const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n\n const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas\n\n // if there was an error on the signed account op with a\n // replacement fee too low, we increase by 13% the signed account op\n // IF the new estimation is not actually higher\n if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) {\n const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined\n const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n\n return min > bumpFees ? min : bumpFees\n }\n\n // if no RBF option for this paidBy option, return the amount\n const rbfOp = this.rbfAccountOps[accId]\n if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName])\n return calculatedGas\n\n // increase by a minimum of 13% the last broadcast txn and use that\n // or use the current gas estimation if it's more\n const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n\n const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n\n return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased\n }\n\n get #feeSpeedsLoading() {\n return !this.isInitialized || !this.gasPrices\n }\n\n #updateFeeSpeeds() {\n if (this.#feeSpeedsLoading) return\n\n // reset the fee speeds at the beginning to avoid duplications\n this.feeSpeeds = {}\n\n const gasUsed = this.estimation!.gasUsed\n\n this.availableFeeOptions.forEach((option) => {\n // if a calculation has been made, do not make it again\n // EOA pays for SA is the most common case for this scenario\n //\n // addition: make sure there's no rbfAccountOps as well\n const identifier = getFeeSpeedIdentifier(\n option,\n this.accountOp.accountAddr,\n this.rbfAccountOps[option.paidBy]\n )\n if (this.hasSpeeds(identifier)) {\n return\n }\n\n const nativeRatio = this.#getNativeToFeeTokenRatio(option.token)\n if (!nativeRatio) {\n this.feeSpeeds[identifier] = []\n return\n }\n\n const erc4337GasLimits = this.estimation?.erc4337GasLimits\n if (erc4337GasLimits) {\n const speeds: SpeedCalc[] = []\n const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n\n for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) {\n const simulatedGasLimit =\n BigInt(erc4337GasLimits.callGasLimit) +\n BigInt(erc4337GasLimits.preVerificationGas) +\n BigInt(option.gasUsed ?? 0)\n const gasPrice = BigInt(speedValue.maxFeePerGas)\n let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n 0n\n )\n if (usesPaymaster) amount = this.#increaseFee(amount)\n\n speeds.push({\n type: speed as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas)\n })\n }\n\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier] = speeds\n return\n }\n\n ;(this.gasPrices || []).forEach((gasRecommendation, i) => {\n let amount\n let simulatedGasLimit\n const prevSpeed =\n this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length\n ? this.feeSpeeds[identifier][i - 1]\n : null\n\n // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation\n // depending whether the network supports EIP-1559 and is it enabled on our side.\n // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559.\n // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns\n // the maxPriorityFeePerGas without doing anything (most cases) or if there's a\n // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF.\n // Finally, we calculate the gasPrice:\n // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas\n // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF)\n const maxPriorityFeePerGas =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? this.#rbfIncrease(\n option.paidBy,\n gasRecommendation.maxPriorityFeePerGas,\n 'maxPriorityFeePerGas',\n prevSpeed\n )\n : undefined\n\n const gasPrice =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? (gasRecommendation as Gas1559Recommendation).baseFeePerGas + maxPriorityFeePerGas!\n : this.#rbfIncrease(\n option.paidBy,\n (gasRecommendation as GasPriceRecommendation).gasPrice,\n 'gasPrice',\n prevSpeed\n )\n\n // EOA\n if (!isSmartAccount(this.account)) {\n simulatedGasLimit = gasUsed\n\n if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) {\n simulatedGasLimit = getGasUsed(simulatedGasLimit)\n }\n\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else if (option.paidBy !== this.accountOp.accountAddr) {\n // Smart account, but EOA pays the fee\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork()\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else {\n // Relayer\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed!\n amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n option.addedNative\n )\n amount = this.#increaseFee(amount)\n }\n\n const feeSpeed: SpeedCalc = {\n type: gasRecommendation.name as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas\n }\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier].push(feeSpeed)\n })\n })\n }\n\n #getGasFeePayment(): GasFeePayment | null {\n if (!this.isInitialized) {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.',\n error: new Error(\n 'SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.'\n )\n })\n\n return null\n }\n if (!this.paidBy) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying account not selected')\n })\n\n return null\n }\n if (!this.feeTokenResult) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee token not selected')\n })\n\n return null\n }\n\n // if there are no availableFeeOptions, we don't have a gasFee\n // this is normal though as there are such cases:\n // - EOA paying in native but doesn't have any native\n // so no error should pop out because of this\n if (!this.availableFeeOptions.length) {\n return null\n }\n\n if (!this.selectedOption) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying option not found')\n })\n\n return null\n }\n\n // if there are no fee speeds available for the option, it means\n // the nativeRatio could not be calculated. In that case, we do not\n // emit an error here but proceed and show an explanation to the user\n // in get errors()\n // check test: Signing [Relayer]: ... priceIn | native/Ratio\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.feeSpeeds[identifier].length) {\n return null\n }\n\n const chosenSpeed = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n if (!chosenSpeed) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee speed not selected')\n })\n\n return null\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n return {\n paidBy: this.paidBy,\n // we're allowing EOAs to broadcast on 4337 networks as well\n // in that case, we don't do user operations\n isERC4337:\n this.paidBy === this.accountOp.accountAddr &&\n isErc4337Broadcast(this.account, this.#network, accountState),\n isGasTank: this.feeTokenResult.flags.onGasTank,\n inToken: this.feeTokenResult.address,\n feeTokenNetworkId: this.feeTokenResult.networkId,\n amount: chosenSpeed.amount,\n simulatedGasLimit: chosenSpeed.simulatedGasLimit,\n gasPrice: chosenSpeed.gasPrice,\n maxPriorityFeePerGas:\n 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined\n }\n }\n\n get feeToken(): string | null {\n return this.accountOp?.gasFeePayment?.inToken || null\n }\n\n get feePaidBy(): string | null {\n return this.accountOp?.gasFeePayment?.paidBy || null\n }\n\n get availableFeeOptions(): EstimateResult['feePaymentOptions'] {\n if (!this.estimation) return []\n\n // if the txn is sponsored, return the native option only\n // even if it's balance is 0\n if (this.isSponsored) {\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n // FeeOptions having amount\n const withAmounts = this.estimation.feePaymentOptions.filter(\n (feeOption) => feeOption.availableAmount\n )\n if (withAmounts.length) return withAmounts\n\n // if there are no fee options with amounts, return the native option\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n get accountKeyStoreKeys(): Key[] {\n return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr))\n }\n\n // eslint-disable-next-line class-methods-use-this\n get speedOptions() {\n return Object.values(FeeSpeed) as string[]\n }\n\n get gasSavedUSD(): number | null {\n if (!this.selectedOption?.token.flags.onGasTank) return null\n\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const selectedFeeSpeedData = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n const gasPrice = selectedFeeSpeedData?.gasPrice\n if (!gasPrice) return null\n\n // get the native token from the portfolio to calculate prices\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price\n if (!nativePrice) return null\n\n // 4337 gasUsed is set to 0 in the estimation as we rely\n // on the bundler for the estimation entirely => use hardcode value\n const gasUsedSelectedOption =\n this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n\n ? this.selectedOption.gasUsed\n : GAS_TANK_TRANSFER_GAS_USED\n const isNativeSelected = this.selectedOption.token.address === ZeroAddress\n const gasUsedNative =\n this.availableFeeOptions.find(\n (option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED\n const gasUsedERC20 =\n this.availableFeeOptions.find(\n (option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_ERC20_TRANSFER_GAS_USED\n\n const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20\n const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice)\n\n return Number(gasSavedInNative) * nativePrice\n }\n\n #emitSigningErrorAndResetToReadyToSign(error: string) {\n this.emitError({ level: 'major', message: error, error: new Error(error) })\n this.status = { type: SigningStatus.ReadyToSign }\n\n this.emitUpdate()\n }\n\n #addFeePayment() {\n // In case of gas tank token fee payment, we need to include one more call to account op\n const abiCoder = new AbiCoder()\n\n if (this.isSponsored) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.isGasTank) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', this.accountOp.gasFeePayment!.amount, this.feeTokenResult?.symbol]\n )\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.inToken === '0x0000000000000000000000000000000000000000') {\n // native payment\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: this.accountOp.gasFeePayment!.amount,\n data: '0x'\n }\n } else {\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n this.accountOp.feeCall = {\n to: this.accountOp.gasFeePayment!.inToken,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('transfer', [\n FEE_COLLECTOR,\n this.accountOp.gasFeePayment!.amount\n ])\n }\n }\n }\n\n async sign() {\n if (!this.readyToSign) {\n const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // when signing begings, we stop immediatelly state updates on the controller\n // by changing the status to InProgress. Check update() for more info\n this.status = { type: SigningStatus.InProgress }\n\n if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) {\n const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n if (!this.accountOp?.gasFeePayment || !this.selectedOption) {\n const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const signer = await this.#keystore.getSigner(\n this.accountOp.signingKeyAddr,\n this.accountOp.signingKeyType\n )\n if (!signer) {\n const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n const usesOneTimeNonce = shouldUseOneTimeNonce(accountState)\n if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) {\n this.status = { type: SigningStatus.WaitingForPaymaster }\n } else {\n this.status = { type: SigningStatus.InProgress }\n }\n\n // we update the FE with the changed status (in progress) only after the checks\n // above confirm everything is okay to prevent two different state updates\n this.emitUpdate()\n\n const gasFeePayment = this.accountOp.gasFeePayment\n\n if (signer.init) signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType])\n\n // just in-case: before signing begins, we delete the feeCall;\n // if there's a need for it, it will be added later on in the code.\n // We need this precaution because this could happen:\n // - try to broadcast with the relayer\n // - the feel call gets added\n // - the relayer broadcast fails\n // - the user does another broadcast, this time with EOA pays for SA\n // - the fee call stays, causing a low gas limit revert\n delete this.accountOp.feeCall\n\n // delete the activatorCall as a precaution that it won't be added twice\n delete this.accountOp.activatorCall\n\n // @EntryPoint activation\n // if we broadcast by an EOA, this is the only way to include\n // the entry point as a signer\n if (\n shouldIncludeActivatorCall(\n this.#network,\n this.account,\n accountState,\n this.accountOp.gasFeePayment.isERC4337\n )\n ) {\n this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr)\n }\n\n try {\n // In case of EOA account\n if (!isSmartAccount(this.account)) {\n if (this.accountOp.calls.length !== 1) {\n const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'\n const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // In legacy mode, we sign the transaction directly.\n // that means the signing will happen on broadcast and here\n // checking whether the call is 1 and 1 only is enough\n this.accountOp.signature = '0x'\n } else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) {\n // Smart account, but EOA pays the fee\n // EOA pays for execute() - relayerless\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n } else if (this.accountOp.gasFeePayment.isERC4337) {\n // if there's no entryPointAuthorization, the txn will fail\n if (\n !accountState.isDeployed &&\n (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)\n )\n return this.#emitSigningErrorAndResetToReadyToSign(\n `Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n )\n\n const erc4337Estimation = this.estimation!.erc4337GasLimits as Erc4337GasLimits\n\n const userOperation = getUserOperation(\n this.account,\n accountState,\n this.accountOp,\n this.bundlerSwitcher.getBundler().getName(),\n !accountState.isDeployed ? this.accountOp.meta!.entryPointAuthorization : undefined\n )\n userOperation.preVerificationGas = erc4337Estimation.preVerificationGas\n userOperation.callGasLimit = toBeHex(\n BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)\n )\n userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit\n userOperation.paymasterVerificationGasLimit =\n erc4337Estimation.paymasterVerificationGasLimit\n userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit\n userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice)\n userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas!)\n\n const paymaster = erc4337Estimation.paymaster\n if (paymaster.shouldIncludePayment()) this.#addFeePayment()\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n if (usesOneTimeNonce) {\n const signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n\n // after signing has completed, we wait for the paymaster response\n // so we tell the user\n this.status = { type: SigningStatus.WaitingForPaymaster }\n this.emitUpdate()\n\n userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [\n [[getSignableCalls(this.accountOp), signature]]\n ])\n this.accountOp.signature = signature\n } else {\n userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCalls(this.accountOp)\n ])\n }\n\n if (paymaster.isUsable()) {\n const response = await paymaster.call(\n this.account,\n this.accountOp,\n userOperation,\n this.#network\n )\n\n if (response.success) {\n const paymasterData = response as PaymasterSuccessReponse\n this.status = { type: SigningStatus.InProgress }\n this.emitUpdate()\n\n userOperation.paymaster = paymasterData.paymaster\n userOperation.paymasterData = paymasterData.paymasterData\n if (usesOneTimeNonce) userOperation.nonce = getOneTimeNonce(userOperation)\n this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored()\n } else {\n const errorResponse = response as PaymasterErrorReponse\n this.emitError({\n level: 'major',\n message: errorResponse.message,\n error: errorResponse.error\n })\n this.status = { type: SigningStatus.ReadyToSign }\n this.emitUpdate()\n this.#reEstimate()\n return\n }\n }\n\n // query the application state from memory to understand if the user\n // hasn't actually rejected the request while waiting for the\n // paymaster to respond\n if (!this.#isSignRequestStillActive()) return\n\n if (userOperation.requestType === 'standard') {\n const typedData = getTypedData(\n this.#network.chainId,\n this.accountOp.accountAddr,\n getUserOpHash(userOperation, this.#network.chainId)\n )\n const signature = wrapStandard(await signer.signTypedData(typedData))\n userOperation.signature = signature\n this.accountOp.signature = signature\n }\n this.accountOp.asUserOperation = userOperation\n } else {\n // Relayer\n this.#addFeePayment()\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n }\n\n this.status = { type: SigningStatus.Done }\n this.signedAccountOp = structuredClone(this.accountOp)\n this.emitUpdate()\n return this.signedAccountOp\n } catch (error: any) {\n const { message } = getHumanReadableBroadcastError(error)\n\n this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n }\n\n toJSON() {\n return {\n ...this,\n isInitialized: this.isInitialized,\n readyToSign: this.readyToSign,\n availableFeeOptions: this.availableFeeOptions,\n accountKeyStoreKeys: this.accountKeyStoreKeys,\n feeToken: this.feeToken,\n feePaidBy: this.feePaidBy,\n speedOptions: this.speedOptions,\n selectedOption: this.selectedOption,\n account: this.account,\n errors: this.errors,\n gasSavedUSD: this.gasSavedUSD\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AbiCoder,\n formatEther,\n formatUnits,\n getAddress,\n Interface,\n toBeHex,\n ZeroAddress\n} from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { SINGLETON } from '../../consts/deploy'\n/* eslint-disable no-restricted-syntax */\nimport { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'\nimport {\n GAS_TANK_TRANSFER_GAS_USED,\n SA_ERC20_TRANSFER_GAS_USED,\n SA_NATIVE_TRANSFER_GAS_USED\n} from '../../consts/signAccountOp/gas'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, GasFeePayment, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { PaymasterErrorReponse, PaymasterSuccessReponse, Sponsor } from '../../libs/erc7677/types'\nimport { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'\nimport { Erc4337GasLimits, EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'\nimport {\n Gas1559Recommendation,\n GasPriceRecommendation,\n GasRecommendation,\n getProbableCallData\n} from '../../libs/gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../../libs/networks/networks'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'\nimport { getGasUsed } from '../../libs/singleton/singleton'\nimport {\n getActivatorCall,\n getOneTimeNonce,\n getUserOperation,\n getUserOpHash,\n isErc4337Broadcast,\n shouldIncludeActivatorCall,\n shouldUseOneTimeNonce\n} from '../../libs/userOperation/userOperation'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\n/* eslint-disable no-restricted-syntax */\nimport { AccountsController } from '../accounts/accounts'\nimport { AccountOpAction } from '../actions/actions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport {\n getFeeSpeedIdentifier,\n getFeeTokenPriceUnavailableWarning,\n getSignificantBalanceDecreaseWarning,\n getTokenUsdAmount\n} from './helper'\n\nexport enum SigningStatus {\n EstimationError = 'estimation-error',\n UnableToSign = 'unable-to-sign',\n ReadyToSign = 'ready-to-sign',\n /**\n * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc.\n * Signing is allowed in this state, but the state of the controller should not change.\n */\n UpdatesPaused = 'updates-paused',\n InProgress = 'in-progress',\n WaitingForPaymaster = 'waiting-for-paymaster-response',\n Done = 'done'\n}\n\nexport type Status = {\n // @TODO: get rid of the object and just use the type\n type: SigningStatus\n}\n\nexport enum FeeSpeed {\n Slow = 'slow',\n Medium = 'medium',\n Fast = 'fast',\n Ape = 'ape'\n}\n\ntype SpeedCalc = {\n type: FeeSpeed\n amount: bigint\n simulatedGasLimit: bigint\n amountFormatted: string\n amountUsd: string\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n}\n\n// declare the statuses we don't want state updates on\nexport const noStateUpdateStatuses = [\n SigningStatus.InProgress,\n SigningStatus.Done,\n SigningStatus.UpdatesPaused,\n SigningStatus.WaitingForPaymaster\n]\n\nexport class SignAccountOpController extends EventEmitter {\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #portfolio: PortfolioController\n\n #externalSignerControllers: ExternalSignerControllers\n\n account: Account\n\n #network: Network\n\n #blockGasLimit: bigint | undefined = undefined\n\n fromActionId: AccountOpAction['id']\n\n accountOp: AccountOp\n\n gasPrices: GasRecommendation[] | null = null\n\n bundlerGasPrices: GasSpeeds | null = null\n\n estimation: EstimateResult | null = null\n\n feeSpeeds: {\n [identifier: string]: SpeedCalc[]\n } = {}\n\n paidBy: string | null = null\n\n feeTokenResult: TokenResult | null = null\n\n selectedFeeSpeed: FeeSpeed = FeeSpeed.Fast\n\n selectedOption: FeePaymentOption | undefined = undefined\n\n status: Status | null = null\n\n gasUsedTooHigh: boolean\n\n gasUsedTooHighAgreed: boolean\n\n #reEstimate: Function\n\n #isSignRequestStillActive: Function\n\n rbfAccountOps: { [key: string]: SubmittedAccountOp | null }\n\n signedAccountOp: AccountOp | null\n\n replacementFeeLow: boolean\n\n warnings: Warning[] = []\n\n // indicates whether the transaction gas is sponsored or not\n isSponsored: boolean = false\n\n // the sponsor data to be displayed, if any\n sponsor: Sponsor | undefined = undefined\n\n bundlerSwitcher: BundlerSwitcher\n\n constructor(\n accounts: AccountsController,\n keystore: KeystoreController,\n portfolio: PortfolioController,\n externalSignerControllers: ExternalSignerControllers,\n account: Account,\n network: Network,\n fromActionId: AccountOpAction['id'],\n accountOp: AccountOp,\n reEstimate: Function,\n isSignRequestStillActive: Function\n ) {\n super()\n\n this.#accounts = accounts\n this.#keystore = keystore\n this.#portfolio = portfolio\n this.#externalSignerControllers = externalSignerControllers\n this.account = account\n this.#network = network\n this.fromActionId = fromActionId\n this.accountOp = structuredClone(accountOp)\n this.#reEstimate = reEstimate\n this.#isSignRequestStillActive = isSignRequestStillActive\n\n this.gasUsedTooHigh = false\n this.gasUsedTooHighAgreed = false\n this.rbfAccountOps = {}\n this.signedAccountOp = null\n this.replacementFeeLow = false\n this.bundlerSwitcher = new BundlerSwitcher(\n network,\n () => {\n return this.status ? this.status.type : null\n },\n noStateUpdateStatuses\n )\n }\n\n get isInitialized(): boolean {\n return !!this.estimation\n }\n\n #setDefaults() {\n // Set the first signer as the default one.\n // If there are more available signers, the user will be able to select a different signer from the application.\n // The main benefit of having a default signer\n // is that it drastically simplifies the logic of determining whether the account is ready for signing.\n // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag.\n // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer.\n // In that case, on the application, we want the \"Sign\" button to be clickable/enabled,\n // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible.\n if (\n this.accountKeyStoreKeys.length &&\n (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)\n ) {\n this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr\n this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type\n }\n }\n\n #setGasFeePayment() {\n if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) {\n this.accountOp.gasFeePayment = this.#getGasFeePayment()\n }\n }\n\n // check if speeds are set for the given identifier\n hasSpeeds(identifier: string) {\n return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length\n }\n\n getCallDataAdditionalByNetwork(): bigint {\n // no additional call data is required for arbitrum as the bytes are already\n // added in the calculation for the L1 fee\n if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) return 0n\n\n const estimationCallData = getProbableCallData(\n this.account,\n this.accountOp,\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId],\n this.#network\n )\n const FIXED_OVERHEAD = 21000n\n const bytes = Buffer.from(estimationCallData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n\n return txDataGas + FIXED_OVERHEAD\n }\n\n get errors(): string[] {\n const errors: string[] = []\n\n if (!this.isInitialized) return errors\n\n const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr)\n const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network)\n\n // This must be the first error check!\n if (isAmbireV1AndNetworkNotSupported) {\n errors.push(\n 'Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'\n )\n\n // Don't show any other errors\n return errors\n }\n\n // if there's an estimation error, show it\n if (this.estimation?.error) {\n errors.push(this.estimation.error.message)\n }\n\n if (\n this.estimation?.gasUsed &&\n this.#blockGasLimit &&\n this.estimation?.gasUsed > this.#blockGasLimit\n ) {\n errors.push('Transaction reverted with estimation too high: above block limit')\n }\n\n if (\n this.#network.predefined &&\n this.estimation?.gasUsed &&\n this.estimation?.gasUsed > 500000000n\n ) {\n errors.push('Unreasonably high estimation. This transaction will probably fail')\n }\n\n // this error should never happen as availableFeeOptions should always have the native option\n if (!this.isSponsored && !this.availableFeeOptions.length)\n errors.push(ERRORS.eoaInsufficientFunds)\n\n // This error should not happen, as in the update method we are always setting a default signer.\n // It may occur, only if there are no available signer.\n if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr)\n errors.push('Please select a signer to sign the transaction.')\n\n const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]\n\n const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!this.isSponsored && !currentPortfolioNetworkNative)\n errors.push(\n 'Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'\n )\n\n // if there's no gasFeePayment calculate but there is: 1) feeTokenResult\n // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error\n if (\n !this.isSponsored &&\n !this.accountOp.gasFeePayment &&\n this.feeTokenResult &&\n this.selectedOption\n ) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (this.hasSpeeds(identifier))\n errors.push('Please select a token and an account for paying the gas fee.')\n }\n\n if (\n !this.isSponsored &&\n this.selectedOption &&\n this.accountOp.gasFeePayment &&\n this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount\n ) {\n const speedCoverage = []\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n\n if (this.feeSpeeds[identifier]) {\n this.feeSpeeds[identifier].forEach((speed) => {\n if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount)\n speedCoverage.push(speed.type)\n })\n }\n\n if (speedCoverage.length === 0) {\n errors.push(\n isSmartAccount(this.account)\n ? \"Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee.\"\n : ERRORS.eoaInsufficientFunds\n )\n } else {\n errors.push(\n 'The selected speed is not available due to insufficient funds. Please select a slower speed.'\n )\n }\n }\n\n // The signing might fail, tell the user why but allow the user to retry signing,\n // @ts-ignore fix TODO: type mismatch\n if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) {\n // @ts-ignore typescript complains, but the error being present gets checked above\n errors.push(this.status.error)\n }\n\n if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.hasSpeeds(identifier)) {\n if (!this.feeTokenResult?.priceIn.length) {\n errors.push(\n `Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`\n )\n } else {\n errors.push(\n 'Unable to estimate the transaction fee. Please try changing the fee token or contact support.'\n )\n }\n }\n }\n\n // if the gasFeePayment is gas tank but the user doesn't have funds, disable it\n let balance = 0\n Object.keys(currentPortfolio).forEach((networkName) => {\n const networkPortfolio = currentPortfolio[networkName]\n if (!networkPortfolio?.result?.total?.usd) return\n\n balance += networkPortfolio.result.total.usd\n })\n if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) {\n errors.push(\n \"Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account\"\n )\n }\n\n return errors\n }\n\n get readyToSign() {\n return (\n !!this.status &&\n (this.status?.type === SigningStatus.ReadyToSign ||\n this.status?.type === SigningStatus.UpdatesPaused)\n )\n }\n\n calculateWarnings() {\n const warnings: Warning[] = []\n\n const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr)\n\n const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(\n latestState,\n pendingState,\n this.accountOp.networkId\n )\n\n if (this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd)\n const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(\n !!this.hasSpeeds(identifier),\n feeTokenHasPrice\n )\n\n // push the warning only if the txn is not sponsored\n if (!this.isSponsored && feeTokenPriceUnavailableWarning)\n warnings.push(feeTokenPriceUnavailableWarning)\n }\n\n if (significantBalanceDecreaseWarning) warnings.push(significantBalanceDecreaseWarning)\n\n this.warnings = warnings\n\n this.emitUpdate()\n }\n\n update({\n gasPrices,\n estimation,\n feeToken,\n paidBy,\n speed,\n signingKeyAddr,\n signingKeyType,\n calls,\n gasUsedTooHighAgreed,\n rbfAccountOps,\n bundlerGasPrices,\n blockGasLimit\n }: {\n gasPrices?: GasRecommendation[]\n estimation?: EstimateResult | null\n feeToken?: TokenResult\n paidBy?: string\n speed?: FeeSpeed\n signingKeyAddr?: Key['addr']\n signingKeyType?: Key['type']\n calls?: AccountOp['calls']\n gasUsedTooHighAgreed?: boolean\n rbfAccountOps?: { [key: string]: SubmittedAccountOp | null }\n bundlerGasPrices?: { speeds: GasSpeeds; bundler: BUNDLER }\n blockGasLimit?: bigint\n }) {\n // once the user commits to the things he sees on his screen,\n // we need to be sure nothing changes afterwards.\n // For example, signing can be slow if it's done by a hardware wallet.\n // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism)\n // If we allow the estimation to affect the controller state during sign,\n // there could be discrepancy between what the user has agreed upon and what\n // we broadcast in the end\n if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) {\n return\n }\n\n if (Array.isArray(calls)) this.accountOp.calls = calls\n\n if (blockGasLimit) this.#blockGasLimit = blockGasLimit\n\n if (gasPrices) this.gasPrices = gasPrices\n\n if (estimation) {\n this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n)\n this.estimation = estimation\n // on each estimation update, set the newest account nonce\n this.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n }\n\n // if estimation is undefined, do not clear the estimation.\n // We do this only if strictly specified as null\n if (estimation === null) this.estimation = null\n\n if (feeToken && paidBy) {\n this.paidBy = paidBy\n this.feeTokenResult = feeToken\n }\n\n if (speed && this.isInitialized) {\n this.selectedFeeSpeed = speed\n }\n\n if (signingKeyAddr && signingKeyType && this.isInitialized) {\n this.accountOp.signingKeyAddr = signingKeyAddr\n this.accountOp.signingKeyType = signingKeyType\n }\n\n if (gasUsedTooHighAgreed !== undefined) this.gasUsedTooHighAgreed = gasUsedTooHighAgreed\n\n // set the rbf is != undefined\n if (rbfAccountOps) this.rbfAccountOps = rbfAccountOps\n\n // Set defaults, if some of the optional params are omitted\n this.#setDefaults()\n\n if (this.estimation && this.paidBy && this.feeTokenResult) {\n this.selectedOption = this.availableFeeOptions.find(\n (option) =>\n option.paidBy === this.paidBy &&\n option.token.address === this.feeTokenResult!.address &&\n option.token.symbol.toLocaleLowerCase() ===\n this.feeTokenResult!.symbol.toLocaleLowerCase() &&\n option.token.flags.onGasTank === this.feeTokenResult!.flags.onGasTank\n )\n }\n\n // update the bundler gas prices if the bundlers match\n if (\n this.estimation?.erc4337GasLimits &&\n bundlerGasPrices &&\n bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()\n ) {\n this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds\n }\n\n if (\n this.estimation &&\n this.estimation.erc4337GasLimits &&\n this.estimation.erc4337GasLimits.paymaster\n ) {\n // if it was sponsored but it no longer is (fallback case),\n // reset the selectedOption option as we use native for the sponsorship\n // but the user might not actually have any native\n const isSponsorshipFallback =\n this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored()\n\n this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored()\n this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor\n\n if (isSponsorshipFallback) {\n this.selectedOption = this.availableFeeOptions.length\n ? this.availableFeeOptions[0]\n : undefined\n }\n }\n\n // calculate the fee speeds if either there are no feeSpeeds\n // or any of properties for update is requested\n if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) {\n this.#updateFeeSpeeds()\n }\n\n // Here, we expect to have most of the fields set, so we can safely set GasFeePayment\n this.#setGasFeePayment()\n this.updateStatus()\n this.calculateWarnings()\n }\n\n updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow = false) {\n // use this to go back to ReadyToSign when a broadcasting error is emitted\n if (forceStatusChange) {\n this.status = { type: forceStatusChange }\n this.emitUpdate()\n return\n }\n\n // no status updates on these two\n const isInTheMiddleOfSigning =\n this.status?.type === SigningStatus.InProgress ||\n this.status?.type === SigningStatus.WaitingForPaymaster\n const isDone = this.status?.type === SigningStatus.Done\n if (isInTheMiddleOfSigning || isDone) return\n\n // if we have an estimation error, set the state so and return\n if (this.estimation?.error) {\n this.status = { type: SigningStatus.EstimationError }\n this.emitUpdate()\n return\n }\n\n if (this.errors.length) {\n this.status = { type: SigningStatus.UnableToSign }\n this.emitUpdate()\n return\n }\n\n if (\n this.isInitialized &&\n this.estimation &&\n this.accountOp?.signingKeyAddr &&\n this.accountOp?.signingKeyType &&\n this.accountOp?.gasFeePayment &&\n // if the gas used is too high, do not allow the user to sign\n // until he explicitly agrees to the risks\n (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)\n ) {\n this.status = { type: SigningStatus.ReadyToSign }\n\n // do not reset this once triggered\n if (replacementFeeLow) this.replacementFeeLow = replacementFeeLow\n this.emitUpdate()\n return\n }\n\n // reset the status if a valid state was not found\n this.status = null\n this.emitUpdate()\n }\n\n reset() {\n this.gasPrices = null\n this.estimation = null\n this.selectedFeeSpeed = FeeSpeed.Fast\n this.paidBy = null\n this.feeTokenResult = null\n this.status = null\n this.emitUpdate()\n }\n\n resetStatus() {\n this.status = null\n this.emitUpdate()\n }\n\n /**\n * Obtain the native token ratio in relation to a fee token.\n *\n * By knowing the USD value of the tokens in the portfolio,\n * we can calculate the ratio between a native token and a fee token.\n *\n * For example, 1 ETH = 8 BNB (ratio: 8).\n *\n * We require the ratio to be in a BigInt format since all the application values,\n * such as amount, gasLimit, etc., are also represented as BigInt numbers.\n */\n #getNativeToFeeTokenRatio(feeToken: TokenResult): bigint | null {\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n\n // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available.\n if (native.address === feeToken.address && native.networkId === feeToken.networkId)\n return BigInt(1 * 1e18)\n\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n\n const nativePrice = native.priceIn.find(isUsd)?.price\n const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price\n\n if (!nativePrice || !feeTokenPrice) return null\n\n const ratio = nativePrice / feeTokenPrice\n\n // Here we multiply it by 1e18, in order to keep the decimal precision.\n // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point.\n // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18.\n const ratio1e18 = ratio * 1e18\n const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0)\n return BigInt(toBigInt)\n }\n\n static getAmountAfterFeeTokenConvert(\n simulatedGasLimit: bigint,\n gasPrice: bigint,\n nativeRatio: bigint,\n feeTokenDecimals: number,\n addedNative: bigint\n ) {\n const amountInWei = simulatedGasLimit * gasPrice + addedNative\n\n // Let's break down the process of converting the amount into FeeToken:\n // 1. Initially, we multiply the amount in wei by the native to fee token ratio.\n // 2. Next, we address the decimal places:\n // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals).\n // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount.\n // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals.\n const extraDecimals = BigInt(10 ** 18)\n const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals))\n const pow = extraDecimals * feeTokenExtraDecimals\n return (amountInWei * nativeRatio) / pow\n }\n\n /**\n * Increase the fee we send to the feeCollector according to the specified\n * options in the network tab\n */\n #increaseFee(amount: bigint): bigint {\n if (!this.#network.feeOptions.feeIncrease) {\n return amount\n }\n\n return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n\n }\n\n /**\n * If the nonce of the current account op and the last account op are the same,\n * do an RBF increase or otherwise the user cannot broadcast the txn\n *\n * calculatedGas: it should be either the whole gasPrice if the network doesn't\n * support EIP-1559 OR it should the maxPriorityFeePerGas if the network\n * supports EIP-1559\n *\n * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas\n */\n #rbfIncrease(\n accId: string,\n calculatedGas: bigint,\n gasPropertyName: 'gasPrice' | 'maxPriorityFeePerGas',\n prevSpeed: SpeedCalc | null\n ): bigint {\n // ape speed gets 50% increase\n const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n\n\n // when doing an RBF, make sure the min gas for the current speed\n // is at least 12% bigger than the previous speed\n const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined\n const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n\n const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas\n\n // if there was an error on the signed account op with a\n // replacement fee too low, we increase by 13% the signed account op\n // IF the new estimation is not actually higher\n if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) {\n const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined\n const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n\n return min > bumpFees ? min : bumpFees\n }\n\n // if no RBF option for this paidBy option, return the amount\n const rbfOp = this.rbfAccountOps[accId]\n if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName])\n return calculatedGas\n\n // increase by a minimum of 13% the last broadcast txn and use that\n // or use the current gas estimation if it's more\n const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n\n const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n\n return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased\n }\n\n get #feeSpeedsLoading() {\n return !this.isInitialized || !this.gasPrices\n }\n\n #updateFeeSpeeds() {\n if (this.#feeSpeedsLoading) return\n\n // reset the fee speeds at the beginning to avoid duplications\n this.feeSpeeds = {}\n\n const gasUsed = this.estimation!.gasUsed\n\n this.availableFeeOptions.forEach((option) => {\n // if a calculation has been made, do not make it again\n // EOA pays for SA is the most common case for this scenario\n //\n // addition: make sure there's no rbfAccountOps as well\n const identifier = getFeeSpeedIdentifier(\n option,\n this.accountOp.accountAddr,\n this.rbfAccountOps[option.paidBy]\n )\n if (this.hasSpeeds(identifier)) {\n return\n }\n\n const nativeRatio = this.#getNativeToFeeTokenRatio(option.token)\n if (!nativeRatio) {\n this.feeSpeeds[identifier] = []\n return\n }\n\n const erc4337GasLimits = this.estimation?.erc4337GasLimits\n if (erc4337GasLimits) {\n const speeds: SpeedCalc[] = []\n const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n\n for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) {\n const simulatedGasLimit =\n BigInt(erc4337GasLimits.callGasLimit) +\n BigInt(erc4337GasLimits.preVerificationGas) +\n BigInt(option.gasUsed ?? 0)\n const gasPrice = BigInt(speedValue.maxFeePerGas)\n let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n 0n\n )\n if (usesPaymaster) amount = this.#increaseFee(amount)\n\n speeds.push({\n type: speed as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas)\n })\n }\n\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier] = speeds\n return\n }\n\n ;(this.gasPrices || []).forEach((gasRecommendation, i) => {\n let amount\n let simulatedGasLimit\n const prevSpeed =\n this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length\n ? this.feeSpeeds[identifier][i - 1]\n : null\n\n // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation\n // depending whether the network supports EIP-1559 and is it enabled on our side.\n // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559.\n // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns\n // the maxPriorityFeePerGas without doing anything (most cases) or if there's a\n // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF.\n // Finally, we calculate the gasPrice:\n // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas\n // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF)\n const maxPriorityFeePerGas =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? this.#rbfIncrease(\n option.paidBy,\n gasRecommendation.maxPriorityFeePerGas,\n 'maxPriorityFeePerGas',\n prevSpeed\n )\n : undefined\n\n const gasPrice =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? (gasRecommendation as Gas1559Recommendation).baseFeePerGas + maxPriorityFeePerGas!\n : this.#rbfIncrease(\n option.paidBy,\n (gasRecommendation as GasPriceRecommendation).gasPrice,\n 'gasPrice',\n prevSpeed\n )\n\n // EOA\n if (!isSmartAccount(this.account)) {\n simulatedGasLimit = gasUsed\n\n if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) {\n simulatedGasLimit = getGasUsed(simulatedGasLimit)\n }\n\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else if (option.paidBy !== this.accountOp.accountAddr) {\n // Smart account, but EOA pays the fee\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork()\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else {\n // Relayer\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed!\n amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n option.addedNative\n )\n amount = this.#increaseFee(amount)\n }\n\n const feeSpeed: SpeedCalc = {\n type: gasRecommendation.name as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas\n }\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier].push(feeSpeed)\n })\n })\n }\n\n #getGasFeePayment(): GasFeePayment | null {\n if (!this.isInitialized) {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.',\n error: new Error(\n 'SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.'\n )\n })\n\n return null\n }\n if (!this.paidBy) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying account not selected')\n })\n\n return null\n }\n if (!this.feeTokenResult) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee token not selected')\n })\n\n return null\n }\n\n // if there are no availableFeeOptions, we don't have a gasFee\n // this is normal though as there are such cases:\n // - EOA paying in native but doesn't have any native\n // so no error should pop out because of this\n if (!this.availableFeeOptions.length) {\n return null\n }\n\n if (!this.selectedOption) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying option not found')\n })\n\n return null\n }\n\n // if there are no fee speeds available for the option, it means\n // the nativeRatio could not be calculated. In that case, we do not\n // emit an error here but proceed and show an explanation to the user\n // in get errors()\n // check test: Signing [Relayer]: ... priceIn | native/Ratio\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.feeSpeeds[identifier].length) {\n return null\n }\n\n const chosenSpeed = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n if (!chosenSpeed) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee speed not selected')\n })\n\n return null\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n return {\n paidBy: this.paidBy,\n // we're allowing EOAs to broadcast on 4337 networks as well\n // in that case, we don't do user operations\n isERC4337:\n this.paidBy === this.accountOp.accountAddr &&\n isErc4337Broadcast(this.account, this.#network, accountState),\n isGasTank: this.feeTokenResult.flags.onGasTank,\n inToken: this.feeTokenResult.address,\n feeTokenNetworkId: this.feeTokenResult.networkId,\n amount: chosenSpeed.amount,\n simulatedGasLimit: chosenSpeed.simulatedGasLimit,\n gasPrice: chosenSpeed.gasPrice,\n maxPriorityFeePerGas:\n 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined\n }\n }\n\n get feeToken(): string | null {\n return this.accountOp?.gasFeePayment?.inToken || null\n }\n\n get feePaidBy(): string | null {\n return this.accountOp?.gasFeePayment?.paidBy || null\n }\n\n get availableFeeOptions(): EstimateResult['feePaymentOptions'] {\n if (!this.estimation) return []\n\n // if the txn is sponsored, return the native option only\n // even if it's balance is 0\n if (this.isSponsored) {\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n // FeeOptions having amount\n const withAmounts = this.estimation.feePaymentOptions.filter(\n (feeOption) => feeOption.availableAmount\n )\n if (withAmounts.length) return withAmounts\n\n // if there are no fee options with amounts, return the native option\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n get accountKeyStoreKeys(): Key[] {\n return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr))\n }\n\n // eslint-disable-next-line class-methods-use-this\n get speedOptions() {\n return Object.values(FeeSpeed) as string[]\n }\n\n get gasSavedUSD(): number | null {\n if (!this.selectedOption?.token.flags.onGasTank) return null\n\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const selectedFeeSpeedData = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n const gasPrice = selectedFeeSpeedData?.gasPrice\n if (!gasPrice) return null\n\n // get the native token from the portfolio to calculate prices\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price\n if (!nativePrice) return null\n\n // 4337 gasUsed is set to 0 in the estimation as we rely\n // on the bundler for the estimation entirely => use hardcode value\n const gasUsedSelectedOption =\n this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n\n ? this.selectedOption.gasUsed\n : GAS_TANK_TRANSFER_GAS_USED\n const isNativeSelected = this.selectedOption.token.address === ZeroAddress\n const gasUsedNative =\n this.availableFeeOptions.find(\n (option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED\n const gasUsedERC20 =\n this.availableFeeOptions.find(\n (option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_ERC20_TRANSFER_GAS_USED\n\n const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20\n const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice)\n\n return Number(gasSavedInNative) * nativePrice\n }\n\n #emitSigningErrorAndResetToReadyToSign(error: string) {\n this.emitError({ level: 'major', message: error, error: new Error(error) })\n this.status = { type: SigningStatus.ReadyToSign }\n\n this.emitUpdate()\n }\n\n #addFeePayment() {\n // In case of gas tank token fee payment, we need to include one more call to account op\n const abiCoder = new AbiCoder()\n\n if (this.isSponsored) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.isGasTank) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', this.accountOp.gasFeePayment!.amount, this.feeTokenResult?.symbol]\n )\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.inToken === '0x0000000000000000000000000000000000000000') {\n // native payment\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: this.accountOp.gasFeePayment!.amount,\n data: '0x'\n }\n } else {\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n this.accountOp.feeCall = {\n to: this.accountOp.gasFeePayment!.inToken,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('transfer', [\n FEE_COLLECTOR,\n this.accountOp.gasFeePayment!.amount\n ])\n }\n }\n }\n\n async sign() {\n if (!this.readyToSign) {\n const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // when signing begings, we stop immediatelly state updates on the controller\n // by changing the status to InProgress. Check update() for more info\n this.status = { type: SigningStatus.InProgress }\n\n if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) {\n const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n if (!this.accountOp?.gasFeePayment || !this.selectedOption) {\n const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const signer = await this.#keystore.getSigner(\n this.accountOp.signingKeyAddr,\n this.accountOp.signingKeyType\n )\n if (!signer) {\n const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n const usesOneTimeNonce = shouldUseOneTimeNonce(accountState)\n if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) {\n this.status = { type: SigningStatus.WaitingForPaymaster }\n } else {\n this.status = { type: SigningStatus.InProgress }\n }\n\n // we update the FE with the changed status (in progress) only after the checks\n // above confirm everything is okay to prevent two different state updates\n this.emitUpdate()\n\n const gasFeePayment = this.accountOp.gasFeePayment\n\n if (signer.init) signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType])\n\n // just in-case: before signing begins, we delete the feeCall;\n // if there's a need for it, it will be added later on in the code.\n // We need this precaution because this could happen:\n // - try to broadcast with the relayer\n // - the feel call gets added\n // - the relayer broadcast fails\n // - the user does another broadcast, this time with EOA pays for SA\n // - the fee call stays, causing a low gas limit revert\n delete this.accountOp.feeCall\n\n // delete the activatorCall as a precaution that it won't be added twice\n delete this.accountOp.activatorCall\n\n // @EntryPoint activation\n // if we broadcast by an EOA, this is the only way to include\n // the entry point as a signer\n if (\n shouldIncludeActivatorCall(\n this.#network,\n this.account,\n accountState,\n this.accountOp.gasFeePayment.isERC4337\n )\n ) {\n this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr)\n }\n\n try {\n // In case of EOA account\n if (!isSmartAccount(this.account)) {\n if (this.accountOp.calls.length !== 1) {\n const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'\n const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // In legacy mode, we sign the transaction directly.\n // that means the signing will happen on broadcast and here\n // checking whether the call is 1 and 1 only is enough\n this.accountOp.signature = '0x'\n } else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) {\n // Smart account, but EOA pays the fee\n // EOA pays for execute() - relayerless\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n } else if (this.accountOp.gasFeePayment.isERC4337) {\n // if there's no entryPointAuthorization, the txn will fail\n if (\n !accountState.isDeployed &&\n (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)\n )\n return this.#emitSigningErrorAndResetToReadyToSign(\n `Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n )\n\n const erc4337Estimation = this.estimation!.erc4337GasLimits as Erc4337GasLimits\n\n const userOperation = getUserOperation(\n this.account,\n accountState,\n this.accountOp,\n this.bundlerSwitcher.getBundler().getName(),\n !accountState.isDeployed ? this.accountOp.meta!.entryPointAuthorization : undefined\n )\n userOperation.preVerificationGas = erc4337Estimation.preVerificationGas\n userOperation.callGasLimit = toBeHex(\n BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)\n )\n userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit\n userOperation.paymasterVerificationGasLimit =\n erc4337Estimation.paymasterVerificationGasLimit\n userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit\n userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice)\n userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas!)\n\n const paymaster = erc4337Estimation.paymaster\n if (paymaster.shouldIncludePayment()) this.#addFeePayment()\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n if (usesOneTimeNonce) {\n const signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n\n // after signing has completed, we wait for the paymaster response\n // so we tell the user\n this.status = { type: SigningStatus.WaitingForPaymaster }\n this.emitUpdate()\n\n userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [\n [[getSignableCalls(this.accountOp), signature]]\n ])\n this.accountOp.signature = signature\n } else {\n userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCalls(this.accountOp)\n ])\n }\n\n if (paymaster.isUsable()) {\n const response = await paymaster.call(\n this.account,\n this.accountOp,\n userOperation,\n this.#network\n )\n\n if (response.success) {\n const paymasterData = response as PaymasterSuccessReponse\n this.status = { type: SigningStatus.InProgress }\n this.emitUpdate()\n\n userOperation.paymaster = paymasterData.paymaster\n userOperation.paymasterData = paymasterData.paymasterData\n if (usesOneTimeNonce) userOperation.nonce = getOneTimeNonce(userOperation)\n this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored()\n } else {\n const errorResponse = response as PaymasterErrorReponse\n this.emitError({\n level: 'major',\n message: errorResponse.message,\n error: errorResponse.error\n })\n this.status = { type: SigningStatus.ReadyToSign }\n this.emitUpdate()\n this.#reEstimate()\n return\n }\n }\n\n // query the application state from memory to understand if the user\n // hasn't actually rejected the request while waiting for the\n // paymaster to respond\n if (!this.#isSignRequestStillActive()) return\n\n if (userOperation.requestType === 'standard') {\n const typedData = getTypedData(\n this.#network.chainId,\n this.accountOp.accountAddr,\n getUserOpHash(userOperation, this.#network.chainId)\n )\n const signature = wrapStandard(await signer.signTypedData(typedData))\n userOperation.signature = signature\n this.accountOp.signature = signature\n }\n this.accountOp.asUserOperation = userOperation\n } else {\n // Relayer\n this.#addFeePayment()\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n }\n\n this.status = { type: SigningStatus.Done }\n this.signedAccountOp = structuredClone(this.accountOp)\n this.emitUpdate()\n return this.signedAccountOp\n } catch (error: any) {\n const { message } = getHumanReadableBroadcastError(error)\n\n this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n }\n\n toJSON() {\n return {\n ...this,\n isInitialized: this.isInitialized,\n readyToSign: this.readyToSign,\n availableFeeOptions: this.availableFeeOptions,\n accountKeyStoreKeys: this.accountKeyStoreKeys,\n feeToken: this.feeToken,\n feePaidBy: this.feePaidBy,\n speedOptions: this.speedOptions,\n selectedOption: this.selectedOption,\n account: this.account,\n errors: this.errors,\n gasSavedUSD: this.gasSavedUSD\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.js b/dist/src/controllers/signMessage/signMessage.js index f3360c1f0..aefdba23c 100644 --- a/dist/src/controllers/signMessage/signMessage.js +++ b/dist/src/controllers/signMessage/signMessage.js @@ -1,12 +1,16 @@ -import { hexlify, isHexString, toUtf8Bytes } from 'ethers'; -import EmittableError from '../../classes/EmittableError'; -import { getEIP712Signature, getPlainTextSignature, verifyMessage, wrapCounterfactualSign } from '../../libs/signMessage/signMessage'; -import hexStringToUint8Array from '../../utils/hexStringToUint8Array'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SignMessageController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const signMessage_1 = require("../../libs/signMessage/signMessage"); +const hexStringToUint8Array_1 = tslib_1.__importDefault(require("../../utils/hexStringToUint8Array")); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const STATUS_WRAPPED_METHODS = { sign: 'INITIAL' }; -export class SignMessageController extends EventEmitter { +class SignMessageController extends eventEmitter_1.default { #keystore; #providers; #networks; @@ -100,16 +104,16 @@ export class SignMessageController extends EventEmitter { try { if (this.messageToSign.content.kind === 'message') { const message = this.messageToSign.content.message; - this.messageToSign.content.message = isHexString(message) + this.messageToSign.content.message = (0, ethers_1.isHexString)(message) ? message - : hexlify(toUtf8Bytes(message.toString())); - signature = await getPlainTextSignature(this.messageToSign.content.message, network, account, accountState, this.#signer); + : (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)(message.toString())); + signature = await (0, signMessage_1.getPlainTextSignature)(this.messageToSign.content.message, network, account, accountState, this.#signer); } if (this.messageToSign.content.kind === 'typedMessage') { if (account.creation && this.messageToSign.content.primaryType === 'Permit') { throw new Error('It looks like that this app doesn\'t detect Smart Account wallets, and requested incompatible approval type. Please, go back to the app and change the approval type to "Transaction", which is supported by Smart Account wallets.'); } - signature = await getEIP712Signature(this.messageToSign.content, account, accountState, this.#signer, network); + signature = await (0, signMessage_1.getEIP712Signature)(this.messageToSign.content, account, accountState, this.#signer, network); } } catch (error) { @@ -124,12 +128,12 @@ export class SignMessageController extends EventEmitter { signature = account.creation && !accountState.isDeployed ? // https://eips.ethereum.org/EIPS/eip-6492 - wrapCounterfactualSign(signature, account.creation) + (0, signMessage_1.wrapCounterfactualSign)(signature, account.creation) : signature; const personalMsgToValidate = typeof this.messageToSign.content.message === 'string' - ? hexStringToUint8Array(this.messageToSign.content.message) + ? (0, hexStringToUint8Array_1.default)(this.messageToSign.content.message) : this.messageToSign.content.message; - const isValidSignature = await verifyMessage({ + const isValidSignature = await (0, signMessage_1.verifyMessage)({ network, provider: this.#providers.providers[network?.id || 'ethereum'], // the signer is always the account even if the actual @@ -163,7 +167,7 @@ export class SignMessageController extends EventEmitter { catch (e) { const error = e instanceof Error ? e : new Error(`Signing failed. Error details: ${e}`); const message = e?.message || 'Something went wrong while signing the message. Please try again.'; - return Promise.reject(new EmittableError({ level: 'major', message, error })); + return Promise.reject(new EmittableError_1.default({ level: 'major', message, error })); } } async sign() { @@ -177,17 +181,18 @@ export class SignMessageController extends EventEmitter { static #throwNotInitialized() { const message = 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'; const error = new Error('signMessage: controller not initialized'); - return Promise.reject(new EmittableError({ level: 'major', message, error })); + return Promise.reject(new EmittableError_1.default({ level: 'major', message, error })); } static #throwMissingMessage() { const message = 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'; const error = new Error('signMessage: missing message to sign'); - return Promise.reject(new EmittableError({ level: 'major', message, error })); + return Promise.reject(new EmittableError_1.default({ level: 'major', message, error })); } static #throwMissingSigningKey() { const message = 'Please select a signing key and try again.'; const error = new Error('signMessage: missing selected signing key'); - return Promise.reject(new EmittableError({ level: 'major', message, error })); + return Promise.reject(new EmittableError_1.default({ level: 'major', message, error })); } } +exports.SignMessageController = SignMessageController; //# sourceMappingURL=signMessage.js.map \ No newline at end of file diff --git a/dist/src/controllers/signMessage/signMessage.js.map b/dist/src/controllers/signMessage/signMessage.js.map index 993694e18..654fda95b 100644 --- a/dist/src/controllers/signMessage/signMessage.js.map +++ b/dist/src/controllers/signMessage/signMessage.js.map @@ -1 +1 @@ -{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/controllers/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify, isHexString, toUtf8Bytes } from 'ethers'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Message } from '../../interfaces/userRequest'\nimport {\n getEIP712Signature,\n getPlainTextSignature,\n verifyMessage,\n wrapCounterfactualSign\n} from '../../libs/signMessage/signMessage'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport { AccountsController } from '../accounts/accounts'\nimport { SignedMessage } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n sign: 'INITIAL'\n} as const\n\nexport class SignMessageController extends EventEmitter {\n #keystore: KeystoreController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #externalSignerControllers: ExternalSignerControllers\n\n #accounts: AccountsController\n\n // this is the signer from keystore.ts\n // we don't have a correct return type at getSigner so\n // I'm leaving it as any\n #signer: any\n\n isInitialized: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n dapp: {\n name: string\n icon: string\n } | null = null\n\n messageToSign: Message | null = null\n\n signingKeyAddr: Key['addr'] | null = null\n\n signingKeyType: Key['type'] | null = null\n\n signedMessage: SignedMessage | null = null\n\n constructor(\n keystore: KeystoreController,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n externalSignerControllers: ExternalSignerControllers\n ) {\n super()\n\n this.#keystore = keystore\n this.#providers = providers\n this.#networks = networks\n this.#externalSignerControllers = externalSignerControllers\n this.#accounts = accounts\n }\n\n async init({\n dapp,\n messageToSign\n }: {\n dapp?: { name: string; icon: string }\n messageToSign: Message\n }) {\n // In the unlikely case that the signMessage controller was already\n // initialized, but not reset, force reset it to prevent misleadingly\n // displaying the prev sign message request.\n if (this.isInitialized) this.reset()\n\n await this.#accounts.initialLoadPromise\n\n if (['message', 'typedMessage'].includes(messageToSign.content.kind)) {\n if (dapp) {\n this.dapp = dapp\n }\n this.messageToSign = messageToSign\n this.isInitialized = true\n this.emitUpdate()\n } else {\n this.emitError({\n level: 'major',\n message:\n 'Ambire does not support this request format for signing messages. Please contact support if you believe could be a glitch.',\n error: new Error(\n `The ${messageToSign.content.kind} signing method is not supported by signMessageController.`\n )\n })\n }\n }\n\n reset() {\n if (!this.isInitialized) return\n\n this.isInitialized = false\n this.dapp = null\n this.messageToSign = null\n this.signedMessage = null\n this.signingKeyAddr = null\n this.signingKeyType = null\n this.emitUpdate()\n }\n\n setSigningKey(signingKeyAddr: Key['addr'], signingKeyType: Key['type']) {\n this.signingKeyAddr = signingKeyAddr\n this.signingKeyType = signingKeyType\n this.emitUpdate()\n }\n\n async #sign() {\n if (!this.isInitialized) {\n return SignMessageController.#throwNotInitialized()\n }\n\n if (!this.messageToSign) {\n return SignMessageController.#throwMissingMessage()\n }\n\n if (!this.signingKeyAddr || !this.signingKeyType) {\n return SignMessageController.#throwMissingSigningKey()\n }\n\n try {\n this.#signer = await this.#keystore.getSigner(this.signingKeyAddr, this.signingKeyType)\n if (this.#signer.init) this.#signer.init(this.#externalSignerControllers[this.signingKeyType])\n\n const account = this.#accounts.accounts.find(\n (acc) => acc.addr === this.messageToSign?.accountAddr\n )\n if (!account) {\n throw new Error(\n 'Account details needed for the signing mechanism are not found. Please try again, re-import your account or contact support if nothing else helps.'\n )\n }\n const network = this.#networks.networks.find(\n // @ts-ignore this.messageToSign is not null and it has a check\n // but typescript malfunctions here\n (n: Network) => n.id === this.messageToSign.networkId\n )\n if (!network) {\n throw new Error('Network not supported on Ambire. Please contract support.')\n }\n\n const accountState = this.#accounts.accountStates[account.addr][network.id]\n let signature\n try {\n if (this.messageToSign.content.kind === 'message') {\n const message = this.messageToSign.content.message\n this.messageToSign.content.message = isHexString(message)\n ? message\n : hexlify(toUtf8Bytes(message.toString()))\n\n signature = await getPlainTextSignature(\n this.messageToSign.content.message,\n network,\n account,\n accountState,\n this.#signer\n )\n }\n\n if (this.messageToSign.content.kind === 'typedMessage') {\n if (account.creation && this.messageToSign.content.primaryType === 'Permit') {\n throw new Error(\n 'It looks like that this app doesn\\'t detect Smart Account wallets, and requested incompatible approval type. Please, go back to the app and change the approval type to \"Transaction\", which is supported by Smart Account wallets.'\n )\n }\n\n signature = await getEIP712Signature(\n this.messageToSign.content,\n account,\n accountState,\n this.#signer,\n network\n )\n }\n } catch (error: any) {\n throw new Error(\n error?.message ||\n 'Something went wrong while signing the message. Please try again later or contact support if the problem persists.'\n )\n }\n\n if (!signature) {\n throw new Error(\n 'Ambire was not able to retrieve the signature. Please try again or contact support if the problem persists.'\n )\n }\n\n // if the account is not deployed, it should be wrapped with EIP-6492\n // magic bytes\n signature =\n account.creation && !accountState.isDeployed\n ? // https://eips.ethereum.org/EIPS/eip-6492\n wrapCounterfactualSign(signature, account.creation!)\n : signature\n\n const personalMsgToValidate =\n typeof this.messageToSign.content.message === 'string'\n ? hexStringToUint8Array(this.messageToSign.content.message)\n : this.messageToSign.content.message\n\n const isValidSignature = await verifyMessage({\n network,\n provider: this.#providers.providers[network?.id || 'ethereum'],\n // the signer is always the account even if the actual\n // signature is from a key that has privs to the account\n signer: this.messageToSign?.accountAddr,\n signature,\n // @ts-ignore TODO: Be aware of the type mismatch, could cause troubles\n message: this.messageToSign.content.kind === 'message' ? personalMsgToValidate : undefined,\n typedData:\n this.messageToSign.content.kind === 'typedMessage'\n ? {\n domain: this.messageToSign.content.domain,\n types: this.messageToSign.content.types,\n message: this.messageToSign.content.message\n }\n : undefined\n })\n\n if (!isValidSignature) {\n throw new Error(\n 'Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support.'\n )\n }\n\n this.signedMessage = {\n fromActionId: this.messageToSign.fromActionId,\n accountAddr: this.messageToSign.accountAddr,\n networkId: this.messageToSign.networkId,\n content: this.messageToSign.content,\n timestamp: new Date().getTime(),\n signature,\n dapp: this.dapp\n }\n\n return this.signedMessage\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(`Signing failed. Error details: ${e}`)\n const message =\n e?.message || 'Something went wrong while signing the message. Please try again.'\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n }\n\n async sign() {\n await this.withStatus('sign', async () => this.#sign())\n }\n\n removeAccountData(address: Account['addr']) {\n if (this.messageToSign?.accountAddr.toLowerCase() === address.toLowerCase()) {\n this.reset()\n }\n }\n\n static #throwNotInitialized() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: controller not initialized')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingMessage() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: missing message to sign')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingSigningKey() {\n const message = 'Please select a signing key and try again.'\n const error = new Error('signMessage: missing selected signing key')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/controllers/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify, isHexString, toUtf8Bytes } from 'ethers'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Message } from '../../interfaces/userRequest'\nimport {\n getEIP712Signature,\n getPlainTextSignature,\n verifyMessage,\n wrapCounterfactualSign\n} from '../../libs/signMessage/signMessage'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport { AccountsController } from '../accounts/accounts'\nimport { SignedMessage } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\nconst STATUS_WRAPPED_METHODS = {\n sign: 'INITIAL'\n} as const\n\nexport class SignMessageController extends EventEmitter {\n #keystore: KeystoreController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #externalSignerControllers: ExternalSignerControllers\n\n #accounts: AccountsController\n\n // this is the signer from keystore.ts\n // we don't have a correct return type at getSigner so\n // I'm leaving it as any\n #signer: any\n\n isInitialized: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n dapp: {\n name: string\n icon: string\n } | null = null\n\n messageToSign: Message | null = null\n\n signingKeyAddr: Key['addr'] | null = null\n\n signingKeyType: Key['type'] | null = null\n\n signedMessage: SignedMessage | null = null\n\n constructor(\n keystore: KeystoreController,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n externalSignerControllers: ExternalSignerControllers\n ) {\n super()\n\n this.#keystore = keystore\n this.#providers = providers\n this.#networks = networks\n this.#externalSignerControllers = externalSignerControllers\n this.#accounts = accounts\n }\n\n async init({\n dapp,\n messageToSign\n }: {\n dapp?: { name: string; icon: string }\n messageToSign: Message\n }) {\n // In the unlikely case that the signMessage controller was already\n // initialized, but not reset, force reset it to prevent misleadingly\n // displaying the prev sign message request.\n if (this.isInitialized) this.reset()\n\n await this.#accounts.initialLoadPromise\n\n if (['message', 'typedMessage'].includes(messageToSign.content.kind)) {\n if (dapp) {\n this.dapp = dapp\n }\n this.messageToSign = messageToSign\n this.isInitialized = true\n this.emitUpdate()\n } else {\n this.emitError({\n level: 'major',\n message:\n 'Ambire does not support this request format for signing messages. Please contact support if you believe could be a glitch.',\n error: new Error(\n `The ${messageToSign.content.kind} signing method is not supported by signMessageController.`\n )\n })\n }\n }\n\n reset() {\n if (!this.isInitialized) return\n\n this.isInitialized = false\n this.dapp = null\n this.messageToSign = null\n this.signedMessage = null\n this.signingKeyAddr = null\n this.signingKeyType = null\n this.emitUpdate()\n }\n\n setSigningKey(signingKeyAddr: Key['addr'], signingKeyType: Key['type']) {\n this.signingKeyAddr = signingKeyAddr\n this.signingKeyType = signingKeyType\n this.emitUpdate()\n }\n\n async #sign() {\n if (!this.isInitialized) {\n return SignMessageController.#throwNotInitialized()\n }\n\n if (!this.messageToSign) {\n return SignMessageController.#throwMissingMessage()\n }\n\n if (!this.signingKeyAddr || !this.signingKeyType) {\n return SignMessageController.#throwMissingSigningKey()\n }\n\n try {\n this.#signer = await this.#keystore.getSigner(this.signingKeyAddr, this.signingKeyType)\n if (this.#signer.init) this.#signer.init(this.#externalSignerControllers[this.signingKeyType])\n\n const account = this.#accounts.accounts.find(\n (acc) => acc.addr === this.messageToSign?.accountAddr\n )\n if (!account) {\n throw new Error(\n 'Account details needed for the signing mechanism are not found. Please try again, re-import your account or contact support if nothing else helps.'\n )\n }\n const network = this.#networks.networks.find(\n // @ts-ignore this.messageToSign is not null and it has a check\n // but typescript malfunctions here\n (n: Network) => n.id === this.messageToSign.networkId\n )\n if (!network) {\n throw new Error('Network not supported on Ambire. Please contract support.')\n }\n\n const accountState = this.#accounts.accountStates[account.addr][network.id]\n let signature\n try {\n if (this.messageToSign.content.kind === 'message') {\n const message = this.messageToSign.content.message\n this.messageToSign.content.message = isHexString(message)\n ? message\n : hexlify(toUtf8Bytes(message.toString()))\n\n signature = await getPlainTextSignature(\n this.messageToSign.content.message,\n network,\n account,\n accountState,\n this.#signer\n )\n }\n\n if (this.messageToSign.content.kind === 'typedMessage') {\n if (account.creation && this.messageToSign.content.primaryType === 'Permit') {\n throw new Error(\n 'It looks like that this app doesn\\'t detect Smart Account wallets, and requested incompatible approval type. Please, go back to the app and change the approval type to \"Transaction\", which is supported by Smart Account wallets.'\n )\n }\n\n signature = await getEIP712Signature(\n this.messageToSign.content,\n account,\n accountState,\n this.#signer,\n network\n )\n }\n } catch (error: any) {\n throw new Error(\n error?.message ||\n 'Something went wrong while signing the message. Please try again later or contact support if the problem persists.'\n )\n }\n\n if (!signature) {\n throw new Error(\n 'Ambire was not able to retrieve the signature. Please try again or contact support if the problem persists.'\n )\n }\n\n // if the account is not deployed, it should be wrapped with EIP-6492\n // magic bytes\n signature =\n account.creation && !accountState.isDeployed\n ? // https://eips.ethereum.org/EIPS/eip-6492\n wrapCounterfactualSign(signature, account.creation!)\n : signature\n\n const personalMsgToValidate =\n typeof this.messageToSign.content.message === 'string'\n ? hexStringToUint8Array(this.messageToSign.content.message)\n : this.messageToSign.content.message\n\n const isValidSignature = await verifyMessage({\n network,\n provider: this.#providers.providers[network?.id || 'ethereum'],\n // the signer is always the account even if the actual\n // signature is from a key that has privs to the account\n signer: this.messageToSign?.accountAddr,\n signature,\n // @ts-ignore TODO: Be aware of the type mismatch, could cause troubles\n message: this.messageToSign.content.kind === 'message' ? personalMsgToValidate : undefined,\n typedData:\n this.messageToSign.content.kind === 'typedMessage'\n ? {\n domain: this.messageToSign.content.domain,\n types: this.messageToSign.content.types,\n message: this.messageToSign.content.message\n }\n : undefined\n })\n\n if (!isValidSignature) {\n throw new Error(\n 'Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support.'\n )\n }\n\n this.signedMessage = {\n fromActionId: this.messageToSign.fromActionId,\n accountAddr: this.messageToSign.accountAddr,\n networkId: this.messageToSign.networkId,\n content: this.messageToSign.content,\n timestamp: new Date().getTime(),\n signature,\n dapp: this.dapp\n }\n\n return this.signedMessage\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(`Signing failed. Error details: ${e}`)\n const message =\n e?.message || 'Something went wrong while signing the message. Please try again.'\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n }\n\n async sign() {\n await this.withStatus('sign', async () => this.#sign())\n }\n\n removeAccountData(address: Account['addr']) {\n if (this.messageToSign?.accountAddr.toLowerCase() === address.toLowerCase()) {\n this.reset()\n }\n }\n\n static #throwNotInitialized() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: controller not initialized')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingMessage() {\n const message =\n 'Looks like there is an error while processing your sign message. Please retry, or contact support if issue persists.'\n const error = new Error('signMessage: missing message to sign')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n\n static #throwMissingSigningKey() {\n const message = 'Please select a signing key and try again.'\n const error = new Error('signMessage: missing selected signing key')\n\n return Promise.reject(new EmittableError({ level: 'major', message, error }))\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.js b/dist/src/controllers/swapAndBridge/socketApiMock.js index 61be53157..ea5dafcc6 100644 --- a/dist/src/controllers/swapAndBridge/socketApiMock.js +++ b/dist/src/controllers/swapAndBridge/socketApiMock.js @@ -1,5 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SocketAPIMock = void 0; /* eslint-disable class-methods-use-this */ -export class SocketAPIMock { +class SocketAPIMock { #fetch; #baseUrl = 'https://api.socket.tech/v2'; #headers; @@ -850,4 +853,5 @@ export class SocketAPIMock { }; } } +exports.SocketAPIMock = SocketAPIMock; //# sourceMappingURL=socketApiMock.js.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/socketApiMock.js.map b/dist/src/controllers/swapAndBridge/socketApiMock.js.map index b0139c391..07c612247 100644 --- a/dist/src/controllers/swapAndBridge/socketApiMock.js.map +++ b/dist/src/controllers/swapAndBridge/socketApiMock.js.map @@ -1 +1 @@ -{"version":3,"file":"socketApiMock.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/socketApiMock.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIQuote,\n SocketAPISendTransactionRequest,\n SocketAPIToken\n} from '../../interfaces/swapAndBridge'\n\n/* eslint-disable class-methods-use-this */\nexport class SocketAPIMock {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n return true\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n async getToTokenList({\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n return [\n {\n name: 'Coinbase Wrapped BTC',\n address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf',\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n decimals: 8,\n symbol: 'CBBTC',\n chainId: toChainId,\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp'\n },\n {\n name: 'Coinbase Wrapped Staked ETH',\n address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22',\n icon: 'https://media.socket.tech/tokens/all/CBETH',\n decimals: 18,\n symbol: 'CBETH',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/CBETH'\n },\n {\n name: 'USDT',\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n icon: 'https://media.socket.tech/tokens/all/USDT',\n decimals: 6,\n symbol: 'USDT',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/USDT'\n }\n ]\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n }) {\n return {\n routes: [\n {\n routeId: '16bb1d94-d028-4b64-b660-c0f50784ea3f',\n isOnlySwapRoute: false,\n fromAmount,\n toAmount: '33',\n usedBridgeNames: ['stargate'],\n minimumGasBalances: {\n '10': '1800000000000000',\n '8453': '1800000000000000'\n },\n chainGasBalances: {\n '10': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n },\n '8453': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n }\n },\n totalUserTx: 2,\n sender: userAddress,\n recipient: userAddress,\n totalGasFeesInUsd: 0.17037701010588965,\n receivedValueInUsd: -0.15017701010588966,\n inputValueInUsd: 0.01997,\n outputValueInUsd: 0.0202,\n userTxs: [\n {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n chainId: fromChainId,\n toAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n stepCount: 2,\n routePath: '406-410',\n sender: userAddress,\n approvalData: {\n minimumApprovalAmount: fromAmount,\n approvalTokenAddress: fromTokenAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: userAddress\n },\n steps: [\n {\n type: 'middleware',\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n chainId: fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n chainAgnosticId: null\n },\n fromAmount,\n toAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n toAmount: '8403278157375',\n swapSlippage: 1,\n minAmountOut: '8319245375801',\n gasFees: {\n gasAmount: '2297984720000',\n gasLimit: 283352,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.0054468902019687996\n }\n },\n {\n type: 'bridge',\n protocol: {\n name: 'stargate',\n displayName: 'Stargate',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n securityScore: 2,\n robustnessScore: 3\n },\n bridgeSlippage: 0.5,\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n fromAmount: '8403278157375',\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n minAmountOut: '8272212227955',\n toAmount: '8398236190482',\n protocolFees: {\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.000011950923706808,\n amount: '5041966893'\n },\n gasFees: {\n gasAmount: '64850800171325',\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.15371520313808992\n },\n serviceTime: 60,\n maxServiceTime: 7200,\n extraData: {\n rewards: []\n }\n }\n ],\n gasFees: {\n gasAmount: '67148784891325',\n feesInUsd: 0.15916209334005874,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1283352\n },\n serviceTime: 60,\n recipient: userAddress,\n maxServiceTime: 7200,\n bridgeSlippage: 0.5,\n swapSlippage: 1,\n userTxIndex: 0\n },\n {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n swapSlippage: 1,\n chainId: toChainId,\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n fromAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n approvalData: null,\n fromAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'cbBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: null,\n logoURI: null,\n chainAgnosticId: null\n },\n toAmount: '33',\n minAmountOut: '32',\n gasFees: {\n gasAmount: '4731453436428',\n gasLimit: 441774,\n asset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n feesInUsd: 0.011214916765830925\n },\n sender: userAddress,\n recipient: userAddress,\n userTxIndex: 1\n }\n ],\n serviceTime: 60,\n maxServiceTime: 7200,\n integratorFee: {\n amount: '0',\n asset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n }\n },\n extraData: {\n rewards: []\n }\n }\n ],\n socketRoute: null,\n destinationCallData: {},\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n logoURI: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n chainAgnosticId: null\n },\n bridgeRouteErrors: {\n cctp: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n 'stargate-v2': {\n status: 'SOCKET_INTERNAL_SERVER_ERROR'\n },\n across: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n symbiosis: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n 'refuel-bridge': {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n hop: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n synapse: {\n status: 'ROUTE_NOT_FOUND'\n },\n 'polygon-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hyphen: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'arbitrum-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v4': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v6': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hopCctp: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n celer: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'optimism-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n connext: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'base-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zora-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zksync-native': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'gnosis-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mantle-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'scroll-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mode-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'super-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n }\n }\n }\n }\n\n async startRoute({\n fromChainId,\n fromAssetAddress\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n return {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n txData:\n '0x0000019aa1b4f14b00000000000000000000000000000000000000000000000000000000000001960000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000008e4ee8f0b860000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000808415565b00000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b8561954e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000420000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000012556e69737761705633000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b9c45870b1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b0b2c639c533813f4aa9d7837caf62653d097ff850001f442000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004200000000000000000000000000000000000006ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000016e3f1bd1000000000000000000000000ad01c20d5886137e056775af56915de824c8fce5000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000de7265c731f34e2d2fccf2dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000316bf7320e95000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000003bc961047b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n chainId: fromChainId,\n totalUserTx: 2,\n userTxIndex: 0,\n activeRouteId: 4338463,\n value: '0x316bf7320e95',\n approvalData: {\n minimumApprovalAmount: '10000',\n approvalTokenAddress: fromAssetAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8'\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async getRouteStatus(props: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n return props.userTxIndex === 1 ? 'completed' : 'ready'\n }\n\n async updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n activeRouteId,\n userAddress: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n totalUserTx: 2,\n userTxs: [\n {\n steps: [\n {\n type: 'middleware',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 285352,\n feesInUsd: 0.0007534051663168406,\n gasAmount: '312852513648'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '4135625926302',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n decimals: 6,\n chainAgnosticId: null\n },\n fromAmount: '10000',\n minAmountOut: '4094269667038',\n swapSlippage: 1\n },\n {\n type: 'bridge',\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.13350023376256365,\n gasAmount: '55436152514581'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n protocol: {\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n name: 'stargate',\n displayName: 'Stargate',\n securityScore: 2,\n robustnessScore: 3\n },\n toAmount: '4133144550747',\n extraData: {\n rewards: []\n },\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n toChainId: 8453,\n fromAmount: '4135625926302',\n fromChainId: 10,\n serviceTime: 60,\n minAmountOut: '4071122568729',\n protocolFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n amount: '2481375555',\n feesInUsd: 0.000005975598984039\n },\n bridgeSlippage: 0.5,\n maxServiceTime: 7200\n }\n ],\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1285352,\n feesInUsd: 0.13425363892888048,\n gasAmount: '55749005028229'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n toAmount: '4133144550747',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n routePath: '406-410',\n stepCount: 2,\n userTxType: 'fund-movr',\n serviceTime: 60,\n userTxIndex: 0,\n approvalData: {\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n approvalTokenAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n minimumApprovalAmount: '10000'\n },\n swapSlippage: 1,\n userTxStatus: 'completed',\n bridgeSlippage: 0.5,\n maxServiceTime: 7200,\n destinationTxHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n destinationTxReceipt: {\n to: '0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa',\n from: '0xe93685f3bBA03016F02bD1828BaDD6195988D950',\n logs: [\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000f1beca945694a1da1dac5e3021928e2dd6623c4dfe3c3a0cf47fd288f26519c84a0950000000000000000000000000000000000000000000000000000000000000014701a95707a0290ac8b90b3719e8ee5b210360883000000000000000000000000',\n topics: [\n '0x2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d',\n '0x000000000000000000000000000000000000000000000000000000000000006f',\n '0x000000000000000000000000af54be5b6eec24d6bfacf1cce4eaf680a8239398'\n ],\n address: '0x38dE71124f7a447a01D67945a51eDcE9FF491251',\n logIndex: 19,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4dafaa7b9b7731ec',\n topics: ['0xdbdd25248751feb2f3b66721dfdd11662a68bc155af3771e661aabec92fba814'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 20,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000003c5b59aac9a',\n topics: [\n '0xb4a87134099d10c48345145381989042ab07dc53e6e62a6511fca55438562e26',\n '0x00000000000000000000000028fc411f9e1c480ad312b3d9c60c22b965015c6b',\n '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea'\n ],\n address: '0x224D8Fd7aB6AD4c6eb4611Ce56EF35Dec2277F03',\n logIndex: 21,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000008d003bf600000000000000000000000000000000000000000000000000000000076bcd42',\n topics: ['0xfb2b592367452f1c437675bed47f5e1e6c25188c17d7ba01a12eb030bc41ccef'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 22,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n }\n ],\n type: 0,\n status: 1,\n gasUsed: {\n hex: '0x0315e0',\n type: 'BigNumber'\n },\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n byzantium: true,\n logsBloom:\n '0x00000400000000000080200000000000000002000000000000000000000000000000000000000001000000000000000000020000000000000000400000000000000000000800000000000004000000000080000000000000000000000000000000000000000002000000100000000000000000000000000002000100000000000002008000000001000000004000000100000000000000000000000000000000000008002000000060000000000000000000004100082004000000000000000000040000000000000000000000000000000000000000000000000000008000000000000000000000200000000000000000020000001000000000000000000000',\n blockNumber: 20922920,\n confirmations: 6,\n contractAddress: null,\n transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37,\n cumulativeGasUsed: {\n hex: '0x2c93f9',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x4592f8',\n type: 'BigNumber'\n }\n },\n sourceTransactionHash:\n '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n sourceTransactionReceipt: {\n to: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n from: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n logs: [],\n type: 2,\n status: 1,\n gasUsed: {\n hex: '0x0aefd7',\n type: 'BigNumber'\n },\n blockHash: '0xd2b0a9277ea51b57cbe99156a537ef552def028e8bed00b1301bc11c08e69a57',\n byzantium: true,\n logsBloom:\n '0x0000204202040000000000100000000000004008000800042c04000000080000000100100020000000040010001800082000000000012000040001000020000000400000000000080000000800802000000100000040400000000400800000000004000000000001000010100000000000009002000044000000009a000920000000008040000000000000000000000000000401282000020000009002000020820000000000432000000004800001000020001000200104000000800010000080029002000008000000008000008000000000440000000000000006002000001010800002000000000000000000100480020000000200400000400008003000',\n blockNumber: 126518175,\n confirmations: 4,\n contractAddress: null,\n transactionHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n transactionIndex: 8,\n cumulativeGasUsed: {\n hex: '0x202cde',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x0363c5',\n type: 'BigNumber'\n }\n }\n },\n {\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 8453,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n gasLimit: 566000,\n feesInUsd: 0.00522177973754892,\n gasAmount: '2168351094000'\n },\n toAsset: {\n icon: null,\n name: 'Coinbase Wrapped BTC',\n symbol: 'cbBTC',\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n chainId: 8453,\n logoURI: null,\n decimals: 8,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '16',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n fromAmount: '4133144550747',\n userTxType: 'dex-swap',\n userTxIndex: 1,\n approvalData: null,\n minAmountOut: '15',\n swapSlippage: 1\n }\n ],\n fromChainId: 10,\n toChainId: 8453,\n fromAssetAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n toAssetAddress: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n fromAmount: '10000',\n toAmount: '16',\n refuel: null,\n routeStatus: 'PENDING',\n transactionData: {\n '0': {\n txHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n chainId: 10\n }\n },\n bridgeTxHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n integratorId: 2564,\n destinationCallData: null,\n bridgeInsuranceData: null,\n integratorFee: {\n asset: {\n icon: 'https://media.socket.tech/tokens/all/USDC',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n decimals: 6,\n chainAgnosticId: null\n },\n amount: '0'\n },\n createdAt: '2024-10-11T08:25:15.853Z',\n updatedAt: '2024-10-11T08:26:38.194Z',\n currentUserTxIndex: 1,\n fromAsset: {\n chainId: 10,\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toAsset: {\n chainId: 8453,\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n chainAgnosticId: null\n }\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n txData:\n '0x000001947899f9ed000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b28415565b0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000002556e6973776170563200000000000000000000000000000000000000000000000000000000000000000003c5b59aac9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000420000000000000000000000000000000000000600000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000244165726f64726f6d6500000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cf77a3ba9a5ca399b7c97c74d54e5b1beb874e4300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420dd381b31aef6683db6b902084cb0ffece40da0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000000869584cd000000000000000000000000100000000000000000000000000000000000001100000000000000000000000000000000000000005252a17c44e837f8ca3be173000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23f943181408eac424116af7b7790c94cb97a5',\n chainId: 8453,\n totalUserTx: 2,\n activeRouteId,\n value: '0x03c5b59aac9a',\n userTxIndex: 1,\n approvalData: null\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"socketApiMock.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/socketApiMock.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIQuote,\n SocketAPISendTransactionRequest,\n SocketAPIToken\n} from '../../interfaces/swapAndBridge'\n\n/* eslint-disable class-methods-use-this */\nexport class SocketAPIMock {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n return true\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n async getToTokenList({\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n return [\n {\n name: 'Coinbase Wrapped BTC',\n address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf',\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n decimals: 8,\n symbol: 'CBBTC',\n chainId: toChainId,\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp'\n },\n {\n name: 'Coinbase Wrapped Staked ETH',\n address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22',\n icon: 'https://media.socket.tech/tokens/all/CBETH',\n decimals: 18,\n symbol: 'CBETH',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/CBETH'\n },\n {\n name: 'USDT',\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n icon: 'https://media.socket.tech/tokens/all/USDT',\n decimals: 6,\n symbol: 'USDT',\n chainId: toChainId,\n logoURI: 'https://media.socket.tech/tokens/all/USDT'\n }\n ]\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n }) {\n return {\n routes: [\n {\n routeId: '16bb1d94-d028-4b64-b660-c0f50784ea3f',\n isOnlySwapRoute: false,\n fromAmount,\n toAmount: '33',\n usedBridgeNames: ['stargate'],\n minimumGasBalances: {\n '10': '1800000000000000',\n '8453': '1800000000000000'\n },\n chainGasBalances: {\n '10': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n },\n '8453': {\n minGasBalance: '1800000000000000',\n hasGasBalance: false\n }\n },\n totalUserTx: 2,\n sender: userAddress,\n recipient: userAddress,\n totalGasFeesInUsd: 0.17037701010588965,\n receivedValueInUsd: -0.15017701010588966,\n inputValueInUsd: 0.01997,\n outputValueInUsd: 0.0202,\n userTxs: [\n {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n chainId: fromChainId,\n toAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n stepCount: 2,\n routePath: '406-410',\n sender: userAddress,\n approvalData: {\n minimumApprovalAmount: fromAmount,\n approvalTokenAddress: fromTokenAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: userAddress\n },\n steps: [\n {\n type: 'middleware',\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n chainId: fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n chainAgnosticId: null\n },\n fromAmount,\n toAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n toAmount: '8403278157375',\n swapSlippage: 1,\n minAmountOut: '8319245375801',\n gasFees: {\n gasAmount: '2297984720000',\n gasLimit: 283352,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.0054468902019687996\n }\n },\n {\n type: 'bridge',\n protocol: {\n name: 'stargate',\n displayName: 'Stargate',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n securityScore: 2,\n robustnessScore: 3\n },\n bridgeSlippage: 0.5,\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n fromAmount: '8403278157375',\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n minAmountOut: '8272212227955',\n toAmount: '8398236190482',\n protocolFees: {\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n feesInUsd: 0.000011950923706808,\n amount: '5041966893'\n },\n gasFees: {\n gasAmount: '64850800171325',\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.15371520313808992\n },\n serviceTime: 60,\n maxServiceTime: 7200,\n extraData: {\n rewards: []\n }\n }\n ],\n gasFees: {\n gasAmount: '67148784891325',\n feesInUsd: 0.15916209334005874,\n asset: {\n chainId: fromChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: null\n },\n gasLimit: 1283352\n },\n serviceTime: 60,\n recipient: userAddress,\n maxServiceTime: 7200,\n bridgeSlippage: 0.5,\n swapSlippage: 1,\n userTxIndex: 0\n },\n {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n swapSlippage: 1,\n chainId: toChainId,\n protocol: {\n name: 'zerox',\n displayName: '0x',\n icon: 'https://media.socket.tech/dexes/0x.svg'\n },\n fromAsset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n approvalData: null,\n fromAmount: '8398236190482',\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'cbBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: null,\n logoURI: null,\n chainAgnosticId: null\n },\n toAmount: '33',\n minAmountOut: '32',\n gasFees: {\n gasAmount: '4731453436428',\n gasLimit: 441774,\n asset: {\n chainId: toChainId,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n chainAgnosticId: 'ETH'\n },\n feesInUsd: 0.011214916765830925\n },\n sender: userAddress,\n recipient: userAddress,\n userTxIndex: 1\n }\n ],\n serviceTime: 60,\n maxServiceTime: 7200,\n integratorFee: {\n amount: '0',\n asset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n }\n },\n extraData: {\n rewards: []\n }\n }\n ],\n socketRoute: null,\n destinationCallData: {},\n fromChainId,\n fromAsset: {\n chainId: fromChainId,\n address: fromTokenAddress,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toChainId,\n toAsset: {\n chainId: toChainId,\n address: toTokenAddress,\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n logoURI: 'https://tokens-data.1inch.io/images/8453toTokenAddresswebp',\n chainAgnosticId: null\n },\n bridgeRouteErrors: {\n cctp: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n 'stargate-v2': {\n status: 'SOCKET_INTERNAL_SERVER_ERROR'\n },\n across: {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n symbiosis: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n 'refuel-bridge': {\n status: 'MIN_AMOUNT_NOT_MET'\n },\n hop: {\n status: 'INSUFFICIENT_INPUT_AMOUNT'\n },\n synapse: {\n status: 'ROUTE_NOT_FOUND'\n },\n 'polygon-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hyphen: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'arbitrum-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v4': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'anyswap-router-v6': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n hopCctp: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n celer: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'optimism-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n connext: {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'base-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zora-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'zksync-native': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'gnosis-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mantle-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'scroll-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'mode-native-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n },\n 'super-bridge': {\n status: 'ASSET_NOT_SUPPORTED'\n }\n }\n }\n }\n\n async startRoute({\n fromChainId,\n fromAssetAddress\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n return {\n userTxType: 'fund-movr',\n txType: 'eth_sendTransaction',\n txData:\n '0x0000019aa1b4f14b00000000000000000000000000000000000000000000000000000000000001960000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000008e4ee8f0b860000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000808415565b00000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b8561954e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85000000000000000000000000420000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000012556e69737761705633000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000003b9c45870b1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b0b2c639c533813f4aa9d7837caf62653d097ff850001f442000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004200000000000000000000000000000000000006ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000016e3f1bd1000000000000000000000000ad01c20d5886137e056775af56915de824c8fce5000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000de7265c731f34e2d2fccf2dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000316bf7320e95000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000003bc961047b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n chainId: fromChainId,\n totalUserTx: 2,\n userTxIndex: 0,\n activeRouteId: 4338463,\n value: '0x316bf7320e95',\n approvalData: {\n minimumApprovalAmount: '10000',\n approvalTokenAddress: fromAssetAddress,\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8'\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async getRouteStatus(props: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n return props.userTxIndex === 1 ? 'completed' : 'ready'\n }\n\n async updateActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n activeRouteId,\n userAddress: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n totalUserTx: 2,\n userTxs: [\n {\n steps: [\n {\n type: 'middleware',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 285352,\n feesInUsd: 0.0007534051663168406,\n gasAmount: '312852513648'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '4135625926302',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/usdc.svg',\n decimals: 6,\n chainAgnosticId: null\n },\n fromAmount: '10000',\n minAmountOut: '4094269667038',\n swapSlippage: 1\n },\n {\n type: 'bridge',\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1000000,\n feesInUsd: 0.13350023376256365,\n gasAmount: '55436152514581'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n protocol: {\n icon: 'https://s2.coinmarketcap.com/static/img/coins/128x128/18934.png',\n name: 'stargate',\n displayName: 'Stargate',\n securityScore: 2,\n robustnessScore: 3\n },\n toAmount: '4133144550747',\n extraData: {\n rewards: []\n },\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n toChainId: 8453,\n fromAmount: '4135625926302',\n fromChainId: 10,\n serviceTime: 60,\n minAmountOut: '4071122568729',\n protocolFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n amount: '2481375555',\n feesInUsd: 0.000005975598984039\n },\n bridgeSlippage: 0.5,\n maxServiceTime: 7200\n }\n ],\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 10,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 10,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: null\n },\n gasLimit: 1285352,\n feesInUsd: 0.13425363892888048,\n gasAmount: '55749005028229'\n },\n toAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n toAmount: '4133144550747',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n routePath: '406-410',\n stepCount: 2,\n userTxType: 'fund-movr',\n serviceTime: 60,\n userTxIndex: 0,\n approvalData: {\n owner: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n allowanceTarget: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n approvalTokenAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n minimumApprovalAmount: '10000'\n },\n swapSlippage: 1,\n userTxStatus: 'completed',\n bridgeSlippage: 0.5,\n maxServiceTime: 7200,\n destinationTxHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n destinationTxReceipt: {\n to: '0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa',\n from: '0xe93685f3bBA03016F02bD1828BaDD6195988D950',\n logs: [\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000f1beca945694a1da1dac5e3021928e2dd6623c4dfe3c3a0cf47fd288f26519c84a0950000000000000000000000000000000000000000000000000000000000000014701a95707a0290ac8b90b3719e8ee5b210360883000000000000000000000000',\n topics: [\n '0x2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d',\n '0x000000000000000000000000000000000000000000000000000000000000006f',\n '0x000000000000000000000000af54be5b6eec24d6bfacf1cce4eaf680a8239398'\n ],\n address: '0x38dE71124f7a447a01D67945a51eDcE9FF491251',\n logIndex: 19,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4dafaa7b9b7731ec',\n topics: ['0xdbdd25248751feb2f3b66721dfdd11662a68bc155af3771e661aabec92fba814'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 20,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000000000000000000000000000000003c5b59aac9a',\n topics: [\n '0xb4a87134099d10c48345145381989042ab07dc53e6e62a6511fca55438562e26',\n '0x00000000000000000000000028fc411f9e1c480ad312b3d9c60c22b965015c6b',\n '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea'\n ],\n address: '0x224D8Fd7aB6AD4c6eb4611Ce56EF35Dec2277F03',\n logIndex: 21,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n },\n {\n data: '0x000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000008d003bf600000000000000000000000000000000000000000000000000000000076bcd42',\n topics: ['0xfb2b592367452f1c437675bed47f5e1e6c25188c17d7ba01a12eb030bc41ccef'],\n address: '0x28fc411f9e1c480AD312b3d9C60c22b965015c6B',\n logIndex: 22,\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n blockNumber: 20922920,\n transactionHash:\n '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37\n }\n ],\n type: 0,\n status: 1,\n gasUsed: {\n hex: '0x0315e0',\n type: 'BigNumber'\n },\n blockHash: '0x66316830837d3664fd42d73f14de7c8cedadc641b9e7f017b64012fab8a70281',\n byzantium: true,\n logsBloom:\n '0x00000400000000000080200000000000000002000000000000000000000000000000000000000001000000000000000000020000000000000000400000000000000000000800000000000004000000000080000000000000000000000000000000000000000002000000100000000000000000000000000002000100000000000002008000000001000000004000000100000000000000000000000000000000000008002000000060000000000000000000004100082004000000000000000000040000000000000000000000000000000000000000000000000000008000000000000000000000200000000000000000020000001000000000000000000000',\n blockNumber: 20922920,\n confirmations: 6,\n contractAddress: null,\n transactionHash: '0xf459d462cc533a73bfa7ef9fcf22e7b8e3f4862115fbbdefb0207bc485fbac29',\n transactionIndex: 37,\n cumulativeGasUsed: {\n hex: '0x2c93f9',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x4592f8',\n type: 'BigNumber'\n }\n },\n sourceTransactionHash:\n '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n sourceTransactionReceipt: {\n to: '0x3a23F943181408EAC424116Af7b7790c94Cb97a5',\n from: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n logs: [],\n type: 2,\n status: 1,\n gasUsed: {\n hex: '0x0aefd7',\n type: 'BigNumber'\n },\n blockHash: '0xd2b0a9277ea51b57cbe99156a537ef552def028e8bed00b1301bc11c08e69a57',\n byzantium: true,\n logsBloom:\n '0x0000204202040000000000100000000000004008000800042c04000000080000000100100020000000040010001800082000000000012000040001000020000000400000000000080000000800802000000100000040400000000400800000000004000000000001000010100000000000009002000044000000009a000920000000008040000000000000000000000000000401282000020000009002000020820000000000432000000004800001000020001000200104000000800010000080029002000008000000008000008000000000440000000000000006002000001010800002000000000000000000100480020000000200400000400008003000',\n blockNumber: 126518175,\n confirmations: 4,\n contractAddress: null,\n transactionHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n transactionIndex: 8,\n cumulativeGasUsed: {\n hex: '0x202cde',\n type: 'BigNumber'\n },\n effectiveGasPrice: {\n hex: '0x0363c5',\n type: 'BigNumber'\n }\n }\n },\n {\n sender: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n txType: 'eth_sendTransaction',\n chainId: 8453,\n gasFees: {\n asset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n gasLimit: 566000,\n feesInUsd: 0.00522177973754892,\n gasAmount: '2168351094000'\n },\n toAsset: {\n icon: null,\n name: 'Coinbase Wrapped BTC',\n symbol: 'cbBTC',\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n chainId: 8453,\n logoURI: null,\n decimals: 8,\n chainAgnosticId: null\n },\n protocol: {\n icon: 'https://media.socket.tech/dexes/0x.svg',\n name: 'zerox',\n displayName: '0x'\n },\n toAmount: '16',\n fromAsset: {\n icon: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n name: 'Ethereum',\n symbol: 'ETH',\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n chainId: 8453,\n logoURI: 'https://assets.polygon.technology/tokenAssets/eth.svg',\n decimals: 18,\n chainAgnosticId: 'ETH'\n },\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n fromAmount: '4133144550747',\n userTxType: 'dex-swap',\n userTxIndex: 1,\n approvalData: null,\n minAmountOut: '15',\n swapSlippage: 1\n }\n ],\n fromChainId: 10,\n toChainId: 8453,\n fromAssetAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n toAssetAddress: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n fromAmount: '10000',\n toAmount: '16',\n refuel: null,\n routeStatus: 'PENDING',\n transactionData: {\n '0': {\n txHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n chainId: 10\n }\n },\n bridgeTxHash: '0x2ea8d137eab4a5226a4b0cce0cdcb3639171bc273f2e1c73df775ab1739c6e06',\n recipient: '0x77777777789A8BBEE6C64381e5E89E501fb0e4c8',\n integratorId: 2564,\n destinationCallData: null,\n bridgeInsuranceData: null,\n integratorFee: {\n asset: {\n icon: 'https://media.socket.tech/tokens/all/USDC',\n name: 'USD Coin',\n symbol: 'USDC',\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n chainId: 10,\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n decimals: 6,\n chainAgnosticId: null\n },\n amount: '0'\n },\n createdAt: '2024-10-11T08:25:15.853Z',\n updatedAt: '2024-10-11T08:26:38.194Z',\n currentUserTxIndex: 1,\n fromAsset: {\n chainId: 10,\n address: '0x0b2c639c533813f4aa9d7837caf62653d097ff85',\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n icon: 'https://media.socket.tech/tokens/all/USDC',\n logoURI: 'https://media.socket.tech/tokens/all/USDC',\n chainAgnosticId: null\n },\n toAsset: {\n chainId: 8453,\n address: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n symbol: 'CBBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n icon: 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n logoURI:\n 'https://tokens-data.1inch.io/images/8453/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.webp',\n chainAgnosticId: null\n }\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n return {\n userTxType: 'dex-swap',\n txType: 'eth_sendTransaction',\n txData:\n '0x000001947899f9ed000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000813f71d642f533399527cbcdbfc77482893f0fea0000000000000000000000000000000000000000000000000000000000000a0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b28415565b0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000003c5b59aac9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000002556e6973776170563200000000000000000000000000000000000000000000000000000000000000000003c5b59aac9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000420000000000000000000000000000000000000600000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000244165726f64726f6d6500000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cf77a3ba9a5ca399b7c97c74d54e5b1beb874e4300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420dd381b31aef6683db6b902084cb0ffece40da0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000000869584cd000000000000000000000000100000000000000000000000000000000000001100000000000000000000000000000000000000005252a17c44e837f8ca3be173000000000000000000000000000000000000000000000000',\n txTarget: '0x3a23f943181408eac424116af7b7790c94cb97a5',\n chainId: 8453,\n totalUserTx: 2,\n activeRouteId,\n value: '0x03c5b59aac9a',\n userTxIndex: 1,\n approvalData: null\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js b/dist/src/controllers/swapAndBridge/swapAndBridge.js index 176df71ff..6a8433eb6 100644 --- a/dist/src/controllers/swapAndBridge/swapAndBridge.js +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js @@ -1,27 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SwapAndBridgeController = exports.SwapAndBridgeFormStatus = void 0; +const tslib_1 = require("tslib"); /* eslint-disable no-await-in-loop */ -import { formatUnits, isAddress, parseUnits } from 'ethers'; -import { v4 as uuidv4 } from 'uuid'; -import EmittableError from '../../classes/EmittableError'; -import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; -import { isSmartAccount } from '../../libs/account/account'; -import { AccountOpStatus } from '../../libs/accountOp/accountOp'; -import { getBridgeBanners } from '../../libs/banners/banners'; -import { getTokenAmount } from '../../libs/portfolio/helpers'; -import { convertPortfolioTokenToSocketAPIToken, getActiveRoutesForAccount, getIsBridgeTxn, getIsTokenEligibleForSwapAndBridge, getQuoteRouteSteps, sortPortfolioTokenList, sortTokenListResponse } from '../../libs/swapAndBridge/swapAndBridge'; -import { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'; -import { getSanitizedAmount } from '../../libs/transfer/amount'; -import { normalizeIncomingSocketToken } from '../../services/socket/api'; -import { ZERO_ADDRESS } from '../../services/socket/constants'; -import { validateSendTransferAmount } from '../../services/validations/validate'; -import formatDecimals from '../../utils/formatDecimals/formatDecimals'; -import { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'; -import wait from '../../utils/wait'; -import EventEmitter from '../eventEmitter/eventEmitter'; +const ethers_1 = require("ethers"); +const uuid_1 = require("uuid"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const SwapAndBridgeError_1 = tslib_1.__importDefault(require("../../classes/SwapAndBridgeError")); +const account_1 = require("../../libs/account/account"); +const accountOp_1 = require("../../libs/accountOp/accountOp"); +const banners_1 = require("../../libs/banners/banners"); +const helpers_1 = require("../../libs/portfolio/helpers"); +const swapAndBridge_1 = require("../../libs/swapAndBridge/swapAndBridge"); +const swapAndBridgeErrorHumanizer_1 = require("../../libs/swapAndBridge/swapAndBridgeErrorHumanizer"); +const amount_1 = require("../../libs/transfer/amount"); +const api_1 = require("../../services/socket/api"); +const constants_1 = require("../../services/socket/constants"); +const validate_1 = require("../../services/validations/validate"); +const formatDecimals_1 = tslib_1.__importDefault(require("../../utils/formatDecimals/formatDecimals")); +const formatters_1 = require("../../utils/numbers/formatters"); +const wait_1 = tslib_1.__importDefault(require("../../utils/wait")); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const HARD_CODED_CURRENCY = 'usd'; const CONVERSION_PRECISION = 16; const CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION); const NETWORK_MISMATCH_MESSAGE = 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'; -export var SwapAndBridgeFormStatus; +var SwapAndBridgeFormStatus; (function (SwapAndBridgeFormStatus) { SwapAndBridgeFormStatus["Empty"] = "empty"; SwapAndBridgeFormStatus["Invalid"] = "invalid"; @@ -29,7 +33,7 @@ export var SwapAndBridgeFormStatus; SwapAndBridgeFormStatus["NoRoutesFound"] = "no-routes-found"; SwapAndBridgeFormStatus["InvalidRouteSelected"] = "invalid-route-selected"; SwapAndBridgeFormStatus["ReadyToSubmit"] = "ready-to-submit"; -})(SwapAndBridgeFormStatus || (SwapAndBridgeFormStatus = {})); +})(SwapAndBridgeFormStatus = exports.SwapAndBridgeFormStatus || (exports.SwapAndBridgeFormStatus = {})); const STATUS_WRAPPED_METHODS = { addToTokenByAddress: 'INITIAL' }; @@ -51,7 +55,7 @@ const PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [ * - Fetching and updating quotes for token swaps and bridges. * - Manages token active routes */ -export class SwapAndBridgeController extends EventEmitter { +class SwapAndBridgeController extends eventEmitter_1.default { #selectedAccount; #networks; #actions; @@ -142,24 +146,24 @@ export class SwapAndBridgeController extends EventEmitter { // on every balance (pending or anything) change. #getFromSelectedTokenInPortfolio = () => this.portfolioTokenList.find((t) => t.address === this.fromSelectedToken?.address && t.networkId === this.fromSelectedToken?.networkId && - getIsTokenEligibleForSwapAndBridge(t)); + (0, swapAndBridge_1.getIsTokenEligibleForSwapAndBridge)(t)); get maxFromAmount() { const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken; - if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number') + if (!tokenRef || (0, helpers_1.getTokenAmount)(tokenRef) === 0n || typeof tokenRef.decimals !== 'number') return '0'; - return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals); + return (0, ethers_1.formatUnits)((0, helpers_1.getTokenAmount)(tokenRef), tokenRef.decimals); } get maxFromAmountInFiat() { const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken; - if (!tokenRef || getTokenAmount(tokenRef) === 0n) + if (!tokenRef || (0, helpers_1.getTokenAmount)(tokenRef) === 0n) return '0'; const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; if (!tokenPrice || !Number(this.maxFromAmount)) return '0'; - const maxAmount = getTokenAmount(tokenRef); - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + const maxAmount = (0, helpers_1.getTokenAmount)(tokenRef); + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss - return formatUnits(BigInt(maxAmount) * tokenPriceBigInt, + return (0, ethers_1.formatUnits)(BigInt(maxAmount) * tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price tokenRef.decimals + tokenPriceDecimals); } @@ -194,7 +198,7 @@ export class SwapAndBridgeController extends EventEmitter { message: '🔔 A route was found for this pair but the minimum token amount was not met.' }; } - return validateSendTransferAmount(this.fromAmount, Number(this.maxFromAmount), Number(this.maxFromAmountInFiat), this.fromSelectedToken); + return (0, validate_1.validateSendTransferAmount)(this.fromAmount, Number(this.maxFromAmount), Number(this.maxFromAmountInFiat), this.fromSelectedToken); } get activeRoutesInProgress() { return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash); @@ -317,10 +321,10 @@ export class SwapAndBridgeController extends EventEmitter { this.fromAmountInFiat = fromAmount; // Get the number of decimals const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0; - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); // Convert the numbers to big int - const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals); - this.fromAmount = formatUnits((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, + const amountInFiatBigInt = (0, ethers_1.parseUnits)(fromAmount, amountInFiatDecimals); + this.fromAmount = (0, ethers_1.formatUnits)((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals); return; @@ -329,13 +333,13 @@ export class SwapAndBridgeController extends EventEmitter { this.fromAmount = fromAmount; if (!this.fromSelectedToken) return; - const sanitizedFieldValue = getSanitizedAmount(fromAmount, this.fromSelectedToken.decimals); + const sanitizedFieldValue = (0, amount_1.getSanitizedAmount)(fromAmount, this.fromSelectedToken.decimals); // Convert the field value to big int - const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals); + const formattedAmount = (0, ethers_1.parseUnits)(sanitizedFieldValue, this.fromSelectedToken.decimals); if (!formattedAmount) return; - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); - this.fromAmountInFiat = formatUnits(formattedAmount * tokenPriceBigInt, + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); + this.fromAmountInFiat = (0, ethers_1.formatUnits)(formattedAmount * tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price this.fromSelectedToken.decimals + tokenPriceDecimals); } @@ -404,8 +408,8 @@ export class SwapAndBridgeController extends EventEmitter { this.#emitUpdateIfNeeded(); } updatePortfolioTokenList(nextPortfolioTokenList) { - const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge); - this.portfolioTokenList = sortPortfolioTokenList( + const tokens = nextPortfolioTokenList.filter(swapAndBridge_1.getIsTokenEligibleForSwapAndBridge); + this.portfolioTokenList = (0, swapAndBridge_1.sortPortfolioTokenList)( // Filtering out hidden tokens here means: 1) They won't be displayed in // the "From" token list (`this.portfolioTokenList`) and 2) They won't be // added to the "Receive" token list as additional tokens from portfolio, @@ -436,7 +440,7 @@ export class SwapAndBridgeController extends EventEmitter { this.#updateToTokenListThrottle.addressToSelect = addressToSelect; if (!this.#updateToTokenListThrottle.throttled) { this.#updateToTokenListThrottle.throttled = true; - await wait(500 - timeSinceLastCall); + await (0, wait_1.default)(500 - timeSinceLastCall); this.#updateToTokenListThrottle.throttled = false; await this.updateToTokenList(this.#updateToTokenListThrottle.shouldReset, this.#updateToTokenListThrottle.addressToSelect); } @@ -470,12 +474,12 @@ export class SwapAndBridgeController extends EventEmitter { const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); // should never happen if (!toTokenNetwork) - throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE); + throw new SwapAndBridgeError_1.default(NETWORK_MISMATCH_MESSAGE); const additionalTokensFromPortfolio = this.portfolioTokenList .filter((t) => t.networkId === toTokenNetwork.id) .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address)) - .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId))); - this.#toTokenList = sortTokenListResponse([...upToDateToTokenList, ...additionalTokensFromPortfolio], this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); + .map((t) => (0, swapAndBridge_1.convertPortfolioTokenToSocketAPIToken)(t, Number(toTokenNetwork.chainId))); + this.#toTokenList = (0, swapAndBridge_1.sortTokenListResponse)([...upToDateToTokenList, ...additionalTokensFromPortfolio], this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); if (!this.toSelectedToken) { if (addressToSelect) { const token = this.#toTokenList.find((t) => t.address === addressToSelect); @@ -489,7 +493,7 @@ export class SwapAndBridgeController extends EventEmitter { } } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); this.emitError({ error, level: 'major', message }); } this.updateToTokenListStatus = 'INITIAL'; @@ -506,7 +510,7 @@ export class SwapAndBridgeController extends EventEmitter { async #addToTokenByAddress(address) { if (!this.toChainId) return; // should never happen - if (!isAddress(address)) + if (!(0, ethers_1.isAddress)(address)) return; // no need to attempt with invalid addresses const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address); if (isAlreadyInTheList) @@ -515,11 +519,11 @@ export class SwapAndBridgeController extends EventEmitter { try { token = await this.#socketAPI.getToken({ address, chainId: this.toChainId }); if (!token) - throw new SwapAndBridgeError('Token with this address is not supported by our service provider.'); + throw new SwapAndBridgeError_1.default('Token with this address is not supported by our service provider.'); } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); - throw new EmittableError({ error, level: 'minor', message }); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); + throw new EmittableError_1.default({ error, level: 'minor', message }); } if (this.#toTokenListKey) // Cache for sometime the tokens added by address @@ -527,11 +531,11 @@ export class SwapAndBridgeController extends EventEmitter { const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId); // should never happen if (!toTokenNetwork) { - const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE); - throw new EmittableError({ error, level: 'minor', message: error?.message }); + const error = new SwapAndBridgeError_1.default(NETWORK_MISMATCH_MESSAGE); + throw new EmittableError_1.default({ error, level: 'minor', message: error?.message }); } const nextTokenList = [...this.#toTokenList, token]; - this.#toTokenList = sortTokenListResponse(nextTokenList, this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); + this.#toTokenList = (0, swapAndBridge_1.sortTokenListResponse)(nextTokenList, this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)); this.#emitUpdateIfNeeded(); return token; } @@ -553,15 +557,15 @@ export class SwapAndBridgeController extends EventEmitter { skipPreviousQuoteRemoval: false, skipStatusUpdate: false }) { - const quoteId = uuidv4(); + const quoteId = (0, uuid_1.v4)(); this.#updateQuoteId = quoteId; const updateQuoteFunction = async () => { if (!this.#selectedAccount.account) return; if (!this.fromAmount) return; - const sanitizedFromAmount = getSanitizedAmount(this.fromAmount, this.fromSelectedToken.decimals); - const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken.decimals); + const sanitizedFromAmount = (0, amount_1.getSanitizedAmount)(this.fromAmount, this.fromSelectedToken.decimals); + const bigintFromAmount = (0, ethers_1.parseUnits)(sanitizedFromAmount, this.fromSelectedToken.decimals); if (this.quote) { const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString(); const isFromNetworkSame = this.quote.fromChainId === this.fromChainId; @@ -591,7 +595,7 @@ export class SwapAndBridgeController extends EventEmitter { toTokenAddress: this.toSelectedToken.address, fromAmount: bigintFromAmount, userAddress: this.#selectedAccount.account.addr, - isSmartAccount: isSmartAccount(this.#selectedAccount.account), + isSmartAccount: (0, account_1.isSmartAccount)(this.#selectedAccount.account), sort: this.routePriority, isOG: this.#invite.isOG }); @@ -610,7 +614,7 @@ export class SwapAndBridgeController extends EventEmitter { routes = routes.map((route) => { if (!route.userTxs) return route; - const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)); + const bridgeTx = route.userTxs.find((tx) => (0, swapAndBridge_1.getIsBridgeTxn)(tx.userTxType)); if (!bridgeTx) return route; const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge'); @@ -618,11 +622,11 @@ export class SwapAndBridgeController extends EventEmitter { return route; if (bridgeStep.protocolFees.amount === '0') return route; - const normalizedProtocolFeeToken = normalizeIncomingSocketToken(bridgeStep.protocolFees.asset); + const normalizedProtocolFeeToken = (0, api_1.normalizeIncomingSocketToken)(bridgeStep.protocolFees.asset); const doesProtocolRequireExtraContractFeeInNative = PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) && // When other tokens than the native ones are being bridged, // Socket API takes the fee directly from the "From" amount. - normalizedProtocolFeeToken.address === ZERO_ADDRESS; + normalizedProtocolFeeToken.address === constants_1.ZERO_ADDRESS; if (!doesProtocolRequireExtraContractFeeInNative) return route; const protocolFeeTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId); @@ -655,8 +659,8 @@ export class SwapAndBridgeController extends EventEmitter { const protocolName = bridgeStep.protocol.displayName; const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol; const insufficientTokenNetwork = protocolFeeTokenNetwork.name; - const insufficientAssetAmount = formatUnits(bridgeStep.protocolFees.amount, bridgeStep.protocolFees.asset.decimals); - const insufficientAssetAmountInUsd = formatDecimals(bridgeStep.protocolFees.feesInUsd, 'value'); + const insufficientAssetAmount = (0, ethers_1.formatUnits)(bridgeStep.protocolFees.amount, bridgeStep.protocolFees.asset.decimals); + const insufficientAssetAmountInUsd = (0, formatDecimals_1.default)(bridgeStep.protocolFees.feesInUsd, 'value'); // Trick to show the error message on the UI, as the API doesn't handle this // eslint-disable-next-line no-param-reassign route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`; @@ -689,14 +693,14 @@ export class SwapAndBridgeController extends EventEmitter { }); if (alreadySelectedRoute) { routeToSelect = alreadySelectedRoute; - routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs); + routeToSelectSteps = (0, swapAndBridge_1.getQuoteRouteSteps)(alreadySelectedRoute.userTxs); } else { const bestRoute = this.routePriority === 'output' ? routes[0] // API returns highest output first : routes[routes.length - 1]; // API returns fastest... last routeToSelect = bestRoute; - routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs); + routeToSelectSteps = (0, swapAndBridge_1.getQuoteRouteSteps)(bestRoute.userTxs); } this.quote = { fromAsset: quoteResult.fromAsset, @@ -711,7 +715,7 @@ export class SwapAndBridgeController extends EventEmitter { this.quoteRoutesStatuses = quoteResult.bridgeRouteErrors || {}; } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); this.emitError({ error, level: 'major', message }); } }; @@ -761,8 +765,8 @@ export class SwapAndBridgeController extends EventEmitter { return routeResult; } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); - throw new EmittableError({ error, level: 'minor', message }); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); + throw new EmittableError_1.default({ error, level: 'minor', message }); } } async getNextRouteUserTx(activeRouteId) { @@ -771,8 +775,8 @@ export class SwapAndBridgeController extends EventEmitter { return route; } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); - throw new EmittableError({ error, level: 'minor', message }); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); + throw new EmittableError_1.default({ error, level: 'minor', message }); } } async checkForNextUserTxForActiveRoutes() { @@ -793,7 +797,7 @@ export class SwapAndBridgeController extends EventEmitter { }); } catch (e) { - const { message } = getHumanReadableSwapAndBridgeError(e); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(e); this.updateActiveRoute(activeRoute.activeRouteId, { error: message }); return; } @@ -829,7 +833,7 @@ export class SwapAndBridgeController extends EventEmitter { ].includes(this.formStatus)) return; this.quote.selectedRoute = route; - this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs); + this.quote.selectedRouteSteps = (0, swapAndBridge_1.getQuoteRouteSteps)(route.userTxs); this.#emitUpdateIfNeeded(); } async addActiveRoute(activeRoute) { @@ -854,8 +858,8 @@ export class SwapAndBridgeController extends EventEmitter { this.emitUpdate(); } catch (error) { - const { message } = getHumanReadableSwapAndBridgeError(error); - throw new EmittableError({ error, level: 'major', message }); + const { message } = (0, swapAndBridgeErrorHumanizer_1.getHumanReadableSwapAndBridgeError)(error); + throw new EmittableError_1.default({ error, level: 'major', message }); } } updateActiveRoute(activeRouteId, activeRoute, forceUpdateRoute) { @@ -900,7 +904,7 @@ export class SwapAndBridgeController extends EventEmitter { }); } #handleActiveRouteBroadcastedTransaction(fromUserRequestId, opStatus) { - if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) + if (opStatus !== accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed) return; const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId); if (!activeRoute) @@ -908,7 +912,7 @@ export class SwapAndBridgeController extends EventEmitter { this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' }); } #handleActiveRouteBroadcastedApproval(fromUserRequestId, opStatus) { - if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) + if (opStatus !== accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed) return; const activeRoute = this.activeRoutes.find((r) => `${r.activeRouteId}-approval` === fromUserRequestId); if (!activeRoute) @@ -922,13 +926,13 @@ export class SwapAndBridgeController extends EventEmitter { `${r.activeRouteId}-approval` === fromUserRequestId); if (!activeRouteWaitingApproval) return; - if (opStatus === AccountOpStatus.Success) { + if (opStatus === accountOp_1.AccountOpStatus.Success) { this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, { routeStatus: 'ready' }); } - if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) { - const errorMessage = opStatus === AccountOpStatus.Rejected + if (opStatus === accountOp_1.AccountOpStatus.Failure || opStatus === accountOp_1.AccountOpStatus.Rejected) { + const errorMessage = opStatus === accountOp_1.AccountOpStatus.Rejected ? 'The approval was rejected but you can try to sign it again' : 'The approval failed but you can try to sign it again'; this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, { @@ -961,12 +965,12 @@ export class SwapAndBridgeController extends EventEmitter { } if (!shouldUpdateActiveRouteStatus) return; - if (opStatus === AccountOpStatus.Success) { + if (opStatus === accountOp_1.AccountOpStatus.Success) { this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' }); } // If the transaction fails, update the status to "ready" to allow the user to sign it again - if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) { - const errorMessage = opStatus === AccountOpStatus.Rejected + if (opStatus === accountOp_1.AccountOpStatus.Failure || opStatus === accountOp_1.AccountOpStatus.Rejected) { + const errorMessage = opStatus === accountOp_1.AccountOpStatus.Rejected ? 'The transaction was rejected but you can try to sign it again' : 'The transaction failed but you can try to sign it again'; this.updateActiveRoute(activeRoute.activeRouteId, { @@ -991,11 +995,11 @@ export class SwapAndBridgeController extends EventEmitter { get banners() { if (!this.#selectedAccount.account) return []; - const activeRoutesForSelectedAccount = getActiveRoutesForAccount(this.#selectedAccount.account.addr, this.activeRoutes); + const activeRoutesForSelectedAccount = (0, swapAndBridge_1.getActiveRoutesForAccount)(this.#selectedAccount.account.addr, this.activeRoutes); const accountOpActions = this.#actions.visibleActionsQueue.filter(({ type }) => type === 'accountOp'); // Swap banners aren't generated because swaps are completed instantly, // thus the activity banner on broadcast is sufficient - return getBridgeBanners(activeRoutesForSelectedAccount, accountOpActions, this.#networks.networks); + return (0, banners_1.getBridgeBanners)(activeRoutesForSelectedAccount, accountOpActions, this.#networks.networks); } #debounceFunctionCallsOnSameTick(funcName, func) { if (this.#shouldDebounceFlags[funcName]) @@ -1027,4 +1031,5 @@ export class SwapAndBridgeController extends EventEmitter { }; } } +exports.SwapAndBridgeController = SwapAndBridgeController; //# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js.map b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map index d9e564b3a..d7c61f724 100644 --- a/dist/src/controllers/swapAndBridge/swapAndBridge.js.map +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map @@ -1 +1 @@ -{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { formatUnits, isAddress, parseUnits } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n ActiveRoute,\n CachedSupportedChains,\n CachedTokenListKey,\n CachedToTokenLists,\n SocketApiBridgeStep,\n SocketAPIBridgeUserTx,\n SocketAPIQuote,\n SocketAPIRoute,\n SocketAPISendTransactionRequest,\n SocketAPIToken,\n SocketRouteStatus,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport { getBridgeBanners } from '../../libs/banners/banners'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport {\n convertPortfolioTokenToSocketAPIToken,\n getActiveRoutesForAccount,\n getIsBridgeTxn,\n getIsTokenEligibleForSwapAndBridge,\n getQuoteRouteSteps,\n sortPortfolioTokenList,\n sortTokenListResponse\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { normalizeIncomingSocketToken, SocketAPI } from '../../services/socket/api'\nimport { ZERO_ADDRESS } from '../../services/socket/constants'\nimport { validateSendTransferAmount } from '../../services/validations/validate'\nimport formatDecimals from '../../utils/formatDecimals/formatDecimals'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport wait from '../../utils/wait'\nimport { AccountOpAction, ActionsController } from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { NetworksController } from '../networks/networks'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst NETWORK_MISMATCH_MESSAGE =\n 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'\n\nexport enum SwapAndBridgeFormStatus {\n Empty = 'empty',\n Invalid = 'invalid',\n FetchingRoutes = 'fetching-routes',\n NoRoutesFound = 'no-routes-found',\n InvalidRouteSelected = 'invalid-route-selected',\n ReadyToSubmit = 'ready-to-submit'\n}\n\nconst STATUS_WRAPPED_METHODS = {\n addToTokenByAddress: 'INITIAL'\n} as const\n\nconst SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24 // 1 day\nconst TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4 // 4 hours\n\nconst PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [\n 'stargate',\n 'stargate-v2',\n 'arbitrum-bridge',\n 'zksync-native'\n]\n\n/**\n * The Swap and Bridge controller is responsible for managing the state and\n * logic related to swapping and bridging tokens across different networks.\n * Key responsibilities:\n * - Initially setting up the swap and bridge form with the necessary data.\n * - Managing form state for token swap and bridge operations (including user preferences).\n * - Fetching and updating token lists (from and to).\n * - Fetching and updating quotes for token swaps and bridges.\n * - Manages token active routes\n */\nexport class SwapAndBridgeController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #networks: NetworksController\n\n #actions: ActionsController\n\n #activity: ActivityController\n\n #invite: InviteController\n\n #storage: Storage\n\n #socketAPI: SocketAPI\n\n #activeRoutes: ActiveRoute[] = []\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n updateQuoteStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n #updateToTokenListThrottle: {\n time: number\n throttled: boolean\n shouldReset: boolean\n addressToSelect?: string\n } = {\n time: 0,\n shouldReset: true,\n throttled: false\n }\n\n #updateQuoteId?: string\n\n #updateQuoteTimeout?: ReturnType\n\n updateToTokenListStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n sessionIds: string[] = []\n\n fromChainId: number | null = 1\n\n fromSelectedToken: TokenResult | null = null\n\n fromAmount: string = ''\n\n fromAmountInFiat: string = ''\n\n fromAmountFieldMode: 'fiat' | 'token' = 'token'\n\n toChainId: number | null = 1\n\n toSelectedToken: SwapAndBridgeToToken | null = null\n\n quote: SocketAPIQuote | null = null\n\n quoteRoutesStatuses: { [key: string]: { status: string } } = {}\n\n portfolioTokenList: TokenResult[] = []\n\n isTokenListLoading: boolean = false\n\n /**\n * Needed to efficiently manage and cache token lists for different chain\n * combinations (fromChainId and toChainId) without having to fetch them\n * repeatedly from the API. Moreover, this way tokens added to a list by\n * address are also cached for sometime.\n */\n #cachedToTokenLists: CachedToTokenLists = {}\n\n #toTokenList: SwapAndBridgeToToken[] = []\n\n /**\n * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API\n * calls to fetch the supported chains from our service provider.\n */\n #cachedSupportedChains: CachedSupportedChains = { lastFetched: 0, data: [] }\n\n routePriority: 'output' | 'time' = 'output'\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n constructor({\n selectedAccount,\n networks,\n activity,\n socketAPI,\n storage,\n actions,\n invite\n }: {\n selectedAccount: SelectedAccountController\n networks: NetworksController\n activity: ActivityController\n socketAPI: SocketAPI\n storage: Storage\n actions: ActionsController\n invite: InviteController\n }) {\n super()\n this.#selectedAccount = selectedAccount\n this.#networks = networks\n this.#activity = activity\n this.#socketAPI = socketAPI\n this.#storage = storage\n this.#actions = actions\n this.#invite = invite\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#initialLoadPromise = this.#load()\n }\n\n #emitUpdateIfNeeded() {\n const shouldSkipUpdate =\n // No need to emit emit updates if there are no active sessions\n !this.sessionIds.length &&\n // but ALSO there are no active routes (otherwise, banners need the updates)\n !this.activeRoutes.length\n if (shouldSkipUpdate) return\n\n super.emitUpdate()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n\n this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', [])\n\n this.#selectedAccount.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => {\n if (this.#selectedAccount.portfolio.isAllReady) {\n this.isTokenListLoading = false\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n // To token list includes selected account portfolio tokens, it should get an update too\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(false)\n }\n })\n })\n this.#emitUpdateIfNeeded()\n }\n\n // The token in portfolio is the source of truth for the amount, it updates\n // on every balance (pending or anything) change.\n #getFromSelectedTokenInPortfolio = () =>\n this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId &&\n getIsTokenEligibleForSwapAndBridge(t)\n )\n\n get maxFromAmount(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number')\n return '0'\n\n return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals)\n }\n\n get maxFromAmountInFiat(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n) return '0'\n\n const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price\n if (!tokenPrice || !Number(this.maxFromAmount)) return '0'\n\n const maxAmount = getTokenAmount(tokenRef)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n BigInt(maxAmount) * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n tokenRef.decimals + tokenPriceDecimals\n )\n }\n\n get isFormEmpty() {\n return (\n !this.fromChainId ||\n !this.toChainId ||\n !this.fromAmount ||\n !this.fromSelectedToken ||\n !this.toSelectedToken\n )\n }\n\n get formStatus() {\n if (this.isFormEmpty) return SwapAndBridgeFormStatus.Empty\n if (this.validateFromAmount.message) return SwapAndBridgeFormStatus.Invalid\n if (this.updateQuoteStatus !== 'INITIAL' && !this.quote)\n return SwapAndBridgeFormStatus.FetchingRoutes\n if (!this.quote?.selectedRoute) return SwapAndBridgeFormStatus.NoRoutesFound\n\n if (this.quote?.selectedRoute?.errorMessage) return SwapAndBridgeFormStatus.InvalidRouteSelected\n\n return SwapAndBridgeFormStatus.ReadyToSubmit\n }\n\n get validateFromAmount() {\n if (!this.fromSelectedToken) return { success: false, message: '' }\n\n if (\n !this.isFormEmpty &&\n !this.quote &&\n Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')\n ) {\n return {\n success: true,\n message: '🔔 A route was found for this pair but the minimum token amount was not met.'\n }\n }\n\n return validateSendTransferAmount(\n this.fromAmount,\n Number(this.maxFromAmount),\n Number(this.maxFromAmountInFiat),\n this.fromSelectedToken\n )\n }\n\n get activeRoutesInProgress() {\n return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash)\n }\n\n get activeRoutes() {\n return this.#activeRoutes\n }\n\n set activeRoutes(value: ActiveRoute[]) {\n this.#activeRoutes = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('swapAndBridgeActiveRoutes', value)\n }\n\n get isSwitchFromAndToTokensEnabled() {\n if (!this.toSelectedToken) return false\n if (!this.portfolioTokenList.length) return false\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n\n return !!this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )\n }\n\n get shouldEnableRoutesSelection() {\n return (\n !!this.quote &&\n !!this.quote.routes &&\n this.quote.routes.length > 1 &&\n this.updateQuoteStatus !== 'LOADING'\n )\n }\n\n async initForm(sessionId: string) {\n await this.#initialLoadPromise\n\n if (this.sessionIds.includes(sessionId)) return\n\n // reset only if there are no other instances opened/active\n if (!this.sessionIds.length) {\n this.resetForm() // clear prev session form state\n // for each new session remove the completed activeRoutes from the previous session\n this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed')\n // remove activeRoutes errors from the previous session\n this.activeRoutes.forEach((r) => {\n if (r.routeStatus !== 'failed') {\n // eslint-disable-next-line no-param-reassign\n delete r.error\n }\n })\n if (this.activeRoutes.length) {\n // Otherwise there may be an emitUpdate with [] tokens\n this.isTokenListLoading = true\n\n // update the activeRoute.route prop for the new session\n this.activeRoutes.forEach((r) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateActiveRoute(r.activeRouteId, undefined, true)\n })\n }\n }\n\n this.sessionIds.push(sessionId)\n // do not await the health status check to prevent UI freeze while fetching\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#socketAPI.updateHealth()\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n this.isTokenListLoading = false\n // Do not await on purpose as it's not critical for the controller state to be ready\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#fetchSupportedChainsIfNeeded()\n this.#emitUpdateIfNeeded()\n }\n\n get isHealthy() {\n return this.#socketAPI.isHealthy\n }\n\n #fetchSupportedChainsIfNeeded = async () => {\n const shouldNotReFetchSupportedChains =\n this.#cachedSupportedChains.data.length &&\n Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD\n if (shouldNotReFetchSupportedChains) return\n\n try {\n const supportedChainsResponse = await this.#socketAPI.getSupportedChains()\n\n this.#cachedSupportedChains = {\n lastFetched: Date.now(),\n data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled)\n }\n this.#emitUpdateIfNeeded()\n } catch (error: any) {\n // Fail silently, as this is not a critical feature, Swap & Bridge is still usable\n this.emitError({ error, level: 'silent', message: error?.message })\n }\n }\n\n get supportedChainIds(): Network['chainId'][] {\n return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId))\n }\n\n get #toTokenListKey(): CachedTokenListKey | null {\n if (this.fromChainId === null || this.toChainId === null) return null\n\n return `from-${this.fromChainId}-to-${this.toChainId}`\n }\n\n unloadScreen(sessionId: string) {\n this.sessionIds = this.sessionIds.filter((id) => id !== sessionId)\n if (!this.sessionIds.length) {\n this.resetForm(true)\n // Reset health to prevent the error state from briefly flashing\n // before the next health check resolves when the Swap & Bridge\n // screen is opened after a some time\n this.#socketAPI.resetHealth()\n }\n }\n\n updateForm(props: {\n fromAmount?: string\n fromAmountInFiat?: string\n fromAmountFieldMode?: 'fiat' | 'token'\n fromSelectedToken?: TokenResult | null\n toChainId?: bigint | number\n toSelectedToken?: SocketAPIToken | null\n routePriority?: 'output' | 'time'\n }) {\n const {\n fromAmount,\n fromAmountInFiat,\n fromAmountFieldMode,\n fromSelectedToken,\n toChainId,\n toSelectedToken,\n routePriority\n } = props\n\n if (fromAmount !== undefined) {\n this.fromAmount = fromAmount\n ;(() => {\n if (fromAmount === '') {\n this.fromAmountInFiat = ''\n return\n }\n const tokenPrice = this.fromSelectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.fromAmountInFiat = ''\n return\n }\n\n if (\n this.fromAmountFieldMode === 'fiat' &&\n typeof this.fromSelectedToken?.decimals === 'number'\n ) {\n this.fromAmountInFiat = fromAmount\n\n // Get the number of decimals\n const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals)\n\n this.fromAmount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.fromAmountFieldMode === 'token') {\n this.fromAmount = fromAmount\n\n if (!this.fromSelectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(\n fromAmount,\n this.fromSelectedToken.decimals\n )\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.fromAmountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.fromSelectedToken.decimals + tokenPriceDecimals\n )\n }\n })()\n }\n\n if (fromAmountInFiat !== undefined) {\n this.fromAmountInFiat = fromAmountInFiat\n }\n\n if (fromAmountFieldMode) {\n this.fromAmountFieldMode = fromAmountFieldMode\n }\n\n if (fromSelectedToken) {\n const isFromNetworkChanged =\n this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId\n if (isFromNetworkChanged) {\n const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId)\n if (network) {\n this.fromChainId = Number(network.chainId)\n // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update)\n this.toChainId = Number(network.chainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n const shouldResetFromTokenAmount =\n isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address\n if (shouldResetFromTokenAmount) {\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n }\n\n // Always update to reflect portfolio amount (or other props) changes\n this.fromSelectedToken = fromSelectedToken\n }\n\n if (toChainId) {\n if (this.toChainId !== Number(toChainId)) {\n this.toChainId = Number(toChainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n if (toSelectedToken) {\n this.toSelectedToken = toSelectedToken\n }\n\n if (routePriority) {\n this.routePriority = routePriority\n if (this.quote) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n }\n }\n this.updateQuote()\n\n this.#emitUpdateIfNeeded()\n }\n\n resetForm(shouldEmit?: boolean) {\n this.fromChainId = 1\n this.fromSelectedToken = null\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toChainId = 1\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.portfolioTokenList = []\n this.#toTokenList = []\n\n if (shouldEmit) this.#emitUpdateIfNeeded()\n }\n\n updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]) {\n const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge)\n this.portfolioTokenList = sortPortfolioTokenList(\n // Filtering out hidden tokens here means: 1) They won't be displayed in\n // the \"From\" token list (`this.portfolioTokenList`) and 2) They won't be\n // added to the \"Receive\" token list as additional tokens from portfolio,\n // BUT 3) They will appear in the \"Receive\" if they are present in service\n // provider's to token list. This is the desired behavior.\n tokens.filter((t) => !t.flags.isHidden)\n )\n\n const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId\n )\n\n const shouldUpdateFromSelectedToken =\n !this.fromSelectedToken || // initial (default) state\n // May happen if selected account gets changed or the token gets send away in the meantime\n !fromSelectedTokenInNextPortfolio ||\n // May happen if user receives or sends the token in the meantime\n fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount\n\n if (shouldUpdateFromSelectedToken) {\n this.updateForm({\n fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null\n })\n } else {\n this.#emitUpdateIfNeeded()\n }\n }\n\n async updateToTokenList(shouldReset: boolean, addressToSelect?: string) {\n const now = Date.now()\n const timeSinceLastCall = now - this.#updateToTokenListThrottle.time\n if (timeSinceLastCall <= 500) {\n this.#updateToTokenListThrottle.shouldReset = shouldReset\n this.#updateToTokenListThrottle.addressToSelect = addressToSelect\n\n if (!this.#updateToTokenListThrottle.throttled) {\n this.#updateToTokenListThrottle.throttled = true\n await wait(500 - timeSinceLastCall)\n this.#updateToTokenListThrottle.throttled = false\n await this.updateToTokenList(\n this.#updateToTokenListThrottle.shouldReset,\n this.#updateToTokenListThrottle.addressToSelect\n )\n }\n return\n }\n this.updateToTokenListStatus = 'LOADING'\n this.#updateToTokenListThrottle.time = now\n if (!this.fromChainId || !this.toChainId) return\n\n if (shouldReset) {\n this.#toTokenList = []\n this.toSelectedToken = null\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const toTokenListInCache =\n this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]\n let upToDateToTokenList: SocketAPIToken[] = toTokenListInCache?.data || []\n const shouldFetchTokenList =\n !upToDateToTokenList.length ||\n now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD\n if (shouldFetchTokenList) {\n upToDateToTokenList = await this.#socketAPI.getToTokenList({\n fromChainId: this.fromChainId,\n toChainId: this.toChainId\n })\n if (this.#toTokenListKey)\n this.#cachedToTokenLists[this.#toTokenListKey] = {\n lastFetched: now,\n data: upToDateToTokenList\n }\n }\n\n const toTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )\n // should never happen\n if (!toTokenNetwork) throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n\n const additionalTokensFromPortfolio = this.portfolioTokenList\n .filter((t) => t.networkId === toTokenNetwork.id)\n .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address))\n .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId)))\n\n this.#toTokenList = sortTokenListResponse(\n [...upToDateToTokenList, ...additionalTokensFromPortfolio],\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n if (!this.toSelectedToken) {\n if (addressToSelect) {\n const token = this.#toTokenList.find((t) => t.address === addressToSelect)\n if (token) {\n this.updateForm({ toSelectedToken: token })\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n return\n }\n }\n }\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n }\n\n get toTokenList(): SwapAndBridgeToToken[] {\n const isSwapping = this.fromChainId === this.toChainId\n if (isSwapping) {\n // Swaps between same \"from\" and \"to\" tokens are not feasible, filter them out\n return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address)\n }\n\n return this.#toTokenList\n }\n\n async #addToTokenByAddress(address: string) {\n if (!this.toChainId) return // should never happen\n if (!isAddress(address)) return // no need to attempt with invalid addresses\n\n const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address)\n if (isAlreadyInTheList) return\n\n let token: SocketAPIToken | null\n try {\n token = await this.#socketAPI.getToken({ address, chainId: this.toChainId })\n\n if (!token)\n throw new SwapAndBridgeError(\n 'Token with this address is not supported by our service provider.'\n )\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n\n if (this.#toTokenListKey)\n // Cache for sometime the tokens added by address\n this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token)\n\n const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId)\n // should never happen\n if (!toTokenNetwork) {\n const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n throw new EmittableError({ error, level: 'minor', message: error?.message })\n }\n\n const nextTokenList: SwapAndBridgeToToken[] = [...this.#toTokenList, token]\n\n this.#toTokenList = sortTokenListResponse(\n nextTokenList,\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n this.#emitUpdateIfNeeded()\n return token\n }\n\n addToTokenByAddress = async (address: string) =>\n this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true)\n\n async switchFromAndToTokens() {\n if (!this.isSwitchFromAndToTokensEnabled) return\n const currentFromSelectedToken = { ...this.fromSelectedToken }\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n this.fromSelectedToken = this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )!\n this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken\n // Reverses the from and to chain ids, since their format is the same\n ;[this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]\n await this.updateToTokenList(true, currentFromSelectedToken.address)\n }\n\n async updateQuote(\n options: {\n skipQuoteUpdateOnSameValues?: boolean\n skipPreviousQuoteRemoval?: boolean\n skipStatusUpdate?: boolean\n } = {\n skipQuoteUpdateOnSameValues: true,\n skipPreviousQuoteRemoval: false,\n skipStatusUpdate: false\n }\n ) {\n const quoteId = uuidv4()\n this.#updateQuoteId = quoteId\n\n const updateQuoteFunction = async () => {\n if (!this.#selectedAccount.account) return\n if (!this.fromAmount) return\n\n const sanitizedFromAmount = getSanitizedAmount(\n this.fromAmount,\n this.fromSelectedToken!.decimals\n )\n\n const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken!.decimals)\n\n if (this.quote) {\n const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString()\n const isFromNetworkSame = this.quote.fromChainId === this.fromChainId\n const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken!.address\n const isToNetworkSame = this.quote.toChainId === this.toChainId\n const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken!.address\n\n if (\n options.skipQuoteUpdateOnSameValues &&\n isFromAmountSame &&\n isFromNetworkSame &&\n isFromAddressSame &&\n isToNetworkSame &&\n isToAddressSame\n ) {\n return\n }\n }\n if (!options.skipPreviousQuoteRemoval) {\n if (this.quote) this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const quoteResult = await this.#socketAPI.quote({\n fromChainId: this.fromChainId!,\n fromTokenAddress: this.fromSelectedToken!.address,\n toChainId: this.toChainId!,\n toTokenAddress: this.toSelectedToken!.address,\n fromAmount: bigintFromAmount,\n userAddress: this.#selectedAccount.account.addr,\n isSmartAccount: isSmartAccount(this.#selectedAccount.account),\n sort: this.routePriority,\n isOG: this.#invite.isOG\n })\n\n if (quoteId !== this.#updateQuoteId) return\n\n if (\n this.#getIsFormValidToFetchQuote() &&\n quoteResult &&\n quoteResult?.routes?.[0] &&\n quoteResult.fromChainId === this.fromChainId &&\n quoteResult.toChainId === this.toChainId &&\n quoteResult.toAsset.address === this.toSelectedToken?.address\n ) {\n let routeToSelect\n let routeToSelectSteps\n let routes = quoteResult.routes || []\n\n try {\n routes = routes.map((route) => {\n if (!route.userTxs) return route\n\n const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)) as\n | SocketAPIBridgeUserTx\n | undefined\n\n if (!bridgeTx) return route\n\n const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge') as\n | SocketApiBridgeStep\n | undefined\n\n if (!bridgeStep) return route\n if (bridgeStep.protocolFees.amount === '0') return route\n\n const normalizedProtocolFeeToken = normalizeIncomingSocketToken(\n bridgeStep.protocolFees.asset\n )\n const doesProtocolRequireExtraContractFeeInNative =\n PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) &&\n // When other tokens than the native ones are being bridged,\n // Socket API takes the fee directly from the \"From\" amount.\n normalizedProtocolFeeToken.address === ZERO_ADDRESS\n if (!doesProtocolRequireExtraContractFeeInNative) return route\n\n const protocolFeeTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId\n )!\n const isTokenToPayFeeWithTheSameAsFromToken =\n this.fromSelectedToken?.address === normalizedProtocolFeeToken.address &&\n this.fromChainId === normalizedProtocolFeeToken.chainId\n\n const tokenToPayFeeWith = this.portfolioTokenList.find((t) => {\n return (\n t.address === normalizedProtocolFeeToken.address &&\n t.networkId === protocolFeeTokenNetwork.id\n )\n })\n\n const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals\n const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? tokenToPayFeeWith.decimals\n : protocolFeeTokenDecimals\n const fromAmountNumber = Number(this.fromAmount)\n const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(\n Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)\n )\n\n const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals\n tokenToPayFeeWith.amount *\n BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals))\n : BigInt(0)\n\n const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals =\n isTokenToPayFeeWithTheSameAsFromToken\n ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals -\n fromAmountScaledToTokenToPayFeeWithDecimals\n : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals\n\n const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(\n Math.round(\n Number(bridgeStep.protocolFees.amount) *\n 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals)\n )\n )\n const hasEnoughAmountToPayFee =\n availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >=\n protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals\n\n if (!hasEnoughAmountToPayFee) {\n const protocolName = bridgeStep.protocol.displayName\n const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol\n const insufficientTokenNetwork = protocolFeeTokenNetwork.name\n const insufficientAssetAmount = formatUnits(\n bridgeStep.protocolFees.amount,\n bridgeStep.protocolFees.asset.decimals\n )\n const insufficientAssetAmountInUsd = formatDecimals(\n bridgeStep.protocolFees.feesInUsd,\n 'value'\n )\n\n // Trick to show the error message on the UI, as the API doesn't handle this\n // eslint-disable-next-line no-param-reassign\n route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`\n }\n\n return route\n })\n\n routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage))\n } catch (error) {\n // if the filtration fails for some reason continue with the original routes\n // array without interrupting the rest of the logic\n console.error(error)\n }\n\n if (!routes.length) {\n this.quote = null\n return\n }\n\n const alreadySelectedRoute = routes.find((nextRoute) => {\n if (!this.quote) return false\n\n // Because we only have routes with unique bridges (bridging case)\n const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]\n if (selectedRouteUsedBridge)\n return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge\n\n // Assuming to only have routes with unique DEXes (swapping case)\n const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName\n if (selectedRouteUsedDex) return nextRoute.usedDexName === selectedRouteUsedDex\n\n return false // should never happen, but just in case of bad data\n })\n\n if (alreadySelectedRoute) {\n routeToSelect = alreadySelectedRoute\n routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs)\n } else {\n const bestRoute =\n this.routePriority === 'output'\n ? routes[0] // API returns highest output first\n : routes[routes.length - 1] // API returns fastest... last\n routeToSelect = bestRoute\n routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs)\n }\n\n this.quote = {\n fromAsset: quoteResult.fromAsset,\n fromChainId: quoteResult.fromChainId,\n toAsset: quoteResult.toAsset,\n toChainId: quoteResult.toChainId,\n selectedRoute: routeToSelect,\n selectedRouteSteps: routeToSelectSteps,\n routes\n }\n }\n this.quoteRoutesStatuses = (quoteResult as any).bridgeRouteErrors || {}\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n }\n\n if (!this.#getIsFormValidToFetchQuote()) {\n if (this.quote || this.quoteRoutesStatuses) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n return\n }\n\n let nextTimeout = 400 // timeout when there is no pending quote update\n if (this.#updateQuoteTimeout) {\n nextTimeout = 1000 // timeout when there is a pending quote update\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }\n\n if (!options.skipStatusUpdate && !this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n this.#updateQuoteTimeout = setTimeout(async () => {\n if (!options.skipStatusUpdate && !!this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n await updateQuoteFunction()\n\n if (quoteId !== this.#updateQuoteId) return\n\n this.updateQuoteStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }, nextTimeout)\n }\n\n async getRouteStartUserTx() {\n if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) return\n\n try {\n const routeResult = await this.#socketAPI.startRoute({\n fromChainId: this.quote!.fromChainId,\n fromAssetAddress: this.quote!.fromAsset.address,\n toChainId: this.quote!.toChainId,\n toAssetAddress: this.quote!.toAsset.address,\n route: this.quote!.selectedRoute\n })\n\n return routeResult\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async getNextRouteUserTx(activeRouteId: number) {\n try {\n const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId)\n return route\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async checkForNextUserTxForActiveRoutes() {\n await this.#initialLoadPromise\n const fetchAndUpdateRoute = async (activeRoute: ActiveRoute) => {\n let status: SocketRouteStatus = null\n const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) =>\n op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)\n )\n\n // call getRouteStatus only after the transaction has processed\n if (broadcastedButNotConfirmed) return\n if (activeRoute.routeStatus === 'completed') return\n\n try {\n status = await this.#socketAPI.getRouteStatus({\n activeRouteId: activeRoute.activeRouteId,\n userTxIndex: activeRoute.userTxIndex,\n txHash: activeRoute.userTxHash!\n })\n } catch (e: any) {\n const { message } = getHumanReadableSwapAndBridgeError(e)\n this.updateActiveRoute(activeRoute.activeRouteId, { error: message })\n return\n }\n\n const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId)\n if (route?.error) {\n this.updateActiveRoute(activeRoute.activeRouteId, {\n error: undefined\n })\n }\n\n if (status === 'completed') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'completed',\n error: undefined\n },\n true\n )\n } else if (status === 'ready') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'ready',\n error: undefined\n },\n true\n )\n }\n }\n\n await Promise.all(\n this.activeRoutesInProgress.map(async (route) => {\n await fetchAndUpdateRoute(route)\n })\n )\n }\n\n selectRoute(route: SocketAPIRoute) {\n if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) return\n if (\n ![\n SwapAndBridgeFormStatus.ReadyToSubmit,\n SwapAndBridgeFormStatus.InvalidRouteSelected\n ].includes(this.formStatus)\n )\n return\n\n this.quote.selectedRoute = route\n this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs)\n\n this.#emitUpdateIfNeeded()\n }\n\n async addActiveRoute(activeRoute: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n }) {\n await this.#initialLoadPromise\n\n try {\n const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId)\n this.activeRoutes.push({\n ...activeRoute,\n routeStatus: 'ready',\n userTxHash: null,\n route\n })\n\n // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion.\n // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId,\n // while resetting all other state related to the form.\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n\n this.emitUpdate()\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'major', message })\n }\n }\n\n updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId'],\n activeRoute?: Partial,\n forceUpdateRoute?: boolean\n ) {\n const currentActiveRoutes = [...this.activeRoutes]\n const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId)\n\n if (activeRouteIndex !== -1) {\n if (forceUpdateRoute) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n let route = currentActiveRoutes[activeRouteIndex].route\n route = await this.#socketAPI.updateActiveRoute(activeRouteId)\n this.updateActiveRoute(activeRouteId, { route })\n })()\n }\n\n if (activeRoute) {\n currentActiveRoutes[activeRouteIndex] = {\n ...currentActiveRoutes[activeRouteIndex],\n ...activeRoute\n }\n } else {\n currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }\n }\n this.activeRoutes = currentActiveRoutes\n\n this.#emitUpdateIfNeeded()\n }\n }\n\n removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId)\n\n // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners\n this.emitUpdate()\n }\n\n // update active route if needed on SubmittedAccountOp update\n handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp) {\n op.calls.forEach((call) => {\n this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status)\n this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status)\n this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status)\n this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId)\n this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status)\n })\n }\n\n #handleActiveRouteBroadcastedTransaction(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' })\n }\n\n #handleActiveRouteBroadcastedApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find(\n (r) => `${r.activeRouteId}-approval` === fromUserRequestId\n )\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'waiting-approval-to-resolve'\n })\n }\n\n #handleActiveRoutesWithReadyApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRouteWaitingApproval = this.activeRoutes.find(\n (r) =>\n r.routeStatus === 'waiting-approval-to-resolve' &&\n `${r.activeRouteId}-approval` === fromUserRequestId\n )\n\n if (!activeRouteWaitingApproval) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready'\n })\n }\n\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The approval was rejected but you can try to sign it again'\n : 'The approval failed but you can try to sign it again'\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n #handleUpdateActiveRoutesUserTxId(\n fromUserRequestId: Call['fromUserRequestId'],\n opTxnId: SubmittedAccountOp['txnId']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n if (opTxnId && !activeRoute.userTxHash) {\n this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId })\n }\n }\n\n #handleActiveRoutesCompleted(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n let shouldUpdateActiveRouteStatus = false\n if (activeRoute.route.fromChainId === activeRoute.route.toChainId)\n shouldUpdateActiveRouteStatus = true\n\n if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) {\n const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]\n if (!tx) return\n\n if (tx.userTxType === 'dex-swap') shouldUpdateActiveRouteStatus = true\n }\n\n if (!shouldUpdateActiveRouteStatus) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' })\n }\n\n // If the transaction fails, update the status to \"ready\" to allow the user to sign it again\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The transaction was rejected but you can try to sign it again'\n : 'The transaction failed but you can try to sign it again'\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n onAccountChange() {\n this.portfolioTokenList = []\n this.isTokenListLoading = true\n\n this.#emitUpdateIfNeeded()\n }\n\n #getIsFormValidToFetchQuote() {\n return (\n this.fromChainId &&\n this.toChainId &&\n this.fromAmount &&\n this.fromSelectedToken &&\n this.toSelectedToken &&\n this.validateFromAmount.success\n )\n }\n\n get banners() {\n if (!this.#selectedAccount.account) return []\n\n const activeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.#selectedAccount.account.addr,\n this.activeRoutes\n )\n const accountOpActions = this.#actions.visibleActionsQueue.filter(\n ({ type }) => type === 'accountOp'\n ) as AccountOpAction[]\n\n // Swap banners aren't generated because swaps are completed instantly,\n // thus the activity banner on broadcast is sufficient\n return getBridgeBanners(\n activeRoutesForSelectedAccount,\n accountOpActions,\n this.#networks.networks\n )\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: Function) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n func()\n }, 0)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n toTokenList: this.toTokenList,\n maxFromAmount: this.maxFromAmount,\n maxFromAmountInFiat: this.maxFromAmountInFiat,\n validateFromAmount: this.validateFromAmount,\n isFormEmpty: this.isFormEmpty,\n formStatus: this.formStatus,\n activeRoutesInProgress: this.activeRoutesInProgress,\n activeRoutes: this.activeRoutes,\n isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled,\n banners: this.banners,\n isHealthy: this.isHealthy,\n shouldEnableRoutesSelection: this.shouldEnableRoutesSelection,\n supportedChainIds: this.supportedChainIds\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { formatUnits, isAddress, parseUnits } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n ActiveRoute,\n CachedSupportedChains,\n CachedTokenListKey,\n CachedToTokenLists,\n SocketApiBridgeStep,\n SocketAPIBridgeUserTx,\n SocketAPIQuote,\n SocketAPIRoute,\n SocketAPISendTransactionRequest,\n SocketAPIToken,\n SocketRouteStatus,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport { getBridgeBanners } from '../../libs/banners/banners'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport {\n convertPortfolioTokenToSocketAPIToken,\n getActiveRoutesForAccount,\n getIsBridgeTxn,\n getIsTokenEligibleForSwapAndBridge,\n getQuoteRouteSteps,\n sortPortfolioTokenList,\n sortTokenListResponse\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { normalizeIncomingSocketToken, SocketAPI } from '../../services/socket/api'\nimport { ZERO_ADDRESS } from '../../services/socket/constants'\nimport { validateSendTransferAmount } from '../../services/validations/validate'\nimport formatDecimals from '../../utils/formatDecimals/formatDecimals'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport wait from '../../utils/wait'\nimport { AccountOpAction, ActionsController } from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { NetworksController } from '../networks/networks'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst NETWORK_MISMATCH_MESSAGE =\n 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'\n\nexport enum SwapAndBridgeFormStatus {\n Empty = 'empty',\n Invalid = 'invalid',\n FetchingRoutes = 'fetching-routes',\n NoRoutesFound = 'no-routes-found',\n InvalidRouteSelected = 'invalid-route-selected',\n ReadyToSubmit = 'ready-to-submit'\n}\n\nconst STATUS_WRAPPED_METHODS = {\n addToTokenByAddress: 'INITIAL'\n} as const\n\nconst SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24 // 1 day\nconst TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4 // 4 hours\n\nconst PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [\n 'stargate',\n 'stargate-v2',\n 'arbitrum-bridge',\n 'zksync-native'\n]\n\n/**\n * The Swap and Bridge controller is responsible for managing the state and\n * logic related to swapping and bridging tokens across different networks.\n * Key responsibilities:\n * - Initially setting up the swap and bridge form with the necessary data.\n * - Managing form state for token swap and bridge operations (including user preferences).\n * - Fetching and updating token lists (from and to).\n * - Fetching and updating quotes for token swaps and bridges.\n * - Manages token active routes\n */\nexport class SwapAndBridgeController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #networks: NetworksController\n\n #actions: ActionsController\n\n #activity: ActivityController\n\n #invite: InviteController\n\n #storage: Storage\n\n #socketAPI: SocketAPI\n\n #activeRoutes: ActiveRoute[] = []\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n updateQuoteStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n #updateToTokenListThrottle: {\n time: number\n throttled: boolean\n shouldReset: boolean\n addressToSelect?: string\n } = {\n time: 0,\n shouldReset: true,\n throttled: false\n }\n\n #updateQuoteId?: string\n\n #updateQuoteTimeout?: ReturnType\n\n updateToTokenListStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n sessionIds: string[] = []\n\n fromChainId: number | null = 1\n\n fromSelectedToken: TokenResult | null = null\n\n fromAmount: string = ''\n\n fromAmountInFiat: string = ''\n\n fromAmountFieldMode: 'fiat' | 'token' = 'token'\n\n toChainId: number | null = 1\n\n toSelectedToken: SwapAndBridgeToToken | null = null\n\n quote: SocketAPIQuote | null = null\n\n quoteRoutesStatuses: { [key: string]: { status: string } } = {}\n\n portfolioTokenList: TokenResult[] = []\n\n isTokenListLoading: boolean = false\n\n /**\n * Needed to efficiently manage and cache token lists for different chain\n * combinations (fromChainId and toChainId) without having to fetch them\n * repeatedly from the API. Moreover, this way tokens added to a list by\n * address are also cached for sometime.\n */\n #cachedToTokenLists: CachedToTokenLists = {}\n\n #toTokenList: SwapAndBridgeToToken[] = []\n\n /**\n * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API\n * calls to fetch the supported chains from our service provider.\n */\n #cachedSupportedChains: CachedSupportedChains = { lastFetched: 0, data: [] }\n\n routePriority: 'output' | 'time' = 'output'\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n constructor({\n selectedAccount,\n networks,\n activity,\n socketAPI,\n storage,\n actions,\n invite\n }: {\n selectedAccount: SelectedAccountController\n networks: NetworksController\n activity: ActivityController\n socketAPI: SocketAPI\n storage: Storage\n actions: ActionsController\n invite: InviteController\n }) {\n super()\n this.#selectedAccount = selectedAccount\n this.#networks = networks\n this.#activity = activity\n this.#socketAPI = socketAPI\n this.#storage = storage\n this.#actions = actions\n this.#invite = invite\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#initialLoadPromise = this.#load()\n }\n\n #emitUpdateIfNeeded() {\n const shouldSkipUpdate =\n // No need to emit emit updates if there are no active sessions\n !this.sessionIds.length &&\n // but ALSO there are no active routes (otherwise, banners need the updates)\n !this.activeRoutes.length\n if (shouldSkipUpdate) return\n\n super.emitUpdate()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n\n this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', [])\n\n this.#selectedAccount.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => {\n if (this.#selectedAccount.portfolio.isAllReady) {\n this.isTokenListLoading = false\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n // To token list includes selected account portfolio tokens, it should get an update too\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(false)\n }\n })\n })\n this.#emitUpdateIfNeeded()\n }\n\n // The token in portfolio is the source of truth for the amount, it updates\n // on every balance (pending or anything) change.\n #getFromSelectedTokenInPortfolio = () =>\n this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId &&\n getIsTokenEligibleForSwapAndBridge(t)\n )\n\n get maxFromAmount(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number')\n return '0'\n\n return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals)\n }\n\n get maxFromAmountInFiat(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n) return '0'\n\n const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price\n if (!tokenPrice || !Number(this.maxFromAmount)) return '0'\n\n const maxAmount = getTokenAmount(tokenRef)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n BigInt(maxAmount) * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n tokenRef.decimals + tokenPriceDecimals\n )\n }\n\n get isFormEmpty() {\n return (\n !this.fromChainId ||\n !this.toChainId ||\n !this.fromAmount ||\n !this.fromSelectedToken ||\n !this.toSelectedToken\n )\n }\n\n get formStatus() {\n if (this.isFormEmpty) return SwapAndBridgeFormStatus.Empty\n if (this.validateFromAmount.message) return SwapAndBridgeFormStatus.Invalid\n if (this.updateQuoteStatus !== 'INITIAL' && !this.quote)\n return SwapAndBridgeFormStatus.FetchingRoutes\n if (!this.quote?.selectedRoute) return SwapAndBridgeFormStatus.NoRoutesFound\n\n if (this.quote?.selectedRoute?.errorMessage) return SwapAndBridgeFormStatus.InvalidRouteSelected\n\n return SwapAndBridgeFormStatus.ReadyToSubmit\n }\n\n get validateFromAmount() {\n if (!this.fromSelectedToken) return { success: false, message: '' }\n\n if (\n !this.isFormEmpty &&\n !this.quote &&\n Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')\n ) {\n return {\n success: true,\n message: '🔔 A route was found for this pair but the minimum token amount was not met.'\n }\n }\n\n return validateSendTransferAmount(\n this.fromAmount,\n Number(this.maxFromAmount),\n Number(this.maxFromAmountInFiat),\n this.fromSelectedToken\n )\n }\n\n get activeRoutesInProgress() {\n return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash)\n }\n\n get activeRoutes() {\n return this.#activeRoutes\n }\n\n set activeRoutes(value: ActiveRoute[]) {\n this.#activeRoutes = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('swapAndBridgeActiveRoutes', value)\n }\n\n get isSwitchFromAndToTokensEnabled() {\n if (!this.toSelectedToken) return false\n if (!this.portfolioTokenList.length) return false\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n\n return !!this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )\n }\n\n get shouldEnableRoutesSelection() {\n return (\n !!this.quote &&\n !!this.quote.routes &&\n this.quote.routes.length > 1 &&\n this.updateQuoteStatus !== 'LOADING'\n )\n }\n\n async initForm(sessionId: string) {\n await this.#initialLoadPromise\n\n if (this.sessionIds.includes(sessionId)) return\n\n // reset only if there are no other instances opened/active\n if (!this.sessionIds.length) {\n this.resetForm() // clear prev session form state\n // for each new session remove the completed activeRoutes from the previous session\n this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed')\n // remove activeRoutes errors from the previous session\n this.activeRoutes.forEach((r) => {\n if (r.routeStatus !== 'failed') {\n // eslint-disable-next-line no-param-reassign\n delete r.error\n }\n })\n if (this.activeRoutes.length) {\n // Otherwise there may be an emitUpdate with [] tokens\n this.isTokenListLoading = true\n\n // update the activeRoute.route prop for the new session\n this.activeRoutes.forEach((r) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateActiveRoute(r.activeRouteId, undefined, true)\n })\n }\n }\n\n this.sessionIds.push(sessionId)\n // do not await the health status check to prevent UI freeze while fetching\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#socketAPI.updateHealth()\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n this.isTokenListLoading = false\n // Do not await on purpose as it's not critical for the controller state to be ready\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#fetchSupportedChainsIfNeeded()\n this.#emitUpdateIfNeeded()\n }\n\n get isHealthy() {\n return this.#socketAPI.isHealthy\n }\n\n #fetchSupportedChainsIfNeeded = async () => {\n const shouldNotReFetchSupportedChains =\n this.#cachedSupportedChains.data.length &&\n Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD\n if (shouldNotReFetchSupportedChains) return\n\n try {\n const supportedChainsResponse = await this.#socketAPI.getSupportedChains()\n\n this.#cachedSupportedChains = {\n lastFetched: Date.now(),\n data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled)\n }\n this.#emitUpdateIfNeeded()\n } catch (error: any) {\n // Fail silently, as this is not a critical feature, Swap & Bridge is still usable\n this.emitError({ error, level: 'silent', message: error?.message })\n }\n }\n\n get supportedChainIds(): Network['chainId'][] {\n return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId))\n }\n\n get #toTokenListKey(): CachedTokenListKey | null {\n if (this.fromChainId === null || this.toChainId === null) return null\n\n return `from-${this.fromChainId}-to-${this.toChainId}`\n }\n\n unloadScreen(sessionId: string) {\n this.sessionIds = this.sessionIds.filter((id) => id !== sessionId)\n if (!this.sessionIds.length) {\n this.resetForm(true)\n // Reset health to prevent the error state from briefly flashing\n // before the next health check resolves when the Swap & Bridge\n // screen is opened after a some time\n this.#socketAPI.resetHealth()\n }\n }\n\n updateForm(props: {\n fromAmount?: string\n fromAmountInFiat?: string\n fromAmountFieldMode?: 'fiat' | 'token'\n fromSelectedToken?: TokenResult | null\n toChainId?: bigint | number\n toSelectedToken?: SocketAPIToken | null\n routePriority?: 'output' | 'time'\n }) {\n const {\n fromAmount,\n fromAmountInFiat,\n fromAmountFieldMode,\n fromSelectedToken,\n toChainId,\n toSelectedToken,\n routePriority\n } = props\n\n if (fromAmount !== undefined) {\n this.fromAmount = fromAmount\n ;(() => {\n if (fromAmount === '') {\n this.fromAmountInFiat = ''\n return\n }\n const tokenPrice = this.fromSelectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.fromAmountInFiat = ''\n return\n }\n\n if (\n this.fromAmountFieldMode === 'fiat' &&\n typeof this.fromSelectedToken?.decimals === 'number'\n ) {\n this.fromAmountInFiat = fromAmount\n\n // Get the number of decimals\n const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals)\n\n this.fromAmount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.fromAmountFieldMode === 'token') {\n this.fromAmount = fromAmount\n\n if (!this.fromSelectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(\n fromAmount,\n this.fromSelectedToken.decimals\n )\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.fromAmountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.fromSelectedToken.decimals + tokenPriceDecimals\n )\n }\n })()\n }\n\n if (fromAmountInFiat !== undefined) {\n this.fromAmountInFiat = fromAmountInFiat\n }\n\n if (fromAmountFieldMode) {\n this.fromAmountFieldMode = fromAmountFieldMode\n }\n\n if (fromSelectedToken) {\n const isFromNetworkChanged =\n this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId\n if (isFromNetworkChanged) {\n const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId)\n if (network) {\n this.fromChainId = Number(network.chainId)\n // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update)\n this.toChainId = Number(network.chainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n const shouldResetFromTokenAmount =\n isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address\n if (shouldResetFromTokenAmount) {\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n }\n\n // Always update to reflect portfolio amount (or other props) changes\n this.fromSelectedToken = fromSelectedToken\n }\n\n if (toChainId) {\n if (this.toChainId !== Number(toChainId)) {\n this.toChainId = Number(toChainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n if (toSelectedToken) {\n this.toSelectedToken = toSelectedToken\n }\n\n if (routePriority) {\n this.routePriority = routePriority\n if (this.quote) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n }\n }\n this.updateQuote()\n\n this.#emitUpdateIfNeeded()\n }\n\n resetForm(shouldEmit?: boolean) {\n this.fromChainId = 1\n this.fromSelectedToken = null\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toChainId = 1\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.portfolioTokenList = []\n this.#toTokenList = []\n\n if (shouldEmit) this.#emitUpdateIfNeeded()\n }\n\n updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]) {\n const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge)\n this.portfolioTokenList = sortPortfolioTokenList(\n // Filtering out hidden tokens here means: 1) They won't be displayed in\n // the \"From\" token list (`this.portfolioTokenList`) and 2) They won't be\n // added to the \"Receive\" token list as additional tokens from portfolio,\n // BUT 3) They will appear in the \"Receive\" if they are present in service\n // provider's to token list. This is the desired behavior.\n tokens.filter((t) => !t.flags.isHidden)\n )\n\n const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId\n )\n\n const shouldUpdateFromSelectedToken =\n !this.fromSelectedToken || // initial (default) state\n // May happen if selected account gets changed or the token gets send away in the meantime\n !fromSelectedTokenInNextPortfolio ||\n // May happen if user receives or sends the token in the meantime\n fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount\n\n if (shouldUpdateFromSelectedToken) {\n this.updateForm({\n fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null\n })\n } else {\n this.#emitUpdateIfNeeded()\n }\n }\n\n async updateToTokenList(shouldReset: boolean, addressToSelect?: string) {\n const now = Date.now()\n const timeSinceLastCall = now - this.#updateToTokenListThrottle.time\n if (timeSinceLastCall <= 500) {\n this.#updateToTokenListThrottle.shouldReset = shouldReset\n this.#updateToTokenListThrottle.addressToSelect = addressToSelect\n\n if (!this.#updateToTokenListThrottle.throttled) {\n this.#updateToTokenListThrottle.throttled = true\n await wait(500 - timeSinceLastCall)\n this.#updateToTokenListThrottle.throttled = false\n await this.updateToTokenList(\n this.#updateToTokenListThrottle.shouldReset,\n this.#updateToTokenListThrottle.addressToSelect\n )\n }\n return\n }\n this.updateToTokenListStatus = 'LOADING'\n this.#updateToTokenListThrottle.time = now\n if (!this.fromChainId || !this.toChainId) return\n\n if (shouldReset) {\n this.#toTokenList = []\n this.toSelectedToken = null\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const toTokenListInCache =\n this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]\n let upToDateToTokenList: SocketAPIToken[] = toTokenListInCache?.data || []\n const shouldFetchTokenList =\n !upToDateToTokenList.length ||\n now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD\n if (shouldFetchTokenList) {\n upToDateToTokenList = await this.#socketAPI.getToTokenList({\n fromChainId: this.fromChainId,\n toChainId: this.toChainId\n })\n if (this.#toTokenListKey)\n this.#cachedToTokenLists[this.#toTokenListKey] = {\n lastFetched: now,\n data: upToDateToTokenList\n }\n }\n\n const toTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )\n // should never happen\n if (!toTokenNetwork) throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n\n const additionalTokensFromPortfolio = this.portfolioTokenList\n .filter((t) => t.networkId === toTokenNetwork.id)\n .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address))\n .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId)))\n\n this.#toTokenList = sortTokenListResponse(\n [...upToDateToTokenList, ...additionalTokensFromPortfolio],\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n if (!this.toSelectedToken) {\n if (addressToSelect) {\n const token = this.#toTokenList.find((t) => t.address === addressToSelect)\n if (token) {\n this.updateForm({ toSelectedToken: token })\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n return\n }\n }\n }\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n }\n\n get toTokenList(): SwapAndBridgeToToken[] {\n const isSwapping = this.fromChainId === this.toChainId\n if (isSwapping) {\n // Swaps between same \"from\" and \"to\" tokens are not feasible, filter them out\n return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address)\n }\n\n return this.#toTokenList\n }\n\n async #addToTokenByAddress(address: string) {\n if (!this.toChainId) return // should never happen\n if (!isAddress(address)) return // no need to attempt with invalid addresses\n\n const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address)\n if (isAlreadyInTheList) return\n\n let token: SocketAPIToken | null\n try {\n token = await this.#socketAPI.getToken({ address, chainId: this.toChainId })\n\n if (!token)\n throw new SwapAndBridgeError(\n 'Token with this address is not supported by our service provider.'\n )\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n\n if (this.#toTokenListKey)\n // Cache for sometime the tokens added by address\n this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token)\n\n const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId)\n // should never happen\n if (!toTokenNetwork) {\n const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n throw new EmittableError({ error, level: 'minor', message: error?.message })\n }\n\n const nextTokenList: SwapAndBridgeToToken[] = [...this.#toTokenList, token]\n\n this.#toTokenList = sortTokenListResponse(\n nextTokenList,\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n this.#emitUpdateIfNeeded()\n return token\n }\n\n addToTokenByAddress = async (address: string) =>\n this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true)\n\n async switchFromAndToTokens() {\n if (!this.isSwitchFromAndToTokensEnabled) return\n const currentFromSelectedToken = { ...this.fromSelectedToken }\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n this.fromSelectedToken = this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )!\n this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken\n // Reverses the from and to chain ids, since their format is the same\n ;[this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]\n await this.updateToTokenList(true, currentFromSelectedToken.address)\n }\n\n async updateQuote(\n options: {\n skipQuoteUpdateOnSameValues?: boolean\n skipPreviousQuoteRemoval?: boolean\n skipStatusUpdate?: boolean\n } = {\n skipQuoteUpdateOnSameValues: true,\n skipPreviousQuoteRemoval: false,\n skipStatusUpdate: false\n }\n ) {\n const quoteId = uuidv4()\n this.#updateQuoteId = quoteId\n\n const updateQuoteFunction = async () => {\n if (!this.#selectedAccount.account) return\n if (!this.fromAmount) return\n\n const sanitizedFromAmount = getSanitizedAmount(\n this.fromAmount,\n this.fromSelectedToken!.decimals\n )\n\n const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken!.decimals)\n\n if (this.quote) {\n const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString()\n const isFromNetworkSame = this.quote.fromChainId === this.fromChainId\n const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken!.address\n const isToNetworkSame = this.quote.toChainId === this.toChainId\n const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken!.address\n\n if (\n options.skipQuoteUpdateOnSameValues &&\n isFromAmountSame &&\n isFromNetworkSame &&\n isFromAddressSame &&\n isToNetworkSame &&\n isToAddressSame\n ) {\n return\n }\n }\n if (!options.skipPreviousQuoteRemoval) {\n if (this.quote) this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const quoteResult = await this.#socketAPI.quote({\n fromChainId: this.fromChainId!,\n fromTokenAddress: this.fromSelectedToken!.address,\n toChainId: this.toChainId!,\n toTokenAddress: this.toSelectedToken!.address,\n fromAmount: bigintFromAmount,\n userAddress: this.#selectedAccount.account.addr,\n isSmartAccount: isSmartAccount(this.#selectedAccount.account),\n sort: this.routePriority,\n isOG: this.#invite.isOG\n })\n\n if (quoteId !== this.#updateQuoteId) return\n\n if (\n this.#getIsFormValidToFetchQuote() &&\n quoteResult &&\n quoteResult?.routes?.[0] &&\n quoteResult.fromChainId === this.fromChainId &&\n quoteResult.toChainId === this.toChainId &&\n quoteResult.toAsset.address === this.toSelectedToken?.address\n ) {\n let routeToSelect\n let routeToSelectSteps\n let routes = quoteResult.routes || []\n\n try {\n routes = routes.map((route) => {\n if (!route.userTxs) return route\n\n const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)) as\n | SocketAPIBridgeUserTx\n | undefined\n\n if (!bridgeTx) return route\n\n const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge') as\n | SocketApiBridgeStep\n | undefined\n\n if (!bridgeStep) return route\n if (bridgeStep.protocolFees.amount === '0') return route\n\n const normalizedProtocolFeeToken = normalizeIncomingSocketToken(\n bridgeStep.protocolFees.asset\n )\n const doesProtocolRequireExtraContractFeeInNative =\n PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) &&\n // When other tokens than the native ones are being bridged,\n // Socket API takes the fee directly from the \"From\" amount.\n normalizedProtocolFeeToken.address === ZERO_ADDRESS\n if (!doesProtocolRequireExtraContractFeeInNative) return route\n\n const protocolFeeTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId\n )!\n const isTokenToPayFeeWithTheSameAsFromToken =\n this.fromSelectedToken?.address === normalizedProtocolFeeToken.address &&\n this.fromChainId === normalizedProtocolFeeToken.chainId\n\n const tokenToPayFeeWith = this.portfolioTokenList.find((t) => {\n return (\n t.address === normalizedProtocolFeeToken.address &&\n t.networkId === protocolFeeTokenNetwork.id\n )\n })\n\n const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals\n const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? tokenToPayFeeWith.decimals\n : protocolFeeTokenDecimals\n const fromAmountNumber = Number(this.fromAmount)\n const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(\n Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)\n )\n\n const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals\n tokenToPayFeeWith.amount *\n BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals))\n : BigInt(0)\n\n const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals =\n isTokenToPayFeeWithTheSameAsFromToken\n ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals -\n fromAmountScaledToTokenToPayFeeWithDecimals\n : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals\n\n const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(\n Math.round(\n Number(bridgeStep.protocolFees.amount) *\n 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals)\n )\n )\n const hasEnoughAmountToPayFee =\n availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >=\n protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals\n\n if (!hasEnoughAmountToPayFee) {\n const protocolName = bridgeStep.protocol.displayName\n const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol\n const insufficientTokenNetwork = protocolFeeTokenNetwork.name\n const insufficientAssetAmount = formatUnits(\n bridgeStep.protocolFees.amount,\n bridgeStep.protocolFees.asset.decimals\n )\n const insufficientAssetAmountInUsd = formatDecimals(\n bridgeStep.protocolFees.feesInUsd,\n 'value'\n )\n\n // Trick to show the error message on the UI, as the API doesn't handle this\n // eslint-disable-next-line no-param-reassign\n route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`\n }\n\n return route\n })\n\n routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage))\n } catch (error) {\n // if the filtration fails for some reason continue with the original routes\n // array without interrupting the rest of the logic\n console.error(error)\n }\n\n if (!routes.length) {\n this.quote = null\n return\n }\n\n const alreadySelectedRoute = routes.find((nextRoute) => {\n if (!this.quote) return false\n\n // Because we only have routes with unique bridges (bridging case)\n const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]\n if (selectedRouteUsedBridge)\n return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge\n\n // Assuming to only have routes with unique DEXes (swapping case)\n const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName\n if (selectedRouteUsedDex) return nextRoute.usedDexName === selectedRouteUsedDex\n\n return false // should never happen, but just in case of bad data\n })\n\n if (alreadySelectedRoute) {\n routeToSelect = alreadySelectedRoute\n routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs)\n } else {\n const bestRoute =\n this.routePriority === 'output'\n ? routes[0] // API returns highest output first\n : routes[routes.length - 1] // API returns fastest... last\n routeToSelect = bestRoute\n routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs)\n }\n\n this.quote = {\n fromAsset: quoteResult.fromAsset,\n fromChainId: quoteResult.fromChainId,\n toAsset: quoteResult.toAsset,\n toChainId: quoteResult.toChainId,\n selectedRoute: routeToSelect,\n selectedRouteSteps: routeToSelectSteps,\n routes\n }\n }\n this.quoteRoutesStatuses = (quoteResult as any).bridgeRouteErrors || {}\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n }\n\n if (!this.#getIsFormValidToFetchQuote()) {\n if (this.quote || this.quoteRoutesStatuses) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n return\n }\n\n let nextTimeout = 400 // timeout when there is no pending quote update\n if (this.#updateQuoteTimeout) {\n nextTimeout = 1000 // timeout when there is a pending quote update\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }\n\n if (!options.skipStatusUpdate && !this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n this.#updateQuoteTimeout = setTimeout(async () => {\n if (!options.skipStatusUpdate && !!this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n await updateQuoteFunction()\n\n if (quoteId !== this.#updateQuoteId) return\n\n this.updateQuoteStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }, nextTimeout)\n }\n\n async getRouteStartUserTx() {\n if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) return\n\n try {\n const routeResult = await this.#socketAPI.startRoute({\n fromChainId: this.quote!.fromChainId,\n fromAssetAddress: this.quote!.fromAsset.address,\n toChainId: this.quote!.toChainId,\n toAssetAddress: this.quote!.toAsset.address,\n route: this.quote!.selectedRoute\n })\n\n return routeResult\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async getNextRouteUserTx(activeRouteId: number) {\n try {\n const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId)\n return route\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async checkForNextUserTxForActiveRoutes() {\n await this.#initialLoadPromise\n const fetchAndUpdateRoute = async (activeRoute: ActiveRoute) => {\n let status: SocketRouteStatus = null\n const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) =>\n op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)\n )\n\n // call getRouteStatus only after the transaction has processed\n if (broadcastedButNotConfirmed) return\n if (activeRoute.routeStatus === 'completed') return\n\n try {\n status = await this.#socketAPI.getRouteStatus({\n activeRouteId: activeRoute.activeRouteId,\n userTxIndex: activeRoute.userTxIndex,\n txHash: activeRoute.userTxHash!\n })\n } catch (e: any) {\n const { message } = getHumanReadableSwapAndBridgeError(e)\n this.updateActiveRoute(activeRoute.activeRouteId, { error: message })\n return\n }\n\n const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId)\n if (route?.error) {\n this.updateActiveRoute(activeRoute.activeRouteId, {\n error: undefined\n })\n }\n\n if (status === 'completed') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'completed',\n error: undefined\n },\n true\n )\n } else if (status === 'ready') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'ready',\n error: undefined\n },\n true\n )\n }\n }\n\n await Promise.all(\n this.activeRoutesInProgress.map(async (route) => {\n await fetchAndUpdateRoute(route)\n })\n )\n }\n\n selectRoute(route: SocketAPIRoute) {\n if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) return\n if (\n ![\n SwapAndBridgeFormStatus.ReadyToSubmit,\n SwapAndBridgeFormStatus.InvalidRouteSelected\n ].includes(this.formStatus)\n )\n return\n\n this.quote.selectedRoute = route\n this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs)\n\n this.#emitUpdateIfNeeded()\n }\n\n async addActiveRoute(activeRoute: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n }) {\n await this.#initialLoadPromise\n\n try {\n const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId)\n this.activeRoutes.push({\n ...activeRoute,\n routeStatus: 'ready',\n userTxHash: null,\n route\n })\n\n // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion.\n // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId,\n // while resetting all other state related to the form.\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n\n this.emitUpdate()\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'major', message })\n }\n }\n\n updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId'],\n activeRoute?: Partial,\n forceUpdateRoute?: boolean\n ) {\n const currentActiveRoutes = [...this.activeRoutes]\n const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId)\n\n if (activeRouteIndex !== -1) {\n if (forceUpdateRoute) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n let route = currentActiveRoutes[activeRouteIndex].route\n route = await this.#socketAPI.updateActiveRoute(activeRouteId)\n this.updateActiveRoute(activeRouteId, { route })\n })()\n }\n\n if (activeRoute) {\n currentActiveRoutes[activeRouteIndex] = {\n ...currentActiveRoutes[activeRouteIndex],\n ...activeRoute\n }\n } else {\n currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }\n }\n this.activeRoutes = currentActiveRoutes\n\n this.#emitUpdateIfNeeded()\n }\n }\n\n removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId)\n\n // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners\n this.emitUpdate()\n }\n\n // update active route if needed on SubmittedAccountOp update\n handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp) {\n op.calls.forEach((call) => {\n this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status)\n this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status)\n this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status)\n this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId)\n this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status)\n })\n }\n\n #handleActiveRouteBroadcastedTransaction(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' })\n }\n\n #handleActiveRouteBroadcastedApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find(\n (r) => `${r.activeRouteId}-approval` === fromUserRequestId\n )\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'waiting-approval-to-resolve'\n })\n }\n\n #handleActiveRoutesWithReadyApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRouteWaitingApproval = this.activeRoutes.find(\n (r) =>\n r.routeStatus === 'waiting-approval-to-resolve' &&\n `${r.activeRouteId}-approval` === fromUserRequestId\n )\n\n if (!activeRouteWaitingApproval) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready'\n })\n }\n\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The approval was rejected but you can try to sign it again'\n : 'The approval failed but you can try to sign it again'\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n #handleUpdateActiveRoutesUserTxId(\n fromUserRequestId: Call['fromUserRequestId'],\n opTxnId: SubmittedAccountOp['txnId']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n if (opTxnId && !activeRoute.userTxHash) {\n this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId })\n }\n }\n\n #handleActiveRoutesCompleted(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n let shouldUpdateActiveRouteStatus = false\n if (activeRoute.route.fromChainId === activeRoute.route.toChainId)\n shouldUpdateActiveRouteStatus = true\n\n if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) {\n const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]\n if (!tx) return\n\n if (tx.userTxType === 'dex-swap') shouldUpdateActiveRouteStatus = true\n }\n\n if (!shouldUpdateActiveRouteStatus) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' })\n }\n\n // If the transaction fails, update the status to \"ready\" to allow the user to sign it again\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The transaction was rejected but you can try to sign it again'\n : 'The transaction failed but you can try to sign it again'\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n onAccountChange() {\n this.portfolioTokenList = []\n this.isTokenListLoading = true\n\n this.#emitUpdateIfNeeded()\n }\n\n #getIsFormValidToFetchQuote() {\n return (\n this.fromChainId &&\n this.toChainId &&\n this.fromAmount &&\n this.fromSelectedToken &&\n this.toSelectedToken &&\n this.validateFromAmount.success\n )\n }\n\n get banners() {\n if (!this.#selectedAccount.account) return []\n\n const activeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.#selectedAccount.account.addr,\n this.activeRoutes\n )\n const accountOpActions = this.#actions.visibleActionsQueue.filter(\n ({ type }) => type === 'accountOp'\n ) as AccountOpAction[]\n\n // Swap banners aren't generated because swaps are completed instantly,\n // thus the activity banner on broadcast is sufficient\n return getBridgeBanners(\n activeRoutesForSelectedAccount,\n accountOpActions,\n this.#networks.networks\n )\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: Function) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n func()\n }, 0)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n toTokenList: this.toTokenList,\n maxFromAmount: this.maxFromAmount,\n maxFromAmountInFiat: this.maxFromAmountInFiat,\n validateFromAmount: this.validateFromAmount,\n isFormEmpty: this.isFormEmpty,\n formStatus: this.formStatus,\n activeRoutesInProgress: this.activeRoutesInProgress,\n activeRoutes: this.activeRoutes,\n isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled,\n banners: this.banners,\n isHealthy: this.isHealthy,\n shouldEnableRoutesSelection: this.shouldEnableRoutesSelection,\n supportedChainIds: this.supportedChainIds\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.js b/dist/src/controllers/transfer/transfer.js index 2607b9e71..49b0afc98 100644 --- a/dist/src/controllers/transfer/transfer.js +++ b/dist/src/controllers/transfer/transfer.js @@ -1,11 +1,15 @@ -import { formatUnits, isAddress, parseUnits } from 'ethers'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { isSmartAccount } from '../../libs/account/account'; -import { getTokenAmount } from '../../libs/portfolio/helpers'; -import { getSanitizedAmount } from '../../libs/transfer/amount'; -import { validateSendTransferAddress, validateSendTransferAmount } from '../../services/validations'; -import { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'; -import EventEmitter from '../eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TransferController = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const addresses_1 = require("../../consts/addresses"); +const account_1 = require("../../libs/account/account"); +const helpers_1 = require("../../libs/portfolio/helpers"); +const amount_1 = require("../../libs/transfer/amount"); +const validations_1 = require("../../services/validations"); +const formatters_1 = require("../../utils/numbers/formatters"); +const eventEmitter_1 = tslib_1.__importDefault(require("../eventEmitter/eventEmitter")); const CONVERSION_PRECISION = 16; const CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION); const DEFAULT_ADDRESS_STATE = { @@ -25,7 +29,7 @@ const DEFAULT_VALIDATION_FORM_MSGS = { } }; const HARD_CODED_CURRENCY = 'usd'; -export class TransferController extends EventEmitter { +class TransferController extends eventEmitter_1.default { #storage; #networks = []; #addressBookContacts = []; @@ -69,7 +73,7 @@ export class TransferController extends EventEmitter { } // every time when updating selectedToken update the amount and maxAmount of the form set selectedToken(token) { - if (!token || Number(getTokenAmount(token)) === 0) { + if (!token || Number((0, helpers_1.getTokenAmount)(token)) === 0) { this.#selectedToken = null; this.amount = ''; this.amountInFiat = ''; @@ -93,21 +97,21 @@ export class TransferController extends EventEmitter { } get maxAmount() { if (!this.selectedToken || - getTokenAmount(this.selectedToken) === 0n || + (0, helpers_1.getTokenAmount)(this.selectedToken) === 0n || typeof this.selectedToken.decimals !== 'number') return '0'; - return formatUnits(getTokenAmount(this.selectedToken), this.selectedToken.decimals); + return (0, ethers_1.formatUnits)((0, helpers_1.getTokenAmount)(this.selectedToken), this.selectedToken.decimals); } get maxAmountInFiat() { - if (!this.selectedToken || getTokenAmount(this.selectedToken) === 0n) + if (!this.selectedToken || (0, helpers_1.getTokenAmount)(this.selectedToken) === 0n) return '0'; const tokenPrice = this.selectedToken?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price; if (!tokenPrice || !Number(this.maxAmount)) return '0'; - const maxAmount = getTokenAmount(this.selectedToken); - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + const maxAmount = (0, helpers_1.getTokenAmount)(this.selectedToken); + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss - return formatUnits(maxAmount * tokenPriceBigInt, + return (0, ethers_1.formatUnits)(maxAmount * tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price this.selectedToken.decimals + tokenPriceDecimals); } @@ -129,11 +133,11 @@ export class TransferController extends EventEmitter { if (this.#humanizerInfo && this.#selectedAccountData) { const isUDAddress = !!this.addressState.udAddress; const isEnsAddress = !!this.addressState.ensAddress; - validationFormMsgsNew.recipientAddress = validateSendTransferAddress(this.recipientAddress, this.#selectedAccountData.addr, this.isRecipientAddressUnknownAgreed, this.isRecipientAddressUnknown, this.isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, this.addressState.isDomainResolving, this.isSWWarningVisible, this.isSWWarningAgreed); + validationFormMsgsNew.recipientAddress = (0, validations_1.validateSendTransferAddress)(this.recipientAddress, this.#selectedAccountData.addr, this.isRecipientAddressUnknownAgreed, this.isRecipientAddressUnknown, this.isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, this.addressState.isDomainResolving, this.isSWWarningVisible, this.isSWWarningAgreed); } // Validate the amount if (this.selectedToken) { - validationFormMsgsNew.amount = validateSendTransferAmount(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken); + validationFormMsgsNew.amount = (0, validations_1.validateSendTransferAmount)(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken); } return validationFormMsgsNew; } @@ -143,7 +147,7 @@ export class TransferController extends EventEmitter { // if the amount is set, it's enough in topUp mode if (this.isTopUp) { return (this.selectedToken && - validateSendTransferAmount(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken).success); + (0, validations_1.validateSendTransferAmount)(this.amount, Number(this.maxAmount), Number(this.maxAmountInFiat), this.selectedToken).success); } const areFormFieldsValid = this.validationFormMsgs.amount.success && this.validationFormMsgs.recipientAddress.success; const isSWWarningMissingOrAccepted = !this.isSWWarningVisible || this.isSWWarningAgreed; @@ -215,7 +219,7 @@ export class TransferController extends EventEmitter { this.emitUpdate(); } checkIsRecipientAddressUnknown() { - if (!isAddress(this.recipientAddress)) { + if (!(0, ethers_1.isAddress)(this.recipientAddress)) { this.isRecipientAddressUnknown = false; this.isRecipientAddressUnknownAgreed = false; this.emitUpdate(); @@ -223,13 +227,13 @@ export class TransferController extends EventEmitter { } const isAddressInAddressBook = this.#addressBookContacts.some(({ address }) => address.toLowerCase() === this.recipientAddress.toLowerCase()); this.isRecipientAddressUnknown = - !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== FEE_COLLECTOR.toLowerCase(); + !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== addresses_1.FEE_COLLECTOR.toLowerCase(); this.isRecipientAddressUnknownAgreed = false; this.#setSWWarningVisibleIfNeeded(); this.emitUpdate(); } #onRecipientAddressChange() { - if (!isAddress(this.recipientAddress)) { + if (!(0, ethers_1.isAddress)(this.recipientAddress)) { this.isRecipientAddressUnknown = false; this.isRecipientAddressUnknownAgreed = false; this.isRecipientHumanizerKnownTokenOrSmartContract = false; @@ -260,10 +264,10 @@ export class TransferController extends EventEmitter { this.amountInFiat = fieldValue; // Get the number of decimals const amountInFiatDecimals = fieldValue.split('.')[1]?.length || 0; - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); // Convert the numbers to big int - const amountInFiatBigInt = parseUnits(fieldValue, amountInFiatDecimals); - this.amount = formatUnits((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, + const amountInFiatBigInt = (0, ethers_1.parseUnits)(fieldValue, amountInFiatDecimals); + this.amount = (0, ethers_1.formatUnits)((amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals); return; @@ -272,13 +276,13 @@ export class TransferController extends EventEmitter { this.amount = fieldValue; if (!this.selectedToken) return; - const sanitizedFieldValue = getSanitizedAmount(fieldValue, this.selectedToken.decimals); + const sanitizedFieldValue = (0, amount_1.getSanitizedAmount)(fieldValue, this.selectedToken.decimals); // Convert the field value to big int - const formattedAmount = parseUnits(sanitizedFieldValue, this.selectedToken.decimals); + const formattedAmount = (0, ethers_1.parseUnits)(sanitizedFieldValue, this.selectedToken.decimals); if (!formattedAmount) return; - const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); - this.amountInFiat = formatUnits(formattedAmount * tokenPriceBigInt, + const { tokenPriceBigInt, tokenPriceDecimals } = (0, formatters_1.convertTokenPriceToBigInt)(tokenPrice); + this.amountInFiat = (0, ethers_1.formatUnits)(formattedAmount * tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price this.selectedToken.decimals + tokenPriceDecimals); } @@ -288,7 +292,7 @@ export class TransferController extends EventEmitter { return; this.isSWWarningVisible = this.isRecipientAddressUnknown && - isSmartAccount(this.#selectedAccountData) && + (0, account_1.isSmartAccount)(this.#selectedAccountData) && !this.isTopUp && !!this.selectedToken?.address && Number(this.selectedToken?.address) === 0 && @@ -313,4 +317,5 @@ export class TransferController extends EventEmitter { }; } } +exports.TransferController = TransferController; //# sourceMappingURL=transfer.js.map \ No newline at end of file diff --git a/dist/src/controllers/transfer/transfer.js.map b/dist/src/controllers/transfer/transfer.js.map index 4a9f90f37..a81cbbd80 100644 --- a/dist/src/controllers/transfer/transfer.js.map +++ b/dist/src/controllers/transfer/transfer.js.map @@ -1 +1 @@ -{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../../src/controllers/transfer/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, isAddress, parseUnits } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { Account } from '../../interfaces/account'\nimport { AddressState } from '../../interfaces/domains'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { TransferUpdate } from '../../interfaces/transfer'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { HumanizerMeta } from '../../libs/humanizer/interfaces'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { validateSendTransferAddress, validateSendTransferAmount } from '../../services/validations'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport { Contacts } from '../addressBook/addressBook'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst DEFAULT_ADDRESS_STATE = {\n fieldValue: '',\n ensAddress: '',\n udAddress: '',\n isDomainResolving: false\n}\n\nconst DEFAULT_VALIDATION_FORM_MSGS = {\n amount: {\n success: false,\n message: ''\n },\n recipientAddress: {\n success: false,\n message: ''\n }\n}\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nexport class TransferController extends EventEmitter {\n #storage: Storage\n\n #networks: Network[] = []\n\n #addressBookContacts: Contacts = []\n\n #selectedToken: TokenResult | null = null\n\n #selectedAccountData: Account | null = null\n\n #humanizerInfo: HumanizerMeta | null = null\n\n isSWWarningVisible = false\n\n isSWWarningAgreed = false\n\n amount = ''\n\n amountInFiat = ''\n\n amountFieldMode: 'fiat' | 'token' = 'token'\n\n addressState: AddressState = { ...DEFAULT_ADDRESS_STATE }\n\n isRecipientAddressUnknown = false\n\n isRecipientAddressUnknownAgreed = false\n\n isRecipientHumanizerKnownTokenOrSmartContract = false\n\n isTopUp: boolean = false\n\n #shouldSkipTransactionQueuedModal: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n humanizerInfo: HumanizerMeta,\n selectedAccountData: Account,\n networks: Network[]\n ) {\n super()\n\n this.#storage = storage\n this.#humanizerInfo = humanizerInfo\n this.#selectedAccountData = selectedAccountData\n this.#networks = networks\n\n this.#initialLoadPromise = this.#load()\n this.emitUpdate()\n }\n\n async #load() {\n this.#shouldSkipTransactionQueuedModal = await this.#storage.get(\n 'shouldSkipTransactionQueuedModal',\n false\n )\n\n this.emitUpdate()\n }\n\n get shouldSkipTransactionQueuedModal() {\n return this.#shouldSkipTransactionQueuedModal\n }\n\n set shouldSkipTransactionQueuedModal(value: boolean) {\n this.#shouldSkipTransactionQueuedModal = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('shouldSkipTransactionQueuedModal', value)\n this.emitUpdate()\n }\n\n // every time when updating selectedToken update the amount and maxAmount of the form\n set selectedToken(token: TokenResult | null) {\n if (!token || Number(getTokenAmount(token)) === 0) {\n this.#selectedToken = null\n this.amount = ''\n this.amountInFiat = ''\n this.amountFieldMode = 'token'\n return\n }\n\n const prevSelectedToken = { ...this.selectedToken }\n\n this.#selectedToken = token\n\n if (\n prevSelectedToken?.address !== token?.address ||\n prevSelectedToken?.networkId !== token?.networkId\n ) {\n if (!token.priceIn.length) {\n this.amountFieldMode = 'token'\n }\n this.amount = ''\n this.amountInFiat = ''\n this.#setSWWarningVisibleIfNeeded()\n }\n }\n\n get selectedToken() {\n return this.#selectedToken\n }\n\n get maxAmount(): string {\n if (\n !this.selectedToken ||\n getTokenAmount(this.selectedToken) === 0n ||\n typeof this.selectedToken.decimals !== 'number'\n )\n return '0'\n\n return formatUnits(getTokenAmount(this.selectedToken), this.selectedToken.decimals)\n }\n\n get maxAmountInFiat(): string {\n if (!this.selectedToken || getTokenAmount(this.selectedToken) === 0n) return '0'\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n if (!tokenPrice || !Number(this.maxAmount)) return '0'\n\n const maxAmount = getTokenAmount(this.selectedToken)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n maxAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n\n resetForm() {\n this.amount = ''\n this.amountInFiat = ''\n this.addressState = { ...DEFAULT_ADDRESS_STATE }\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n this.emitUpdate()\n }\n\n get validationFormMsgs() {\n if (!this.isInitialized) return DEFAULT_VALIDATION_FORM_MSGS\n\n const validationFormMsgsNew = DEFAULT_VALIDATION_FORM_MSGS\n\n if (this.#humanizerInfo && this.#selectedAccountData) {\n const isUDAddress = !!this.addressState.udAddress\n const isEnsAddress = !!this.addressState.ensAddress\n\n validationFormMsgsNew.recipientAddress = validateSendTransferAddress(\n this.recipientAddress,\n this.#selectedAccountData.addr,\n this.isRecipientAddressUnknownAgreed,\n this.isRecipientAddressUnknown,\n this.isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n this.addressState.isDomainResolving,\n this.isSWWarningVisible,\n this.isSWWarningAgreed\n )\n }\n\n // Validate the amount\n if (this.selectedToken) {\n validationFormMsgsNew.amount = validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n )\n }\n\n return validationFormMsgsNew\n }\n\n get isFormValid() {\n if (!this.isInitialized) return false\n\n // if the amount is set, it's enough in topUp mode\n if (this.isTopUp) {\n return (\n this.selectedToken &&\n validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n ).success\n )\n }\n\n const areFormFieldsValid =\n this.validationFormMsgs.amount.success && this.validationFormMsgs.recipientAddress.success\n\n const isSWWarningMissingOrAccepted = !this.isSWWarningVisible || this.isSWWarningAgreed\n\n const isRecipientAddressUnknownMissingOrAccepted =\n !this.isRecipientAddressUnknown || this.isRecipientAddressUnknownAgreed\n\n return (\n areFormFieldsValid &&\n isSWWarningMissingOrAccepted &&\n isRecipientAddressUnknownMissingOrAccepted &&\n !this.addressState.isDomainResolving\n )\n }\n\n get isInitialized() {\n return !!this.#humanizerInfo && !!this.#selectedAccountData && !!this.#networks.length\n }\n\n get recipientAddress() {\n return (\n this.addressState.ensAddress || this.addressState.udAddress || this.addressState.fieldValue\n )\n }\n\n update({\n selectedAccountData,\n humanizerInfo,\n selectedToken,\n amount,\n addressState,\n isSWWarningAgreed,\n isRecipientAddressUnknownAgreed,\n isTopUp,\n networks,\n contacts,\n amountFieldMode\n }: TransferUpdate) {\n if (humanizerInfo) {\n this.#humanizerInfo = humanizerInfo\n }\n if (networks) {\n this.#networks = networks\n }\n if (contacts) {\n this.#addressBookContacts = contacts\n\n if (this.isInitialized) {\n this.checkIsRecipientAddressUnknown()\n }\n }\n if (selectedAccountData) {\n if (this.#selectedAccountData?.addr !== selectedAccountData.addr) {\n this.#setAmount('')\n this.selectedToken = null\n }\n this.#selectedAccountData = selectedAccountData\n }\n if (selectedToken) {\n this.selectedToken = selectedToken\n }\n // If we do a regular check the value won't update if it's '' or '0'\n if (typeof amount === 'string') {\n this.#setAmount(amount)\n }\n if (amountFieldMode) {\n this.amountFieldMode = amountFieldMode\n }\n\n if (addressState) {\n this.addressState = {\n ...this.addressState,\n ...addressState\n }\n if (this.isInitialized) {\n this.#onRecipientAddressChange()\n }\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isSWWarningAgreed) {\n this.isSWWarningAgreed = !this.isSWWarningAgreed\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isRecipientAddressUnknownAgreed) {\n this.isRecipientAddressUnknownAgreed = !this.isRecipientAddressUnknownAgreed\n }\n\n if (typeof isTopUp === 'boolean') {\n this.isTopUp = isTopUp\n this.#setSWWarningVisibleIfNeeded()\n }\n\n this.emitUpdate()\n }\n\n checkIsRecipientAddressUnknown() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n\n this.emitUpdate()\n return\n }\n const isAddressInAddressBook = this.#addressBookContacts.some(\n ({ address }) => address.toLowerCase() === this.recipientAddress.toLowerCase()\n )\n\n this.isRecipientAddressUnknown =\n !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== FEE_COLLECTOR.toLowerCase()\n this.isRecipientAddressUnknownAgreed = false\n this.#setSWWarningVisibleIfNeeded()\n\n this.emitUpdate()\n }\n\n #onRecipientAddressChange() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n return\n }\n\n if (this.#humanizerInfo) {\n // @TODO: could fetch address code\n this.isRecipientHumanizerKnownTokenOrSmartContract =\n !!this.#humanizerInfo.knownAddresses[this.recipientAddress.toLowerCase()]?.isSC\n }\n\n this.checkIsRecipientAddressUnknown()\n }\n\n #setAmount(fieldValue: string) {\n if (!fieldValue) {\n this.amount = ''\n this.amountInFiat = ''\n return\n }\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.amount = fieldValue\n this.amountInFiat = ''\n return\n }\n\n if (this.amountFieldMode === 'fiat' && typeof this.selectedToken?.decimals === 'number') {\n this.amountInFiat = fieldValue\n\n // Get the number of decimals\n const amountInFiatDecimals = fieldValue.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fieldValue, amountInFiatDecimals)\n\n this.amount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.amountFieldMode === 'token') {\n this.amount = fieldValue\n\n if (!this.selectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(fieldValue, this.selectedToken.decimals)\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.selectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.amountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n }\n\n #setSWWarningVisibleIfNeeded() {\n if (!this.#selectedAccountData) return\n\n this.isSWWarningVisible =\n this.isRecipientAddressUnknown &&\n isSmartAccount(this.#selectedAccountData) &&\n !this.isTopUp &&\n !!this.selectedToken?.address &&\n Number(this.selectedToken?.address) === 0 &&\n this.#networks\n .filter((n) => n.id !== 'ethereum')\n .map(({ id }) => id)\n .includes(this.selectedToken.networkId || 'ethereum')\n\n this.emitUpdate()\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n validationFormMsgs: this.validationFormMsgs,\n isFormValid: this.isFormValid,\n isInitialized: this.isInitialized,\n selectedToken: this.selectedToken,\n maxAmount: this.maxAmount,\n maxAmountInFiat: this.maxAmountInFiat,\n shouldSkipTransactionQueuedModal: this.shouldSkipTransactionQueuedModal\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../../src/controllers/transfer/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, isAddress, parseUnits } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { Account } from '../../interfaces/account'\nimport { AddressState } from '../../interfaces/domains'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { TransferUpdate } from '../../interfaces/transfer'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { HumanizerMeta } from '../../libs/humanizer/interfaces'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { validateSendTransferAddress, validateSendTransferAmount } from '../../services/validations'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport { Contacts } from '../addressBook/addressBook'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst DEFAULT_ADDRESS_STATE = {\n fieldValue: '',\n ensAddress: '',\n udAddress: '',\n isDomainResolving: false\n}\n\nconst DEFAULT_VALIDATION_FORM_MSGS = {\n amount: {\n success: false,\n message: ''\n },\n recipientAddress: {\n success: false,\n message: ''\n }\n}\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nexport class TransferController extends EventEmitter {\n #storage: Storage\n\n #networks: Network[] = []\n\n #addressBookContacts: Contacts = []\n\n #selectedToken: TokenResult | null = null\n\n #selectedAccountData: Account | null = null\n\n #humanizerInfo: HumanizerMeta | null = null\n\n isSWWarningVisible = false\n\n isSWWarningAgreed = false\n\n amount = ''\n\n amountInFiat = ''\n\n amountFieldMode: 'fiat' | 'token' = 'token'\n\n addressState: AddressState = { ...DEFAULT_ADDRESS_STATE }\n\n isRecipientAddressUnknown = false\n\n isRecipientAddressUnknownAgreed = false\n\n isRecipientHumanizerKnownTokenOrSmartContract = false\n\n isTopUp: boolean = false\n\n #shouldSkipTransactionQueuedModal: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n humanizerInfo: HumanizerMeta,\n selectedAccountData: Account,\n networks: Network[]\n ) {\n super()\n\n this.#storage = storage\n this.#humanizerInfo = humanizerInfo\n this.#selectedAccountData = selectedAccountData\n this.#networks = networks\n\n this.#initialLoadPromise = this.#load()\n this.emitUpdate()\n }\n\n async #load() {\n this.#shouldSkipTransactionQueuedModal = await this.#storage.get(\n 'shouldSkipTransactionQueuedModal',\n false\n )\n\n this.emitUpdate()\n }\n\n get shouldSkipTransactionQueuedModal() {\n return this.#shouldSkipTransactionQueuedModal\n }\n\n set shouldSkipTransactionQueuedModal(value: boolean) {\n this.#shouldSkipTransactionQueuedModal = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('shouldSkipTransactionQueuedModal', value)\n this.emitUpdate()\n }\n\n // every time when updating selectedToken update the amount and maxAmount of the form\n set selectedToken(token: TokenResult | null) {\n if (!token || Number(getTokenAmount(token)) === 0) {\n this.#selectedToken = null\n this.amount = ''\n this.amountInFiat = ''\n this.amountFieldMode = 'token'\n return\n }\n\n const prevSelectedToken = { ...this.selectedToken }\n\n this.#selectedToken = token\n\n if (\n prevSelectedToken?.address !== token?.address ||\n prevSelectedToken?.networkId !== token?.networkId\n ) {\n if (!token.priceIn.length) {\n this.amountFieldMode = 'token'\n }\n this.amount = ''\n this.amountInFiat = ''\n this.#setSWWarningVisibleIfNeeded()\n }\n }\n\n get selectedToken() {\n return this.#selectedToken\n }\n\n get maxAmount(): string {\n if (\n !this.selectedToken ||\n getTokenAmount(this.selectedToken) === 0n ||\n typeof this.selectedToken.decimals !== 'number'\n )\n return '0'\n\n return formatUnits(getTokenAmount(this.selectedToken), this.selectedToken.decimals)\n }\n\n get maxAmountInFiat(): string {\n if (!this.selectedToken || getTokenAmount(this.selectedToken) === 0n) return '0'\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n if (!tokenPrice || !Number(this.maxAmount)) return '0'\n\n const maxAmount = getTokenAmount(this.selectedToken)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n maxAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n\n resetForm() {\n this.amount = ''\n this.amountInFiat = ''\n this.addressState = { ...DEFAULT_ADDRESS_STATE }\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n this.emitUpdate()\n }\n\n get validationFormMsgs() {\n if (!this.isInitialized) return DEFAULT_VALIDATION_FORM_MSGS\n\n const validationFormMsgsNew = DEFAULT_VALIDATION_FORM_MSGS\n\n if (this.#humanizerInfo && this.#selectedAccountData) {\n const isUDAddress = !!this.addressState.udAddress\n const isEnsAddress = !!this.addressState.ensAddress\n\n validationFormMsgsNew.recipientAddress = validateSendTransferAddress(\n this.recipientAddress,\n this.#selectedAccountData.addr,\n this.isRecipientAddressUnknownAgreed,\n this.isRecipientAddressUnknown,\n this.isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n this.addressState.isDomainResolving,\n this.isSWWarningVisible,\n this.isSWWarningAgreed\n )\n }\n\n // Validate the amount\n if (this.selectedToken) {\n validationFormMsgsNew.amount = validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n )\n }\n\n return validationFormMsgsNew\n }\n\n get isFormValid() {\n if (!this.isInitialized) return false\n\n // if the amount is set, it's enough in topUp mode\n if (this.isTopUp) {\n return (\n this.selectedToken &&\n validateSendTransferAmount(\n this.amount,\n Number(this.maxAmount),\n Number(this.maxAmountInFiat),\n this.selectedToken\n ).success\n )\n }\n\n const areFormFieldsValid =\n this.validationFormMsgs.amount.success && this.validationFormMsgs.recipientAddress.success\n\n const isSWWarningMissingOrAccepted = !this.isSWWarningVisible || this.isSWWarningAgreed\n\n const isRecipientAddressUnknownMissingOrAccepted =\n !this.isRecipientAddressUnknown || this.isRecipientAddressUnknownAgreed\n\n return (\n areFormFieldsValid &&\n isSWWarningMissingOrAccepted &&\n isRecipientAddressUnknownMissingOrAccepted &&\n !this.addressState.isDomainResolving\n )\n }\n\n get isInitialized() {\n return !!this.#humanizerInfo && !!this.#selectedAccountData && !!this.#networks.length\n }\n\n get recipientAddress() {\n return (\n this.addressState.ensAddress || this.addressState.udAddress || this.addressState.fieldValue\n )\n }\n\n update({\n selectedAccountData,\n humanizerInfo,\n selectedToken,\n amount,\n addressState,\n isSWWarningAgreed,\n isRecipientAddressUnknownAgreed,\n isTopUp,\n networks,\n contacts,\n amountFieldMode\n }: TransferUpdate) {\n if (humanizerInfo) {\n this.#humanizerInfo = humanizerInfo\n }\n if (networks) {\n this.#networks = networks\n }\n if (contacts) {\n this.#addressBookContacts = contacts\n\n if (this.isInitialized) {\n this.checkIsRecipientAddressUnknown()\n }\n }\n if (selectedAccountData) {\n if (this.#selectedAccountData?.addr !== selectedAccountData.addr) {\n this.#setAmount('')\n this.selectedToken = null\n }\n this.#selectedAccountData = selectedAccountData\n }\n if (selectedToken) {\n this.selectedToken = selectedToken\n }\n // If we do a regular check the value won't update if it's '' or '0'\n if (typeof amount === 'string') {\n this.#setAmount(amount)\n }\n if (amountFieldMode) {\n this.amountFieldMode = amountFieldMode\n }\n\n if (addressState) {\n this.addressState = {\n ...this.addressState,\n ...addressState\n }\n if (this.isInitialized) {\n this.#onRecipientAddressChange()\n }\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isSWWarningAgreed) {\n this.isSWWarningAgreed = !this.isSWWarningAgreed\n }\n // We can do a regular check here, because the property defines if it should be updated\n // and not the actual value\n if (isRecipientAddressUnknownAgreed) {\n this.isRecipientAddressUnknownAgreed = !this.isRecipientAddressUnknownAgreed\n }\n\n if (typeof isTopUp === 'boolean') {\n this.isTopUp = isTopUp\n this.#setSWWarningVisibleIfNeeded()\n }\n\n this.emitUpdate()\n }\n\n checkIsRecipientAddressUnknown() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n\n this.emitUpdate()\n return\n }\n const isAddressInAddressBook = this.#addressBookContacts.some(\n ({ address }) => address.toLowerCase() === this.recipientAddress.toLowerCase()\n )\n\n this.isRecipientAddressUnknown =\n !isAddressInAddressBook && this.recipientAddress.toLowerCase() !== FEE_COLLECTOR.toLowerCase()\n this.isRecipientAddressUnknownAgreed = false\n this.#setSWWarningVisibleIfNeeded()\n\n this.emitUpdate()\n }\n\n #onRecipientAddressChange() {\n if (!isAddress(this.recipientAddress)) {\n this.isRecipientAddressUnknown = false\n this.isRecipientAddressUnknownAgreed = false\n this.isRecipientHumanizerKnownTokenOrSmartContract = false\n this.isSWWarningVisible = false\n this.isSWWarningAgreed = false\n\n return\n }\n\n if (this.#humanizerInfo) {\n // @TODO: could fetch address code\n this.isRecipientHumanizerKnownTokenOrSmartContract =\n !!this.#humanizerInfo.knownAddresses[this.recipientAddress.toLowerCase()]?.isSC\n }\n\n this.checkIsRecipientAddressUnknown()\n }\n\n #setAmount(fieldValue: string) {\n if (!fieldValue) {\n this.amount = ''\n this.amountInFiat = ''\n return\n }\n\n const tokenPrice = this.selectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.amount = fieldValue\n this.amountInFiat = ''\n return\n }\n\n if (this.amountFieldMode === 'fiat' && typeof this.selectedToken?.decimals === 'number') {\n this.amountInFiat = fieldValue\n\n // Get the number of decimals\n const amountInFiatDecimals = fieldValue.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fieldValue, amountInFiatDecimals)\n\n this.amount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.amountFieldMode === 'token') {\n this.amount = fieldValue\n\n if (!this.selectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(fieldValue, this.selectedToken.decimals)\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.selectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.amountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.selectedToken.decimals + tokenPriceDecimals\n )\n }\n }\n\n #setSWWarningVisibleIfNeeded() {\n if (!this.#selectedAccountData) return\n\n this.isSWWarningVisible =\n this.isRecipientAddressUnknown &&\n isSmartAccount(this.#selectedAccountData) &&\n !this.isTopUp &&\n !!this.selectedToken?.address &&\n Number(this.selectedToken?.address) === 0 &&\n this.#networks\n .filter((n) => n.id !== 'ethereum')\n .map(({ id }) => id)\n .includes(this.selectedToken.networkId || 'ethereum')\n\n this.emitUpdate()\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n validationFormMsgs: this.validationFormMsgs,\n isFormValid: this.isFormValid,\n isInitialized: this.isInitialized,\n selectedToken: this.selectedToken,\n maxAmount: this.maxAmount,\n maxAmountInFiat: this.maxAmountInFiat,\n shouldSkipTransactionQueuedModal: this.shouldSkipTransactionQueuedModal\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/account.js b/dist/src/interfaces/account.js index f96c294dd..7085e122f 100644 --- a/dist/src/interfaces/account.js +++ b/dist/src/interfaces/account.js @@ -1,7 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportStatus = void 0; /** * Enum for tracking the import status of an account during the import process. */ -export var ImportStatus; +var ImportStatus; (function (ImportStatus) { ImportStatus["NotImported"] = "not-imported"; ImportStatus["ImportedWithoutKey"] = "imported-without-key"; @@ -12,5 +15,5 @@ export var ImportStatus; ImportStatus["ImportedWithDifferentKeys"] = "imported-with-different-keys"; // different key // meaning that could be a key with the same address but different type, // or a key with different address altogether. -})(ImportStatus || (ImportStatus = {})); +})(ImportStatus = exports.ImportStatus || (exports.ImportStatus = {})); //# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/interfaces/account.js.map b/dist/src/interfaces/account.js.map index 907a8fb1c..ed540af3e 100644 --- a/dist/src/interfaces/account.js.map +++ b/dist/src/interfaces/account.js.map @@ -1 +1 @@ -{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/interfaces/account.ts"],"names":[],"mappings":"AAwEA;;GAEG;AACH,MAAM,CAAN,IAAY,YAUX;AAVD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,2DAA2C,CAAA;IAC3C,4EAA4D,CAAA;IAC5D,qFAAqF;IACrF,uEAAuD,CAAA;IACvD,4DAA4D;IAC5D,0EAA0D,CAAA,CAAC,gBAAgB;IAC3E,wEAAwE;IACxE,8CAA8C;AAChD,CAAC,EAVW,YAAY,KAAZ,YAAY,QAUvB","sourcesContent":["import { Network } from './network'\n\nexport type AccountId = string\n\nexport type AccountPreferences = {\n label: string\n pfp: string // profile picture - acc address as default value to display a unique jazz icon\n}\n\nexport interface Account {\n addr: AccountId\n // Associated keys that can control the account\n // For EOAs this must be set to [account.addr]\n associatedKeys: string[]\n initialPrivileges: [string, string][]\n // Creation data; `null` in case of an EOA\n creation: AccountCreation | null\n preferences: AccountPreferences\n email?: string\n newlyCreated?: boolean\n newlyAdded?: boolean\n}\n\nexport interface AccountCreation {\n factoryAddr: string\n bytecode: string\n salt: string\n // baseIdentityAddr is intentionally omitted because it's not used anywhere\n // and because it can be retrieved from the bytecode\n}\n\nexport interface AccountOnchainState {\n accountAddr: string\n isDeployed: boolean\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint\n erc4337Nonce: bigint\n associatedKeysPriviliges: { [key: string]: string }\n deployError: boolean\n balance: bigint\n isEOA: boolean\n isErc4337Enabled: boolean\n isErc4337Nonce: boolean\n isV2: boolean\n currentBlock: bigint\n}\n\nexport type AccountStates = {\n [accountId: string]: {\n [networkId: string]: AccountOnchainState\n }\n}\n\ntype AccountDerivationMeta = {\n slot: number // the iteration on which the account is derived, starting from 1\n index: number // the derivation index of the in the slot, starting from 0\n isLinked: boolean // linked accounts are also smart accounts, so use a flag to differentiate\n}\n\nexport type AccountWithNetworkMeta = Account & { usedOnNetworks: Network[] }\n\n/**\n * The account that is derived programmatically and internally by Ambire.\n * Could be either a basic (EOA) account, a derived with custom derivation\n * basic (EOA) account (used for smart account key only) or a smart account.\n */\nexport type DerivedAccount = AccountDerivationMeta & { account: AccountWithNetworkMeta }\n// Sub-type, used during intermediate step during the deriving accounts process\nexport type DerivedAccountWithoutNetworkMeta = Omit & {\n account: Account\n}\n\n/**\n * Enum for tracking the import status of an account during the import process.\n */\nexport enum ImportStatus {\n NotImported = 'not-imported',\n ImportedWithoutKey = 'imported-without-key', // as a view only account\n ImportedWithSomeOfTheKeys = 'imported-with-some-of-the-keys', // imported with\n // some of the keys (having the same key type), but not all found on the current page\n ImportedWithTheSameKeys = 'imported-with-the-same-keys', // imported with all\n // keys (having the same key type) found on the current page\n ImportedWithDifferentKeys = 'imported-with-different-keys' // different key\n // meaning that could be a key with the same address but different type,\n // or a key with different address altogether.\n}\n\n/**\n * All the accounts that should be visible on the current page - the Basic\n * Accounts, Smart Accounts and the linked accounts. Excludes the derived\n * EOA (basic) accounts used for smart account keys only.\n */\nexport type AccountOnPage = DerivedAccount & { importStatus: ImportStatus }\n\n/**\n * The account that the user has actively chosen (selected) via the app UI.\n * It's always one of the visible accounts returned by the accountsOnPage().\n * Could be either a basic (EOA) account, a smart account or a linked account.\n */\nexport type SelectedAccountForImport = {\n account: Account\n isLinked: AccountDerivationMeta['isLinked']\n accountKeys: (Omit & { addr: Account['addr'] })[]\n}\n"]} \ No newline at end of file +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/interfaces/account.ts"],"names":[],"mappings":";;;AAwEA;;GAEG;AACH,IAAY,YAUX;AAVD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,2DAA2C,CAAA;IAC3C,4EAA4D,CAAA;IAC5D,qFAAqF;IACrF,uEAAuD,CAAA;IACvD,4DAA4D;IAC5D,0EAA0D,CAAA,CAAC,gBAAgB;IAC3E,wEAAwE;IACxE,8CAA8C;AAChD,CAAC,EAVW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAUvB","sourcesContent":["import { Network } from './network'\n\nexport type AccountId = string\n\nexport type AccountPreferences = {\n label: string\n pfp: string // profile picture - acc address as default value to display a unique jazz icon\n}\n\nexport interface Account {\n addr: AccountId\n // Associated keys that can control the account\n // For EOAs this must be set to [account.addr]\n associatedKeys: string[]\n initialPrivileges: [string, string][]\n // Creation data; `null` in case of an EOA\n creation: AccountCreation | null\n preferences: AccountPreferences\n email?: string\n newlyCreated?: boolean\n newlyAdded?: boolean\n}\n\nexport interface AccountCreation {\n factoryAddr: string\n bytecode: string\n salt: string\n // baseIdentityAddr is intentionally omitted because it's not used anywhere\n // and because it can be retrieved from the bytecode\n}\n\nexport interface AccountOnchainState {\n accountAddr: string\n isDeployed: boolean\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint\n erc4337Nonce: bigint\n associatedKeysPriviliges: { [key: string]: string }\n deployError: boolean\n balance: bigint\n isEOA: boolean\n isErc4337Enabled: boolean\n isErc4337Nonce: boolean\n isV2: boolean\n currentBlock: bigint\n}\n\nexport type AccountStates = {\n [accountId: string]: {\n [networkId: string]: AccountOnchainState\n }\n}\n\ntype AccountDerivationMeta = {\n slot: number // the iteration on which the account is derived, starting from 1\n index: number // the derivation index of the in the slot, starting from 0\n isLinked: boolean // linked accounts are also smart accounts, so use a flag to differentiate\n}\n\nexport type AccountWithNetworkMeta = Account & { usedOnNetworks: Network[] }\n\n/**\n * The account that is derived programmatically and internally by Ambire.\n * Could be either a basic (EOA) account, a derived with custom derivation\n * basic (EOA) account (used for smart account key only) or a smart account.\n */\nexport type DerivedAccount = AccountDerivationMeta & { account: AccountWithNetworkMeta }\n// Sub-type, used during intermediate step during the deriving accounts process\nexport type DerivedAccountWithoutNetworkMeta = Omit & {\n account: Account\n}\n\n/**\n * Enum for tracking the import status of an account during the import process.\n */\nexport enum ImportStatus {\n NotImported = 'not-imported',\n ImportedWithoutKey = 'imported-without-key', // as a view only account\n ImportedWithSomeOfTheKeys = 'imported-with-some-of-the-keys', // imported with\n // some of the keys (having the same key type), but not all found on the current page\n ImportedWithTheSameKeys = 'imported-with-the-same-keys', // imported with all\n // keys (having the same key type) found on the current page\n ImportedWithDifferentKeys = 'imported-with-different-keys' // different key\n // meaning that could be a key with the same address but different type,\n // or a key with different address altogether.\n}\n\n/**\n * All the accounts that should be visible on the current page - the Basic\n * Accounts, Smart Accounts and the linked accounts. Excludes the derived\n * EOA (basic) accounts used for smart account keys only.\n */\nexport type AccountOnPage = DerivedAccount & { importStatus: ImportStatus }\n\n/**\n * The account that the user has actively chosen (selected) via the app UI.\n * It's always one of the visible accounts returned by the accountsOnPage().\n * Could be either a basic (EOA) account, a smart account or a linked account.\n */\nexport type SelectedAccountForImport = {\n account: Account\n isLinked: AccountDerivationMeta['isLinked']\n accountKeys: (Omit & { addr: Account['addr'] })[]\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/actions.js b/dist/src/interfaces/actions.js index 0477c352d..1f1e33d46 100644 --- a/dist/src/interfaces/actions.js +++ b/dist/src/interfaces/actions.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/interfaces/banner.js b/dist/src/interfaces/banner.js index c6d99cc05..8ca5529d2 100644 --- a/dist/src/interfaces/banner.js +++ b/dist/src/interfaces/banner.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=banner.js.map \ No newline at end of file diff --git a/dist/src/interfaces/dapp.js b/dist/src/interfaces/dapp.js index b8e7f3864..0e5422af7 100644 --- a/dist/src/interfaces/dapp.js +++ b/dist/src/interfaces/dapp.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=dapp.js.map \ No newline at end of file diff --git a/dist/src/interfaces/domains.js b/dist/src/interfaces/domains.js index a013bd5d5..6027c8535 100644 --- a/dist/src/interfaces/domains.js +++ b/dist/src/interfaces/domains.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=domains.js.map \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.js b/dist/src/interfaces/emailVault.js index e3ca0833e..6937b4303 100644 --- a/dist/src/interfaces/emailVault.js +++ b/dist/src/interfaces/emailVault.js @@ -1,11 +1,14 @@ -export var SecretType; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OperationRequestType = exports.SecretType = void 0; +var SecretType; (function (SecretType) { SecretType["RecoveryKey"] = "recoveryKey"; SecretType["KeyStore"] = "keyStore"; SecretType["keyBackup"] = "keyBackup"; -})(SecretType || (SecretType = {})); -export var OperationRequestType; +})(SecretType = exports.SecretType || (exports.SecretType = {})); +var OperationRequestType; (function (OperationRequestType) { OperationRequestType["requestKeySync"] = "requestKeySync"; -})(OperationRequestType || (OperationRequestType = {})); +})(OperationRequestType = exports.OperationRequestType || (exports.OperationRequestType = {})); //# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/interfaces/emailVault.js.map b/dist/src/interfaces/emailVault.js.map index 4a6a29711..5240605e4 100644 --- a/dist/src/interfaces/emailVault.js.map +++ b/dist/src/interfaces/emailVault.js.map @@ -1 +1 @@ -{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../src/interfaces/emailVault.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,mCAAqB,CAAA;IACrB,qCAAuB,CAAA;AACzB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAcD,MAAM,CAAN,IAAY,oBAEX;AAFD,WAAY,oBAAoB;IAC9B,yDAAiC,CAAA;AACnC,CAAC,EAFW,oBAAoB,KAApB,oBAAoB,QAE/B","sourcesContent":["import { AccountCreation, AccountId } from './account'\n\nexport type MagicLinkFlow = 'recovery' | 'setup'\n\nexport enum SecretType {\n RecoveryKey = 'recoveryKey',\n KeyStore = 'keyStore',\n keyBackup = 'keyBackup'\n}\n\nexport interface EmailVaultSecret {\n key: string\n value?: string\n type: SecretType\n}\n\nexport interface EmailVaultAccountInfo {\n addr: AccountId\n associatedKeys: string[]\n creation: AccountCreation | null\n}\n\nexport enum OperationRequestType {\n requestKeySync = 'requestKeySync'\n}\n/**\n * Operations are used for communication between devices.\n *\n * @interface EmailVaultOperation\n * @property {string} [id] - A value that is randomly assigned by the relayer if the operation is legit.\n * @property {OperationRequestType} type - A label for the intention of the operation.\n * @property {string} requester - In the context of the EmailVault, this is the device's keystoreId, acting as a public key for encryption.\n * @property {string} key - In the context of the EmailVault and syncing keys, this is the address for the EOA we want the private key for (might not be applicable for new operation types, if any).\n * @property {string} [value] - The fetched value.\n * @property {string} [password] - The password associated with the operation. The relayer doesn't return the value of the op if wrong password\n */\nexport interface EmailVaultOperation {\n id?: string\n type: OperationRequestType\n requester: string\n key: string\n value?: string\n password?: string\n}\n\nexport interface EmailVaultData {\n recoveryKey: string\n email: string\n availableAccounts: { [addr: string]: EmailVaultAccountInfo }\n availableSecrets: { [key: string]: EmailVaultSecret }\n operations: EmailVaultOperation[]\n}\n\nexport interface RecoveryKey {\n key: String\n type: String\n}\n"]} \ No newline at end of file +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../src/interfaces/emailVault.ts"],"names":[],"mappings":";;;AAIA,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,mCAAqB,CAAA;IACrB,qCAAuB,CAAA;AACzB,CAAC,EAJW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAIrB;AAcD,IAAY,oBAEX;AAFD,WAAY,oBAAoB;IAC9B,yDAAiC,CAAA;AACnC,CAAC,EAFW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAE/B","sourcesContent":["import { AccountCreation, AccountId } from './account'\n\nexport type MagicLinkFlow = 'recovery' | 'setup'\n\nexport enum SecretType {\n RecoveryKey = 'recoveryKey',\n KeyStore = 'keyStore',\n keyBackup = 'keyBackup'\n}\n\nexport interface EmailVaultSecret {\n key: string\n value?: string\n type: SecretType\n}\n\nexport interface EmailVaultAccountInfo {\n addr: AccountId\n associatedKeys: string[]\n creation: AccountCreation | null\n}\n\nexport enum OperationRequestType {\n requestKeySync = 'requestKeySync'\n}\n/**\n * Operations are used for communication between devices.\n *\n * @interface EmailVaultOperation\n * @property {string} [id] - A value that is randomly assigned by the relayer if the operation is legit.\n * @property {OperationRequestType} type - A label for the intention of the operation.\n * @property {string} requester - In the context of the EmailVault, this is the device's keystoreId, acting as a public key for encryption.\n * @property {string} key - In the context of the EmailVault and syncing keys, this is the address for the EOA we want the private key for (might not be applicable for new operation types, if any).\n * @property {string} [value] - The fetched value.\n * @property {string} [password] - The password associated with the operation. The relayer doesn't return the value of the op if wrong password\n */\nexport interface EmailVaultOperation {\n id?: string\n type: OperationRequestType\n requester: string\n key: string\n value?: string\n password?: string\n}\n\nexport interface EmailVaultData {\n recoveryKey: string\n email: string\n availableAccounts: { [addr: string]: EmailVaultAccountInfo }\n availableSecrets: { [key: string]: EmailVaultSecret }\n operations: EmailVaultOperation[]\n}\n\nexport interface RecoveryKey {\n key: String\n type: String\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/fetch.js b/dist/src/interfaces/fetch.js index 168511afa..6cbb4df07 100644 --- a/dist/src/interfaces/fetch.js +++ b/dist/src/interfaces/fetch.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/dist/src/interfaces/hex.js b/dist/src/interfaces/hex.js index 960efc83e..33ea65151 100644 --- a/dist/src/interfaces/hex.js +++ b/dist/src/interfaces/hex.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=hex.js.map \ No newline at end of file diff --git a/dist/src/interfaces/keyIterator.js b/dist/src/interfaces/keyIterator.js index 1f266deb7..f590c41f8 100644 --- a/dist/src/interfaces/keyIterator.js +++ b/dist/src/interfaces/keyIterator.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=keyIterator.js.map \ No newline at end of file diff --git a/dist/src/interfaces/keystore.js b/dist/src/interfaces/keystore.js index 516934c60..e73bd46c0 100644 --- a/dist/src/interfaces/keystore.js +++ b/dist/src/interfaces/keystore.js @@ -1,3 +1,6 @@ -export const standardSigningOnlyPriv = '0x0000000000000000000000000000000000000000000000000000000000000001'; -export const dedicatedToOneSAPriv = '0x0000000000000000000000000000000000000000000000000000000000000002'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.dedicatedToOneSAPriv = exports.standardSigningOnlyPriv = void 0; +exports.standardSigningOnlyPriv = '0x0000000000000000000000000000000000000000000000000000000000000001'; +exports.dedicatedToOneSAPriv = '0x0000000000000000000000000000000000000000000000000000000000000002'; //# sourceMappingURL=keystore.js.map \ No newline at end of file diff --git a/dist/src/interfaces/keystore.js.map b/dist/src/interfaces/keystore.js.map index 6785aa6e5..e6b5f9af5 100644 --- a/dist/src/interfaces/keystore.js.map +++ b/dist/src/interfaces/keystore.js.map @@ -1 +1 @@ -{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":"AA8FA,MAAM,CAAC,MAAM,uBAAuB,GAClC,oEAAoE,CAAA;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["import { Transaction } from 'ethers'\n\nimport { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { GasFeePayment } from '../libs/accountOp/accountOp'\nimport { Call } from '../libs/accountOp/types'\nimport { getHdPathFromTemplate } from '../utils/hdPath'\nimport { Account } from './account'\nimport { Network } from './network'\nimport { TypedMessage } from './userRequest'\n\n/**\n * The ExternalSignerController interface defines the structure for controllers\n * that interact with hardware wallets. Each hardware wallet type (Ledger,\n * Trezor, Lattice) will have its own implementation of this interface.\n * The interface includes methods for unlocking the device, checking if it's\n * unlocked, and cleaning up after use. It also includes properties specific to\n * each type of hardware wallet, such as the device model and ID, the path to\n * the unlocked device, and any necessary credentials.\n */\nexport interface ExternalSignerController {\n type: string\n deviceModel: string\n deviceId: string\n isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean\n unlock: (\n path: ReturnType,\n expectedKeyOnThisPath?: string,\n shouldOpenLatticeConnectorInTab?: boolean // Lattice specific\n ) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>\n unlockedPath: string\n unlockedPathKeyAddr: string\n walletSDK?: any // Either the wallet own SDK or its session, each wallet having specifics\n cleanUp: () => void // Trezor and Ledger specific\n isInitiated?: boolean // Trezor specific\n initialLoadPromise?: Promise // Trezor specific\n retrieveAddresses: (paths: string[]) => Promise // Ledger specific\n // TODO: Refine the rest of the props\n isWebHID?: boolean // Ledger specific\n transport?: any // Ledger specific\n appName?: string // Lattice specific\n creds?: any // Lattice specific\n network?: any // Lattice specific\n}\nexport type ExternalSignerControllers = Partial<{ [key in Key['type']]: ExternalSignerController }>\n\nexport interface TxnRequest {\n to: Call['to']\n value?: Call['value']\n data: Call['data']\n chainId: Network['chainId']\n nonce: number\n gasLimit: GasFeePayment['simulatedGasLimit']\n gasPrice?: bigint\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n type?: number\n}\n\nexport interface KeystoreSigner {\n key: Key\n init?: (externalSignerController?: ExternalSignerController) => void\n signRawTransaction: (txnRequest: TxnRequest) => Promise\n signTypedData: (typedMessage: TypedMessage) => Promise\n signMessage: (hex: string) => Promise\n}\n\nexport type ScryptParams = {\n salt: string\n N: number\n r: number\n p: number\n dkLen: number\n}\n\nexport type AESEncrypted = {\n cipherType: string\n ciphertext: string\n iv: string\n mac: string\n}\n\nexport type MainKeyEncryptedWithSecret = {\n id: string\n scryptParams: ScryptParams\n aesEncrypted: AESEncrypted\n}\n\nexport type MainKey = {\n key: Uint8Array\n iv: Uint8Array\n}\n\nexport type Key = (InternalKey | ExternalKey) & { isExternallyStored: boolean }\n\nexport const standardSigningOnlyPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000001'\nexport const dedicatedToOneSAPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000002'\n\nexport type InternalKey = {\n addr: Account['addr']\n type: 'internal'\n label: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number | null\n }\n}\n\nexport type ExternalKey = {\n addr: Account['addr']\n type: 'trezor' | 'ledger' | 'lattice' | string\n label: string\n dedicatedToOneSA: boolean\n meta: {\n deviceId: string\n deviceModel: string\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n index: number\n createdAt: number | null\n }\n}\n\nexport type StoredKey = (InternalKey & { privKey: string }) | (ExternalKey & { privKey: null })\n\nexport type KeystoreSeed = { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }\n\nexport type KeystoreSignerType = {\n new (key: Key, privateKey?: string): KeystoreSigner\n}\n\n/**\n * The keys that are ready to be added to the user's keystore (by the Main Controller).\n * They are needed as an intermediate step during the accounts import flow\n * (for the accounts that were just imported by the AccountAdder Controller).\n */\nexport type ReadyToAddKeys = {\n internal: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n }[]\n external: {\n addr: Key['addr']\n label: string\n type: Key['type']\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: ExternalKey['meta']\n }[]\n}\n\nexport type KeyPreferences = {\n label: string\n}\n"]} \ No newline at end of file +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":";;;AA8Fa,QAAA,uBAAuB,GAClC,oEAAoE,CAAA;AACzD,QAAA,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["import { Transaction } from 'ethers'\n\nimport { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { GasFeePayment } from '../libs/accountOp/accountOp'\nimport { Call } from '../libs/accountOp/types'\nimport { getHdPathFromTemplate } from '../utils/hdPath'\nimport { Account } from './account'\nimport { Network } from './network'\nimport { TypedMessage } from './userRequest'\n\n/**\n * The ExternalSignerController interface defines the structure for controllers\n * that interact with hardware wallets. Each hardware wallet type (Ledger,\n * Trezor, Lattice) will have its own implementation of this interface.\n * The interface includes methods for unlocking the device, checking if it's\n * unlocked, and cleaning up after use. It also includes properties specific to\n * each type of hardware wallet, such as the device model and ID, the path to\n * the unlocked device, and any necessary credentials.\n */\nexport interface ExternalSignerController {\n type: string\n deviceModel: string\n deviceId: string\n isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean\n unlock: (\n path: ReturnType,\n expectedKeyOnThisPath?: string,\n shouldOpenLatticeConnectorInTab?: boolean // Lattice specific\n ) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>\n unlockedPath: string\n unlockedPathKeyAddr: string\n walletSDK?: any // Either the wallet own SDK or its session, each wallet having specifics\n cleanUp: () => void // Trezor and Ledger specific\n isInitiated?: boolean // Trezor specific\n initialLoadPromise?: Promise // Trezor specific\n retrieveAddresses: (paths: string[]) => Promise // Ledger specific\n // TODO: Refine the rest of the props\n isWebHID?: boolean // Ledger specific\n transport?: any // Ledger specific\n appName?: string // Lattice specific\n creds?: any // Lattice specific\n network?: any // Lattice specific\n}\nexport type ExternalSignerControllers = Partial<{ [key in Key['type']]: ExternalSignerController }>\n\nexport interface TxnRequest {\n to: Call['to']\n value?: Call['value']\n data: Call['data']\n chainId: Network['chainId']\n nonce: number\n gasLimit: GasFeePayment['simulatedGasLimit']\n gasPrice?: bigint\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n type?: number\n}\n\nexport interface KeystoreSigner {\n key: Key\n init?: (externalSignerController?: ExternalSignerController) => void\n signRawTransaction: (txnRequest: TxnRequest) => Promise\n signTypedData: (typedMessage: TypedMessage) => Promise\n signMessage: (hex: string) => Promise\n}\n\nexport type ScryptParams = {\n salt: string\n N: number\n r: number\n p: number\n dkLen: number\n}\n\nexport type AESEncrypted = {\n cipherType: string\n ciphertext: string\n iv: string\n mac: string\n}\n\nexport type MainKeyEncryptedWithSecret = {\n id: string\n scryptParams: ScryptParams\n aesEncrypted: AESEncrypted\n}\n\nexport type MainKey = {\n key: Uint8Array\n iv: Uint8Array\n}\n\nexport type Key = (InternalKey | ExternalKey) & { isExternallyStored: boolean }\n\nexport const standardSigningOnlyPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000001'\nexport const dedicatedToOneSAPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000002'\n\nexport type InternalKey = {\n addr: Account['addr']\n type: 'internal'\n label: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number | null\n }\n}\n\nexport type ExternalKey = {\n addr: Account['addr']\n type: 'trezor' | 'ledger' | 'lattice' | string\n label: string\n dedicatedToOneSA: boolean\n meta: {\n deviceId: string\n deviceModel: string\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n index: number\n createdAt: number | null\n }\n}\n\nexport type StoredKey = (InternalKey & { privKey: string }) | (ExternalKey & { privKey: null })\n\nexport type KeystoreSeed = { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }\n\nexport type KeystoreSignerType = {\n new (key: Key, privateKey?: string): KeystoreSigner\n}\n\n/**\n * The keys that are ready to be added to the user's keystore (by the Main Controller).\n * They are needed as an intermediate step during the accounts import flow\n * (for the accounts that were just imported by the AccountAdder Controller).\n */\nexport type ReadyToAddKeys = {\n internal: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n }[]\n external: {\n addr: Key['addr']\n label: string\n type: Key['type']\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: ExternalKey['meta']\n }[]\n}\n\nexport type KeyPreferences = {\n label: string\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/messenger.js b/dist/src/interfaces/messenger.js index 169ce6382..aad1f1788 100644 --- a/dist/src/interfaces/messenger.js +++ b/dist/src/interfaces/messenger.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=messenger.js.map \ No newline at end of file diff --git a/dist/src/interfaces/network.js b/dist/src/interfaces/network.js index 731a3482a..971689954 100644 --- a/dist/src/interfaces/network.js +++ b/dist/src/interfaces/network.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=network.js.map \ No newline at end of file diff --git a/dist/src/interfaces/notification.js b/dist/src/interfaces/notification.js index 3db328a47..afc0a2a77 100644 --- a/dist/src/interfaces/notification.js +++ b/dist/src/interfaces/notification.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=notification.js.map \ No newline at end of file diff --git a/dist/src/interfaces/provider.js b/dist/src/interfaces/provider.js index be31058cd..0903bb2ef 100644 --- a/dist/src/interfaces/provider.js +++ b/dist/src/interfaces/provider.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=provider.js.map \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.js b/dist/src/interfaces/selectedAccount.js index f8d2e5a21..054a4d9d6 100644 --- a/dist/src/interfaces/selectedAccount.js +++ b/dist/src/interfaces/selectedAccount.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/interfaces/signAccountOp.js b/dist/src/interfaces/signAccountOp.js index b16ebeeb5..09b87527e 100644 --- a/dist/src/interfaces/signAccountOp.js +++ b/dist/src/interfaces/signAccountOp.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=signAccountOp.js.map \ No newline at end of file diff --git a/dist/src/interfaces/storage.js b/dist/src/interfaces/storage.js index 530407742..6a9734237 100644 --- a/dist/src/interfaces/storage.js +++ b/dist/src/interfaces/storage.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=storage.js.map \ No newline at end of file diff --git a/dist/src/interfaces/swapAndBridge.js b/dist/src/interfaces/swapAndBridge.js index a171925eb..2ffee029a 100644 --- a/dist/src/interfaces/swapAndBridge.js +++ b/dist/src/interfaces/swapAndBridge.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/interfaces/transfer.js b/dist/src/interfaces/transfer.js index d1462cfc6..34ce7a1c9 100644 --- a/dist/src/interfaces/transfer.js +++ b/dist/src/interfaces/transfer.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=transfer.js.map \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.js b/dist/src/interfaces/userRequest.js index 95e2f8f30..62fe71c97 100644 --- a/dist/src/interfaces/userRequest.js +++ b/dist/src/interfaces/userRequest.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=userRequest.js.map \ No newline at end of file diff --git a/dist/src/interfaces/window.js b/dist/src/interfaces/window.js index 715c517e1..482f19578 100644 --- a/dist/src/interfaces/window.js +++ b/dist/src/interfaces/window.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=window.js.map \ No newline at end of file diff --git a/dist/src/libs/account/account.js b/dist/src/libs/account/account.js index 22e311a5c..8881ae329 100644 --- a/dist/src/libs/account/account.js +++ b/dist/src/libs/account/account.js @@ -1,25 +1,29 @@ -import { AbiCoder, getAddress, hexlify, Interface, toBeHex, toUtf8Bytes, ZeroAddress } from 'ethers'; -import { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'; -import { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'; -import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; -import { SPOOF_SIGTYPE } from '../../consts/signatures'; -import { ImportStatus } from '../../interfaces/account'; -import { DKIM_VALIDATOR_ADDR, getSignerKey, RECOVERY_DEFAULTS } from '../dkim/recovery'; -import { getBytecode } from '../proxyDeploy/bytecode'; -import { getAmbireAccountAddress } from '../proxyDeploy/getAmbireAddressTwo'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getUniqueAccountsArray = exports.migrateAccountPreferencesToAccounts = exports.getDefaultAccountPreferences = exports.getAccountImportStatus = exports.getDefaultSelectedAccount = exports.isDerivedForSmartAccountKeyOnly = exports.isSmartAccount = exports.isAmbireV1LinkedAccount = exports.getEmailAccount = exports.getSpoof = exports.getSmartAccount = exports.getBasicAccount = exports.getAccountDeployParams = void 0; +const ethers_1 = require("ethers"); +const account_1 = require("../../consts/account"); +const deploy_1 = require("../../consts/deploy"); +const derivation_1 = require("../../consts/derivation"); +const signatures_1 = require("../../consts/signatures"); +const account_2 = require("../../interfaces/account"); +const recovery_1 = require("../dkim/recovery"); +const bytecode_1 = require("../proxyDeploy/bytecode"); +const getAmbireAddressTwo_1 = require("../proxyDeploy/getAmbireAddressTwo"); // returns to, data -export function getAccountDeployParams(account) { +function getAccountDeployParams(account) { // for EOAs, we do not throw an error anymore as we need fake // values for the simulation if (account.creation === null) - return [ZeroAddress, '0x']; - const factory = new Interface(['function deploy(bytes calldata code, uint256 salt) external']); + return [ethers_1.ZeroAddress, '0x']; + const factory = new ethers_1.Interface(['function deploy(bytes calldata code, uint256 salt) external']); return [ account.creation.factoryAddr, factory.encodeFunctionData('deploy', [account.creation.bytecode, account.creation.salt]) ]; } -export function getBasicAccount(addr, existingAccounts) { +exports.getAccountDeployParams = getAccountDeployParams; +function getBasicAccount(addr, existingAccounts) { const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}; return { addr, @@ -27,34 +31,37 @@ export function getBasicAccount(addr, existingAccounts) { initialPrivileges: [], creation: null, preferences: { - label: preferences?.label || DEFAULT_ACCOUNT_LABEL, + label: preferences?.label || account_1.DEFAULT_ACCOUNT_LABEL, pfp: preferences?.pfp || addr } }; } -export async function getSmartAccount(privileges, existingAccounts) { - const bytecode = await getBytecode(privileges); - const addr = getAmbireAccountAddress(AMBIRE_ACCOUNT_FACTORY, bytecode); +exports.getBasicAccount = getBasicAccount; +async function getSmartAccount(privileges, existingAccounts) { + const bytecode = await (0, bytecode_1.getBytecode)(privileges); + const addr = (0, getAmbireAddressTwo_1.getAmbireAccountAddress)(deploy_1.AMBIRE_ACCOUNT_FACTORY, bytecode); const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}; return { addr, initialPrivileges: privileges.map((priv) => [priv.addr, priv.hash]), associatedKeys: privileges.map((priv) => priv.addr), creation: { - factoryAddr: AMBIRE_ACCOUNT_FACTORY, + factoryAddr: deploy_1.AMBIRE_ACCOUNT_FACTORY, bytecode, - salt: toBeHex(0, 32) + salt: (0, ethers_1.toBeHex)(0, 32) }, preferences: { - label: preferences?.label || DEFAULT_ACCOUNT_LABEL, + label: preferences?.label || account_1.DEFAULT_ACCOUNT_LABEL, pfp: preferences?.pfp || addr } }; } -export function getSpoof(account) { - const abiCoder = new AbiCoder(); - return abiCoder.encode(['address'], [account.associatedKeys[0]]) + SPOOF_SIGTYPE; +exports.getSmartAccount = getSmartAccount; +function getSpoof(account) { + const abiCoder = new ethers_1.AbiCoder(); + return abiCoder.encode(['address'], [account.associatedKeys[0]]) + signatures_1.SPOOF_SIGTYPE; } +exports.getSpoof = getSpoof; /** * Create a DKIM recoverable email smart account * @@ -62,7 +69,7 @@ export function getSpoof(account) { * @param associatedKey the key that has privileges * @returns Promise */ -export async function getEmailAccount(recoveryInfo, associatedKey) { +async function getEmailAccount(recoveryInfo, associatedKey) { // const domain: string = recoveryInfo.emailFrom.split('@')[1] // TODO: make getEmailAccount work with cloudflare // try to take the dkimKey from the list of knownSelectors @@ -84,9 +91,9 @@ export async function getEmailAccount(recoveryInfo, associatedKey) { // if there's no dkimKey, standard DKIM recovery is not possible // we leave the defaults empty and the user will have to rely on // keys added through DNSSEC - const selector = hexlify(toUtf8Bytes('')); - const modulus = hexlify(toUtf8Bytes('')); - const exponent = hexlify(toUtf8Bytes('')); + const selector = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)('')); + const modulus = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)('')); + const exponent = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)('')); // if (dkimKey) { // const key = publicKeyToComponents(dkimKey.publicKey) // modulus = hexlify(key.modulus) @@ -94,18 +101,18 @@ export async function getEmailAccount(recoveryInfo, associatedKey) { // } // acceptUnknownSelectors should be always true // and should not be overriden by the FE at this point - const acceptUnknownSelectors = RECOVERY_DEFAULTS.acceptUnknownSelectors; - const waitUntilAcceptAdded = recoveryInfo.waitUntilAcceptAdded ?? RECOVERY_DEFAULTS.waitUntilAcceptAdded; - const waitUntilAcceptRemoved = recoveryInfo.waitUntilAcceptRemoved ?? RECOVERY_DEFAULTS.waitUntilAcceptRemoved; - const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? RECOVERY_DEFAULTS.acceptEmptyDKIMSig; - const acceptEmptySecondSig = recoveryInfo.acceptEmptySecondSig ?? RECOVERY_DEFAULTS.acceptEmptySecondSig; - const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? RECOVERY_DEFAULTS.onlyOneSigTimelock; - const abiCoder = new AbiCoder(); - const validatorAddr = DKIM_VALIDATOR_ADDR; + const acceptUnknownSelectors = recovery_1.RECOVERY_DEFAULTS.acceptUnknownSelectors; + const waitUntilAcceptAdded = recoveryInfo.waitUntilAcceptAdded ?? recovery_1.RECOVERY_DEFAULTS.waitUntilAcceptAdded; + const waitUntilAcceptRemoved = recoveryInfo.waitUntilAcceptRemoved ?? recovery_1.RECOVERY_DEFAULTS.waitUntilAcceptRemoved; + const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? recovery_1.RECOVERY_DEFAULTS.acceptEmptyDKIMSig; + const acceptEmptySecondSig = recoveryInfo.acceptEmptySecondSig ?? recovery_1.RECOVERY_DEFAULTS.acceptEmptySecondSig; + const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? recovery_1.RECOVERY_DEFAULTS.onlyOneSigTimelock; + const abiCoder = new ethers_1.AbiCoder(); + const validatorAddr = recovery_1.DKIM_VALIDATOR_ADDR; const validatorData = abiCoder.encode(['tuple(string,string,string,bytes,bytes,address,bool,uint32,uint32,bool,bool,uint32)'], [ [ recoveryInfo.emailFrom, - RECOVERY_DEFAULTS.emailTo, + recovery_1.RECOVERY_DEFAULTS.emailTo, selector, modulus, exponent, @@ -118,18 +125,22 @@ export async function getEmailAccount(recoveryInfo, associatedKey) { onlyOneSigTimelock ] ]); - const { hash } = getSignerKey(validatorAddr, validatorData); + const { hash } = (0, recovery_1.getSignerKey)(validatorAddr, validatorData); const privileges = [{ addr: associatedKey, hash }]; return getSmartAccount(privileges, []); } -export const isAmbireV1LinkedAccount = (factoryAddr) => factoryAddr && getAddress(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'; -export const isSmartAccount = (account) => !!account && !!account.creation; +exports.getEmailAccount = getEmailAccount; +const isAmbireV1LinkedAccount = (factoryAddr) => factoryAddr && (0, ethers_1.getAddress)(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'; +exports.isAmbireV1LinkedAccount = isAmbireV1LinkedAccount; +const isSmartAccount = (account) => !!account && !!account.creation; +exports.isSmartAccount = isSmartAccount; /** * Checks if a (basic) EOA account is a derived one, * that is meant to be used as a smart account key only. */ -export const isDerivedForSmartAccountKeyOnly = (index) => typeof index === 'number' && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; -export const getDefaultSelectedAccount = (accounts) => { +const isDerivedForSmartAccountKeyOnly = (index) => typeof index === 'number' && index >= derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; +exports.isDerivedForSmartAccountKeyOnly = isDerivedForSmartAccountKeyOnly; +const getDefaultSelectedAccount = (accounts) => { if (accounts.length === 0) return null; const smartAccounts = accounts.filter((acc) => acc.creation); @@ -137,17 +148,18 @@ export const getDefaultSelectedAccount = (accounts) => { return smartAccounts[0]; return accounts[0]; }; -export const getAccountImportStatus = ({ account, alreadyImportedAccounts, keys, accountsOnPage = [], keyIteratorType }) => { +exports.getDefaultSelectedAccount = getDefaultSelectedAccount; +const getAccountImportStatus = ({ account, alreadyImportedAccounts, keys, accountsOnPage = [], keyIteratorType }) => { const isAlreadyImported = alreadyImportedAccounts.some(({ addr }) => addr === account.addr); if (!isAlreadyImported) - return ImportStatus.NotImported; + return account_2.ImportStatus.NotImported; // Check if the account has been imported with at least one of the keys // that the account was originally associated with, when it was imported. const storedAssociatedKeys = alreadyImportedAccounts.find((x) => x.addr === account.addr)?.associatedKeys || []; const importedKeysForThisAcc = keys.filter((key) => storedAssociatedKeys.includes(key.addr)); // Could be imported as a view only account (and therefore, without a key) if (!importedKeysForThisAcc.length) - return ImportStatus.ImportedWithoutKey; + return account_2.ImportStatus.ImportedWithoutKey; // Merge the `associatedKeys` from the account instances found on the page, // with the `associatedKeys` of the account from the extension storage. This // ensures up-to-date keys, considering the account existing associatedKeys @@ -171,7 +183,7 @@ export const getAccountImportStatus = ({ account, alreadyImportedAccounts, keys, const associatedKeysNotImportedYet = mergedAssociatedKeys.filter((keyAddr) => associatedKeysAlreadyImported.some((x) => x.addr !== keyAddr)); const notImportedYetKeysExistInPage = accountsOnPage.some((x) => associatedKeysNotImportedYet.includes(x.account.addr)); if (notImportedYetKeysExistInPage) - return ImportStatus.ImportedWithSomeOfTheKeys; + return account_2.ImportStatus.ImportedWithSomeOfTheKeys; // Could happen when user imports a smart account with one associated key. // Then imports an Basic account. Then makes the Basic account a second key // for the smart account. In this case, both associated keys of the smart @@ -184,33 +196,37 @@ export const getAccountImportStatus = ({ account, alreadyImportedAccounts, keys, return ![...incomingAssociatedKeysSet].every((k) => storedAssociatedKeysSet.has(k)); }); return associatedKeysFoundOnPageAreDifferent - ? ImportStatus.ImportedWithSomeOfTheKeys - : ImportStatus.ImportedWithTheSameKeys; + ? account_2.ImportStatus.ImportedWithSomeOfTheKeys + : account_2.ImportStatus.ImportedWithTheSameKeys; } // Since there are `importedKeysForThisAcc`, as a fallback - // for all other scenarios this account has been imported with different keys. - return ImportStatus.ImportedWithDifferentKeys; + return account_2.ImportStatus.ImportedWithDifferentKeys; }; -export const getDefaultAccountPreferences = (accountAddr, prevAccounts, i) => { +exports.getAccountImportStatus = getAccountImportStatus; +const getDefaultAccountPreferences = (accountAddr, prevAccounts, i) => { const number = i ? prevAccounts.length + (i + 1) : prevAccounts.length + 1; return { label: `Account ${number}`, - pfp: getAddress(accountAddr) // default pfp - a jazz icon generated from the addr + pfp: (0, ethers_1.getAddress)(accountAddr) // default pfp - a jazz icon generated from the addr }; }; +exports.getDefaultAccountPreferences = getDefaultAccountPreferences; // As of version 4.25.0, a new Account interface has been introduced, // merging the previously separate Account and AccountPreferences interfaces. // This change requires a migration due to the introduction of a new controller, AccountsController, // which now manages both accounts and their preferences. -export function migrateAccountPreferencesToAccounts(accountPreferences, accounts) { +function migrateAccountPreferencesToAccounts(accountPreferences, accounts) { return accounts.map((a) => { return { ...a, - preferences: accountPreferences[a.addr] || { label: DEFAULT_ACCOUNT_LABEL, pfp: a.addr } + preferences: accountPreferences[a.addr] || { label: account_1.DEFAULT_ACCOUNT_LABEL, pfp: a.addr } }; }); } -export function getUniqueAccountsArray(accounts) { +exports.migrateAccountPreferencesToAccounts = migrateAccountPreferencesToAccounts; +function getUniqueAccountsArray(accounts) { return Array.from(new Map(accounts.map((account) => [account.addr, account])).values()); } +exports.getUniqueAccountsArray = getUniqueAccountsArray; //# sourceMappingURL=account.js.map \ No newline at end of file diff --git a/dist/src/libs/account/account.js.map b/dist/src/libs/account/account.js.map index 91352cda1..dcb27f263 100644 --- a/dist/src/libs/account/account.js.map +++ b/dist/src/libs/account/account.js.map @@ -1 +1 @@ -{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/libs/account/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getAddress, hexlify, Interface, toBeHex, toUtf8Bytes, ZeroAddress } from 'ethers'\n\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport {\n Account,\n AccountId,\n AccountOnPage,\n AccountPreferences,\n ImportStatus\n} from '../../interfaces/account'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { DKIM_VALIDATOR_ADDR, getSignerKey, RECOVERY_DEFAULTS } from '../dkim/recovery'\nimport { getBytecode } from '../proxyDeploy/bytecode'\nimport { PrivLevels } from '../proxyDeploy/deploy'\nimport { getAmbireAccountAddress } from '../proxyDeploy/getAmbireAddressTwo'\n\n/**\n * The minimum requirements are emailFrom and secondaryKey.\n * - emailFrom is the email from the email vault\n * - secondaryKey is the recoveryKey set in the email vault\n * - acceptUnknownSelectors: sets whether recovery can be done by DNSSEC keys\n * - waitUntilAcceptAdded: how much time to wait before the user accepts\n * a DNSSEC key\n * - waitUntilAcceptRemoved: how much time to wait before the user accepts\n * a removal of a DNSSEC key\n * - acceptEmptyDKIMSig: can recovery be performed without DKIM\n * - acceptEmptySecondSig: can recovery be performed without secondaryKey\n * - onlyOneSigTimelock: in case of 1/2 multisig, how much time to wait\n * before the recovery transaction can be executed\n */\ninterface DKIMRecoveryAccInfo {\n emailFrom: string\n secondaryKey: string\n waitUntilAcceptAdded?: BigInt\n waitUntilAcceptRemoved?: BigInt\n acceptEmptyDKIMSig?: boolean\n acceptEmptySecondSig?: boolean\n onlyOneSigTimelock?: BigInt\n}\n\n// returns to, data\nexport function getAccountDeployParams(account: Account): [string, string] {\n // for EOAs, we do not throw an error anymore as we need fake\n // values for the simulation\n if (account.creation === null) return [ZeroAddress, '0x']\n\n const factory = new Interface(['function deploy(bytes calldata code, uint256 salt) external'])\n return [\n account.creation.factoryAddr,\n factory.encodeFunctionData('deploy', [account.creation.bytecode, account.creation.salt])\n ]\n}\n\nexport function getBasicAccount(addr: string, existingAccounts: Account[]): Account {\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n return {\n addr,\n associatedKeys: [addr],\n initialPrivileges: [],\n creation: null,\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport async function getSmartAccount(\n privileges: PrivLevels[],\n existingAccounts: Account[]\n): Promise {\n const bytecode = await getBytecode(privileges)\n const addr = getAmbireAccountAddress(AMBIRE_ACCOUNT_FACTORY, bytecode)\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n\n return {\n addr,\n initialPrivileges: privileges.map((priv) => [priv.addr, priv.hash]),\n associatedKeys: privileges.map((priv) => priv.addr),\n creation: {\n factoryAddr: AMBIRE_ACCOUNT_FACTORY,\n bytecode,\n salt: toBeHex(0, 32)\n },\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport function getSpoof(account: Account) {\n const abiCoder = new AbiCoder()\n return abiCoder.encode(['address'], [account.associatedKeys[0]]) + SPOOF_SIGTYPE\n}\n\n/**\n * Create a DKIM recoverable email smart account\n *\n * @param recoveryInfo DKIMRecoveryAccInfo\n * @param associatedKey the key that has privileges\n * @returns Promise\n */\nexport async function getEmailAccount(\n recoveryInfo: DKIMRecoveryAccInfo,\n associatedKey: string\n): Promise {\n // const domain: string = recoveryInfo.emailFrom.split('@')[1]\n\n // TODO: make getEmailAccount work with cloudflare\n\n // try to take the dkimKey from the list of knownSelectors\n // if we cannot, we query a list of frequentlyUsedSelectors to try\n // to find the dkim key\n // let selector = knownSelectors[domain as keyof typeof knownSelectors] ?? ''\n // let dkimKey = selector ? await getPublicKeyIfAny({domain, selector: selector}) : ''\n // if (!dkimKey) {\n // const promises = frequentlyUsedSelectors.map(sel => getPublicKeyIfAny({domain, selector: sel}))\n // const results = await Promise.all(promises)\n // for (let i = 0; i < results.length; i++) {\n // if (results[i]) {\n // dkimKey = results[i]\n // selector = frequentlyUsedSelectors[i]\n // break\n // }\n // }\n // }\n\n // if there's no dkimKey, standard DKIM recovery is not possible\n // we leave the defaults empty and the user will have to rely on\n // keys added through DNSSEC\n const selector = hexlify(toUtf8Bytes(''))\n const modulus = hexlify(toUtf8Bytes(''))\n const exponent = hexlify(toUtf8Bytes(''))\n // if (dkimKey) {\n // const key = publicKeyToComponents(dkimKey.publicKey)\n // modulus = hexlify(key.modulus)\n // exponent = hexlify(toBeHex(key.exponent))\n // }\n\n // acceptUnknownSelectors should be always true\n // and should not be overriden by the FE at this point\n const acceptUnknownSelectors = RECOVERY_DEFAULTS.acceptUnknownSelectors\n const waitUntilAcceptAdded =\n recoveryInfo.waitUntilAcceptAdded ?? RECOVERY_DEFAULTS.waitUntilAcceptAdded\n const waitUntilAcceptRemoved =\n recoveryInfo.waitUntilAcceptRemoved ?? RECOVERY_DEFAULTS.waitUntilAcceptRemoved\n const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? RECOVERY_DEFAULTS.acceptEmptyDKIMSig\n const acceptEmptySecondSig =\n recoveryInfo.acceptEmptySecondSig ?? RECOVERY_DEFAULTS.acceptEmptySecondSig\n const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? RECOVERY_DEFAULTS.onlyOneSigTimelock\n\n const abiCoder = new AbiCoder()\n const validatorAddr = DKIM_VALIDATOR_ADDR\n const validatorData = abiCoder.encode(\n ['tuple(string,string,string,bytes,bytes,address,bool,uint32,uint32,bool,bool,uint32)'],\n [\n [\n recoveryInfo.emailFrom,\n RECOVERY_DEFAULTS.emailTo,\n selector,\n modulus,\n exponent,\n recoveryInfo.secondaryKey,\n acceptUnknownSelectors,\n waitUntilAcceptAdded,\n waitUntilAcceptRemoved,\n acceptEmptyDKIMSig,\n acceptEmptySecondSig,\n onlyOneSigTimelock\n ]\n ]\n )\n const { hash } = getSignerKey(validatorAddr, validatorData)\n const privileges = [{ addr: associatedKey, hash }]\n return getSmartAccount(privileges, [])\n}\n\nexport const isAmbireV1LinkedAccount = (factoryAddr?: string) =>\n factoryAddr && getAddress(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'\n\nexport const isSmartAccount = (account?: Account | null) => !!account && !!account.creation\n\n/**\n * Checks if a (basic) EOA account is a derived one,\n * that is meant to be used as a smart account key only.\n */\nexport const isDerivedForSmartAccountKeyOnly = (index?: number) =>\n typeof index === 'number' && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n\nexport const getDefaultSelectedAccount = (accounts: Account[]) => {\n if (accounts.length === 0) return null\n\n const smartAccounts = accounts.filter((acc) => acc.creation)\n if (smartAccounts.length) return smartAccounts[0]\n\n return accounts[0]\n}\n\nexport const getAccountImportStatus = ({\n account,\n alreadyImportedAccounts,\n keys,\n accountsOnPage = [],\n keyIteratorType\n}: {\n account: Account\n alreadyImportedAccounts: Account[]\n keys: Key[]\n accountsOnPage?: Omit[]\n keyIteratorType?: KeyIterator['type']\n}): ImportStatus => {\n const isAlreadyImported = alreadyImportedAccounts.some(({ addr }) => addr === account.addr)\n if (!isAlreadyImported) return ImportStatus.NotImported\n\n // Check if the account has been imported with at least one of the keys\n // that the account was originally associated with, when it was imported.\n const storedAssociatedKeys =\n alreadyImportedAccounts.find((x) => x.addr === account.addr)?.associatedKeys || []\n const importedKeysForThisAcc = keys.filter((key) => storedAssociatedKeys.includes(key.addr))\n // Could be imported as a view only account (and therefore, without a key)\n if (!importedKeysForThisAcc.length) return ImportStatus.ImportedWithoutKey\n\n // Merge the `associatedKeys` from the account instances found on the page,\n // with the `associatedKeys` of the account from the extension storage. This\n // ensures up-to-date keys, considering the account existing associatedKeys\n // could be outdated (associated keys of the smart accounts can change) or\n // incomplete initial data (during the initial import, not all associatedKeys\n // could have been fetched (for privacy).\n const mergedAssociatedKeys = Array.from(\n new Set([\n ...accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .flatMap((x) => x.account.associatedKeys),\n ...storedAssociatedKeys\n ])\n )\n\n // Same key in this context means not only the same key address, but the\n // same type too. Because user can opt in to import same key address with\n // many different hardware wallets (Trezor, Ledger, GridPlus, etc.) or\n // the same address with seed (private key).\n const associatedKeysAlreadyImported = importedKeysForThisAcc.filter(\n (key) =>\n mergedAssociatedKeys.includes(key.addr) &&\n // if key type is not provided, skip this part of the check on purpose\n (keyIteratorType ? key.type === keyIteratorType : true)\n )\n if (associatedKeysAlreadyImported.length) {\n const associatedKeysNotImportedYet = mergedAssociatedKeys.filter((keyAddr) =>\n associatedKeysAlreadyImported.some((x) => x.addr !== keyAddr)\n )\n\n const notImportedYetKeysExistInPage = accountsOnPage.some((x) =>\n associatedKeysNotImportedYet.includes(x.account.addr)\n )\n\n if (notImportedYetKeysExistInPage) return ImportStatus.ImportedWithSomeOfTheKeys\n\n // Could happen when user imports a smart account with one associated key.\n // Then imports an Basic account. Then makes the Basic account a second key\n // for the smart account. In this case, both associated keys of the smart\n // account are imported, but the smart account's `associatedKeys` are incomplete.\n const associatedKeysFoundOnPageAreDifferent = accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .some((x) => {\n const incomingAssociatedKeysSet = new Set(x.account.associatedKeys)\n const storedAssociatedKeysSet = new Set(storedAssociatedKeys)\n\n return ![...incomingAssociatedKeysSet].every((k) => storedAssociatedKeysSet.has(k))\n })\n\n return associatedKeysFoundOnPageAreDifferent\n ? ImportStatus.ImportedWithSomeOfTheKeys\n : ImportStatus.ImportedWithTheSameKeys\n }\n\n // Since there are `importedKeysForThisAcc`, as a fallback -\n // for all other scenarios this account has been imported with different keys.\n return ImportStatus.ImportedWithDifferentKeys\n}\n\nexport const getDefaultAccountPreferences = (\n accountAddr: string,\n prevAccounts: Account[],\n i?: number\n): AccountPreferences => {\n const number = i ? prevAccounts.length + (i + 1) : prevAccounts.length + 1\n\n return {\n label: `Account ${number}`,\n pfp: getAddress(accountAddr) // default pfp - a jazz icon generated from the addr\n }\n}\n\n// As of version 4.25.0, a new Account interface has been introduced,\n// merging the previously separate Account and AccountPreferences interfaces.\n// This change requires a migration due to the introduction of a new controller, AccountsController,\n// which now manages both accounts and their preferences.\nexport function migrateAccountPreferencesToAccounts(\n accountPreferences: {\n [key: AccountId]: AccountPreferences\n },\n accounts: Account[]\n) {\n return accounts.map((a) => {\n return {\n ...a,\n preferences: accountPreferences[a.addr] || { label: DEFAULT_ACCOUNT_LABEL, pfp: a.addr }\n }\n })\n}\n\nexport function getUniqueAccountsArray(accounts: Account[]) {\n return Array.from(new Map(accounts.map((account) => [account.addr, account])).values())\n}\n"]} \ No newline at end of file +{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/libs/account/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getAddress, hexlify, Interface, toBeHex, toUtf8Bytes, ZeroAddress } from 'ethers'\n\nimport { DEFAULT_ACCOUNT_LABEL } from '../../consts/account'\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport {\n Account,\n AccountId,\n AccountOnPage,\n AccountPreferences,\n ImportStatus\n} from '../../interfaces/account'\nimport { KeyIterator } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { DKIM_VALIDATOR_ADDR, getSignerKey, RECOVERY_DEFAULTS } from '../dkim/recovery'\nimport { getBytecode } from '../proxyDeploy/bytecode'\nimport { PrivLevels } from '../proxyDeploy/deploy'\nimport { getAmbireAccountAddress } from '../proxyDeploy/getAmbireAddressTwo'\n\n/**\n * The minimum requirements are emailFrom and secondaryKey.\n * - emailFrom is the email from the email vault\n * - secondaryKey is the recoveryKey set in the email vault\n * - acceptUnknownSelectors: sets whether recovery can be done by DNSSEC keys\n * - waitUntilAcceptAdded: how much time to wait before the user accepts\n * a DNSSEC key\n * - waitUntilAcceptRemoved: how much time to wait before the user accepts\n * a removal of a DNSSEC key\n * - acceptEmptyDKIMSig: can recovery be performed without DKIM\n * - acceptEmptySecondSig: can recovery be performed without secondaryKey\n * - onlyOneSigTimelock: in case of 1/2 multisig, how much time to wait\n * before the recovery transaction can be executed\n */\ninterface DKIMRecoveryAccInfo {\n emailFrom: string\n secondaryKey: string\n waitUntilAcceptAdded?: BigInt\n waitUntilAcceptRemoved?: BigInt\n acceptEmptyDKIMSig?: boolean\n acceptEmptySecondSig?: boolean\n onlyOneSigTimelock?: BigInt\n}\n\n// returns to, data\nexport function getAccountDeployParams(account: Account): [string, string] {\n // for EOAs, we do not throw an error anymore as we need fake\n // values for the simulation\n if (account.creation === null) return [ZeroAddress, '0x']\n\n const factory = new Interface(['function deploy(bytes calldata code, uint256 salt) external'])\n return [\n account.creation.factoryAddr,\n factory.encodeFunctionData('deploy', [account.creation.bytecode, account.creation.salt])\n ]\n}\n\nexport function getBasicAccount(addr: string, existingAccounts: Account[]): Account {\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n return {\n addr,\n associatedKeys: [addr],\n initialPrivileges: [],\n creation: null,\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport async function getSmartAccount(\n privileges: PrivLevels[],\n existingAccounts: Account[]\n): Promise {\n const bytecode = await getBytecode(privileges)\n const addr = getAmbireAccountAddress(AMBIRE_ACCOUNT_FACTORY, bytecode)\n const { preferences } = existingAccounts.find((acc) => acc.addr === addr) || {}\n\n return {\n addr,\n initialPrivileges: privileges.map((priv) => [priv.addr, priv.hash]),\n associatedKeys: privileges.map((priv) => priv.addr),\n creation: {\n factoryAddr: AMBIRE_ACCOUNT_FACTORY,\n bytecode,\n salt: toBeHex(0, 32)\n },\n preferences: {\n label: preferences?.label || DEFAULT_ACCOUNT_LABEL,\n pfp: preferences?.pfp || addr\n }\n }\n}\n\nexport function getSpoof(account: Account) {\n const abiCoder = new AbiCoder()\n return abiCoder.encode(['address'], [account.associatedKeys[0]]) + SPOOF_SIGTYPE\n}\n\n/**\n * Create a DKIM recoverable email smart account\n *\n * @param recoveryInfo DKIMRecoveryAccInfo\n * @param associatedKey the key that has privileges\n * @returns Promise\n */\nexport async function getEmailAccount(\n recoveryInfo: DKIMRecoveryAccInfo,\n associatedKey: string\n): Promise {\n // const domain: string = recoveryInfo.emailFrom.split('@')[1]\n\n // TODO: make getEmailAccount work with cloudflare\n\n // try to take the dkimKey from the list of knownSelectors\n // if we cannot, we query a list of frequentlyUsedSelectors to try\n // to find the dkim key\n // let selector = knownSelectors[domain as keyof typeof knownSelectors] ?? ''\n // let dkimKey = selector ? await getPublicKeyIfAny({domain, selector: selector}) : ''\n // if (!dkimKey) {\n // const promises = frequentlyUsedSelectors.map(sel => getPublicKeyIfAny({domain, selector: sel}))\n // const results = await Promise.all(promises)\n // for (let i = 0; i < results.length; i++) {\n // if (results[i]) {\n // dkimKey = results[i]\n // selector = frequentlyUsedSelectors[i]\n // break\n // }\n // }\n // }\n\n // if there's no dkimKey, standard DKIM recovery is not possible\n // we leave the defaults empty and the user will have to rely on\n // keys added through DNSSEC\n const selector = hexlify(toUtf8Bytes(''))\n const modulus = hexlify(toUtf8Bytes(''))\n const exponent = hexlify(toUtf8Bytes(''))\n // if (dkimKey) {\n // const key = publicKeyToComponents(dkimKey.publicKey)\n // modulus = hexlify(key.modulus)\n // exponent = hexlify(toBeHex(key.exponent))\n // }\n\n // acceptUnknownSelectors should be always true\n // and should not be overriden by the FE at this point\n const acceptUnknownSelectors = RECOVERY_DEFAULTS.acceptUnknownSelectors\n const waitUntilAcceptAdded =\n recoveryInfo.waitUntilAcceptAdded ?? RECOVERY_DEFAULTS.waitUntilAcceptAdded\n const waitUntilAcceptRemoved =\n recoveryInfo.waitUntilAcceptRemoved ?? RECOVERY_DEFAULTS.waitUntilAcceptRemoved\n const acceptEmptyDKIMSig = recoveryInfo.acceptEmptyDKIMSig ?? RECOVERY_DEFAULTS.acceptEmptyDKIMSig\n const acceptEmptySecondSig =\n recoveryInfo.acceptEmptySecondSig ?? RECOVERY_DEFAULTS.acceptEmptySecondSig\n const onlyOneSigTimelock = recoveryInfo.onlyOneSigTimelock ?? RECOVERY_DEFAULTS.onlyOneSigTimelock\n\n const abiCoder = new AbiCoder()\n const validatorAddr = DKIM_VALIDATOR_ADDR\n const validatorData = abiCoder.encode(\n ['tuple(string,string,string,bytes,bytes,address,bool,uint32,uint32,bool,bool,uint32)'],\n [\n [\n recoveryInfo.emailFrom,\n RECOVERY_DEFAULTS.emailTo,\n selector,\n modulus,\n exponent,\n recoveryInfo.secondaryKey,\n acceptUnknownSelectors,\n waitUntilAcceptAdded,\n waitUntilAcceptRemoved,\n acceptEmptyDKIMSig,\n acceptEmptySecondSig,\n onlyOneSigTimelock\n ]\n ]\n )\n const { hash } = getSignerKey(validatorAddr, validatorData)\n const privileges = [{ addr: associatedKey, hash }]\n return getSmartAccount(privileges, [])\n}\n\nexport const isAmbireV1LinkedAccount = (factoryAddr?: string) =>\n factoryAddr && getAddress(factoryAddr) === '0xBf07a0Df119Ca234634588fbDb5625594E2a5BCA'\n\nexport const isSmartAccount = (account?: Account | null) => !!account && !!account.creation\n\n/**\n * Checks if a (basic) EOA account is a derived one,\n * that is meant to be used as a smart account key only.\n */\nexport const isDerivedForSmartAccountKeyOnly = (index?: number) =>\n typeof index === 'number' && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n\nexport const getDefaultSelectedAccount = (accounts: Account[]) => {\n if (accounts.length === 0) return null\n\n const smartAccounts = accounts.filter((acc) => acc.creation)\n if (smartAccounts.length) return smartAccounts[0]\n\n return accounts[0]\n}\n\nexport const getAccountImportStatus = ({\n account,\n alreadyImportedAccounts,\n keys,\n accountsOnPage = [],\n keyIteratorType\n}: {\n account: Account\n alreadyImportedAccounts: Account[]\n keys: Key[]\n accountsOnPage?: Omit[]\n keyIteratorType?: KeyIterator['type']\n}): ImportStatus => {\n const isAlreadyImported = alreadyImportedAccounts.some(({ addr }) => addr === account.addr)\n if (!isAlreadyImported) return ImportStatus.NotImported\n\n // Check if the account has been imported with at least one of the keys\n // that the account was originally associated with, when it was imported.\n const storedAssociatedKeys =\n alreadyImportedAccounts.find((x) => x.addr === account.addr)?.associatedKeys || []\n const importedKeysForThisAcc = keys.filter((key) => storedAssociatedKeys.includes(key.addr))\n // Could be imported as a view only account (and therefore, without a key)\n if (!importedKeysForThisAcc.length) return ImportStatus.ImportedWithoutKey\n\n // Merge the `associatedKeys` from the account instances found on the page,\n // with the `associatedKeys` of the account from the extension storage. This\n // ensures up-to-date keys, considering the account existing associatedKeys\n // could be outdated (associated keys of the smart accounts can change) or\n // incomplete initial data (during the initial import, not all associatedKeys\n // could have been fetched (for privacy).\n const mergedAssociatedKeys = Array.from(\n new Set([\n ...accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .flatMap((x) => x.account.associatedKeys),\n ...storedAssociatedKeys\n ])\n )\n\n // Same key in this context means not only the same key address, but the\n // same type too. Because user can opt in to import same key address with\n // many different hardware wallets (Trezor, Ledger, GridPlus, etc.) or\n // the same address with seed (private key).\n const associatedKeysAlreadyImported = importedKeysForThisAcc.filter(\n (key) =>\n mergedAssociatedKeys.includes(key.addr) &&\n // if key type is not provided, skip this part of the check on purpose\n (keyIteratorType ? key.type === keyIteratorType : true)\n )\n if (associatedKeysAlreadyImported.length) {\n const associatedKeysNotImportedYet = mergedAssociatedKeys.filter((keyAddr) =>\n associatedKeysAlreadyImported.some((x) => x.addr !== keyAddr)\n )\n\n const notImportedYetKeysExistInPage = accountsOnPage.some((x) =>\n associatedKeysNotImportedYet.includes(x.account.addr)\n )\n\n if (notImportedYetKeysExistInPage) return ImportStatus.ImportedWithSomeOfTheKeys\n\n // Could happen when user imports a smart account with one associated key.\n // Then imports an Basic account. Then makes the Basic account a second key\n // for the smart account. In this case, both associated keys of the smart\n // account are imported, but the smart account's `associatedKeys` are incomplete.\n const associatedKeysFoundOnPageAreDifferent = accountsOnPage\n .filter((x) => x.account.addr === account.addr)\n .some((x) => {\n const incomingAssociatedKeysSet = new Set(x.account.associatedKeys)\n const storedAssociatedKeysSet = new Set(storedAssociatedKeys)\n\n return ![...incomingAssociatedKeysSet].every((k) => storedAssociatedKeysSet.has(k))\n })\n\n return associatedKeysFoundOnPageAreDifferent\n ? ImportStatus.ImportedWithSomeOfTheKeys\n : ImportStatus.ImportedWithTheSameKeys\n }\n\n // Since there are `importedKeysForThisAcc`, as a fallback -\n // for all other scenarios this account has been imported with different keys.\n return ImportStatus.ImportedWithDifferentKeys\n}\n\nexport const getDefaultAccountPreferences = (\n accountAddr: string,\n prevAccounts: Account[],\n i?: number\n): AccountPreferences => {\n const number = i ? prevAccounts.length + (i + 1) : prevAccounts.length + 1\n\n return {\n label: `Account ${number}`,\n pfp: getAddress(accountAddr) // default pfp - a jazz icon generated from the addr\n }\n}\n\n// As of version 4.25.0, a new Account interface has been introduced,\n// merging the previously separate Account and AccountPreferences interfaces.\n// This change requires a migration due to the introduction of a new controller, AccountsController,\n// which now manages both accounts and their preferences.\nexport function migrateAccountPreferencesToAccounts(\n accountPreferences: {\n [key: AccountId]: AccountPreferences\n },\n accounts: Account[]\n) {\n return accounts.map((a) => {\n return {\n ...a,\n preferences: accountPreferences[a.addr] || { label: DEFAULT_ACCOUNT_LABEL, pfp: a.addr }\n }\n })\n}\n\nexport function getUniqueAccountsArray(accounts: Account[]) {\n return Array.from(new Map(accounts.map((account) => [account.addr, account])).values())\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.js b/dist/src/libs/accountAdder/accountAdder.js index ec8b83587..203f3deb8 100644 --- a/dist/src/libs/accountAdder/accountAdder.js +++ b/dist/src/libs/accountAdder/accountAdder.js @@ -1,8 +1,11 @@ -import { fetchCaught } from '../../../v1/services/fetch'; -export async function getIdentity(address, fetch, relayerUrl) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getIdentity = void 0; +const fetch_1 = require("../../../v1/services/fetch"); +async function getIdentity(address, fetch, relayerUrl) { // Use `fetchCaught` because the endpoint could return 404 if the account // is not found, which should not throw an error - const accountIdentityResponse = await fetchCaught(fetch, `${relayerUrl}/v2/identity/${address}`); + const accountIdentityResponse = await (0, fetch_1.fetchCaught)(fetch, `${relayerUrl}/v2/identity/${address}`); // Trick to determine if there is an error throw. When the request 404s, // there is no error message incoming, which is enough to treat it as a // no-error, 404 response is expected for EOAs. @@ -35,4 +38,5 @@ export async function getIdentity(address, fetch, relayerUrl) { initialPrivileges }; } +exports.getIdentity = getIdentity; //# sourceMappingURL=accountAdder.js.map \ No newline at end of file diff --git a/dist/src/libs/accountAdder/accountAdder.js.map b/dist/src/libs/accountAdder/accountAdder.js.map index fd4944929..cfaa75874 100644 --- a/dist/src/libs/accountAdder/accountAdder.js.map +++ b/dist/src/libs/accountAdder/accountAdder.js.map @@ -1 +1 @@ -{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/libs/accountAdder/accountAdder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAGxD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,KAAY,EAAE,UAAkB;IACjF,yEAAyE;IACzE,gDAAgD;IAChD,MAAM,uBAAuB,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,UAAU,gBAAgB,OAAO,EAAE,CAAC,CAAA;IAEhG,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,IAAI,uBAAuB,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;IAEpF,MAAM,eAAe,GAAQ,uBAAuB,EAAE,IAAI,CAAA;IAC1D,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,IAAI,cAAc,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,eAAe,KAAK,IAAI;QACxB,qBAAqB,IAAI,eAAe;QACxC,OAAO,eAAe,CAAC,mBAAmB,KAAK,QAAQ;QACvD,UAAU,IAAI,eAAe;QAC7B,OAAO,eAAe,CAAC,QAAQ,KAAK,QAAQ;QAC5C,MAAM,IAAI,eAAe;QACzB,OAAO,eAAe,CAAC,IAAI,KAAK,QAAQ,EACxC;QACA,QAAQ,GAAG;YACT,WAAW,EAAE,eAAe,CAAC,mBAAmB;YAChD,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,IAAI,EAAE,eAAe,CAAC,IAAI;SAC3B,CAAA;KACF;IAED,IAAI,eAAe,EAAE,cAAc,EAAE;QACnC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,IAAI,EAAE,CAAC,CAAA;KACpE;IAED,MAAM,iBAAiB,GAAG,eAAe,EAAE,iBAAiB,IAAI,EAAE,CAAA;IAElE,OAAO;QACL,QAAQ;QACR,cAAc;QACd,iBAAiB;KAClB,CAAA;AACH,CAAC","sourcesContent":["import { fetchCaught } from '../../../v1/services/fetch'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport async function getIdentity(address: string, fetch: Fetch, relayerUrl: string) {\n // Use `fetchCaught` because the endpoint could return 404 if the account\n // is not found, which should not throw an error\n const accountIdentityResponse = await fetchCaught(fetch, `${relayerUrl}/v2/identity/${address}`)\n\n // Trick to determine if there is an error throw. When the request 404s,\n // there is no error message incoming, which is enough to treat it as a\n // no-error, 404 response is expected for EOAs.\n if (accountIdentityResponse?.errMsg) throw new Error(accountIdentityResponse.errMsg)\n\n const accountIdentity: any = accountIdentityResponse?.body\n let creation = null\n let associatedKeys = [address]\n if (\n typeof accountIdentity === 'object' &&\n accountIdentity !== null &&\n 'identityFactoryAddr' in accountIdentity &&\n typeof accountIdentity.identityFactoryAddr === 'string' &&\n 'bytecode' in accountIdentity &&\n typeof accountIdentity.bytecode === 'string' &&\n 'salt' in accountIdentity &&\n typeof accountIdentity.salt === 'string'\n ) {\n creation = {\n factoryAddr: accountIdentity.identityFactoryAddr,\n bytecode: accountIdentity.bytecode,\n salt: accountIdentity.salt\n }\n }\n\n if (accountIdentity?.associatedKeys) {\n associatedKeys = Object.keys(accountIdentity?.associatedKeys || {})\n }\n\n const initialPrivileges = accountIdentity?.initialPrivileges || []\n\n return {\n creation,\n associatedKeys,\n initialPrivileges\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"accountAdder.js","sourceRoot":"","sources":["../../../../src/libs/accountAdder/accountAdder.ts"],"names":[],"mappings":";;;AAAA,sDAAwD;AAGjD,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,KAAY,EAAE,UAAkB;IACjF,yEAAyE;IACzE,gDAAgD;IAChD,MAAM,uBAAuB,GAAG,MAAM,IAAA,mBAAW,EAAC,KAAK,EAAE,GAAG,UAAU,gBAAgB,OAAO,EAAE,CAAC,CAAA;IAEhG,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,IAAI,uBAAuB,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;IAEpF,MAAM,eAAe,GAAQ,uBAAuB,EAAE,IAAI,CAAA;IAC1D,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,IAAI,cAAc,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,eAAe,KAAK,IAAI;QACxB,qBAAqB,IAAI,eAAe;QACxC,OAAO,eAAe,CAAC,mBAAmB,KAAK,QAAQ;QACvD,UAAU,IAAI,eAAe;QAC7B,OAAO,eAAe,CAAC,QAAQ,KAAK,QAAQ;QAC5C,MAAM,IAAI,eAAe;QACzB,OAAO,eAAe,CAAC,IAAI,KAAK,QAAQ,EACxC;QACA,QAAQ,GAAG;YACT,WAAW,EAAE,eAAe,CAAC,mBAAmB;YAChD,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,IAAI,EAAE,eAAe,CAAC,IAAI;SAC3B,CAAA;KACF;IAED,IAAI,eAAe,EAAE,cAAc,EAAE;QACnC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,IAAI,EAAE,CAAC,CAAA;KACpE;IAED,MAAM,iBAAiB,GAAG,eAAe,EAAE,iBAAiB,IAAI,EAAE,CAAA;IAElE,OAAO;QACL,QAAQ;QACR,cAAc;QACd,iBAAiB;KAClB,CAAA;AACH,CAAC;AAzCD,kCAyCC","sourcesContent":["import { fetchCaught } from '../../../v1/services/fetch'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport async function getIdentity(address: string, fetch: Fetch, relayerUrl: string) {\n // Use `fetchCaught` because the endpoint could return 404 if the account\n // is not found, which should not throw an error\n const accountIdentityResponse = await fetchCaught(fetch, `${relayerUrl}/v2/identity/${address}`)\n\n // Trick to determine if there is an error throw. When the request 404s,\n // there is no error message incoming, which is enough to treat it as a\n // no-error, 404 response is expected for EOAs.\n if (accountIdentityResponse?.errMsg) throw new Error(accountIdentityResponse.errMsg)\n\n const accountIdentity: any = accountIdentityResponse?.body\n let creation = null\n let associatedKeys = [address]\n if (\n typeof accountIdentity === 'object' &&\n accountIdentity !== null &&\n 'identityFactoryAddr' in accountIdentity &&\n typeof accountIdentity.identityFactoryAddr === 'string' &&\n 'bytecode' in accountIdentity &&\n typeof accountIdentity.bytecode === 'string' &&\n 'salt' in accountIdentity &&\n typeof accountIdentity.salt === 'string'\n ) {\n creation = {\n factoryAddr: accountIdentity.identityFactoryAddr,\n bytecode: accountIdentity.bytecode,\n salt: accountIdentity.salt\n }\n }\n\n if (accountIdentity?.associatedKeys) {\n associatedKeys = Object.keys(accountIdentity?.associatedKeys || {})\n }\n\n const initialPrivileges = accountIdentity?.initialPrivileges || []\n\n return {\n creation,\n associatedKeys,\n initialPrivileges\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.js b/dist/src/libs/accountOp/accountOp.js index 7abbf41e9..e61d4a50f 100644 --- a/dist/src/libs/accountOp/accountOp.js +++ b/dist/src/libs/accountOp/accountOp.js @@ -1,7 +1,10 @@ -import { AbiCoder, getBytes, Interface, keccak256, toBeHex } from 'ethers'; -import { SINGLETON } from '../../consts/deploy'; -import { stringify } from '../richJson/richJson'; -export var AccountOpStatus; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.accountOpSignableHash = exports.getSignableHash = exports.getSignableCallsForBundlerEstimate = exports.getSignableCalls = exports.isAccountOpsIntentEqual = exports.canBroadcast = exports.callToTuple = exports.toSingletonCall = exports.AccountOpStatus = void 0; +const ethers_1 = require("ethers"); +const deploy_1 = require("../../consts/deploy"); +const richJson_1 = require("../richJson/richJson"); +var AccountOpStatus; (function (AccountOpStatus) { AccountOpStatus["Pending"] = "pending"; AccountOpStatus["BroadcastedButNotConfirmed"] = "broadcasted-but-not-confirmed"; @@ -10,7 +13,7 @@ export var AccountOpStatus; AccountOpStatus["Rejected"] = "rejected"; AccountOpStatus["UnknownButPastNonce"] = "unknown-but-past-nonce"; AccountOpStatus["BroadcastButStuck"] = "broadcast-but-stuck"; -})(AccountOpStatus || (AccountOpStatus = {})); +})(AccountOpStatus = exports.AccountOpStatus || (exports.AccountOpStatus = {})); /** * If we want to deploy a contract, the to field of Call will actually * be empty (undefined). In order to simulate it in a transaction or @@ -20,7 +23,7 @@ export var AccountOpStatus; * @param call * @returns Call */ -export function toSingletonCall(call) { +function toSingletonCall(call) { if (call.to) return call; const singletonABI = [ @@ -35,17 +38,19 @@ export function toSingletonCall(call) { type: 'function' } ]; - const singletonInterface = new Interface(singletonABI); + const singletonInterface = new ethers_1.Interface(singletonABI); return { - to: SINGLETON, + to: deploy_1.SINGLETON, value: call.value, - data: singletonInterface.encodeFunctionData('deploy', [call.data, toBeHex(0, 32)]) + data: singletonInterface.encodeFunctionData('deploy', [call.data, (0, ethers_1.toBeHex)(0, 32)]) }; } -export function callToTuple(call) { +exports.toSingletonCall = toSingletonCall; +function callToTuple(call) { return [call.to, call.value.toString(), call.data]; } -export function canBroadcast(op, accountIsEOA) { +exports.callToTuple = callToTuple; +function canBroadcast(op, accountIsEOA) { if (op.signingKeyAddr === null) throw new Error('missing signingKeyAddr'); if (op.signature === null) @@ -66,6 +71,7 @@ export function canBroadcast(op, accountIsEOA) { } return true; } +exports.canBroadcast = canBroadcast; /** * Compare two AccountOps intents. * @@ -73,7 +79,7 @@ export function canBroadcast(op, accountIsEOA) { * * Since we are comparing the intents, we exclude any other properties of the AccountOps. */ -export function isAccountOpsIntentEqual(accountOps1, accountOps2) { +function isAccountOpsIntentEqual(accountOps1, accountOps2) { const createIntent = (accountOps) => { return accountOps.map(({ accountAddr, networkId, calls }) => ({ accountAddr, @@ -81,9 +87,10 @@ export function isAccountOpsIntentEqual(accountOps1, accountOps2) { calls })); }; - return stringify(createIntent(accountOps1)) === stringify(createIntent(accountOps2)); + return (0, richJson_1.stringify)(createIntent(accountOps1)) === (0, richJson_1.stringify)(createIntent(accountOps2)); } -export function getSignableCalls(op) { +exports.isAccountOpsIntentEqual = isAccountOpsIntentEqual; +function getSignableCalls(op) { const callsToSign = op.calls.map(toSingletonCall).map(callToTuple); if (op.activatorCall) callsToSign.push(callToTuple(op.activatorCall)); @@ -91,7 +98,8 @@ export function getSignableCalls(op) { callsToSign.push(callToTuple(op.feeCall)); return callsToSign; } -export function getSignableCallsForBundlerEstimate(op) { +exports.getSignableCalls = getSignableCalls; +function getSignableCallsForBundlerEstimate(op) { const callsToSign = getSignableCalls(op); // add the fee call one more time when doing a bundler estimate // this is because the feeCall during estimation is fake (approve instead @@ -101,10 +109,12 @@ export function getSignableCallsForBundlerEstimate(op) { callsToSign.push(callToTuple(op.feeCall)); return callsToSign; } -export function getSignableHash(addr, chainId, nonce, calls) { - const abiCoder = new AbiCoder(); - return getBytes(keccak256(abiCoder.encode(['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'], [addr, chainId, nonce, calls]))); +exports.getSignableCallsForBundlerEstimate = getSignableCallsForBundlerEstimate; +function getSignableHash(addr, chainId, nonce, calls) { + const abiCoder = new ethers_1.AbiCoder(); + return (0, ethers_1.getBytes)((0, ethers_1.keccak256)(abiCoder.encode(['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'], [addr, chainId, nonce, calls]))); } +exports.getSignableHash = getSignableHash; /** * This function returns the hash as a Uint8Array instead of string * and the reason for this is the implementation that follows: @@ -130,7 +140,8 @@ export function getSignableHash(addr, chainId, nonce, calls) { * @param op AccountOp * @returns Uint8Array */ -export function accountOpSignableHash(op, chainId) { +function accountOpSignableHash(op, chainId) { return getSignableHash(op.accountAddr, chainId, op.nonce ?? 0n, getSignableCalls(op)); } +exports.accountOpSignableHash = accountOpSignableHash; //# sourceMappingURL=accountOp.js.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/accountOp.js.map b/dist/src/libs/accountOp/accountOp.js.map index 845034432..70f53b320 100644 --- a/dist/src/libs/accountOp/accountOp.js.map +++ b/dist/src/libs/accountOp/accountOp.js.map @@ -1 +1 @@ -{"version":3,"file":"accountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/accountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getBytes, Interface, keccak256, toBeHex } from 'ethers'\n\nimport { SINGLETON } from '../../consts/deploy'\nimport { AccountId } from '../../interfaces/account'\n// eslint-disable-next-line import/no-cycle\nimport { Key } from '../../interfaces/keystore'\nimport { NetworkId } from '../../interfaces/network'\nimport { PaymasterService } from '../erc7677/types'\nimport { stringify } from '../richJson/richJson'\nimport { UserOperation } from '../userOperation/types'\nimport { Call } from './types'\n\n// This is an abstract representation of the gas fee payment\n// 1) it cannot contain details about maxFeePerGas/baseFee because some networks might not be aware of EIP-1559; it only cares about total amount\n// 2) it cannot contain info about the mechanism of payment (from EOA but on smart account, pure EOA paying it's fee directly, 4337 paymaster, 4337 direct, relayer, etc.)\n// This info can be inferred when needed from the account type and whether we're running in 4337 mode or not\n// 3) isGasTank and isERC4337 can both be true\n// 4) whether those values are sane will be checked in an additional function (currently `canBroadcast`); for example, this function is meant to ensure that in case of an EOA, the fee is always paid in native\nexport interface GasFeePayment {\n isERC4337: boolean\n isGasTank: boolean\n paidBy: string\n inToken: string\n // optional, because older versions of the extension did not have this stored locally\n feeTokenNetworkId?: NetworkId\n amount: bigint\n simulatedGasLimit: bigint\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n isSponsored?: boolean\n}\n\nexport enum AccountOpStatus {\n Pending = 'pending',\n BroadcastedButNotConfirmed = 'broadcasted-but-not-confirmed',\n Success = 'success',\n Failure = 'failure',\n Rejected = 'rejected',\n UnknownButPastNonce = 'unknown-but-past-nonce',\n BroadcastButStuck = 'broadcast-but-stuck'\n}\n\n// Equivalent to ERC-4337 UserOp, but more universal than it since a AccountOp can be transformed to\n// a UserOp, or to a direct EOA transaction, or relayed through the Ambire relayer\n// it is more precisely defined than a UserOp though - UserOp just has calldata and this has individual `calls`\nexport interface AccountOp {\n accountAddr: string\n networkId: NetworkId\n // this may not be defined, in case the user has not picked a key yet\n signingKeyAddr: Key['addr'] | null\n signingKeyType: Key['type'] | null\n // this may not be set in case we haven't set it yet\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint | null\n // @TODO: nonce namespace? it is dependent on gasFeePayment\n calls: Call[]\n // the feeCall is an extra call we add manually when there's a\n // relayer/paymaster transaction so that the relayer/paymaster\n // can authorize the payment\n feeCall?: Call\n // the activator call is for cases where we want to activate the EntryPoint\n // it existed previously in the UserOperation type but now it is no longer\n // limited to it as we can broadcast none ERC-4337 txn with an activatorCall\n activatorCall?: Call\n gasLimit: number | null\n signature: string | null\n gasFeePayment: GasFeePayment | null\n // This is used when we have an account recovery to finalize before executing the AccountOp,\n // And we set this to the recovery finalization AccountOp; could be used in other scenarios too in the future,\n // for example account migration (from v1 QuickAcc to v2)\n // theoretically you can recurse these (an AccountOp set as *ToExecuteBefore can have another accountOpToExecuteBefore)\n // however, in practice we only use this for recovery atm and we never have a case with more than one\n // Supporting this can done relatively easily via executeMany() for v2 accounts, and with multiple UserOps via 4337 (again v2 accs)\n accountOpToExecuteBefore: AccountOp | null\n txnId?: string\n status?: AccountOpStatus\n // in the case of ERC-4337, we need an UserOperation structure for the AccountOp\n asUserOperation?: UserOperation\n // all kinds of custom accountOp properties that are needed in specific cases\n meta?: {\n // pass the entry point authorization signature for the deploy 4337 txn\n entryPointAuthorization?: string\n paymasterService?: PaymasterService\n }\n}\n\n/**\n * If we want to deploy a contract, the to field of Call will actually\n * be empty (undefined). In order to simulate it in a transaction or\n * perform it using a smart account, we need to transform the call to\n * a call to the singleton\n *\n * @param call\n * @returns Call\n */\nexport function toSingletonCall(call: Call): Call {\n if (call.to) return call\n\n const singletonABI = [\n {\n inputs: [\n { internalType: 'bytes', name: '_initCode', type: 'bytes' },\n { internalType: 'bytes32', name: '_salt', type: 'bytes32' }\n ],\n name: 'deploy',\n outputs: [{ internalType: 'address payable', name: 'createdContract', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'function'\n }\n ]\n const singletonInterface = new Interface(singletonABI)\n return {\n to: SINGLETON,\n value: call.value,\n data: singletonInterface.encodeFunctionData('deploy', [call.data, toBeHex(0, 32)])\n }\n}\n\nexport function callToTuple(call: Call): [string, string, string] {\n return [call.to, call.value.toString(), call.data]\n}\n\nexport function canBroadcast(op: AccountOp, accountIsEOA: boolean): boolean {\n if (op.signingKeyAddr === null) throw new Error('missing signingKeyAddr')\n if (op.signature === null) throw new Error('missing signature')\n if (op.gasFeePayment === null) throw new Error('missing gasFeePayment')\n if (op.gasLimit === null) throw new Error('missing gasLimit')\n if (op.nonce === null) throw new Error('missing nonce')\n if (accountIsEOA) {\n if (op.gasFeePayment.isGasTank)\n throw new Error('gas fee payment with gas tank cannot be used with an EOA')\n if (op.gasFeePayment.inToken !== '0x0000000000000000000000000000000000000000')\n throw new Error('gas fee payment needs to be in the native asset')\n if (op.gasFeePayment.paidBy !== op.accountAddr)\n throw new Error('gas fee payment cannot be paid by anyone other than the EOA that signed it')\n }\n return true\n}\n\n/**\n * Compare two AccountOps intents.\n *\n * By 'intent,' we are referring to the sender of the transaction, the network it is sent on, and the included calls.\n *\n * Since we are comparing the intents, we exclude any other properties of the AccountOps.\n */\nexport function isAccountOpsIntentEqual(\n accountOps1: AccountOp[],\n accountOps2: AccountOp[]\n): boolean {\n const createIntent = (accountOps: AccountOp[]) => {\n return accountOps.map(({ accountAddr, networkId, calls }) => ({\n accountAddr,\n networkId,\n calls\n }))\n }\n\n return stringify(createIntent(accountOps1)) === stringify(createIntent(accountOps2))\n}\n\nexport function getSignableCalls(op: AccountOp): [string, string, string][] {\n const callsToSign = op.calls.map(toSingletonCall).map(callToTuple)\n if (op.activatorCall) callsToSign.push(callToTuple(op.activatorCall))\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableCallsForBundlerEstimate(op: AccountOp): [string, string, string][] {\n const callsToSign = getSignableCalls(op)\n // add the fee call one more time when doing a bundler estimate\n // this is because the feeCall during estimation is fake (approve instead\n // of transfer, incorrect amount) and more ofteh than not, this causes\n // a lower estimation than the real one, causing bad UX in the process\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableHash(\n addr: AccountId,\n chainId: bigint,\n nonce: bigint,\n calls: [string, string, string][]\n): Uint8Array {\n const abiCoder = new AbiCoder()\n return getBytes(\n keccak256(\n abiCoder.encode(\n ['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'],\n [addr, chainId, nonce, calls]\n )\n )\n )\n}\n\n/**\n * This function returns the hash as a Uint8Array instead of string\n * and the reason for this is the implementation that follows:\n *\n * const hash = accountOpSignableHash(op); // get the hash\n * const signature = await wallet.signMessage(hash)\n *\n * The signMessage method is an ethers method. It checks whether\n * the hash is a string or not. If it's a string, it calls\n * ethers.toUtf8Bytes to it, completing ignoring that the string\n * might actually be abi-encoded (like in our case).\n *\n * Applying ethers.toUtf8Bytes to a string is only correct if the\n * string is... a utf8 string. In our case, IT IS NOT.\n * That's why we need to wrap in with ethers.getBytes to prevent\n * the sign message from breaking it.\n *\n * If despite everything you wish to return a string instead of a Uint8Array,\n * you have to wrap the hash with ethers.getBytes each time before passing it\n * to signMessage. Also, the reverse method of ethers.getBytes is ethers.hexlify\n * if you need to transform it back.\n *\n * @param op AccountOp\n * @returns Uint8Array\n */\nexport function accountOpSignableHash(op: AccountOp, chainId: bigint): Uint8Array {\n return getSignableHash(op.accountAddr, chainId, op.nonce ?? 0n, getSignableCalls(op))\n}\n"]} \ No newline at end of file +{"version":3,"file":"accountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/accountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, getBytes, Interface, keccak256, toBeHex } from 'ethers'\n\nimport { SINGLETON } from '../../consts/deploy'\nimport { AccountId } from '../../interfaces/account'\n// eslint-disable-next-line import/no-cycle\nimport { Key } from '../../interfaces/keystore'\nimport { NetworkId } from '../../interfaces/network'\nimport { PaymasterService } from '../erc7677/types'\nimport { stringify } from '../richJson/richJson'\nimport { UserOperation } from '../userOperation/types'\nimport { Call } from './types'\n\n// This is an abstract representation of the gas fee payment\n// 1) it cannot contain details about maxFeePerGas/baseFee because some networks might not be aware of EIP-1559; it only cares about total amount\n// 2) it cannot contain info about the mechanism of payment (from EOA but on smart account, pure EOA paying it's fee directly, 4337 paymaster, 4337 direct, relayer, etc.)\n// This info can be inferred when needed from the account type and whether we're running in 4337 mode or not\n// 3) isGasTank and isERC4337 can both be true\n// 4) whether those values are sane will be checked in an additional function (currently `canBroadcast`); for example, this function is meant to ensure that in case of an EOA, the fee is always paid in native\nexport interface GasFeePayment {\n isERC4337: boolean\n isGasTank: boolean\n paidBy: string\n inToken: string\n // optional, because older versions of the extension did not have this stored locally\n feeTokenNetworkId?: NetworkId\n amount: bigint\n simulatedGasLimit: bigint\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n isSponsored?: boolean\n}\n\nexport enum AccountOpStatus {\n Pending = 'pending',\n BroadcastedButNotConfirmed = 'broadcasted-but-not-confirmed',\n Success = 'success',\n Failure = 'failure',\n Rejected = 'rejected',\n UnknownButPastNonce = 'unknown-but-past-nonce',\n BroadcastButStuck = 'broadcast-but-stuck'\n}\n\n// Equivalent to ERC-4337 UserOp, but more universal than it since a AccountOp can be transformed to\n// a UserOp, or to a direct EOA transaction, or relayed through the Ambire relayer\n// it is more precisely defined than a UserOp though - UserOp just has calldata and this has individual `calls`\nexport interface AccountOp {\n accountAddr: string\n networkId: NetworkId\n // this may not be defined, in case the user has not picked a key yet\n signingKeyAddr: Key['addr'] | null\n signingKeyType: Key['type'] | null\n // this may not be set in case we haven't set it yet\n // this is a number and not a bigint because of ethers (it uses number for nonces)\n nonce: bigint | null\n // @TODO: nonce namespace? it is dependent on gasFeePayment\n calls: Call[]\n // the feeCall is an extra call we add manually when there's a\n // relayer/paymaster transaction so that the relayer/paymaster\n // can authorize the payment\n feeCall?: Call\n // the activator call is for cases where we want to activate the EntryPoint\n // it existed previously in the UserOperation type but now it is no longer\n // limited to it as we can broadcast none ERC-4337 txn with an activatorCall\n activatorCall?: Call\n gasLimit: number | null\n signature: string | null\n gasFeePayment: GasFeePayment | null\n // This is used when we have an account recovery to finalize before executing the AccountOp,\n // And we set this to the recovery finalization AccountOp; could be used in other scenarios too in the future,\n // for example account migration (from v1 QuickAcc to v2)\n // theoretically you can recurse these (an AccountOp set as *ToExecuteBefore can have another accountOpToExecuteBefore)\n // however, in practice we only use this for recovery atm and we never have a case with more than one\n // Supporting this can done relatively easily via executeMany() for v2 accounts, and with multiple UserOps via 4337 (again v2 accs)\n accountOpToExecuteBefore: AccountOp | null\n txnId?: string\n status?: AccountOpStatus\n // in the case of ERC-4337, we need an UserOperation structure for the AccountOp\n asUserOperation?: UserOperation\n // all kinds of custom accountOp properties that are needed in specific cases\n meta?: {\n // pass the entry point authorization signature for the deploy 4337 txn\n entryPointAuthorization?: string\n paymasterService?: PaymasterService\n }\n}\n\n/**\n * If we want to deploy a contract, the to field of Call will actually\n * be empty (undefined). In order to simulate it in a transaction or\n * perform it using a smart account, we need to transform the call to\n * a call to the singleton\n *\n * @param call\n * @returns Call\n */\nexport function toSingletonCall(call: Call): Call {\n if (call.to) return call\n\n const singletonABI = [\n {\n inputs: [\n { internalType: 'bytes', name: '_initCode', type: 'bytes' },\n { internalType: 'bytes32', name: '_salt', type: 'bytes32' }\n ],\n name: 'deploy',\n outputs: [{ internalType: 'address payable', name: 'createdContract', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'function'\n }\n ]\n const singletonInterface = new Interface(singletonABI)\n return {\n to: SINGLETON,\n value: call.value,\n data: singletonInterface.encodeFunctionData('deploy', [call.data, toBeHex(0, 32)])\n }\n}\n\nexport function callToTuple(call: Call): [string, string, string] {\n return [call.to, call.value.toString(), call.data]\n}\n\nexport function canBroadcast(op: AccountOp, accountIsEOA: boolean): boolean {\n if (op.signingKeyAddr === null) throw new Error('missing signingKeyAddr')\n if (op.signature === null) throw new Error('missing signature')\n if (op.gasFeePayment === null) throw new Error('missing gasFeePayment')\n if (op.gasLimit === null) throw new Error('missing gasLimit')\n if (op.nonce === null) throw new Error('missing nonce')\n if (accountIsEOA) {\n if (op.gasFeePayment.isGasTank)\n throw new Error('gas fee payment with gas tank cannot be used with an EOA')\n if (op.gasFeePayment.inToken !== '0x0000000000000000000000000000000000000000')\n throw new Error('gas fee payment needs to be in the native asset')\n if (op.gasFeePayment.paidBy !== op.accountAddr)\n throw new Error('gas fee payment cannot be paid by anyone other than the EOA that signed it')\n }\n return true\n}\n\n/**\n * Compare two AccountOps intents.\n *\n * By 'intent,' we are referring to the sender of the transaction, the network it is sent on, and the included calls.\n *\n * Since we are comparing the intents, we exclude any other properties of the AccountOps.\n */\nexport function isAccountOpsIntentEqual(\n accountOps1: AccountOp[],\n accountOps2: AccountOp[]\n): boolean {\n const createIntent = (accountOps: AccountOp[]) => {\n return accountOps.map(({ accountAddr, networkId, calls }) => ({\n accountAddr,\n networkId,\n calls\n }))\n }\n\n return stringify(createIntent(accountOps1)) === stringify(createIntent(accountOps2))\n}\n\nexport function getSignableCalls(op: AccountOp): [string, string, string][] {\n const callsToSign = op.calls.map(toSingletonCall).map(callToTuple)\n if (op.activatorCall) callsToSign.push(callToTuple(op.activatorCall))\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableCallsForBundlerEstimate(op: AccountOp): [string, string, string][] {\n const callsToSign = getSignableCalls(op)\n // add the fee call one more time when doing a bundler estimate\n // this is because the feeCall during estimation is fake (approve instead\n // of transfer, incorrect amount) and more ofteh than not, this causes\n // a lower estimation than the real one, causing bad UX in the process\n if (op.feeCall) callsToSign.push(callToTuple(op.feeCall))\n return callsToSign\n}\n\nexport function getSignableHash(\n addr: AccountId,\n chainId: bigint,\n nonce: bigint,\n calls: [string, string, string][]\n): Uint8Array {\n const abiCoder = new AbiCoder()\n return getBytes(\n keccak256(\n abiCoder.encode(\n ['address', 'uint', 'uint', 'tuple(address, uint, bytes)[]'],\n [addr, chainId, nonce, calls]\n )\n )\n )\n}\n\n/**\n * This function returns the hash as a Uint8Array instead of string\n * and the reason for this is the implementation that follows:\n *\n * const hash = accountOpSignableHash(op); // get the hash\n * const signature = await wallet.signMessage(hash)\n *\n * The signMessage method is an ethers method. It checks whether\n * the hash is a string or not. If it's a string, it calls\n * ethers.toUtf8Bytes to it, completing ignoring that the string\n * might actually be abi-encoded (like in our case).\n *\n * Applying ethers.toUtf8Bytes to a string is only correct if the\n * string is... a utf8 string. In our case, IT IS NOT.\n * That's why we need to wrap in with ethers.getBytes to prevent\n * the sign message from breaking it.\n *\n * If despite everything you wish to return a string instead of a Uint8Array,\n * you have to wrap the hash with ethers.getBytes each time before passing it\n * to signMessage. Also, the reverse method of ethers.getBytes is ethers.hexlify\n * if you need to transform it back.\n *\n * @param op AccountOp\n * @returns Uint8Array\n */\nexport function accountOpSignableHash(op: AccountOp, chainId: bigint): Uint8Array {\n return getSignableHash(op.accountAddr, chainId, op.nonce ?? 0n, getSignableCalls(op))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.js b/dist/src/libs/accountOp/submittedAccountOp.js index 803b9cbb7..3abeaacb1 100644 --- a/dist/src/libs/accountOp/submittedAccountOp.js +++ b/dist/src/libs/accountOp/submittedAccountOp.js @@ -1,21 +1,28 @@ -import { getBundlerByName, getDefaultBundler } from '../../services/bundlers/getBundler'; -import { fetchUserOp } from '../../services/explorers/jiffyscan'; -export function isIdentifiedByTxn(identifiedBy) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pollTxnId = exports.fetchTxnId = exports.getDappIdentifier = exports.isIdentifiedByRelayer = exports.isIdentifiedByUserOpHash = exports.isIdentifiedByTxn = void 0; +const getBundler_1 = require("../../services/bundlers/getBundler"); +const jiffyscan_1 = require("../../services/explorers/jiffyscan"); +function isIdentifiedByTxn(identifiedBy) { return identifiedBy.type === 'Transaction'; } -export function isIdentifiedByUserOpHash(identifiedBy) { +exports.isIdentifiedByTxn = isIdentifiedByTxn; +function isIdentifiedByUserOpHash(identifiedBy) { return identifiedBy.type === 'UserOperation'; } -export function isIdentifiedByRelayer(identifiedBy) { +exports.isIdentifiedByUserOpHash = isIdentifiedByUserOpHash; +function isIdentifiedByRelayer(identifiedBy) { return identifiedBy.type === 'Relayer'; } -export function getDappIdentifier(op) { +exports.isIdentifiedByRelayer = isIdentifiedByRelayer; +function getDappIdentifier(op) { let hash = `${op.identifiedBy.type}:${op.identifiedBy.identifier}`; if (op.identifiedBy?.bundler) hash = `${hash}:${op.identifiedBy.bundler}`; return hash; } -export async function fetchTxnId(identifiedBy, network, fetchFn, callRelayer, op) { +exports.getDappIdentifier = getDappIdentifier; +async function fetchTxnId(identifiedBy, network, fetchFn, callRelayer, op) { if (isIdentifiedByTxn(identifiedBy)) return { status: 'success', @@ -24,10 +31,10 @@ export async function fetchTxnId(identifiedBy, network, fetchFn, callRelayer, op if (isIdentifiedByUserOpHash(identifiedBy)) { const userOpHash = identifiedBy.identifier; const bundler = identifiedBy.bundler - ? getBundlerByName(identifiedBy.bundler) - : getDefaultBundler(network); + ? (0, getBundler_1.getBundlerByName)(identifiedBy.bundler) + : (0, getBundler_1.getDefaultBundler)(network); const [response, bundlerResult] = await Promise.all([ - fetchUserOp(userOpHash, fetchFn), + (0, jiffyscan_1.fetchUserOp)(userOpHash, fetchFn), bundler.getStatus(network, userOpHash) ]); if (bundlerResult.status === 'rejected') @@ -94,7 +101,8 @@ export async function fetchTxnId(identifiedBy, network, fetchFn, callRelayer, op txnId: response.data.txId }; } -export async function pollTxnId(identifiedBy, network, fetchFn, callRelayer, failCount = 0) { +exports.fetchTxnId = fetchTxnId; +async function pollTxnId(identifiedBy, network, fetchFn, callRelayer, failCount = 0) { // allow 8 retries and declate fetching the txnId a failure after if (failCount >= 8) return null; @@ -111,4 +119,5 @@ export async function pollTxnId(identifiedBy, network, fetchFn, callRelayer, fai } return fetchTxnIdResult.txnId; } +exports.pollTxnId = pollTxnId; //# sourceMappingURL=submittedAccountOp.js.map \ No newline at end of file diff --git a/dist/src/libs/accountOp/submittedAccountOp.js.map b/dist/src/libs/accountOp/submittedAccountOp.js.map index 08c48d5c9..cdc8c6bf2 100644 --- a/dist/src/libs/accountOp/submittedAccountOp.js.map +++ b/dist/src/libs/accountOp/submittedAccountOp.js.map @@ -1 +1 @@ -{"version":3,"file":"submittedAccountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/submittedAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { getBundlerByName, getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { fetchUserOp } from '../../services/explorers/jiffyscan'\nimport { AccountOp } from './accountOp'\n\n/*\n * AccountOpIdentifiedBy\n * The txnId may not neceseraly be final on the moment of broadcast.\n * It is final when the type is Transaction. This is the case when we do\n * a regular EOA broadcast (including SA EOA broadcast)\n * The relayer and bundler work differently, though. The relayer may sometimes\n * decide not to return a txnId at all if it decides the current gas prices\n * are too high for the transaction. Also, it may return a txnId only to\n * replace it with another if the conditions meet. Here is an example:\n * - you broadcast a transaction on slow and the relayer returns a txnId\n * - at the same time another person broadcasts via the relayer, fast speed\n * - the relayer sees- that the second txn's chances of getting confirmed sooner\n * are higher and replaces the current one with the RBF logic\n * - at a later stage, the relayer re-broadcasts the first txn but since it's\n * a different nonce and signature, the txnId also differs\n * That's why we cannot rely on txnId for smart accounts in the relayer\n * broadcast case to fetch information about the transaction. Instead, the\n * relayer will return a database ID record of the transaction and we will be\n * refetching the txnId from the relayer until the transaction gets mined.\n *\n * The same logic is true for userOps and bundler broadcast. In the case of\n * userOps, the only difference is that we get a userOpHash instead of a\n * database ID record\n */\nexport type AccountOpIdentifiedBy = {\n type: 'Transaction' | 'UserOperation' | 'Relayer'\n identifier: string\n bundler?: BUNDLER\n}\n\nexport interface SubmittedAccountOp extends AccountOp {\n txnId?: string\n nonce: bigint\n success?: boolean\n timestamp: number\n isSingletonDeploy?: boolean\n identifiedBy: AccountOpIdentifiedBy\n flags?: {\n hideActivityBanner?: boolean\n }\n}\n\nexport function isIdentifiedByTxn(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Transaction'\n}\n\nexport function isIdentifiedByUserOpHash(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'UserOperation'\n}\n\nexport function isIdentifiedByRelayer(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Relayer'\n}\n\nexport function getDappIdentifier(op: SubmittedAccountOp) {\n let hash = `${op.identifiedBy.type}:${op.identifiedBy.identifier}`\n if (op.identifiedBy?.bundler) hash = `${hash}:${op.identifiedBy.bundler}`\n return hash\n}\n\nexport async function fetchTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n op?: AccountOp\n): Promise<{ status: string; txnId: string | null }> {\n if (isIdentifiedByTxn(identifiedBy))\n return {\n status: 'success',\n txnId: identifiedBy.identifier\n }\n\n if (isIdentifiedByUserOpHash(identifiedBy)) {\n const userOpHash = identifiedBy.identifier\n\n const bundler = identifiedBy.bundler\n ? getBundlerByName(identifiedBy.bundler)\n : getDefaultBundler(network)\n\n const [response, bundlerResult]: [any, any] = await Promise.all([\n fetchUserOp(userOpHash, fetchFn),\n bundler.getStatus(network, userOpHash)\n ])\n\n if (bundlerResult.status === 'rejected')\n return {\n status: 'rejected',\n txnId: null\n }\n\n if (bundlerResult.transactionHash)\n return {\n status: 'success',\n txnId: bundlerResult.transactionHash\n }\n\n // on custom networks the response is null\n if (!response)\n return {\n status: 'not_found',\n txnId: null\n }\n\n // nothing we can do if we don't have information\n if (response.status !== 200)\n return {\n status: 'not_found',\n txnId: null\n }\n\n const data = await response.json()\n const userOps = data.userOps\n\n // if there are not user ops, it means the userOpHash is not\n // indexed, yet, so we wait\n if (userOps.length)\n return {\n status: 'success',\n txnId: userOps[0].transactionHash\n }\n\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n const id = identifiedBy.identifier\n let response = null\n try {\n response = await callRelayer(`/v2/get-txn-id/${id}`)\n } catch (e) {\n console.log(`relayer responded with an error when trying to find the txnId: ${e}`)\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n if (!response.data.txId) {\n if (op && op.txnId)\n return {\n status: 'success',\n txnId: op.txnId\n }\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n return {\n status: 'success',\n txnId: response.data.txId\n }\n}\n\nexport async function pollTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n failCount = 0\n): Promise {\n // allow 8 retries and declate fetching the txnId a failure after\n if (failCount >= 8) return null\n\n const fetchTxnIdResult = await fetchTxnId(identifiedBy, network, fetchFn, callRelayer)\n if (fetchTxnIdResult.status === 'rejected') return null\n\n if (fetchTxnIdResult.status === 'not_found') {\n const delayPromise = () =>\n new Promise((resolve) => {\n setTimeout(resolve, 1500)\n })\n await delayPromise()\n const increase = failCount + 1\n return pollTxnId(identifiedBy, network, fetchFn, callRelayer, increase)\n }\n\n return fetchTxnIdResult.txnId\n}\n"]} \ No newline at end of file +{"version":3,"file":"submittedAccountOp.js","sourceRoot":"","sources":["../../../../src/libs/accountOp/submittedAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { getBundlerByName, getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { fetchUserOp } from '../../services/explorers/jiffyscan'\nimport { AccountOp } from './accountOp'\n\n/*\n * AccountOpIdentifiedBy\n * The txnId may not neceseraly be final on the moment of broadcast.\n * It is final when the type is Transaction. This is the case when we do\n * a regular EOA broadcast (including SA EOA broadcast)\n * The relayer and bundler work differently, though. The relayer may sometimes\n * decide not to return a txnId at all if it decides the current gas prices\n * are too high for the transaction. Also, it may return a txnId only to\n * replace it with another if the conditions meet. Here is an example:\n * - you broadcast a transaction on slow and the relayer returns a txnId\n * - at the same time another person broadcasts via the relayer, fast speed\n * - the relayer sees- that the second txn's chances of getting confirmed sooner\n * are higher and replaces the current one with the RBF logic\n * - at a later stage, the relayer re-broadcasts the first txn but since it's\n * a different nonce and signature, the txnId also differs\n * That's why we cannot rely on txnId for smart accounts in the relayer\n * broadcast case to fetch information about the transaction. Instead, the\n * relayer will return a database ID record of the transaction and we will be\n * refetching the txnId from the relayer until the transaction gets mined.\n *\n * The same logic is true for userOps and bundler broadcast. In the case of\n * userOps, the only difference is that we get a userOpHash instead of a\n * database ID record\n */\nexport type AccountOpIdentifiedBy = {\n type: 'Transaction' | 'UserOperation' | 'Relayer'\n identifier: string\n bundler?: BUNDLER\n}\n\nexport interface SubmittedAccountOp extends AccountOp {\n txnId?: string\n nonce: bigint\n success?: boolean\n timestamp: number\n isSingletonDeploy?: boolean\n identifiedBy: AccountOpIdentifiedBy\n flags?: {\n hideActivityBanner?: boolean\n }\n}\n\nexport function isIdentifiedByTxn(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Transaction'\n}\n\nexport function isIdentifiedByUserOpHash(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'UserOperation'\n}\n\nexport function isIdentifiedByRelayer(identifiedBy: AccountOpIdentifiedBy): boolean {\n return identifiedBy.type === 'Relayer'\n}\n\nexport function getDappIdentifier(op: SubmittedAccountOp) {\n let hash = `${op.identifiedBy.type}:${op.identifiedBy.identifier}`\n if (op.identifiedBy?.bundler) hash = `${hash}:${op.identifiedBy.bundler}`\n return hash\n}\n\nexport async function fetchTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n op?: AccountOp\n): Promise<{ status: string; txnId: string | null }> {\n if (isIdentifiedByTxn(identifiedBy))\n return {\n status: 'success',\n txnId: identifiedBy.identifier\n }\n\n if (isIdentifiedByUserOpHash(identifiedBy)) {\n const userOpHash = identifiedBy.identifier\n\n const bundler = identifiedBy.bundler\n ? getBundlerByName(identifiedBy.bundler)\n : getDefaultBundler(network)\n\n const [response, bundlerResult]: [any, any] = await Promise.all([\n fetchUserOp(userOpHash, fetchFn),\n bundler.getStatus(network, userOpHash)\n ])\n\n if (bundlerResult.status === 'rejected')\n return {\n status: 'rejected',\n txnId: null\n }\n\n if (bundlerResult.transactionHash)\n return {\n status: 'success',\n txnId: bundlerResult.transactionHash\n }\n\n // on custom networks the response is null\n if (!response)\n return {\n status: 'not_found',\n txnId: null\n }\n\n // nothing we can do if we don't have information\n if (response.status !== 200)\n return {\n status: 'not_found',\n txnId: null\n }\n\n const data = await response.json()\n const userOps = data.userOps\n\n // if there are not user ops, it means the userOpHash is not\n // indexed, yet, so we wait\n if (userOps.length)\n return {\n status: 'success',\n txnId: userOps[0].transactionHash\n }\n\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n const id = identifiedBy.identifier\n let response = null\n try {\n response = await callRelayer(`/v2/get-txn-id/${id}`)\n } catch (e) {\n console.log(`relayer responded with an error when trying to find the txnId: ${e}`)\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n if (!response.data.txId) {\n if (op && op.txnId)\n return {\n status: 'success',\n txnId: op.txnId\n }\n return {\n status: 'not_found',\n txnId: null\n }\n }\n\n return {\n status: 'success',\n txnId: response.data.txId\n }\n}\n\nexport async function pollTxnId(\n identifiedBy: AccountOpIdentifiedBy,\n network: Network,\n fetchFn: Fetch,\n callRelayer: Function,\n failCount = 0\n): Promise {\n // allow 8 retries and declate fetching the txnId a failure after\n if (failCount >= 8) return null\n\n const fetchTxnIdResult = await fetchTxnId(identifiedBy, network, fetchFn, callRelayer)\n if (fetchTxnIdResult.status === 'rejected') return null\n\n if (fetchTxnIdResult.status === 'not_found') {\n const delayPromise = () =>\n new Promise((resolve) => {\n setTimeout(resolve, 1500)\n })\n await delayPromise()\n const increase = failCount + 1\n return pollTxnId(identifiedBy, network, fetchFn, callRelayer, increase)\n }\n\n return fetchTxnIdResult.txnId\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/accountOp/types.js b/dist/src/libs/accountOp/types.js index 718fd38ae..11e638d1e 100644 --- a/dist/src/libs/accountOp/types.js +++ b/dist/src/libs/accountOp/types.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.js b/dist/src/libs/accountState/accountState.js index 7f031e8a1..b7c3caf62 100644 --- a/dist/src/libs/accountState/accountState.js +++ b/dist/src/libs/accountState/accountState.js @@ -1,20 +1,24 @@ -import AmbireAccountState from '../../../contracts/compiled/AmbireAccountState.json'; -import { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT, MAX_UINT256 } from '../../consts/deploy'; -import { getAccountDeployParams, isSmartAccount } from '../account/account'; -import { fromDescriptor } from '../deployless/deployless'; -export async function getAccountState(provider, network, accounts, blockTag = 'latest') { - const deploylessAccountState = fromDescriptor(provider, AmbireAccountState, !network.rpcNoStateOverride); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAccountState = void 0; +const tslib_1 = require("tslib"); +const AmbireAccountState_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccountState.json")); +const deploy_1 = require("../../consts/deploy"); +const account_1 = require("../account/account"); +const deployless_1 = require("../deployless/deployless"); +async function getAccountState(provider, network, accounts, blockTag = 'latest') { + const deploylessAccountState = (0, deployless_1.fromDescriptor)(provider, AmbireAccountState_json_1.default, !network.rpcNoStateOverride); const args = accounts.map((account) => { - const associatedKeys = network?.erc4337?.enabled && !account.associatedKeys.includes(ERC_4337_ENTRYPOINT) - ? [...account.associatedKeys, ERC_4337_ENTRYPOINT] + const associatedKeys = network?.erc4337?.enabled && !account.associatedKeys.includes(deploy_1.ERC_4337_ENTRYPOINT) + ? [...account.associatedKeys, deploy_1.ERC_4337_ENTRYPOINT] : account.associatedKeys; return [ account.addr, associatedKeys, ...(account.creation == null ? ['0x0000000000000000000000000000000000000000', '0x'] - : getAccountDeployParams(account)), - network?.erc4337?.enabled ? ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000' + : (0, account_1.getAccountDeployParams)(account)), + network?.erc4337?.enabled ? deploy_1.ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000' ]; }); async function getEOAsNonce(eoaAccounts) { @@ -27,7 +31,7 @@ export async function getAccountState(provider, network, accounts, blockTag = 'l deploylessAccountState.call('getAccountsState', [args], { blockTag }), - getEOAsNonce(accounts.filter((account) => !isSmartAccount(account)).map((account) => account.addr)) + getEOAsNonce(accounts.filter((account) => !(0, account_1.isSmartAccount)(account)).map((account) => account.addr)) ]); const result = accountStateResult.map((accResult, index) => { const associatedKeys = accResult.associatedKeyPrivileges.map((privilege, keyIndex) => { @@ -35,7 +39,7 @@ export async function getAccountState(provider, network, accounts, blockTag = 'l }); const res = { accountAddr: accounts[index].addr, - nonce: !isSmartAccount(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce, + nonce: !(0, account_1.isSmartAccount)(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce, erc4337Nonce: accResult.erc4337Nonce, isDeployed: accResult.isDeployed, associatedKeys: Object.fromEntries(associatedKeys), @@ -43,8 +47,8 @@ export async function getAccountState(provider, network, accounts, blockTag = 'l balance: accResult.balance, isEOA: accResult.isEOA, isErc4337Enabled: !!(network?.erc4337?.enabled && - accResult.erc4337Nonce < MAX_UINT256 && - associatedKeys.find((associatedKey) => associatedKey[0] === ERC_4337_ENTRYPOINT && associatedKey[1] === ENTRY_POINT_MARKER)), + accResult.erc4337Nonce < deploy_1.MAX_UINT256 && + associatedKeys.find((associatedKey) => associatedKey[0] === deploy_1.ERC_4337_ENTRYPOINT && associatedKey[1] === deploy_1.ENTRY_POINT_MARKER)), currentBlock: accResult.currentBlock, deployError: accounts[index].associatedKeys.length > 0 && accResult.associatedKeyPrivileges.length === 0 }; @@ -52,4 +56,5 @@ export async function getAccountState(provider, network, accounts, blockTag = 'l }); return result; } +exports.getAccountState = getAccountState; //# sourceMappingURL=accountState.js.map \ No newline at end of file diff --git a/dist/src/libs/accountState/accountState.js.map b/dist/src/libs/accountState/accountState.js.map index 960dea7eb..fa35daab4 100644 --- a/dist/src/libs/accountState/accountState.js.map +++ b/dist/src/libs/accountState/accountState.js.map @@ -1 +1 @@ -{"version":3,"file":"accountState.js","sourceRoot":"","sources":["../../../../src/libs/accountState/accountState.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,qDAAqD,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAG1F,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,OAAgB,EAChB,QAAmB,EACnB,WAA4B,QAAQ;IAEpC,MAAM,sBAAsB,GAAG,cAAc,CAC3C,QAAQ,EACR,kBAAkB,EAClB,CAAC,OAAO,CAAC,kBAAkB,CAC5B,CAAA;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,MAAM,cAAc,GAClB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAChF,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,mBAAmB,CAAC;YAClD,CAAC,CAAC,OAAO,CAAC,cAAc,CAAA;QAE5B,OAAO;YACL,OAAO,CAAC,IAAI;YACZ,cAAc;YACd,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI;gBAC1B,CAAC,CAAC,CAAC,4CAA4C,EAAE,IAAI,CAAC;gBACtD,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,4CAA4C;SAC/F,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,KAAK,UAAU,YAAY,CAAC,WAAkB;QAC5C,MAAM,MAAM,GAAQ,MAAM,OAAO,CAAC,GAAG,CACnC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CACtE,CAAA;QACD,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,EACF,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,KAAsB,EAAE,EAAE,CAAC,CAAC;YAC5D,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC9B,CAAC,CAAC,CACJ,CAAA;IACH,CAAC;IAED,MAAM,CAAC,CAAC,kBAAkB,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1D,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE;YACtD,QAAQ;SACT,CAAC;QACF,YAAY,CACV,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CACtF;KACF,CAAC,CAAA;IAEF,MAAM,MAAM,GAA0B,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE;QAC7F,MAAM,cAAc,GAAG,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAC1D,CAAC,SAAiB,EAAE,QAAgB,EAAE,EAAE;YACtC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAA;QAC9C,CAAC,CACF,CAAA;QAED,MAAM,GAAG,GAAG;YACV,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI;YACjC,KAAK,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK;YAC3F,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC;YAClD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,gBAAgB,EAAE,CAAC,CAAC,CAClB,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,SAAS,CAAC,YAAY,GAAG,WAAW;gBACpC,cAAc,CAAC,IAAI,CACjB,CAAC,aAAuB,EAAE,EAAE,CAC1B,aAAa,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,kBAAkB,CACtF,CACF;YACD,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,WAAW,EACT,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC;SAC9F,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import { Provider } from 'ethers'\n\nimport AmbireAccountState from '../../../contracts/compiled/AmbireAccountState.json'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT, MAX_UINT256 } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { fromDescriptor } from '../deployless/deployless'\n\nexport async function getAccountState(\n provider: Provider,\n network: Network,\n accounts: Account[],\n blockTag: string | number = 'latest'\n): Promise {\n const deploylessAccountState = fromDescriptor(\n provider,\n AmbireAccountState,\n !network.rpcNoStateOverride\n )\n\n const args = accounts.map((account) => {\n const associatedKeys =\n network?.erc4337?.enabled && !account.associatedKeys.includes(ERC_4337_ENTRYPOINT)\n ? [...account.associatedKeys, ERC_4337_ENTRYPOINT]\n : account.associatedKeys\n\n return [\n account.addr,\n associatedKeys,\n ...(account.creation == null\n ? ['0x0000000000000000000000000000000000000000', '0x']\n : getAccountDeployParams(account)),\n network?.erc4337?.enabled ? ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000'\n ]\n })\n\n async function getEOAsNonce(eoaAccounts: any[]): Promise<{ [addr: string]: number }> {\n const nonces: any = await Promise.all(\n eoaAccounts.map((addr: string) => provider.getTransactionCount(addr))\n )\n return Object.assign(\n {},\n ...eoaAccounts.map((addr: string, index: string | number) => ({\n [addr]: BigInt(nonces[index])\n }))\n )\n }\n\n const [[accountStateResult], eoaNonces] = await Promise.all([\n deploylessAccountState.call('getAccountsState', [args], {\n blockTag\n }),\n getEOAsNonce(\n accounts.filter((account) => !isSmartAccount(account)).map((account) => account.addr)\n )\n ])\n\n const result: AccountOnchainState[] = accountStateResult.map((accResult: any, index: number) => {\n const associatedKeys = accResult.associatedKeyPrivileges.map(\n (privilege: string, keyIndex: number) => {\n return [args[index][1][keyIndex], privilege]\n }\n )\n\n const res = {\n accountAddr: accounts[index].addr,\n nonce: !isSmartAccount(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce,\n erc4337Nonce: accResult.erc4337Nonce,\n isDeployed: accResult.isDeployed,\n associatedKeys: Object.fromEntries(associatedKeys),\n isV2: accResult.isV2,\n balance: accResult.balance,\n isEOA: accResult.isEOA,\n isErc4337Enabled: !!(\n network?.erc4337?.enabled &&\n accResult.erc4337Nonce < MAX_UINT256 &&\n associatedKeys.find(\n (associatedKey: string[]) =>\n associatedKey[0] === ERC_4337_ENTRYPOINT && associatedKey[1] === ENTRY_POINT_MARKER\n )\n ),\n currentBlock: accResult.currentBlock,\n deployError:\n accounts[index].associatedKeys.length > 0 && accResult.associatedKeyPrivileges.length === 0\n }\n\n return res\n })\n\n return result\n}\n"]} \ No newline at end of file +{"version":3,"file":"accountState.js","sourceRoot":"","sources":["../../../../src/libs/accountState/accountState.ts"],"names":[],"mappings":"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","sourcesContent":["import { Provider } from 'ethers'\n\nimport AmbireAccountState from '../../../contracts/compiled/AmbireAccountState.json'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT, MAX_UINT256 } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { fromDescriptor } from '../deployless/deployless'\n\nexport async function getAccountState(\n provider: Provider,\n network: Network,\n accounts: Account[],\n blockTag: string | number = 'latest'\n): Promise {\n const deploylessAccountState = fromDescriptor(\n provider,\n AmbireAccountState,\n !network.rpcNoStateOverride\n )\n\n const args = accounts.map((account) => {\n const associatedKeys =\n network?.erc4337?.enabled && !account.associatedKeys.includes(ERC_4337_ENTRYPOINT)\n ? [...account.associatedKeys, ERC_4337_ENTRYPOINT]\n : account.associatedKeys\n\n return [\n account.addr,\n associatedKeys,\n ...(account.creation == null\n ? ['0x0000000000000000000000000000000000000000', '0x']\n : getAccountDeployParams(account)),\n network?.erc4337?.enabled ? ERC_4337_ENTRYPOINT : '0x0000000000000000000000000000000000000000'\n ]\n })\n\n async function getEOAsNonce(eoaAccounts: any[]): Promise<{ [addr: string]: number }> {\n const nonces: any = await Promise.all(\n eoaAccounts.map((addr: string) => provider.getTransactionCount(addr))\n )\n return Object.assign(\n {},\n ...eoaAccounts.map((addr: string, index: string | number) => ({\n [addr]: BigInt(nonces[index])\n }))\n )\n }\n\n const [[accountStateResult], eoaNonces] = await Promise.all([\n deploylessAccountState.call('getAccountsState', [args], {\n blockTag\n }),\n getEOAsNonce(\n accounts.filter((account) => !isSmartAccount(account)).map((account) => account.addr)\n )\n ])\n\n const result: AccountOnchainState[] = accountStateResult.map((accResult: any, index: number) => {\n const associatedKeys = accResult.associatedKeyPrivileges.map(\n (privilege: string, keyIndex: number) => {\n return [args[index][1][keyIndex], privilege]\n }\n )\n\n const res = {\n accountAddr: accounts[index].addr,\n nonce: !isSmartAccount(accounts[index]) ? eoaNonces[accounts[index].addr] : accResult.nonce,\n erc4337Nonce: accResult.erc4337Nonce,\n isDeployed: accResult.isDeployed,\n associatedKeys: Object.fromEntries(associatedKeys),\n isV2: accResult.isV2,\n balance: accResult.balance,\n isEOA: accResult.isEOA,\n isErc4337Enabled: !!(\n network?.erc4337?.enabled &&\n accResult.erc4337Nonce < MAX_UINT256 &&\n associatedKeys.find(\n (associatedKey: string[]) =>\n associatedKey[0] === ERC_4337_ENTRYPOINT && associatedKey[1] === ENTRY_POINT_MARKER\n )\n ),\n currentBlock: accResult.currentBlock,\n deployError:\n accounts[index].associatedKeys.length > 0 && accResult.associatedKeyPrivileges.length === 0\n }\n\n return res\n })\n\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/actions/actions.js b/dist/src/libs/actions/actions.js index 8e54cc8c1..64485b101 100644 --- a/dist/src/libs/actions/actions.js +++ b/dist/src/libs/actions/actions.js @@ -1,4 +1,7 @@ -export const dappRequestMethodToActionKind = (method) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.messageOnNewAction = exports.getAccountOpFromAction = exports.getAccountOpActionsByNetwork = exports.getAccountOpsByNetwork = exports.dappRequestMethodToActionKind = void 0; +const dappRequestMethodToActionKind = (method) => { if (['call', 'calls', 'eth_sendTransaction', 'wallet_sendCalls'].includes(method)) return 'calls'; if ([ @@ -13,7 +16,8 @@ export const dappRequestMethodToActionKind = (method) => { // method to camelCase return method.replace(/_(.)/g, (m, p1) => p1.toUpperCase()); }; -export const getAccountOpsByNetwork = (accountAddr, actions) => { +exports.dappRequestMethodToActionKind = dappRequestMethodToActionKind; +const getAccountOpsByNetwork = (accountAddr, actions) => { const accountOps = actions.filter((a) => a.type === 'accountOp') .map((a) => a.accountOp) .filter((op) => op.accountAddr === accountAddr); @@ -27,7 +31,8 @@ export const getAccountOpsByNetwork = (accountAddr, actions) => { return acc; }, {}); }; -export const getAccountOpActionsByNetwork = (accountAddr, actions) => { +exports.getAccountOpsByNetwork = getAccountOpsByNetwork; +const getAccountOpActionsByNetwork = (accountAddr, actions) => { const accountOpActions = actions.filter((a) => a.type === 'accountOp').filter((action) => action.accountOp.accountAddr === accountAddr); const actionsByNetwork = accountOpActions.reduce((acc, accountOpAction) => { const { networkId } = accountOpAction.accountOp; @@ -38,13 +43,15 @@ export const getAccountOpActionsByNetwork = (accountAddr, actions) => { }, {}); return actionsByNetwork; }; -export const getAccountOpFromAction = (accountOpActionId, actions) => { +exports.getAccountOpActionsByNetwork = getAccountOpActionsByNetwork; +const getAccountOpFromAction = (accountOpActionId, actions) => { const accountOpAction = actions.find((a) => a.id === accountOpActionId); if (!accountOpAction) return undefined; return accountOpAction.accountOp; }; -export const messageOnNewAction = (action, addType) => { +exports.getAccountOpFromAction = getAccountOpFromAction; +const messageOnNewAction = (action, addType) => { let requestType = ''; if (action.type === 'accountOp') requestType = 'Sign Transaction'; @@ -68,4 +75,5 @@ export const messageOnNewAction = (action, addType) => { } return null; }; +exports.messageOnNewAction = messageOnNewAction; //# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/dist/src/libs/actions/actions.js.map b/dist/src/libs/actions/actions.js.map index cbcedb76a..14fdf4595 100644 --- a/dist/src/libs/actions/actions.js.map +++ b/dist/src/libs/actions/actions.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/libs/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-cycle\nimport { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport const dappRequestMethodToActionKind = (method: DappProviderRequest['method']) => {\n if (['call', 'calls', 'eth_sendTransaction', 'wallet_sendCalls'].includes(method)) return 'calls'\n if (\n [\n 'eth_signTypedData',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4'\n ].includes(method)\n )\n return 'typedMessage'\n if (['personal_sign'].includes(method)) return 'message'\n // method to camelCase\n return method.replace(/_(.)/g, (m, p1) => p1.toUpperCase())\n}\n\nexport const getAccountOpsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOp[] } | undefined => {\n const accountOps = (actions.filter((a) => a.type === 'accountOp') as AccountOpAction[])\n .map((a) => a.accountOp)\n .filter((op) => op.accountAddr === accountAddr)\n\n if (!accountOps.length) return undefined\n\n return accountOps.reduce((acc: any, accountOp) => {\n const { networkId } = accountOp\n if (!acc[networkId]) acc[networkId] = []\n\n acc[networkId].push(accountOp)\n return acc\n }, {})\n}\n\nexport const getAccountOpActionsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOpAction[] } => {\n const accountOpActions = (\n actions.filter((a) => a.type === 'accountOp') as AccountOpAction[]\n ).filter((action) => action.accountOp.accountAddr === accountAddr)\n\n const actionsByNetwork = accountOpActions.reduce((acc: any, accountOpAction) => {\n const { networkId } = accountOpAction.accountOp\n if (!acc[networkId]) acc[networkId] = []\n acc[networkId].push(accountOpAction)\n return acc\n }, {})\n return actionsByNetwork\n}\n\nexport const getAccountOpFromAction = (\n accountOpActionId: AccountOpAction['id'],\n actions: Action[]\n) => {\n const accountOpAction = actions.find((a) => a.id === accountOpActionId) as AccountOpAction\n if (!accountOpAction) return undefined\n return accountOpAction.accountOp\n}\n\nexport const messageOnNewAction = (action: Action, addType: 'queued' | 'updated') => {\n let requestType = ''\n if (action.type === 'accountOp') requestType = 'Sign Transaction'\n if (action.type === 'signMessage') requestType = 'Sign Message'\n if (action.type === 'dappRequest') {\n if (action.userRequest.action.kind === 'dappConnect') requestType = 'Dapp Connect'\n if (action.userRequest.action.kind === 'walletAddEthereumChain') requestType = 'Add Chain'\n if (action.userRequest.action.kind === 'walletWatchAsset') requestType = 'Watch Asset'\n if (action.userRequest.action.kind === 'ethGetEncryptionPublicKey')\n requestType = 'Get Encryption Public Key'\n }\n\n if (addType === 'queued') {\n return `A new${requestType ? ` ${requestType} ` : ' '}request was queued.`\n }\n\n if (addType === 'updated') {\n return `${requestType ? ` ${requestType} ` : ' '}request was updated.`\n }\n\n return null\n}\n"]} \ No newline at end of file +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/libs/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-cycle\nimport { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport const dappRequestMethodToActionKind = (method: DappProviderRequest['method']) => {\n if (['call', 'calls', 'eth_sendTransaction', 'wallet_sendCalls'].includes(method)) return 'calls'\n if (\n [\n 'eth_signTypedData',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4'\n ].includes(method)\n )\n return 'typedMessage'\n if (['personal_sign'].includes(method)) return 'message'\n // method to camelCase\n return method.replace(/_(.)/g, (m, p1) => p1.toUpperCase())\n}\n\nexport const getAccountOpsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOp[] } | undefined => {\n const accountOps = (actions.filter((a) => a.type === 'accountOp') as AccountOpAction[])\n .map((a) => a.accountOp)\n .filter((op) => op.accountAddr === accountAddr)\n\n if (!accountOps.length) return undefined\n\n return accountOps.reduce((acc: any, accountOp) => {\n const { networkId } = accountOp\n if (!acc[networkId]) acc[networkId] = []\n\n acc[networkId].push(accountOp)\n return acc\n }, {})\n}\n\nexport const getAccountOpActionsByNetwork = (\n accountAddr: string,\n actions: Action[]\n): { [key: string]: AccountOpAction[] } => {\n const accountOpActions = (\n actions.filter((a) => a.type === 'accountOp') as AccountOpAction[]\n ).filter((action) => action.accountOp.accountAddr === accountAddr)\n\n const actionsByNetwork = accountOpActions.reduce((acc: any, accountOpAction) => {\n const { networkId } = accountOpAction.accountOp\n if (!acc[networkId]) acc[networkId] = []\n acc[networkId].push(accountOpAction)\n return acc\n }, {})\n return actionsByNetwork\n}\n\nexport const getAccountOpFromAction = (\n accountOpActionId: AccountOpAction['id'],\n actions: Action[]\n) => {\n const accountOpAction = actions.find((a) => a.id === accountOpActionId) as AccountOpAction\n if (!accountOpAction) return undefined\n return accountOpAction.accountOp\n}\n\nexport const messageOnNewAction = (action: Action, addType: 'queued' | 'updated') => {\n let requestType = ''\n if (action.type === 'accountOp') requestType = 'Sign Transaction'\n if (action.type === 'signMessage') requestType = 'Sign Message'\n if (action.type === 'dappRequest') {\n if (action.userRequest.action.kind === 'dappConnect') requestType = 'Dapp Connect'\n if (action.userRequest.action.kind === 'walletAddEthereumChain') requestType = 'Add Chain'\n if (action.userRequest.action.kind === 'walletWatchAsset') requestType = 'Watch Asset'\n if (action.userRequest.action.kind === 'ethGetEncryptionPublicKey')\n requestType = 'Get Encryption Public Key'\n }\n\n if (addType === 'queued') {\n return `A new${requestType ? ` ${requestType} ` : ' '}request was queued.`\n }\n\n if (addType === 'updated') {\n return `${requestType ? ` ${requestType} ` : ' '}request was updated.`\n }\n\n return null\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/banners/banners.js b/dist/src/libs/banners/banners.js index f7b275914..0c1d580e9 100644 --- a/dist/src/libs/banners/banners.js +++ b/dist/src/libs/banners/banners.js @@ -1,4 +1,7 @@ -import { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getKeySyncBanner = exports.getAccountOpBanners = exports.getDappActionRequestsBanners = exports.getBridgeBanners = void 0; +const swapAndBridge_1 = require("../swapAndBridge/swapAndBridge"); const getBridgeBannerTitle = (routeStatus) => { switch (routeStatus) { case 'completed': @@ -16,7 +19,7 @@ const getBridgeActionText = (routeStatus, isBridgeTxn) => { return routeStatus === 'completed' ? 'Swapped' : 'Swap'; }; const getBridgeBannerText = (route, isBridgeTxn, networks) => { - const steps = getQuoteRouteSteps(route.route.userTxs); + const steps = (0, swapAndBridge_1.getQuoteRouteSteps)(route.route.userTxs); const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn); const fromAssetSymbol = steps[0].fromAsset.symbol; const toAssetSymbol = steps[steps.length - 1].toAsset.symbol; @@ -31,8 +34,8 @@ const getBridgeBannerText = (route, isBridgeTxn, networks) => { const stepsIndexText = `(step ${route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1} of ${route.route.totalUserTx})`; return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`; }; -export const getBridgeBanners = (activeRoutes, accountOpActions, networks) => { - const isBridgeTxn = (route) => route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType)); +const getBridgeBanners = (activeRoutes, accountOpActions, networks) => { + const isBridgeTxn = (route) => route.route.userTxs.some((t) => (0, swapAndBridge_1.getIsBridgeTxn)(t.userTxType)); const isRouteTurnedIntoAccountOp = (route) => { return accountOpActions.some((action) => { return action.accountOp.calls.some((call) => call.fromUserRequestId === route.activeRouteId || @@ -88,7 +91,8 @@ export const getBridgeBanners = (activeRoutes, accountOpActions, networks) => { }; }); }; -export const getDappActionRequestsBanners = (actions) => { +exports.getBridgeBanners = getBridgeBanners; +const getDappActionRequestsBanners = (actions) => { const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type)); if (!requests.length) return []; @@ -107,6 +111,7 @@ export const getDappActionRequestsBanners = (actions) => { } ]; }; +exports.getDappActionRequestsBanners = getDappActionRequestsBanners; const getAccountOpBannerText = (activeSwapAndBridgeRoutesForSelectedAccount, chainId, nonSwapAndBridgeTxns, networks) => { const swapsAndBridges = []; const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => { @@ -114,7 +119,7 @@ const getAccountOpBannerText = (activeSwapAndBridgeRoutesForSelectedAccount, cha }); if (networkSwapAndBridgeRoutes.length) { networkSwapAndBridgeRoutes.forEach((route) => { - const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType)); + const isBridgeTxn = route.route.userTxs.some((t) => (0, swapAndBridge_1.getIsBridgeTxn)(t.userTxType)); const desc = getBridgeBannerText(route, isBridgeTxn, networks); swapsAndBridges.push(desc); }); @@ -124,7 +129,7 @@ const getAccountOpBannerText = (activeSwapAndBridgeRoutesForSelectedAccount, cha } return ''; }; -export const getAccountOpBanners = ({ accountOpActionsByNetwork, selectedAccount, accounts, networks, swapAndBridgeRoutesPendingSignature }) => { +const getAccountOpBanners = ({ accountOpActionsByNetwork, selectedAccount, accounts, networks, swapAndBridgeRoutesPendingSignature }) => { if (!accountOpActionsByNetwork) return []; const txnBanners = []; @@ -208,7 +213,8 @@ export const getAccountOpBanners = ({ accountOpActionsByNetwork, selectedAccount } return txnBanners; }; -export const getKeySyncBanner = (addr, email, keys) => { +exports.getAccountOpBanners = getAccountOpBanners; +const getKeySyncBanner = (addr, email, keys) => { const banner = { id: `keys-sync:${addr}:${email}`, accountAddr: addr, @@ -225,4 +231,5 @@ export const getKeySyncBanner = (addr, email, keys) => { }; return banner; }; +exports.getKeySyncBanner = getKeySyncBanner; //# sourceMappingURL=banners.js.map \ No newline at end of file diff --git a/dist/src/libs/banners/banners.js.map b/dist/src/libs/banners/banners.js.map index 00ec890be..023bfb208 100644 --- a/dist/src/libs/banners/banners.js.map +++ b/dist/src/libs/banners/banners.js.map @@ -1 +1 @@ -{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'\n// eslint-disable-next-line import/no-cycle\nimport { Action, Banner } from '../../interfaces/banner'\nimport { Network } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport { ActiveRoute } from '../../interfaces/swapAndBridge'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\nimport { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'\n\nconst getBridgeBannerTitle = (routeStatus: ActiveRoute['routeStatus']) => {\n switch (routeStatus) {\n case 'completed':\n return 'Bridge request completed'\n case 'in-progress':\n return 'Bridge request in progress'\n default:\n return 'Bridge request awaiting signature'\n }\n}\n\nconst getBridgeActionText = (routeStatus: ActiveRoute['routeStatus'], isBridgeTxn: boolean) => {\n if (isBridgeTxn) {\n return routeStatus === 'completed' ? 'Bridged' : 'Bridge'\n }\n\n return routeStatus === 'completed' ? 'Swapped' : 'Swap'\n}\n\nconst getBridgeBannerText = (route: ActiveRoute, isBridgeTxn: boolean, networks?: Network[]) => {\n const steps = getQuoteRouteSteps(route.route.userTxs)\n const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn)\n const fromAssetSymbol = steps[0].fromAsset.symbol\n const toAssetSymbol = steps[steps.length - 1].toAsset.symbol\n\n let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`\n\n if (networks) {\n const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId)\n const toAssetNetwork = networks.find(\n (n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId\n )\n if (fromAssetNetwork && toAssetNetwork) {\n assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`\n }\n }\n\n const stepsIndexText = `(step ${\n route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1\n } of ${route.route.totalUserTx})`\n\n return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`\n}\n\nexport const getBridgeBanners = (\n activeRoutes: ActiveRoute[],\n accountOpActions: AccountOpAction[],\n networks: Network[]\n): Banner[] => {\n const isBridgeTxn = (route: ActiveRoute) =>\n route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const isRouteTurnedIntoAccountOp = (route: ActiveRoute) => {\n return accountOpActions.some((action) => {\n return action.accountOp.calls.some(\n (call) =>\n call.fromUserRequestId === route.activeRouteId ||\n call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` ||\n call.fromUserRequestId === `${route.activeRouteId}-approval`\n )\n })\n }\n\n return activeRoutes\n .filter(isBridgeTxn)\n .filter((route) => {\n if (route.routeStatus === 'failed') return false\n if (route.routeStatus !== 'ready') return true\n // If the route is ready to be signed, we should display the banner only if it's not turned into an account op\n // because when it does get turned into an account op, there will be a different banner for that\n return !isRouteTurnedIntoAccountOp(route)\n })\n .map((r) => {\n const actions: Action[] = []\n\n if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') {\n actions.push({\n label: 'Details',\n actionName: 'open-swap-and-bridge-tab'\n })\n }\n\n if (r.routeStatus === 'completed') {\n actions.push({\n label: 'Close',\n actionName: 'close-bridge',\n meta: { activeRouteId: r.activeRouteId }\n })\n }\n\n if (r.routeStatus === 'ready') {\n const isNextTnxForBridging = r.route.currentUserTxIndex >= 1\n\n actions.push(\n {\n label: 'Reject',\n actionName: 'reject-bridge',\n meta: { activeRouteId: r.activeRouteId }\n },\n {\n label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open',\n actionName: 'proceed-bridge',\n meta: { activeRouteId: r.activeRouteId }\n }\n )\n }\n\n return {\n id: `bridge-${r.activeRouteId}`,\n type: r.routeStatus === 'completed' ? 'success' : 'info',\n category: `bridge-${r.routeStatus}`,\n title: getBridgeBannerTitle(r.routeStatus),\n text: getBridgeBannerText(r, true, networks),\n actions\n }\n })\n}\n\nexport const getDappActionRequestsBanners = (actions: ActionFromActionsQueue[]): Banner[] => {\n const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type))\n if (!requests.length) return []\n\n return [\n {\n id: 'dapp-requests-banner',\n type: 'info',\n title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`,\n text: '',\n actions: [\n {\n label: 'Open',\n actionName: 'open-pending-dapp-requests'\n }\n ]\n }\n ]\n}\n\nconst getAccountOpBannerText = (\n activeSwapAndBridgeRoutesForSelectedAccount: ActiveRoute[],\n chainId: bigint,\n nonSwapAndBridgeTxns: number,\n networks: Network[]\n) => {\n const swapsAndBridges: string[] = []\n const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => {\n return BigInt(route.route.fromChainId) === chainId\n })\n\n if (networkSwapAndBridgeRoutes.length) {\n networkSwapAndBridgeRoutes.forEach((route) => {\n const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const desc = getBridgeBannerText(route, isBridgeTxn, networks)\n\n swapsAndBridges.push(desc)\n })\n\n return `${swapsAndBridges.join(', ')} ${\n nonSwapAndBridgeTxns\n ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}`\n : ''\n }`\n }\n\n return ''\n}\n\nexport const getAccountOpBanners = ({\n accountOpActionsByNetwork,\n selectedAccount,\n accounts,\n networks,\n swapAndBridgeRoutesPendingSignature\n}: {\n accountOpActionsByNetwork: {\n [key: string]: AccountOpAction[]\n }\n\n selectedAccount: string\n accounts: Account[]\n networks: Network[]\n swapAndBridgeRoutesPendingSignature: ActiveRoute[]\n}): Banner[] => {\n if (!accountOpActionsByNetwork) return []\n const txnBanners: Banner[] = []\n\n const account = accounts.find((acc) => acc.addr === selectedAccount)\n\n if (account?.creation) {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n actions.forEach((action) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n }, 0)\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n category: 'pending-to-be-signed-acc-op',\n title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: action.id,\n shouldOpenNextAction: false\n }\n },\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: { actionId: action.id }\n }\n ]\n })\n })\n })\n } else {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = actions.reduce((prev, action) => {\n action.accountOp.calls.forEach((call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n })\n\n return prev\n }, 0)\n\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n title: `${actions.length} transaction${\n actions.length > 1 ? 's' : ''\n } waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n actions.length <= 1\n ? {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: actions[0].id\n }\n }\n : undefined,\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: {\n actionId: actions[0].id\n }\n }\n ].filter(Boolean) as Action[]\n })\n })\n }\n\n return txnBanners\n}\n\nexport const getKeySyncBanner = (addr: string, email: string, keys: string[]) => {\n const banner: Banner = {\n id: `keys-sync:${addr}:${email}`,\n accountAddr: addr,\n type: 'info',\n title: 'Sync Key Store keys',\n text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.',\n actions: [\n {\n label: 'Sync',\n actionName: 'sync-keys',\n meta: { email, keys }\n }\n ]\n }\n return banner\n}\n"]} \ No newline at end of file +{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'\n// eslint-disable-next-line import/no-cycle\nimport { Action, Banner } from '../../interfaces/banner'\nimport { Network } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport { ActiveRoute } from '../../interfaces/swapAndBridge'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\nimport { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'\n\nconst getBridgeBannerTitle = (routeStatus: ActiveRoute['routeStatus']) => {\n switch (routeStatus) {\n case 'completed':\n return 'Bridge request completed'\n case 'in-progress':\n return 'Bridge request in progress'\n default:\n return 'Bridge request awaiting signature'\n }\n}\n\nconst getBridgeActionText = (routeStatus: ActiveRoute['routeStatus'], isBridgeTxn: boolean) => {\n if (isBridgeTxn) {\n return routeStatus === 'completed' ? 'Bridged' : 'Bridge'\n }\n\n return routeStatus === 'completed' ? 'Swapped' : 'Swap'\n}\n\nconst getBridgeBannerText = (route: ActiveRoute, isBridgeTxn: boolean, networks?: Network[]) => {\n const steps = getQuoteRouteSteps(route.route.userTxs)\n const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn)\n const fromAssetSymbol = steps[0].fromAsset.symbol\n const toAssetSymbol = steps[steps.length - 1].toAsset.symbol\n\n let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`\n\n if (networks) {\n const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId)\n const toAssetNetwork = networks.find(\n (n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId\n )\n if (fromAssetNetwork && toAssetNetwork) {\n assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`\n }\n }\n\n const stepsIndexText = `(step ${\n route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1\n } of ${route.route.totalUserTx})`\n\n return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`\n}\n\nexport const getBridgeBanners = (\n activeRoutes: ActiveRoute[],\n accountOpActions: AccountOpAction[],\n networks: Network[]\n): Banner[] => {\n const isBridgeTxn = (route: ActiveRoute) =>\n route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const isRouteTurnedIntoAccountOp = (route: ActiveRoute) => {\n return accountOpActions.some((action) => {\n return action.accountOp.calls.some(\n (call) =>\n call.fromUserRequestId === route.activeRouteId ||\n call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` ||\n call.fromUserRequestId === `${route.activeRouteId}-approval`\n )\n })\n }\n\n return activeRoutes\n .filter(isBridgeTxn)\n .filter((route) => {\n if (route.routeStatus === 'failed') return false\n if (route.routeStatus !== 'ready') return true\n // If the route is ready to be signed, we should display the banner only if it's not turned into an account op\n // because when it does get turned into an account op, there will be a different banner for that\n return !isRouteTurnedIntoAccountOp(route)\n })\n .map((r) => {\n const actions: Action[] = []\n\n if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') {\n actions.push({\n label: 'Details',\n actionName: 'open-swap-and-bridge-tab'\n })\n }\n\n if (r.routeStatus === 'completed') {\n actions.push({\n label: 'Close',\n actionName: 'close-bridge',\n meta: { activeRouteId: r.activeRouteId }\n })\n }\n\n if (r.routeStatus === 'ready') {\n const isNextTnxForBridging = r.route.currentUserTxIndex >= 1\n\n actions.push(\n {\n label: 'Reject',\n actionName: 'reject-bridge',\n meta: { activeRouteId: r.activeRouteId }\n },\n {\n label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open',\n actionName: 'proceed-bridge',\n meta: { activeRouteId: r.activeRouteId }\n }\n )\n }\n\n return {\n id: `bridge-${r.activeRouteId}`,\n type: r.routeStatus === 'completed' ? 'success' : 'info',\n category: `bridge-${r.routeStatus}`,\n title: getBridgeBannerTitle(r.routeStatus),\n text: getBridgeBannerText(r, true, networks),\n actions\n }\n })\n}\n\nexport const getDappActionRequestsBanners = (actions: ActionFromActionsQueue[]): Banner[] => {\n const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type))\n if (!requests.length) return []\n\n return [\n {\n id: 'dapp-requests-banner',\n type: 'info',\n title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`,\n text: '',\n actions: [\n {\n label: 'Open',\n actionName: 'open-pending-dapp-requests'\n }\n ]\n }\n ]\n}\n\nconst getAccountOpBannerText = (\n activeSwapAndBridgeRoutesForSelectedAccount: ActiveRoute[],\n chainId: bigint,\n nonSwapAndBridgeTxns: number,\n networks: Network[]\n) => {\n const swapsAndBridges: string[] = []\n const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => {\n return BigInt(route.route.fromChainId) === chainId\n })\n\n if (networkSwapAndBridgeRoutes.length) {\n networkSwapAndBridgeRoutes.forEach((route) => {\n const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const desc = getBridgeBannerText(route, isBridgeTxn, networks)\n\n swapsAndBridges.push(desc)\n })\n\n return `${swapsAndBridges.join(', ')} ${\n nonSwapAndBridgeTxns\n ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}`\n : ''\n }`\n }\n\n return ''\n}\n\nexport const getAccountOpBanners = ({\n accountOpActionsByNetwork,\n selectedAccount,\n accounts,\n networks,\n swapAndBridgeRoutesPendingSignature\n}: {\n accountOpActionsByNetwork: {\n [key: string]: AccountOpAction[]\n }\n\n selectedAccount: string\n accounts: Account[]\n networks: Network[]\n swapAndBridgeRoutesPendingSignature: ActiveRoute[]\n}): Banner[] => {\n if (!accountOpActionsByNetwork) return []\n const txnBanners: Banner[] = []\n\n const account = accounts.find((acc) => acc.addr === selectedAccount)\n\n if (account?.creation) {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n actions.forEach((action) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n }, 0)\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n category: 'pending-to-be-signed-acc-op',\n title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: action.id,\n shouldOpenNextAction: false\n }\n },\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: { actionId: action.id }\n }\n ]\n })\n })\n })\n } else {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = actions.reduce((prev, action) => {\n action.accountOp.calls.forEach((call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n })\n\n return prev\n }, 0)\n\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n title: `${actions.length} transaction${\n actions.length > 1 ? 's' : ''\n } waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n actions.length <= 1\n ? {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: actions[0].id\n }\n }\n : undefined,\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: {\n actionId: actions[0].id\n }\n }\n ].filter(Boolean) as Action[]\n })\n })\n }\n\n return txnBanners\n}\n\nexport const getKeySyncBanner = (addr: string, email: string, keys: string[]) => {\n const banner: Banner = {\n id: `keys-sync:${addr}:${email}`,\n accountAddr: addr,\n type: 'info',\n title: 'Sync Key Store keys',\n text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.',\n actions: [\n {\n label: 'Sync',\n actionName: 'sync-keys',\n meta: { email, keys }\n }\n ]\n }\n return banner\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/calls/calls.js b/dist/src/libs/calls/calls.js index 33f77bdd6..526335645 100644 --- a/dist/src/libs/calls/calls.js +++ b/dist/src/libs/calls/calls.js @@ -1,36 +1,41 @@ -import { AbiCoder, Interface, ZeroAddress } from 'ethers'; -import ERC20 from '../../../contracts/compiled/IERC20.json'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; -export function getFeeCall(feeToken) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getFeeCall = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const IERC20_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/IERC20.json")); +const addresses_1 = require("../../consts/addresses"); +const deploy_1 = require("../../consts/deploy"); +function getFeeCall(feeToken) { // set a bigger number for gas tank / approvals so on // L2s it could calculate the preVerificationGas better const gasTankOrApproveAmount = 500000000n * BigInt(feeToken.decimals); if (feeToken.flags.onGasTank) { - const abiCoder = new AbiCoder(); + const abiCoder = new ethers_1.AbiCoder(); return { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: 0n, data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', gasTankOrApproveAmount, feeToken.symbol]) }; } - if (feeToken.address === ZeroAddress) { + if (feeToken.address === ethers_1.ZeroAddress) { // native payment return { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: 1n, data: '0x' }; } // token payment - const ERC20Interface = new Interface(ERC20.abi); + const ERC20Interface = new ethers_1.Interface(IERC20_json_1.default.abi); return { to: feeToken.address, value: 0n, data: ERC20Interface.encodeFunctionData('approve', [ - DEPLOYLESS_SIMULATION_FROM, + deploy_1.DEPLOYLESS_SIMULATION_FROM, gasTankOrApproveAmount ]) }; } +exports.getFeeCall = getFeeCall; //# sourceMappingURL=calls.js.map \ No newline at end of file diff --git a/dist/src/libs/calls/calls.js.map b/dist/src/libs/calls/calls.js.map index ff3910f4b..e158356bd 100644 --- a/dist/src/libs/calls/calls.js.map +++ b/dist/src/libs/calls/calls.js.map @@ -1 +1 @@ -{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/libs/calls/calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,KAAK,MAAM,yCAAyC,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAIhE,MAAM,UAAU,UAAU,CAAC,QAAqB;IAC9C,qDAAqD;IACrD,uDAAuD;IACvD,MAAM,sBAAsB,GAAG,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAErE,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,OAAO;YACL,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ,CAAC,MAAM,CACnB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC/B,CAAC,SAAS,EAAE,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CACrD;SACF,CAAA;KACF;IAED,IAAI,QAAQ,CAAC,OAAO,KAAK,WAAW,EAAE;QACpC,iBAAiB;QACjB,OAAO;YACL,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,IAAI;SACX,CAAA;KACF;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,OAAO;QACpB,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE;YACjD,0BAA0B;YAC1B,sBAAsB;SACvB,CAAC;KACH,CAAA;AACH,CAAC","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeCall(feeToken: TokenResult): Call {\n // set a bigger number for gas tank / approvals so on\n // L2s it could calculate the preVerificationGas better\n const gasTankOrApproveAmount = 500000000n * BigInt(feeToken.decimals)\n\n if (feeToken.flags.onGasTank) {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', gasTankOrApproveAmount, feeToken.symbol]\n )\n }\n }\n\n if (feeToken.address === ZeroAddress) {\n // native payment\n return {\n to: FEE_COLLECTOR,\n value: 1n,\n data: '0x'\n }\n }\n\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n return {\n to: feeToken.address,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('approve', [\n DEPLOYLESS_SIMULATION_FROM,\n gasTankOrApproveAmount\n ])\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/libs/calls/calls.ts"],"names":[],"mappings":";;;;AAAA,mCAAyD;AAEzD,kGAA2D;AAC3D,sDAAsD;AACtD,gDAAgE;AAIhE,SAAgB,UAAU,CAAC,QAAqB;IAC9C,qDAAqD;IACrD,uDAAuD;IACvD,MAAM,sBAAsB,GAAG,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAErE,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;QAC/B,OAAO;YACL,EAAE,EAAE,yBAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ,CAAC,MAAM,CACnB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC/B,CAAC,SAAS,EAAE,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CACrD;SACF,CAAA;KACF;IAED,IAAI,QAAQ,CAAC,OAAO,KAAK,oBAAW,EAAE;QACpC,iBAAiB;QACjB,OAAO;YACL,EAAE,EAAE,yBAAa;YACjB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,IAAI;SACX,CAAA;KACF;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,IAAI,kBAAS,CAAC,qBAAK,CAAC,GAAG,CAAC,CAAA;IAC/C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,OAAO;QACpB,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE;YACjD,mCAA0B;YAC1B,sBAAsB;SACvB,CAAC;KACH,CAAA;AACH,CAAC;AApCD,gCAoCC","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeCall(feeToken: TokenResult): Call {\n // set a bigger number for gas tank / approvals so on\n // L2s it could calculate the preVerificationGas better\n const gasTankOrApproveAmount = 500000000n * BigInt(feeToken.decimals)\n\n if (feeToken.flags.onGasTank) {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', gasTankOrApproveAmount, feeToken.symbol]\n )\n }\n }\n\n if (feeToken.address === ZeroAddress) {\n // native payment\n return {\n to: FEE_COLLECTOR,\n value: 1n,\n data: '0x'\n }\n }\n\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n return {\n to: feeToken.address,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('approve', [\n DEPLOYLESS_SIMULATION_FROM,\n gasTankOrApproveAmount\n ])\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/defiAddresses.js b/dist/src/libs/defiPositions/defiAddresses.js index 59bf08d73..c601ac4f3 100644 --- a/dist/src/libs/defiPositions/defiAddresses.js +++ b/dist/src/libs/defiPositions/defiAddresses.js @@ -1,4 +1,7 @@ -export const AAVE_V3 = { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UNISWAP_V3 = exports.AAVE_V3 = void 0; +exports.AAVE_V3 = { ethereum: { poolAddr: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2' }, @@ -19,7 +22,7 @@ export const AAVE_V3 = { poolAddr: '0x11fCfe756c05AD438e312a7fd934381537D3cFfe' } }; -export const UNISWAP_V3 = { +exports.UNISWAP_V3 = { ethereum: { nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88', factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984' diff --git a/dist/src/libs/defiPositions/defiAddresses.js.map b/dist/src/libs/defiPositions/defiAddresses.js.map index 877e64b24..7b424925e 100644 --- a/dist/src/libs/defiPositions/defiAddresses.js.map +++ b/dist/src/libs/defiPositions/defiAddresses.js.map @@ -1 +1 @@ -{"version":3,"file":"defiAddresses.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/defiAddresses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;QACtD,yDAAyD;KAC1D;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,4CAA4C;KACvD;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,4CAA4C;KACvD;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,4CAA4C;KACvD;CACF,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,IAAI,EAAE;QACJ,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,OAAO,EAAE;QACP,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;CACF,CAAA","sourcesContent":["export const AAVE_V3 = {\n ethereum: {\n poolAddr: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2'\n },\n optimism: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n // poolAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88'\n },\n arbitrum: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n base: {\n poolAddr: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5'\n },\n polygon: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n scroll: {\n poolAddr: '0x11fCfe756c05AD438e312a7fd934381537D3cFfe'\n }\n}\n\nexport const UNISWAP_V3 = {\n ethereum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n optimism: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n arbitrum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n base: {\n nonfungiblePositionManagerAddr: '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1',\n factoryAddr: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD'\n },\n polygon: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"defiAddresses.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/defiAddresses.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG;IACrB,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;QACtD,yDAAyD;KAC1D;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,4CAA4C;KACvD;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,4CAA4C;KACvD;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,4CAA4C;KACvD;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,4CAA4C;KACvD;CACF,CAAA;AAEY,QAAA,UAAU,GAAG;IACxB,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE;QACR,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,IAAI,EAAE;QACJ,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;IACD,OAAO,EAAE;QACP,8BAA8B,EAAE,4CAA4C;QAC5E,WAAW,EAAE,4CAA4C;KAC1D;CACF,CAAA","sourcesContent":["export const AAVE_V3 = {\n ethereum: {\n poolAddr: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2'\n },\n optimism: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n // poolAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88'\n },\n arbitrum: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n base: {\n poolAddr: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5'\n },\n polygon: {\n poolAddr: '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n },\n scroll: {\n poolAddr: '0x11fCfe756c05AD438e312a7fd934381537D3cFfe'\n }\n}\n\nexport const UNISWAP_V3 = {\n ethereum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n optimism: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n arbitrum: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n },\n base: {\n nonfungiblePositionManagerAddr: '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1',\n factoryAddr: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD'\n },\n polygon: {\n nonfungiblePositionManagerAddr: '0xC36442b4a4522E871399CD717aBDD847Ab11FE88',\n factoryAddr: '0x1F98431c8aD98523631AE4a59f267346ea31F984'\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.js b/dist/src/libs/defiPositions/helpers.js index dfc3f8c0e..757f58cd6 100644 --- a/dist/src/libs/defiPositions/helpers.js +++ b/dist/src/libs/defiPositions/helpers.js @@ -1,4 +1,7 @@ -import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAssetValue = exports.sortByValue = void 0; +const formatters_1 = require("../../utils/numbers/formatters"); const sortByValue = (aValue, bValue) => { if (aValue && bValue) { return bValue - aValue; @@ -11,14 +14,15 @@ const sortByValue = (aValue, bValue) => { } return 0; }; +exports.sortByValue = sortByValue; const getAssetValue = (amount, decimals, priceIn) => { if (!priceIn.length) return undefined; const priceInUSD = priceIn.find((p) => p.baseCurrency === 'usd')?.price; if (!priceInUSD) return undefined; - const assetValueString = safeTokenAmountAndNumberMultiplication(amount, decimals, priceInUSD); + const assetValueString = (0, formatters_1.safeTokenAmountAndNumberMultiplication)(amount, decimals, priceInUSD); return Number(assetValueString); }; -export { sortByValue, getAssetValue }; +exports.getAssetValue = getAssetValue; //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/helpers.js.map b/dist/src/libs/defiPositions/helpers.js.map index cc761a753..7b718c44c 100644 --- a/dist/src/libs/defiPositions/helpers.js.map +++ b/dist/src/libs/defiPositions/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sCAAsC,EAAE,MAAM,gCAAgC,CAAA;AAGvF,MAAM,WAAW,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,EAAE;IACvD,IAAI,MAAM,IAAI,MAAM,EAAE;QACpB,OAAO,MAAM,GAAG,MAAM,CAAA;KACvB;IACD,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB,OAAO,CAAC,CAAC,CAAA;KACV;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;QACrB,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAgB,EAAsB,EAAE;IAC/F,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,KAAK,CAAA;IACvE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAE7F,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA","sourcesContent":["import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport { Price } from '../portfolio'\n\nconst sortByValue = (aValue?: number, bValue?: number) => {\n if (aValue && bValue) {\n return bValue - aValue\n }\n if (aValue && !bValue) {\n return -1\n }\n if (!aValue && bValue) {\n return 1\n }\n\n return 0\n}\n\nconst getAssetValue = (amount: bigint, decimals: number, priceIn: Price[]): number | undefined => {\n if (!priceIn.length) return undefined\n\n const priceInUSD = priceIn.find((p) => p.baseCurrency === 'usd')?.price\n if (!priceInUSD) return undefined\n\n const assetValueString = safeTokenAmountAndNumberMultiplication(amount, decimals, priceInUSD)\n\n return Number(assetValueString)\n}\n\nexport { sortByValue, getAssetValue }\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/helpers.ts"],"names":[],"mappings":";;;AAAA,+DAAuF;AAGvF,MAAM,WAAW,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,EAAE;IACvD,IAAI,MAAM,IAAI,MAAM,EAAE;QACpB,OAAO,MAAM,GAAG,MAAM,CAAA;KACvB;IACD,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB,OAAO,CAAC,CAAC,CAAA;KACV;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;QACrB,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAaQ,kCAAW;AAXpB,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAgB,EAAsB,EAAE;IAC/F,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,KAAK,CAAA;IACvE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,gBAAgB,GAAG,IAAA,mDAAsC,EAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAE7F,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAA;AACjC,CAAC,CAAA;AAEqB,sCAAa","sourcesContent":["import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport { Price } from '../portfolio'\n\nconst sortByValue = (aValue?: number, bValue?: number) => {\n if (aValue && bValue) {\n return bValue - aValue\n }\n if (aValue && !bValue) {\n return -1\n }\n if (!aValue && bValue) {\n return 1\n }\n\n return 0\n}\n\nconst getAssetValue = (amount: bigint, decimals: number, priceIn: Price[]): number | undefined => {\n if (!priceIn.length) return undefined\n\n const priceInUSD = priceIn.find((p) => p.baseCurrency === 'usd')?.price\n if (!priceInUSD) return undefined\n\n const assetValueString = safeTokenAmountAndNumberMultiplication(amount, decimals, priceInUSD)\n\n return Number(assetValueString)\n}\n\nexport { sortByValue, getAssetValue }\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.js b/dist/src/libs/defiPositions/providers/aaveV3.js index 1308d81c8..4c6f0ef91 100644 --- a/dist/src/libs/defiPositions/providers/aaveV3.js +++ b/dist/src/libs/defiPositions/providers/aaveV3.js @@ -1,16 +1,20 @@ -import { v4 as uuidv4 } from 'uuid'; -import DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiAAVEPosition.json'; -import { fromDescriptor } from '../../deployless/deployless'; -import { AAVE_V3 } from '../defiAddresses'; -import { getAssetValue } from '../helpers'; -import { AssetType } from '../types'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAAVEPositions = void 0; +const tslib_1 = require("tslib"); +const uuid_1 = require("uuid"); +const DeFiAAVEPosition_json_1 = tslib_1.__importDefault(require("../../../../contracts/compiled/DeFiAAVEPosition.json")); +const deployless_1 = require("../../deployless/deployless"); +const defiAddresses_1 = require("../defiAddresses"); +const helpers_1 = require("../helpers"); +const types_1 = require("../types"); const AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; -export async function getAAVEPositions(userAddr, provider, network) { +async function getAAVEPositions(userAddr, provider, network) { const networkId = network.id; - if (networkId && !AAVE_V3[networkId]) + if (networkId && !defiAddresses_1.AAVE_V3[networkId]) return null; - const { poolAddr } = AAVE_V3[networkId]; - const deploylessDeFiPositionsGetter = fromDescriptor(provider, DeFiPositionsDeploylessCode, network.rpcNoStateOverride); + const { poolAddr } = defiAddresses_1.AAVE_V3[networkId]; + const deploylessDeFiPositionsGetter = (0, deployless_1.fromDescriptor)(provider, DeFiAAVEPosition_json_1.default, network.rpcNoStateOverride); const [[result0], [result1], [result2]] = await Promise.all([ deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 0, 15], {}), deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 15, 30], {}), @@ -52,7 +56,7 @@ export async function getAAVEPositions(userAddr, provider, network) { accountData.healthFactor = null; } const position = { - id: uuidv4(), + id: (0, uuid_1.v4)(), additionalData: { healthRate: accountData.healthFactor ? Number(accountData.healthFactor) / 1e18 : null, positionInUSD: 0, @@ -81,8 +85,8 @@ export async function getAAVEPositions(userAddr, provider, network) { decimals: Number(asset.decimals), amount: asset.balance, priceIn, - value: getAssetValue(asset.balance, Number(asset.decimals), priceIn), - type: AssetType.Collateral, + value: (0, helpers_1.getAssetValue)(asset.balance, Number(asset.decimals), priceIn), + type: types_1.AssetType.Collateral, additionalData: { APY: Number(asset.currentLiquidityRate) / 10 ** 25 }, @@ -100,8 +104,8 @@ export async function getAAVEPositions(userAddr, provider, network) { decimals: Number(asset.decimals), amount: asset.stableBorrowAssetBalanc, priceIn, - value: getAssetValue(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn), - type: AssetType.Borrow, + value: (0, helpers_1.getAssetValue)(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn), + type: types_1.AssetType.Borrow, additionalData: { APY: Number(asset.currentStableBorrowRate) / 10 ** 25 }, @@ -119,8 +123,8 @@ export async function getAAVEPositions(userAddr, provider, network) { decimals: Number(asset.decimals), amount: asset.borrowAssetBalance, priceIn, - value: getAssetValue(asset.borrowAssetBalance, Number(asset.decimals), priceIn), - type: AssetType.Borrow, + value: (0, helpers_1.getAssetValue)(asset.borrowAssetBalance, Number(asset.decimals), priceIn), + type: types_1.AssetType.Borrow, additionalData: { APY: Number(asset.currentVariableBorrowRate) / 10 ** 25 }, @@ -144,4 +148,5 @@ export async function getAAVEPositions(userAddr, provider, network) { positionInUSD: position.additionalData.positionInUSD }; } +exports.getAAVEPositions = getAAVEPositions; //# sourceMappingURL=aaveV3.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/aaveV3.js.map b/dist/src/libs/defiPositions/providers/aaveV3.js.map index 6b460cc02..ad0183216 100644 --- a/dist/src/libs/defiPositions/providers/aaveV3.js.map +++ b/dist/src/libs/defiPositions/providers/aaveV3.js.map @@ -1 +1 @@ -{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiAAVEPosition.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { AAVE_V3 } from '../defiAddresses'\nimport { getAssetValue } from '../helpers'\nimport { AssetType, Position, PositionAsset, PositionsByProvider } from '../types'\n\nconst AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\n\nexport async function getAAVEPositions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !AAVE_V3[networkId as keyof typeof AAVE_V3]) return null\n\n const { poolAddr } = AAVE_V3[networkId as keyof typeof AAVE_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [[result0], [result1], [result2]] = await Promise.all([\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 0, 15], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 15, 30], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 30, 45], {})\n ])\n\n const accountDataRes = result0[1]\n\n const userAssets = [...result0[0], ...result1[0], ...result2[0]]\n .map((asset: any) => ({\n address: asset[0],\n symbol: asset[1],\n balance: asset[2],\n decimals: asset[3],\n price: asset[4],\n borrowAssetBalance: asset[5],\n stableBorrowAssetBalance: asset[6],\n currentLiquidityRate: asset[7],\n currentVariableBorrowRate: asset[8],\n currentStableBorrowRate: asset[9],\n\n aaveAddress: asset[10],\n aaveSymbol: asset[11],\n aaveDecimals: asset[12],\n\n aaveSDebtAddr: asset[13],\n aaveSDebtSymbol: asset[14],\n aaveSDebtDecimals: asset[15],\n\n aaveVDebtAddr: asset[16],\n aaveVDebtSymbol: asset[17],\n aaveVDebtDecimals: asset[18]\n }))\n .filter((t: any) => t.balance > 0 || t.borrowAssetBalance > 0 || t.stableBorrowAssetBalance > 0)\n\n const accountData = {\n totalCollateralBase: accountDataRes[0],\n totalDebtBase: accountDataRes[1],\n availableBorrowsBase: accountDataRes[2],\n currentLiquidationThreshold: accountDataRes[3],\n ltv: accountDataRes[4],\n healthFactor: accountDataRes[5]\n }\n\n if (accountData.healthFactor === AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER) {\n accountData.healthFactor = null\n }\n\n const position = {\n id: uuidv4(),\n additionalData: {\n healthRate: accountData.healthFactor ? Number(accountData.healthFactor) / 1e18 : null,\n positionInUSD: 0,\n deptInUSD: 0,\n collateralInUSD: 0,\n availableBorrowInUSD: Number(accountData.availableBorrowsBase) / 1e8\n },\n assets: []\n } as Position\n\n position.assets = userAssets\n .map((asset: any) => {\n const balance = Number(asset.balance) / 10 ** Number(asset.decimals)\n const price = Number(asset.price) / 1e8\n const borrow = (Number(asset.borrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n const stableBorrow =\n (Number(asset.stableBorrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n\n position.additionalData.positionInUSD += (balance + borrow + stableBorrow) * price\n position.additionalData.deptInUSD += borrow * price\n position.additionalData.deptInUSD += stableBorrow * price\n position.additionalData.collateralInUSD += balance * price\n\n const assetsResult = []\n\n const priceIn = [{ baseCurrency: 'usd', price }]\n\n if (asset.balance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.balance,\n priceIn,\n value: getAssetValue(asset.balance, Number(asset.decimals), priceIn),\n type: AssetType.Collateral,\n additionalData: {\n APY: Number(asset.currentLiquidityRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveAddress,\n symbol: asset.aaveSymbol,\n decimals: asset.aaveDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.stableBorrowAssetBalanc > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.stableBorrowAssetBalanc,\n priceIn,\n value: getAssetValue(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentStableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveSDebtAddr,\n symbol: asset.aaveSDebtSymbol,\n decimals: asset.aaveSDebtDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.borrowAssetBalance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.borrowAssetBalance,\n priceIn,\n value: getAssetValue(asset.borrowAssetBalance, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentVariableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveVDebtAddr,\n symbol: asset.aaveVDebtSymbol,\n decimals: asset.aaveVDebtDecimals\n }\n } as PositionAsset)\n }\n\n return assetsResult\n })\n .flat()\n\n if (position.additionalData.positionInUSD === 0 || !position.assets.length) return null\n\n return {\n providerName: 'AAVE v3',\n networkId,\n type: 'lending',\n positions: [position],\n positionInUSD: position.additionalData.positionInUSD\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiAAVEPosition.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { AAVE_V3 } from '../defiAddresses'\nimport { getAssetValue } from '../helpers'\nimport { AssetType, Position, PositionAsset, PositionsByProvider } from '../types'\n\nconst AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER =\n 115792089237316195423570985008687907853269984665640564039457584007913129639935n\n\nexport async function getAAVEPositions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !AAVE_V3[networkId as keyof typeof AAVE_V3]) return null\n\n const { poolAddr } = AAVE_V3[networkId as keyof typeof AAVE_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [[result0], [result1], [result2]] = await Promise.all([\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 0, 15], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 15, 30], {}),\n deploylessDeFiPositionsGetter.call('getAAVEPosition', [userAddr, poolAddr, 30, 45], {})\n ])\n\n const accountDataRes = result0[1]\n\n const userAssets = [...result0[0], ...result1[0], ...result2[0]]\n .map((asset: any) => ({\n address: asset[0],\n symbol: asset[1],\n balance: asset[2],\n decimals: asset[3],\n price: asset[4],\n borrowAssetBalance: asset[5],\n stableBorrowAssetBalance: asset[6],\n currentLiquidityRate: asset[7],\n currentVariableBorrowRate: asset[8],\n currentStableBorrowRate: asset[9],\n\n aaveAddress: asset[10],\n aaveSymbol: asset[11],\n aaveDecimals: asset[12],\n\n aaveSDebtAddr: asset[13],\n aaveSDebtSymbol: asset[14],\n aaveSDebtDecimals: asset[15],\n\n aaveVDebtAddr: asset[16],\n aaveVDebtSymbol: asset[17],\n aaveVDebtDecimals: asset[18]\n }))\n .filter((t: any) => t.balance > 0 || t.borrowAssetBalance > 0 || t.stableBorrowAssetBalance > 0)\n\n const accountData = {\n totalCollateralBase: accountDataRes[0],\n totalDebtBase: accountDataRes[1],\n availableBorrowsBase: accountDataRes[2],\n currentLiquidationThreshold: accountDataRes[3],\n ltv: accountDataRes[4],\n healthFactor: accountDataRes[5]\n }\n\n if (accountData.healthFactor === AAVE_NO_HEALTH_FACTOR_MAGIC_NUMBER) {\n accountData.healthFactor = null\n }\n\n const position = {\n id: uuidv4(),\n additionalData: {\n healthRate: accountData.healthFactor ? Number(accountData.healthFactor) / 1e18 : null,\n positionInUSD: 0,\n deptInUSD: 0,\n collateralInUSD: 0,\n availableBorrowInUSD: Number(accountData.availableBorrowsBase) / 1e8\n },\n assets: []\n } as Position\n\n position.assets = userAssets\n .map((asset: any) => {\n const balance = Number(asset.balance) / 10 ** Number(asset.decimals)\n const price = Number(asset.price) / 1e8\n const borrow = (Number(asset.borrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n const stableBorrow =\n (Number(asset.stableBorrowAssetBalance) / 10 ** Number(asset.decimals)) * -1\n\n position.additionalData.positionInUSD += (balance + borrow + stableBorrow) * price\n position.additionalData.deptInUSD += borrow * price\n position.additionalData.deptInUSD += stableBorrow * price\n position.additionalData.collateralInUSD += balance * price\n\n const assetsResult = []\n\n const priceIn = [{ baseCurrency: 'usd', price }]\n\n if (asset.balance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.balance,\n priceIn,\n value: getAssetValue(asset.balance, Number(asset.decimals), priceIn),\n type: AssetType.Collateral,\n additionalData: {\n APY: Number(asset.currentLiquidityRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveAddress,\n symbol: asset.aaveSymbol,\n decimals: asset.aaveDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.stableBorrowAssetBalanc > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.stableBorrowAssetBalanc,\n priceIn,\n value: getAssetValue(asset.stableBorrowAssetBalanc, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentStableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveSDebtAddr,\n symbol: asset.aaveSDebtSymbol,\n decimals: asset.aaveSDebtDecimals\n }\n } as PositionAsset)\n }\n\n if (asset.borrowAssetBalance > 0) {\n assetsResult.push({\n address: asset.address,\n symbol: asset.symbol,\n decimals: Number(asset.decimals),\n amount: asset.borrowAssetBalance,\n priceIn,\n value: getAssetValue(asset.borrowAssetBalance, Number(asset.decimals), priceIn),\n type: AssetType.Borrow,\n additionalData: {\n APY: Number(asset.currentVariableBorrowRate) / 10 ** 25\n },\n protocolAsset: {\n address: asset.aaveVDebtAddr,\n symbol: asset.aaveVDebtSymbol,\n decimals: asset.aaveVDebtDecimals\n }\n } as PositionAsset)\n }\n\n return assetsResult\n })\n .flat()\n\n if (position.additionalData.positionInUSD === 0 || !position.assets.length) return null\n\n return {\n providerName: 'AAVE v3',\n networkId,\n type: 'lending',\n positions: [position],\n positionInUSD: position.additionalData.positionInUSD\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js index 42b9089ec..75c0d92d8 100644 --- a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const getAccountNetworksWithPositions = (accountId, accountState, oldNetworksWithPositionsByAccounts, providers) => { const networksWithPositions = { ...oldNetworksWithPositionsByAccounts[accountId] @@ -19,5 +21,5 @@ const getAccountNetworksWithPositions = (accountId, accountState, oldNetworksWit }); return networksWithPositions; }; -export default getAccountNetworksWithPositions; +exports.default = getAccountNetworksWithPositions; //# sourceMappingURL=networksWithPositions.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map index 3872908e9..084b3abfd 100644 --- a/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map +++ b/dist/src/libs/defiPositions/providers/helpers/networksWithPositions.js.map @@ -1 +1 @@ -{"version":3,"file":"networksWithPositions.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/networksWithPositions.ts"],"names":[],"mappings":"AAIA,MAAM,+BAA+B,GAAG,CACtC,SAAoB,EACpB,YAA0B,EAC1B,kCAAmE,EACnE,SAAuB,EACA,EAAE;IACzB,MAAM,qBAAqB,GAA0B;QACnD,GAAG,kCAAkC,CAAC,SAAS,CAAC;KACjD,CAAA;IAED,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAE9E,mCAAmC;QACnC,IAAI,KAAK,IAAI,SAAS,IAAI,cAAc,EAAE,MAAM;YAAE,OAAM;QAExD,qBAAqB,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAC3D,CAAC,gCAAgC,EAAE,QAAQ,EAAE,EAAE;YAC7C,IAAI,gCAAgC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAClE,OAAO,gCAAgC,CAAA;YAEzC,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAE5D,OAAO,gCAAgC,CAAA;QACzC,CAAC,EACD,qBAAqB,CAAC,SAAS,CAAC,IAAI,EAAE,CACvC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,qBAAqB,CAAA;AAC9B,CAAC,CAAA;AAED,eAAe,+BAA+B,CAAA","sourcesContent":["import { AccountId } from '../../../../interfaces/account'\nimport { RPCProviders } from '../../../../interfaces/provider'\nimport { AccountState, NetworksWithPositions, NetworksWithPositionsByAccounts } from '../../types'\n\nconst getAccountNetworksWithPositions = (\n accountId: AccountId,\n accountState: AccountState,\n oldNetworksWithPositionsByAccounts: NetworksWithPositionsByAccounts,\n providers: RPCProviders\n): NetworksWithPositions => {\n const networksWithPositions: NetworksWithPositions = {\n ...oldNetworksWithPositionsByAccounts[accountId]\n }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const { positionsByProvider, error, providerErrors } = accountState[networkId]\n\n // RPC is down or an error occurred\n if (error || isRPCDown || providerErrors?.length) return\n\n networksWithPositions[networkId] = positionsByProvider.reduce(\n (networksWithPositionsByProviders, provider) => {\n if (networksWithPositionsByProviders.includes(provider.providerName))\n return networksWithPositionsByProviders\n\n networksWithPositionsByProviders.push(provider.providerName)\n\n return networksWithPositionsByProviders\n },\n networksWithPositions[networkId] || []\n )\n })\n\n return networksWithPositions\n}\n\nexport default getAccountNetworksWithPositions\n"]} \ No newline at end of file +{"version":3,"file":"networksWithPositions.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/networksWithPositions.ts"],"names":[],"mappings":";;AAIA,MAAM,+BAA+B,GAAG,CACtC,SAAoB,EACpB,YAA0B,EAC1B,kCAAmE,EACnE,SAAuB,EACA,EAAE;IACzB,MAAM,qBAAqB,GAA0B;QACnD,GAAG,kCAAkC,CAAC,SAAS,CAAC;KACjD,CAAA;IAED,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAE9E,mCAAmC;QACnC,IAAI,KAAK,IAAI,SAAS,IAAI,cAAc,EAAE,MAAM;YAAE,OAAM;QAExD,qBAAqB,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAC3D,CAAC,gCAAgC,EAAE,QAAQ,EAAE,EAAE;YAC7C,IAAI,gCAAgC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAClE,OAAO,gCAAgC,CAAA;YAEzC,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAE5D,OAAO,gCAAgC,CAAA;QACzC,CAAC,EACD,qBAAqB,CAAC,SAAS,CAAC,IAAI,EAAE,CACvC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,qBAAqB,CAAA;AAC9B,CAAC,CAAA;AAED,kBAAe,+BAA+B,CAAA","sourcesContent":["import { AccountId } from '../../../../interfaces/account'\nimport { RPCProviders } from '../../../../interfaces/provider'\nimport { AccountState, NetworksWithPositions, NetworksWithPositionsByAccounts } from '../../types'\n\nconst getAccountNetworksWithPositions = (\n accountId: AccountId,\n accountState: AccountState,\n oldNetworksWithPositionsByAccounts: NetworksWithPositionsByAccounts,\n providers: RPCProviders\n): NetworksWithPositions => {\n const networksWithPositions: NetworksWithPositions = {\n ...oldNetworksWithPositionsByAccounts[accountId]\n }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const { positionsByProvider, error, providerErrors } = accountState[networkId]\n\n // RPC is down or an error occurred\n if (error || isRPCDown || providerErrors?.length) return\n\n networksWithPositions[networkId] = positionsByProvider.reduce(\n (networksWithPositionsByProviders, provider) => {\n if (networksWithPositionsByProviders.includes(provider.providerName))\n return networksWithPositionsByProviders\n\n networksWithPositionsByProviders.push(provider.providerName)\n\n return networksWithPositionsByProviders\n },\n networksWithPositions[networkId] || []\n )\n })\n\n return networksWithPositions\n}\n\nexport default getAccountNetworksWithPositions\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js index 0486f8d23..3d075c2c8 100644 --- a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js @@ -1,4 +1,7 @@ -export function uniV3DataToPortfolioPosition(liquidity, sqrtPriceX96, tickLow, tickHigh) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniV3DataToPortfolioPosition = void 0; +function uniV3DataToPortfolioPosition(liquidity, sqrtPriceX96, tickLow, tickHigh) { const Q96 = 2 ** 96; function getTickAtSqrtPrice(sqrtPriceX96) { const tick = Math.floor(Math.log((sqrtPriceX96 / Q96) ** 2) / Math.log(1.0001)); @@ -29,4 +32,5 @@ export function uniV3DataToPortfolioPosition(liquidity, sqrtPriceX96, tickLow, t } return getTokenAmounts(Number(liquidity), Number(sqrtPriceX96), Number(tickLow), Number(tickHigh)); } +exports.uniV3DataToPortfolioPosition = uniV3DataToPortfolioPosition; //# sourceMappingURL=univ3Math.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map index 293b1de75..55e362397 100644 --- a/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map +++ b/dist/src/libs/defiPositions/providers/helpers/univ3Math.js.map @@ -1 +1 @@ -{"version":3,"file":"univ3Math.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/univ3Math.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,4BAA4B,CAC1C,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;IAEhB,MAAM,GAAG,GAAQ,CAAC,IAAI,EAAE,CAAA;IAExB,SAAS,kBAAkB,CAAC,YAAoB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,eAAe,CACtB,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;QAEhB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;QAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,YAAY,GAAG,GAAG,CAAA;QACpC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,WAAW,GAAG,OAAO,EAAE;YACzB,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;SAC1F;aAAM,IAAI,WAAW,IAAI,QAAQ,EAAE;YAClC,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAA;SAC5D;aAAM,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,GAAG,QAAQ,EAAE;YAC3D,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YACvF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAA;SAC3D;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACvC,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpG,CAAC","sourcesContent":["export function uniV3DataToPortfolioPosition(\n liquidity: bigint,\n sqrtPriceX96: bigint,\n tickLow: bigint,\n tickHigh: bigint\n) {\n const Q96: any = 2 ** 96\n\n function getTickAtSqrtPrice(sqrtPriceX96: number) {\n const tick = Math.floor(Math.log((sqrtPriceX96 / Q96) ** 2) / Math.log(1.0001))\n return tick\n }\n\n function getTokenAmounts(\n liquidity: number,\n sqrtPriceX96: number,\n tickLow: number,\n tickHigh: number\n ) {\n let isInRage = false\n const sqrtRatioA = Math.sqrt(1.0001 ** tickLow)\n const sqrtRatioB = Math.sqrt(1.0001 ** tickHigh)\n const currentTick = getTickAtSqrtPrice(sqrtPriceX96)\n\n const sqrtPrice = sqrtPriceX96 / Q96\n let amount0 = 0\n let amount1 = 0\n if (currentTick < tickLow) {\n isInRage = false\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))\n } else if (currentTick >= tickHigh) {\n isInRage = false\n amount1 = Math.floor(liquidity * (sqrtRatioB - sqrtRatioA))\n } else if (currentTick >= tickLow && currentTick < tickHigh) {\n isInRage = true\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB)))\n amount1 = Math.floor(liquidity * (sqrtPrice - sqrtRatioA))\n }\n return { amount0, amount1, isInRage }\n }\n\n return getTokenAmounts(Number(liquidity), Number(sqrtPriceX96), Number(tickLow), Number(tickHigh))\n}\n"]} \ No newline at end of file +{"version":3,"file":"univ3Math.js","sourceRoot":"","sources":["../../../../../../src/libs/defiPositions/providers/helpers/univ3Math.ts"],"names":[],"mappings":";;;AAAA,SAAgB,4BAA4B,CAC1C,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;IAEhB,MAAM,GAAG,GAAQ,CAAC,IAAI,EAAE,CAAA;IAExB,SAAS,kBAAkB,CAAC,YAAoB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,eAAe,CACtB,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,QAAgB;QAEhB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;QAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,YAAY,GAAG,GAAG,CAAA;QACpC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,WAAW,GAAG,OAAO,EAAE;YACzB,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;SAC1F;aAAM,IAAI,WAAW,IAAI,QAAQ,EAAE;YAClC,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAA;SAC5D;aAAM,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,GAAG,QAAQ,EAAE;YAC3D,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YACvF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAA;SAC3D;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACvC,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpG,CAAC;AA1CD,oEA0CC","sourcesContent":["export function uniV3DataToPortfolioPosition(\n liquidity: bigint,\n sqrtPriceX96: bigint,\n tickLow: bigint,\n tickHigh: bigint\n) {\n const Q96: any = 2 ** 96\n\n function getTickAtSqrtPrice(sqrtPriceX96: number) {\n const tick = Math.floor(Math.log((sqrtPriceX96 / Q96) ** 2) / Math.log(1.0001))\n return tick\n }\n\n function getTokenAmounts(\n liquidity: number,\n sqrtPriceX96: number,\n tickLow: number,\n tickHigh: number\n ) {\n let isInRage = false\n const sqrtRatioA = Math.sqrt(1.0001 ** tickLow)\n const sqrtRatioB = Math.sqrt(1.0001 ** tickHigh)\n const currentTick = getTickAtSqrtPrice(sqrtPriceX96)\n\n const sqrtPrice = sqrtPriceX96 / Q96\n let amount0 = 0\n let amount1 = 0\n if (currentTick < tickLow) {\n isInRage = false\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))\n } else if (currentTick >= tickHigh) {\n isInRage = false\n amount1 = Math.floor(liquidity * (sqrtRatioB - sqrtRatioA))\n } else if (currentTick >= tickLow && currentTick < tickHigh) {\n isInRage = true\n amount0 = Math.floor(liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB)))\n amount1 = Math.floor(liquidity * (sqrtPrice - sqrtRatioA))\n }\n return { amount0, amount1, isInRage }\n }\n\n return getTokenAmounts(Number(liquidity), Number(sqrtPriceX96), Number(tickLow), Number(tickHigh))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.js b/dist/src/libs/defiPositions/providers/index.js index 2d84d506e..50fff11d4 100644 --- a/dist/src/libs/defiPositions/providers/index.js +++ b/dist/src/libs/defiPositions/providers/index.js @@ -1,4 +1,8 @@ -import { getAAVEPositions } from './aaveV3'; -import { getUniV3Positions } from './uniV3'; -export { getUniV3Positions, getAAVEPositions }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAAVEPositions = exports.getUniV3Positions = void 0; +const aaveV3_1 = require("./aaveV3"); +Object.defineProperty(exports, "getAAVEPositions", { enumerable: true, get: function () { return aaveV3_1.getAAVEPositions; } }); +const uniV3_1 = require("./uniV3"); +Object.defineProperty(exports, "getUniV3Positions", { enumerable: true, get: function () { return uniV3_1.getUniV3Positions; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/index.js.map b/dist/src/libs/defiPositions/providers/index.js.map index dc53efe66..c691c4494 100644 --- a/dist/src/libs/defiPositions/providers/index.js.map +++ b/dist/src/libs/defiPositions/providers/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAA","sourcesContent":["import { getAAVEPositions } from './aaveV3'\nimport { getUniV3Positions } from './uniV3'\n\nexport { getUniV3Positions, getAAVEPositions }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/index.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAGf,iGAHnB,yBAAgB,OAGmB;AAF5C,mCAA2C;AAElC,kGAFA,yBAAiB,OAEA","sourcesContent":["import { getAAVEPositions } from './aaveV3'\nimport { getUniV3Positions } from './uniV3'\n\nexport { getUniV3Positions, getAAVEPositions }\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.js b/dist/src/libs/defiPositions/providers/uniV3.js index cab383e00..5252b18e5 100644 --- a/dist/src/libs/defiPositions/providers/uniV3.js +++ b/dist/src/libs/defiPositions/providers/uniV3.js @@ -1,14 +1,18 @@ -import DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiUniswapV3Positions.json'; -import { fromDescriptor } from '../../deployless/deployless'; -import { UNISWAP_V3 } from '../defiAddresses'; -import { AssetType } from '../types'; -import { uniV3DataToPortfolioPosition } from './helpers/univ3Math'; -export async function getUniV3Positions(userAddr, provider, network) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getUniV3Positions = void 0; +const tslib_1 = require("tslib"); +const DeFiUniswapV3Positions_json_1 = tslib_1.__importDefault(require("../../../../contracts/compiled/DeFiUniswapV3Positions.json")); +const deployless_1 = require("../../deployless/deployless"); +const defiAddresses_1 = require("../defiAddresses"); +const types_1 = require("../types"); +const univ3Math_1 = require("./helpers/univ3Math"); +async function getUniV3Positions(userAddr, provider, network) { const networkId = network.id; - if (networkId && !UNISWAP_V3[networkId]) + if (networkId && !defiAddresses_1.UNISWAP_V3[networkId]) return null; - const { nonfungiblePositionManagerAddr, factoryAddr } = UNISWAP_V3[networkId]; - const deploylessDeFiPositionsGetter = fromDescriptor(provider, DeFiPositionsDeploylessCode, network.rpcNoStateOverride); + const { nonfungiblePositionManagerAddr, factoryAddr } = defiAddresses_1.UNISWAP_V3[networkId]; + const deploylessDeFiPositionsGetter = (0, deployless_1.fromDescriptor)(provider, DeFiUniswapV3Positions_json_1.default, network.rpcNoStateOverride); const [result] = await deploylessDeFiPositionsGetter.call('getUniV3Position', [ userAddr, nonfungiblePositionManagerAddr, @@ -47,7 +51,7 @@ export async function getUniV3Positions(userAddr, provider, network) { })); const positions = data .map((pos) => { - const tokenAmounts = uniV3DataToPortfolioPosition(pos.positionInfo.liquidity, pos.poolSlot0.sqrtPriceX96, pos.positionInfo.tickLower, pos.positionInfo.tickUpper); + const tokenAmounts = (0, univ3Math_1.uniV3DataToPortfolioPosition)(pos.positionInfo.liquidity, pos.poolSlot0.sqrtPriceX96, pos.positionInfo.tickLower, pos.positionInfo.tickUpper); return { id: pos.positionId.toString(), additionalData: { @@ -60,14 +64,14 @@ export async function getUniV3Positions(userAddr, provider, network) { symbol: pos.token0Symbol, decimals: Number(pos.token0Decimals), amount: BigInt(tokenAmounts.amount0), - type: AssetType.Liquidity + type: types_1.AssetType.Liquidity }, { address: pos.positionInfo.token1, symbol: pos.token1Symbol, decimals: Number(pos.token1Decimals), amount: BigInt(tokenAmounts.amount1), - type: AssetType.Liquidity + type: types_1.AssetType.Liquidity } ] }; @@ -82,4 +86,5 @@ export async function getUniV3Positions(userAddr, provider, network) { positions }; } +exports.getUniV3Positions = getUniV3Positions; //# sourceMappingURL=uniV3.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/providers/uniV3.js.map b/dist/src/libs/defiPositions/providers/uniV3.js.map index dfa9e5472..cea303d52 100644 --- a/dist/src/libs/defiPositions/providers/uniV3.js.map +++ b/dist/src/libs/defiPositions/providers/uniV3.js.map @@ -1 +1 @@ -{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiUniswapV3Positions.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { UNISWAP_V3 } from '../defiAddresses'\nimport { AssetType, Position, PositionsByProvider } from '../types'\nimport { uniV3DataToPortfolioPosition } from './helpers/univ3Math'\n\nexport async function getUniV3Positions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]) return null\n\n const { nonfungiblePositionManagerAddr, factoryAddr } =\n UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [result] = await deploylessDeFiPositionsGetter.call('getUniV3Position', [\n userAddr,\n nonfungiblePositionManagerAddr,\n factoryAddr\n ])\n\n const data = result.map((asset: any) => ({\n positionId: asset.positionId,\n token0Symbol: asset.token0Symbol,\n token0Decimals: asset.token0Decimals,\n token1Symbol: asset.token1Symbol,\n token1Decimals: asset.token1Decimals,\n feeGrowthGlobal0X128: asset.feeGrowthGlobal0X128,\n positionInfo: {\n nonce: asset.positionInfo.nonce,\n operator: asset.positionInfo.operator,\n token0: asset.positionInfo.token0,\n token1: asset.positionInfo.token1,\n fee: asset.positionInfo.fee,\n tickLower: asset.positionInfo.tickLower,\n tickUpper: asset.positionInfo.tickUpper,\n liquidity: asset.positionInfo.liquidity,\n feeGrowthInside0LastX128: asset.positionInfo.feeGrowthInside0LastX128,\n feeGrowthInside1LastX128: asset.positionInfo.feeGrowthInside1LastX128,\n tokensOwed0: asset.positionInfo.tokensOwed0,\n tokensOwed1: asset.positionInfo.tokensOwed1\n },\n poolSlot0: {\n sqrtPriceX96: asset.poolSlot0.sqrtPriceX96,\n tick: asset.poolSlot0.tick,\n observationIndex: asset.poolSlot0.observationIndex,\n observationCardinality: asset.poolSlot0.observationCardinality,\n observationCardinalityNext: asset.poolSlot0.observationCardinalityNext,\n feeProtocol: asset.poolSlot0.feeProtocol,\n unlocked: asset.poolSlot0.unlocked\n }\n }))\n\n const positions: Position[] = data\n .map((pos: any) => {\n const tokenAmounts = uniV3DataToPortfolioPosition(\n pos.positionInfo.liquidity,\n pos.poolSlot0.sqrtPriceX96,\n pos.positionInfo.tickLower,\n pos.positionInfo.tickUpper\n )\n return {\n id: pos.positionId.toString(),\n additionalData: {\n inRange: tokenAmounts.isInRage,\n liquidity: pos.positionInfo.liquidity\n },\n assets: [\n {\n address: pos.positionInfo.token0,\n symbol: pos.token0Symbol,\n decimals: Number(pos.token0Decimals),\n amount: BigInt(tokenAmounts.amount0),\n type: AssetType.Liquidity\n },\n {\n address: pos.positionInfo.token1,\n symbol: pos.token1Symbol,\n decimals: Number(pos.token1Decimals),\n amount: BigInt(tokenAmounts.amount1),\n type: AssetType.Liquidity\n }\n ]\n }\n })\n .filter((p: Position) => p.additionalData.liquidity !== BigInt(0))\n\n if (positions.length === 0) return null\n\n return {\n providerName: 'Uniswap V3',\n networkId,\n type: 'liquidity-pool',\n positions\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../src/libs/defiPositions/providers/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider, Provider } from 'ethers'\n\nimport DeFiPositionsDeploylessCode from '../../../../contracts/compiled/DeFiUniswapV3Positions.json'\nimport { Network } from '../../../interfaces/network'\nimport { fromDescriptor } from '../../deployless/deployless'\nimport { UNISWAP_V3 } from '../defiAddresses'\nimport { AssetType, Position, PositionsByProvider } from '../types'\nimport { uniV3DataToPortfolioPosition } from './helpers/univ3Math'\n\nexport async function getUniV3Positions(\n userAddr: string,\n provider: Provider | JsonRpcProvider,\n network: Network\n): Promise {\n const networkId = network.id\n if (networkId && !UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]) return null\n\n const { nonfungiblePositionManagerAddr, factoryAddr } =\n UNISWAP_V3[networkId as keyof typeof UNISWAP_V3]\n\n const deploylessDeFiPositionsGetter = fromDescriptor(\n provider,\n DeFiPositionsDeploylessCode,\n network.rpcNoStateOverride\n )\n const [result] = await deploylessDeFiPositionsGetter.call('getUniV3Position', [\n userAddr,\n nonfungiblePositionManagerAddr,\n factoryAddr\n ])\n\n const data = result.map((asset: any) => ({\n positionId: asset.positionId,\n token0Symbol: asset.token0Symbol,\n token0Decimals: asset.token0Decimals,\n token1Symbol: asset.token1Symbol,\n token1Decimals: asset.token1Decimals,\n feeGrowthGlobal0X128: asset.feeGrowthGlobal0X128,\n positionInfo: {\n nonce: asset.positionInfo.nonce,\n operator: asset.positionInfo.operator,\n token0: asset.positionInfo.token0,\n token1: asset.positionInfo.token1,\n fee: asset.positionInfo.fee,\n tickLower: asset.positionInfo.tickLower,\n tickUpper: asset.positionInfo.tickUpper,\n liquidity: asset.positionInfo.liquidity,\n feeGrowthInside0LastX128: asset.positionInfo.feeGrowthInside0LastX128,\n feeGrowthInside1LastX128: asset.positionInfo.feeGrowthInside1LastX128,\n tokensOwed0: asset.positionInfo.tokensOwed0,\n tokensOwed1: asset.positionInfo.tokensOwed1\n },\n poolSlot0: {\n sqrtPriceX96: asset.poolSlot0.sqrtPriceX96,\n tick: asset.poolSlot0.tick,\n observationIndex: asset.poolSlot0.observationIndex,\n observationCardinality: asset.poolSlot0.observationCardinality,\n observationCardinalityNext: asset.poolSlot0.observationCardinalityNext,\n feeProtocol: asset.poolSlot0.feeProtocol,\n unlocked: asset.poolSlot0.unlocked\n }\n }))\n\n const positions: Position[] = data\n .map((pos: any) => {\n const tokenAmounts = uniV3DataToPortfolioPosition(\n pos.positionInfo.liquidity,\n pos.poolSlot0.sqrtPriceX96,\n pos.positionInfo.tickLower,\n pos.positionInfo.tickUpper\n )\n return {\n id: pos.positionId.toString(),\n additionalData: {\n inRange: tokenAmounts.isInRage,\n liquidity: pos.positionInfo.liquidity\n },\n assets: [\n {\n address: pos.positionInfo.token0,\n symbol: pos.token0Symbol,\n decimals: Number(pos.token0Decimals),\n amount: BigInt(tokenAmounts.amount0),\n type: AssetType.Liquidity\n },\n {\n address: pos.positionInfo.token1,\n symbol: pos.token1Symbol,\n decimals: Number(pos.token1Decimals),\n amount: BigInt(tokenAmounts.amount1),\n type: AssetType.Liquidity\n }\n ]\n }\n })\n .filter((p: Position) => p.additionalData.liquidity !== BigInt(0))\n\n if (positions.length === 0) return null\n\n return {\n providerName: 'Uniswap V3',\n networkId,\n type: 'liquidity-pool',\n positions\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.js b/dist/src/libs/defiPositions/types.js index bd0522caa..7e38c1bbb 100644 --- a/dist/src/libs/defiPositions/types.js +++ b/dist/src/libs/defiPositions/types.js @@ -1,12 +1,15 @@ -export var AssetType; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DeFiPositionsError = exports.AssetType = void 0; +var AssetType; (function (AssetType) { AssetType[AssetType["Liquidity"] = 0] = "Liquidity"; AssetType[AssetType["Collateral"] = 1] = "Collateral"; AssetType[AssetType["Borrow"] = 2] = "Borrow"; -})(AssetType || (AssetType = {})); -export var DeFiPositionsError; +})(AssetType = exports.AssetType || (exports.AssetType = {})); +var DeFiPositionsError; (function (DeFiPositionsError) { DeFiPositionsError["AssetPriceError"] = "AssetPriceError"; DeFiPositionsError["CriticalError"] = "CriticalError"; -})(DeFiPositionsError || (DeFiPositionsError = {})); +})(DeFiPositionsError = exports.DeFiPositionsError || (exports.DeFiPositionsError = {})); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.js.map b/dist/src/libs/defiPositions/types.js.map index 82584958d..eab9ec708 100644 --- a/dist/src/libs/defiPositions/types.js.map +++ b/dist/src/libs/defiPositions/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,mDAAS,CAAA;IACT,qDAAU,CAAA;IACV,6CAAM,CAAA;AACR,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;AACjC,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { Price } from '../portfolio'\n\nexport enum AssetType {\n Liquidity,\n Collateral,\n Borrow\n}\n\nexport enum DeFiPositionsError {\n AssetPriceError = 'AssetPriceError',\n CriticalError = 'CriticalError'\n}\n\nexport type ProviderName = 'AAVE v3' | 'Uniswap V3'\n\nexport interface PositionAsset {\n address: string\n symbol: string\n decimals: number\n amount: bigint\n priceIn: Price[]\n value?: number\n type: AssetType\n additionalData?: {\n [key: string]: any\n }\n protocolAsset?: {\n address: string\n symbol: string\n decimals: number\n }\n}\n\nexport interface DeFiPositionsState {\n [accountId: string]: AccountState\n}\n\nexport interface AccountState {\n [networkId: string]: NetworkState\n}\n\nexport interface ProviderError {\n providerName: ProviderName\n error: string\n}\n\nexport interface NetworkState {\n positionsByProvider: PositionsByProvider[]\n isLoading: boolean\n updatedAt?: number\n error?: string | null\n providerErrors?: ProviderError[]\n}\n\nexport type NetworksWithPositions = {\n [networkId: NetworkId]: ProviderName[]\n}\n\nexport type NetworksWithPositionsByAccounts = {\n [accountId: string]: NetworksWithPositions\n}\n\nexport type PositionsByProvider = {\n providerName: ProviderName\n networkId: Network['id']\n type: 'lending' | 'liquidity-pool'\n positions: Position[]\n positionInUSD?: number\n}\n\nexport interface Position {\n id: string\n assets: PositionAsset[]\n additionalData: {\n [key: string]: any\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":";;;AAGA,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,mDAAS,CAAA;IACT,qDAAU,CAAA;IACV,6CAAM,CAAA;AACR,CAAC,EAJW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAIpB;AAED,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;AACjC,CAAC,EAHW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAG7B","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { Price } from '../portfolio'\n\nexport enum AssetType {\n Liquidity,\n Collateral,\n Borrow\n}\n\nexport enum DeFiPositionsError {\n AssetPriceError = 'AssetPriceError',\n CriticalError = 'CriticalError'\n}\n\nexport type ProviderName = 'AAVE v3' | 'Uniswap V3'\n\nexport interface PositionAsset {\n address: string\n symbol: string\n decimals: number\n amount: bigint\n priceIn: Price[]\n value?: number\n type: AssetType\n additionalData?: {\n [key: string]: any\n }\n protocolAsset?: {\n address: string\n symbol: string\n decimals: number\n }\n}\n\nexport interface DeFiPositionsState {\n [accountId: string]: AccountState\n}\n\nexport interface AccountState {\n [networkId: string]: NetworkState\n}\n\nexport interface ProviderError {\n providerName: ProviderName\n error: string\n}\n\nexport interface NetworkState {\n positionsByProvider: PositionsByProvider[]\n isLoading: boolean\n updatedAt?: number\n error?: string | null\n providerErrors?: ProviderError[]\n}\n\nexport type NetworksWithPositions = {\n [networkId: NetworkId]: ProviderName[]\n}\n\nexport type NetworksWithPositionsByAccounts = {\n [accountId: string]: NetworksWithPositions\n}\n\nexport type PositionsByProvider = {\n providerName: ProviderName\n networkId: Network['id']\n type: 'lending' | 'liquidity-pool'\n positions: Position[]\n positionInUSD?: number\n}\n\nexport interface Position {\n id: string\n assets: PositionAsset[]\n additionalData: {\n [key: string]: any\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.js b/dist/src/libs/deployless/compile.js index 7df37d017..5a0739925 100644 --- a/dist/src/libs/deployless/compile.js +++ b/dist/src/libs/deployless/compile.js @@ -1,5 +1,9 @@ -import fs from 'fs'; -import path from 'path'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.compile = void 0; +const tslib_1 = require("tslib"); +const fs_1 = tslib_1.__importDefault(require("fs")); +const path_1 = tslib_1.__importDefault(require("path")); // solc js doesn't support typescript so we hack it let _solc = null; function getSolc() { @@ -15,11 +19,11 @@ function getSolc() { // options // - fileName - if the name of the file is different than the name // of the contract, it should be passed along as we cannot guess it -export function compile(contractName, options = {}) { +function compile(contractName, options = {}) { const fileName = options.fileName ? options.fileName : `${contractName}.sol`; const contractsFolder = options.contractsFolder ? options.contractsFolder : 'contracts'; - const contractPath = path.resolve(`${__dirname}../../../../`, contractsFolder, fileName); - const contractSource = fs.readFileSync(contractPath, { encoding: 'utf8' }); + const contractPath = path_1.default.resolve(`${__dirname}../../../../`, contractsFolder, fileName); + const contractSource = fs_1.default.readFileSync(contractPath, { encoding: 'utf8' }); const input = { language: 'Solidity', sources: { @@ -48,7 +52,7 @@ export function compile(contractName, options = {}) { compileFolder = ''; } return { - contents: fs.readFileSync(path.resolve(`${__dirname}../../../../`, compileFolder, libPath), { + contents: fs_1.default.readFileSync(path_1.default.resolve(`${__dirname}../../../../`, compileFolder, libPath), { encoding: 'utf8' }) }; @@ -67,4 +71,5 @@ export function compile(contractName, options = {}) { binRuntime: `0x${output.contracts[contractName][contractName].evm.deployedBytecode.object}` // binRuntime }; } +exports.compile = compile; //# sourceMappingURL=compile.js.map \ No newline at end of file diff --git a/dist/src/libs/deployless/compile.js.map b/dist/src/libs/deployless/compile.js.map index b12434f3d..0e65947bf 100644 --- a/dist/src/libs/deployless/compile.js.map +++ b/dist/src/libs/deployless/compile.js.map @@ -1 +1 @@ -{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/libs/deployless/compile.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\n\n// solc js doesn't support typescript so we hack it\nlet _solc: any = null\nfunction getSolc(): any {\n if (!_solc) {\n _solc = require('solc')\n }\n return _solc\n}\n\ninterface Options {\n fileName?: null | string\n contractsFolder?: null | string\n}\n\n// a function that compiles a contract at run time as long\n// as that contract and all its includes are in the /contracts folder\n//\n// contractName - the name of the contract, not the file name\n// options\n// - fileName - if the name of the file is different than the name\n// of the contract, it should be passed along as we cannot guess it\nexport function compile(contractName: string, options: Options = {}) {\n const fileName = options.fileName ? options.fileName : `${contractName}.sol`\n const contractsFolder = options.contractsFolder ? options.contractsFolder : 'contracts'\n\n const contractPath = path.resolve(`${__dirname}../../../../`, contractsFolder, fileName)\n const contractSource = fs.readFileSync(contractPath, { encoding: 'utf8' })\n\n const input = {\n language: 'Solidity',\n sources: {\n [contractName]: {\n content: contractSource\n }\n },\n settings: {\n viaIR: true,\n optimizer: {\n enabled: true,\n runs: 1000\n },\n outputSelection: {\n '*': {\n '*': ['*']\n }\n }\n }\n }\n\n function findImports(libPath: string) {\n let compileFolder = libPath.indexOf('node_modules') === -1\n ? contractsFolder\n : ''\n\n if (libPath.indexOf('contracts/libs') !== -1) {\n compileFolder = ''\n }\n\n return {\n contents: fs.readFileSync(\n path.resolve(`${__dirname}../../../../`, compileFolder, libPath),\n {\n encoding: 'utf8'\n }\n )\n }\n }\n\n const output = JSON.parse(getSolc().compile(JSON.stringify(input), { import: findImports }))\n\n if (output.errors) {\n const error = output.errors.map((err: any) => `${err.formattedMessage} `)\n throw new Error(error)\n }\n\n if (!output.contracts[contractName][contractName]) {\n throw new Error(`unable to find contract named ${contractName} in output from file ${contractName}: perhaps the name of the file is different compared to the name of the contract?`)\n }\n\n return {\n abi: output.contracts[contractName][contractName].abi,\n bin: `0x${output.contracts[contractName][contractName].evm.bytecode.object}`, // bin\n binRuntime: `0x${output.contracts[contractName][contractName].evm.deployedBytecode.object}` // binRuntime\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/libs/deployless/compile.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\n\n// solc js doesn't support typescript so we hack it\nlet _solc: any = null\nfunction getSolc(): any {\n if (!_solc) {\n _solc = require('solc')\n }\n return _solc\n}\n\ninterface Options {\n fileName?: null | string\n contractsFolder?: null | string\n}\n\n// a function that compiles a contract at run time as long\n// as that contract and all its includes are in the /contracts folder\n//\n// contractName - the name of the contract, not the file name\n// options\n// - fileName - if the name of the file is different than the name\n// of the contract, it should be passed along as we cannot guess it\nexport function compile(contractName: string, options: Options = {}) {\n const fileName = options.fileName ? options.fileName : `${contractName}.sol`\n const contractsFolder = options.contractsFolder ? options.contractsFolder : 'contracts'\n\n const contractPath = path.resolve(`${__dirname}../../../../`, contractsFolder, fileName)\n const contractSource = fs.readFileSync(contractPath, { encoding: 'utf8' })\n\n const input = {\n language: 'Solidity',\n sources: {\n [contractName]: {\n content: contractSource\n }\n },\n settings: {\n viaIR: true,\n optimizer: {\n enabled: true,\n runs: 1000\n },\n outputSelection: {\n '*': {\n '*': ['*']\n }\n }\n }\n }\n\n function findImports(libPath: string) {\n let compileFolder = libPath.indexOf('node_modules') === -1\n ? contractsFolder\n : ''\n\n if (libPath.indexOf('contracts/libs') !== -1) {\n compileFolder = ''\n }\n\n return {\n contents: fs.readFileSync(\n path.resolve(`${__dirname}../../../../`, compileFolder, libPath),\n {\n encoding: 'utf8'\n }\n )\n }\n }\n\n const output = JSON.parse(getSolc().compile(JSON.stringify(input), { import: findImports }))\n\n if (output.errors) {\n const error = output.errors.map((err: any) => `${err.formattedMessage} `)\n throw new Error(error)\n }\n\n if (!output.contracts[contractName][contractName]) {\n throw new Error(`unable to find contract named ${contractName} in output from file ${contractName}: perhaps the name of the file is different compared to the name of the contract?`)\n }\n\n return {\n abi: output.contracts[contractName][contractName].abi,\n bin: `0x${output.contracts[contractName][contractName].evm.bytecode.object}`, // bin\n binRuntime: `0x${output.contracts[contractName][contractName].evm.deployedBytecode.object}` // binRuntime\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.js b/dist/src/libs/deployless/deployless.js index 382bb8e71..928c0fed2 100644 --- a/dist/src/libs/deployless/deployless.js +++ b/dist/src/libs/deployless/deployless.js @@ -1,9 +1,13 @@ -import assert from 'assert'; -import { AbiCoder, concat, getBytes, Interface } from 'ethers'; -import DeploylessCompiled from '../../../contracts/compiled/Deployless.json'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseErr = exports.fromDescriptor = exports.Deployless = exports.DeploylessMode = void 0; +const tslib_1 = require("tslib"); +const assert_1 = tslib_1.__importDefault(require("assert")); +const ethers_1 = require("ethers"); +const Deployless_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/Deployless.json")); // this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call // compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17 -const deploylessProxyBin = DeploylessCompiled.bin; +const deploylessProxyBin = Deployless_json_1.default.bin; // This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself // see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e const codeOfContractCode = '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'; @@ -23,13 +27,13 @@ const expiredSwap = '0x5bf6f916'; const expiredSig = '0xcd21db4f'; // any made up addr would work const arbitraryAddr = '0x0000000000000000000000000000000000696969'; -const abiCoder = new AbiCoder(); -export var DeploylessMode; +const abiCoder = new ethers_1.AbiCoder(); +var DeploylessMode; (function (DeploylessMode) { DeploylessMode[DeploylessMode["Detect"] = 0] = "Detect"; DeploylessMode[DeploylessMode["ProxyContract"] = 1] = "ProxyContract"; DeploylessMode[DeploylessMode["StateOverride"] = 2] = "StateOverride"; -})(DeploylessMode || (DeploylessMode = {})); +})(DeploylessMode = exports.DeploylessMode || (exports.DeploylessMode = {})); const defaultOptions = { mode: DeploylessMode.Detect, blockTag: 'latest', @@ -37,7 +41,7 @@ const defaultOptions = { to: arbitraryAddr, stateToOverride: null }; -export class Deployless { +class Deployless { iface; // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs contractBytecode; @@ -53,15 +57,15 @@ export class Deployless { return !this.stateOverrideSupported; } constructor(provider, abi, code, codeAtRuntime) { - assert.ok(code.startsWith('0x'), 'contract code must start with 0x'); - assert.ok(!abi.includes((x) => x.type === 'constructor'), 'contract cannot have a constructor, as it is not supported in state override mode'); + assert_1.default.ok(code.startsWith('0x'), 'contract code must start with 0x'); + assert_1.default.ok(!abi.includes((x) => x.type === 'constructor'), 'contract cannot have a constructor, as it is not supported in state override mode'); this.contractBytecode = code; this.provider = provider; // eslint-disable-next-line no-underscore-dangle this.isProviderInvictus = provider._getConnection().url.includes('invictus'); - this.iface = new Interface(abi); + this.iface = new ethers_1.Interface(abi); if (codeAtRuntime !== undefined) { - assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x'); + assert_1.default.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x'); this.stateOverrideSupported = true; this.contractRuntimeCode = codeAtRuntime; } @@ -75,7 +79,7 @@ export class Deployless { if (!isJsonRpcProvider) { throw new Error('state override mode (or auto-detect) not available unless you use JsonRpcProvider'); } - const codeOfIface = new Interface(codeOfContractAbi); + const codeOfIface = new ethers_1.Interface(codeOfContractAbi); const code = await mapError(this.provider.send('eth_call', [ { to: arbitraryAddr, @@ -129,7 +133,7 @@ export class Deployless { from: opts.from, gasPrice: opts?.gasPrice, gasLimit: opts?.gasLimit, - data: checkDataSize(concat([ + data: checkDataSize((0, ethers_1.concat)([ deploylessProxyBin, abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData]) ])) @@ -148,9 +152,11 @@ export class Deployless { return this.iface.decodeFunctionResult(methodName, returnDataRaw); } } -export function fromDescriptor(provider, desc, supportStateOverride) { +exports.Deployless = Deployless; +function fromDescriptor(provider, desc, supportStateOverride) { return new Deployless(provider, desc.abi, desc.bin, supportStateOverride ? desc.binRuntime : undefined); } +exports.fromDescriptor = fromDescriptor; async function mapError(callPromise) { try { return await callPromise; @@ -176,7 +182,7 @@ function mapResponse(data) { throw err; return data; } -export function parseErr(data) { +function parseErr(data) { const dataNoPrefix = data.slice(10); if (data.startsWith(panicSig)) { // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require @@ -214,8 +220,9 @@ export function parseErr(data) { } return null; } +exports.parseErr = parseErr; function checkDataSize(data) { - if (getBytes(data).length >= 24576) + if ((0, ethers_1.getBytes)(data).length >= 24576) throw new Error('Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'); return data; } diff --git a/dist/src/libs/deployless/deployless.js.map b/dist/src/libs/deployless/deployless.js.map index 7f695a0b2..5aa32bbfc 100644 --- a/dist/src/libs/deployless/deployless.js.map +++ b/dist/src/libs/deployless/deployless.js.map @@ -1 +1 @@ -{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport { AbiCoder, concat, getBytes, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport DeploylessCompiled from '../../../contracts/compiled/Deployless.json'\n\n// this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call\n// compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17\nconst deploylessProxyBin = DeploylessCompiled.bin\n// This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself\n// see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e\nconst codeOfContractCode =\n '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'\nconst codeOfContractAbi = ['function codeOf(bytes deployCode) external view']\n\n// The custom error that both these contracts will raise in case the deploy process of the contract goes wrong\n// error DeployFailed();\nconst deployErrorSig = '0xb4f54111'\n// Signature of Error(string)\nconst errorSig = '0x08c379a0'\n// LBRouter__InvalidTokenPath\nconst invalidPath = '0x4feac00c'\n// Signature of Panic(uint256)\nconst panicSig = '0x4e487b71'\n// uniswap swap expired\nconst expiredSwap = '0x5bf6f916'\n// uniswap signature expired\nconst expiredSig = '0xcd21db4f'\n\n// any made up addr would work\nconst arbitraryAddr = '0x0000000000000000000000000000000000696969'\nconst abiCoder = new AbiCoder()\n\nexport enum DeploylessMode {\n Detect,\n ProxyContract,\n StateOverride\n}\nexport type CallOptions = {\n mode: DeploylessMode\n // Note: some RPCs don't seem to like numbers, we can use hex strings for them\n blockTag: string | number\n from?: string\n to?: string\n gasPrice?: string\n gasLimit?: string\n stateToOverride: object | null\n}\nconst defaultOptions: CallOptions = {\n mode: DeploylessMode.Detect,\n blockTag: 'latest',\n from: undefined,\n to: arbitraryAddr,\n stateToOverride: null\n}\n\nexport class Deployless {\n private iface: Interface\n\n // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs\n private contractBytecode: string\n\n private provider: JsonRpcProvider | Provider\n\n private isProviderInvictus: boolean = false\n\n // We need to detect whether the provider supports state override\n private detectionPromise?: Promise\n\n private stateOverrideSupported?: boolean\n\n // the code of the contract after it's actually deployed (or in our case, simulate-deployed)\n // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df\n private contractRuntimeCode?: string\n\n public get isLimitedAt24kbData() {\n return !this.stateOverrideSupported\n }\n\n constructor(\n provider: JsonRpcProvider | Provider,\n abi: any[],\n code: string,\n codeAtRuntime?: string\n ) {\n assert.ok(code.startsWith('0x'), 'contract code must start with 0x')\n assert.ok(\n !abi.includes((x: any) => x.type === 'constructor'),\n 'contract cannot have a constructor, as it is not supported in state override mode'\n )\n this.contractBytecode = code\n this.provider = provider\n // eslint-disable-next-line no-underscore-dangle\n this.isProviderInvictus = (provider as any)._getConnection().url.includes('invictus')\n this.iface = new Interface(abi)\n if (codeAtRuntime !== undefined) {\n assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x')\n this.stateOverrideSupported = true\n this.contractRuntimeCode = codeAtRuntime\n }\n }\n\n // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using\n private async detectStateOverride(): Promise {\n const isJsonRpcProvider =\n this.provider &&\n typeof (this.provider as JsonRpcProvider).send === 'function' &&\n // eslint-disable-next-line no-underscore-dangle\n typeof (this.provider as JsonRpcProvider)._send === 'function'\n\n if (!isJsonRpcProvider) {\n throw new Error(\n 'state override mode (or auto-detect) not available unless you use JsonRpcProvider'\n )\n }\n const codeOfIface = new Interface(codeOfContractAbi)\n const code = await mapError(\n (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: arbitraryAddr,\n data: codeOfIface.encodeFunctionData('codeOf', [this.contractBytecode])\n },\n 'latest',\n { [arbitraryAddr]: { code: codeOfContractCode } }\n ])\n )\n // any response bigger than 0x is sufficient to know that state override worked\n // the response would be just \"0x\" if state override doesn't work\n this.stateOverrideSupported = code.startsWith('0x') && code.length > 2\n this.contractRuntimeCode = mapResponse(code)\n }\n\n async call(methodName: string, args: any[], opts: Partial = {}): Promise {\n opts = { ...defaultOptions, ...opts }\n const forceProxy = opts.mode === DeploylessMode.ProxyContract\n\n // First, start by detecting which modes are available, unless we're forcing the proxy mode\n // if we use state override, we do need detection to run still so it can populate contractRuntimeCode\n if (\n this.stateOverrideSupported &&\n !this.detectionPromise &&\n !forceProxy &&\n this.contractRuntimeCode === undefined\n ) {\n this.detectionPromise = this.detectStateOverride()\n }\n await this.detectionPromise\n\n if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) {\n throw new Error('state override passed but not requested')\n }\n if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) {\n throw new Error(`${methodName}: state override requested but not supported`)\n }\n\n const callData = this.iface.encodeFunctionData(methodName, args)\n const toAddr = opts.to ?? arbitraryAddr\n const callPromise =\n !!this.stateOverrideSupported && !forceProxy\n ? (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: toAddr,\n data: callData,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gas: opts?.gasLimit\n },\n opts.blockTag,\n {\n [toAddr]: { code: this.contractRuntimeCode },\n ...(opts.stateToOverride || {})\n }\n ])\n : this.provider.call({\n blockTag: opts.blockTag,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gasLimit: opts?.gasLimit,\n data: checkDataSize(\n concat([\n deploylessProxyBin,\n abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData])\n ])\n )\n })\n\n // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise.\n // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve\n // or the timeout promise will reject after 10 seconds, whichever occurs first.\n const callPromisedWithResolveTimeout = Promise.race([\n callPromise,\n new Promise((_resolve, reject) => {\n // Custom providers may take longer to respond, so we set a longer timeout for them.\n setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000)\n })\n ])\n\n const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout))\n return this.iface.decodeFunctionResult(methodName, returnDataRaw)\n }\n}\n\nexport function fromDescriptor(\n provider: JsonRpcProvider | Provider,\n desc: { abi: any; bin: string; binRuntime: string },\n supportStateOverride: boolean\n): Deployless {\n return new Deployless(\n provider,\n desc.abi,\n desc.bin,\n supportStateOverride ? desc.binRuntime : undefined\n )\n}\n\nasync function mapError(callPromise: Promise): Promise {\n try {\n return await callPromise\n } catch (e: any) {\n // ethers v5 provider: e.error.data is usually our eth_call output in case of execution reverted\n if (e.error && e.error.data) return e.error.data\n // ethers v5 provider: unwrap the wrapping that ethers adds to this type of error in case of provider.call\n if (e.code === 'CALL_EXCEPTION' && e.error) throw e.error\n // ethers v6 provider: wrapping the error in case of execution reverted\n if (e.code === 'CALL_EXCEPTION' && e.data) return e.data\n throw e\n }\n}\n\nfunction mapResponse(data: string): string {\n if (data === deployErrorSig) throw new Error('contract deploy failed')\n const err = parseErr(data)\n if (err) throw err\n return data\n}\n\nexport function parseErr(data: string): string | null {\n const dataNoPrefix = data.slice(10)\n if (data.startsWith(panicSig)) {\n // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require\n const num = parseInt(`0x${dataNoPrefix}`)\n if (num === 0x00) return 'generic compiler error'\n if (num === 0x01) return 'solidity assert error'\n if (num === 0x11) return 'arithmetic error'\n if (num === 0x12) return 'division by zero'\n return `panic error: 0x${num.toString(16)}`\n }\n if (data.startsWith(errorSig)) {\n try {\n return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]\n } catch (e: any) {\n if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix\n return e\n }\n }\n if (data.startsWith(invalidPath)) {\n return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'\n }\n // uniswap expired error\n if (data === expiredSwap) {\n return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'\n }\n // uniswap signature expired error\n if (data.startsWith(expiredSig)) {\n return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'\n }\n return null\n}\n\nfunction checkDataSize(data: string): string {\n if (getBytes(data).length >= 24576)\n throw new Error(\n 'Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'\n )\n return data\n}\n"]} \ No newline at end of file +{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport { AbiCoder, concat, getBytes, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport DeploylessCompiled from '../../../contracts/compiled/Deployless.json'\n\n// this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call\n// compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17\nconst deploylessProxyBin = DeploylessCompiled.bin\n// This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself\n// see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e\nconst codeOfContractCode =\n '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'\nconst codeOfContractAbi = ['function codeOf(bytes deployCode) external view']\n\n// The custom error that both these contracts will raise in case the deploy process of the contract goes wrong\n// error DeployFailed();\nconst deployErrorSig = '0xb4f54111'\n// Signature of Error(string)\nconst errorSig = '0x08c379a0'\n// LBRouter__InvalidTokenPath\nconst invalidPath = '0x4feac00c'\n// Signature of Panic(uint256)\nconst panicSig = '0x4e487b71'\n// uniswap swap expired\nconst expiredSwap = '0x5bf6f916'\n// uniswap signature expired\nconst expiredSig = '0xcd21db4f'\n\n// any made up addr would work\nconst arbitraryAddr = '0x0000000000000000000000000000000000696969'\nconst abiCoder = new AbiCoder()\n\nexport enum DeploylessMode {\n Detect,\n ProxyContract,\n StateOverride\n}\nexport type CallOptions = {\n mode: DeploylessMode\n // Note: some RPCs don't seem to like numbers, we can use hex strings for them\n blockTag: string | number\n from?: string\n to?: string\n gasPrice?: string\n gasLimit?: string\n stateToOverride: object | null\n}\nconst defaultOptions: CallOptions = {\n mode: DeploylessMode.Detect,\n blockTag: 'latest',\n from: undefined,\n to: arbitraryAddr,\n stateToOverride: null\n}\n\nexport class Deployless {\n private iface: Interface\n\n // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs\n private contractBytecode: string\n\n private provider: JsonRpcProvider | Provider\n\n private isProviderInvictus: boolean = false\n\n // We need to detect whether the provider supports state override\n private detectionPromise?: Promise\n\n private stateOverrideSupported?: boolean\n\n // the code of the contract after it's actually deployed (or in our case, simulate-deployed)\n // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df\n private contractRuntimeCode?: string\n\n public get isLimitedAt24kbData() {\n return !this.stateOverrideSupported\n }\n\n constructor(\n provider: JsonRpcProvider | Provider,\n abi: any[],\n code: string,\n codeAtRuntime?: string\n ) {\n assert.ok(code.startsWith('0x'), 'contract code must start with 0x')\n assert.ok(\n !abi.includes((x: any) => x.type === 'constructor'),\n 'contract cannot have a constructor, as it is not supported in state override mode'\n )\n this.contractBytecode = code\n this.provider = provider\n // eslint-disable-next-line no-underscore-dangle\n this.isProviderInvictus = (provider as any)._getConnection().url.includes('invictus')\n this.iface = new Interface(abi)\n if (codeAtRuntime !== undefined) {\n assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x')\n this.stateOverrideSupported = true\n this.contractRuntimeCode = codeAtRuntime\n }\n }\n\n // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using\n private async detectStateOverride(): Promise {\n const isJsonRpcProvider =\n this.provider &&\n typeof (this.provider as JsonRpcProvider).send === 'function' &&\n // eslint-disable-next-line no-underscore-dangle\n typeof (this.provider as JsonRpcProvider)._send === 'function'\n\n if (!isJsonRpcProvider) {\n throw new Error(\n 'state override mode (or auto-detect) not available unless you use JsonRpcProvider'\n )\n }\n const codeOfIface = new Interface(codeOfContractAbi)\n const code = await mapError(\n (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: arbitraryAddr,\n data: codeOfIface.encodeFunctionData('codeOf', [this.contractBytecode])\n },\n 'latest',\n { [arbitraryAddr]: { code: codeOfContractCode } }\n ])\n )\n // any response bigger than 0x is sufficient to know that state override worked\n // the response would be just \"0x\" if state override doesn't work\n this.stateOverrideSupported = code.startsWith('0x') && code.length > 2\n this.contractRuntimeCode = mapResponse(code)\n }\n\n async call(methodName: string, args: any[], opts: Partial = {}): Promise {\n opts = { ...defaultOptions, ...opts }\n const forceProxy = opts.mode === DeploylessMode.ProxyContract\n\n // First, start by detecting which modes are available, unless we're forcing the proxy mode\n // if we use state override, we do need detection to run still so it can populate contractRuntimeCode\n if (\n this.stateOverrideSupported &&\n !this.detectionPromise &&\n !forceProxy &&\n this.contractRuntimeCode === undefined\n ) {\n this.detectionPromise = this.detectStateOverride()\n }\n await this.detectionPromise\n\n if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) {\n throw new Error('state override passed but not requested')\n }\n if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) {\n throw new Error(`${methodName}: state override requested but not supported`)\n }\n\n const callData = this.iface.encodeFunctionData(methodName, args)\n const toAddr = opts.to ?? arbitraryAddr\n const callPromise =\n !!this.stateOverrideSupported && !forceProxy\n ? (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: toAddr,\n data: callData,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gas: opts?.gasLimit\n },\n opts.blockTag,\n {\n [toAddr]: { code: this.contractRuntimeCode },\n ...(opts.stateToOverride || {})\n }\n ])\n : this.provider.call({\n blockTag: opts.blockTag,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gasLimit: opts?.gasLimit,\n data: checkDataSize(\n concat([\n deploylessProxyBin,\n abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData])\n ])\n )\n })\n\n // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise.\n // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve\n // or the timeout promise will reject after 10 seconds, whichever occurs first.\n const callPromisedWithResolveTimeout = Promise.race([\n callPromise,\n new Promise((_resolve, reject) => {\n // Custom providers may take longer to respond, so we set a longer timeout for them.\n setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000)\n })\n ])\n\n const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout))\n return this.iface.decodeFunctionResult(methodName, returnDataRaw)\n }\n}\n\nexport function fromDescriptor(\n provider: JsonRpcProvider | Provider,\n desc: { abi: any; bin: string; binRuntime: string },\n supportStateOverride: boolean\n): Deployless {\n return new Deployless(\n provider,\n desc.abi,\n desc.bin,\n supportStateOverride ? desc.binRuntime : undefined\n )\n}\n\nasync function mapError(callPromise: Promise): Promise {\n try {\n return await callPromise\n } catch (e: any) {\n // ethers v5 provider: e.error.data is usually our eth_call output in case of execution reverted\n if (e.error && e.error.data) return e.error.data\n // ethers v5 provider: unwrap the wrapping that ethers adds to this type of error in case of provider.call\n if (e.code === 'CALL_EXCEPTION' && e.error) throw e.error\n // ethers v6 provider: wrapping the error in case of execution reverted\n if (e.code === 'CALL_EXCEPTION' && e.data) return e.data\n throw e\n }\n}\n\nfunction mapResponse(data: string): string {\n if (data === deployErrorSig) throw new Error('contract deploy failed')\n const err = parseErr(data)\n if (err) throw err\n return data\n}\n\nexport function parseErr(data: string): string | null {\n const dataNoPrefix = data.slice(10)\n if (data.startsWith(panicSig)) {\n // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require\n const num = parseInt(`0x${dataNoPrefix}`)\n if (num === 0x00) return 'generic compiler error'\n if (num === 0x01) return 'solidity assert error'\n if (num === 0x11) return 'arithmetic error'\n if (num === 0x12) return 'division by zero'\n return `panic error: 0x${num.toString(16)}`\n }\n if (data.startsWith(errorSig)) {\n try {\n return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]\n } catch (e: any) {\n if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix\n return e\n }\n }\n if (data.startsWith(invalidPath)) {\n return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'\n }\n // uniswap expired error\n if (data === expiredSwap) {\n return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'\n }\n // uniswap signature expired error\n if (data.startsWith(expiredSig)) {\n return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'\n }\n return null\n}\n\nfunction checkDataSize(data: string): string {\n if (getBytes(data).length >= 24576)\n throw new Error(\n 'Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'\n )\n return data\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.js b/dist/src/libs/deployless/simulateDeployCall.js index cb084cb86..f1da5aeec 100644 --- a/dist/src/libs/deployless/simulateDeployCall.js +++ b/dist/src/libs/deployless/simulateDeployCall.js @@ -1,36 +1,40 @@ -import { ZeroAddress } from 'ethers'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import { AMBIRE_ACCOUNT_FACTORY, DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; -import { getSmartAccount, getSpoof } from '../account/account'; -import { callToTuple } from '../accountOp/accountOp'; -import { getActivatorCall } from '../userOperation/userOperation'; -import { DeploylessMode, fromDescriptor } from './deployless'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSASupport = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const deploy_1 = require("../../consts/deploy"); +const account_1 = require("../account/account"); +const accountOp_1 = require("../accountOp/accountOp"); +const userOperation_1 = require("../userOperation/userOperation"); +const deployless_1 = require("./deployless"); // simulate a deployless call to the given provider. // if the call is successful, it means Ambire smart accounts are supported // on the given network -export async function getSASupport(provider) { - const smartAccount = await getSmartAccount([ +async function getSASupport(provider) { + const smartAccount = await (0, account_1.getSmartAccount)([ { - addr: DEPLOYLESS_SIMULATION_FROM, + addr: deploy_1.DEPLOYLESS_SIMULATION_FROM, hash: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' } ], []); const deploylessOptions = { blockTag: 'latest', - from: DEPLOYLESS_SIMULATION_FROM, + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, // very important to send to the AMBIRE_ACCOUNT_FACTORY // or else the SA address won't match - to: AMBIRE_ACCOUNT_FACTORY, - mode: DeploylessMode.StateOverride + to: deploy_1.AMBIRE_ACCOUNT_FACTORY, + mode: deployless_1.DeploylessMode.StateOverride }; - const deployless = fromDescriptor(provider, AmbireFactory, true); + const deployless = (0, deployless_1.fromDescriptor)(provider, AmbireFactory_json_1.default, true); let supportsStateOverride = true; const result = await deployless .call('deployAndExecute', [ smartAccount.creation.bytecode, smartAccount.creation.salt, - [callToTuple(getActivatorCall(smartAccount.addr))], - getSpoof(smartAccount) + [(0, accountOp_1.callToTuple)((0, userOperation_1.getActivatorCall)(smartAccount.addr))], + (0, account_1.getSpoof)(smartAccount) ], deploylessOptions) .catch((e) => { if (e.message.includes('no response')) { @@ -39,11 +43,12 @@ export async function getSASupport(provider) { // if there's an error, return the zero address indicating that // our smart accounts will most likely not work on this chain supportsStateOverride = false; - return [ZeroAddress]; + return [ethers_1.ZeroAddress]; }); return { addressMatches: result[0] === smartAccount.addr, supportsStateOverride }; } +exports.getSASupport = getSASupport; //# sourceMappingURL=simulateDeployCall.js.map \ No newline at end of file diff --git a/dist/src/libs/deployless/simulateDeployCall.js.map b/dist/src/libs/deployless/simulateDeployCall.js.map index e726ca392..67c4e6a86 100644 --- a/dist/src/libs/deployless/simulateDeployCall.js.map +++ b/dist/src/libs/deployless/simulateDeployCall.js.map @@ -1 +1 @@ -{"version":3,"file":"simulateDeployCall.js","sourceRoot":"","sources":["../../../../src/libs/deployless/simulateDeployCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7D,oDAAoD;AACpD,0EAA0E;AAC1E,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,eAAe,CACxC;QACE;YACE,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,oEAAoE;SAC3E;KACF,EACD,EAAE,CACH,CAAA;IACD,MAAM,iBAAiB,GAAG;QACxB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,0BAA0B;QAChC,uDAAuD;QACvD,qCAAqC;QACrC,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,cAAc,CAAC,aAAa;KACnC,CAAA;IACD,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;IAChE,IAAI,qBAAqB,GAAG,IAAI,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU;SAC5B,IAAI,CACH,kBAAkB,EAClB;QACE,YAAY,CAAC,QAAS,CAAC,QAAQ;QAC/B,YAAY,CAAC,QAAS,CAAC,IAAI;QAC3B,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,YAAY,CAAC;KACvB,EACD,iBAAiB,CAClB;SACA,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;SAC/B;QAED,+DAA+D;QAC/D,6DAA6D;QAC7D,qBAAqB,GAAG,KAAK,CAAA;QAC7B,OAAO,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI;QAC/C,qBAAqB;KACtB,CAAA;AACH,CAAC","sourcesContent":["import { JsonRpcProvider, ZeroAddress } from 'ethers'\n\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { AMBIRE_ACCOUNT_FACTORY, DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { getSmartAccount, getSpoof } from '../account/account'\nimport { callToTuple } from '../accountOp/accountOp'\nimport { getActivatorCall } from '../userOperation/userOperation'\nimport { DeploylessMode, fromDescriptor } from './deployless'\n\n// simulate a deployless call to the given provider.\n// if the call is successful, it means Ambire smart accounts are supported\n// on the given network\nexport async function getSASupport(\n provider: JsonRpcProvider\n): Promise<{ addressMatches: boolean; supportsStateOverride: boolean }> {\n const smartAccount = await getSmartAccount(\n [\n {\n addr: DEPLOYLESS_SIMULATION_FROM,\n hash: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n ],\n []\n )\n const deploylessOptions = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n // very important to send to the AMBIRE_ACCOUNT_FACTORY\n // or else the SA address won't match\n to: AMBIRE_ACCOUNT_FACTORY,\n mode: DeploylessMode.StateOverride\n }\n const deployless = fromDescriptor(provider, AmbireFactory, true)\n let supportsStateOverride = true\n const result = await deployless\n .call(\n 'deployAndExecute',\n [\n smartAccount.creation!.bytecode,\n smartAccount.creation!.salt,\n [callToTuple(getActivatorCall(smartAccount.addr))],\n getSpoof(smartAccount)\n ],\n deploylessOptions\n )\n .catch((e: any) => {\n if (e.message.includes('no response')) {\n throw new Error('no response')\n }\n\n // if there's an error, return the zero address indicating that\n // our smart accounts will most likely not work on this chain\n supportsStateOverride = false\n return [ZeroAddress]\n })\n\n return {\n addressMatches: result[0] === smartAccount.addr,\n supportsStateOverride\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"simulateDeployCall.js","sourceRoot":"","sources":["../../../../src/libs/deployless/simulateDeployCall.ts"],"names":[],"mappings":";;;;AAAA,mCAAqD;AAErD,gHAA0E;AAC1E,gDAAwF;AACxF,gDAA8D;AAC9D,sDAAoD;AACpD,kEAAiE;AACjE,6CAA6D;AAE7D,oDAAoD;AACpD,0EAA0E;AAC1E,uBAAuB;AAChB,KAAK,UAAU,YAAY,CAChC,QAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,IAAA,yBAAe,EACxC;QACE;YACE,IAAI,EAAE,mCAA0B;YAChC,IAAI,EAAE,oEAAoE;SAC3E;KACF,EACD,EAAE,CACH,CAAA;IACD,MAAM,iBAAiB,GAAG;QACxB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,mCAA0B;QAChC,uDAAuD;QACvD,qCAAqC;QACrC,EAAE,EAAE,+BAAsB;QAC1B,IAAI,EAAE,2BAAc,CAAC,aAAa;KACnC,CAAA;IACD,MAAM,UAAU,GAAG,IAAA,2BAAc,EAAC,QAAQ,EAAE,4BAAa,EAAE,IAAI,CAAC,CAAA;IAChE,IAAI,qBAAqB,GAAG,IAAI,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU;SAC5B,IAAI,CACH,kBAAkB,EAClB;QACE,YAAY,CAAC,QAAS,CAAC,QAAQ;QAC/B,YAAY,CAAC,QAAS,CAAC,IAAI;QAC3B,CAAC,IAAA,uBAAW,EAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,IAAA,kBAAQ,EAAC,YAAY,CAAC;KACvB,EACD,iBAAiB,CAClB;SACA,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;SAC/B;QAED,+DAA+D;QAC/D,6DAA6D;QAC7D,qBAAqB,GAAG,KAAK,CAAA;QAC7B,OAAO,CAAC,oBAAW,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI;QAC/C,qBAAqB;KACtB,CAAA;AACH,CAAC;AAhDD,oCAgDC","sourcesContent":["import { JsonRpcProvider, ZeroAddress } from 'ethers'\n\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { AMBIRE_ACCOUNT_FACTORY, DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { getSmartAccount, getSpoof } from '../account/account'\nimport { callToTuple } from '../accountOp/accountOp'\nimport { getActivatorCall } from '../userOperation/userOperation'\nimport { DeploylessMode, fromDescriptor } from './deployless'\n\n// simulate a deployless call to the given provider.\n// if the call is successful, it means Ambire smart accounts are supported\n// on the given network\nexport async function getSASupport(\n provider: JsonRpcProvider\n): Promise<{ addressMatches: boolean; supportsStateOverride: boolean }> {\n const smartAccount = await getSmartAccount(\n [\n {\n addr: DEPLOYLESS_SIMULATION_FROM,\n hash: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n ],\n []\n )\n const deploylessOptions = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n // very important to send to the AMBIRE_ACCOUNT_FACTORY\n // or else the SA address won't match\n to: AMBIRE_ACCOUNT_FACTORY,\n mode: DeploylessMode.StateOverride\n }\n const deployless = fromDescriptor(provider, AmbireFactory, true)\n let supportsStateOverride = true\n const result = await deployless\n .call(\n 'deployAndExecute',\n [\n smartAccount.creation!.bytecode,\n smartAccount.creation!.salt,\n [callToTuple(getActivatorCall(smartAccount.addr))],\n getSpoof(smartAccount)\n ],\n deploylessOptions\n )\n .catch((e: any) => {\n if (e.message.includes('no response')) {\n throw new Error('no response')\n }\n\n // if there's an error, return the zero address indicating that\n // our smart accounts will most likely not work on this chain\n supportsStateOverride = false\n return [ZeroAddress]\n })\n\n return {\n addressMatches: result[0] === smartAccount.addr,\n supportsStateOverride\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.js b/dist/src/libs/dkim/getPublicKey.js index f83e7cc8d..0f3445f63 100644 --- a/dist/src/libs/dkim/getPublicKey.js +++ b/dist/src/libs/dkim/getPublicKey.js @@ -1,9 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPublicKeyIfAny = void 0; /* fetch domainkey record (nodejs) */ const { promisify } = require("util"); const getKey = promisify(require("dkim/lib/get-key")); -export default function getPublicKey({ domain, selector }) { +function getPublicKey({ domain, selector }) { return getKey(domain, selector).then((key) => { const publicKey = "-----BEGIN PUBLIC KEY-----\n" + key.key.toString("base64") + @@ -15,6 +18,7 @@ export default function getPublicKey({ domain, selector }) { }; }); } +exports.default = getPublicKey; ; /** * A wrapper to help getPublicKey reverts when a pub key is not found. @@ -23,7 +27,7 @@ export default function getPublicKey({ domain, selector }) { * @param {domain: string, selector: string} * @returns base64encoded | null */ -export async function getPublicKeyIfAny({ domain, selector }) { +async function getPublicKeyIfAny({ domain, selector }) { try { const dkimKey = await getPublicKey({ domain, selector: selector }); return dkimKey; @@ -32,4 +36,5 @@ export async function getPublicKeyIfAny({ domain, selector }) { return null; } } +exports.getPublicKeyIfAny = getPublicKeyIfAny; //# sourceMappingURL=getPublicKey.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/getPublicKey.js.map b/dist/src/libs/dkim/getPublicKey.js.map index d51a122e1..4ed7c260f 100644 --- a/dist/src/libs/dkim/getPublicKey.js.map +++ b/dist/src/libs/dkim/getPublicKey.js.map @@ -1 +1 @@ -{"version":3,"file":"getPublicKey.js","sourceRoot":"","sources":["../../../../src/libs/dkim/getPublicKey.ts"],"names":[],"mappings":"AAAA;;EAEE;AACF,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;QAChD,MAAM,SAAS,GACb,8BAA8B;YAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,4BAA4B,CAAC;QAE/B,OAAO;YACL,MAAM;YACN,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAAA,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC/D,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC,CAAA;QAChE,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,IAAI,CAAA;KACZ;AACH,CAAC","sourcesContent":["/*\n fetch domainkey record (nodejs)\n*/\nconst { promisify } = require(\"util\");\nconst getKey = promisify(require(\"dkim/lib/get-key\"));\n\nexport default function getPublicKey({ domain, selector }: any) {\n return getKey(domain, selector).then((key: any) => {\n const publicKey =\n \"-----BEGIN PUBLIC KEY-----\\n\" +\n key.key.toString(\"base64\") +\n \"\\n-----END PUBLIC KEY-----\";\n\n return {\n domain,\n selector,\n publicKey\n };\n });\n};\n\n/**\n * A wrapper to help getPublicKey reverts when a pub key is not found.\n * We don't want that\n *\n * @param {domain: string, selector: string}\n * @returns base64encoded | null\n */\nexport async function getPublicKeyIfAny({ domain, selector }: any) {\n try {\n const dkimKey = await getPublicKey({domain, selector: selector})\n return dkimKey\n } catch (e) {\n return null\n }\n}"]} \ No newline at end of file +{"version":3,"file":"getPublicKey.js","sourceRoot":"","sources":["../../../../src/libs/dkim/getPublicKey.ts"],"names":[],"mappings":";;;AAAA;;EAEE;AACF,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEtD,SAAwB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;QAChD,MAAM,SAAS,GACb,8BAA8B;YAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,4BAA4B,CAAC;QAE/B,OAAO;YACL,MAAM;YACN,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAbD,+BAaC;AAAA,CAAC;AAEF;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAO;IAC/D,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC,CAAA;QAChE,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,IAAI,CAAA;KACZ;AACH,CAAC;AAPD,8CAOC","sourcesContent":["/*\n fetch domainkey record (nodejs)\n*/\nconst { promisify } = require(\"util\");\nconst getKey = promisify(require(\"dkim/lib/get-key\"));\n\nexport default function getPublicKey({ domain, selector }: any) {\n return getKey(domain, selector).then((key: any) => {\n const publicKey =\n \"-----BEGIN PUBLIC KEY-----\\n\" +\n key.key.toString(\"base64\") +\n \"\\n-----END PUBLIC KEY-----\";\n\n return {\n domain,\n selector,\n publicKey\n };\n });\n};\n\n/**\n * A wrapper to help getPublicKey reverts when a pub key is not found.\n * We don't want that\n *\n * @param {domain: string, selector: string}\n * @returns base64encoded | null\n */\nexport async function getPublicKeyIfAny({ domain, selector }: any) {\n try {\n const dkimKey = await getPublicKey({domain, selector: selector})\n return dkimKey\n } catch (e) {\n return null\n }\n}"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.js b/dist/src/libs/dkim/isDKIM.js index 760d63150..4da70cfb5 100644 --- a/dist/src/libs/dkim/isDKIM.js +++ b/dist/src/libs/dkim/isDKIM.js @@ -1,4 +1,7 @@ -export default function isDKIM(key) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isDKIM(key) { return /^(DKIM-Signature|X-Google-DKIM-Signature)/.test(key); } +exports.default = isDKIM; //# sourceMappingURL=isDKIM.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/isDKIM.js.map b/dist/src/libs/dkim/isDKIM.js.map index 91e727efb..0af876865 100644 --- a/dist/src/libs/dkim/isDKIM.js.map +++ b/dist/src/libs/dkim/isDKIM.js.map @@ -1 +1 @@ -{"version":3,"file":"isDKIM.js","sourceRoot":"","sources":["../../../../src/libs/dkim/isDKIM.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAQ;IACnC,OAAO,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAChE,CAAC","sourcesContent":["export default function isDKIM(key: any) {\n return /^(DKIM-Signature|X-Google-DKIM-Signature)/.test(key)\n}\n"]} \ No newline at end of file +{"version":3,"file":"isDKIM.js","sourceRoot":"","sources":["../../../../src/libs/dkim/isDKIM.ts"],"names":[],"mappings":";;AAAA,SAAwB,MAAM,CAAC,GAAQ;IACnC,OAAO,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAChE,CAAC;AAFD,yBAEC","sourcesContent":["export default function isDKIM(key: any) {\n return /^(DKIM-Signature|X-Google-DKIM-Signature)/.test(key)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.js b/dist/src/libs/dkim/parse.js index aed33c7a2..f31bda163 100644 --- a/dist/src/libs/dkim/parse.js +++ b/dist/src/libs/dkim/parse.js @@ -1,4 +1,8 @@ -import isDKIM from "./isDKIM"; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = void 0; +const tslib_1 = require("tslib"); +const isDKIM_1 = tslib_1.__importDefault(require("./isDKIM")); /* parse email (cross-platform) @@ -30,9 +34,9 @@ const getDkims = (header) => { return header .split(/\r\n(?=[^\x20\x09]|$)/g) .map((h, i, allHeaders) => { - if (isDKIM(h)) { + if ((0, isDKIM_1.default)(h)) { // remove DKIM headers - const headers = allHeaders.filter((v) => !isDKIM(v)); + const headers = allHeaders.filter((v) => !(0, isDKIM_1.default)(v)); // add one DKIM header headers.unshift(h); return { @@ -44,7 +48,7 @@ const getDkims = (header) => { }) .filter((v) => !!v); }; -export function parse(email) { +function parse(email) { const { header, body } = emailToHeaderAndBody(email); const dkims = getDkims(header).map((dkim) => { // a new field called dara has been introduced to DKIM signature @@ -72,5 +76,6 @@ export function parse(email) { dkims }; } +exports.parse = parse; ; //# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parse.js.map b/dist/src/libs/dkim/parse.js.map index b8adc39c5..cb2c6cbf8 100644 --- a/dist/src/libs/dkim/parse.js.map +++ b/dist/src/libs/dkim/parse.js.map @@ -1 +1 @@ -{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parse.ts"],"names":[],"mappings":"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","sourcesContent":["import isDKIM from \"./isDKIM\";\n\n/*\n parse email\n (cross-platform)\n*/\nconst Signature = require(\"dkim-signature\");\nconst processHeader = require(\"dkim/lib/process-header\");\nconst processBody = require(\"dkim/lib/process-body\");\n\nconst emailToHeaderAndBody = (email: any) => {\n const boundary = email.indexOf(\"\\r\\n\\r\\n\");\n if (boundary === -1) {\n throw Error(\"no header boundary found\");\n }\n\n const header = email.slice(0, boundary);\n const body = email.slice(boundary + 4);\n\n return {\n boundary,\n header,\n body\n };\n};\n\nconst getDkimEntry = (dkim: any) => {\n const [name, ...rest] = dkim.split(\":\");\n\n return {\n name,\n value: rest.join(\":\").slice(1)\n };\n};\n\nconst getDkims = (header: any) => {\n return header\n .split(/\\r\\n(?=[^\\x20\\x09]|$)/g)\n .map((h: any, i: any, allHeaders: any) => {\n if (isDKIM(h)) {\n // remove DKIM headers\n const headers = allHeaders.filter((v: any) => !isDKIM(v));\n // add one DKIM header\n headers.unshift(h);\n\n return {\n entry: getDkimEntry(h),\n headers\n };\n }\n\n return undefined;\n })\n .filter((v: any) => !!v);\n};\n\nexport function parse(email: any) {\n const { header, body } = emailToHeaderAndBody(email);\n\n const dkims = getDkims(header).map((dkim: any) => {\n // a new field called dara has been introduced to DKIM signature\n // standarts. We add it manually as the lib does not support it\n if (dkim.entry.value.indexOf('dara') !== -1) {\n Signature.fields.push('dara')\n Signature.keys.push('dara')\n }\n\n const signature = Signature.parse(dkim.entry.value);\n\n const sigBody =\n signature.length != null ? body.slice(0, signature.length) : body;\n\n const processedBody = processBody(\n sigBody,\n signature.canonical.split(\"/\").pop()\n );\n\n const processedHeader = processHeader(\n dkim.headers,\n signature.headers,\n signature.canonical.split(\"/\").shift()\n );\n\n const algorithm = signature.algorithm.toUpperCase();\n\n return {\n ...dkim,\n signature,\n processedBody,\n processedHeader,\n algorithm\n };\n });\n\n return {\n header,\n body,\n dkims\n };\n};"]} \ No newline at end of file +{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parse.ts"],"names":[],"mappings":"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","sourcesContent":["import isDKIM from \"./isDKIM\";\n\n/*\n parse email\n (cross-platform)\n*/\nconst Signature = require(\"dkim-signature\");\nconst processHeader = require(\"dkim/lib/process-header\");\nconst processBody = require(\"dkim/lib/process-body\");\n\nconst emailToHeaderAndBody = (email: any) => {\n const boundary = email.indexOf(\"\\r\\n\\r\\n\");\n if (boundary === -1) {\n throw Error(\"no header boundary found\");\n }\n\n const header = email.slice(0, boundary);\n const body = email.slice(boundary + 4);\n\n return {\n boundary,\n header,\n body\n };\n};\n\nconst getDkimEntry = (dkim: any) => {\n const [name, ...rest] = dkim.split(\":\");\n\n return {\n name,\n value: rest.join(\":\").slice(1)\n };\n};\n\nconst getDkims = (header: any) => {\n return header\n .split(/\\r\\n(?=[^\\x20\\x09]|$)/g)\n .map((h: any, i: any, allHeaders: any) => {\n if (isDKIM(h)) {\n // remove DKIM headers\n const headers = allHeaders.filter((v: any) => !isDKIM(v));\n // add one DKIM header\n headers.unshift(h);\n\n return {\n entry: getDkimEntry(h),\n headers\n };\n }\n\n return undefined;\n })\n .filter((v: any) => !!v);\n};\n\nexport function parse(email: any) {\n const { header, body } = emailToHeaderAndBody(email);\n\n const dkims = getDkims(header).map((dkim: any) => {\n // a new field called dara has been introduced to DKIM signature\n // standarts. We add it manually as the lib does not support it\n if (dkim.entry.value.indexOf('dara') !== -1) {\n Signature.fields.push('dara')\n Signature.keys.push('dara')\n }\n\n const signature = Signature.parse(dkim.entry.value);\n\n const sigBody =\n signature.length != null ? body.slice(0, signature.length) : body;\n\n const processedBody = processBody(\n sigBody,\n signature.canonical.split(\"/\").pop()\n );\n\n const processedHeader = processHeader(\n dkim.headers,\n signature.headers,\n signature.canonical.split(\"/\").shift()\n );\n\n const algorithm = signature.algorithm.toUpperCase();\n\n return {\n ...dkim,\n signature,\n processedBody,\n processedHeader,\n algorithm\n };\n });\n\n return {\n header,\n body,\n dkims\n };\n};"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.js b/dist/src/libs/dkim/parseEmail.js index a929d4282..bcb20e156 100644 --- a/dist/src/libs/dkim/parseEmail.js +++ b/dist/src/libs/dkim/parseEmail.js @@ -1,26 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); /* parse and return email data (nodejs) */ -import { parse } from './parse'; -import getPublicKey from './getPublicKey'; -import publicKeyToComponents from './publicKeyToComponents'; -import toSolidity from './toSolidity'; -import { createHash } from 'crypto'; -export default async function parseEmail(email) { - const dkims = parse(email).dkims.map((dkim) => { +const parse_1 = require("./parse"); +const getPublicKey_1 = tslib_1.__importDefault(require("./getPublicKey")); +const publicKeyToComponents_1 = tslib_1.__importDefault(require("./publicKeyToComponents")); +const toSolidity_1 = tslib_1.__importDefault(require("./toSolidity")); +const crypto_1 = require("crypto"); +async function parseEmail(email) { + const dkims = (0, parse_1.parse)(email).dkims.map((dkim) => { const algorithm = dkim.algorithm .split('-') .pop() .toUpperCase(); - const bodyHash = createHash(algorithm) + const bodyHash = (0, crypto_1.createHash)(algorithm) .update(dkim.processedBody) .digest(); const bodyHashMatched = bodyHash.compare(dkim.signature.hash) !== 0; if (bodyHashMatched) { throw new Error('body hash did not verify'); } - const hash = createHash(algorithm) + const hash = (0, crypto_1.createHash)(algorithm) .update(dkim.processedHeader) .digest(); return { @@ -29,13 +32,13 @@ export default async function parseEmail(email) { }; }); // get dns records - const publicKeysEntries = await Promise.all(dkims.map((dkim) => getPublicKey({ + const publicKeysEntries = await Promise.all(dkims.map((dkim) => (0, getPublicKey_1.default)({ domain: dkim.signature.domain, selector: dkim.signature.selector }))); const publicKeys = publicKeysEntries.map((entry) => { const { publicKey } = entry; - const { exponent, modulus } = publicKeyToComponents(publicKey); + const { exponent, modulus } = (0, publicKeyToComponents_1.default)(publicKey); return { ...entry, exponent, @@ -43,7 +46,7 @@ export default async function parseEmail(email) { }; }); return dkims.map((dkim, i) => { - const solidity = toSolidity({ + const solidity = (0, toSolidity_1.default)({ algorithm: dkim.algorithm, hash: dkim.hash, signature: dkim.signature.signature, @@ -57,4 +60,5 @@ export default async function parseEmail(email) { }; }); } +exports.default = parseEmail; //# sourceMappingURL=parseEmail.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/parseEmail.js.map b/dist/src/libs/dkim/parseEmail.js.map index b75166fa5..923a21718 100644 --- a/dist/src/libs/dkim/parseEmail.js.map +++ b/dist/src/libs/dkim/parseEmail.js.map @@ -1 +1 @@ -{"version":3,"file":"parseEmail.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parseEmail.ts"],"names":[],"mappings":"AAAA;;;EAGE;AACF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,qBAAqB,MAAM,yBAAyB,CAAA;AAC3D,OAAO,UAAU,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,UAAU,CAAC,KAAU;IAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;aAC7B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,EAAE;aACL,WAAW,EAAE,CAAA;QAEhB,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;aACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;aAC1B,MAAM,EAAE,CAAA;QAEX,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEnE,IAAI,eAAe,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;SAC5C;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;aAC5B,MAAM,EAAE,CAAA;QAEX,OAAO;YACL,GAAG,IAAI;YACP,IAAI;SACL,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,MAAM,iBAAiB,GAAQ,MAAM,OAAO,CAAC,GAAG,CAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CACtB,YAAY,CAAC;QACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;QAC7B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;KAClC,CAAC,CACH,CACF,CAAA;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAE9D,OAAO;YACL,GAAG,KAAK;YACR,QAAQ;YACR,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,CAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;YACnC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ;YAChC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO;SAC/B,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,IAAI;YACP,GAAG,UAAU,CAAC,CAAC,CAAC;YAChB,QAAQ;SACT,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/*\n parse and return email data\n (nodejs)\n*/\nimport { parse } from './parse'\nimport getPublicKey from './getPublicKey'\nimport publicKeyToComponents from './publicKeyToComponents'\nimport toSolidity from './toSolidity'\nimport { createHash } from 'crypto'\n\nexport default async function parseEmail(email: any) {\n\n const dkims = parse(email).dkims.map((dkim: any) => {\n const algorithm = dkim.algorithm\n .split('-')\n .pop()\n .toUpperCase()\n\n const bodyHash = createHash(algorithm)\n .update(dkim.processedBody)\n .digest()\n\n const bodyHashMatched = bodyHash.compare(dkim.signature.hash) !== 0\n\n if (bodyHashMatched) {\n throw new Error('body hash did not verify')\n }\n\n const hash = createHash(algorithm)\n .update(dkim.processedHeader)\n .digest()\n\n return {\n ...dkim,\n hash\n }\n })\n\n // get dns records\n const publicKeysEntries: any = await Promise.all(\n dkims.map((dkim: any) =>\n getPublicKey({\n domain: dkim.signature.domain,\n selector: dkim.signature.selector\n })\n )\n )\n\n const publicKeys = publicKeysEntries.map((entry: any) => {\n const { publicKey } = entry\n const { exponent, modulus } = publicKeyToComponents(publicKey)\n\n return {\n ...entry,\n exponent,\n modulus\n }\n })\n\n return dkims.map((dkim: any, i: any) => {\n const solidity = toSolidity({\n algorithm: dkim.algorithm,\n hash: dkim.hash,\n signature: dkim.signature.signature,\n exponent: publicKeys[i].exponent,\n modulus: publicKeys[i].modulus\n })\n\n return {\n ...dkim,\n ...publicKeys[i],\n solidity\n }\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"parseEmail.js","sourceRoot":"","sources":["../../../../src/libs/dkim/parseEmail.ts"],"names":[],"mappings":";;;AAAA;;;EAGE;AACF,mCAA+B;AAC/B,0EAAyC;AACzC,4FAA2D;AAC3D,sEAAqC;AACrC,mCAAmC;AAEpB,KAAK,UAAU,UAAU,CAAC,KAAU;IAEjD,MAAM,KAAK,GAAG,IAAA,aAAK,EAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;aAC7B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,EAAE;aACL,WAAW,EAAE,CAAA;QAEhB,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC;aACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;aAC1B,MAAM,EAAE,CAAA;QAEX,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEnE,IAAI,eAAe,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;SAC5C;QAED,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;aAC5B,MAAM,EAAE,CAAA;QAEX,OAAO;YACL,GAAG,IAAI;YACP,IAAI;SACL,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,MAAM,iBAAiB,GAAQ,MAAM,OAAO,CAAC,GAAG,CAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CACtB,IAAA,sBAAY,EAAC;QACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;QAC7B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;KAClC,CAAC,CACH,CACF,CAAA;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAA,+BAAqB,EAAC,SAAS,CAAC,CAAA;QAE9D,OAAO;YACL,GAAG,KAAK;YACR,QAAQ;YACR,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,CAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAA,oBAAU,EAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;YACnC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ;YAChC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO;SAC/B,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,IAAI;YACP,GAAG,UAAU,CAAC,CAAC,CAAC;YAChB,QAAQ;SACT,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAhED,6BAgEC","sourcesContent":["/*\n parse and return email data\n (nodejs)\n*/\nimport { parse } from './parse'\nimport getPublicKey from './getPublicKey'\nimport publicKeyToComponents from './publicKeyToComponents'\nimport toSolidity from './toSolidity'\nimport { createHash } from 'crypto'\n\nexport default async function parseEmail(email: any) {\n\n const dkims = parse(email).dkims.map((dkim: any) => {\n const algorithm = dkim.algorithm\n .split('-')\n .pop()\n .toUpperCase()\n\n const bodyHash = createHash(algorithm)\n .update(dkim.processedBody)\n .digest()\n\n const bodyHashMatched = bodyHash.compare(dkim.signature.hash) !== 0\n\n if (bodyHashMatched) {\n throw new Error('body hash did not verify')\n }\n\n const hash = createHash(algorithm)\n .update(dkim.processedHeader)\n .digest()\n\n return {\n ...dkim,\n hash\n }\n })\n\n // get dns records\n const publicKeysEntries: any = await Promise.all(\n dkims.map((dkim: any) =>\n getPublicKey({\n domain: dkim.signature.domain,\n selector: dkim.signature.selector\n })\n )\n )\n\n const publicKeys = publicKeysEntries.map((entry: any) => {\n const { publicKey } = entry\n const { exponent, modulus } = publicKeyToComponents(publicKey)\n\n return {\n ...entry,\n exponent,\n modulus\n }\n })\n\n return dkims.map((dkim: any, i: any) => {\n const solidity = toSolidity({\n algorithm: dkim.algorithm,\n hash: dkim.hash,\n signature: dkim.signature.signature,\n exponent: publicKeys[i].exponent,\n modulus: publicKeys[i].modulus\n })\n\n return {\n ...dkim,\n ...publicKeys[i],\n solidity\n }\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.js b/dist/src/libs/dkim/publicKeyToComponents.js index 7777aac8b..22cf59180 100644 --- a/dist/src/libs/dkim/publicKeyToComponents.js +++ b/dist/src/libs/dkim/publicKeyToComponents.js @@ -1,5 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const NodeRSA = require("node-rsa"); -export default function publicKeyToComponents(publicKey) { +function publicKeyToComponents(publicKey) { const parsed = new NodeRSA(publicKey); const { e: exponent, n: modulus } = parsed.exportKey("components-public"); return { @@ -7,4 +9,5 @@ export default function publicKeyToComponents(publicKey) { modulus }; } +exports.default = publicKeyToComponents; //# sourceMappingURL=publicKeyToComponents.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/publicKeyToComponents.js.map b/dist/src/libs/dkim/publicKeyToComponents.js.map index b37b3b941..0a618da75 100644 --- a/dist/src/libs/dkim/publicKeyToComponents.js.map +++ b/dist/src/libs/dkim/publicKeyToComponents.js.map @@ -1 +1 @@ -{"version":3,"file":"publicKeyToComponents.js","sourceRoot":"","sources":["../../../../src/libs/dkim/publicKeyToComponents.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEnC,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,SAAc;IAC1D,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAErC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAEzE,OAAO;QACL,QAAQ;QACR,OAAO;KACR,CAAA;AACH,CAAC","sourcesContent":["const NodeRSA = require(\"node-rsa\")\n\nexport default function publicKeyToComponents(publicKey: any) {\n const parsed = new NodeRSA(publicKey)\n\n const { e: exponent, n: modulus } = parsed.exportKey(\"components-public\")\n\n return {\n exponent,\n modulus\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"publicKeyToComponents.js","sourceRoot":"","sources":["../../../../src/libs/dkim/publicKeyToComponents.ts"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEnC,SAAwB,qBAAqB,CAAC,SAAc;IAC1D,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAErC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAEzE,OAAO;QACL,QAAQ;QACR,OAAO;KACR,CAAA;AACH,CAAC;AATD,wCASC","sourcesContent":["const NodeRSA = require(\"node-rsa\")\n\nexport default function publicKeyToComponents(publicKey: any) {\n const parsed = new NodeRSA(publicKey)\n\n const { e: exponent, n: modulus } = parsed.exportKey(\"components-public\")\n\n return {\n exponent,\n modulus\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.js b/dist/src/libs/dkim/recovery.js index 4275a488c..19dd15b34 100644 --- a/dist/src/libs/dkim/recovery.js +++ b/dist/src/libs/dkim/recovery.js @@ -1,7 +1,10 @@ -import { AbiCoder, getAddress, keccak256 } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSignerKey = exports.frequentlyUsedSelectors = exports.knownSelectors = exports.RECOVERY_DEFAULTS = exports.DKIM_VALIDATOR_ADDR = void 0; +const ethers_1 = require("ethers"); // TODO: change to original address once deployed -export const DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'; -export const RECOVERY_DEFAULTS = { +exports.DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'; +exports.RECOVERY_DEFAULTS = { emailTo: 'recovery@ambire.com', acceptUnknownSelectors: true, waitUntilAcceptAdded: 138240n, @@ -10,10 +13,10 @@ export const RECOVERY_DEFAULTS = { acceptEmptySecondSig: true, onlyOneSigTimelock: 259200n // 3 days }; -export const knownSelectors = { +exports.knownSelectors = { 'gmail.com': '20230601' }; -export const frequentlyUsedSelectors = [ +exports.frequentlyUsedSelectors = [ 'Google', 'selector1', 'selector2', @@ -32,10 +35,11 @@ export const frequentlyUsedSelectors = [ * @param validatorData BytesLike * @returns {Address, bytes32} */ -export function getSignerKey(validatorAddr, validatorData) { - const abiCoder = new AbiCoder(); - const hash = keccak256(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData])); - const signerKey = getAddress(`0x${hash.slice(hash.length - 40, hash.length)}`); +function getSignerKey(validatorAddr, validatorData) { + const abiCoder = new ethers_1.AbiCoder(); + const hash = (0, ethers_1.keccak256)(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData])); + const signerKey = (0, ethers_1.getAddress)(`0x${hash.slice(hash.length - 40, hash.length)}`); return { signerKey, hash }; } +exports.getSignerKey = getSignerKey; //# sourceMappingURL=recovery.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/recovery.js.map b/dist/src/libs/dkim/recovery.js.map index f74fc8190..7c1bda054 100644 --- a/dist/src/libs/dkim/recovery.js.map +++ b/dist/src/libs/dkim/recovery.js.map @@ -1 +1 @@ -{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../../src/libs/dkim/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAExD,iDAAiD;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAA;AAE/E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,sBAAsB,EAAE,IAAI;IAC5B,oBAAoB,EAAE,OAAO;IAC7B,sBAAsB,EAAE,OAAO;IAC/B,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,IAAI;IAC1B,kBAAkB,EAAE,OAAO,CAAC,SAAS;CACtC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,UAAU;CACxB,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ;IACR,WAAW;IACX,WAAW;IACX,eAAe;IACf,eAAe;IACf,SAAS;IACT,IAAI;IACJ,SAAS;IACT,MAAM;CACP,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,aAAkB;IACpE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC","sourcesContent":["import { AbiCoder, getAddress, keccak256 } from 'ethers'\n\n// TODO: change to original address once deployed\nexport const DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'\n\nexport const RECOVERY_DEFAULTS = {\n emailTo: 'recovery@ambire.com',\n acceptUnknownSelectors: true,\n waitUntilAcceptAdded: 138240n, // 4 days\n waitUntilAcceptRemoved: 138240n, // 4 days\n acceptEmptyDKIMSig: true,\n acceptEmptySecondSig: true,\n onlyOneSigTimelock: 259200n // 3 days\n}\n\nexport const knownSelectors = {\n 'gmail.com': '20230601'\n}\n\nexport const frequentlyUsedSelectors = [\n 'Google',\n 'selector1',\n 'selector2',\n 'everlytickey1',\n 'everlytickey2',\n 'eversrv',\n 'k1',\n 'mxvault',\n 'dkim'\n]\n\n/**\n * Get the signerKey that goes as the address in privileges\n * and its accompanying priv hash for the email recovery\n *\n * @param validatorAddr string\n * @param validatorData BytesLike\n * @returns {Address, bytes32}\n */\nexport function getSignerKey(validatorAddr: string, validatorData: any) {\n const abiCoder = new AbiCoder()\n const hash = keccak256(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData]))\n const signerKey = getAddress(`0x${hash.slice(hash.length - 40, hash.length)}`)\n return { signerKey, hash }\n}\n"]} \ No newline at end of file +{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../../src/libs/dkim/recovery.ts"],"names":[],"mappings":";;;AAAA,mCAAwD;AAExD,iDAAiD;AACpC,QAAA,mBAAmB,GAAG,4CAA4C,CAAA;AAElE,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,sBAAsB,EAAE,IAAI;IAC5B,oBAAoB,EAAE,OAAO;IAC7B,sBAAsB,EAAE,OAAO;IAC/B,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,IAAI;IAC1B,kBAAkB,EAAE,OAAO,CAAC,SAAS;CACtC,CAAA;AAEY,QAAA,cAAc,GAAG;IAC5B,WAAW,EAAE,UAAU;CACxB,CAAA;AAEY,QAAA,uBAAuB,GAAG;IACrC,QAAQ;IACR,WAAW;IACX,WAAW;IACX,eAAe;IACf,eAAe;IACf,SAAS;IACT,IAAI;IACJ,SAAS;IACT,MAAM;CACP,CAAA;AAED;;;;;;;GAOG;AACH,SAAgB,YAAY,CAAC,aAAqB,EAAE,aAAkB;IACpE,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC;AALD,oCAKC","sourcesContent":["import { AbiCoder, getAddress, keccak256 } from 'ethers'\n\n// TODO: change to original address once deployed\nexport const DKIM_VALIDATOR_ADDR = '0x0000000000000000000000000000000000000000'\n\nexport const RECOVERY_DEFAULTS = {\n emailTo: 'recovery@ambire.com',\n acceptUnknownSelectors: true,\n waitUntilAcceptAdded: 138240n, // 4 days\n waitUntilAcceptRemoved: 138240n, // 4 days\n acceptEmptyDKIMSig: true,\n acceptEmptySecondSig: true,\n onlyOneSigTimelock: 259200n // 3 days\n}\n\nexport const knownSelectors = {\n 'gmail.com': '20230601'\n}\n\nexport const frequentlyUsedSelectors = [\n 'Google',\n 'selector1',\n 'selector2',\n 'everlytickey1',\n 'everlytickey2',\n 'eversrv',\n 'k1',\n 'mxvault',\n 'dkim'\n]\n\n/**\n * Get the signerKey that goes as the address in privileges\n * and its accompanying priv hash for the email recovery\n *\n * @param validatorAddr string\n * @param validatorData BytesLike\n * @returns {Address, bytes32}\n */\nexport function getSignerKey(validatorAddr: string, validatorData: any) {\n const abiCoder = new AbiCoder()\n const hash = keccak256(abiCoder.encode(['address', 'bytes'], [validatorAddr, validatorData]))\n const signerKey = getAddress(`0x${hash.slice(hash.length - 40, hash.length)}`)\n return { signerKey, hash }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.js b/dist/src/libs/dkim/toSolidity.js index 6ccbc2121..69f7ad212 100644 --- a/dist/src/libs/dkim/toSolidity.js +++ b/dist/src/libs/dkim/toSolidity.js @@ -1,8 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const algorithms = { RSASHA1: 0, RSASHA256: 1 }; -export default function toSolidity(rawData) { +function toSolidity(rawData) { return { ...rawData, algorithm: algorithms[rawData.algorithm.replace("-", "")], @@ -12,4 +14,5 @@ export default function toSolidity(rawData) { modulus: "0x" + rawData.modulus.toString("hex").slice(2) }; } +exports.default = toSolidity; //# sourceMappingURL=toSolidity.js.map \ No newline at end of file diff --git a/dist/src/libs/dkim/toSolidity.js.map b/dist/src/libs/dkim/toSolidity.js.map index eec394fb0..b118209cc 100644 --- a/dist/src/libs/dkim/toSolidity.js.map +++ b/dist/src/libs/dkim/toSolidity.js.map @@ -1 +1 @@ -{"version":3,"file":"toSolidity.js","sourceRoot":"","sources":["../../../../src/libs/dkim/toSolidity.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAQ;IACpB,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAY;IAC3C,OAAO;QACH,GAAG,OAAO;QACV,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnD,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3D,CAAA;AACL,CAAC","sourcesContent":["const algorithms: any = {\n RSASHA1: 0,\n RSASHA256: 1\n};\n \nexport default function toSolidity(rawData: any) {\n return {\n ...rawData,\n algorithm: algorithms[rawData.algorithm.replace(\"-\", \"\")],\n hash: \"0x\" + rawData.hash.toString(\"hex\"),\n signature: \"0x\" + rawData.signature.toString(\"hex\"),\n exponent: \"0x\" + rawData.exponent.toString(16),\n modulus: \"0x\" + rawData.modulus.toString(\"hex\").slice(2)\n }\n}"]} \ No newline at end of file +{"version":3,"file":"toSolidity.js","sourceRoot":"","sources":["../../../../src/libs/dkim/toSolidity.ts"],"names":[],"mappings":";;AAAA,MAAM,UAAU,GAAQ;IACpB,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;CACf,CAAC;AAEF,SAAwB,UAAU,CAAC,OAAY;IAC3C,OAAO;QACH,GAAG,OAAO;QACV,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnD,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3D,CAAA;AACL,CAAC;AATD,6BASC","sourcesContent":["const algorithms: any = {\n RSASHA1: 0,\n RSASHA256: 1\n};\n \nexport default function toSolidity(rawData: any) {\n return {\n ...rawData,\n algorithm: algorithms[rawData.algorithm.replace(\"-\", \"\")],\n hash: \"0x\" + rawData.hash.toString(\"hex\"),\n signature: \"0x\" + rawData.signature.toString(\"hex\"),\n exponent: \"0x\" + rawData.exponent.toString(16),\n modulus: \"0x\" + rawData.modulus.toString(\"hex\").slice(2)\n }\n}"]} \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.js b/dist/src/libs/dns/lookup.js index 663ce1fb7..9fa0dabb5 100644 --- a/dist/src/libs/dns/lookup.js +++ b/dist/src/libs/dns/lookup.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const { DNSProver } = require('@ensdomains/dnsprovejs'); /** * The method returns a SignedSet answer if found or throws an exception @@ -10,7 +12,7 @@ const { DNSProver } = require('@ensdomains/dnsprovejs'); * @param opt: Options * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]} */ -export default async function lookup(selector, domain, opt = {}) { +async function lookup(selector, domain, opt = {}) { const provider = opt.apiProvider ?? 'https://cloudflare-dns.com/dns-query'; const textDomain = `${selector}._domainKey.${domain}`; const prover = DNSProver.create(provider); @@ -24,4 +26,5 @@ export default async function lookup(selector, domain, opt = {}) { throw new Error(error.message); } } +exports.default = lookup; //# sourceMappingURL=lookup.js.map \ No newline at end of file diff --git a/dist/src/libs/dns/lookup.js.map b/dist/src/libs/dns/lookup.js.map index e369507a2..8364d028a 100644 --- a/dist/src/libs/dns/lookup.js.map +++ b/dist/src/libs/dns/lookup.js.map @@ -1 +1 @@ -{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/libs/dns/lookup.ts"],"names":[],"mappings":"AAAA,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAMvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAe,EAAE;IACtF,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,sCAAsC,CAAA;IAC1E,MAAM,UAAU,GAAG,GAAG,QAAQ,eAAe,MAAM,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzC,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1D,OAAO,GAAG,CAAA;KACX;IAAC,OAAO,KAAU,EAAE;QACnB,IAAI,KAAK,CAAC,IAAI,IAAI,oBAAoB;YAAE,OAAO,IAAI,CAAA;QACnD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;KAC/B;AACH,CAAC","sourcesContent":["const { DNSProver } = require('@ensdomains/dnsprovejs')\n\ninterface Options {\n apiProvider?: string // cloudflare or another DNS api provider\n}\n\n/**\n * The method returns a SignedSet answer if found or throws an exception\n * if it could not verify it. So in the case of NoValidDnskeyError, we\n * silently return null to indicate that no SignedSet exists for this record.\n * If the error is of a different kind, we throw it.\n *\n * @param selector string \"20221208\" from example 20221208._domainkey.gmail.com\n * @param domain string \"gmail.com\" from example 20221208._domainkey.gmail.com\n * @param opt: Options\n * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]}\n */\nexport default async function lookup(selector: string, domain: string, opt: Options = {}): Promise {\n const provider = opt.apiProvider ?? 'https://cloudflare-dns.com/dns-query'\n const textDomain = `${selector}._domainKey.${domain}`\n const prover = DNSProver.create(provider)\n try {\n const res = await prover.queryWithProof('TXT', textDomain)\n return res\n } catch (error: any) {\n if (error.name == 'NoValidDnskeyError') return null\n throw new Error(error.message)\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/libs/dns/lookup.ts"],"names":[],"mappings":";;AAAA,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAMvD;;;;;;;;;;GAUG;AACY,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAe,EAAE;IACtF,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,sCAAsC,CAAA;IAC1E,MAAM,UAAU,GAAG,GAAG,QAAQ,eAAe,MAAM,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzC,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1D,OAAO,GAAG,CAAA;KACX;IAAC,OAAO,KAAU,EAAE;QACnB,IAAI,KAAK,CAAC,IAAI,IAAI,oBAAoB;YAAE,OAAO,IAAI,CAAA;QACnD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;KAC/B;AACH,CAAC;AAXD,yBAWC","sourcesContent":["const { DNSProver } = require('@ensdomains/dnsprovejs')\n\ninterface Options {\n apiProvider?: string // cloudflare or another DNS api provider\n}\n\n/**\n * The method returns a SignedSet answer if found or throws an exception\n * if it could not verify it. So in the case of NoValidDnskeyError, we\n * silently return null to indicate that no SignedSet exists for this record.\n * If the error is of a different kind, we throw it.\n *\n * @param selector string \"20221208\" from example 20221208._domainkey.gmail.com\n * @param domain string \"gmail.com\" from example 20221208._domainkey.gmail.com\n * @param opt: Options\n * @returns {answer: SignedSet, proofs: [SignedSet,SignedSet,...]}\n */\nexport default async function lookup(selector: string, domain: string, opt: Options = {}): Promise {\n const provider = opt.apiProvider ?? 'https://cloudflare-dns.com/dns-query'\n const textDomain = `${selector}._domainKey.${domain}`\n const prover = DNSProver.create(provider)\n try {\n const res = await prover.queryWithProof('TXT', textDomain)\n return res\n } catch (error: any) {\n if (error.name == 'NoValidDnskeyError') return null\n throw new Error(error.message)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.js b/dist/src/libs/emailVault/emailVault.js index 8f935818b..8817149dc 100644 --- a/dist/src/libs/emailVault/emailVault.js +++ b/dist/src/libs/emailVault/emailVault.js @@ -1,8 +1,11 @@ -import { relayerCall } from '../relayerCall/relayerCall'; -export class EmailVault { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailVault = void 0; +const relayerCall_1 = require("../relayerCall/relayerCall"); +class EmailVault { callRelayer; constructor(fetch, relayerUrl) { - this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch }); } async getRecoveryKeyAddress(email, authKey) { return (await this.callRelayer(`/email-vault/get-recovery-key/${email}/${authKey}`)).data; @@ -51,4 +54,5 @@ export class EmailVault { return (await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`)).data; } } +exports.EmailVault = EmailVault; //# sourceMappingURL=emailVault.js.map \ No newline at end of file diff --git a/dist/src/libs/emailVault/emailVault.js.map b/dist/src/libs/emailVault/emailVault.js.map index 25f203558..7aa0b7f45 100644 --- a/dist/src/libs/emailVault/emailVault.js.map +++ b/dist/src/libs/emailVault/emailVault.js.map @@ -1 +1 @@ -{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/libs/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmailVaultData,\n EmailVaultOperation,\n EmailVaultSecret,\n RecoveryKey\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { relayerCall } from '../relayerCall/relayerCall'\n\nexport interface Secret {\n key: String\n type: String\n}\n\n// NOTE: its a quick fix. Will be updated in other branch\nexport interface EmailVaultInfo {\n email: String\n recoveryKey: String\n availableSecrets: Secret[]\n availableAccounts: any\n}\n\nexport class EmailVault {\n private callRelayer: Function\n\n constructor(fetch: Fetch, relayerUrl: string) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n async getRecoveryKeyAddress(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-recovery-key/${email}/${authKey}`)).data\n }\n\n async getSessionKey(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-session-key/${email}/${authKey}`))?.data\n ?.sessionKey\n }\n\n async getEmailVaultInfo(email: String, authKey: String): Promise {\n const result = await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`).then(\n (res: any) => res.data\n )\n\n return {\n ...result,\n availableAccounts: Object.fromEntries(\n result.availableAccounts.map((acc: any) => [acc.addr, acc])\n ),\n availableSecrets: Object.fromEntries(\n result.availableSecrets.map((secret: any) => [secret.key, secret])\n )\n }\n }\n\n async operations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/post-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async getOperations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/get-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async addKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String,\n secret: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-store-secret/${email}/${authKey}`, 'POST', {\n secret,\n uid: keyStoreUid\n })\n ).success\n }\n\n async retrieveKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String\n ): Promise {\n return (\n await this.callRelayer(\n `/email-vault/retrieve-key-store-secret/${email}/${keyStoreUid}/${authKey}`\n )\n ).data\n }\n\n async addKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String,\n privateKeyEncryptedJSON: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-backup/${email}/${authKey}`, 'POST', {\n keyAddress,\n encryptedBackup: privateKeyEncryptedJSON\n })\n ).success\n }\n\n async retrieveKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/retrieve-key-backup/${email}/${keyAddress}/${authKey}`)\n ).data\n }\n\n async getInfo(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`)).data\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/libs/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmailVaultData,\n EmailVaultOperation,\n EmailVaultSecret,\n RecoveryKey\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { relayerCall } from '../relayerCall/relayerCall'\n\nexport interface Secret {\n key: String\n type: String\n}\n\n// NOTE: its a quick fix. Will be updated in other branch\nexport interface EmailVaultInfo {\n email: String\n recoveryKey: String\n availableSecrets: Secret[]\n availableAccounts: any\n}\n\nexport class EmailVault {\n private callRelayer: Function\n\n constructor(fetch: Fetch, relayerUrl: string) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n }\n\n async getRecoveryKeyAddress(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-recovery-key/${email}/${authKey}`)).data\n }\n\n async getSessionKey(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/get-session-key/${email}/${authKey}`))?.data\n ?.sessionKey\n }\n\n async getEmailVaultInfo(email: String, authKey: String): Promise {\n const result = await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`).then(\n (res: any) => res.data\n )\n\n return {\n ...result,\n availableAccounts: Object.fromEntries(\n result.availableAccounts.map((acc: any) => [acc.addr, acc])\n ),\n availableSecrets: Object.fromEntries(\n result.availableSecrets.map((secret: any) => [secret.key, secret])\n )\n }\n }\n\n async operations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/post-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async getOperations(\n email: String,\n authKey: String,\n operations: EmailVaultOperation[]\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/get-operations/${email}/${authKey}`, 'POST', {\n operations\n })\n ).data\n }\n\n async addKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String,\n secret: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-store-secret/${email}/${authKey}`, 'POST', {\n secret,\n uid: keyStoreUid\n })\n ).success\n }\n\n async retrieveKeyStoreSecret(\n email: String,\n authKey: String,\n keyStoreUid: String\n ): Promise {\n return (\n await this.callRelayer(\n `/email-vault/retrieve-key-store-secret/${email}/${keyStoreUid}/${authKey}`\n )\n ).data\n }\n\n async addKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String,\n privateKeyEncryptedJSON: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/add-key-backup/${email}/${authKey}`, 'POST', {\n keyAddress,\n encryptedBackup: privateKeyEncryptedJSON\n })\n ).success\n }\n\n async retrieveKeyBackup(\n email: String,\n authKey: String,\n keyAddress: String\n ): Promise {\n return (\n await this.callRelayer(`/email-vault/retrieve-key-backup/${email}/${keyAddress}/${authKey}`)\n ).data\n }\n\n async getInfo(email: String, authKey: String): Promise {\n return (await this.callRelayer(`/email-vault/email-vault-info/${email}/${authKey}`)).data\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.js b/dist/src/libs/erc7677/erc7677.js index ce28945f1..3418397d1 100644 --- a/dist/src/libs/erc7677/erc7677.js +++ b/dist/src/libs/erc7677/erc7677.js @@ -1,13 +1,16 @@ -import { toBeHex, toQuantity } from 'ethers'; -import { ERC_4337_ENTRYPOINT } from '../../consts/deploy'; -import { getRpcProvider } from '../../services/provider'; -import { getCleanUserOp } from '../userOperation/userOperation'; -export function getPaymasterService(chainId, capabilities) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPaymasterData = exports.getPaymasterStubData = exports.getPaymasterService = void 0; +const ethers_1 = require("ethers"); +const deploy_1 = require("../../consts/deploy"); +const provider_1 = require("../../services/provider"); +const userOperation_1 = require("../userOperation/userOperation"); +function getPaymasterService(chainId, capabilities) { if (!capabilities || !capabilities.paymasterService) return undefined; // hex may come with a leading zero or not. Prepare for both - const chainIdHex = toBeHex(chainId); - const chainIdQuantity = toQuantity(chainId); + const chainIdHex = (0, ethers_1.toBeHex)(chainId); + const chainIdQuantity = (0, ethers_1.toQuantity)(chainId); const paymasterService = chainIdHex in capabilities.paymasterService ? capabilities.paymasterService[chainIdHex] : capabilities.paymasterService[chainIdQuantity]; @@ -16,22 +19,25 @@ export function getPaymasterService(chainId, capabilities) { paymasterService.id = new Date().getTime(); return paymasterService; } -export function getPaymasterStubData(service, userOp, network) { - const provider = getRpcProvider([service.url], network.chainId); +exports.getPaymasterService = getPaymasterService; +function getPaymasterStubData(service, userOp, network) { + const provider = (0, provider_1.getRpcProvider)([service.url], network.chainId); return provider.send('pm_getPaymasterStubData', [ - getCleanUserOp(userOp)[0], - ERC_4337_ENTRYPOINT, - toBeHex(network.chainId.toString()), + (0, userOperation_1.getCleanUserOp)(userOp)[0], + deploy_1.ERC_4337_ENTRYPOINT, + (0, ethers_1.toBeHex)(network.chainId.toString()), service.context ]); } -export async function getPaymasterData(service, userOp, network) { - const provider = getRpcProvider([service.url], network.chainId); +exports.getPaymasterStubData = getPaymasterStubData; +async function getPaymasterData(service, userOp, network) { + const provider = (0, provider_1.getRpcProvider)([service.url], network.chainId); return provider.send('pm_getPaymasterData', [ - getCleanUserOp(userOp)[0], - ERC_4337_ENTRYPOINT, - toBeHex(network.chainId.toString()), + (0, userOperation_1.getCleanUserOp)(userOp)[0], + deploy_1.ERC_4337_ENTRYPOINT, + (0, ethers_1.toBeHex)(network.chainId.toString()), service.context ]); } +exports.getPaymasterData = getPaymasterData; //# sourceMappingURL=erc7677.js.map \ No newline at end of file diff --git a/dist/src/libs/erc7677/erc7677.js.map b/dist/src/libs/erc7677/erc7677.js.map index faea224fd..9fde4b112 100644 --- a/dist/src/libs/erc7677/erc7677.js.map +++ b/dist/src/libs/erc7677/erc7677.js.map @@ -1 +1 @@ -{"version":3,"file":"erc7677.js","sourceRoot":"","sources":["../../../../src/libs/erc7677/erc7677.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAQ/D,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,YAA2D;IAE3D,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAErE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAkB,CAAA;IACpD,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAkB,CAAA;IAC5D,MAAM,gBAAgB,GACpB,UAAU,IAAI,YAAY,CAAC,gBAAgB;QACzC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;IACpD,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAEvC,gBAAgB,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC1C,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAC9C,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,mBAAmB;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAC1C,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,mBAAmB;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { toBeHex, toQuantity } from 'ethers'\n\nimport { ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp } from '../userOperation/userOperation'\nimport {\n PaymasterCapabilities,\n PaymasterData,\n PaymasterEstimationData,\n PaymasterService\n} from './types'\n\nexport function getPaymasterService(\n chainId: bigint,\n capabilities?: { paymasterService?: PaymasterCapabilities }\n): PaymasterService | undefined {\n if (!capabilities || !capabilities.paymasterService) return undefined\n\n // hex may come with a leading zero or not. Prepare for both\n const chainIdHex = toBeHex(chainId) as `0x${string}`\n const chainIdQuantity = toQuantity(chainId) as `0x${string}`\n const paymasterService =\n chainIdHex in capabilities.paymasterService\n ? capabilities.paymasterService[chainIdHex]\n : capabilities.paymasterService[chainIdQuantity]\n if (!paymasterService) return undefined\n\n paymasterService.id = new Date().getTime()\n return paymasterService\n}\n\nexport function getPaymasterStubData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterStubData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n\nexport async function getPaymasterData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n"]} \ No newline at end of file +{"version":3,"file":"erc7677.js","sourceRoot":"","sources":["../../../../src/libs/erc7677/erc7677.ts"],"names":[],"mappings":";;;AAAA,mCAA4C;AAE5C,gDAAyD;AAEzD,sDAAwD;AAExD,kEAA+D;AAQ/D,SAAgB,mBAAmB,CACjC,OAAe,EACf,YAA2D;IAE3D,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAErE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,IAAA,gBAAO,EAAC,OAAO,CAAkB,CAAA;IACpD,MAAM,eAAe,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAkB,CAAA;IAC5D,MAAM,gBAAgB,GACpB,UAAU,IAAI,YAAY,CAAC,gBAAgB;QACzC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;IACpD,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAEvC,gBAAgB,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC1C,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAjBD,kDAiBC;AAED,SAAgB,oBAAoB,CAClC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAA,yBAAc,EAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAC9C,IAAA,8BAAc,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,4BAAmB;QACnB,IAAA,gBAAO,EAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC;AAZD,oDAYC;AAEM,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,MAAqB,EACrB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAA,yBAAc,EAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAC1C,IAAA,8BAAc,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,4BAAmB;QACnB,IAAA,gBAAO,EAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO;KAChB,CAAC,CAAA;AACJ,CAAC;AAZD,4CAYC","sourcesContent":["import { toBeHex, toQuantity } from 'ethers'\n\nimport { ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp } from '../userOperation/userOperation'\nimport {\n PaymasterCapabilities,\n PaymasterData,\n PaymasterEstimationData,\n PaymasterService\n} from './types'\n\nexport function getPaymasterService(\n chainId: bigint,\n capabilities?: { paymasterService?: PaymasterCapabilities }\n): PaymasterService | undefined {\n if (!capabilities || !capabilities.paymasterService) return undefined\n\n // hex may come with a leading zero or not. Prepare for both\n const chainIdHex = toBeHex(chainId) as `0x${string}`\n const chainIdQuantity = toQuantity(chainId) as `0x${string}`\n const paymasterService =\n chainIdHex in capabilities.paymasterService\n ? capabilities.paymasterService[chainIdHex]\n : capabilities.paymasterService[chainIdQuantity]\n if (!paymasterService) return undefined\n\n paymasterService.id = new Date().getTime()\n return paymasterService\n}\n\nexport function getPaymasterStubData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterStubData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n\nexport async function getPaymasterData(\n service: PaymasterService,\n userOp: UserOperation,\n network: Network\n): Promise {\n const provider = getRpcProvider([service.url], network.chainId)\n return provider.send('pm_getPaymasterData', [\n getCleanUserOp(userOp)[0],\n ERC_4337_ENTRYPOINT,\n toBeHex(network.chainId.toString()),\n service.context\n ])\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/erc7677/types.js b/dist/src/libs/erc7677/types.js index 718fd38ae..11e638d1e 100644 --- a/dist/src/libs/erc7677/types.js +++ b/dist/src/libs/erc7677/types.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.js b/dist/src/libs/errorDecoder/constants.js index 44c8b6bb5..bfb954a4e 100644 --- a/dist/src/libs/errorDecoder/constants.js +++ b/dist/src/libs/errorDecoder/constants.js @@ -1,6 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EXPIRED_PREFIX = exports.PANIC_ERROR_PREFIX = exports.ERROR_PREFIX = void 0; const ERROR_PREFIX = '0x08c379a0'; +exports.ERROR_PREFIX = ERROR_PREFIX; const PANIC_ERROR_PREFIX = '0x4e487b71'; +exports.PANIC_ERROR_PREFIX = PANIC_ERROR_PREFIX; // Signature of TransactionDeadlinePassed const EXPIRED_PREFIX = '0x5bf6f916'; -export { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }; +exports.EXPIRED_PREFIX = EXPIRED_PREFIX; //# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/constants.js.map b/dist/src/libs/errorDecoder/constants.js.map index e567a4e3a..7a4cdb922 100644 --- a/dist/src/libs/errorDecoder/constants.js.map +++ b/dist/src/libs/errorDecoder/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/constants.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,YAAY,CAAA;AACjC,MAAM,kBAAkB,GAAG,YAAY,CAAA;AAEvC,yCAAyC;AACzC,MAAM,cAAc,GAAG,YAAY,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA","sourcesContent":["const ERROR_PREFIX = '0x08c379a0'\nconst PANIC_ERROR_PREFIX = '0x4e487b71'\n\n// Signature of TransactionDeadlinePassed\nconst EXPIRED_PREFIX = '0x5bf6f916'\n\nexport { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }\n"]} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/constants.ts"],"names":[],"mappings":";;;AAAA,MAAM,YAAY,GAAG,YAAY,CAAA;AAMxB,oCAAY;AALrB,MAAM,kBAAkB,GAAG,YAAY,CAAA;AAKhB,gDAAkB;AAHzC,yCAAyC;AACzC,MAAM,cAAc,GAAG,YAAY,CAAA;AAEQ,wCAAc","sourcesContent":["const ERROR_PREFIX = '0x08c379a0'\nconst PANIC_ERROR_PREFIX = '0x4e487b71'\n\n// Signature of TransactionDeadlinePassed\nconst EXPIRED_PREFIX = '0x5bf6f916'\n\nexport { ERROR_PREFIX, PANIC_ERROR_PREFIX, EXPIRED_PREFIX }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.js b/dist/src/libs/errorDecoder/customErrors.js index 08668817c..cf9faee9b 100644 --- a/dist/src/libs/errorDecoder/customErrors.js +++ b/dist/src/libs/errorDecoder/customErrors.js @@ -1,5 +1,8 @@ +"use strict"; /* eslint-disable max-classes-per-file */ -import { isHexString } from 'ethers'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BundlerError = exports.SponsorshipPaymasterError = exports.RelayerPaymasterError = exports.InnerCallFailureError = void 0; +const ethers_1 = require("ethers"); class InnerCallFailureError extends Error { data = ''; calls; @@ -13,11 +16,12 @@ class InnerCallFailureError extends Error { this.nativePortfolioValue = nativePortfolioValue; // If the message is a hex string pass it to // the data field so it can be used by other error handlers - if (isHexString(message)) { + if ((0, ethers_1.isHexString)(message)) { this.data = message; } } } +exports.InnerCallFailureError = InnerCallFailureError; class RelayerPaymasterError extends Error { constructor(error) { let message = ''; @@ -32,6 +36,7 @@ class RelayerPaymasterError extends Error { this.message = message; } } +exports.RelayerPaymasterError = RelayerPaymasterError; class SponsorshipPaymasterError extends Error { constructor() { const message = 'Sponsorship failed.'; @@ -40,6 +45,7 @@ class SponsorshipPaymasterError extends Error { this.message = message; } } +exports.SponsorshipPaymasterError = SponsorshipPaymasterError; class BundlerError extends Error { bundlerName; constructor(message, bundlerName) { @@ -49,5 +55,5 @@ class BundlerError extends Error { this.message = message; } } -export { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }; +exports.BundlerError = BundlerError; //# sourceMappingURL=customErrors.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/customErrors.js.map b/dist/src/libs/errorDecoder/customErrors.js.map index 29c0533e0..42b16b88e 100644 --- a/dist/src/libs/errorDecoder/customErrors.js.map +++ b/dist/src/libs/errorDecoder/customErrors.js.map @@ -1 +1 @@ -{"version":3,"file":"customErrors.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/customErrors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAMpC,MAAM,qBAAsB,SAAQ,KAAK;IAChC,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,CAAQ;IAEb,oBAAoB,CAAoB;IAExC,OAAO,CAAS;IAEvB,YAAY,OAAe,EAAE,KAAa,EAAE,OAAgB,EAAE,oBAA6B;QACzF,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAChD,4CAA4C;QAC5C,2DAA2D;QAC3D,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;YACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;SACpB;IACH,CAAC;CACF;AAED,MAAM,qBAAsB,SAAQ,KAAK;IACvC,YAAY,KAAU;QACpB,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YAC3C,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;SACtC;aAAM,IAAI,KAAK,CAAC,OAAO,EAAE;YACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;SACxB;QAED,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,yBAA0B,SAAQ,KAAK;IAC3C;QACE,MAAM,OAAO,GAAG,qBAAqB,CAAA;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,YAAa,SAAQ,KAAK;IAC9B,WAAW,CAAS;IAEpB,YAAY,OAAe,EAAE,WAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,YAAY,EAAE,CAAA","sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport { isHexString } from 'ethers'\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Call } from '../accountOp/types'\n\nclass InnerCallFailureError extends Error {\n public data: string = ''\n\n public calls: Call[]\n\n public nativePortfolioValue: bigint | undefined\n\n public network: Network\n\n constructor(message: string, calls: Call[], network: Network, nativePortfolioValue?: bigint) {\n super(message)\n this.name = 'InnerCallFailureError'\n this.calls = calls\n this.network = network\n this.nativePortfolioValue = nativePortfolioValue\n // If the message is a hex string pass it to\n // the data field so it can be used by other error handlers\n if (isHexString(message)) {\n this.data = message\n }\n }\n}\n\nclass RelayerPaymasterError extends Error {\n constructor(error: any) {\n let message = ''\n if (error.errorState && error.errorState[0]) {\n message = error.errorState[0].message\n } else if (error.message) {\n message = error.message\n }\n\n super(message)\n this.name = 'PaymasterError'\n this.message = message\n }\n}\n\nclass SponsorshipPaymasterError extends Error {\n constructor() {\n const message = 'Sponsorship failed.'\n super(message)\n this.name = 'PaymasterSponsorshipError'\n this.message = message\n }\n}\n\nclass BundlerError extends Error {\n bundlerName: BUNDLER\n\n constructor(message: string, bundlerName: BUNDLER) {\n super(message)\n this.bundlerName = bundlerName\n this.name = 'BundlerError'\n this.message = message\n }\n}\n\nexport { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }\n"]} \ No newline at end of file +{"version":3,"file":"customErrors.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/customErrors.ts"],"names":[],"mappings":";AAAA,yCAAyC;;;AAEzC,mCAAoC;AAMpC,MAAM,qBAAsB,SAAQ,KAAK;IAChC,IAAI,GAAW,EAAE,CAAA;IAEjB,KAAK,CAAQ;IAEb,oBAAoB,CAAoB;IAExC,OAAO,CAAS;IAEvB,YAAY,OAAe,EAAE,KAAa,EAAE,OAAgB,EAAE,oBAA6B;QACzF,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAChD,4CAA4C;QAC5C,2DAA2D;QAC3D,IAAI,IAAA,oBAAW,EAAC,OAAO,CAAC,EAAE;YACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;SACpB;IACH,CAAC;CACF;AAqCQ,sDAAqB;AAnC9B,MAAM,qBAAsB,SAAQ,KAAK;IACvC,YAAY,KAAU;QACpB,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YAC3C,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;SACtC;aAAM,IAAI,KAAK,CAAC,OAAO,EAAE;YACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;SACxB;QAED,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAsB+B,sDAAqB;AApBrD,MAAM,yBAA0B,SAAQ,KAAK;IAC3C;QACE,MAAM,OAAO,GAAG,qBAAqB,CAAA;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAasD,8DAAyB;AAXhF,MAAM,YAAa,SAAQ,KAAK;IAC9B,WAAW,CAAS;IAEpB,YAAY,OAAe,EAAE,WAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAEiF,oCAAY","sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport { isHexString } from 'ethers'\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Call } from '../accountOp/types'\n\nclass InnerCallFailureError extends Error {\n public data: string = ''\n\n public calls: Call[]\n\n public nativePortfolioValue: bigint | undefined\n\n public network: Network\n\n constructor(message: string, calls: Call[], network: Network, nativePortfolioValue?: bigint) {\n super(message)\n this.name = 'InnerCallFailureError'\n this.calls = calls\n this.network = network\n this.nativePortfolioValue = nativePortfolioValue\n // If the message is a hex string pass it to\n // the data field so it can be used by other error handlers\n if (isHexString(message)) {\n this.data = message\n }\n }\n}\n\nclass RelayerPaymasterError extends Error {\n constructor(error: any) {\n let message = ''\n if (error.errorState && error.errorState[0]) {\n message = error.errorState[0].message\n } else if (error.message) {\n message = error.message\n }\n\n super(message)\n this.name = 'PaymasterError'\n this.message = message\n }\n}\n\nclass SponsorshipPaymasterError extends Error {\n constructor() {\n const message = 'Sponsorship failed.'\n super(message)\n this.name = 'PaymasterSponsorshipError'\n this.message = message\n }\n}\n\nclass BundlerError extends Error {\n bundlerName: BUNDLER\n\n constructor(message: string, bundlerName: BUNDLER) {\n super(message)\n this.bundlerName = bundlerName\n this.name = 'BundlerError'\n this.message = message\n }\n}\n\nexport { InnerCallFailureError, RelayerPaymasterError, SponsorshipPaymasterError, BundlerError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.js b/dist/src/libs/errorDecoder/errorDecoder.js index 94ce6067d..26151f83f 100644 --- a/dist/src/libs/errorDecoder/errorDecoder.js +++ b/dist/src/libs/errorDecoder/errorDecoder.js @@ -1,26 +1,30 @@ -import { BundlerError } from './customErrors'; -import { BundlerErrorHandler, CustomErrorHandler, InnerCallFailureHandler, PanicErrorHandler, PaymasterErrorHandler, RevertErrorHandler, RpcErrorHandler, UserRejectionHandler } from './handlers'; -import BiconomyEstimationErrorHandler from './handlers/biconomy'; -import PimlicoEstimationErrorHandler from './handlers/pimlico'; -import RelayerErrorHandler from './handlers/relayer'; -import { formatReason, getDataFromError, isReasonValid } from './helpers'; -import { ErrorType } from './types'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeError = void 0; +const tslib_1 = require("tslib"); +const customErrors_1 = require("./customErrors"); +const handlers_1 = require("./handlers"); +const biconomy_1 = tslib_1.__importDefault(require("./handlers/biconomy")); +const pimlico_1 = tslib_1.__importDefault(require("./handlers/pimlico")); +const relayer_1 = tslib_1.__importDefault(require("./handlers/relayer")); +const helpers_1 = require("./helpers"); +const types_1 = require("./types"); const PREPROCESSOR_BUNDLER_HANDLERS = [ - BiconomyEstimationErrorHandler, - PimlicoEstimationErrorHandler + biconomy_1.default, + pimlico_1.default ]; -const PREPROCESSOR_HANDLERS = [BundlerErrorHandler, RelayerErrorHandler, InnerCallFailureHandler]; +const PREPROCESSOR_HANDLERS = [handlers_1.BundlerErrorHandler, relayer_1.default, handlers_1.InnerCallFailureHandler]; const ERROR_HANDLERS = [ - RpcErrorHandler, - CustomErrorHandler, - PanicErrorHandler, - RevertErrorHandler, - PaymasterErrorHandler, - UserRejectionHandler + handlers_1.RpcErrorHandler, + handlers_1.CustomErrorHandler, + handlers_1.PanicErrorHandler, + handlers_1.RevertErrorHandler, + handlers_1.PaymasterErrorHandler, + handlers_1.UserRejectionHandler ]; // additionalHandlers is a list of handlers we want to add only for // specific decodeError cases (e.g. bundler estimation) -export function decodeError(e) { +function decodeError(e) { // Otherwise regular JS/TS errors will be handled // as RPC errors which is confusing. if (e instanceof TypeError || @@ -29,14 +33,14 @@ export function decodeError(e) { e instanceof RangeError) { console.error('Encountered a code error', e); return { - type: ErrorType.CodeError, + type: types_1.ErrorType.CodeError, reason: e.name, data: null }; } - const errorData = getDataFromError(e); + const errorData = (0, helpers_1.getDataFromError)(e); let decodedError = { - type: ErrorType.UnknownError, + type: types_1.ErrorType.UnknownError, reason: '', data: errorData }; @@ -45,7 +49,7 @@ export function decodeError(e) { // from a bundler that mean one thing but from an RPC another, and from the relayer // a third. So we will add additional handlers optionally const preprocessorHandlers = PREPROCESSOR_HANDLERS; - if (e instanceof BundlerError) { + if (e instanceof customErrors_1.BundlerError) { preprocessorHandlers.push(...PREPROCESSOR_BUNDLER_HANDLERS); } // Run preprocessor handlers first @@ -60,16 +64,17 @@ export function decodeError(e) { // Run error handlers ERROR_HANDLERS.forEach((HandlerClass) => { const handler = new HandlerClass(); - const isValidReason = isReasonValid(decodedError.reason); + const isValidReason = (0, helpers_1.isReasonValid)(decodedError.reason); const processedData = decodedError.data || errorData; if (handler.matches(processedData, e) && !isValidReason) { decodedError = handler.handle(processedData, e); } }); - decodedError.reason = formatReason(decodedError.reason || ''); - if (decodedError.type === ErrorType.UnknownError) { + decodedError.reason = (0, helpers_1.formatReason)(decodedError.reason || ''); + if (decodedError.type === types_1.ErrorType.UnknownError) { console.error('Failed to decode error', e); } return decodedError; } +exports.decodeError = decodeError; //# sourceMappingURL=errorDecoder.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/errorDecoder.js.map b/dist/src/libs/errorDecoder/errorDecoder.js.map index 7820844b6..1f0e75d79 100644 --- a/dist/src/libs/errorDecoder/errorDecoder.js.map +++ b/dist/src/libs/errorDecoder/errorDecoder.js.map @@ -1 +1 @@ -{"version":3,"file":"errorDecoder.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/errorDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { BundlerError } from './customErrors'\nimport {\n BundlerErrorHandler,\n CustomErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n PaymasterErrorHandler,\n RevertErrorHandler,\n RpcErrorHandler,\n UserRejectionHandler\n} from './handlers'\nimport BiconomyEstimationErrorHandler from './handlers/biconomy'\nimport PimlicoEstimationErrorHandler from './handlers/pimlico'\nimport RelayerErrorHandler from './handlers/relayer'\nimport { formatReason, getDataFromError, isReasonValid } from './helpers'\nimport { DecodedError, ErrorType } from './types'\n\nconst PREPROCESSOR_BUNDLER_HANDLERS = [\n BiconomyEstimationErrorHandler,\n PimlicoEstimationErrorHandler\n]\n\nconst PREPROCESSOR_HANDLERS = [BundlerErrorHandler, RelayerErrorHandler, InnerCallFailureHandler]\nconst ERROR_HANDLERS = [\n RpcErrorHandler,\n CustomErrorHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler\n]\n\n// additionalHandlers is a list of handlers we want to add only for\n// specific decodeError cases (e.g. bundler estimation)\nexport function decodeError(e: Error): DecodedError {\n // Otherwise regular JS/TS errors will be handled\n // as RPC errors which is confusing.\n if (\n e instanceof TypeError ||\n e instanceof ReferenceError ||\n e instanceof SyntaxError ||\n e instanceof RangeError\n ) {\n console.error('Encountered a code error', e)\n\n return {\n type: ErrorType.CodeError,\n reason: e.name,\n data: null\n }\n }\n\n const errorData = getDataFromError(e)\n\n let decodedError: DecodedError = {\n type: ErrorType.UnknownError,\n reason: '',\n data: errorData\n }\n\n // configure a list of preprocessorHandlers we want to use.\n // There are very generic errors like 400 bad request that when they come\n // from a bundler that mean one thing but from an RPC another, and from the relayer\n // a third. So we will add additional handlers optionally\n const preprocessorHandlers = PREPROCESSOR_HANDLERS\n if (e instanceof BundlerError) {\n preprocessorHandlers.push(...PREPROCESSOR_BUNDLER_HANDLERS)\n }\n\n // Run preprocessor handlers first\n // The idea is that preprocessor handlers can either decode the error\n // or leave it partially decoded for the other handlers to decode\n preprocessorHandlers.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n if (handler.matches(errorData, e)) {\n decodedError = handler.handle(errorData, e)\n }\n })\n\n // Run error handlers\n ERROR_HANDLERS.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n const isValidReason = isReasonValid(decodedError.reason)\n const processedData = decodedError.data || errorData\n\n if (handler.matches(processedData, e) && !isValidReason) {\n decodedError = handler.handle(processedData, e)\n }\n })\n\n decodedError.reason = formatReason(decodedError.reason || '')\n\n if (decodedError.type === ErrorType.UnknownError) {\n console.error('Failed to decode error', e)\n }\n\n return decodedError\n}\n"]} \ No newline at end of file +{"version":3,"file":"errorDecoder.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/errorDecoder.ts"],"names":[],"mappings":";;;;AAAA,iDAA6C;AAC7C,yCASmB;AACnB,2EAAgE;AAChE,yEAA8D;AAC9D,yEAAoD;AACpD,uCAAyE;AACzE,mCAAiD;AAEjD,MAAM,6BAA6B,GAAG;IACpC,kBAA8B;IAC9B,iBAA6B;CAC9B,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,8BAAmB,EAAE,iBAAmB,EAAE,kCAAuB,CAAC,CAAA;AACjG,MAAM,cAAc,GAAG;IACrB,0BAAe;IACf,6BAAkB;IAClB,4BAAiB;IACjB,6BAAkB;IAClB,gCAAqB;IACrB,+BAAoB;CACrB,CAAA;AAED,mEAAmE;AACnE,uDAAuD;AACvD,SAAgB,WAAW,CAAC,CAAQ;IAClC,iDAAiD;IACjD,oCAAoC;IACpC,IACE,CAAC,YAAY,SAAS;QACtB,CAAC,YAAY,cAAc;QAC3B,CAAC,YAAY,WAAW;QACxB,CAAC,YAAY,UAAU,EACvB;QACA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAA;QAE5C,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,SAAS;YACzB,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,IAAI,EAAE,IAAI;SACX,CAAA;KACF;IAED,MAAM,SAAS,GAAG,IAAA,0BAAgB,EAAC,CAAC,CAAC,CAAA;IAErC,IAAI,YAAY,GAAiB;QAC/B,IAAI,EAAE,iBAAS,CAAC,YAAY;QAC5B,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB,CAAA;IAED,2DAA2D;IAC3D,yEAAyE;IACzE,mFAAmF;IACnF,yDAAyD;IACzD,MAAM,oBAAoB,GAAG,qBAAqB,CAAA;IAClD,IAAI,CAAC,YAAY,2BAAY,EAAE;QAC7B,oBAAoB,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAA;KAC5D;IAED,kCAAkC;IAClC,qEAAqE;IACrE,iEAAiE;IACjE,oBAAoB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QAClC,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;YACjC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;SAC5C;IACH,CAAC,CAAC,CAAA;IAEF,qBAAqB;IACrB,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QAClC,MAAM,aAAa,GAAG,IAAA,uBAAa,EAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,IAAI,SAAS,CAAA;QAEpD,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;YACvD,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;SAChD;IACH,CAAC,CAAC,CAAA;IAEF,YAAY,CAAC,MAAM,GAAG,IAAA,sBAAY,EAAC,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAE7D,IAAI,YAAY,CAAC,IAAI,KAAK,iBAAS,CAAC,YAAY,EAAE;QAChD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAA;KAC3C;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AA/DD,kCA+DC","sourcesContent":["import { BundlerError } from './customErrors'\nimport {\n BundlerErrorHandler,\n CustomErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n PaymasterErrorHandler,\n RevertErrorHandler,\n RpcErrorHandler,\n UserRejectionHandler\n} from './handlers'\nimport BiconomyEstimationErrorHandler from './handlers/biconomy'\nimport PimlicoEstimationErrorHandler from './handlers/pimlico'\nimport RelayerErrorHandler from './handlers/relayer'\nimport { formatReason, getDataFromError, isReasonValid } from './helpers'\nimport { DecodedError, ErrorType } from './types'\n\nconst PREPROCESSOR_BUNDLER_HANDLERS = [\n BiconomyEstimationErrorHandler,\n PimlicoEstimationErrorHandler\n]\n\nconst PREPROCESSOR_HANDLERS = [BundlerErrorHandler, RelayerErrorHandler, InnerCallFailureHandler]\nconst ERROR_HANDLERS = [\n RpcErrorHandler,\n CustomErrorHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler\n]\n\n// additionalHandlers is a list of handlers we want to add only for\n// specific decodeError cases (e.g. bundler estimation)\nexport function decodeError(e: Error): DecodedError {\n // Otherwise regular JS/TS errors will be handled\n // as RPC errors which is confusing.\n if (\n e instanceof TypeError ||\n e instanceof ReferenceError ||\n e instanceof SyntaxError ||\n e instanceof RangeError\n ) {\n console.error('Encountered a code error', e)\n\n return {\n type: ErrorType.CodeError,\n reason: e.name,\n data: null\n }\n }\n\n const errorData = getDataFromError(e)\n\n let decodedError: DecodedError = {\n type: ErrorType.UnknownError,\n reason: '',\n data: errorData\n }\n\n // configure a list of preprocessorHandlers we want to use.\n // There are very generic errors like 400 bad request that when they come\n // from a bundler that mean one thing but from an RPC another, and from the relayer\n // a third. So we will add additional handlers optionally\n const preprocessorHandlers = PREPROCESSOR_HANDLERS\n if (e instanceof BundlerError) {\n preprocessorHandlers.push(...PREPROCESSOR_BUNDLER_HANDLERS)\n }\n\n // Run preprocessor handlers first\n // The idea is that preprocessor handlers can either decode the error\n // or leave it partially decoded for the other handlers to decode\n preprocessorHandlers.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n if (handler.matches(errorData, e)) {\n decodedError = handler.handle(errorData, e)\n }\n })\n\n // Run error handlers\n ERROR_HANDLERS.forEach((HandlerClass) => {\n const handler = new HandlerClass()\n const isValidReason = isReasonValid(decodedError.reason)\n const processedData = decodedError.data || errorData\n\n if (handler.matches(processedData, e) && !isValidReason) {\n decodedError = handler.handle(processedData, e)\n }\n })\n\n decodedError.reason = formatReason(decodedError.reason || '')\n\n if (decodedError.type === ErrorType.UnknownError) {\n console.error('Failed to decode error', e)\n }\n\n return decodedError\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.js b/dist/src/libs/errorDecoder/handlers/biconomy.js index 708588536..bf363c57b 100644 --- a/dist/src/libs/errorDecoder/handlers/biconomy.js +++ b/dist/src/libs/errorDecoder/handlers/biconomy.js @@ -1,10 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { BICONOMY } from '../../../consts/bundlers'; -import { ErrorType } from '../types'; +const bundlers_1 = require("../../../consts/bundlers"); +const types_1 = require("../types"); class BiconomyEstimationErrorHandler { matches(data, error) { const { bundlerName } = error; - return bundlerName && bundlerName === BICONOMY; + return bundlerName && bundlerName === bundlers_1.BICONOMY; } handle(data, error) { const { message } = error?.error || error || {}; @@ -15,11 +17,11 @@ class BiconomyEstimationErrorHandler { reason = 'biconomy: 400'; } return { - type: ErrorType.BundlerError, + type: types_1.ErrorType.BundlerError, reason, data: reason }; } } -export default BiconomyEstimationErrorHandler; +exports.default = BiconomyEstimationErrorHandler; //# sourceMappingURL=biconomy.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/biconomy.js.map b/dist/src/libs/errorDecoder/handlers/biconomy.js.map index b3ad5051c..b170b18a7 100644 --- a/dist/src/libs/errorDecoder/handlers/biconomy.js.map +++ b/dist/src/libs/errorDecoder/handlers/biconomy.js.map @@ -1 +1 @@ -{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/biconomy.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,8BAA8B;IAC3B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,QAAQ,CAAA;IAChD,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACvE,MAAM,GAAG,eAAe,CAAA;SACzB;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,8BAA8B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { BICONOMY } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BiconomyEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === BICONOMY\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('400') || lowerCased.includes('internal error')) {\n reason = 'biconomy: 400'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BiconomyEstimationErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/biconomy.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,uDAAmD;AACnD,oCAAgE;AAEhE,MAAM,8BAA8B;IAC3B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,mBAAQ,CAAA;IAChD,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACvE,MAAM,GAAG,eAAe,CAAA;SACzB;QAED,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,kBAAe,8BAA8B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { BICONOMY } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BiconomyEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === BICONOMY\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('400') || lowerCased.includes('internal error')) {\n reason = 'biconomy: 400'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BiconomyEstimationErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.js b/dist/src/libs/errorDecoder/handlers/bundler.js index b52adee2d..8b3292f2a 100644 --- a/dist/src/libs/errorDecoder/handlers/bundler.js +++ b/dist/src/libs/errorDecoder/handlers/bundler.js @@ -1,5 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { ErrorType } from '../types'; +const types_1 = require("../types"); class BundlerErrorHandler { matches(data, error) { const { message } = error?.error || error || {}; @@ -35,11 +37,11 @@ class BundlerErrorHandler { } } return { - type: ErrorType.BundlerError, + type: types_1.ErrorType.BundlerError, reason, data: reason }; } } -export default BundlerErrorHandler; +exports.default = BundlerErrorHandler; //# sourceMappingURL=bundler.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/bundler.js.map b/dist/src/libs/errorDecoder/handlers/bundler.js.map index b2b339e1b..a84be5c15 100644 --- a/dist/src/libs/errorDecoder/handlers/bundler.js.map +++ b/dist/src/libs/errorDecoder/handlers/bundler.js.map @@ -1 +1 @@ -{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/bundler.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAE/C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACzE,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACpD,OAAO,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAChE,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE;YACxD,MAAM,GAAG,kCAAkC,CAAA;SAC5C;aAAM;YACL,MAAM,4BAA4B,GAChC,2DAA2D,CAAA;YAC7D,MAAM,4BAA4B,GAAG,kDAAkD,CAAA;YACvF,MAAM,0BAA0B,GAAG,yCAAyC,CAAA;YAC5E,MAAM,OAAO,GAAG;gBACd,4BAA4B;gBAC5B,4BAA4B;gBAC5B,0BAA0B;aAC3B,CAAA;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;gBACxB,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACvB,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;oBAC7C,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;oBACnC,kEAAkE;oBAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;oBAChD,MAAK;iBACN;aACF;SACF;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BundlerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error?.error || error || {}\n\n return (\n message.includes('UserOperation reverted during simulation with reason:') ||\n message.includes('pimlico_getUserOperationGasPrice') ||\n message.includes('UserOperation failed validation with reason:') ||\n message.includes('UserOperation reverted with reason:')\n )\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n let reason = ''\n\n if (message.includes('pimlico_getUserOperationGasPrice')) {\n reason = 'pimlico_getUserOperationGasPrice'\n } else {\n const userOperationSimulationRegex =\n /UserOperation reverted during simulation with reason:\\s*/i\n const userOperationValidationRegex = /UserOperation failed validation with reason:\\s*/i\n const userOperationRevertedRegex = /UserOperation reverted with reason:\\s*/i\n const regexes = [\n userOperationSimulationRegex,\n userOperationValidationRegex,\n userOperationRevertedRegex\n ]\n\n for (let i = 0; i < regexes.length; i++) {\n const regex = regexes[i]\n if (regex.test(message)) {\n const EntryPointErrorCode = /AA[0-9]{1,2}\\s?/\n reason = message.replace(regex, '')\n // Remove error codes like AA1, AA2, etc. and the space after them\n reason = reason.replace(EntryPointErrorCode, '')\n break\n }\n }\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BundlerErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/bundler.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,oCAAgE;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAE/C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACzE,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACpD,OAAO,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAChE,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE;YACxD,MAAM,GAAG,kCAAkC,CAAA;SAC5C;aAAM;YACL,MAAM,4BAA4B,GAChC,2DAA2D,CAAA;YAC7D,MAAM,4BAA4B,GAAG,kDAAkD,CAAA;YACvF,MAAM,0BAA0B,GAAG,yCAAyC,CAAA;YAC5E,MAAM,OAAO,GAAG;gBACd,4BAA4B;gBAC5B,4BAA4B;gBAC5B,0BAA0B;aAC3B,CAAA;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;gBACxB,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACvB,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;oBAC7C,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;oBACnC,kEAAkE;oBAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;oBAChD,MAAK;iBACN;aACF;SACF;QAED,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,kBAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass BundlerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error?.error || error || {}\n\n return (\n message.includes('UserOperation reverted during simulation with reason:') ||\n message.includes('pimlico_getUserOperationGasPrice') ||\n message.includes('UserOperation failed validation with reason:') ||\n message.includes('UserOperation reverted with reason:')\n )\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n let reason = ''\n\n if (message.includes('pimlico_getUserOperationGasPrice')) {\n reason = 'pimlico_getUserOperationGasPrice'\n } else {\n const userOperationSimulationRegex =\n /UserOperation reverted during simulation with reason:\\s*/i\n const userOperationValidationRegex = /UserOperation failed validation with reason:\\s*/i\n const userOperationRevertedRegex = /UserOperation reverted with reason:\\s*/i\n const regexes = [\n userOperationSimulationRegex,\n userOperationValidationRegex,\n userOperationRevertedRegex\n ]\n\n for (let i = 0; i < regexes.length; i++) {\n const regex = regexes[i]\n if (regex.test(message)) {\n const EntryPointErrorCode = /AA[0-9]{1,2}\\s?/\n reason = message.replace(regex, '')\n // Remove error codes like AA1, AA2, etc. and the space after them\n reason = reason.replace(EntryPointErrorCode, '')\n break\n }\n }\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default BundlerErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.js b/dist/src/libs/errorDecoder/handlers/custom.js index 4e65423c6..3c91b967f 100644 --- a/dist/src/libs/errorDecoder/handlers/custom.js +++ b/dist/src/libs/errorDecoder/handlers/custom.js @@ -1,17 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { ERROR_PREFIX, PANIC_ERROR_PREFIX } from '../constants'; -import { ErrorType } from '../types'; +const constants_1 = require("../constants"); +const types_1 = require("../types"); /** Handles custom errors thrown by contracts */ class CustomErrorHandler { matches(data) { return (!!data && data !== '0x' && - !data?.startsWith(ERROR_PREFIX) && - !data?.startsWith(PANIC_ERROR_PREFIX)); + !data?.startsWith(constants_1.ERROR_PREFIX) && + !data?.startsWith(constants_1.PANIC_ERROR_PREFIX)); } handle(data) { return { - type: ErrorType.CustomError, + type: types_1.ErrorType.CustomError, // Custom errors do not provide a specific reason. // Therefore, we return the raw data in hexadecimal format, // which can be used to map to a corresponding error message. @@ -20,5 +22,5 @@ class CustomErrorHandler { }; } } -export default CustomErrorHandler; +exports.default = CustomErrorHandler; //# sourceMappingURL=custom.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/custom.js.map b/dist/src/libs/errorDecoder/handlers/custom.js.map index 12eb3b6da..e81e663c3 100644 --- a/dist/src/libs/errorDecoder/handlers/custom.js.map +++ b/dist/src/libs/errorDecoder/handlers/custom.js.map @@ -1 +1 @@ -{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/custom.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,gDAAgD;AAChD,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,CACL,CAAC,CAAC,IAAI;YACN,IAAI,KAAK,IAAI;YACb,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;YAC/B,CAAC,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CACtC,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,WAAW;YAC3B,kDAAkD;YAClD,2DAA2D;YAC3D,6DAA6D;YAC7D,MAAM,EAAE,IAAI;YACZ,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\n/** Handles custom errors thrown by contracts */\nclass CustomErrorHandler implements ErrorHandler {\n public matches(data: string) {\n return (\n !!data &&\n data !== '0x' &&\n !data?.startsWith(ERROR_PREFIX) &&\n !data?.startsWith(PANIC_ERROR_PREFIX)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.CustomError,\n // Custom errors do not provide a specific reason.\n // Therefore, we return the raw data in hexadecimal format,\n // which can be used to map to a corresponding error message.\n reason: data,\n data\n }\n }\n}\n\nexport default CustomErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/custom.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,4CAA+D;AAC/D,oCAAgE;AAEhE,gDAAgD;AAChD,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,CACL,CAAC,CAAC,IAAI;YACN,IAAI,KAAK,IAAI;YACb,CAAC,IAAI,EAAE,UAAU,CAAC,wBAAY,CAAC;YAC/B,CAAC,IAAI,EAAE,UAAU,CAAC,8BAAkB,CAAC,CACtC,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,WAAW;YAC3B,kDAAkD;YAClD,2DAA2D;YAC3D,6DAA6D;YAC7D,MAAM,EAAE,IAAI;YACZ,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,kBAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\n/** Handles custom errors thrown by contracts */\nclass CustomErrorHandler implements ErrorHandler {\n public matches(data: string) {\n return (\n !!data &&\n data !== '0x' &&\n !data?.startsWith(ERROR_PREFIX) &&\n !data?.startsWith(PANIC_ERROR_PREFIX)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.CustomError,\n // Custom errors do not provide a specific reason.\n // Therefore, we return the raw data in hexadecimal format,\n // which can be used to map to a corresponding error message.\n reason: data,\n data\n }\n }\n}\n\nexport default CustomErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.js b/dist/src/libs/errorDecoder/handlers/index.js index 970fce2f5..a4430a288 100644 --- a/dist/src/libs/errorDecoder/handlers/index.js +++ b/dist/src/libs/errorDecoder/handlers/index.js @@ -1,10 +1,21 @@ -import BundlerErrorHandler from './bundler'; -import CustomErrorHandler from './custom'; -import InnerCallFailureHandler from './innerCallFailure'; -import PanicErrorHandler from './panic'; -import PaymasterErrorHandler from './paymaster'; -import RevertErrorHandler from './revert'; -import RpcErrorHandler from './rpc'; -import UserRejectionHandler from './userRejection'; -export { BundlerErrorHandler, RpcErrorHandler, InnerCallFailureHandler, PanicErrorHandler, RevertErrorHandler, PaymasterErrorHandler, UserRejectionHandler, CustomErrorHandler }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CustomErrorHandler = exports.UserRejectionHandler = exports.PaymasterErrorHandler = exports.RevertErrorHandler = exports.PanicErrorHandler = exports.InnerCallFailureHandler = exports.RpcErrorHandler = exports.BundlerErrorHandler = void 0; +const tslib_1 = require("tslib"); +const bundler_1 = tslib_1.__importDefault(require("./bundler")); +exports.BundlerErrorHandler = bundler_1.default; +const custom_1 = tslib_1.__importDefault(require("./custom")); +exports.CustomErrorHandler = custom_1.default; +const innerCallFailure_1 = tslib_1.__importDefault(require("./innerCallFailure")); +exports.InnerCallFailureHandler = innerCallFailure_1.default; +const panic_1 = tslib_1.__importDefault(require("./panic")); +exports.PanicErrorHandler = panic_1.default; +const paymaster_1 = tslib_1.__importDefault(require("./paymaster")); +exports.PaymasterErrorHandler = paymaster_1.default; +const revert_1 = tslib_1.__importDefault(require("./revert")); +exports.RevertErrorHandler = revert_1.default; +const rpc_1 = tslib_1.__importDefault(require("./rpc")); +exports.RpcErrorHandler = rpc_1.default; +const userRejection_1 = tslib_1.__importDefault(require("./userRejection")); +exports.UserRejectionHandler = userRejection_1.default; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/index.js.map b/dist/src/libs/errorDecoder/handlers/index.js.map index d7d9d7b2c..6c20e0540 100644 --- a/dist/src/libs/errorDecoder/handlers/index.js.map +++ b/dist/src/libs/errorDecoder/handlers/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,WAAW,CAAA;AAC3C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,uBAAuB,MAAM,oBAAoB,CAAA;AACxD,OAAO,iBAAiB,MAAM,SAAS,CAAA;AACvC,OAAO,qBAAqB,MAAM,aAAa,CAAA;AAC/C,OAAO,kBAAkB,MAAM,UAAU,CAAA;AACzC,OAAO,eAAe,MAAM,OAAO,CAAA;AACnC,OAAO,oBAAoB,MAAM,iBAAiB,CAAA;AAElD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,CAAA","sourcesContent":["import BundlerErrorHandler from './bundler'\nimport CustomErrorHandler from './custom'\nimport InnerCallFailureHandler from './innerCallFailure'\nimport PanicErrorHandler from './panic'\nimport PaymasterErrorHandler from './paymaster'\nimport RevertErrorHandler from './revert'\nimport RpcErrorHandler from './rpc'\nimport UserRejectionHandler from './userRejection'\n\nexport {\n BundlerErrorHandler,\n RpcErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler,\n CustomErrorHandler\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/index.ts"],"names":[],"mappings":";;;;AAAA,gEAA2C;AAUzC,8BAVK,iBAAmB,CAUL;AATrB,8DAAyC;AAgBvC,6BAhBK,gBAAkB,CAgBL;AAfpB,kFAAwD;AAUtD,kCAVK,0BAAuB,CAUL;AATzB,4DAAuC;AAUrC,4BAVK,eAAiB,CAUL;AATnB,oEAA+C;AAW7C,gCAXK,mBAAqB,CAWL;AAVvB,8DAAyC;AASvC,6BATK,gBAAkB,CASL;AARpB,wDAAmC;AAKjC,0BALK,aAAe,CAKL;AAJjB,4EAAkD;AAShD,+BATK,uBAAoB,CASL","sourcesContent":["import BundlerErrorHandler from './bundler'\nimport CustomErrorHandler from './custom'\nimport InnerCallFailureHandler from './innerCallFailure'\nimport PanicErrorHandler from './panic'\nimport PaymasterErrorHandler from './paymaster'\nimport RevertErrorHandler from './revert'\nimport RpcErrorHandler from './rpc'\nimport UserRejectionHandler from './userRejection'\n\nexport {\n BundlerErrorHandler,\n RpcErrorHandler,\n InnerCallFailureHandler,\n PanicErrorHandler,\n RevertErrorHandler,\n PaymasterErrorHandler,\n UserRejectionHandler,\n CustomErrorHandler\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js index c6acadaed..f7ef598cc 100644 --- a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js @@ -1,6 +1,8 @@ -import { ErrorType } from '../types'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const types_1 = require("../types"); class InnerCallFailureHandler { - type = ErrorType.InnerCallFailureError; + type = types_1.ErrorType.InnerCallFailureError; matches(data, error) { return error.name === 'InnerCallFailureError'; } @@ -41,5 +43,5 @@ class InnerCallFailureHandler { }; } } -export default InnerCallFailureHandler; +exports.default = InnerCallFailureHandler; //# sourceMappingURL=innerCallFailure.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map index 35f30511e..8504cfe07 100644 --- a/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map +++ b/dist/src/libs/errorDecoder/handlers/innerCallFailure.js.map @@ -1 +1 @@ -{"version":3,"file":"innerCallFailure.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/innerCallFailure.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,uBAAuB;IAC3B,IAAI,GAAG,SAAS,CAAC,qBAAqB,CAAA;IAE/B,OAAO,CAAC,IAAY,EAAE,KAAY;QACvC,OAAO,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,cAAc,GAAG,KAA8B,CAAA;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,KAAK,IAAI,CAAA;QAEjD,6CAA6C;QAC7C,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAA;YACrC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,mEAAmE;QACnE,+DAA+D;QAC/D,IAAI,cAAc,CAAC,oBAAoB,KAAK,SAAS,EAAE;YACrD,MAAM,MAAM,GAAG,gBAAgB,CAAA;YAC/B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,MAAM,8BAA8B,GAAG,WAAW,GAAG,cAAc,CAAC,oBAAqB,CAAA;QACzF,MAAM,MAAM,GAAG,8BAA8B;YAC3C,CAAC,CAAC,gBAAgB,cAAc,CAAC,OAAO,CAAC,iBAAiB,wBAAwB;YAClF,CAAC,CAAC,gBAAgB,CAAA;QAEpB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,uBAAuB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { InnerCallFailureError } from '../customErrors'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass InnerCallFailureHandler implements ErrorHandler {\n type = ErrorType.InnerCallFailureError\n\n public matches(data: string, error: Error) {\n return error.name === 'InnerCallFailureError'\n }\n\n public handle(data: string, error: Error): DecodedError {\n const innerCallError = error as InnerCallFailureError\n const isError0x = innerCallError.message === '0x'\n\n // if an error has been found, report it back\n if (!isError0x) {\n const reason = innerCallError.message\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n // if the error is 0x but we don't have info on the portfolio value\n // because of an RPC failure or something, return error unknown\n if (innerCallError.nativePortfolioValue === undefined) {\n const reason = 'Inner call: 0x'\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n let callsNative = 0n\n innerCallError.calls.forEach((call) => {\n callsNative += call.value ?? 0n\n })\n const isCallsNativeMoreThanPortfolio = callsNative > innerCallError.nativePortfolioValue!\n const reason = isCallsNativeMoreThanPortfolio\n ? `Insufficient ${innerCallError.network.nativeAssetSymbol} for transaction calls`\n : 'Inner call: 0x'\n\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n}\n\nexport default InnerCallFailureHandler\n"]} \ No newline at end of file +{"version":3,"file":"innerCallFailure.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/innerCallFailure.ts"],"names":[],"mappings":";;AAEA,oCAAgE;AAEhE,MAAM,uBAAuB;IAC3B,IAAI,GAAG,iBAAS,CAAC,qBAAqB,CAAA;IAE/B,OAAO,CAAC,IAAY,EAAE,KAAY;QACvC,OAAO,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,cAAc,GAAG,KAA8B,CAAA;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,KAAK,IAAI,CAAA;QAEjD,6CAA6C;QAC7C,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAA;YACrC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,mEAAmE;QACnE,+DAA+D;QAC/D,IAAI,cAAc,CAAC,oBAAoB,KAAK,SAAS,EAAE;YACrD,MAAM,MAAM,GAAG,gBAAgB,CAAA;YAC/B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,IAAI,EAAE,MAAM;aACb,CAAA;SACF;QAED,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,MAAM,8BAA8B,GAAG,WAAW,GAAG,cAAc,CAAC,oBAAqB,CAAA;QACzF,MAAM,MAAM,GAAG,8BAA8B;YAC3C,CAAC,CAAC,gBAAgB,cAAc,CAAC,OAAO,CAAC,iBAAiB,wBAAwB;YAClF,CAAC,CAAC,gBAAgB,CAAA;QAEpB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,kBAAe,uBAAuB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { InnerCallFailureError } from '../customErrors'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass InnerCallFailureHandler implements ErrorHandler {\n type = ErrorType.InnerCallFailureError\n\n public matches(data: string, error: Error) {\n return error.name === 'InnerCallFailureError'\n }\n\n public handle(data: string, error: Error): DecodedError {\n const innerCallError = error as InnerCallFailureError\n const isError0x = innerCallError.message === '0x'\n\n // if an error has been found, report it back\n if (!isError0x) {\n const reason = innerCallError.message\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n // if the error is 0x but we don't have info on the portfolio value\n // because of an RPC failure or something, return error unknown\n if (innerCallError.nativePortfolioValue === undefined) {\n const reason = 'Inner call: 0x'\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n\n let callsNative = 0n\n innerCallError.calls.forEach((call) => {\n callsNative += call.value ?? 0n\n })\n const isCallsNativeMoreThanPortfolio = callsNative > innerCallError.nativePortfolioValue!\n const reason = isCallsNativeMoreThanPortfolio\n ? `Insufficient ${innerCallError.network.nativeAssetSymbol} for transaction calls`\n : 'Inner call: 0x'\n\n return {\n type: this.type,\n reason,\n data: reason\n }\n }\n}\n\nexport default InnerCallFailureHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.js b/dist/src/libs/errorDecoder/handlers/panic.js index fe9088ef5..dd4efa28f 100644 --- a/dist/src/libs/errorDecoder/handlers/panic.js +++ b/dist/src/libs/errorDecoder/handlers/panic.js @@ -1,21 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { AbiCoder, ErrorFragment } from 'ethers'; -import { PANIC_ERROR_PREFIX } from '../constants'; -import { panicErrorCodeToReason } from '../helpers'; -import { ErrorType } from '../types'; +const ethers_1 = require("ethers"); +const constants_1 = require("../constants"); +const helpers_1 = require("../helpers"); +const types_1 = require("../types"); class PanicErrorHandler { matches(data) { - return data?.startsWith(PANIC_ERROR_PREFIX); + return data?.startsWith(constants_1.PANIC_ERROR_PREFIX); } handle(data) { - const encodedReason = data.slice(PANIC_ERROR_PREFIX.length); - const abi = new AbiCoder(); + const encodedReason = data.slice(constants_1.PANIC_ERROR_PREFIX.length); + const abi = new ethers_1.AbiCoder(); try { - const fragment = ErrorFragment.from('Panic(uint256)'); + const fragment = ethers_1.ErrorFragment.from('Panic(uint256)'); const args = abi.decode(fragment.inputs, `0x${encodedReason}`); - const reason = panicErrorCodeToReason(args[0]) ?? 'Unknown panic code'; + const reason = (0, helpers_1.panicErrorCodeToReason)(args[0]) ?? 'Unknown panic code'; return { - type: ErrorType.PanicError, + type: types_1.ErrorType.PanicError, reason, data }; @@ -23,12 +25,12 @@ class PanicErrorHandler { catch (e) { console.error('Failed to decode panic error', e); return { - type: ErrorType.PanicError, + type: types_1.ErrorType.PanicError, reason: 'Failed to decode panic error', data }; } } } -export default PanicErrorHandler; +exports.default = PanicErrorHandler; //# sourceMappingURL=panic.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/panic.js.map b/dist/src/libs/errorDecoder/handlers/panic.js.map index 4583a208c..dd8e5cd86 100644 --- a/dist/src/libs/errorDecoder/handlers/panic.js.map +++ b/dist/src/libs/errorDecoder/handlers/panic.js.map @@ -1 +1 @@ -{"version":3,"file":"panic.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/panic.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,iBAAiB;IACd,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC7C,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC,IAAI,oBAAoB,CAAA;YAEhF,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,UAAU;gBAC1B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;YAChD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,UAAU;gBAC1B,MAAM,EAAE,8BAA8B;gBACtC,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { PANIC_ERROR_PREFIX } from '../constants'\nimport { panicErrorCodeToReason } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PanicErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(PANIC_ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(PANIC_ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Panic(uint256)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = panicErrorCodeToReason(args[0] as bigint) ?? 'Unknown panic code'\n\n return {\n type: ErrorType.PanicError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode panic error', e)\n return {\n type: ErrorType.PanicError,\n reason: 'Failed to decode panic error',\n data\n }\n }\n }\n}\n\nexport default PanicErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"panic.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/panic.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,mCAAgD;AAEhD,4CAAiD;AACjD,wCAAmD;AACnD,oCAAgE;AAEhE,MAAM,iBAAiB;IACd,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,8BAAkB,CAAC,CAAA;IAC7C,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,8BAAkB,CAAC,MAAM,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,IAAI,iBAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,sBAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAA,gCAAsB,EAAC,IAAI,CAAC,CAAC,CAAW,CAAC,IAAI,oBAAoB,CAAA;YAEhF,OAAO;gBACL,IAAI,EAAE,iBAAS,CAAC,UAAU;gBAC1B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;YAChD,OAAO;gBACL,IAAI,EAAE,iBAAS,CAAC,UAAU;gBAC1B,MAAM,EAAE,8BAA8B;gBACtC,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { PANIC_ERROR_PREFIX } from '../constants'\nimport { panicErrorCodeToReason } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PanicErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(PANIC_ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(PANIC_ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Panic(uint256)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = panicErrorCodeToReason(args[0] as bigint) ?? 'Unknown panic code'\n\n return {\n type: ErrorType.PanicError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode panic error', e)\n return {\n type: ErrorType.PanicError,\n reason: 'Failed to decode panic error',\n data\n }\n }\n }\n}\n\nexport default PanicErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.js b/dist/src/libs/errorDecoder/handlers/paymaster.js index 74cefb46c..7e5971a5c 100644 --- a/dist/src/libs/errorDecoder/handlers/paymaster.js +++ b/dist/src/libs/errorDecoder/handlers/paymaster.js @@ -1,5 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { ErrorType } from '../types'; +const types_1 = require("../types"); class PaymasterErrorHandler { matches(data, error) { const { name } = error; @@ -8,11 +10,11 @@ class PaymasterErrorHandler { handle(data, error) { const { message: reason } = error; return { - type: ErrorType.PaymasterError, + type: types_1.ErrorType.PaymasterError, reason, data: '' }; } } -export default PaymasterErrorHandler; +exports.default = PaymasterErrorHandler; //# sourceMappingURL=paymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/paymaster.js.map b/dist/src/libs/errorDecoder/handlers/paymaster.js.map index 1ae1eb3f9..05998e30d 100644 --- a/dist/src/libs/errorDecoder/handlers/paymaster.js.map +++ b/dist/src/libs/errorDecoder/handlers/paymaster.js.map @@ -1 +1 @@ -{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/paymaster.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,qBAAqB;IAClB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAEtB,OAAO,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,2BAA2B,CAAA;IAC1E,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;QAEjC,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,cAAc;YAC9B,MAAM;YACN,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;CACF;AAED,eAAe,qBAAqB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PaymasterErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { name } = error\n\n return name === 'PaymasterError' || name === 'PaymasterSponsorshipError'\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message: reason } = error\n\n return {\n type: ErrorType.PaymasterError,\n reason,\n data: ''\n }\n }\n}\n\nexport default PaymasterErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/paymaster.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,oCAAgE;AAEhE,MAAM,qBAAqB;IAClB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAEtB,OAAO,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,2BAA2B,CAAA;IAC1E,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;QAEjC,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,cAAc;YAC9B,MAAM;YACN,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;CACF;AAED,kBAAe,qBAAqB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PaymasterErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { name } = error\n\n return name === 'PaymasterError' || name === 'PaymasterSponsorshipError'\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message: reason } = error\n\n return {\n type: ErrorType.PaymasterError,\n reason,\n data: ''\n }\n }\n}\n\nexport default PaymasterErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.js b/dist/src/libs/errorDecoder/handlers/pimlico.js index 5b2648ef4..3893412cf 100644 --- a/dist/src/libs/errorDecoder/handlers/pimlico.js +++ b/dist/src/libs/errorDecoder/handlers/pimlico.js @@ -1,10 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { PIMLICO } from '../../../consts/bundlers'; -import { ErrorType } from '../types'; +const bundlers_1 = require("../../../consts/bundlers"); +const types_1 = require("../types"); class PimlicoEstimationErrorHandler { matches(data, error) { const { bundlerName } = error; - return bundlerName && bundlerName === PIMLICO; + return bundlerName && bundlerName === bundlers_1.PIMLICO; } handle(data, error) { const { message } = error?.error || error || {}; @@ -15,11 +17,11 @@ class PimlicoEstimationErrorHandler { reason = 'pimlico: 500'; } return { - type: ErrorType.BundlerError, + type: types_1.ErrorType.BundlerError, reason, data: reason }; } } -export default PimlicoEstimationErrorHandler; +exports.default = PimlicoEstimationErrorHandler; //# sourceMappingURL=pimlico.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/pimlico.js.map b/dist/src/libs/errorDecoder/handlers/pimlico.js.map index eb0f0a97b..4283e2de9 100644 --- a/dist/src/libs/errorDecoder/handlers/pimlico.js.map +++ b/dist/src/libs/errorDecoder/handlers/pimlico.js.map @@ -1 +1 @@ -{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/pimlico.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,6BAA6B;IAC1B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,OAAO,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACzC,MAAM,GAAG,cAAc,CAAA;SACxB;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,eAAe,6BAA6B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { PIMLICO } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PimlicoEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === PIMLICO\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('internal error')) {\n reason = 'pimlico: 500'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default PimlicoEstimationErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/pimlico.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,uDAAkD;AAClD,oCAAgE;AAEhE,MAAM,6BAA6B;IAC1B,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QAE7B,OAAO,WAAW,IAAI,WAAW,KAAK,kBAAO,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAExC,qCAAqC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACzC,MAAM,GAAG,cAAc,CAAA;SACxB;QAED,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,MAAM;SACb,CAAA;IACH,CAAC;CACF;AAED,kBAAe,6BAA6B,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { PIMLICO } from '../../../consts/bundlers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass PimlicoEstimationErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { bundlerName } = error\n\n return bundlerName && bundlerName === PIMLICO\n }\n\n public handle(data: string, error: any): DecodedError {\n const { message } = error?.error || error || {}\n const lowerCased = message.toLowerCase()\n\n // TODO: expand with more error cases\n let reason = ''\n if (lowerCased.includes('internal error')) {\n reason = 'pimlico: 500'\n }\n\n return {\n type: ErrorType.BundlerError,\n reason,\n data: reason\n }\n }\n}\n\nexport default PimlicoEstimationErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.js b/dist/src/libs/errorDecoder/handlers/relayer.js index 2b527e1f5..256805fb9 100644 --- a/dist/src/libs/errorDecoder/handlers/relayer.js +++ b/dist/src/libs/errorDecoder/handlers/relayer.js @@ -1,20 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { RELAYER_DOWN_MESSAGE, RelayerError } from '../../relayerCall/relayerCall'; -import { isReasonValid } from '../helpers'; -import { ErrorType } from '../types'; +const relayerCall_1 = require("../../relayerCall/relayerCall"); +const helpers_1 = require("../helpers"); +const types_1 = require("../types"); class RelayerErrorHandler { matches(data, error) { const { message } = error || {}; - if (message === RELAYER_DOWN_MESSAGE) + if (message === relayerCall_1.RELAYER_DOWN_MESSAGE) return true; - return error instanceof RelayerError; + return error instanceof relayerCall_1.RelayerError; } handle(data, error) { let reason = ''; let finalData = ''; - if (error.message === RELAYER_DOWN_MESSAGE) { + if (error.message === relayerCall_1.RELAYER_DOWN_MESSAGE) { // Relayer is down - reason = RELAYER_DOWN_MESSAGE; + reason = relayerCall_1.RELAYER_DOWN_MESSAGE; } else { // RPC error returned as string @@ -22,16 +24,16 @@ class RelayerErrorHandler { finalData = error.message.match(/data="([^"]*)"/)?.[1] || ''; // The response isn't a stringified RPC error so the // reason is likely the error message - if (!isReasonValid(reason) && !finalData) { + if (!(0, helpers_1.isReasonValid)(reason) && !finalData) { reason = error.message; } } return { - type: ErrorType.RelayerError, + type: types_1.ErrorType.RelayerError, reason, data: finalData }; } } -export default RelayerErrorHandler; +exports.default = RelayerErrorHandler; //# sourceMappingURL=relayer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/relayer.js.map b/dist/src/libs/errorDecoder/handlers/relayer.js.map index 58d935bf7..061a0e46b 100644 --- a/dist/src/libs/errorDecoder/handlers/relayer.js.map +++ b/dist/src/libs/errorDecoder/handlers/relayer.js.map @@ -1 +1 @@ -{"version":3,"file":"relayer.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/relayer.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QAE/B,IAAI,OAAO,KAAK,oBAAoB;YAAE,OAAO,IAAI,CAAA;QAEjD,OAAO,KAAK,YAAY,YAAY,CAAA;IACtC,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,SAAS,GAAG,EAAE,CAAA;QAElB,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,EAAE;YAC1C,kBAAkB;YAClB,MAAM,GAAG,oBAAoB,CAAA;SAC9B;aAAM;YACL,+BAA+B;YAC/B,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC3D,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAE5D,oDAAoD;YACpD,qCAAqC;YACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;gBACxC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;aACvB;SACF;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,SAAS;SAChB,CAAA;IACH,CAAC;CACF;AAED,eAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { RELAYER_DOWN_MESSAGE, RelayerError } from '../../relayerCall/relayerCall'\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RelayerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error || {}\n\n if (message === RELAYER_DOWN_MESSAGE) return true\n\n return error instanceof RelayerError\n }\n\n public handle(data: string, error: any): DecodedError {\n let reason = ''\n let finalData = ''\n\n if (error.message === RELAYER_DOWN_MESSAGE) {\n // Relayer is down\n reason = RELAYER_DOWN_MESSAGE\n } else {\n // RPC error returned as string\n reason = error.message.match(/reason=\"([^\"]*)\"/)?.[1] || ''\n finalData = error.message.match(/data=\"([^\"]*)\"/)?.[1] || ''\n\n // The response isn't a stringified RPC error so the\n // reason is likely the error message\n if (!isReasonValid(reason) && !finalData) {\n reason = error.message\n }\n }\n\n return {\n type: ErrorType.RelayerError,\n reason,\n data: finalData\n }\n }\n}\n\nexport default RelayerErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"relayer.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/relayer.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,+DAAkF;AAClF,wCAA0C;AAC1C,oCAAgE;AAEhE,MAAM,mBAAmB;IAChB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QAE/B,IAAI,OAAO,KAAK,kCAAoB;YAAE,OAAO,IAAI,CAAA;QAEjD,OAAO,KAAK,YAAY,0BAAY,CAAA;IACtC,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAU;QACpC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,SAAS,GAAG,EAAE,CAAA;QAElB,IAAI,KAAK,CAAC,OAAO,KAAK,kCAAoB,EAAE;YAC1C,kBAAkB;YAClB,MAAM,GAAG,kCAAoB,CAAA;SAC9B;aAAM;YACL,+BAA+B;YAC/B,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC3D,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAE5D,oDAAoD;YACpD,qCAAqC;YACrC,IAAI,CAAC,IAAA,uBAAa,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;gBACxC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;aACvB;SACF;QAED,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,YAAY;YAC5B,MAAM;YACN,IAAI,EAAE,SAAS;SAChB,CAAA;IACH,CAAC;CACF;AAED,kBAAe,mBAAmB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { RELAYER_DOWN_MESSAGE, RelayerError } from '../../relayerCall/relayerCall'\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RelayerErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n const { message } = error || {}\n\n if (message === RELAYER_DOWN_MESSAGE) return true\n\n return error instanceof RelayerError\n }\n\n public handle(data: string, error: any): DecodedError {\n let reason = ''\n let finalData = ''\n\n if (error.message === RELAYER_DOWN_MESSAGE) {\n // Relayer is down\n reason = RELAYER_DOWN_MESSAGE\n } else {\n // RPC error returned as string\n reason = error.message.match(/reason=\"([^\"]*)\"/)?.[1] || ''\n finalData = error.message.match(/data=\"([^\"]*)\"/)?.[1] || ''\n\n // The response isn't a stringified RPC error so the\n // reason is likely the error message\n if (!isReasonValid(reason) && !finalData) {\n reason = error.message\n }\n }\n\n return {\n type: ErrorType.RelayerError,\n reason,\n data: finalData\n }\n }\n}\n\nexport default RelayerErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.js b/dist/src/libs/errorDecoder/handlers/revert.js index 9763d52b4..809a9a9ca 100644 --- a/dist/src/libs/errorDecoder/handlers/revert.js +++ b/dist/src/libs/errorDecoder/handlers/revert.js @@ -1,20 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable class-methods-use-this */ -import { AbiCoder, ErrorFragment } from 'ethers'; -import { ERROR_PREFIX } from '../constants'; -import { ErrorType } from '../types'; +const ethers_1 = require("ethers"); +const constants_1 = require("../constants"); +const types_1 = require("../types"); class RevertErrorHandler { matches(data) { - return data?.startsWith(ERROR_PREFIX); + return data?.startsWith(constants_1.ERROR_PREFIX); } handle(data) { - const encodedReason = data.slice(ERROR_PREFIX.length); - const abi = new AbiCoder(); + const encodedReason = data.slice(constants_1.ERROR_PREFIX.length); + const abi = new ethers_1.AbiCoder(); try { - const fragment = ErrorFragment.from('Error(string)'); + const fragment = ethers_1.ErrorFragment.from('Error(string)'); const args = abi.decode(fragment.inputs, `0x${encodedReason}`); const reason = args[0]; return { - type: ErrorType.RevertError, + type: types_1.ErrorType.RevertError, reason, data }; @@ -22,12 +24,12 @@ class RevertErrorHandler { catch (e) { console.error('Failed to decode revert error', e); return { - type: ErrorType.RevertError, + type: types_1.ErrorType.RevertError, reason: '', data }; } } } -export default RevertErrorHandler; +exports.default = RevertErrorHandler; //# sourceMappingURL=revert.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/revert.js.map b/dist/src/libs/errorDecoder/handlers/revert.js.map index b99bedbe9..f17ac52bc 100644 --- a/dist/src/libs/errorDecoder/handlers/revert.js.map +++ b/dist/src/libs/errorDecoder/handlers/revert.js.map @@ -1 +1 @@ -{"version":3,"file":"revert.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/revert.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YAEhC,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,WAAW;gBAC3B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,WAAW;gBAC3B,MAAM,EAAE,EAAE;gBACV,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,eAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RevertErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Error(string)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = args[0] as string\n\n return {\n type: ErrorType.RevertError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode revert error', e)\n\n return {\n type: ErrorType.RevertError,\n reason: '',\n data\n }\n }\n }\n}\n\nexport default RevertErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"revert.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/revert.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAC3C,mCAAgD;AAEhD,4CAA2C;AAC3C,oCAAgE;AAEhE,MAAM,kBAAkB;IACf,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,EAAE,UAAU,CAAC,wBAAY,CAAC,CAAA;IACvC,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAY,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,IAAI,iBAAQ,EAAE,CAAA;QAC1B,IAAI;YACF,MAAM,QAAQ,GAAG,sBAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YAEhC,OAAO;gBACL,IAAI,EAAE,iBAAS,CAAC,WAAW;gBAC3B,MAAM;gBACN,IAAI;aACL,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO;gBACL,IAAI,EAAE,iBAAS,CAAC,WAAW;gBAC3B,MAAM,EAAE,EAAE;gBACV,IAAI;aACL,CAAA;SACF;IACH,CAAC;CACF;AAED,kBAAe,kBAAkB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { AbiCoder, ErrorFragment } from 'ethers'\n\nimport { ERROR_PREFIX } from '../constants'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nclass RevertErrorHandler implements ErrorHandler {\n public matches(data: string): boolean {\n return data?.startsWith(ERROR_PREFIX)\n }\n\n public handle(data: string): DecodedError {\n const encodedReason = data.slice(ERROR_PREFIX.length)\n const abi = new AbiCoder()\n try {\n const fragment = ErrorFragment.from('Error(string)')\n const args = abi.decode(fragment.inputs, `0x${encodedReason}`)\n const reason = args[0] as string\n\n return {\n type: ErrorType.RevertError,\n reason,\n data\n }\n } catch (e) {\n console.error('Failed to decode revert error', e)\n\n return {\n type: ErrorType.RevertError,\n reason: '',\n data\n }\n }\n }\n}\n\nexport default RevertErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.js b/dist/src/libs/errorDecoder/handlers/rpc.js index 801f81c00..29a937e2f 100644 --- a/dist/src/libs/errorDecoder/handlers/rpc.js +++ b/dist/src/libs/errorDecoder/handlers/rpc.js @@ -1,22 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RPC_HARDCODED_ERRORS = void 0; /* eslint-disable class-methods-use-this */ -import { isReasonValid } from '../helpers'; -import { ErrorType } from '../types'; -import { USER_REJECTED_TRANSACTION_ERROR_CODE } from './userRejection'; -export const RPC_HARDCODED_ERRORS = { +const helpers_1 = require("../helpers"); +const types_1 = require("../types"); +const userRejection_1 = require("./userRejection"); +exports.RPC_HARDCODED_ERRORS = { rpcTimeout: 'rpc-timeout' }; class RpcErrorHandler { matches(data, error) { // This is the only case in which we want to check for a specific error message // because it's a custom error that should be handled as an RPC error - if (error?.message === RPC_HARDCODED_ERRORS.rpcTimeout) + if (error?.message === exports.RPC_HARDCODED_ERRORS.rpcTimeout) return true; return (!data && !!error.message && !error?.message?.includes('rejected transaction') && // eslint-disable-next-line @typescript-eslint/no-explicit-any error?.code !== undefined && - error.code !== USER_REJECTED_TRANSACTION_ERROR_CODE); + error.code !== userRejection_1.USER_REJECTED_TRANSACTION_ERROR_CODE); } handle(data, error) { const rpcError = error; @@ -29,13 +32,13 @@ class RpcErrorHandler { rpcError.info?.error?.message, rpcError.error?.message ]; - const reason = possibleReasons.find((r) => !!r && isReasonValid(r)) || ''; + const reason = possibleReasons.find((r) => !!r && (0, helpers_1.isReasonValid)(r)) || ''; return { - type: ErrorType.RpcError, + type: types_1.ErrorType.RpcError, reason, data }; } } -export default RpcErrorHandler; +exports.default = RpcErrorHandler; //# sourceMappingURL=rpc.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/rpc.js.map b/dist/src/libs/errorDecoder/handlers/rpc.js.map index 77d82b1f8..b85b7eb61 100644 --- a/dist/src/libs/errorDecoder/handlers/rpc.js.map +++ b/dist/src/libs/errorDecoder/handlers/rpc.js.map @@ -1 +1 @@ -{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/rpc.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAChE,OAAO,EAAE,oCAAoC,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,aAAa;CAC1B,CAAA;AAED,MAAM,eAAe;IACZ,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,+EAA+E;QAC/E,qEAAqE;QACrE,IAAI,KAAK,EAAE,OAAO,KAAK,oBAAoB,CAAC,UAAU;YAAE,OAAO,IAAI,CAAA;QAEnE,OAAO,CACL,CAAC,IAAI;YACL,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;YACjD,8DAA8D;YAC9D,KAAK,EAAE,IAAI,KAAK,SAAS;YACzB,KAAK,CAAC,IAAI,KAAK,oCAAoC,CACpD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,QAAQ,GAAG,KAAY,CAAA;QAC7B,8EAA8E;QAC9E,0FAA0F;QAC1F,MAAM,eAAe,GAAG;YACtB,QAAQ,CAAC,IAAI;YACb,QAAQ,CAAC,YAAY;YACrB,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;YAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO;SACxB,CAAA;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAEzE,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,QAAQ;YACxB,MAAM;YACN,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,eAAe,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\nimport { USER_REJECTED_TRANSACTION_ERROR_CODE } from './userRejection'\n\nexport const RPC_HARDCODED_ERRORS = {\n rpcTimeout: 'rpc-timeout'\n}\n\nclass RpcErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n // This is the only case in which we want to check for a specific error message\n // because it's a custom error that should be handled as an RPC error\n if (error?.message === RPC_HARDCODED_ERRORS.rpcTimeout) return true\n\n return (\n !data &&\n !!error.message &&\n !error?.message?.includes('rejected transaction') &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error?.code !== undefined &&\n error.code !== USER_REJECTED_TRANSACTION_ERROR_CODE\n )\n }\n\n public handle(data: string, error: Error): DecodedError {\n const rpcError = error as any\n // The order is important here, we want to prioritize the most relevant reason\n // Also, we do it this way as the reason can be in different places depending on the error\n const possibleReasons = [\n rpcError.code,\n rpcError.shortMessage,\n rpcError.message,\n rpcError.info?.error?.message,\n rpcError.error?.message\n ]\n\n const reason = possibleReasons.find((r) => !!r && isReasonValid(r)) || ''\n\n return {\n type: ErrorType.RpcError,\n reason,\n data\n }\n }\n}\n\nexport default RpcErrorHandler\n"]} \ No newline at end of file +{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/rpc.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,wCAA0C;AAC1C,oCAAgE;AAChE,mDAAsE;AAEzD,QAAA,oBAAoB,GAAG;IAClC,UAAU,EAAE,aAAa;CAC1B,CAAA;AAED,MAAM,eAAe;IACZ,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,+EAA+E;QAC/E,qEAAqE;QACrE,IAAI,KAAK,EAAE,OAAO,KAAK,4BAAoB,CAAC,UAAU;YAAE,OAAO,IAAI,CAAA;QAEnE,OAAO,CACL,CAAC,IAAI;YACL,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;YACjD,8DAA8D;YAC9D,KAAK,EAAE,IAAI,KAAK,SAAS;YACzB,KAAK,CAAC,IAAI,KAAK,oDAAoC,CACpD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,KAAY;QACtC,MAAM,QAAQ,GAAG,KAAY,CAAA;QAC7B,8EAA8E;QAC9E,0FAA0F;QAC1F,MAAM,eAAe,GAAG;YACtB,QAAQ,CAAC,IAAI;YACb,QAAQ,CAAC,YAAY;YACrB,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;YAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO;SACxB,CAAA;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAA,uBAAa,EAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAEzE,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,QAAQ;YACxB,MAAM;YACN,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,kBAAe,eAAe,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { isReasonValid } from '../helpers'\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\nimport { USER_REJECTED_TRANSACTION_ERROR_CODE } from './userRejection'\n\nexport const RPC_HARDCODED_ERRORS = {\n rpcTimeout: 'rpc-timeout'\n}\n\nclass RpcErrorHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n // This is the only case in which we want to check for a specific error message\n // because it's a custom error that should be handled as an RPC error\n if (error?.message === RPC_HARDCODED_ERRORS.rpcTimeout) return true\n\n return (\n !data &&\n !!error.message &&\n !error?.message?.includes('rejected transaction') &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error?.code !== undefined &&\n error.code !== USER_REJECTED_TRANSACTION_ERROR_CODE\n )\n }\n\n public handle(data: string, error: Error): DecodedError {\n const rpcError = error as any\n // The order is important here, we want to prioritize the most relevant reason\n // Also, we do it this way as the reason can be in different places depending on the error\n const possibleReasons = [\n rpcError.code,\n rpcError.shortMessage,\n rpcError.message,\n rpcError.info?.error?.message,\n rpcError.error?.message\n ]\n\n const reason = possibleReasons.find((r) => !!r && isReasonValid(r)) || ''\n\n return {\n type: ErrorType.RpcError,\n reason,\n data\n }\n }\n}\n\nexport default RpcErrorHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.js b/dist/src/libs/errorDecoder/handlers/userRejection.js index bc8d868cd..fcde7a9e0 100644 --- a/dist/src/libs/errorDecoder/handlers/userRejection.js +++ b/dist/src/libs/errorDecoder/handlers/userRejection.js @@ -1,20 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TRANSACTION_REJECTED_REASON = exports.USER_REJECTED_TRANSACTION_ERROR_CODE = void 0; /* eslint-disable class-methods-use-this */ -import { ErrorType } from '../types'; -export const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001; -export const TRANSACTION_REJECTED_REASON = 'transaction-rejected'; +const types_1 = require("../types"); +exports.USER_REJECTED_TRANSACTION_ERROR_CODE = 4001; +exports.TRANSACTION_REJECTED_REASON = 'transaction-rejected'; class UserRejectionHandler { matches(data, error) { return (!data && (error?.message?.includes('rejected transaction') || - error?.code === USER_REJECTED_TRANSACTION_ERROR_CODE)); + error?.code === exports.USER_REJECTED_TRANSACTION_ERROR_CODE)); } handle(data) { return { - type: ErrorType.UserRejectionError, - reason: TRANSACTION_REJECTED_REASON, + type: types_1.ErrorType.UserRejectionError, + reason: exports.TRANSACTION_REJECTED_REASON, data }; } } -export default UserRejectionHandler; +exports.default = UserRejectionHandler; //# sourceMappingURL=userRejection.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/handlers/userRejection.js.map b/dist/src/libs/errorDecoder/handlers/userRejection.js.map index 0e4f3c243..fb63e98df 100644 --- a/dist/src/libs/errorDecoder/handlers/userRejection.js.map +++ b/dist/src/libs/errorDecoder/handlers/userRejection.js.map @@ -1 +1 @@ -{"version":3,"file":"userRejection.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/userRejection.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhE,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAA;AACxD,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAAA;AAEjE,MAAM,oBAAoB;IACjB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,OAAO,CACL,CAAC,IAAI;YACL,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;gBAC/C,KAAK,EAAE,IAAI,KAAK,oCAAoC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,kBAAkB;YAClC,MAAM,EAAE,2BAA2B;YACnC,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,eAAe,oBAAoB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nexport const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001\nexport const TRANSACTION_REJECTED_REASON = 'transaction-rejected'\n\nclass UserRejectionHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n return (\n !data &&\n (error?.message?.includes('rejected transaction') ||\n error?.code === USER_REJECTED_TRANSACTION_ERROR_CODE)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.UserRejectionError,\n reason: TRANSACTION_REJECTED_REASON,\n data\n }\n }\n}\n\nexport default UserRejectionHandler\n"]} \ No newline at end of file +{"version":3,"file":"userRejection.js","sourceRoot":"","sources":["../../../../../src/libs/errorDecoder/handlers/userRejection.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,oCAAgE;AAEnD,QAAA,oCAAoC,GAAG,IAAI,CAAA;AAC3C,QAAA,2BAA2B,GAAG,sBAAsB,CAAA;AAEjE,MAAM,oBAAoB;IACjB,OAAO,CAAC,IAAY,EAAE,KAAU;QACrC,OAAO,CACL,CAAC,IAAI;YACL,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;gBAC/C,KAAK,EAAE,IAAI,KAAK,4CAAoC,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAY;QACxB,OAAO;YACL,IAAI,EAAE,iBAAS,CAAC,kBAAkB;YAClC,MAAM,EAAE,mCAA2B;YACnC,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,kBAAe,oBAAoB,CAAA","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { DecodedError, ErrorHandler, ErrorType } from '../types'\n\nexport const USER_REJECTED_TRANSACTION_ERROR_CODE = 4001\nexport const TRANSACTION_REJECTED_REASON = 'transaction-rejected'\n\nclass UserRejectionHandler implements ErrorHandler {\n public matches(data: string, error: any) {\n return (\n !data &&\n (error?.message?.includes('rejected transaction') ||\n error?.code === USER_REJECTED_TRANSACTION_ERROR_CODE)\n )\n }\n\n public handle(data: string): DecodedError {\n return {\n type: ErrorType.UserRejectionError,\n reason: TRANSACTION_REJECTED_REASON,\n data\n }\n }\n}\n\nexport default UserRejectionHandler\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.js b/dist/src/libs/errorDecoder/helpers.js index 9c3c0ec3c..bec940c04 100644 --- a/dist/src/libs/errorDecoder/helpers.js +++ b/dist/src/libs/errorDecoder/helpers.js @@ -1,5 +1,8 @@ -import { isHexString, toUtf8String } from 'ethers'; -import { ERROR_PREFIX, PANIC_ERROR_PREFIX } from './constants'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatReason = exports.getDataFromError = exports.isReasonValid = exports.getErrorCodeStringFromReason = exports.panicErrorCodeToReason = void 0; +const ethers_1 = require("ethers"); +const constants_1 = require("./constants"); const panicErrorCodeToReason = (errorCode) => { switch (errorCode) { case 0x0n: @@ -26,39 +29,43 @@ const panicErrorCodeToReason = (errorCode) => { return undefined; } }; +exports.panicErrorCodeToReason = panicErrorCodeToReason; const isReasonValid = (reason) => { return (!!reason && typeof reason === 'string' && reason !== '0x' && reason !== 'Unknown error' && reason !== 'UNKNOWN_ERROR' && - !reason.startsWith(ERROR_PREFIX) && - !reason.startsWith(PANIC_ERROR_PREFIX) && + !reason.startsWith(constants_1.ERROR_PREFIX) && + !reason.startsWith(constants_1.PANIC_ERROR_PREFIX) && !reason.toLowerCase().includes('could not coalesce error')); }; +exports.isReasonValid = isReasonValid; /** * Some reasons are encoded in hex, this function will decode them to a human-readable string * which can then be matched to a specific error message. */ const formatReason = (reason) => { const trimmedReason = reason.trim(); - if (!isHexString(trimmedReason)) + if (!(0, ethers_1.isHexString)(trimmedReason)) return trimmedReason; - if (trimmedReason.startsWith(ERROR_PREFIX) || trimmedReason.startsWith(PANIC_ERROR_PREFIX)) + if (trimmedReason.startsWith(constants_1.ERROR_PREFIX) || trimmedReason.startsWith(constants_1.PANIC_ERROR_PREFIX)) return trimmedReason; try { - return toUtf8String(trimmedReason); + return (0, ethers_1.toUtf8String)(trimmedReason); } catch { return trimmedReason; } }; +exports.formatReason = formatReason; const getErrorCodeStringFromReason = (reason, withSpace = true) => { if (!reason || !isReasonValid(reason)) return ''; const truncatedReason = reason.length > 100 ? `${reason.slice(0, 100)}...` : reason; return `${withSpace ? ' ' : ''}Error code: ${truncatedReason}`; }; +exports.getErrorCodeStringFromReason = getErrorCodeStringFromReason; function getDataFromError(error) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const errorData = error.data ?? error.error?.data; @@ -74,5 +81,5 @@ function getDataFromError(error) { } return returnData; } -export { panicErrorCodeToReason, getErrorCodeStringFromReason, isReasonValid, getDataFromError, formatReason }; +exports.getDataFromError = getDataFromError; //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/helpers.js.map b/dist/src/libs/errorDecoder/helpers.js.map index 71e3b1674..c120cddbf 100644 --- a/dist/src/libs/errorDecoder/helpers.js.map +++ b/dist/src/libs/errorDecoder/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from './constants'\n\nconst panicErrorCodeToReason = (errorCode: bigint): string | undefined => {\n switch (errorCode) {\n case 0x0n:\n return 'Generic compiler inserted panic'\n case 0x1n:\n return 'Assertion error'\n case 0x11n:\n return 'Arithmetic operation underflowed or overflowed outside of an unchecked block'\n case 0x12n:\n return 'Division or modulo division by zero'\n case 0x21n:\n return 'Tried to convert a value into an enum, but the value was too big or negative'\n case 0x22n:\n return 'Incorrectly encoded storage byte array'\n case 0x31n:\n return '.pop() was called on an empty array'\n case 0x32n:\n return 'Array accessed at an out-of-bounds or negative index'\n case 0x41n:\n return 'Too much memory was allocated, or an array was created that is too large'\n case 0x51n:\n return 'Called a zero-initialized variable of internal function type'\n default:\n return undefined\n }\n}\n\nconst isReasonValid = (reason: string | null): boolean => {\n return (\n !!reason &&\n typeof reason === 'string' &&\n reason !== '0x' &&\n reason !== 'Unknown error' &&\n reason !== 'UNKNOWN_ERROR' &&\n !reason.startsWith(ERROR_PREFIX) &&\n !reason.startsWith(PANIC_ERROR_PREFIX) &&\n !reason.toLowerCase().includes('could not coalesce error')\n )\n}\n\n/**\n * Some reasons are encoded in hex, this function will decode them to a human-readable string\n * which can then be matched to a specific error message.\n */\nconst formatReason = (reason: string): string => {\n const trimmedReason = reason.trim()\n if (!isHexString(trimmedReason)) return trimmedReason\n if (trimmedReason.startsWith(ERROR_PREFIX) || trimmedReason.startsWith(PANIC_ERROR_PREFIX))\n return trimmedReason\n\n try {\n return toUtf8String(trimmedReason)\n } catch {\n return trimmedReason\n }\n}\n\nconst getErrorCodeStringFromReason = (reason: string, withSpace = true): string => {\n if (!reason || !isReasonValid(reason)) return ''\n\n const truncatedReason = reason.length > 100 ? `${reason.slice(0, 100)}...` : reason\n\n return `${withSpace ? ' ' : ''}Error code: ${truncatedReason}`\n}\n\nfunction getDataFromError(error: Error): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorData = (error as any).data ?? (error as any).error?.data\n\n if (errorData === undefined) {\n return ''\n }\n\n let returnData = typeof errorData === 'string' ? errorData : errorData.data\n\n if (typeof returnData === 'object' && returnData.data) {\n returnData = returnData.data\n }\n\n if (returnData === undefined || typeof returnData !== 'string') {\n return ''\n }\n\n return returnData\n}\n\nexport {\n panicErrorCodeToReason,\n getErrorCodeStringFromReason,\n isReasonValid,\n getDataFromError,\n formatReason\n}\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { ERROR_PREFIX, PANIC_ERROR_PREFIX } from './constants'\n\nconst panicErrorCodeToReason = (errorCode: bigint): string | undefined => {\n switch (errorCode) {\n case 0x0n:\n return 'Generic compiler inserted panic'\n case 0x1n:\n return 'Assertion error'\n case 0x11n:\n return 'Arithmetic operation underflowed or overflowed outside of an unchecked block'\n case 0x12n:\n return 'Division or modulo division by zero'\n case 0x21n:\n return 'Tried to convert a value into an enum, but the value was too big or negative'\n case 0x22n:\n return 'Incorrectly encoded storage byte array'\n case 0x31n:\n return '.pop() was called on an empty array'\n case 0x32n:\n return 'Array accessed at an out-of-bounds or negative index'\n case 0x41n:\n return 'Too much memory was allocated, or an array was created that is too large'\n case 0x51n:\n return 'Called a zero-initialized variable of internal function type'\n default:\n return undefined\n }\n}\n\nconst isReasonValid = (reason: string | null): boolean => {\n return (\n !!reason &&\n typeof reason === 'string' &&\n reason !== '0x' &&\n reason !== 'Unknown error' &&\n reason !== 'UNKNOWN_ERROR' &&\n !reason.startsWith(ERROR_PREFIX) &&\n !reason.startsWith(PANIC_ERROR_PREFIX) &&\n !reason.toLowerCase().includes('could not coalesce error')\n )\n}\n\n/**\n * Some reasons are encoded in hex, this function will decode them to a human-readable string\n * which can then be matched to a specific error message.\n */\nconst formatReason = (reason: string): string => {\n const trimmedReason = reason.trim()\n if (!isHexString(trimmedReason)) return trimmedReason\n if (trimmedReason.startsWith(ERROR_PREFIX) || trimmedReason.startsWith(PANIC_ERROR_PREFIX))\n return trimmedReason\n\n try {\n return toUtf8String(trimmedReason)\n } catch {\n return trimmedReason\n }\n}\n\nconst getErrorCodeStringFromReason = (reason: string, withSpace = true): string => {\n if (!reason || !isReasonValid(reason)) return ''\n\n const truncatedReason = reason.length > 100 ? `${reason.slice(0, 100)}...` : reason\n\n return `${withSpace ? ' ' : ''}Error code: ${truncatedReason}`\n}\n\nfunction getDataFromError(error: Error): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorData = (error as any).data ?? (error as any).error?.data\n\n if (errorData === undefined) {\n return ''\n }\n\n let returnData = typeof errorData === 'string' ? errorData : errorData.data\n\n if (typeof returnData === 'object' && returnData.data) {\n returnData = returnData.data\n }\n\n if (returnData === undefined || typeof returnData !== 'string') {\n return ''\n }\n\n return returnData\n}\n\nexport {\n panicErrorCodeToReason,\n getErrorCodeStringFromReason,\n isReasonValid,\n getDataFromError,\n formatReason\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.js b/dist/src/libs/errorDecoder/index.js index 8fd4b94c3..3c66f7f49 100644 --- a/dist/src/libs/errorDecoder/index.js +++ b/dist/src/libs/errorDecoder/index.js @@ -1,3 +1,6 @@ -import { decodeError } from './errorDecoder'; -export { decodeError }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeError = void 0; +const errorDecoder_1 = require("./errorDecoder"); +Object.defineProperty(exports, "decodeError", { enumerable: true, get: function () { return errorDecoder_1.decodeError; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/index.js.map b/dist/src/libs/errorDecoder/index.js.map index a88bb4be1..dd03f1ef5 100644 --- a/dist/src/libs/errorDecoder/index.js.map +++ b/dist/src/libs/errorDecoder/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,CAAA","sourcesContent":["import { decodeError } from './errorDecoder'\n\nexport { decodeError }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/index.ts"],"names":[],"mappings":";;;AAAA,iDAA4C;AAEnC,4FAFA,0BAAW,OAEA","sourcesContent":["import { decodeError } from './errorDecoder'\n\nexport { decodeError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.js b/dist/src/libs/errorDecoder/types.js index 2c00d2c3d..291d3ba14 100644 --- a/dist/src/libs/errorDecoder/types.js +++ b/dist/src/libs/errorDecoder/types.js @@ -1,4 +1,7 @@ -export var ErrorType; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ErrorType = void 0; +var ErrorType; (function (ErrorType) { /** Reference, Type, Syntax and Range errors (JS/TS) */ ErrorType["CodeError"] = "CodeError"; @@ -22,5 +25,5 @@ export var ErrorType; ErrorType["UserRejectionError"] = "UserRejectionError"; /** Error due to an inner call failure during estimation */ ErrorType["InnerCallFailureError"] = "InnerCallFailureError"; -})(ErrorType || (ErrorType = {})); +})(ErrorType = exports.ErrorType || (exports.ErrorType = {})); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/errorDecoder/types.js.map b/dist/src/libs/errorDecoder/types.js.map index 1c0b220db..e4a45a7ed 100644 --- a/dist/src/libs/errorDecoder/types.js.map +++ b/dist/src/libs/errorDecoder/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAuBX;AAvBD,WAAY,SAAS;IACnB,uDAAuD;IACvD,oCAAuB,CAAA;IACvB,uEAAuE;IACvE,wCAA2B,CAAA;IAC3B,mEAAmE;IACnE,sCAAyB,CAAA;IACzB,4CAA4C;IAC5C,0CAA6B,CAAA;IAC7B,yDAAyD;IACzD,8CAAiC,CAAA;IACjC,mDAAmD;IACnD,0CAA6B,CAAA;IAC7B,6BAA6B;IAC7B,wCAA2B,CAAA;IAC3B,6BAA6B;IAC7B,kCAAqB,CAAA;IACrB,mCAAmC;IACnC,0CAA6B,CAAA;IAC7B,oDAAoD;IACpD,sDAAyC,CAAA;IACzC,2DAA2D;IAC3D,4DAA+C,CAAA;AACjD,CAAC,EAvBW,SAAS,KAAT,SAAS,QAuBpB","sourcesContent":["export enum ErrorType {\n /** Reference, Type, Syntax and Range errors (JS/TS) */\n CodeError = 'CodeError',\n /** Error due to contract reverting, identified by prefix 0x08c379a0 */\n RevertError = 'RevertError',\n /** Error due to contract panic, identified by prefix 0x4e487b71 */\n PanicError = 'PanicError',\n /** Error originating from a relayer call */\n RelayerError = 'RelayerError',\n /** Error originating from the Paymaster (our Relayer) */\n PaymasterError = 'PaymasterError',\n /** Error during bundler estimation or broadcast */\n BundlerError = 'BundlerError',\n /** Custom contract errors */\n CustomError = 'CustomError',\n /** Error from an RPC call */\n RpcError = 'RpcError',\n /** Error that cannot be decoded */\n UnknownError = 'UnknownError',\n /** Error due to the user rejecting a transaction */\n UserRejectionError = 'UserRejectionError',\n /** Error due to an inner call failure during estimation */\n InnerCallFailureError = 'InnerCallFailureError'\n}\n\nexport type DecodedError = {\n type: ErrorType\n reason: string | null\n data: string | null\n}\n\nexport type ErrorHandler = {\n matches: (data: string, error: Error) => boolean\n handle: (data: string, error: Error) => DecodedError\n}\n"]} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/errorDecoder/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,SAuBX;AAvBD,WAAY,SAAS;IACnB,uDAAuD;IACvD,oCAAuB,CAAA;IACvB,uEAAuE;IACvE,wCAA2B,CAAA;IAC3B,mEAAmE;IACnE,sCAAyB,CAAA;IACzB,4CAA4C;IAC5C,0CAA6B,CAAA;IAC7B,yDAAyD;IACzD,8CAAiC,CAAA;IACjC,mDAAmD;IACnD,0CAA6B,CAAA;IAC7B,6BAA6B;IAC7B,wCAA2B,CAAA;IAC3B,6BAA6B;IAC7B,kCAAqB,CAAA;IACrB,mCAAmC;IACnC,0CAA6B,CAAA;IAC7B,oDAAoD;IACpD,sDAAyC,CAAA;IACzC,2DAA2D;IAC3D,4DAA+C,CAAA;AACjD,CAAC,EAvBW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAuBpB","sourcesContent":["export enum ErrorType {\n /** Reference, Type, Syntax and Range errors (JS/TS) */\n CodeError = 'CodeError',\n /** Error due to contract reverting, identified by prefix 0x08c379a0 */\n RevertError = 'RevertError',\n /** Error due to contract panic, identified by prefix 0x4e487b71 */\n PanicError = 'PanicError',\n /** Error originating from a relayer call */\n RelayerError = 'RelayerError',\n /** Error originating from the Paymaster (our Relayer) */\n PaymasterError = 'PaymasterError',\n /** Error during bundler estimation or broadcast */\n BundlerError = 'BundlerError',\n /** Custom contract errors */\n CustomError = 'CustomError',\n /** Error from an RPC call */\n RpcError = 'RpcError',\n /** Error that cannot be decoded */\n UnknownError = 'UnknownError',\n /** Error due to the user rejecting a transaction */\n UserRejectionError = 'UserRejectionError',\n /** Error due to an inner call failure during estimation */\n InnerCallFailureError = 'InnerCallFailureError'\n}\n\nexport type DecodedError = {\n type: ErrorType\n reason: string | null\n data: string | null\n}\n\nexport type ErrorHandler = {\n matches: (data: string, error: Error) => boolean\n handle: (data: string, error: Error) => DecodedError\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js index f687ab631..14226ef47 100644 --- a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js @@ -1,33 +1,38 @@ -import EmittableError from '../../classes/EmittableError'; -import ExternalSignerError from '../../classes/ExternalSignerError'; -import { decodeError } from '../errorDecoder'; -import { ErrorType } from '../errorDecoder/types'; -import { BROADCAST_ERRORS } from './errors'; -import { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'; -import { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHumanReadableBroadcastError = exports.PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE = void 0; +const tslib_1 = require("tslib"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const ExternalSignerError_1 = tslib_1.__importDefault(require("../../classes/ExternalSignerError")); +const errorDecoder_1 = require("../errorDecoder"); +const types_1 = require("../errorDecoder/types"); +const errors_1 = require("./errors"); +const helpers_1 = require("./helpers"); +const humanizeCommonCases_1 = require("./humanizeCommonCases"); const LAST_RESORT_ERROR_MESSAGE = 'An unknown error occurred while broadcasting the transaction. Please try again or contact Ambire support for assistance.'; const MESSAGE_PREFIX = 'The transaction cannot be broadcast because'; -export const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE = 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'; +exports.PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE = 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'; function getPrefix(reason) { if (!reason) return MESSAGE_PREFIX; return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''; } -export function getHumanReadableBroadcastError(e) { - if (e instanceof EmittableError || e instanceof ExternalSignerError) { +function getHumanReadableBroadcastError(e) { + if (e instanceof EmittableError_1.default || e instanceof ExternalSignerError_1.default) { return e; } - const decodedError = e instanceof Error ? decodeError(e) : e; - const commonError = humanizeEstimationOrBroadcastError(decodedError.reason, getPrefix(decodedError.reason)); - let errorMessage = getHumanReadableErrorMessage(commonError, BROADCAST_ERRORS, MESSAGE_PREFIX, decodedError.reason, e); + const decodedError = e instanceof Error ? (0, errorDecoder_1.decodeError)(e) : e; + const commonError = (0, humanizeCommonCases_1.humanizeEstimationOrBroadcastError)(decodedError.reason, getPrefix(decodedError.reason)); + let errorMessage = (0, helpers_1.getHumanReadableErrorMessage)(commonError, errors_1.BROADCAST_ERRORS, MESSAGE_PREFIX, decodedError.reason, e); if (!errorMessage) { - if (decodedError.type === ErrorType.PaymasterError) { - errorMessage = PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE; + if (decodedError.type === types_1.ErrorType.PaymasterError) { + errorMessage = exports.PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE; } else { - errorMessage = getGenericMessageFromType(decodedError.type, decodedError.reason, MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); + errorMessage = (0, helpers_1.getGenericMessageFromType)(decodedError.type, decodedError.reason, MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); } } return new Error(errorMessage, { cause: decodedError.reason }); } +exports.getHumanReadableBroadcastError = getHumanReadableBroadcastError; //# sourceMappingURL=broadcastErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map index f22bc4b06..c564e781f 100644 --- a/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map +++ b/dist/src/libs/errorHumanizer/broadcastErrorHumanizer.js.map @@ -1 +1 @@ -{"version":3,"file":"broadcastErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/broadcastErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAgB,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE1E,MAAM,yBAAyB,GAC7B,0HAA0H,CAAA;AAC5H,MAAM,cAAc,GAAG,6CAA6C,CAAA;AACpE,MAAM,CAAC,MAAM,sCAAsC,GACjD,iLAAiL,CAAA;AAEnL,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,cAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,CAAuB;IACpE,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,YAAY,mBAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,kCAAkC,CACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,4BAA4B,CAC7C,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,cAAc,EAAE;YAClD,YAAY,GAAG,sCAAsC,CAAA;SACtD;aAAM;YACL,YAAY,GAAG,yBAAyB,CACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,cAAc,EACd,yBAAyB,CAC1B,CAAA;SACF;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { BROADCAST_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while broadcasting the transaction. Please try again or contact Ambire support for assistance.'\nconst MESSAGE_PREFIX = 'The transaction cannot be broadcast because'\nexport const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE =\n 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableBroadcastError(e: Error | DecodedError) {\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n BROADCAST_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n if (decodedError.type === ErrorType.PaymasterError) {\n errorMessage = PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE\n } else {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file +{"version":3,"file":"broadcastErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/broadcastErrorHumanizer.ts"],"names":[],"mappings":";;;;AAAA,0FAAyD;AACzD,oGAAmE;AACnE,kDAA6C;AAC7C,iDAA+D;AAC/D,qCAA2C;AAC3C,uCAAmF;AACnF,+DAA0E;AAE1E,MAAM,yBAAyB,GAC7B,0HAA0H,CAAA;AAC5H,MAAM,cAAc,GAAG,6CAA6C,CAAA;AACvD,QAAA,sCAAsC,GACjD,iLAAiL,CAAA;AAEnL,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,cAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,SAAgB,8BAA8B,CAAC,CAAuB;IACpE,IAAI,CAAC,YAAY,wBAAc,IAAI,CAAC,YAAY,6BAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,IAAA,0BAAW,EAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,IAAA,wDAAkC,EACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,IAAA,sCAA4B,EAC7C,WAAW,EACX,yBAAgB,EAChB,cAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,IAAI,YAAY,CAAC,IAAI,KAAK,iBAAS,CAAC,cAAc,EAAE;YAClD,YAAY,GAAG,8CAAsC,CAAA;SACtD;aAAM;YACL,YAAY,GAAG,IAAA,mCAAyB,EACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,cAAc,EACd,yBAAyB,CAC1B,CAAA;SACF;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC;AAhCD,wEAgCC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { BROADCAST_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while broadcasting the transaction. Please try again or contact Ambire support for assistance.'\nconst MESSAGE_PREFIX = 'The transaction cannot be broadcast because'\nexport const PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE =\n 'Currently, the paymaster seems to be down and your transaction cannot be broadcast. Please try again in a few moments or pay the fee with a Basic Account if the error persists'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableBroadcastError(e: Error | DecodedError) {\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n BROADCAST_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n if (decodedError.type === ErrorType.PaymasterError) {\n errorMessage = PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE\n } else {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.js b/dist/src/libs/errorHumanizer/errors.js index 9ca66a8b2..454ca37c0 100644 --- a/dist/src/libs/errorHumanizer/errors.js +++ b/dist/src/libs/errorHumanizer/errors.js @@ -1,7 +1,11 @@ -import { EXPIRED_PREFIX } from '../errorDecoder/constants'; -import { RPC_HARDCODED_ERRORS } from '../errorDecoder/handlers/rpc'; -import { RELAYER_DOWN_MESSAGE } from '../relayerCall/relayerCall'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.insufficientPaymasterFunds = exports.ESTIMATION_ERRORS = exports.BROADCAST_ERRORS = exports.BROADCAST_OR_ESTIMATION_ERRORS = void 0; +const constants_1 = require("../errorDecoder/constants"); +const rpc_1 = require("../errorDecoder/handlers/rpc"); +const relayerCall_1 = require("../relayerCall/relayerCall"); const insufficientPaymasterFunds = "the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options."; +exports.insufficientPaymasterFunds = insufficientPaymasterFunds; const BROADCAST_OR_ESTIMATION_ERRORS = [ // Rpc { @@ -9,7 +13,7 @@ const BROADCAST_OR_ESTIMATION_ERRORS = [ message: 'the RPC provider does not support the requested operation. Please check your RPC settings or contact the app team.' }, { - reasons: [RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'], + reasons: [rpc_1.RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'], message: 'of a problem with the RPC on this network. Please try again later, change the RPC or contact support for assistance.' }, { @@ -56,7 +60,7 @@ const BROADCAST_OR_ESTIMATION_ERRORS = [ }, // Relayer { - reasons: [RELAYER_DOWN_MESSAGE], + reasons: [relayerCall_1.RELAYER_DOWN_MESSAGE], message: 'the Ambire relayer is temporarily down.\nPlease try again or contact Ambire support for assistance.' }, { @@ -81,7 +85,7 @@ const BROADCAST_OR_ESTIMATION_ERRORS = [ message: 'of one of the following reasons: missing approval, insufficient approved amount, the amount exceeds the account balance.' }, { - reasons: [EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'], + reasons: [constants_1.EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'], message: 'the swap has expired. Return to the app and reinitiate the swap if you wish to proceed.' }, // bundler @@ -94,6 +98,7 @@ const BROADCAST_OR_ESTIMATION_ERRORS = [ message: 'The bundler seems to be down at the moment. Please try again later' } ]; +exports.BROADCAST_OR_ESTIMATION_ERRORS = BROADCAST_OR_ESTIMATION_ERRORS; const BROADCAST_ERRORS = [ { reasons: ['pimlico_getUserOperationGasPrice'], @@ -108,6 +113,7 @@ const BROADCAST_ERRORS = [ message: 'the fee set for the transaction is lower than the network’s current base fee. Please try again with a higher fee.' } ]; +exports.BROADCAST_ERRORS = BROADCAST_ERRORS; const ESTIMATION_ERRORS = [ { reasons: ['SPOOF_ERROR', 'INSUFFICIENT_PRIVILEGE'], @@ -159,5 +165,5 @@ const ESTIMATION_ERRORS = [ message: 'the smart contract’s initialization failed. This is likely a deployment issue; please check the constructor parameters.' } ]; -export { BROADCAST_OR_ESTIMATION_ERRORS, BROADCAST_ERRORS, ESTIMATION_ERRORS, insufficientPaymasterFunds }; +exports.ESTIMATION_ERRORS = ESTIMATION_ERRORS; //# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/errors.js.map b/dist/src/libs/errorHumanizer/errors.js.map index 32940f014..c5529653e 100644 --- a/dist/src/libs/errorHumanizer/errors.js.map +++ b/dist/src/libs/errorHumanizer/errors.js.map @@ -1 +1 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXPIRED_PREFIX } from '../errorDecoder/constants'\nimport { RPC_HARDCODED_ERRORS } from '../errorDecoder/handlers/rpc'\nimport { RELAYER_DOWN_MESSAGE } from '../relayerCall/relayerCall'\nimport { ErrorHumanizerError } from './types'\n\nconst insufficientPaymasterFunds =\n \"the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options.\"\n\nconst BROADCAST_OR_ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n // Rpc\n {\n reasons: ['Method not found'],\n message:\n 'the RPC provider does not support the requested operation. Please check your RPC settings or contact the app team.'\n },\n {\n reasons: [RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'],\n message:\n 'of a problem with the RPC on this network. Please try again later, change the RPC or contact support for assistance.'\n },\n {\n reasons: ['Invalid JSON RPC parameters'],\n message:\n 'of a RPC request that contains invalid or missing parameters. Please try again later or contact support.'\n },\n {\n reasons: ['Too Many Requests'],\n message:\n 'your wallet has sent too many requests in a short time. Please wait a moment and try again.'\n },\n // Contract / Transaction\n {\n reasons: ['IMPOSSIBLE_GAS_CONSUMPTION'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['INSUFFICIENT_FUNDS', 'insufficient funds'],\n message:\n 'of insufficient funds for the transaction fee. Please add more fee tokens to your account and try again.'\n },\n {\n reasons: ['transfer amount exceeds balance'],\n message:\n 'the transfer amount exceeds your account balance. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['ERC721: insufficient balance for transfer'],\n message:\n 'you do not have enough of the specified NFT in your account. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['Low gas limit'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['Transaction underpriced'],\n message: 'it is underpriced. Please select a higher transaction speed and try again.'\n },\n // Smart Accounts\n {\n reasons: ['Sponsorship failed.'],\n message:\n 'the gas sponsorship was refused by the app. Please try again by paying for the gas instead'\n },\n {\n reasons: ['paymaster deposit too low'],\n message: insufficientPaymasterFunds\n },\n // Relayer\n {\n reasons: [RELAYER_DOWN_MESSAGE],\n message:\n 'the Ambire relayer is temporarily down.\\nPlease try again or contact Ambire support for assistance.'\n },\n {\n reasons: ['user nonce too low'],\n message:\n 'the user nonce is too low. Is there a pending transaction? Please try broadcasting again.'\n },\n // dApp interactions\n {\n reasons: ['INSUFFICIENT_INPUT_AMOUNT'],\n message: 'the input token amount is too low. Please increase the token amount and try again.'\n },\n {\n reasons: ['INSUFFICIENT_OUTPUT_AMOUNT'],\n message:\n 'the slippage tolerance was exceeded. Please reduce the slippage tolerance in the app and try again.'\n },\n {\n reasons: ['80'],\n message:\n \"the smart contract you're interacting with doesn't support this operation. This could be due to contract restrictions, insufficient permissions, or specific conditions that haven't been met. Please review the requirements of this operation or consult the contract documentation.\"\n },\n {\n reasons: ['STF'],\n message:\n 'of one of the following reasons: missing approval, insufficient approved amount, the amount exceeds the account balance.'\n },\n {\n reasons: [EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'],\n message:\n 'the swap has expired. Return to the app and reinitiate the swap if you wish to proceed.'\n },\n // bundler\n {\n reasons: ['biconomy: 400'],\n message: 'it will revert onchain with reason unknown.'\n },\n {\n reasons: ['pimlico: 500'],\n message: 'The bundler seems to be down at the moment. Please try again later'\n }\n]\n\nconst BROADCAST_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['pimlico_getUserOperationGasPrice'],\n message: 'the selected fee is too low. Please select a higher transaction speed and try again.'\n },\n {\n reasons: ['Replacement transaction underpriced'],\n message: 'the gas fee for replacing a pending transaction is too low. Please try again.'\n },\n {\n reasons: ['Max fee per gas less than block base fee'],\n message:\n 'the fee set for the transaction is lower than the network’s current base fee. Please try again with a higher fee.'\n }\n]\n\nconst ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['SPOOF_ERROR', 'INSUFFICIENT_PRIVILEGE'],\n message:\n 'your account key lacks the necessary permissions. Ensure that you have authorization to sign or use an account with sufficient privileges.'\n },\n {\n reasons: [\n 'caller is a contract',\n 'contract not allowed',\n 'contract not supported',\n 'No contractz allowed',\n 'contracts allowed',\n 'ontract is not allowed'\n ],\n message: 'this app does not support Smart Account wallets. Use a Basic Account (EOA) instead.'\n },\n // Contract errors\n {\n reasons: ['0x7b36c479', '0x81ceff30'],\n message: 'of a Swap failure. Please try performing the same swap again.'\n },\n {\n reasons: ['ERC721: token already minted'],\n message:\n 'the NFT you are trying to mint is already minted. This can also happen if you have batched multiple mint transactions for the same NFT.'\n },\n {\n reasons: ['ERC721: token does not exist'],\n message:\n 'the NFT you are trying to interact with does not exist. Ensure you are using the correct token ID.'\n },\n {\n reasons: ['Inner call: 0x'],\n message: 'it reverted onchain with reason unknown.'\n },\n // Rare contract errors\n {\n reasons: ['AccessControl: account is missing role'],\n message:\n 'your account lacks the necessary permissions to perform this action. Please contact the contract owner or ensure you have the required role.'\n },\n {\n reasons: ['Pausable: paused'],\n message:\n 'the contract is currently paused. Please wait until it is active or contact the contract owner for more information.'\n },\n {\n reasons: ['Contract code size exceeds'],\n message:\n 'the contract’s size exceeds the EVM limit for deployment. Please ensure the contract is optimized before redeploying.'\n },\n {\n reasons: ['Constructor reverted'],\n message:\n 'the smart contract’s initialization failed. This is likely a deployment issue; please check the constructor parameters.'\n }\n]\n\nexport {\n BROADCAST_OR_ESTIMATION_ERRORS,\n BROADCAST_ERRORS,\n ESTIMATION_ERRORS,\n insufficientPaymasterFunds\n}\n"]} \ No newline at end of file +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXPIRED_PREFIX } from '../errorDecoder/constants'\nimport { RPC_HARDCODED_ERRORS } from '../errorDecoder/handlers/rpc'\nimport { RELAYER_DOWN_MESSAGE } from '../relayerCall/relayerCall'\nimport { ErrorHumanizerError } from './types'\n\nconst insufficientPaymasterFunds =\n \"the Paymaster has insufficient funds. Please report this to the team. We've disabled it, so please try again with the updated fee payment options.\"\n\nconst BROADCAST_OR_ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n // Rpc\n {\n reasons: ['Method not found'],\n message:\n 'the RPC provider does not support the requested operation. Please check your RPC settings or contact the app team.'\n },\n {\n reasons: [RPC_HARDCODED_ERRORS.rpcTimeout, 'Unable to connect to provider'],\n message:\n 'of a problem with the RPC on this network. Please try again later, change the RPC or contact support for assistance.'\n },\n {\n reasons: ['Invalid JSON RPC parameters'],\n message:\n 'of a RPC request that contains invalid or missing parameters. Please try again later or contact support.'\n },\n {\n reasons: ['Too Many Requests'],\n message:\n 'your wallet has sent too many requests in a short time. Please wait a moment and try again.'\n },\n // Contract / Transaction\n {\n reasons: ['IMPOSSIBLE_GAS_CONSUMPTION'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['INSUFFICIENT_FUNDS', 'insufficient funds'],\n message:\n 'of insufficient funds for the transaction fee. Please add more fee tokens to your account and try again.'\n },\n {\n reasons: ['transfer amount exceeds balance'],\n message:\n 'the transfer amount exceeds your account balance. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['ERC721: insufficient balance for transfer'],\n message:\n 'you do not have enough of the specified NFT in your account. Please check your balance or adjust the transfer amount.'\n },\n {\n reasons: ['Low gas limit'],\n message: 'of a low gas limit. Please try again or contact support for assistance.'\n },\n {\n reasons: ['Transaction underpriced'],\n message: 'it is underpriced. Please select a higher transaction speed and try again.'\n },\n // Smart Accounts\n {\n reasons: ['Sponsorship failed.'],\n message:\n 'the gas sponsorship was refused by the app. Please try again by paying for the gas instead'\n },\n {\n reasons: ['paymaster deposit too low'],\n message: insufficientPaymasterFunds\n },\n // Relayer\n {\n reasons: [RELAYER_DOWN_MESSAGE],\n message:\n 'the Ambire relayer is temporarily down.\\nPlease try again or contact Ambire support for assistance.'\n },\n {\n reasons: ['user nonce too low'],\n message:\n 'the user nonce is too low. Is there a pending transaction? Please try broadcasting again.'\n },\n // dApp interactions\n {\n reasons: ['INSUFFICIENT_INPUT_AMOUNT'],\n message: 'the input token amount is too low. Please increase the token amount and try again.'\n },\n {\n reasons: ['INSUFFICIENT_OUTPUT_AMOUNT'],\n message:\n 'the slippage tolerance was exceeded. Please reduce the slippage tolerance in the app and try again.'\n },\n {\n reasons: ['80'],\n message:\n \"the smart contract you're interacting with doesn't support this operation. This could be due to contract restrictions, insufficient permissions, or specific conditions that haven't been met. Please review the requirements of this operation or consult the contract documentation.\"\n },\n {\n reasons: ['STF'],\n message:\n 'of one of the following reasons: missing approval, insufficient approved amount, the amount exceeds the account balance.'\n },\n {\n reasons: [EXPIRED_PREFIX, 'Router: EXPIRED', 'Transaction too old'],\n message:\n 'the swap has expired. Return to the app and reinitiate the swap if you wish to proceed.'\n },\n // bundler\n {\n reasons: ['biconomy: 400'],\n message: 'it will revert onchain with reason unknown.'\n },\n {\n reasons: ['pimlico: 500'],\n message: 'The bundler seems to be down at the moment. Please try again later'\n }\n]\n\nconst BROADCAST_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['pimlico_getUserOperationGasPrice'],\n message: 'the selected fee is too low. Please select a higher transaction speed and try again.'\n },\n {\n reasons: ['Replacement transaction underpriced'],\n message: 'the gas fee for replacing a pending transaction is too low. Please try again.'\n },\n {\n reasons: ['Max fee per gas less than block base fee'],\n message:\n 'the fee set for the transaction is lower than the network’s current base fee. Please try again with a higher fee.'\n }\n]\n\nconst ESTIMATION_ERRORS: ErrorHumanizerError[] = [\n {\n reasons: ['SPOOF_ERROR', 'INSUFFICIENT_PRIVILEGE'],\n message:\n 'your account key lacks the necessary permissions. Ensure that you have authorization to sign or use an account with sufficient privileges.'\n },\n {\n reasons: [\n 'caller is a contract',\n 'contract not allowed',\n 'contract not supported',\n 'No contractz allowed',\n 'contracts allowed',\n 'ontract is not allowed'\n ],\n message: 'this app does not support Smart Account wallets. Use a Basic Account (EOA) instead.'\n },\n // Contract errors\n {\n reasons: ['0x7b36c479', '0x81ceff30'],\n message: 'of a Swap failure. Please try performing the same swap again.'\n },\n {\n reasons: ['ERC721: token already minted'],\n message:\n 'the NFT you are trying to mint is already minted. This can also happen if you have batched multiple mint transactions for the same NFT.'\n },\n {\n reasons: ['ERC721: token does not exist'],\n message:\n 'the NFT you are trying to interact with does not exist. Ensure you are using the correct token ID.'\n },\n {\n reasons: ['Inner call: 0x'],\n message: 'it reverted onchain with reason unknown.'\n },\n // Rare contract errors\n {\n reasons: ['AccessControl: account is missing role'],\n message:\n 'your account lacks the necessary permissions to perform this action. Please contact the contract owner or ensure you have the required role.'\n },\n {\n reasons: ['Pausable: paused'],\n message:\n 'the contract is currently paused. Please wait until it is active or contact the contract owner for more information.'\n },\n {\n reasons: ['Contract code size exceeds'],\n message:\n 'the contract’s size exceeds the EVM limit for deployment. Please ensure the contract is optimized before redeploying.'\n },\n {\n reasons: ['Constructor reverted'],\n message:\n 'the smart contract’s initialization failed. This is likely a deployment issue; please check the constructor parameters.'\n }\n]\n\nexport {\n BROADCAST_OR_ESTIMATION_ERRORS,\n BROADCAST_ERRORS,\n ESTIMATION_ERRORS,\n insufficientPaymasterFunds\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js index 14333aa62..475447c04 100644 --- a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js @@ -1,28 +1,33 @@ -import EmittableError from '../../classes/EmittableError'; -import ExternalSignerError from '../../classes/ExternalSignerError'; -import { decodeError } from '../errorDecoder'; -import { ESTIMATION_ERRORS } from './errors'; -import { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'; -import { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'; -export const MESSAGE_PREFIX = 'The transaction will fail because'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHumanReadableEstimationError = exports.MESSAGE_PREFIX = void 0; +const tslib_1 = require("tslib"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const ExternalSignerError_1 = tslib_1.__importDefault(require("../../classes/ExternalSignerError")); +const errorDecoder_1 = require("../errorDecoder"); +const errors_1 = require("./errors"); +const helpers_1 = require("./helpers"); +const humanizeCommonCases_1 = require("./humanizeCommonCases"); +exports.MESSAGE_PREFIX = 'The transaction will fail because'; const LAST_RESORT_ERROR_MESSAGE = 'An unknown error occurred while estimating the transaction. Please try again or contact Ambire support for assistance.'; function getPrefix(reason) { if (!reason) - return MESSAGE_PREFIX; - return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''; + return exports.MESSAGE_PREFIX; + return !reason.includes('pimlico: 500') ? exports.MESSAGE_PREFIX : ''; } -export function getHumanReadableEstimationError(e) { +function getHumanReadableEstimationError(e) { // These errors should be thrown as they are // as they are already human-readable - if (e instanceof EmittableError || e instanceof ExternalSignerError) { + if (e instanceof EmittableError_1.default || e instanceof ExternalSignerError_1.default) { return e; } - const decodedError = e instanceof Error ? decodeError(e) : e; - const commonError = humanizeEstimationOrBroadcastError(decodedError.reason, getPrefix(decodedError.reason)); - let errorMessage = getHumanReadableErrorMessage(commonError, ESTIMATION_ERRORS, MESSAGE_PREFIX, decodedError.reason, e); + const decodedError = e instanceof Error ? (0, errorDecoder_1.decodeError)(e) : e; + const commonError = (0, humanizeCommonCases_1.humanizeEstimationOrBroadcastError)(decodedError.reason, getPrefix(decodedError.reason)); + let errorMessage = (0, helpers_1.getHumanReadableErrorMessage)(commonError, errors_1.ESTIMATION_ERRORS, exports.MESSAGE_PREFIX, decodedError.reason, e); if (!errorMessage) { - errorMessage = getGenericMessageFromType(decodedError.type, decodedError.reason, MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); + errorMessage = (0, helpers_1.getGenericMessageFromType)(decodedError.type, decodedError.reason, exports.MESSAGE_PREFIX, LAST_RESORT_ERROR_MESSAGE); } return new Error(errorMessage, { cause: decodedError.reason }); } +exports.getHumanReadableEstimationError = getHumanReadableEstimationError; //# sourceMappingURL=estimationErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map index 4929af5aa..2d1b6aea2 100644 --- a/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map +++ b/dist/src/libs/errorHumanizer/estimationErrorHumanizer.js.map @@ -1 +1 @@ -{"version":3,"file":"estimationErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/estimationErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AAEjE,MAAM,yBAAyB,GAC7B,wHAAwH,CAAA;AAE1H,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,cAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,CAAuB;IACrE,4CAA4C;IAC5C,qCAAqC;IACrC,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,YAAY,mBAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,kCAAkC,CACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,4BAA4B,CAC7C,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,yBAAyB,CACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,cAAc,EACd,yBAAyB,CAC1B,CAAA;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError } from '../errorDecoder/types'\nimport { ESTIMATION_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nexport const MESSAGE_PREFIX = 'The transaction will fail because'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while estimating the transaction. Please try again or contact Ambire support for assistance.'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableEstimationError(e: Error | DecodedError) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n ESTIMATION_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimationErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/estimationErrorHumanizer.ts"],"names":[],"mappings":";;;;AAAA,0FAAyD;AACzD,oGAAmE;AACnE,kDAA6C;AAE7C,qCAA4C;AAC5C,uCAAmF;AACnF,+DAA0E;AAE7D,QAAA,cAAc,GAAG,mCAAmC,CAAA;AAEjE,MAAM,yBAAyB,GAC7B,wHAAwH,CAAA;AAE1H,SAAS,SAAS,CAAC,MAAqB;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,sBAAc,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,sBAAc,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,SAAgB,+BAA+B,CAAC,CAAuB;IACrE,4CAA4C;IAC5C,qCAAqC;IACrC,IAAI,CAAC,YAAY,wBAAc,IAAI,CAAC,YAAY,6BAAmB,EAAE;QACnE,OAAO,CAAC,CAAA;KACT;IAED,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,IAAA,0BAAW,EAAC,CAAU,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAA;IACvF,MAAM,WAAW,GAAG,IAAA,wDAAkC,EACpD,YAAY,CAAC,MAAM,EACnB,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,CAAA;IACD,IAAI,YAAY,GAAG,IAAA,sCAA4B,EAC7C,WAAW,EACX,0BAAiB,EACjB,sBAAc,EACd,YAAY,CAAC,MAAM,EACnB,CAAC,CACF,CAAA;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,IAAA,mCAAyB,EACtC,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,MAAM,EACnB,sBAAc,EACd,yBAAyB,CAC1B,CAAA;KACF;IAED,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC;AA9BD,0EA8BC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport ExternalSignerError from '../../classes/ExternalSignerError'\nimport { decodeError } from '../errorDecoder'\nimport { DecodedError } from '../errorDecoder/types'\nimport { ESTIMATION_ERRORS } from './errors'\nimport { getGenericMessageFromType, getHumanReadableErrorMessage } from './helpers'\nimport { humanizeEstimationOrBroadcastError } from './humanizeCommonCases'\n\nexport const MESSAGE_PREFIX = 'The transaction will fail because'\n\nconst LAST_RESORT_ERROR_MESSAGE =\n 'An unknown error occurred while estimating the transaction. Please try again or contact Ambire support for assistance.'\n\nfunction getPrefix(reason: string | null): string {\n if (!reason) return MESSAGE_PREFIX\n return !reason.includes('pimlico: 500') ? MESSAGE_PREFIX : ''\n}\n\nexport function getHumanReadableEstimationError(e: Error | DecodedError) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (e instanceof EmittableError || e instanceof ExternalSignerError) {\n return e\n }\n\n const decodedError = e instanceof Error ? decodeError(e as Error) : (e as DecodedError)\n const commonError = humanizeEstimationOrBroadcastError(\n decodedError.reason,\n getPrefix(decodedError.reason)\n )\n let errorMessage = getHumanReadableErrorMessage(\n commonError,\n ESTIMATION_ERRORS,\n MESSAGE_PREFIX,\n decodedError.reason,\n e\n )\n\n if (!errorMessage) {\n errorMessage = getGenericMessageFromType(\n decodedError.type,\n decodedError.reason,\n MESSAGE_PREFIX,\n LAST_RESORT_ERROR_MESSAGE\n )\n }\n\n return new Error(errorMessage, { cause: decodedError.reason })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.js b/dist/src/libs/errorHumanizer/helpers.js index bcd51134e..6f14ba0d3 100644 --- a/dist/src/libs/errorHumanizer/helpers.js +++ b/dist/src/libs/errorHumanizer/helpers.js @@ -1,35 +1,39 @@ -import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'; -import { ErrorType } from '../errorDecoder/types'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHumanReadableErrorMessage = exports.getGenericMessageFromType = void 0; +const helpers_1 = require("../errorDecoder/helpers"); +const types_1 = require("../errorDecoder/types"); function getGenericMessageFromType(errorType, reason, messagePrefix, lastResortMessage) { - const reasonString = getErrorCodeStringFromReason(reason ?? ''); + const reasonString = (0, helpers_1.getErrorCodeStringFromReason)(reason ?? ''); const messageSuffixNoSupport = `${reasonString}\n`; const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`; const origin = errorType?.split('Error')?.[0] || ''; switch (errorType) { - case ErrorType.RelayerError: - case ErrorType.RpcError: + case types_1.ErrorType.RelayerError: + case types_1.ErrorType.RpcError: return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`; - case ErrorType.PaymasterError: + case types_1.ErrorType.PaymasterError: return `${messagePrefix} of a Paymaster Error.${messageSuffix}`; - case ErrorType.BundlerError: + case types_1.ErrorType.BundlerError: return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`; - case ErrorType.CodeError: - case ErrorType.UnknownError: + case types_1.ErrorType.CodeError: + case types_1.ErrorType.UnknownError: return `${messagePrefix} of an unknown error.${messageSuffix}`; - case ErrorType.InnerCallFailureError: + case types_1.ErrorType.InnerCallFailureError: return (reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`); // I don't think we should say anything else for this case - case ErrorType.UserRejectionError: + case types_1.ErrorType.UserRejectionError: return 'Transaction rejected.'; // Panic error may scare the user so let's call it a contract error - case ErrorType.CustomError: - case ErrorType.PanicError: - case ErrorType.RevertError: + case types_1.ErrorType.CustomError: + case types_1.ErrorType.PanicError: + case types_1.ErrorType.RevertError: return `${messagePrefix} of a contract error.${messageSuffix}`; default: return lastResortMessage; } } +exports.getGenericMessageFromType = getGenericMessageFromType; const getHumanReadableErrorMessage = (commonError, errors, messagePrefix, reason, e) => { if (commonError) return commonError; @@ -45,5 +49,5 @@ const getHumanReadableErrorMessage = (commonError, errors, messagePrefix, reason } return message; }; -export { getGenericMessageFromType, getHumanReadableErrorMessage }; +exports.getHumanReadableErrorMessage = getHumanReadableErrorMessage; //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.js.map b/dist/src/libs/errorHumanizer/helpers.js.map index 7d1b986e9..f0aaae337 100644 --- a/dist/src/libs/errorHumanizer/helpers.js.map +++ b/dist/src/libs/errorHumanizer/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAgB,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAG/D,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAA8B,EAC9B,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,YAAY,GAAG,4BAA4B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,sBAAsB,GAAG,GAAG,YAAY,IAAI,CAAA;IAClD,MAAM,aAAa,GAAG,GAAG,sBAAsB,4DAA4D,CAAA;IAC3G,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnD,QAAQ,SAAS,EAAE;QACjB,KAAK,SAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,SAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,aAAa,iCAAiC,MAAM,UAAU,aAAa,EAAE,CAAA;QACzF,KAAK,SAAS,CAAC,cAAc;YAC3B,OAAO,GAAG,aAAa,yBAAyB,aAAa,EAAE,CAAA;QACjE,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,iBAAiB,sBAAsB,EAAE,CAAA;QAClE,KAAK,SAAS,CAAC,SAAS,CAAC;QACzB,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE,KAAK,SAAS,CAAC,qBAAqB;YAClC,OAAO,CACL,MAAM,IAAI,GAAG,aAAa,+CAA+C,aAAa,EAAE,CACzF,CAAA;QACH,0DAA0D;QAC1D,KAAK,SAAS,CAAC,kBAAkB;YAC/B,OAAO,uBAAuB,CAAA;QAChC,mEAAmE;QACnE,KAAK,SAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,SAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE;YACE,OAAO,iBAAiB,CAAA;KAC3B;AACH,CAAC;AAED,MAAM,4BAA4B,GAAG,CACnC,WAA0B,EAC1B,MAA6B,EAC7B,aAAqB,EACrB,MAA8B,EAC9B,CAAM,EACN,EAAE;IACF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAA;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;YACD,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;KACH;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,CAAA","sourcesContent":["import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { ErrorHumanizerError } from './types'\n\nfunction getGenericMessageFromType(\n errorType: ErrorType,\n reason: DecodedError['reason'],\n messagePrefix: string,\n lastResortMessage: string\n): string {\n const reasonString = getErrorCodeStringFromReason(reason ?? '')\n const messageSuffixNoSupport = `${reasonString}\\n`\n const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`\n const origin = errorType?.split('Error')?.[0] || ''\n\n switch (errorType) {\n case ErrorType.RelayerError:\n case ErrorType.RpcError:\n return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`\n case ErrorType.PaymasterError:\n return `${messagePrefix} of a Paymaster Error.${messageSuffix}`\n case ErrorType.BundlerError:\n return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`\n case ErrorType.CodeError:\n case ErrorType.UnknownError:\n return `${messagePrefix} of an unknown error.${messageSuffix}`\n case ErrorType.InnerCallFailureError:\n return (\n reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`\n )\n // I don't think we should say anything else for this case\n case ErrorType.UserRejectionError:\n return 'Transaction rejected.'\n // Panic error may scare the user so let's call it a contract error\n case ErrorType.CustomError:\n case ErrorType.PanicError:\n case ErrorType.RevertError:\n return `${messagePrefix} of a contract error.${messageSuffix}`\n default:\n return lastResortMessage\n }\n}\n\nconst getHumanReadableErrorMessage = (\n commonError: string | null,\n errors: ErrorHumanizerError[],\n messagePrefix: string,\n reason: DecodedError['reason'],\n e: any\n) => {\n if (commonError) return commonError\n\n const checkAgainst = reason || e?.error?.message || e?.message\n let message = null\n\n if (checkAgainst) {\n errors.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n checkAgainst.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${messagePrefix} ${error.message}`\n })\n }\n\n return message\n}\n\nexport { getGenericMessageFromType, getHumanReadableErrorMessage }\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":";;;AAAA,qDAAsE;AACtE,iDAA+D;AAG/D,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAA8B,EAC9B,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,YAAY,GAAG,IAAA,sCAA4B,EAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,sBAAsB,GAAG,GAAG,YAAY,IAAI,CAAA;IAClD,MAAM,aAAa,GAAG,GAAG,sBAAsB,4DAA4D,CAAA;IAC3G,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnD,QAAQ,SAAS,EAAE;QACjB,KAAK,iBAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,iBAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,aAAa,iCAAiC,MAAM,UAAU,aAAa,EAAE,CAAA;QACzF,KAAK,iBAAS,CAAC,cAAc;YAC3B,OAAO,GAAG,aAAa,yBAAyB,aAAa,EAAE,CAAA;QACjE,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,iBAAiB,sBAAsB,EAAE,CAAA;QAClE,KAAK,iBAAS,CAAC,SAAS,CAAC;QACzB,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE,KAAK,iBAAS,CAAC,qBAAqB;YAClC,OAAO,CACL,MAAM,IAAI,GAAG,aAAa,+CAA+C,aAAa,EAAE,CACzF,CAAA;QACH,0DAA0D;QAC1D,KAAK,iBAAS,CAAC,kBAAkB;YAC/B,OAAO,uBAAuB,CAAA;QAChC,mEAAmE;QACnE,KAAK,iBAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,iBAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,iBAAS,CAAC,WAAW;YACxB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE;YACE,OAAO,iBAAiB,CAAA;KAC3B;AACH,CAAC;AA4BQ,8DAAyB;AA1BlC,MAAM,4BAA4B,GAAG,CACnC,WAA0B,EAC1B,MAA6B,EAC7B,aAAqB,EACrB,MAA8B,EAC9B,CAAM,EACN,EAAE;IACF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAA;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;YACD,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;KACH;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAEmC,oEAA4B","sourcesContent":["import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { ErrorHumanizerError } from './types'\n\nfunction getGenericMessageFromType(\n errorType: ErrorType,\n reason: DecodedError['reason'],\n messagePrefix: string,\n lastResortMessage: string\n): string {\n const reasonString = getErrorCodeStringFromReason(reason ?? '')\n const messageSuffixNoSupport = `${reasonString}\\n`\n const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`\n const origin = errorType?.split('Error')?.[0] || ''\n\n switch (errorType) {\n case ErrorType.RelayerError:\n case ErrorType.RpcError:\n return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`\n case ErrorType.PaymasterError:\n return `${messagePrefix} of a Paymaster Error.${messageSuffix}`\n case ErrorType.BundlerError:\n return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`\n case ErrorType.CodeError:\n case ErrorType.UnknownError:\n return `${messagePrefix} of an unknown error.${messageSuffix}`\n case ErrorType.InnerCallFailureError:\n return (\n reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`\n )\n // I don't think we should say anything else for this case\n case ErrorType.UserRejectionError:\n return 'Transaction rejected.'\n // Panic error may scare the user so let's call it a contract error\n case ErrorType.CustomError:\n case ErrorType.PanicError:\n case ErrorType.RevertError:\n return `${messagePrefix} of a contract error.${messageSuffix}`\n default:\n return lastResortMessage\n }\n}\n\nconst getHumanReadableErrorMessage = (\n commonError: string | null,\n errors: ErrorHumanizerError[],\n messagePrefix: string,\n reason: DecodedError['reason'],\n e: any\n) => {\n if (commonError) return commonError\n\n const checkAgainst = reason || e?.error?.message || e?.message\n let message = null\n\n if (checkAgainst) {\n errors.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n checkAgainst.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${messagePrefix} ${error.message}`\n })\n }\n\n return message\n}\n\nexport { getGenericMessageFromType, getHumanReadableErrorMessage }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.js b/dist/src/libs/errorHumanizer/humanizeCommonCases.js index 41f3793e7..5838c1bdb 100644 --- a/dist/src/libs/errorHumanizer/humanizeCommonCases.js +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.js @@ -1,9 +1,12 @@ -import { BROADCAST_OR_ESTIMATION_ERRORS } from './errors'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.humanizeEstimationOrBroadcastError = void 0; +const errors_1 = require("./errors"); const humanizeEstimationOrBroadcastError = (reason, prefix) => { let message = null; if (!reason) return message; - BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => { + errors_1.BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => { const isMatching = error.reasons.some((errorReason) => reason.toLowerCase().includes(errorReason.toLowerCase())); if (!isMatching) return; @@ -11,5 +14,5 @@ const humanizeEstimationOrBroadcastError = (reason, prefix) => { }); return message; }; -export { humanizeEstimationOrBroadcastError }; +exports.humanizeEstimationOrBroadcastError = humanizeEstimationOrBroadcastError; //# sourceMappingURL=humanizeCommonCases.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map b/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map index f3813f164..b6063d646 100644 --- a/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map +++ b/dist/src/libs/errorHumanizer/humanizeCommonCases.js.map @@ -1 +1 @@ -{"version":3,"file":"humanizeCommonCases.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/humanizeCommonCases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAA;AAEzD,MAAM,kCAAkC,GAAG,CACzC,MAAqB,EACrB,MAAc,EACC,EAAE;IACjB,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAE3B,8BAA8B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CACzD,CAAA;QACD,IAAI,CAAC,UAAU;YAAE,OAAM;QAEvB,OAAO,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,OAAO,EAAE,kCAAkC,EAAE,CAAA","sourcesContent":["import { BROADCAST_OR_ESTIMATION_ERRORS } from './errors'\n\nconst humanizeEstimationOrBroadcastError = (\n reason: string | null,\n prefix: string\n): string | null => {\n let message = null\n\n if (!reason) return message\n\n BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n reason.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${prefix !== '' ? `${prefix} ` : ''}${error.message}`\n })\n\n return message\n}\n\nexport { humanizeEstimationOrBroadcastError }\n"]} \ No newline at end of file +{"version":3,"file":"humanizeCommonCases.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/humanizeCommonCases.ts"],"names":[],"mappings":";;;AAAA,qCAAyD;AAEzD,MAAM,kCAAkC,GAAG,CACzC,MAAqB,EACrB,MAAc,EACC,EAAE;IACjB,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAE3B,uCAA8B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CACzD,CAAA;QACD,IAAI,CAAC,UAAU;YAAE,OAAM;QAEvB,OAAO,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAEQ,gFAAkC","sourcesContent":["import { BROADCAST_OR_ESTIMATION_ERRORS } from './errors'\n\nconst humanizeEstimationOrBroadcastError = (\n reason: string | null,\n prefix: string\n): string | null => {\n let message = null\n\n if (!reason) return message\n\n BROADCAST_OR_ESTIMATION_ERRORS.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n reason.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${prefix !== '' ? `${prefix} ` : ''}${error.message}`\n })\n\n return message\n}\n\nexport { humanizeEstimationOrBroadcastError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.js b/dist/src/libs/errorHumanizer/index.js index 0a8d54c50..baa099541 100644 --- a/dist/src/libs/errorHumanizer/index.js +++ b/dist/src/libs/errorHumanizer/index.js @@ -1,4 +1,8 @@ -import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'; -import { getHumanReadableEstimationError } from './estimationErrorHumanizer'; -export { getHumanReadableBroadcastError, getHumanReadableEstimationError }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHumanReadableEstimationError = exports.getHumanReadableBroadcastError = void 0; +const broadcastErrorHumanizer_1 = require("./broadcastErrorHumanizer"); +Object.defineProperty(exports, "getHumanReadableBroadcastError", { enumerable: true, get: function () { return broadcastErrorHumanizer_1.getHumanReadableBroadcastError; } }); +const estimationErrorHumanizer_1 = require("./estimationErrorHumanizer"); +Object.defineProperty(exports, "getHumanReadableEstimationError", { enumerable: true, get: function () { return estimationErrorHumanizer_1.getHumanReadableEstimationError; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/index.js.map b/dist/src/libs/errorHumanizer/index.js.map index 3a5ad0086..2bc6daa5e 100644 --- a/dist/src/libs/errorHumanizer/index.js.map +++ b/dist/src/libs/errorHumanizer/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAA;AAE5E,OAAO,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,CAAA","sourcesContent":["import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'\nimport { getHumanReadableEstimationError } from './estimationErrorHumanizer'\n\nexport { getHumanReadableBroadcastError, getHumanReadableEstimationError }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/index.ts"],"names":[],"mappings":";;;AAAA,uEAA0E;AAGjE,+GAHA,wDAA8B,OAGA;AAFvC,yEAA4E;AAEnC,gHAFhC,0DAA+B,OAEgC","sourcesContent":["import { getHumanReadableBroadcastError } from './broadcastErrorHumanizer'\nimport { getHumanReadableEstimationError } from './estimationErrorHumanizer'\n\nexport { getHumanReadableBroadcastError, getHumanReadableEstimationError }\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/types.js b/dist/src/libs/errorHumanizer/types.js index 718fd38ae..11e638d1e 100644 --- a/dist/src/libs/errorHumanizer/types.js +++ b/dist/src/libs/errorHumanizer/types.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.js b/dist/src/libs/estimate/errors.js index fb590de1a..1309e25ff 100644 --- a/dist/src/libs/estimate/errors.js +++ b/dist/src/libs/estimate/errors.js @@ -1,4 +1,7 @@ -export function estimationErrorFormatted(error, opts) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.estimationErrorFormatted = void 0; +function estimationErrorFormatted(error, opts) { const feePaymentOptions = opts?.feePaymentOptions ?? []; const finalsOps = { ...opts, @@ -12,4 +15,5 @@ export function estimationErrorFormatted(error, opts) { ...finalsOps }; } +exports.estimationErrorFormatted = estimationErrorFormatted; //# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/errors.js.map b/dist/src/libs/estimate/errors.js.map index bbfbfb9e3..d7131cc36 100644 --- a/dist/src/libs/estimate/errors.js.map +++ b/dist/src/libs/estimate/errors.js.map @@ -1 +1 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/estimate/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,KAAY,EACZ,IAGC;IAED,MAAM,iBAAiB,GAAG,IAAI,EAAE,iBAAiB,IAAI,EAAE,CAAA;IACvD,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,iBAAiB;QACjB,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,SAAS;KAClD,CAAA;IAED,OAAO;QACL,OAAO,EAAE,EAAE;QACX,mBAAmB,EAAE,CAAC;QACtB,KAAK;QACL,GAAG,SAAS;KACb,CAAA;AACH,CAAC","sourcesContent":["import { EstimateResult } from './interfaces'\n\nexport function estimationErrorFormatted(\n error: Error,\n opts?: {\n feePaymentOptions?: EstimateResult['feePaymentOptions']\n nonFatalErrors?: Error[]\n }\n): EstimateResult {\n const feePaymentOptions = opts?.feePaymentOptions ?? []\n const finalsOps = {\n ...opts,\n feePaymentOptions,\n nonFatalErrors: opts?.nonFatalErrors ?? undefined\n }\n\n return {\n gasUsed: 0n,\n currentAccountNonce: 0,\n error,\n ...finalsOps\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/estimate/errors.ts"],"names":[],"mappings":";;;AAEA,SAAgB,wBAAwB,CACtC,KAAY,EACZ,IAGC;IAED,MAAM,iBAAiB,GAAG,IAAI,EAAE,iBAAiB,IAAI,EAAE,CAAA;IACvD,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,iBAAiB;QACjB,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,SAAS;KAClD,CAAA;IAED,OAAO;QACL,OAAO,EAAE,EAAE;QACX,mBAAmB,EAAE,CAAC;QACtB,KAAK;QACL,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AApBD,4DAoBC","sourcesContent":["import { EstimateResult } from './interfaces'\n\nexport function estimationErrorFormatted(\n error: Error,\n opts?: {\n feePaymentOptions?: EstimateResult['feePaymentOptions']\n nonFatalErrors?: Error[]\n }\n): EstimateResult {\n const feePaymentOptions = opts?.feePaymentOptions ?? []\n const finalsOps = {\n ...opts,\n feePaymentOptions,\n nonFatalErrors: opts?.nonFatalErrors ?? undefined\n }\n\n return {\n gasUsed: 0n,\n currentAccountNonce: 0,\n error,\n ...finalsOps\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.js b/dist/src/libs/estimate/estimate.js index f4a025c1a..ebe197241 100644 --- a/dist/src/libs/estimate/estimate.js +++ b/dist/src/libs/estimate/estimate.js @@ -1,28 +1,32 @@ -import { AbiCoder, ZeroAddress } from 'ethers'; -import Estimation from '../../../contracts/compiled/Estimation.json'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { DEPLOYLESS_SIMULATION_FROM, OPTIMISTIC_ORACLE } from '../../consts/deploy'; -import { getAccountDeployParams, isSmartAccount } from '../account/account'; -import { toSingletonCall } from '../accountOp/accountOp'; -import { getFeeCall } from '../calls/calls'; -import { fromDescriptor } from '../deployless/deployless'; -import { InnerCallFailureError } from '../errorDecoder/customErrors'; -import { getHumanReadableEstimationError } from '../errorHumanizer'; -import { getProbableCallData } from '../gasPrice/gasPrice'; -import { hasRelayerSupport } from '../networks/networks'; -import { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'; -import { estimationErrorFormatted } from './errors'; -import { bundlerEstimate } from './estimateBundler'; -import { estimateEOA } from './estimateEOA'; -import { estimateGas } from './estimateGas'; -import { getFeeTokenForEstimate } from './estimateHelpers'; -import { estimateWithRetries } from './estimateWithRetries'; -import { refund } from './refund'; -const abiCoder = new AbiCoder(); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.estimate = exports.estimate4337 = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const Estimation_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/Estimation.json")); +const addresses_1 = require("../../consts/addresses"); +const deploy_1 = require("../../consts/deploy"); +const account_1 = require("../account/account"); +const accountOp_1 = require("../accountOp/accountOp"); +const calls_1 = require("../calls/calls"); +const deployless_1 = require("../deployless/deployless"); +const customErrors_1 = require("../errorDecoder/customErrors"); +const errorHumanizer_1 = require("../errorHumanizer"); +const gasPrice_1 = require("../gasPrice/gasPrice"); +const networks_1 = require("../networks/networks"); +const userOperation_1 = require("../userOperation/userOperation"); +const errors_1 = require("./errors"); +const estimateBundler_1 = require("./estimateBundler"); +const estimateEOA_1 = require("./estimateEOA"); +const estimateGas_1 = require("./estimateGas"); +const estimateHelpers_1 = require("./estimateHelpers"); +const estimateWithRetries_1 = require("./estimateWithRetries"); +const refund_1 = require("./refund"); +const abiCoder = new ethers_1.AbiCoder(); function getInnerCallFailure(estimationOp, calls, network, portfolioNativeValue) { if (estimationOp.success) return null; - const error = getHumanReadableEstimationError(new InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)); + const error = (0, errorHumanizer_1.getHumanReadableEstimationError)(new customErrors_1.InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)); return new Error(error.message, { cause: 'CALLS_FAILURE' }); @@ -36,8 +40,8 @@ function getNonceDiscrepancyFailure(op, outcomeNonce) { cause: 'NONCE_FAILURE' }); } -export async function estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, switcher, errorCallback) { - const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); +async function estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, switcher, errorCallback) { + const deploylessEstimator = (0, deployless_1.fromDescriptor)(provider, Estimation_json_1.default, !network.rpcNoStateOverride); // build the feePaymentOptions with the available current amounts. We will // change them after simulation passes let feePaymentOptions = feeTokens.map((token) => { @@ -60,7 +64,7 @@ export async function estimate4337(account, op, calls, accountStates, network, p const accountState = accountStates[op.accountAddr][op.networkId]; const checkInnerCallsArgs = [ account.addr, - ...getAccountDeployParams(account), + ...(0, account_1.getAccountDeployParams)(account), [ account.addr, op.accountOpToExecuteBefore?.nonce || 0, @@ -68,42 +72,42 @@ export async function estimate4337(account, op, calls, accountStates, network, p op.accountOpToExecuteBefore?.signature || '0x' ], [account.addr, op.nonce || 1, calls, '0x'], - getProbableCallData(account, op, accountState, network), + (0, gasPrice_1.getProbableCallData)(account, op, accountState, network), account.associatedKeys, feeTokens.map((feeToken) => feeToken.address), - FEE_COLLECTOR, + addresses_1.FEE_COLLECTOR, nativeToCheck, - network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress + network.isOptimistic ? deploy_1.OPTIMISTIC_ORACLE : ethers_1.ZeroAddress ]; // always add a feeCall if available as we're using the paymaster // on predefined chains and on custom networks it is better to // have a slightly bigger estimation (if we don't have a paymaster) const estimateGasOp = { ...op }; - const feeToken = getFeeTokenForEstimate(feeTokens, network); + const feeToken = (0, estimateHelpers_1.getFeeTokenForEstimate)(feeTokens, network); if (feeToken) - estimateGasOp.feeCall = getFeeCall(feeToken); + estimateGasOp.feeCall = (0, calls_1.getFeeCall)(feeToken); const initializeRequests = () => [ deploylessEstimator .call('estimate', checkInnerCallsArgs, { - from: DEPLOYLESS_SIMULATION_FROM, + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, blockTag }) - .catch(getHumanReadableEstimationError), - bundlerEstimate(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback), - estimateGas(account, estimateGasOp, provider, accountState, network).catch(() => 0n) + .catch(errorHumanizer_1.getHumanReadableEstimationError), + (0, estimateBundler_1.bundlerEstimate)(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback), + (0, estimateGas_1.estimateGas)(account, estimateGasOp, provider, accountState, network).catch(() => 0n) ]; - const estimations = await estimateWithRetries(initializeRequests, 'estimation-deployless', errorCallback, 12000); + const estimations = await (0, estimateWithRetries_1.estimateWithRetries)(initializeRequests, 'estimation-deployless', errorCallback, 12000); const ambireEstimation = estimations[0]; const bundlerEstimationResult = estimations[1]; if (ambireEstimation instanceof Error) { - return estimationErrorFormatted( + return (0, errors_1.estimationErrorFormatted)( // give priority to the bundler error if both estimations end up with an error bundlerEstimationResult.error ?? ambireEstimation, { feePaymentOptions }); } // // if there's a bundler error only, remove the smart account payment options // if (bundlerEstimationResult instanceof Error) feePaymentOptions = [] const [[deployment, accountOpToExecuteBefore, accountOp, outcomeNonce, feeTokenOutcomes, , nativeAssetBalances, , l1GasEstimation]] = estimations[0]; - const ambireEstimationError = getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, outcomeNonce); + const ambireEstimationError = getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ethers_1.ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, outcomeNonce); // if Estimation.sol estimate is a success, it means the nonce has incremented // so we subtract 1 from it. If it's an error, we return the old one bundlerEstimationResult.currentAccountNonce = accountOp.success @@ -134,7 +138,7 @@ export async function estimate4337(account, op, calls, accountStates, network, p bundlerEstimationResult.gasUsed = bigIntMax(bundlerEstimationResult.gasUsed, estimateGasCall, ambireGas); const isPaymasterUsable = !!bundlerEstimationResult.erc4337GasLimits?.paymaster.isUsable(); bundlerEstimationResult.feePaymentOptions = feePaymentOptions - .filter((option) => isPaymasterUsable || option.token.address === ZeroAddress) + .filter((option) => isPaymasterUsable || option.token.address === ethers_1.ZeroAddress) .map((option, index) => { // after simulation: add the left over amount as available const localOp = { ...option }; @@ -146,7 +150,7 @@ export async function estimate4337(account, op, calls, accountStates, network, p return localOp; }); // this is for EOAs paying for SA in native - const nativeToken = feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank); + const nativeToken = feeTokens.find((token) => token.address === ethers_1.ZeroAddress && !token.flags.onGasTank); const nativeTokenOptions = nativeAssetBalances.map((balance, key) => ({ paidBy: nativeToCheck[key], availableAmount: balance, @@ -162,30 +166,31 @@ export async function estimate4337(account, op, calls, accountStates, network, p ]; return bundlerEstimationResult; } -export async function estimate(provider, network, account, op, accountStates, nativeToCheck, feeTokens, errorCallback, bundlerSwitcher, opts, blockFrom = '0x0000000000000000000000000000000000000001', blockTag = 'pending') { +exports.estimate4337 = estimate4337; +async function estimate(provider, network, account, op, accountStates, nativeToCheck, feeTokens, errorCallback, bundlerSwitcher, opts, blockFrom = '0x0000000000000000000000000000000000000001', blockTag = 'pending') { // if EOA, delegate - if (!isSmartAccount(account)) - return estimateEOA(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback); + if (!(0, account_1.isSmartAccount)(account)) + return (0, estimateEOA_1.estimateEOA)(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback); if (!network.isSAEnabled) - return estimationErrorFormatted(new Error('Smart accounts are not available for this network. Please use a Basic Account')); + return (0, errors_1.estimationErrorFormatted)(new Error('Smart accounts are not available for this network. Please use a Basic Account')); if (!network.areContractsDeployed) - return estimationErrorFormatted(new Error('The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings')); + return (0, errors_1.estimationErrorFormatted)(new Error('The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings')); // @EntryPoint activation // if the account is v2 without the entry point signer being a signer // and the network is 4337 but doesn't have a paymaster and the account // is deployed for some reason, we should include the activator - const calls = [...op.calls.map(toSingletonCall)]; + const calls = [...op.calls.map(accountOp_1.toSingletonCall)]; const accountState = accountStates[op.accountAddr][op.networkId]; - if (shouldIncludeActivatorCall(network, account, accountState, false)) { - calls.push(getActivatorCall(op.accountAddr)); + if ((0, userOperation_1.shouldIncludeActivatorCall)(network, account, accountState, false)) { + calls.push((0, userOperation_1.getActivatorCall)(op.accountAddr)); } // if 4337, delegate if (opts && opts.is4337Broadcast) return estimate4337(account, op, calls, accountStates, network, provider, feeTokens, blockTag, nativeToCheck, bundlerSwitcher, errorCallback); - const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); - const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress; + const deploylessEstimator = (0, deployless_1.fromDescriptor)(provider, Estimation_json_1.default, !network.rpcNoStateOverride); + const optimisticOracle = network.isOptimistic ? deploy_1.OPTIMISTIC_ORACLE : ethers_1.ZeroAddress; // if the network doesn't have a relayer, we can't pay in fee tokens - const filteredFeeTokens = hasRelayerSupport(network) ? feeTokens : []; + const filteredFeeTokens = (0, networks_1.hasRelayerSupport)(network) ? feeTokens : []; // @L2s // craft the probableTxn that's going to be saved on the L1 // so we could do proper estimation @@ -198,9 +203,9 @@ export async function estimate(provider, network, account, op, accountStates, na 'uint256', 'uint256' // gasLimit ], [ - getProbableCallData(account, op, accountState, network), + (0, gasPrice_1.getProbableCallData)(account, op, accountState, network), op.accountAddr, - FEE_COLLECTOR, + addresses_1.FEE_COLLECTOR, 100000, 2, op.nonce, @@ -208,7 +213,7 @@ export async function estimate(provider, network, account, op, accountStates, na ]); const args = [ account.addr, - ...getAccountDeployParams(account), + ...(0, account_1.getAccountDeployParams)(account), // @TODO can pass 0 here for the addr [ account.addr, @@ -220,7 +225,7 @@ export async function estimate(provider, network, account, op, accountStates, na encodedCallData, account.associatedKeys, filteredFeeTokens.map((token) => token.address), - FEE_COLLECTOR, + addresses_1.FEE_COLLECTOR, nativeToCheck, optimisticOracle ]; @@ -230,12 +235,12 @@ export async function estimate(provider, network, account, op, accountStates, na from: blockFrom, blockTag }) - .catch(getHumanReadableEstimationError), - estimateGas(account, op, provider, accountState, network).catch(() => 0n) + .catch(errorHumanizer_1.getHumanReadableEstimationError), + (0, estimateGas_1.estimateGas)(account, op, provider, accountState, network).catch(() => 0n) ]; - const estimations = await estimateWithRetries(initializeRequests, 'estimation-deployless', errorCallback); + const estimations = await (0, estimateWithRetries_1.estimateWithRetries)(initializeRequests, 'estimation-deployless', errorCallback); if (estimations instanceof Error) - return estimationErrorFormatted(estimations); + return (0, errors_1.estimationErrorFormatted)(estimations); const [[deployment, accountOpToExecuteBefore, accountOp, nonce, feeTokenOutcomes, , nativeAssetBalances, , l1GasEstimation // [gasUsed, baseFee, totalFee, gasOracle] ]] = estimations[0]; let gasUsed = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed; @@ -246,7 +251,7 @@ export async function estimate(provider, network, account, op, accountStates, na // WARNING: calculateRefund will 100% NOT work in all cases we have // So a warning not to assume this is working if (opts?.calculateRefund) - gasUsed = await refund(account, op, provider, gasUsed); + gasUsed = await (0, refund_1.refund)(account, op, provider, gasUsed); const feeTokenOptions = filteredFeeTokens.map((token, key) => { const availableAmount = token.flags.onGasTank ? token.amount : feeTokenOutcomes[key].amount; return { @@ -262,7 +267,7 @@ export async function estimate(provider, network, account, op, accountStates, na // broadcasts will always consume at least 4035. // setting it to 5000n just be sure gasUsed: token.flags.onGasTank ? 5000n : feeTokenOutcomes[key].gasUsed, - addedNative: token.address === ZeroAddress + addedNative: token.address === ethers_1.ZeroAddress ? l1GasEstimation.feeWithNativePayment : l1GasEstimation.feeWithTransferPayment, token: { @@ -272,7 +277,7 @@ export async function estimate(provider, network, account, op, accountStates, na }; }); // this is for EOAs paying for SA in native - const nativeToken = feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank); + const nativeToken = feeTokens.find((token) => token.address === ethers_1.ZeroAddress && !token.flags.onGasTank); const nativeTokenOptions = nativeAssetBalances.map((balance, key) => ({ paidBy: nativeToCheck[key], availableAmount: balance, @@ -288,7 +293,8 @@ export async function estimate(provider, network, account, op, accountStates, na // so we subtract 1 from it. If it's an error, we return the old one currentAccountNonce: accountOp.success ? Number(nonce - 1n) : Number(nonce), feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions], - error: getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, nonce) + error: getInnerCallFailure(accountOp, calls, network, feeTokens.find((token) => token.address === ethers_1.ZeroAddress && !token.flags.onGasTank)?.amount) || getNonceDiscrepancyFailure(op, nonce) }; } +exports.estimate = estimate; //# sourceMappingURL=estimate.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimate.js.map b/dist/src/libs/estimate/estimate.js.map index bd5adfed1..a415f921e 100644 --- a/dist/src/libs/estimate/estimate.js.map +++ b/dist/src/libs/estimate/estimate.js.map @@ -1 +1 @@ -{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM, OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { InnerCallFailureError } from '../errorDecoder/customErrors'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { getProbableCallData } from '../gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../networks/networks'\nimport { TokenResult } from '../portfolio'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { bundlerEstimate } from './estimateBundler'\nimport { estimateEOA } from './estimateEOA'\nimport { estimateGas } from './estimateGas'\nimport { getFeeTokenForEstimate } from './estimateHelpers'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\nimport { refund } from './refund'\n\nconst abiCoder = new AbiCoder()\n\nfunction getInnerCallFailure(\n estimationOp: { success: boolean; err: string },\n calls: Call[],\n network: Network,\n portfolioNativeValue?: bigint\n): Error | null {\n if (estimationOp.success) return null\n\n const error = getHumanReadableEstimationError(\n new InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)\n )\n\n return new Error(error.message, {\n cause: 'CALLS_FAILURE'\n })\n}\n\n// the outcomeNonce should always be equal to the nonce in accountOp + 1\n// that's an indication of transaction success\nfunction getNonceDiscrepancyFailure(op: AccountOp, outcomeNonce: number): Error | null {\n if (op.nonce !== null && op.nonce + 1n === BigInt(outcomeNonce)) return null\n\n return new Error(\"Nonce discrepancy, perhaps there's a pending transaction. Retrying...\", {\n cause: 'NONCE_FAILURE'\n })\n}\n\nexport async function estimate4337(\n account: Account,\n op: AccountOp,\n calls: Call[],\n accountStates: AccountStates,\n network: Network,\n provider: RPCProvider,\n feeTokens: TokenResult[],\n blockTag: string | number,\n nativeToCheck: string[],\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n\n // build the feePaymentOptions with the available current amounts. We will\n // change them after simulation passes\n let feePaymentOptions = feeTokens.map((token: TokenResult) => {\n return {\n paidBy: account.addr,\n availableAmount: token.amount,\n // @relyOnBundler\n // gasUsed goes to 0\n // we add a transfer call or a native call when sending the uOp to the\n // bundler and he estimates that. For different networks this gasUsed\n // goes to different places (callGasLimit or preVerificationGas) and\n // its calculated differently. So it's a wild bet to think we could\n // calculate this on our own for each network.\n gasUsed: 0n,\n // addedNative gets calculated by the bundler & added to uOp gasData\n addedNative: 0n,\n token\n }\n })\n\n const accountState = accountStates[op.accountAddr][op.networkId]\n const checkInnerCallsArgs = [\n account.addr,\n ...getAccountDeployParams(account),\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n getProbableCallData(account, op, accountState, network),\n account.associatedKeys,\n feeTokens.map((feeToken) => feeToken.address),\n FEE_COLLECTOR,\n nativeToCheck,\n network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n ]\n\n // always add a feeCall if available as we're using the paymaster\n // on predefined chains and on custom networks it is better to\n // have a slightly bigger estimation (if we don't have a paymaster)\n const estimateGasOp = { ...op }\n const feeToken = getFeeTokenForEstimate(feeTokens, network)\n if (feeToken) estimateGasOp.feeCall = getFeeCall(feeToken)\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', checkInnerCallsArgs, {\n from: DEPLOYLESS_SIMULATION_FROM,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n bundlerEstimate(\n account,\n accountStates,\n op,\n network,\n feeTokens,\n provider,\n switcher,\n errorCallback\n ),\n estimateGas(account, estimateGasOp, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback,\n 12000\n )\n\n const ambireEstimation = estimations[0]\n const bundlerEstimationResult: EstimateResult = estimations[1]\n if (ambireEstimation instanceof Error) {\n return estimationErrorFormatted(\n // give priority to the bundler error if both estimations end up with an error\n bundlerEstimationResult.error ?? ambireEstimation,\n { feePaymentOptions }\n )\n }\n // // if there's a bundler error only, remove the smart account payment options\n // if (bundlerEstimationResult instanceof Error) feePaymentOptions = []\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n outcomeNonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation\n ]\n ] = estimations[0]\n const ambireEstimationError =\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, outcomeNonce)\n\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n bundlerEstimationResult.currentAccountNonce = accountOp.success\n ? Number(outcomeNonce - 1n)\n : Number(outcomeNonce)\n\n if (ambireEstimationError) {\n // if there's an ambire estimation error, we do not allow the txn\n // to be executed as it means it will most certainly fail\n bundlerEstimationResult.error = ambireEstimationError\n } else if (!ambireEstimationError && bundlerEstimationResult.error) {\n // if there's a bundler error only, it means it's a bundler specific\n // problem. If we can switch the bundler, re-estimate\n if (switcher.canSwitch(null)) {\n switcher.switch()\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n switcher,\n errorCallback\n )\n }\n\n // if there's a bundler error only, it means we cannot do ERC-4337\n // but we have to do broadcast by EOA\n feePaymentOptions = []\n delete bundlerEstimationResult.erc4337GasLimits\n bundlerEstimationResult.error = null\n }\n\n // set the gasUsed to the biggest one found from all estimations\n const bigIntMax = (...args: bigint[]): bigint => args.reduce((m, e) => (e > m ? e : m))\n const ambireGas = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n const estimateGasCall = estimations[2]\n bundlerEstimationResult.gasUsed = bigIntMax(\n bundlerEstimationResult.gasUsed,\n estimateGasCall,\n ambireGas\n )\n\n const isPaymasterUsable = !!bundlerEstimationResult.erc4337GasLimits?.paymaster.isUsable()\n bundlerEstimationResult.feePaymentOptions = feePaymentOptions\n .filter((option) => isPaymasterUsable || option.token.address === ZeroAddress)\n .map((option: FeePaymentOption, index: number) => {\n // after simulation: add the left over amount as available\n const localOp = { ...option }\n if (!option.token.flags.onGasTank) {\n localOp.availableAmount = feeTokenOutcomes[index][1]\n localOp.token.amount = feeTokenOutcomes[index][1]\n }\n\n localOp.gasUsed = localOp.token.flags.onGasTank ? 5000n : feeTokenOutcomes[index][0]\n return localOp\n })\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n bundlerEstimationResult.feePaymentOptions = [\n ...bundlerEstimationResult.feePaymentOptions,\n ...nativeTokenOptions\n ]\n return bundlerEstimationResult\n}\n\nexport async function estimate(\n provider: RPCProvider,\n network: Network,\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n nativeToCheck: string[],\n feeTokens: TokenResult[],\n errorCallback: Function,\n bundlerSwitcher: BundlerSwitcher,\n opts?: {\n calculateRefund?: boolean\n is4337Broadcast?: boolean\n },\n blockFrom: string = '0x0000000000000000000000000000000000000001',\n blockTag: string | number = 'pending'\n): Promise {\n // if EOA, delegate\n if (!isSmartAccount(account))\n return estimateEOA(\n account,\n op,\n accountStates,\n network,\n provider,\n feeTokens,\n blockFrom,\n blockTag,\n errorCallback\n )\n\n if (!network.isSAEnabled)\n return estimationErrorFormatted(\n new Error('Smart accounts are not available for this network. Please use a Basic Account')\n )\n if (!network.areContractsDeployed)\n return estimationErrorFormatted(\n new Error(\n 'The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings'\n )\n )\n\n // @EntryPoint activation\n // if the account is v2 without the entry point signer being a signer\n // and the network is 4337 but doesn't have a paymaster and the account\n // is deployed for some reason, we should include the activator\n const calls = [...op.calls.map(toSingletonCall)]\n const accountState = accountStates[op.accountAddr][op.networkId]\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n calls.push(getActivatorCall(op.accountAddr))\n }\n\n // if 4337, delegate\n if (opts && opts.is4337Broadcast)\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n bundlerSwitcher,\n errorCallback\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n\n // if the network doesn't have a relayer, we can't pay in fee tokens\n const filteredFeeTokens = hasRelayerSupport(network) ? feeTokens : []\n\n // @L2s\n // craft the probableTxn that's going to be saved on the L1\n // so we could do proper estimation\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [\n getProbableCallData(account, op, accountState, network),\n op.accountAddr,\n FEE_COLLECTOR,\n 100000,\n 2,\n op.nonce,\n 100000\n ]\n )\n\n const args = [\n account.addr,\n ...getAccountDeployParams(account),\n // @TODO can pass 0 here for the addr\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n encodedCallData,\n account.associatedKeys,\n filteredFeeTokens.map((token) => token.address),\n FEE_COLLECTOR,\n nativeToCheck,\n optimisticOracle\n ]\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', args, {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n estimateGas(account, op, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback\n )\n\n if (estimations instanceof Error) return estimationErrorFormatted(estimations)\n\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n nonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation // [gasUsed, baseFee, totalFee, gasOracle]\n ]\n ] = estimations[0]\n\n let gasUsed = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n\n // if estimateGas brings a bigger estimation than Estimation.sol, use it\n const customlyEstimatedGas = estimations[1]\n if (gasUsed < customlyEstimatedGas) gasUsed = customlyEstimatedGas\n\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n if (opts?.calculateRefund) gasUsed = await refund(account, op, provider, gasUsed)\n\n const feeTokenOptions: FeePaymentOption[] = filteredFeeTokens.map(\n (token: TokenResult, key: number) => {\n const availableAmount = token.flags.onGasTank ? token.amount : feeTokenOutcomes[key].amount\n return {\n paidBy: account.addr,\n availableAmount,\n // gasUsed for the gas tank tokens is smaller because of the commitment:\n // ['gasTank', amount, symbol]\n // and this commitment costs onchain:\n // - 1535, if the broadcasting addr is the relayer\n // - 4035, if the broadcasting addr is different\n // currently, there are more than 1 relayer addresses and we cannot\n // be sure which is the one that will broadcast this txn; also, ERC-4337\n // broadcasts will always consume at least 4035.\n // setting it to 5000n just be sure\n gasUsed: token.flags.onGasTank ? 5000n : feeTokenOutcomes[key].gasUsed,\n addedNative:\n token.address === ZeroAddress\n ? l1GasEstimation.feeWithNativePayment\n : l1GasEstimation.feeWithTransferPayment,\n token: {\n ...token,\n amount: availableAmount\n }\n }\n }\n )\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n\n return {\n gasUsed,\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n currentAccountNonce: accountOp.success ? Number(nonce - 1n) : Number(nonce),\n feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions],\n error:\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, nonce)\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { DEPLOYLESS_SIMULATION_FROM, OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { InnerCallFailureError } from '../errorDecoder/customErrors'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { getProbableCallData } from '../gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../networks/networks'\nimport { TokenResult } from '../portfolio'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { bundlerEstimate } from './estimateBundler'\nimport { estimateEOA } from './estimateEOA'\nimport { estimateGas } from './estimateGas'\nimport { getFeeTokenForEstimate } from './estimateHelpers'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\nimport { refund } from './refund'\n\nconst abiCoder = new AbiCoder()\n\nfunction getInnerCallFailure(\n estimationOp: { success: boolean; err: string },\n calls: Call[],\n network: Network,\n portfolioNativeValue?: bigint\n): Error | null {\n if (estimationOp.success) return null\n\n const error = getHumanReadableEstimationError(\n new InnerCallFailureError(estimationOp.err, calls, network, portfolioNativeValue)\n )\n\n return new Error(error.message, {\n cause: 'CALLS_FAILURE'\n })\n}\n\n// the outcomeNonce should always be equal to the nonce in accountOp + 1\n// that's an indication of transaction success\nfunction getNonceDiscrepancyFailure(op: AccountOp, outcomeNonce: number): Error | null {\n if (op.nonce !== null && op.nonce + 1n === BigInt(outcomeNonce)) return null\n\n return new Error(\"Nonce discrepancy, perhaps there's a pending transaction. Retrying...\", {\n cause: 'NONCE_FAILURE'\n })\n}\n\nexport async function estimate4337(\n account: Account,\n op: AccountOp,\n calls: Call[],\n accountStates: AccountStates,\n network: Network,\n provider: RPCProvider,\n feeTokens: TokenResult[],\n blockTag: string | number,\n nativeToCheck: string[],\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n\n // build the feePaymentOptions with the available current amounts. We will\n // change them after simulation passes\n let feePaymentOptions = feeTokens.map((token: TokenResult) => {\n return {\n paidBy: account.addr,\n availableAmount: token.amount,\n // @relyOnBundler\n // gasUsed goes to 0\n // we add a transfer call or a native call when sending the uOp to the\n // bundler and he estimates that. For different networks this gasUsed\n // goes to different places (callGasLimit or preVerificationGas) and\n // its calculated differently. So it's a wild bet to think we could\n // calculate this on our own for each network.\n gasUsed: 0n,\n // addedNative gets calculated by the bundler & added to uOp gasData\n addedNative: 0n,\n token\n }\n })\n\n const accountState = accountStates[op.accountAddr][op.networkId]\n const checkInnerCallsArgs = [\n account.addr,\n ...getAccountDeployParams(account),\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n getProbableCallData(account, op, accountState, network),\n account.associatedKeys,\n feeTokens.map((feeToken) => feeToken.address),\n FEE_COLLECTOR,\n nativeToCheck,\n network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n ]\n\n // always add a feeCall if available as we're using the paymaster\n // on predefined chains and on custom networks it is better to\n // have a slightly bigger estimation (if we don't have a paymaster)\n const estimateGasOp = { ...op }\n const feeToken = getFeeTokenForEstimate(feeTokens, network)\n if (feeToken) estimateGasOp.feeCall = getFeeCall(feeToken)\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', checkInnerCallsArgs, {\n from: DEPLOYLESS_SIMULATION_FROM,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n bundlerEstimate(\n account,\n accountStates,\n op,\n network,\n feeTokens,\n provider,\n switcher,\n errorCallback\n ),\n estimateGas(account, estimateGasOp, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback,\n 12000\n )\n\n const ambireEstimation = estimations[0]\n const bundlerEstimationResult: EstimateResult = estimations[1]\n if (ambireEstimation instanceof Error) {\n return estimationErrorFormatted(\n // give priority to the bundler error if both estimations end up with an error\n bundlerEstimationResult.error ?? ambireEstimation,\n { feePaymentOptions }\n )\n }\n // // if there's a bundler error only, remove the smart account payment options\n // if (bundlerEstimationResult instanceof Error) feePaymentOptions = []\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n outcomeNonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation\n ]\n ] = estimations[0]\n const ambireEstimationError =\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, outcomeNonce)\n\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n bundlerEstimationResult.currentAccountNonce = accountOp.success\n ? Number(outcomeNonce - 1n)\n : Number(outcomeNonce)\n\n if (ambireEstimationError) {\n // if there's an ambire estimation error, we do not allow the txn\n // to be executed as it means it will most certainly fail\n bundlerEstimationResult.error = ambireEstimationError\n } else if (!ambireEstimationError && bundlerEstimationResult.error) {\n // if there's a bundler error only, it means it's a bundler specific\n // problem. If we can switch the bundler, re-estimate\n if (switcher.canSwitch(null)) {\n switcher.switch()\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n switcher,\n errorCallback\n )\n }\n\n // if there's a bundler error only, it means we cannot do ERC-4337\n // but we have to do broadcast by EOA\n feePaymentOptions = []\n delete bundlerEstimationResult.erc4337GasLimits\n bundlerEstimationResult.error = null\n }\n\n // set the gasUsed to the biggest one found from all estimations\n const bigIntMax = (...args: bigint[]): bigint => args.reduce((m, e) => (e > m ? e : m))\n const ambireGas = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n const estimateGasCall = estimations[2]\n bundlerEstimationResult.gasUsed = bigIntMax(\n bundlerEstimationResult.gasUsed,\n estimateGasCall,\n ambireGas\n )\n\n const isPaymasterUsable = !!bundlerEstimationResult.erc4337GasLimits?.paymaster.isUsable()\n bundlerEstimationResult.feePaymentOptions = feePaymentOptions\n .filter((option) => isPaymasterUsable || option.token.address === ZeroAddress)\n .map((option: FeePaymentOption, index: number) => {\n // after simulation: add the left over amount as available\n const localOp = { ...option }\n if (!option.token.flags.onGasTank) {\n localOp.availableAmount = feeTokenOutcomes[index][1]\n localOp.token.amount = feeTokenOutcomes[index][1]\n }\n\n localOp.gasUsed = localOp.token.flags.onGasTank ? 5000n : feeTokenOutcomes[index][0]\n return localOp\n })\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n bundlerEstimationResult.feePaymentOptions = [\n ...bundlerEstimationResult.feePaymentOptions,\n ...nativeTokenOptions\n ]\n return bundlerEstimationResult\n}\n\nexport async function estimate(\n provider: RPCProvider,\n network: Network,\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n nativeToCheck: string[],\n feeTokens: TokenResult[],\n errorCallback: Function,\n bundlerSwitcher: BundlerSwitcher,\n opts?: {\n calculateRefund?: boolean\n is4337Broadcast?: boolean\n },\n blockFrom: string = '0x0000000000000000000000000000000000000001',\n blockTag: string | number = 'pending'\n): Promise {\n // if EOA, delegate\n if (!isSmartAccount(account))\n return estimateEOA(\n account,\n op,\n accountStates,\n network,\n provider,\n feeTokens,\n blockFrom,\n blockTag,\n errorCallback\n )\n\n if (!network.isSAEnabled)\n return estimationErrorFormatted(\n new Error('Smart accounts are not available for this network. Please use a Basic Account')\n )\n if (!network.areContractsDeployed)\n return estimationErrorFormatted(\n new Error(\n 'The Ambire smart contracts are not deployed on this network, yet. You can deploy them via a Basic Account throught the network settings'\n )\n )\n\n // @EntryPoint activation\n // if the account is v2 without the entry point signer being a signer\n // and the network is 4337 but doesn't have a paymaster and the account\n // is deployed for some reason, we should include the activator\n const calls = [...op.calls.map(toSingletonCall)]\n const accountState = accountStates[op.accountAddr][op.networkId]\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n calls.push(getActivatorCall(op.accountAddr))\n }\n\n // if 4337, delegate\n if (opts && opts.is4337Broadcast)\n return estimate4337(\n account,\n op,\n calls,\n accountStates,\n network,\n provider,\n feeTokens,\n blockTag,\n nativeToCheck,\n bundlerSwitcher,\n errorCallback\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n\n // if the network doesn't have a relayer, we can't pay in fee tokens\n const filteredFeeTokens = hasRelayerSupport(network) ? feeTokens : []\n\n // @L2s\n // craft the probableTxn that's going to be saved on the L1\n // so we could do proper estimation\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [\n getProbableCallData(account, op, accountState, network),\n op.accountAddr,\n FEE_COLLECTOR,\n 100000,\n 2,\n op.nonce,\n 100000\n ]\n )\n\n const args = [\n account.addr,\n ...getAccountDeployParams(account),\n // @TODO can pass 0 here for the addr\n [\n account.addr,\n op.accountOpToExecuteBefore?.nonce || 0,\n op.accountOpToExecuteBefore?.calls || [],\n op.accountOpToExecuteBefore?.signature || '0x'\n ],\n [account.addr, op.nonce || 1, calls, '0x'],\n encodedCallData,\n account.associatedKeys,\n filteredFeeTokens.map((token) => token.address),\n FEE_COLLECTOR,\n nativeToCheck,\n optimisticOracle\n ]\n\n const initializeRequests = () => [\n deploylessEstimator\n .call('estimate', args, {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError),\n estimateGas(account, op, provider, accountState, network).catch(() => 0n)\n ]\n const estimations = await estimateWithRetries(\n initializeRequests,\n 'estimation-deployless',\n errorCallback\n )\n\n if (estimations instanceof Error) return estimationErrorFormatted(estimations)\n\n const [\n [\n deployment,\n accountOpToExecuteBefore,\n accountOp,\n nonce,\n feeTokenOutcomes,\n ,\n nativeAssetBalances,\n ,\n l1GasEstimation // [gasUsed, baseFee, totalFee, gasOracle]\n ]\n ] = estimations[0]\n\n let gasUsed = deployment.gasUsed + accountOpToExecuteBefore.gasUsed + accountOp.gasUsed\n\n // if estimateGas brings a bigger estimation than Estimation.sol, use it\n const customlyEstimatedGas = estimations[1]\n if (gasUsed < customlyEstimatedGas) gasUsed = customlyEstimatedGas\n\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n if (opts?.calculateRefund) gasUsed = await refund(account, op, provider, gasUsed)\n\n const feeTokenOptions: FeePaymentOption[] = filteredFeeTokens.map(\n (token: TokenResult, key: number) => {\n const availableAmount = token.flags.onGasTank ? token.amount : feeTokenOutcomes[key].amount\n return {\n paidBy: account.addr,\n availableAmount,\n // gasUsed for the gas tank tokens is smaller because of the commitment:\n // ['gasTank', amount, symbol]\n // and this commitment costs onchain:\n // - 1535, if the broadcasting addr is the relayer\n // - 4035, if the broadcasting addr is different\n // currently, there are more than 1 relayer addresses and we cannot\n // be sure which is the one that will broadcast this txn; also, ERC-4337\n // broadcasts will always consume at least 4035.\n // setting it to 5000n just be sure\n gasUsed: token.flags.onGasTank ? 5000n : feeTokenOutcomes[key].gasUsed,\n addedNative:\n token.address === ZeroAddress\n ? l1GasEstimation.feeWithNativePayment\n : l1GasEstimation.feeWithTransferPayment,\n token: {\n ...token,\n amount: availableAmount\n }\n }\n }\n )\n\n // this is for EOAs paying for SA in native\n const nativeToken = feeTokens.find(\n (token) => token.address === ZeroAddress && !token.flags.onGasTank\n )\n const nativeTokenOptions: FeePaymentOption[] = nativeAssetBalances.map(\n (balance: bigint, key: number) => ({\n paidBy: nativeToCheck[key],\n availableAmount: balance,\n addedNative: l1GasEstimation.fee,\n token: {\n ...nativeToken,\n amount: balance\n }\n })\n )\n\n return {\n gasUsed,\n // if Estimation.sol estimate is a success, it means the nonce has incremented\n // so we subtract 1 from it. If it's an error, we return the old one\n currentAccountNonce: accountOp.success ? Number(nonce - 1n) : Number(nonce),\n feePaymentOptions: [...feeTokenOptions, ...nativeTokenOptions],\n error:\n getInnerCallFailure(\n accountOp,\n calls,\n network,\n feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)?.amount\n ) || getNonceDiscrepancyFailure(op, nonce)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.js b/dist/src/libs/estimate/estimateBundler.js index fa6a0d516..1a10d4513 100644 --- a/dist/src/libs/estimate/estimateBundler.js +++ b/dist/src/libs/estimate/estimateBundler.js @@ -1,14 +1,18 @@ +"use strict"; /* eslint-disable no-await-in-loop */ /* eslint-disable no-continue */ /* eslint-disable no-constant-condition */ -import { Interface } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import { paymasterFactory } from '../../services/paymaster'; -import { getSignableCallsForBundlerEstimate } from '../accountOp/accountOp'; -import { getHumanReadableEstimationError } from '../errorHumanizer'; -import { getSigForCalculations, getUserOperation } from '../userOperation/userOperation'; -import { estimationErrorFormatted } from './errors'; -import { estimateWithRetries } from './estimateWithRetries'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bundlerEstimate = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const paymaster_1 = require("../../services/paymaster"); +const accountOp_1 = require("../accountOp/accountOp"); +const errorHumanizer_1 = require("../errorHumanizer"); +const userOperation_1 = require("../userOperation/userOperation"); +const errors_1 = require("./errors"); +const estimateWithRetries_1 = require("./estimateWithRetries"); async function estimate(bundler, network, userOp, isEdgeCase, errorCallback) { const gasPrice = await bundler.fetchGasPrices(network, errorCallback).catch(() => { return new Error('Could not fetch gas prices, retrying...'); @@ -19,7 +23,7 @@ async function estimate(bundler, network, userOp, isEdgeCase, errorCallback) { return { gasPrice, // if gas prices couldn't be fetched, it means there's an internal error - estimation: getHumanReadableEstimationError(decodedError), + estimation: (0, errorHumanizer_1.getHumanReadableEstimationError)(decodedError), nonFatalErrors: [] }; } @@ -43,17 +47,17 @@ async function estimate(bundler, network, userOp, isEdgeCase, errorCallback) { if (decodedError.reason && decodedError.reason.indexOf('invalid account nonce') !== -1) { nonFatalErrors.push(new Error('4337 invalid account nonce', { cause: '4337_INVALID_NONCE' })); } - return getHumanReadableEstimationError(decodedError); + return (0, errorHumanizer_1.getHumanReadableEstimationError)(decodedError); }) ]; - const estimation = await estimateWithRetries(initializeRequests, 'estimation-bundler', errorCallback); + const estimation = await (0, estimateWithRetries_1.estimateWithRetries)(initializeRequests, 'estimation-bundler', errorCallback); return { gasPrice, estimation, nonFatalErrors }; } -export async function bundlerEstimate(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback) { +async function bundlerEstimate(account, accountStates, op, network, feeTokens, provider, switcher, errorCallback) { // we pass an empty array of feePaymentOptions as they are built // in an upper level using the balances from Estimation.sol. // balances from Estimation.sol reflect the balances after pending txn exec @@ -62,19 +66,19 @@ export async function bundlerEstimate(account, accountStates, op, network, feeTo const accountState = accountStates[localOp.accountAddr][localOp.networkId]; // if there's no entryPointAuthorization, we cannot do the estimation on deploy if (!accountState.isDeployed && (!op.meta || !op.meta.entryPointAuthorization)) - return estimationErrorFormatted(new Error('Entry point privileges not granted. Please contact support'), { feePaymentOptions }); + return (0, errors_1.estimationErrorFormatted)(new Error('Entry point privileges not granted. Please contact support'), { feePaymentOptions }); const initialBundler = switcher.getBundler(); - const userOp = getUserOperation(account, accountState, localOp, initialBundler.getName(), !accountState.isDeployed ? op.meta.entryPointAuthorization : undefined); + const userOp = (0, userOperation_1.getUserOperation)(account, accountState, localOp, initialBundler.getName(), !accountState.isDeployed ? op.meta.entryPointAuthorization : undefined); // set the callData if (userOp.activatorCall) localOp.activatorCall = userOp.activatorCall; - const ambireAccount = new Interface(AmbireAccount.abi); + const ambireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); const isEdgeCase = !accountState.isErc4337Enabled && accountState.isDeployed; - userOp.signature = getSigForCalculations(); - const paymaster = await paymasterFactory.create(op, userOp, network, provider); + userOp.signature = (0, userOperation_1.getSigForCalculations)(); + const paymaster = await paymaster_1.paymasterFactory.create(op, userOp, network, provider); localOp.feeCall = paymaster.getFeeCallForEstimation(feeTokens); userOp.callData = ambireAccount.encodeFunctionData('executeBySender', [ - getSignableCallsForBundlerEstimate(localOp) + (0, accountOp_1.getSignableCallsForBundlerEstimate)(localOp) ]); if (paymaster.isUsable()) { const paymasterEstimationData = paymaster.getEstimationData(); @@ -110,7 +114,7 @@ export async function bundlerEstimate(account, accountStates, op, network, feeTo } // if there's an error but we can't switch, return the error if (!switcher.canSwitch(estimations.estimation)) { - return estimationErrorFormatted(estimations.estimation, { + return (0, errors_1.estimationErrorFormatted)(estimations.estimation, { feePaymentOptions, nonFatalErrors: estimations.nonFatalErrors }); @@ -119,4 +123,5 @@ export async function bundlerEstimate(account, accountStates, op, network, feeTo switcher.switch(); } } +exports.bundlerEstimate = bundlerEstimate; //# sourceMappingURL=estimateBundler.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateBundler.js.map b/dist/src/libs/estimate/estimateBundler.js.map index 8490dadc6..e7be2d2a3 100644 --- a/dist/src/libs/estimate/estimateBundler.js.map +++ b/dist/src/libs/estimate/estimateBundler.js.map @@ -1 +1 @@ -{"version":3,"file":"estimateBundler.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateBundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\n/* eslint-disable no-continue */\n/* eslint-disable no-constant-condition */\n\nimport { Interface } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { AccountOp, getSignableCallsForBundlerEstimate } from '../accountOp/accountOp'\nimport { PaymasterEstimationData } from '../erc7677/types'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getSigForCalculations, getUserOperation } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\n\nasync function estimate(\n bundler: Bundler,\n network: Network,\n userOp: UserOperation,\n isEdgeCase: boolean,\n errorCallback: Function\n): Promise<{\n gasPrice: GasSpeeds | Error\n estimation: any\n nonFatalErrors: Error[]\n}> {\n const gasPrice = await bundler.fetchGasPrices(network, errorCallback).catch(() => {\n return new Error('Could not fetch gas prices, retrying...')\n })\n\n // if the gasPrice fetch fails, we will switch the bundler and try again\n if (gasPrice instanceof Error) {\n const decodedError = bundler.decodeBundlerError(new Error('internal error'))\n return {\n gasPrice,\n // if gas prices couldn't be fetched, it means there's an internal error\n estimation: getHumanReadableEstimationError(decodedError),\n nonFatalErrors: []\n }\n }\n\n // add the maxFeePerGas and maxPriorityFeePerGas only if the network\n // is optimistic as the bundler uses these values to determine the\n // preVerificationGas.\n const localUserOp = { ...userOp }\n if (network.isOptimistic) {\n // use medium for the gas limit estimation\n localUserOp.maxPriorityFeePerGas = gasPrice.medium.maxPriorityFeePerGas\n localUserOp.maxFeePerGas = gasPrice.medium.maxFeePerGas\n }\n\n const nonFatalErrors: Error[] = []\n const initializeRequests = () => [\n bundler.estimate(userOp, network, isEdgeCase).catch((e: Error) => {\n const decodedError = bundler.decodeBundlerError(e)\n\n // if the bundler estimation fails, add a nonFatalError so we can react to\n // it on the FE. The BE at a later stage decides if this error is actually\n // fatal (at estimate.ts -> estimate4337)\n nonFatalErrors.push(new Error('Bundler estimation failed', { cause: '4337_ESTIMATION' }))\n\n if (decodedError.reason && decodedError.reason.indexOf('invalid account nonce') !== -1) {\n nonFatalErrors.push(\n new Error('4337 invalid account nonce', { cause: '4337_INVALID_NONCE' })\n )\n }\n\n return getHumanReadableEstimationError(decodedError)\n })\n ]\n\n const estimation = await estimateWithRetries(\n initializeRequests,\n 'estimation-bundler',\n errorCallback\n )\n return {\n gasPrice,\n estimation,\n nonFatalErrors\n }\n}\n\nexport async function bundlerEstimate(\n account: Account,\n accountStates: AccountStates,\n op: AccountOp,\n network: Network,\n feeTokens: TokenResult[],\n provider: RPCProvider,\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n // we pass an empty array of feePaymentOptions as they are built\n // in an upper level using the balances from Estimation.sol.\n // balances from Estimation.sol reflect the balances after pending txn exec\n const feePaymentOptions: FeePaymentOption[] = []\n\n const localOp = { ...op }\n const accountState = accountStates[localOp.accountAddr][localOp.networkId]\n // if there's no entryPointAuthorization, we cannot do the estimation on deploy\n if (!accountState.isDeployed && (!op.meta || !op.meta.entryPointAuthorization))\n return estimationErrorFormatted(\n new Error('Entry point privileges not granted. Please contact support'),\n { feePaymentOptions }\n )\n\n const initialBundler = switcher.getBundler()\n const userOp = getUserOperation(\n account,\n accountState,\n localOp,\n initialBundler.getName(),\n !accountState.isDeployed ? op.meta!.entryPointAuthorization : undefined\n )\n // set the callData\n if (userOp.activatorCall) localOp.activatorCall = userOp.activatorCall\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n const isEdgeCase = !accountState.isErc4337Enabled && accountState.isDeployed\n userOp.signature = getSigForCalculations()\n\n const paymaster = await paymasterFactory.create(op, userOp, network, provider)\n localOp.feeCall = paymaster.getFeeCallForEstimation(feeTokens)\n userOp.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCallsForBundlerEstimate(localOp)\n ])\n\n if (paymaster.isUsable()) {\n const paymasterEstimationData = paymaster.getEstimationData() as PaymasterEstimationData\n userOp.paymaster = paymasterEstimationData.paymaster\n userOp.paymasterData = paymasterEstimationData.paymasterData\n\n if (paymasterEstimationData.paymasterPostOpGasLimit)\n userOp.paymasterPostOpGasLimit = paymasterEstimationData.paymasterPostOpGasLimit\n\n if (paymasterEstimationData.paymasterVerificationGasLimit)\n userOp.paymasterVerificationGasLimit = paymasterEstimationData.paymasterVerificationGasLimit\n }\n\n while (true) {\n // estimate\n const bundler = switcher.getBundler()\n const estimations = await estimate(bundler, network, userOp, isEdgeCase, errorCallback)\n\n // if no errors, return the results and get on with life\n if (!(estimations.estimation instanceof Error)) {\n const gasData = estimations.estimation[0]\n return {\n gasUsed: BigInt(gasData.callGasLimit),\n currentAccountNonce: Number(op.nonce),\n feePaymentOptions,\n erc4337GasLimits: {\n preVerificationGas: gasData.preVerificationGas,\n verificationGasLimit: gasData.verificationGasLimit,\n callGasLimit: gasData.callGasLimit,\n paymasterVerificationGasLimit: gasData.paymasterVerificationGasLimit,\n paymasterPostOpGasLimit: gasData.paymasterPostOpGasLimit,\n gasPrice: estimations.gasPrice as GasSpeeds,\n paymaster\n },\n error: null\n }\n }\n\n // if there's an error but we can't switch, return the error\n if (!switcher.canSwitch(estimations.estimation)) {\n return estimationErrorFormatted(estimations.estimation as Error, {\n feePaymentOptions,\n nonFatalErrors: estimations.nonFatalErrors\n })\n }\n\n // try again\n switcher.switch()\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimateBundler.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateBundler.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,gCAAgC;AAChC,0CAA0C;;;;AAE1C,mCAAkC;AAElC,gHAA0E;AAO1E,wDAA2D;AAC3D,sDAAsF;AAEtF,sDAAmE;AAGnE,kEAAwF;AACxF,qCAAmD;AACnD,+DAA2D;AAG3D,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,OAAgB,EAChB,MAAqB,EACrB,UAAmB,EACnB,aAAuB;IAMvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAC/E,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,wEAAwE;IACxE,IAAI,QAAQ,YAAY,KAAK,EAAE;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;QAC5E,OAAO;YACL,QAAQ;YACR,wEAAwE;YACxE,UAAU,EAAE,IAAA,gDAA+B,EAAC,YAAY,CAAC;YACzD,cAAc,EAAE,EAAE;SACnB,CAAA;KACF;IAED,oEAAoE;IACpE,kEAAkE;IAClE,sBAAsB;IACtB,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACjC,IAAI,OAAO,CAAC,YAAY,EAAE;QACxB,0CAA0C;QAC1C,WAAW,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAA;QACvE,WAAW,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAA;KACxD;IAED,MAAM,cAAc,GAAY,EAAE,CAAA;IAClC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;YAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;YAElD,0EAA0E;YAC1E,0EAA0E;YAC1E,yCAAyC;YACzC,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAA;YAEzF,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE;gBACtF,cAAc,CAAC,IAAI,CACjB,IAAI,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CACzE,CAAA;aACF;YAED,OAAO,IAAA,gDAA+B,EAAC,YAAY,CAAC,CAAA;QACtD,CAAC,CAAC;KACH,CAAA;IAED,MAAM,UAAU,GAAG,MAAM,IAAA,yCAAmB,EAC1C,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,CACd,CAAA;IACD,OAAO;QACL,QAAQ;QACR,UAAU;QACV,cAAc;KACf,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,aAA4B,EAC5B,EAAa,EACb,OAAgB,EAChB,SAAwB,EACxB,QAAqB,EACrB,QAAyB,EACzB,aAAuB;IAEvB,gEAAgE;IAChE,4DAA4D;IAC5D,2EAA2E;IAC3E,MAAM,iBAAiB,GAAuB,EAAE,CAAA;IAEhD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1E,+EAA+E;IAC/E,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC;QAC5E,OAAO,IAAA,iCAAwB,EAC7B,IAAI,KAAK,CAAC,4DAA4D,CAAC,EACvE,EAAE,iBAAiB,EAAE,CACtB,CAAA;IAEH,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAA,gCAAgB,EAC7B,OAAO,EACP,YAAY,EACZ,OAAO,EACP,cAAc,CAAC,OAAO,EAAE,EACxB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CACxE,CAAA;IACD,mBAAmB;IACnB,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAA;IAEtE,MAAM,aAAa,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,CAAC,YAAY,CAAC,gBAAgB,IAAI,YAAY,CAAC,UAAU,CAAA;IAC5E,MAAM,CAAC,SAAS,GAAG,IAAA,qCAAqB,GAAE,CAAA;IAE1C,MAAM,SAAS,GAAG,MAAM,4BAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC9E,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;QACpE,IAAA,8CAAkC,EAAC,OAAO,CAAC;KAC5C,CAAC,CAAA;IAEF,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE;QACxB,MAAM,uBAAuB,GAAG,SAAS,CAAC,iBAAiB,EAA6B,CAAA;QACxF,MAAM,CAAC,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAA;QACpD,MAAM,CAAC,aAAa,GAAG,uBAAuB,CAAC,aAAa,CAAA;QAE5D,IAAI,uBAAuB,CAAC,uBAAuB;YACjD,MAAM,CAAC,uBAAuB,GAAG,uBAAuB,CAAC,uBAAuB,CAAA;QAElF,IAAI,uBAAuB,CAAC,6BAA6B;YACvD,MAAM,CAAC,6BAA6B,GAAG,uBAAuB,CAAC,6BAA6B,CAAA;KAC/F;IAED,OAAO,IAAI,EAAE;QACX,WAAW;QACX,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAA;QACrC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;QAEvF,wDAAwD;QACxD,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,YAAY,KAAK,CAAC,EAAE;YAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACzC,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;gBACrC,mBAAmB,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;gBACrC,iBAAiB;gBACjB,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;oBAC9C,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;oBAClD,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,6BAA6B,EAAE,OAAO,CAAC,6BAA6B;oBACpE,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;oBACxD,QAAQ,EAAE,WAAW,CAAC,QAAqB;oBAC3C,SAAS;iBACV;gBACD,KAAK,EAAE,IAAI;aACZ,CAAA;SACF;QAED,4DAA4D;QAC5D,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;YAC/C,OAAO,IAAA,iCAAwB,EAAC,WAAW,CAAC,UAAmB,EAAE;gBAC/D,iBAAiB;gBACjB,cAAc,EAAE,WAAW,CAAC,cAAc;aAC3C,CAAC,CAAA;SACH;QAED,YAAY;QACZ,QAAQ,CAAC,MAAM,EAAE,CAAA;KAClB;AACH,CAAC;AA7FD,0CA6FC","sourcesContent":["/* eslint-disable no-await-in-loop */\n/* eslint-disable no-continue */\n/* eslint-disable no-constant-condition */\n\nimport { Interface } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { AccountOp, getSignableCallsForBundlerEstimate } from '../accountOp/accountOp'\nimport { PaymasterEstimationData } from '../erc7677/types'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getSigForCalculations, getUserOperation } from '../userOperation/userOperation'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult, FeePaymentOption } from './interfaces'\n\nasync function estimate(\n bundler: Bundler,\n network: Network,\n userOp: UserOperation,\n isEdgeCase: boolean,\n errorCallback: Function\n): Promise<{\n gasPrice: GasSpeeds | Error\n estimation: any\n nonFatalErrors: Error[]\n}> {\n const gasPrice = await bundler.fetchGasPrices(network, errorCallback).catch(() => {\n return new Error('Could not fetch gas prices, retrying...')\n })\n\n // if the gasPrice fetch fails, we will switch the bundler and try again\n if (gasPrice instanceof Error) {\n const decodedError = bundler.decodeBundlerError(new Error('internal error'))\n return {\n gasPrice,\n // if gas prices couldn't be fetched, it means there's an internal error\n estimation: getHumanReadableEstimationError(decodedError),\n nonFatalErrors: []\n }\n }\n\n // add the maxFeePerGas and maxPriorityFeePerGas only if the network\n // is optimistic as the bundler uses these values to determine the\n // preVerificationGas.\n const localUserOp = { ...userOp }\n if (network.isOptimistic) {\n // use medium for the gas limit estimation\n localUserOp.maxPriorityFeePerGas = gasPrice.medium.maxPriorityFeePerGas\n localUserOp.maxFeePerGas = gasPrice.medium.maxFeePerGas\n }\n\n const nonFatalErrors: Error[] = []\n const initializeRequests = () => [\n bundler.estimate(userOp, network, isEdgeCase).catch((e: Error) => {\n const decodedError = bundler.decodeBundlerError(e)\n\n // if the bundler estimation fails, add a nonFatalError so we can react to\n // it on the FE. The BE at a later stage decides if this error is actually\n // fatal (at estimate.ts -> estimate4337)\n nonFatalErrors.push(new Error('Bundler estimation failed', { cause: '4337_ESTIMATION' }))\n\n if (decodedError.reason && decodedError.reason.indexOf('invalid account nonce') !== -1) {\n nonFatalErrors.push(\n new Error('4337 invalid account nonce', { cause: '4337_INVALID_NONCE' })\n )\n }\n\n return getHumanReadableEstimationError(decodedError)\n })\n ]\n\n const estimation = await estimateWithRetries(\n initializeRequests,\n 'estimation-bundler',\n errorCallback\n )\n return {\n gasPrice,\n estimation,\n nonFatalErrors\n }\n}\n\nexport async function bundlerEstimate(\n account: Account,\n accountStates: AccountStates,\n op: AccountOp,\n network: Network,\n feeTokens: TokenResult[],\n provider: RPCProvider,\n switcher: BundlerSwitcher,\n errorCallback: Function\n): Promise {\n // we pass an empty array of feePaymentOptions as they are built\n // in an upper level using the balances from Estimation.sol.\n // balances from Estimation.sol reflect the balances after pending txn exec\n const feePaymentOptions: FeePaymentOption[] = []\n\n const localOp = { ...op }\n const accountState = accountStates[localOp.accountAddr][localOp.networkId]\n // if there's no entryPointAuthorization, we cannot do the estimation on deploy\n if (!accountState.isDeployed && (!op.meta || !op.meta.entryPointAuthorization))\n return estimationErrorFormatted(\n new Error('Entry point privileges not granted. Please contact support'),\n { feePaymentOptions }\n )\n\n const initialBundler = switcher.getBundler()\n const userOp = getUserOperation(\n account,\n accountState,\n localOp,\n initialBundler.getName(),\n !accountState.isDeployed ? op.meta!.entryPointAuthorization : undefined\n )\n // set the callData\n if (userOp.activatorCall) localOp.activatorCall = userOp.activatorCall\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n const isEdgeCase = !accountState.isErc4337Enabled && accountState.isDeployed\n userOp.signature = getSigForCalculations()\n\n const paymaster = await paymasterFactory.create(op, userOp, network, provider)\n localOp.feeCall = paymaster.getFeeCallForEstimation(feeTokens)\n userOp.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCallsForBundlerEstimate(localOp)\n ])\n\n if (paymaster.isUsable()) {\n const paymasterEstimationData = paymaster.getEstimationData() as PaymasterEstimationData\n userOp.paymaster = paymasterEstimationData.paymaster\n userOp.paymasterData = paymasterEstimationData.paymasterData\n\n if (paymasterEstimationData.paymasterPostOpGasLimit)\n userOp.paymasterPostOpGasLimit = paymasterEstimationData.paymasterPostOpGasLimit\n\n if (paymasterEstimationData.paymasterVerificationGasLimit)\n userOp.paymasterVerificationGasLimit = paymasterEstimationData.paymasterVerificationGasLimit\n }\n\n while (true) {\n // estimate\n const bundler = switcher.getBundler()\n const estimations = await estimate(bundler, network, userOp, isEdgeCase, errorCallback)\n\n // if no errors, return the results and get on with life\n if (!(estimations.estimation instanceof Error)) {\n const gasData = estimations.estimation[0]\n return {\n gasUsed: BigInt(gasData.callGasLimit),\n currentAccountNonce: Number(op.nonce),\n feePaymentOptions,\n erc4337GasLimits: {\n preVerificationGas: gasData.preVerificationGas,\n verificationGasLimit: gasData.verificationGasLimit,\n callGasLimit: gasData.callGasLimit,\n paymasterVerificationGasLimit: gasData.paymasterVerificationGasLimit,\n paymasterPostOpGasLimit: gasData.paymasterPostOpGasLimit,\n gasPrice: estimations.gasPrice as GasSpeeds,\n paymaster\n },\n error: null\n }\n }\n\n // if there's an error but we can't switch, return the error\n if (!switcher.canSwitch(estimations.estimation)) {\n return estimationErrorFormatted(estimations.estimation as Error, {\n feePaymentOptions,\n nonFatalErrors: estimations.nonFatalErrors\n })\n }\n\n // try again\n switcher.switch()\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.js b/dist/src/libs/estimate/estimateEOA.js index 05983f62d..3aea4161f 100644 --- a/dist/src/libs/estimate/estimateEOA.js +++ b/dist/src/libs/estimate/estimateEOA.js @@ -1,20 +1,24 @@ -import { AbiCoder, ZeroAddress } from 'ethers'; -import Estimation from '../../../contracts/compiled/Estimation.json'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { OPTIMISTIC_ORACLE } from '../../consts/deploy'; -import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; -import { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'; -import { toSingletonCall } from '../accountOp/accountOp'; -import { DeploylessMode, fromDescriptor } from '../deployless/deployless'; -import { getHumanReadableEstimationError } from '../errorHumanizer'; -import { estimationErrorFormatted } from './errors'; -import { estimateWithRetries } from './estimateWithRetries'; -const abiCoder = new AbiCoder(); -export async function estimateEOA(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.estimateEOA = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const Estimation_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/Estimation.json")); +const addresses_1 = require("../../consts/addresses"); +const deploy_1 = require("../../consts/deploy"); +const deployless_1 = require("../../consts/deployless"); +const simulationStateOverride_1 = require("../../utils/simulationStateOverride"); +const accountOp_1 = require("../accountOp/accountOp"); +const deployless_2 = require("../deployless/deployless"); +const errorHumanizer_1 = require("../errorHumanizer"); +const errors_1 = require("./errors"); +const estimateWithRetries_1 = require("./estimateWithRetries"); +const abiCoder = new ethers_1.AbiCoder(); +async function estimateEOA(account, op, accountStates, network, provider, feeTokens, blockFrom, blockTag, errorCallback) { if (op.calls.length !== 1) - return estimationErrorFormatted(new Error("Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.")); - const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride); - const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress; + return (0, errors_1.estimationErrorFormatted)(new Error("Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.")); + const deploylessEstimator = (0, deployless_2.fromDescriptor)(provider, Estimation_json_1.default, !network.rpcNoStateOverride); + const optimisticOracle = network.isOptimistic ? deploy_1.OPTIMISTIC_ORACLE : ethers_1.ZeroAddress; const call = op.calls[0]; // TODO: try to remove this call const nonce = await provider.getTransactionCount(account.addr); @@ -27,7 +31,7 @@ export async function estimateEOA(account, op, accountStates, network, provider, 'uint256', 'uint256', 'uint256' // gasLimit - ], [call.data, call.to ?? ZeroAddress, account.addr, 100000000, 2, nonce, 100000]); + ], [call.data, call.to ?? ethers_1.ZeroAddress, account.addr, 100000000, 2, nonce, 100000]); const initializeRequests = () => [ provider .estimateGas({ @@ -37,44 +41,44 @@ export async function estimateEOA(account, op, accountStates, network, provider, data: call.data, nonce }) - .catch(getHumanReadableEstimationError), + .catch(errorHumanizer_1.getHumanReadableEstimationError), !network.rpcNoStateOverride ? deploylessEstimator .call('estimateEoa', [ account.addr, - [account.addr, EOA_SIMULATION_NONCE, op.calls.map(toSingletonCall), '0x'], + [account.addr, deployless_1.EOA_SIMULATION_NONCE, op.calls.map(accountOp_1.toSingletonCall), '0x'], encodedCallData, [account.addr], - FEE_COLLECTOR, + addresses_1.FEE_COLLECTOR, optimisticOracle ], { from: blockFrom, blockTag, - mode: DeploylessMode.StateOverride, - stateToOverride: getEoaSimulationStateOverride(account.addr) + mode: deployless_2.DeploylessMode.StateOverride, + stateToOverride: (0, simulationStateOverride_1.getEoaSimulationStateOverride)(account.addr) }) .catch((e) => { console.log('error calling estimateEoa:', e); return [[0n, [], {}]]; }) : deploylessEstimator - .call('getL1GasEstimation', [encodedCallData, FEE_COLLECTOR, optimisticOracle], { + .call('getL1GasEstimation', [encodedCallData, addresses_1.FEE_COLLECTOR, optimisticOracle], { from: blockFrom, blockTag }) - .catch(getHumanReadableEstimationError) + .catch(errorHumanizer_1.getHumanReadableEstimationError) ]; - const result = await estimateWithRetries(initializeRequests, 'estimation-eoa', errorCallback); + const result = await (0, estimateWithRetries_1.estimateWithRetries)(initializeRequests, 'estimation-eoa', errorCallback); const feePaymentOptions = [ { paidBy: account.addr, availableAmount: accountState.balance, addedNative: 0n, - token: feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank) + token: feeTokens.find((token) => token.address === ethers_1.ZeroAddress && !token.flags.onGasTank) } ]; if (result instanceof Error) - return estimationErrorFormatted(result, { feePaymentOptions }); + return (0, errors_1.estimationErrorFormatted)(result, { feePaymentOptions }); let gasUsed = 0n; if (!network.rpcNoStateOverride) { const [gasUsedEstimateGas, [[gasUsedEstimationSol, feeTokenOutcomes, l1GasEstimation]]] = result; @@ -104,4 +108,5 @@ export async function estimateEOA(account, op, accountStates, network, provider, error: result instanceof Error ? result : null }; } +exports.estimateEOA = estimateEOA; //# sourceMappingURL=estimateEOA.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateEOA.js.map b/dist/src/libs/estimate/estimateEOA.js.map index 0a47beb29..60c79131c 100644 --- a/dist/src/libs/estimate/estimateEOA.js.map +++ b/dist/src/libs/estimate/estimateEOA.js.map @@ -1 +1 @@ -{"version":3,"file":"estimateEOA.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateEOA.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult } from './interfaces'\n\nconst abiCoder = new AbiCoder()\n\nexport async function estimateEOA(\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n network: Network,\n provider: JsonRpcProvider | Provider,\n feeTokens: TokenResult[],\n blockFrom: string,\n blockTag: string | number,\n errorCallback: Function\n): Promise {\n if (op.calls.length !== 1)\n return estimationErrorFormatted(\n new Error(\n \"Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.\"\n )\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n const call = op.calls[0]\n // TODO: try to remove this call\n const nonce = await provider.getTransactionCount(account.addr)\n const accountState = accountStates[op.accountAddr][op.networkId]\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [call.data, call.to ?? ZeroAddress, account.addr, 100000000, 2, nonce, 100000]\n )\n const initializeRequests = () => [\n provider\n .estimateGas({\n from: account.addr,\n to: call.to ?? undefined,\n value: call.value,\n data: call.data,\n nonce\n })\n .catch(getHumanReadableEstimationError),\n !network.rpcNoStateOverride\n ? deploylessEstimator\n .call(\n 'estimateEoa',\n [\n account.addr,\n [account.addr, EOA_SIMULATION_NONCE, op.calls.map(toSingletonCall), '0x'],\n encodedCallData,\n [account.addr],\n FEE_COLLECTOR,\n optimisticOracle\n ],\n {\n from: blockFrom,\n blockTag,\n mode: DeploylessMode.StateOverride,\n stateToOverride: getEoaSimulationStateOverride(account.addr)\n }\n )\n .catch((e) => {\n console.log('error calling estimateEoa:', e)\n return [[0n, [], {}]]\n })\n : deploylessEstimator\n .call('getL1GasEstimation', [encodedCallData, FEE_COLLECTOR, optimisticOracle], {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError)\n ]\n const result = await estimateWithRetries(initializeRequests, 'estimation-eoa', errorCallback)\n const feePaymentOptions = [\n {\n paidBy: account.addr,\n availableAmount: accountState.balance,\n addedNative: 0n,\n token: feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)!\n }\n ]\n if (result instanceof Error) return estimationErrorFormatted(result, { feePaymentOptions })\n\n let gasUsed = 0n\n if (!network.rpcNoStateOverride) {\n const [gasUsedEstimateGas, [[gasUsedEstimationSol, feeTokenOutcomes, l1GasEstimation]]] = result\n if (feeTokenOutcomes.length && feeTokenOutcomes[0].length) {\n feePaymentOptions[0].availableAmount = feeTokenOutcomes[0][1]\n }\n if (l1GasEstimation && l1GasEstimation.fee) {\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n }\n\n // if it's a simple transfer, trust estimateGas as it should be 21K\n // if it's a contract call, trust whichever is higher\n if (call.data === '0x') gasUsed = gasUsedEstimateGas\n else\n gasUsed =\n gasUsedEstimateGas > gasUsedEstimationSol ? gasUsedEstimateGas : gasUsedEstimationSol\n } else {\n const [gasUsedEstimateGas, [l1GasEstimation]] = result\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n gasUsed = gasUsedEstimateGas\n }\n\n return {\n gasUsed,\n currentAccountNonce: nonce,\n feePaymentOptions,\n error: result instanceof Error ? result : null\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimateEOA.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateEOA.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport Estimation from '../../../contracts/compiled/Estimation.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { OPTIMISTIC_ORACLE } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountStates } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { AccountOp, toSingletonCall } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { getHumanReadableEstimationError } from '../errorHumanizer'\nimport { TokenResult } from '../portfolio'\nimport { estimationErrorFormatted } from './errors'\nimport { estimateWithRetries } from './estimateWithRetries'\nimport { EstimateResult } from './interfaces'\n\nconst abiCoder = new AbiCoder()\n\nexport async function estimateEOA(\n account: Account,\n op: AccountOp,\n accountStates: AccountStates,\n network: Network,\n provider: JsonRpcProvider | Provider,\n feeTokens: TokenResult[],\n blockFrom: string,\n blockTag: string | number,\n errorCallback: Function\n): Promise {\n if (op.calls.length !== 1)\n return estimationErrorFormatted(\n new Error(\n \"Trying to make multiple calls with a Basic Account which shouldn't happen. Please try again or contact support.\"\n )\n )\n\n const deploylessEstimator = fromDescriptor(provider, Estimation, !network.rpcNoStateOverride)\n const optimisticOracle = network.isOptimistic ? OPTIMISTIC_ORACLE : ZeroAddress\n const call = op.calls[0]\n // TODO: try to remove this call\n const nonce = await provider.getTransactionCount(account.addr)\n const accountState = accountStates[op.accountAddr][op.networkId]\n const encodedCallData = abiCoder.encode(\n [\n 'bytes', // data\n 'address', // to\n 'address', // from\n 'uint256', // gasPrice\n 'uint256', // type\n 'uint256', // nonce\n 'uint256' // gasLimit\n ],\n [call.data, call.to ?? ZeroAddress, account.addr, 100000000, 2, nonce, 100000]\n )\n const initializeRequests = () => [\n provider\n .estimateGas({\n from: account.addr,\n to: call.to ?? undefined,\n value: call.value,\n data: call.data,\n nonce\n })\n .catch(getHumanReadableEstimationError),\n !network.rpcNoStateOverride\n ? deploylessEstimator\n .call(\n 'estimateEoa',\n [\n account.addr,\n [account.addr, EOA_SIMULATION_NONCE, op.calls.map(toSingletonCall), '0x'],\n encodedCallData,\n [account.addr],\n FEE_COLLECTOR,\n optimisticOracle\n ],\n {\n from: blockFrom,\n blockTag,\n mode: DeploylessMode.StateOverride,\n stateToOverride: getEoaSimulationStateOverride(account.addr)\n }\n )\n .catch((e) => {\n console.log('error calling estimateEoa:', e)\n return [[0n, [], {}]]\n })\n : deploylessEstimator\n .call('getL1GasEstimation', [encodedCallData, FEE_COLLECTOR, optimisticOracle], {\n from: blockFrom,\n blockTag\n })\n .catch(getHumanReadableEstimationError)\n ]\n const result = await estimateWithRetries(initializeRequests, 'estimation-eoa', errorCallback)\n const feePaymentOptions = [\n {\n paidBy: account.addr,\n availableAmount: accountState.balance,\n addedNative: 0n,\n token: feeTokens.find((token) => token.address === ZeroAddress && !token.flags.onGasTank)!\n }\n ]\n if (result instanceof Error) return estimationErrorFormatted(result, { feePaymentOptions })\n\n let gasUsed = 0n\n if (!network.rpcNoStateOverride) {\n const [gasUsedEstimateGas, [[gasUsedEstimationSol, feeTokenOutcomes, l1GasEstimation]]] = result\n if (feeTokenOutcomes.length && feeTokenOutcomes[0].length) {\n feePaymentOptions[0].availableAmount = feeTokenOutcomes[0][1]\n }\n if (l1GasEstimation && l1GasEstimation.fee) {\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n }\n\n // if it's a simple transfer, trust estimateGas as it should be 21K\n // if it's a contract call, trust whichever is higher\n if (call.data === '0x') gasUsed = gasUsedEstimateGas\n else\n gasUsed =\n gasUsedEstimateGas > gasUsedEstimationSol ? gasUsedEstimateGas : gasUsedEstimationSol\n } else {\n const [gasUsedEstimateGas, [l1GasEstimation]] = result\n feePaymentOptions[0].addedNative = l1GasEstimation.fee\n gasUsed = gasUsedEstimateGas\n }\n\n return {\n gasUsed,\n currentAccountNonce: nonce,\n feePaymentOptions,\n error: result instanceof Error ? result : null\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.js b/dist/src/libs/estimate/estimateGas.js index 2a806b6f6..e418c3a4b 100644 --- a/dist/src/libs/estimate/estimateGas.js +++ b/dist/src/libs/estimate/estimateGas.js @@ -1,31 +1,35 @@ -import { Interface } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; -import { getRpcProvider } from '../../services/provider'; -import { getSpoof } from '../account/account'; -import { getSignableCalls } from '../accountOp/accountOp'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.estimateGas = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const deploy_1 = require("../../consts/deploy"); +const provider_1 = require("../../services/provider"); +const account_1 = require("../account/account"); +const accountOp_1 = require("../accountOp/accountOp"); // Use this estimateGas only for SA estimations -export async function estimateGas(account, op, provider, accountState, network) { +async function estimateGas(account, op, provider, accountState, network) { if (network.disableEstimateGas) return 0n; if (!account.creation) throw new Error('Use this estimation only for smart accounts'); - const saAbi = new Interface(AmbireAccount.abi); - const factoryAbi = new Interface(AmbireFactory.abi); + const saAbi = new ethers_1.Interface(AmbireAccount_json_1.default.abi); + const factoryAbi = new ethers_1.Interface(AmbireFactory_json_1.default.abi); const callData = accountState.isDeployed - ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)]) + ? saAbi.encodeFunctionData('execute', [(0, accountOp_1.getSignableCalls)(op), (0, account_1.getSpoof)(account)]) : factoryAbi.encodeFunctionData('deployAndExecute', [ account.creation.bytecode, account.creation.salt, - getSignableCalls(op), - getSpoof(account) + (0, accountOp_1.getSignableCalls)(op), + (0, account_1.getSpoof)(account) ]); // try estimating the gas without state override. If an error of type // insufficient funds is encountered, try re-estimating with state override return provider .estimateGas({ - from: DEPLOYLESS_SIMULATION_FROM, + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, value: 0, data: callData, @@ -34,19 +38,19 @@ export async function estimateGas(account, op, provider, accountState, network) .catch(async (e) => { if (!e.message.includes('insufficient funds')) return 0n; - const isolatedProvider = getRpcProvider(network.rpcUrls, network.chainId, network.selectedRpcUrl, { batchMaxCount: 1 }); + const isolatedProvider = (0, provider_1.getRpcProvider)(network.rpcUrls, network.chainId, network.selectedRpcUrl, { batchMaxCount: 1 }); const withOverrides = await isolatedProvider .send('eth_estimateGas', [ { to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, value: '0x0', data: callData, - from: DEPLOYLESS_SIMULATION_FROM, + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, nonce: '0x0' }, 'latest', { - [DEPLOYLESS_SIMULATION_FROM]: { + [deploy_1.DEPLOYLESS_SIMULATION_FROM]: { balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' } } @@ -56,4 +60,5 @@ export async function estimateGas(account, op, provider, accountState, network) return BigInt(withOverrides); }); } +exports.estimateGas = estimateGas; //# sourceMappingURL=estimateGas.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateGas.js.map b/dist/src/libs/estimate/estimateGas.js.map index f64587db7..b73158a8f 100644 --- a/dist/src/libs/estimate/estimateGas.js.map +++ b/dist/src/libs/estimate/estimateGas.js.map @@ -1 +1 @@ -{"version":3,"file":"estimateGas.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,QAAQ,CAAA;AAE7D,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAa,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,YAAiC,EACjC,OAAgB;IAEhB,IAAI,OAAO,CAAC,kBAAkB;QAAE,OAAO,EAAE,CAAA;IAEzC,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAErF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU;QACtC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;YAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;YACrB,gBAAgB,CAAC,EAAE,CAAC;YACpB,QAAQ,CAAC,OAAO,CAAC;SAClB,CAAC,CAAA;IAEN,qEAAqE;IACrE,2EAA2E;IAC3E,OAAO,QAAQ;SACZ,WAAW,CAAC;QACX,IAAI,EAAE,0BAA0B;QAChC,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW;QACzE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,CAAC;KACT,CAAC;SACD,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,OAAO,EAAE,CAAA;QAExD,MAAM,gBAAgB,GAAG,cAAc,CACrC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,EACtB,EAAE,aAAa,EAAE,CAAC,EAAE,CACrB,CAAA;QACD,MAAM,aAAa,GAAG,MAAM,gBAAgB;aACzC,IAAI,CAAC,iBAAiB,EAAE;YACvB;gBACE,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAS,CAAC,WAAW;gBAC1E,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,KAAK;aACb;YACD,QAAQ;YACR;gBACE,CAAC,0BAA0B,CAAC,EAAE;oBAC5B,OAAO,EAAE,oEAAoE;iBAC9E;aACF;SACF,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAErB,gBAAgB,CAAC,OAAO,EAAE,CAAA;QAC1B,OAAO,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACN,CAAC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSpoof } from '../account/account'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\n\n// Use this estimateGas only for SA estimations\nexport async function estimateGas(\n account: Account,\n op: AccountOp,\n provider: Provider | JsonRpcProvider,\n accountState: AccountOnchainState,\n network: Network\n): Promise {\n if (network.disableEstimateGas) return 0n\n\n if (!account.creation) throw new Error('Use this estimation only for smart accounts')\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n // try estimating the gas without state override. If an error of type\n // insufficient funds is encountered, try re-estimating with state override\n return provider\n .estimateGas({\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData,\n nonce: 0\n })\n .catch(async (e) => {\n if (!e.message.includes('insufficient funds')) return 0n\n\n const isolatedProvider = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl,\n { batchMaxCount: 1 }\n )\n const withOverrides = await isolatedProvider\n .send('eth_estimateGas', [\n {\n to: accountState.isDeployed ? account.addr : account.creation!.factoryAddr,\n value: '0x0',\n data: callData,\n from: DEPLOYLESS_SIMULATION_FROM,\n nonce: '0x0'\n },\n 'latest',\n {\n [DEPLOYLESS_SIMULATION_FROM]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n }\n ])\n .catch(() => '0x0')\n\n isolatedProvider.destroy()\n return BigInt(withOverrides)\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimateGas.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateGas.ts"],"names":[],"mappings":";;;;AAAA,mCAA6D;AAE7D,gHAA0E;AAC1E,gHAA0E;AAC1E,gDAAgE;AAGhE,sDAAwD;AACxD,gDAA6C;AAC7C,sDAAoE;AAEpE,+CAA+C;AACxC,KAAK,UAAU,WAAW,CAC/B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,YAAiC,EACjC,OAAgB;IAEhB,IAAI,OAAO,CAAC,kBAAkB;QAAE,OAAO,EAAE,CAAA;IAEzC,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAErF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU;QACtC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,IAAA,4BAAgB,EAAC,EAAE,CAAC,EAAE,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;YAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;YACrB,IAAA,4BAAgB,EAAC,EAAE,CAAC;YACpB,IAAA,kBAAQ,EAAC,OAAO,CAAC;SAClB,CAAC,CAAA;IAEN,qEAAqE;IACrE,2EAA2E;IAC3E,OAAO,QAAQ;SACZ,WAAW,CAAC;QACX,IAAI,EAAE,mCAA0B;QAChC,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW;QACzE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,CAAC;KACT,CAAC;SACD,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,OAAO,EAAE,CAAA;QAExD,MAAM,gBAAgB,GAAG,IAAA,yBAAc,EACrC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,cAAc,EACtB,EAAE,aAAa,EAAE,CAAC,EAAE,CACrB,CAAA;QACD,MAAM,aAAa,GAAG,MAAM,gBAAgB;aACzC,IAAI,CAAC,iBAAiB,EAAE;YACvB;gBACE,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAS,CAAC,WAAW;gBAC1E,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,mCAA0B;gBAChC,KAAK,EAAE,KAAK;aACb;YACD,QAAQ;YACR;gBACE,CAAC,mCAA0B,CAAC,EAAE;oBAC5B,OAAO,EAAE,oEAAoE;iBAC9E;aACF;SACF,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAErB,gBAAgB,CAAC,OAAO,EAAE,CAAA;QAC1B,OAAO,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACN,CAAC;AA9DD,kCA8DC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSpoof } from '../account/account'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\n\n// Use this estimateGas only for SA estimations\nexport async function estimateGas(\n account: Account,\n op: AccountOp,\n provider: Provider | JsonRpcProvider,\n accountState: AccountOnchainState,\n network: Network\n): Promise {\n if (network.disableEstimateGas) return 0n\n\n if (!account.creation) throw new Error('Use this estimation only for smart accounts')\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n // try estimating the gas without state override. If an error of type\n // insufficient funds is encountered, try re-estimating with state override\n return provider\n .estimateGas({\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData,\n nonce: 0\n })\n .catch(async (e) => {\n if (!e.message.includes('insufficient funds')) return 0n\n\n const isolatedProvider = getRpcProvider(\n network.rpcUrls,\n network.chainId,\n network.selectedRpcUrl,\n { batchMaxCount: 1 }\n )\n const withOverrides = await isolatedProvider\n .send('eth_estimateGas', [\n {\n to: accountState.isDeployed ? account.addr : account.creation!.factoryAddr,\n value: '0x0',\n data: callData,\n from: DEPLOYLESS_SIMULATION_FROM,\n nonce: '0x0'\n },\n 'latest',\n {\n [DEPLOYLESS_SIMULATION_FROM]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n }\n }\n ])\n .catch(() => '0x0')\n\n isolatedProvider.destroy()\n return BigInt(withOverrides)\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.js b/dist/src/libs/estimate/estimateHelpers.js index fb6e9721f..cf6ee8292 100644 --- a/dist/src/libs/estimate/estimateHelpers.js +++ b/dist/src/libs/estimate/estimateHelpers.js @@ -1,10 +1,13 @@ -import { ZeroAddress } from 'ethers'; -export function getFeeTokenForEstimate(feeTokens, network) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getFeeTokenForEstimate = void 0; +const ethers_1 = require("ethers"); +function getFeeTokenForEstimate(feeTokens, network) { if (!feeTokens.length) return null; const gasTankToken = feeTokens.find((feeToken) => feeToken.flags.onGasTank && feeToken.amount > 0n); - const erc20token = feeTokens.find((feeToken) => feeToken.address !== ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); - const nativeToken = feeTokens.find((feeToken) => feeToken.address === ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); + const erc20token = feeTokens.find((feeToken) => feeToken.address !== ethers_1.ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); + const nativeToken = feeTokens.find((feeToken) => feeToken.address === ethers_1.ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n); // for optimistic L2s, prioritize the gas tank token as a fee payment // option as its callData costs more than the actual transfer of tokens if (network.isOptimistic) { @@ -21,4 +24,5 @@ export function getFeeTokenForEstimate(feeTokens, network) { return nativeToken; return gasTankToken ?? null; } +exports.getFeeTokenForEstimate = getFeeTokenForEstimate; //# sourceMappingURL=estimateHelpers.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateHelpers.js.map b/dist/src/libs/estimate/estimateHelpers.js.map index d200834e0..719487029 100644 --- a/dist/src/libs/estimate/estimateHelpers.js.map +++ b/dist/src/libs/estimate/estimateHelpers.js.map @@ -1 +1 @@ -{"version":3,"file":"estimateHelpers.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKpC,MAAM,UAAU,sBAAsB,CACpC,SAAwB,EACxB,OAAgB;IAEhB,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAElC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CACjC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAC/D,CAAA;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAC/B,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IAED,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,OAAO,CAAC,YAAY,EAAE;QACxB,IAAI,YAAY;YAAE,OAAO,YAAY,CAAA;QACrC,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,OAAO,WAAW,IAAI,IAAI,CAAA;KAC3B;IAED,gEAAgE;IAChE,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACjC,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IACnC,OAAO,YAAY,IAAI,IAAI,CAAA;AAC7B,CAAC","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../../interfaces/network'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeTokenForEstimate(\n feeTokens: TokenResult[],\n network: Network\n): TokenResult | null {\n if (!feeTokens.length) return null\n\n const gasTankToken = feeTokens.find(\n (feeToken) => feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const erc20token = feeTokens.find(\n (feeToken) =>\n feeToken.address !== ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const nativeToken = feeTokens.find(\n (feeToken) =>\n feeToken.address === ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n\n // for optimistic L2s, prioritize the gas tank token as a fee payment\n // option as its callData costs more than the actual transfer of tokens\n if (network.isOptimistic) {\n if (gasTankToken) return gasTankToken\n if (erc20token) return erc20token\n return nativeToken ?? null\n }\n\n // for L1s, prioritize erc20 transfer as it's the most expensive\n if (erc20token) return erc20token\n if (nativeToken) return nativeToken\n return gasTankToken ?? null\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimateHelpers.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateHelpers.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAKpC,SAAgB,sBAAsB,CACpC,SAAwB,EACxB,OAAgB;IAEhB,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAElC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CACjC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAC/D,CAAA;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAC/B,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,oBAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,OAAO,KAAK,oBAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CACxF,CAAA;IAED,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,OAAO,CAAC,YAAY,EAAE;QACxB,IAAI,YAAY;YAAE,OAAO,YAAY,CAAA;QACrC,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,OAAO,WAAW,IAAI,IAAI,CAAA;KAC3B;IAED,gEAAgE;IAChE,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACjC,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IACnC,OAAO,YAAY,IAAI,IAAI,CAAA;AAC7B,CAAC;AA9BD,wDA8BC","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { Network } from '../../interfaces/network'\nimport { TokenResult } from '../portfolio'\n\nexport function getFeeTokenForEstimate(\n feeTokens: TokenResult[],\n network: Network\n): TokenResult | null {\n if (!feeTokens.length) return null\n\n const gasTankToken = feeTokens.find(\n (feeToken) => feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const erc20token = feeTokens.find(\n (feeToken) =>\n feeToken.address !== ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n const nativeToken = feeTokens.find(\n (feeToken) =>\n feeToken.address === ZeroAddress && !feeToken.flags.onGasTank && feeToken.amount > 0n\n )\n\n // for optimistic L2s, prioritize the gas tank token as a fee payment\n // option as its callData costs more than the actual transfer of tokens\n if (network.isOptimistic) {\n if (gasTankToken) return gasTankToken\n if (erc20token) return erc20token\n return nativeToken ?? null\n }\n\n // for L1s, prioritize erc20 transfer as it's the most expensive\n if (erc20token) return erc20token\n if (nativeToken) return nativeToken\n return gasTankToken ?? null\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.js b/dist/src/libs/estimate/estimateWithRetries.js index 2106a8ad1..7b45a5304 100644 --- a/dist/src/libs/estimate/estimateWithRetries.js +++ b/dist/src/libs/estimate/estimateWithRetries.js @@ -1,4 +1,7 @@ -export async function estimateWithRetries(fetchRequests, timeoutType, errorCallback, timeoutInMill = 10000, counter = 0) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.estimateWithRetries = void 0; +async function estimateWithRetries(fetchRequests, timeoutType, errorCallback, timeoutInMill = 10000, counter = 0) { // stop the execution on 5 fails; // the below error message is not shown to the user so we are safe if (counter >= 5) @@ -50,4 +53,5 @@ export async function estimateWithRetries(fetchRequests, timeoutType, errorCallb // success outcome return result; } +exports.estimateWithRetries = estimateWithRetries; //# sourceMappingURL=estimateWithRetries.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/estimateWithRetries.js.map b/dist/src/libs/estimate/estimateWithRetries.js.map index 7fc2afae8..46157146d 100644 --- a/dist/src/libs/estimate/estimateWithRetries.js.map +++ b/dist/src/libs/estimate/estimateWithRetries.js.map @@ -1 +1 @@ -{"version":3,"file":"estimateWithRetries.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateWithRetries.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAuB,EACvB,WAAmB,EACnB,aAAuB,EACvB,gBAAwB,KAAK,EAC7B,UAAkB,CAAC;IAEnB,iCAAiC;IACjC,kEAAkE;IAClE,IAAI,OAAO,IAAI,CAAC;QACd,OAAO,IAAI,KAAK,CACd,wIAAwI,CACzI,CAAA;IAEH,MAAM,kBAAkB,GAAG,EAAE,CAAA;IAC7B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAC7B,CAAC,EAAE,aAAa,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAElF,qBAAqB;IACrB,IAAI,MAAM,KAAK,kBAAkB,EAAE;QACjC,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,gDAAgD;QAEhD,QAAQ,WAAW,EAAE;YACnB,KAAK,uBAAuB;gBAC1B,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,2DAA2D;oBACpE,KAAK,EAAE,IAAI,KAAK,CAAC,mCAAmC,CAAC;iBACtD,CAAC,CAAA;gBACF,MAAK;YAEP,KAAK,oBAAoB;gBACvB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,+DAA+D;oBACxE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YACP,KAAK,gBAAgB;gBACnB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,6EAA6E;oBACtF,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YAEP;gBACE,MAAK;SACR;QAED,MAAM,GAAG,MAAM,mBAAmB,CAChC,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,CACZ,CAAA;KACF;SAAM;QACL,kDAAkD;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;KACxB;IAED,kBAAkB;IAClB,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["export async function estimateWithRetries(\n fetchRequests: Function,\n timeoutType: string,\n errorCallback: Function,\n timeoutInMill: number = 10000,\n counter: number = 0\n): Promise {\n // stop the execution on 5 fails;\n // the below error message is not shown to the user so we are safe\n if (counter >= 5)\n return new Error(\n 'Estimation failure, retrying in a couple of seconds. If this issue persists, please change your RPC provider or contact Ambire support'\n )\n\n const santinelTimeoutErr = {}\n const estimationTimeout = new Promise((resolve) => {\n setTimeout(() => {\n resolve(santinelTimeoutErr)\n }, timeoutInMill)\n })\n\n let result = await Promise.race([Promise.all(fetchRequests()), estimationTimeout])\n\n // retry on a timeout\n if (result === santinelTimeoutErr) {\n const incremented = counter + 1\n\n // display a timeout error only on the first try\n\n switch (timeoutType) {\n case 'estimation-deployless':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the RPC timed out. Retrying...',\n error: new Error('Estimation.sol deployless timeout')\n })\n break\n\n case 'estimation-bundler':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the bundler timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n case 'estimation-eoa':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits for Basic Account from the RPC timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n\n default:\n break\n }\n\n result = await estimateWithRetries(\n fetchRequests,\n timeoutType,\n errorCallback,\n timeoutInMill,\n incremented\n )\n } else {\n // if one of the calls returns an error, return it\n const error = Array.isArray(result) ? result.find((res) => res instanceof Error) : null\n if (error) return error\n }\n\n // success outcome\n return result\n}\n"]} \ No newline at end of file +{"version":3,"file":"estimateWithRetries.js","sourceRoot":"","sources":["../../../../src/libs/estimate/estimateWithRetries.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,mBAAmB,CACvC,aAAuB,EACvB,WAAmB,EACnB,aAAuB,EACvB,gBAAwB,KAAK,EAC7B,UAAkB,CAAC;IAEnB,iCAAiC;IACjC,kEAAkE;IAClE,IAAI,OAAO,IAAI,CAAC;QACd,OAAO,IAAI,KAAK,CACd,wIAAwI,CACzI,CAAA;IAEH,MAAM,kBAAkB,GAAG,EAAE,CAAA;IAC7B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAC7B,CAAC,EAAE,aAAa,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAElF,qBAAqB;IACrB,IAAI,MAAM,KAAK,kBAAkB,EAAE;QACjC,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,gDAAgD;QAEhD,QAAQ,WAAW,EAAE;YACnB,KAAK,uBAAuB;gBAC1B,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,2DAA2D;oBACpE,KAAK,EAAE,IAAI,KAAK,CAAC,mCAAmC,CAAC;iBACtD,CAAC,CAAA;gBACF,MAAK;YAEP,KAAK,oBAAoB;gBACvB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,+DAA+D;oBACxE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YACP,KAAK,gBAAgB;gBACnB,aAAa,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,6EAA6E;oBACtF,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC,CAAA;gBACF,MAAK;YAEP;gBACE,MAAK;SACR;QAED,MAAM,GAAG,MAAM,mBAAmB,CAChC,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,CACZ,CAAA;KACF;SAAM;QACL,kDAAkD;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;KACxB;IAED,kBAAkB;IAClB,OAAO,MAAM,CAAA;AACf,CAAC;AAxED,kDAwEC","sourcesContent":["export async function estimateWithRetries(\n fetchRequests: Function,\n timeoutType: string,\n errorCallback: Function,\n timeoutInMill: number = 10000,\n counter: number = 0\n): Promise {\n // stop the execution on 5 fails;\n // the below error message is not shown to the user so we are safe\n if (counter >= 5)\n return new Error(\n 'Estimation failure, retrying in a couple of seconds. If this issue persists, please change your RPC provider or contact Ambire support'\n )\n\n const santinelTimeoutErr = {}\n const estimationTimeout = new Promise((resolve) => {\n setTimeout(() => {\n resolve(santinelTimeoutErr)\n }, timeoutInMill)\n })\n\n let result = await Promise.race([Promise.all(fetchRequests()), estimationTimeout])\n\n // retry on a timeout\n if (result === santinelTimeoutErr) {\n const incremented = counter + 1\n\n // display a timeout error only on the first try\n\n switch (timeoutType) {\n case 'estimation-deployless':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the RPC timed out. Retrying...',\n error: new Error('Estimation.sol deployless timeout')\n })\n break\n\n case 'estimation-bundler':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits from the bundler timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n case 'estimation-eoa':\n errorCallback({\n level: 'major',\n message: 'Estimating gas limits for Basic Account from the RPC timed out. Retrying...',\n error: new Error('Budler gas limit estimation timeout')\n })\n break\n\n default:\n break\n }\n\n result = await estimateWithRetries(\n fetchRequests,\n timeoutType,\n errorCallback,\n timeoutInMill,\n incremented\n )\n } else {\n // if one of the calls returns an error, return it\n const error = Array.isArray(result) ? result.find((res) => res instanceof Error) : null\n if (error) return error\n }\n\n // success outcome\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/estimate/interfaces.js b/dist/src/libs/estimate/interfaces.js index c30bb68c1..db9191150 100644 --- a/dist/src/libs/estimate/interfaces.js +++ b/dist/src/libs/estimate/interfaces.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.js b/dist/src/libs/estimate/refund.js index 34eb956ba..655d0479f 100644 --- a/dist/src/libs/estimate/refund.js +++ b/dist/src/libs/estimate/refund.js @@ -1,11 +1,15 @@ -import { Interface } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -export async function refund(account, op, provider, gasUsed) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.refund = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +async function refund(account, op, provider, gasUsed) { // WARNING: calculateRefund will 100% NOT work in all cases we have // So a warning not to assume this is working - const IAmbireAccount = new Interface(AmbireAccount.abi); - const IAmbireFactory = new Interface(AmbireFactory.abi); + const IAmbireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); + const IAmbireFactory = new ethers_1.Interface(AmbireFactory_json_1.default.abi); const accountCalldata = op.accountOpToExecuteBefore ? IAmbireAccount.encodeFunctionData('executeMultiple', [ [ @@ -31,4 +35,5 @@ export async function refund(account, op, provider, gasUsed) { return estimatedGas; return gasUsed; } +exports.refund = refund; //# sourceMappingURL=refund.js.map \ No newline at end of file diff --git a/dist/src/libs/estimate/refund.js.map b/dist/src/libs/estimate/refund.js.map index 6adead122..9e28076c3 100644 --- a/dist/src/libs/estimate/refund.js.map +++ b/dist/src/libs/estimate/refund.js.map @@ -1 +1 @@ -{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../../src/libs/estimate/refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,QAAQ,CAAA;AAE7D,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAC1E,OAAO,aAAa,MAAM,gDAAgD,CAAA;AAI1E,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,OAAe;IAEf,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAEvD,MAAM,eAAe,GAAG,EAAE,CAAC,wBAAwB;QACjD,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACnD;gBACE,CAAC,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;gBAC1E,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC;aACzB;SACF,CAAC;QACJ,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAE1E,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;QAC5E,OAAO,CAAC,QAAS,CAAC,QAAQ;QAC1B,OAAO,CAAC,QAAS,CAAC,IAAI;QACtB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACpC,EAAE,CAAC,SAAS;KACb,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;QAC9C,IAAI,EAAE,4CAA4C;QAClD,EAAE,EAAE,OAAO,CAAC,QAAS,CAAC,WAAW;QACjC,IAAI,EAAE,eAAe;KACtB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,CAAA;IAE9C,6DAA6D;IAC7D,IAAI,eAAe,IAAI,OAAO,GAAG,EAAE,IAAI,eAAe,GAAG,EAAE;QAAE,OAAO,YAAY,CAAA;IAChF,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account } from '../../interfaces/account'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport async function refund(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider | Provider,\n gasUsed: bigint\n): Promise {\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n const IAmbireAccount = new Interface(AmbireAccount.abi)\n const IAmbireFactory = new Interface(AmbireFactory.abi)\n\n const accountCalldata = op.accountOpToExecuteBefore\n ? IAmbireAccount.encodeFunctionData('executeMultiple', [\n [\n [op.accountOpToExecuteBefore.calls, op.accountOpToExecuteBefore.signature],\n [op.calls, op.signature]\n ]\n ])\n : IAmbireAccount.encodeFunctionData('execute', [op.calls, op.signature])\n\n const factoryCalldata = IAmbireFactory.encodeFunctionData('deployAndExecute', [\n account.creation!.bytecode,\n account.creation!.salt,\n [[account.addr, 0, accountCalldata]],\n op.signature\n ])\n\n const estimatedGas = await provider.estimateGas({\n from: '0x0000000000000000000000000000000000000001',\n to: account.creation!.factoryAddr,\n data: factoryCalldata\n })\n\n const estimatedRefund = gasUsed - estimatedGas\n\n // As of EIP-3529, the max refund is 1/5th of the entire cost\n if (estimatedRefund <= gasUsed / 5n && estimatedRefund > 0n) return estimatedGas\n return gasUsed\n}\n"]} \ No newline at end of file +{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../../src/libs/estimate/refund.ts"],"names":[],"mappings":";;;;AAAA,mCAA6D;AAE7D,gHAA0E;AAC1E,gHAA0E;AAInE,KAAK,UAAU,MAAM,CAC1B,OAAgB,EAChB,EAAa,EACb,QAAoC,EACpC,OAAe;IAEf,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,cAAc,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IAEvD,MAAM,eAAe,GAAG,EAAE,CAAC,wBAAwB;QACjD,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACnD;gBACE,CAAC,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;gBAC1E,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC;aACzB;SACF,CAAC;QACJ,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAE1E,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;QAC5E,OAAO,CAAC,QAAS,CAAC,QAAQ;QAC1B,OAAO,CAAC,QAAS,CAAC,IAAI;QACtB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACpC,EAAE,CAAC,SAAS;KACb,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;QAC9C,IAAI,EAAE,4CAA4C;QAClD,EAAE,EAAE,OAAO,CAAC,QAAS,CAAC,WAAW;QACjC,IAAI,EAAE,eAAe;KACtB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,CAAA;IAE9C,6DAA6D;IAC7D,IAAI,eAAe,IAAI,OAAO,GAAG,EAAE,IAAI,eAAe,GAAG,EAAE;QAAE,OAAO,YAAY,CAAA;IAChF,OAAO,OAAO,CAAA;AAChB,CAAC;AAtCD,wBAsCC","sourcesContent":["import { Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account } from '../../interfaces/account'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport async function refund(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider | Provider,\n gasUsed: bigint\n): Promise {\n // WARNING: calculateRefund will 100% NOT work in all cases we have\n // So a warning not to assume this is working\n const IAmbireAccount = new Interface(AmbireAccount.abi)\n const IAmbireFactory = new Interface(AmbireFactory.abi)\n\n const accountCalldata = op.accountOpToExecuteBefore\n ? IAmbireAccount.encodeFunctionData('executeMultiple', [\n [\n [op.accountOpToExecuteBefore.calls, op.accountOpToExecuteBefore.signature],\n [op.calls, op.signature]\n ]\n ])\n : IAmbireAccount.encodeFunctionData('execute', [op.calls, op.signature])\n\n const factoryCalldata = IAmbireFactory.encodeFunctionData('deployAndExecute', [\n account.creation!.bytecode,\n account.creation!.salt,\n [[account.addr, 0, accountCalldata]],\n op.signature\n ])\n\n const estimatedGas = await provider.estimateGas({\n from: '0x0000000000000000000000000000000000000001',\n to: account.creation!.factoryAddr,\n data: factoryCalldata\n })\n\n const estimatedRefund = gasUsed - estimatedGas\n\n // As of EIP-3529, the max refund is 1/5th of the entire cost\n if (estimatedRefund <= gasUsed / 5n && estimatedRefund > 0n) return estimatedGas\n return gasUsed\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.js b/dist/src/libs/gasPrice/gasPrice.js index dad54d273..d64789664 100644 --- a/dist/src/libs/gasPrice/gasPrice.js +++ b/dist/src/libs/gasPrice/gasPrice.js @@ -1,13 +1,17 @@ -import { Interface } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import { getSignableCalls } from '../accountOp/accountOp'; -import { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getProbableCallData = exports.getGasPriceRecommendations = exports.MIN_GAS_PRICE = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const accountOp_1 = require("../accountOp/accountOp"); +const userOperation_1 = require("../userOperation/userOperation"); // https://eips.ethereum.org/EIPS/eip-1559 const DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR = 8n; const DEFAULT_ELASTICITY_MULTIPLIER = 2n; // a 1 gwei min for gas price, non1559 networks -export const MIN_GAS_PRICE = 1000000000n; +exports.MIN_GAS_PRICE = 1000000000n; // multipliers from the old: https://github.com/AmbireTech/relayer/blob/wallet-v2/src/utils/gasOracle.js#L64-L76 // 2x, 2x*0.4, 2x*0.2 - all of them divided by 8 so 0.25, 0.1, 0.05 - those seem usable; with a slight tweak for the ape const speeds = [ @@ -101,7 +105,7 @@ async function refetchBlock(provider, blockTag = -1, counter = 0) { } return lastBlock; } -export async function getGasPriceRecommendations(provider, network, blockTag = -1) { +async function getGasPriceRecommendations(provider, network, blockTag = -1) { const [lastBlock, ethGasPrice] = await Promise.all([ refetchBlock(provider, blockTag), provider.send('eth_gasPrice', []).catch((e) => { @@ -165,7 +169,7 @@ export async function getGasPriceRecommendations(provider, network, blockTag = - const prices = filterOutliers(txns.map((x) => x.gasPrice).filter((x) => x > 0)); // use th fetched price as a min if not 0 as it could be actually lower // than the hardcoded MIN. - const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : MIN_GAS_PRICE; + const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : exports.MIN_GAS_PRICE; const fee = speeds.map(({ name }, i) => { const avgGasPrice = average(nthGroup(prices, i, speeds.length)); return { @@ -175,21 +179,22 @@ export async function getGasPriceRecommendations(provider, network, blockTag = - }); return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }; } -export function getProbableCallData(account, accountOp, accountState, network) { +exports.getGasPriceRecommendations = getGasPriceRecommendations; +function getProbableCallData(account, accountOp, accountState, network) { let estimationCallData; // include the activator call for estimation if any const localOp = { ...accountOp }; - if (shouldIncludeActivatorCall(network, account, accountState, false)) { - localOp.activatorCall = getActivatorCall(localOp.accountAddr); + if ((0, userOperation_1.shouldIncludeActivatorCall)(network, account, accountState, false)) { + localOp.activatorCall = (0, userOperation_1.getActivatorCall)(localOp.accountAddr); } // always call executeMultiple as the worts case scenario // we disregard the initCode if (accountState.isDeployed) { - const ambireAccount = new Interface(AmbireAccount.abi); + const ambireAccount = new ethers_1.Interface(AmbireAccount_json_1.default.abi); estimationCallData = ambireAccount.encodeFunctionData('executeMultiple', [ [ [ - getSignableCalls(localOp), + (0, accountOp_1.getSignableCalls)(localOp), '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01' ] ] @@ -197,13 +202,13 @@ export function getProbableCallData(account, accountOp, accountState, network) { } else { // deployAndExecuteMultiple is the worst case - const ambireFactory = new Interface(AmbireFactory.abi); + const ambireFactory = new ethers_1.Interface(AmbireFactory_json_1.default.abi); estimationCallData = ambireFactory.encodeFunctionData('deployAndExecuteMultiple', [ '0x7f00000000000000000000000000000000000000000000000000000000000000017fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5553d602d80604d3d3981f3363d3d373d3d3d363d7353a31973ebcc225e219bb0d7c0c9324773f5b3e95af43d82803e903d91602b57fd5bf3', '0x0000000000000000000000000000000000000000000000000000000000000000', [ [ - getSignableCalls(localOp), + (0, accountOp_1.getSignableCalls)(localOp), '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01' ] ] @@ -211,4 +216,5 @@ export function getProbableCallData(account, accountOp, accountState, network) { } return estimationCallData; } +exports.getProbableCallData = getProbableCallData; //# sourceMappingURL=gasPrice.js.map \ No newline at end of file diff --git a/dist/src/libs/gasPrice/gasPrice.js.map b/dist/src/libs/gasPrice/gasPrice.js.map index 25afa296f..7fd2fb294 100644 --- a/dist/src/libs/gasPrice/gasPrice.js.map +++ b/dist/src/libs/gasPrice/gasPrice.js.map @@ -1 +1 @@ -{"version":3,"file":"gasPrice.js","sourceRoot":"","sources":["../../../../src/libs/gasPrice/gasPrice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Block, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\n\n// https://eips.ethereum.org/EIPS/eip-1559\nconst DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR = 8n\nconst DEFAULT_ELASTICITY_MULTIPLIER = 2n\n\n// a 1 gwei min for gas price, non1559 networks\nexport const MIN_GAS_PRICE = 1000000000n\n\n// multipliers from the old: https://github.com/AmbireTech/relayer/blob/wallet-v2/src/utils/gasOracle.js#L64-L76\n// 2x, 2x*0.4, 2x*0.2 - all of them divided by 8 so 0.25, 0.1, 0.05 - those seem usable; with a slight tweak for the ape\nconst speeds = [\n { name: 'slow', baseFeeAddBps: 0n },\n { name: 'medium', baseFeeAddBps: 500n },\n { name: 'fast', baseFeeAddBps: 1000n },\n { name: 'ape', baseFeeAddBps: 1500n }\n]\n\nexport interface GasPriceRecommendation {\n name: string\n gasPrice: bigint\n}\nexport interface Gas1559Recommendation {\n name: string\n baseFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\nexport type GasRecommendation = GasPriceRecommendation | Gas1559Recommendation\n\n// https://stackoverflow.com/questions/20811131/javascript-remove-outlier-from-an-array\nfunction filterOutliers(data: bigint[]): bigint[] {\n if (!data.length) return []\n\n // numeric sort, a - b doesn't work for bigint\n data.sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n\n const q1 = data[Math.floor(data.length / 4)]\n const endPosition = Math.ceil(data.length * (3 / 4))\n const q2 = data[endPosition < data.length ? endPosition : data.length - 1]\n const iqr = q2 - q1\n const maxValue = q2 + (iqr * 15n) / 10n\n const minValue = q1 - (iqr * 15n) / 10n\n const filteredValues = data.filter((x) => x <= maxValue && x >= minValue)\n return filteredValues\n}\n\nfunction nthGroup(data: bigint[], n: number, outOf: number): bigint[] {\n const step = Math.floor(data.length / outOf)\n const at = n * step\n\n // if n is 3 (ape speed) and we have at least 4 txns in the previous block,\n // we want to include the remaining high cost transactions in the group.\n // Example: 15 txns make 3 groups of 3 for slow, medium and fast, totalling 9\n // the remaining 6 get included in the ape calculation\n const end = n !== 3 || data.length < 4 ? at + Math.max(1, step) : data.length\n return data.slice(at, end)\n}\n\nfunction average(data: bigint[]): bigint {\n if (data.length === 0) return 0n\n return data.reduce((a, b) => a + b, 0n) / BigInt(data.length)\n}\n\nfunction getNetworkMinBaseFee(network: Network, lastBlock: Block): bigint {\n // if we have a minBaseFee set in our config, use it\n if (network.feeOptions.minBaseFee) return network.feeOptions.minBaseFee\n\n // if we don't have a config, we return 0\n if (network.predefined && !network.feeOptions.minBaseFeeEqualToLastBlock) return 0n\n\n // if it's a custom network and it has EIP-1559, set the minimum\n // to the lastBlock's baseFeePerGas. Every chain is free to tweak\n // its EIP-1559 implementation as it deems fit. Therefore, we have no\n // guarantee the 12.5% block base fee reduction will actually happen.\n // if it doesn't and we reduce the baseFee with our calculations,\n // most often than not the transaction will just get stuck.\n //\n // Transaction fees are no longer an issue on L2s.\n // Having the user spend a fraction of the cent more is way better\n // than having his txns constantly getting stuck\n return lastBlock.baseFeePerGas ?? 0n\n}\n\n// if there's an RPC issue, try refetching the block at least\n// 5 times before declaring a failure\nasync function refetchBlock(\n provider: Provider,\n blockTag: string | number = -1,\n counter = 0\n): Promise {\n // the reason we throw an error here is that getGasPriceRecommendations is\n // used in main.ts #updateGasPrice where we emit an error with a predefined\n // msg, which in turn displays a notification popup with the error.\n // If we change the design and decide to display this as an error\n // somewhere else, we should probably not throw, but return the\n // error instead\n if (counter >= 5) throw new Error('unable to retrieve block')\n\n let lastBlock = null\n try {\n const response = await Promise.race([\n provider.getBlock(blockTag, true),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('last block failed to resolve, request too slow')), 6000)\n })\n ])\n lastBlock = response as Block\n } catch (e) {\n lastBlock = null\n }\n\n if (!lastBlock) {\n const localCounter = counter + 1\n lastBlock = await refetchBlock(provider, blockTag, localCounter)\n }\n\n return lastBlock\n}\n\nexport async function getGasPriceRecommendations(\n provider: Provider,\n network: Network,\n blockTag: string | number = -1\n): Promise<{ gasPrice: GasRecommendation[]; blockGasLimit: bigint }> {\n const [lastBlock, ethGasPrice] = await Promise.all([\n refetchBlock(provider, blockTag),\n (provider as JsonRpcProvider).send('eth_gasPrice', []).catch((e) => {\n console.log('eth_gasPrice failed because of the following reason:')\n console.log(e)\n return '0x'\n })\n ])\n // https://github.com/ethers-io/ethers.js/issues/3683#issuecomment-1436554995\n const txns = lastBlock.prefetchedTransactions\n\n if (\n network.feeOptions.is1559 &&\n lastBlock.baseFeePerGas != null &&\n lastBlock.baseFeePerGas !== 0n\n ) {\n // https://eips.ethereum.org/EIPS/eip-1559\n const elasticityMultiplier =\n network.feeOptions.elasticityMultiplier ?? DEFAULT_ELASTICITY_MULTIPLIER\n const baseFeeMaxChangeDenominator =\n network.feeOptions.baseFeeMaxChangeDenominator ?? DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR\n\n const gasTarget = lastBlock.gasLimit / elasticityMultiplier\n const baseFeePerGas = lastBlock.baseFeePerGas\n const getBaseFeeDelta = (delta: bigint) =>\n (baseFeePerGas * delta) / gasTarget / baseFeeMaxChangeDenominator\n let expectedBaseFee = baseFeePerGas\n if (lastBlock.gasUsed > gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(lastBlock.gasUsed - gasTarget)\n expectedBaseFee += baseFeeDelta === 0n ? 1n : baseFeeDelta\n } else if (lastBlock.gasUsed < gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(gasTarget - lastBlock.gasUsed)\n expectedBaseFee -= baseFeeDelta\n }\n\n // if the estimated fee is below the chain minimum, set it to the min\n const minBaseFee = getNetworkMinBaseFee(network, lastBlock)\n if (expectedBaseFee < minBaseFee) expectedBaseFee = minBaseFee\n\n const tips = filterOutliers(txns.map((x) => x.maxPriorityFeePerGas!).filter((x) => x > 0))\n const fee: Gas1559Recommendation[] = []\n speeds.forEach(({ name, baseFeeAddBps }, i) => {\n const baseFee = expectedBaseFee + (expectedBaseFee * baseFeeAddBps) / 10000n\n let maxPriorityFeePerGas = average(nthGroup(tips, i, speeds.length))\n\n // set a bare minimum of 100000n for maxPriorityFeePerGas\n maxPriorityFeePerGas = maxPriorityFeePerGas >= 100000n ? maxPriorityFeePerGas : 100000n\n\n // compare the maxPriorityFeePerGas with the previous speed\n // if it's not at least 12% bigger, then replace the calculated one\n // with at least 12% bigger maxPriorityFeePerGas.\n // This is most impactufull on L2s where txns get stuck for low maxPriorityFeePerGas\n //\n // if the speed is ape, make it 50% more\n const prevSpeed = fee.length ? fee[i - 1].maxPriorityFeePerGas : null\n if (prevSpeed) {\n const divider = name === 'ape' ? 2n : 8n\n const min = prevSpeed + prevSpeed / divider\n if (maxPriorityFeePerGas < min) maxPriorityFeePerGas = min\n }\n\n fee.push({\n name,\n baseFeePerGas: baseFee,\n maxPriorityFeePerGas\n })\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n }\n const prices = filterOutliers(txns.map((x) => x.gasPrice!).filter((x) => x > 0))\n\n // use th fetched price as a min if not 0 as it could be actually lower\n // than the hardcoded MIN.\n const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : MIN_GAS_PRICE\n\n const fee = speeds.map(({ name }, i) => {\n const avgGasPrice = average(nthGroup(prices, i, speeds.length))\n return {\n name,\n gasPrice: avgGasPrice >= minOrFetchedGasPrice ? avgGasPrice : minOrFetchedGasPrice\n }\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n}\n\nexport function getProbableCallData(\n account: Account,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n network: Network\n): string {\n let estimationCallData\n\n // include the activator call for estimation if any\n const localOp = { ...accountOp }\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n localOp.activatorCall = getActivatorCall(localOp.accountAddr)\n }\n\n // always call executeMultiple as the worts case scenario\n // we disregard the initCode\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n estimationCallData = ambireAccount.encodeFunctionData('executeMultiple', [\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n } else {\n // deployAndExecuteMultiple is the worst case\n const ambireFactory = new Interface(AmbireFactory.abi)\n estimationCallData = ambireFactory.encodeFunctionData('deployAndExecuteMultiple', [\n '0x7f00000000000000000000000000000000000000000000000000000000000000017fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5553d602d80604d3d3981f3363d3d373d3d3d363d7353a31973ebcc225e219bb0d7c0c9324773f5b3e95af43d82803e903d91602b57fd5bf3',\n '0x0000000000000000000000000000000000000000000000000000000000000000',\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n }\n\n return estimationCallData\n}\n"]} \ No newline at end of file +{"version":3,"file":"gasPrice.js","sourceRoot":"","sources":["../../../../src/libs/gasPrice/gasPrice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Block, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { AccountOp, getSignableCalls } from '../accountOp/accountOp'\nimport { getActivatorCall, shouldIncludeActivatorCall } from '../userOperation/userOperation'\n\n// https://eips.ethereum.org/EIPS/eip-1559\nconst DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR = 8n\nconst DEFAULT_ELASTICITY_MULTIPLIER = 2n\n\n// a 1 gwei min for gas price, non1559 networks\nexport const MIN_GAS_PRICE = 1000000000n\n\n// multipliers from the old: https://github.com/AmbireTech/relayer/blob/wallet-v2/src/utils/gasOracle.js#L64-L76\n// 2x, 2x*0.4, 2x*0.2 - all of them divided by 8 so 0.25, 0.1, 0.05 - those seem usable; with a slight tweak for the ape\nconst speeds = [\n { name: 'slow', baseFeeAddBps: 0n },\n { name: 'medium', baseFeeAddBps: 500n },\n { name: 'fast', baseFeeAddBps: 1000n },\n { name: 'ape', baseFeeAddBps: 1500n }\n]\n\nexport interface GasPriceRecommendation {\n name: string\n gasPrice: bigint\n}\nexport interface Gas1559Recommendation {\n name: string\n baseFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\nexport type GasRecommendation = GasPriceRecommendation | Gas1559Recommendation\n\n// https://stackoverflow.com/questions/20811131/javascript-remove-outlier-from-an-array\nfunction filterOutliers(data: bigint[]): bigint[] {\n if (!data.length) return []\n\n // numeric sort, a - b doesn't work for bigint\n data.sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n\n const q1 = data[Math.floor(data.length / 4)]\n const endPosition = Math.ceil(data.length * (3 / 4))\n const q2 = data[endPosition < data.length ? endPosition : data.length - 1]\n const iqr = q2 - q1\n const maxValue = q2 + (iqr * 15n) / 10n\n const minValue = q1 - (iqr * 15n) / 10n\n const filteredValues = data.filter((x) => x <= maxValue && x >= minValue)\n return filteredValues\n}\n\nfunction nthGroup(data: bigint[], n: number, outOf: number): bigint[] {\n const step = Math.floor(data.length / outOf)\n const at = n * step\n\n // if n is 3 (ape speed) and we have at least 4 txns in the previous block,\n // we want to include the remaining high cost transactions in the group.\n // Example: 15 txns make 3 groups of 3 for slow, medium and fast, totalling 9\n // the remaining 6 get included in the ape calculation\n const end = n !== 3 || data.length < 4 ? at + Math.max(1, step) : data.length\n return data.slice(at, end)\n}\n\nfunction average(data: bigint[]): bigint {\n if (data.length === 0) return 0n\n return data.reduce((a, b) => a + b, 0n) / BigInt(data.length)\n}\n\nfunction getNetworkMinBaseFee(network: Network, lastBlock: Block): bigint {\n // if we have a minBaseFee set in our config, use it\n if (network.feeOptions.minBaseFee) return network.feeOptions.minBaseFee\n\n // if we don't have a config, we return 0\n if (network.predefined && !network.feeOptions.minBaseFeeEqualToLastBlock) return 0n\n\n // if it's a custom network and it has EIP-1559, set the minimum\n // to the lastBlock's baseFeePerGas. Every chain is free to tweak\n // its EIP-1559 implementation as it deems fit. Therefore, we have no\n // guarantee the 12.5% block base fee reduction will actually happen.\n // if it doesn't and we reduce the baseFee with our calculations,\n // most often than not the transaction will just get stuck.\n //\n // Transaction fees are no longer an issue on L2s.\n // Having the user spend a fraction of the cent more is way better\n // than having his txns constantly getting stuck\n return lastBlock.baseFeePerGas ?? 0n\n}\n\n// if there's an RPC issue, try refetching the block at least\n// 5 times before declaring a failure\nasync function refetchBlock(\n provider: Provider,\n blockTag: string | number = -1,\n counter = 0\n): Promise {\n // the reason we throw an error here is that getGasPriceRecommendations is\n // used in main.ts #updateGasPrice where we emit an error with a predefined\n // msg, which in turn displays a notification popup with the error.\n // If we change the design and decide to display this as an error\n // somewhere else, we should probably not throw, but return the\n // error instead\n if (counter >= 5) throw new Error('unable to retrieve block')\n\n let lastBlock = null\n try {\n const response = await Promise.race([\n provider.getBlock(blockTag, true),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('last block failed to resolve, request too slow')), 6000)\n })\n ])\n lastBlock = response as Block\n } catch (e) {\n lastBlock = null\n }\n\n if (!lastBlock) {\n const localCounter = counter + 1\n lastBlock = await refetchBlock(provider, blockTag, localCounter)\n }\n\n return lastBlock\n}\n\nexport async function getGasPriceRecommendations(\n provider: Provider,\n network: Network,\n blockTag: string | number = -1\n): Promise<{ gasPrice: GasRecommendation[]; blockGasLimit: bigint }> {\n const [lastBlock, ethGasPrice] = await Promise.all([\n refetchBlock(provider, blockTag),\n (provider as JsonRpcProvider).send('eth_gasPrice', []).catch((e) => {\n console.log('eth_gasPrice failed because of the following reason:')\n console.log(e)\n return '0x'\n })\n ])\n // https://github.com/ethers-io/ethers.js/issues/3683#issuecomment-1436554995\n const txns = lastBlock.prefetchedTransactions\n\n if (\n network.feeOptions.is1559 &&\n lastBlock.baseFeePerGas != null &&\n lastBlock.baseFeePerGas !== 0n\n ) {\n // https://eips.ethereum.org/EIPS/eip-1559\n const elasticityMultiplier =\n network.feeOptions.elasticityMultiplier ?? DEFAULT_ELASTICITY_MULTIPLIER\n const baseFeeMaxChangeDenominator =\n network.feeOptions.baseFeeMaxChangeDenominator ?? DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR\n\n const gasTarget = lastBlock.gasLimit / elasticityMultiplier\n const baseFeePerGas = lastBlock.baseFeePerGas\n const getBaseFeeDelta = (delta: bigint) =>\n (baseFeePerGas * delta) / gasTarget / baseFeeMaxChangeDenominator\n let expectedBaseFee = baseFeePerGas\n if (lastBlock.gasUsed > gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(lastBlock.gasUsed - gasTarget)\n expectedBaseFee += baseFeeDelta === 0n ? 1n : baseFeeDelta\n } else if (lastBlock.gasUsed < gasTarget) {\n const baseFeeDelta = getBaseFeeDelta(gasTarget - lastBlock.gasUsed)\n expectedBaseFee -= baseFeeDelta\n }\n\n // if the estimated fee is below the chain minimum, set it to the min\n const minBaseFee = getNetworkMinBaseFee(network, lastBlock)\n if (expectedBaseFee < minBaseFee) expectedBaseFee = minBaseFee\n\n const tips = filterOutliers(txns.map((x) => x.maxPriorityFeePerGas!).filter((x) => x > 0))\n const fee: Gas1559Recommendation[] = []\n speeds.forEach(({ name, baseFeeAddBps }, i) => {\n const baseFee = expectedBaseFee + (expectedBaseFee * baseFeeAddBps) / 10000n\n let maxPriorityFeePerGas = average(nthGroup(tips, i, speeds.length))\n\n // set a bare minimum of 100000n for maxPriorityFeePerGas\n maxPriorityFeePerGas = maxPriorityFeePerGas >= 100000n ? maxPriorityFeePerGas : 100000n\n\n // compare the maxPriorityFeePerGas with the previous speed\n // if it's not at least 12% bigger, then replace the calculated one\n // with at least 12% bigger maxPriorityFeePerGas.\n // This is most impactufull on L2s where txns get stuck for low maxPriorityFeePerGas\n //\n // if the speed is ape, make it 50% more\n const prevSpeed = fee.length ? fee[i - 1].maxPriorityFeePerGas : null\n if (prevSpeed) {\n const divider = name === 'ape' ? 2n : 8n\n const min = prevSpeed + prevSpeed / divider\n if (maxPriorityFeePerGas < min) maxPriorityFeePerGas = min\n }\n\n fee.push({\n name,\n baseFeePerGas: baseFee,\n maxPriorityFeePerGas\n })\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n }\n const prices = filterOutliers(txns.map((x) => x.gasPrice!).filter((x) => x > 0))\n\n // use th fetched price as a min if not 0 as it could be actually lower\n // than the hardcoded MIN.\n const minOrFetchedGasPrice = ethGasPrice !== '0x' ? BigInt(ethGasPrice) : MIN_GAS_PRICE\n\n const fee = speeds.map(({ name }, i) => {\n const avgGasPrice = average(nthGroup(prices, i, speeds.length))\n return {\n name,\n gasPrice: avgGasPrice >= minOrFetchedGasPrice ? avgGasPrice : minOrFetchedGasPrice\n }\n })\n return { gasPrice: fee, blockGasLimit: lastBlock.gasLimit }\n}\n\nexport function getProbableCallData(\n account: Account,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n network: Network\n): string {\n let estimationCallData\n\n // include the activator call for estimation if any\n const localOp = { ...accountOp }\n if (shouldIncludeActivatorCall(network, account, accountState, false)) {\n localOp.activatorCall = getActivatorCall(localOp.accountAddr)\n }\n\n // always call executeMultiple as the worts case scenario\n // we disregard the initCode\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n estimationCallData = ambireAccount.encodeFunctionData('executeMultiple', [\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n } else {\n // deployAndExecuteMultiple is the worst case\n const ambireFactory = new Interface(AmbireFactory.abi)\n estimationCallData = ambireFactory.encodeFunctionData('deployAndExecuteMultiple', [\n '0x7f00000000000000000000000000000000000000000000000000000000000000017fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5553d602d80604d3d3981f3363d3d373d3d3d363d7353a31973ebcc225e219bb0d7c0c9324773f5b3e95af43d82803e903d91602b57fd5bf3',\n '0x0000000000000000000000000000000000000000000000000000000000000000',\n [\n [\n getSignableCalls(localOp),\n '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n ]\n ]\n ])\n }\n\n return estimationCallData\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/1Inch.js b/dist/src/libs/humanizer/const/abis/1Inch.js index 796483878..77ebd819f 100644 --- a/dist/src/libs/humanizer/const/abis/1Inch.js +++ b/dist/src/libs/humanizer/const/abis/1Inch.js @@ -1,4 +1,7 @@ -export const OneInch = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OneInch = void 0; +exports.OneInch = [ 'function advanceEpoch(uint96,uint256)', 'function and(uint256,bytes) view returns (bool)', 'function arbitraryStaticCall(address,bytes) view returns (uint256)', diff --git a/dist/src/libs/humanizer/const/abis/1Inch.js.map b/dist/src/libs/humanizer/const/abis/1Inch.js.map index b91fec271..dd9df28fd 100644 --- a/dist/src/libs/humanizer/const/abis/1Inch.js.map +++ b/dist/src/libs/humanizer/const/abis/1Inch.js.map @@ -1 +1 @@ -{"version":3,"file":"1Inch.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/1Inch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,uCAAuC;IACvC,iDAAiD;IACjD,oEAAoE;IACpE,yEAAyE;IACzE,kDAAkD;IAClD,8DAA8D;IAC9D,4CAA4C;IAC5C,oDAAoD;IACpD,iHAAiH;IACjH,2HAA2H;IAC3H,qEAAqE;IACrE,+FAA+F;IAC/F,uDAAuD;IACvD,mEAAmE;IACnE,gDAAgD;IAChD,gEAAgE;IAChE,yEAAyE;IACzE,iFAAiF;IACjF,0EAA0E;IAC1E,mFAAmF;IACnF,2FAA2F;IAC3F,4JAA4J;IAC5J,sKAAsK;IACtK,sKAAsK;IACtK,gLAAgL;IAChL,gDAAgD;IAChD,mHAAmH;IACnH,gCAAgC;IAChC,gDAAgD;IAChD,yCAAyC;IACzC,gDAAgD;IAChD,yCAAyC;IACzC,kBAAkB;IAClB,uCAAuC;IACvC,6CAA6C;IAC7C,kFAAkF;IAClF,+EAA+E;IAC/E,8BAA8B;IAC9B,uCAAuC;IACvC,kCAAkC;IAClC,yNAAyN;IACzN,qCAAqC;IACrC,qDAAqD;IACrD,oGAAoG;IACpG,gGAAgG;IAChG,2HAA2H;IAC3H,6GAA6G;IAC7G,wFAAwF;IACxF,gGAAgG;IAChG,oBAAoB;IACpB,yQAAyQ;CAC1Q,CAAA","sourcesContent":["export const OneInch = [\n 'function advanceEpoch(uint96,uint256)',\n 'function and(uint256,bytes) view returns (bool)',\n 'function arbitraryStaticCall(address,bytes) view returns (uint256)',\n 'function bitInvalidatorForOrder(address,uint256) view returns (uint256)',\n 'function bitsInvalidateForOrder(uint256,uint256)',\n 'function cancelOrder(uint256 makerTraits, bytes32 orderHash)',\n 'function cancelOrders(uint256[],bytes32[])',\n 'function checkPredicate(bytes) view returns (bool)',\n 'function clipperSwap(address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function clipperSwapTo(address,address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function curveSwapCallback(address,address,address,uint256,uint256)',\n 'function eip712Domain() view returns (bytes1,string,string,uint256,address,bytes32,uint256[])',\n 'function epoch(address,uint96) view returns (uint256)',\n 'function epochEquals(address,uint256,uint256) view returns (bool)',\n 'function eq(uint256,bytes) view returns (bool)',\n 'function ethUnoswap(uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap2(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap3(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo2(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function fillContractOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256) returns (uint256,uint256,bytes32)',\n 'function fillContractOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256,bytes) returns (uint256,uint256,bytes32)',\n 'function fillOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256) payable returns (uint256,uint256,bytes32)',\n 'function fillOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256,bytes) payable returns (uint256,uint256,bytes32)',\n 'function gt(uint256,bytes) view returns (bool)',\n 'function hashOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) view returns (bytes32)',\n 'function increaseEpoch(uint96)',\n 'function lt(uint256,bytes) view returns (bool)',\n 'function not(bytes) view returns (bool)',\n 'function or(uint256,bytes) view returns (bool)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function paused() view returns (bool)',\n 'function permitAndCall(bytes,bytes) payable',\n 'function rawRemainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function remainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function simulate(address,bytes)',\n 'function swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data) payable returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function uniswapV3SwapCallback(int256,int256,bytes)',\n 'function unoswap(uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256)',\n 'function unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)',\n 'function unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3) returns (uint256)',\n 'function unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex) returns (uint256)',\n 'function unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unpause()',\n 'function swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"1Inch.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/1Inch.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG;IACrB,uCAAuC;IACvC,iDAAiD;IACjD,oEAAoE;IACpE,yEAAyE;IACzE,kDAAkD;IAClD,8DAA8D;IAC9D,4CAA4C;IAC5C,oDAAoD;IACpD,iHAAiH;IACjH,2HAA2H;IAC3H,qEAAqE;IACrE,+FAA+F;IAC/F,uDAAuD;IACvD,mEAAmE;IACnE,gDAAgD;IAChD,gEAAgE;IAChE,yEAAyE;IACzE,iFAAiF;IACjF,0EAA0E;IAC1E,mFAAmF;IACnF,2FAA2F;IAC3F,4JAA4J;IAC5J,sKAAsK;IACtK,sKAAsK;IACtK,gLAAgL;IAChL,gDAAgD;IAChD,mHAAmH;IACnH,gCAAgC;IAChC,gDAAgD;IAChD,yCAAyC;IACzC,gDAAgD;IAChD,yCAAyC;IACzC,kBAAkB;IAClB,uCAAuC;IACvC,6CAA6C;IAC7C,kFAAkF;IAClF,+EAA+E;IAC/E,8BAA8B;IAC9B,uCAAuC;IACvC,kCAAkC;IAClC,yNAAyN;IACzN,qCAAqC;IACrC,qDAAqD;IACrD,oGAAoG;IACpG,gGAAgG;IAChG,2HAA2H;IAC3H,6GAA6G;IAC7G,wFAAwF;IACxF,gGAAgG;IAChG,oBAAoB;IACpB,yQAAyQ;CAC1Q,CAAA","sourcesContent":["export const OneInch = [\n 'function advanceEpoch(uint96,uint256)',\n 'function and(uint256,bytes) view returns (bool)',\n 'function arbitraryStaticCall(address,bytes) view returns (uint256)',\n 'function bitInvalidatorForOrder(address,uint256) view returns (uint256)',\n 'function bitsInvalidateForOrder(uint256,uint256)',\n 'function cancelOrder(uint256 makerTraits, bytes32 orderHash)',\n 'function cancelOrders(uint256[],bytes32[])',\n 'function checkPredicate(bytes) view returns (bool)',\n 'function clipperSwap(address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function clipperSwapTo(address,address,uint256,address,uint256,uint256,uint256,bytes32,bytes32) payable returns (uint256)',\n 'function curveSwapCallback(address,address,address,uint256,uint256)',\n 'function eip712Domain() view returns (bytes1,string,string,uint256,address,bytes32,uint256[])',\n 'function epoch(address,uint96) view returns (uint256)',\n 'function epochEquals(address,uint256,uint256) view returns (bool)',\n 'function eq(uint256,bytes) view returns (bool)',\n 'function ethUnoswap(uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap2(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswap3(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo(uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo2(uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256) payable returns (uint256)',\n 'function fillContractOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256) returns (uint256,uint256,bytes32)',\n 'function fillContractOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes,uint256,uint256,bytes) returns (uint256,uint256,bytes32)',\n 'function fillOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256) payable returns (uint256,uint256,bytes32)',\n 'function fillOrderArgs(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),bytes32,bytes32,uint256,uint256,bytes) payable returns (uint256,uint256,bytes32)',\n 'function gt(uint256,bytes) view returns (bool)',\n 'function hashOrder(tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) view returns (bytes32)',\n 'function increaseEpoch(uint96)',\n 'function lt(uint256,bytes) view returns (bool)',\n 'function not(bytes) view returns (bool)',\n 'function or(uint256,bytes) view returns (bool)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function paused() view returns (bool)',\n 'function permitAndCall(bytes,bytes) payable',\n 'function rawRemainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function remainingInvalidatorForOrder(address,bytes32) view returns (uint256)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function simulate(address,bytes)',\n 'function swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data) payable returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function uniswapV3SwapCallback(int256,int256,bytes)',\n 'function unoswap(uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256)',\n 'function unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)',\n 'function unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3) returns (uint256)',\n 'function unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex) returns (uint256)',\n 'function unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256) returns (uint256)',\n 'function unpause()',\n 'function swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Aave.js b/dist/src/libs/humanizer/const/abis/Aave.js index ac3b89746..8f0cc483e 100644 --- a/dist/src/libs/humanizer/const/abis/Aave.js +++ b/dist/src/libs/humanizer/const/abis/Aave.js @@ -1,4 +1,7 @@ -export const AaveLendingPoolV2 = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AaveV3Pool = exports.AaveWethGatewayV2 = exports.AaveLendingPoolV2 = void 0; +exports.AaveLendingPoolV2 = [ 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)', 'function LENDINGPOOL_REVISION() view returns (uint256)', 'function MAX_NUMBER_RESERVES() view returns (uint256)', @@ -28,7 +31,7 @@ export const AaveLendingPoolV2 = [ 'function swapBorrowRateMode(address asset, uint256 rateMode)', 'function withdraw(address asset, uint256 amount, address to) returns (uint256)' ]; -export const AaveWethGatewayV2 = [ +exports.AaveWethGatewayV2 = [ 'function authorizeLendingPool(address lendingPool)', 'function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)', 'function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable', @@ -41,7 +44,7 @@ export const AaveWethGatewayV2 = [ 'function transferOwnership(address newOwner)', 'function withdrawETH(address lendingPool, uint256 amount, address to)' ]; -export const AaveV3Pool = [ +exports.AaveV3Pool = [ 'function ADDRESSES_PROVIDER() view returns (address)', 'function BRIDGE_PROTOCOL_FEE() view returns (uint256)', 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint128)', diff --git a/dist/src/libs/humanizer/const/abis/Aave.js.map b/dist/src/libs/humanizer/const/abis/Aave.js.map index 1d1104a40..ccfc570c4 100644 --- a/dist/src/libs/humanizer/const/abis/Aave.js.map +++ b/dist/src/libs/humanizer/const/abis/Aave.js.map @@ -1 +1 @@ -{"version":3,"file":"Aave.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Aave.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,2DAA2D;IAC3D,wDAAwD;IACxD,uDAAuD;IACvD,uEAAuE;IACvE,mHAAmH;IACnH,0FAA0F;IAC1F,wIAAwI;IACxI,0JAA0J;IAC1J,wDAAwD;IACxD,wEAAwE;IACxE,iZAAiZ;IACjZ,2EAA2E;IAC3E,iFAAiF;IACjF,qDAAqD;IACrD,gNAAgN;IAChN,2EAA2E;IAC3E,yJAAyJ;IACzJ,uCAAuC;IACvC,6HAA6H;IAC7H,uCAAuC;IACvC,iEAAiE;IACjE,uGAAuG;IACvG,iEAAiE;IACjE,6BAA6B;IAC7B,4FAA4F;IAC5F,6EAA6E;IAC7E,8DAA8D;IAC9D,gFAAgF;CACjF,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oDAAoD;IACpD,uGAAuG;IACvG,2FAA2F;IAC3F,6DAA6D;IAC7D,4EAA4E;IAC5E,kDAAkD;IAClD,yCAAyC;IACzC,8BAA8B;IAC9B,sGAAsG;IACtG,8CAA8C;IAC9C,uEAAuE;CACxE,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,sDAAsD;IACtD,uDAAuD;IACvD,2DAA2D;IAC3D,iEAAiE;IACjE,sDAAsD;IACtD,iDAAiD;IACjD,qFAAqF;IACrF,mHAAmH;IACnH,+BAA+B;IAC/B,sIAAsI;IACtI,qFAAqF;IACrF,qFAAqF;IACrF,0FAA0F;IAC1F,qCAAqC;IACrC,wIAAwI;IACxI,sKAAsK;IACtK,qHAAqH;IACrH,kDAAkD;IAClD,kDAAkD;IAClD,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,uIAAuI;IACvI,8JAA8J;IAC9J,gEAAgE;IAChE,iDAAiD;IACjD,qDAAqD;IACrD,oEAAoE;IACpE,uDAAuD;IACvD,gDAAgD;IAChD,kEAAkE;IAClE,+dAA+d;IAC/d,8jBAA8jB;IAC9jB,2EAA2E;IAC3E,iFAAiF;IACjF,oDAAoD;IACpD,qDAAqD;IACrD,kDAAkD;IAClD,mNAAmN;IACnN,2EAA2E;IAC3E,4DAA4D;IAC5D,4EAA4E;IAC5E,8HAA8H;IAC9H,uCAAuC;IACvC,6HAA6H;IAC7H,wDAAwD;IACxD,2CAA2C;IAC3C,+FAA+F;IAC/F,gDAAgD;IAChD,+GAA+G;IAC/G,sGAAsG;IACtG,2DAA2D;IAC3D,gFAAgF;IAChF,4LAA4L;IAC5L,kEAAkE;IAClE,qDAAqD;IACrD,wEAAwE;IACxE,iEAAiE;IACjE,4FAA4F;IAC5F,yCAAyC;IACzC,sDAAsD;IACtD,6EAA6E;IAC7E,yFAAyF;IACzF,+BAA+B;IAC/B,sKAAsK;IACtK,+DAA+D;IAC/D,0CAA0C;IAC1C,wCAAwC;IACxC,uDAAuD;IACvD,qGAAqG;IACrG,gFAAgF;IAChF,mDAAmD;CACpD,CAAA","sourcesContent":["export const AaveLendingPoolV2 = [\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)',\n 'function LENDINGPOOL_REVISION() view returns (uint256)',\n 'function MAX_NUMBER_RESERVES() view returns (uint256)',\n 'function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() view returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] modes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function getAddressesProvider() view returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function paused() view returns (bool)',\n 'function rebalanceStableBorrowRate(address asset, address user)',\n 'function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)',\n 'function setConfiguration(address asset, uint256 configuration)',\n 'function setPause(bool val)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function swapBorrowRateMode(address asset, uint256 rateMode)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)'\n]\n\nexport const AaveWethGatewayV2 = [\n 'function authorizeLendingPool(address lendingPool)',\n 'function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)',\n 'function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable',\n 'function emergencyEtherTransfer(address to, uint256 amount)',\n 'function emergencyTokenTransfer(address token, address to, uint256 amount)',\n 'function getWETHAddress() view returns (address)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function repayETH(address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf) payable',\n 'function transferOwnership(address newOwner)',\n 'function withdrawETH(address lendingPool, uint256 amount, address to)'\n]\n\nexport const AaveV3Pool = [\n 'function ADDRESSES_PROVIDER() view returns (address)',\n 'function BRIDGE_PROTOCOL_FEE() view returns (uint256)',\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint128)',\n 'function FLASHLOAN_PREMIUM_TO_PROTOCOL() view returns (uint128)',\n 'function MAX_NUMBER_RESERVES() view returns (uint16)',\n 'function POOL_REVISION() view returns (uint256)',\n 'function backUnbacked(address asset, uint256 amount, uint256 fee) returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function borrow(bytes32 args)',\n 'function configureEModeCategory(uint8 id, (uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, string label) category)',\n 'function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap)',\n 'function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function dropReserve(address asset)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] interestRateModes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)',\n 'function getBorrowLogic() pure returns (address)',\n 'function getBridgeLogic() pure returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getEModeCategoryBorrowableBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralConfig(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus))',\n 'function getEModeCategoryData(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, address priceSource, string label))',\n 'function getEModeCategoryLabel(uint8 id) view returns (string)',\n 'function getEModeLogic() pure returns (address)',\n 'function getFlashLoanLogic() pure returns (address)',\n 'function getLiquidationGracePeriod(address asset) returns (uint40)',\n 'function getLiquidationLogic() pure returns (address)',\n 'function getPoolLogic() pure returns (address)',\n 'function getReserveAddressById(uint16 id) view returns (address)',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt))',\n 'function getReserveDataExtended(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 __deprecatedStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, uint40 liquidationGracePeriodUntil, address aTokenAddress, address __deprecatedStableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt, uint128 virtualUnderlyingBalance))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesCount() view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getSupplyLogic() pure returns (address)',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function getUserEMode(address user) view returns (uint256)',\n 'function getVirtualUnderlyingBalance(address asset) view returns (uint128)',\n 'function initReserve(address asset, address aTokenAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function liquidationCall(bytes32 args1, bytes32 args2)',\n 'function mintToTreasury(address[] assets)',\n 'function mintUnbacked(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function repay(bytes32 args) returns (uint256)',\n 'function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)',\n 'function repayWithATokens(address asset, uint256 amount, uint256 interestRateMode) returns (uint256)',\n 'function repayWithATokens(bytes32 args) returns (uint256)',\n 'function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) returns (uint256)',\n 'function repayWithPermit(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS) returns (uint256)',\n 'function rescueTokens(address token, address to, uint256 amount)',\n 'function resetIsolationModeTotalDebt(address asset)',\n 'function setConfiguration(address asset, (uint256 data) configuration)',\n 'function setLiquidationGracePeriod(address asset, uint40 until)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserEMode(uint8 categoryId)',\n 'function setUserUseReserveAsCollateral(bytes32 args)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function supply(bytes32 args)',\n 'function supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)',\n 'function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s)',\n 'function syncIndexesState(address asset)',\n 'function syncRatesState(address asset)',\n 'function updateBridgeProtocolFee(uint256 protocolFee)',\n 'function updateFlashloanPremiums(uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)',\n 'function withdraw(bytes32 args) returns (uint256)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Aave.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Aave.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG;IAC/B,2DAA2D;IAC3D,wDAAwD;IACxD,uDAAuD;IACvD,uEAAuE;IACvE,mHAAmH;IACnH,0FAA0F;IAC1F,wIAAwI;IACxI,0JAA0J;IAC1J,wDAAwD;IACxD,wEAAwE;IACxE,iZAAiZ;IACjZ,2EAA2E;IAC3E,iFAAiF;IACjF,qDAAqD;IACrD,gNAAgN;IAChN,2EAA2E;IAC3E,yJAAyJ;IACzJ,uCAAuC;IACvC,6HAA6H;IAC7H,uCAAuC;IACvC,iEAAiE;IACjE,uGAAuG;IACvG,iEAAiE;IACjE,6BAA6B;IAC7B,4FAA4F;IAC5F,6EAA6E;IAC7E,8DAA8D;IAC9D,gFAAgF;CACjF,CAAA;AAEY,QAAA,iBAAiB,GAAG;IAC/B,oDAAoD;IACpD,uGAAuG;IACvG,2FAA2F;IAC3F,6DAA6D;IAC7D,4EAA4E;IAC5E,kDAAkD;IAClD,yCAAyC;IACzC,8BAA8B;IAC9B,sGAAsG;IACtG,8CAA8C;IAC9C,uEAAuE;CACxE,CAAA;AAEY,QAAA,UAAU,GAAG;IACxB,sDAAsD;IACtD,uDAAuD;IACvD,2DAA2D;IAC3D,iEAAiE;IACjE,sDAAsD;IACtD,iDAAiD;IACjD,qFAAqF;IACrF,mHAAmH;IACnH,+BAA+B;IAC/B,sIAAsI;IACtI,qFAAqF;IACrF,qFAAqF;IACrF,0FAA0F;IAC1F,qCAAqC;IACrC,wIAAwI;IACxI,sKAAsK;IACtK,qHAAqH;IACrH,kDAAkD;IAClD,kDAAkD;IAClD,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,uIAAuI;IACvI,8JAA8J;IAC9J,gEAAgE;IAChE,iDAAiD;IACjD,qDAAqD;IACrD,oEAAoE;IACpE,uDAAuD;IACvD,gDAAgD;IAChD,kEAAkE;IAClE,+dAA+d;IAC/d,8jBAA8jB;IAC9jB,2EAA2E;IAC3E,iFAAiF;IACjF,oDAAoD;IACpD,qDAAqD;IACrD,kDAAkD;IAClD,mNAAmN;IACnN,2EAA2E;IAC3E,4DAA4D;IAC5D,4EAA4E;IAC5E,8HAA8H;IAC9H,uCAAuC;IACvC,6HAA6H;IAC7H,wDAAwD;IACxD,2CAA2C;IAC3C,+FAA+F;IAC/F,gDAAgD;IAChD,+GAA+G;IAC/G,sGAAsG;IACtG,2DAA2D;IAC3D,gFAAgF;IAChF,4LAA4L;IAC5L,kEAAkE;IAClE,qDAAqD;IACrD,wEAAwE;IACxE,iEAAiE;IACjE,4FAA4F;IAC5F,yCAAyC;IACzC,sDAAsD;IACtD,6EAA6E;IAC7E,yFAAyF;IACzF,+BAA+B;IAC/B,sKAAsK;IACtK,+DAA+D;IAC/D,0CAA0C;IAC1C,wCAAwC;IACxC,uDAAuD;IACvD,qGAAqG;IACrG,gFAAgF;IAChF,mDAAmD;CACpD,CAAA","sourcesContent":["export const AaveLendingPoolV2 = [\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint256)',\n 'function LENDINGPOOL_REVISION() view returns (uint256)',\n 'function MAX_NUMBER_RESERVES() view returns (uint256)',\n 'function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() view returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] modes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function getAddressesProvider() view returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function paused() view returns (bool)',\n 'function rebalanceStableBorrowRate(address asset, address user)',\n 'function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)',\n 'function setConfiguration(address asset, uint256 configuration)',\n 'function setPause(bool val)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function swapBorrowRateMode(address asset, uint256 rateMode)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)'\n]\n\nexport const AaveWethGatewayV2 = [\n 'function authorizeLendingPool(address lendingPool)',\n 'function borrowETH(address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode)',\n 'function depositETH(address lendingPool, address onBehalfOf, uint16 referralCode) payable',\n 'function emergencyEtherTransfer(address to, uint256 amount)',\n 'function emergencyTokenTransfer(address token, address to, uint256 amount)',\n 'function getWETHAddress() view returns (address)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function repayETH(address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf) payable',\n 'function transferOwnership(address newOwner)',\n 'function withdrawETH(address lendingPool, uint256 amount, address to)'\n]\n\nexport const AaveV3Pool = [\n 'function ADDRESSES_PROVIDER() view returns (address)',\n 'function BRIDGE_PROTOCOL_FEE() view returns (uint256)',\n 'function FLASHLOAN_PREMIUM_TOTAL() view returns (uint128)',\n 'function FLASHLOAN_PREMIUM_TO_PROTOCOL() view returns (uint128)',\n 'function MAX_NUMBER_RESERVES() view returns (uint16)',\n 'function POOL_REVISION() view returns (uint256)',\n 'function backUnbacked(address asset, uint256 amount, uint256 fee) returns (uint256)',\n 'function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)',\n 'function borrow(bytes32 args)',\n 'function configureEModeCategory(uint8 id, (uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, string label) category)',\n 'function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap)',\n 'function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap)',\n 'function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function dropReserve(address asset)',\n 'function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore)',\n 'function flashLoan(address receiverAddress, address[] assets, uint256[] amounts, uint256[] interestRateModes, address onBehalfOf, bytes params, uint16 referralCode)',\n 'function flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)',\n 'function getBorrowLogic() pure returns (address)',\n 'function getBridgeLogic() pure returns (address)',\n 'function getConfiguration(address asset) view returns ((uint256 data))',\n 'function getEModeCategoryBorrowableBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralBitmap(uint8 id) view returns (uint128)',\n 'function getEModeCategoryCollateralConfig(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus))',\n 'function getEModeCategoryData(uint8 id) view returns ((uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, address priceSource, string label))',\n 'function getEModeCategoryLabel(uint8 id) view returns (string)',\n 'function getEModeLogic() pure returns (address)',\n 'function getFlashLoanLogic() pure returns (address)',\n 'function getLiquidationGracePeriod(address asset) returns (uint40)',\n 'function getLiquidationLogic() pure returns (address)',\n 'function getPoolLogic() pure returns (address)',\n 'function getReserveAddressById(uint16 id) view returns (address)',\n 'function getReserveData(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt))',\n 'function getReserveDataExtended(address asset) view returns (((uint256 data) configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 __deprecatedStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, uint40 liquidationGracePeriodUntil, address aTokenAddress, address __deprecatedStableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt, uint128 virtualUnderlyingBalance))',\n 'function getReserveNormalizedIncome(address asset) view returns (uint256)',\n 'function getReserveNormalizedVariableDebt(address asset) view returns (uint256)',\n 'function getReservesCount() view returns (uint256)',\n 'function getReservesList() view returns (address[])',\n 'function getSupplyLogic() pure returns (address)',\n 'function getUserAccountData(address user) view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)',\n 'function getUserConfiguration(address user) view returns ((uint256 data))',\n 'function getUserEMode(address user) view returns (uint256)',\n 'function getVirtualUnderlyingBalance(address asset) view returns (uint128)',\n 'function initReserve(address asset, address aTokenAddress, address variableDebtAddress, address interestRateStrategyAddress)',\n 'function initialize(address provider)',\n 'function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)',\n 'function liquidationCall(bytes32 args1, bytes32 args2)',\n 'function mintToTreasury(address[] assets)',\n 'function mintUnbacked(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function repay(bytes32 args) returns (uint256)',\n 'function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)',\n 'function repayWithATokens(address asset, uint256 amount, uint256 interestRateMode) returns (uint256)',\n 'function repayWithATokens(bytes32 args) returns (uint256)',\n 'function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) returns (uint256)',\n 'function repayWithPermit(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS) returns (uint256)',\n 'function rescueTokens(address token, address to, uint256 amount)',\n 'function resetIsolationModeTotalDebt(address asset)',\n 'function setConfiguration(address asset, (uint256 data) configuration)',\n 'function setLiquidationGracePeriod(address asset, uint40 until)',\n 'function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)',\n 'function setUserEMode(uint8 categoryId)',\n 'function setUserUseReserveAsCollateral(bytes32 args)',\n 'function setUserUseReserveAsCollateral(address asset, bool useAsCollateral)',\n 'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',\n 'function supply(bytes32 args)',\n 'function supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)',\n 'function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s)',\n 'function syncIndexesState(address asset)',\n 'function syncRatesState(address asset)',\n 'function updateBridgeProtocolFee(uint256 protocolFee)',\n 'function updateFlashloanPremiums(uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol)',\n 'function withdraw(address asset, uint256 amount, address to) returns (uint256)',\n 'function withdraw(bytes32 args) returns (uint256)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Across.js b/dist/src/libs/humanizer/const/abis/Across.js index a3c45ed17..3b281dad7 100644 --- a/dist/src/libs/humanizer/const/abis/Across.js +++ b/dist/src/libs/humanizer/const/abis/Across.js @@ -1,4 +1,7 @@ -export const Across = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Across = void 0; +exports.Across = [ 'function EMPTY_RELAYER() view returns (address)', 'function EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)', 'function INFINITE_FILL_DEADLINE() view returns (uint32)', diff --git a/dist/src/libs/humanizer/const/abis/Across.js.map b/dist/src/libs/humanizer/const/abis/Across.js.map index 868e65aa1..f97714e78 100644 --- a/dist/src/libs/humanizer/const/abis/Across.js.map +++ b/dist/src/libs/humanizer/const/abis/Across.js.map @@ -1 +1 @@ -{"version":3,"file":"Across.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Across.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,iDAAiD;IACjD,4DAA4D;IAC5D,yDAAyD;IACzD,qDAAqD;IACrD,kEAAkE;IAClE,mDAAmD;IACnD,sDAAsD;IACtD,2CAA2C;IAC3C,oDAAoD;IACpD,2LAA2L;IAC3L,iGAAiG;IACjG,yDAAyD;IACzD,iSAAiS;IACjS,oHAAoH;IACpH,6CAA6C;IAC7C,oEAAoE;IACpE,uHAAuH;IACvH,4KAA4K;IAC5K,qDAAqD;IACrD,uDAAuD;IACvD,iIAAiI;IACjI,+KAA+K;IAC/K,2CAA2C;IAC3C,kDAAkD;IAClD,2CAA2C;IAC3C,6DAA6D;IAC7D,+CAA+C;IAC/C,mDAAmD;IACnD,8BAA8B;IAC9B,2BAA2B;IAC3B,+CAA+C;IAC/C,4CAA4C;IAC5C,uDAAuD;IACvD,wDAAwD;IACxD,iDAAiD;IACjD,0DAA0D;IAC1D,2CAA2C;IAC3C,+HAA+H;IAC/H,8DAA8D;IAC9D,uCAAuC;IACvC,+CAA+C;IAC/C,8BAA8B;IAC9B,8BAA8B;IAC9B,0CAA0C;IAC1C,uEAAuE;IACvE,8DAA8D;IAC9D,6BAA6B;IAC7B,kDAAkD;IAClD,6CAA6C;IAC7C,iBAAiB;IACjB,sDAAsD;IACtD,mBAAmB;IACnB,4MAA4M;CAC7M,CAAA","sourcesContent":["export const Across = [\n 'function EMPTY_RELAYER() view returns (address)',\n 'function EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)',\n 'function INFINITE_FILL_DEADLINE() view returns (uint32)',\n 'function MAX_TRANSFER_SIZE() view returns (uint256)',\n 'function UPDATE_V3_DEPOSIT_DETAILS_HASH() view returns (bytes32)',\n 'function __SpokePool_init(uint32,address,address)',\n 'function cctpTokenMessenger() view returns (address)',\n 'function chainId() view returns (uint256)',\n 'function crossDomainAdmin() view returns (address)',\n 'function deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount) payable',\n 'function depositFor(address,address,address,uint256,uint256,int64,uint32,bytes,uint256) payable',\n 'function depositQuoteTimeBuffer() view returns (uint32)',\n 'function depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message) payable',\n 'function depositV3Now(address,address,address,address,uint256,uint256,uint256,address,uint32,uint32,bytes) payable',\n 'function emergencyDeleteRootBundle(uint256)',\n 'function enabledDepositRoutes(address,uint256) view returns (bool)',\n 'function executeRelayerRefundLeaf(uint32,tuple(uint256,uint256,uint256[],uint32,address,address[]),bytes32[]) payable',\n 'function executeV3SlowRelayLeaf(tuple(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256),uint32,bytes32[])',\n 'function fillDeadlineBuffer() view returns (uint32)',\n 'function fillStatuses(bytes32) view returns (uint256)',\n 'function fillV3Relay(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256)',\n 'function fillV3RelayWithUpdatedDeposit(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256,address,bytes,bytes)',\n 'function fxChild() view returns (address)',\n 'function getCurrentTime() view returns (uint256)',\n 'function hubPool() view returns (address)',\n 'function initialize(uint32,address,address,address,address)',\n 'function multicall(bytes[]) returns (bytes[])',\n 'function numberOfDeposits() view returns (uint32)',\n 'function pauseDeposits(bool)',\n 'function pauseFills(bool)',\n 'function pausedDeposits() view returns (bool)',\n 'function pausedFills() view returns (bool)',\n 'function polygonTokenBridger() view returns (address)',\n 'function processMessageFromRoot(uint256,address,bytes)',\n 'function proxiableUUID() view returns (bytes32)',\n 'function recipientCircleDomainId() view returns (uint32)',\n 'function relayRootBundle(bytes32,bytes32)',\n 'function requestV3SlowFill(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes))',\n 'function rootBundles(uint256) view returns (bytes32,bytes32)',\n 'function setCrossDomainAdmin(address)',\n 'function setEnableRoute(address,uint256,bool)',\n 'function setFxChild(address)',\n 'function setHubPool(address)',\n 'function setPolygonTokenBridger(address)',\n 'function speedUpV3Deposit(address,uint32,uint256,address,bytes,bytes)',\n 'function tryMulticall(bytes[]) returns (tuple(bool,bytes)[])',\n 'function upgradeTo(address)',\n 'function upgradeToAndCall(address,bytes) payable',\n 'function usdcToken() view returns (address)',\n 'function wrap()',\n 'function wrappedNativeToken() view returns (address)',\n 'receive() payable',\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Across.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Across.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IACpB,iDAAiD;IACjD,4DAA4D;IAC5D,yDAAyD;IACzD,qDAAqD;IACrD,kEAAkE;IAClE,mDAAmD;IACnD,sDAAsD;IACtD,2CAA2C;IAC3C,oDAAoD;IACpD,2LAA2L;IAC3L,iGAAiG;IACjG,yDAAyD;IACzD,iSAAiS;IACjS,oHAAoH;IACpH,6CAA6C;IAC7C,oEAAoE;IACpE,uHAAuH;IACvH,4KAA4K;IAC5K,qDAAqD;IACrD,uDAAuD;IACvD,iIAAiI;IACjI,+KAA+K;IAC/K,2CAA2C;IAC3C,kDAAkD;IAClD,2CAA2C;IAC3C,6DAA6D;IAC7D,+CAA+C;IAC/C,mDAAmD;IACnD,8BAA8B;IAC9B,2BAA2B;IAC3B,+CAA+C;IAC/C,4CAA4C;IAC5C,uDAAuD;IACvD,wDAAwD;IACxD,iDAAiD;IACjD,0DAA0D;IAC1D,2CAA2C;IAC3C,+HAA+H;IAC/H,8DAA8D;IAC9D,uCAAuC;IACvC,+CAA+C;IAC/C,8BAA8B;IAC9B,8BAA8B;IAC9B,0CAA0C;IAC1C,uEAAuE;IACvE,8DAA8D;IAC9D,6BAA6B;IAC7B,kDAAkD;IAClD,6CAA6C;IAC7C,iBAAiB;IACjB,sDAAsD;IACtD,mBAAmB;IACnB,4MAA4M;CAC7M,CAAA","sourcesContent":["export const Across = [\n 'function EMPTY_RELAYER() view returns (address)',\n 'function EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)',\n 'function INFINITE_FILL_DEADLINE() view returns (uint32)',\n 'function MAX_TRANSFER_SIZE() view returns (uint256)',\n 'function UPDATE_V3_DEPOSIT_DETAILS_HASH() view returns (bytes32)',\n 'function __SpokePool_init(uint32,address,address)',\n 'function cctpTokenMessenger() view returns (address)',\n 'function chainId() view returns (uint256)',\n 'function crossDomainAdmin() view returns (address)',\n 'function deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount) payable',\n 'function depositFor(address,address,address,uint256,uint256,int64,uint32,bytes,uint256) payable',\n 'function depositQuoteTimeBuffer() view returns (uint32)',\n 'function depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message) payable',\n 'function depositV3Now(address,address,address,address,uint256,uint256,uint256,address,uint32,uint32,bytes) payable',\n 'function emergencyDeleteRootBundle(uint256)',\n 'function enabledDepositRoutes(address,uint256) view returns (bool)',\n 'function executeRelayerRefundLeaf(uint32,tuple(uint256,uint256,uint256[],uint32,address,address[]),bytes32[]) payable',\n 'function executeV3SlowRelayLeaf(tuple(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256),uint32,bytes32[])',\n 'function fillDeadlineBuffer() view returns (uint32)',\n 'function fillStatuses(bytes32) view returns (uint256)',\n 'function fillV3Relay(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256)',\n 'function fillV3RelayWithUpdatedDeposit(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes),uint256,uint256,address,bytes,bytes)',\n 'function fxChild() view returns (address)',\n 'function getCurrentTime() view returns (uint256)',\n 'function hubPool() view returns (address)',\n 'function initialize(uint32,address,address,address,address)',\n 'function multicall(bytes[]) returns (bytes[])',\n 'function numberOfDeposits() view returns (uint32)',\n 'function pauseDeposits(bool)',\n 'function pauseFills(bool)',\n 'function pausedDeposits() view returns (bool)',\n 'function pausedFills() view returns (bool)',\n 'function polygonTokenBridger() view returns (address)',\n 'function processMessageFromRoot(uint256,address,bytes)',\n 'function proxiableUUID() view returns (bytes32)',\n 'function recipientCircleDomainId() view returns (uint32)',\n 'function relayRootBundle(bytes32,bytes32)',\n 'function requestV3SlowFill(tuple(address,address,address,address,address,uint256,uint256,uint256,uint32,uint32,uint32,bytes))',\n 'function rootBundles(uint256) view returns (bytes32,bytes32)',\n 'function setCrossDomainAdmin(address)',\n 'function setEnableRoute(address,uint256,bool)',\n 'function setFxChild(address)',\n 'function setHubPool(address)',\n 'function setPolygonTokenBridger(address)',\n 'function speedUpV3Deposit(address,uint32,uint256,address,bytes,bytes)',\n 'function tryMulticall(bytes[]) returns (tuple(bool,bytes)[])',\n 'function upgradeTo(address)',\n 'function upgradeToAndCall(address,bytes) payable',\n 'function usdcToken() view returns (address)',\n 'function wrap()',\n 'function wrappedNativeToken() view returns (address)',\n 'receive() payable',\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.js b/dist/src/libs/humanizer/const/abis/AmbireAccount.js index 01b945701..4b814e415 100644 --- a/dist/src/libs/humanizer/const/abis/AmbireAccount.js +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.js @@ -1,4 +1,7 @@ -export const AmbireAccount = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AmbireAccount = void 0; +exports.AmbireAccount = [ // executable by address(this) 'function tryCatch(address to, uint256 value, bytes calldata data)', 'function tryCatchLimit(address to, uint256 value, bytes calldata data, uint256 gasLimit)', diff --git a/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map b/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map index fcfb33f19..c40c7ac8d 100644 --- a/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map +++ b/dist/src/libs/humanizer/const/abis/AmbireAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"AmbireAccount.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/AmbireAccount.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,8BAA8B;IAC9B,mEAAmE;IACnE,0FAA0F;IAC1F,4EAA4E;IAC5E,yEAAyE;IACzE,0BAA0B;IAC1B,4FAA4F;IAC5F,+GAA+G;IAC/G,uBAAuB;IACvB,mFAAmF;CACpF,CAAA","sourcesContent":["export const AmbireAccount = [\n // executable by address(this)\n 'function tryCatch(address to, uint256 value, bytes calldata data)',\n 'function tryCatchLimit(address to, uint256 value, bytes calldata data, uint256 gasLimit)',\n 'function executeBySelfSingle((address to, uint256 value, bytes data) call)',\n 'function executeBySelf((address to, uint256 value, bytes data)[] calls)',\n // executed with signature\n 'function execute((address to, uint256 value, bytes data)[] calls, bytes signature) payable',\n 'function executeMultiple(((address to, uint256 value, bytes data)[] calls, bytes signature)[] toExec) payable',\n // executable by signer\n 'function executeBySender((address to, uint256 value, bytes data)[] calls) payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"AmbireAccount.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/AmbireAccount.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;IAC3B,8BAA8B;IAC9B,mEAAmE;IACnE,0FAA0F;IAC1F,4EAA4E;IAC5E,yEAAyE;IACzE,0BAA0B;IAC1B,4FAA4F;IAC5F,+GAA+G;IAC/G,uBAAuB;IACvB,mFAAmF;CACpF,CAAA","sourcesContent":["export const AmbireAccount = [\n // executable by address(this)\n 'function tryCatch(address to, uint256 value, bytes calldata data)',\n 'function tryCatchLimit(address to, uint256 value, bytes calldata data, uint256 gasLimit)',\n 'function executeBySelfSingle((address to, uint256 value, bytes data) call)',\n 'function executeBySelf((address to, uint256 value, bytes data)[] calls)',\n // executed with signature\n 'function execute((address to, uint256 value, bytes data)[] calls, bytes signature) payable',\n 'function executeMultiple(((address to, uint256 value, bytes data)[] calls, bytes signature)[] toExec) payable',\n // executable by signer\n 'function executeBySender((address to, uint256 value, bytes data)[] calls) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Curve.js b/dist/src/libs/humanizer/const/abis/Curve.js index 4faca7e00..3584dd6e9 100644 --- a/dist/src/libs/humanizer/const/abis/Curve.js +++ b/dist/src/libs/humanizer/const/abis/Curve.js @@ -1,4 +1,7 @@ -export const CurveRouter = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CurveRouter = void 0; +exports.CurveRouter = [ 'event Exchange(address indexed,address indexed,address[11],uint256[5][5],address[5],uint256,uint256)', 'fallback()', 'constructor(address,address,address,address[2])', diff --git a/dist/src/libs/humanizer/const/abis/Curve.js.map b/dist/src/libs/humanizer/const/abis/Curve.js.map index b1de4df85..3a58355b3 100644 --- a/dist/src/libs/humanizer/const/abis/Curve.js.map +++ b/dist/src/libs/humanizer/const/abis/Curve.js.map @@ -1 +1 @@ -{"version":3,"file":"Curve.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Curve.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,sGAAsG;IACtG,YAAY;IACZ,iDAAiD;IACjD,8DAA8D;IAC9D,4IAA4I;IAC5I,0HAA0H;IAC1H,oDAAoD;IACpD,+DAA+D;IAC/D,+DAA+D;IAC/D,0EAA0E;IAC1E,qFAAqF;IACrF,gGAAgG;IAChG,2GAA2G;CAC5G,CAAA","sourcesContent":["export const CurveRouter = [\n 'event Exchange(address indexed,address indexed,address[11],uint256[5][5],address[5],uint256,uint256)',\n 'fallback()',\n 'constructor(address,address,address,address[2])',\n 'function exchange(address[11],uint256[5][5],uint256,uint256)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] pools, address _receiver)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)',\n 'function get_dy(address[11],uint256[5][5],uint256)',\n 'function get_dy(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5],address[5])'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Curve.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Curve.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG;IACzB,sGAAsG;IACtG,YAAY;IACZ,iDAAiD;IACjD,8DAA8D;IAC9D,4IAA4I;IAC5I,0HAA0H;IAC1H,oDAAoD;IACpD,+DAA+D;IAC/D,+DAA+D;IAC/D,0EAA0E;IAC1E,qFAAqF;IACrF,gGAAgG;IAChG,2GAA2G;CAC5G,CAAA","sourcesContent":["export const CurveRouter = [\n 'event Exchange(address indexed,address indexed,address[11],uint256[5][5],address[5],uint256,uint256)',\n 'fallback()',\n 'constructor(address,address,address,address[2])',\n 'function exchange(address[11],uint256[5][5],uint256,uint256)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] pools, address _receiver)',\n 'function exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)',\n 'function get_dy(address[11],uint256[5][5],uint256)',\n 'function get_dy(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5])',\n 'function get_dx(address[11],uint256[5][5],uint256,address[5],address[5],address[5],address[5],address[5])'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.js b/dist/src/libs/humanizer/const/abis/KyberSwap.js index c27e3dd8b..79ffe9147 100644 --- a/dist/src/libs/humanizer/const/abis/KyberSwap.js +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.js @@ -1,4 +1,7 @@ -export const KyberSwap = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KyberSwap = void 0; +exports.KyberSwap = [ 'function WETH() view returns (address)', 'function isWhitelist(address) view returns (bool)', 'function owner() view returns (address)', diff --git a/dist/src/libs/humanizer/const/abis/KyberSwap.js.map b/dist/src/libs/humanizer/const/abis/KyberSwap.js.map index 28c4c9c77..70809b7b8 100644 --- a/dist/src/libs/humanizer/const/abis/KyberSwap.js.map +++ b/dist/src/libs/humanizer/const/abis/KyberSwap.js.map @@ -1 +1 @@ -{"version":3,"file":"KyberSwap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/KyberSwap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,wCAAwC;IACxC,mDAAmD;IACnD,yCAAyC;IACzC,8BAA8B;IAC9B,uCAAuC;IACvC,0WAA0W;IAC1W,iMAAiM;IACjM,oUAAoU;IACpU,qCAAqC;IACrC,4CAA4C;IAC5C,mBAAmB;CACpB,CAAA","sourcesContent":["export const KyberSwap = [\n 'function WETH() view returns (address)',\n 'function isWhitelist(address) view returns (bool)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution) payable returns (uint256,uint256)',\n 'function swapGeneric(tuple(address,address,bytes,tuple(address,address,address[],uint256[],address[],uint256[],address,uint256,uint256,uint256,bytes),bytes)) payable returns (uint256,uint256)',\n 'function swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData) returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function updateWhitelist(address[],bool[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"KyberSwap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/KyberSwap.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,wCAAwC;IACxC,mDAAmD;IACnD,yCAAyC;IACzC,8BAA8B;IAC9B,uCAAuC;IACvC,0WAA0W;IAC1W,iMAAiM;IACjM,oUAAoU;IACpU,qCAAqC;IACrC,4CAA4C;IAC5C,mBAAmB;CACpB,CAAA","sourcesContent":["export const KyberSwap = [\n 'function WETH() view returns (address)',\n 'function isWhitelist(address) view returns (bool)',\n 'function owner() view returns (address)',\n 'function renounceOwnership()',\n 'function rescueFunds(address,uint256)',\n 'function swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution) payable returns (uint256,uint256)',\n 'function swapGeneric(tuple(address,address,bytes,tuple(address,address,address[],uint256[],address[],uint256[],address,uint256,uint256,uint256,bytes),bytes)) payable returns (uint256,uint256)',\n 'function swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData) returns (uint256,uint256)',\n 'function transferOwnership(address)',\n 'function updateWhitelist(address[],bool[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Legends.js b/dist/src/libs/humanizer/const/abis/Legends.js index 665dcd2d4..76f36be9e 100644 --- a/dist/src/libs/humanizer/const/abis/Legends.js +++ b/dist/src/libs/humanizer/const/abis/Legends.js @@ -1,4 +1,7 @@ -export const Legends = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Legends = void 0; +exports.Legends = [ 'function mint(uint256 )', 'function spinWheel(uint256 random)', 'function linkAndAcceptInvite(address INVITEE_V2_ACCOUNT, address INVITEE_EOA_OR_V1, address INVITER_V2, bytes signature)', diff --git a/dist/src/libs/humanizer/const/abis/Legends.js.map b/dist/src/libs/humanizer/const/abis/Legends.js.map index 985d77fca..aa9907ff8 100644 --- a/dist/src/libs/humanizer/const/abis/Legends.js.map +++ b/dist/src/libs/humanizer/const/abis/Legends.js.map @@ -1 +1 @@ -{"version":3,"file":"Legends.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Legends.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB;IACzB,oCAAoC;IACpC,0HAA0H;IAC1H,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAA","sourcesContent":["export const Legends = [\n 'function mint(uint256 )',\n 'function spinWheel(uint256 random)',\n 'function linkAndAcceptInvite(address INVITEE_V2_ACCOUNT, address INVITEE_EOA_OR_V1, address INVITER_V2, bytes signature)',\n 'function invite(address)',\n 'function getDailyReward()'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Legends.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Legends.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG;IACrB,yBAAyB;IACzB,oCAAoC;IACpC,0HAA0H;IAC1H,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAA","sourcesContent":["export const Legends = [\n 'function mint(uint256 )',\n 'function spinWheel(uint256 random)',\n 'function linkAndAcceptInvite(address INVITEE_V2_ACCOUNT, address INVITEE_EOA_OR_V1, address INVITER_V2, bytes signature)',\n 'function invite(address)',\n 'function getDailyReward()'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Lido.js b/dist/src/libs/humanizer/const/abis/Lido.js index d69b70bfb..59265d2f3 100644 --- a/dist/src/libs/humanizer/const/abis/Lido.js +++ b/dist/src/libs/humanizer/const/abis/Lido.js @@ -1,4 +1,7 @@ -export const WrappedStETH = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unstETH = exports.WrappedStETH = void 0; +exports.WrappedStETH = [ 'function DOMAIN_SEPARATOR() view returns (bytes32)', 'function allowance(address owner, address spender) view returns (uint256)', 'function approve(address spender, uint256 amount) returns (bool)', @@ -21,7 +24,7 @@ export const WrappedStETH = [ 'function unwrap(uint256 _wstETHAmount) returns (uint256)', 'function wrap(uint256 _stETHAmount) returns (uint256)' ]; -export const unstETH = [ +exports.unstETH = [ 'function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)', 'function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints)', 'function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient)', diff --git a/dist/src/libs/humanizer/const/abis/Lido.js.map b/dist/src/libs/humanizer/const/abis/Lido.js.map index ceb061adb..62d8585c2 100644 --- a/dist/src/libs/humanizer/const/abis/Lido.js.map +++ b/dist/src/libs/humanizer/const/abis/Lido.js.map @@ -1 +1 @@ -{"version":3,"file":"Lido.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Lido.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oDAAoD;IACpD,2EAA2E;IAC3E,kEAAkE;IAClE,4DAA4D;IAC5D,0CAA0C;IAC1C,qFAAqF;IACrF,yEAAyE;IACzE,wEAAwE;IACxE,gFAAgF;IAChF,uCAAuC;IACvC,uDAAuD;IACvD,iHAAiH;IACjH,yCAAyC;IACzC,iDAAiD;IACjD,yCAAyC;IACzC,kDAAkD;IAClD,+CAA+C;IAC/C,qEAAqE;IACrE,yFAAyF;IACzF,0DAA0D;IAC1D,uDAAuD;CACxD,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,gGAAgG;IAChG,sFAAsF;IACtF,4GAA4G;IAC5G,8CAA8C;CAC/C,CAAA","sourcesContent":["export const WrappedStETH = [\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function getStETHByWstETH(uint256 _wstETHAmount) view returns (uint256)',\n 'function getWstETHByStETH(uint256 _stETHAmount) view returns (uint256)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function stETH() view returns (address)',\n 'function stEthPerToken() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function tokensPerStEth() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address recipient, uint256 amount) returns (bool)',\n 'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)',\n 'function unwrap(uint256 _wstETHAmount) returns (uint256)',\n 'function wrap(uint256 _stETHAmount) returns (uint256)'\n]\n\nexport const unstETH = [\n 'function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)',\n 'function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints)',\n 'function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient)',\n 'function claimWithdrawal(uint256 _requestId)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Lido.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Lido.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IAC1B,oDAAoD;IACpD,2EAA2E;IAC3E,kEAAkE;IAClE,4DAA4D;IAC5D,0CAA0C;IAC1C,qFAAqF;IACrF,yEAAyE;IACzE,wEAAwE;IACxE,gFAAgF;IAChF,uCAAuC;IACvC,uDAAuD;IACvD,iHAAiH;IACjH,yCAAyC;IACzC,iDAAiD;IACjD,yCAAyC;IACzC,kDAAkD;IAClD,+CAA+C;IAC/C,qEAAqE;IACrE,yFAAyF;IACzF,0DAA0D;IAC1D,uDAAuD;CACxD,CAAA;AAEY,QAAA,OAAO,GAAG;IACrB,gGAAgG;IAChG,sFAAsF;IACtF,4GAA4G;IAC5G,8CAA8C;CAC/C,CAAA","sourcesContent":["export const WrappedStETH = [\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function getStETHByWstETH(uint256 _wstETHAmount) view returns (uint256)',\n 'function getWstETHByStETH(uint256 _stETHAmount) view returns (uint256)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function stETH() view returns (address)',\n 'function stEthPerToken() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function tokensPerStEth() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address recipient, uint256 amount) returns (bool)',\n 'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)',\n 'function unwrap(uint256 _wstETHAmount) returns (uint256)',\n 'function wrap(uint256 _stETHAmount) returns (uint256)'\n]\n\nexport const unstETH = [\n 'function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)',\n 'function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints)',\n 'function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient)',\n 'function claimWithdrawal(uint256 _requestId)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Sushi.js b/dist/src/libs/humanizer/const/abis/Sushi.js index 98bb83a5a..358d868fd 100644 --- a/dist/src/libs/humanizer/const/abis/Sushi.js +++ b/dist/src/libs/humanizer/const/abis/Sushi.js @@ -1,4 +1,7 @@ -export const RouteProcessor = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RouteProcessor = void 0; +exports.RouteProcessor = [ 'function bentoBox() view returns (address)', 'function owner() view returns (address)', 'function pause()', diff --git a/dist/src/libs/humanizer/const/abis/Sushi.js.map b/dist/src/libs/humanizer/const/abis/Sushi.js.map index 90a4644e0..2fb1cb389 100644 --- a/dist/src/libs/humanizer/const/abis/Sushi.js.map +++ b/dist/src/libs/humanizer/const/abis/Sushi.js.map @@ -1 +1 @@ -{"version":3,"file":"Sushi.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Sushi.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4CAA4C;IAC5C,yCAAyC;IACzC,kBAAkB;IAClB,+JAA+J;IAC/J,8BAA8B;IAC9B,mBAAmB;IACnB,uDAAuD;IACvD,8CAA8C;IAC9C,qOAAqO;IACrO,sFAAsF;CACvF,CAAA","sourcesContent":["export const RouteProcessor = [\n 'function bentoBox() view returns (address)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function renounceOwnership()',\n 'function resume()',\n 'function setPriviledge(address user, bool priviledge)',\n 'function transferOwnership(address newOwner)',\n 'function transferValueAndprocessRoute(address transferValueTo, uint256 amountValueTransfer, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Sushi.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Sushi.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG;IAC5B,4CAA4C;IAC5C,yCAAyC;IACzC,kBAAkB;IAClB,+JAA+J;IAC/J,8BAA8B;IAC9B,mBAAmB;IACnB,uDAAuD;IACvD,8CAA8C;IAC9C,qOAAqO;IACrO,sFAAsF;CACvF,CAAA","sourcesContent":["export const RouteProcessor = [\n 'function bentoBox() view returns (address)',\n 'function owner() view returns (address)',\n 'function pause()',\n 'function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function renounceOwnership()',\n 'function resume()',\n 'function setPriviledge(address user, bool priviledge)',\n 'function transferOwnership(address newOwner)',\n 'function transferValueAndprocessRoute(address transferValueTo, uint256 amountValueTransfer, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin, address to, bytes route) payable returns (uint256 amountOut)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Tokens.js b/dist/src/libs/humanizer/const/abis/Tokens.js index 614d0963f..100e200e7 100644 --- a/dist/src/libs/humanizer/const/abis/Tokens.js +++ b/dist/src/libs/humanizer/const/abis/Tokens.js @@ -1,4 +1,7 @@ -export const ERC20 = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WETH = exports.ERC721 = exports.ERC20 = void 0; +exports.ERC20 = [ 'function name() view returns (string)', 'function approve(address _spender, uint256 _value) returns (bool)', 'function totalSupply() view returns (uint256)', @@ -11,7 +14,7 @@ export const ERC20 = [ 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)', 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)' ]; -export const ERC721 = [ +exports.ERC721 = [ 'function BAYC_PROVENANCE() view returns (string)', 'function MAX_APES() view returns (uint256)', 'function REVEAL_TIMESTAMP() view returns (uint256)', @@ -50,7 +53,7 @@ export const ERC721 = [ 'function transferOwnership(address newOwner)', 'function withdraw()' ]; -export const WETH = [ +exports.WETH = [ 'function name() view returns (string)', 'function approve(address guy, uint256 wad) returns (bool)', 'function totalSupply() view returns (uint256)', diff --git a/dist/src/libs/humanizer/const/abis/Tokens.js.map b/dist/src/libs/humanizer/const/abis/Tokens.js.map index 6a44b5f58..74ef51765 100644 --- a/dist/src/libs/humanizer/const/abis/Tokens.js.map +++ b/dist/src/libs/humanizer/const/abis/Tokens.js.map @@ -1 +1 @@ -{"version":3,"file":"Tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,uCAAuC;IACvC,mEAAmE;IACnE,+CAA+C;IAC/C,kFAAkF;IAClF,0CAA0C;IAC1C,mEAAmE;IACnE,yCAAyC;IACzC,+DAA+D;IAC/D,6EAA6E;IAC7E,qFAAqF;IACrF,gFAAgF;CACjF,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,kDAAkD;IAClD,4CAA4C;IAC5C,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,0DAA0D;IAC1D,0CAA0C;IAC1C,2CAA2C;IAC3C,0BAA0B;IAC1B,8DAA8D;IAC9D,gFAAgF;IAChF,kDAAkD;IAClD,kDAAkD;IAClD,uCAAuC;IACvC,yCAAyC;IACzC,0DAA0D;IAC1D,8BAA8B;IAC9B,wBAAwB;IACxB,sEAAsE;IACtE,mFAAmF;IACnF,6CAA6C;IAC7C,6DAA6D;IAC7D,qCAAqC;IACrC,mDAAmD;IACnD,sDAAsD;IACtD,6BAA6B;IAC7B,iDAAiD;IACjD,sDAAsD;IACtD,oEAAoE;IACpE,yCAAyC;IACzC,6DAA6D;IAC7D,mFAAmF;IACnF,0DAA0D;IAC1D,+CAA+C;IAC/C,kEAAkE;IAClE,8CAA8C;IAC9C,qBAAqB;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,uCAAuC;IACvC,2DAA2D;IAC3D,+CAA+C;IAC/C,6EAA6E;IAC7E,gCAAgC;IAChC,0CAA0C;IAC1C,oDAAoD;IACpD,yCAAyC;IACzC,4DAA4D;IAC5D,4BAA4B;IAC5B,6DAA6D;CAC9D,CAAA","sourcesContent":["export const ERC20 = [\n 'function name() view returns (string)',\n 'function approve(address _spender, uint256 _value) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address _from, address _to, uint256 _value) returns (bool)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address _owner) view returns (uint256 balance)',\n 'function symbol() view returns (string)',\n 'function transfer(address _to, uint256 _value) returns (bool)',\n 'function allowance(address _owner, address _spender) view returns (uint256)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)'\n]\n\nexport const ERC721 = [\n 'function BAYC_PROVENANCE() view returns (string)',\n 'function MAX_APES() view returns (uint256)',\n 'function REVEAL_TIMESTAMP() view returns (uint256)',\n 'function apePrice() view returns (uint256)',\n 'function approve(address to, uint256 tokenId)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function baseURI() view returns (string)',\n 'function emergencySetStartingIndexBlock()',\n 'function flipSaleState()',\n 'function getApproved(uint256 tokenId) view returns (address)',\n 'function isApprovedForAll(address owner, address operator) view returns (bool)',\n 'function maxApePurchase() view returns (uint256)',\n 'function mintApe(uint256 numberOfTokens) payable',\n 'function name() view returns (string)',\n 'function owner() view returns (address)',\n 'function ownerOf(uint256 tokenId) view returns (address)',\n 'function renounceOwnership()',\n 'function reserveApes()',\n 'function safeTransferFrom(address from, address to, uint256 tokenId)',\n 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n 'function saleIsActive() view returns (bool)',\n 'function setApprovalForAll(address operator, bool approved)',\n 'function setBaseURI(string baseURI)',\n 'function setProvenanceHash(string provenanceHash)',\n 'function setRevealTimestamp(uint256 revealTimeStamp)',\n 'function setStartingIndex()',\n 'function startingIndex() view returns (uint256)',\n 'function startingIndexBlock() view returns (uint256)',\n 'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n 'function symbol() view returns (string)',\n 'function tokenByIndex(uint256 index) view returns (uint256)',\n 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',\n 'function tokenURI(uint256 tokenId) view returns (string)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address from, address to, uint256 tokenId)',\n 'function transferOwnership(address newOwner)',\n 'function withdraw()'\n]\n\nexport const WETH = [\n 'function name() view returns (string)',\n 'function approve(address guy, uint256 wad) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address src, address dst, uint256 wad) returns (bool)',\n 'function withdraw(uint256 wad)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address) view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function transfer(address dst, uint256 wad) returns (bool)',\n 'function deposit() payable',\n 'function allowance(address, address) view returns (uint256)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Tokens.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAAG;IACnB,uCAAuC;IACvC,mEAAmE;IACnE,+CAA+C;IAC/C,kFAAkF;IAClF,0CAA0C;IAC1C,mEAAmE;IACnE,yCAAyC;IACzC,+DAA+D;IAC/D,6EAA6E;IAC7E,qFAAqF;IACrF,gFAAgF;CACjF,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,kDAAkD;IAClD,4CAA4C;IAC5C,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,0DAA0D;IAC1D,0CAA0C;IAC1C,2CAA2C;IAC3C,0BAA0B;IAC1B,8DAA8D;IAC9D,gFAAgF;IAChF,kDAAkD;IAClD,kDAAkD;IAClD,uCAAuC;IACvC,yCAAyC;IACzC,0DAA0D;IAC1D,8BAA8B;IAC9B,wBAAwB;IACxB,sEAAsE;IACtE,mFAAmF;IACnF,6CAA6C;IAC7C,6DAA6D;IAC7D,qCAAqC;IACrC,mDAAmD;IACnD,sDAAsD;IACtD,6BAA6B;IAC7B,iDAAiD;IACjD,sDAAsD;IACtD,oEAAoE;IACpE,yCAAyC;IACzC,6DAA6D;IAC7D,mFAAmF;IACnF,0DAA0D;IAC1D,+CAA+C;IAC/C,kEAAkE;IAClE,8CAA8C;IAC9C,qBAAqB;CACtB,CAAA;AAEY,QAAA,IAAI,GAAG;IAClB,uCAAuC;IACvC,2DAA2D;IAC3D,+CAA+C;IAC/C,6EAA6E;IAC7E,gCAAgC;IAChC,0CAA0C;IAC1C,oDAAoD;IACpD,yCAAyC;IACzC,4DAA4D;IAC5D,4BAA4B;IAC5B,6DAA6D;CAC9D,CAAA","sourcesContent":["export const ERC20 = [\n 'function name() view returns (string)',\n 'function approve(address _spender, uint256 _value) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address _from, address _to, uint256 _value) returns (bool)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address _owner) view returns (uint256 balance)',\n 'function symbol() view returns (string)',\n 'function transfer(address _to, uint256 _value) returns (bool)',\n 'function allowance(address _owner, address _spender) view returns (uint256)',\n 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',\n 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)'\n]\n\nexport const ERC721 = [\n 'function BAYC_PROVENANCE() view returns (string)',\n 'function MAX_APES() view returns (uint256)',\n 'function REVEAL_TIMESTAMP() view returns (uint256)',\n 'function apePrice() view returns (uint256)',\n 'function approve(address to, uint256 tokenId)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function baseURI() view returns (string)',\n 'function emergencySetStartingIndexBlock()',\n 'function flipSaleState()',\n 'function getApproved(uint256 tokenId) view returns (address)',\n 'function isApprovedForAll(address owner, address operator) view returns (bool)',\n 'function maxApePurchase() view returns (uint256)',\n 'function mintApe(uint256 numberOfTokens) payable',\n 'function name() view returns (string)',\n 'function owner() view returns (address)',\n 'function ownerOf(uint256 tokenId) view returns (address)',\n 'function renounceOwnership()',\n 'function reserveApes()',\n 'function safeTransferFrom(address from, address to, uint256 tokenId)',\n 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n 'function saleIsActive() view returns (bool)',\n 'function setApprovalForAll(address operator, bool approved)',\n 'function setBaseURI(string baseURI)',\n 'function setProvenanceHash(string provenanceHash)',\n 'function setRevealTimestamp(uint256 revealTimeStamp)',\n 'function setStartingIndex()',\n 'function startingIndex() view returns (uint256)',\n 'function startingIndexBlock() view returns (uint256)',\n 'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n 'function symbol() view returns (string)',\n 'function tokenByIndex(uint256 index) view returns (uint256)',\n 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',\n 'function tokenURI(uint256 tokenId) view returns (string)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address from, address to, uint256 tokenId)',\n 'function transferOwnership(address newOwner)',\n 'function withdraw()'\n]\n\nexport const WETH = [\n 'function name() view returns (string)',\n 'function approve(address guy, uint256 wad) returns (bool)',\n 'function totalSupply() view returns (uint256)',\n 'function transferFrom(address src, address dst, uint256 wad) returns (bool)',\n 'function withdraw(uint256 wad)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address) view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function transfer(address dst, uint256 wad) returns (bool)',\n 'function deposit() payable',\n 'function allowance(address, address) view returns (uint256)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.js b/dist/src/libs/humanizer/const/abis/TraderJoe.js index 543eb3c82..37dec6fb4 100644 --- a/dist/src/libs/humanizer/const/abis/TraderJoe.js +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.js @@ -1,4 +1,7 @@ -export const JoeRouter = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JoeRouter = void 0; +exports.JoeRouter = [ 'function addLiquidity(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) returns (uint256,uint256,uint256,uint256,uint256[],uint256[])', 'function addLiquidityNATIVE(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) payable returns (uint256,uint256,uint256,uint256,uint256[],uint256[])', 'function createLBPair(address,address,uint24,uint16) returns (address)', diff --git a/dist/src/libs/humanizer/const/abis/TraderJoe.js.map b/dist/src/libs/humanizer/const/abis/TraderJoe.js.map index aaf4ca1d9..45a658628 100644 --- a/dist/src/libs/humanizer/const/abis/TraderJoe.js.map +++ b/dist/src/libs/humanizer/const/abis/TraderJoe.js.map @@ -1 +1 @@ -{"version":3,"file":"TraderJoe.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/TraderJoe.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,0NAA0N;IAC1N,wOAAwO;IACxO,wEAAwE;IACxE,8CAA8C;IAC9C,kDAAkD;IAClD,gEAAgE;IAChE,oDAAoD;IACpD,mDAAmD;IACnD,gEAAgE;IAChE,iFAAiF;IACjF,kFAAkF;IAClF,gDAAgD;IAChD,8CAA8C;IAC9C,gIAAgI;IAChI,8HAA8H;IAC9H,kJAAkJ;IAClJ,sJAAsJ;IACtJ,sKAAsK;IACtK,sJAAsJ;IACtJ,gKAAgK;IAChK,sJAAsJ;IACtJ,sJAAsJ;IACtJ,wKAAwK;IACxK,kKAAkK;IAClK,yCAAyC;IACzC,4DAA4D;IAC5D,mBAAmB;CACpB,CAAA","sourcesContent":["export const JoeRouter = [\n 'function addLiquidity(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function addLiquidityNATIVE(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) payable returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function createLBPair(address,address,uint24,uint16) returns (address)',\n 'function getFactory() view returns (address)',\n 'function getFactoryV2_1() view returns (address)',\n 'function getIdFromPrice(address,uint256) view returns (uint24)',\n 'function getLegacyFactory() view returns (address)',\n 'function getLegacyRouter() view returns (address)',\n 'function getPriceFromId(address,uint24) view returns (uint256)',\n 'function getSwapIn(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getSwapOut(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getV1Factory() view returns (address)',\n 'function getWNATIVE() view returns (address)',\n 'function removeLiquidity(address,address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function removeLiquidityNATIVE(address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256)',\n 'function swapExactNATIVEForTokensSupportingFeeOnTransferTokens(uint256,tuple(uint256[],uint8[],address[]),address,uint256) payable returns (uint256)',\n 'function swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForNATIVESupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256[])',\n 'function swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function sweep(address,address,uint256)',\n 'function sweepLBToken(address,address,uint256[],uint256[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"TraderJoe.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/TraderJoe.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,0NAA0N;IAC1N,wOAAwO;IACxO,wEAAwE;IACxE,8CAA8C;IAC9C,kDAAkD;IAClD,gEAAgE;IAChE,oDAAoD;IACpD,mDAAmD;IACnD,gEAAgE;IAChE,iFAAiF;IACjF,kFAAkF;IAClF,gDAAgD;IAChD,8CAA8C;IAC9C,gIAAgI;IAChI,8HAA8H;IAC9H,kJAAkJ;IAClJ,sJAAsJ;IACtJ,sKAAsK;IACtK,sJAAsJ;IACtJ,gKAAgK;IAChK,sJAAsJ;IACtJ,sJAAsJ;IACtJ,wKAAwK;IACxK,kKAAkK;IAClK,yCAAyC;IACzC,4DAA4D;IAC5D,mBAAmB;CACpB,CAAA","sourcesContent":["export const JoeRouter = [\n 'function addLiquidity(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function addLiquidityNATIVE(tuple(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int256[],uint256[],uint256[],address,address,uint256)) payable returns (uint256,uint256,uint256,uint256,uint256[],uint256[])',\n 'function createLBPair(address,address,uint24,uint16) returns (address)',\n 'function getFactory() view returns (address)',\n 'function getFactoryV2_1() view returns (address)',\n 'function getIdFromPrice(address,uint256) view returns (uint24)',\n 'function getLegacyFactory() view returns (address)',\n 'function getLegacyRouter() view returns (address)',\n 'function getPriceFromId(address,uint24) view returns (uint256)',\n 'function getSwapIn(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getSwapOut(address,uint128,bool) view returns (uint128,uint128,uint128)',\n 'function getV1Factory() view returns (address)',\n 'function getWNATIVE() view returns (address)',\n 'function removeLiquidity(address,address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function removeLiquidityNATIVE(address,uint16,uint256,uint256,uint256[],uint256[],address,uint256) returns (uint256,uint256)',\n 'function swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256)',\n 'function swapExactNATIVEForTokensSupportingFeeOnTransferTokens(uint256,tuple(uint256[],uint8[],address[]),address,uint256) payable returns (uint256)',\n 'function swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForNATIVESupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,tuple(uint256[],uint8[],address[]),address,uint256) returns (uint256)',\n 'function swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) payable returns (uint256[])',\n 'function swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline) returns (uint256[])',\n 'function sweep(address,address,uint256)',\n 'function sweepLBToken(address,address,uint256[],uint256[])',\n 'receive() payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.js b/dist/src/libs/humanizer/const/abis/Uniswap.js index ff2cda225..652a58773 100644 --- a/dist/src/libs/humanizer/const/abis/Uniswap.js +++ b/dist/src/libs/humanizer/const/abis/Uniswap.js @@ -1,4 +1,7 @@ -export const UniswapUniversalRouter = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UniV3Router2 = exports.UniV3Router = exports.UniV2Router = exports.UniswapUniversalRouter = void 0; +exports.UniswapUniversalRouter = [ 'function collectRewards(bytes looksRareClaim)', 'function execute(bytes commands, bytes[] inputs) payable', 'function execute(bytes commands, bytes[] inputs, uint256 deadline) payable', @@ -8,7 +11,7 @@ export const UniswapUniversalRouter = [ 'function supportsInterface(bytes4 interfaceId) pure returns (bool)', 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)' ]; -export const UniV2Router = [ +exports.UniV2Router = [ 'function WETH() view returns (address)', 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)', 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)', @@ -34,7 +37,7 @@ export const UniV2Router = [ 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)', 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)' ]; -export const UniV3Router = [ +exports.UniV3Router = [ 'function WETH9() view returns (address)', 'function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)', 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)', @@ -53,7 +56,7 @@ export const UniV3Router = [ 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable', 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable' ]; -export const UniV3Router2 = [ +exports.UniV3Router2 = [ 'function WETH9() view returns (address)', 'function approveMax(address token) payable', 'function approveMaxMinusOne(address token) payable', diff --git a/dist/src/libs/humanizer/const/abis/Uniswap.js.map b/dist/src/libs/humanizer/const/abis/Uniswap.js.map index 93b43e7c2..c91c52acf 100644 --- a/dist/src/libs/humanizer/const/abis/Uniswap.js.map +++ b/dist/src/libs/humanizer/const/abis/Uniswap.js.map @@ -1 +1 @@ -{"version":3,"file":"Uniswap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Uniswap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,+CAA+C;IAC/C,0DAA0D;IAC1D,4EAA4E;IAC5E,sGAAsG;IACtG,6FAA6F;IAC7F,mFAAmF;IACnF,oEAAoE;IACpE,sFAAsF;CACvF,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,wCAAwC;IACxC,2OAA2O;IAC3O,6NAA6N;IAC7N,2CAA2C;IAC3C,gHAAgH;IAChH,iHAAiH;IACjH,2FAA2F;IAC3F,2FAA2F;IAC3F,oGAAoG;IACpG,8LAA8L;IAC9L,4LAA4L;IAC5L,oMAAoM;IACpM,sPAAsP;IACtP,8PAA8P;IAC9P,wPAAwP;IACxP,qIAAqI;IACrI,wIAAwI;IACxI,yIAAyI;IACzI,kJAAkJ;IAClJ,mJAAmJ;IACnJ,qJAAqJ;IACrJ,sJAAsJ;IACtJ,kJAAkJ;IAClJ,qJAAqJ;CACtJ,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,yCAAyC;IACzC,+JAA+J;IAC/J,mOAAmO;IACnO,+JAA+J;IAC/J,mOAAmO;IACnO,2CAA2C;IAC3C,oEAAoE;IACpE,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,sFAAsF;IACtF,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,sHAAsH;CACvH,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,yCAAyC;IACzC,4CAA4C;IAC5C,oDAAoD;IACpD,oDAAoD;IACpD,4DAA4D;IAC5D,yEAAyE;IACzE,sHAAsH;IACtH,gGAAgG;IAChG,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,2CAA2C;IAC3C,6CAA6C;IAC7C,yEAAyE;IACzE,6JAA6J;IAC7J,gMAAgM;IAChM,0TAA0T;IAC1T,uFAAuF;IACvF,8EAA8E;IAC9E,oEAAoE;IACpE,mDAAmD;IACnD,qDAAqD;IACrD,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,2IAA2I;IAC3I,0IAA0I;IAC1I,sFAAsF;IACtF,mEAAmE;IACnE,iHAAiH;IACjH,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,qDAAqD;IACrD,sHAAsH;IACtH,mGAAmG;IACnG,yCAAyC;CAC1C,CAAA","sourcesContent":["export const UniswapUniversalRouter = [\n 'function collectRewards(bytes looksRareClaim)',\n 'function execute(bytes commands, bytes[] inputs) payable',\n 'function execute(bytes commands, bytes[] inputs, uint256 deadline) payable',\n 'function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) pure returns (bytes4)',\n 'function onERC1155Received(address, address, uint256, uint256, bytes) pure returns (bytes4)',\n 'function onERC721Received(address, address, uint256, bytes) pure returns (bytes4)',\n 'function supportsInterface(bytes4 interfaceId) pure returns (bool)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n\nexport const UniV2Router = [\n 'function WETH() view returns (address)',\n 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)',\n 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)',\n 'function factory() view returns (address)',\n 'function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)',\n 'function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)',\n 'function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)',\n 'function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)',\n 'function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)',\n 'function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)',\n 'function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)',\n 'function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)',\n 'function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)',\n 'function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',\n 'function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)'\n]\n\nexport const UniV3Router = [\n 'function WETH9() view returns (address)',\n 'function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable'\n]\n\nexport const UniV3Router2 = [\n 'function WETH9() view returns (address)',\n 'function approveMax(address token) payable',\n 'function approveMaxMinusOne(address token) payable',\n 'function approveZeroThenMax(address token) payable',\n 'function approveZeroThenMaxMinusOne(address token) payable',\n 'function callPositionManager(bytes data) payable returns (bytes result)',\n 'function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function factoryV2() view returns (address)',\n 'function getApprovalType(address token, uint256 amount) returns (uint8)',\n 'function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)',\n 'function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])',\n 'function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function positionManager() view returns (address)',\n 'function pull(address token, uint256 value) payable',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepToken(address token, uint256 amountMinimum) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9(uint256 amountMinimum) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function wrapETH(uint256 value) payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Uniswap.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Uniswap.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG;IACpC,+CAA+C;IAC/C,0DAA0D;IAC1D,4EAA4E;IAC5E,sGAAsG;IACtG,6FAA6F;IAC7F,mFAAmF;IACnF,oEAAoE;IACpE,sFAAsF;CACvF,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,wCAAwC;IACxC,2OAA2O;IAC3O,6NAA6N;IAC7N,2CAA2C;IAC3C,gHAAgH;IAChH,iHAAiH;IACjH,2FAA2F;IAC3F,2FAA2F;IAC3F,oGAAoG;IACpG,8LAA8L;IAC9L,4LAA4L;IAC5L,oMAAoM;IACpM,sPAAsP;IACtP,8PAA8P;IAC9P,wPAAwP;IACxP,qIAAqI;IACrI,wIAAwI;IACxI,yIAAyI;IACzI,kJAAkJ;IAClJ,mJAAmJ;IACnJ,qJAAqJ;IACrJ,sJAAsJ;IACtJ,kJAAkJ;IAClJ,qJAAqJ;CACtJ,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,yCAAyC;IACzC,+JAA+J;IAC/J,mOAAmO;IACnO,+JAA+J;IAC/J,mOAAmO;IACnO,2CAA2C;IAC3C,oEAAoE;IACpE,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,sFAAsF;IACtF,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,sHAAsH;CACvH,CAAA;AAEY,QAAA,YAAY,GAAG;IAC1B,yCAAyC;IACzC,4CAA4C;IAC5C,oDAAoD;IACpD,oDAAoD;IACpD,4DAA4D;IAC5D,yEAAyE;IACzE,sHAAsH;IACtH,gGAAgG;IAChG,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,6IAA6I;IAC7I,iNAAiN;IACjN,mOAAmO;IACnO,2CAA2C;IAC3C,6CAA6C;IAC7C,yEAAyE;IACzE,6JAA6J;IAC7J,gMAAgM;IAChM,0TAA0T;IAC1T,uFAAuF;IACvF,8EAA8E;IAC9E,oEAAoE;IACpE,mDAAmD;IACnD,qDAAqD;IACrD,8BAA8B;IAC9B,4GAA4G;IAC5G,iHAAiH;IACjH,4HAA4H;IAC5H,uHAAuH;IACvH,2IAA2I;IAC3I,0IAA0I;IAC1I,sFAAsF;IACtF,mEAAmE;IACnE,iHAAiH;IACjH,oIAAoI;IACpI,uFAAuF;IACvF,wEAAwE;IACxE,qDAAqD;IACrD,sHAAsH;IACtH,mGAAmG;IACnG,yCAAyC;CAC1C,CAAA","sourcesContent":["export const UniswapUniversalRouter = [\n 'function collectRewards(bytes looksRareClaim)',\n 'function execute(bytes commands, bytes[] inputs) payable',\n 'function execute(bytes commands, bytes[] inputs, uint256 deadline) payable',\n 'function onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) pure returns (bytes4)',\n 'function onERC1155Received(address, address, uint256, uint256, bytes) pure returns (bytes4)',\n 'function onERC721Received(address, address, uint256, bytes) pure returns (bytes4)',\n 'function supportsInterface(bytes4 interfaceId) pure returns (bool)',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)'\n]\n\nexport const UniV2Router = [\n 'function WETH() view returns (address)',\n 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)',\n 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)',\n 'function factory() view returns (address)',\n 'function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountIn)',\n 'function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) pure returns (uint256 amountOut)',\n 'function getAmountsIn(uint256 amountOut, address[] path) view returns (uint256[] amounts)',\n 'function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)',\n 'function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) pure returns (uint256 amountB)',\n 'function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB)',\n 'function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) returns (uint256 amountETH)',\n 'function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountToken, uint256 amountETH)',\n 'function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountETH)',\n 'function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) returns (uint256 amountA, uint256 amountB)',\n 'function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable returns (uint256[] amounts)',\n 'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',\n 'function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',\n 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) returns (uint256[] amounts)'\n]\n\nexport const UniV3Router = [\n 'function WETH9() view returns (address)',\n 'function exactInput((bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable'\n]\n\nexport const UniV3Router2 = [\n 'function WETH9() view returns (address)',\n 'function approveMax(address token) payable',\n 'function approveMaxMinusOne(address token) payable',\n 'function approveZeroThenMax(address token) payable',\n 'function approveZeroThenMaxMinusOne(address token) payable',\n 'function callPositionManager(bytes data) payable returns (bytes result)',\n 'function checkOracleSlippage(bytes[] paths, uint128[] amounts, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function checkOracleSlippage(bytes path, uint24 maximumTickDivergence, uint32 secondsAgo) view',\n 'function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',\n 'function exactOutput((bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountIn)',\n 'function factory() view returns (address)',\n 'function factoryV2() view returns (address)',\n 'function getApprovalType(address token, uint256 amount) returns (uint8)',\n 'function increaseLiquidity((address token0, address token1, uint256 tokenId, uint256 amount0Min, uint256 amount1Min) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Min, uint256 amount1Min, address recipient) params) payable returns (bytes result)',\n 'function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)',\n 'function multicall(bytes32 previousBlockhash, bytes[] data) payable returns (bytes[])',\n 'function multicall(uint256 deadline, bytes[] data) payable returns (bytes[])',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function positionManager() view returns (address)',\n 'function pull(address token, uint256 value) payable',\n 'function refundETH() payable',\n 'function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitAllowedIfNecessary(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) payable',\n 'function selfPermitIfNecessary(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) payable',\n 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable returns (uint256 amountOut)',\n 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable returns (uint256 amountIn)',\n 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',\n 'function sweepToken(address token, uint256 amountMinimum) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes _data)',\n 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',\n 'function unwrapWETH9(uint256 amountMinimum) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) payable',\n 'function unwrapWETH9WithFee(uint256 amountMinimum, uint256 feeBips, address feeRecipient) payable',\n 'function wrapETH(uint256 value) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/Wallet.js b/dist/src/libs/humanizer/const/abis/Wallet.js index 759aca543..881f1b431 100644 --- a/dist/src/libs/humanizer/const/abis/Wallet.js +++ b/dist/src/libs/humanizer/const/abis/Wallet.js @@ -1,4 +1,7 @@ -export const StakingPool = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StakingPool = void 0; +exports.StakingPool = [ 'function ADXToken() view returns (address)', 'function ADXUSDOracle() view returns (address)', 'function DOMAIN_SEPARATOR() view returns (bytes32)', diff --git a/dist/src/libs/humanizer/const/abis/Wallet.js.map b/dist/src/libs/humanizer/const/abis/Wallet.js.map index 2533f6007..1c01638db 100644 --- a/dist/src/libs/humanizer/const/abis/Wallet.js.map +++ b/dist/src/libs/humanizer/const/abis/Wallet.js.map @@ -1 +1 @@ -{"version":3,"file":"Wallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Wallet.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,4CAA4C;IAC5C,gDAAgD;IAChD,oDAAoD;IACpD,mDAAmD;IACnD,qFAAqF;IACrF,0EAA0E;IAC1E,kEAAkE;IAClE,8DAA8D;IAC9D,sDAAsD;IACtD,0CAA0C;IAC1C,gCAAgC;IAChC,qDAAqD;IACrD,8CAA8C;IAC9C,4CAA4C;IAC5C,+CAA+C;IAC/C,kDAAkD;IAClD,kDAAkD;IAClD,uDAAuD;IACvD,8DAA8D;IAC9D,uCAAuC;IACvC,iDAAiD;IACjD,sCAAsC;IACtC,kHAAkH;IAClH,mDAAmD;IACnD,yDAAyD;IACzD,0CAA0C;IAC1C,sCAAsC;IACtC,2CAA2C;IAC3C,gDAAgD;IAChD,wCAAwC;IACxC,oEAAoE;IACpE,8CAA8C;IAC9C,yCAAyC;IACzC,gDAAgD;IAChD,+CAA+C;IAC/C,sEAAsE;IACtE,wFAAwF;IACxF,4GAA4G;IAC5G,2CAA2C;IAC3C,6CAA6C;IAC7C,8DAA8D;IAC9D,qEAAqE;CACtE,CAAA","sourcesContent":["export const StakingPool = [\n 'function ADXToken() view returns (address)',\n 'function ADXUSDOracle() view returns (address)',\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function PERMIT_TYPEHASH() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256 remaining)',\n 'function approve(address spender, uint256 amount) returns (bool success)',\n 'function balanceOf(address owner) view returns (uint256 balance)',\n 'function claim(address tokenOut, address to, uint256 amount)',\n 'function commitments(bytes32) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function enter(uint256 amount)',\n 'function enterTo(address recipient, uint256 amount)',\n 'function governance() view returns (address)',\n 'function guardian() view returns (address)',\n 'function leave(uint256 shares, bool skipMint)',\n 'function limitLastReset() view returns (uint256)',\n 'function limitRemaining() view returns (uint256)',\n 'function lockedShares(address) view returns (uint256)',\n 'function maxDailyPenaltiesPromilles() view returns (uint256)',\n 'function name() view returns (string)',\n 'function nonces(address) view returns (uint256)',\n 'function penalize(uint256 adxAmount)',\n 'function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function rageLeave(uint256 shares, bool skipMint)',\n 'function rageReceivedPromilles() view returns (uint256)',\n 'function setDailyPenaltyMax(uint256 max)',\n 'function setGovernance(address addr)',\n 'function setGuardian(address newGuardian)',\n 'function setRageReceived(uint256 rageReceived)',\n 'function setTimeToUnbond(uint256 time)',\n 'function setWhitelistedClaimToken(address token, bool whitelisted)',\n 'function shareValue() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function timeToUnbond() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool success)',\n 'function transferFrom(address from, address to, uint256 amount) returns (bool success)',\n 'function unbondingCommitmentWorth(address owner, uint256 shares, uint256 unlocksAt) view returns (uint256)',\n 'function uniswap() view returns (address)',\n 'function validator() view returns (address)',\n 'function whitelistedClaimTokens(address) view returns (bool)',\n 'function withdraw(uint256 shares, uint256 unlocksAt, bool skipMint)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"Wallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/Wallet.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG;IACzB,4CAA4C;IAC5C,gDAAgD;IAChD,oDAAoD;IACpD,mDAAmD;IACnD,qFAAqF;IACrF,0EAA0E;IAC1E,kEAAkE;IAClE,8DAA8D;IAC9D,sDAAsD;IACtD,0CAA0C;IAC1C,gCAAgC;IAChC,qDAAqD;IACrD,8CAA8C;IAC9C,4CAA4C;IAC5C,+CAA+C;IAC/C,kDAAkD;IAClD,kDAAkD;IAClD,uDAAuD;IACvD,8DAA8D;IAC9D,uCAAuC;IACvC,iDAAiD;IACjD,sCAAsC;IACtC,kHAAkH;IAClH,mDAAmD;IACnD,yDAAyD;IACzD,0CAA0C;IAC1C,sCAAsC;IACtC,2CAA2C;IAC3C,gDAAgD;IAChD,wCAAwC;IACxC,oEAAoE;IACpE,8CAA8C;IAC9C,yCAAyC;IACzC,gDAAgD;IAChD,+CAA+C;IAC/C,sEAAsE;IACtE,wFAAwF;IACxF,4GAA4G;IAC5G,2CAA2C;IAC3C,6CAA6C;IAC7C,8DAA8D;IAC9D,qEAAqE;CACtE,CAAA","sourcesContent":["export const StakingPool = [\n 'function ADXToken() view returns (address)',\n 'function ADXUSDOracle() view returns (address)',\n 'function DOMAIN_SEPARATOR() view returns (bytes32)',\n 'function PERMIT_TYPEHASH() view returns (bytes32)',\n 'function allowance(address owner, address spender) view returns (uint256 remaining)',\n 'function approve(address spender, uint256 amount) returns (bool success)',\n 'function balanceOf(address owner) view returns (uint256 balance)',\n 'function claim(address tokenOut, address to, uint256 amount)',\n 'function commitments(bytes32) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function enter(uint256 amount)',\n 'function enterTo(address recipient, uint256 amount)',\n 'function governance() view returns (address)',\n 'function guardian() view returns (address)',\n 'function leave(uint256 shares, bool skipMint)',\n 'function limitLastReset() view returns (uint256)',\n 'function limitRemaining() view returns (uint256)',\n 'function lockedShares(address) view returns (uint256)',\n 'function maxDailyPenaltiesPromilles() view returns (uint256)',\n 'function name() view returns (string)',\n 'function nonces(address) view returns (uint256)',\n 'function penalize(uint256 adxAmount)',\n 'function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'function rageLeave(uint256 shares, bool skipMint)',\n 'function rageReceivedPromilles() view returns (uint256)',\n 'function setDailyPenaltyMax(uint256 max)',\n 'function setGovernance(address addr)',\n 'function setGuardian(address newGuardian)',\n 'function setRageReceived(uint256 rageReceived)',\n 'function setTimeToUnbond(uint256 time)',\n 'function setWhitelistedClaimToken(address token, bool whitelisted)',\n 'function shareValue() view returns (uint256)',\n 'function symbol() view returns (string)',\n 'function timeToUnbond() view returns (uint256)',\n 'function totalSupply() view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool success)',\n 'function transferFrom(address from, address to, uint256 amount) returns (bool success)',\n 'function unbondingCommitmentWorth(address owner, uint256 shares, uint256 unlocksAt) view returns (uint256)',\n 'function uniswap() view returns (address)',\n 'function validator() view returns (address)',\n 'function whitelistedClaimTokens(address) view returns (bool)',\n 'function withdraw(uint256 shares, uint256 unlocksAt, bool skipMint)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.js b/dist/src/libs/humanizer/const/abis/index.js index 6e17a7c43..5a5f2954a 100644 --- a/dist/src/libs/humanizer/const/abis/index.js +++ b/dist/src/libs/humanizer/const/abis/index.js @@ -1,13 +1,33 @@ -import { OneInch } from './1Inch'; -import { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'; -import { Across } from './Across'; -import { KyberSwap } from './KyberSwap'; -import { Legends } from './Legends'; -import { SocketViaAcross } from './socket'; -import { RouteProcessor } from './Sushi'; -import { ERC20, ERC721, WETH } from './Tokens'; -import { JoeRouter } from './TraderJoe'; -import { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'; -import { StakingPool } from './Wallet'; -export { AaveLendingPoolV2, AaveWethGatewayV2, AaveV3Pool, UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2, StakingPool, ERC20, ERC721, WETH, RouteProcessor, JoeRouter, Across, OneInch, KyberSwap, SocketViaAcross, Legends }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Legends = exports.SocketViaAcross = exports.KyberSwap = exports.OneInch = exports.Across = exports.JoeRouter = exports.RouteProcessor = exports.WETH = exports.ERC721 = exports.ERC20 = exports.StakingPool = exports.UniV3Router2 = exports.UniV3Router = exports.UniV2Router = exports.UniswapUniversalRouter = exports.AaveV3Pool = exports.AaveWethGatewayV2 = exports.AaveLendingPoolV2 = void 0; +const _1Inch_1 = require("./1Inch"); +Object.defineProperty(exports, "OneInch", { enumerable: true, get: function () { return _1Inch_1.OneInch; } }); +const Aave_1 = require("./Aave"); +Object.defineProperty(exports, "AaveLendingPoolV2", { enumerable: true, get: function () { return Aave_1.AaveLendingPoolV2; } }); +Object.defineProperty(exports, "AaveV3Pool", { enumerable: true, get: function () { return Aave_1.AaveV3Pool; } }); +Object.defineProperty(exports, "AaveWethGatewayV2", { enumerable: true, get: function () { return Aave_1.AaveWethGatewayV2; } }); +const Across_1 = require("./Across"); +Object.defineProperty(exports, "Across", { enumerable: true, get: function () { return Across_1.Across; } }); +const KyberSwap_1 = require("./KyberSwap"); +Object.defineProperty(exports, "KyberSwap", { enumerable: true, get: function () { return KyberSwap_1.KyberSwap; } }); +const Legends_1 = require("./Legends"); +Object.defineProperty(exports, "Legends", { enumerable: true, get: function () { return Legends_1.Legends; } }); +const socket_1 = require("./socket"); +Object.defineProperty(exports, "SocketViaAcross", { enumerable: true, get: function () { return socket_1.SocketViaAcross; } }); +const Sushi_1 = require("./Sushi"); +Object.defineProperty(exports, "RouteProcessor", { enumerable: true, get: function () { return Sushi_1.RouteProcessor; } }); +const Tokens_1 = require("./Tokens"); +Object.defineProperty(exports, "ERC20", { enumerable: true, get: function () { return Tokens_1.ERC20; } }); +Object.defineProperty(exports, "ERC721", { enumerable: true, get: function () { return Tokens_1.ERC721; } }); +Object.defineProperty(exports, "WETH", { enumerable: true, get: function () { return Tokens_1.WETH; } }); +const TraderJoe_1 = require("./TraderJoe"); +Object.defineProperty(exports, "JoeRouter", { enumerable: true, get: function () { return TraderJoe_1.JoeRouter; } }); +const Uniswap_1 = require("./Uniswap"); +Object.defineProperty(exports, "UniswapUniversalRouter", { enumerable: true, get: function () { return Uniswap_1.UniswapUniversalRouter; } }); +Object.defineProperty(exports, "UniV2Router", { enumerable: true, get: function () { return Uniswap_1.UniV2Router; } }); +Object.defineProperty(exports, "UniV3Router", { enumerable: true, get: function () { return Uniswap_1.UniV3Router; } }); +Object.defineProperty(exports, "UniV3Router2", { enumerable: true, get: function () { return Uniswap_1.UniV3Router2; } }); +const Wallet_1 = require("./Wallet"); +Object.defineProperty(exports, "StakingPool", { enumerable: true, get: function () { return Wallet_1.StakingPool; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/index.js.map b/dist/src/libs/humanizer/const/abis/index.js.map index b3fffd2b8..97c464add 100644 --- a/dist/src/libs/humanizer/const/abis/index.js.map +++ b/dist/src/libs/humanizer/const/abis/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,MAAM,EACN,IAAI,EACJ,cAAc,EACd,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,eAAe,EACf,OAAO,EACR,CAAA","sourcesContent":["import { OneInch } from './1Inch'\nimport { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'\nimport { Across } from './Across'\nimport { KyberSwap } from './KyberSwap'\nimport { Legends } from './Legends'\nimport { SocketViaAcross } from './socket'\nimport { RouteProcessor } from './Sushi'\nimport { ERC20, ERC721, WETH } from './Tokens'\nimport { JoeRouter } from './TraderJoe'\nimport { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'\nimport { StakingPool } from './Wallet'\n\nexport {\n AaveLendingPoolV2,\n AaveWethGatewayV2,\n AaveV3Pool,\n UniswapUniversalRouter,\n UniV2Router,\n UniV3Router,\n UniV3Router2,\n StakingPool,\n ERC20,\n ERC721,\n WETH,\n RouteProcessor,\n JoeRouter,\n Across,\n OneInch,\n KyberSwap,\n SocketViaAcross,\n Legends\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/index.ts"],"names":[],"mappings":";;;AAAA,oCAAiC;AA2B/B,wFA3BO,gBAAO,OA2BP;AA1BT,iCAAyE;AAYvE,kGAZO,wBAAiB,OAYP;AAEjB,2FAd0B,iBAAU,OAc1B;AADV,kGAbsC,wBAAiB,OAatC;AAZnB,qCAAiC;AAwB/B,uFAxBO,eAAM,OAwBP;AAvBR,2CAAuC;AAyBrC,0FAzBO,qBAAS,OAyBP;AAxBX,uCAAmC;AA0BjC,wFA1BO,iBAAO,OA0BP;AAzBT,qCAA0C;AAwBxC,gGAxBO,wBAAe,OAwBP;AAvBjB,mCAAwC;AAkBtC,+FAlBO,sBAAc,OAkBP;AAjBhB,qCAA8C;AAc5C,sFAdO,cAAK,OAcP;AACL,uFAfc,eAAM,OAed;AACN,qFAhBsB,aAAI,OAgBtB;AAfN,2CAAuC;AAiBrC,0FAjBO,qBAAS,OAiBP;AAhBX,uCAA0F;AAOxF,uGAPO,gCAAsB,OAOP;AACtB,4FAR+B,qBAAW,OAQ/B;AACX,4FAT4C,qBAAW,OAS5C;AACX,6FAVyD,sBAAY,OAUzD;AATd,qCAAsC;AAUpC,4FAVO,oBAAW,OAUP","sourcesContent":["import { OneInch } from './1Inch'\nimport { AaveLendingPoolV2, AaveV3Pool, AaveWethGatewayV2 } from './Aave'\nimport { Across } from './Across'\nimport { KyberSwap } from './KyberSwap'\nimport { Legends } from './Legends'\nimport { SocketViaAcross } from './socket'\nimport { RouteProcessor } from './Sushi'\nimport { ERC20, ERC721, WETH } from './Tokens'\nimport { JoeRouter } from './TraderJoe'\nimport { UniswapUniversalRouter, UniV2Router, UniV3Router, UniV3Router2 } from './Uniswap'\nimport { StakingPool } from './Wallet'\n\nexport {\n AaveLendingPoolV2,\n AaveWethGatewayV2,\n AaveV3Pool,\n UniswapUniversalRouter,\n UniV2Router,\n UniV3Router,\n UniV3Router2,\n StakingPool,\n ERC20,\n ERC721,\n WETH,\n RouteProcessor,\n JoeRouter,\n Across,\n OneInch,\n KyberSwap,\n SocketViaAcross,\n Legends\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/socket.js b/dist/src/libs/humanizer/const/abis/socket.js index 329b6441f..564527a14 100644 --- a/dist/src/libs/humanizer/const/abis/socket.js +++ b/dist/src/libs/humanizer/const/abis/socket.js @@ -1,4 +1,7 @@ -export const SocketViaAcross = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SocketViaAcross = void 0; +exports.SocketViaAcross = [ // 'constructor(address _spokePool, address _wethAddress, address _socketGateway, address _socketDeployFactory)', 'error OnlySocketGatewayOwner()', 'event NativeBridgeFee(uint256 fee)', diff --git a/dist/src/libs/humanizer/const/abis/socket.js.map b/dist/src/libs/humanizer/const/abis/socket.js.map index 0ff07f2a7..8004c0886 100644 --- a/dist/src/libs/humanizer/const/abis/socket.js.map +++ b/dist/src/libs/humanizer/const/abis/socket.js.map @@ -1 +1 @@ -{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/socket.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iHAAiH;IACjH,gCAAgC;IAChC,oCAAoC;IACpC,8IAA8I;IAC9I,iFAAiF;IACjF,kFAAkF;IAClF,8DAA8D;IAC9D,oDAAoD;IACpD,6DAA6D;IAC7D,wDAAwD;IACxD,wCAAwC;IACxC,oEAAoE;IACpE,mPAAmP;IACnP,2DAA2D;IAC3D,0EAA0E;IAC1E,uDAAuD;IACvD,iDAAiD;IACjD,+CAA+C;IAC/C,6CAA6C;IAC7C,oDAAoD;IACpD,0PAA0P;IAC1P,8DAA8D;IAC9D,gLAAgL;IAChL,4OAA4O;IAC5O,6JAA6J;IAC7J,mKAAmK;IACnK,kNAAkN;IAClN,2IAA2I;IAC3I,gVAAgV;IAChV,0DAA0D;IAC1D,wPAAwP;IACxP,2UAA2U;IAC3U,qRAAqR;IACrR,qXAAqX;CACtX,CAAA","sourcesContent":["export const SocketViaAcross = [\n // 'constructor(address _spokePool, address _wethAddress, address _socketGateway, address _socketDeployFactory)',\n 'error OnlySocketGatewayOwner()',\n 'event NativeBridgeFee(uint256 fee)',\n 'event SocketBridge(uint256 amount, address token, uint256 toChainId, bytes32 bridgeName, address sender, address receiver, bytes32 metadata)',\n 'function ACROSS_ERC20_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_NATIVE_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_SWAP_BRIDGE_SELECTOR() view returns (bytes4)',\n 'function AcrossIdentifier() view returns (bytes32)',\n 'function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)',\n 'function NATIVE_TOKEN_ADDRESS() view returns (address)',\n 'function WETH() view returns (address)',\n 'function bridgeAfterSwap(uint256 amount, bytes bridgeData) payable',\n 'function bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function rescueEther(address userAddress, uint256 amount)',\n 'function rescueFunds(address token, address userAddress, uint256 amount)',\n 'function socketDeployFactory() view returns (address)',\n 'function socketGateway() view returns (address)',\n 'function socketRoute() view returns (address)',\n 'function spokePool() view returns (address)',\n 'function spokePoolAddress() view returns (address)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function swapAndBridge(uint32,address,uint256,bytes32,bytes)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable',\n 'function bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data) payable',\n 'function bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash) payable',\n 'function bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable',\n 'function bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)',\n 'function bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery) payable',\n 'function bridgeNativeTo(uint256,address,uint256,bytes32)',\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable',\n 'function bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable',\n 'function bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)',\n 'function bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n]\n"]} \ No newline at end of file +{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/socket.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG;IAC7B,iHAAiH;IACjH,gCAAgC;IAChC,oCAAoC;IACpC,8IAA8I;IAC9I,iFAAiF;IACjF,kFAAkF;IAClF,8DAA8D;IAC9D,oDAAoD;IACpD,6DAA6D;IAC7D,wDAAwD;IACxD,wCAAwC;IACxC,oEAAoE;IACpE,mPAAmP;IACnP,2DAA2D;IAC3D,0EAA0E;IAC1E,uDAAuD;IACvD,iDAAiD;IACjD,+CAA+C;IAC/C,6CAA6C;IAC7C,oDAAoD;IACpD,0PAA0P;IAC1P,8DAA8D;IAC9D,gLAAgL;IAChL,4OAA4O;IAC5O,6JAA6J;IAC7J,mKAAmK;IACnK,kNAAkN;IAClN,2IAA2I;IAC3I,gVAAgV;IAChV,0DAA0D;IAC1D,wPAAwP;IACxP,2UAA2U;IAC3U,qRAAqR;IACrR,qXAAqX;CACtX,CAAA","sourcesContent":["export const SocketViaAcross = [\n // 'constructor(address _spokePool, address _wethAddress, address _socketGateway, address _socketDeployFactory)',\n 'error OnlySocketGatewayOwner()',\n 'event NativeBridgeFee(uint256 fee)',\n 'event SocketBridge(uint256 amount, address token, uint256 toChainId, bytes32 bridgeName, address sender, address receiver, bytes32 metadata)',\n 'function ACROSS_ERC20_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_NATIVE_EXTERNAL_BRIDGE_FUNCTION_SELECTOR() view returns (bytes4)',\n 'function ACROSS_SWAP_BRIDGE_SELECTOR() view returns (bytes4)',\n 'function AcrossIdentifier() view returns (bytes32)',\n 'function BRIDGE_AFTER_SWAP_SELECTOR() view returns (bytes4)',\n 'function NATIVE_TOKEN_ADDRESS() view returns (address)',\n 'function WETH() view returns (address)',\n 'function bridgeAfterSwap(uint256 amount, bytes bridgeData) payable',\n 'function bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function rescueEther(address userAddress, uint256 amount)',\n 'function rescueFunds(address token, address userAddress, uint256 amount)',\n 'function socketDeployFactory() view returns (address)',\n 'function socketGateway() view returns (address)',\n 'function socketRoute() view returns (address)',\n 'function spokePool() view returns (address)',\n 'function spokePoolAddress() view returns (address)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function swapAndBridge(uint32,address,uint256,bytes32,bytes)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable',\n 'function bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData) payable',\n 'function bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data) payable',\n 'function bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash) payable',\n 'function bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable',\n 'function bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)',\n 'function bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery) payable',\n 'function bridgeNativeTo(uint256,address,uint256,bytes32)',\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable',\n 'function bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData) payable',\n 'function bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)',\n 'function bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.js b/dist/src/libs/humanizer/const/abis/stkWallet.js index 1c69ce781..58172f24b 100644 --- a/dist/src/libs/humanizer/const/abis/stkWallet.js +++ b/dist/src/libs/humanizer/const/abis/stkWallet.js @@ -1,4 +1,7 @@ -export const StkWallet = [ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StkWallet = void 0; +exports.StkWallet = [ 'function wrapAll()', 'function wrap(uint256 shareAmount)', 'function unwrap(uint256 shareAmount)', diff --git a/dist/src/libs/humanizer/const/abis/stkWallet.js.map b/dist/src/libs/humanizer/const/abis/stkWallet.js.map index f991fea13..949175dc8 100644 --- a/dist/src/libs/humanizer/const/abis/stkWallet.js.map +++ b/dist/src/libs/humanizer/const/abis/stkWallet.js.map @@ -1 +1 @@ -{"version":3,"file":"stkWallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/stkWallet.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,oBAAoB;IACpB,oCAAoC;IACpC,sCAAsC;IACtC,uCAAuC;CACxC,CAAA","sourcesContent":["export const StkWallet = [\n 'function wrapAll()',\n 'function wrap(uint256 shareAmount)',\n 'function unwrap(uint256 shareAmount)',\n 'function stakeAndWrap(uint256 amount)'\n]\n"]} \ No newline at end of file +{"version":3,"file":"stkWallet.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/const/abis/stkWallet.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,oBAAoB;IACpB,oCAAoC;IACpC,sCAAsC;IACtC,uCAAuC;CACxC,CAAA","sourcesContent":["export const StkWallet = [\n 'function wrapAll()',\n 'function wrap(uint256 shareAmount)',\n 'function unwrap(uint256 shareAmount)',\n 'function stakeAndWrap(uint256 amount)'\n]\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/const/coinType.js b/dist/src/libs/humanizer/const/coinType.js index 6108a0527..aa65be8f6 100644 --- a/dist/src/libs/humanizer/const/coinType.js +++ b/dist/src/libs/humanizer/const/coinType.js @@ -1,4 +1,7 @@ -export const registeredCoinTypes = { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.registeredCoinTypes = void 0; +exports.registeredCoinTypes = { 0: ['0x80000000', 'BTC', 'Bitcoin'], 1: ['0x80000001', undefined, 'Testnet'], 2: ['0x80000002', 'LTC', 'Litecoin'], diff --git a/dist/src/libs/humanizer/const/coinType.js.map b/dist/src/libs/humanizer/const/coinType.js.map index bf8d655d4..39d4271b1 100644 --- a/dist/src/libs/humanizer/const/coinType.js.map +++ b/dist/src/libs/humanizer/const/coinType.js.map @@ -1 +1 @@ -{"version":3,"file":"coinType.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/const/coinType.ts"],"names":[],"mappings":"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","sourcesContent":["export const registeredCoinTypes: { [n: number]: any[] } = {\n 0: ['0x80000000', 'BTC', 'Bitcoin'],\n 1: ['0x80000001', undefined, 'Testnet'],\n 2: ['0x80000002', 'LTC', 'Litecoin'],\n 3: ['0x80000003', 'DOGE', 'Dogecoin'],\n 4: ['0x80000004', 'RDD', 'Reddcoin'],\n 5: ['0x80000005', 'DASH', 'Dash'],\n 6: ['0x80000006', 'PPC', 'Peercoin'],\n 7: ['0x80000007', 'NMC', 'Namecoin'],\n 8: ['0x80000008', 'FTC', 'Feathercoin'],\n 9: ['0x80000009', 'XCP', 'Counterparty'],\n 10: ['0x8000000a', 'BLK', 'Blackcoin'],\n 11: ['0x8000000b', 'NSR', 'NuShares'],\n 12: ['0x8000000c', 'NBT', 'NuBits'],\n 13: ['0x8000000d', 'MZC', 'Mazacoin'],\n 14: ['0x8000000e', 'VIA', 'Viacoin'],\n 15: ['0x8000000f', 'XCH', 'ClearingHouse'],\n 16: ['0x80000010', 'RBY', 'Rubycoin'],\n 17: ['0x80000011', 'GRS', 'Groestlcoin'],\n 18: ['0x80000012', 'DGC', 'Digitalcoin'],\n 19: ['0x80000013', 'CCN', 'Cannacoin'],\n 20: ['0x80000014', 'DGB', 'DigiByte'],\n 21: ['0x80000015', 'Open Assets'],\n 22: ['0x80000016', 'MONA', 'Monacoin'],\n 23: ['0x80000017', 'CLAM', 'Clams'],\n 24: ['0x80000018', 'XPM', 'Primecoin'],\n 25: ['0x80000019', 'NEOS', 'Neoscoin'],\n 26: ['0x8000001a', 'JBS', 'Jumbucks'],\n 27: ['0x8000001b', 'ZRC', 'ziftrCOIN'],\n 28: ['0x8000001c', 'VTC', 'Vertcoin'],\n 29: ['0x8000001d', 'NXT', 'NXT'],\n 30: ['0x8000001e', 'BURST', 'Burst'],\n 31: ['0x8000001f', 'MUE', 'MonetaryUnit'],\n 32: ['0x80000020', 'ZOOM', 'Zoom'],\n 33: ['0x80000021', 'VASH', 'Virtual Cash'],\n 34: ['0x80000022', 'CDN', 'Canada eCoin'],\n 35: ['0x80000023', 'SDC', 'ShadowCash'],\n 36: ['0x80000024', 'PKB', 'ParkByte'],\n 37: ['0x80000025', 'PND', 'Pandacoin'],\n 38: ['0x80000026', 'START', 'StartCOIN'],\n 39: ['0x80000027', 'MOIN', 'MOIN'],\n 40: ['0x80000028', 'EXP', 'Expanse'],\n 41: ['0x80000029', 'EMC2', 'Einsteinium'],\n 42: ['0x8000002a', 'DCR', 'Decred'],\n 43: ['0x8000002b', 'XEM', 'NEM'],\n 44: ['0x8000002c', 'PART', 'Particl'],\n 45: ['0x8000002d', 'ARG', 'Argentum (dead)'],\n 46: ['0x8000002e', 'Libertas'],\n 47: ['0x8000002f', 'Posw coin'],\n 48: ['0x80000030', 'SHR', 'Shreeji'],\n 49: ['0x80000031', 'GCR', 'Global Currency Reserve'],\n 50: ['0x80000032', 'NVC', 'Novacoin'],\n 51: ['0x80000033', 'AC', 'Asiacoin'],\n 52: ['0x80000034', 'BTCD', 'BitcoinDark'],\n 53: ['0x80000035', 'DOPE', 'Dopecoin'],\n 54: ['0x80000036', 'TPC', 'Templecoin'],\n 55: ['0x80000037', 'AIB', 'AIB'],\n 56: ['0x80000038', 'EDRC', 'EDRCoin'],\n 57: ['0x80000039', 'SYS', 'Syscoin'],\n 58: ['0x8000003a', 'SLR', 'Solarcoin'],\n 59: ['0x8000003b', 'SMLY', 'Smileycoin'],\n 60: ['0x8000003c', 'ETH', 'Ether'],\n 61: ['0x8000003d', 'ETC', 'Ether Classic'],\n 62: ['0x8000003e', 'PSB', 'Pesobit'],\n 63: ['0x8000003f', 'LDCN', 'Landcoin (dead)'],\n 64: ['0x80000040', 'Open Chain'],\n 65: ['0x80000041', 'XBC', 'Bitcoinplus'],\n 66: ['0x80000042', 'IOP', 'Internet of People'],\n 67: ['0x80000043', 'NXS', 'Nexus'],\n 68: ['0x80000044', 'INSN', 'InsaneCoin'],\n 69: ['0x80000045', 'OK', 'OKCash'],\n 70: ['0x80000046', 'BRIT', 'BritCoin'],\n 71: ['0x80000047', 'CMP', 'Compcoin'],\n 72: ['0x80000048', 'CRW', 'Crown'],\n 73: ['0x80000049', 'BELA', 'BelaCoin'],\n 74: ['0x8000004a', 'ICX', 'ICON'],\n 75: ['0x8000004b', 'FJC', 'FujiCoin'],\n 76: ['0x8000004c', 'MIX', 'MIX'],\n 77: ['0x8000004d', 'XVG', 'Verge Currency'],\n 78: ['0x8000004e', 'EFL', 'Electronic Gulden'],\n 79: ['0x8000004f', 'CLUB', 'ClubCoin'],\n 80: ['0x80000050', 'RICHX', 'RichCoin'],\n 81: ['0x80000051', 'POT', 'Potcoin'],\n 82: ['0x80000052', 'QRK', 'Quarkcoin'],\n 83: ['0x80000053', 'TRC', 'Terracoin'],\n 84: ['0x80000054', 'GRC', 'Gridcoin'],\n 85: ['0x80000055', 'AUR', 'Auroracoin'],\n 86: ['0x80000056', 'IXC', 'IXCoin'],\n 87: ['0x80000057', 'NLG', 'Gulden'],\n 88: ['0x80000058', 'BITB', 'BitBean'],\n 89: ['0x80000059', 'BTA', 'Bata'],\n 90: ['0x8000005a', 'XMY', 'Myriadcoin'],\n 91: ['0x8000005b', 'BSD', 'BitSend'],\n 92: ['0x8000005c', 'UNO', 'Unobtanium'],\n 93: ['0x8000005d', 'MTR', 'MasterTrader'],\n 94: ['0x8000005e', 'GB', 'GoldBlocks'],\n 95: ['0x8000005f', 'SHM', 'Saham'],\n 96: ['0x80000060', 'CRX', 'Chronos'],\n 97: ['0x80000061', 'BIQ', 'Ubiquoin'],\n 98: ['0x80000062', 'EVO', 'Evotion'],\n 99: ['0x80000063', 'STO', 'SaveTheOcean'],\n 100: ['0x80000064', 'BIGUP', 'BigUp'],\n 101: ['0x80000065', 'GAME', 'GameCredits'],\n 102: ['0x80000066', 'DLC', 'Dollarcoins'],\n 103: ['0x80000067', 'ZYD', 'Zayedcoin'],\n 104: ['0x80000068', 'DBIC', 'Dubaicoin'],\n 105: ['0x80000069', 'STRAT', 'Stratis'],\n 106: ['0x8000006a', 'SH', 'Shilling'],\n 107: ['0x8000006b', 'MARS', 'MarsCoin'],\n 108: ['0x8000006c', 'UBQ', 'Ubiq'],\n 109: ['0x8000006d', 'PTC', 'Pesetacoin'],\n 110: ['0x8000006e', 'NRO', 'Neurocoin'],\n 111: ['0x8000006f', 'ARK', 'ARK'],\n 112: ['0x80000070', 'USC', 'UltimateSecureCashMain'],\n 113: ['0x80000071', 'THC', 'Hempcoin'],\n 114: ['0x80000072', 'LINX', 'Linx'],\n 115: ['0x80000073', 'ECN', 'Ecoin'],\n 116: ['0x80000074', 'DNR', 'Denarius'],\n 117: ['0x80000075', 'PINK', 'Pinkcoin'],\n 118: ['0x80000076', 'ATOM', 'Atom'],\n 119: ['0x80000077', 'PIVX', 'Pivx'],\n 120: ['0x80000078', 'FLASH', 'Flashcoin'],\n 121: ['0x80000079', 'ZEN', 'Zencash'],\n 122: ['0x8000007a', 'PUT', 'Putincoin'],\n 123: ['0x8000007b', 'ZNY', 'BitZeny'],\n 124: ['0x8000007c', 'UNIFY', 'Unify'],\n 125: ['0x8000007d', 'XST', 'StealthCoin'],\n 126: ['0x8000007e', 'BRK', 'Breakout Coin'],\n 127: ['0x8000007f', 'VC', 'Vcash'],\n 128: ['0x80000080', 'XMR', 'Monero'],\n 129: ['0x80000081', 'VOX', 'Voxels'],\n 130: ['0x80000082', 'NAV', 'NavCoin'],\n 131: ['0x80000083', 'FCT', 'Factom Factoids'],\n 132: ['0x80000084', 'EC', 'Factom Entry Credits'],\n 133: ['0x80000085', 'ZEC', 'Zcash'],\n 134: ['0x80000086', 'LSK', 'Lisk'],\n 135: ['0x80000087', 'STEEM', 'Steem'],\n 136: ['0x80000088', 'XZC', 'ZCoin'],\n 137: ['0x80000089', 'RBTC', 'Rootstock'],\n '138': ['0x8000008a', 'Giftblock'],\n 139: ['0x8000008b', 'RPT', 'RealPointCoin'],\n 140: ['0x8000008c', 'LBC', 'LBRY Credits'],\n 141: ['0x8000008d', 'KMD', 'Komodo'],\n 142: ['0x8000008e', 'BSQ', 'bisq Token'],\n 143: ['0x8000008f', 'RIC', 'Riecoin'],\n 144: ['0x80000090', 'XRP', 'XRP'],\n 145: ['0x80000091', 'BCH', 'Bitcoin Cash'],\n 146: ['0x80000092', 'NEBL', 'Neblio'],\n 147: ['0x80000093', 'ZCL', 'ZClassic'],\n 148: ['0x80000094', 'XLM', 'Stellar Lumens'],\n 149: ['0x80000095', 'NLC2', 'NoLimitCoin2'],\n 150: ['0x80000096', 'WHL', 'WhaleCoin'],\n 151: ['0x80000097', 'ERC', 'EuropeCoin'],\n 152: ['0x80000098', 'DMD', 'Diamond'],\n 153: ['0x80000099', 'BTM', 'Bytom'],\n 154: ['0x8000009a', 'BIO', 'Biocoin'],\n 155: ['0x8000009b', 'XWCC', 'Whitecoin Classic'],\n 156: ['0x8000009c', 'BTG', 'Bitcoin Gold'],\n 157: ['0x8000009d', 'BTC2X', 'Bitcoin 2x'],\n 158: ['0x8000009e', 'SSN', 'SuperSkynet'],\n 159: ['0x8000009f', 'TOA', 'TOACoin'],\n 160: ['0x800000a0', 'BTX', 'Bitcore'],\n 161: ['0x800000a1', 'ACC', 'Adcoin'],\n 162: ['0x800000a2', 'BCO', 'Bridgecoin'],\n 163: ['0x800000a3', 'ELLA', 'Ellaism'],\n 164: ['0x800000a4', 'PIRL', 'Pirl'],\n 165: ['0x800000a5', 'XNO', 'Nano'],\n 166: ['0x800000a6', 'VIVO', 'Vivo'],\n 167: ['0x800000a7', 'FRST', 'Firstcoin'],\n 168: ['0x800000a8', 'HNC', 'Helleniccoin'],\n 169: ['0x800000a9', 'BUZZ', 'BUZZ'],\n 170: ['0x800000aa', 'MBRS', 'Ember'],\n 171: ['0x800000ab', 'HC', 'Hcash'],\n 172: ['0x800000ac', 'HTML', 'HTMLCOIN'],\n 173: ['0x800000ad', 'ODN', 'Obsidian'],\n 174: ['0x800000ae', 'ONX', 'OnixCoin'],\n 175: ['0x800000af', 'RVN', 'Ravencoin'],\n 176: ['0x800000b0', 'GBX', 'GoByte'],\n 177: ['0x800000b1', 'BTCZ', 'BitcoinZ'],\n 178: ['0x800000b2', 'POA', 'Poa'],\n 179: ['0x800000b3', 'NYC', 'NewYorkCoin'],\n 180: ['0x800000b4', 'MXT', 'MarteXcoin'],\n 181: ['0x800000b5', 'WC', 'Wincoin'],\n 182: ['0x800000b6', 'MNX', 'Minexcoin'],\n 183: ['0x800000b7', 'BTCP', 'Bitcoin Private'],\n 184: ['0x800000b8', 'MUSIC', 'Musicoin'],\n 185: ['0x800000b9', 'BCA', 'Bitcoin Atom'],\n 186: ['0x800000ba', 'CRAVE', 'Crave'],\n 187: ['0x800000bb', 'STAK', 'STRAKS'],\n 188: ['0x800000bc', 'WBTC', 'World Bitcoin'],\n 189: ['0x800000bd', 'LCH', 'LiteCash'],\n 190: ['0x800000be', 'EXCL', 'ExclusiveCoin'],\n '191': ['0x800000bf', 'Lynx'],\n 192: ['0x800000c0', 'LCC', 'LitecoinCash'],\n 193: ['0x800000c1', 'XFE', 'Feirm'],\n 194: ['0x800000c2', 'EOS', 'EOS'],\n 195: ['0x800000c3', 'TRX', 'Tron'],\n 196: ['0x800000c4', 'KOBO', 'Kobocoin'],\n 197: ['0x800000c5', 'HUSH', 'HUSH'],\n 198: ['0x800000c6', 'BAN', 'Banano'],\n 199: ['0x800000c7', 'ETF', 'ETF'],\n 200: ['0x800000c8', 'OMNI', 'Omni'],\n 201: ['0x800000c9', 'BIFI', 'BitcoinFile'],\n 202: ['0x800000ca', 'UFO', 'Uniform Fiscal Object'],\n 203: ['0x800000cb', 'CNMC', 'Cryptonodes'],\n 204: ['0x800000cc', 'BCN', 'Bytecoin'],\n 205: ['0x800000cd', 'RIN', 'Ringo'],\n 206: ['0x800000ce', 'ATP', 'Alaya'],\n 207: ['0x800000cf', 'EVT', 'everiToken'],\n 208: ['0x800000d0', 'ATN', 'ATN'],\n 209: ['0x800000d1', 'BIS', 'Bismuth'],\n 210: ['0x800000d2', 'NEET', 'NEETCOIN'],\n 211: ['0x800000d3', 'BOPO', 'BopoChain'],\n 212: ['0x800000d4', 'OOT', 'Utrum'],\n 213: ['0x800000d5', 'ALIAS', 'Alias'],\n 214: ['0x800000d6', 'MONK', 'Monkey Project'],\n 215: ['0x800000d7', 'BOXY', 'BoxyCoin'],\n 216: ['0x800000d8', 'FLO', 'Flo'],\n 217: ['0x800000d9', 'MEC', 'Megacoin'],\n 218: ['0x800000da', 'BTDX', 'BitCloud'],\n 219: ['0x800000db', 'XAX', 'Artax'],\n 220: ['0x800000dc', 'ANON', 'ANON'],\n 221: ['0x800000dd', 'LTZ', 'LitecoinZ'],\n 222: ['0x800000de', 'BITG', 'Bitcoin Green'],\n 223: ['0x800000df', 'ICP', 'Internet Computer (DFINITY)'],\n 224: ['0x800000e0', 'SMART', 'Smartcash'],\n 225: ['0x800000e1', 'XUEZ', 'XUEZ'],\n 226: ['0x800000e2', 'HLM', 'Helium'],\n 227: ['0x800000e3', 'WEB', 'Webchain'],\n 228: ['0x800000e4', 'ACM', 'Actinium'],\n 229: ['0x800000e5', 'NOS', 'NOS Stable Coins'],\n 230: ['0x800000e6', 'BITC', 'BitCash'],\n 231: ['0x800000e7', 'HTH', 'Help The Homeless Coin'],\n 232: ['0x800000e8', 'TZC', 'Trezarcoin'],\n 233: ['0x800000e9', 'VAR', 'Varda'],\n 234: ['0x800000ea', 'IOV', 'IOV'],\n 235: ['0x800000eb', 'FIO', 'FIO'],\n 236: ['0x800000ec', 'BSV', 'BitcoinSV'],\n 237: ['0x800000ed', 'DXN', 'DEXON'],\n 238: ['0x800000ee', 'QRL', 'Quantum Resistant Ledger'],\n 239: ['0x800000ef', 'PCX', 'ChainX'],\n 240: ['0x800000f0', 'LOKI', 'Loki'],\n '241': ['0x800000f1', 'Imagewallet'],\n 242: ['0x800000f2', 'NIM', 'Nimiq'],\n 243: ['0x800000f3', 'SOV', 'Sovereign Coin'],\n 244: ['0x800000f4', 'JCT', 'Jibital Coin'],\n 245: ['0x800000f5', 'SLP', 'Simple Ledger Protocol'],\n 246: ['0x800000f6', 'EWT', 'Energy Web'],\n 247: ['0x800000f7', 'UC', 'Ulord'],\n 248: ['0x800000f8', 'EXOS', 'EXOS'],\n 249: ['0x800000f9', 'ECA', 'Electra'],\n 250: ['0x800000fa', 'SOOM', 'Soom'],\n 251: ['0x800000fb', 'XRD', 'Redstone'],\n 252: ['0x800000fc', 'FREE', 'FreeCoin'],\n 253: ['0x800000fd', 'NPW', 'NewPowerCoin'],\n 254: ['0x800000fe', 'BST', 'BlockStamp'],\n '255': ['0x800000ff', 'SmartHoldem'],\n 256: ['0x80000100', 'NANO', 'Bitcoin Nano'],\n 257: ['0x80000101', 'BTCC', 'Bitcoin Core'],\n 258: ['0x80000102', 'Zen Protocol'],\n 259: ['0x80000103', 'ZEST', 'Zest'],\n 260: ['0x80000104', 'ABT', 'ArcBlock'],\n 261: ['0x80000105', 'PION', 'Pion'],\n 262: ['0x80000106', 'DT3', 'DreamTeam3'],\n 263: ['0x80000107', 'ZBUX', 'Zbux'],\n 264: ['0x80000108', 'KPL', 'Kepler'],\n 265: ['0x80000109', 'TPAY', 'TokenPay'],\n 266: ['0x8000010a', 'ZILLA', 'ChainZilla'],\n 267: ['0x8000010b', 'ANK', 'Anker'],\n 268: ['0x8000010c', 'BCC', 'BCChain'],\n 269: ['0x8000010d', 'HPB', 'HPB'],\n 270: ['0x8000010e', 'ONE', 'ONE'],\n 271: ['0x8000010f', 'SBC', 'SBC'],\n 272: ['0x80000110', 'IPC', 'IPChain'],\n 273: ['0x80000111', 'DMTC', 'Dominantchain'],\n 274: ['0x80000112', 'OGC', 'Onegram'],\n 275: ['0x80000113', 'SHIT', 'Shitcoin'],\n 276: ['0x80000114', 'ANDES', 'Andescoin'],\n 277: ['0x80000115', 'AREPA', 'Arepacoin'],\n 278: ['0x80000116', 'BOLI', 'Bolivarcoin'],\n 279: ['0x80000117', 'RIL', 'Rilcoin'],\n 280: ['0x80000118', 'HTR', 'Hathor Network'],\n 281: ['0x80000119', 'ACME', 'Accumulate'],\n 282: ['0x8000011a', 'BRAVO', 'BRAVO'],\n 283: ['0x8000011b', 'ALGO', 'Algorand'],\n 284: ['0x8000011c', 'BZX', 'Bitcoinzero'],\n 285: ['0x8000011d', 'GXX', 'GravityCoin'],\n 286: ['0x8000011e', 'HEAT', 'HEAT'],\n 287: ['0x8000011f', 'XDN', 'DigitalNote'],\n 288: ['0x80000120', 'FSN', 'FUSION'],\n 289: ['0x80000121', 'CPC', 'Capricoin'],\n 290: ['0x80000122', 'BOLD', 'Bold'],\n 291: ['0x80000123', 'IOST', 'IOST'],\n 292: ['0x80000124', 'TKEY', 'Tkeycoin'],\n 293: ['0x80000125', 'USE', 'Usechain'],\n 294: ['0x80000126', 'BCZ', 'BitcoinCZ'],\n 295: ['0x80000127', 'IOC', 'Iocoin'],\n 296: ['0x80000128', 'ASF', 'Asofe'],\n 297: ['0x80000129', 'MASS', 'MASS'],\n 298: ['0x8000012a', 'FAIR', 'FairCoin'],\n 299: ['0x8000012b', 'NUKO', 'Nekonium'],\n 300: ['0x8000012c', 'GNX', 'Genaro Network'],\n 301: ['0x8000012d', 'DIVI', 'Divi Project'],\n 302: ['0x8000012e', 'CMT', 'Community'],\n 303: ['0x8000012f', 'EUNO', 'EUNO'],\n 304: ['0x80000130', 'IOTX', 'IoTeX'],\n 305: ['0x80000131', 'ONION', 'DeepOnion'],\n 306: ['0x80000132', '8BIT', '8Bit'],\n 307: ['0x80000133', 'ATC', 'AToken Coin'],\n 308: ['0x80000134', 'BTS', 'Bitshares'],\n 309: ['0x80000135', 'CKB', 'Nervos CKB'],\n 310: ['0x80000136', 'UGAS', 'Ultrain'],\n 311: ['0x80000137', 'ADS', 'Adshares'],\n 312: ['0x80000138', 'ARA', 'Aura'],\n 313: ['0x80000139', 'ZIL', 'Zilliqa'],\n 314: ['0x8000013a', 'MOAC', 'MOAC'],\n 315: ['0x8000013b', 'SWTC', 'SWTC'],\n 316: ['0x8000013c', 'VNSC', 'vnscoin'],\n 317: ['0x8000013d', 'PLUG', 'Pl ^ g'],\n 318: ['0x8000013e', 'MAN', 'Matrix AI Network'],\n 319: ['0x8000013f', 'ECC', 'ECCoin'],\n 320: ['0x80000140', 'RPD', 'Rapids'],\n 321: ['0x80000141', 'RAP', 'Rapture'],\n 322: ['0x80000142', 'GARD', 'Hashgard'],\n 323: ['0x80000143', 'ZER', 'Zero'],\n 324: ['0x80000144', 'EBST', 'eBoost'],\n 325: ['0x80000145', 'SHARD', 'Shard'],\n 326: ['0x80000146', 'MRX', 'Metrix Coin'],\n 327: ['0x80000147', 'CMM', 'Commercium'],\n 328: ['0x80000148', 'BLOCK', 'Blocknet'],\n 329: ['0x80000149', 'AUDAX', 'AUDAX'],\n 330: ['0x8000014a', 'LUNA', 'Terra'],\n 331: ['0x8000014b', 'ZPM', 'zPrime'],\n 332: ['0x8000014c', 'KUVA', 'Kuva Utility Note'],\n 333: ['0x8000014d', 'MEM', 'MemCoin'],\n 334: ['0x8000014e', 'CS', 'Credits'],\n 335: ['0x8000014f', 'SWIFT', 'SwiftCash'],\n 336: ['0x80000150', 'FIX', 'FIX'],\n 337: ['0x80000151', 'CPC', 'CPChain'],\n 338: ['0x80000152', 'VGO', 'VirtualGoodsToken'],\n 339: ['0x80000153', 'DVT', 'DeVault'],\n 340: ['0x80000154', 'N8V', 'N8VCoin'],\n 341: ['0x80000155', 'MTNS', 'OmotenashiCoin'],\n 342: ['0x80000156', 'BLAST', 'BLAST'],\n 343: ['0x80000157', 'DCT', 'DECENT'],\n 344: ['0x80000158', 'AUX', 'Auxilium'],\n 345: ['0x80000159', 'USDP', 'USDP'],\n 346: ['0x8000015a', 'HTDF', 'HTDF'],\n 347: ['0x8000015b', 'YEC', 'Ycash'],\n 348: ['0x8000015c', 'QLC', 'QLC Chain'],\n 349: ['0x8000015d', 'TEA', 'Icetea Blockchain'],\n 350: ['0x8000015e', 'ARW', 'ArrowChain'],\n 351: ['0x8000015f', 'MDM', 'Medium'],\n 352: ['0x80000160', 'CYB', 'Cybex'],\n 353: ['0x80000161', 'LTO', 'LTO Network'],\n 354: ['0x80000162', 'DOT', 'Polkadot'],\n 355: ['0x80000163', 'AEON', 'Aeon'],\n 356: ['0x80000164', 'RES', 'Resistance'],\n 357: ['0x80000165', 'AYA', 'Aryacoin'],\n 358: ['0x80000166', 'DAPS', 'Dapscoin'],\n 359: ['0x80000167', 'CSC', 'CasinoCoin'],\n 360: ['0x80000168', 'VSYS', 'V Systems'],\n 361: ['0x80000169', 'NOLLAR', 'Nollar'],\n 362: ['0x8000016a', 'XNOS', 'NOS'],\n 363: ['0x8000016b', 'CPU', 'CPUchain'],\n 364: ['0x8000016c', 'LAMB', 'Lambda Storage Chain'],\n 365: ['0x8000016d', 'VCT', 'ValueCyber'],\n 366: ['0x8000016e', 'CZR', 'Canonchain'],\n 367: ['0x8000016f', 'ABBC', 'ABBC'],\n 368: ['0x80000170', 'HET', 'HET'],\n 369: ['0x80000171', 'XAS', 'Asch'],\n 370: ['0x80000172', 'VDL', 'Vidulum'],\n 371: ['0x80000173', 'MED', 'MediBloc'],\n 372: ['0x80000174', 'ZVC', 'ZVChain'],\n 373: ['0x80000175', 'VESTX', 'Vestx'],\n 374: ['0x80000176', 'DBT', 'DarkBit'],\n 375: ['0x80000177', 'SEOS', 'SuperEOS'],\n 376: ['0x80000178', 'MXW', 'Maxonrow'],\n 377: ['0x80000179', 'ZNZ', 'ZENZO'],\n 378: ['0x8000017a', 'XCX', 'XChain'],\n 379: ['0x8000017b', 'SOX', 'SonicX'],\n 380: ['0x8000017c', 'NYZO', 'Nyzo'],\n 381: ['0x8000017d', 'ULC', 'ULCoin'],\n 382: ['0x8000017e', 'RYO', 'Ryo Currency'],\n 383: ['0x8000017f', 'KAL', 'Kaleidochain'],\n 384: ['0x80000180', 'XSN', 'Stakenet'],\n 385: ['0x80000181', 'DOGEC', 'DogeCash'],\n 386: ['0x80000182', 'BMV', \"Bitcoin Matteo\\\\'s Vision\"],\n 387: ['0x80000183', 'QBC', 'Quebecoin'],\n 388: ['0x80000184', 'IMG', 'ImageCoin'],\n 389: ['0x80000185', 'QOS', 'QOS'],\n 390: ['0x80000186', 'PKT', 'PKT'],\n 391: ['0x80000187', 'LHD', 'LitecoinHD'],\n 392: ['0x80000188', 'CENNZ', 'CENNZnet'],\n 393: ['0x80000189', 'HSN', 'Hyper Speed Network'],\n 394: ['0x8000018a', 'CRO', 'Crypto Chain'],\n 395: ['0x8000018b', 'UMBRU', 'Umbru'],\n 396: ['0x8000018c', 'EVER', 'Everscale'],\n 397: ['0x8000018d', 'NEAR', 'NEAR Protocol'],\n 398: ['0x8000018e', 'XPC', 'XPChain'],\n 399: ['0x8000018f', 'ZOC', '01coin'],\n 400: ['0x80000190', 'NIX', 'NIX'],\n 401: ['0x80000191', 'UC', 'Utopiacoin'],\n 402: ['0x80000192', 'GALI', 'Galilel'],\n 403: ['0x80000193', 'OLT', 'Oneledger'],\n 404: ['0x80000194', 'XBI', 'XBI'],\n 405: ['0x80000195', 'DONU', 'DONU'],\n 406: ['0x80000196', 'EARTHS', 'Earths'],\n 407: ['0x80000197', 'HDD', 'HDDCash'],\n 408: ['0x80000198', 'SUGAR', 'Sugarchain'],\n 409: ['0x80000199', 'AILE', 'AileCoin'],\n 410: ['0x8000019a', 'TENT', 'TENT'],\n 411: ['0x8000019b', 'TAN', 'Tangerine Network'],\n 412: ['0x8000019c', 'AIN', 'AIN'],\n 413: ['0x8000019d', 'MSR', 'Masari'],\n 414: ['0x8000019e', 'SUMO', 'Sumokoin'],\n 415: ['0x8000019f', 'ETN', 'Electroneum'],\n 416: ['0x800001a0', 'BYTZ', 'BYTZ'],\n 417: ['0x800001a1', 'WOW', 'Wownero'],\n 418: ['0x800001a2', 'XTNC', 'XtendCash'],\n 419: ['0x800001a3', 'LTHN', 'Lethean'],\n 420: ['0x800001a4', 'NODE', 'NodeHost'],\n 421: ['0x800001a5', 'AGM', 'Argoneum'],\n 422: ['0x800001a6', 'CCX', 'Conceal Network'],\n 423: ['0x800001a7', 'TNET', 'Title Network'],\n 424: ['0x800001a8', 'TELOS', 'TelosCoin'],\n 425: ['0x800001a9', 'AION', 'Aion'],\n 426: ['0x800001aa', 'BC', 'Bitcoin Confidential'],\n 427: ['0x800001ab', 'KTV', 'KmushiCoin'],\n 428: ['0x800001ac', 'ZCR', 'ZCore'],\n 429: ['0x800001ad', 'ERG', 'Ergo'],\n 430: ['0x800001ae', 'PESO', 'Criptopeso'],\n 431: ['0x800001af', 'BTC2', 'Bitcoin 2'],\n 432: ['0x800001b0', 'XRPHD', 'XRPHD'],\n 433: ['0x800001b1', 'WE', 'WE Coin'],\n 434: ['0x800001b2', 'KSM', 'Kusama'],\n 435: ['0x800001b3', 'PCN', 'Peepcoin'],\n 436: ['0x800001b4', 'NCH', 'NetCloth'],\n 437: ['0x800001b5', 'ICU', 'CHIPO'],\n 438: ['0x800001b6', 'FNSA', 'FINSCHIA'],\n 439: ['0x800001b7', 'DTP', 'DeVault Token Protocol'],\n 440: ['0x800001b8', 'BTCR', 'Bitcoin Royale'],\n 441: ['0x800001b9', 'AERGO', 'AERGO'],\n 442: ['0x800001ba', 'XTH', 'Dothereum'],\n 443: ['0x800001bb', 'LV', 'Lava'],\n 444: ['0x800001bc', 'PHR', 'Phore'],\n 445: ['0x800001bd', 'VITAE', 'Vitae'],\n 446: ['0x800001be', 'COCOS', 'Cocos - BCX'],\n 447: ['0x800001bf', 'DIN', 'Dinero'],\n 448: ['0x800001c0', 'SPL', 'Simplicity'],\n 449: ['0x800001c1', 'YCE', 'MYCE'],\n 450: ['0x800001c2', 'XLR', 'Solaris'],\n 451: ['0x800001c3', 'KTS', 'Klimatas'],\n 452: ['0x800001c4', 'DGLD', 'DGLD'],\n 453: ['0x800001c5', 'XNS', 'Insolar'],\n 454: ['0x800001c6', 'EM', 'EMPOW'],\n 455: ['0x800001c7', 'SHN', 'ShineBlocks'],\n 456: ['0x800001c8', 'SEELE', 'Seele'],\n 457: ['0x800001c9', 'AE', 'æternity'],\n 458: ['0x800001ca', 'ODX', 'ObsidianX'],\n 459: ['0x800001cb', 'KAVA', 'Kava'],\n 460: ['0x800001cc', 'GLEEC', 'GLEEC'],\n 461: ['0x800001cd', 'FIL', 'Filecoin'],\n 462: ['0x800001ce', 'RUTA', 'Rutanio'],\n 463: ['0x800001cf', 'CSDT', 'CSDT'],\n 464: ['0x800001d0', 'ETI', 'EtherInc'],\n 465: ['0x800001d1', 'ZSLP', 'Zclassic Simple Ledger Protocol'],\n 466: ['0x800001d2', 'ERE', 'EtherCore'],\n 467: ['0x800001d3', 'DX', 'DxChain Token'],\n 468: ['0x800001d4', 'CPS', 'Capricoin+'],\n 469: ['0x800001d5', 'BTH', 'Bithereum'],\n 470: ['0x800001d6', 'MESG', 'MESG'],\n 471: ['0x800001d7', 'FIMK', 'FIMK'],\n 472: ['0x800001d8', 'AR', 'Arweave'],\n 473: ['0x800001d9', 'OGO', 'Origo'],\n 474: ['0x800001da', 'ROSE', 'Oasis Network'],\n 475: ['0x800001db', 'BARE', 'BARE Network'],\n 476: ['0x800001dc', 'GLEEC', 'GleecBTC'],\n 477: ['0x800001dd', 'CLR', 'Color Coin'],\n 478: ['0x800001de', 'RNG', 'Ring'],\n 479: ['0x800001df', 'OLO', 'Tool Global'],\n 480: ['0x800001e0', 'PEXA', 'Pexa'],\n 481: ['0x800001e1', 'MOON', 'Mooncoin'],\n 482: ['0x800001e2', 'OCEAN', 'Ocean Protocol'],\n 483: ['0x800001e3', 'BNT', 'Bluzelle Native'],\n 484: ['0x800001e4', 'AMO', 'AMO Blockchain'],\n 485: ['0x800001e5', 'FCH', 'FreeCash'],\n 486: ['0x800001e6', 'LAT', 'PlatON'],\n 487: ['0x800001e7', 'COIN', 'Bitcoin Bank'],\n 488: ['0x800001e8', 'VEO', 'Amoveo'],\n 489: ['0x800001e9', 'CCA', 'Counos Coin'],\n 490: ['0x800001ea', 'GFN', 'Graphene'],\n 491: ['0x800001eb', 'BIP', 'Minter Network'],\n 492: ['0x800001ec', 'KPG', 'Kunpeng Network'],\n 493: ['0x800001ed', 'FIN', 'FINL Chain'],\n 494: ['0x800001ee', 'BAND', 'Band'],\n 495: ['0x800001ef', 'DROP', 'Dropil'],\n 496: ['0x800001f0', 'BHT', 'Bluehelix Chain'],\n 497: ['0x800001f1', 'LYRA', 'Scrypta'],\n 498: ['0x800001f2', 'CS', 'Credits'],\n 499: ['0x800001f3', 'RUPX', 'Rupaya'],\n 500: ['0x800001f4', 'THETA', 'Theta'],\n 501: ['0x800001f5', 'SOL', 'Solana'],\n 502: ['0x800001f6', 'THT', 'ThoughtAI'],\n 503: ['0x800001f7', 'CFX', 'Conflux'],\n 504: ['0x800001f8', 'KUMA', 'Kumacoin'],\n 505: ['0x800001f9', 'HASH', 'Provenance'],\n 506: ['0x800001fa', 'CSPR', 'Casper'],\n 507: ['0x800001fb', 'EARTH', 'EARTH'],\n 508: ['0x800001fc', 'EGLD', 'MultiversX'],\n 509: ['0x800001fd', 'CHI', 'Xaya'],\n 510: ['0x800001fe', 'KOTO', 'Koto'],\n 511: ['0x800001ff', 'OTC', 'θ'],\n 512: ['0x80000200', 'RXD', 'Radiant'],\n 513: ['0x80000201', 'SEELEN', 'Seele - N'],\n 514: ['0x80000202', 'AETH', 'AETH'],\n 515: ['0x80000203', 'DNA', 'Idena'],\n 516: ['0x80000204', 'VEE', 'Virtual Economy Era'],\n 517: ['0x80000205', 'SIERRA', 'SierraCoin'],\n 518: ['0x80000206', 'LET', 'Linkeye'],\n 519: ['0x80000207', 'BSC', 'Bitcoin Smart Contract'],\n 520: ['0x80000208', 'BTCV', 'BitcoinVIP'],\n 521: ['0x80000209', 'ABA', 'Dabacus'],\n 522: ['0x8000020a', 'SCC', 'StakeCubeCoin'],\n 523: ['0x8000020b', 'EDG', 'Edgeware'],\n 524: ['0x8000020c', 'AMS', 'AmsterdamCoin'],\n 525: ['0x8000020d', 'GOSS', 'GOSSIP Coin'],\n 526: ['0x8000020e', 'BU', 'BUMO'],\n 527: ['0x8000020f', 'GRAM', 'GRAM'],\n 528: ['0x80000210', 'YAP', 'Yapstone'],\n 529: ['0x80000211', 'SCRT', 'Secret Network'],\n 530: ['0x80000212', 'NOVO', 'Novo'],\n 531: ['0x80000213', 'GHOST', 'Ghost'],\n 532: ['0x80000214', 'HST', 'HST'],\n 533: ['0x80000215', 'PRJ', 'ProjectCoin'],\n 534: ['0x80000216', 'YOU', 'YOUChain'],\n 535: ['0x80000217', 'XHV', 'Haven Protocol'],\n 536: ['0x80000218', 'BYND', 'Beyondcoin'],\n 537: ['0x80000219', 'JOYS', 'Joys Digital'],\n 538: ['0x8000021a', 'VAL', 'Valorbit'],\n 539: ['0x8000021b', 'FLOW', 'Flow'],\n 540: ['0x8000021c', 'SMESH', 'Spacemesh Coin'],\n 541: ['0x8000021d', 'SCDO', 'SCDO'],\n 542: ['0x8000021e', 'IQS', 'IQ - Cash'],\n 543: ['0x8000021f', 'BIND', 'Compendia'],\n 544: ['0x80000220', 'COINEVO', 'Coinevo'],\n 545: ['0x80000221', 'SCRIBE', 'Scribe'],\n 546: ['0x80000222', 'HYN', 'Hyperion'],\n 547: ['0x80000223', 'BHP', 'BHP'],\n 548: ['0x80000224', 'BBC', 'BigBang Core'],\n 549: ['0x80000225', 'MKF', 'MarketFinance'],\n 550: ['0x80000226', 'XDC', 'XinFin'],\n 551: ['0x80000227', 'STR', 'Straightedge'],\n 552: ['0x80000228', 'SUM', 'Sumcoin'],\n 553: ['0x80000229', 'HBC', 'HuobiChain'],\n 554: ['0x8000022a', 'reserved'],\n 555: ['0x8000022b', 'BCS', 'Bitcoin Smart'],\n 556: ['0x8000022c', 'KTS', 'Kratos'],\n 557: ['0x8000022d', 'LKR', 'Lkrcoin'],\n 558: ['0x8000022e', 'TAO', 'Tao'],\n 559: ['0x8000022f', 'XWC', 'Whitecoin'],\n 560: ['0x80000230', 'DEAL', 'DEAL'],\n 561: ['0x80000231', 'NTY', 'Nexty'],\n 562: ['0x80000232', 'TOP', 'TOP NetWork'],\n 563: ['0x80000233,---', 'reserved'],\n 564: ['0x80000234', 'AG', 'Agoric'],\n 565: ['0x80000235', 'CICO', 'Coinicles'],\n 566: ['0x80000236', 'IRIS', 'Irisnet'],\n 567: ['0x80000237', 'NCG', 'Nine Chronicles'],\n 568: ['0x80000238', 'LRG', 'Large Coin'],\n 569: ['0x80000239', 'SERO', 'Super Zero Protocol'],\n 570: ['0x8000023a', 'BDX', 'Beldex'],\n 571: ['0x8000023b', 'CCXX', 'Counos X'],\n 572: ['0x8000023c', 'SLS', 'Saluscoin'],\n 573: ['0x8000023d', 'SRM', 'Serum'],\n 574: ['0x8000023e,---', 'reserved'],\n 575: ['0x8000023f', 'VIVT', 'VIDT Datalink'],\n 576: ['0x80000240', 'BPS', 'BitcoinPoS'],\n 577: ['0x80000241', 'NKN', 'NKN'],\n 578: ['0x80000242', 'ICL', 'ILCOIN'],\n 579: ['0x80000243', 'BONO', 'Bonorum'],\n 580: ['0x80000244', 'PLC', 'PLATINCOIN'],\n 581: ['0x80000245', 'DUN', 'Dune'],\n 582: ['0x80000246', 'DMCH', 'Darmacash'],\n 583: ['0x80000247', 'CTC', 'Creditcoin'],\n 584: ['0x80000248', 'KELP', 'Haidai Network'],\n 585: ['0x80000249', 'GBCR', 'GoldBCR'],\n 586: ['0x8000024a', 'XDAG', 'XDAG'],\n 587: ['0x8000024b', 'PRV', 'Incognito Privacy'],\n 588: ['0x8000024c', 'SCAP', 'SafeCapital'],\n 589: ['0x8000024d', 'TFUEL', 'Theta Fuel'],\n 590: ['0x8000024e', 'GTM', 'Gentarium'],\n 591: ['0x8000024f', 'RNL', 'RentalChain'],\n 592: ['0x80000250', 'GRIN', 'Grin'],\n 593: ['0x80000251', 'MWC', 'MimbleWimbleCoin'],\n 594: ['0x80000252', 'DOCK', 'Dock'],\n 595: ['0x80000253', 'POLYX', 'Polymesh'],\n 596: ['0x80000254', 'DIVER', 'Divergenti'],\n 597: ['0x80000255', 'XEP', 'Electra Protocol'],\n 598: ['0x80000256', 'APN', 'Apron'],\n 599: ['0x80000257', 'TFC', 'Turbo File Coin'],\n 600: ['0x80000258', 'UTE', 'Unit - e'],\n 601: ['0x80000259', 'MTC', 'Metacoin'],\n 602: ['0x8000025a', 'NC', 'NobodyCash'],\n 603: ['0x8000025b', 'XINY', 'Xinyuehu'],\n 604: ['0x8000025c', 'DYN', 'Dynamo'],\n 605: ['0x8000025d', 'BUFS', 'Buffer'],\n 606: ['0x8000025e', 'STOS', 'Stratos'],\n 607: ['0x8000025f', 'TON', 'TON'],\n 608: ['0x80000260', 'TAFT', 'TAFT'],\n 609: ['0x80000261', 'HYDRA', 'HYDRA'],\n 610: ['0x80000262', 'NOR', 'Noir'],\n 611: ['0x80000263', undefined, 'Manta Network Private Asset'],\n 612: ['0x80000264', undefined, 'Calamari Network Private Asset'],\n 613: ['0x80000265', 'WCN', 'Widecoin'],\n 614: ['0x80000266', 'OPT', 'Optimistic Ethereum'],\n 615: ['0x80000267', 'PSWAP', 'PolkaSwap'],\n 616: ['0x80000268', 'VAL', 'Validator'],\n 617: ['0x80000269', 'XOR', 'Sora'],\n 618: ['0x8000026a', 'SSP', 'SmartShare'],\n 619: ['0x8000026b', 'DEI', 'DeimosX'],\n 620: ['0x8000026c,---', 'reserved'],\n 621: ['0x8000026d', 'ZERO', 'Singularity'],\n 622: ['0x8000026e', 'ALPHA', 'AlphaDAO'],\n 623: ['0x8000026f', 'BDECO', 'BDCashProtocol Ecosystem'],\n 624: ['0x80000270', 'NOBL', 'Nobility'],\n 625: ['0x80000271', 'EAST', 'Eastcoin'],\n 626: ['0x80000272', 'KDA', 'Kadena'],\n 627: ['0x80000273', 'SOUL', 'Phantasma'],\n 628: ['0x80000274', 'LORE', 'Gitopia'],\n 629: ['0x80000275', 'FNR', 'Fincor'],\n 630: ['0x80000276', 'NEXUS', 'Nexus'],\n 631: ['0x80000277', 'QTZ', 'Quartz'],\n 632: ['0x80000278', 'MAS', 'Massa'],\n 633: ['0x80000279', 'CALL', 'Callchain'],\n 634: ['0x8000027a', 'VAL', 'Validity'],\n 635: ['0x8000027b', 'POKT', 'Pocket Network'],\n 636: ['0x8000027c', 'EMIT', 'EMIT'],\n 637: ['0x8000027d', 'APTOS', 'Aptos'],\n 638: ['0x8000027e', 'ADON', 'ADON'],\n 639: ['0x8000027f', 'BTSG', 'BitSong'],\n 640: ['0x80000280', 'LFC', 'Leofcoin'],\n 641: ['0x80000281', 'KCS', 'KuCoin Shares'],\n 642: ['0x80000282', 'KCC', 'KuCoin Community Chain'],\n 643: ['0x80000283', 'AZERO', 'Aleph Zero'],\n 644: ['0x80000284', 'TREE', 'Tree'],\n 645: ['0x80000285', 'LX', 'Lynx'],\n 646: ['0x80000286', 'XLN', 'Lunarium'],\n 647: ['0x80000287', 'CIC', 'CIC Chain'],\n 648: ['0x80000288', 'ZRB', 'Zarb'],\n 649: ['0x80000289,---', 'reserved'],\n 650: ['0x8000028a', 'UCO', 'Archethic'],\n 651: ['0x8000028b', 'SFX', 'Safex Cash'],\n 652: ['0x8000028c', 'SFT', 'Safex Token'],\n 653: ['0x8000028d', 'WSFX', 'Wrapped Safex Cash'],\n 654: ['0x8000028e', 'USDG', 'US Digital Gold'],\n 655: ['0x8000028f', 'WMP', 'WAMP'],\n 656: ['0x80000290', 'EKTA', 'Ekta'],\n 657: ['0x80000291', 'YDA', 'YadaCoin'],\n 658: ['0x80000292', 'WHIVE', 'Whive'],\n 659: ['0x80000293', 'KOIN', 'Koinos'],\n 660: ['0x80000294', 'PIRATE', 'PirateCash'],\n 661: ['0x80000295', 'UNQ', 'Unique'],\n 662: ['0x80000296', 'ULM', 'UltonSmartchain'],\n 663: ['0x80000297', 'SFRX', 'EtherGem Sapphire'],\n 664: ['0x80000298', 'BSTY', 'GlobalBoost - Y'],\n 665: ['0x80000299', 'IMP', 'Impact Protocol'],\n 666: ['0x8000029a', 'ACT', 'Achain'],\n 667: ['0x8000029b', 'PRKL', 'Perkle'],\n 668: ['0x8000029c', 'SSC', 'SelfSell'],\n 669: ['0x8000029d', 'GC', 'GateChain'],\n 670: ['0x8000029e', 'PLGR', 'Pledger'],\n 671: ['0x8000029f', 'MPLGR', 'Pledger'],\n 672: ['0x800002a0', 'KNOX', 'Knox'],\n 673: ['0x800002a1', 'ZED', 'ZED'],\n 674: ['0x800002a2', 'CNDL', 'Candle'],\n 675: ['0x800002a3', 'WLKR', 'Walker Crypto Innovation Index'],\n 676: ['0x800002a4', 'WLKRR', 'Walker'],\n 677: ['0x800002a5', 'YUNGE', 'Yunge'],\n 678: ['0x800002a6', 'Voken', 'Voken'],\n 679: ['0x800002a7', 'APL', 'Apollo'],\n 680: ['0x800002a8', 'Evrynet', 'Evrynet'],\n 681: ['0x800002a9', 'NENG', 'Nengcoin'],\n 682: ['0x800002aa', 'CHTA', 'Cheetahcoin'],\n 683: ['0x800002ab', 'ALEO', 'Aleo Network'],\n 684: ['0x800002ac', 'HMS', 'Hemis'],\n 685: ['0x800002ad', 'OAS', 'Oasys'],\n 686: ['0x800002ae', 'KAR', 'Karura Network'],\n 687: ['0x800002af', 'FLON', 'FullOn Network'],\n 688: ['0x800002b0', 'CET', 'CoinEx Chain'],\n 689: ['0x800002b1', 'XLINK', 'XLink Chain'],\n 690: ['0x800002b2', 'KLV', 'KleverChain'],\n 691: ['0x800002b3', 'TNT', 'Tangle'],\n 692: ['0x800002b4', 'GTG', 'Gotigin'],\n 693: ['0x800002b5', 'NET', 'RealityNet'],\n 694: ['0x800002b6', 'VTBC', 'VTB Community'],\n 695: ['0x800002b7', 'DIONE', 'Odyssey Chain'],\n 696: ['0x800002b8', 'LUM', 'Lumos'],\n 697: ['0x800002b9', 'AVA', 'Avalon'],\n 698: ['0x800002ba', 'VEIL', 'Veil'],\n 699: ['0x800002bb', 'GTB', 'GotaBit'],\n 700: ['0x800002bc', 'XDAI', 'xDai'],\n 701: ['0x800002bd', 'COM', 'Commercio'],\n 702: ['0x800002be', 'CCC', 'Commercio Cash Credit'],\n 703: ['0x800002bf', 'SNR', 'Sonr'],\n 704: ['0x800002c0', 'RAQ', 'Ra Quantum'],\n 705: ['0x800002c1', 'PEG', 'Pegasus Token'],\n 706: ['0x800002c2', 'LKG', 'Lionking'],\n 707: ['0x800002c3', 'MCOIN', 'Moneta Coin'],\n 708: ['0x800002c4,---', 'reserved'],\n 709: ['0x800002c5', 'AVAIL', 'Avail'],\n 710: ['0x800002c6', 'FURY', 'Highbury'],\n 711: ['0x800002c7', 'CHC', 'Chaincoin'],\n 712: ['0x800002c8', 'SERF', 'Serfnet'],\n 713: ['0x800002c9', 'XTL', 'Katal Chain'],\n 714: ['0x800002ca', 'BNB', 'Binance'],\n 715: ['0x800002cb', 'SIN', 'Sinovate'],\n 716: ['0x800002cc', 'DLN', 'Delion'],\n 717: ['0x800002cd', 'BONTE', 'Bontecoin'],\n 718: ['0x800002ce', 'PEER', 'Peer'],\n 719: ['0x800002cf', 'ZET', 'Zetacoin'],\n 720: ['0x800002d0', 'ABY', 'Artbyte'],\n 721: ['0x800002d1', 'PGX', 'Mirai Chain'],\n 722: ['0x800002d2', 'IL8P', 'InfiniLooP'],\n 723: ['0x800002d3', 'VOI', 'Voi'],\n 724: ['0x800002d4', 'XVC', 'Vanillacash'],\n 725: ['0x800002d5', 'MCX', 'MultiCash'],\n 726: ['0x800002d6', 'TARA', 'Taraxa'],\n 727: ['0x800002d7', 'BLU', 'BluCrates'],\n 728: ['0x800002d8', 'BFC', 'BFC'],\n 729: ['0x800002d9'],\n 730: ['0x800002da', 'HEALIOS', 'Tenacity'],\n 731: ['0x800002db', 'BMK', 'Bitmark'],\n 732: ['0x800002dc'],\n 733: ['0x800002dd', 'TBC', 'TBChat'],\n 734: ['0x800002de', 'DENTX', 'DENTNet'],\n 735: ['0x800002df'],\n 736: ['0x800002e0'],\n 737: ['0x800002e1', 'ATOP', 'Financial Blockchain'],\n 738: ['0x800002e2', 'BTE', 'Bitweb'],\n 739: ['0x800002e3', 'DPC', 'Dpowcoin (DualPowCoin)'],\n 740: ['0x800002e4', 'MDC', 'MyDataCoin'],\n 741: ['0x800002e5', 'RIV', 'Rigvid'],\n 742: ['0x800002e6'],\n 743: ['0x800002e7'],\n 744: ['0x800002e8', 'DUSK', 'Dusk'],\n 745: ['0x800002e9'],\n 746: ['0x800002ea'],\n 747: ['0x800002eb', 'CFG', 'Centrifuge'],\n 748: ['0x800002ec'],\n 749: ['0x800002ed'],\n 750: ['0x800002ee', 'XPRT', 'Persistence'],\n 751: ['0x800002ef'],\n 752: ['0x800002f0'],\n 753: ['0x800002f1', undefined, 'Age NIST Encryption'],\n 754: ['0x800002f2', undefined, 'Age NIST Encryption'],\n 755: ['0x800002f3'],\n 756: ['0x800002f4'],\n 757: ['0x800002f5', 'HONEY', 'HoneyWood'],\n 758: ['0x800002f6', 'XDD', 'XDDCoin'],\n 759: ['0x800002f7'],\n 760: ['0x800002f8'],\n 761: ['0x800002f9'],\n 762: ['0x800002fa'],\n 763: ['0x800002fb'],\n 764: ['0x800002fc'],\n 765: ['0x800002fd', 'TGN', 'Tagion'],\n 766: ['0x800002fe'],\n 767: ['0x800002ff'],\n 768: ['0x80000300', 'BALLZ', 'Ballzcoin'],\n 769: ['0x80000301'],\n 770: ['0x80000302', 'COSA', 'Cosanta'],\n 771: ['0x80000303', 'BR', 'BR'],\n 772: ['0x80000304'],\n 773: ['0x80000305', 'CSB', 'CosmoBliss'],\n 774: ['0x80000306'],\n 775: ['0x80000307', 'PLSR', 'Pulsar Coin'],\n 776: ['0x80000308', 'KEY', 'Keymaker Coin'],\n 777: ['0x80000309', 'BTW', 'Bitcoin World'],\n 778: ['0x8000030a'],\n 779: ['0x8000030b'],\n 780: ['0x8000030c', 'PLCUC', 'PLC Ultima Classic'],\n 781: ['0x8000030d', 'PLCUX', 'PLC Ultima X'],\n 782: ['0x8000030e', 'PLCU', 'PLC Ultima'],\n 783: ['0x8000030f', 'SMARTBC', 'SMART Blockchain'],\n 784: ['0x80000310', 'SUI', 'Sui'],\n 785: ['0x80000311', 'ULTIMA', 'ULTIMA'],\n 786: ['0x80000312', 'UIDD', 'UIDD'],\n 787: ['0x80000313', 'ACA', 'Acala'],\n 788: ['0x80000314', 'BNC', 'Bifrost'],\n 789: ['0x80000315', 'TAU', 'Lamden'],\n 790: ['0x80000316'],\n 791: ['0x80000317'],\n 792: ['0x80000318'],\n 793: ['0x80000319'],\n 794: ['0x8000031a', 'INTR', 'Interlay'],\n 795: ['0x8000031b', 'KINT', 'Kintsugi'],\n 796: ['0x8000031c'],\n 797: ['0x8000031d'],\n 798: ['0x8000031e'],\n 799: ['0x8000031f', 'PDEX', 'Polkadex'],\n 800: ['0x80000320', 'BEET', 'Beetle Coin'],\n 801: ['0x80000321', 'DST', 'DSTRA'],\n 802: ['0x80000322', 'CY', 'Cyberyen'],\n 803: ['0x80000323', 'RYME', 'Ryme Network'],\n 804: ['0x80000324', 'ZKS', 'zkSync'],\n 805: ['0x80000325', 'SCASH', 'Scash'],\n 806: ['0x80000326'],\n 807: ['0x80000327'],\n 808: ['0x80000328', 'QVT', 'Qvolta'],\n 809: ['0x80000329', 'SDN', 'Shiden Network'],\n 810: ['0x8000032a', 'ASTR', 'Astar Network'],\n 811: ['0x8000032b', '---', 'reserved'],\n 812: ['0x8000032c'],\n 813: ['0x8000032d', 'MEER', 'Qitmeer'],\n 814: ['0x8000032e'],\n 815: ['0x8000032f', 'FACT', 'ImFACT'],\n 816: ['0x80000330', 'FSC', 'FSC'],\n 817: ['0x80000331'],\n 818: ['0x80000332', 'VET', 'VeChain Token'],\n 819: ['0x80000333', 'REEF', 'Reef'],\n 820: ['0x80000334', 'CLO', 'Callisto'],\n 821: ['0x80000335'],\n 822: ['0x80000336', 'BDB', 'BigchainDB'],\n 823: ['0x80000337'],\n 824: ['0x80000338', 'RBNT', 'Redbelly Network'],\n 825: ['0x80000339'],\n 826: ['0x8000033a'],\n 827: ['0x8000033b', 'ACE', 'Endurance'],\n 828: ['0x8000033c', 'CCN', 'ComputeCoin'],\n 829: ['0x8000033d', 'BBA', 'BBACHAIN'],\n 830: ['0x8000033e'],\n 831: ['0x8000033f', 'CRUZ', 'cruzbit'],\n 832: ['0x80000340', 'SAPP', 'Sapphire'],\n 833: ['0x80000341', 777, 'Jackpot'],\n 834: ['0x80000342', 'KYAN', 'Kyanite'],\n 835: ['0x80000343', 'AZR', 'Azzure'],\n 836: ['0x80000344', 'CFL', 'CryptoFlow'],\n 837: ['0x80000345', 'DASHD', 'Dash Diamond'],\n 838: ['0x80000346', 'TRTT', 'Trittium'],\n 839: ['0x80000347', 'UCR', 'Ultra Clear'],\n 840: ['0x80000348', 'PNY', 'Peony'],\n 841: ['0x80000349', 'BECN', 'Beacon'],\n 842: ['0x8000034a', 'MONK', 'Monk'],\n 843: ['0x8000034b', 'SAGA', 'CryptoSaga'],\n 844: ['0x8000034c', 'SUV', 'Suvereno'],\n 845: ['0x8000034d', 'ESK', 'EskaCoin'],\n 846: ['0x8000034e', 'OWO', 'OneWorld Coin'],\n 847: ['0x8000034f', 'PEPS', 'PEPS Coin'],\n 848: ['0x80000350', 'BIR', 'Birake'],\n 849: ['0x80000351', 'MOBIC', 'MobilityCoin'],\n 850: ['0x80000352', 'FLS', 'Flits'],\n 851: ['0x80000353', 'FRECO', 'Freco'],\n 852: ['0x80000354', 'DSM', 'Desmos'],\n 853: ['0x80000355', 'PRCY', 'PRCY Coin'],\n 854: ['0x80000356'],\n 855: ['0x80000357'],\n 856: ['0x80000358'],\n 857: ['0x80000359'],\n 858: ['0x8000035a', 'HVH', 'HAVAH'],\n 859: ['0x8000035b'],\n 860: ['0x8000035c', 'XBIT', 'XBIT Coin'],\n 861: ['0x8000035d'],\n 862: ['0x8000035e'],\n 863: ['0x8000035f'],\n 864: ['0x80000360', 'CVM', 'Convex'],\n 865: ['0x80000361'],\n 866: ['0x80000362', 'MOB', 'MobileCoin'],\n 867: ['0x80000363'],\n 868: ['0x80000364', 'IF', 'Infinitefuture'],\n 869: ['0x80000365'],\n 870: ['0x80000366'],\n 871: ['0x80000367'],\n 872: ['0x80000368'],\n 873: ['0x80000369', 'QUORUM', 'Quorum'],\n 874: ['0x8000036a'],\n 875: ['0x8000036b'],\n 876: ['0x8000036c'],\n 877: ['0x8000036d', 'NAM', 'Namada'],\n 878: ['0x8000036e', 'SCR', 'Scorum Network'],\n 879: ['0x8000036f'],\n 880: ['0x80000370', 'LUM', 'Lum Network'],\n 881: ['0x80000371'],\n 882: ['0x80000372'],\n 883: ['0x80000373', 'ZBC', 'ZooBC'],\n 884: ['0x80000374'],\n 885: ['0x80000375'],\n 886: ['0x80000376', 'ADF', 'AD Token'],\n 887: ['0x80000377'],\n 888: ['0x80000378', 'NEO', 'NEO'],\n 889: ['0x80000379', 'TOMO', 'TOMO'],\n 890: ['0x8000037a', 'XSEL', 'Seln'],\n 891: ['0x8000037b'],\n 892: ['0x8000037c'],\n 893: ['0x8000037d'],\n 894: ['0x8000037e'],\n 895: ['0x8000037f'],\n 896: ['0x80000380', 'LKSC', 'LKSCoin'],\n 897: ['0x80000381'],\n 898: ['0x80000382', 'AS', 'Assetchain'],\n 899: ['0x80000383', 'XEC', 'eCash'],\n 900: ['0x80000384', 'LMO', 'Lumeneo'],\n 901: ['0x80000385', 'NXT', 'NxtMeta'],\n 902: ['0x80000386'],\n 903: ['0x80000387'],\n 904: ['0x80000388', 'HNT', 'Helium'],\n 905: ['0x80000389'],\n 906: ['0x8000038a', 'XPX', 'Sirius'],\n 907: ['0x8000038b', 'FIS', 'StaFi'],\n 908: ['0x8000038c'],\n 909: ['0x8000038d', 'SGE', 'Saage'],\n 910: ['0x8000038e'],\n 911: ['0x8000038f', 'GERT', 'Gert'],\n 912: ['0x80000390'],\n 913: ['0x80000391', 'VARA', 'Vara Network'],\n 914: ['0x80000392'],\n 915: ['0x80000393'],\n 916: ['0x80000394', 'META', 'Metadium'],\n 917: ['0x80000395', 'FRA', 'Findora'],\n 918: ['0x80000396'],\n 919: ['0x80000397', 'CCD', 'Concordium'],\n 920: ['0x80000398'],\n 921: ['0x80000399', 'AVN', 'Avian Network'],\n 922: ['0x8000039a'],\n 923: ['0x8000039b'],\n 924: ['0x8000039c'],\n 925: ['0x8000039d', 'DIP', 'Dipper Network'],\n 926: ['0x8000039e'],\n 927: ['0x8000039f'],\n 928: ['0x800003a0', 'GHM', 'HermitMatrixNetwork'],\n 929: ['0x800003a1'],\n 930: ['0x800003a2'],\n 931: ['0x800003a3', 'RUNE', 'THORChain (RUNE)'],\n 932: ['0x800003a4'],\n 933: ['0x800003a5'],\n 934: ['0x800003a6'],\n 935: ['0x800003a7'],\n 936: ['0x800003a8'],\n 937: ['0x800003a9'],\n 938: ['0x800003aa', 'MGO', 'Mango Network'],\n 939: ['0x800003ab', 'AB', 'Argot Protocol'],\n 940: ['0x800003ac'],\n 941: ['0x800003ad', '---', 'reserved'],\n 942: ['0x800003ae', 'KCN', 'Kylacoin'],\n 943: ['0x800003af', 'LCN', 'Lyncoin'],\n 944: ['0x800003b0'],\n 945: ['0x800003b1', 'UNLOCK', 'Jasiri protocol'],\n 946: ['0x800003b2'],\n 947: ['0x800003b3'],\n 948: ['0x800003b4'],\n 949: ['0x800003b5'],\n 950: ['0x800003b6'],\n 951: ['0x800003b7'],\n 952: ['0x800003b8'],\n 953: ['0x800003b9'],\n 954: ['0x800003ba'],\n 955: ['0x800003bb', 'LTP', 'LifetionCoin'],\n 956: ['0x800003bc'],\n 957: ['0x800003bd'],\n 958: ['0x800003be', undefined, 'KickSoccer'],\n 959: ['0x800003bf'],\n 960: ['0x800003c0', 'VKAX', 'Vkax'],\n 961: ['0x800003c1'],\n 962: ['0x800003c2'],\n 963: ['0x800003c3'],\n 964: ['0x800003c4'],\n 965: ['0x800003c5'],\n 966: ['0x800003c6', 'MATIC', 'Matic'],\n 967: ['0x800003c7'],\n 968: ['0x800003c8', 'UNW', 'UNW'],\n 969: ['0x800003c9', 'QI', 'Quai Network'],\n 970: ['0x800003ca', 'TWINS', 'TWINS'],\n 971: ['0x800003cb'],\n 972: ['0x800003cc'],\n 973: ['0x800003cd'],\n 974: ['0x800003ce'],\n 975: ['0x800003cf'],\n 976: ['0x800003d0'],\n 977: ['0x800003d1', 'TLOS', 'Telos'],\n 978: ['0x800003d2'],\n 979: ['0x800003d3'],\n 980: ['0x800003d4'],\n 981: ['0x800003d5', 'TAFECO', 'Taf ECO Chain'],\n 982: ['0x800003d6'],\n 983: ['0x800003d7'],\n 984: ['0x800003d8'],\n 985: ['0x800003d9', 'AU', 'Autonomy'],\n 986: ['0x800003da'],\n 987: ['0x800003db', 'VCG', 'VipCoin'],\n 988: ['0x800003dc', 'XAZAB', 'Xazab core'],\n 989: ['0x800003dd', 'AIOZ', 'AIOZ'],\n 990: ['0x800003de', 'CORE', 'Coreum'],\n 991: ['0x800003df', 'PEC', 'Phoenix'],\n 992: ['0x800003e0', 'UNT', 'Unit'],\n 993: ['0x800003e1', 'XRB', 'X Currency'],\n 994: ['0x800003e2', 'QUAI', 'Quai Network'],\n 995: ['0x800003e3', 'CAPS', 'Ternoa'],\n 996: ['0x800003e4', 'OKT', 'OKChain Token'],\n 997: ['0x800003e5', 'SUM', 'Solidum'],\n 998: ['0x800003e6', 'LBTC', 'Lightning Bitcoin'],\n 999: ['0x800003e7', 'BCD', 'Bitcoin Diamond'],\n 1000: ['0x800003e8', 'BTN', 'Bitcoin New'],\n 1001: ['0x800003e9', 'TT', 'ThunderCore'],\n 1002: ['0x800003ea', 'BKT', 'BanKitt'],\n 1003: ['0x800003eb', 'NODL', 'Nodle'],\n 1004: ['0x800003ec', 'PCOIN', 'PCOIN'],\n 1005: ['0x800003ed', 'TAO', 'Bittensor'],\n 1006: ['0x800003ee', 'HSK', 'HashKey Chain'],\n 1007: ['0x800003ef', 'FTM', 'Fantom'],\n 1008: ['0x800003f0', 'RPG', 'RPG'],\n 1009: ['0x800003f1', 'LAKE', 'iconLake'],\n 1010: ['0x800003f2', 'HT', 'Huobi ECO Chain'],\n 1011: ['0x800003f3', 'ELV', 'Eluvio'],\n 1012: ['0x800003f4', 'JOC', 'Japan Open Chain'],\n 1013: ['0x800003f5', 'BIC', 'Beincrypto'],\n 1014: ['0x800003f6', 'JOY', 'Joystream'],\n 1015: ['0x800003f7', 'ZCX', 'ZEN Exchange Token'],\n 1016: ['0x800003f8', '---', 'reserved'],\n 1020: ['0x800003fc', 'EVC', 'Evrice'],\n 1022: ['0x800003fe', 'XRD', 'Radix DLT'],\n 1023: ['0x800003ff', 'ONE', 'HARMONY-ONE (Legacy)'],\n 1024: ['0x80000400', 'ONT', 'Ontology'],\n 1025: ['0x80000401', 'CZZ', 'Classzz'],\n 1026: ['0x80000402', 'KEX', 'Kira Exchange Token'],\n 1027: ['0x80000403', 'MCM', 'Mochimo'],\n 1028: ['0x80000404', 'PLS', 'Pulse Coin'],\n 1032: ['0x80000408', 'BTCR', 'BTCR'],\n 1042: ['0x80000412', 'MFID', 'Moonfish ID'],\n 1111: ['0x80000457', 'BBC', 'Big Bitcoin'],\n 1116: ['0x8000045c', 'CORE', 'Core'],\n 1120: ['0x80000460', 'RISE', 'RISE'],\n 1122: ['0x80000462', 'CMT', 'CyberMiles Token'],\n 1128: ['0x80000468', 'ETSC', 'Ethereum Social'],\n 1129: ['0x80000469', 'DFI', 'DeFiChain'],\n 1130: ['0x8000046a', 'DFI', 'DeFiChain EVM Network'],\n 1137: ['0x80000471', '$DAG', 'Constellation Labs'],\n 1145: ['0x80000479', 'CDY', 'Bitcoin Candy'],\n 1155: ['0x80000483', 'ENJ', 'Enjin Coin'],\n 1170: ['0x80000492', 'HOO', 'Hoo Smart Chain'],\n 1234: ['0x800004d2', 'ALPH', 'Alephium'],\n 1236: ['0x800004d4', undefined, 'Masca'],\n 1237: ['0x800004d5', undefined, 'Nostr'],\n 1280: ['0x80000500', undefined, 'Kudos Setler'],\n 1284: ['0x80000504', 'GLMR', 'Moonbeam'],\n 1285: ['0x80000505', 'MOVR', 'Moonriver'],\n 1286: ['0x80000506', 'DSG', 'Dessage Social Protocol'],\n 1298: ['0x80000512', 'WPC', 'Wpc'],\n 1308: ['0x8000051c', 'WEI', 'WEI'],\n 1312: ['0x80000520', 'BITS', 'Entropy'],\n 1337: ['0x80000539', 'DFC', 'Defcoin'],\n 1338: ['0x8000053a', 'IRON', 'Iron Fish'],\n 1348: ['0x80000544', 'ISLM', 'IslamicCoin'],\n 1397: ['0x80000575', 'HYC', 'Hycon'],\n 1410: ['0x80000582', 'TENTSLP', 'TENT Simple Ledger Protocol'],\n 1510: ['0x800005e6', 'XSC', 'XT Smart Chain'],\n 1512: ['0x800005e8', 'AAC', 'Double-A Chain'],\n 1524: ['0x800005f4', undefined, 'Taler'],\n 1533: ['0x800005fd', 'BEAM', 'Beam'],\n 1536: ['0x80000600', 'GAS', 'BubiChain'],\n 1540: ['0x80000604', 'ATHENA', 'Athena'],\n 1551: ['0x8000060f', 'SDK', 'Sovereign SDK'],\n 1555: ['0x80000613', 'APC', 'Apc Chain'],\n 1616: ['0x80000650', 'ELF', 'AELF'],\n 1618: ['0x80000652', 'AUDL', 'AUDL'],\n 1620: ['0x80000654', 'ATH', 'Atheios'],\n 1627: ['0x8000065b', 'LUME', 'Lume Web'],\n 1642: ['0x8000066a', 'NEW', 'Newton'],\n 1657: ['0x80000679', 'BTA', 'Btachain'],\n 1668: ['0x80000684', 'NEOX', 'Neoxa'],\n 1669: ['0x80000685', 'MEWC', 'Meowcoin'],\n 1688: ['0x80000698', 'BCX', 'BitcoinX'],\n 1729: ['0x800006c1', 'XTZ', 'Tezos'],\n 1776: ['0x800006f0', 'LBTC', 'Liquid BTC'],\n 1777: ['0x800006f1', 'BBP', 'Biblepay'],\n 1784: ['0x800006f8', 'JPYS', 'JPY Stablecoin'],\n 1789: ['0x800006fd', 'VEGA', 'Vega Protocol'],\n 1815: ['0x80000717', 'ADA', 'Cardano'],\n 1818: ['0x8000071a', 'CUBE', 'Cube Chain Native Token'],\n 1856: ['0x80000743', 'TES', 'Teslacoin'],\n 1888: ['0x80000760', 'ZTX', 'Zetrix'],\n 1899: ['0x8000076b', 'XEC', 'eCash token'],\n 1900: ['0x8000076c', 'XNA', 'Neurai'],\n 1901: ['0x8000076d', 'CLC', 'Classica'],\n 1907: ['0x80000773', 'BITCI', 'Bitcicoin'],\n 1918: ['0x8000077e', 'BKC', 'Briskcoin'],\n 1919: ['0x8000077f', 'VIPS', 'VIPSTARCOIN'],\n 1926: ['0x80000786', 'CITY', 'City Coin'],\n 1951: ['0x8000079f', 'ESA', 'Esa'],\n 1952: ['0x800007a0', 'ESC', 'EsaCoin'],\n 1955: ['0x800007a3', 'XX', 'xx coin'],\n 1977: ['0x800007b9', 'XMX', 'Xuma'],\n 1984: ['0x800007c0', 'TRTL', 'TurtleCoin'],\n 1985: ['0x800007c1', 'SLRT', 'Solarti Chain'],\n 1986: ['0x800007c2', 'QTH', 'Qing Tong Horizon'],\n 1987: ['0x800007c3', 'EGEM', 'EtherGem'],\n 1988: ['0x800007c4', 'MIRA', 'Mira Chain'],\n 1989: ['0x800007c5', 'HODL', 'HOdlcoin'],\n 1990: ['0x800007c6', 'PHL', 'Placeholders'],\n 1991: ['0x800007c7', 'SC', 'Sia'],\n 1996: ['0x800007cc', 'MYT', 'Mineyourtime'],\n 1997: ['0x800007cd', 'POLIS', 'Polis'],\n 1998: ['0x800007ce', 'XMCC', 'Monoeci'],\n 1999: ['0x800007cf', 'COLX', 'ColossusXT'],\n 2000: ['0x800007d0', 'GIN', 'GinCoin'],\n 2001: ['0x800007d1', 'MNP', 'MNPCoin'],\n 2002: ['0x800007d2', 'MLN', 'Miraland'],\n 2015: ['0x800007df', 'TEER', 'Integritee'],\n 2017: ['0x800007e1', 'KIN', 'Kin'],\n 2018: ['0x800007e2', 'EOSC', 'EOSClassic'],\n 2019: ['0x800007e3', 'GBT', 'GoldBean Token'],\n 2020: ['0x800007e4', 'PKC', 'PKC'],\n 2021: ['0x800007e5', 'SKT', 'Sukhavati'],\n 2024: ['0x800007e8', 'USBC', 'Universal Ledger USBC'],\n 2022: ['0x800007e6', 'XHT', 'Xinghuo Token'],\n 2023: ['0x800007e7', 'COC', 'Chat On Chain'],\n 2025: ['0x800007e9', 'ROCK', 'Zenrock Labs'],\n 2026: ['0x800007ea', 'ASTRON', 'ASTRON Token'],\n 2046: ['0x800007fe', 'ANY', 'Any'],\n 2048: ['0x80000800', 'MCASH', 'MCashChain'],\n 2049: ['0x80000801', 'TRUE', 'TrueChain'],\n 2050: ['0x80000802', 'MOVO', 'Movo Smart Chain'],\n 2086: ['0x80000826', 'KILT', 'KILT Spiritnet'],\n 2091: ['0x8000082b', 'FRQCY', 'Frequency'],\n 2109: ['0x8000083d', 'SAMA', 'Exosama Network'],\n 2112: ['0x80000840', 'IoTE', 'IoTE'],\n 2125: ['0x8000084d', 'BAY', 'BitBay'],\n 2137: ['0x80000859', 'XRG', 'Ergon'],\n 2199: ['0x80000897', 'SAMA', 'Moonsama Network'],\n 2221: ['0x800008ad', 'ASK', 'ASK'],\n 2222: ['0x800008ae', 'CWEB', 'Coinweb'],\n 2285: ['0x800008ed', undefined, 'Qiyi Chain'],\n 2301: ['0x800008fd', 'QTUM', 'QTUM'],\n 2302: ['0x800008fe', 'ETP', 'Metaverse'],\n 2303: ['0x800008ff', 'GXC', 'GXChain'],\n 2304: ['0x80000900', 'CRP', 'CranePay'],\n 2305: ['0x80000901', 'ELA', 'Elastos'],\n 2338: ['0x80000922', 'SNOW', 'Snowblossom'],\n 2365: ['0x8000093d', 'XIN', 'Mixin'],\n 2500: ['0x800009c4', 'NEXI', 'Nexi'],\n 2570: ['0x80000a0a', 'AOA', 'Aurora'],\n 2686: ['0x80000a7e', 'AIPG', 'AIPowerGrid'],\n 2718: ['0x80000a9e', 'NAS', 'Nebulas'],\n 2809: ['0x80000af9', 'LAN', 'Lanify'],\n 2894: ['0x80000b4e', 'REOSC', 'REOSC Ecosystem'],\n 2941: ['0x80000b7d', 'BND', 'Blocknode'],\n 3000: ['0x80000bb8', 'SM', 'Stealth Message'],\n 3003: ['0x80000bbb', 'LUX', 'LUX'],\n 3030: ['0x80000bd6', 'HBAR', 'Hedera HBAR'],\n 3077: ['0x80000c05', 'COS', 'Contentos'],\n 3276: ['0x80000ccc', 'CCC', 'CodeChain'],\n 3344: ['0x80000d10', 'PLMC', 'Polimec'],\n 3333: ['0x80000d05', 'SXP', 'Solar'],\n 3338: ['0x80000d0a', 'PEAQ', 'peaq'],\n 3377: ['0x80000d31', 'ROI', 'ROIcoin'],\n 3381: ['0x80000d35', 'DYN', 'Dynamic'],\n 3383: ['0x80000d37', 'SEQ', 'Sequence'],\n 3434: ['0x80000d6a', 'PEPE', 'Pepecoin Core'],\n 3501: ['0x80000dad', 'JFIN', 'JFIN Coin'],\n 3552: ['0x80000de0', 'DEO', 'Destocoin'],\n 3564: ['0x80000dec', 'DST', 'DeStream'],\n 3601: ['0x80000e11', 'CY', 'Cybits'],\n 3757: ['0x80000ead', 'MPC', 'Partisia Blockchain'],\n 3840: ['0x80000f00', 'RED', 'ReDeFi RED'],\n 4040: ['0x80000fc8', 'FC8', 'FCH Network'],\n 4096: ['0x80001000', 'YEE', 'YeeCo'],\n 4218: ['0x8000107a', 'IOTA', 'IOTA'],\n 4219: ['0x8000107b', 'SMR', 'Shimmer'],\n 4242: ['0x80001092', 'AXE', 'Axe'],\n 4343: ['0x800010f7', 'XYM', 'Symbol'],\n 4444: ['0x8000115c', 'C4EI', 'Chain4Energy'],\n 4646: ['0x80001226', 'MST', 'MST'],\n 4919: ['0x80001337', 'XVM', 'Venidium'],\n 4976: ['0x80001370', 'VARA', 'Vara'],\n 4999: ['0x80001387', 'BXN', 'BlackFort Exchange Network'],\n 5000: ['0x80001388', 'V12', 'Vet The Vote'],\n 5006: ['0x8000138e', 'SBC', 'Senior Blockchain'],\n 5248: ['0x80001480', 'FIC', 'FIC'],\n 5353: ['0x800014e9', 'HNS', 'Handshake'],\n 5404: ['0x8000151c', 'ISK', 'ISKRA'],\n 5467: ['0x8000155b', 'ALTME', 'ALTME'],\n 5555: ['0x800015b3', 'FUND', 'Unification'],\n 5757: ['0x8000167d', 'STX', 'Stacks'],\n 5895: ['0x80001707', 'VOW', 'VowChain VOW'],\n 5920: ['0x80001720', 'SLU', 'SILUBIUM'],\n 5995: ['0x8000176B', 'DUSK', 'Dusk Network'],\n 6060: ['0x800017ac', 'GO', 'GoChain GO'],\n 6144: ['0x80001800', 'DTS', 'Datos'],\n 6174: ['0x8000181e', 'MOI', 'My Own Internet'],\n 6278: ['0x80001886', 'STEAMX', 'Rails Network Mainnet'],\n 6532: ['0x80001984', 'UM', 'Penumbra'],\n 6599: ['0x800019c7', 'RSC', 'Royal Sports City'],\n 6666: ['0x80001a0a', 'BPA', 'Bitcoin Pizza'],\n 6688: ['0x80001a20', 'SAFE', 'SAFE'],\n 6779: ['0x80001a7b', 'COTI', 'COTI'],\n 6969: ['0x80001b39', 'ROGER', 'TheHolyrogerCoin'],\n 7000: ['0x80001b58', 'ZETA', 'ZetaChain'],\n 7027: ['0x80001b73', 'ELLA', 'Ella the heart'],\n 7028: ['0x80001b74', 'AA', 'Arthera'],\n 7070: ['0x80001b9e', 'DOI', 'Doichain'],\n 7091: ['0x80001bb3', 'TOPL', 'Topl'],\n 7331: ['0x80001ca3', 'KLY', 'KLYNTAR'],\n 7341: ['0x80001cad', 'SHFT', 'Shyft'],\n 7518: ['0x80001d5e', 'MEV', 'MEVerse'],\n 7576: ['0x80001d98', 'ADIL', 'ADIL Chain'],\n 7777: ['0x80001e61', 'BTV', 'Bitvote'],\n 7779: ['0x80001e63', 'CPV', 'Compverse'],\n 8000: ['0x80001f40', 'SKY', 'Skycoin'],\n 8017: ['0x80001f51', 'ISC', 'iSunCoin'],\n 8080: ['0x80001f90', undefined, 'DSRV'],\n 8181: ['0x80001ff5', 'BOC', 'BeOne Chain'],\n 8192: ['0x80002000', 'PAC', 'pacprotocol'],\n 8217: ['0x80002019', 'KAIA', 'KAIA'],\n 8339: ['0x80002093', 'BTQ', 'BitcoinQuark'],\n 8444: ['0x800020fc', 'XCH', 'Chia'],\n 8453: ['0x80002105', undefined, 'Base'],\n 8520: ['0x80002148', '---', 'reserved'],\n 8680: ['0x800021e8', 'PLMNT', 'Planetmint'],\n 8732: ['0x8000221c', 'BLN', 'Bullions'],\n 8866: ['0x800022a2', 'GGX', 'Golden Gate'],\n 8886: ['0x800022b6', 'GGXT', 'Golden Gate Sydney'],\n 8888: ['0x800022b8', 'SBTC', 'Super Bitcoin'],\n 8964: ['0x80002304', 'NULS', 'NULS'],\n 8997: ['0x80002325', 'BBC', 'Babacoin'],\n 8998: ['0x80002326', 'JGC', 'JagoanCoin'],\n 8999: ['0x80002327', 'BTP', 'Bitcoin Pay'],\n 9000: ['0x80002328', 'AVAX', 'Avalanche'],\n 9001: ['0x80002329', 'ARB1', 'Arbitrum'],\n 9002: ['0x8000232a', 'BOBA', 'Boba'],\n 9003: ['0x8000232b', 'LOOP', 'Loopring'],\n 9004: ['0x8000232c', 'STRK', 'StarkNet'],\n 9005: ['0x8000232d', 'AVAXC', 'Avalanche C-Chain'],\n 9006: ['0x8000232e', 'BSC', 'Binance Smart Chain'],\n 9797: ['0x80002645', 'NRG', 'Energi'],\n 9888: ['0x800026a0', 'BTF', 'Bitcoin Faith'],\n 9969: ['0x800026f1', 'OSMI', 'Osmium'],\n 9999: ['0x8000270f', 'GOD', 'Bitcoin God'],\n 10000: ['0x80002710', 'FO', 'FIBOS'],\n 10001: ['0x80002711', 'SPACE', 'Space'],\n 10007: ['0x80002717', 'S', 'SONIC'],\n 10111: ['0x8000277f', 'DHP', 'dHealth'],\n 10226: ['0x800027f2', 'RTM', 'Raptoreum'],\n 10242: ['0x80002802', 'AA', 'Arthera'],\n 10291: ['0x80002833', 'XRC', 'XRhodium'],\n 10507: ['0x8000290b', 'NUM', 'Numbers Protocol'],\n 10605: ['0x8000296d', 'XPI', 'Lotus'],\n 11111: ['0x80002b67', 'ESS', 'Essentia One'],\n 11742: ['0x80002dde', 'VARCH', 'InvArch'],\n 11743: ['0x80002ddf', 'TNKR', 'Tinkernet'],\n 12345: ['0x80003039', 'IPOS', 'IPOS'],\n 12586: ['0x8000312a', 'MINA', 'Mina'],\n 13107: ['0x80003333', 'BTY', 'BitYuan'],\n 13108: ['0x80003334', 'YCC', 'Yuan Chain Coin'],\n 13381: ['0x80003445', 'PHX', 'Phoenix'],\n 14001: ['0x800036b1', 'WAX', 'Worldwide Asset Exchange'],\n 15845: ['0x80003de5', 'SDGO', 'SanDeGo'],\n 16181: ['0x80003f35', 'XTX', 'Totem Live Network'],\n 16754: ['0x80004172', 'ARDR', 'Ardor'],\n 18000: ['0x80004650', 'MTR', 'Meter'],\n 19165: ['0x80004add', 'SAFE', 'Safecoin'],\n 19167: ['0x80004adf', 'FLUX', 'Flux'],\n 19169: ['0x80004ae1', 'RITO', 'Ritocoin'],\n 19788: ['0x80004d4c', 'ML', 'Mintlayer'],\n 20036: ['0x80004e44', 'XND', 'ndau'],\n 21004: ['0x8000520c', 'C4EI', 'c4ei'],\n 21337: ['0x80005359', 'XAH', 'Xahau'],\n 21888: ['0x80005580', 'PAC', 'Pactus'],\n 22504: ['0x800057e8', 'PWR', 'PWRcoin'],\n 23000: ['0x800059d8', 'EPIC', 'Epic Cash'],\n 25252: ['0x800062a4', 'BELL', 'Bellcoin'],\n 25718: ['0x80006476', 'CHX', 'Own'],\n 26417: ['0x80006731', 'G1', 'Ğ1'],\n 29223: ['0x80007227', 'NEXA', 'Nexa'],\n 30001: ['0x80007531', '---', 'reserved'],\n 31102: ['0x8000797e', 'ESN', 'EtherSocial Network'],\n 31337: ['0x80007a69', undefined, 'ThePower'],\n 33416: ['0x80008288', 'TEO', 'Trust Eth reOrigin'],\n 33878: ['0x80008456', 'BTCS', 'Bitcoin Stake'],\n 34952: ['0x80008888', 'BTT', 'ByteTrade'],\n 37992: ['0x80009468', 'FXTC', 'FixedTradeCoin'],\n 39321: ['0x80009999', 'AMA', 'Amabig'],\n 42069: ['0x8000a455', 'FACT', 'FACT0RN'],\n 43028: ['0x8000a814', 'AXIV', 'AXIV'],\n 47803: ['0x8000babb', 'BAX', 'BAX'],\n 49262: ['0x8000c06e', 'EVE', 'evan'],\n 49344: ['0x8000c0c0', 'STASH', 'STASH'],\n 52752: ['0x8000ce10', 'CELO', 'Celo'],\n 54176: ['0x8000d3a0', 'OVER', 'OverProtocol'],\n 61616: ['0x8000f0b0', 'TH', 'TianHe'],\n 65536: ['0x80010000', 'KETH', 'Krypton World'],\n 69420: ['0x80010f2c', 'GRLC', 'Garlicoin'],\n 70007: ['0x80011177', 'GWL', 'Gewel'],\n 83293: ['0x8001455d', 'QUBIC', 'Qubic'],\n 77777: ['0x80012fd1', 'ZYN', 'Wethio'],\n 88888: ['0x80015b38', 'RYO', 'c0ban'],\n 99999: ['0x8001869f', 'WICC', 'Waykichain'],\n 100500: ['0x80018894', 'HOME', 'HomeCoin'],\n 101010: ['0x80018a92', 'STC', 'Starcoin'],\n 104109: ['0x800196ad', undefined, 'Seed Hypermedia'],\n 105105: ['0x80019a91', 'STRAX', 'Strax'],\n 111111: ['0x8001b207', 'KAS', 'Kaspa'],\n 121337: ['0x8001d9f9', 'KLS', 'Karlsen'],\n 123456: ['0x8001e240', 'SPR', 'Spectre'],\n 130822: ['0x8001ff06', 'WBT', 'WhiteBIT Coin'],\n 161803: ['0x8002780b', 'APTA', 'Bloqs4Good'],\n 200625: ['0x80030fb1', 'AKA', 'Akroma'],\n 200901: ['0x800310c5', 'BTR', 'Bitlayer'],\n 224433: ['0x80036cb1', 'CONET', 'CONET Holesky Network'],\n 246529: ['0x8003c301', 'ATS', 'ARTIS sigma1'],\n 261131: ['0x8003fc0b', 'ZAMA', 'Zama'],\n 314159: ['0x8004cb2f', 'PI', 'Pi Network'],\n 333332: ['0x80051614', 'VALUE', 'Value Chain'],\n 333333: ['0x80051615', 3333, 'Pi Value Consensus'],\n 424242: ['0x80067932', 'X42', 'x42'],\n 440017: ['0x8006b6d1', '@G', 'Graphite'],\n 534352: ['0x80082750', 'SCR', 'Scroll'],\n 666666: ['0x800a2c2a', 'VITE', 'Vite'],\n 696365: ['0x800b3206', 'ICE', 'Ice Network'],\n 888888: ['0x800d9038', 'SEA', 'Second Exchange Alliance'],\n 999999: ['0x800c9061', 'WTC', 'WaltonChain'],\n 1048576: ['0x80100000', 'AMAX', 'Armonia Meta Chain'],\n 1171337: ['0x8011df89', 'ILT', 'iOlite'],\n 1313114: ['0x8014095a', 'ETHO', 'Etho Protocol'],\n 1313500: ['0x80140adc', 'XERO', 'Xerom'],\n 1712144: ['0x801a2010', 'LAX', 'LAPO'],\n 3924011: ['0x803be02b', 'EPK', 'EPIK Protocol'],\n 4741444: ['0x80485944', 'HYD', 'Hydra Token'],\n 5249353: ['0x80501949', 'BCO', 'BitcoinOre'],\n 5249354: ['0x8050194a', 'BHD', 'BitcoinHD'],\n 5264462: ['0x8050544e', 'PTN', 'PalletOne'],\n 5655640: ['0x80564c58', 'VLX', 'Velas'],\n 5718350: ['0x8057414e', 'WAN', 'Wanchain'],\n 5741564: ['0x80579bfc', 'WAVES', 'Waves'],\n 5741565: ['0x80579bfd', 'WEST', 'Waves Enterprise'],\n 6382179: ['0x80616263', 'ABC', 'Abcmint'],\n 6517357: ['0x8063726d', 'CRM', 'Creamcoin'],\n 7171666: ['0x806d6e52', 'BROCK', 'Bitrock'],\n 7562605: ['0x8073656d', 'SEM', 'Semux'],\n 7567736: ['0x80737978', 'ION', 'ION'],\n 7777777: ['0x8076adf1', 'FCT', 'FirmaChain'],\n 7825266: ['0x80776772', 'WGR', 'WGR'],\n 7825267: ['0x80776773', 'OBSR', 'OBServer'],\n 8163271: ['0x807c8fc7', 'AFS', 'ANFS'],\n 10000118: ['0x805d30b6', 'OSMO', 'Osmosis'],\n 15118976: ['0x80e6b280', 'XDS', 'XDS'],\n 19000118: ['0x8121eb36', 'SEI', 'SEI'],\n 61717561: ['0x83adbc39', 'AQUA', 'Aquachain'],\n 77777777: ['0x84a2cb71', 'AZT', 'Aztecoin'],\n 88888888: ['0x854c5638', 'HATCH', 'Hatch'],\n 91927009: ['0x857ab1e1', 'kUSD', 'kUSD'],\n 99999996: ['0x85f5e0fc', 'GENS', 'GENS'],\n 99999997: ['0x85f5e0fd', 'EQ', 'EQ'],\n 99999998: ['0x85f5e0fe', 'FLUID', 'Fluid Chains'],\n 99999999: ['0x85f5e0ff', 'QKC', 'QuarkChain'],\n 11259375: ['0x80abcdef', 'LBR', '0L'],\n 20230101: ['0x8134afd5', 'ROH', 'Rooch'],\n 20240430: ['0x8134d82e', 'NLK', 'NuLinkCoin'],\n 608589380: ['0xa4465644', 'FVDC', 'ForumCoin'],\n 1179993420: ['0xc655454c', undefined, 'Fuel'],\n 1179993421: ['0xc655454d', 'TTNC', 'TakeTitan'],\n 1179993431: ['0xc6554557', 'MTGBP', 'MTGBP'],\n 1179993441: ['0xc6554561', 'QFS', 'Qfs'],\n 1179993451: ['0xc655456b', 'RWA', 'Asset Chain']\n}\n"]} \ No newline at end of file +{"version":3,"file":"coinType.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/const/coinType.ts"],"names":[],"mappings":"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","sourcesContent":["export const registeredCoinTypes: { [n: number]: any[] } = {\n 0: ['0x80000000', 'BTC', 'Bitcoin'],\n 1: ['0x80000001', undefined, 'Testnet'],\n 2: ['0x80000002', 'LTC', 'Litecoin'],\n 3: ['0x80000003', 'DOGE', 'Dogecoin'],\n 4: ['0x80000004', 'RDD', 'Reddcoin'],\n 5: ['0x80000005', 'DASH', 'Dash'],\n 6: ['0x80000006', 'PPC', 'Peercoin'],\n 7: ['0x80000007', 'NMC', 'Namecoin'],\n 8: ['0x80000008', 'FTC', 'Feathercoin'],\n 9: ['0x80000009', 'XCP', 'Counterparty'],\n 10: ['0x8000000a', 'BLK', 'Blackcoin'],\n 11: ['0x8000000b', 'NSR', 'NuShares'],\n 12: ['0x8000000c', 'NBT', 'NuBits'],\n 13: ['0x8000000d', 'MZC', 'Mazacoin'],\n 14: ['0x8000000e', 'VIA', 'Viacoin'],\n 15: ['0x8000000f', 'XCH', 'ClearingHouse'],\n 16: ['0x80000010', 'RBY', 'Rubycoin'],\n 17: ['0x80000011', 'GRS', 'Groestlcoin'],\n 18: ['0x80000012', 'DGC', 'Digitalcoin'],\n 19: ['0x80000013', 'CCN', 'Cannacoin'],\n 20: ['0x80000014', 'DGB', 'DigiByte'],\n 21: ['0x80000015', 'Open Assets'],\n 22: ['0x80000016', 'MONA', 'Monacoin'],\n 23: ['0x80000017', 'CLAM', 'Clams'],\n 24: ['0x80000018', 'XPM', 'Primecoin'],\n 25: ['0x80000019', 'NEOS', 'Neoscoin'],\n 26: ['0x8000001a', 'JBS', 'Jumbucks'],\n 27: ['0x8000001b', 'ZRC', 'ziftrCOIN'],\n 28: ['0x8000001c', 'VTC', 'Vertcoin'],\n 29: ['0x8000001d', 'NXT', 'NXT'],\n 30: ['0x8000001e', 'BURST', 'Burst'],\n 31: ['0x8000001f', 'MUE', 'MonetaryUnit'],\n 32: ['0x80000020', 'ZOOM', 'Zoom'],\n 33: ['0x80000021', 'VASH', 'Virtual Cash'],\n 34: ['0x80000022', 'CDN', 'Canada eCoin'],\n 35: ['0x80000023', 'SDC', 'ShadowCash'],\n 36: ['0x80000024', 'PKB', 'ParkByte'],\n 37: ['0x80000025', 'PND', 'Pandacoin'],\n 38: ['0x80000026', 'START', 'StartCOIN'],\n 39: ['0x80000027', 'MOIN', 'MOIN'],\n 40: ['0x80000028', 'EXP', 'Expanse'],\n 41: ['0x80000029', 'EMC2', 'Einsteinium'],\n 42: ['0x8000002a', 'DCR', 'Decred'],\n 43: ['0x8000002b', 'XEM', 'NEM'],\n 44: ['0x8000002c', 'PART', 'Particl'],\n 45: ['0x8000002d', 'ARG', 'Argentum (dead)'],\n 46: ['0x8000002e', 'Libertas'],\n 47: ['0x8000002f', 'Posw coin'],\n 48: ['0x80000030', 'SHR', 'Shreeji'],\n 49: ['0x80000031', 'GCR', 'Global Currency Reserve'],\n 50: ['0x80000032', 'NVC', 'Novacoin'],\n 51: ['0x80000033', 'AC', 'Asiacoin'],\n 52: ['0x80000034', 'BTCD', 'BitcoinDark'],\n 53: ['0x80000035', 'DOPE', 'Dopecoin'],\n 54: ['0x80000036', 'TPC', 'Templecoin'],\n 55: ['0x80000037', 'AIB', 'AIB'],\n 56: ['0x80000038', 'EDRC', 'EDRCoin'],\n 57: ['0x80000039', 'SYS', 'Syscoin'],\n 58: ['0x8000003a', 'SLR', 'Solarcoin'],\n 59: ['0x8000003b', 'SMLY', 'Smileycoin'],\n 60: ['0x8000003c', 'ETH', 'Ether'],\n 61: ['0x8000003d', 'ETC', 'Ether Classic'],\n 62: ['0x8000003e', 'PSB', 'Pesobit'],\n 63: ['0x8000003f', 'LDCN', 'Landcoin (dead)'],\n 64: ['0x80000040', 'Open Chain'],\n 65: ['0x80000041', 'XBC', 'Bitcoinplus'],\n 66: ['0x80000042', 'IOP', 'Internet of People'],\n 67: ['0x80000043', 'NXS', 'Nexus'],\n 68: ['0x80000044', 'INSN', 'InsaneCoin'],\n 69: ['0x80000045', 'OK', 'OKCash'],\n 70: ['0x80000046', 'BRIT', 'BritCoin'],\n 71: ['0x80000047', 'CMP', 'Compcoin'],\n 72: ['0x80000048', 'CRW', 'Crown'],\n 73: ['0x80000049', 'BELA', 'BelaCoin'],\n 74: ['0x8000004a', 'ICX', 'ICON'],\n 75: ['0x8000004b', 'FJC', 'FujiCoin'],\n 76: ['0x8000004c', 'MIX', 'MIX'],\n 77: ['0x8000004d', 'XVG', 'Verge Currency'],\n 78: ['0x8000004e', 'EFL', 'Electronic Gulden'],\n 79: ['0x8000004f', 'CLUB', 'ClubCoin'],\n 80: ['0x80000050', 'RICHX', 'RichCoin'],\n 81: ['0x80000051', 'POT', 'Potcoin'],\n 82: ['0x80000052', 'QRK', 'Quarkcoin'],\n 83: ['0x80000053', 'TRC', 'Terracoin'],\n 84: ['0x80000054', 'GRC', 'Gridcoin'],\n 85: ['0x80000055', 'AUR', 'Auroracoin'],\n 86: ['0x80000056', 'IXC', 'IXCoin'],\n 87: ['0x80000057', 'NLG', 'Gulden'],\n 88: ['0x80000058', 'BITB', 'BitBean'],\n 89: ['0x80000059', 'BTA', 'Bata'],\n 90: ['0x8000005a', 'XMY', 'Myriadcoin'],\n 91: ['0x8000005b', 'BSD', 'BitSend'],\n 92: ['0x8000005c', 'UNO', 'Unobtanium'],\n 93: ['0x8000005d', 'MTR', 'MasterTrader'],\n 94: ['0x8000005e', 'GB', 'GoldBlocks'],\n 95: ['0x8000005f', 'SHM', 'Saham'],\n 96: ['0x80000060', 'CRX', 'Chronos'],\n 97: ['0x80000061', 'BIQ', 'Ubiquoin'],\n 98: ['0x80000062', 'EVO', 'Evotion'],\n 99: ['0x80000063', 'STO', 'SaveTheOcean'],\n 100: ['0x80000064', 'BIGUP', 'BigUp'],\n 101: ['0x80000065', 'GAME', 'GameCredits'],\n 102: ['0x80000066', 'DLC', 'Dollarcoins'],\n 103: ['0x80000067', 'ZYD', 'Zayedcoin'],\n 104: ['0x80000068', 'DBIC', 'Dubaicoin'],\n 105: ['0x80000069', 'STRAT', 'Stratis'],\n 106: ['0x8000006a', 'SH', 'Shilling'],\n 107: ['0x8000006b', 'MARS', 'MarsCoin'],\n 108: ['0x8000006c', 'UBQ', 'Ubiq'],\n 109: ['0x8000006d', 'PTC', 'Pesetacoin'],\n 110: ['0x8000006e', 'NRO', 'Neurocoin'],\n 111: ['0x8000006f', 'ARK', 'ARK'],\n 112: ['0x80000070', 'USC', 'UltimateSecureCashMain'],\n 113: ['0x80000071', 'THC', 'Hempcoin'],\n 114: ['0x80000072', 'LINX', 'Linx'],\n 115: ['0x80000073', 'ECN', 'Ecoin'],\n 116: ['0x80000074', 'DNR', 'Denarius'],\n 117: ['0x80000075', 'PINK', 'Pinkcoin'],\n 118: ['0x80000076', 'ATOM', 'Atom'],\n 119: ['0x80000077', 'PIVX', 'Pivx'],\n 120: ['0x80000078', 'FLASH', 'Flashcoin'],\n 121: ['0x80000079', 'ZEN', 'Zencash'],\n 122: ['0x8000007a', 'PUT', 'Putincoin'],\n 123: ['0x8000007b', 'ZNY', 'BitZeny'],\n 124: ['0x8000007c', 'UNIFY', 'Unify'],\n 125: ['0x8000007d', 'XST', 'StealthCoin'],\n 126: ['0x8000007e', 'BRK', 'Breakout Coin'],\n 127: ['0x8000007f', 'VC', 'Vcash'],\n 128: ['0x80000080', 'XMR', 'Monero'],\n 129: ['0x80000081', 'VOX', 'Voxels'],\n 130: ['0x80000082', 'NAV', 'NavCoin'],\n 131: ['0x80000083', 'FCT', 'Factom Factoids'],\n 132: ['0x80000084', 'EC', 'Factom Entry Credits'],\n 133: ['0x80000085', 'ZEC', 'Zcash'],\n 134: ['0x80000086', 'LSK', 'Lisk'],\n 135: ['0x80000087', 'STEEM', 'Steem'],\n 136: ['0x80000088', 'XZC', 'ZCoin'],\n 137: ['0x80000089', 'RBTC', 'Rootstock'],\n '138': ['0x8000008a', 'Giftblock'],\n 139: ['0x8000008b', 'RPT', 'RealPointCoin'],\n 140: ['0x8000008c', 'LBC', 'LBRY Credits'],\n 141: ['0x8000008d', 'KMD', 'Komodo'],\n 142: ['0x8000008e', 'BSQ', 'bisq Token'],\n 143: ['0x8000008f', 'RIC', 'Riecoin'],\n 144: ['0x80000090', 'XRP', 'XRP'],\n 145: ['0x80000091', 'BCH', 'Bitcoin Cash'],\n 146: ['0x80000092', 'NEBL', 'Neblio'],\n 147: ['0x80000093', 'ZCL', 'ZClassic'],\n 148: ['0x80000094', 'XLM', 'Stellar Lumens'],\n 149: ['0x80000095', 'NLC2', 'NoLimitCoin2'],\n 150: ['0x80000096', 'WHL', 'WhaleCoin'],\n 151: ['0x80000097', 'ERC', 'EuropeCoin'],\n 152: ['0x80000098', 'DMD', 'Diamond'],\n 153: ['0x80000099', 'BTM', 'Bytom'],\n 154: ['0x8000009a', 'BIO', 'Biocoin'],\n 155: ['0x8000009b', 'XWCC', 'Whitecoin Classic'],\n 156: ['0x8000009c', 'BTG', 'Bitcoin Gold'],\n 157: ['0x8000009d', 'BTC2X', 'Bitcoin 2x'],\n 158: ['0x8000009e', 'SSN', 'SuperSkynet'],\n 159: ['0x8000009f', 'TOA', 'TOACoin'],\n 160: ['0x800000a0', 'BTX', 'Bitcore'],\n 161: ['0x800000a1', 'ACC', 'Adcoin'],\n 162: ['0x800000a2', 'BCO', 'Bridgecoin'],\n 163: ['0x800000a3', 'ELLA', 'Ellaism'],\n 164: ['0x800000a4', 'PIRL', 'Pirl'],\n 165: ['0x800000a5', 'XNO', 'Nano'],\n 166: ['0x800000a6', 'VIVO', 'Vivo'],\n 167: ['0x800000a7', 'FRST', 'Firstcoin'],\n 168: ['0x800000a8', 'HNC', 'Helleniccoin'],\n 169: ['0x800000a9', 'BUZZ', 'BUZZ'],\n 170: ['0x800000aa', 'MBRS', 'Ember'],\n 171: ['0x800000ab', 'HC', 'Hcash'],\n 172: ['0x800000ac', 'HTML', 'HTMLCOIN'],\n 173: ['0x800000ad', 'ODN', 'Obsidian'],\n 174: ['0x800000ae', 'ONX', 'OnixCoin'],\n 175: ['0x800000af', 'RVN', 'Ravencoin'],\n 176: ['0x800000b0', 'GBX', 'GoByte'],\n 177: ['0x800000b1', 'BTCZ', 'BitcoinZ'],\n 178: ['0x800000b2', 'POA', 'Poa'],\n 179: ['0x800000b3', 'NYC', 'NewYorkCoin'],\n 180: ['0x800000b4', 'MXT', 'MarteXcoin'],\n 181: ['0x800000b5', 'WC', 'Wincoin'],\n 182: ['0x800000b6', 'MNX', 'Minexcoin'],\n 183: ['0x800000b7', 'BTCP', 'Bitcoin Private'],\n 184: ['0x800000b8', 'MUSIC', 'Musicoin'],\n 185: ['0x800000b9', 'BCA', 'Bitcoin Atom'],\n 186: ['0x800000ba', 'CRAVE', 'Crave'],\n 187: ['0x800000bb', 'STAK', 'STRAKS'],\n 188: ['0x800000bc', 'WBTC', 'World Bitcoin'],\n 189: ['0x800000bd', 'LCH', 'LiteCash'],\n 190: ['0x800000be', 'EXCL', 'ExclusiveCoin'],\n '191': ['0x800000bf', 'Lynx'],\n 192: ['0x800000c0', 'LCC', 'LitecoinCash'],\n 193: ['0x800000c1', 'XFE', 'Feirm'],\n 194: ['0x800000c2', 'EOS', 'EOS'],\n 195: ['0x800000c3', 'TRX', 'Tron'],\n 196: ['0x800000c4', 'KOBO', 'Kobocoin'],\n 197: ['0x800000c5', 'HUSH', 'HUSH'],\n 198: ['0x800000c6', 'BAN', 'Banano'],\n 199: ['0x800000c7', 'ETF', 'ETF'],\n 200: ['0x800000c8', 'OMNI', 'Omni'],\n 201: ['0x800000c9', 'BIFI', 'BitcoinFile'],\n 202: ['0x800000ca', 'UFO', 'Uniform Fiscal Object'],\n 203: ['0x800000cb', 'CNMC', 'Cryptonodes'],\n 204: ['0x800000cc', 'BCN', 'Bytecoin'],\n 205: ['0x800000cd', 'RIN', 'Ringo'],\n 206: ['0x800000ce', 'ATP', 'Alaya'],\n 207: ['0x800000cf', 'EVT', 'everiToken'],\n 208: ['0x800000d0', 'ATN', 'ATN'],\n 209: ['0x800000d1', 'BIS', 'Bismuth'],\n 210: ['0x800000d2', 'NEET', 'NEETCOIN'],\n 211: ['0x800000d3', 'BOPO', 'BopoChain'],\n 212: ['0x800000d4', 'OOT', 'Utrum'],\n 213: ['0x800000d5', 'ALIAS', 'Alias'],\n 214: ['0x800000d6', 'MONK', 'Monkey Project'],\n 215: ['0x800000d7', 'BOXY', 'BoxyCoin'],\n 216: ['0x800000d8', 'FLO', 'Flo'],\n 217: ['0x800000d9', 'MEC', 'Megacoin'],\n 218: ['0x800000da', 'BTDX', 'BitCloud'],\n 219: ['0x800000db', 'XAX', 'Artax'],\n 220: ['0x800000dc', 'ANON', 'ANON'],\n 221: ['0x800000dd', 'LTZ', 'LitecoinZ'],\n 222: ['0x800000de', 'BITG', 'Bitcoin Green'],\n 223: ['0x800000df', 'ICP', 'Internet Computer (DFINITY)'],\n 224: ['0x800000e0', 'SMART', 'Smartcash'],\n 225: ['0x800000e1', 'XUEZ', 'XUEZ'],\n 226: ['0x800000e2', 'HLM', 'Helium'],\n 227: ['0x800000e3', 'WEB', 'Webchain'],\n 228: ['0x800000e4', 'ACM', 'Actinium'],\n 229: ['0x800000e5', 'NOS', 'NOS Stable Coins'],\n 230: ['0x800000e6', 'BITC', 'BitCash'],\n 231: ['0x800000e7', 'HTH', 'Help The Homeless Coin'],\n 232: ['0x800000e8', 'TZC', 'Trezarcoin'],\n 233: ['0x800000e9', 'VAR', 'Varda'],\n 234: ['0x800000ea', 'IOV', 'IOV'],\n 235: ['0x800000eb', 'FIO', 'FIO'],\n 236: ['0x800000ec', 'BSV', 'BitcoinSV'],\n 237: ['0x800000ed', 'DXN', 'DEXON'],\n 238: ['0x800000ee', 'QRL', 'Quantum Resistant Ledger'],\n 239: ['0x800000ef', 'PCX', 'ChainX'],\n 240: ['0x800000f0', 'LOKI', 'Loki'],\n '241': ['0x800000f1', 'Imagewallet'],\n 242: ['0x800000f2', 'NIM', 'Nimiq'],\n 243: ['0x800000f3', 'SOV', 'Sovereign Coin'],\n 244: ['0x800000f4', 'JCT', 'Jibital Coin'],\n 245: ['0x800000f5', 'SLP', 'Simple Ledger Protocol'],\n 246: ['0x800000f6', 'EWT', 'Energy Web'],\n 247: ['0x800000f7', 'UC', 'Ulord'],\n 248: ['0x800000f8', 'EXOS', 'EXOS'],\n 249: ['0x800000f9', 'ECA', 'Electra'],\n 250: ['0x800000fa', 'SOOM', 'Soom'],\n 251: ['0x800000fb', 'XRD', 'Redstone'],\n 252: ['0x800000fc', 'FREE', 'FreeCoin'],\n 253: ['0x800000fd', 'NPW', 'NewPowerCoin'],\n 254: ['0x800000fe', 'BST', 'BlockStamp'],\n '255': ['0x800000ff', 'SmartHoldem'],\n 256: ['0x80000100', 'NANO', 'Bitcoin Nano'],\n 257: ['0x80000101', 'BTCC', 'Bitcoin Core'],\n 258: ['0x80000102', 'Zen Protocol'],\n 259: ['0x80000103', 'ZEST', 'Zest'],\n 260: ['0x80000104', 'ABT', 'ArcBlock'],\n 261: ['0x80000105', 'PION', 'Pion'],\n 262: ['0x80000106', 'DT3', 'DreamTeam3'],\n 263: ['0x80000107', 'ZBUX', 'Zbux'],\n 264: ['0x80000108', 'KPL', 'Kepler'],\n 265: ['0x80000109', 'TPAY', 'TokenPay'],\n 266: ['0x8000010a', 'ZILLA', 'ChainZilla'],\n 267: ['0x8000010b', 'ANK', 'Anker'],\n 268: ['0x8000010c', 'BCC', 'BCChain'],\n 269: ['0x8000010d', 'HPB', 'HPB'],\n 270: ['0x8000010e', 'ONE', 'ONE'],\n 271: ['0x8000010f', 'SBC', 'SBC'],\n 272: ['0x80000110', 'IPC', 'IPChain'],\n 273: ['0x80000111', 'DMTC', 'Dominantchain'],\n 274: ['0x80000112', 'OGC', 'Onegram'],\n 275: ['0x80000113', 'SHIT', 'Shitcoin'],\n 276: ['0x80000114', 'ANDES', 'Andescoin'],\n 277: ['0x80000115', 'AREPA', 'Arepacoin'],\n 278: ['0x80000116', 'BOLI', 'Bolivarcoin'],\n 279: ['0x80000117', 'RIL', 'Rilcoin'],\n 280: ['0x80000118', 'HTR', 'Hathor Network'],\n 281: ['0x80000119', 'ACME', 'Accumulate'],\n 282: ['0x8000011a', 'BRAVO', 'BRAVO'],\n 283: ['0x8000011b', 'ALGO', 'Algorand'],\n 284: ['0x8000011c', 'BZX', 'Bitcoinzero'],\n 285: ['0x8000011d', 'GXX', 'GravityCoin'],\n 286: ['0x8000011e', 'HEAT', 'HEAT'],\n 287: ['0x8000011f', 'XDN', 'DigitalNote'],\n 288: ['0x80000120', 'FSN', 'FUSION'],\n 289: ['0x80000121', 'CPC', 'Capricoin'],\n 290: ['0x80000122', 'BOLD', 'Bold'],\n 291: ['0x80000123', 'IOST', 'IOST'],\n 292: ['0x80000124', 'TKEY', 'Tkeycoin'],\n 293: ['0x80000125', 'USE', 'Usechain'],\n 294: ['0x80000126', 'BCZ', 'BitcoinCZ'],\n 295: ['0x80000127', 'IOC', 'Iocoin'],\n 296: ['0x80000128', 'ASF', 'Asofe'],\n 297: ['0x80000129', 'MASS', 'MASS'],\n 298: ['0x8000012a', 'FAIR', 'FairCoin'],\n 299: ['0x8000012b', 'NUKO', 'Nekonium'],\n 300: ['0x8000012c', 'GNX', 'Genaro Network'],\n 301: ['0x8000012d', 'DIVI', 'Divi Project'],\n 302: ['0x8000012e', 'CMT', 'Community'],\n 303: ['0x8000012f', 'EUNO', 'EUNO'],\n 304: ['0x80000130', 'IOTX', 'IoTeX'],\n 305: ['0x80000131', 'ONION', 'DeepOnion'],\n 306: ['0x80000132', '8BIT', '8Bit'],\n 307: ['0x80000133', 'ATC', 'AToken Coin'],\n 308: ['0x80000134', 'BTS', 'Bitshares'],\n 309: ['0x80000135', 'CKB', 'Nervos CKB'],\n 310: ['0x80000136', 'UGAS', 'Ultrain'],\n 311: ['0x80000137', 'ADS', 'Adshares'],\n 312: ['0x80000138', 'ARA', 'Aura'],\n 313: ['0x80000139', 'ZIL', 'Zilliqa'],\n 314: ['0x8000013a', 'MOAC', 'MOAC'],\n 315: ['0x8000013b', 'SWTC', 'SWTC'],\n 316: ['0x8000013c', 'VNSC', 'vnscoin'],\n 317: ['0x8000013d', 'PLUG', 'Pl ^ g'],\n 318: ['0x8000013e', 'MAN', 'Matrix AI Network'],\n 319: ['0x8000013f', 'ECC', 'ECCoin'],\n 320: ['0x80000140', 'RPD', 'Rapids'],\n 321: ['0x80000141', 'RAP', 'Rapture'],\n 322: ['0x80000142', 'GARD', 'Hashgard'],\n 323: ['0x80000143', 'ZER', 'Zero'],\n 324: ['0x80000144', 'EBST', 'eBoost'],\n 325: ['0x80000145', 'SHARD', 'Shard'],\n 326: ['0x80000146', 'MRX', 'Metrix Coin'],\n 327: ['0x80000147', 'CMM', 'Commercium'],\n 328: ['0x80000148', 'BLOCK', 'Blocknet'],\n 329: ['0x80000149', 'AUDAX', 'AUDAX'],\n 330: ['0x8000014a', 'LUNA', 'Terra'],\n 331: ['0x8000014b', 'ZPM', 'zPrime'],\n 332: ['0x8000014c', 'KUVA', 'Kuva Utility Note'],\n 333: ['0x8000014d', 'MEM', 'MemCoin'],\n 334: ['0x8000014e', 'CS', 'Credits'],\n 335: ['0x8000014f', 'SWIFT', 'SwiftCash'],\n 336: ['0x80000150', 'FIX', 'FIX'],\n 337: ['0x80000151', 'CPC', 'CPChain'],\n 338: ['0x80000152', 'VGO', 'VirtualGoodsToken'],\n 339: ['0x80000153', 'DVT', 'DeVault'],\n 340: ['0x80000154', 'N8V', 'N8VCoin'],\n 341: ['0x80000155', 'MTNS', 'OmotenashiCoin'],\n 342: ['0x80000156', 'BLAST', 'BLAST'],\n 343: ['0x80000157', 'DCT', 'DECENT'],\n 344: ['0x80000158', 'AUX', 'Auxilium'],\n 345: ['0x80000159', 'USDP', 'USDP'],\n 346: ['0x8000015a', 'HTDF', 'HTDF'],\n 347: ['0x8000015b', 'YEC', 'Ycash'],\n 348: ['0x8000015c', 'QLC', 'QLC Chain'],\n 349: ['0x8000015d', 'TEA', 'Icetea Blockchain'],\n 350: ['0x8000015e', 'ARW', 'ArrowChain'],\n 351: ['0x8000015f', 'MDM', 'Medium'],\n 352: ['0x80000160', 'CYB', 'Cybex'],\n 353: ['0x80000161', 'LTO', 'LTO Network'],\n 354: ['0x80000162', 'DOT', 'Polkadot'],\n 355: ['0x80000163', 'AEON', 'Aeon'],\n 356: ['0x80000164', 'RES', 'Resistance'],\n 357: ['0x80000165', 'AYA', 'Aryacoin'],\n 358: ['0x80000166', 'DAPS', 'Dapscoin'],\n 359: ['0x80000167', 'CSC', 'CasinoCoin'],\n 360: ['0x80000168', 'VSYS', 'V Systems'],\n 361: ['0x80000169', 'NOLLAR', 'Nollar'],\n 362: ['0x8000016a', 'XNOS', 'NOS'],\n 363: ['0x8000016b', 'CPU', 'CPUchain'],\n 364: ['0x8000016c', 'LAMB', 'Lambda Storage Chain'],\n 365: ['0x8000016d', 'VCT', 'ValueCyber'],\n 366: ['0x8000016e', 'CZR', 'Canonchain'],\n 367: ['0x8000016f', 'ABBC', 'ABBC'],\n 368: ['0x80000170', 'HET', 'HET'],\n 369: ['0x80000171', 'XAS', 'Asch'],\n 370: ['0x80000172', 'VDL', 'Vidulum'],\n 371: ['0x80000173', 'MED', 'MediBloc'],\n 372: ['0x80000174', 'ZVC', 'ZVChain'],\n 373: ['0x80000175', 'VESTX', 'Vestx'],\n 374: ['0x80000176', 'DBT', 'DarkBit'],\n 375: ['0x80000177', 'SEOS', 'SuperEOS'],\n 376: ['0x80000178', 'MXW', 'Maxonrow'],\n 377: ['0x80000179', 'ZNZ', 'ZENZO'],\n 378: ['0x8000017a', 'XCX', 'XChain'],\n 379: ['0x8000017b', 'SOX', 'SonicX'],\n 380: ['0x8000017c', 'NYZO', 'Nyzo'],\n 381: ['0x8000017d', 'ULC', 'ULCoin'],\n 382: ['0x8000017e', 'RYO', 'Ryo Currency'],\n 383: ['0x8000017f', 'KAL', 'Kaleidochain'],\n 384: ['0x80000180', 'XSN', 'Stakenet'],\n 385: ['0x80000181', 'DOGEC', 'DogeCash'],\n 386: ['0x80000182', 'BMV', \"Bitcoin Matteo\\\\'s Vision\"],\n 387: ['0x80000183', 'QBC', 'Quebecoin'],\n 388: ['0x80000184', 'IMG', 'ImageCoin'],\n 389: ['0x80000185', 'QOS', 'QOS'],\n 390: ['0x80000186', 'PKT', 'PKT'],\n 391: ['0x80000187', 'LHD', 'LitecoinHD'],\n 392: ['0x80000188', 'CENNZ', 'CENNZnet'],\n 393: ['0x80000189', 'HSN', 'Hyper Speed Network'],\n 394: ['0x8000018a', 'CRO', 'Crypto Chain'],\n 395: ['0x8000018b', 'UMBRU', 'Umbru'],\n 396: ['0x8000018c', 'EVER', 'Everscale'],\n 397: ['0x8000018d', 'NEAR', 'NEAR Protocol'],\n 398: ['0x8000018e', 'XPC', 'XPChain'],\n 399: ['0x8000018f', 'ZOC', '01coin'],\n 400: ['0x80000190', 'NIX', 'NIX'],\n 401: ['0x80000191', 'UC', 'Utopiacoin'],\n 402: ['0x80000192', 'GALI', 'Galilel'],\n 403: ['0x80000193', 'OLT', 'Oneledger'],\n 404: ['0x80000194', 'XBI', 'XBI'],\n 405: ['0x80000195', 'DONU', 'DONU'],\n 406: ['0x80000196', 'EARTHS', 'Earths'],\n 407: ['0x80000197', 'HDD', 'HDDCash'],\n 408: ['0x80000198', 'SUGAR', 'Sugarchain'],\n 409: ['0x80000199', 'AILE', 'AileCoin'],\n 410: ['0x8000019a', 'TENT', 'TENT'],\n 411: ['0x8000019b', 'TAN', 'Tangerine Network'],\n 412: ['0x8000019c', 'AIN', 'AIN'],\n 413: ['0x8000019d', 'MSR', 'Masari'],\n 414: ['0x8000019e', 'SUMO', 'Sumokoin'],\n 415: ['0x8000019f', 'ETN', 'Electroneum'],\n 416: ['0x800001a0', 'BYTZ', 'BYTZ'],\n 417: ['0x800001a1', 'WOW', 'Wownero'],\n 418: ['0x800001a2', 'XTNC', 'XtendCash'],\n 419: ['0x800001a3', 'LTHN', 'Lethean'],\n 420: ['0x800001a4', 'NODE', 'NodeHost'],\n 421: ['0x800001a5', 'AGM', 'Argoneum'],\n 422: ['0x800001a6', 'CCX', 'Conceal Network'],\n 423: ['0x800001a7', 'TNET', 'Title Network'],\n 424: ['0x800001a8', 'TELOS', 'TelosCoin'],\n 425: ['0x800001a9', 'AION', 'Aion'],\n 426: ['0x800001aa', 'BC', 'Bitcoin Confidential'],\n 427: ['0x800001ab', 'KTV', 'KmushiCoin'],\n 428: ['0x800001ac', 'ZCR', 'ZCore'],\n 429: ['0x800001ad', 'ERG', 'Ergo'],\n 430: ['0x800001ae', 'PESO', 'Criptopeso'],\n 431: ['0x800001af', 'BTC2', 'Bitcoin 2'],\n 432: ['0x800001b0', 'XRPHD', 'XRPHD'],\n 433: ['0x800001b1', 'WE', 'WE Coin'],\n 434: ['0x800001b2', 'KSM', 'Kusama'],\n 435: ['0x800001b3', 'PCN', 'Peepcoin'],\n 436: ['0x800001b4', 'NCH', 'NetCloth'],\n 437: ['0x800001b5', 'ICU', 'CHIPO'],\n 438: ['0x800001b6', 'FNSA', 'FINSCHIA'],\n 439: ['0x800001b7', 'DTP', 'DeVault Token Protocol'],\n 440: ['0x800001b8', 'BTCR', 'Bitcoin Royale'],\n 441: ['0x800001b9', 'AERGO', 'AERGO'],\n 442: ['0x800001ba', 'XTH', 'Dothereum'],\n 443: ['0x800001bb', 'LV', 'Lava'],\n 444: ['0x800001bc', 'PHR', 'Phore'],\n 445: ['0x800001bd', 'VITAE', 'Vitae'],\n 446: ['0x800001be', 'COCOS', 'Cocos - BCX'],\n 447: ['0x800001bf', 'DIN', 'Dinero'],\n 448: ['0x800001c0', 'SPL', 'Simplicity'],\n 449: ['0x800001c1', 'YCE', 'MYCE'],\n 450: ['0x800001c2', 'XLR', 'Solaris'],\n 451: ['0x800001c3', 'KTS', 'Klimatas'],\n 452: ['0x800001c4', 'DGLD', 'DGLD'],\n 453: ['0x800001c5', 'XNS', 'Insolar'],\n 454: ['0x800001c6', 'EM', 'EMPOW'],\n 455: ['0x800001c7', 'SHN', 'ShineBlocks'],\n 456: ['0x800001c8', 'SEELE', 'Seele'],\n 457: ['0x800001c9', 'AE', 'æternity'],\n 458: ['0x800001ca', 'ODX', 'ObsidianX'],\n 459: ['0x800001cb', 'KAVA', 'Kava'],\n 460: ['0x800001cc', 'GLEEC', 'GLEEC'],\n 461: ['0x800001cd', 'FIL', 'Filecoin'],\n 462: ['0x800001ce', 'RUTA', 'Rutanio'],\n 463: ['0x800001cf', 'CSDT', 'CSDT'],\n 464: ['0x800001d0', 'ETI', 'EtherInc'],\n 465: ['0x800001d1', 'ZSLP', 'Zclassic Simple Ledger Protocol'],\n 466: ['0x800001d2', 'ERE', 'EtherCore'],\n 467: ['0x800001d3', 'DX', 'DxChain Token'],\n 468: ['0x800001d4', 'CPS', 'Capricoin+'],\n 469: ['0x800001d5', 'BTH', 'Bithereum'],\n 470: ['0x800001d6', 'MESG', 'MESG'],\n 471: ['0x800001d7', 'FIMK', 'FIMK'],\n 472: ['0x800001d8', 'AR', 'Arweave'],\n 473: ['0x800001d9', 'OGO', 'Origo'],\n 474: ['0x800001da', 'ROSE', 'Oasis Network'],\n 475: ['0x800001db', 'BARE', 'BARE Network'],\n 476: ['0x800001dc', 'GLEEC', 'GleecBTC'],\n 477: ['0x800001dd', 'CLR', 'Color Coin'],\n 478: ['0x800001de', 'RNG', 'Ring'],\n 479: ['0x800001df', 'OLO', 'Tool Global'],\n 480: ['0x800001e0', 'PEXA', 'Pexa'],\n 481: ['0x800001e1', 'MOON', 'Mooncoin'],\n 482: ['0x800001e2', 'OCEAN', 'Ocean Protocol'],\n 483: ['0x800001e3', 'BNT', 'Bluzelle Native'],\n 484: ['0x800001e4', 'AMO', 'AMO Blockchain'],\n 485: ['0x800001e5', 'FCH', 'FreeCash'],\n 486: ['0x800001e6', 'LAT', 'PlatON'],\n 487: ['0x800001e7', 'COIN', 'Bitcoin Bank'],\n 488: ['0x800001e8', 'VEO', 'Amoveo'],\n 489: ['0x800001e9', 'CCA', 'Counos Coin'],\n 490: ['0x800001ea', 'GFN', 'Graphene'],\n 491: ['0x800001eb', 'BIP', 'Minter Network'],\n 492: ['0x800001ec', 'KPG', 'Kunpeng Network'],\n 493: ['0x800001ed', 'FIN', 'FINL Chain'],\n 494: ['0x800001ee', 'BAND', 'Band'],\n 495: ['0x800001ef', 'DROP', 'Dropil'],\n 496: ['0x800001f0', 'BHT', 'Bluehelix Chain'],\n 497: ['0x800001f1', 'LYRA', 'Scrypta'],\n 498: ['0x800001f2', 'CS', 'Credits'],\n 499: ['0x800001f3', 'RUPX', 'Rupaya'],\n 500: ['0x800001f4', 'THETA', 'Theta'],\n 501: ['0x800001f5', 'SOL', 'Solana'],\n 502: ['0x800001f6', 'THT', 'ThoughtAI'],\n 503: ['0x800001f7', 'CFX', 'Conflux'],\n 504: ['0x800001f8', 'KUMA', 'Kumacoin'],\n 505: ['0x800001f9', 'HASH', 'Provenance'],\n 506: ['0x800001fa', 'CSPR', 'Casper'],\n 507: ['0x800001fb', 'EARTH', 'EARTH'],\n 508: ['0x800001fc', 'EGLD', 'MultiversX'],\n 509: ['0x800001fd', 'CHI', 'Xaya'],\n 510: ['0x800001fe', 'KOTO', 'Koto'],\n 511: ['0x800001ff', 'OTC', 'θ'],\n 512: ['0x80000200', 'RXD', 'Radiant'],\n 513: ['0x80000201', 'SEELEN', 'Seele - N'],\n 514: ['0x80000202', 'AETH', 'AETH'],\n 515: ['0x80000203', 'DNA', 'Idena'],\n 516: ['0x80000204', 'VEE', 'Virtual Economy Era'],\n 517: ['0x80000205', 'SIERRA', 'SierraCoin'],\n 518: ['0x80000206', 'LET', 'Linkeye'],\n 519: ['0x80000207', 'BSC', 'Bitcoin Smart Contract'],\n 520: ['0x80000208', 'BTCV', 'BitcoinVIP'],\n 521: ['0x80000209', 'ABA', 'Dabacus'],\n 522: ['0x8000020a', 'SCC', 'StakeCubeCoin'],\n 523: ['0x8000020b', 'EDG', 'Edgeware'],\n 524: ['0x8000020c', 'AMS', 'AmsterdamCoin'],\n 525: ['0x8000020d', 'GOSS', 'GOSSIP Coin'],\n 526: ['0x8000020e', 'BU', 'BUMO'],\n 527: ['0x8000020f', 'GRAM', 'GRAM'],\n 528: ['0x80000210', 'YAP', 'Yapstone'],\n 529: ['0x80000211', 'SCRT', 'Secret Network'],\n 530: ['0x80000212', 'NOVO', 'Novo'],\n 531: ['0x80000213', 'GHOST', 'Ghost'],\n 532: ['0x80000214', 'HST', 'HST'],\n 533: ['0x80000215', 'PRJ', 'ProjectCoin'],\n 534: ['0x80000216', 'YOU', 'YOUChain'],\n 535: ['0x80000217', 'XHV', 'Haven Protocol'],\n 536: ['0x80000218', 'BYND', 'Beyondcoin'],\n 537: ['0x80000219', 'JOYS', 'Joys Digital'],\n 538: ['0x8000021a', 'VAL', 'Valorbit'],\n 539: ['0x8000021b', 'FLOW', 'Flow'],\n 540: ['0x8000021c', 'SMESH', 'Spacemesh Coin'],\n 541: ['0x8000021d', 'SCDO', 'SCDO'],\n 542: ['0x8000021e', 'IQS', 'IQ - Cash'],\n 543: ['0x8000021f', 'BIND', 'Compendia'],\n 544: ['0x80000220', 'COINEVO', 'Coinevo'],\n 545: ['0x80000221', 'SCRIBE', 'Scribe'],\n 546: ['0x80000222', 'HYN', 'Hyperion'],\n 547: ['0x80000223', 'BHP', 'BHP'],\n 548: ['0x80000224', 'BBC', 'BigBang Core'],\n 549: ['0x80000225', 'MKF', 'MarketFinance'],\n 550: ['0x80000226', 'XDC', 'XinFin'],\n 551: ['0x80000227', 'STR', 'Straightedge'],\n 552: ['0x80000228', 'SUM', 'Sumcoin'],\n 553: ['0x80000229', 'HBC', 'HuobiChain'],\n 554: ['0x8000022a', 'reserved'],\n 555: ['0x8000022b', 'BCS', 'Bitcoin Smart'],\n 556: ['0x8000022c', 'KTS', 'Kratos'],\n 557: ['0x8000022d', 'LKR', 'Lkrcoin'],\n 558: ['0x8000022e', 'TAO', 'Tao'],\n 559: ['0x8000022f', 'XWC', 'Whitecoin'],\n 560: ['0x80000230', 'DEAL', 'DEAL'],\n 561: ['0x80000231', 'NTY', 'Nexty'],\n 562: ['0x80000232', 'TOP', 'TOP NetWork'],\n 563: ['0x80000233,---', 'reserved'],\n 564: ['0x80000234', 'AG', 'Agoric'],\n 565: ['0x80000235', 'CICO', 'Coinicles'],\n 566: ['0x80000236', 'IRIS', 'Irisnet'],\n 567: ['0x80000237', 'NCG', 'Nine Chronicles'],\n 568: ['0x80000238', 'LRG', 'Large Coin'],\n 569: ['0x80000239', 'SERO', 'Super Zero Protocol'],\n 570: ['0x8000023a', 'BDX', 'Beldex'],\n 571: ['0x8000023b', 'CCXX', 'Counos X'],\n 572: ['0x8000023c', 'SLS', 'Saluscoin'],\n 573: ['0x8000023d', 'SRM', 'Serum'],\n 574: ['0x8000023e,---', 'reserved'],\n 575: ['0x8000023f', 'VIVT', 'VIDT Datalink'],\n 576: ['0x80000240', 'BPS', 'BitcoinPoS'],\n 577: ['0x80000241', 'NKN', 'NKN'],\n 578: ['0x80000242', 'ICL', 'ILCOIN'],\n 579: ['0x80000243', 'BONO', 'Bonorum'],\n 580: ['0x80000244', 'PLC', 'PLATINCOIN'],\n 581: ['0x80000245', 'DUN', 'Dune'],\n 582: ['0x80000246', 'DMCH', 'Darmacash'],\n 583: ['0x80000247', 'CTC', 'Creditcoin'],\n 584: ['0x80000248', 'KELP', 'Haidai Network'],\n 585: ['0x80000249', 'GBCR', 'GoldBCR'],\n 586: ['0x8000024a', 'XDAG', 'XDAG'],\n 587: ['0x8000024b', 'PRV', 'Incognito Privacy'],\n 588: ['0x8000024c', 'SCAP', 'SafeCapital'],\n 589: ['0x8000024d', 'TFUEL', 'Theta Fuel'],\n 590: ['0x8000024e', 'GTM', 'Gentarium'],\n 591: ['0x8000024f', 'RNL', 'RentalChain'],\n 592: ['0x80000250', 'GRIN', 'Grin'],\n 593: ['0x80000251', 'MWC', 'MimbleWimbleCoin'],\n 594: ['0x80000252', 'DOCK', 'Dock'],\n 595: ['0x80000253', 'POLYX', 'Polymesh'],\n 596: ['0x80000254', 'DIVER', 'Divergenti'],\n 597: ['0x80000255', 'XEP', 'Electra Protocol'],\n 598: ['0x80000256', 'APN', 'Apron'],\n 599: ['0x80000257', 'TFC', 'Turbo File Coin'],\n 600: ['0x80000258', 'UTE', 'Unit - e'],\n 601: ['0x80000259', 'MTC', 'Metacoin'],\n 602: ['0x8000025a', 'NC', 'NobodyCash'],\n 603: ['0x8000025b', 'XINY', 'Xinyuehu'],\n 604: ['0x8000025c', 'DYN', 'Dynamo'],\n 605: ['0x8000025d', 'BUFS', 'Buffer'],\n 606: ['0x8000025e', 'STOS', 'Stratos'],\n 607: ['0x8000025f', 'TON', 'TON'],\n 608: ['0x80000260', 'TAFT', 'TAFT'],\n 609: ['0x80000261', 'HYDRA', 'HYDRA'],\n 610: ['0x80000262', 'NOR', 'Noir'],\n 611: ['0x80000263', undefined, 'Manta Network Private Asset'],\n 612: ['0x80000264', undefined, 'Calamari Network Private Asset'],\n 613: ['0x80000265', 'WCN', 'Widecoin'],\n 614: ['0x80000266', 'OPT', 'Optimistic Ethereum'],\n 615: ['0x80000267', 'PSWAP', 'PolkaSwap'],\n 616: ['0x80000268', 'VAL', 'Validator'],\n 617: ['0x80000269', 'XOR', 'Sora'],\n 618: ['0x8000026a', 'SSP', 'SmartShare'],\n 619: ['0x8000026b', 'DEI', 'DeimosX'],\n 620: ['0x8000026c,---', 'reserved'],\n 621: ['0x8000026d', 'ZERO', 'Singularity'],\n 622: ['0x8000026e', 'ALPHA', 'AlphaDAO'],\n 623: ['0x8000026f', 'BDECO', 'BDCashProtocol Ecosystem'],\n 624: ['0x80000270', 'NOBL', 'Nobility'],\n 625: ['0x80000271', 'EAST', 'Eastcoin'],\n 626: ['0x80000272', 'KDA', 'Kadena'],\n 627: ['0x80000273', 'SOUL', 'Phantasma'],\n 628: ['0x80000274', 'LORE', 'Gitopia'],\n 629: ['0x80000275', 'FNR', 'Fincor'],\n 630: ['0x80000276', 'NEXUS', 'Nexus'],\n 631: ['0x80000277', 'QTZ', 'Quartz'],\n 632: ['0x80000278', 'MAS', 'Massa'],\n 633: ['0x80000279', 'CALL', 'Callchain'],\n 634: ['0x8000027a', 'VAL', 'Validity'],\n 635: ['0x8000027b', 'POKT', 'Pocket Network'],\n 636: ['0x8000027c', 'EMIT', 'EMIT'],\n 637: ['0x8000027d', 'APTOS', 'Aptos'],\n 638: ['0x8000027e', 'ADON', 'ADON'],\n 639: ['0x8000027f', 'BTSG', 'BitSong'],\n 640: ['0x80000280', 'LFC', 'Leofcoin'],\n 641: ['0x80000281', 'KCS', 'KuCoin Shares'],\n 642: ['0x80000282', 'KCC', 'KuCoin Community Chain'],\n 643: ['0x80000283', 'AZERO', 'Aleph Zero'],\n 644: ['0x80000284', 'TREE', 'Tree'],\n 645: ['0x80000285', 'LX', 'Lynx'],\n 646: ['0x80000286', 'XLN', 'Lunarium'],\n 647: ['0x80000287', 'CIC', 'CIC Chain'],\n 648: ['0x80000288', 'ZRB', 'Zarb'],\n 649: ['0x80000289,---', 'reserved'],\n 650: ['0x8000028a', 'UCO', 'Archethic'],\n 651: ['0x8000028b', 'SFX', 'Safex Cash'],\n 652: ['0x8000028c', 'SFT', 'Safex Token'],\n 653: ['0x8000028d', 'WSFX', 'Wrapped Safex Cash'],\n 654: ['0x8000028e', 'USDG', 'US Digital Gold'],\n 655: ['0x8000028f', 'WMP', 'WAMP'],\n 656: ['0x80000290', 'EKTA', 'Ekta'],\n 657: ['0x80000291', 'YDA', 'YadaCoin'],\n 658: ['0x80000292', 'WHIVE', 'Whive'],\n 659: ['0x80000293', 'KOIN', 'Koinos'],\n 660: ['0x80000294', 'PIRATE', 'PirateCash'],\n 661: ['0x80000295', 'UNQ', 'Unique'],\n 662: ['0x80000296', 'ULM', 'UltonSmartchain'],\n 663: ['0x80000297', 'SFRX', 'EtherGem Sapphire'],\n 664: ['0x80000298', 'BSTY', 'GlobalBoost - Y'],\n 665: ['0x80000299', 'IMP', 'Impact Protocol'],\n 666: ['0x8000029a', 'ACT', 'Achain'],\n 667: ['0x8000029b', 'PRKL', 'Perkle'],\n 668: ['0x8000029c', 'SSC', 'SelfSell'],\n 669: ['0x8000029d', 'GC', 'GateChain'],\n 670: ['0x8000029e', 'PLGR', 'Pledger'],\n 671: ['0x8000029f', 'MPLGR', 'Pledger'],\n 672: ['0x800002a0', 'KNOX', 'Knox'],\n 673: ['0x800002a1', 'ZED', 'ZED'],\n 674: ['0x800002a2', 'CNDL', 'Candle'],\n 675: ['0x800002a3', 'WLKR', 'Walker Crypto Innovation Index'],\n 676: ['0x800002a4', 'WLKRR', 'Walker'],\n 677: ['0x800002a5', 'YUNGE', 'Yunge'],\n 678: ['0x800002a6', 'Voken', 'Voken'],\n 679: ['0x800002a7', 'APL', 'Apollo'],\n 680: ['0x800002a8', 'Evrynet', 'Evrynet'],\n 681: ['0x800002a9', 'NENG', 'Nengcoin'],\n 682: ['0x800002aa', 'CHTA', 'Cheetahcoin'],\n 683: ['0x800002ab', 'ALEO', 'Aleo Network'],\n 684: ['0x800002ac', 'HMS', 'Hemis'],\n 685: ['0x800002ad', 'OAS', 'Oasys'],\n 686: ['0x800002ae', 'KAR', 'Karura Network'],\n 687: ['0x800002af', 'FLON', 'FullOn Network'],\n 688: ['0x800002b0', 'CET', 'CoinEx Chain'],\n 689: ['0x800002b1', 'XLINK', 'XLink Chain'],\n 690: ['0x800002b2', 'KLV', 'KleverChain'],\n 691: ['0x800002b3', 'TNT', 'Tangle'],\n 692: ['0x800002b4', 'GTG', 'Gotigin'],\n 693: ['0x800002b5', 'NET', 'RealityNet'],\n 694: ['0x800002b6', 'VTBC', 'VTB Community'],\n 695: ['0x800002b7', 'DIONE', 'Odyssey Chain'],\n 696: ['0x800002b8', 'LUM', 'Lumos'],\n 697: ['0x800002b9', 'AVA', 'Avalon'],\n 698: ['0x800002ba', 'VEIL', 'Veil'],\n 699: ['0x800002bb', 'GTB', 'GotaBit'],\n 700: ['0x800002bc', 'XDAI', 'xDai'],\n 701: ['0x800002bd', 'COM', 'Commercio'],\n 702: ['0x800002be', 'CCC', 'Commercio Cash Credit'],\n 703: ['0x800002bf', 'SNR', 'Sonr'],\n 704: ['0x800002c0', 'RAQ', 'Ra Quantum'],\n 705: ['0x800002c1', 'PEG', 'Pegasus Token'],\n 706: ['0x800002c2', 'LKG', 'Lionking'],\n 707: ['0x800002c3', 'MCOIN', 'Moneta Coin'],\n 708: ['0x800002c4,---', 'reserved'],\n 709: ['0x800002c5', 'AVAIL', 'Avail'],\n 710: ['0x800002c6', 'FURY', 'Highbury'],\n 711: ['0x800002c7', 'CHC', 'Chaincoin'],\n 712: ['0x800002c8', 'SERF', 'Serfnet'],\n 713: ['0x800002c9', 'XTL', 'Katal Chain'],\n 714: ['0x800002ca', 'BNB', 'Binance'],\n 715: ['0x800002cb', 'SIN', 'Sinovate'],\n 716: ['0x800002cc', 'DLN', 'Delion'],\n 717: ['0x800002cd', 'BONTE', 'Bontecoin'],\n 718: ['0x800002ce', 'PEER', 'Peer'],\n 719: ['0x800002cf', 'ZET', 'Zetacoin'],\n 720: ['0x800002d0', 'ABY', 'Artbyte'],\n 721: ['0x800002d1', 'PGX', 'Mirai Chain'],\n 722: ['0x800002d2', 'IL8P', 'InfiniLooP'],\n 723: ['0x800002d3', 'VOI', 'Voi'],\n 724: ['0x800002d4', 'XVC', 'Vanillacash'],\n 725: ['0x800002d5', 'MCX', 'MultiCash'],\n 726: ['0x800002d6', 'TARA', 'Taraxa'],\n 727: ['0x800002d7', 'BLU', 'BluCrates'],\n 728: ['0x800002d8', 'BFC', 'BFC'],\n 729: ['0x800002d9'],\n 730: ['0x800002da', 'HEALIOS', 'Tenacity'],\n 731: ['0x800002db', 'BMK', 'Bitmark'],\n 732: ['0x800002dc'],\n 733: ['0x800002dd', 'TBC', 'TBChat'],\n 734: ['0x800002de', 'DENTX', 'DENTNet'],\n 735: ['0x800002df'],\n 736: ['0x800002e0'],\n 737: ['0x800002e1', 'ATOP', 'Financial Blockchain'],\n 738: ['0x800002e2', 'BTE', 'Bitweb'],\n 739: ['0x800002e3', 'DPC', 'Dpowcoin (DualPowCoin)'],\n 740: ['0x800002e4', 'MDC', 'MyDataCoin'],\n 741: ['0x800002e5', 'RIV', 'Rigvid'],\n 742: ['0x800002e6'],\n 743: ['0x800002e7'],\n 744: ['0x800002e8', 'DUSK', 'Dusk'],\n 745: ['0x800002e9'],\n 746: ['0x800002ea'],\n 747: ['0x800002eb', 'CFG', 'Centrifuge'],\n 748: ['0x800002ec'],\n 749: ['0x800002ed'],\n 750: ['0x800002ee', 'XPRT', 'Persistence'],\n 751: ['0x800002ef'],\n 752: ['0x800002f0'],\n 753: ['0x800002f1', undefined, 'Age NIST Encryption'],\n 754: ['0x800002f2', undefined, 'Age NIST Encryption'],\n 755: ['0x800002f3'],\n 756: ['0x800002f4'],\n 757: ['0x800002f5', 'HONEY', 'HoneyWood'],\n 758: ['0x800002f6', 'XDD', 'XDDCoin'],\n 759: ['0x800002f7'],\n 760: ['0x800002f8'],\n 761: ['0x800002f9'],\n 762: ['0x800002fa'],\n 763: ['0x800002fb'],\n 764: ['0x800002fc'],\n 765: ['0x800002fd', 'TGN', 'Tagion'],\n 766: ['0x800002fe'],\n 767: ['0x800002ff'],\n 768: ['0x80000300', 'BALLZ', 'Ballzcoin'],\n 769: ['0x80000301'],\n 770: ['0x80000302', 'COSA', 'Cosanta'],\n 771: ['0x80000303', 'BR', 'BR'],\n 772: ['0x80000304'],\n 773: ['0x80000305', 'CSB', 'CosmoBliss'],\n 774: ['0x80000306'],\n 775: ['0x80000307', 'PLSR', 'Pulsar Coin'],\n 776: ['0x80000308', 'KEY', 'Keymaker Coin'],\n 777: ['0x80000309', 'BTW', 'Bitcoin World'],\n 778: ['0x8000030a'],\n 779: ['0x8000030b'],\n 780: ['0x8000030c', 'PLCUC', 'PLC Ultima Classic'],\n 781: ['0x8000030d', 'PLCUX', 'PLC Ultima X'],\n 782: ['0x8000030e', 'PLCU', 'PLC Ultima'],\n 783: ['0x8000030f', 'SMARTBC', 'SMART Blockchain'],\n 784: ['0x80000310', 'SUI', 'Sui'],\n 785: ['0x80000311', 'ULTIMA', 'ULTIMA'],\n 786: ['0x80000312', 'UIDD', 'UIDD'],\n 787: ['0x80000313', 'ACA', 'Acala'],\n 788: ['0x80000314', 'BNC', 'Bifrost'],\n 789: ['0x80000315', 'TAU', 'Lamden'],\n 790: ['0x80000316'],\n 791: ['0x80000317'],\n 792: ['0x80000318'],\n 793: ['0x80000319'],\n 794: ['0x8000031a', 'INTR', 'Interlay'],\n 795: ['0x8000031b', 'KINT', 'Kintsugi'],\n 796: ['0x8000031c'],\n 797: ['0x8000031d'],\n 798: ['0x8000031e'],\n 799: ['0x8000031f', 'PDEX', 'Polkadex'],\n 800: ['0x80000320', 'BEET', 'Beetle Coin'],\n 801: ['0x80000321', 'DST', 'DSTRA'],\n 802: ['0x80000322', 'CY', 'Cyberyen'],\n 803: ['0x80000323', 'RYME', 'Ryme Network'],\n 804: ['0x80000324', 'ZKS', 'zkSync'],\n 805: ['0x80000325', 'SCASH', 'Scash'],\n 806: ['0x80000326'],\n 807: ['0x80000327'],\n 808: ['0x80000328', 'QVT', 'Qvolta'],\n 809: ['0x80000329', 'SDN', 'Shiden Network'],\n 810: ['0x8000032a', 'ASTR', 'Astar Network'],\n 811: ['0x8000032b', '---', 'reserved'],\n 812: ['0x8000032c'],\n 813: ['0x8000032d', 'MEER', 'Qitmeer'],\n 814: ['0x8000032e'],\n 815: ['0x8000032f', 'FACT', 'ImFACT'],\n 816: ['0x80000330', 'FSC', 'FSC'],\n 817: ['0x80000331'],\n 818: ['0x80000332', 'VET', 'VeChain Token'],\n 819: ['0x80000333', 'REEF', 'Reef'],\n 820: ['0x80000334', 'CLO', 'Callisto'],\n 821: ['0x80000335'],\n 822: ['0x80000336', 'BDB', 'BigchainDB'],\n 823: ['0x80000337'],\n 824: ['0x80000338', 'RBNT', 'Redbelly Network'],\n 825: ['0x80000339'],\n 826: ['0x8000033a'],\n 827: ['0x8000033b', 'ACE', 'Endurance'],\n 828: ['0x8000033c', 'CCN', 'ComputeCoin'],\n 829: ['0x8000033d', 'BBA', 'BBACHAIN'],\n 830: ['0x8000033e'],\n 831: ['0x8000033f', 'CRUZ', 'cruzbit'],\n 832: ['0x80000340', 'SAPP', 'Sapphire'],\n 833: ['0x80000341', 777, 'Jackpot'],\n 834: ['0x80000342', 'KYAN', 'Kyanite'],\n 835: ['0x80000343', 'AZR', 'Azzure'],\n 836: ['0x80000344', 'CFL', 'CryptoFlow'],\n 837: ['0x80000345', 'DASHD', 'Dash Diamond'],\n 838: ['0x80000346', 'TRTT', 'Trittium'],\n 839: ['0x80000347', 'UCR', 'Ultra Clear'],\n 840: ['0x80000348', 'PNY', 'Peony'],\n 841: ['0x80000349', 'BECN', 'Beacon'],\n 842: ['0x8000034a', 'MONK', 'Monk'],\n 843: ['0x8000034b', 'SAGA', 'CryptoSaga'],\n 844: ['0x8000034c', 'SUV', 'Suvereno'],\n 845: ['0x8000034d', 'ESK', 'EskaCoin'],\n 846: ['0x8000034e', 'OWO', 'OneWorld Coin'],\n 847: ['0x8000034f', 'PEPS', 'PEPS Coin'],\n 848: ['0x80000350', 'BIR', 'Birake'],\n 849: ['0x80000351', 'MOBIC', 'MobilityCoin'],\n 850: ['0x80000352', 'FLS', 'Flits'],\n 851: ['0x80000353', 'FRECO', 'Freco'],\n 852: ['0x80000354', 'DSM', 'Desmos'],\n 853: ['0x80000355', 'PRCY', 'PRCY Coin'],\n 854: ['0x80000356'],\n 855: ['0x80000357'],\n 856: ['0x80000358'],\n 857: ['0x80000359'],\n 858: ['0x8000035a', 'HVH', 'HAVAH'],\n 859: ['0x8000035b'],\n 860: ['0x8000035c', 'XBIT', 'XBIT Coin'],\n 861: ['0x8000035d'],\n 862: ['0x8000035e'],\n 863: ['0x8000035f'],\n 864: ['0x80000360', 'CVM', 'Convex'],\n 865: ['0x80000361'],\n 866: ['0x80000362', 'MOB', 'MobileCoin'],\n 867: ['0x80000363'],\n 868: ['0x80000364', 'IF', 'Infinitefuture'],\n 869: ['0x80000365'],\n 870: ['0x80000366'],\n 871: ['0x80000367'],\n 872: ['0x80000368'],\n 873: ['0x80000369', 'QUORUM', 'Quorum'],\n 874: ['0x8000036a'],\n 875: ['0x8000036b'],\n 876: ['0x8000036c'],\n 877: ['0x8000036d', 'NAM', 'Namada'],\n 878: ['0x8000036e', 'SCR', 'Scorum Network'],\n 879: ['0x8000036f'],\n 880: ['0x80000370', 'LUM', 'Lum Network'],\n 881: ['0x80000371'],\n 882: ['0x80000372'],\n 883: ['0x80000373', 'ZBC', 'ZooBC'],\n 884: ['0x80000374'],\n 885: ['0x80000375'],\n 886: ['0x80000376', 'ADF', 'AD Token'],\n 887: ['0x80000377'],\n 888: ['0x80000378', 'NEO', 'NEO'],\n 889: ['0x80000379', 'TOMO', 'TOMO'],\n 890: ['0x8000037a', 'XSEL', 'Seln'],\n 891: ['0x8000037b'],\n 892: ['0x8000037c'],\n 893: ['0x8000037d'],\n 894: ['0x8000037e'],\n 895: ['0x8000037f'],\n 896: ['0x80000380', 'LKSC', 'LKSCoin'],\n 897: ['0x80000381'],\n 898: ['0x80000382', 'AS', 'Assetchain'],\n 899: ['0x80000383', 'XEC', 'eCash'],\n 900: ['0x80000384', 'LMO', 'Lumeneo'],\n 901: ['0x80000385', 'NXT', 'NxtMeta'],\n 902: ['0x80000386'],\n 903: ['0x80000387'],\n 904: ['0x80000388', 'HNT', 'Helium'],\n 905: ['0x80000389'],\n 906: ['0x8000038a', 'XPX', 'Sirius'],\n 907: ['0x8000038b', 'FIS', 'StaFi'],\n 908: ['0x8000038c'],\n 909: ['0x8000038d', 'SGE', 'Saage'],\n 910: ['0x8000038e'],\n 911: ['0x8000038f', 'GERT', 'Gert'],\n 912: ['0x80000390'],\n 913: ['0x80000391', 'VARA', 'Vara Network'],\n 914: ['0x80000392'],\n 915: ['0x80000393'],\n 916: ['0x80000394', 'META', 'Metadium'],\n 917: ['0x80000395', 'FRA', 'Findora'],\n 918: ['0x80000396'],\n 919: ['0x80000397', 'CCD', 'Concordium'],\n 920: ['0x80000398'],\n 921: ['0x80000399', 'AVN', 'Avian Network'],\n 922: ['0x8000039a'],\n 923: ['0x8000039b'],\n 924: ['0x8000039c'],\n 925: ['0x8000039d', 'DIP', 'Dipper Network'],\n 926: ['0x8000039e'],\n 927: ['0x8000039f'],\n 928: ['0x800003a0', 'GHM', 'HermitMatrixNetwork'],\n 929: ['0x800003a1'],\n 930: ['0x800003a2'],\n 931: ['0x800003a3', 'RUNE', 'THORChain (RUNE)'],\n 932: ['0x800003a4'],\n 933: ['0x800003a5'],\n 934: ['0x800003a6'],\n 935: ['0x800003a7'],\n 936: ['0x800003a8'],\n 937: ['0x800003a9'],\n 938: ['0x800003aa', 'MGO', 'Mango Network'],\n 939: ['0x800003ab', 'AB', 'Argot Protocol'],\n 940: ['0x800003ac'],\n 941: ['0x800003ad', '---', 'reserved'],\n 942: ['0x800003ae', 'KCN', 'Kylacoin'],\n 943: ['0x800003af', 'LCN', 'Lyncoin'],\n 944: ['0x800003b0'],\n 945: ['0x800003b1', 'UNLOCK', 'Jasiri protocol'],\n 946: ['0x800003b2'],\n 947: ['0x800003b3'],\n 948: ['0x800003b4'],\n 949: ['0x800003b5'],\n 950: ['0x800003b6'],\n 951: ['0x800003b7'],\n 952: ['0x800003b8'],\n 953: ['0x800003b9'],\n 954: ['0x800003ba'],\n 955: ['0x800003bb', 'LTP', 'LifetionCoin'],\n 956: ['0x800003bc'],\n 957: ['0x800003bd'],\n 958: ['0x800003be', undefined, 'KickSoccer'],\n 959: ['0x800003bf'],\n 960: ['0x800003c0', 'VKAX', 'Vkax'],\n 961: ['0x800003c1'],\n 962: ['0x800003c2'],\n 963: ['0x800003c3'],\n 964: ['0x800003c4'],\n 965: ['0x800003c5'],\n 966: ['0x800003c6', 'MATIC', 'Matic'],\n 967: ['0x800003c7'],\n 968: ['0x800003c8', 'UNW', 'UNW'],\n 969: ['0x800003c9', 'QI', 'Quai Network'],\n 970: ['0x800003ca', 'TWINS', 'TWINS'],\n 971: ['0x800003cb'],\n 972: ['0x800003cc'],\n 973: ['0x800003cd'],\n 974: ['0x800003ce'],\n 975: ['0x800003cf'],\n 976: ['0x800003d0'],\n 977: ['0x800003d1', 'TLOS', 'Telos'],\n 978: ['0x800003d2'],\n 979: ['0x800003d3'],\n 980: ['0x800003d4'],\n 981: ['0x800003d5', 'TAFECO', 'Taf ECO Chain'],\n 982: ['0x800003d6'],\n 983: ['0x800003d7'],\n 984: ['0x800003d8'],\n 985: ['0x800003d9', 'AU', 'Autonomy'],\n 986: ['0x800003da'],\n 987: ['0x800003db', 'VCG', 'VipCoin'],\n 988: ['0x800003dc', 'XAZAB', 'Xazab core'],\n 989: ['0x800003dd', 'AIOZ', 'AIOZ'],\n 990: ['0x800003de', 'CORE', 'Coreum'],\n 991: ['0x800003df', 'PEC', 'Phoenix'],\n 992: ['0x800003e0', 'UNT', 'Unit'],\n 993: ['0x800003e1', 'XRB', 'X Currency'],\n 994: ['0x800003e2', 'QUAI', 'Quai Network'],\n 995: ['0x800003e3', 'CAPS', 'Ternoa'],\n 996: ['0x800003e4', 'OKT', 'OKChain Token'],\n 997: ['0x800003e5', 'SUM', 'Solidum'],\n 998: ['0x800003e6', 'LBTC', 'Lightning Bitcoin'],\n 999: ['0x800003e7', 'BCD', 'Bitcoin Diamond'],\n 1000: ['0x800003e8', 'BTN', 'Bitcoin New'],\n 1001: ['0x800003e9', 'TT', 'ThunderCore'],\n 1002: ['0x800003ea', 'BKT', 'BanKitt'],\n 1003: ['0x800003eb', 'NODL', 'Nodle'],\n 1004: ['0x800003ec', 'PCOIN', 'PCOIN'],\n 1005: ['0x800003ed', 'TAO', 'Bittensor'],\n 1006: ['0x800003ee', 'HSK', 'HashKey Chain'],\n 1007: ['0x800003ef', 'FTM', 'Fantom'],\n 1008: ['0x800003f0', 'RPG', 'RPG'],\n 1009: ['0x800003f1', 'LAKE', 'iconLake'],\n 1010: ['0x800003f2', 'HT', 'Huobi ECO Chain'],\n 1011: ['0x800003f3', 'ELV', 'Eluvio'],\n 1012: ['0x800003f4', 'JOC', 'Japan Open Chain'],\n 1013: ['0x800003f5', 'BIC', 'Beincrypto'],\n 1014: ['0x800003f6', 'JOY', 'Joystream'],\n 1015: ['0x800003f7', 'ZCX', 'ZEN Exchange Token'],\n 1016: ['0x800003f8', '---', 'reserved'],\n 1020: ['0x800003fc', 'EVC', 'Evrice'],\n 1022: ['0x800003fe', 'XRD', 'Radix DLT'],\n 1023: ['0x800003ff', 'ONE', 'HARMONY-ONE (Legacy)'],\n 1024: ['0x80000400', 'ONT', 'Ontology'],\n 1025: ['0x80000401', 'CZZ', 'Classzz'],\n 1026: ['0x80000402', 'KEX', 'Kira Exchange Token'],\n 1027: ['0x80000403', 'MCM', 'Mochimo'],\n 1028: ['0x80000404', 'PLS', 'Pulse Coin'],\n 1032: ['0x80000408', 'BTCR', 'BTCR'],\n 1042: ['0x80000412', 'MFID', 'Moonfish ID'],\n 1111: ['0x80000457', 'BBC', 'Big Bitcoin'],\n 1116: ['0x8000045c', 'CORE', 'Core'],\n 1120: ['0x80000460', 'RISE', 'RISE'],\n 1122: ['0x80000462', 'CMT', 'CyberMiles Token'],\n 1128: ['0x80000468', 'ETSC', 'Ethereum Social'],\n 1129: ['0x80000469', 'DFI', 'DeFiChain'],\n 1130: ['0x8000046a', 'DFI', 'DeFiChain EVM Network'],\n 1137: ['0x80000471', '$DAG', 'Constellation Labs'],\n 1145: ['0x80000479', 'CDY', 'Bitcoin Candy'],\n 1155: ['0x80000483', 'ENJ', 'Enjin Coin'],\n 1170: ['0x80000492', 'HOO', 'Hoo Smart Chain'],\n 1234: ['0x800004d2', 'ALPH', 'Alephium'],\n 1236: ['0x800004d4', undefined, 'Masca'],\n 1237: ['0x800004d5', undefined, 'Nostr'],\n 1280: ['0x80000500', undefined, 'Kudos Setler'],\n 1284: ['0x80000504', 'GLMR', 'Moonbeam'],\n 1285: ['0x80000505', 'MOVR', 'Moonriver'],\n 1286: ['0x80000506', 'DSG', 'Dessage Social Protocol'],\n 1298: ['0x80000512', 'WPC', 'Wpc'],\n 1308: ['0x8000051c', 'WEI', 'WEI'],\n 1312: ['0x80000520', 'BITS', 'Entropy'],\n 1337: ['0x80000539', 'DFC', 'Defcoin'],\n 1338: ['0x8000053a', 'IRON', 'Iron Fish'],\n 1348: ['0x80000544', 'ISLM', 'IslamicCoin'],\n 1397: ['0x80000575', 'HYC', 'Hycon'],\n 1410: ['0x80000582', 'TENTSLP', 'TENT Simple Ledger Protocol'],\n 1510: ['0x800005e6', 'XSC', 'XT Smart Chain'],\n 1512: ['0x800005e8', 'AAC', 'Double-A Chain'],\n 1524: ['0x800005f4', undefined, 'Taler'],\n 1533: ['0x800005fd', 'BEAM', 'Beam'],\n 1536: ['0x80000600', 'GAS', 'BubiChain'],\n 1540: ['0x80000604', 'ATHENA', 'Athena'],\n 1551: ['0x8000060f', 'SDK', 'Sovereign SDK'],\n 1555: ['0x80000613', 'APC', 'Apc Chain'],\n 1616: ['0x80000650', 'ELF', 'AELF'],\n 1618: ['0x80000652', 'AUDL', 'AUDL'],\n 1620: ['0x80000654', 'ATH', 'Atheios'],\n 1627: ['0x8000065b', 'LUME', 'Lume Web'],\n 1642: ['0x8000066a', 'NEW', 'Newton'],\n 1657: ['0x80000679', 'BTA', 'Btachain'],\n 1668: ['0x80000684', 'NEOX', 'Neoxa'],\n 1669: ['0x80000685', 'MEWC', 'Meowcoin'],\n 1688: ['0x80000698', 'BCX', 'BitcoinX'],\n 1729: ['0x800006c1', 'XTZ', 'Tezos'],\n 1776: ['0x800006f0', 'LBTC', 'Liquid BTC'],\n 1777: ['0x800006f1', 'BBP', 'Biblepay'],\n 1784: ['0x800006f8', 'JPYS', 'JPY Stablecoin'],\n 1789: ['0x800006fd', 'VEGA', 'Vega Protocol'],\n 1815: ['0x80000717', 'ADA', 'Cardano'],\n 1818: ['0x8000071a', 'CUBE', 'Cube Chain Native Token'],\n 1856: ['0x80000743', 'TES', 'Teslacoin'],\n 1888: ['0x80000760', 'ZTX', 'Zetrix'],\n 1899: ['0x8000076b', 'XEC', 'eCash token'],\n 1900: ['0x8000076c', 'XNA', 'Neurai'],\n 1901: ['0x8000076d', 'CLC', 'Classica'],\n 1907: ['0x80000773', 'BITCI', 'Bitcicoin'],\n 1918: ['0x8000077e', 'BKC', 'Briskcoin'],\n 1919: ['0x8000077f', 'VIPS', 'VIPSTARCOIN'],\n 1926: ['0x80000786', 'CITY', 'City Coin'],\n 1951: ['0x8000079f', 'ESA', 'Esa'],\n 1952: ['0x800007a0', 'ESC', 'EsaCoin'],\n 1955: ['0x800007a3', 'XX', 'xx coin'],\n 1977: ['0x800007b9', 'XMX', 'Xuma'],\n 1984: ['0x800007c0', 'TRTL', 'TurtleCoin'],\n 1985: ['0x800007c1', 'SLRT', 'Solarti Chain'],\n 1986: ['0x800007c2', 'QTH', 'Qing Tong Horizon'],\n 1987: ['0x800007c3', 'EGEM', 'EtherGem'],\n 1988: ['0x800007c4', 'MIRA', 'Mira Chain'],\n 1989: ['0x800007c5', 'HODL', 'HOdlcoin'],\n 1990: ['0x800007c6', 'PHL', 'Placeholders'],\n 1991: ['0x800007c7', 'SC', 'Sia'],\n 1996: ['0x800007cc', 'MYT', 'Mineyourtime'],\n 1997: ['0x800007cd', 'POLIS', 'Polis'],\n 1998: ['0x800007ce', 'XMCC', 'Monoeci'],\n 1999: ['0x800007cf', 'COLX', 'ColossusXT'],\n 2000: ['0x800007d0', 'GIN', 'GinCoin'],\n 2001: ['0x800007d1', 'MNP', 'MNPCoin'],\n 2002: ['0x800007d2', 'MLN', 'Miraland'],\n 2015: ['0x800007df', 'TEER', 'Integritee'],\n 2017: ['0x800007e1', 'KIN', 'Kin'],\n 2018: ['0x800007e2', 'EOSC', 'EOSClassic'],\n 2019: ['0x800007e3', 'GBT', 'GoldBean Token'],\n 2020: ['0x800007e4', 'PKC', 'PKC'],\n 2021: ['0x800007e5', 'SKT', 'Sukhavati'],\n 2024: ['0x800007e8', 'USBC', 'Universal Ledger USBC'],\n 2022: ['0x800007e6', 'XHT', 'Xinghuo Token'],\n 2023: ['0x800007e7', 'COC', 'Chat On Chain'],\n 2025: ['0x800007e9', 'ROCK', 'Zenrock Labs'],\n 2026: ['0x800007ea', 'ASTRON', 'ASTRON Token'],\n 2046: ['0x800007fe', 'ANY', 'Any'],\n 2048: ['0x80000800', 'MCASH', 'MCashChain'],\n 2049: ['0x80000801', 'TRUE', 'TrueChain'],\n 2050: ['0x80000802', 'MOVO', 'Movo Smart Chain'],\n 2086: ['0x80000826', 'KILT', 'KILT Spiritnet'],\n 2091: ['0x8000082b', 'FRQCY', 'Frequency'],\n 2109: ['0x8000083d', 'SAMA', 'Exosama Network'],\n 2112: ['0x80000840', 'IoTE', 'IoTE'],\n 2125: ['0x8000084d', 'BAY', 'BitBay'],\n 2137: ['0x80000859', 'XRG', 'Ergon'],\n 2199: ['0x80000897', 'SAMA', 'Moonsama Network'],\n 2221: ['0x800008ad', 'ASK', 'ASK'],\n 2222: ['0x800008ae', 'CWEB', 'Coinweb'],\n 2285: ['0x800008ed', undefined, 'Qiyi Chain'],\n 2301: ['0x800008fd', 'QTUM', 'QTUM'],\n 2302: ['0x800008fe', 'ETP', 'Metaverse'],\n 2303: ['0x800008ff', 'GXC', 'GXChain'],\n 2304: ['0x80000900', 'CRP', 'CranePay'],\n 2305: ['0x80000901', 'ELA', 'Elastos'],\n 2338: ['0x80000922', 'SNOW', 'Snowblossom'],\n 2365: ['0x8000093d', 'XIN', 'Mixin'],\n 2500: ['0x800009c4', 'NEXI', 'Nexi'],\n 2570: ['0x80000a0a', 'AOA', 'Aurora'],\n 2686: ['0x80000a7e', 'AIPG', 'AIPowerGrid'],\n 2718: ['0x80000a9e', 'NAS', 'Nebulas'],\n 2809: ['0x80000af9', 'LAN', 'Lanify'],\n 2894: ['0x80000b4e', 'REOSC', 'REOSC Ecosystem'],\n 2941: ['0x80000b7d', 'BND', 'Blocknode'],\n 3000: ['0x80000bb8', 'SM', 'Stealth Message'],\n 3003: ['0x80000bbb', 'LUX', 'LUX'],\n 3030: ['0x80000bd6', 'HBAR', 'Hedera HBAR'],\n 3077: ['0x80000c05', 'COS', 'Contentos'],\n 3276: ['0x80000ccc', 'CCC', 'CodeChain'],\n 3344: ['0x80000d10', 'PLMC', 'Polimec'],\n 3333: ['0x80000d05', 'SXP', 'Solar'],\n 3338: ['0x80000d0a', 'PEAQ', 'peaq'],\n 3377: ['0x80000d31', 'ROI', 'ROIcoin'],\n 3381: ['0x80000d35', 'DYN', 'Dynamic'],\n 3383: ['0x80000d37', 'SEQ', 'Sequence'],\n 3434: ['0x80000d6a', 'PEPE', 'Pepecoin Core'],\n 3501: ['0x80000dad', 'JFIN', 'JFIN Coin'],\n 3552: ['0x80000de0', 'DEO', 'Destocoin'],\n 3564: ['0x80000dec', 'DST', 'DeStream'],\n 3601: ['0x80000e11', 'CY', 'Cybits'],\n 3757: ['0x80000ead', 'MPC', 'Partisia Blockchain'],\n 3840: ['0x80000f00', 'RED', 'ReDeFi RED'],\n 4040: ['0x80000fc8', 'FC8', 'FCH Network'],\n 4096: ['0x80001000', 'YEE', 'YeeCo'],\n 4218: ['0x8000107a', 'IOTA', 'IOTA'],\n 4219: ['0x8000107b', 'SMR', 'Shimmer'],\n 4242: ['0x80001092', 'AXE', 'Axe'],\n 4343: ['0x800010f7', 'XYM', 'Symbol'],\n 4444: ['0x8000115c', 'C4EI', 'Chain4Energy'],\n 4646: ['0x80001226', 'MST', 'MST'],\n 4919: ['0x80001337', 'XVM', 'Venidium'],\n 4976: ['0x80001370', 'VARA', 'Vara'],\n 4999: ['0x80001387', 'BXN', 'BlackFort Exchange Network'],\n 5000: ['0x80001388', 'V12', 'Vet The Vote'],\n 5006: ['0x8000138e', 'SBC', 'Senior Blockchain'],\n 5248: ['0x80001480', 'FIC', 'FIC'],\n 5353: ['0x800014e9', 'HNS', 'Handshake'],\n 5404: ['0x8000151c', 'ISK', 'ISKRA'],\n 5467: ['0x8000155b', 'ALTME', 'ALTME'],\n 5555: ['0x800015b3', 'FUND', 'Unification'],\n 5757: ['0x8000167d', 'STX', 'Stacks'],\n 5895: ['0x80001707', 'VOW', 'VowChain VOW'],\n 5920: ['0x80001720', 'SLU', 'SILUBIUM'],\n 5995: ['0x8000176B', 'DUSK', 'Dusk Network'],\n 6060: ['0x800017ac', 'GO', 'GoChain GO'],\n 6144: ['0x80001800', 'DTS', 'Datos'],\n 6174: ['0x8000181e', 'MOI', 'My Own Internet'],\n 6278: ['0x80001886', 'STEAMX', 'Rails Network Mainnet'],\n 6532: ['0x80001984', 'UM', 'Penumbra'],\n 6599: ['0x800019c7', 'RSC', 'Royal Sports City'],\n 6666: ['0x80001a0a', 'BPA', 'Bitcoin Pizza'],\n 6688: ['0x80001a20', 'SAFE', 'SAFE'],\n 6779: ['0x80001a7b', 'COTI', 'COTI'],\n 6969: ['0x80001b39', 'ROGER', 'TheHolyrogerCoin'],\n 7000: ['0x80001b58', 'ZETA', 'ZetaChain'],\n 7027: ['0x80001b73', 'ELLA', 'Ella the heart'],\n 7028: ['0x80001b74', 'AA', 'Arthera'],\n 7070: ['0x80001b9e', 'DOI', 'Doichain'],\n 7091: ['0x80001bb3', 'TOPL', 'Topl'],\n 7331: ['0x80001ca3', 'KLY', 'KLYNTAR'],\n 7341: ['0x80001cad', 'SHFT', 'Shyft'],\n 7518: ['0x80001d5e', 'MEV', 'MEVerse'],\n 7576: ['0x80001d98', 'ADIL', 'ADIL Chain'],\n 7777: ['0x80001e61', 'BTV', 'Bitvote'],\n 7779: ['0x80001e63', 'CPV', 'Compverse'],\n 8000: ['0x80001f40', 'SKY', 'Skycoin'],\n 8017: ['0x80001f51', 'ISC', 'iSunCoin'],\n 8080: ['0x80001f90', undefined, 'DSRV'],\n 8181: ['0x80001ff5', 'BOC', 'BeOne Chain'],\n 8192: ['0x80002000', 'PAC', 'pacprotocol'],\n 8217: ['0x80002019', 'KAIA', 'KAIA'],\n 8339: ['0x80002093', 'BTQ', 'BitcoinQuark'],\n 8444: ['0x800020fc', 'XCH', 'Chia'],\n 8453: ['0x80002105', undefined, 'Base'],\n 8520: ['0x80002148', '---', 'reserved'],\n 8680: ['0x800021e8', 'PLMNT', 'Planetmint'],\n 8732: ['0x8000221c', 'BLN', 'Bullions'],\n 8866: ['0x800022a2', 'GGX', 'Golden Gate'],\n 8886: ['0x800022b6', 'GGXT', 'Golden Gate Sydney'],\n 8888: ['0x800022b8', 'SBTC', 'Super Bitcoin'],\n 8964: ['0x80002304', 'NULS', 'NULS'],\n 8997: ['0x80002325', 'BBC', 'Babacoin'],\n 8998: ['0x80002326', 'JGC', 'JagoanCoin'],\n 8999: ['0x80002327', 'BTP', 'Bitcoin Pay'],\n 9000: ['0x80002328', 'AVAX', 'Avalanche'],\n 9001: ['0x80002329', 'ARB1', 'Arbitrum'],\n 9002: ['0x8000232a', 'BOBA', 'Boba'],\n 9003: ['0x8000232b', 'LOOP', 'Loopring'],\n 9004: ['0x8000232c', 'STRK', 'StarkNet'],\n 9005: ['0x8000232d', 'AVAXC', 'Avalanche C-Chain'],\n 9006: ['0x8000232e', 'BSC', 'Binance Smart Chain'],\n 9797: ['0x80002645', 'NRG', 'Energi'],\n 9888: ['0x800026a0', 'BTF', 'Bitcoin Faith'],\n 9969: ['0x800026f1', 'OSMI', 'Osmium'],\n 9999: ['0x8000270f', 'GOD', 'Bitcoin God'],\n 10000: ['0x80002710', 'FO', 'FIBOS'],\n 10001: ['0x80002711', 'SPACE', 'Space'],\n 10007: ['0x80002717', 'S', 'SONIC'],\n 10111: ['0x8000277f', 'DHP', 'dHealth'],\n 10226: ['0x800027f2', 'RTM', 'Raptoreum'],\n 10242: ['0x80002802', 'AA', 'Arthera'],\n 10291: ['0x80002833', 'XRC', 'XRhodium'],\n 10507: ['0x8000290b', 'NUM', 'Numbers Protocol'],\n 10605: ['0x8000296d', 'XPI', 'Lotus'],\n 11111: ['0x80002b67', 'ESS', 'Essentia One'],\n 11742: ['0x80002dde', 'VARCH', 'InvArch'],\n 11743: ['0x80002ddf', 'TNKR', 'Tinkernet'],\n 12345: ['0x80003039', 'IPOS', 'IPOS'],\n 12586: ['0x8000312a', 'MINA', 'Mina'],\n 13107: ['0x80003333', 'BTY', 'BitYuan'],\n 13108: ['0x80003334', 'YCC', 'Yuan Chain Coin'],\n 13381: ['0x80003445', 'PHX', 'Phoenix'],\n 14001: ['0x800036b1', 'WAX', 'Worldwide Asset Exchange'],\n 15845: ['0x80003de5', 'SDGO', 'SanDeGo'],\n 16181: ['0x80003f35', 'XTX', 'Totem Live Network'],\n 16754: ['0x80004172', 'ARDR', 'Ardor'],\n 18000: ['0x80004650', 'MTR', 'Meter'],\n 19165: ['0x80004add', 'SAFE', 'Safecoin'],\n 19167: ['0x80004adf', 'FLUX', 'Flux'],\n 19169: ['0x80004ae1', 'RITO', 'Ritocoin'],\n 19788: ['0x80004d4c', 'ML', 'Mintlayer'],\n 20036: ['0x80004e44', 'XND', 'ndau'],\n 21004: ['0x8000520c', 'C4EI', 'c4ei'],\n 21337: ['0x80005359', 'XAH', 'Xahau'],\n 21888: ['0x80005580', 'PAC', 'Pactus'],\n 22504: ['0x800057e8', 'PWR', 'PWRcoin'],\n 23000: ['0x800059d8', 'EPIC', 'Epic Cash'],\n 25252: ['0x800062a4', 'BELL', 'Bellcoin'],\n 25718: ['0x80006476', 'CHX', 'Own'],\n 26417: ['0x80006731', 'G1', 'Ğ1'],\n 29223: ['0x80007227', 'NEXA', 'Nexa'],\n 30001: ['0x80007531', '---', 'reserved'],\n 31102: ['0x8000797e', 'ESN', 'EtherSocial Network'],\n 31337: ['0x80007a69', undefined, 'ThePower'],\n 33416: ['0x80008288', 'TEO', 'Trust Eth reOrigin'],\n 33878: ['0x80008456', 'BTCS', 'Bitcoin Stake'],\n 34952: ['0x80008888', 'BTT', 'ByteTrade'],\n 37992: ['0x80009468', 'FXTC', 'FixedTradeCoin'],\n 39321: ['0x80009999', 'AMA', 'Amabig'],\n 42069: ['0x8000a455', 'FACT', 'FACT0RN'],\n 43028: ['0x8000a814', 'AXIV', 'AXIV'],\n 47803: ['0x8000babb', 'BAX', 'BAX'],\n 49262: ['0x8000c06e', 'EVE', 'evan'],\n 49344: ['0x8000c0c0', 'STASH', 'STASH'],\n 52752: ['0x8000ce10', 'CELO', 'Celo'],\n 54176: ['0x8000d3a0', 'OVER', 'OverProtocol'],\n 61616: ['0x8000f0b0', 'TH', 'TianHe'],\n 65536: ['0x80010000', 'KETH', 'Krypton World'],\n 69420: ['0x80010f2c', 'GRLC', 'Garlicoin'],\n 70007: ['0x80011177', 'GWL', 'Gewel'],\n 83293: ['0x8001455d', 'QUBIC', 'Qubic'],\n 77777: ['0x80012fd1', 'ZYN', 'Wethio'],\n 88888: ['0x80015b38', 'RYO', 'c0ban'],\n 99999: ['0x8001869f', 'WICC', 'Waykichain'],\n 100500: ['0x80018894', 'HOME', 'HomeCoin'],\n 101010: ['0x80018a92', 'STC', 'Starcoin'],\n 104109: ['0x800196ad', undefined, 'Seed Hypermedia'],\n 105105: ['0x80019a91', 'STRAX', 'Strax'],\n 111111: ['0x8001b207', 'KAS', 'Kaspa'],\n 121337: ['0x8001d9f9', 'KLS', 'Karlsen'],\n 123456: ['0x8001e240', 'SPR', 'Spectre'],\n 130822: ['0x8001ff06', 'WBT', 'WhiteBIT Coin'],\n 161803: ['0x8002780b', 'APTA', 'Bloqs4Good'],\n 200625: ['0x80030fb1', 'AKA', 'Akroma'],\n 200901: ['0x800310c5', 'BTR', 'Bitlayer'],\n 224433: ['0x80036cb1', 'CONET', 'CONET Holesky Network'],\n 246529: ['0x8003c301', 'ATS', 'ARTIS sigma1'],\n 261131: ['0x8003fc0b', 'ZAMA', 'Zama'],\n 314159: ['0x8004cb2f', 'PI', 'Pi Network'],\n 333332: ['0x80051614', 'VALUE', 'Value Chain'],\n 333333: ['0x80051615', 3333, 'Pi Value Consensus'],\n 424242: ['0x80067932', 'X42', 'x42'],\n 440017: ['0x8006b6d1', '@G', 'Graphite'],\n 534352: ['0x80082750', 'SCR', 'Scroll'],\n 666666: ['0x800a2c2a', 'VITE', 'Vite'],\n 696365: ['0x800b3206', 'ICE', 'Ice Network'],\n 888888: ['0x800d9038', 'SEA', 'Second Exchange Alliance'],\n 999999: ['0x800c9061', 'WTC', 'WaltonChain'],\n 1048576: ['0x80100000', 'AMAX', 'Armonia Meta Chain'],\n 1171337: ['0x8011df89', 'ILT', 'iOlite'],\n 1313114: ['0x8014095a', 'ETHO', 'Etho Protocol'],\n 1313500: ['0x80140adc', 'XERO', 'Xerom'],\n 1712144: ['0x801a2010', 'LAX', 'LAPO'],\n 3924011: ['0x803be02b', 'EPK', 'EPIK Protocol'],\n 4741444: ['0x80485944', 'HYD', 'Hydra Token'],\n 5249353: ['0x80501949', 'BCO', 'BitcoinOre'],\n 5249354: ['0x8050194a', 'BHD', 'BitcoinHD'],\n 5264462: ['0x8050544e', 'PTN', 'PalletOne'],\n 5655640: ['0x80564c58', 'VLX', 'Velas'],\n 5718350: ['0x8057414e', 'WAN', 'Wanchain'],\n 5741564: ['0x80579bfc', 'WAVES', 'Waves'],\n 5741565: ['0x80579bfd', 'WEST', 'Waves Enterprise'],\n 6382179: ['0x80616263', 'ABC', 'Abcmint'],\n 6517357: ['0x8063726d', 'CRM', 'Creamcoin'],\n 7171666: ['0x806d6e52', 'BROCK', 'Bitrock'],\n 7562605: ['0x8073656d', 'SEM', 'Semux'],\n 7567736: ['0x80737978', 'ION', 'ION'],\n 7777777: ['0x8076adf1', 'FCT', 'FirmaChain'],\n 7825266: ['0x80776772', 'WGR', 'WGR'],\n 7825267: ['0x80776773', 'OBSR', 'OBServer'],\n 8163271: ['0x807c8fc7', 'AFS', 'ANFS'],\n 10000118: ['0x805d30b6', 'OSMO', 'Osmosis'],\n 15118976: ['0x80e6b280', 'XDS', 'XDS'],\n 19000118: ['0x8121eb36', 'SEI', 'SEI'],\n 61717561: ['0x83adbc39', 'AQUA', 'Aquachain'],\n 77777777: ['0x84a2cb71', 'AZT', 'Aztecoin'],\n 88888888: ['0x854c5638', 'HATCH', 'Hatch'],\n 91927009: ['0x857ab1e1', 'kUSD', 'kUSD'],\n 99999996: ['0x85f5e0fc', 'GENS', 'GENS'],\n 99999997: ['0x85f5e0fd', 'EQ', 'EQ'],\n 99999998: ['0x85f5e0fe', 'FLUID', 'Fluid Chains'],\n 99999999: ['0x85f5e0ff', 'QKC', 'QuarkChain'],\n 11259375: ['0x80abcdef', 'LBR', '0L'],\n 20230101: ['0x8134afd5', 'ROH', 'Rooch'],\n 20240430: ['0x8134d82e', 'NLK', 'NuLinkCoin'],\n 608589380: ['0xa4465644', 'FVDC', 'ForumCoin'],\n 1179993420: ['0xc655454c', undefined, 'Fuel'],\n 1179993421: ['0xc655454d', 'TTNC', 'TakeTitan'],\n 1179993431: ['0xc6554557', 'MTGBP', 'MTGBP'],\n 1179993441: ['0xc6554561', 'QFS', 'Qfs'],\n 1179993451: ['0xc655456b', 'RWA', 'Asset Chain']\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.js b/dist/src/libs/humanizer/index.js index 07dc7b8bb..08ff1987e 100644 --- a/dist/src/libs/humanizer/index.js +++ b/dist/src/libs/humanizer/index.js @@ -1,84 +1,88 @@ -import humanizerInfo from '../../consts/humanizer/humanizerInfo.json'; -import { parse, stringify } from '../richJson/richJson'; -import { ensMessageModule, entryPointModule, erc20Module, erc721Module, legendsMessageModule, openseaMessageModule, permit2Module } from './messageModules'; -import OneInchModule from './modules/1Inch'; -import { aaveHumanizer } from './modules/Aave'; -import AcrossModule from './modules/Across'; -import { airdropsModule } from './modules/Airdrops'; -import asciiModule from './modules/AsciiModule'; -import curveModule from './modules/Curve'; -import { deploymentModule } from './modules/Deployment'; -import { embeddedAmbireOperationHumanizer } from './modules/embeddedAmbireOperationHumanizer'; -import { ensModule } from './modules/ENS'; -import fallbackHumanizer from './modules/FallbackHumanizer'; -import gasTankModule from './modules/GasTankModule'; -import KyberSwap from './modules/KyberSwap'; -import legendsModule from './modules/Legends'; -import { LidoModule } from './modules/Lido'; -import { openSeaModule } from './modules/OpenSea'; -import { postProcessing } from './modules/PostProcessing/postProcessModule'; -import preProcessHumanizer from './modules/PreProcess'; -import privilegeHumanizer from './modules/Privileges'; -import singletonFactory from './modules/SingletonFactory'; -import { SocketModule } from './modules/Socket'; -import sushiSwapModule from './modules/Sushiswap'; -import { genericErc20Humanizer, genericErc721Humanizer } from './modules/Tokens'; -import traderJoeModule from './modules/TraderJoe'; -import { uniswapHumanizer } from './modules/Uniswap'; -import { WALLETModule } from './modules/WALLET'; -import wrappingModule from './modules/Wrapping'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.clearHumanizerMetaObjectFromStorage = exports.humanizeMessage = exports.humanizeAccountOp = exports.humanizerCallModules = void 0; +const tslib_1 = require("tslib"); +const humanizerInfo_json_1 = tslib_1.__importDefault(require("../../consts/humanizer/humanizerInfo.json")); +const richJson_1 = require("../richJson/richJson"); +const messageModules_1 = require("./messageModules"); +const _1Inch_1 = tslib_1.__importDefault(require("./modules/1Inch")); +const Aave_1 = require("./modules/Aave"); +const Across_1 = tslib_1.__importDefault(require("./modules/Across")); +const Airdrops_1 = require("./modules/Airdrops"); +const AsciiModule_1 = tslib_1.__importDefault(require("./modules/AsciiModule")); +const Curve_1 = tslib_1.__importDefault(require("./modules/Curve")); +const Deployment_1 = require("./modules/Deployment"); +const embeddedAmbireOperationHumanizer_1 = require("./modules/embeddedAmbireOperationHumanizer"); +const ENS_1 = require("./modules/ENS"); +const FallbackHumanizer_1 = tslib_1.__importDefault(require("./modules/FallbackHumanizer")); +const GasTankModule_1 = tslib_1.__importDefault(require("./modules/GasTankModule")); +const KyberSwap_1 = tslib_1.__importDefault(require("./modules/KyberSwap")); +const Legends_1 = tslib_1.__importDefault(require("./modules/Legends")); +const Lido_1 = require("./modules/Lido"); +const OpenSea_1 = require("./modules/OpenSea"); +const postProcessModule_1 = require("./modules/PostProcessing/postProcessModule"); +const PreProcess_1 = tslib_1.__importDefault(require("./modules/PreProcess")); +const Privileges_1 = tslib_1.__importDefault(require("./modules/Privileges")); +const SingletonFactory_1 = tslib_1.__importDefault(require("./modules/SingletonFactory")); +const Socket_1 = require("./modules/Socket"); +const Sushiswap_1 = tslib_1.__importDefault(require("./modules/Sushiswap")); +const Tokens_1 = require("./modules/Tokens"); +const TraderJoe_1 = tslib_1.__importDefault(require("./modules/TraderJoe")); +const Uniswap_1 = require("./modules/Uniswap"); +const WALLET_1 = require("./modules/WALLET"); +const Wrapping_1 = tslib_1.__importDefault(require("./modules/Wrapping")); // from most generic to least generic // the final humanization is the final triggered module -export const humanizerCallModules = [ - preProcessHumanizer, - embeddedAmbireOperationHumanizer, - deploymentModule, - genericErc721Humanizer, - genericErc20Humanizer, - LidoModule, - gasTankModule, - airdropsModule, - uniswapHumanizer, - curveModule, - traderJoeModule, - KyberSwap, - SocketModule, - AcrossModule, - OneInchModule, - wrappingModule, - aaveHumanizer, - WALLETModule, - privilegeHumanizer, - sushiSwapModule, - legendsModule, - singletonFactory, - ensModule, - openSeaModule, - asciiModule, - fallbackHumanizer, - postProcessing +exports.humanizerCallModules = [ + PreProcess_1.default, + embeddedAmbireOperationHumanizer_1.embeddedAmbireOperationHumanizer, + Deployment_1.deploymentModule, + Tokens_1.genericErc721Humanizer, + Tokens_1.genericErc20Humanizer, + Lido_1.LidoModule, + GasTankModule_1.default, + Airdrops_1.airdropsModule, + Uniswap_1.uniswapHumanizer, + Curve_1.default, + TraderJoe_1.default, + KyberSwap_1.default, + Socket_1.SocketModule, + Across_1.default, + _1Inch_1.default, + Wrapping_1.default, + Aave_1.aaveHumanizer, + WALLET_1.WALLETModule, + Privileges_1.default, + Sushiswap_1.default, + Legends_1.default, + SingletonFactory_1.default, + ENS_1.ensModule, + OpenSea_1.openSeaModule, + AsciiModule_1.default, + FallbackHumanizer_1.default, + postProcessModule_1.postProcessing ]; // from least generic to most generic // the final visualization and warnings are from the first triggered module const humanizerTMModules = [ - erc20Module, - erc721Module, - permit2Module, - entryPointModule, - legendsMessageModule, - ensMessageModule, - openseaMessageModule + messageModules_1.erc20Module, + messageModules_1.erc721Module, + messageModules_1.permit2Module, + messageModules_1.entryPointModule, + messageModules_1.legendsMessageModule, + messageModules_1.ensMessageModule, + messageModules_1.openseaMessageModule ]; const humanizeAccountOp = (_accountOp, options) => { - const accountOp = parse(stringify(_accountOp)); + const accountOp = (0, richJson_1.parse)((0, richJson_1.stringify)(_accountOp)); const humanizerOptions = { ...options, networkId: accountOp.networkId }; let currentCalls = accountOp.calls; - humanizerCallModules.forEach((hm) => { + exports.humanizerCallModules.forEach((hm) => { try { - currentCalls = hm(accountOp, currentCalls, humanizerInfo, humanizerOptions); + currentCalls = hm(accountOp, currentCalls, humanizerInfo_json_1.default, humanizerOptions); } catch (error) { console.error(error); @@ -87,8 +91,9 @@ const humanizeAccountOp = (_accountOp, options) => { }); return currentCalls; }; +exports.humanizeAccountOp = humanizeAccountOp; const humanizeMessage = (_message) => { - const message = parse(stringify(_message)); + const message = (0, richJson_1.parse)((0, richJson_1.stringify)(_message)); try { // runs all modules and takes the first non empty array const { fullVisualization, warnings } = humanizerTMModules.map((m) => m(message)).filter((p) => p.fullVisualization?.length)[0] || {}; @@ -99,11 +104,12 @@ const humanizeMessage = (_message) => { return message; } }; +exports.humanizeMessage = humanizeMessage; // As of version v4.34.0 HumanizerMetaV2 in storage is no longer needed. It was // used for persisting learnt data from async operations, triggered by the // humanization process. async function clearHumanizerMetaObjectFromStorage(storage) { await storage.remove('HumanizerMetaV2'); } -export { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }; +exports.clearHumanizerMetaObjectFromStorage = clearHumanizerMetaObjectFromStorage; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/index.js.map b/dist/src/libs/humanizer/index.js.map index 888ebf17c..6ee3deda3 100644 --- a/dist/src/libs/humanizer/index.js.map +++ b/dist/src/libs/humanizer/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import humanizerInfo from '../../consts/humanizer/humanizerInfo.json'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { parse, stringify } from '../richJson/richJson'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerOptions,\n IrCall,\n IrMessage\n} from './interfaces'\nimport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n openseaMessageModule,\n permit2Module\n} from './messageModules'\nimport OneInchModule from './modules/1Inch'\nimport { aaveHumanizer } from './modules/Aave'\nimport AcrossModule from './modules/Across'\nimport { airdropsModule } from './modules/Airdrops'\nimport asciiModule from './modules/AsciiModule'\nimport curveModule from './modules/Curve'\nimport { deploymentModule } from './modules/Deployment'\nimport { embeddedAmbireOperationHumanizer } from './modules/embeddedAmbireOperationHumanizer'\nimport { ensModule } from './modules/ENS'\nimport fallbackHumanizer from './modules/FallbackHumanizer'\nimport gasTankModule from './modules/GasTankModule'\nimport KyberSwap from './modules/KyberSwap'\nimport legendsModule from './modules/Legends'\nimport { LidoModule } from './modules/Lido'\nimport { openSeaModule } from './modules/OpenSea'\nimport { postProcessing } from './modules/PostProcessing/postProcessModule'\nimport preProcessHumanizer from './modules/PreProcess'\nimport privilegeHumanizer from './modules/Privileges'\nimport singletonFactory from './modules/SingletonFactory'\nimport { SocketModule } from './modules/Socket'\nimport sushiSwapModule from './modules/Sushiswap'\nimport { genericErc20Humanizer, genericErc721Humanizer } from './modules/Tokens'\nimport traderJoeModule from './modules/TraderJoe'\nimport { uniswapHumanizer } from './modules/Uniswap'\nimport { WALLETModule } from './modules/WALLET'\nimport wrappingModule from './modules/Wrapping'\n\n// from most generic to least generic\n// the final humanization is the final triggered module\nexport const humanizerCallModules: HumanizerCallModule[] = [\n preProcessHumanizer,\n embeddedAmbireOperationHumanizer,\n deploymentModule,\n genericErc721Humanizer,\n genericErc20Humanizer,\n LidoModule,\n gasTankModule,\n airdropsModule,\n uniswapHumanizer,\n curveModule,\n traderJoeModule,\n KyberSwap,\n SocketModule,\n AcrossModule,\n OneInchModule,\n wrappingModule,\n aaveHumanizer,\n WALLETModule,\n privilegeHumanizer,\n sushiSwapModule,\n legendsModule,\n singletonFactory,\n ensModule,\n openSeaModule,\n asciiModule,\n fallbackHumanizer,\n postProcessing\n]\n\n// from least generic to most generic\n// the final visualization and warnings are from the first triggered module\nconst humanizerTMModules = [\n erc20Module,\n erc721Module,\n permit2Module,\n entryPointModule,\n legendsMessageModule,\n ensMessageModule,\n openseaMessageModule\n]\n\nconst humanizeAccountOp = (_accountOp: AccountOp, options: HumanizerOptions): IrCall[] => {\n const accountOp = parse(stringify(_accountOp))\n const humanizerOptions: HumanizerOptions = {\n ...options,\n networkId: accountOp.networkId\n }\n\n let currentCalls: IrCall[] = accountOp.calls\n humanizerCallModules.forEach((hm) => {\n try {\n currentCalls = hm(accountOp, currentCalls, humanizerInfo as HumanizerMeta, humanizerOptions)\n } catch (error) {\n console.error(error)\n // No action is needed here; we only set `currentCalls` if the module successfully resolves the calls.\n }\n })\n return currentCalls\n}\n\nconst humanizeMessage = (_message: Message): IrMessage => {\n const message = parse(stringify(_message))\n\n try {\n // runs all modules and takes the first non empty array\n const { fullVisualization, warnings } =\n humanizerTMModules.map((m) => m(message)).filter((p) => p.fullVisualization?.length)[0] || {}\n\n return { ...message, fullVisualization, warnings }\n } catch (error) {\n console.error(error)\n return message\n }\n}\n\n// As of version v4.34.0 HumanizerMetaV2 in storage is no longer needed. It was\n// used for persisting learnt data from async operations, triggered by the\n// humanization process.\nasync function clearHumanizerMetaObjectFromStorage(storage: Storage) {\n await storage.remove('HumanizerMetaV2')\n}\n\nexport { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import humanizerInfo from '../../consts/humanizer/humanizerInfo.json'\nimport { Storage } from '../../interfaces/storage'\nimport { Message } from '../../interfaces/userRequest'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { parse, stringify } from '../richJson/richJson'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerOptions,\n IrCall,\n IrMessage\n} from './interfaces'\nimport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n openseaMessageModule,\n permit2Module\n} from './messageModules'\nimport OneInchModule from './modules/1Inch'\nimport { aaveHumanizer } from './modules/Aave'\nimport AcrossModule from './modules/Across'\nimport { airdropsModule } from './modules/Airdrops'\nimport asciiModule from './modules/AsciiModule'\nimport curveModule from './modules/Curve'\nimport { deploymentModule } from './modules/Deployment'\nimport { embeddedAmbireOperationHumanizer } from './modules/embeddedAmbireOperationHumanizer'\nimport { ensModule } from './modules/ENS'\nimport fallbackHumanizer from './modules/FallbackHumanizer'\nimport gasTankModule from './modules/GasTankModule'\nimport KyberSwap from './modules/KyberSwap'\nimport legendsModule from './modules/Legends'\nimport { LidoModule } from './modules/Lido'\nimport { openSeaModule } from './modules/OpenSea'\nimport { postProcessing } from './modules/PostProcessing/postProcessModule'\nimport preProcessHumanizer from './modules/PreProcess'\nimport privilegeHumanizer from './modules/Privileges'\nimport singletonFactory from './modules/SingletonFactory'\nimport { SocketModule } from './modules/Socket'\nimport sushiSwapModule from './modules/Sushiswap'\nimport { genericErc20Humanizer, genericErc721Humanizer } from './modules/Tokens'\nimport traderJoeModule from './modules/TraderJoe'\nimport { uniswapHumanizer } from './modules/Uniswap'\nimport { WALLETModule } from './modules/WALLET'\nimport wrappingModule from './modules/Wrapping'\n\n// from most generic to least generic\n// the final humanization is the final triggered module\nexport const humanizerCallModules: HumanizerCallModule[] = [\n preProcessHumanizer,\n embeddedAmbireOperationHumanizer,\n deploymentModule,\n genericErc721Humanizer,\n genericErc20Humanizer,\n LidoModule,\n gasTankModule,\n airdropsModule,\n uniswapHumanizer,\n curveModule,\n traderJoeModule,\n KyberSwap,\n SocketModule,\n AcrossModule,\n OneInchModule,\n wrappingModule,\n aaveHumanizer,\n WALLETModule,\n privilegeHumanizer,\n sushiSwapModule,\n legendsModule,\n singletonFactory,\n ensModule,\n openSeaModule,\n asciiModule,\n fallbackHumanizer,\n postProcessing\n]\n\n// from least generic to most generic\n// the final visualization and warnings are from the first triggered module\nconst humanizerTMModules = [\n erc20Module,\n erc721Module,\n permit2Module,\n entryPointModule,\n legendsMessageModule,\n ensMessageModule,\n openseaMessageModule\n]\n\nconst humanizeAccountOp = (_accountOp: AccountOp, options: HumanizerOptions): IrCall[] => {\n const accountOp = parse(stringify(_accountOp))\n const humanizerOptions: HumanizerOptions = {\n ...options,\n networkId: accountOp.networkId\n }\n\n let currentCalls: IrCall[] = accountOp.calls\n humanizerCallModules.forEach((hm) => {\n try {\n currentCalls = hm(accountOp, currentCalls, humanizerInfo as HumanizerMeta, humanizerOptions)\n } catch (error) {\n console.error(error)\n // No action is needed here; we only set `currentCalls` if the module successfully resolves the calls.\n }\n })\n return currentCalls\n}\n\nconst humanizeMessage = (_message: Message): IrMessage => {\n const message = parse(stringify(_message))\n\n try {\n // runs all modules and takes the first non empty array\n const { fullVisualization, warnings } =\n humanizerTMModules.map((m) => m(message)).filter((p) => p.fullVisualization?.length)[0] || {}\n\n return { ...message, fullVisualization, warnings }\n } catch (error) {\n console.error(error)\n return message\n }\n}\n\n// As of version v4.34.0 HumanizerMetaV2 in storage is no longer needed. It was\n// used for persisting learnt data from async operations, triggered by the\n// humanization process.\nasync function clearHumanizerMetaObjectFromStorage(storage: Storage) {\n await storage.remove('HumanizerMetaV2')\n}\n\nexport { humanizeAccountOp, humanizeMessage, clearHumanizerMetaObjectFromStorage }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/interfaces.js b/dist/src/libs/humanizer/interfaces.js index c30bb68c1..db9191150 100644 --- a/dist/src/libs/humanizer/interfaces.js +++ b/dist/src/libs/humanizer/interfaces.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.js b/dist/src/libs/humanizer/messageModules/ensModule.js index 9b7febea0..083ac8b7e 100644 --- a/dist/src/libs/humanizer/messageModules/ensModule.js +++ b/dist/src/libs/humanizer/messageModules/ensModule.js @@ -1,5 +1,8 @@ -import { getAction, getDeadline, getLabel } from '../utils'; -export const ensMessageModule = (message) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ensMessageModule = void 0; +const utils_1 = require("../utils"); +const ensMessageModule = (message) => { if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }; if (message.content.domain.name === 'Ethereum Name Service') { @@ -8,13 +11,14 @@ export const ensMessageModule = (message) => { message.content.message.expiry) return { fullVisualization: [ - getAction('Update'), - getLabel('ENS profile pic of'), - getLabel(message.content.message.name), - getDeadline(BigInt(message.content.message.expiry) / 1000n) + (0, utils_1.getAction)('Update'), + (0, utils_1.getLabel)('ENS profile pic of'), + (0, utils_1.getLabel)(message.content.message.name), + (0, utils_1.getDeadline)(BigInt(message.content.message.expiry) / 1000n) ] }; } return { fullVisualization: [] }; }; +exports.ensMessageModule = ensMessageModule; //# sourceMappingURL=ensModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/ensModule.js.map b/dist/src/libs/humanizer/messageModules/ensModule.js.map index 597660f58..7011fcbdd 100644 --- a/dist/src/libs/humanizer/messageModules/ensModule.js.map +++ b/dist/src/libs/humanizer/messageModules/ensModule.js.map @@ -1 +1 @@ -{"version":3,"file":"ensModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/ensModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE;QAC3D,IACE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;YAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YAC5B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;YAE9B,OAAO;gBACL,iBAAiB,EAAE;oBACjB,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,oBAAoB,CAAC;oBAC9B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBACtC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;iBAC5D;aACF,CAAA;KACJ;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getDeadline, getLabel } from '../utils'\n\nexport const ensMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n if (message.content.domain.name === 'Ethereum Name Service') {\n if (\n message.content.message.upload === 'avatar' &&\n message.content.message.name &&\n message.content.message.expiry\n )\n return {\n fullVisualization: [\n getAction('Update'),\n getLabel('ENS profile pic of'),\n getLabel(message.content.message.name),\n getDeadline(BigInt(message.content.message.expiry) / 1000n)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ensModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/ensModule.ts"],"names":[],"mappings":";;;AAEA,oCAA2D;AAEpD,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE;QAC3D,IACE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;YAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YAC5B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;YAE9B,OAAO;gBACL,iBAAiB,EAAE;oBACjB,IAAA,iBAAS,EAAC,QAAQ,CAAC;oBACnB,IAAA,gBAAQ,EAAC,oBAAoB,CAAC;oBAC9B,IAAA,gBAAQ,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBACtC,IAAA,mBAAW,EAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;iBAC5D;aACF,CAAA;KACJ;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AAlBY,QAAA,gBAAgB,oBAkB5B","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getDeadline, getLabel } from '../utils'\n\nexport const ensMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n if (message.content.domain.name === 'Ethereum Name Service') {\n if (\n message.content.message.upload === 'avatar' &&\n message.content.message.name &&\n message.content.message.expiry\n )\n return {\n fullVisualization: [\n getAction('Update'),\n getLabel('ENS profile pic of'),\n getLabel(message.content.message.name),\n getDeadline(BigInt(message.content.message.expiry) / 1000n)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.js b/dist/src/libs/humanizer/messageModules/entryPointModule.js index 3378ef17d..bfbc075db 100644 --- a/dist/src/libs/humanizer/messageModules/entryPointModule.js +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.js @@ -1,16 +1,20 @@ -import { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../userOperation/userOperation'; -import { getAction, getAddressVisualization, getLabel } from '../utils'; -export const entryPointModule = (message) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.entryPointModule = void 0; +const userOperation_1 = require("../../userOperation/userOperation"); +const utils_1 = require("../utils"); +const entryPointModule = (message) => { if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }; - if (message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) + if (message.fromActionId === userOperation_1.ENTRY_POINT_AUTHORIZATION_REQUEST_ID) return { fullVisualization: [ - getAction('Authorize entry point'), - getLabel('for'), - getAddressVisualization(message.accountAddr) + (0, utils_1.getAction)('Authorize entry point'), + (0, utils_1.getLabel)('for'), + (0, utils_1.getAddressVisualization)(message.accountAddr) ] }; return { fullVisualization: [] }; }; +exports.entryPointModule = entryPointModule; //# sourceMappingURL=entryPointModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/entryPointModule.js.map b/dist/src/libs/humanizer/messageModules/entryPointModule.js.map index b3d33a615..144b02df1 100644 --- a/dist/src/libs/humanizer/messageModules/entryPointModule.js.map +++ b/dist/src/libs/humanizer/messageModules/entryPointModule.js.map @@ -1 +1 @@ -{"version":3,"file":"entryPointModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/entryPointModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oCAAoC,EAAE,MAAM,mCAAmC,CAAA;AAExF,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEvE,MAAM,CAAC,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAE7E,IAAI,OAAO,CAAC,YAAY,KAAK,oCAAoC;QAC/D,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,uBAAuB,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC;gBACf,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC;aAC7C;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../userOperation/userOperation'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const entryPointModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n\n if (message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return {\n fullVisualization: [\n getAction('Authorize entry point'),\n getLabel('for'),\n getAddressVisualization(message.accountAddr)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"entryPointModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/entryPointModule.ts"],"names":[],"mappings":";;;AACA,qEAAwF;AAExF,oCAAuE;AAEhE,MAAM,gBAAgB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAChF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAE7E,IAAI,OAAO,CAAC,YAAY,KAAK,oDAAoC;QAC/D,OAAO;YACL,iBAAiB,EAAE;gBACjB,IAAA,iBAAS,EAAC,uBAAuB,CAAC;gBAClC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,+BAAuB,EAAC,OAAO,CAAC,WAAW,CAAC;aAC7C;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AAZY,QAAA,gBAAgB,oBAY5B","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../userOperation/userOperation'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const entryPointModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n\n if (message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return {\n fullVisualization: [\n getAction('Authorize entry point'),\n getLabel('for'),\n getAddressVisualization(message.accountAddr)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.js b/dist/src/libs/humanizer/messageModules/erc20Module.js index 0acaf5752..832e5d7ba 100644 --- a/dist/src/libs/humanizer/messageModules/erc20Module.js +++ b/dist/src/libs/humanizer/messageModules/erc20Module.js @@ -1,5 +1,8 @@ -import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; -export const erc20Module = (message) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.erc20Module = void 0; +const utils_1 = require("../utils"); +const erc20Module = (message) => { if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }; const tm = message.content; @@ -10,12 +13,12 @@ export const erc20Module = (message) => { tm.domain.verifyingContract) { return { fullVisualization: [ - getAction('Grant approval'), - getLabel('for'), - getToken(tm.domain.verifyingContract, tm.message.value), - getLabel('to'), - getAddressVisualization(tm.message.spender), - tm.message.deadline ? getDeadline(tm.message.deadline) : null + (0, utils_1.getAction)('Grant approval'), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(tm.domain.verifyingContract, tm.message.value), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(tm.message.spender), + tm.message.deadline ? (0, utils_1.getDeadline)(tm.message.deadline) : null ].filter((x) => x) }; } @@ -27,14 +30,15 @@ export const erc20Module = (message) => { tm?.message?.details?.expiration) { return { fullVisualization: [ - getAction('Approve'), - getAddressVisualization(tm.message.spender), - getLabel('to use'), - getToken(tm.message.details.token, BigInt(tm.message.details.amount)), - getDeadline(tm.message.details.expiration) + (0, utils_1.getAction)('Approve'), + (0, utils_1.getAddressVisualization)(tm.message.spender), + (0, utils_1.getLabel)('to use'), + (0, utils_1.getToken)(tm.message.details.token, BigInt(tm.message.details.amount)), + (0, utils_1.getDeadline)(tm.message.details.expiration) ] }; } return { fullVisualization: [] }; }; +exports.erc20Module = erc20Module; //# sourceMappingURL=erc20Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc20Module.js.map b/dist/src/libs/humanizer/messageModules/erc20Module.js.map index dd1c87b20..e71296a89 100644 --- a/dist/src/libs/humanizer/messageModules/erc20Module.js.map +++ b/dist/src/libs/humanizer/messageModules/erc20Module.js.map @@ -1 +1 @@ -{"version":3,"file":"erc20Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc20Module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE9F,MAAM,CAAC,MAAM,WAAW,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC3E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO;QACV,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;QAChF,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAC3B;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,gBAAgB,CAAC;gBAC3B,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAkB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;aAC9D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAA6B;SAC/C,CAAA;KACF;IACD,IACE,EAAE,CAAC,KAAK,CAAC,YAAY;QACrB,EAAE,CAAC,WAAW,KAAK,cAAc;QACjC,EAAE,EAAE,OAAO,EAAE,OAAO;QACpB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;QAC3B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;QAC5B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAChC;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,SAAS,CAAC;gBACpB,uBAAuB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,QAAQ,CAAC,QAAQ,CAAC;gBAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;aAC3C;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nexport const erc20Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message &&\n ['owner', 'spender', 'value', 'nonce', 'deadline'].every((i) => i in tm.message) &&\n tm.domain.verifyingContract\n ) {\n return {\n fullVisualization: [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(tm.domain.verifyingContract!, tm.message.value),\n getLabel('to'),\n getAddressVisualization(tm.message.spender),\n tm.message.deadline ? getDeadline(tm.message.deadline) : null\n ].filter((x) => x) as HumanizerVisualization[]\n }\n }\n if (\n tm.types.PermitSingle &&\n tm.primaryType === 'PermitSingle' &&\n tm?.message?.spender &&\n tm?.message?.details?.token &&\n tm?.message?.details?.amount &&\n tm?.message?.details?.expiration\n ) {\n return {\n fullVisualization: [\n getAction('Approve'),\n getAddressVisualization(tm.message.spender),\n getLabel('to use'),\n getToken(tm.message.details.token, BigInt(tm.message.details.amount)),\n getDeadline(tm.message.details.expiration)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"erc20Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc20Module.ts"],"names":[],"mappings":";;;AAEA,oCAA8F;AAEvF,MAAM,WAAW,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC3E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO;QACV,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;QAChF,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAC3B;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,IAAA,iBAAS,EAAC,gBAAgB,CAAC;gBAC3B,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,EAAE,CAAC,MAAM,CAAC,iBAAkB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxD,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,mBAAW,EAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;aAC9D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAA6B;SAC/C,CAAA;KACF;IACD,IACE,EAAE,CAAC,KAAK,CAAC,YAAY;QACrB,EAAE,CAAC,WAAW,KAAK,cAAc;QACjC,EAAE,EAAE,OAAO,EAAE,OAAO;QACpB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;QAC3B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;QAC5B,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAChC;QACA,OAAO;YACL,iBAAiB,EAAE;gBACjB,IAAA,iBAAS,EAAC,SAAS,CAAC;gBACpB,IAAA,+BAAuB,EAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC3C,IAAA,gBAAQ,EAAC,QAAQ,CAAC;gBAClB,IAAA,gBAAQ,EAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrE,IAAA,mBAAW,EAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;aAC3C;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AAxCY,QAAA,WAAW,eAwCvB","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nexport const erc20Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message &&\n ['owner', 'spender', 'value', 'nonce', 'deadline'].every((i) => i in tm.message) &&\n tm.domain.verifyingContract\n ) {\n return {\n fullVisualization: [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(tm.domain.verifyingContract!, tm.message.value),\n getLabel('to'),\n getAddressVisualization(tm.message.spender),\n tm.message.deadline ? getDeadline(tm.message.deadline) : null\n ].filter((x) => x) as HumanizerVisualization[]\n }\n }\n if (\n tm.types.PermitSingle &&\n tm.primaryType === 'PermitSingle' &&\n tm?.message?.spender &&\n tm?.message?.details?.token &&\n tm?.message?.details?.amount &&\n tm?.message?.details?.expiration\n ) {\n return {\n fullVisualization: [\n getAction('Approve'),\n getAddressVisualization(tm.message.spender),\n getLabel('to use'),\n getToken(tm.message.details.token, BigInt(tm.message.details.amount)),\n getDeadline(tm.message.details.expiration)\n ]\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.js b/dist/src/libs/humanizer/messageModules/erc721Module.js index acfedeb38..884856091 100644 --- a/dist/src/libs/humanizer/messageModules/erc721Module.js +++ b/dist/src/libs/humanizer/messageModules/erc721Module.js @@ -1,16 +1,19 @@ -import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.erc721Module = void 0; +const utils_1 = require("../utils"); const visualizePermit = (spender, tokenId, deadline, contract) => { const res = [ - getAction('Permit use of'), - getToken(contract, tokenId), - getLabel('to'), - getAddressVisualization(spender) + (0, utils_1.getAction)('Permit use of'), + (0, utils_1.getToken)(contract, tokenId), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(spender) ]; - if (getDeadline(deadline)) - res.push(getDeadline(deadline)); + if ((0, utils_1.getDeadline)(deadline)) + res.push((0, utils_1.getDeadline)(deadline)); return res; }; -export const erc721Module = (message) => { +const erc721Module = (message) => { if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }; const tm = message.content; @@ -26,4 +29,5 @@ export const erc721Module = (message) => { } return { fullVisualization: [] }; }; +exports.erc721Module = erc721Module; //# sourceMappingURL=erc721Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/erc721Module.js.map b/dist/src/libs/humanizer/messageModules/erc721Module.js.map index 628bae34e..aea858039 100644 --- a/dist/src/libs/humanizer/messageModules/erc721Module.js.map +++ b/dist/src/libs/humanizer/messageModules/erc721Module.js.map @@ -1 +1 @@ -{"version":3,"file":"erc721Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc721Module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE9F,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,OAAe,EACf,QAAgB,EAChB,QAAgB,EACU,EAAE;IAC5B,MAAM,GAAG,GAAG;QACV,SAAS,CAAC,eAAe,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;QACd,uBAAuB,CAAC,OAAO,CAAC;KACjC,CAAA;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAA2B,CAAC,CAAA;IACpF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC5E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,KAAK;QAChB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB;QACA,OAAO;YACL,iBAAiB,EAAE,eAAe,CAChC,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB,EAAE,CAAC,MAAM,CAAC,iBAA2B,CACtC;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nconst visualizePermit = (\n spender: string,\n tokenId: bigint,\n deadline: bigint,\n contract: string\n): HumanizerVisualization[] => {\n const res = [\n getAction('Permit use of'),\n getToken(contract, tokenId),\n getLabel('to'),\n getAddressVisualization(spender)\n ]\n if (getDeadline(deadline)) res.push(getDeadline(deadline) as HumanizerVisualization)\n return res\n}\nexport const erc721Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message.spender &&\n tm.message.tokenId &&\n tm.message.nonce &&\n tm.message.deadline\n ) {\n return {\n fullVisualization: visualizePermit(\n tm.message.spender,\n tm.message.tokenId,\n tm.message.deadline,\n tm.domain.verifyingContract as string\n )\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"erc721Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/erc721Module.ts"],"names":[],"mappings":";;;AAEA,oCAA8F;AAE9F,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,OAAe,EACf,QAAgB,EAChB,QAAgB,EACU,EAAE;IAC5B,MAAM,GAAG,GAAG;QACV,IAAA,iBAAS,EAAC,eAAe,CAAC;QAC1B,IAAA,gBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,IAAA,gBAAQ,EAAC,IAAI,CAAC;QACd,IAAA,+BAAuB,EAAC,OAAO,CAAC;KACjC,CAAA;IACD,IAAI,IAAA,mBAAW,EAAC,QAAQ,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,IAAA,mBAAW,EAAC,QAAQ,CAA2B,CAAC,CAAA;IACpF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AACM,MAAM,YAAY,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC5E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,IACE,EAAE,CAAC,KAAK,CAAC,MAAM;QACf,EAAE,CAAC,WAAW,KAAK,QAAQ;QAC3B,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,OAAO;QAClB,EAAE,CAAC,OAAO,CAAC,KAAK;QAChB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB;QACA,OAAO;YACL,iBAAiB,EAAE,eAAe,CAChC,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,OAAO,EAClB,EAAE,CAAC,OAAO,CAAC,QAAQ,EACnB,EAAE,CAAC,MAAM,CAAC,iBAA2B,CACtC;SACF,CAAA;KACF;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AArBY,QAAA,YAAY,gBAqBxB","sourcesContent":["import { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\nconst visualizePermit = (\n spender: string,\n tokenId: bigint,\n deadline: bigint,\n contract: string\n): HumanizerVisualization[] => {\n const res = [\n getAction('Permit use of'),\n getToken(contract, tokenId),\n getLabel('to'),\n getAddressVisualization(spender)\n ]\n if (getDeadline(deadline)) res.push(getDeadline(deadline) as HumanizerVisualization)\n return res\n}\nexport const erc721Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n if (\n tm.types.Permit &&\n tm.primaryType === 'Permit' &&\n tm.message.spender &&\n tm.message.tokenId &&\n tm.message.nonce &&\n tm.message.deadline\n ) {\n return {\n fullVisualization: visualizePermit(\n tm.message.spender,\n tm.message.tokenId,\n tm.message.deadline,\n tm.domain.verifyingContract as string\n )\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.js b/dist/src/libs/humanizer/messageModules/index.js index 12f88e4aa..cca906e81 100644 --- a/dist/src/libs/humanizer/messageModules/index.js +++ b/dist/src/libs/humanizer/messageModules/index.js @@ -1,9 +1,18 @@ -import { ensMessageModule } from './ensModule'; -import { entryPointModule } from './entryPointModule'; -import { erc20Module } from './erc20Module'; -import { erc721Module } from './erc721Module'; -import { legendsMessageModule } from './legendsModule'; -import { openseaMessageModule } from './openseaModule'; -import { permit2Module } from './permit2Module'; -export { ensMessageModule, entryPointModule, erc20Module, erc721Module, legendsMessageModule, permit2Module, openseaMessageModule }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openseaMessageModule = exports.permit2Module = exports.legendsMessageModule = exports.erc721Module = exports.erc20Module = exports.entryPointModule = exports.ensMessageModule = void 0; +const ensModule_1 = require("./ensModule"); +Object.defineProperty(exports, "ensMessageModule", { enumerable: true, get: function () { return ensModule_1.ensMessageModule; } }); +const entryPointModule_1 = require("./entryPointModule"); +Object.defineProperty(exports, "entryPointModule", { enumerable: true, get: function () { return entryPointModule_1.entryPointModule; } }); +const erc20Module_1 = require("./erc20Module"); +Object.defineProperty(exports, "erc20Module", { enumerable: true, get: function () { return erc20Module_1.erc20Module; } }); +const erc721Module_1 = require("./erc721Module"); +Object.defineProperty(exports, "erc721Module", { enumerable: true, get: function () { return erc721Module_1.erc721Module; } }); +const legendsModule_1 = require("./legendsModule"); +Object.defineProperty(exports, "legendsMessageModule", { enumerable: true, get: function () { return legendsModule_1.legendsMessageModule; } }); +const openseaModule_1 = require("./openseaModule"); +Object.defineProperty(exports, "openseaMessageModule", { enumerable: true, get: function () { return openseaModule_1.openseaMessageModule; } }); +const permit2Module_1 = require("./permit2Module"); +Object.defineProperty(exports, "permit2Module", { enumerable: true, get: function () { return permit2Module_1.permit2Module; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/index.js.map b/dist/src/libs/humanizer/messageModules/index.js.map index c26145035..4e49de623 100644 --- a/dist/src/libs/humanizer/messageModules/index.js.map +++ b/dist/src/libs/humanizer/messageModules/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACrB,CAAA","sourcesContent":["import { ensMessageModule } from './ensModule'\nimport { entryPointModule } from './entryPointModule'\nimport { erc20Module } from './erc20Module'\nimport { erc721Module } from './erc721Module'\nimport { legendsMessageModule } from './legendsModule'\nimport { openseaMessageModule } from './openseaModule'\nimport { permit2Module } from './permit2Module'\n\nexport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n permit2Module,\n openseaMessageModule\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/index.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAS5C,iGATO,4BAAgB,OASP;AARlB,yDAAqD;AASnD,iGATO,mCAAgB,OASP;AARlB,+CAA2C;AASzC,4FATO,yBAAW,OASP;AARb,iDAA6C;AAS3C,6FATO,2BAAY,OASP;AARd,mDAAsD;AASpD,qGATO,oCAAoB,OASP;AARtB,mDAAsD;AAUpD,qGAVO,oCAAoB,OAUP;AATtB,mDAA+C;AAQ7C,8FARO,6BAAa,OAQP","sourcesContent":["import { ensMessageModule } from './ensModule'\nimport { entryPointModule } from './entryPointModule'\nimport { erc20Module } from './erc20Module'\nimport { erc721Module } from './erc721Module'\nimport { legendsMessageModule } from './legendsModule'\nimport { openseaMessageModule } from './openseaModule'\nimport { permit2Module } from './permit2Module'\n\nexport {\n ensMessageModule,\n entryPointModule,\n erc20Module,\n erc721Module,\n legendsMessageModule,\n permit2Module,\n openseaMessageModule\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.js b/dist/src/libs/humanizer/messageModules/legendsModule.js index 6a043e65b..b1ed8510e 100644 --- a/dist/src/libs/humanizer/messageModules/legendsModule.js +++ b/dist/src/libs/humanizer/messageModules/legendsModule.js @@ -1,11 +1,14 @@ -import { isHexString, toUtf8Bytes, toUtf8String } from 'ethers'; -import { getAction, getAddressVisualization, getLabel } from '../utils'; -export const legendsMessageModule = (message) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.legendsMessageModule = void 0; +const ethers_1 = require("ethers"); +const utils_1 = require("../utils"); +const legendsMessageModule = (message) => { if (message.content.kind !== 'message' || typeof message.content.message !== 'string') return { fullVisualization: [] }; let messageAsText = message.content.message; - if (isHexString(message.content.message) && message.content.message.length % 2 === 0) { - messageAsText = toUtf8String(toUtf8Bytes(message.content.message)); + if ((0, ethers_1.isHexString)(message.content.message) && message.content.message.length % 2 === 0) { + messageAsText = (0, ethers_1.toUtf8String)((0, ethers_1.toUtf8Bytes)(message.content.message)); } const messageRegex = /Assign 0x[a-fA-F0-9]{40} to Ambire Legends 0x[a-fA-F0-9]{40}/; const addressRegex = /0x[a-fA-F0-9]{40}/g; @@ -13,13 +16,14 @@ export const legendsMessageModule = (message) => { messageAsText.match(addressRegex)[0] === message.accountAddr) return { fullVisualization: [ - getAction('Link'), - getAddressVisualization(messageAsText.match(addressRegex)[0]), - getLabel('to'), - getAddressVisualization(messageAsText.match(addressRegex)[1]), - getLabel('for Ambire Legends', true) + (0, utils_1.getAction)('Link'), + (0, utils_1.getAddressVisualization)(messageAsText.match(addressRegex)[0]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(messageAsText.match(addressRegex)[1]), + (0, utils_1.getLabel)('for Ambire Legends', true) ] }; return { fullVisualization: [] }; }; +exports.legendsMessageModule = legendsMessageModule; //# sourceMappingURL=legendsModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/legendsModule.js.map b/dist/src/libs/humanizer/messageModules/legendsModule.js.map index 683ac4ed7..5b7a14633 100644 --- a/dist/src/libs/humanizer/messageModules/legendsModule.js.map +++ b/dist/src/libs/humanizer/messageModules/legendsModule.js.map @@ -1 +1 @@ -{"version":3,"file":"legendsModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/legendsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAI/D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEvE,MAAM,CAAC,MAAM,oBAAoB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IACpF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;QACnF,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAClC,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAA;IAC3C,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QACpF,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;KACnE;IACD,MAAM,YAAY,GAAG,8DAA8D,CAAA;IACnF,MAAM,YAAY,GAAG,oBAAoB,CAAA;IACzC,IACE,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW;QAE7D,OAAO;YACL,iBAAiB,EAAE;gBACjB,SAAS,CAAC,MAAM,CAAC;gBACjB,uBAAuB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;aACrC;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { isHexString, toUtf8Bytes, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const legendsMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'message' || typeof message.content.message !== 'string')\n return { fullVisualization: [] }\n let messageAsText = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(toUtf8Bytes(message.content.message))\n }\n const messageRegex = /Assign 0x[a-fA-F0-9]{40} to Ambire Legends 0x[a-fA-F0-9]{40}/\n const addressRegex = /0x[a-fA-F0-9]{40}/g\n if (\n messageAsText.match(messageRegex) &&\n messageAsText.match(addressRegex)![0] === message.accountAddr\n )\n return {\n fullVisualization: [\n getAction('Link'),\n getAddressVisualization(messageAsText.match(addressRegex)![0]),\n getLabel('to'),\n getAddressVisualization(messageAsText.match(addressRegex)![1]),\n getLabel('for Ambire Legends', true)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"legendsModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/legendsModule.ts"],"names":[],"mappings":";;;AAAA,mCAA+D;AAI/D,oCAAuE;AAEhE,MAAM,oBAAoB,GAAgC,CAAC,OAAgB,EAAE,EAAE;IACpF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;QACnF,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAClC,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAA;IAC3C,IAAI,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QACpF,aAAa,GAAG,IAAA,qBAAY,EAAC,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;KACnE;IACD,MAAM,YAAY,GAAG,8DAA8D,CAAA;IACnF,MAAM,YAAY,GAAG,oBAAoB,CAAA;IACzC,IACE,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW;QAE7D,OAAO;YACL,iBAAiB,EAAE;gBACjB,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,+BAAuB,EAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAA,gBAAQ,EAAC,oBAAoB,EAAE,IAAI,CAAC;aACrC;SACF,CAAA;IACH,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AAvBY,QAAA,oBAAoB,wBAuBhC","sourcesContent":["import { isHexString, toUtf8Bytes, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../utils'\n\nexport const legendsMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'message' || typeof message.content.message !== 'string')\n return { fullVisualization: [] }\n let messageAsText = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(toUtf8Bytes(message.content.message))\n }\n const messageRegex = /Assign 0x[a-fA-F0-9]{40} to Ambire Legends 0x[a-fA-F0-9]{40}/\n const addressRegex = /0x[a-fA-F0-9]{40}/g\n if (\n messageAsText.match(messageRegex) &&\n messageAsText.match(addressRegex)![0] === message.accountAddr\n )\n return {\n fullVisualization: [\n getAction('Link'),\n getAddressVisualization(messageAsText.match(addressRegex)![0]),\n getLabel('to'),\n getAddressVisualization(messageAsText.match(addressRegex)![1]),\n getLabel('for Ambire Legends', true)\n ]\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.js b/dist/src/libs/humanizer/messageModules/openseaModule.js index 348248b60..527bc4ce0 100644 --- a/dist/src/libs/humanizer/messageModules/openseaModule.js +++ b/dist/src/libs/humanizer/messageModules/openseaModule.js @@ -1,5 +1,8 @@ -import { isHexString, toUtf8String } from 'ethers'; -import { getAction, getLabel, getToken } from '../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openseaMessageModule = void 0; +const ethers_1 = require("ethers"); +const utils_1 = require("../utils"); const SEAPORT_ADDRESS = [ '0x0000000000000068F116a894984e2DB1123eB395', '0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC', @@ -8,24 +11,24 @@ const SEAPORT_ADDRESS = [ '0x00e5F120f500006757E984F1DED400fc00370000', '0x0000f00000627D293Ab4Dfb40082001724dB006F' ]; -export const openseaMessageModule = (message) => { +const openseaMessageModule = (message) => { if (message.content.kind === 'message' && typeof message.content.message === 'string') { let messageAsText = message.content.message; - if (isHexString(message.content.message) && message.content.message.length % 2 === 0) { - messageAsText = toUtf8String(message.content.message); + if ((0, ethers_1.isHexString)(message.content.message) && message.content.message.length % 2 === 0) { + messageAsText = (0, ethers_1.toUtf8String)(message.content.message); } const OPENSEA_LOGIN_MESSAGE_PREFIX = 'Welcome to OpenSea!'; if (messageAsText.includes(OPENSEA_LOGIN_MESSAGE_PREFIX) && messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())) { return { - fullVisualization: [getAction('Log in'), getLabel('OpenSea', true)] + fullVisualization: [(0, utils_1.getAction)('Log in'), (0, utils_1.getLabel)('OpenSea', true)] }; } const OPENSEA_PRO_LOGIN_MESSAGE_PREFIX = 'Sign in to OpenSea Pro'; if (messageAsText.includes(OPENSEA_PRO_LOGIN_MESSAGE_PREFIX) && messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())) { return { - fullVisualization: [getAction('Log in'), getLabel('OpenSea Pro', true)] + fullVisualization: [(0, utils_1.getAction)('Log in'), (0, utils_1.getLabel)('OpenSea Pro', true)] }; } } @@ -53,14 +56,15 @@ export const openseaMessageModule = (message) => { .filter((x) => x); return { fullVisualization: [ - getAction('Make offer to swap'), - ...itemsToList.map(({ address, amountOrId }) => getToken(address, amountOrId)), - getLabel('for'), - ...itemsToGet.map(({ address, amountOrId }) => getToken(address, amountOrId)) + (0, utils_1.getAction)('Make offer to swap'), + ...itemsToList.map(({ address, amountOrId }) => (0, utils_1.getToken)(address, amountOrId)), + (0, utils_1.getLabel)('for'), + ...itemsToGet.map(({ address, amountOrId }) => (0, utils_1.getToken)(address, amountOrId)) ] }; } } return { fullVisualization: [] }; }; +exports.openseaMessageModule = openseaMessageModule; //# sourceMappingURL=openseaModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/openseaModule.js.map b/dist/src/libs/humanizer/messageModules/openseaModule.js.map index 08f53b81b..1d3b9aa20 100644 --- a/dist/src/libs/humanizer/messageModules/openseaModule.js.map +++ b/dist/src/libs/humanizer/messageModules/openseaModule.js.map @@ -1 +1 @@ -{"version":3,"file":"openseaModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/openseaModule.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getLabel, getToken } from '../utils'\n\nconst SEAPORT_ADDRESS = [\n '0x0000000000000068F116a894984e2DB1123eB395',\n\n '0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC',\n\n '0x00000000006c3852cbEf3e08E8dF289169EdE581',\n\n '0x00000000F9490004C11Cef243f5400493c00Ad63',\n\n '0x00e5F120f500006757E984F1DED400fc00370000',\n\n '0x0000f00000627D293Ab4Dfb40082001724dB006F'\n]\n\nexport const openseaMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind === 'message' && typeof message.content.message === 'string') {\n let messageAsText: string = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(message.content.message)\n }\n const OPENSEA_LOGIN_MESSAGE_PREFIX = 'Welcome to OpenSea!'\n if (\n messageAsText.includes(OPENSEA_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea', true)]\n }\n }\n const OPENSEA_PRO_LOGIN_MESSAGE_PREFIX = 'Sign in to OpenSea Pro'\n if (\n messageAsText.includes(OPENSEA_PRO_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea Pro', true)]\n }\n }\n }\n if (message.content.kind === 'typedMessage') {\n if (\n message.content.domain.name === 'Seaport' &&\n message.content.domain.version === '1.6' &&\n SEAPORT_ADDRESS.includes(message.content.domain.verifyingContract || '')\n ) {\n const considerations = message.content.message.consideration\n const offer = message.content.message.offer\n\n const extractItems = ({ itemType, token, identifierOrCriteria, startAmount }: any) => {\n if (itemType === '0') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '1') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '2') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n if (itemType === '3') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n return null\n }\n const itemsToList = offer.map(extractItems).filter((x: any) => x)\n const itemsToGet = considerations\n .filter(({ recipient }: any) => recipient === message.accountAddr)\n .map(extractItems)\n .filter((x: any) => x)\n\n return {\n fullVisualization: [\n getAction('Make offer to swap'),\n ...itemsToList.map(({ address, amountOrId }: any) => getToken(address, amountOrId)),\n getLabel('for'),\n ...itemsToGet.map(({ address, amountOrId }: any) => getToken(address, amountOrId))\n ]\n }\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"openseaModule.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/openseaModule.ts"],"names":[],"mappings":"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","sourcesContent":["import { isHexString, toUtf8String } from 'ethers'\n\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule } from '../interfaces'\nimport { getAction, getLabel, getToken } from '../utils'\n\nconst SEAPORT_ADDRESS = [\n '0x0000000000000068F116a894984e2DB1123eB395',\n\n '0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC',\n\n '0x00000000006c3852cbEf3e08E8dF289169EdE581',\n\n '0x00000000F9490004C11Cef243f5400493c00Ad63',\n\n '0x00e5F120f500006757E984F1DED400fc00370000',\n\n '0x0000f00000627D293Ab4Dfb40082001724dB006F'\n]\n\nexport const openseaMessageModule: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind === 'message' && typeof message.content.message === 'string') {\n let messageAsText: string = message.content.message\n if (isHexString(message.content.message) && message.content.message.length % 2 === 0) {\n messageAsText = toUtf8String(message.content.message)\n }\n const OPENSEA_LOGIN_MESSAGE_PREFIX = 'Welcome to OpenSea!'\n if (\n messageAsText.includes(OPENSEA_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea', true)]\n }\n }\n const OPENSEA_PRO_LOGIN_MESSAGE_PREFIX = 'Sign in to OpenSea Pro'\n if (\n messageAsText.includes(OPENSEA_PRO_LOGIN_MESSAGE_PREFIX) &&\n messageAsText.toLowerCase().includes(message.accountAddr.toLowerCase())\n ) {\n return {\n fullVisualization: [getAction('Log in'), getLabel('OpenSea Pro', true)]\n }\n }\n }\n if (message.content.kind === 'typedMessage') {\n if (\n message.content.domain.name === 'Seaport' &&\n message.content.domain.version === '1.6' &&\n SEAPORT_ADDRESS.includes(message.content.domain.verifyingContract || '')\n ) {\n const considerations = message.content.message.consideration\n const offer = message.content.message.offer\n\n const extractItems = ({ itemType, token, identifierOrCriteria, startAmount }: any) => {\n if (itemType === '0') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '1') return { address: token, amountOrId: BigInt(startAmount) }\n if (itemType === '2') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n if (itemType === '3') return { address: token, amountOrId: BigInt(identifierOrCriteria) }\n return null\n }\n const itemsToList = offer.map(extractItems).filter((x: any) => x)\n const itemsToGet = considerations\n .filter(({ recipient }: any) => recipient === message.accountAddr)\n .map(extractItems)\n .filter((x: any) => x)\n\n return {\n fullVisualization: [\n getAction('Make offer to swap'),\n ...itemsToList.map(({ address, amountOrId }: any) => getToken(address, amountOrId)),\n getLabel('for'),\n ...itemsToGet.map(({ address, amountOrId }: any) => getToken(address, amountOrId))\n ]\n }\n }\n }\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.js b/dist/src/libs/humanizer/messageModules/permit2Module.js index e559311dd..b3ead4afb 100644 --- a/dist/src/libs/humanizer/messageModules/permit2Module.js +++ b/dist/src/libs/humanizer/messageModules/permit2Module.js @@ -1,32 +1,35 @@ -import { PERMIT_2_ADDRESS } from '../../../consts/addresses'; -import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.permit2Module = void 0; +const addresses_1 = require("../../../consts/addresses"); +const utils_1 = require("../utils"); const visualizePermit = (permit) => { return [ - getAction('Permit'), - getAddressVisualization(PERMIT_2_ADDRESS), - getLabel('to use'), - getToken(permit.token, permit.amount), - getLabel('for time period'), - getDeadline(permit.expiration) + (0, utils_1.getAction)('Permit'), + (0, utils_1.getAddressVisualization)(addresses_1.PERMIT_2_ADDRESS), + (0, utils_1.getLabel)('to use'), + (0, utils_1.getToken)(permit.token, permit.amount), + (0, utils_1.getLabel)('for time period'), + (0, utils_1.getDeadline)(permit.expiration) ]; }; -export const permit2Module = (message) => { +const permit2Module = (message) => { if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }; const tm = message.content; const visualizations = []; if (tm?.domain?.verifyingContract && - tm.domain.verifyingContract.toLowerCase() === PERMIT_2_ADDRESS.toLowerCase()) { + tm.domain.verifyingContract.toLowerCase() === addresses_1.PERMIT_2_ADDRESS.toLowerCase()) { if (tm?.types?.PermitSingle?.[0]?.type === 'PermitDetails') { - visualizations.push(...visualizePermit(tm.message.details), getLabel('this whole signatuere'), getDeadline(tm.message.sigDeadline)); + visualizations.push(...visualizePermit(tm.message.details), (0, utils_1.getLabel)('this whole signatuere'), (0, utils_1.getDeadline)(tm.message.sigDeadline)); } else if (tm?.types?.PermitBatch?.[0]?.type === 'PermitDetails[]') { tm.message.details.forEach((permitDetails, i) => { visualizations.push(...[ - getLabel(`Permit #${i + 1}`), + (0, utils_1.getLabel)(`Permit #${i + 1}`), ...visualizePermit(permitDetails), - getLabel('this whole signatuere'), - getDeadline(tm.message.sigDeadline) + (0, utils_1.getLabel)('this whole signatuere'), + (0, utils_1.getDeadline)(tm.message.sigDeadline) ]); }); } @@ -34,4 +37,5 @@ export const permit2Module = (message) => { } return { fullVisualization: [] }; }; +exports.permit2Module = permit2Module; //# sourceMappingURL=permit2Module.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/messageModules/permit2Module.js.map b/dist/src/libs/humanizer/messageModules/permit2Module.js.map index 40800cdce..ef27b9a3a 100644 --- a/dist/src/libs/humanizer/messageModules/permit2Module.js.map +++ b/dist/src/libs/humanizer/messageModules/permit2Module.js.map @@ -1 +1 @@ -{"version":3,"file":"permit2Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/permit2Module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAG5D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoC9F,MAAM,eAAe,GAAG,CAAC,MAAqB,EAA4B,EAAE;IAC1E,OAAO;QACL,SAAS,CAAC,QAAQ,CAAC;QACnB,uBAAuB,CAAC,gBAAgB,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC;QAClB,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACrC,QAAQ,CAAC,iBAAiB,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;KAC/B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,MAAM,cAAc,GAA6B,EAAE,CAAA;IACnD,IACE,EAAE,EAAE,MAAM,EAAE,iBAAiB;QAC7B,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,WAAW,EAAE,EAC5E;QACA,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,eAAe,EAAE;YAC1D,cAAc,CAAC,IAAI,CACjB,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EACtC,QAAQ,CAAC,uBAAuB,CAAC,EACjC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CACpC,CAAA;SACF;aAAM,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,iBAAiB,EAAE;YAClE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAA4B,EAAE,CAAS,EAAE,EAAE;gBACrE,cAAc,CAAC,IAAI,CACjB,GAAG;oBACD,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,GAAG,eAAe,CAAC,aAAa,CAAC;oBACjC,QAAQ,CAAC,uBAAuB,CAAC;oBACjC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAA2B;iBAC9D,CACF,CAAA;YACH,CAAC,CAAC,CAAA;SACH;QACD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAA;KAC7C;IAED,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA","sourcesContent":["import { PERMIT_2_ADDRESS } from '../../../consts/addresses'\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\n// interfaces\n// export interface PermitSingle {\n// details: PermitDetails\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// interface PermitBatch {\n// details: PermitDetails[]\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// example\n// const permitSingle: PermitSingle = {\n// details: {\n// token: tokenAddress,\n// amount: MaxAllowanceTransferAmount,\n// // You may set your own deadline - we use 30 days.\n// expiration: toDeadline(/* 30 days= */ 1000 * 60 * 60 * 24 * 30),\n// nonce\n// },\n// spender: spenderAddress,\n// // You may set your own deadline - we use 30 minutes.\n// sigDeadline: toDeadline(/* 30 minutes= */ 1000 * 60 * 60 * 30)\n// }\n\ninterface PermitDetails {\n token: string\n amount: bigint\n expiration: bigint\n nonce: bigint\n}\n\nconst visualizePermit = (permit: PermitDetails): HumanizerVisualization[] => {\n return [\n getAction('Permit'),\n getAddressVisualization(PERMIT_2_ADDRESS),\n getLabel('to use'),\n getToken(permit.token, permit.amount),\n getLabel('for time period'),\n getDeadline(permit.expiration)\n ]\n}\n\nexport const permit2Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n const visualizations: HumanizerVisualization[] = []\n if (\n tm?.domain?.verifyingContract &&\n tm.domain.verifyingContract.toLowerCase() === PERMIT_2_ADDRESS.toLowerCase()\n ) {\n if (tm?.types?.PermitSingle?.[0]?.type === 'PermitDetails') {\n visualizations.push(\n ...visualizePermit(tm.message.details),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline)\n )\n } else if (tm?.types?.PermitBatch?.[0]?.type === 'PermitDetails[]') {\n tm.message.details.forEach((permitDetails: PermitDetails, i: number) => {\n visualizations.push(\n ...[\n getLabel(`Permit #${i + 1}`),\n ...visualizePermit(permitDetails),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline) as HumanizerVisualization\n ]\n )\n })\n }\n return { fullVisualization: visualizations }\n }\n\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file +{"version":3,"file":"permit2Module.js","sourceRoot":"","sources":["../../../../../src/libs/humanizer/messageModules/permit2Module.ts"],"names":[],"mappings":";;;AAAA,yDAA4D;AAG5D,oCAA8F;AAoC9F,MAAM,eAAe,GAAG,CAAC,MAAqB,EAA4B,EAAE;IAC1E,OAAO;QACL,IAAA,iBAAS,EAAC,QAAQ,CAAC;QACnB,IAAA,+BAAuB,EAAC,4BAAgB,CAAC;QACzC,IAAA,gBAAQ,EAAC,QAAQ,CAAC;QAClB,IAAA,gBAAQ,EAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACrC,IAAA,gBAAQ,EAAC,iBAAiB,CAAC;QAC3B,IAAA,mBAAW,EAAC,MAAM,CAAC,UAAU,CAAC;KAC/B,CAAA;AACH,CAAC,CAAA;AAEM,MAAM,aAAa,GAAgC,CAAC,OAAgB,EAAE,EAAE;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;IAC1B,MAAM,cAAc,GAA6B,EAAE,CAAA;IACnD,IACE,EAAE,EAAE,MAAM,EAAE,iBAAiB;QAC7B,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,4BAAgB,CAAC,WAAW,EAAE,EAC5E;QACA,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,eAAe,EAAE;YAC1D,cAAc,CAAC,IAAI,CACjB,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EACtC,IAAA,gBAAQ,EAAC,uBAAuB,CAAC,EACjC,IAAA,mBAAW,EAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CACpC,CAAA;SACF;aAAM,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,iBAAiB,EAAE;YAClE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAA4B,EAAE,CAAS,EAAE,EAAE;gBACrE,cAAc,CAAC,IAAI,CACjB,GAAG;oBACD,IAAA,gBAAQ,EAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,GAAG,eAAe,CAAC,aAAa,CAAC;oBACjC,IAAA,gBAAQ,EAAC,uBAAuB,CAAC;oBACjC,IAAA,mBAAW,EAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAA2B;iBAC9D,CACF,CAAA;YACH,CAAC,CAAC,CAAA;SACH;QACD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAA;KAC7C;IAED,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;AAClC,CAAC,CAAA;AA9BY,QAAA,aAAa,iBA8BzB","sourcesContent":["import { PERMIT_2_ADDRESS } from '../../../consts/addresses'\nimport { Message } from '../../../interfaces/userRequest'\nimport { HumanizerTypedMessageModule, HumanizerVisualization } from '../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../utils'\n\n// interfaces\n// export interface PermitSingle {\n// details: PermitDetails\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// interface PermitBatch {\n// details: PermitDetails[]\n// spender: string\n// sigDeadline: BigNumberish\n// }\n\n// example\n// const permitSingle: PermitSingle = {\n// details: {\n// token: tokenAddress,\n// amount: MaxAllowanceTransferAmount,\n// // You may set your own deadline - we use 30 days.\n// expiration: toDeadline(/* 30 days= */ 1000 * 60 * 60 * 24 * 30),\n// nonce\n// },\n// spender: spenderAddress,\n// // You may set your own deadline - we use 30 minutes.\n// sigDeadline: toDeadline(/* 30 minutes= */ 1000 * 60 * 60 * 30)\n// }\n\ninterface PermitDetails {\n token: string\n amount: bigint\n expiration: bigint\n nonce: bigint\n}\n\nconst visualizePermit = (permit: PermitDetails): HumanizerVisualization[] => {\n return [\n getAction('Permit'),\n getAddressVisualization(PERMIT_2_ADDRESS),\n getLabel('to use'),\n getToken(permit.token, permit.amount),\n getLabel('for time period'),\n getDeadline(permit.expiration)\n ]\n}\n\nexport const permit2Module: HumanizerTypedMessageModule = (message: Message) => {\n if (message.content.kind !== 'typedMessage') return { fullVisualization: [] }\n const tm = message.content\n const visualizations: HumanizerVisualization[] = []\n if (\n tm?.domain?.verifyingContract &&\n tm.domain.verifyingContract.toLowerCase() === PERMIT_2_ADDRESS.toLowerCase()\n ) {\n if (tm?.types?.PermitSingle?.[0]?.type === 'PermitDetails') {\n visualizations.push(\n ...visualizePermit(tm.message.details),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline)\n )\n } else if (tm?.types?.PermitBatch?.[0]?.type === 'PermitDetails[]') {\n tm.message.details.forEach((permitDetails: PermitDetails, i: number) => {\n visualizations.push(\n ...[\n getLabel(`Permit #${i + 1}`),\n ...visualizePermit(permitDetails),\n getLabel('this whole signatuere'),\n getDeadline(tm.message.sigDeadline) as HumanizerVisualization\n ]\n )\n })\n }\n return { fullVisualization: visualizations }\n }\n\n return { fullVisualization: [] }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.js b/dist/src/libs/humanizer/modules/1Inch/index.js index 3bd4d399d..2b8d93c37 100644 --- a/dist/src/libs/humanizer/modules/1Inch/index.js +++ b/dist/src/libs/humanizer/modules/1Inch/index.js @@ -1,58 +1,60 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { OneInch } from '../../const/abis/1Inch'; -import { eToNative, getAction, getLabel, getRecipientText, getToken, uintToAddress } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const _1Inch_1 = require("../../const/abis/1Inch"); +const utils_1 = require("../../utils"); const OneInchModule = (accOp, calls) => { - const iface = new Interface(OneInch); + const iface = new ethers_1.Interface(_1Inch_1.OneInch); const matcher = { [iface.getFunction('cancelOrder(uint256 makerTraits, bytes32 orderHash)')?.selector]: (call) => { const { orderHash } = iface.parseTransaction(call).args; return [ - getAction('Cancel order'), - getLabel(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`) + (0, utils_1.getAction)('Cancel order'), + (0, utils_1.getLabel)(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`) ]; }, [iface.getFunction('unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)')?.selector]: (call) => { const { token: tokenArg, amount } = iface.parseTransaction(call).args; - const token = uintToAddress(tokenArg); - return [getAction('Swap'), getToken(eToNative(token), amount)]; + const token = (0, utils_1.uintToAddress)(tokenArg); + return [(0, utils_1.getAction)('Swap'), (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount)]; }, [iface.getFunction('swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data)')?.selector]: (call) => { const { desc: { srcToken, dstToken, dstReceiver, amount, minReturnAmount } } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(eToNative(srcToken), amount), - getLabel('for'), - getToken(eToNative(dstToken), minReturnAmount), - ...getRecipientText(accOp.accountAddr, dstReceiver) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)((0, utils_1.eToNative)(srcToken), amount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)((0, utils_1.eToNative)(dstToken), minReturnAmount), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, dstReceiver) ]; }, [iface.getFunction('ethUnoswap(uint256, uint256)')?.selector]: (call) => { - return [getAction('Swap'), getToken(ZeroAddress, call.value)]; + return [(0, utils_1.getAction)('Swap'), (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value)]; }, [iface.getFunction('unoswap(uint256 token,uint256 amount,uint256 minReturn,uint256 dex)') ?.selector]: (call) => { const { token: tokenArg, amount } = iface.parseTransaction(call).args; - const token = uintToAddress(tokenArg); - return [getAction('Swap'), getToken(eToNative(token), amount)]; + const token = (0, utils_1.uintToAddress)(tokenArg); + return [(0, utils_1.getAction)('Swap'), (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount)]; }, [iface.getFunction('unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex)')?.selector]: (call) => { const { token: tokenArg, amount } = iface.parseTransaction(call).args; - const token = uintToAddress(tokenArg); - return [getAction('Swap'), getToken(eToNative(token), amount)]; + const token = (0, utils_1.uintToAddress)(tokenArg); + return [(0, utils_1.getAction)('Swap'), (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount)]; }, [iface.getFunction('unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3)')?.selector]: (call) => { const { token: tokenArg, amount } = iface.parseTransaction(call).args; - const token = uintToAddress(tokenArg); - return [getAction('Swap'), getToken(eToNative(token), amount)]; + const token = (0, utils_1.uintToAddress)(tokenArg); + return [(0, utils_1.getAction)('Swap'), (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount)]; }, [iface.getFunction('swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)')?.selector]: (call) => { const { executor, desc: { srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags }, permit, data } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(srcToken, amount), - getLabel('for'), - getToken(dstToken, minReturnAmount), - ...getRecipientText(accOp.accountAddr, dstReceiver) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(srcToken, amount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(dstToken, minReturnAmount), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, dstReceiver) ]; } }; @@ -63,5 +65,5 @@ const OneInchModule = (accOp, calls) => { }); return newCalls; }; -export default OneInchModule; +exports.default = OneInchModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/1Inch/index.js.map b/dist/src/libs/humanizer/modules/1Inch/index.js.map index c5abe1188..1e3dc0275 100644 --- a/dist/src/libs/humanizer/modules/1Inch/index.js.map +++ b/dist/src/libs/humanizer/modules/1Inch/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/1Inch/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { OneInch } from '../../const/abis/1Inch'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getLabel,\n getRecipientText,\n getToken,\n uintToAddress\n} from '../../utils'\n\nconst OneInchModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(OneInch)\n const matcher = {\n [iface.getFunction('cancelOrder(uint256 makerTraits, bytes32 orderHash)')?.selector!]: (\n call: IrCall\n ) => {\n const { orderHash } = iface.parseTransaction(call)!.args\n return [\n getAction('Cancel order'),\n getLabel(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`)\n ]\n },\n [iface.getFunction(\n 'unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, dstReceiver, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n },\n [iface.getFunction('ethUnoswap(uint256, uint256)')?.selector!]: (call: IrCall) => {\n return [getAction('Swap'), getToken(ZeroAddress, call.value)]\n },\n [iface.getFunction('unoswap(uint256 token,uint256 amount,uint256 minReturn,uint256 dex)')\n ?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n )?.selector!]: (call: IrCall) => {\n const {\n executor,\n desc: { srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags },\n permit,\n data\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Swap'),\n getToken(srcToken, amount),\n getLabel('for'),\n getToken(dstToken, minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default OneInchModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/1Inch/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { OneInch } from '../../const/abis/1Inch'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getLabel,\n getRecipientText,\n getToken,\n uintToAddress\n} from '../../utils'\n\nconst OneInchModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(OneInch)\n const matcher = {\n [iface.getFunction('cancelOrder(uint256 makerTraits, bytes32 orderHash)')?.selector!]: (\n call: IrCall\n ) => {\n const { orderHash } = iface.parseTransaction(call)!.args\n return [\n getAction('Cancel order'),\n getLabel(`with order hash ${orderHash.slice(0, 5)}...${orderHash.slice(63, 66)}`)\n ]\n },\n [iface.getFunction(\n 'unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor,tuple(address srcToken,address dstToken,address srcReceiver,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags) desc,bytes data)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, dstReceiver, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n },\n [iface.getFunction('ethUnoswap(uint256, uint256)')?.selector!]: (call: IrCall) => {\n return [getAction('Swap'), getToken(ZeroAddress, call.value)]\n },\n [iface.getFunction('unoswap(uint256 token,uint256 amount,uint256 minReturn,uint256 dex)')\n ?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswapTo(uint256 to,uint256 token,uint256 amount,uint256 minReturn,uint256 dex)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'unoswap3(uint256 token,uint256 amount,uint256 minReturn,uint256 dex,uint256 dex2,uint256 dex3)'\n )?.selector!]: (call: IrCall) => {\n const { token: tokenArg, amount } = iface.parseTransaction(call)!.args\n const token = uintToAddress(tokenArg)\n\n return [getAction('Swap'), getToken(eToNative(token), amount)]\n },\n [iface.getFunction(\n 'swap(address executor, tuple(address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)'\n )?.selector!]: (call: IrCall) => {\n const {\n executor,\n desc: { srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags },\n permit,\n data\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Swap'),\n getToken(srcToken, amount),\n getLabel('for'),\n getToken(dstToken, minReturnAmount),\n ...getRecipientText(accOp.accountAddr, dstReceiver)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default OneInchModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js index 791a7af5a..1ce6d4710 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js @@ -1,49 +1,53 @@ -import { Interface } from 'ethers'; -import { AaveLendingPoolV2 } from '../../const/abis'; -import { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'; -export const aaveLendingPoolV2 = () => { - const iface = new Interface(AaveLendingPoolV2); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.aaveLendingPoolV2 = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const aaveLendingPoolV2 = () => { + const iface = new ethers_1.Interface(abis_1.AaveLendingPoolV2); const matcher = { [iface.getFunction('deposit')?.selector]: (accountOp, call) => { const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []; return [ - getAction('Deposit'), - getToken(asset, amount), - getLabel('to'), - getAddressVisualization(call.to), - ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + (0, utils_1.getAction)('Deposit'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(onBehalf, accountOp.accountAddr) ]; }, [iface.getFunction('withdraw')?.selector]: (accountOp, call) => { const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []; return [ - getAction('Withdraw'), - getToken(asset, amount), - getLabel('from'), - getAddressVisualization(call.to), - ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + (0, utils_1.getAction)('Withdraw'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(onBehalf, accountOp.accountAddr) ]; }, [iface.getFunction('repay')?.selector]: (accountOp, call) => { const [asset, amount /* rateMode */, , onBehalf] = iface.parseTransaction(call)?.args || []; return [ - getAction('Repay'), - getToken(asset, amount), - getLabel('to'), - getAddressVisualization(call.to), - ...getOnBehalfOf(onBehalf, accountOp.accountAddr) + (0, utils_1.getAction)('Repay'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(onBehalf, accountOp.accountAddr) ]; }, [iface.getFunction('borrow')?.selector]: (accountOp, call) => { const [asset, amount] = iface.parseTransaction(call)?.args || []; return [ - getAction('Borrow'), - getToken(asset, amount), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Borrow'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ]; } }; return matcher; }; +exports.aaveLendingPoolV2 = aaveLendingPoolV2; //# sourceMappingURL=aaveLendingPoolV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map index fcdf0e98a..0b0583fc8 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map +++ b/dist/src/libs/humanizer/modules/Aave/aaveLendingPoolV2.js.map @@ -1 +1 @@ -{"version":3,"file":"aaveLendingPoolV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveLendingPoolV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAChF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,SAAS,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,SAAS,CAAC,UAAU,CAAC;gBACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC9E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC3F,OAAO;gBACL,SAAS,CAAC,OAAO,CAAC;gBAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAChE,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveLendingPoolV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveLendingPoolV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveLendingPoolV2)\n const matcher = {\n [iface.getFunction('deposit')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repay')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount /* rateMode */, , onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrow')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n return matcher\n}\n"]} \ No newline at end of file +{"version":3,"file":"aaveLendingPoolV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveLendingPoolV2.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAGlC,2CAAoD;AAEpD,uCAAmG;AAE5F,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,wBAAiB,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAChF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,IAAA,iBAAS,EAAC,SAAS,CAAC;gBACpB,IAAA,gBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1E,OAAO;gBACL,IAAA,iBAAS,EAAC,UAAU,CAAC;gBACrB,IAAA,gBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAA,gBAAQ,EAAC,MAAM,CAAC;gBAChB,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC9E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC3F,OAAO;gBACL,IAAA,iBAAS,EAAC,OAAO,CAAC;gBAClB,IAAA,gBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;aAClD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAChE,OAAO;gBACL,IAAA,iBAAS,EAAC,QAAQ,CAAC;gBACnB,IAAA,gBAAQ,EAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAA,gBAAQ,EAAC,MAAM,CAAC;gBAChB,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AA5CY,QAAA,iBAAiB,qBA4C7B","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveLendingPoolV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveLendingPoolV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveLendingPoolV2)\n const matcher = {\n [iface.getFunction('deposit')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount, onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repay')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount /* rateMode */, , onBehalf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrow')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [asset, amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(asset, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n return matcher\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.js b/dist/src/libs/humanizer/modules/Aave/aaveV3.js index a35af7858..36d2ca68e 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveV3.js +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.js @@ -1,6 +1,9 @@ -import { Interface, MaxUint256 } from 'ethers'; -import { AaveV3Pool } from '../../const/abis'; -import { getAction, getAddressVisualization, getDeadline, getLabel, getOnBehalfOf, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.aaveV3Pool = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); /* Fetched via let maxValueForUint16 = 65535 @@ -101,52 +104,52 @@ const AAVE_TOKENS_BY_INDEX = { '0x2416092f143378750bb29b79ed961ab195cceea5' ] }; -export const aaveV3Pool = () => { - const iface = new Interface(AaveV3Pool); +const aaveV3Pool = () => { + const iface = new ethers_1.Interface(abis_1.AaveV3Pool); return { [iface.getFunction('supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)')?.selector]: (accountOp, call) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { asset, amount, onBehalfOf, referralCode } = iface.parseTransaction(call).args; return [ - getAction('Deposit'), - getToken(asset, amount), - getLabel('to'), - getAddressVisualization(call.to), - ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + (0, utils_1.getAction)('Deposit'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(onBehalfOf, accountOp.accountAddr) ]; }, [iface.getFunction('flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)')?.selector]: (accountOp, call) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { receiverAddress, asset, amount, params, referralCode } = iface.parseTransaction(call).args; return [ - getAction('Execute Flash Loan'), - getToken(asset, amount), - getLabel('and call'), - getAddressVisualization(receiverAddress) + (0, utils_1.getAction)('Execute Flash Loan'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('and call'), + (0, utils_1.getAddressVisualization)(receiverAddress) ]; }, [iface.getFunction('repayWithATokens(bytes32 args)')?.selector]: (accountOp, call) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { args } = iface.parseTransaction(call).args; - return [getAction('Repay with token A'), getLabel('to'), getAddressVisualization(call.to)]; + return [(0, utils_1.getAction)('Repay with token A'), (0, utils_1.getLabel)('to'), (0, utils_1.getAddressVisualization)(call.to)]; }, [iface.getFunction('repayWithPermit(bytes32 args, bytes32 r, bytes32 s)')?.selector]: (accountOp, call) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { args } = iface.parseTransaction(call).args; - return [getAction('Repay with permit'), getLabel('to'), getAddressVisualization(call.to)]; + return [(0, utils_1.getAction)('Repay with permit'), (0, utils_1.getLabel)('to'), (0, utils_1.getAddressVisualization)(call.to)]; }, [iface.getFunction('supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)')?.selector]: (accountOp, call) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { asset, amount, onBehalfOf, referralCode, deadline, permitV, permitR, bytes32 } = iface.parseTransaction(call).args; return [ - getAction('Supply'), - getToken(asset, amount), - getLabel('to'), - getAddressVisualization(call.to), + (0, utils_1.getAction)('Supply'), + (0, utils_1.getToken)(asset, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), ...(onBehalfOf !== accountOp.accountAddr - ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)] + ? [(0, utils_1.getLabel)('on behalf of'), (0, utils_1.getAddressVisualization)(onBehalfOf)] : []), - getDeadline(deadline) + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('withdraw(bytes32 args)')?.selector]: (accountOp, call) => { @@ -155,18 +158,19 @@ export const aaveV3Pool = () => { const amountAsString = args.slice(30, 62); const tokenIndex = Number(`0x${args.slice(62)}`); if (!AAVE_TOKENS_BY_INDEX[accountOp.networkId]) - return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]; + return [(0, utils_1.getAction)('Withdraw'), (0, utils_1.getLabel)('from'), (0, utils_1.getAddressVisualization)(call.to)]; if (tokenIndex >= AAVE_TOKENS_BY_INDEX[accountOp.networkId].length) - return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]; + return [(0, utils_1.getAction)('Withdraw'), (0, utils_1.getLabel)('from'), (0, utils_1.getAddressVisualization)(call.to)]; // stores amount inn uint128 instead of uint256, but max value is treated as max value - const amount = amountAsString === 'f'.repeat(32) ? MaxUint256 : BigInt(`0x${amountAsString}`); + const amount = amountAsString === 'f'.repeat(32) ? ethers_1.MaxUint256 : BigInt(`0x${amountAsString}`); return [ - getAction('Withdraw'), - getToken(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Withdraw'), + (0, utils_1.getToken)(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ]; } }; }; +exports.aaveV3Pool = aaveV3Pool; //# sourceMappingURL=aaveV3.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map b/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map index 7039d42c1..23b75064b 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map +++ b/dist/src/libs/humanizer/modules/Aave/aaveV3.js.map @@ -1 +1 @@ -{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, MaxUint256 } from 'ethers'\n\nimport { NetworkId } from '../../../../interfaces/network'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveV3Pool } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getOnBehalfOf,\n getToken\n} from '../../utils'\n\n/*\nFetched via\n let maxValueForUint16 = 65535\n let tokenIdsStorageSlot = 54\n let poolAddress = '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n for (let i = 0; i < maxValueForUint16; i++) {\n const storageSlot = solidityPackedKeccak256(['uint256', 'uint256'], [i, tokenIdsStorageSlot])\n const res = await provider.getStorage(poolAddress, storageSlot)\n if (res !== '0x0000000000000000000000000000000000000000000000000000000000000000')\n console.log(res, i)\n\n pool address is taken from\n https://aave.com/docs/resources/addresses\n*/\nconst AAVE_TOKENS_BY_INDEX: { [network: NetworkId]: string[] } = {\n optimism: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6',\n '0x7f5c764cbc14f9669b88837ca1490cca17c31607',\n '0x68f180fcce6836688e9084f035309e29bf0a2095',\n '0x4200000000000000000000000000000000000006',\n '0x94b008aa00579c1307b0ef2c499ad98a8ce58e58',\n '0x76fb31fb4af56892a25e32cfc43de717950c9278',\n '0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9',\n '0x4200000000000000000000000000000000000042',\n '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n '0xc40f949f8a4e094d1b49a23ea9241d289b7b2819',\n '0xdfa46478f9e5ea86d57387849598dbfb2e964b02',\n '0x9bcef72be871e61ed4fbbc7630889bee758eb81d',\n '0x0b2c639c533813f4aa9d7837caf62653d097ff85'\n ],\n arbitrum: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0xf97f4df75117a78c1a5a0dbb814af92458539fb4',\n '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8',\n '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f',\n '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',\n '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',\n '0xba5ddd1f9d7f570dc94a51479a000e3bce967196',\n '0xd22a58f79e9481d1a88e00c343885a588b34b68b',\n '0x5979d7b546e38e414f7e9822514be443a4800529',\n '0x3f56e0c36d275367b8c502090edf38289b3dea0d',\n '0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8',\n '0x93b346b6bc2548da6a1e7d98e9a421b42541425b',\n '0xaf88d065e77c8cc2239327c5edb3a432268e5831',\n '0x17fc002b466eec40dae837fc4be5c67993ddbd6f',\n '0x912ce59144191c1204e64559fe8253a0e49e6548',\n '0x35751007a407ca6feffe80b3cb397736d2cf4dbe',\n '0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ],\n avalanche: [\n '0xd586e7f844cea2f87f50152665bcbc2c279d8d70',\n '0x5947bb275c521040051d82396192181b413227a3',\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n '0x50b7545627a5162f82a992c33b87adc75187b218',\n '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab',\n '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7',\n '0x63a72806098bd3d9520cc43356dd78afe5d386d9',\n '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n '0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be',\n '0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64',\n '0x5c49b268c9841aff1cc3b0a418ff5c3442ee3f3b',\n '0x152b9d0fdc40c096757f570a51e494bd4b943e50',\n '0x00000000efe302beaa2b3e6e1b18d08d69a9012a'\n ],\n polygon: [\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6',\n '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',\n '0xd6df932a45c0f255f85145f286ea0b292b21c90b',\n '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n '0x172370d5cd63279efa6d502dab29171933a610af',\n '0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a',\n '0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7',\n '0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3',\n '0x85955046df4668e1dd369d2de9f3aeb98dd2a369',\n '0xe111178a87a3bff0c8d18decba5798827539ae99',\n '0x4e3decbb3645551b8a19f0ea1678079fcb33fb4c',\n '0xe0b52e49357fd4daf2c15e02058dce6bc0057db4',\n '0xa3fa99a148fa48d14ed51d610c367c61876997f1',\n '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4',\n '0xfa68fb4628dff1028cfec22b4162fccd0d45efb6',\n '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359'\n ],\n base: [\n '0x4200000000000000000000000000000000000006',\n '0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22',\n '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca',\n '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n '0x04c0599ae5a44757c0af6f9ec3b93da8976c150a',\n '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ]\n}\nexport const aaveV3Pool = (): { [key: string]: Function } => {\n const iface = new Interface(AaveV3Pool)\n return {\n [iface.getFunction(\n 'supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction(\n 'flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { receiverAddress, asset, amount, params, referralCode } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Execute Flash Loan'),\n getToken(asset, amount),\n getLabel('and call'),\n getAddressVisualization(receiverAddress)\n ]\n },\n [iface.getFunction('repayWithATokens(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with token A'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction('repayWithPermit(bytes32 args, bytes32 r, bytes32 s)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with permit'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction(\n 'supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode, deadline, permitV, permitR, bytes32 } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Supply'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...(onBehalfOf !== accountOp.accountAddr\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('withdraw(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // @TODO do some hecks for network OR\n const { args } = iface.parseTransaction(call)!.args\n const amountAsString = args.slice(30, 62)\n const tokenIndex = Number(`0x${args.slice(62)}`)\n if (!AAVE_TOKENS_BY_INDEX[accountOp.networkId])\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n if (tokenIndex >= AAVE_TOKENS_BY_INDEX[accountOp.networkId].length)\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n // stores amount inn uint128 instead of uint256, but max value is treated as max value\n const amount = amountAsString === 'f'.repeat(32) ? MaxUint256 : BigInt(`0x${amountAsString}`)\n\n return [\n getAction('Withdraw'),\n getToken(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"aaveV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, MaxUint256 } from 'ethers'\n\nimport { NetworkId } from '../../../../interfaces/network'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveV3Pool } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getOnBehalfOf,\n getToken\n} from '../../utils'\n\n/*\nFetched via\n let maxValueForUint16 = 65535\n let tokenIdsStorageSlot = 54\n let poolAddress = '0x794a61358D6845594F94dc1DB02A252b5b4814aD'\n for (let i = 0; i < maxValueForUint16; i++) {\n const storageSlot = solidityPackedKeccak256(['uint256', 'uint256'], [i, tokenIdsStorageSlot])\n const res = await provider.getStorage(poolAddress, storageSlot)\n if (res !== '0x0000000000000000000000000000000000000000000000000000000000000000')\n console.log(res, i)\n\n pool address is taken from\n https://aave.com/docs/resources/addresses\n*/\nconst AAVE_TOKENS_BY_INDEX: { [network: NetworkId]: string[] } = {\n optimism: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6',\n '0x7f5c764cbc14f9669b88837ca1490cca17c31607',\n '0x68f180fcce6836688e9084f035309e29bf0a2095',\n '0x4200000000000000000000000000000000000006',\n '0x94b008aa00579c1307b0ef2c499ad98a8ce58e58',\n '0x76fb31fb4af56892a25e32cfc43de717950c9278',\n '0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9',\n '0x4200000000000000000000000000000000000042',\n '0x1f32b1c2345538c0c6f582fcb022739c4a194ebb',\n '0xc40f949f8a4e094d1b49a23ea9241d289b7b2819',\n '0xdfa46478f9e5ea86d57387849598dbfb2e964b02',\n '0x9bcef72be871e61ed4fbbc7630889bee758eb81d',\n '0x0b2c639c533813f4aa9d7837caf62653d097ff85'\n ],\n arbitrum: [\n '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',\n '0xf97f4df75117a78c1a5a0dbb814af92458539fb4',\n '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8',\n '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f',\n '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',\n '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',\n '0xba5ddd1f9d7f570dc94a51479a000e3bce967196',\n '0xd22a58f79e9481d1a88e00c343885a588b34b68b',\n '0x5979d7b546e38e414f7e9822514be443a4800529',\n '0x3f56e0c36d275367b8c502090edf38289b3dea0d',\n '0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8',\n '0x93b346b6bc2548da6a1e7d98e9a421b42541425b',\n '0xaf88d065e77c8cc2239327c5edb3a432268e5831',\n '0x17fc002b466eec40dae837fc4be5c67993ddbd6f',\n '0x912ce59144191c1204e64559fe8253a0e49e6548',\n '0x35751007a407ca6feffe80b3cb397736d2cf4dbe',\n '0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ],\n avalanche: [\n '0xd586e7f844cea2f87f50152665bcbc2c279d8d70',\n '0x5947bb275c521040051d82396192181b413227a3',\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n '0x50b7545627a5162f82a992c33b87adc75187b218',\n '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab',\n '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7',\n '0x63a72806098bd3d9520cc43356dd78afe5d386d9',\n '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',\n '0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be',\n '0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64',\n '0x5c49b268c9841aff1cc3b0a418ff5c3442ee3f3b',\n '0x152b9d0fdc40c096757f570a51e494bd4b943e50',\n '0x00000000efe302beaa2b3e6e1b18d08d69a9012a'\n ],\n polygon: [\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6',\n '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',\n '0xd6df932a45c0f255f85145f286ea0b292b21c90b',\n '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n '0x172370d5cd63279efa6d502dab29171933a610af',\n '0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a',\n '0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7',\n '0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3',\n '0x85955046df4668e1dd369d2de9f3aeb98dd2a369',\n '0xe111178a87a3bff0c8d18decba5798827539ae99',\n '0x4e3decbb3645551b8a19f0ea1678079fcb33fb4c',\n '0xe0b52e49357fd4daf2c15e02058dce6bc0057db4',\n '0xa3fa99a148fa48d14ed51d610c367c61876997f1',\n '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4',\n '0xfa68fb4628dff1028cfec22b4162fccd0d45efb6',\n '0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd',\n '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359'\n ],\n base: [\n '0x4200000000000000000000000000000000000006',\n '0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22',\n '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca',\n '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452',\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n '0x04c0599ae5a44757c0af6f9ec3b93da8976c150a',\n '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',\n '0x2416092f143378750bb29b79ed961ab195cceea5'\n ]\n}\nexport const aaveV3Pool = (): { [key: string]: Function } => {\n const iface = new Interface(AaveV3Pool)\n return {\n [iface.getFunction(\n 'supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction(\n 'flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { receiverAddress, asset, amount, params, referralCode } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Execute Flash Loan'),\n getToken(asset, amount),\n getLabel('and call'),\n getAddressVisualization(receiverAddress)\n ]\n },\n [iface.getFunction('repayWithATokens(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with token A'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction('repayWithPermit(bytes32 args, bytes32 r, bytes32 s)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { args } = iface.parseTransaction(call)!.args\n return [getAction('Repay with permit'), getLabel('to'), getAddressVisualization(call.to)]\n },\n [iface.getFunction(\n 'supplyWithPermit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { asset, amount, onBehalfOf, referralCode, deadline, permitV, permitR, bytes32 } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Supply'),\n getToken(asset, amount),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...(onBehalfOf !== accountOp.accountAddr\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('withdraw(bytes32 args)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n // @TODO do some hecks for network OR\n const { args } = iface.parseTransaction(call)!.args\n const amountAsString = args.slice(30, 62)\n const tokenIndex = Number(`0x${args.slice(62)}`)\n if (!AAVE_TOKENS_BY_INDEX[accountOp.networkId])\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n if (tokenIndex >= AAVE_TOKENS_BY_INDEX[accountOp.networkId].length)\n return [getAction('Withdraw'), getLabel('from'), getAddressVisualization(call.to)]\n\n // stores amount inn uint128 instead of uint256, but max value is treated as max value\n const amount = amountAsString === 'f'.repeat(32) ? MaxUint256 : BigInt(`0x${amountAsString}`)\n\n return [\n getAction('Withdraw'),\n getToken(AAVE_TOKENS_BY_INDEX[accountOp.networkId][tokenIndex], amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js index f4f268a5d..59fb0807c 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js @@ -1,48 +1,52 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { AaveWethGatewayV2 } from '../../const/abis'; -import { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'; -export const aaveWethGatewayV2 = () => { - const iface = new Interface(AaveWethGatewayV2); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.aaveWethGatewayV2 = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const aaveWethGatewayV2 = () => { + const iface = new ethers_1.Interface(abis_1.AaveWethGatewayV2); return { [iface.getFunction('depositETH')?.selector]: (accountOp, call) => { const [, onBehalfOf] = iface.parseTransaction(call)?.args || []; return [ - getAction('Deposit'), - getToken(ZeroAddress, call.value), - getLabel('to'), - getAddressVisualization(call.to), - ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + (0, utils_1.getAction)('Deposit'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(onBehalfOf, accountOp.accountAddr) ]; }, [iface.getFunction('withdrawETH')?.selector]: (accountOp, call) => { const [, /* lendingPool */ amount, to] = iface.parseTransaction(call)?.args || []; return [ - getAction('Withdraw'), - getToken(ZeroAddress, amount), - getLabel('from'), - getAddressVisualization(call.to), - ...getOnBehalfOf(to, accountOp.accountAddr) + (0, utils_1.getAction)('Withdraw'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to), + ...(0, utils_1.getOnBehalfOf)(to, accountOp.accountAddr) ]; }, [iface.getFunction('repayETH')?.selector]: (accountOp, call) => { const [, , , /* lendingPool */ /* amount */ /* rateMode */ onBehalfOf] = iface.parseTransaction(call)?.args || []; return [ - getAction('Repay'), - getToken(ZeroAddress, call.value), - getLabel('to'), - getAddressVisualization(call.to), - getOnBehalfOf(onBehalfOf, accountOp.accountAddr) + (0, utils_1.getAction)('Repay'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + (0, utils_1.getOnBehalfOf)(onBehalfOf, accountOp.accountAddr) ]; }, [iface.getFunction('borrowETH')?.selector]: (accountOp, call) => { const [, /* lendingPool */ amount] = iface.parseTransaction(call)?.args || []; return [ - getAction('Borrow'), - getToken(ZeroAddress, amount), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Borrow'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ]; } }; }; +exports.aaveWethGatewayV2 = aaveWethGatewayV2; //# sourceMappingURL=aaveWethGatewayV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map index 78311acd9..bf86c260f 100644 --- a/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map +++ b/dist/src/libs/humanizer/modules/Aave/aaveWethGatewayV2.js.map @@ -1 +1 @@ -{"version":3,"file":"aaveWethGatewayV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveWethGatewayV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC9C,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACnF,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC/D,OAAO;gBACL,SAAS,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACpD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACpF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YACjF,OAAO;gBACL,SAAS,CAAC,UAAU,CAAC;gBACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC;aAC5C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,GACpE,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1C,OAAO;gBACL,SAAS,CAAC,OAAO,CAAC;gBAClB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACjD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAClF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC7E,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveWethGatewayV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveWethGatewayV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveWethGatewayV2)\n return {\n [iface.getFunction('depositETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, onBehalfOf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdrawETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount, to] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(to, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repayETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, , , /* lendingPool */ /* amount */ /* rateMode */ onBehalfOf] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrowETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"aaveWethGatewayV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/aaveWethGatewayV2.ts"],"names":[],"mappings":";;;AAAA,mCAA+C;AAG/C,2CAAoD;AAEpD,uCAAmG;AAE5F,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,wBAAiB,CAAC,CAAA;IAC9C,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACnF,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC/D,OAAO;gBACL,IAAA,iBAAS,EAAC,SAAS,CAAC;gBACpB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,IAAA,qBAAa,EAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACpD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACpF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YACjF,OAAO;gBACL,IAAA,iBAAS,EAAC,UAAU,CAAC;gBACrB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,MAAM,CAAC;gBAC7B,IAAA,gBAAQ,EAAC,MAAM,CAAC;gBAChB,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,IAAA,qBAAa,EAAC,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC;aAC5C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,GACpE,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC1C,OAAO;gBACL,IAAA,iBAAS,EAAC,OAAO,CAAC;gBAClB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,IAAA,qBAAa,EAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;aACjD,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,SAAoB,EAAE,IAAY,EAAE,EAAE;YAClF,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;YAC7E,OAAO;gBACL,IAAA,iBAAS,EAAC,QAAQ,CAAC;gBACnB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,MAAM,CAAC;gBAC7B,IAAA,gBAAQ,EAAC,MAAM,CAAC;gBAChB,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AA5CY,QAAA,iBAAiB,qBA4C7B","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AaveWethGatewayV2 } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getOnBehalfOf, getToken } from '../../utils'\n\nexport const aaveWethGatewayV2 = (): { [key: string]: Function } => {\n const iface = new Interface(AaveWethGatewayV2)\n return {\n [iface.getFunction('depositETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, onBehalfOf] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Deposit'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('withdrawETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount, to] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Withdraw'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...getOnBehalfOf(to, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('repayETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, , , /* lendingPool */ /* amount */ /* rateMode */ onBehalfOf] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Repay'),\n getToken(ZeroAddress, call.value),\n getLabel('to'),\n getAddressVisualization(call.to),\n getOnBehalfOf(onBehalfOf, accountOp.accountAddr)\n ]\n },\n [iface.getFunction('borrowETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [, /* lendingPool */ amount] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Borrow'),\n getToken(ZeroAddress, amount),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.js b/dist/src/libs/humanizer/modules/Aave/index.js index 8c588368e..3d03a70d2 100644 --- a/dist/src/libs/humanizer/modules/Aave/index.js +++ b/dist/src/libs/humanizer/modules/Aave/index.js @@ -1,11 +1,14 @@ -import { aaveLendingPoolV2 } from './aaveLendingPoolV2'; -import { aaveV3Pool } from './aaveV3'; -import { aaveWethGatewayV2 } from './aaveWethGatewayV2'; -export const aaveHumanizer = (accountOp, irCalls) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.aaveHumanizer = void 0; +const aaveLendingPoolV2_1 = require("./aaveLendingPoolV2"); +const aaveV3_1 = require("./aaveV3"); +const aaveWethGatewayV2_1 = require("./aaveWethGatewayV2"); +const aaveHumanizer = (accountOp, irCalls) => { const matcher = { - ...aaveLendingPoolV2(), - ...aaveWethGatewayV2(), - ...aaveV3Pool() + ...(0, aaveLendingPoolV2_1.aaveLendingPoolV2)(), + ...(0, aaveWethGatewayV2_1.aaveWethGatewayV2)(), + ...(0, aaveV3_1.aaveV3Pool)() }; const newCalls = irCalls.map((call) => { const sigHash = call.data.slice(0, 10); @@ -15,4 +18,5 @@ export const aaveHumanizer = (accountOp, irCalls) => { }); return newCalls; }; +exports.aaveHumanizer = aaveHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Aave/index.js.map b/dist/src/libs/humanizer/modules/Aave/index.js.map index fc971d0f9..f9dff1afc 100644 --- a/dist/src/libs/humanizer/modules/Aave/index.js.map +++ b/dist/src/libs/humanizer/modules/Aave/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC5F,MAAM,OAAO,GAAG;QACd,GAAG,iBAAiB,EAAE;QACtB,GAAG,iBAAiB,EAAE;QACtB,GAAG,UAAU,EAAE;KAChB,CAAA;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtC,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YACnE,CAAC,CAAC,IAAI,CAAA;IACV,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { aaveLendingPoolV2 } from './aaveLendingPoolV2'\nimport { aaveV3Pool } from './aaveV3'\nimport { aaveWethGatewayV2 } from './aaveWethGatewayV2'\n\nexport const aaveHumanizer: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n ...aaveLendingPoolV2(),\n ...aaveWethGatewayV2(),\n ...aaveV3Pool()\n }\n const newCalls = irCalls.map((call) => {\n const sigHash = call.data.slice(0, 10)\n return matcher[sigHash]\n ? { ...call, fullVisualization: matcher[sigHash](accountOp, call) }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Aave/index.ts"],"names":[],"mappings":";;;AAEA,2DAAuD;AACvD,qCAAqC;AACrC,2DAAuD;AAEhD,MAAM,aAAa,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC5F,MAAM,OAAO,GAAG;QACd,GAAG,IAAA,qCAAiB,GAAE;QACtB,GAAG,IAAA,qCAAiB,GAAE;QACtB,GAAG,IAAA,mBAAU,GAAE;KAChB,CAAA;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtC,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YACnE,CAAC,CAAC,IAAI,CAAA;IACV,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAbY,QAAA,aAAa,iBAazB","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { aaveLendingPoolV2 } from './aaveLendingPoolV2'\nimport { aaveV3Pool } from './aaveV3'\nimport { aaveWethGatewayV2 } from './aaveWethGatewayV2'\n\nexport const aaveHumanizer: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n ...aaveLendingPoolV2(),\n ...aaveWethGatewayV2(),\n ...aaveV3Pool()\n }\n const newCalls = irCalls.map((call) => {\n const sigHash = call.data.slice(0, 10)\n return matcher[sigHash]\n ? { ...call, fullVisualization: matcher[sigHash](accountOp, call) }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.js b/dist/src/libs/humanizer/modules/Across/index.js index e775b39bd..684ac1338 100644 --- a/dist/src/libs/humanizer/modules/Across/index.js +++ b/dist/src/libs/humanizer/modules/Across/index.js @@ -1,40 +1,42 @@ -import { Interface } from 'ethers'; -import { Across } from '../../const/abis'; -import { getAction, getChain, getDeadline, getLabel, getRecipientText, getToken, getTokenWithChain } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); const AcrossModule = (accOp, calls) => { - const iface = new Interface(Across); + const iface = new ethers_1.Interface(abis_1.Across); const matcher = { [iface.getFunction('depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message)')?.selector]: (call) => { const { recipient, inputToken, outputToken, inputAmount, outputAmount, destinationChainId, fillDeadline } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(inputToken, inputAmount), - getLabel('for'), - getTokenWithChain(outputToken, outputAmount, destinationChainId), - getLabel('to'), - getChain(destinationChainId), - getDeadline(fillDeadline), - ...getRecipientText(accOp.accountAddr, recipient) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(inputToken, inputAmount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getTokenWithChain)(outputToken, outputAmount, destinationChainId), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(destinationChainId), + (0, utils_1.getDeadline)(fillDeadline), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, recipient) ]; }, [iface.getFunction('deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount)')?.selector]: (call) => { const { recipient, originToken, amount, destinationChainId } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(originToken, amount), - getLabel('to'), - getChain(destinationChainId), - ...getRecipientText(accOp.accountAddr, recipient) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(originToken, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(destinationChainId), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, recipient) ]; }, [iface.getFunction('function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable')?.selector]: (call) => { const { recipient, originToken, amount, destinationChainId } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(originToken, amount), - getLabel('to'), - getChain(destinationChainId), - ...getRecipientText(accOp.accountAddr, recipient) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(originToken, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(destinationChainId), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, recipient) ]; } }; @@ -45,5 +47,5 @@ const AcrossModule = (accOp, calls) => { }); return newCalls; }; -export default AcrossModule; +exports.default = AcrossModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Across/index.js.map b/dist/src/libs/humanizer/modules/Across/index.js.map index 37556fba1..ff6961daf 100644 --- a/dist/src/libs/humanizer/modules/Across/index.js.map +++ b/dist/src/libs/humanizer/modules/Across/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Across/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Across } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n getAction,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\nconst AcrossModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Across)\n const matcher = {\n [iface.getFunction(\n 'depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message)'\n )?.selector!]: (call: IrCall) => {\n const {\n recipient,\n inputToken,\n outputToken,\n inputAmount,\n outputAmount,\n destinationChainId,\n fillDeadline\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(inputToken, inputAmount),\n getLabel('for'),\n getTokenWithChain(outputToken, outputAmount, destinationChainId),\n getLabel('to'),\n getChain(destinationChainId),\n getDeadline(fillDeadline),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount)'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default AcrossModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Across/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Across } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n getAction,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\nconst AcrossModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Across)\n const matcher = {\n [iface.getFunction(\n 'depositV3(address depositor,address recipient,address inputToken,address outputToken,uint256 inputAmount,uint256 outputAmount,uint256 destinationChainId,address exclusiveRelayer,uint32 quoteTimestamp,uint32 fillDeadline,uint32 exclusivityDeadline,bytes calldata message)'\n )?.selector!]: (call: IrCall) => {\n const {\n recipient,\n inputToken,\n outputToken,\n inputAmount,\n outputAmount,\n destinationChainId,\n fillDeadline\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(inputToken, inputAmount),\n getLabel('for'),\n getTokenWithChain(outputToken, outputAmount, destinationChainId),\n getLabel('to'),\n getChain(destinationChainId),\n getDeadline(fillDeadline),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'deposit(address recipient,address originToken,uint256 amount,uint256 destinationChainId,int64 relayerFeePct,uint32 quoteTimestamp,bytes memory message,uint256 maxCount)'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n },\n [iface.getFunction(\n 'function deposit(address spokePool,address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp,bytes message, uint256 maxCount) payable'\n )?.selector!]: (call: IrCall) => {\n const { recipient, originToken, amount, destinationChainId } =\n iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(originToken, amount),\n getLabel('to'),\n getChain(destinationChainId),\n ...getRecipientText(accOp.accountAddr, recipient)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default AcrossModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.js b/dist/src/libs/humanizer/modules/Airdrops/index.js index 5a20a99ba..b6e02299a 100644 --- a/dist/src/libs/humanizer/modules/Airdrops/index.js +++ b/dist/src/libs/humanizer/modules/Airdrops/index.js @@ -1,19 +1,23 @@ -import { Interface } from 'ethers'; -import { getAction, getToken } from '../../utils'; -const iface = new Interface([ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.airdropsModule = void 0; +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); +const iface = new ethers_1.Interface([ 'function claimTokens(uint256 index, uint256 amount, bytes32[] merkleProof)' ]); const WTC_TOKEN_ADDRESS = '0xeF4461891DfB3AC8572cCf7C794664A8DD927945'; -export const airdropsModule = (accountOp, currentIrCalls) => { +const airdropsModule = (accountOp, currentIrCalls) => { const matcher = { [iface.getFunction('claimTokens').selector]: (call) => { if (call.to !== '0x4ee97a759AACa2EdF9c1445223b6Cd17c2eD3fb4') return call; const { amount } = iface.parseTransaction(call).args; - const fullVisualization = [getAction('Claim'), getToken(WTC_TOKEN_ADDRESS, amount)]; + const fullVisualization = [(0, utils_1.getAction)('Claim'), (0, utils_1.getToken)(WTC_TOKEN_ADDRESS, amount)]; return { ...call, fullVisualization }; } }; return currentIrCalls.map((call) => matcher[call.data.slice(0, 10)] ? matcher[call.data.slice(0, 10)](call) : call); }; +exports.airdropsModule = airdropsModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Airdrops/index.js.map b/dist/src/libs/humanizer/modules/Airdrops/index.js.map index 8335becc3..48dd74ef7 100644 --- a/dist/src/libs/humanizer/modules/Airdrops/index.js.map +++ b/dist/src/libs/humanizer/modules/Airdrops/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Airdrops/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIlC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;IAC1B,4EAA4E;CAC7E,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAwB,CACjD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAY,EAAU,EAAE;YACrE,IAAI,IAAI,CAAC,EAAE,KAAK,4CAA4C;gBAAE,OAAO,IAAI,CAAA;YACzE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,MAAM,iBAAiB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;YACnF,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/E,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function claimTokens(uint256 index, uint256 amount, bytes32[] merkleProof)'\n])\nconst WTC_TOKEN_ADDRESS = '0xeF4461891DfB3AC8572cCf7C794664A8DD927945'\n\nexport const airdropsModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const matcher = {\n [iface.getFunction('claimTokens')!.selector]: (call: IrCall): IrCall => {\n if (call.to !== '0x4ee97a759AACa2EdF9c1445223b6Cd17c2eD3fb4') return call\n const { amount } = iface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim'), getToken(WTC_TOKEN_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n return currentIrCalls.map((call) =>\n matcher[call.data.slice(0, 10)] ? matcher[call.data.slice(0, 10)](call) : call\n )\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Airdrops/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAIlC,uCAAiD;AAEjD,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC;IAC1B,4EAA4E;CAC7E,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAE/D,MAAM,cAAc,GAAwB,CACjD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAY,EAAU,EAAE;YACrE,IAAI,IAAI,CAAC,EAAE,KAAK,4CAA4C;gBAAE,OAAO,IAAI,CAAA;YACzE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,MAAM,iBAAiB,GAAG,CAAC,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,IAAA,gBAAQ,EAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;YACnF,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/E,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,cAAc,kBAe1B","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function claimTokens(uint256 index, uint256 amount, bytes32[] merkleProof)'\n])\nconst WTC_TOKEN_ADDRESS = '0xeF4461891DfB3AC8572cCf7C794664A8DD927945'\n\nexport const airdropsModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const matcher = {\n [iface.getFunction('claimTokens')!.selector]: (call: IrCall): IrCall => {\n if (call.to !== '0x4ee97a759AACa2EdF9c1445223b6Cd17c2eD3fb4') return call\n const { amount } = iface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim'), getToken(WTC_TOKEN_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n return currentIrCalls.map((call) =>\n matcher[call.data.slice(0, 10)] ? matcher[call.data.slice(0, 10)](call) : call\n )\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js index 6c8bbbaab..47f442cb2 100644 --- a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js @@ -1,33 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.asciiModule = void 0; /* eslint-disable no-await-in-loop */ -import { toUtf8String, ZeroAddress } from 'ethers'; -import { checkIfUnknownAction, getAction, getAddressVisualization, getLabel, getText, getToken } from '../../utils'; -export const asciiModule = (accountOp, currentIrCalls) => { +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); +const asciiModule = (accountOp, currentIrCalls) => { const newCalls = currentIrCalls.map((call) => { if (call.data === '0x') return call; - if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) + if (call.fullVisualization && !(0, utils_1.checkIfUnknownAction)(call?.fullVisualization)) return call; let messageAsText; try { - messageAsText = toUtf8String(call.data); + messageAsText = (0, ethers_1.toUtf8String)(call.data); } catch { return call; } const sendNativeHumanization = call.value - ? [getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)] + ? [(0, utils_1.getLabel)('and'), (0, utils_1.getAction)('Send'), (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value)] : []; return { ...call, fullVisualization: [ - getAction('Send this message'), - getLabel('to'), - getAddressVisualization(call.to), - getText(messageAsText), + (0, utils_1.getAction)('Send this message'), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to), + (0, utils_1.getText)(messageAsText), ...sendNativeHumanization ] }; }); return newCalls; }; +exports.asciiModule = asciiModule; //# sourceMappingURL=asciiModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map index f3612633e..e089e15f0 100644 --- a/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map +++ b/dist/src/libs/humanizer/modules/AsciiModule/asciiModule.js.map @@ -1 +1 @@ -{"version":3,"file":"asciiModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/asciiModule.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIlD,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,uBAAuB,EACvB,QAAQ,EACR,OAAO,EACP,QAAQ,EACT,MAAM,aAAa,CAAA;AAEpB,MAAM,CAAC,MAAM,WAAW,GAAwB,CAC9C,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACnC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAA;QACzF,IAAI,aAAa,CAAA;QACjB,IAAI;YACF,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACxC;QAAC,MAAM;YACN,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK;YACvC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzE,CAAC,CAAC,EAAE,CAAA;QACN,OAAO;YACL,GAAG,IAAI;YACP,iBAAiB,EAAE;gBACjB,SAAS,CAAC,mBAAmB,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,aAAa,CAAC;gBACtB,GAAG,sBAAsB;aAC1B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { toUtf8String, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getText,\n getToken\n} from '../../utils'\n\nexport const asciiModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.data === '0x') return call\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n let messageAsText\n try {\n messageAsText = toUtf8String(call.data)\n } catch {\n return call\n }\n const sendNativeHumanization = call.value\n ? [getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n : []\n return {\n ...call,\n fullVisualization: [\n getAction('Send this message'),\n getLabel('to'),\n getAddressVisualization(call.to),\n getText(messageAsText),\n ...sendNativeHumanization\n ]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"asciiModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/asciiModule.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AACrC,mCAAkD;AAIlD,uCAOoB;AAEb,MAAM,WAAW,GAAwB,CAC9C,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACnC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAA,4BAAoB,EAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAA;QACzF,IAAI,aAAa,CAAA;QACjB,IAAI;YACF,aAAa,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACxC;QAAC,MAAM;YACN,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK;YACvC,CAAC,CAAC,CAAC,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,IAAA,iBAAS,EAAC,MAAM,CAAC,EAAE,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzE,CAAC,CAAC,EAAE,CAAA;QACN,OAAO;YACL,GAAG,IAAI;YACP,iBAAiB,EAAE;gBACjB,IAAA,iBAAS,EAAC,mBAAmB,CAAC;gBAC9B,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,IAAA,eAAO,EAAC,aAAa,CAAC;gBACtB,GAAG,sBAAsB;aAC1B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AA5BY,QAAA,WAAW,eA4BvB","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { toUtf8String, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getText,\n getToken\n} from '../../utils'\n\nexport const asciiModule: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.data === '0x') return call\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n let messageAsText\n try {\n messageAsText = toUtf8String(call.data)\n } catch {\n return call\n }\n const sendNativeHumanization = call.value\n ? [getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n : []\n return {\n ...call,\n fullVisualization: [\n getAction('Send this message'),\n getLabel('to'),\n getAddressVisualization(call.to),\n getText(messageAsText),\n ...sendNativeHumanization\n ]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.js b/dist/src/libs/humanizer/modules/AsciiModule/index.js index 0bbe35635..8ee3d46a9 100644 --- a/dist/src/libs/humanizer/modules/AsciiModule/index.js +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.js @@ -1,3 +1,5 @@ -import { asciiModule } from './asciiModule'; -export default asciiModule; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const asciiModule_1 = require("./asciiModule"); +exports.default = asciiModule_1.asciiModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/AsciiModule/index.js.map b/dist/src/libs/humanizer/modules/AsciiModule/index.js.map index dc9b16430..7d589e7c6 100644 --- a/dist/src/libs/humanizer/modules/AsciiModule/index.js.map +++ b/dist/src/libs/humanizer/modules/AsciiModule/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,eAAe,WAAW,CAAA","sourcesContent":["import { asciiModule } from './asciiModule'\n\nexport default asciiModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/AsciiModule/index.ts"],"names":[],"mappings":";;AAAA,+CAA2C;AAE3C,kBAAe,yBAAW,CAAA","sourcesContent":["import { asciiModule } from './asciiModule'\n\nexport default asciiModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.js b/dist/src/libs/humanizer/modules/Curve/index.js index a48549086..619d7c8f6 100644 --- a/dist/src/libs/humanizer/modules/Curve/index.js +++ b/dist/src/libs/humanizer/modules/Curve/index.js @@ -1,18 +1,20 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { CurveRouter } from '../../const/abis/Curve'; -import { getAction, getLabel, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const Curve_1 = require("../../const/abis/Curve"); +const utils_1 = require("../../utils"); const curveModule = (_, calls) => { - const iface = new Interface(CurveRouter); - const parseCurveNative = (address) => address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ZeroAddress : address; + const iface = new ethers_1.Interface(Curve_1.CurveRouter); + const parseCurveNative = (address) => address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ethers_1.ZeroAddress : address; const handleBasicSwap = (curveRoute, amountIn, amountOut) => { // eslint-disable-next-line @typescript-eslint/naming-convention - const route = curveRoute.filter((a) => a !== ZeroAddress); + const route = curveRoute.filter((a) => a !== ethers_1.ZeroAddress); const [inToken, outToken] = [route[0], route[route.length - 1]]; return [ - getAction('Swap'), - getToken(parseCurveNative(inToken), amountIn), - getLabel('for'), - getToken(parseCurveNative(outToken), amountOut) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(parseCurveNative(inToken), amountIn), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(parseCurveNative(outToken), amountOut) ]; }; const matcher = { @@ -29,5 +31,5 @@ const curveModule = (_, calls) => { }); return newCalls; }; -export default curveModule; +exports.default = curveModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Curve/index.js.map b/dist/src/libs/humanizer/modules/Curve/index.js.map index cf7da6ffd..bf4c07289 100644 --- a/dist/src/libs/humanizer/modules/Curve/index.js.map +++ b/dist/src/libs/humanizer/modules/Curve/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Curve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3D,MAAM,WAAW,GAAwB,CAAC,CAAY,EAAE,KAAe,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;IAExC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE,CAC3C,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA;IAEhG,MAAM,eAAe,GAAG,CAAC,UAAoB,EAAE,QAAgB,EAAE,SAAiB,EAAE,EAAE;QACpF,gEAAgE;QAChE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAA;QACjE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/D,OAAO;YACL,SAAS,CAAC,MAAM,CAAC;YACjB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;YAC7C,QAAQ,CAAC,KAAK,CAAC;YACf,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;SAChD,CAAA;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,iHAAiH,CAClH,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACzE,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { CurveRouter } from '../../const/abis/Curve'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getToken } from '../../utils'\n\nconst curveModule: HumanizerCallModule = (_: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(CurveRouter)\n\n const parseCurveNative = (address: string) =>\n address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ZeroAddress : address\n\n const handleBasicSwap = (curveRoute: string[], amountIn: bigint, amountOut: bigint) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const route = curveRoute.filter((a: string) => a !== ZeroAddress)\n const [inToken, outToken] = [route[0], route[route.length - 1]]\n return [\n getAction('Swap'),\n getToken(parseCurveNative(inToken), amountIn),\n getLabel('for'),\n getToken(parseCurveNative(outToken), amountOut)\n ]\n }\n\n const matcher = {\n [iface.getFunction(\n 'exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _route, _amount, _expected } = iface.parseTransaction(call)!.args\n return handleBasicSwap(_route, _amount, _expected)\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default curveModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Curve/index.ts"],"names":[],"mappings":";;AAAA,mCAA+C;AAG/C,kDAAoD;AAEpD,uCAA2D;AAE3D,MAAM,WAAW,GAAwB,CAAC,CAAY,EAAE,KAAe,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,mBAAW,CAAC,CAAA;IAExC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE,CAC3C,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C,CAAC,CAAC,CAAC,oBAAW,CAAC,CAAC,CAAC,OAAO,CAAA;IAEhG,MAAM,eAAe,GAAG,CAAC,UAAoB,EAAE,QAAgB,EAAE,SAAiB,EAAE,EAAE;QACpF,gEAAgE;QAChE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,oBAAW,CAAC,CAAA;QACjE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/D,OAAO;YACL,IAAA,iBAAS,EAAC,MAAM,CAAC;YACjB,IAAA,gBAAQ,EAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;YAC7C,IAAA,gBAAQ,EAAC,KAAK,CAAC;YACf,IAAA,gBAAQ,EAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;SAChD,CAAA;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,iHAAiH,CAClH,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACzE,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,kBAAe,WAAW,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { CurveRouter } from '../../const/abis/Curve'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getToken } from '../../utils'\n\nconst curveModule: HumanizerCallModule = (_: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(CurveRouter)\n\n const parseCurveNative = (address: string) =>\n address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ? ZeroAddress : address\n\n const handleBasicSwap = (curveRoute: string[], amountIn: bigint, amountOut: bigint) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const route = curveRoute.filter((a: string) => a !== ZeroAddress)\n const [inToken, outToken] = [route[0], route[route.length - 1]]\n return [\n getAction('Swap'),\n getToken(parseCurveNative(inToken), amountIn),\n getLabel('for'),\n getToken(parseCurveNative(outToken), amountOut)\n ]\n }\n\n const matcher = {\n [iface.getFunction(\n 'exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _route, _amount, _expected } = iface.parseTransaction(call)!.args\n return handleBasicSwap(_route, _amount, _expected)\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default curveModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.js b/dist/src/libs/humanizer/modules/Deployment/index.js index 0ca4d1485..31ff1b2c7 100644 --- a/dist/src/libs/humanizer/modules/Deployment/index.js +++ b/dist/src/libs/humanizer/modules/Deployment/index.js @@ -1,13 +1,17 @@ -import { getAction } from '../../utils'; -export const deploymentModule = (_, irCalls +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deploymentModule = void 0; +const utils_1 = require("../../utils"); +const deploymentModule = (_, irCalls // humanizerMeta: HumanizerMeta ) => { const newCalls = irCalls.map((irCall) => irCall.to === undefined ? { ...irCall, - fullVisualization: [getAction('Deploy a smart contract')] + fullVisualization: [(0, utils_1.getAction)('Deploy a smart contract')] } : irCall); return newCalls; }; +exports.deploymentModule = deploymentModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Deployment/index.js.map b/dist/src/libs/humanizer/modules/Deployment/index.js.map index 4000ef2d5..e66f40a3f 100644 --- a/dist/src/libs/humanizer/modules/Deployment/index.js.map +++ b/dist/src/libs/humanizer/modules/Deployment/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Deployment/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CACnD,CAAY,EACZ,OAAiB;AACjB,+BAA+B;EAC/B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACtC,MAAM,CAAC,EAAE,KAAK,SAAS;QACrB,CAAC,CAAC;YACE,GAAG,MAAM;YACT,iBAAiB,EAAE,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;SAC1D;QACH,CAAC,CAAC,MAAM,CACX,CAAA;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction } from '../../utils'\n\nexport const deploymentModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[]\n // humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((irCall) =>\n irCall.to === undefined\n ? {\n ...irCall,\n fullVisualization: [getAction('Deploy a smart contract')]\n }\n : irCall\n )\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Deployment/index.ts"],"names":[],"mappings":";;;AAEA,uCAAuC;AAEhC,MAAM,gBAAgB,GAAwB,CACnD,CAAY,EACZ,OAAiB;AACjB,+BAA+B;EAC/B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACtC,MAAM,CAAC,EAAE,KAAK,SAAS;QACrB,CAAC,CAAC;YACE,GAAG,MAAM;YACT,iBAAiB,EAAE,CAAC,IAAA,iBAAS,EAAC,yBAAyB,CAAC,CAAC;SAC1D;QACH,CAAC,CAAC,MAAM,CACX,CAAA;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAdY,QAAA,gBAAgB,oBAc5B","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction } from '../../utils'\n\nexport const deploymentModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[]\n // humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((irCall) =>\n irCall.to === undefined\n ? {\n ...irCall,\n fullVisualization: [getAction('Deploy a smart contract')]\n }\n : irCall\n )\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.js b/dist/src/libs/humanizer/modules/ENS/index.js index 862043c5e..6500fccc6 100644 --- a/dist/src/libs/humanizer/modules/ENS/index.js +++ b/dist/src/libs/humanizer/modules/ENS/index.js @@ -1,10 +1,13 @@ -import { getAddress, Interface, isAddress } from 'ethers'; -import { registeredCoinTypes } from '../../const/coinType'; -import { getAction, getAddressVisualization, getLabel } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ensModule = void 0; +const ethers_1 = require("ethers"); +const coinType_1 = require("../../const/coinType"); +const utils_1 = require("../../utils"); const ENS_CONTROLLER = '0x253553366Da8546fC250F225fe3d25d0C782303b'; const ENS_RESOLVER = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'; const BULK_RENEWAL = '0xa12159e5131b1eEf6B4857EEE3e1954744b5033A'; -const iface = new Interface([ +const iface = new ethers_1.Interface([ 'function register(string name,address owner, uint256 duration, bytes32 secret, address resolver, bytes[] data, bool reverseRecord, uint16 ownerControlledFuses)', 'function commit(bytes32)', 'function setText(bytes32 node,string calldata key,string calldata value)', @@ -21,10 +24,10 @@ const getDurationText = (duration) => { const durationLabel = `${duration / YEAR_IN_SECONDS} year${duration < 2n * YEAR_IN_SECONDS ? '' : 's'}`; return durationLabel; }; -export const ensModule = (accountOp, irCalls) => { +const ensModule = (accountOp, irCalls) => { // @TODO: set text and others return irCalls.map((call) => { - if (getAddress(call.to) === ENS_CONTROLLER) { + if ((0, ethers_1.getAddress)(call.to) === ENS_CONTROLLER) { if (call.data.slice(0, 10) === iface.getFunction('register').selector) { const { name, owner, duration // secret, @@ -33,28 +36,28 @@ export const ensModule = (accountOp, irCalls) => { // reverseRecord, // ownerControlledFuses } = iface.decodeFunctionData('register', call.data); - const fullVisualization = [getAction('Register'), getLabel(`${name}.ens`, true)]; + const fullVisualization = [(0, utils_1.getAction)('Register'), (0, utils_1.getLabel)(`${name}.ens`, true)]; if (owner !== accountOp.accountAddr) - fullVisualization.push(getLabel('to'), getAddressVisualization(owner)); + fullVisualization.push((0, utils_1.getLabel)('to'), (0, utils_1.getAddressVisualization)(owner)); const durationLabel = getDurationText(duration); - fullVisualization.push(getLabel('for'), getLabel(durationLabel, true)); + fullVisualization.push((0, utils_1.getLabel)('for'), (0, utils_1.getLabel)(durationLabel, true)); return { ...call, fullVisualization }; } if (call.data.slice(0, 10) === iface.getFunction('renew').selector) { const { id, duration } = iface.decodeFunctionData('renew', call.data); const durationLabel = getDurationText(duration); const fullVisualization = [ - getAction('Renew'), - getLabel(`${id}.eth`), - getLabel('for'), - getLabel(durationLabel, true) + (0, utils_1.getAction)('Renew'), + (0, utils_1.getLabel)(`${id}.eth`), + (0, utils_1.getLabel)('for'), + (0, utils_1.getLabel)(durationLabel, true) ]; return { ...call, fullVisualization }; } if (call.data.slice(0, 10) === iface.getFunction('commit').selector) { return { ...call, - fullVisualization: [getAction('Request'), getLabel('to register an ENS record')] + fullVisualization: [(0, utils_1.getAction)('Request'), (0, utils_1.getLabel)('to register an ENS record')] }; } } @@ -63,66 +66,67 @@ export const ensModule = (accountOp, irCalls) => { const { // node, key, value } = iface.decodeFunctionData('setText', data); - return [getAction('Set'), getLabel(`${key} to`), getLabel(value, true)]; + return [(0, utils_1.getAction)('Set'), (0, utils_1.getLabel)(`${key} to`), (0, utils_1.getLabel)(value, true)]; }, [iface.getFunction('setAddr').selector]: (data) => { const { // node, coinType, a } = iface.decodeFunctionData('setAddr', data); - const ct = registeredCoinTypes[Number(coinType)]; + const ct = coinType_1.registeredCoinTypes[Number(coinType)]; const networkName = (ct && ct[2]) || 'Unknown network'; return networkName === 'Ether' ? [ - getAction('Transfer ENS'), - getLabel('to'), - isAddress(a) ? getAddressVisualization(a) : getLabel(a, true) + (0, utils_1.getAction)('Transfer ENS'), + (0, utils_1.getLabel)('to'), + (0, ethers_1.isAddress)(a) ? (0, utils_1.getAddressVisualization)(a) : (0, utils_1.getLabel)(a, true) ] : [ - getAction('Set'), - getLabel('address'), - isAddress(a) ? getAddressVisualization(a) : getLabel(a, true), - getLabel('on'), - getLabel(networkName, true) + (0, utils_1.getAction)('Set'), + (0, utils_1.getLabel)('address'), + (0, ethers_1.isAddress)(a) ? (0, utils_1.getAddressVisualization)(a) : (0, utils_1.getLabel)(a, true), + (0, utils_1.getLabel)('on'), + (0, utils_1.getLabel)(networkName, true) ]; }, [iface.getFunction('setContenthash').selector]: () => { - return [getAction('Update'), getLabel('data')]; + return [(0, utils_1.getAction)('Update'), (0, utils_1.getLabel)('data')]; }, [iface.getFunction('setABI').selector]: () => { - return [getAction('Set'), getLabel('ABI')]; + return [(0, utils_1.getAction)('Set'), (0, utils_1.getLabel)('ABI')]; } }; - if (getAddress(call.to) === ENS_RESOLVER) { + if ((0, ethers_1.getAddress)(call.to) === ENS_RESOLVER) { if (resolverMatcher[call.data.slice(0, 10)]) return { ...call, fullVisualization: resolverMatcher[call.data.slice(0, 10)](call.data) }; if (call.data.slice(0, 10) === iface.getFunction('multicall').selector) { const { data } = iface.decodeFunctionData('multicall', call.data); - const separator = getLabel('and'); + const separator = (0, utils_1.getLabel)('and'); const fullVisualization = data .map((i) => { return resolverMatcher[i.slice(0, 10)] ? resolverMatcher[i.slice(0, 10)](i) - : [getAction('Unknown ENS action')]; + : [(0, utils_1.getAction)('Unknown ENS action')]; }) .reduce((acc, curr, index) => acc.concat(index ? [separator, ...curr] : curr), []); return { ...call, fullVisualization }; } } - if (getAddress(call.to) === BULK_RENEWAL && + if ((0, ethers_1.getAddress)(call.to) === BULK_RENEWAL && call.data.startsWith(iface.getFunction('renewAll').selector)) { const { names, duration } = iface.decodeFunctionData('renewAll', call.data); const durationLabel = getDurationText(duration); return { ...call, fullVisualization: [ - getAction('Renew'), - ...names.map((name) => getLabel(`${name}.eth`, true)), - getLabel('for'), - getLabel(durationLabel, true) + (0, utils_1.getAction)('Renew'), + ...names.map((name) => (0, utils_1.getLabel)(`${name}.eth`, true)), + (0, utils_1.getLabel)('for'), + (0, utils_1.getLabel)(durationLabel, true) ] }; } return call; }); }; +exports.ensModule = ensModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/ENS/index.js.map b/dist/src/libs/humanizer/modules/ENS/index.js.map index 51580493b..82f0e9f0f 100644 --- a/dist/src/libs/humanizer/modules/ENS/index.js.map +++ b/dist/src/libs/humanizer/modules/ENS/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/ENS/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { registeredCoinTypes } from '../../const/coinType'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst ENS_CONTROLLER = '0x253553366Da8546fC250F225fe3d25d0C782303b'\nconst ENS_RESOLVER = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'\nconst BULK_RENEWAL = '0xa12159e5131b1eEf6B4857EEE3e1954744b5033A'\n\nconst iface = new Interface([\n 'function register(string name,address owner, uint256 duration, bytes32 secret, address resolver, bytes[] data, bool reverseRecord, uint16 ownerControlledFuses)',\n 'function commit(bytes32)',\n 'function setText(bytes32 node,string calldata key,string calldata value)',\n 'function multicall(bytes[] data)',\n // 'function setAddr(bytes32,uint256,bytes)',\n 'function setAddr(bytes32 node, uint256 coinType, bytes memory a)',\n 'function setContenthash(bytes32,bytes)',\n 'function setABI(bytes32,uint256,bytes)',\n 'function renew(string id,uint256 duration)',\n 'function renewAll(string[] calldata names, uint256 duration)'\n])\n\nconst YEAR_IN_SECONDS = 60n * 60n * 24n * 365n\nconst getDurationText = (duration: bigint): string => {\n const durationLabel = `${duration / YEAR_IN_SECONDS} year${\n duration < 2n * YEAR_IN_SECONDS ? '' : 's'\n }`\n return durationLabel\n}\n\nexport const ensModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n // @TODO: set text and others\n return irCalls.map((call) => {\n if (getAddress(call.to) === ENS_CONTROLLER) {\n if (call.data.slice(0, 10) === iface.getFunction('register')!.selector) {\n const {\n name,\n owner,\n duration\n // secret,\n // resolver,\n // data,\n // reverseRecord,\n // ownerControlledFuses\n } = iface.decodeFunctionData('register', call.data)\n const fullVisualization = [getAction('Register'), getLabel(`${name}.ens`, true)]\n\n if (owner !== accountOp.accountAddr)\n fullVisualization.push(getLabel('to'), getAddressVisualization(owner))\n const durationLabel = getDurationText(duration)\n\n fullVisualization.push(getLabel('for'), getLabel(durationLabel, true))\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('renew')!.selector) {\n const { id, duration } = iface.decodeFunctionData('renew', call.data)\n const durationLabel = getDurationText(duration)\n const fullVisualization = [\n getAction('Renew'),\n getLabel(`${id}.eth`),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('commit')!.selector) {\n return {\n ...call,\n fullVisualization: [getAction('Request'), getLabel('to register an ENS record')]\n }\n }\n }\n const resolverMatcher = {\n [iface.getFunction('setText')!.selector]: (data: string) => {\n const {\n // node,\n key,\n value\n } = iface.decodeFunctionData('setText', data)\n return [getAction('Set'), getLabel(`${key} to`), getLabel(value, true)]\n },\n [iface.getFunction('setAddr')!.selector]: (data: string) => {\n const {\n // node,\n coinType,\n a\n } = iface.decodeFunctionData('setAddr', data)\n const ct = registeredCoinTypes[Number(coinType)]\n const networkName = (ct && ct[2]) || 'Unknown network'\n return networkName === 'Ether'\n ? [\n getAction('Transfer ENS'),\n getLabel('to'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true)\n ]\n : [\n getAction('Set'),\n getLabel('address'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true),\n getLabel('on'),\n getLabel(networkName, true)\n ]\n },\n [iface.getFunction('setContenthash')!.selector]: () => {\n return [getAction('Update'), getLabel('data')]\n },\n [iface.getFunction('setABI')!.selector]: () => {\n return [getAction('Set'), getLabel('ABI')]\n }\n }\n\n if (getAddress(call.to) === ENS_RESOLVER) {\n if (resolverMatcher[call.data.slice(0, 10)])\n return { ...call, fullVisualization: resolverMatcher[call.data.slice(0, 10)](call.data) }\n\n if (call.data.slice(0, 10) === iface.getFunction('multicall')!.selector) {\n const { data } = iface.decodeFunctionData('multicall', call.data)\n const separator = getLabel('and')\n const fullVisualization = data\n .map((i: string): HumanizerVisualization[] => {\n return resolverMatcher[i.slice(0, 10)]\n ? resolverMatcher[i.slice(0, 10)](i)\n : [getAction('Unknown ENS action')]\n })\n .reduce(\n (acc: HumanizerVisualization[], curr: HumanizerVisualization[], index: number) =>\n acc.concat(index ? [separator, ...curr] : curr),\n []\n )\n return { ...call, fullVisualization }\n }\n }\n if (\n getAddress(call.to) === BULK_RENEWAL &&\n call.data.startsWith(iface.getFunction('renewAll')!.selector)\n ) {\n const { names, duration } = iface.decodeFunctionData('renewAll', call.data)\n const durationLabel = getDurationText(duration)\n\n return {\n ...call,\n fullVisualization: [\n getAction('Renew'),\n ...names.map((name: string) => getLabel(`${name}.eth`, true)),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n }\n }\n return call\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/ENS/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { registeredCoinTypes } from '../../const/coinType'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst ENS_CONTROLLER = '0x253553366Da8546fC250F225fe3d25d0C782303b'\nconst ENS_RESOLVER = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'\nconst BULK_RENEWAL = '0xa12159e5131b1eEf6B4857EEE3e1954744b5033A'\n\nconst iface = new Interface([\n 'function register(string name,address owner, uint256 duration, bytes32 secret, address resolver, bytes[] data, bool reverseRecord, uint16 ownerControlledFuses)',\n 'function commit(bytes32)',\n 'function setText(bytes32 node,string calldata key,string calldata value)',\n 'function multicall(bytes[] data)',\n // 'function setAddr(bytes32,uint256,bytes)',\n 'function setAddr(bytes32 node, uint256 coinType, bytes memory a)',\n 'function setContenthash(bytes32,bytes)',\n 'function setABI(bytes32,uint256,bytes)',\n 'function renew(string id,uint256 duration)',\n 'function renewAll(string[] calldata names, uint256 duration)'\n])\n\nconst YEAR_IN_SECONDS = 60n * 60n * 24n * 365n\nconst getDurationText = (duration: bigint): string => {\n const durationLabel = `${duration / YEAR_IN_SECONDS} year${\n duration < 2n * YEAR_IN_SECONDS ? '' : 's'\n }`\n return durationLabel\n}\n\nexport const ensModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n // @TODO: set text and others\n return irCalls.map((call) => {\n if (getAddress(call.to) === ENS_CONTROLLER) {\n if (call.data.slice(0, 10) === iface.getFunction('register')!.selector) {\n const {\n name,\n owner,\n duration\n // secret,\n // resolver,\n // data,\n // reverseRecord,\n // ownerControlledFuses\n } = iface.decodeFunctionData('register', call.data)\n const fullVisualization = [getAction('Register'), getLabel(`${name}.ens`, true)]\n\n if (owner !== accountOp.accountAddr)\n fullVisualization.push(getLabel('to'), getAddressVisualization(owner))\n const durationLabel = getDurationText(duration)\n\n fullVisualization.push(getLabel('for'), getLabel(durationLabel, true))\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('renew')!.selector) {\n const { id, duration } = iface.decodeFunctionData('renew', call.data)\n const durationLabel = getDurationText(duration)\n const fullVisualization = [\n getAction('Renew'),\n getLabel(`${id}.eth`),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n\n return { ...call, fullVisualization }\n }\n\n if (call.data.slice(0, 10) === iface.getFunction('commit')!.selector) {\n return {\n ...call,\n fullVisualization: [getAction('Request'), getLabel('to register an ENS record')]\n }\n }\n }\n const resolverMatcher = {\n [iface.getFunction('setText')!.selector]: (data: string) => {\n const {\n // node,\n key,\n value\n } = iface.decodeFunctionData('setText', data)\n return [getAction('Set'), getLabel(`${key} to`), getLabel(value, true)]\n },\n [iface.getFunction('setAddr')!.selector]: (data: string) => {\n const {\n // node,\n coinType,\n a\n } = iface.decodeFunctionData('setAddr', data)\n const ct = registeredCoinTypes[Number(coinType)]\n const networkName = (ct && ct[2]) || 'Unknown network'\n return networkName === 'Ether'\n ? [\n getAction('Transfer ENS'),\n getLabel('to'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true)\n ]\n : [\n getAction('Set'),\n getLabel('address'),\n isAddress(a) ? getAddressVisualization(a) : getLabel(a, true),\n getLabel('on'),\n getLabel(networkName, true)\n ]\n },\n [iface.getFunction('setContenthash')!.selector]: () => {\n return [getAction('Update'), getLabel('data')]\n },\n [iface.getFunction('setABI')!.selector]: () => {\n return [getAction('Set'), getLabel('ABI')]\n }\n }\n\n if (getAddress(call.to) === ENS_RESOLVER) {\n if (resolverMatcher[call.data.slice(0, 10)])\n return { ...call, fullVisualization: resolverMatcher[call.data.slice(0, 10)](call.data) }\n\n if (call.data.slice(0, 10) === iface.getFunction('multicall')!.selector) {\n const { data } = iface.decodeFunctionData('multicall', call.data)\n const separator = getLabel('and')\n const fullVisualization = data\n .map((i: string): HumanizerVisualization[] => {\n return resolverMatcher[i.slice(0, 10)]\n ? resolverMatcher[i.slice(0, 10)](i)\n : [getAction('Unknown ENS action')]\n })\n .reduce(\n (acc: HumanizerVisualization[], curr: HumanizerVisualization[], index: number) =>\n acc.concat(index ? [separator, ...curr] : curr),\n []\n )\n return { ...call, fullVisualization }\n }\n }\n if (\n getAddress(call.to) === BULK_RENEWAL &&\n call.data.startsWith(iface.getFunction('renewAll')!.selector)\n ) {\n const { names, duration } = iface.decodeFunctionData('renewAll', call.data)\n const durationLabel = getDurationText(duration)\n\n return {\n ...call,\n fullVisualization: [\n getAction('Renew'),\n ...names.map((name: string) => getLabel(`${name}.eth`, true)),\n getLabel('for'),\n getLabel(durationLabel, true)\n ]\n }\n }\n return call\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js index f58f3c6a0..3c8f8dd8b 100644 --- a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js @@ -1,14 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fallbackHumanizer = void 0; /* eslint-disable no-await-in-loop */ -import { Interface, isAddress, ZeroAddress } from 'ethers'; -import { checkIfUnknownAction, getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); function extractAddresses(data, _selector) { const selector = _selector.startsWith('function') ? _selector : `function ${_selector}`; - const iface = new Interface([selector]); + const iface = new ethers_1.Interface([selector]); const args = iface.decodeFunctionData(selector, data); const deepSearchForAddress = (obj) => { return Object.values(obj) .map((o) => { - if (typeof o === 'string' && isAddress(o)) + if (typeof o === 'string' && (0, ethers_1.isAddress)(o)) return [o]; if (typeof o === 'object') return deepSearchForAddress(o).filter((x) => x); @@ -18,9 +21,9 @@ function extractAddresses(data, _selector) { }; return deepSearchForAddress(args); } -export const fallbackHumanizer = (accountOp, currentIrCalls, humanizerMeta) => { +const fallbackHumanizer = (accountOp, currentIrCalls, humanizerMeta) => { const newCalls = currentIrCalls.map((call) => { - if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) + if (call.fullVisualization && !(0, utils_1.checkIfUnknownAction)(call?.fullVisualization)) return call; const knownSigHashes = Object.values(humanizerMeta.abis).reduce((a, b) => ({ ...a, ...b }), {}); const visualization = []; @@ -33,32 +36,33 @@ export const fallbackHumanizer = (accountOp, currentIrCalls, humanizerMeta) => { catch (e) { console.error('Humanizer: fallback: Could not decode addresses from calldata'); } - visualization.push(getAction(`Call ${ + visualization.push((0, utils_1.getAction)(`Call ${ // from function asd(address asd) returns ... => asd(address asd) knownSigHashes[call.data.slice(0, 10)].signature .split('function ') .filter((x) => x !== '')[0] .split(' returns') - .filter((x) => x !== '')[0]}`), getLabel('from'), getAddressVisualization(call.to), ...extractedAddresses.map((a) => ({ ...getToken(a, 0n), isHidden: true }))); + .filter((x) => x !== '')[0]}`), (0, utils_1.getLabel)('from'), (0, utils_1.getAddressVisualization)(call.to), ...extractedAddresses.map((a) => ({ ...(0, utils_1.getToken)(a, 0n), isHidden: true }))); } else { - visualization.push(getAction('Unknown action'), getLabel('to'), getAddressVisualization(call.to)); + visualization.push((0, utils_1.getAction)('Unknown action'), (0, utils_1.getLabel)('to'), (0, utils_1.getAddressVisualization)(call.to)); } } if (call.value) { if (call.data !== '0x') - visualization.push(getLabel('and')); - visualization.push(getAction('Send'), getToken(ZeroAddress, call.value)); + visualization.push((0, utils_1.getLabel)('and')); + visualization.push((0, utils_1.getAction)('Send'), (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value)); if (call.data === '0x') - visualization.push(getLabel('to'), getAddressVisualization(call.to)); + visualization.push((0, utils_1.getLabel)('to'), (0, utils_1.getAddressVisualization)(call.to)); } return { ...call, fullVisualization: visualization.length ? visualization - : [getAction('No data, no value, call to'), getAddressVisualization(call.to)] + : [(0, utils_1.getAction)('No data, no value, call to'), (0, utils_1.getAddressVisualization)(call.to)] }; }); return newCalls; }; +exports.fallbackHumanizer = fallbackHumanizer; //# sourceMappingURL=fallBackHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map index cd22f710f..dc9d345af 100644 --- a/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.js.map @@ -1 +1 @@ -{"version":3,"file":"fallBackHumanizer.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getToken\n} from '../../utils'\n\nfunction extractAddresses(data: string, _selector: string): string[] {\n const selector = _selector.startsWith('function') ? _selector : `function ${_selector}`\n const iface = new Interface([selector])\n const args = iface.decodeFunctionData(selector, data)\n const deepSearchForAddress = (obj: { [prop: string]: any }): string[] => {\n return (\n Object.values(obj)\n .map((o: any): string[] | undefined => {\n if (typeof o === 'string' && isAddress(o)) return [o] as string[]\n if (typeof o === 'object') return deepSearchForAddress(o).filter((x) => x) as string[]\n return undefined\n })\n .filter((x) => x) as string[][]\n ).flat() as string[]\n }\n return deepSearchForAddress(args)\n}\n\nexport const fallbackHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n\n const knownSigHashes: HumanizerMeta['abis']['NO_ABI'] = Object.values(\n humanizerMeta.abis as HumanizerMeta['abis']\n ).reduce((a, b) => ({ ...a, ...b }), {})\n\n const visualization: Array = []\n if (call.data !== '0x') {\n let extractedAddresses: string[] = []\n if (knownSigHashes[call.data.slice(0, 10)]?.signature) {\n try {\n extractedAddresses = extractAddresses(\n call.data,\n knownSigHashes[call.data.slice(0, 10)].signature\n )\n } catch (e) {\n console.error('Humanizer: fallback: Could not decode addresses from calldata')\n }\n visualization.push(\n getAction(\n `Call ${\n // from function asd(address asd) returns ... => asd(address asd)\n knownSigHashes[call.data.slice(0, 10)].signature\n .split('function ')\n .filter((x) => x !== '')[0]\n .split(' returns')\n .filter((x) => x !== '')[0]\n }`\n ),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...extractedAddresses.map(\n (a): HumanizerVisualization => ({ ...getToken(a, 0n), isHidden: true })\n )\n )\n } else {\n visualization.push(\n getAction('Unknown action'),\n getLabel('to'),\n getAddressVisualization(call.to)\n )\n }\n }\n if (call.value) {\n if (call.data !== '0x') visualization.push(getLabel('and'))\n visualization.push(getAction('Send'), getToken(ZeroAddress, call.value))\n if (call.data === '0x') visualization.push(getLabel('to'), getAddressVisualization(call.to))\n }\n\n return {\n ...call,\n fullVisualization: visualization.length\n ? visualization\n : [getAction('No data, no value, call to'), getAddressVisualization(call.to)]\n }\n })\n\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"fallBackHumanizer.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/fallBackHumanizer.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getAddressVisualization,\n getLabel,\n getToken\n} from '../../utils'\n\nfunction extractAddresses(data: string, _selector: string): string[] {\n const selector = _selector.startsWith('function') ? _selector : `function ${_selector}`\n const iface = new Interface([selector])\n const args = iface.decodeFunctionData(selector, data)\n const deepSearchForAddress = (obj: { [prop: string]: any }): string[] => {\n return (\n Object.values(obj)\n .map((o: any): string[] | undefined => {\n if (typeof o === 'string' && isAddress(o)) return [o] as string[]\n if (typeof o === 'object') return deepSearchForAddress(o).filter((x) => x) as string[]\n return undefined\n })\n .filter((x) => x) as string[][]\n ).flat() as string[]\n }\n return deepSearchForAddress(args)\n}\n\nexport const fallbackHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = currentIrCalls.map((call) => {\n if (call.fullVisualization && !checkIfUnknownAction(call?.fullVisualization)) return call\n\n const knownSigHashes: HumanizerMeta['abis']['NO_ABI'] = Object.values(\n humanizerMeta.abis as HumanizerMeta['abis']\n ).reduce((a, b) => ({ ...a, ...b }), {})\n\n const visualization: Array = []\n if (call.data !== '0x') {\n let extractedAddresses: string[] = []\n if (knownSigHashes[call.data.slice(0, 10)]?.signature) {\n try {\n extractedAddresses = extractAddresses(\n call.data,\n knownSigHashes[call.data.slice(0, 10)].signature\n )\n } catch (e) {\n console.error('Humanizer: fallback: Could not decode addresses from calldata')\n }\n visualization.push(\n getAction(\n `Call ${\n // from function asd(address asd) returns ... => asd(address asd)\n knownSigHashes[call.data.slice(0, 10)].signature\n .split('function ')\n .filter((x) => x !== '')[0]\n .split(' returns')\n .filter((x) => x !== '')[0]\n }`\n ),\n getLabel('from'),\n getAddressVisualization(call.to),\n ...extractedAddresses.map(\n (a): HumanizerVisualization => ({ ...getToken(a, 0n), isHidden: true })\n )\n )\n } else {\n visualization.push(\n getAction('Unknown action'),\n getLabel('to'),\n getAddressVisualization(call.to)\n )\n }\n }\n if (call.value) {\n if (call.data !== '0x') visualization.push(getLabel('and'))\n visualization.push(getAction('Send'), getToken(ZeroAddress, call.value))\n if (call.data === '0x') visualization.push(getLabel('to'), getAddressVisualization(call.to))\n }\n\n return {\n ...call,\n fullVisualization: visualization.length\n ? visualization\n : [getAction('No data, no value, call to'), getAddressVisualization(call.to)]\n }\n })\n\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js index 43d22f448..536eda1eb 100644 --- a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js @@ -1,3 +1,5 @@ -import { fallbackHumanizer } from './fallBackHumanizer'; -export default fallbackHumanizer; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fallBackHumanizer_1 = require("./fallBackHumanizer"); +exports.default = fallBackHumanizer_1.fallbackHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map index 1bf7578c3..1aeda9b9c 100644 --- a/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map +++ b/dist/src/libs/humanizer/modules/FallbackHumanizer/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,eAAe,iBAAiB,CAAA","sourcesContent":["import { fallbackHumanizer } from './fallBackHumanizer'\n\nexport default fallbackHumanizer\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/FallbackHumanizer/index.ts"],"names":[],"mappings":";;AAAA,2DAAuD;AAEvD,kBAAe,qCAAiB,CAAA","sourcesContent":["import { fallbackHumanizer } from './fallBackHumanizer'\n\nexport default fallbackHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js index e45f0be1e..973fa9787 100644 --- a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js @@ -1,21 +1,24 @@ -import { AbiCoder, ZeroAddress } from 'ethers'; -import { FEE_COLLECTOR } from '../../../../consts/addresses'; -import { getAction, getToken } from '../../utils'; -export const gasTankModule = (_, irCalls) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gasTankModule = void 0; +const ethers_1 = require("ethers"); +const addresses_1 = require("../../../../consts/addresses"); +const utils_1 = require("../../utils"); +const gasTankModule = (_, irCalls) => { const newCalls = irCalls.map((call) => { // @TODO fix those upper/lowercase - if (call.to.toLowerCase() === FEE_COLLECTOR.toLowerCase()) { + if (call.to.toLowerCase() === addresses_1.FEE_COLLECTOR.toLowerCase()) { if (call.value > 0n) { return { ...call, - fullVisualization: [getAction('Fuel gas tank with'), getToken(ZeroAddress, call.value)] + fullVisualization: [(0, utils_1.getAction)('Fuel gas tank with'), (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value)] }; } try { - const [text] = new AbiCoder().decode(['string', 'uint256', 'string'], call.data); + const [text] = new ethers_1.AbiCoder().decode(['string', 'uint256', 'string'], call.data); // mostly useful for filtering out call in benzin if (text === 'gasTank') - return { ...call, fullVisualization: [getAction('Pay fee with gas tank')] }; + return { ...call, fullVisualization: [(0, utils_1.getAction)('Pay fee with gas tank')] }; } catch (e) { // do nothing @@ -25,13 +28,14 @@ export const gasTankModule = (_, irCalls) => { call.fullVisualization?.[1]?.type === 'token' && call.fullVisualization?.[2]?.content === 'to' && call.fullVisualization?.[3].type === 'address' && - call.fullVisualization[3].address.toLowerCase() === FEE_COLLECTOR.toLowerCase()) + call.fullVisualization[3].address.toLowerCase() === addresses_1.FEE_COLLECTOR.toLowerCase()) return { ...call, - fullVisualization: [getAction('Fuel gas tank with'), call.fullVisualization[1]] + fullVisualization: [(0, utils_1.getAction)('Fuel gas tank with'), call.fullVisualization[1]] }; return call; }); return newCalls; }; +exports.gasTankModule = gasTankModule; //# sourceMappingURL=gasTankModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map index 3cf5f4327..79092c4e2 100644 --- a/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map +++ b/dist/src/libs/humanizer/modules/GasTankModule/gasTankModule.js.map @@ -1 +1 @@ -{"version":3,"file":"gasTankModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/gasTankModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAG5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,EAAE;YACzD,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE;gBACnB,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACxF,CAAA;aACF;YACD,IAAI;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChF,iDAAiD;gBACjD,IAAI,IAAI,KAAK,SAAS;oBACpB,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAA;aAC9E;YAAC,OAAO,CAAC,EAAE;gBACV,aAAa;aACd;SACF;aAAM,IACL,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM;YAC/C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAC9C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAQ,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE;YAEhF,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;aAChF,CAAA;QACH,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nexport const gasTankModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (call.to.toLowerCase() === FEE_COLLECTOR.toLowerCase()) {\n if (call.value > 0n) {\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), getToken(ZeroAddress, call.value)]\n }\n }\n try {\n const [text] = new AbiCoder().decode(['string', 'uint256', 'string'], call.data)\n // mostly useful for filtering out call in benzin\n if (text === 'gasTank')\n return { ...call, fullVisualization: [getAction('Pay fee with gas tank')] }\n } catch (e) {\n // do nothing\n }\n } else if (\n call.fullVisualization?.[0]?.content === 'Send' &&\n call.fullVisualization?.[1]?.type === 'token' &&\n call.fullVisualization?.[2]?.content === 'to' &&\n call.fullVisualization?.[3].type === 'address' &&\n call.fullVisualization[3].address!.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n )\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), call.fullVisualization[1]]\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"gasTankModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/gasTankModule.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAE9C,4DAA4D;AAG5D,uCAAiD;AAE1C,MAAM,aAAa,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,yBAAa,CAAC,WAAW,EAAE,EAAE;YACzD,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE;gBACnB,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,CAAC,IAAA,iBAAS,EAAC,oBAAoB,CAAC,EAAE,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACxF,CAAA;aACF;YACD,IAAI;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChF,iDAAiD;gBACjD,IAAI,IAAI,KAAK,SAAS;oBACpB,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,IAAA,iBAAS,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAA;aAC9E;YAAC,OAAO,CAAC,EAAE;gBACV,aAAa;aACd;SACF;aAAM,IACL,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM;YAC/C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAC9C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAQ,CAAC,WAAW,EAAE,KAAK,yBAAa,CAAC,WAAW,EAAE;YAEhF,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,CAAC,IAAA,iBAAS,EAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;aAChF,CAAA;QACH,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAhCY,QAAA,aAAa,iBAgCzB","sourcesContent":["import { AbiCoder, ZeroAddress } from 'ethers'\n\nimport { FEE_COLLECTOR } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getToken } from '../../utils'\n\nexport const gasTankModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (call.to.toLowerCase() === FEE_COLLECTOR.toLowerCase()) {\n if (call.value > 0n) {\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), getToken(ZeroAddress, call.value)]\n }\n }\n try {\n const [text] = new AbiCoder().decode(['string', 'uint256', 'string'], call.data)\n // mostly useful for filtering out call in benzin\n if (text === 'gasTank')\n return { ...call, fullVisualization: [getAction('Pay fee with gas tank')] }\n } catch (e) {\n // do nothing\n }\n } else if (\n call.fullVisualization?.[0]?.content === 'Send' &&\n call.fullVisualization?.[1]?.type === 'token' &&\n call.fullVisualization?.[2]?.content === 'to' &&\n call.fullVisualization?.[3].type === 'address' &&\n call.fullVisualization[3].address!.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n )\n return {\n ...call,\n fullVisualization: [getAction('Fuel gas tank with'), call.fullVisualization[1]]\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.js b/dist/src/libs/humanizer/modules/GasTankModule/index.js index a17c54ee7..4578d1022 100644 --- a/dist/src/libs/humanizer/modules/GasTankModule/index.js +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.js @@ -1,3 +1,5 @@ -import { gasTankModule } from './gasTankModule'; -export default gasTankModule; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const gasTankModule_1 = require("./gasTankModule"); +exports.default = gasTankModule_1.gasTankModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/GasTankModule/index.js.map b/dist/src/libs/humanizer/modules/GasTankModule/index.js.map index 3b35a8f3c..28f4209d5 100644 --- a/dist/src/libs/humanizer/modules/GasTankModule/index.js.map +++ b/dist/src/libs/humanizer/modules/GasTankModule/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,eAAe,aAAa,CAAA","sourcesContent":["import { gasTankModule } from './gasTankModule'\n\nexport default gasTankModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/GasTankModule/index.ts"],"names":[],"mappings":";;AAAA,mDAA+C;AAE/C,kBAAe,6BAAa,CAAA","sourcesContent":["import { gasTankModule } from './gasTankModule'\n\nexport default gasTankModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.js b/dist/src/libs/humanizer/modules/KyberSwap/index.js index 6e88e7544..68c80042d 100644 --- a/dist/src/libs/humanizer/modules/KyberSwap/index.js +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.js @@ -1,25 +1,27 @@ -import { Interface } from 'ethers'; -import { KyberSwap } from '../../const/abis'; -import { eToNative, getAction, getLabel, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); const KyberModule = (accOp, calls) => { - const iface = new Interface(KyberSwap); + const iface = new ethers_1.Interface(abis_1.KyberSwap); const matcher = { [iface.getFunction('swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution)')?.selector]: (call) => { const { execution: { desc: { srcToken, dstToken, amount, minReturnAmount } } } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(eToNative(srcToken), amount), - getLabel('for'), - getToken(eToNative(dstToken), minReturnAmount) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)((0, utils_1.eToNative)(srcToken), amount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)((0, utils_1.eToNative)(dstToken), minReturnAmount) ]; }, [iface.getFunction('swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData)')?.selector]: (call) => { const { desc: { srcToken, dstToken, amount, minReturnAmount } } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(eToNative(srcToken), amount), - getLabel('for'), - getToken(eToNative(dstToken), minReturnAmount) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)((0, utils_1.eToNative)(srcToken), amount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)((0, utils_1.eToNative)(dstToken), minReturnAmount) ]; } }; @@ -30,5 +32,5 @@ const KyberModule = (accOp, calls) => { }); return newCalls; }; -export default KyberModule; +exports.default = KyberModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/KyberSwap/index.js.map b/dist/src/libs/humanizer/modules/KyberSwap/index.js.map index b8214b86f..7f7441655 100644 --- a/dist/src/libs/humanizer/modules/KyberSwap/index.js.map +++ b/dist/src/libs/humanizer/modules/KyberSwap/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/KyberSwap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtE,MAAM,WAAW,GAAwB,CAAC,KAAgB,EAAE,KAAe,EAAE,EAAE;IAC7E,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,+TAA+T,CAChU,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,SAAS,EAAE,EACT,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,iSAAiS,CAClS,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC;gBACf,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { KyberSwap } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { eToNative, getAction, getLabel, getToken } from '../../utils'\n\nconst KyberModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(KyberSwap)\n\n const matcher = {\n [iface.getFunction(\n 'swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution)'\n )?.selector!]: (call: IrCall) => {\n const {\n execution: {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n },\n [iface.getFunction(\n 'swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default KyberModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/KyberSwap/index.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AAGlC,2CAA4C;AAE5C,uCAAsE;AAEtE,MAAM,WAAW,GAAwB,CAAC,KAAgB,EAAE,KAAe,EAAE,EAAE;IAC7E,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,gBAAS,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,+TAA+T,CAChU,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,SAAS,EAAE,EACT,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,gBAAQ,EAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,iSAAiS,CAClS,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,EACJ,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EACtD,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,gBAAQ,EAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;aAC/C,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,kBAAe,WAAW,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { KyberSwap } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { eToNative, getAction, getLabel, getToken } from '../../utils'\n\nconst KyberModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(KyberSwap)\n\n const matcher = {\n [iface.getFunction(\n 'swap(tuple(address callTarget,address approveTarget,bytes targetData,tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes clientData) execution)'\n )?.selector!]: (call: IrCall) => {\n const {\n execution: {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n },\n [iface.getFunction(\n 'swapSimpleMode(address caller, tuple(address srcToken,address dstToken,address[] srcReceivers,uint256[] srcAmounts,address[] feeReceivers,uint256[] feeAmounts,address dstReceiver,uint256 amount,uint256 minReturnAmount,uint256 flags,bytes permit) desc,bytes executorData,bytes clientData)'\n )?.selector!]: (call: IrCall) => {\n const {\n desc: { srcToken, dstToken, amount, minReturnAmount }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(eToNative(srcToken), amount),\n getLabel('for'),\n getToken(eToNative(dstToken), minReturnAmount)\n ]\n }\n }\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default KyberModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.js b/dist/src/libs/humanizer/modules/Legends/index.js index 0bb868337..0f10ea734 100644 --- a/dist/src/libs/humanizer/modules/Legends/index.js +++ b/dist/src/libs/humanizer/modules/Legends/index.js @@ -1,6 +1,8 @@ -import { getAddress, Interface, ZeroAddress } from 'ethers'; -import { Legends } from '../../const/abis/Legends'; -import { getAction, getAddressVisualization, getImage, getLabel } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const Legends_1 = require("../../const/abis/Legends"); +const utils_1 = require("../../utils"); const ONCHAIN_TXNS_LEGENDS_ADDRESS = '0x1415926535897932384626433832795028841971'; const OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [ '0x52d067EBB7b06F31AEB645Bd34f92c3Ac13a29ea', @@ -9,7 +11,7 @@ const OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [ '0xb850AcfBC7720873242D27A38E4AE987f914Ef5B' ]; const legendsModule = (accOp, calls) => { - const iface = new Interface(Legends); + const iface = new ethers_1.Interface(Legends_1.Legends); const characterTypes = [ { type: 'Unknown', @@ -44,48 +46,48 @@ const legendsModule = (accOp, calls) => { [iface.getFunction('mint')?.selector]: (call) => { const [heroType] = iface.parseTransaction(call).args; return [ - getAction('Pick character'), - getImage(characterTypes[heroType]?.image || characterTypes[0].image), - getLabel(characterTypes[heroType]?.type || characterTypes[0].type, true), - getLabel('for Ambire Legends') + (0, utils_1.getAction)('Pick character'), + (0, utils_1.getImage)(characterTypes[heroType]?.image || characterTypes[0].image), + (0, utils_1.getLabel)(characterTypes[heroType]?.type || characterTypes[0].type, true), + (0, utils_1.getLabel)('for Ambire Legends') ]; }, [iface.getFunction('getDailyReward')?.selector]: () => [ - getAction('Unlock the treasure chest') + (0, utils_1.getAction)('Unlock the treasure chest') ], [iface.getFunction('spinWheel')?.selector]: () => { - return [getAction('Unlock the wheel of fortune')]; + return [(0, utils_1.getAction)('Unlock the wheel of fortune')]; }, [iface.getFunction('linkAndAcceptInvite')?.selector]: (call) => { const [inviteeV2Account, inviteeEoaOrV1, inviter] = iface.parseTransaction(call).args; - const acceptInvitationVisualizationPrefix = inviter !== ZeroAddress + const acceptInvitationVisualizationPrefix = inviter !== ethers_1.ZeroAddress ? [ - getAction('Accept invitation'), - getLabel('from'), - getAddressVisualization(inviter), - getLabel('and') + (0, utils_1.getAction)('Accept invitation'), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(inviter), + (0, utils_1.getLabel)('and') ] : []; return [ ...acceptInvitationVisualizationPrefix, - getAction('Link account'), - getAddressVisualization(inviteeEoaOrV1), - getLabel('to'), - getAddressVisualization(inviteeV2Account) + (0, utils_1.getAction)('Link account'), + (0, utils_1.getAddressVisualization)(inviteeEoaOrV1), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(inviteeV2Account) ]; }, [iface.getFunction('invite')?.selector]: (call) => { const [invitee] = iface.parseTransaction(call).args; - return [getAction('Invite'), getAddressVisualization(invitee), getLabel('to Ambire Legends')]; + return [(0, utils_1.getAction)('Invite'), (0, utils_1.getAddressVisualization)(invitee), (0, utils_1.getLabel)('to Ambire Legends')]; } }; const newCalls = calls.map((call) => { - if (![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes(getAddress(call.to)) || + if (![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes((0, ethers_1.getAddress)(call.to)) || !matcher[call.data.slice(0, 10)]) return call; return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }; }); return newCalls; }; -export default legendsModule; +exports.default = legendsModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Legends/index.js.map b/dist/src/libs/humanizer/modules/Legends/index.js.map index d76390d55..25e08f1b4 100644 --- a/dist/src/libs/humanizer/modules/Legends/index.js.map +++ b/dist/src/libs/humanizer/modules/Legends/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Legends/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Legends } from '../../const/abis/Legends'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getImage, getLabel } from '../../utils'\n\nconst ONCHAIN_TXNS_LEGENDS_ADDRESS = '0x1415926535897932384626433832795028841971'\nconst OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [\n '0x52d067EBB7b06F31AEB645Bd34f92c3Ac13a29ea',\n '0xcfbAec203431045E9589F70375AC5F529EE55511',\n '0xF51dF52d0a9BEeB7b6E4B6451e729108a115B863',\n '0xb850AcfBC7720873242D27A38E4AE987f914Ef5B'\n]\n\nconst legendsModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Legends)\n const characterTypes = [\n {\n type: 'Unknown',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/unknown.png'\n },\n {\n type: 'The Degenerate',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/slime-lvl0.png'\n },\n {\n type: 'The Codeweaver',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/sorceress-lvl0.png'\n },\n {\n type: 'The Layerbinder',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/necromancer-lvl0.png'\n },\n {\n type: 'The Custodian',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/penguin-lvl0.png'\n },\n {\n type: 'The Warrior',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/orc-lvl0.png'\n },\n {\n type: 'The Shapeshifter',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/shapeshifter-lvl0.png'\n }\n ]\n const matcher = {\n [iface.getFunction('mint')?.selector!]: (call: IrCall) => {\n const [heroType] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Pick character'),\n getImage(characterTypes[heroType]?.image || characterTypes[0].image),\n getLabel(characterTypes[heroType]?.type || characterTypes[0].type, true),\n getLabel('for Ambire Legends')\n ]\n },\n [iface.getFunction('getDailyReward')?.selector!]: () => [\n getAction('Unlock the treasure chest')\n ],\n [iface.getFunction('spinWheel')?.selector!]: () => {\n return [getAction('Unlock the wheel of fortune')]\n },\n [iface.getFunction('linkAndAcceptInvite')?.selector!]: (call: IrCall) => {\n const [inviteeV2Account, inviteeEoaOrV1, inviter] = iface.parseTransaction(call)!.args\n const acceptInvitationVisualizationPrefix =\n inviter !== ZeroAddress\n ? [\n getAction('Accept invitation'),\n getLabel('from'),\n getAddressVisualization(inviter),\n getLabel('and')\n ]\n : []\n return [\n ...acceptInvitationVisualizationPrefix,\n getAction('Link account'),\n getAddressVisualization(inviteeEoaOrV1),\n getLabel('to'),\n getAddressVisualization(inviteeV2Account)\n ]\n },\n [iface.getFunction('invite')?.selector!]: (call: IrCall) => {\n const [invitee] = iface.parseTransaction(call)!.args\n\n return [getAction('Invite'), getAddressVisualization(invitee), getLabel('to Ambire Legends')]\n }\n }\n const newCalls = calls.map((call) => {\n if (\n ![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes(\n getAddress(call.to)\n ) ||\n !matcher[call.data.slice(0, 10)]\n )\n return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default legendsModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Legends/index.ts"],"names":[],"mappings":";;AAAA,mCAA2D;AAG3D,sDAAkD;AAElD,uCAAoF;AAEpF,MAAM,4BAA4B,GAAG,4CAA4C,CAAA;AACjF,MAAM,qCAAqC,GAAG;IAC5C,4CAA4C;IAC5C,4CAA4C;IAC5C,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA;AAED,MAAM,aAAa,GAAwB,CAAC,KAAgB,EAAE,KAAe,EAAE,EAAE;IAC/E,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,iBAAO,CAAC,CAAA;IACpC,MAAM,cAAc,GAAG;QACrB;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,iEAAiE;SACzE;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,oEAAoE;SAC5E;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,wEAAwE;SAChF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,0EAA0E;SAClF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,sEAAsE;SAC9E;QACD;YACE,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,kEAAkE;SAC1E;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,2EAA2E;SACnF;KACF,CAAA;IACD,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACvD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAErD,OAAO;gBACL,IAAA,iBAAS,EAAC,gBAAgB,CAAC;gBAC3B,IAAA,gBAAQ,EAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACpE,IAAA,gBAAQ,EAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;gBACxE,IAAA,gBAAQ,EAAC,oBAAoB,CAAC;aAC/B,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,QAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YACtD,IAAA,iBAAS,EAAC,2BAA2B,CAAC;SACvC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAS,CAAC,EAAE,GAAG,EAAE;YAChD,OAAO,CAAC,IAAA,iBAAS,EAAC,6BAA6B,CAAC,CAAC,CAAA;QACnD,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACtE,MAAM,CAAC,gBAAgB,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtF,MAAM,mCAAmC,GACvC,OAAO,KAAK,oBAAW;gBACrB,CAAC,CAAC;oBACE,IAAA,iBAAS,EAAC,mBAAmB,CAAC;oBAC9B,IAAA,gBAAQ,EAAC,MAAM,CAAC;oBAChB,IAAA,+BAAuB,EAAC,OAAO,CAAC;oBAChC,IAAA,gBAAQ,EAAC,KAAK,CAAC;iBAChB;gBACH,CAAC,CAAC,EAAE,CAAA;YACR,OAAO;gBACL,GAAG,mCAAmC;gBACtC,IAAA,iBAAS,EAAC,cAAc,CAAC;gBACzB,IAAA,+BAAuB,EAAC,cAAc,CAAC;gBACvC,IAAA,gBAAQ,EAAC,IAAI,CAAC;gBACd,IAAA,+BAAuB,EAAC,gBAAgB,CAAC;aAC1C,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACzD,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAEpD,OAAO,CAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,IAAA,+BAAuB,EAAC,OAAO,CAAC,EAAE,IAAA,gBAAQ,EAAC,mBAAmB,CAAC,CAAC,CAAA;QAC/F,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IACE,CAAC,CAAC,4BAA4B,EAAE,GAAG,qCAAqC,CAAC,CAAC,QAAQ,CAChF,IAAA,mBAAU,EAAC,IAAI,CAAC,EAAE,CAAC,CACpB;YACD,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhC,OAAO,IAAI,CAAA;QACb,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,kBAAe,aAAa,CAAA","sourcesContent":["import { getAddress, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { Legends } from '../../const/abis/Legends'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getImage, getLabel } from '../../utils'\n\nconst ONCHAIN_TXNS_LEGENDS_ADDRESS = '0x1415926535897932384626433832795028841971'\nconst OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES = [\n '0x52d067EBB7b06F31AEB645Bd34f92c3Ac13a29ea',\n '0xcfbAec203431045E9589F70375AC5F529EE55511',\n '0xF51dF52d0a9BEeB7b6E4B6451e729108a115B863',\n '0xb850AcfBC7720873242D27A38E4AE987f914Ef5B'\n]\n\nconst legendsModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(Legends)\n const characterTypes = [\n {\n type: 'Unknown',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/unknown.png'\n },\n {\n type: 'The Degenerate',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/slime-lvl0.png'\n },\n {\n type: 'The Codeweaver',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/sorceress-lvl0.png'\n },\n {\n type: 'The Layerbinder',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/necromancer-lvl0.png'\n },\n {\n type: 'The Custodian',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/penguin-lvl0.png'\n },\n {\n type: 'The Warrior',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/orc-lvl0.png'\n },\n {\n type: 'The Shapeshifter',\n image: 'https://relayer.ambire.com/legends/nft-image/avatar/shapeshifter-lvl0.png'\n }\n ]\n const matcher = {\n [iface.getFunction('mint')?.selector!]: (call: IrCall) => {\n const [heroType] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Pick character'),\n getImage(characterTypes[heroType]?.image || characterTypes[0].image),\n getLabel(characterTypes[heroType]?.type || characterTypes[0].type, true),\n getLabel('for Ambire Legends')\n ]\n },\n [iface.getFunction('getDailyReward')?.selector!]: () => [\n getAction('Unlock the treasure chest')\n ],\n [iface.getFunction('spinWheel')?.selector!]: () => {\n return [getAction('Unlock the wheel of fortune')]\n },\n [iface.getFunction('linkAndAcceptInvite')?.selector!]: (call: IrCall) => {\n const [inviteeV2Account, inviteeEoaOrV1, inviter] = iface.parseTransaction(call)!.args\n const acceptInvitationVisualizationPrefix =\n inviter !== ZeroAddress\n ? [\n getAction('Accept invitation'),\n getLabel('from'),\n getAddressVisualization(inviter),\n getLabel('and')\n ]\n : []\n return [\n ...acceptInvitationVisualizationPrefix,\n getAction('Link account'),\n getAddressVisualization(inviteeEoaOrV1),\n getLabel('to'),\n getAddressVisualization(inviteeV2Account)\n ]\n },\n [iface.getFunction('invite')?.selector!]: (call: IrCall) => {\n const [invitee] = iface.parseTransaction(call)!.args\n\n return [getAction('Invite'), getAddressVisualization(invitee), getLabel('to Ambire Legends')]\n }\n }\n const newCalls = calls.map((call) => {\n if (\n ![ONCHAIN_TXNS_LEGENDS_ADDRESS, ...OLD_AND_CURRENT_LEGENDS_NFT_ADDRESSES].includes(\n getAddress(call.to)\n ) ||\n !matcher[call.data.slice(0, 10)]\n )\n return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default legendsModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.js b/dist/src/libs/humanizer/modules/Lido/index.js index 36aa70021..c17d1c210 100644 --- a/dist/src/libs/humanizer/modules/Lido/index.js +++ b/dist/src/libs/humanizer/modules/Lido/index.js @@ -1,52 +1,56 @@ -import { getAddress, Interface, isAddress, ZeroAddress } from 'ethers'; -import { unstETH, WrappedStETH } from '../../const/abis/Lido'; -import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LidoModule = void 0; +const ethers_1 = require("ethers"); +const Lido_1 = require("../../const/abis/Lido"); +const utils_1 = require("../../utils"); const WRAPPED_ST_ETH_ADDRESS = '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'; const ST_ETH_ADDRESS = '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84'; const UNWRAP_CONTRACT_ADDR = '0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1'; -const wrapIface = new Interface(WrappedStETH); -const unwrapIface = new Interface(unstETH); -export const LidoModule = (accOp, calls) => { +const wrapIface = new ethers_1.Interface(Lido_1.WrappedStETH); +const unwrapIface = new ethers_1.Interface(Lido_1.unstETH); +const LidoModule = (accOp, calls) => { const newCalls = calls.map((call) => { - if (isAddress(call.to) && getAddress(call.to) === WRAPPED_ST_ETH_ADDRESS) { + if ((0, ethers_1.isAddress)(call.to) && (0, ethers_1.getAddress)(call.to) === WRAPPED_ST_ETH_ADDRESS) { if (call.data.startsWith(wrapIface.getFunction('wrap(uint256)').selector)) { const [amount] = wrapIface.parseTransaction(call).args; - const fullVisualization = [getAction('Wrap'), getToken(ST_ETH_ADDRESS, amount)]; + const fullVisualization = [(0, utils_1.getAction)('Wrap'), (0, utils_1.getToken)(ST_ETH_ADDRESS, amount)]; return { ...call, fullVisualization }; } if (call.data.startsWith(wrapIface.getFunction('unwrap(uint256)').selector)) { const [amount] = wrapIface.parseTransaction(call).args; - const fullVisualization = [getAction('Unwrap'), getToken(ST_ETH_ADDRESS, amount)]; + const fullVisualization = [(0, utils_1.getAction)('Unwrap'), (0, utils_1.getToken)(ST_ETH_ADDRESS, amount)]; return { ...call, fullVisualization }; } } - if (isAddress(call.to) && getAddress(call.to) === UNWRAP_CONTRACT_ADDR) { + if ((0, ethers_1.isAddress)(call.to) && (0, ethers_1.getAddress)(call.to) === UNWRAP_CONTRACT_ADDR) { if (call.data.startsWith(unwrapIface.getFunction('requestWithdrawals').selector)) { // eslint-disable-next-line @typescript-eslint/naming-convention const { _amounts, _owner } = unwrapIface.parseTransaction(call).args; const amount = _amounts.reduce((acc, cur) => acc + cur, 0n); - const fullVisualization = [getAction('Request withdraw'), getToken(ST_ETH_ADDRESS, amount)]; - if (![ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase())) - fullVisualization.push(getLabel('and authorize'), getAddressVisualization(_owner)); + const fullVisualization = [(0, utils_1.getAction)('Request withdraw'), (0, utils_1.getToken)(ST_ETH_ADDRESS, amount)]; + if (![ethers_1.ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase())) + fullVisualization.push((0, utils_1.getLabel)('and authorize'), (0, utils_1.getAddressVisualization)(_owner)); return { ...call, fullVisualization }; } if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawals').selector)) { - return { ...call, fullVisualization: [getAction('Claim withdrawals')] }; + return { ...call, fullVisualization: [(0, utils_1.getAction)('Claim withdrawals')] }; } if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawal').selector)) { - return { ...call, fullVisualization: [getAction('Claim withdrawal')] }; + return { ...call, fullVisualization: [(0, utils_1.getAction)('Claim withdrawal')] }; } if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawalsTo').selector)) { // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars const { _requestIds, _hints, _recipient } = unwrapIface.parseTransaction(call).args; - const fullVisualization = [getAction('Claim withdrawal')]; + const fullVisualization = [(0, utils_1.getAction)('Claim withdrawal')]; if (_recipient.toLowerCase() !== accOp.accountAddr.toLowerCase()) - fullVisualization.push(getLabel('and send to'), getAddressVisualization(_recipient)); - return { ...call, fullVisualization: [getAction('Claim withdrawal')] }; + fullVisualization.push((0, utils_1.getLabel)('and send to'), (0, utils_1.getAddressVisualization)(_recipient)); + return { ...call, fullVisualization: [(0, utils_1.getAction)('Claim withdrawal')] }; } } return call; }); return newCalls; }; +exports.LidoModule = LidoModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Lido/index.js.map b/dist/src/libs/humanizer/modules/Lido/index.js.map index 766673c86..c18e59b94 100644 --- a/dist/src/libs/humanizer/modules/Lido/index.js.map +++ b/dist/src/libs/humanizer/modules/Lido/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Lido/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { unstETH, WrappedStETH } from '../../const/abis/Lido'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst WRAPPED_ST_ETH_ADDRESS = '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'\nconst ST_ETH_ADDRESS = '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84'\nconst UNWRAP_CONTRACT_ADDR = '0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1'\nconst wrapIface = new Interface(WrappedStETH)\nconst unwrapIface = new Interface(unstETH)\nexport const LidoModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const newCalls = calls.map((call) => {\n if (isAddress(call.to) && getAddress(call.to) === WRAPPED_ST_ETH_ADDRESS) {\n if (call.data.startsWith(wrapIface.getFunction('wrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Wrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(wrapIface.getFunction('unwrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Unwrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n\n if (isAddress(call.to) && getAddress(call.to) === UNWRAP_CONTRACT_ADDR) {\n if (call.data.startsWith(unwrapIface.getFunction('requestWithdrawals')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _amounts, _owner } = unwrapIface.parseTransaction(call)!.args\n const amount = _amounts.reduce((acc: bigint, cur: bigint) => acc + cur, 0n)\n const fullVisualization = [getAction('Request withdraw'), getToken(ST_ETH_ADDRESS, amount)]\n if (![ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase()))\n fullVisualization.push(getLabel('and authorize'), getAddressVisualization(_owner))\n return { ...call, fullVisualization }\n }\n\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawals')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawals')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawal')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawalsTo')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars\n const { _requestIds, _hints, _recipient } = unwrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim withdrawal')]\n if (_recipient.toLowerCase() !== accOp.accountAddr.toLowerCase())\n fullVisualization.push(getLabel('and send to'), getAddressVisualization(_recipient))\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n }\n return call\n })\n\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Lido/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, isAddress, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { unstETH, WrappedStETH } from '../../const/abis/Lido'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst WRAPPED_ST_ETH_ADDRESS = '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'\nconst ST_ETH_ADDRESS = '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84'\nconst UNWRAP_CONTRACT_ADDR = '0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1'\nconst wrapIface = new Interface(WrappedStETH)\nconst unwrapIface = new Interface(unstETH)\nexport const LidoModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const newCalls = calls.map((call) => {\n if (isAddress(call.to) && getAddress(call.to) === WRAPPED_ST_ETH_ADDRESS) {\n if (call.data.startsWith(wrapIface.getFunction('wrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Wrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(wrapIface.getFunction('unwrap(uint256)')!.selector)) {\n const [amount] = wrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Unwrap'), getToken(ST_ETH_ADDRESS, amount)]\n return { ...call, fullVisualization }\n }\n }\n\n if (isAddress(call.to) && getAddress(call.to) === UNWRAP_CONTRACT_ADDR) {\n if (call.data.startsWith(unwrapIface.getFunction('requestWithdrawals')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { _amounts, _owner } = unwrapIface.parseTransaction(call)!.args\n const amount = _amounts.reduce((acc: bigint, cur: bigint) => acc + cur, 0n)\n const fullVisualization = [getAction('Request withdraw'), getToken(ST_ETH_ADDRESS, amount)]\n if (![ZeroAddress, accOp.accountAddr.toLowerCase()].includes(_owner.toLowerCase()))\n fullVisualization.push(getLabel('and authorize'), getAddressVisualization(_owner))\n return { ...call, fullVisualization }\n }\n\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawals')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawals')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawal')!.selector)) {\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n if (call.data.startsWith(unwrapIface.getFunction('claimWithdrawalsTo')!.selector)) {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars\n const { _requestIds, _hints, _recipient } = unwrapIface.parseTransaction(call)!.args\n const fullVisualization = [getAction('Claim withdrawal')]\n if (_recipient.toLowerCase() !== accOp.accountAddr.toLowerCase())\n fullVisualization.push(getLabel('and send to'), getAddressVisualization(_recipient))\n return { ...call, fullVisualization: [getAction('Claim withdrawal')] }\n }\n }\n return call\n })\n\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.js b/dist/src/libs/humanizer/modules/OpenSea/index.js index 745fcb555..acbbc1a7f 100644 --- a/dist/src/libs/humanizer/modules/OpenSea/index.js +++ b/dist/src/libs/humanizer/modules/OpenSea/index.js @@ -1,7 +1,10 @@ -import { Interface } from 'ethers'; -import { stringify } from '../../../richJson/richJson'; -import { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../../utils'; -const iface = new Interface([ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openSeaModule = void 0; +const ethers_1 = require("ethers"); +const richJson_1 = require("../../../richJson/richJson"); +const utils_1 = require("../../utils"); +const iface = new ethers_1.Interface([ 'function fulfillBasicOrder_efficient_6GL6yc(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)', 'function fulfillBasicOrder(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)', 'function fulfillAvailableAdvancedOrders(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData)[], (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], (uint256 orderIndex, uint256 itemIndex)[][], (uint256 orderIndex, uint256 itemIndex)[][], bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled) payable returns (bool[], ((uint8 itemType, address token, uint256 identifier, uint256 amount, address recipient) item, address offerer, bytes32 conduitKey)[])', @@ -54,7 +57,7 @@ const parseOrder = (order) => { const dedupe1155Orders = (orders) => { if (orders.length <= 30) return orders; - const uniqueOrders = [...new Set(orders.map(stringify))]; + const uniqueOrders = [...new Set(orders.map(richJson_1.stringify))]; if (uniqueOrders.length > 1) return orders; if (orders[0].items.length > 1) @@ -71,18 +74,18 @@ const dedupe1155Orders = (orders) => { }; const humanizerOrder = ({ items, payment, end }) => { return [ - getAction('Buy'), + (0, utils_1.getAction)('Buy'), ...items .map(({ address, id, fromAmount }) => fromAmount === 1n - ? [getToken(address, id)] - : [getLabel(fromAmount.toString(), true), getToken(address, id)]) + ? [(0, utils_1.getToken)(address, id)] + : [(0, utils_1.getLabel)(fromAmount.toString(), true), (0, utils_1.getToken)(address, id)]) .flat(), - getLabel('for up to'), - ...payment.map(({ address, amountOrId }) => getToken(address, amountOrId)), - getDeadline(end) + (0, utils_1.getLabel)('for up to'), + ...payment.map(({ address, amountOrId }) => (0, utils_1.getToken)(address, amountOrId)), + (0, utils_1.getDeadline)(end) ]; }; -export const openSeaModule = (accountOp, irCalls) => { +const openSeaModule = (accountOp, irCalls) => { return irCalls.map((call) => { if ([ iface.getFunction('fulfillBasicOrder_efficient_6GL6yc').selector, @@ -135,11 +138,11 @@ export const openSeaModule = (accountOp, irCalls) => { return { ...call, fullVisualization: [ - getAction('Buy'), - getToken(data[0].offerToken, data[0].offerIdentifier), - getLabel('for'), - getToken(data[0].considerationToken, data[0].considerationAmount), - getDeadline(data[0].endTime) + (0, utils_1.getAction)('Buy'), + (0, utils_1.getToken)(data[0].offerToken, data[0].offerIdentifier), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(data[0].considerationToken, data[0].considerationAmount), + (0, utils_1.getDeadline)(data[0].endTime) ] }; } @@ -157,9 +160,9 @@ export const openSeaModule = (accountOp, irCalls) => { return { ...call, fullVisualization: [ - getAction('Buy NFTs'), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Buy NFTs'), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ] }; const fullVisualization = totalOrders.map(humanizerOrder).flat(); @@ -174,4 +177,5 @@ export const openSeaModule = (accountOp, irCalls) => { return call; }); }; +exports.openSeaModule = openSeaModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/OpenSea/index.js.map b/dist/src/libs/humanizer/modules/OpenSea/index.js.map index ae5a3b9a3..2eea5e828 100644 --- a/dist/src/libs/humanizer/modules/OpenSea/index.js.map +++ b/dist/src/libs/humanizer/modules/OpenSea/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/OpenSea/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { stringify } from '../../../richJson/richJson'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function fulfillBasicOrder_efficient_6GL6yc(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillBasicOrder(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillAvailableAdvancedOrders(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData)[], (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], (uint256 orderIndex, uint256 itemIndex)[][], (uint256 orderIndex, uint256 itemIndex)[][], bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled) payable returns (bool[], ((uint8 itemType, address token, uint256 identifier, uint256 amount, address recipient) item, address offerer, bytes32 conduitKey)[])',\n 'function fulfillAdvancedOrder(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData), (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], bytes32 fulfillerConduitKey, address recipient) payable returns (bool fulfilled)'\n])\n\ninterface Order {\n items: { address: string; id: bigint; fromAmount: bigint; endAmount: bigint }[]\n payment: { address: string; amountOrId: bigint }[]\n end: bigint\n}\nconst parsePrice = (price: bigint, numerator: bigint, denumerator: bigint): bigint =>\n BigInt((price * numerator) / denumerator)\nconst parseOrder = (order: any): Order => {\n const [\n params,\n num,\n denum\n // data2, data3\n ] = order\n const [\n ,\n ,\n // currentOwner\n // zone\n offers,\n consideration,\n ,\n ,\n // orderType\n // startTime\n endTime\n // zoneHash,\n // salt,\n // conduitKey\n // totalOriginalConsiderationItems\n ] = params\n const items = offers.map((o: any): Order['items'][0] => {\n const [\n ,\n // type\n address,\n id,\n fromAmount,\n endAmount\n ] = o\n return {\n address,\n id,\n fromAmount: parsePrice(fromAmount, num, denum),\n endAmount: parsePrice(endAmount, num, denum)\n }\n })\n const payment: Order['payment'][0][] = []\n const tokenPayments: { [addr: string]: bigint } = {}\n consideration.forEach((o: any) => {\n const [\n type,\n token,\n tokenId,\n ,\n // fromAmount\n endAmount\n ] = o\n if (type === 0n || type === 1n)\n tokenPayments[token] = (tokenPayments[token] || 0n) + parsePrice(endAmount, num, denum)\n if (type === 2n || type === 3n)\n payment.push({ address: token as string, amountOrId: BigInt(tokenId) })\n })\n Object.entries(tokenPayments).forEach(([address, amountOrId]) => {\n payment.push({ address, amountOrId })\n })\n return { items, payment, end: BigInt(endTime) }\n}\n\nconst dedupe1155Orders = (orders: Order[]): any[] => {\n if (orders.length <= 30) return orders\n const uniqueOrders = [...new Set(orders.map(stringify))]\n if (uniqueOrders.length > 1) return orders\n if (orders[0].items.length > 1) return orders\n if (orders[0].payment.length > 1) return orders\n // if (uniqueOrders.items.length > 1) return orders\n const correctNumberOfOrders = BigInt(orders.length - 30)\n const finalOrder = orders[0]\n finalOrder.items[0].endAmount *= correctNumberOfOrders\n finalOrder.items[0].fromAmount *= correctNumberOfOrders\n finalOrder.payment[0].amountOrId *= correctNumberOfOrders\n return [finalOrder]\n}\nconst humanizerOrder = ({ items, payment, end }: Order) => {\n return [\n getAction('Buy'),\n ...items\n .map(({ address, id, fromAmount }) =>\n fromAmount === 1n\n ? [getToken(address, id)]\n : [getLabel(fromAmount.toString(), true), getToken(address, id)]\n )\n .flat(),\n getLabel('for up to'),\n ...payment.map(({ address, amountOrId }) => getToken(address, amountOrId)),\n getDeadline(end)\n ]\n}\n\nexport const openSeaModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n return irCalls.map((call: IrCall) => {\n if (\n [\n iface.getFunction('fulfillBasicOrder_efficient_6GL6yc')!.selector,\n iface.getFunction('fulfillBasicOrder')!.selector\n ].includes(call.data.slice(0, 10))\n ) {\n let orders\n if (call.data.slice(0, 10) === iface.getFunction('fulfillBasicOrder')!.selector)\n orders = iface.decodeFunctionData('fulfillBasicOrder', call.data)\n else orders = iface.decodeFunctionData('fulfillBasicOrder_efficient_6GL6yc', call.data)\n\n const data = orders.map((i) => {\n const [\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n ,\n ,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n ,\n ,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n ] = i\n\n return {\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n }\n })\n if (data.length !== 1) return call\n return {\n ...call,\n fullVisualization: [\n getAction('Buy'),\n getToken(data[0].offerToken, data[0].offerIdentifier),\n getLabel('for'),\n getToken(data[0].considerationToken, data[0].considerationAmount),\n getDeadline(data[0].endTime)\n ]\n }\n }\n\n if (call.data.startsWith(iface.getFunction('fulfillAvailableAdvancedOrders')!.selector)) {\n const [orders] = iface.decodeFunctionData('fulfillAvailableAdvancedOrders', call.data)\n\n let totalOrders: Order[] = orders.map((o: any) => parseOrder(o))\n // opensea allows batch buy of 30 items at most\n // if we detect more than 30 orders, that means the dapp attempts to\n // execute n-30 EIP1155 orders that are being deduplicated accordingly on a contract level\n // dedupe1155Orders removes 30 repeating orders and merges the remaining n orders\n if (totalOrders.length > 30) totalOrders = dedupe1155Orders(totalOrders)\n // still not deduped\n if (totalOrders.length > 30)\n return {\n ...call,\n fullVisualization: [\n getAction('Buy NFTs'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n const fullVisualization = totalOrders.map(humanizerOrder).flat()\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(iface.getFunction('fulfillAdvancedOrder')!.selector)) {\n const [order] = iface.decodeFunctionData('fulfillAdvancedOrder', call.data)\n const parsedOrder: Order = parseOrder(order)\n const fullVisualization = humanizerOrder(parsedOrder)\n return { ...call, fullVisualization }\n }\n\n return call\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/OpenSea/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { stringify } from '../../../richJson/richJson'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getDeadline, getLabel, getToken } from '../../utils'\n\nconst iface = new Interface([\n 'function fulfillBasicOrder_efficient_6GL6yc(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillBasicOrder(tuple(address considerationToken, uint256 considerationIdentifier, uint256 considerationAmount, address offerer, address zone, address offerToken, uint256 offerIdentifier, uint256 offerAmount, uint8 basicOrderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 offererConduitKey, bytes32 fulfillerConduitKey, uint256 totalOriginalAdditionalRecipients, tuple(uint256 amount, address recipient)[] additionalRecipients, bytes signature) args) payable returns (bool fulfilled)',\n 'function fulfillAvailableAdvancedOrders(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData)[], (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], (uint256 orderIndex, uint256 itemIndex)[][], (uint256 orderIndex, uint256 itemIndex)[][], bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled) payable returns (bool[], ((uint8 itemType, address token, uint256 identifier, uint256 amount, address recipient) item, address offerer, bytes32 conduitKey)[])',\n 'function fulfillAdvancedOrder(((address offerer, address zone, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount)[] offer, (uint8 itemType, address token, uint256 identifierOrCriteria, uint256 startAmount, uint256 endAmount, address recipient)[] consideration, uint8 orderType, uint256 startTime, uint256 endTime, bytes32 zoneHash, uint256 salt, bytes32 conduitKey, uint256 totalOriginalConsiderationItems) parameters, uint120 numerator, uint120 denominator, bytes signature, bytes extraData), (uint256 orderIndex, uint8 side, uint256 index, uint256 identifier, bytes32[] criteriaProof)[], bytes32 fulfillerConduitKey, address recipient) payable returns (bool fulfilled)'\n])\n\ninterface Order {\n items: { address: string; id: bigint; fromAmount: bigint; endAmount: bigint }[]\n payment: { address: string; amountOrId: bigint }[]\n end: bigint\n}\nconst parsePrice = (price: bigint, numerator: bigint, denumerator: bigint): bigint =>\n BigInt((price * numerator) / denumerator)\nconst parseOrder = (order: any): Order => {\n const [\n params,\n num,\n denum\n // data2, data3\n ] = order\n const [\n ,\n ,\n // currentOwner\n // zone\n offers,\n consideration,\n ,\n ,\n // orderType\n // startTime\n endTime\n // zoneHash,\n // salt,\n // conduitKey\n // totalOriginalConsiderationItems\n ] = params\n const items = offers.map((o: any): Order['items'][0] => {\n const [\n ,\n // type\n address,\n id,\n fromAmount,\n endAmount\n ] = o\n return {\n address,\n id,\n fromAmount: parsePrice(fromAmount, num, denum),\n endAmount: parsePrice(endAmount, num, denum)\n }\n })\n const payment: Order['payment'][0][] = []\n const tokenPayments: { [addr: string]: bigint } = {}\n consideration.forEach((o: any) => {\n const [\n type,\n token,\n tokenId,\n ,\n // fromAmount\n endAmount\n ] = o\n if (type === 0n || type === 1n)\n tokenPayments[token] = (tokenPayments[token] || 0n) + parsePrice(endAmount, num, denum)\n if (type === 2n || type === 3n)\n payment.push({ address: token as string, amountOrId: BigInt(tokenId) })\n })\n Object.entries(tokenPayments).forEach(([address, amountOrId]) => {\n payment.push({ address, amountOrId })\n })\n return { items, payment, end: BigInt(endTime) }\n}\n\nconst dedupe1155Orders = (orders: Order[]): any[] => {\n if (orders.length <= 30) return orders\n const uniqueOrders = [...new Set(orders.map(stringify))]\n if (uniqueOrders.length > 1) return orders\n if (orders[0].items.length > 1) return orders\n if (orders[0].payment.length > 1) return orders\n // if (uniqueOrders.items.length > 1) return orders\n const correctNumberOfOrders = BigInt(orders.length - 30)\n const finalOrder = orders[0]\n finalOrder.items[0].endAmount *= correctNumberOfOrders\n finalOrder.items[0].fromAmount *= correctNumberOfOrders\n finalOrder.payment[0].amountOrId *= correctNumberOfOrders\n return [finalOrder]\n}\nconst humanizerOrder = ({ items, payment, end }: Order) => {\n return [\n getAction('Buy'),\n ...items\n .map(({ address, id, fromAmount }) =>\n fromAmount === 1n\n ? [getToken(address, id)]\n : [getLabel(fromAmount.toString(), true), getToken(address, id)]\n )\n .flat(),\n getLabel('for up to'),\n ...payment.map(({ address, amountOrId }) => getToken(address, amountOrId)),\n getDeadline(end)\n ]\n}\n\nexport const openSeaModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n return irCalls.map((call: IrCall) => {\n if (\n [\n iface.getFunction('fulfillBasicOrder_efficient_6GL6yc')!.selector,\n iface.getFunction('fulfillBasicOrder')!.selector\n ].includes(call.data.slice(0, 10))\n ) {\n let orders\n if (call.data.slice(0, 10) === iface.getFunction('fulfillBasicOrder')!.selector)\n orders = iface.decodeFunctionData('fulfillBasicOrder', call.data)\n else orders = iface.decodeFunctionData('fulfillBasicOrder_efficient_6GL6yc', call.data)\n\n const data = orders.map((i) => {\n const [\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n ,\n ,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n ,\n ,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n ] = i\n\n return {\n considerationToken,\n considerationIdentifier,\n considerationAmount,\n // offerer,\n // zone,\n offerToken,\n offerIdentifier,\n // offerAmount,\n // basicOrderType,\n startTime,\n endTime\n // zoneHash,\n // salt,\n // offererConduitKey,\n // fulfillerConduitKey,\n // totalOriginalAdditionalRecipients,\n // additionalRecipients,\n // signature\n }\n })\n if (data.length !== 1) return call\n return {\n ...call,\n fullVisualization: [\n getAction('Buy'),\n getToken(data[0].offerToken, data[0].offerIdentifier),\n getLabel('for'),\n getToken(data[0].considerationToken, data[0].considerationAmount),\n getDeadline(data[0].endTime)\n ]\n }\n }\n\n if (call.data.startsWith(iface.getFunction('fulfillAvailableAdvancedOrders')!.selector)) {\n const [orders] = iface.decodeFunctionData('fulfillAvailableAdvancedOrders', call.data)\n\n let totalOrders: Order[] = orders.map((o: any) => parseOrder(o))\n // opensea allows batch buy of 30 items at most\n // if we detect more than 30 orders, that means the dapp attempts to\n // execute n-30 EIP1155 orders that are being deduplicated accordingly on a contract level\n // dedupe1155Orders removes 30 repeating orders and merges the remaining n orders\n if (totalOrders.length > 30) totalOrders = dedupe1155Orders(totalOrders)\n // still not deduped\n if (totalOrders.length > 30)\n return {\n ...call,\n fullVisualization: [\n getAction('Buy NFTs'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n }\n const fullVisualization = totalOrders.map(humanizerOrder).flat()\n return { ...call, fullVisualization }\n }\n if (call.data.startsWith(iface.getFunction('fulfillAdvancedOrder')!.selector)) {\n const [order] = iface.decodeFunctionData('fulfillAdvancedOrder', call.data)\n const parsedOrder: Order = parseOrder(order)\n const fullVisualization = humanizerOrder(parsedOrder)\n return { ...call, fullVisualization }\n }\n\n return call\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.js b/dist/src/libs/humanizer/modules/PostProcessing/index.js index c8bd11dc2..3f0b4f00e 100644 --- a/dist/src/libs/humanizer/modules/PostProcessing/index.js +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.js @@ -1,3 +1,5 @@ -import { postProcessing } from './postProcessModule'; -export default postProcessing; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const postProcessModule_1 = require("./postProcessModule"); +exports.default = postProcessModule_1.postProcessing; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/index.js.map b/dist/src/libs/humanizer/modules/PostProcessing/index.js.map index 45d7621aa..7617e9362 100644 --- a/dist/src/libs/humanizer/modules/PostProcessing/index.js.map +++ b/dist/src/libs/humanizer/modules/PostProcessing/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,eAAe,cAAc,CAAA","sourcesContent":["import { postProcessing } from './postProcessModule'\n\nexport default postProcessing\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/index.ts"],"names":[],"mappings":";;AAAA,2DAAoD;AAEpD,kBAAe,kCAAc,CAAA","sourcesContent":["import { postProcessing } from './postProcessModule'\n\nexport default postProcessing\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js index e0187b570..89cf77013 100644 --- a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js @@ -1,17 +1,21 @@ -import { ZeroAddress } from 'ethers'; -import { getToken } from '../../utils'; -export const postProcessing = (_, currentIrCalls) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.postProcessing = void 0; +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); +const postProcessing = (_, currentIrCalls) => { const newCalls = currentIrCalls.map((_call) => { const fullVisualization = (_call?.fullVisualization || []).map((i) => { if (i.type === 'token' && i.address.toLowerCase() === '0x'.padEnd(42, 'e')) - return { ...i, address: ZeroAddress }; + return { ...i, address: ethers_1.ZeroAddress }; return i; }); return { ..._call, - fullVisualization: [...fullVisualization, getToken(_call.to, 0n, true)] + fullVisualization: [...fullVisualization, (0, utils_1.getToken)(_call.to, 0n, true)] }; }); return newCalls; }; +exports.postProcessing = postProcessing; //# sourceMappingURL=postProcessModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map index dabf46127..237dd5284 100644 --- a/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map +++ b/dist/src/libs/humanizer/modules/PostProcessing/postProcessModule.js.map @@ -1 +1 @@ -{"version":3,"file":"postProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/postProcessModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAwB,CAAC,CAAY,EAAE,cAAwB,EAAE,EAAE;IAC5F,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;gBACxE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;YACvC,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,OAAO;YACL,GAAG,KAAK;YACR,iBAAiB,EAAE,CAAC,GAAG,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;SACxE,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getToken } from '../../utils'\n\nexport const postProcessing: HumanizerCallModule = (_: AccountOp, currentIrCalls: IrCall[]) => {\n const newCalls = currentIrCalls.map((_call) => {\n const fullVisualization = (_call?.fullVisualization || []).map((i) => {\n if (i.type === 'token' && i.address.toLowerCase() === '0x'.padEnd(42, 'e'))\n return { ...i, address: ZeroAddress }\n return i\n })\n return {\n ..._call,\n fullVisualization: [...fullVisualization, getToken(_call.to, 0n, true)]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"postProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PostProcessing/postProcessModule.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAIpC,uCAAsC;AAE/B,MAAM,cAAc,GAAwB,CAAC,CAAY,EAAE,cAAwB,EAAE,EAAE;IAC5F,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;gBACxE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,oBAAW,EAAE,CAAA;YACvC,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,OAAO;YACL,GAAG,KAAK;YACR,iBAAiB,EAAE,CAAC,GAAG,iBAAiB,EAAE,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;SACxE,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAbY,QAAA,cAAc,kBAa1B","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getToken } from '../../utils'\n\nexport const postProcessing: HumanizerCallModule = (_: AccountOp, currentIrCalls: IrCall[]) => {\n const newCalls = currentIrCalls.map((_call) => {\n const fullVisualization = (_call?.fullVisualization || []).map((i) => {\n if (i.type === 'token' && i.address.toLowerCase() === '0x'.padEnd(42, 'e'))\n return { ...i, address: ZeroAddress }\n return i\n })\n return {\n ..._call,\n fullVisualization: [...fullVisualization, getToken(_call.to, 0n, true)]\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.js b/dist/src/libs/humanizer/modules/PreProcess/index.js index 50d563a3b..2920ca591 100644 --- a/dist/src/libs/humanizer/modules/PreProcess/index.js +++ b/dist/src/libs/humanizer/modules/PreProcess/index.js @@ -1,3 +1,5 @@ -import { preProcessHumanizer } from './preProcessModule'; -export default preProcessHumanizer; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const preProcessModule_1 = require("./preProcessModule"); +exports.default = preProcessModule_1.preProcessHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/index.js.map b/dist/src/libs/humanizer/modules/PreProcess/index.js.map index dc69de1d6..97c32750c 100644 --- a/dist/src/libs/humanizer/modules/PreProcess/index.js.map +++ b/dist/src/libs/humanizer/modules/PreProcess/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,eAAe,mBAAmB,CAAA","sourcesContent":["import { preProcessHumanizer } from './preProcessModule'\n\nexport default preProcessHumanizer\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/index.ts"],"names":[],"mappings":";;AAAA,yDAAwD;AAExD,kBAAe,sCAAmB,CAAA","sourcesContent":["import { preProcessHumanizer } from './preProcessModule'\n\nexport default preProcessHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js index 48e35be6d..9fbeca7d5 100644 --- a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js @@ -1,4 +1,7 @@ -export const preProcessHumanizer = (_, currentIrCalls) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.preProcessHumanizer = void 0; +const preProcessHumanizer = (_, currentIrCalls) => { const newCalls = currentIrCalls.map((_call) => { const call = { ..._call }; if (!call.data) { @@ -8,4 +11,5 @@ export const preProcessHumanizer = (_, currentIrCalls) => { }); return newCalls; }; +exports.preProcessHumanizer = preProcessHumanizer; //# sourceMappingURL=preProcessModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map index b3796fc12..1fbb0ad7d 100644 --- a/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map +++ b/dist/src/libs/humanizer/modules/PreProcess/preProcessModule.js.map @@ -1 +1 @@ -{"version":3,"file":"preProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/preProcessModule.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAwB,CACtD,CAAY,EACZ,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;SACjB;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\n\nexport const preProcessHumanizer: HumanizerCallModule = (\n _: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((_call) => {\n const call = { ..._call }\n if (!call.data) {\n call.data = '0x'\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"preProcessModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/PreProcess/preProcessModule.ts"],"names":[],"mappings":";;;AAGO,MAAM,mBAAmB,GAAwB,CACtD,CAAY,EACZ,cAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;SACjB;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAZY,QAAA,mBAAmB,uBAY/B","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\n\nexport const preProcessHumanizer: HumanizerCallModule = (\n _: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const newCalls = currentIrCalls.map((_call) => {\n const call = { ..._call }\n if (!call.data) {\n call.data = '0x'\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.js b/dist/src/libs/humanizer/modules/Privileges/index.js index 5c074f5e8..3dc40354f 100644 --- a/dist/src/libs/humanizer/modules/Privileges/index.js +++ b/dist/src/libs/humanizer/modules/Privileges/index.js @@ -1,3 +1,5 @@ -import { privilegeHumanizer } from './privileges'; -export default privilegeHumanizer; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const privileges_1 = require("./privileges"); +exports.default = privileges_1.privilegeHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/index.js.map b/dist/src/libs/humanizer/modules/Privileges/index.js.map index 1c69948e9..35626863c 100644 --- a/dist/src/libs/humanizer/modules/Privileges/index.js.map +++ b/dist/src/libs/humanizer/modules/Privileges/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,eAAe,kBAAkB,CAAA","sourcesContent":["import { privilegeHumanizer } from './privileges'\n\nexport default privilegeHumanizer\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/index.ts"],"names":[],"mappings":";;AAAA,6CAAiD;AAEjD,kBAAe,+BAAkB,CAAA","sourcesContent":["import { privilegeHumanizer } from './privileges'\n\nexport default privilegeHumanizer\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.js b/dist/src/libs/humanizer/modules/Privileges/privileges.js index 352738917..7bf079462 100644 --- a/dist/src/libs/humanizer/modules/Privileges/privileges.js +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.js @@ -1,25 +1,29 @@ -import { Interface, ZeroHash } from 'ethers'; -import AmbireAccount from '../../../../../contracts/compiled/AmbireAccount.json'; -import { ENTRY_POINT_MARKER } from '../../../../consts/deploy'; -import { getAction, getAddressVisualization, getKnownName, getLabel } from '../../utils'; -const iface = new Interface(AmbireAccount.abi); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.privilegeHumanizer = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../../../contracts/compiled/AmbireAccount.json")); +const deploy_1 = require("../../../../consts/deploy"); +const utils_1 = require("../../utils"); +const iface = new ethers_1.Interface(AmbireAccount_json_1.default.abi); const parsePrivilegeCall = (humanizerMeta, call) => { const { addr, priv } = iface.parseTransaction(call).args; - if (getKnownName(humanizerMeta, addr)?.includes('entry point') && priv === ENTRY_POINT_MARKER) - return [getAction('Enable'), getAddressVisualization(addr)]; - if (priv === ZeroHash) - return [getAction('Revoke access'), getLabel('of'), getAddressVisualization(addr)]; + if ((0, utils_1.getKnownName)(humanizerMeta, addr)?.includes('entry point') && priv === deploy_1.ENTRY_POINT_MARKER) + return [(0, utils_1.getAction)('Enable'), (0, utils_1.getAddressVisualization)(addr)]; + if (priv === ethers_1.ZeroHash) + return [(0, utils_1.getAction)('Revoke access'), (0, utils_1.getLabel)('of'), (0, utils_1.getAddressVisualization)(addr)]; return [ - getAction('Update access status'), - getLabel('of'), - getAddressVisualization(addr), - getLabel('to'), + (0, utils_1.getAction)('Update access status'), + (0, utils_1.getLabel)('of'), + (0, utils_1.getAddressVisualization)(addr), + (0, utils_1.getLabel)('to'), priv === '0x0000000000000000000000000000000000000000000000000000000000000001' - ? getLabel('regular access') - : getLabel(priv) + ? (0, utils_1.getLabel)('regular access') + : (0, utils_1.getLabel)(priv) ]; }; -export const privilegeHumanizer = (accountOp, irCalls, humanizerMeta) => { +const privilegeHumanizer = (accountOp, irCalls, humanizerMeta) => { const newCalls = irCalls.map((call) => { if (call.data.slice(0, 10) === iface.getFunction('setAddrPrivilege')?.selector) { return { @@ -31,4 +35,5 @@ export const privilegeHumanizer = (accountOp, irCalls, humanizerMeta) => { }); return newCalls; }; +exports.privilegeHumanizer = privilegeHumanizer; //# sourceMappingURL=privileges.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Privileges/privileges.js.map b/dist/src/libs/humanizer/modules/Privileges/privileges.js.map index 54beba14a..35eabbd52 100644 --- a/dist/src/libs/humanizer/modules/Privileges/privileges.js.map +++ b/dist/src/libs/humanizer/modules/Privileges/privileges.js.map @@ -1 +1 @@ -{"version":3,"file":"privileges.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/privileges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,aAAa,MAAM,sDAAsD,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAQ9D,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,kBAAkB,GAAG,CACzB,aAA4B,EAC5B,IAAY,EACc,EAAE;IAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;IACzD,IAAI,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,kBAAkB;QAC3F,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7D,IAAI,IAAI,KAAK,QAAQ;QACnB,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IACpF,OAAO;QACL,SAAS,CAAC,sBAAsB,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC;QACd,uBAAuB,CAAC,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;QACd,IAAI,KAAK,oEAAoE;YAC3E,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;KACnB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAwB,CACrD,SAAoB,EACpB,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE;YAC9E,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC;aAC3D,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroHash } from 'ethers'\n\nimport AmbireAccount from '../../../../../contracts/compiled/AmbireAccount.json'\nimport { ENTRY_POINT_MARKER } from '../../../../consts/deploy'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport { getAction, getAddressVisualization, getKnownName, getLabel } from '../../utils'\n\nconst iface = new Interface(AmbireAccount.abi)\n\nconst parsePrivilegeCall = (\n humanizerMeta: HumanizerMeta,\n call: IrCall\n): HumanizerVisualization[] => {\n const { addr, priv } = iface.parseTransaction(call)!.args\n if (getKnownName(humanizerMeta, addr)?.includes('entry point') && priv === ENTRY_POINT_MARKER)\n return [getAction('Enable'), getAddressVisualization(addr)]\n if (priv === ZeroHash)\n return [getAction('Revoke access'), getLabel('of'), getAddressVisualization(addr)]\n return [\n getAction('Update access status'),\n getLabel('of'),\n getAddressVisualization(addr),\n getLabel('to'),\n priv === '0x0000000000000000000000000000000000000000000000000000000000000001'\n ? getLabel('regular access')\n : getLabel(priv)\n ]\n}\n\nexport const privilegeHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((call) => {\n if (call.data.slice(0, 10) === iface.getFunction('setAddrPrivilege')?.selector) {\n return {\n ...call,\n fullVisualization: parsePrivilegeCall(humanizerMeta, call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"privileges.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Privileges/privileges.ts"],"names":[],"mappings":";;;;AAAA,mCAA4C;AAE5C,sHAAgF;AAChF,sDAA8D;AAQ9D,uCAAwF;AAExF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,kBAAkB,GAAG,CACzB,aAA4B,EAC5B,IAAY,EACc,EAAE;IAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;IACzD,IAAI,IAAA,oBAAY,EAAC,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,2BAAkB;QAC3F,OAAO,CAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC,CAAA;IAC7D,IAAI,IAAI,KAAK,iBAAQ;QACnB,OAAO,CAAC,IAAA,iBAAS,EAAC,eAAe,CAAC,EAAE,IAAA,gBAAQ,EAAC,IAAI,CAAC,EAAE,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC,CAAA;IACpF,OAAO;QACL,IAAA,iBAAS,EAAC,sBAAsB,CAAC;QACjC,IAAA,gBAAQ,EAAC,IAAI,CAAC;QACd,IAAA,+BAAuB,EAAC,IAAI,CAAC;QAC7B,IAAA,gBAAQ,EAAC,IAAI,CAAC;QACd,IAAI,KAAK,oEAAoE;YAC3E,CAAC,CAAC,IAAA,gBAAQ,EAAC,gBAAgB,CAAC;YAC5B,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC;KACnB,CAAA;AACH,CAAC,CAAA;AAEM,MAAM,kBAAkB,GAAwB,CACrD,SAAoB,EACpB,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE;YAC9E,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC;aAC3D,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAfY,QAAA,kBAAkB,sBAe9B","sourcesContent":["import { Interface, ZeroHash } from 'ethers'\n\nimport AmbireAccount from '../../../../../contracts/compiled/AmbireAccount.json'\nimport { ENTRY_POINT_MARKER } from '../../../../consts/deploy'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport {\n HumanizerCallModule,\n HumanizerMeta,\n HumanizerVisualization,\n IrCall\n} from '../../interfaces'\nimport { getAction, getAddressVisualization, getKnownName, getLabel } from '../../utils'\n\nconst iface = new Interface(AmbireAccount.abi)\n\nconst parsePrivilegeCall = (\n humanizerMeta: HumanizerMeta,\n call: IrCall\n): HumanizerVisualization[] => {\n const { addr, priv } = iface.parseTransaction(call)!.args\n if (getKnownName(humanizerMeta, addr)?.includes('entry point') && priv === ENTRY_POINT_MARKER)\n return [getAction('Enable'), getAddressVisualization(addr)]\n if (priv === ZeroHash)\n return [getAction('Revoke access'), getLabel('of'), getAddressVisualization(addr)]\n return [\n getAction('Update access status'),\n getLabel('of'),\n getAddressVisualization(addr),\n getLabel('to'),\n priv === '0x0000000000000000000000000000000000000000000000000000000000000001'\n ? getLabel('regular access')\n : getLabel(priv)\n ]\n}\n\nexport const privilegeHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const newCalls = irCalls.map((call) => {\n if (call.data.slice(0, 10) === iface.getFunction('setAddrPrivilege')?.selector) {\n return {\n ...call,\n fullVisualization: parsePrivilegeCall(humanizerMeta, call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.js b/dist/src/libs/humanizer/modules/SingletonFactory/index.js index f732f387a..6e6983be3 100644 --- a/dist/src/libs/humanizer/modules/SingletonFactory/index.js +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.js @@ -1,3 +1,5 @@ -import { singletonFactory } from './singletonFactory'; -export default singletonFactory; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const singletonFactory_1 = require("./singletonFactory"); +exports.default = singletonFactory_1.singletonFactory; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map b/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map index 839287183..c64db4781 100644 --- a/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map +++ b/dist/src/libs/humanizer/modules/SingletonFactory/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAe,gBAAgB,CAAA","sourcesContent":["import { singletonFactory } from './singletonFactory'\n\nexport default singletonFactory\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/index.ts"],"names":[],"mappings":";;AAAA,yDAAqD;AAErD,kBAAe,mCAAgB,CAAA","sourcesContent":["import { singletonFactory } from './singletonFactory'\n\nexport default singletonFactory\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js index 69c602b68..3b10fd800 100644 --- a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js @@ -1,18 +1,21 @@ -import { getAddress, Interface } from 'ethers'; -import { getAction, getAddressVisualization, getLabel } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.singletonFactory = void 0; +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); const CONTRACT_FACTORY_ADDRESS = '0xce0042B868300000d44A59004Da54A005ffdcf9f'; -export const singletonFactory = (_, irCalls) => { - const iface = new Interface(['function deploy(bytes,bytes32)']); +const singletonFactory = (_, irCalls) => { + const iface = new ethers_1.Interface(['function deploy(bytes,bytes32)']); const newCalls = irCalls.map((call) => { // @TODO fix those upper/lowercase - if (getAddress(call.to) === CONTRACT_FACTORY_ADDRESS && + if ((0, ethers_1.getAddress)(call.to) === CONTRACT_FACTORY_ADDRESS && call.data.slice(0, 10) === iface.getFunction('deploy').selector) { return { ...call, fullVisualization: [ - getAction('Deploy a contract'), - getLabel('via'), - getAddressVisualization(CONTRACT_FACTORY_ADDRESS) + (0, utils_1.getAction)('Deploy a contract'), + (0, utils_1.getLabel)('via'), + (0, utils_1.getAddressVisualization)(CONTRACT_FACTORY_ADDRESS) ] }; } @@ -20,4 +23,5 @@ export const singletonFactory = (_, irCalls) => { }); return newCalls; }; +exports.singletonFactory = singletonFactory; //# sourceMappingURL=singletonFactory.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map index f454ca387..a8ae3e02b 100644 --- a/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map +++ b/dist/src/libs/humanizer/modules/SingletonFactory/singletonFactory.js.map @@ -1 +1 @@ -{"version":3,"file":"singletonFactory.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/singletonFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAI9C,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE1E,MAAM,wBAAwB,GAAG,4CAA4C,CAAA;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IACE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,wBAAwB;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAE,CAAC,QAAQ,EAChE;YACA,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,SAAS,CAAC,mBAAmB,CAAC;oBAC9B,QAAQ,CAAC,KAAK,CAAC;oBACf,uBAAuB,CAAC,wBAAwB,CAAC;iBAClD;aACF,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { getAddress, Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst CONTRACT_FACTORY_ADDRESS = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const singletonFactory: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const iface = new Interface(['function deploy(bytes,bytes32)'])\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (\n getAddress(call.to) === CONTRACT_FACTORY_ADDRESS &&\n call.data.slice(0, 10) === iface.getFunction('deploy')!.selector\n ) {\n return {\n ...call,\n fullVisualization: [\n getAction('Deploy a contract'),\n getLabel('via'),\n getAddressVisualization(CONTRACT_FACTORY_ADDRESS)\n ]\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"singletonFactory.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/SingletonFactory/singletonFactory.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAI9C,uCAA0E;AAE1E,MAAM,wBAAwB,GAAG,4CAA4C,CAAA;AACtE,MAAM,gBAAgB,GAAwB,CAAC,CAAY,EAAE,OAAiB,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,kCAAkC;QAClC,IACE,IAAA,mBAAU,EAAC,IAAI,CAAC,EAAE,CAAC,KAAK,wBAAwB;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAE,CAAC,QAAQ,EAChE;YACA,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,IAAA,iBAAS,EAAC,mBAAmB,CAAC;oBAC9B,IAAA,gBAAQ,EAAC,KAAK,CAAC;oBACf,IAAA,+BAAuB,EAAC,wBAAwB,CAAC;iBAClD;aACF,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AApBY,QAAA,gBAAgB,oBAoB5B","sourcesContent":["import { getAddress, Interface } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\nconst CONTRACT_FACTORY_ADDRESS = '0xce0042B868300000d44A59004Da54A005ffdcf9f'\nexport const singletonFactory: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const iface = new Interface(['function deploy(bytes,bytes32)'])\n const newCalls = irCalls.map((call) => {\n // @TODO fix those upper/lowercase\n if (\n getAddress(call.to) === CONTRACT_FACTORY_ADDRESS &&\n call.data.slice(0, 10) === iface.getFunction('deploy')!.selector\n ) {\n return {\n ...call,\n fullVisualization: [\n getAction('Deploy a contract'),\n getLabel('via'),\n getAddressVisualization(CONTRACT_FACTORY_ADDRESS)\n ]\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.js b/dist/src/libs/humanizer/modules/Socket/index.js index 05123f459..492af4efa 100644 --- a/dist/src/libs/humanizer/modules/Socket/index.js +++ b/dist/src/libs/humanizer/modules/Socket/index.js @@ -1,3 +1,6 @@ -import { SocketModule } from './socketModules'; -export { SocketModule }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SocketModule = void 0; +const socketModules_1 = require("./socketModules"); +Object.defineProperty(exports, "SocketModule", { enumerable: true, get: function () { return socketModules_1.SocketModule; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/index.js.map b/dist/src/libs/humanizer/modules/Socket/index.js.map index 2e625d44a..fbc342d66 100644 --- a/dist/src/libs/humanizer/modules/Socket/index.js.map +++ b/dist/src/libs/humanizer/modules/Socket/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,CAAA","sourcesContent":["import { SocketModule } from './socketModules'\n\nexport { SocketModule }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8C;AAErC,6FAFA,4BAAY,OAEA","sourcesContent":["import { SocketModule } from './socketModules'\n\nexport { SocketModule }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.js b/dist/src/libs/humanizer/modules/Socket/socketModules.js index 707735ec0..508bd99cd 100644 --- a/dist/src/libs/humanizer/modules/Socket/socketModules.js +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.js @@ -1,7 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SocketModule = void 0; /* eslint-disable @typescript-eslint/no-unused-vars */ -import { AbiCoder, Interface, ZeroAddress } from 'ethers'; -import { SocketViaAcross } from '../../const/abis'; -import { eToNative, getAction, getAddressVisualization, getChain, getDeadline, getLabel, getRecipientText, getToken, getTokenWithChain } from '../../utils'; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); // taken from https://stargateprotocol.gitbook.io/stargate/developers/chain-ids const STARGATE_CHAIN_IDS = { '101': 1n, @@ -20,16 +23,16 @@ const STARGATE_CHAIN_IDS = { // @TODO check all additional data provided // @TODO consider fees everywhere // @TODO add automated tests -export const SocketModule = (accountOp, irCalls) => { - const preControllerIface = new Interface([ +const SocketModule = (accountOp, irCalls) => { + const preControllerIface = new ethers_1.Interface([ 'function executeController((uint32 controllerId, bytes data) socketControllerRequest)', 'function takeFeesAndSwap((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes swapRequestData) ftsRequest) payable returns (bytes)', 'function takeFeesAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes bridgeRequestData) ftbRequest) payable returns (bytes)', // @TODO 'function takeFeeAndSwapAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 swapRouteId, bytes swapData, uint32 bridgeRouteId, bytes bridgeData) fsbRequest)' ]); - const iface = new Interface([ - ...SocketViaAcross, + const iface = new ethers_1.Interface([ + ...abis_1.SocketViaAcross, // @TODO move to more appropriate place all funcs 'function performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData) payable returns (uint256)', 'function performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)', @@ -60,25 +63,25 @@ export const SocketModule = (accountOp, irCalls) => { data: swapData }).args; return [ - getAction('Bridge'), - getToken(eToNative(fromToken), amount), - getLabel('to'), - getTokenWithChain(eToNative(toToken), outputAmount), - getLabel('on'), - getChain(dstChain), - getDeadline(quoteAndDeadlineTimeStamps[1]), - ...getRecipientText(senderAddress, recipientAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(fromToken), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(toToken), outputAmount), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(dstChain), + (0, utils_1.getDeadline)(quoteAndDeadlineTimeStamps[1]), + ...(0, utils_1.getRecipientText)(senderAddress, recipientAddress) ]; } return [ - getAction('Bridge'), - getLabel('undetected token'), - getLabel('to'), - getTokenWithChain(eToNative(outputToken), outputAmount, dstChain), - getLabel('on'), - getChain(dstChain), - getDeadline(quoteAndDeadlineTimeStamps[1]), - ...getRecipientText(senderAddress, recipientAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getLabel)('undetected token'), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(outputToken), outputAmount, dstChain), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(dstChain), + (0, utils_1.getDeadline)(quoteAndDeadlineTimeStamps[1]), + ...(0, utils_1.getRecipientText)(senderAddress, recipientAddress) ]; }, [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable')?.selector}`]: (call) => { @@ -88,21 +91,21 @@ export const SocketModule = (accountOp, irCalls) => { data: swapData }).args; return [ - getAction('Bridge'), - getToken(eToNative(fromToken), amount), - getLabel('to'), - getTokenWithChain(eToNative(toToken), 0n), - getLabel('on'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(fromToken), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(toToken), 0n), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; } return [ - getAction('Bridge'), - getLabel('via'), - getAddressVisualization(call.to), - getLabel('to'), - getChain(toChainId) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getLabel)('via'), + (0, utils_1.getAddressVisualization)(call.to), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId) ]; }, [`${iface.getFunction('swapAndBridge(uint32,address,uint256,bytes32,bytes)')?.selector}`]: (call) => { @@ -118,24 +121,24 @@ export const SocketModule = (accountOp, irCalls) => { data: swapExtraData }).args; return [ - getAction('Bridge'), - getToken(fromToken, amount), - getLabel('to'), - getToken(toToken, minOutputTokenAmount, false, chainId), - getLabel('on'), - getChain(chainId) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(fromToken, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(toToken, minOutputTokenAmount, false, chainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId) ]; } return [ - getAction('Bridge'), - getToken(fromToken, amount), - getLabel('to'), - getToken(toToken, 0n, false, chainId), - getLabel('on'), - getChain(chainId) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(fromToken, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(toToken, 0n, false, chainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId) ]; } - return [getAction('Bridge'), getLabel('to'), getChain(chainId)]; + return [(0, utils_1.getAction)('Bridge'), (0, utils_1.getLabel)('to'), (0, utils_1.getChain)(chainId)]; }, [`${iface.getFunction('bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)')?.selector}`]: (call) => { const [amount, [[sender, receiver], outputToken, [outputAmount, chainId], quoteAndDeadlineTimeStamps @@ -143,27 +146,27 @@ export const SocketModule = (accountOp, irCalls) => { // bridgeFee ]] = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getTokenWithChain(eToNative(outputToken), outputAmount, chainId), - getLabel('on'), - getChain(chainId), - getDeadline(quoteAndDeadlineTimeStamps[1]), - ...getRecipientText(sender, receiver) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(outputToken), outputAmount, chainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId), + (0, utils_1.getDeadline)(quoteAndDeadlineTimeStamps[1]), + ...(0, utils_1.getRecipientText)(sender, receiver) ]; }, [`${iface.getFunction('bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData)')?.selector}`]: (call) => { const { senderAddress, receiverAddress, amount, stargateBridgeExtraData: { minReceivedAmt, stargateDstChainId } } = iface.parseTransaction(call).args; const chainId = STARGATE_CHAIN_IDS[stargateDstChainId.toString()]; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getTokenWithChain(ZeroAddress, minReceivedAmt), - getLabel('on'), - getChain(chainId), - ...getRecipientText(senderAddress, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)(ethers_1.ZeroAddress, minReceivedAmt), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId), + ...(0, utils_1.getRecipientText)(senderAddress, receiverAddress) ]; }, [`${iface.getFunction('performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)')?.selector}`]: (call) => { @@ -227,11 +230,11 @@ export const SocketModule = (accountOp, irCalls) => { outAmount = minReturnAmount; } return [ - getAction('Swap'), - getToken(eToNative(fromToken), amount), - getLabel(outAmount ? 'for at least' : 'for'), - getToken(eToNative(toToken), outAmount), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)((0, utils_1.eToNative)(fromToken), amount), + (0, utils_1.getLabel)(outAmount ? 'for at least' : 'for'), + (0, utils_1.getToken)((0, utils_1.eToNative)(toToken), outAmount), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector}`]: (call) => { @@ -295,126 +298,126 @@ export const SocketModule = (accountOp, irCalls) => { outAmount = minReturnAmount; } return [ - getAction('Swap'), - getToken(eToNative(fromToken), amount), - getLabel(outAmount ? 'for at least' : 'for'), - getToken(eToNative(toToken), outAmount) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)((0, utils_1.eToNative)(fromToken), amount), + (0, utils_1.getLabel)(outAmount ? 'for at least' : 'for'), + (0, utils_1.getToken)((0, utils_1.eToNative)(toToken), outAmount) ]; }, [`${iface.getFunction('bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)')?.selector}`]: (call) => { const { amount, acrossBridgeData: { senderReceiverAddresses: [sender, receiver], inputOutputTokens: [inputToken, outputToken], outputAmountToChainIdArray: [outputAmount, chainId] } } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(eToNative(inputToken), amount), - getLabel('to'), - getTokenWithChain(eToNative(outputToken), outputAmount, chainId), - getLabel('on'), - getChain(chainId), - ...getRecipientText(sender, receiver) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(inputToken), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(outputToken), outputAmount, chainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId), + ...(0, utils_1.getRecipientText)(sender, receiver) ]; }, [`${iface.getFunction('bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)')?.selector}`]: (call) => { const { amount, connextBridgeData: { toChainId, dstChainDomain, token, receiverAddress, metadata, callData, delegate } } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(eToNative(token), amount), - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery)')?.selector}`]: (call) => { const { amount, metadata, receiverAddress, toChainId, originQuery: { tokenOut, minAmountOut, deadline }, destinationQuery // : { swapAdapter, tokenOut, minAmountOut, deadline, rawParams } } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(eToNative(tokenOut), amount), - getLabel('to'), - getTokenWithChain(eToNative(destinationQuery.tokenOut), destinationQuery.minAmountOut, toChainId), - getLabel('on'), - getChain(toChainId), - getDeadline(deadline), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(tokenOut), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(destinationQuery.tokenOut), destinationQuery.minAmountOut, toChainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(toChainId), + (0, utils_1.getDeadline)(deadline), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)') ?.selector}`]: (call) => { const [amount, id, recipient, token, chainId, unknown1, fee] = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(eToNative(token), amount), - getLabel('to'), - getToken(eToNative(token), amount), - getLabel('on'), - getChain(chainId), - ...getRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)((0, utils_1.eToNative)(token), amount), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, recipient) ]; }, [`${iface.getFunction('bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)')?.selector}`]: (call) => { const { receiverAddress, customBridgeAddress, l2Gas, amount, metadata, data } = iface.parseTransaction(call).args; // @TODO return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('via'), - getAddressVisualization(customBridgeAddress), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('via'), + (0, utils_1.getAddressVisualization)(customBridgeAddress), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data)')?.selector}`]: (call) => { const { receiverAddress, l2Gas, amount, toChainId, metadata, bridgeHash, data } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash)')?.selector}`]: (call) => { const { receiverAddress, gasLimit, fees, metadata, amount, toChainId, bridgeHash } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ]; }, [`${iface.getFunction('bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable')?.selector}`]: (call) => { const { receiverAddress, l1bridgeAddr, toChainId, amount, amountOutMin, relayerFee, deadline, metadata } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getToken(ZeroAddress, amountOutMin), - getLabel('on'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress), - getDeadline(deadline) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountOutMin), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress), + (0, utils_1.getDeadline)(deadline) ]; }, [`${iface.getFunction('bridgeNativeTo(uint256,address,uint256,bytes32)')?.selector}`]: (call) => { const [amount, recipient, chainId, metadata] = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getChain(chainId), - ...getRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(chainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, recipient) ]; }, [`${iface.getFunction('function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable')?.selector}`]: (call) => { const { receiverAddress, hopAMM, amount, toChainId, bonderFee, amountOutMin, deadline, amountOutMinDestination, deadlineDestination, metadata } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(ZeroAddress, amount), - getLabel('to'), - getToken(ZeroAddress, amountOutMin), - getLabel('on'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress), - getDeadline(deadline) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountOutMin), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress), + (0, utils_1.getDeadline)(deadline) ]; }, [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)')?.selector}`]: (call) => { @@ -428,26 +431,26 @@ export const SocketModule = (accountOp, irCalls) => { if (swapExtraData.startsWith('0x415565b0')) outAmount = iface.parseTransaction({ data: swapExtraData }).args[3]; return [ - getAction('Bridge'), - getToken(eToNative(fromToken), amount), - getLabel('to'), + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)((0, utils_1.eToNative)(fromToken), amount), + (0, utils_1.getLabel)('to'), ...(chainId ? [ - getTokenWithChain(eToNative(toToken), outAmount, chainId), - getLabel('on'), - getChain(chainId) + (0, utils_1.getTokenWithChain)((0, utils_1.eToNative)(toToken), outAmount, chainId), + (0, utils_1.getLabel)('on'), + (0, utils_1.getChain)(chainId) ] - : [getToken(eToNative(toToken), outAmount)]), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + : [(0, utils_1.getToken)((0, utils_1.eToNative)(toToken), outAmount)]), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ].filter((x) => x); } return [ - getAction('Bridge'), - getLabel('undetected token'), - getLabel('to'), - getLabel('undetected token'), - ...(chainId ? [getLabel('on'), getChain(chainId)] : []), - ...getRecipientText(accountOp.accountAddr, receiverAddress) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getLabel)('undetected token'), + (0, utils_1.getLabel)('to'), + (0, utils_1.getLabel)('undetected token'), + ...(chainId ? [(0, utils_1.getLabel)('on'), (0, utils_1.getChain)(chainId)] : []), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress) ].filter((x) => x); }, [`${iface.getFunction('swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData)')?.selector}`]: (call) => { @@ -455,19 +458,19 @@ export const SocketModule = (accountOp, irCalls) => { const dstChain = []; const tokensData = []; if (STARGATE_CHAIN_IDS[stargateDstChainId]) - dstChain.push(getLabel('to'), getChain(STARGATE_CHAIN_IDS[stargateDstChainId])); + dstChain.push((0, utils_1.getLabel)('to'), (0, utils_1.getChain)(STARGATE_CHAIN_IDS[stargateDstChainId])); if (swapData.startsWith(iface.getFunction('performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)')?.selector)) { const { fromToken, toToken, amount, metadata: newMeta, swapExtraData } = iface.parseTransaction({ ...call, data: swapData }).args; - tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, value)); + tokensData.push((0, utils_1.getToken)(fromToken, amount), (0, utils_1.getLabel)('to'), (0, utils_1.getToken)(toToken, value)); } return [ - getAction('Bridge'), + (0, utils_1.getAction)('Bridge'), ...tokensData, ...dstChain, - ...getRecipientText(senderAddress, receiverAddress) + ...(0, utils_1.getRecipientText)(senderAddress, receiverAddress) ]; }, [`${iface.getFunction('function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable')?.selector}`]: (call) => { @@ -479,37 +482,37 @@ export const SocketModule = (accountOp, irCalls) => { ...call, data: swapData }).args; - tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, minAmountLD)); + tokensData.push((0, utils_1.getToken)(fromToken, amount), (0, utils_1.getLabel)('to'), (0, utils_1.getToken)(toToken, minAmountLD)); } return [ - getAction('Bridge'), + (0, utils_1.getAction)('Bridge'), ...tokensData, - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiver) + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiver) ]; }, [`${iface.getFunction('bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)')?.selector}`]: (call) => { const { receiverAddress, token, hopAMM, amount, toChainId, hopBridgeRequestData: { bonderFee, amountOutMin, deadline, amountOutMinDestination, deadlineDestination, metadata } } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(token, amount), - getLabel('for at least'), - getToken(token, amountOutMinDestination), - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiverAddress), - getDeadline(deadline) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(token, amount), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(token, amountOutMinDestination), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiverAddress), + (0, utils_1.getDeadline)(deadline) ]; }, [`${iface.getFunction('bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable')?.selector}`]: (call) => { const { token, amount, stargateBridgeData: { dstEid, minAmountLD, stargatePoolAddress, destinationPayload, destinationExtraOptions, messagingFee: { nativeFee, lzTokenFee }, metadata, toChainId, receiver, swapData, swapId, isNativeSwapRequired } } = iface.parseTransaction(call).args; return [ - getAction('Bridge'), - getToken(token, amount), - getLabel('to'), - getChain(toChainId), - ...getRecipientText(accountOp.accountAddr, receiver) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(token, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(toChainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiver) ]; } }; @@ -522,21 +525,21 @@ export const SocketModule = (accountOp, irCalls) => { const [[feesTakerAddress, feesToken, feesAmount, swapRouteId, swapData, bridgeRouteId, bridgeData]] = preControllerIface.decodeFunctionData('takeFeeAndSwapAndBridge', dataToUse); const humanizationOfSwap = matcher[swapData.slice(0, 10)] ? matcher[swapData.slice(0, 10)]({ ...call, data: swapData }) - : [getAction('Swap')]; - let humanizationOfBridge = [getAction('Bridge')]; + : [(0, utils_1.getAction)('Swap')]; + let humanizationOfBridge = [(0, utils_1.getAction)('Bridge')]; try { - const [[[sender, receiver], [tokenIn, tokenOut], [outputAmount, chainId], [quoteTime, deadline], bridgeFee, metadata]] = new AbiCoder().decode([ + const [[[sender, receiver], [tokenIn, tokenOut], [outputAmount, chainId], [quoteTime, deadline], bridgeFee, metadata]] = new ethers_1.AbiCoder().decode([ 'tuple(address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata)' ], bridgeData); humanizationOfBridge = [ - getAction('Bridge'), - getToken(tokenIn, 0n), - getLabel('for at least'), - getTokenWithChain(tokenOut, outputAmount, chainId), - getLabel('to'), - getChain(chainId), - ...getRecipientText(accountOp.accountAddr, receiver), - getDeadline(deadline) + (0, utils_1.getAction)('Bridge'), + (0, utils_1.getToken)(tokenIn, 0n), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getTokenWithChain)(tokenOut, outputAmount, chainId), + (0, utils_1.getLabel)('to'), + (0, utils_1.getChain)(chainId), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, receiver), + (0, utils_1.getDeadline)(deadline) ]; } catch (e) { @@ -544,7 +547,7 @@ export const SocketModule = (accountOp, irCalls) => { } return { ...call, - fullVisualization: [...humanizationOfSwap, getLabel('and'), ...humanizationOfBridge] + fullVisualization: [...humanizationOfSwap, (0, utils_1.getLabel)('and'), ...humanizationOfBridge] }; } if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndSwap').selector)) { @@ -569,4 +572,5 @@ export const SocketModule = (accountOp, irCalls) => { }); return newCalls; }; +exports.SocketModule = SocketModule; //# sourceMappingURL=socketModules.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Socket/socketModules.js.map b/dist/src/libs/humanizer/modules/Socket/socketModules.js.map index bfe946d68..c21ab116f 100644 --- a/dist/src/libs/humanizer/modules/Socket/socketModules.js.map +++ b/dist/src/libs/humanizer/modules/Socket/socketModules.js.map @@ -1 +1 @@ -{"version":3,"file":"socketModules.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/socketModules.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EACL,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EAClB,MAAM,aAAa,CAAA;AAEpB,+EAA+E;AAC/E,MAAM,kBAAkB,GAA8B;IACpD,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;CACb,CAAA;AACD,2CAA2C;AAC3C,iCAAiC;AACjC,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC3F,MAAM,kBAAkB,GAAG,IAAI,SAAS,CAAC;QACvC,uFAAuF;QACvF,uKAAuK;QACvK,2KAA2K;QAC3K,QAAQ;QACR,4LAA4L;KAC7L,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;QAC1B,GAAG,eAAe;QAClB,iDAAiD;QACjD,sKAAsK;QACtK,4JAA4J;QAC5J,gFAAgF;QAChF,wOAAwO;QACxO,4JAA4J;QAC5J,6OAA6O;QAC7O,gXAAgX;QAChX,qXAAqX;QACrX,8FAA8F;QAC9F,oVAAoV;QACpV,sDAAsD;QACtD,yIAAyI;QACzI,6DAA6D;QAC7D,uDAAuD;QACvD,mDAAmD;KACpD,CAAC,CAAA;IACF,MAAM,OAAO,GAAwE;QACnF,CAAC,GACC,KAAK,CAAC,WAAW,CACf,yOAAyO,CAC1O,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM;YACJ,UAAU;YACV,QAAQ,EACR,gBAAgB,EAAE,EAChB,uBAAuB,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC,EAC1D,WAAW,EACX,0BAA0B,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,EACpD,0BAA0B;YAC1B,aAAa;YACb,WAAW;cACZ,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,IACE,QAAQ,CAAC,UAAU,CACjB,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAC5D,IAAI,EAAE,QAAQ;iBACf,CAAE,CAAC,IAAI,CAAA;gBACR,OAAO;oBACL,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC;oBACd,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;oBACnD,QAAQ,CAAC,IAAI,CAAC;oBACd,QAAQ,CAAC,QAAQ,CAAC;oBAClB,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;oBAC1C,GAAG,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC;iBACrD,CAAA;aACF;YACD,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,kBAAkB,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC;gBACd,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,QAAQ,CAAC;gBAClB,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBAC1C,GAAG,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC;aACrD,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,uKAAuK,CACxK,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,eAAe,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAC9E,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,IACE,QAAQ,CAAC,UAAU,CACjB,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAC5D,IAAI,EAAE,QAAQ;iBACf,CAAE,CAAC,IAAI,CAAA;gBACR,OAAO;oBACL,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC;oBACd,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;oBACzC,QAAQ,CAAC,IAAI,CAAC;oBACd,QAAQ,CAAC,SAAS,CAAC;oBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;iBAC5D,CAAA;aACF;YACD,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,KAAK,CAAC;gBACf,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;aACpB,CAAA;QACH,CAAC;QACD,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,qDAAqD,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CACzF,IAAY,EACZ,EAAE;YACF,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,AAAD,EAAG,IAAI,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAChE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAE,CAAC,QAAQ,CAAC,EAAE;gBACvE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAC3E,GAAG,IAAI;oBACP,IAAI;iBACL,CAAE,CAAC,IAAI,CAAA;gBACR,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAE,CAAC,QAAQ,CAAC,EAAE;oBAC3E,MAAM,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;wBACtD,GAAG,IAAI;wBACP,IAAI,EAAE,aAAa;qBACpB,CAAE,CAAC,IAAI,CAAA;oBAER,OAAO;wBACL,SAAS,CAAC,QAAQ,CAAC;wBACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;wBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACd,QAAQ,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,CAAC;wBACvD,QAAQ,CAAC,IAAI,CAAC;wBACd,QAAQ,CAAC,OAAO,CAAC;qBAClB,CAAA;iBACF;gBACD,OAAO;oBACL,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;oBACd,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC;oBACrC,QAAQ,CAAC,IAAI,CAAC;oBACd,QAAQ,CAAC,OAAO,CAAC;iBAClB,CAAA;aACF;YACD,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QACjE,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,2NAA2N,CAC5N,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,CACJ,MAAM,EACN,CACE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClB,WAAW,EACX,CAAC,YAAY,EAAE,OAAO,CAAC,EACvB,0BAA0B;YAC1B,QAAQ;YACR,YAAY;aACb,CACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAEtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC;gBAChE,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,OAAO,CAAC;gBACjB,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBAC1C,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC;aACtC,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,0TAA0T,CAC3T,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,aAAa,EACb,eAAe,EACf,MAAM,EACN,uBAAuB,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAChE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAA;YACjE,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,iBAAiB,CAAC,WAAW,EAAE,cAAc,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,OAAO,CAAC;gBACjB,GAAG,gBAAgB,CAAC,aAAa,EAAE,eAAe,CAAC;aACpD,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,mIAAmI,CACpI,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,wCAAwC;YACxC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,GAC1E,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,IAAI,SAAS,GAAG,EAAE,CAAA;YAClB,IACE,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,mIAAmI,CACpI,EAAE,QAAQ,CACZ,EACD;gBACA,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;aACrE;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,qFAAqF,CACtF,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,CACJ,WAAW,EACX,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAC3D,MAAM,EACN,MAAM,CACP,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAA;gBACzD,SAAS,GAAG,OAAO,CAAA;aACpB;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CAAC,kEAAkE,CAAE;iBACnF,QAAQ,CACZ,EACD;gBACA,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAA;gBACpE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;aACtB;iBAAM,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE;gBACxE,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,AAAD,EAAG,SAAS,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACjD,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE;oBAChE,wCAAwC;oBACxC,IAAI,CAAC,CAAC,EAAE,AAAD,EAAG,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;wBACzD,IAAI,EAAE,SAAS;qBAChB,CAAE,CAAC,IAAI,CAAA;oBACR,IAAI,CAAC,YAAY,EAAE;wBACjB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC1C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CACvD,CAAA;wBACD,IAAI,WAAW,EAAE;4BACf,CAAC;4BAAA,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,YAAY,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAE,CAAC,IAAI,CAAA;yBAC5E;qBACF;oBACD,SAAS,GAAG,YAAY,CAAA;iBACzB;aACF;iBAAM,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,EAAE;gBACnF,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzD,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,SAAS,GAAG,OAAO,CAAA;aACpB;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,oVAAoV,CACrV,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM;gBACJ,UAAU;gBACV,IAAI,EAAE;gBACJ,YAAY;gBACZ,YAAY;gBACZ,eAAe;gBACf,eAAe;gBACf,mBAAmB;gBACnB,eAAe;gBACf,oBAAoB;gBACpB,SAAS;gBACT,YAAY;gBACZ,SAAS;kBACV,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzB,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,SAAS,GAAG,eAAe,CAAA;aAC5B;YACD,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5C,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;gBACvC,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,wCAAwC;YACxC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GACzD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,IAAI,SAAS,GAAG,EAAE,CAAA;YAClB,IACE,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,mIAAmI,CACpI,EAAE,QAAQ,CACZ,EACD;gBACA,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;aACrE;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,qFAAqF,CACtF,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,CACJ,WAAW,EACX,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAC3D,MAAM,EACN,MAAM,CACP,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAA;gBACzD,SAAS,GAAG,OAAO,CAAA;aACpB;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CAAC,kEAAkE,CAAE;iBACnF,QAAQ,CACZ,EACD;gBACA,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAA;gBACpE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;aACtB;iBAAM,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE;gBACxE,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,AAAD,EAAG,SAAS,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACjD,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE;oBAChE,wCAAwC;oBACxC,IAAI,CAAC,CAAC,EAAE,AAAD,EAAG,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;wBACzD,IAAI,EAAE,SAAS;qBAChB,CAAE,CAAC,IAAI,CAAA;oBACR,IAAI,CAAC,YAAY,EAAE;wBACjB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC1C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CACvD,CAAA;wBACD,IAAI,WAAW,EAAE;4BACf,CAAC;4BAAA,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,YAAY,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAE,CAAC,IAAI,CAAA;yBAC5E;qBACF;oBACD,SAAS,GAAG,YAAY,CAAA;iBACzB;aACF;iBAAM,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,EAAE;gBACnF,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzD,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,SAAS,GAAG,OAAO,CAAA;aACpB;iBAAM,IACL,aAAa,CAAC,UAAU,CACtB,KAAK,CAAC,WAAW,CACf,oVAAoV,CACrV,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM;gBACJ,UAAU;gBACV,IAAI,EAAE;gBACJ,YAAY;gBACZ,YAAY;gBACZ,eAAe;gBACf,eAAe;gBACf,mBAAmB;gBACnB,eAAe;gBACf,oBAAoB;gBACpB,SAAS;gBACT,YAAY;gBACZ,SAAS;kBACV,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzB,IAAI,EAAE,aAAa;iBACpB,CAAE,CAAC,IAAI,CAAA;gBACR,SAAS,GAAG,eAAe,CAAA;aAC5B;YACD,OAAO;gBACL,SAAS,CAAC,MAAM,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5C,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;aACxC,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,kOAAkO,CACnO,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,gBAAgB,EAAE,EAChB,uBAAuB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3C,iBAAiB,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAC5C,0BAA0B,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EACpD,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC;gBACd,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC;gBAChE,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,OAAO,CAAC;gBACjB,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC;aACtC,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,+NAA+N,CAChO,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,iBAAiB,EAAE,EACjB,SAAS,EACT,cAAc,EACd,KAAK,EACL,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACT,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,+TAA+T,CAChU,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,eAAe,EACf,SAAS,EACT,WAAW,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,EACjD,gBAAgB,CAAC,iEAAiE;cACnF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC;gBACd,iBAAiB,CACf,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EACpC,gBAAgB,CAAC,YAAY,EAC7B,SAAS,CACV;gBACD,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,WAAW,CAAC,QAAQ,CAAC;gBACrB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CAAC,uEAAuE,CAAC;YACxF,EAAE,QACN,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,GAC1D,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,OAAO,CAAC;gBACjB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC;aACtD,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,kIAAkI,CACnI,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAC3E,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,QAAQ;YACR,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,KAAK,CAAC;gBACf,uBAAuB,CAAC,mBAAmB,CAAC;gBAC5C,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,4IAA4I,CAC7I,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAC7E,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,kJAAkJ,CACnJ,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAChF,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,yMAAyM,CAC1M,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,MAAM,EACN,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,QAAQ,EACT,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC3D,WAAW,CAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,iDAAiD,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CACrF,IAAY,EACZ,EAAE;YACF,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACjF,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,OAAO,CAAC;gBACjB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC;aACtD,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,wPAAwP,CACzP,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,eAAe,EACf,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,EACT,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC3D,WAAW,CAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,oOAAoO,CACrO,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,QAAQ,EACR,iBAAiB,EAAE,EACjB,OAAO,EACP,QAAQ,EACR,UAAU,EACV,cAAc,EACd,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACT,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,IACE,QAAQ,CAAC,UAAU,CACjB,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAC3E,IAAI,EAAE,QAAQ;iBACf,CAAE,CAAC,IAAI,CAAA;gBACR,IAAI,SAAS,GAAG,EAAE,CAAA;gBAClB,8BAA8B;gBAC9B,IAAI,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC;oBACxC,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAEtE,OAAO;oBACL,SAAS,CAAC,QAAQ,CAAC;oBACnB,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC;oBAEd,GAAG,CAAC,OAAO;wBACT,CAAC,CAAC;4BACE,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC;4BACzD,QAAQ,CAAC,IAAI,CAAC;4BACd,QAAQ,CAAC,OAAO,CAAC;yBAClB;wBACH,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;oBAC9C,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;iBAC5D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;aACnB;YACD,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,kBAAkB,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,kBAAkB,CAAC;gBAC5B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;aAC5D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,+VAA+V,CAChW,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,gBAAgB,EAAE,EAChB,eAAe,EACf,aAAa,EACb,KAAK,EACL,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EACR,kBAAkB,EACnB,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAEtC,MAAM,QAAQ,GAA6B,EAAE,CAAA;YAC7C,MAAM,UAAU,GAA6B,EAAE,CAAA;YAC/C,IAAI,kBAAkB,CAAC,kBAAkB,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;YACjF,IACE,QAAQ,CAAC,UAAU,CACjB,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EAAE,OAAO,EACjB,aAAa,EACd,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzB,GAAG,IAAI;oBACP,IAAI,EAAE,QAAQ;iBACf,CAAE,CAAC,IAAI,CAAA;gBACR,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;aACvF;YAED,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,GAAG,UAAU;gBACb,GAAG,QAAQ;gBACX,GAAG,gBAAgB,CAAC,aAAa,EAAE,eAAe,CAAC;aACpD,CAAA;QACH,CAAC;QAED,CAAC,GACC,KAAK,CAAC,WAAW,CACf,qXAAqX,CACtX,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,kBAAkB,EAAE,EAClB,MAAM,EACN,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EACvC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,WAAW,EACnB,oBAAoB,EACrB,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,MAAM,QAAQ,GAA6B,EAAE,CAAA;YAC7C,MAAM,UAAU,GAA6B,EAAE,CAAA;YAC/C,IACE,QAAQ,CAAC,UAAU,CACjB,KAAK,CAAC,WAAW,CACf,mJAAmJ,CACpJ,EAAE,QAAQ,CACZ,EACD;gBACA,MAAM,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EAAE,OAAO,EACjB,aAAa,EACd,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBACzB,GAAG,IAAI;oBACP,IAAI,EAAE,QAAQ;iBACf,CAAE,CAAC,IAAI,CAAA;gBACR,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;aAC7F;YAED,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,GAAG,UAAU;gBACb,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC;aACrD,CAAA;QACH,CAAC;QAED,CAAC,GACC,KAAK,CAAC,WAAW,CACf,4QAA4Q,CAC7Q,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,eAAe,EACf,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,oBAAoB,EAAE,EACpB,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,EACT,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAEtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,cAAc,CAAC;gBACxB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC3D,WAAW,CAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,GACC,KAAK,CAAC,WAAW,CACf,4WAA4W,CAC7W,EAAE,QACL,EAAE,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,EACJ,KAAK,EACL,MAAM,EACN,kBAAkB,EAAE,EAClB,MAAM,EACN,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EACvC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,oBAAoB,EACrB,EACF,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACtC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC;gBACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,SAAS,CAAC;gBACnB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC;aACrD,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QACtD,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAA;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,mBAAmB,CAAE,CAAC,QAAQ,CAAC,EAAE;YACvF,MAAM,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACjF,SAAS,GAAG,OAAO,CAAA;YAEnB,IACE,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,yBAAyB,CAAE,CAAC,QAAQ,CAAC,EACzF;gBACA,MAAM,CACJ,CACE,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,CACX,CACF,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;gBAC/E,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC7D,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;gBAEvB,IAAI,oBAAoB,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAEhD,IAAI;oBACF,MAAM,CACJ,CACE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB,CAAC,YAAY,EAAE,OAAO,CAAC,EACvB,CAAC,SAAS,EAAE,QAAQ,CAAC,EACrB,SAAS,EACT,QAAQ,CACT,CACF,GAAG,IAAI,QAAQ,EAAE,CAAC,MAAM,CACvB;wBACE,uLAAuL;qBACxL,EACD,UAAU,CACX,CAAA;oBAED,oBAAoB,GAAG;wBACrB,SAAS,CAAC,QAAQ,CAAC;wBACnB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;wBACrB,QAAQ,CAAC,cAAc,CAAC;wBACxB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC;wBAClD,QAAQ,CAAC,IAAI,CAAC;wBACd,QAAQ,CAAC,OAAO,CAAC;wBACjB,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC;wBACpD,WAAW,CAAC,QAAQ,CAAC;qBACtB,CAAA;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;iBACf;gBACD,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,CAAC,GAAG,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,oBAAoB,CAAC;iBACrF,CAAA;aACF;YACD,IAAI,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,iBAAiB,CAAE,CAAC,QAAQ,CAAC,EAAE;gBACrF,MAAM,CAAC,CAAC,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,GACzE,kBAAkB,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;gBACrE,SAAS,GAAG,eAAe,CAAA;aAC5B;iBAAM,IACL,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,mBAAmB,CAAE,CAAC,QAAQ,CAAC,EACnF;gBACA,MAAM,CAAC,CAAC,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,GAC3E,kBAAkB,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;gBACvE,SAAS,GAAG,iBAAiB,CAAA;aAC9B;SACF;aAAM;YACL,SAAS,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;SACvC;QACD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;YACnC,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACjF,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { SocketViaAcross } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\n// taken from https://stargateprotocol.gitbook.io/stargate/developers/chain-ids\nconst STARGATE_CHAIN_IDS: { [key: string]: bigint } = {\n '101': 1n,\n '102': 56n,\n '106': 43114n,\n '109': 137n,\n '110': 42161n,\n '111': 10n,\n '112': 250n,\n '151': 1088n,\n '184': 8453n,\n '183': 59144n,\n '177': 2222n,\n '181': 5000n\n}\n// @TODO check all additional data provided\n// @TODO consider fees everywhere\n// @TODO add automated tests\nexport const SocketModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const preControllerIface = new Interface([\n 'function executeController((uint32 controllerId, bytes data) socketControllerRequest)',\n 'function takeFeesAndSwap((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes swapRequestData) ftsRequest) payable returns (bytes)',\n 'function takeFeesAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes bridgeRequestData) ftbRequest) payable returns (bytes)',\n // @TODO\n 'function takeFeeAndSwapAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 swapRouteId, bytes swapData, uint32 bridgeRouteId, bytes bridgeData) fsbRequest)'\n ])\n const iface = new Interface([\n ...SocketViaAcross,\n // @TODO move to more appropriate place all funcs\n 'function performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData) payable returns (uint256)',\n 'function performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)',\n 'function bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)',\n 'function bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function transformERC20(address inputToken, address outputToken, uint256 inputTokenAmount, uint256 minOutputTokenAmount, (uint32,bytes)[] transformations)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData) payable',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable',\n 'function swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)',\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)',\n 'function exec(address,address,uint256,address,bytes)',\n 'function execute((address recipient, address buyToken, uint256 minAmountOut) slippage, bytes[] actions, bytes32) payable returns (bool)',\n 'function uniswapV3SwapTo(address,uint256,uint256,uint256[])',\n 'function BASIC(address,uint256,address,uint256,bytes)',\n 'function UNISWAPV3(address,uint256,bytes,uint256)'\n ])\n const matcher: { [sighash: string]: (irCall: IrCall) => HumanizerVisualization[] } = {\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(address[] senderReceiverAddresses,address outputToken,uint256[] outputAmountToChainIdArray,uint32[] quoteAndDeadlineTimeStamps,uint256 bridgeFee,bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n // swapId,\n swapData,\n acrossBridgeData: {\n senderReceiverAddresses: [senderAddress, recipientAddress],\n outputToken,\n outputAmountToChainIdArray: [outputAmount, dstChain],\n quoteAndDeadlineTimeStamps\n // bridgeFee,\n // metadata\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), outputAmount),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, dstChain),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n celerBridgeData: { receiverAddress, toChainId, maxSlippage, nonce, metadata }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), 0n),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('via'),\n getAddressVisualization(call.to),\n getLabel('to'),\n getChain(toChainId)\n ]\n },\n [`${iface.getFunction('swapAndBridge(uint32,address,uint256,bytes32,bytes)')?.selector}`]: (\n call: IrCall\n ) => {\n const [, , chainId, , data] = iface.parseTransaction(call)!.args\n if (data.startsWith(iface.getFunction('performActionWithIn')!.selector)) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n ...call,\n data\n })!.args\n if (swapExtraData.startsWith(iface.getFunction('transformERC20')!.selector)) {\n const { minOutputTokenAmount } = iface.parseTransaction({\n ...call,\n data: swapExtraData\n })!.args\n\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, minOutputTokenAmount, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, 0n, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [getAction('Bridge'), getLabel('to'), getChain(chainId)]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const [\n amount,\n [\n [sender, receiver],\n outputToken,\n [outputAmount, chainId],\n quoteAndDeadlineTimeStamps\n // @TODO\n // bridgeFee\n ]\n ] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n senderAddress,\n receiverAddress,\n amount,\n stargateBridgeExtraData: { minReceivedAmt, stargateDstChainId }\n } = iface.parseTransaction(call)!.args\n const chainId = STARGATE_CHAIN_IDS[stargateDstChainId.toString()]\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(ZeroAddress, minReceivedAmt),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, receiverAddress, swapExtraData, metadata } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, metadata, swapExtraData } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n acrossBridgeData: {\n senderReceiverAddresses: [sender, receiver],\n inputOutputTokens: [inputToken, outputToken],\n outputAmountToChainIdArray: [outputAmount, chainId]\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(inputToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n connextBridgeData: {\n toChainId,\n dstChainDomain,\n token,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n metadata,\n receiverAddress,\n toChainId,\n originQuery: { tokenOut, minAmountOut, deadline },\n destinationQuery // : { swapAdapter, tokenOut, minAmountOut, deadline, rawParams }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(tokenOut), amount),\n getLabel('to'),\n getTokenWithChain(\n eToNative(destinationQuery.tokenOut),\n destinationQuery.minAmountOut,\n toChainId\n ),\n getLabel('on'),\n getChain(toChainId),\n getDeadline(deadline),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction('bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)')\n ?.selector\n }`]: (call: IrCall) => {\n const [amount, id, recipient, token, chainId, unknown1, fee] =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getToken(eToNative(token), amount),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, customBridgeAddress, l2Gas, amount, metadata, data } =\n iface.parseTransaction(call)!.args\n // @TODO\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('via'),\n getAddressVisualization(customBridgeAddress),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, l2Gas, amount, toChainId, metadata, bridgeHash, data } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, gasLimit, fees, metadata, amount, toChainId, bridgeHash } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n l1bridgeAddr,\n toChainId,\n amount,\n amountOutMin,\n relayerFee,\n deadline,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${iface.getFunction('bridgeNativeTo(uint256,address,uint256,bytes32)')?.selector}`]: (\n call: IrCall\n ) => {\n const [amount, recipient, chainId, metadata] = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n hopAMM,\n amount,\n toChainId,\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapData,\n connextBridgeData: {\n chainId,\n slippage,\n relayerFee,\n dstChainDomain,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n data: swapData\n })!.args\n let outAmount = 0n\n // @TODO no harcoded sighashes\n if (swapExtraData.startsWith('0x415565b0'))\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n\n ...(chainId\n ? [\n getTokenWithChain(eToNative(toToken), outAmount, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n : [getToken(eToNative(toToken), outAmount)]),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getLabel('undetected token'),\n ...(chainId ? [getLabel('on'), getChain(chainId)] : []),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n acrossBridgeData: {\n receiverAddress,\n senderAddress,\n value,\n srcPoolId,\n dstPoolId,\n minReceivedAmt,\n destinationGasLimit,\n isNativeSwapRequired,\n stargateDstChainId,\n swapId: innerSwapId,\n swapData: innerSwapData,\n metadata,\n destinationPayload\n }\n } = iface.parseTransaction(call)!.args\n\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (STARGATE_CHAIN_IDS[stargateDstChainId])\n dstChain.push(getLabel('to'), getChain(STARGATE_CHAIN_IDS[stargateDstChainId]))\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, value))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n ...dstChain,\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n\n [`${\n iface.getFunction(\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData: InnerSwapData,\n swapId: InnerSwapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, minAmountLD))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n },\n\n [`${\n iface.getFunction(\n 'bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n token,\n hopAMM,\n amount,\n toChainId,\n hopBridgeRequestData: {\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n }\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('for at least'),\n getToken(token, amountOutMinDestination),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n token,\n amount,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData,\n swapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n let dataToUse = call.data\n\n if (call.data.startsWith(preControllerIface.getFunction('executeController')!.selector)) {\n const [[controllerId, newData]] = preControllerIface.parseTransaction(call)!.args\n dataToUse = newData\n\n if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeeAndSwapAndBridge')!.selector)\n ) {\n const [\n [\n feesTakerAddress,\n feesToken,\n feesAmount,\n swapRouteId,\n swapData,\n bridgeRouteId,\n bridgeData\n ]\n ] = preControllerIface.decodeFunctionData('takeFeeAndSwapAndBridge', dataToUse)\n const humanizationOfSwap = matcher[swapData.slice(0, 10)]\n ? matcher[swapData.slice(0, 10)]({ ...call, data: swapData })\n : [getAction('Swap')]\n\n let humanizationOfBridge = [getAction('Bridge')]\n\n try {\n const [\n [\n [sender, receiver],\n [tokenIn, tokenOut],\n [outputAmount, chainId],\n [quoteTime, deadline],\n bridgeFee,\n metadata\n ]\n ] = new AbiCoder().decode(\n [\n 'tuple(address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata)'\n ],\n bridgeData\n )\n\n humanizationOfBridge = [\n getAction('Bridge'),\n getToken(tokenIn, 0n),\n getLabel('for at least'),\n getTokenWithChain(tokenOut, outputAmount, chainId),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, receiver),\n getDeadline(deadline)\n ]\n } catch (e) {\n console.log(e)\n }\n return {\n ...call,\n fullVisualization: [...humanizationOfSwap, getLabel('and'), ...humanizationOfBridge]\n }\n }\n if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndSwap')!.selector)) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, swapRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndSwap', dataToUse)\n dataToUse = swapRequestData\n } else if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndBridge')!.selector)\n ) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, bridgeRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndBridge', dataToUse)\n dataToUse = bridgeRequestData\n }\n } else {\n dataToUse = `0x${dataToUse.slice(10)}`\n }\n if (matcher[dataToUse.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher[dataToUse.slice(0, 10)]({ ...call, data: dataToUse })\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"socketModules.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Socket/socketModules.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { SocketViaAcross } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n eToNative,\n getAction,\n getAddressVisualization,\n getChain,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getTokenWithChain\n} from '../../utils'\n\n// taken from https://stargateprotocol.gitbook.io/stargate/developers/chain-ids\nconst STARGATE_CHAIN_IDS: { [key: string]: bigint } = {\n '101': 1n,\n '102': 56n,\n '106': 43114n,\n '109': 137n,\n '110': 42161n,\n '111': 10n,\n '112': 250n,\n '151': 1088n,\n '184': 8453n,\n '183': 59144n,\n '177': 2222n,\n '181': 5000n\n}\n// @TODO check all additional data provided\n// @TODO consider fees everywhere\n// @TODO add automated tests\nexport const SocketModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const preControllerIface = new Interface([\n 'function executeController((uint32 controllerId, bytes data) socketControllerRequest)',\n 'function takeFeesAndSwap((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes swapRequestData) ftsRequest) payable returns (bytes)',\n 'function takeFeesAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 routeId, bytes bridgeRequestData) ftbRequest) payable returns (bytes)',\n // @TODO\n 'function takeFeeAndSwapAndBridge((address feesTakerAddress, address feesToken, uint256 feesAmount, uint32 swapRouteId, bytes swapData, uint32 bridgeRouteId, bytes bridgeData) fsbRequest)'\n ])\n const iface = new Interface([\n ...SocketViaAcross,\n // @TODO move to more appropriate place all funcs\n 'function performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData) payable returns (uint256)',\n 'function performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)',\n 'function bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)',\n 'function bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function transformERC20(address inputToken, address outputToken, uint256 inputTokenAmount, uint256 minOutputTokenAmount, (uint32,bytes)[] transformations)',\n 'function swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)',\n 'function swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData) payable',\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable',\n 'function swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)',\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)',\n 'function exec(address,address,uint256,address,bytes)',\n 'function execute((address recipient, address buyToken, uint256 minAmountOut) slippage, bytes[] actions, bytes32) payable returns (bool)',\n 'function uniswapV3SwapTo(address,uint256,uint256,uint256[])',\n 'function BASIC(address,uint256,address,uint256,bytes)',\n 'function UNISWAPV3(address,uint256,bytes,uint256)'\n ])\n const matcher: { [sighash: string]: (irCall: IrCall) => HumanizerVisualization[] } = {\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(address[] senderReceiverAddresses,address outputToken,uint256[] outputAmountToChainIdArray,uint32[] quoteAndDeadlineTimeStamps,uint256 bridgeFee,bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n // swapId,\n swapData,\n acrossBridgeData: {\n senderReceiverAddresses: [senderAddress, recipientAddress],\n outputToken,\n outputAmountToChainIdArray: [outputAmount, dstChain],\n quoteAndDeadlineTimeStamps\n // bridgeFee,\n // metadata\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), outputAmount),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, dstChain),\n getLabel('on'),\n getChain(dstChain),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(senderAddress, recipientAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, (address receiverAddress, uint64 toChainId, uint32 maxSlippage, uint64 nonce, bytes32 metadata) celerBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n celerBridgeData: { receiverAddress, toChainId, maxSlippage, nonce, metadata }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, amount, toToken } = iface.parseTransaction({\n data: swapData\n })!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(toToken), 0n),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n }\n return [\n getAction('Bridge'),\n getLabel('via'),\n getAddressVisualization(call.to),\n getLabel('to'),\n getChain(toChainId)\n ]\n },\n [`${iface.getFunction('swapAndBridge(uint32,address,uint256,bytes32,bytes)')?.selector}`]: (\n call: IrCall\n ) => {\n const [, , chainId, , data] = iface.parseTransaction(call)!.args\n if (data.startsWith(iface.getFunction('performActionWithIn')!.selector)) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n ...call,\n data\n })!.args\n if (swapExtraData.startsWith(iface.getFunction('transformERC20')!.selector)) {\n const { minOutputTokenAmount } = iface.parseTransaction({\n ...call,\n data: swapExtraData\n })!.args\n\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, minOutputTokenAmount, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [\n getAction('Bridge'),\n getToken(fromToken, amount),\n getLabel('to'),\n getToken(toToken, 0n, false, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n }\n return [getAction('Bridge'), getLabel('to'), getChain(chainId)]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, (address[] senderReceiverAddresses, address outputToken, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const [\n amount,\n [\n [sender, receiver],\n outputToken,\n [outputAmount, chainId],\n quoteAndDeadlineTimeStamps\n // @TODO\n // bridgeFee\n ]\n ] = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n getDeadline(quoteAndDeadlineTimeStamps[1]),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address senderAddress, address receiverAddress, uint256 amount, (uint256 srcPoolId, uint256 dstPoolId, uint256 destinationGasLimit, uint256 minReceivedAmt, uint256 value, uint16 stargateDstChainId, uint32 swapId, bytes32 metadata, bytes swapData, bytes destinationPayload) stargateBridgeExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n senderAddress,\n receiverAddress,\n amount,\n stargateBridgeExtraData: { minReceivedAmt, stargateDstChainId }\n } = iface.parseTransaction(call)!.args\n const chainId = STARGATE_CHAIN_IDS[stargateDstChainId.toString()]\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getTokenWithChain(ZeroAddress, minReceivedAmt),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, receiverAddress, swapExtraData, metadata } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n }`]: (call: IrCall) => {\n // eslint-disable-next-line prefer-const\n let { fromToken, toToken, amount, metadata, swapExtraData } =\n iface.parseTransaction(call)!.args\n let outAmount = 0n\n if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'performAction(address fromToken, address toToken, uint256 amount, address receiverAddress, bytes32 metadata, bytes swapExtraData)'\n )?.selector\n )\n ) {\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'swap(address,(address,address,address,address,uint256,uint256,uint256),bytes,bytes)'\n )?.selector\n )\n ) {\n const [\n randAddress,\n [token1, token2, randAddress2, recipient, amount1, amount2],\n bytes1,\n bytes2\n ] = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction('transformERC20(address,address,uint256,uint256,(uint32,bytes)[])')!\n .selector\n )\n ) {\n const params = iface.parseTransaction({ data: swapExtraData })!.args\n outAmount = params[3]\n } else if (swapExtraData.startsWith(iface.getFunction('exec')?.selector)) {\n const [, , , , extraData] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n if (extraData.startsWith(iface.getFunction('execute')?.selector)) {\n // eslint-disable-next-line prefer-const\n let [[, , minAmountOut], actions] = iface.parseTransaction({\n data: extraData\n })!.args\n if (!minAmountOut) {\n const uniswapData = actions.find((i: any) =>\n i.startsWith(iface.getFunction('UNISWAPV3')?.selector)\n )\n if (uniswapData) {\n ;[, , , minAmountOut] = iface.parseTransaction({ data: uniswapData })!.args\n }\n }\n outAmount = minAmountOut\n }\n } else if (swapExtraData.startsWith(iface.getFunction('uniswapV3SwapTo')?.selector)) {\n const [address, amount1, amount2] = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = amount2\n } else if (\n swapExtraData.startsWith(\n iface.getFunction(\n 'function swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 guaranteedAmount, uint256 flags, address referrer, bytes permit) desc, (uint256 target, uint256 gasLimit, uint256 value, bytes data)[] calls) payable returns (uint256 returnAmount)'\n )?.selector\n )\n ) {\n const {\n // caller,\n desc: {\n // srcToken,\n // dstToken,\n // srcReceiver,\n // dstReceiver,\n // amount: _amount,\n minReturnAmount\n // guaranteedAmount,\n // flags,\n // referrer,\n // permit\n }\n } = iface.parseTransaction({\n data: swapExtraData\n })!.args\n outAmount = minReturnAmount\n }\n return [\n getAction('Swap'),\n getToken(eToNative(fromToken), amount),\n getLabel(outAmount ? 'for at least' : 'for'),\n getToken(eToNative(toToken), outAmount)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n acrossBridgeData: {\n senderReceiverAddresses: [sender, receiver],\n inputOutputTokens: [inputToken, outputToken],\n outputAmountToChainIdArray: [outputAmount, chainId]\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(inputToken), amount),\n getLabel('to'),\n getTokenWithChain(eToNative(outputToken), outputAmount, chainId),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(sender, receiver)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(uint256 amount, (uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address token, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n connextBridgeData: {\n toChainId,\n dstChainDomain,\n token,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) originQuery, (address swapAdapter, address tokenOut, uint256 minAmountOut, uint256 deadline, bytes rawParams) destinationQuery)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n amount,\n metadata,\n receiverAddress,\n toChainId,\n originQuery: { tokenOut, minAmountOut, deadline },\n destinationQuery // : { swapAdapter, tokenOut, minAmountOut, deadline, rawParams }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(tokenOut), amount),\n getLabel('to'),\n getTokenWithChain(\n eToNative(destinationQuery.tokenOut),\n destinationQuery.minAmountOut,\n toChainId\n ),\n getLabel('on'),\n getChain(toChainId),\n getDeadline(deadline),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction('bridgeERC20To(uint256,bytes32,address,address,uint256,uint32,uint256)')\n ?.selector\n }`]: (call: IrCall) => {\n const [amount, id, recipient, token, chainId, unknown1, fee] =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(eToNative(token), amount),\n getLabel('to'),\n getToken(eToNative(token), amount),\n getLabel('on'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address customBridgeAddress, uint32 l2Gas, uint256 amount, bytes32 metadata, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, customBridgeAddress, l2Gas, amount, metadata, data } =\n iface.parseTransaction(call)!.args\n // @TODO\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('via'),\n getAddressVisualization(customBridgeAddress),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint32 l2Gas, uint256 amount, uint256 toChainId, bytes32 metadata, bytes32 bridgeHash, bytes data)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, l2Gas, amount, toChainId, metadata, bridgeHash, data } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, uint256 gasLimit, uint256 fees, bytes32 metadata, uint256 amount, uint256 toChainId, bytes32 bridgeHash)'\n )?.selector\n }`]: (call: IrCall) => {\n const { receiverAddress, gasLimit, fees, metadata, amount, toChainId, bridgeHash } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeNativeTo(address receiverAddress, address l1bridgeAddr, address relayer, uint256 toChainId, uint256 amount, uint256 amountOutMin, uint256 relayerFee, uint256 deadline, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n l1bridgeAddr,\n toChainId,\n amount,\n amountOutMin,\n relayerFee,\n deadline,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${iface.getFunction('bridgeNativeTo(uint256,address,uint256,bytes32)')?.selector}`]: (\n call: IrCall\n ) => {\n const [amount, recipient, chainId, metadata] = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n [`${\n iface.getFunction(\n 'function bridgeNativeTo(address receiverAddress, address hopAMM, uint256 amount, uint256 toChainId, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n hopAMM,\n amount,\n toChainId,\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(ZeroAddress, amount),\n getLabel('to'),\n getToken(ZeroAddress, amountOutMin),\n getLabel('on'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes swapData, tuple(uint256 toChainId, uint256 slippage, uint256 relayerFee, uint32 dstChainDomain, address receiverAddress, bytes32 metadata, bytes callData, address delegate) connextBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapData,\n connextBridgeData: {\n chainId,\n slippage,\n relayerFee,\n dstChainDomain,\n receiverAddress,\n metadata,\n callData,\n delegate\n }\n } = iface.parseTransaction(call)!.args\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const { fromToken, toToken, amount, swapExtraData } = iface.parseTransaction({\n data: swapData\n })!.args\n let outAmount = 0n\n // @TODO no harcoded sighashes\n if (swapExtraData.startsWith('0x415565b0'))\n outAmount = iface.parseTransaction({ data: swapExtraData })!.args[3]\n\n return [\n getAction('Bridge'),\n getToken(eToNative(fromToken), amount),\n getLabel('to'),\n\n ...(chainId\n ? [\n getTokenWithChain(eToNative(toToken), outAmount, chainId),\n getLabel('on'),\n getChain(chainId)\n ]\n : [getToken(eToNative(toToken), outAmount)]),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n }\n return [\n getAction('Bridge'),\n getLabel('undetected token'),\n getLabel('to'),\n getLabel('undetected token'),\n ...(chainId ? [getLabel('on'), getChain(chainId)] : []),\n ...getRecipientText(accountOp.accountAddr, receiverAddress)\n ].filter((x) => x)\n },\n [`${\n iface.getFunction(\n 'swapAndBridge(uint32 swapId, bytes calldata swapData, tuple (address receiverAddress,address senderAddress,uint256 value,uint256 srcPoolId,uint256 dstPoolId,uint256 minReceivedAmt,uint256 destinationGasLimit,bool isNativeSwapRequired,uint16 stargateDstChainId,uint32 swapId,bytes swapData,bytes32 metadata,bytes destinationPayload) acrossBridgeData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n acrossBridgeData: {\n receiverAddress,\n senderAddress,\n value,\n srcPoolId,\n dstPoolId,\n minReceivedAmt,\n destinationGasLimit,\n isNativeSwapRequired,\n stargateDstChainId,\n swapId: innerSwapId,\n swapData: innerSwapData,\n metadata,\n destinationPayload\n }\n } = iface.parseTransaction(call)!.args\n\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (STARGATE_CHAIN_IDS[stargateDstChainId])\n dstChain.push(getLabel('to'), getChain(STARGATE_CHAIN_IDS[stargateDstChainId]))\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, value))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n ...dstChain,\n ...getRecipientText(senderAddress, receiverAddress)\n ]\n },\n\n [`${\n iface.getFunction(\n 'function swapAndBridge(uint32 swapId, bytes swapData, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n swapId,\n swapData,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData: InnerSwapData,\n swapId: InnerSwapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n const dstChain: HumanizerVisualization[] = []\n const tokensData: HumanizerVisualization[] = []\n if (\n swapData.startsWith(\n iface.getFunction(\n 'performActionWithIn(address fromToken, address toToken, uint256 amount, bytes32 metadata, bytes swapExtraData) payable returns (uint256, address)'\n )?.selector\n )\n ) {\n const {\n fromToken,\n toToken,\n amount,\n metadata: newMeta,\n swapExtraData\n } = iface.parseTransaction({\n ...call,\n data: swapData\n })!.args\n tokensData.push(getToken(fromToken, amount), getLabel('to'), getToken(toToken, minAmountLD))\n }\n\n return [\n getAction('Bridge'),\n ...tokensData,\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n },\n\n [`${\n iface.getFunction(\n 'bridgeERC20To(address receiverAddress, address token, address hopAMM, uint256 amount, uint256 toChainId, (uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 amountOutMinDestination, uint256 deadlineDestination, bytes32 metadata) hopBridgeRequestData)'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n receiverAddress,\n token,\n hopAMM,\n amount,\n toChainId,\n hopBridgeRequestData: {\n bonderFee,\n amountOutMin,\n deadline,\n amountOutMinDestination,\n deadlineDestination,\n metadata\n }\n } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('for at least'),\n getToken(token, amountOutMinDestination),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiverAddress),\n getDeadline(deadline)\n ]\n },\n [`${\n iface.getFunction(\n 'bridgeERC20To(address token, uint256 amount, (uint32 dstEid, uint256 minAmountLD, address stargatePoolAddress, bytes destinationPayload, bytes destinationExtraOptions, (uint256 nativeFee, uint256 lzTokenFee) messagingFee, bytes32 metadata, uint256 toChainId, address receiver, bytes swapData, uint32 swapId, bool isNativeSwapRequired) stargateBridgeData) payable'\n )?.selector\n }`]: (call: IrCall) => {\n const {\n token,\n amount,\n stargateBridgeData: {\n dstEid,\n minAmountLD,\n stargatePoolAddress,\n destinationPayload,\n destinationExtraOptions,\n messagingFee: { nativeFee, lzTokenFee },\n metadata,\n toChainId,\n receiver,\n swapData,\n swapId,\n isNativeSwapRequired\n }\n } = iface.parseTransaction(call)!.args\n return [\n getAction('Bridge'),\n getToken(token, amount),\n getLabel('to'),\n getChain(toChainId),\n ...getRecipientText(accountOp.accountAddr, receiver)\n ]\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n let dataToUse = call.data\n\n if (call.data.startsWith(preControllerIface.getFunction('executeController')!.selector)) {\n const [[controllerId, newData]] = preControllerIface.parseTransaction(call)!.args\n dataToUse = newData\n\n if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeeAndSwapAndBridge')!.selector)\n ) {\n const [\n [\n feesTakerAddress,\n feesToken,\n feesAmount,\n swapRouteId,\n swapData,\n bridgeRouteId,\n bridgeData\n ]\n ] = preControllerIface.decodeFunctionData('takeFeeAndSwapAndBridge', dataToUse)\n const humanizationOfSwap = matcher[swapData.slice(0, 10)]\n ? matcher[swapData.slice(0, 10)]({ ...call, data: swapData })\n : [getAction('Swap')]\n\n let humanizationOfBridge = [getAction('Bridge')]\n\n try {\n const [\n [\n [sender, receiver],\n [tokenIn, tokenOut],\n [outputAmount, chainId],\n [quoteTime, deadline],\n bridgeFee,\n metadata\n ]\n ] = new AbiCoder().decode(\n [\n 'tuple(address[] senderReceiverAddresses, address[] inputOutputTokens, uint256[] outputAmountToChainIdArray, uint32[] quoteAndDeadlineTimeStamps, uint256 bridgeFee, bytes32 metadata)'\n ],\n bridgeData\n )\n\n humanizationOfBridge = [\n getAction('Bridge'),\n getToken(tokenIn, 0n),\n getLabel('for at least'),\n getTokenWithChain(tokenOut, outputAmount, chainId),\n getLabel('to'),\n getChain(chainId),\n ...getRecipientText(accountOp.accountAddr, receiver),\n getDeadline(deadline)\n ]\n } catch (e) {\n console.log(e)\n }\n return {\n ...call,\n fullVisualization: [...humanizationOfSwap, getLabel('and'), ...humanizationOfBridge]\n }\n }\n if (dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndSwap')!.selector)) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, swapRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndSwap', dataToUse)\n dataToUse = swapRequestData\n } else if (\n dataToUse.startsWith(preControllerIface.getFunction('takeFeesAndBridge')!.selector)\n ) {\n const [[feesTakerAddress, feesToken, feesAmount, routeId, bridgeRequestData]] =\n preControllerIface.decodeFunctionData('takeFeesAndBridge', dataToUse)\n dataToUse = bridgeRequestData\n }\n } else {\n dataToUse = `0x${dataToUse.slice(10)}`\n }\n if (matcher[dataToUse.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher[dataToUse.slice(0, 10)]({ ...call, data: dataToUse })\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.js b/dist/src/libs/humanizer/modules/Sushiswap/index.js index 51b212b81..85a907dd7 100644 --- a/dist/src/libs/humanizer/modules/Sushiswap/index.js +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.js @@ -1,3 +1,5 @@ -import { sushiSwapModule } from './sushiSwapModule'; -export default sushiSwapModule; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const sushiSwapModule_1 = require("./sushiSwapModule"); +exports.default = sushiSwapModule_1.sushiSwapModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/index.js.map b/dist/src/libs/humanizer/modules/Sushiswap/index.js.map index 8488b0d58..06fc99efb 100644 --- a/dist/src/libs/humanizer/modules/Sushiswap/index.js.map +++ b/dist/src/libs/humanizer/modules/Sushiswap/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,eAAe,eAAe,CAAA","sourcesContent":["import { sushiSwapModule } from './sushiSwapModule'\n\nexport default sushiSwapModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/index.ts"],"names":[],"mappings":";;AAAA,uDAAmD;AAEnD,kBAAe,iCAAe,CAAA","sourcesContent":["import { sushiSwapModule } from './sushiSwapModule'\n\nexport default sushiSwapModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js index da474231d..30007c99c 100644 --- a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js @@ -1,25 +1,28 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { RouteProcessor } from '../../const/abis'; -import { getAction, getLabel, getRecipientText, getToken } from '../../utils'; -export const sushiSwapModule = (accountOp, irCalls) => { - const routeProcessorIface = new Interface(RouteProcessor); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sushiSwapModule = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const sushiSwapModule = (accountOp, irCalls) => { + const routeProcessorIface = new ethers_1.Interface(abis_1.RouteProcessor); const matcher = { [`${routeProcessorIface.getFunction('processRoute')?.selector}`]: (_accountOp, call) => { const params = routeProcessorIface.parseTransaction(call).args; let { tokenIn, tokenOut /* route */ } = params; const { amountIn, amountOutMin, to } = params; if (tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee') - tokenIn = ZeroAddress; + tokenIn = ethers_1.ZeroAddress; if (tokenOut.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee') - tokenOut = ZeroAddress; + tokenOut = ethers_1.ZeroAddress; return { ...call, fullVisualization: [ - getAction('Swap'), - getToken(tokenIn, amountIn), - getLabel('for'), - getToken(tokenOut, amountOutMin), - ...getRecipientText(accountOp.accountAddr, to) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(tokenIn, amountIn), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(tokenOut, amountOutMin), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, to) ] }; } @@ -32,4 +35,5 @@ export const sushiSwapModule = (accountOp, irCalls) => { }); return newCalls; }; +exports.sushiSwapModule = sushiSwapModule; //# sourceMappingURL=sushiSwapModule.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map index 073441aaf..bae970a42 100644 --- a/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map +++ b/dist/src/libs/humanizer/modules/Sushiswap/sushiSwapModule.js.map @@ -1 +1 @@ -{"version":3,"file":"sushiSwapModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/sushiSwapModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,CAAC,MAAM,eAAe,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC9F,MAAM,mBAAmB,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG;QACd,CAAC,GAAG,mBAAmB,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChE,UAAqB,EACrB,IAAY,EACJ,EAAE;YACV,MAAM,MAAM,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAC/D,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,MAAM,CAAA;YAC9C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,MAAM,CAAA;YAC7C,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACxE,OAAO,GAAG,WAAW,CAAA;YACvB,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACzE,QAAQ,GAAG,WAAW,CAAA;YAExB,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,SAAS,CAAC,MAAM,CAAC;oBACjB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;oBAC3B,QAAQ,CAAC,KAAK,CAAC;oBACf,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;oBAChC,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;iBAC/C;aACF,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;YACnC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACxD;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { RouteProcessor } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getRecipientText, getToken } from '../../utils'\n\nexport const sushiSwapModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const routeProcessorIface = new Interface(RouteProcessor)\n const matcher = {\n [`${routeProcessorIface.getFunction('processRoute')?.selector}`]: (\n _accountOp: AccountOp,\n call: IrCall\n ): IrCall => {\n const params = routeProcessorIface.parseTransaction(call)!.args\n let { tokenIn, tokenOut /* route */ } = params\n const { amountIn, amountOutMin, to } = params\n if (tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenIn = ZeroAddress\n if (tokenOut.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenOut = ZeroAddress\n\n return {\n ...call,\n fullVisualization: [\n getAction('Swap'),\n getToken(tokenIn, amountIn),\n getLabel('for'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accountOp.accountAddr, to)\n ]\n }\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n if (matcher[call.data.slice(0, 10)]) {\n return matcher[call.data.slice(0, 10)](accountOp, call)\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"sushiSwapModule.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Sushiswap/sushiSwapModule.ts"],"names":[],"mappings":";;;AAAA,mCAA+C;AAG/C,2CAAiD;AAEjD,uCAA6E;AAEtE,MAAM,eAAe,GAAwB,CAAC,SAAoB,EAAE,OAAiB,EAAE,EAAE;IAC9F,MAAM,mBAAmB,GAAG,IAAI,kBAAS,CAAC,qBAAc,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG;QACd,CAAC,GAAG,mBAAmB,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChE,UAAqB,EACrB,IAAY,EACJ,EAAE;YACV,MAAM,MAAM,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAC/D,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,MAAM,CAAA;YAC9C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,MAAM,CAAA;YAC7C,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACxE,OAAO,GAAG,oBAAW,CAAA;YACvB,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,4CAA4C;gBACzE,QAAQ,GAAG,oBAAW,CAAA;YAExB,OAAO;gBACL,GAAG,IAAI;gBACP,iBAAiB,EAAE;oBACjB,IAAA,iBAAS,EAAC,MAAM,CAAC;oBACjB,IAAA,gBAAQ,EAAC,OAAO,EAAE,QAAQ,CAAC;oBAC3B,IAAA,gBAAQ,EAAC,KAAK,CAAC;oBACf,IAAA,gBAAQ,EAAC,QAAQ,EAAE,YAAY,CAAC;oBAChC,GAAG,IAAA,wBAAgB,EAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;iBAC/C;aACF,CAAA;QACH,CAAC;KACF,CAAA;IACD,MAAM,QAAQ,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;YACnC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACxD;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAlCY,QAAA,eAAe,mBAkC3B","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { RouteProcessor } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getLabel, getRecipientText, getToken } from '../../utils'\n\nexport const sushiSwapModule: HumanizerCallModule = (accountOp: AccountOp, irCalls: IrCall[]) => {\n const routeProcessorIface = new Interface(RouteProcessor)\n const matcher = {\n [`${routeProcessorIface.getFunction('processRoute')?.selector}`]: (\n _accountOp: AccountOp,\n call: IrCall\n ): IrCall => {\n const params = routeProcessorIface.parseTransaction(call)!.args\n let { tokenIn, tokenOut /* route */ } = params\n const { amountIn, amountOutMin, to } = params\n if (tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenIn = ZeroAddress\n if (tokenOut.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')\n tokenOut = ZeroAddress\n\n return {\n ...call,\n fullVisualization: [\n getAction('Swap'),\n getToken(tokenIn, amountIn),\n getLabel('for'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accountOp.accountAddr, to)\n ]\n }\n }\n }\n const newCalls: IrCall[] = irCalls.map((call: IrCall) => {\n if (matcher[call.data.slice(0, 10)]) {\n return matcher[call.data.slice(0, 10)](accountOp, call)\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.js b/dist/src/libs/humanizer/modules/Tokens/index.js index 32ce3f4dd..3d1275423 100644 --- a/dist/src/libs/humanizer/modules/Tokens/index.js +++ b/dist/src/libs/humanizer/modules/Tokens/index.js @@ -1,3 +1,7 @@ -import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'; -export { genericErc20Humanizer, genericErc721Humanizer }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.genericErc721Humanizer = exports.genericErc20Humanizer = void 0; +const tokens_1 = require("./tokens"); +Object.defineProperty(exports, "genericErc20Humanizer", { enumerable: true, get: function () { return tokens_1.genericErc20Humanizer; } }); +Object.defineProperty(exports, "genericErc721Humanizer", { enumerable: true, get: function () { return tokens_1.genericErc721Humanizer; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/index.js.map b/dist/src/libs/humanizer/modules/Tokens/index.js.map index 79173cfd8..8aace064d 100644 --- a/dist/src/libs/humanizer/modules/Tokens/index.js.map +++ b/dist/src/libs/humanizer/modules/Tokens/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAExE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAA","sourcesContent":["import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'\n\nexport { genericErc20Humanizer, genericErc721Humanizer }\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwE;AAE/D,sGAFA,8BAAqB,OAEA;AAAE,uGAFA,+BAAsB,OAEA","sourcesContent":["import { genericErc20Humanizer, genericErc721Humanizer } from './tokens'\n\nexport { genericErc20Humanizer, genericErc721Humanizer }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.js b/dist/src/libs/humanizer/modules/Tokens/tokens.js index 1f9ca9478..ec99a4ebe 100644 --- a/dist/src/libs/humanizer/modules/Tokens/tokens.js +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.js @@ -1,52 +1,55 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { ERC20, ERC721 } from '../../const/abis'; -import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.genericErc20Humanizer = exports.genericErc721Humanizer = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); // @TODO merge this with the erc20 humanizer module as sometimes // we see no difference between the two -export const genericErc721Humanizer = (accountOp, currentIrCalls) => { - const iface = new Interface(ERC721); +const genericErc721Humanizer = (accountOp, currentIrCalls) => { + const iface = new ethers_1.Interface(abis_1.ERC721); const nftTransferVisualization = (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; return args[0] === accountOp.accountAddr ? [ - getAction('Send'), - getToken(call.to, args[2]), - getLabel('to'), - getAddressVisualization(args[1]) + (0, utils_1.getAction)('Send'), + (0, utils_1.getToken)(call.to, args[2]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[1]) ] : [ - getAction('Transfer'), - getToken(call.to, args[2]), - getLabel('from'), - getAddressVisualization(args[0]), - getLabel('to'), - getAddressVisualization(args[1]) + (0, utils_1.getAction)('Transfer'), + (0, utils_1.getToken)(call.to, args[2]), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(args[0]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[1]) ]; }; const matcher = { [iface.getFunction('approve')?.selector]: (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; - return args[0] === ZeroAddress - ? [getAction('Revoke approval'), getLabel('for'), getToken(call.to, args[1])] + return args[0] === ethers_1.ZeroAddress + ? [(0, utils_1.getAction)('Revoke approval'), (0, utils_1.getLabel)('for'), (0, utils_1.getToken)(call.to, args[1])] : [ - getAction('Grant approval'), - getLabel('for'), - getToken(call.to, args[1]), - getLabel('to'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Grant approval'), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(call.to, args[1]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[0]) ]; }, [iface.getFunction('setApprovalForAll')?.selector]: (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; return args[1] ? [ - getAction('Grant approval'), - getLabel('for all nfts'), - getToken(call.to, args[1]), - getLabel('to'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Grant approval'), + (0, utils_1.getLabel)('for all nfts'), + (0, utils_1.getToken)(call.to, args[1]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[0]) ] - : [getAction('Revoke approval'), getLabel('for all nfts'), getAddressVisualization(args[0])]; + : [(0, utils_1.getAction)('Revoke approval'), (0, utils_1.getLabel)('for all nfts'), (0, utils_1.getAddressVisualization)(args[0])]; }, // not in tests [iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256'])?.selector]: nftTransferVisualization, @@ -67,80 +70,81 @@ export const genericErc721Humanizer = (accountOp, currentIrCalls) => { }); return newCalls; }; -export const genericErc20Humanizer = (accountOp, currentIrCalls) => { - const iface = new Interface(ERC20); +exports.genericErc721Humanizer = genericErc721Humanizer; +const genericErc20Humanizer = (accountOp, currentIrCalls) => { + const iface = new ethers_1.Interface(abis_1.ERC20); const matcher = { [iface.getFunction('approve')?.selector]: (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; return args[1] !== BigInt(0) ? [ - getAction('Grant approval'), - getLabel('for'), - getToken(call.to, args[1]), - getLabel('to'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Grant approval'), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(call.to, args[1]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[0]) ] : [ - getAction('Revoke approval'), - getToken(call.to, args[1]), - getLabel('for'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Revoke approval'), + (0, utils_1.getToken)(call.to, args[1]), + (0, utils_1.getLabel)('for'), + (0, utils_1.getAddressVisualization)(args[0]) ]; }, [iface.getFunction('increaseAllowance')?.selector]: (call) => { const { spender, addedValue } = iface.decodeFunctionData('increaseAllowance', call.data); return [ - getAction('Increase allowance'), - getLabel('of'), - getAddressVisualization(spender), - getLabel('with'), - getToken(call.to, addedValue) + (0, utils_1.getAction)('Increase allowance'), + (0, utils_1.getLabel)('of'), + (0, utils_1.getAddressVisualization)(spender), + (0, utils_1.getLabel)('with'), + (0, utils_1.getToken)(call.to, addedValue) ]; }, [iface.getFunction('decreaseAllowance')?.selector]: (call) => { const { spender, subtractedValue } = iface.decodeFunctionData('decreaseAllowance', call.data); return [ - getAction('Decrease allowance'), - getLabel('of'), - getAddressVisualization(spender), - getLabel('with'), - getToken(call.to, subtractedValue) + (0, utils_1.getAction)('Decrease allowance'), + (0, utils_1.getLabel)('of'), + (0, utils_1.getAddressVisualization)(spender), + (0, utils_1.getLabel)('with'), + (0, utils_1.getToken)(call.to, subtractedValue) ]; }, [iface.getFunction('transfer')?.selector]: (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; return [ - getAction('Send'), - getToken(call.to, args[1]), - getLabel('to'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Send'), + (0, utils_1.getToken)(call.to, args[1]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[0]) ]; }, [iface.getFunction('transferFrom')?.selector]: (call) => { const args = iface.parseTransaction(call)?.args.toArray() || []; if (args[0] === accountOp.accountAddr) { return [ - getAction('Transfer'), - getToken(call.to, args[2]), - getLabel('to'), - getAddressVisualization(args[1]) + (0, utils_1.getAction)('Transfer'), + (0, utils_1.getToken)(call.to, args[2]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[1]) ]; } if (args[1] === accountOp.accountAddr) { return [ - getAction('Take'), - getToken(call.to, args[2]), - getLabel('from'), - getAddressVisualization(args[0]) + (0, utils_1.getAction)('Take'), + (0, utils_1.getToken)(call.to, args[2]), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(args[0]) ]; } return [ - getAction('Move'), - getToken(call.to, args[2]), - getLabel('from'), - getAddressVisualization(args[0]), - getLabel('to'), - getAddressVisualization(args[1]) + (0, utils_1.getAction)('Move'), + (0, utils_1.getToken)(call.to, args[2]), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(args[0]), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(args[1]) ]; } }; @@ -155,4 +159,5 @@ export const genericErc20Humanizer = (accountOp, currentIrCalls) => { }); return newCalls; }; +exports.genericErc20Humanizer = genericErc20Humanizer; //# sourceMappingURL=tokens.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Tokens/tokens.js.map b/dist/src/libs/humanizer/modules/Tokens/tokens.js.map index 76bc5f292..db42bc989 100644 --- a/dist/src/libs/humanizer/modules/Tokens/tokens.js.map +++ b/dist/src/libs/humanizer/modules/Tokens/tokens.js.map @@ -1 +1 @@ -{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { ERC20, ERC721 } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\n// @TODO merge this with the erc20 humanizer module as sometimes\n// we see no difference between the two\nexport const genericErc721Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC721)\n const nftTransferVisualization = (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === accountOp.accountAddr\n ? [\n getAction('Send'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n : [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === ZeroAddress\n ? [getAction('Revoke approval'), getLabel('for'), getToken(call.to, args[1])]\n : [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('setApprovalForAll')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1]\n ? [\n getAction('Grant approval'),\n getLabel('for all nfts'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [getAction('Revoke approval'), getLabel('for all nfts'), getAddressVisualization(args[0])]\n },\n // not in tests\n [iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization,\n // [`${\n // iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256', 'bytes'])\n // ?.selector\n // }`]: nftTransferVisualization,\n [iface.getFunction('transferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization\n }\n\n const newCalls = currentIrCalls.map((call) => {\n // could do additional check if it is actually NFT contract\n return matcher[call.data.substring(0, 10)]\n ? {\n ...call,\n fullVisualization: matcher[call.data.substring(0, 10)](call)\n }\n : call\n })\n return newCalls\n}\n\nexport const genericErc20Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC20)\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1] !== BigInt(0)\n ? [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [\n getAction('Revoke approval'),\n getToken(call.to, args[1]),\n getLabel('for'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('increaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, addedValue } = iface.decodeFunctionData('increaseAllowance', call.data)\n\n return [\n getAction('Increase allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, addedValue)\n ]\n },\n\n [iface.getFunction('decreaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, subtractedValue } = iface.decodeFunctionData('decreaseAllowance', call.data)\n\n return [\n getAction('Decrease allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, subtractedValue)\n ]\n },\n [iface.getFunction('transfer')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return [\n getAction('Send'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('transferFrom')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n if (args[0] === accountOp.accountAddr) {\n return [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n if (args[1] === accountOp.accountAddr) {\n return [\n getAction('Take'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0])\n ]\n }\n return [\n getAction('Move'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n }\n const newCalls = currentIrCalls.map((call) => {\n const sigHash = call.data.substring(0, 10)\n return matcher[sigHash]\n ? {\n ...call,\n fullVisualization: matcher[sigHash](call)\n }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Tokens/tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { ERC20, ERC721 } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\n// @TODO merge this with the erc20 humanizer module as sometimes\n// we see no difference between the two\nexport const genericErc721Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC721)\n const nftTransferVisualization = (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === accountOp.accountAddr\n ? [\n getAction('Send'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n : [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[0] === ZeroAddress\n ? [getAction('Revoke approval'), getLabel('for'), getToken(call.to, args[1])]\n : [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('setApprovalForAll')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1]\n ? [\n getAction('Grant approval'),\n getLabel('for all nfts'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [getAction('Revoke approval'), getLabel('for all nfts'), getAddressVisualization(args[0])]\n },\n // not in tests\n [iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization,\n // [`${\n // iface.getFunction('safeTransferFrom', ['address', 'address', 'uint256', 'bytes'])\n // ?.selector\n // }`]: nftTransferVisualization,\n [iface.getFunction('transferFrom', ['address', 'address', 'uint256'])?.selector!]:\n nftTransferVisualization\n }\n\n const newCalls = currentIrCalls.map((call) => {\n // could do additional check if it is actually NFT contract\n return matcher[call.data.substring(0, 10)]\n ? {\n ...call,\n fullVisualization: matcher[call.data.substring(0, 10)](call)\n }\n : call\n })\n return newCalls\n}\n\nexport const genericErc20Humanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const iface = new Interface(ERC20)\n const matcher = {\n [iface.getFunction('approve')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return args[1] !== BigInt(0)\n ? [\n getAction('Grant approval'),\n getLabel('for'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n : [\n getAction('Revoke approval'),\n getToken(call.to, args[1]),\n getLabel('for'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('increaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, addedValue } = iface.decodeFunctionData('increaseAllowance', call.data)\n\n return [\n getAction('Increase allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, addedValue)\n ]\n },\n\n [iface.getFunction('decreaseAllowance')?.selector!]: (call: IrCall) => {\n const { spender, subtractedValue } = iface.decodeFunctionData('decreaseAllowance', call.data)\n\n return [\n getAction('Decrease allowance'),\n getLabel('of'),\n getAddressVisualization(spender),\n getLabel('with'),\n getToken(call.to, subtractedValue)\n ]\n },\n [iface.getFunction('transfer')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n return [\n getAction('Send'),\n getToken(call.to, args[1]),\n getLabel('to'),\n getAddressVisualization(args[0])\n ]\n },\n [iface.getFunction('transferFrom')?.selector!]: (call: IrCall) => {\n const args = iface.parseTransaction(call)?.args.toArray() || []\n if (args[0] === accountOp.accountAddr) {\n return [\n getAction('Transfer'),\n getToken(call.to, args[2]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n if (args[1] === accountOp.accountAddr) {\n return [\n getAction('Take'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0])\n ]\n }\n return [\n getAction('Move'),\n getToken(call.to, args[2]),\n getLabel('from'),\n getAddressVisualization(args[0]),\n getLabel('to'),\n getAddressVisualization(args[1])\n ]\n }\n }\n const newCalls = currentIrCalls.map((call) => {\n const sigHash = call.data.substring(0, 10)\n return matcher[sigHash]\n ? {\n ...call,\n fullVisualization: matcher[sigHash](call)\n }\n : call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.js b/dist/src/libs/humanizer/modules/TraderJoe/index.js index af1eb65b2..67f4c13c9 100644 --- a/dist/src/libs/humanizer/modules/TraderJoe/index.js +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.js @@ -1,25 +1,27 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { JoeRouter } from '../../const/abis'; -import { getAction, getDeadline, getLabel, getRecipientText, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); // @TODO limit order manager // @TODO those use AVAX in the function method // https://snowtrace.io/address/0x60aE616a2155Ee3d9A68541Ba4544862310933d4 // https://arbiscan.io/address/0xbeE5c10Cf6E4F68f831E11C1D9E59B43560B3642 // https://arbiscan.io/address/0x7BFd7192E76D950832c77BB412aaE841049D8D9B const traderJoeModule = (accOp, calls) => { - const iface = new Interface(JoeRouter); + const iface = new ethers_1.Interface(abis_1.JoeRouter); const matcher = { [iface.getFunction('swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { // eslint-disable-next-line @typescript-eslint/naming-convention const { amountOutMin, path, to, deadline } = iface.parseTransaction(call).args; const tokenOut = path[2][path[2].length - 1]; return [ - getAction('Swap'), - getToken(ZeroAddress, call.value), - getLabel('for at least'), - getToken(tokenOut, amountOutMin), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(tokenOut, amountOutMin), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { @@ -27,60 +29,60 @@ const traderJoeModule = (accOp, calls) => { const { amountOut, path, to, deadline } = iface.parseTransaction(call).args; const tokenOut = path[2][path[2].length - 1]; return [ - getAction('Swap up to'), - getToken(ZeroAddress, call.value), - getLabel('for'), - getToken(tokenOut, amountOut), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(tokenOut, amountOut), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { // eslint-disable-next-line @typescript-eslint/naming-convention const { amountIn, amountOutMinNATIVE, path, to, deadline } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(path[2][0], amountIn), - getLabel('for at least'), - getToken(ZeroAddress, amountOutMinNATIVE), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[2][0], amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountOutMinNATIVE), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { // eslint-disable-next-line @typescript-eslint/naming-convention const { amountNATIVEOut, amountInMax, path, to, deadline } = iface.parseTransaction(call).args; return [ - getAction('Swap up to'), - getToken(path[2][0], amountInMax), - getLabel('for'), - getToken(ZeroAddress, amountNATIVEOut), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[2][0], amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountNATIVEOut), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { // eslint-disable-next-line @typescript-eslint/naming-convention const { amountIn, amountOutMin, path, to, deadline } = iface.parseTransaction(call).args; return [ - getAction('Swap'), - getToken(path[2][0], amountIn), - getLabel('for at least'), - getToken(path[2][path[2].length - 1], amountOutMin), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[2][0], amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[2][path[2].length - 1], amountOutMin), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)')?.selector]: (call) => { // eslint-disable-next-line @typescript-eslint/naming-convention const { amountOut, amountInMax, path, to, deadline } = iface.parseTransaction(call).args; return [ - getAction('Swap up to'), - getToken(path[2][0], amountInMax), - getLabel('for'), - getToken(path[2][path[2].length - 1], amountOut), - ...getRecipientText(accOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[2][0], amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[2][path[2].length - 1], amountOut), + ...(0, utils_1.getRecipientText)(accOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; } }; @@ -91,5 +93,5 @@ const traderJoeModule = (accOp, calls) => { }); return newCalls; }; -export default traderJoeModule; +exports.default = traderJoeModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/TraderJoe/index.js.map b/dist/src/libs/humanizer/modules/TraderJoe/index.js.map index 5f07cff4f..62b527130 100644 --- a/dist/src/libs/humanizer/modules/TraderJoe/index.js.map +++ b/dist/src/libs/humanizer/modules/TraderJoe/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/TraderJoe/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { JoeRouter } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getRecipientText, getToken } from '../../utils'\n\n// @TODO limit order manager\n// @TODO those use AVAX in the function method\n// https://snowtrace.io/address/0x60aE616a2155Ee3d9A68541Ba4544862310933d4\n// https://arbiscan.io/address/0xbeE5c10Cf6E4F68f831E11C1D9E59B43560B3642\n// https://arbiscan.io/address/0x7BFd7192E76D950832c77BB412aaE841049D8D9B\nconst traderJoeModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(JoeRouter)\n const matcher = {\n [iface.getFunction(\n 'swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, call.value),\n getLabel('for at least'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, call.value),\n getLabel('for'),\n getToken(tokenOut, amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMinNATIVE, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMinNATIVE),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountNATIVEOut, amountInMax, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountNATIVEOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(path[2][path[2].length - 1], amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, amountInMax, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(path[2][path[2].length - 1], amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default traderJoeModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/TraderJoe/index.ts"],"names":[],"mappings":";;AAAA,mCAA+C;AAG/C,2CAA4C;AAE5C,uCAA0F;AAE1F,4BAA4B;AAC5B,8CAA8C;AAC9C,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,eAAe,GAAwB,CAAC,KAAgB,EAAE,KAAe,EAAE,EAAE;IACjF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,gBAAS,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC,WAAW,CAChB,+GAA+G,CAChH,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC5C,OAAO;gBACL,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAA,gBAAQ,EAAC,cAAc,CAAC;gBACxB,IAAA,gBAAQ,EAAC,QAAQ,EAAE,YAAY,CAAC;gBAChC,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,iHAAiH,CAClH,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC5C,OAAO;gBACL,IAAA,iBAAS,EAAC,YAAY,CAAC;gBACvB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,QAAQ,EAAE,SAAS,CAAC;gBAC7B,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,2IAA2I,CAC5I,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GACxD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,OAAO;gBACL,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;gBAC9B,IAAA,gBAAQ,EAAC,cAAc,CAAC;gBACxB,IAAA,gBAAQ,EAAC,oBAAW,EAAE,kBAAkB,CAAC;gBACzC,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,2IAA2I,CAC5I,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GACxD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACpC,OAAO;gBACL,IAAA,iBAAS,EAAC,YAAY,CAAC;gBACvB,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;gBACjC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,oBAAW,EAAE,eAAe,CAAC;gBACtC,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,qIAAqI,CACtI,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACzF,OAAO;gBACL,IAAA,iBAAS,EAAC,MAAM,CAAC;gBACjB,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;gBAC9B,IAAA,gBAAQ,EAAC,cAAc,CAAC;gBACxB,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC;gBACnD,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAChB,qIAAqI,CACtI,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,gEAAgE;YAChE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACzF,OAAO;gBACL,IAAA,iBAAS,EAAC,YAAY,CAAC;gBACvB,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;gBACjC,IAAA,gBAAQ,EAAC,KAAK,CAAC;gBACf,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;gBAChD,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1C,IAAA,mBAAW,EAAC,QAAQ,CAAC;aACtB,CAAA;QACH,CAAC;KACF,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,kBAAe,eAAe,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { JoeRouter } from '../../const/abis'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getRecipientText, getToken } from '../../utils'\n\n// @TODO limit order manager\n// @TODO those use AVAX in the function method\n// https://snowtrace.io/address/0x60aE616a2155Ee3d9A68541Ba4544862310933d4\n// https://arbiscan.io/address/0xbeE5c10Cf6E4F68f831E11C1D9E59B43560B3642\n// https://arbiscan.io/address/0x7BFd7192E76D950832c77BB412aaE841049D8D9B\nconst traderJoeModule: HumanizerCallModule = (accOp: AccountOp, calls: IrCall[]) => {\n const iface = new Interface(JoeRouter)\n const matcher = {\n [iface.getFunction(\n 'swapExactNATIVEForTokens(uint256 amountOutMin,(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, call.value),\n getLabel('for at least'),\n getToken(tokenOut, amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapNATIVEForExactTokens(uint256 amountOut,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, path, to, deadline } = iface.parseTransaction(call)!.args\n const tokenOut = path[2][path[2].length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, call.value),\n getLabel('for'),\n getToken(tokenOut, amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForNATIVE(uint256 amountIn,uint256 amountOutMinNATIVE,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMinNATIVE, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMinNATIVE),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactNATIVE(uint256 amountNATIVEOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountNATIVEOut, amountInMax, path, to, deadline } =\n iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountNATIVEOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapExactTokensForTokens(uint256 amountIn,uint256 amountOutMin,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountIn, amountOutMin, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap'),\n getToken(path[2][0], amountIn),\n getLabel('for at least'),\n getToken(path[2][path[2].length - 1], amountOutMin),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction(\n 'swapTokensForExactTokens(uint256 amountOut,uint256 amountInMax,tuple(uint256[],uint8[],address[]) path,address to,uint256 deadline)'\n )?.selector!]: (call: IrCall) => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { amountOut, amountInMax, path, to, deadline } = iface.parseTransaction(call)!.args\n return [\n getAction('Swap up to'),\n getToken(path[2][0], amountInMax),\n getLabel('for'),\n getToken(path[2][path[2].length - 1], amountOut),\n ...getRecipientText(accOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n }\n\n const newCalls = calls.map((call) => {\n if (call.fullVisualization || !matcher[call.data.slice(0, 10)]) return call\n return { ...call, fullVisualization: matcher[call.data.slice(0, 10)](call) }\n })\n\n return newCalls\n}\n\nexport default traderJoeModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.js b/dist/src/libs/humanizer/modules/Uniswap/Commands.js index 0b947160b..9129a5327 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/Commands.js +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.js @@ -1,4 +1,7 @@ -export const COMMANDS = { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.COMMANDS_DESCRIPTIONS = exports.COMMANDS = void 0; +exports.COMMANDS = { FLAG_ALLOW_REVERT: '0x80', COMMAND_TYPE_MASK: '0x3f', V3_SWAP_EXACT_IN: '0x00', @@ -33,7 +36,7 @@ export const COMMANDS = { * ABI-like structure for each uniswap action * https://docs.uniswap.org/contracts/universal-router/technical-reference */ -export const COMMANDS_DESCRIPTIONS = { +exports.COMMANDS_DESCRIPTIONS = { V3_SWAP_EXACT_IN: { command: '0x00', inputsDetails: [ diff --git a/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map b/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map index e9493084e..d4af37dd4 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/Commands.js.map @@ -1 +1 @@ -{"version":3,"file":"Commands.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/Commands.ts"],"names":[],"mappings":"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","sourcesContent":["export const COMMANDS = {\n FLAG_ALLOW_REVERT: '0x80',\n COMMAND_TYPE_MASK: '0x3f',\n V3_SWAP_EXACT_IN: '0x00',\n V3_SWAP_EXACT_OUT: '0x01',\n PERMIT2_TRANSFER_FROM: '0x02',\n // PERMIT2_PERMIT_BATCH: '0x03',\n SWEEP: '0x04',\n TRANSFER: '0x05',\n PAY_PORTION: '0x06',\n V2_SWAP_EXACT_IN: '0x08',\n V2_SWAP_EXACT_OUT: '0x09',\n PERMIT2_PERMIT: '0x0a',\n WRAP_ETH: '0x0b',\n UNWRAP_WETH: '0x0c',\n // PERMIT2_TRANSFER_FROM_BATCH: '0x0d',\n SEAPORT: '0x10',\n // LOOKS_RARE_721: '0x11',\n NFTX: '0x12',\n CRYPTOPUNKS: '0x13',\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: '0x15',\n OWNER_CHECK_1155: '0x16',\n SWEEP_ERC721: '0x17',\n // X2Y2_721: '0x18',\n SUDOSWAP: '0x19',\n NFT20: '0x1a'\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n // SWEEP_ERC1155: '0x1d'\n}\n\n/**\n * ABI-like structure for each uniswap action\n * https://docs.uniswap.org/contracts/universal-router/technical-reference\n */\nexport const COMMANDS_DESCRIPTIONS = {\n V3_SWAP_EXACT_IN: {\n command: '0x00',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V3_SWAP_EXACT_OUT: {\n command: '0x01',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_TRANSFER_FROM: {\n command: '0x02',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amount' }\n ]\n },\n // PERMIT2_PERMIT_BATCH\n SWEEP: {\n command: '0x04',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amountMin' }\n ]\n },\n TRANSFER: {\n command: '0x05',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n PAY_PORTION: {\n command: '0x06',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'bips' }\n ]\n },\n V2_SWAP_EXACT_IN: {\n command: '0x08',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V2_SWAP_EXACT_OUT: {\n command: '0x09',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_PERMIT: {\n command: '0x0a',\n inputsDetails: [\n {\n name: 'permit',\n type: 'tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline)'\n },\n { name: 'signature', type: 'bytes' }\n ]\n },\n WRAP_ETH: {\n command: '0x0b',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n UNWRAP_WETH: {\n command: '0x0c',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n SEAPORT: {\n command: '0x10',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFTX: {\n command: '0x12',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n CRYPTOPUNKS: {\n command: '0x13',\n inputsDetails: [\n { type: 'uint256', name: 'punkId' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: {\n command: '0x15',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' }\n ]\n },\n OWNER_CHECK_1155: {\n command: '0x16',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'minBalance' }\n ]\n },\n SWEEP_ERC721: {\n command: '0x17',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' }\n ]\n },\n // X2Y2_721: '0x18',\n SUDOSWAP: {\n command: '0x19',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFT20: {\n command: '0x1a',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n SWEEP_ERC1155: {\n command: '0x1d',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'amount' }\n ]\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"Commands.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/Commands.ts"],"names":[],"mappings":"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","sourcesContent":["export const COMMANDS = {\n FLAG_ALLOW_REVERT: '0x80',\n COMMAND_TYPE_MASK: '0x3f',\n V3_SWAP_EXACT_IN: '0x00',\n V3_SWAP_EXACT_OUT: '0x01',\n PERMIT2_TRANSFER_FROM: '0x02',\n // PERMIT2_PERMIT_BATCH: '0x03',\n SWEEP: '0x04',\n TRANSFER: '0x05',\n PAY_PORTION: '0x06',\n V2_SWAP_EXACT_IN: '0x08',\n V2_SWAP_EXACT_OUT: '0x09',\n PERMIT2_PERMIT: '0x0a',\n WRAP_ETH: '0x0b',\n UNWRAP_WETH: '0x0c',\n // PERMIT2_TRANSFER_FROM_BATCH: '0x0d',\n SEAPORT: '0x10',\n // LOOKS_RARE_721: '0x11',\n NFTX: '0x12',\n CRYPTOPUNKS: '0x13',\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: '0x15',\n OWNER_CHECK_1155: '0x16',\n SWEEP_ERC721: '0x17',\n // X2Y2_721: '0x18',\n SUDOSWAP: '0x19',\n NFT20: '0x1a'\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n // SWEEP_ERC1155: '0x1d'\n}\n\n/**\n * ABI-like structure for each uniswap action\n * https://docs.uniswap.org/contracts/universal-router/technical-reference\n */\nexport const COMMANDS_DESCRIPTIONS = {\n V3_SWAP_EXACT_IN: {\n command: '0x00',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V3_SWAP_EXACT_OUT: {\n command: '0x01',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'bytes', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_TRANSFER_FROM: {\n command: '0x02',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amount' }\n ]\n },\n // PERMIT2_PERMIT_BATCH\n SWEEP: {\n command: '0x04',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint160', name: 'amountMin' }\n ]\n },\n TRANSFER: {\n command: '0x05',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n PAY_PORTION: {\n command: '0x06',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'bips' }\n ]\n },\n V2_SWAP_EXACT_IN: {\n command: '0x08',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOutMin' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n V2_SWAP_EXACT_OUT: {\n command: '0x09',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'uint256', name: 'amountInMax' },\n { type: 'address[]', name: 'path' },\n { type: 'bool', name: 'payerIsUser' }\n ]\n },\n PERMIT2_PERMIT: {\n command: '0x0a',\n inputsDetails: [\n {\n name: 'permit',\n type: 'tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline)'\n },\n { name: 'signature', type: 'bytes' }\n ]\n },\n WRAP_ETH: {\n command: '0x0b',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n UNWRAP_WETH: {\n command: '0x0c',\n inputsDetails: [\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'amountMin' }\n ]\n },\n SEAPORT: {\n command: '0x10',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFTX: {\n command: '0x12',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n CRYPTOPUNKS: {\n command: '0x13',\n inputsDetails: [\n { type: 'uint256', name: 'punkId' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'value' }\n ]\n },\n // LOOKS_RARE_1155: '0x14',\n OWNER_CHECK_721: {\n command: '0x15',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' }\n ]\n },\n OWNER_CHECK_1155: {\n command: '0x16',\n inputsDetails: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'minBalance' }\n ]\n },\n SWEEP_ERC721: {\n command: '0x17',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' }\n ]\n },\n // X2Y2_721: '0x18',\n SUDOSWAP: {\n command: '0x19',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n NFT20: {\n command: '0x1a',\n inputsDetails: [{ type: 'uint256', name: 'value' }]\n },\n // X2Y2_1155: '0x1b',\n // FOUNDATION: '0x1c',\n SWEEP_ERC1155: {\n command: '0x1d',\n inputsDetails: [\n { type: 'address', name: 'token' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'id' },\n { type: 'uint256', name: 'amount' }\n ]\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.js b/dist/src/libs/humanizer/modules/Uniswap/index.js index 04849a64e..c7f13a660 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/index.js +++ b/dist/src/libs/humanizer/modules/Uniswap/index.js @@ -1,11 +1,14 @@ -import { uniUniversalRouter } from './uniUniversalRouter'; -import { uniV2Mapping } from './uniV2'; -import { uniV32Mapping, uniV3Mapping } from './uniV3'; -export const uniswapHumanizer = (accountOp, currentIrCalls) => { - const uniV2MappingObj = uniV2Mapping(); - const uniV3MappingObj = uniV3Mapping(); - const uniV32MappingObj = uniV32Mapping(); - const uniUniversalRouterObj = uniUniversalRouter(); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniswapHumanizer = void 0; +const uniUniversalRouter_1 = require("./uniUniversalRouter"); +const uniV2_1 = require("./uniV2"); +const uniV3_1 = require("./uniV3"); +const uniswapHumanizer = (accountOp, currentIrCalls) => { + const uniV2MappingObj = (0, uniV2_1.uniV2Mapping)(); + const uniV3MappingObj = (0, uniV3_1.uniV3Mapping)(); + const uniV32MappingObj = (0, uniV3_1.uniV32Mapping)(); + const uniUniversalRouterObj = (0, uniUniversalRouter_1.uniUniversalRouter)(); const matcher = { '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D': uniV2MappingObj, '0xe592427a0aece92de3edee1f18e0157c05861564': uniV3MappingObj, @@ -49,4 +52,5 @@ export const uniswapHumanizer = (accountOp, currentIrCalls) => { }); return newCalls; }; +exports.uniswapHumanizer = uniswapHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/index.js.map b/dist/src/libs/humanizer/modules/Uniswap/index.js.map index 05f608208..8f8360aa8 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/index.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CACnD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,eAAe,GAAG,YAAY,EAAE,CAAA;IACtC,MAAM,eAAe,GAAG,YAAY,EAAE,CAAA;IACtC,MAAM,gBAAgB,GAAG,aAAa,EAAE,CAAA;IACxC,MAAM,qBAAqB,GAAG,kBAAkB,EAAE,CAAA;IAElD,MAAM,OAAO,GAET;QACF,4CAA4C,EAAE,eAAe;QAC7D,4CAA4C,EAAE,eAAe;QAC7D,uDAAuD;QACvD,4CAA4C,EAAE,gBAAgB;QAC9D,kGAAkG;QAClG,4CAA4C,EAAE,gBAAgB;QAC9D,qCAAqC;QACrC,4CAA4C,EAAE,qBAAqB;QACnE,2HAA2H;QAC3H,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,UAAU;QACV,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,YAAY;QACZ,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;KACpE,CAAA;IACD,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAChG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,cAAc,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1C,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,IAAI,mBAAmB,IAAI,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE;YACzD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACvE,oCAAoC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;YAE7C,wCAAwC;SACzC;aAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;SAC9C;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACpB;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { uniUniversalRouter } from './uniUniversalRouter'\nimport { uniV2Mapping } from './uniV2'\nimport { uniV32Mapping, uniV3Mapping } from './uniV3'\n\nexport const uniswapHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const uniV2MappingObj = uniV2Mapping()\n const uniV3MappingObj = uniV3Mapping()\n const uniV32MappingObj = uniV32Mapping()\n const uniUniversalRouterObj = uniUniversalRouter()\n\n const matcher: {\n [address: string]: HumanizerUniMatcher\n } = {\n '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D': uniV2MappingObj,\n '0xe592427a0aece92de3edee1f18e0157c05861564': uniV3MappingObj,\n // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address\n '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45': uniV32MappingObj,\n // same as above line but on on base (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x2626664c2603336e57b271c5c0b26f421741e481': uniV32MappingObj,\n // empirical address from wallet txns\n '0x4c60051384bd2d3c01bfc845cf5f4b44bcbe9de5': uniUniversalRouterObj,\n // same as above but with address from official documentation (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad': uniUniversalRouterObj,\n // optimism\n '0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4': uniUniversalRouterObj,\n '0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8': uniUniversalRouterObj,\n // polygon\n '0x643770e279d5d0733f21d6dc03a8efbabf3255b4': uniUniversalRouterObj,\n '0xec7be89e9d109e7e3fec59c222cf297125fefda2': uniUniversalRouterObj,\n // avalanche\n '0x82635af6146972cd6601161c4472ffe97237d292': uniUniversalRouterObj,\n // arbitrum\n '0x5e325eda8064b456f4781070c0738d849c824258': uniUniversalRouterObj\n }\n const fallbackFlatUniswapsMather = Object.values(matcher).reduce((a, b) => ({ ...a, ...b }), {})\n const newCalls: IrCall[] = []\n currentIrCalls.forEach((call: IrCall) => {\n const sigHash = call.data.substring(0, 10)\n\n const knownUniswapVersion = matcher[call.to.toLowerCase()]\n if (knownUniswapVersion && knownUniswapVersion?.[sigHash]) {\n const fullVisualization = knownUniswapVersion[sigHash](accountOp, call)\n // @TODO add visualization squashing\n newCalls.push({ ...call, fullVisualization })\n\n // if unknown address, but known sighash\n } else if (fallbackFlatUniswapsMather[sigHash]) {\n const fullVisualization = fallbackFlatUniswapsMather[sigHash](accountOp, call)\n newCalls.push({ ...call, fullVisualization })\n } else {\n newCalls.push(call)\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/index.ts"],"names":[],"mappings":";;;AAGA,6DAAyD;AACzD,mCAAsC;AACtC,mCAAqD;AAE9C,MAAM,gBAAgB,GAAwB,CACnD,SAAoB,EACpB,cAAwB,EACxB,EAAE;IACF,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAA;IACtC,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAA;IACtC,MAAM,gBAAgB,GAAG,IAAA,qBAAa,GAAE,CAAA;IACxC,MAAM,qBAAqB,GAAG,IAAA,uCAAkB,GAAE,CAAA;IAElD,MAAM,OAAO,GAET;QACF,4CAA4C,EAAE,eAAe;QAC7D,4CAA4C,EAAE,eAAe;QAC7D,uDAAuD;QACvD,4CAA4C,EAAE,gBAAgB;QAC9D,kGAAkG;QAClG,4CAA4C,EAAE,gBAAgB;QAC9D,qCAAqC;QACrC,4CAA4C,EAAE,qBAAqB;QACnE,2HAA2H;QAC3H,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,UAAU;QACV,4CAA4C,EAAE,qBAAqB;QACnE,4CAA4C,EAAE,qBAAqB;QACnE,YAAY;QACZ,4CAA4C,EAAE,qBAAqB;QACnE,WAAW;QACX,4CAA4C,EAAE,qBAAqB;KACpE,CAAA;IACD,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAChG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,cAAc,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1C,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,IAAI,mBAAmB,IAAI,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE;YACzD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACvE,oCAAoC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;YAE7C,wCAAwC;SACzC;aAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;SAC9C;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACpB;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AArDY,QAAA,gBAAgB,oBAqD5B","sourcesContent":["import { AccountOp } from '../../../accountOp/accountOp'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { uniUniversalRouter } from './uniUniversalRouter'\nimport { uniV2Mapping } from './uniV2'\nimport { uniV32Mapping, uniV3Mapping } from './uniV3'\n\nexport const uniswapHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n currentIrCalls: IrCall[]\n) => {\n const uniV2MappingObj = uniV2Mapping()\n const uniV3MappingObj = uniV3Mapping()\n const uniV32MappingObj = uniV32Mapping()\n const uniUniversalRouterObj = uniUniversalRouter()\n\n const matcher: {\n [address: string]: HumanizerUniMatcher\n } = {\n '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D': uniV2MappingObj,\n '0xe592427a0aece92de3edee1f18e0157c05861564': uniV3MappingObj,\n // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address\n '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45': uniV32MappingObj,\n // same as above line but on on base (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x2626664c2603336e57b271c5c0b26f421741e481': uniV32MappingObj,\n // empirical address from wallet txns\n '0x4c60051384bd2d3c01bfc845cf5f4b44bcbe9de5': uniUniversalRouterObj,\n // same as above but with address from official documentation (https://docs.uniswap.org/contracts/v3/reference/deployments)\n '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad': uniUniversalRouterObj,\n // optimism\n '0xec8b0f7ffe3ae75d7ffab09429e3675bb63503e4': uniUniversalRouterObj,\n '0xcb1355ff08ab38bbce60111f1bb2b784be25d7e8': uniUniversalRouterObj,\n // polygon\n '0x643770e279d5d0733f21d6dc03a8efbabf3255b4': uniUniversalRouterObj,\n '0xec7be89e9d109e7e3fec59c222cf297125fefda2': uniUniversalRouterObj,\n // avalanche\n '0x82635af6146972cd6601161c4472ffe97237d292': uniUniversalRouterObj,\n // arbitrum\n '0x5e325eda8064b456f4781070c0738d849c824258': uniUniversalRouterObj\n }\n const fallbackFlatUniswapsMather = Object.values(matcher).reduce((a, b) => ({ ...a, ...b }), {})\n const newCalls: IrCall[] = []\n currentIrCalls.forEach((call: IrCall) => {\n const sigHash = call.data.substring(0, 10)\n\n const knownUniswapVersion = matcher[call.to.toLowerCase()]\n if (knownUniswapVersion && knownUniswapVersion?.[sigHash]) {\n const fullVisualization = knownUniswapVersion[sigHash](accountOp, call)\n // @TODO add visualization squashing\n newCalls.push({ ...call, fullVisualization })\n\n // if unknown address, but known sighash\n } else if (fallbackFlatUniswapsMather[sigHash]) {\n const fullVisualization = fallbackFlatUniswapsMather[sigHash](accountOp, call)\n newCalls.push({ ...call, fullVisualization })\n } else {\n newCalls.push(call)\n }\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/interfaces.js b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js index c30bb68c1..db9191150 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/interfaces.js +++ b/dist/src/libs/humanizer/modules/Uniswap/interfaces.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js index 403d4fb3a..ba085f4fa 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js @@ -1,9 +1,12 @@ -import { AbiCoder, Interface, ZeroAddress } from 'ethers'; -import { UniswapUniversalRouter } from '../../const/abis'; -import { getAction, getAddressVisualization, getDeadline, getLabel, getToken, getUnknownVisualization, getWrapping } from '../../utils'; -import { COMMANDS, COMMANDS_DESCRIPTIONS } from './Commands'; -import { getUniRecipientText, parsePath, uniReduce } from './utils'; -const coder = new AbiCoder(); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniUniversalRouter = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const Commands_1 = require("./Commands"); +const utils_2 = require("./utils"); +const coder = new ethers_1.AbiCoder(); const extractParams = (inputsDetails, input) => { const types = inputsDetails.map((i) => i.type); const decodedInput = coder.decode(types, input); @@ -28,8 +31,8 @@ function parseCommands(commands) { } return res; } -export const uniUniversalRouter = () => { - const ifaceUniversalRouter = new Interface(UniswapUniversalRouter); +const uniUniversalRouter = () => { + const ifaceUniversalRouter = new ethers_1.Interface(abis_1.UniswapUniversalRouter); return { [`${ifaceUniversalRouter.getFunction('execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)')?.selector}`]: (accountOp, call) => { const [commands, inputs, deadline] = ifaceUniversalRouter.parseTransaction(call)?.args || []; @@ -37,48 +40,48 @@ export const uniUniversalRouter = () => { const parsed = []; parsedCommands ? parsedCommands.forEach((command, index) => { - if (command === COMMANDS.V3_SWAP_EXACT_IN) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN; + if (command === Commands_1.COMMANDS.V3_SWAP_EXACT_IN) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN; const params = extractParams(inputsDetails, inputs[index]); - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); parsed.push([ - getAction('Swap'), - getToken(path[0], params.amountIn), - getLabel('for at least'), - getToken(path[path.length - 1], params.amountOutMin), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[path.length - 1], params.amountOutMin), + (0, utils_1.getDeadline)(deadline) ]); } - else if (command === COMMANDS.V3_SWAP_EXACT_OUT) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT; + else if (command === Commands_1.COMMANDS.V3_SWAP_EXACT_OUT) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT; const params = extractParams(inputsDetails, inputs[index]); - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); parsed.push([ - getAction('Swap up to'), - getToken(path[path.length - 1], params.amountInMax), - getLabel('for'), - getToken(path[0], params.amountOut), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[path.length - 1], params.amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[0], params.amountOut), + (0, utils_1.getDeadline)(deadline) ]); } - else if (command === COMMANDS.SWEEP) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.SWEEP; + else if (command === Commands_1.COMMANDS.SWEEP) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.SWEEP; const params = extractParams(inputsDetails, inputs[index]); if (['0x0000000000000000000000000000000000000001', accountOp.accountAddr].includes(params.recipient)) parsed.push([ - getAction('Take'), - getLabel('at least'), - getToken(params.token, params.amountMin) + (0, utils_1.getAction)('Take'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(params.token, params.amountMin) ]); else parsed.push([ - getAction('Send'), - getToken(params.token, params.amountMin), - getLabel('to'), - getAddressVisualization(params.recipient) + (0, utils_1.getAction)('Send'), + (0, utils_1.getToken)(params.token, params.amountMin), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(params.recipient) ]); } - else if (command === COMMANDS.PAY_PORTION) { + else if (command === Commands_1.COMMANDS.PAY_PORTION) { // @NOTE: this is used for paying fee although its already calculated in the humanized response // @NOTE: no need to be displayed but we can add warning id the fee is too high? // const { inputsDetails } = COMMANDS_DESCRIPTIONS.PAY_PORTION @@ -94,80 +97,81 @@ export const uniUniversalRouter = () => { // ] // }) } - else if (command === COMMANDS.TRANSFER) { + else if (command === Commands_1.COMMANDS.TRANSFER) { // when we swap with exact out the ui displays amount X for out token // the actual swap is X + small fee // and this is the small fee that is to be sent to the fee collector of uniswap // at later stage of the humanizer pipeline if swap with the same token is present exactly before this transfer // we will subtract the amount from the swap and remove this call from the visualization - const { inputsDetails } = COMMANDS_DESCRIPTIONS.TRANSFER; + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.TRANSFER; const params = extractParams(inputsDetails, inputs[index]); parsed.push([ - getAction('Send'), - getToken(params.token, params.value), - getLabel('to'), - getAddressVisualization(params.recipient) + (0, utils_1.getAction)('Send'), + (0, utils_1.getToken)(params.token, params.value), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(params.recipient) ]); } - else if (command === COMMANDS.V2_SWAP_EXACT_IN) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN; + else if (command === Commands_1.COMMANDS.V2_SWAP_EXACT_IN) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN; const params = extractParams(inputsDetails, inputs[index]); const path = params.path; parsed.push([ - getAction('Swap'), - getToken(path[0], params.amountIn), - getLabel('for at least'), - getToken(path[path.length - 1], params.amountOutMin), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[path.length - 1], params.amountOutMin), + (0, utils_1.getDeadline)(deadline) ]); } - else if (command === COMMANDS.V2_SWAP_EXACT_OUT) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT; + else if (command === Commands_1.COMMANDS.V2_SWAP_EXACT_OUT) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT; const params = extractParams(inputsDetails, inputs[index]); const path = params.path; parsed.push([ - getAction('Swap up to'), - getToken(path[0], params.amountInMax), - getLabel('for'), - getToken(path[path.length - 1], params.amountOut), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[0], params.amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[path.length - 1], params.amountOut), + (0, utils_1.getDeadline)(deadline) ]); } - else if (command === COMMANDS.PERMIT2_PERMIT) { + else if (command === Commands_1.COMMANDS.PERMIT2_PERMIT) { const { permit: { details: { token, amount /* expiration, nonce */ }, spender // sigDeadline } // signature - } = extractParams(COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index]); + } = extractParams(Commands_1.COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index]); parsed.push([ - getAction('Grant approval'), - getLabel('for'), - getToken(token, amount), - getLabel('to'), - getAddressVisualization(spender) + (0, utils_1.getAction)('Grant approval'), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(token, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(spender) ]); } - else if (command === COMMANDS.WRAP_ETH) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.WRAP_ETH; + else if (command === Commands_1.COMMANDS.WRAP_ETH) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.WRAP_ETH; const params = extractParams(inputsDetails, inputs[index]); - params.amountMin && parsed.push(getWrapping(ZeroAddress, params.amountMin)); + params.amountMin && parsed.push((0, utils_1.getWrapping)(ethers_1.ZeroAddress, params.amountMin)); } - else if (command === COMMANDS.UNWRAP_WETH) { - const { inputsDetails } = COMMANDS_DESCRIPTIONS.UNWRAP_WETH; + else if (command === Commands_1.COMMANDS.UNWRAP_WETH) { + const { inputsDetails } = Commands_1.COMMANDS_DESCRIPTIONS.UNWRAP_WETH; const params = extractParams(inputsDetails, inputs[index]); params.amountMin && parsed.push([ - getAction('Unwrap'), - getToken(ZeroAddress, params.amountMin), - ...getUniRecipientText(accountOp.accountAddr, params.recipient) + (0, utils_1.getAction)('Unwrap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, params.amountMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient) ]); } else - parsed.push(getUnknownVisualization('Uni V3', call)); + parsed.push((0, utils_1.getUnknownVisualization)('Uni V3', call)); }) - : parsed.push(getUnknownVisualization('Uniswap V3', call)); - return uniReduce(parsed); + : parsed.push((0, utils_1.getUnknownVisualization)('Uniswap V3', call)); + return (0, utils_2.uniReduce)(parsed); } }; }; +exports.uniUniversalRouter = uniUniversalRouter; //# sourceMappingURL=uniUniversalRouter.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map index a61eff87e..30a77d719 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/uniUniversalRouter.js.map @@ -1 +1 @@ -{"version":3,"file":"uniUniversalRouter.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniUniversalRouter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniswapUniversalRouter } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getToken,\n getUnknownVisualization,\n getWrapping\n} from '../../utils'\nimport { COMMANDS, COMMANDS_DESCRIPTIONS } from './Commands'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst coder = new AbiCoder()\n\nconst extractParams = (inputsDetails: any, input: any) => {\n const types = inputsDetails.map((i: any) => i.type)\n const decodedInput = coder.decode(types, input)\n\n const params: any = {}\n inputsDetails.forEach((item: any, index: number) => {\n params[item.name] = decodedInput[index]\n })\n\n return params\n}\n\n// this function splits uniswap commands from single hex string to multiple hex strings\n// '0x1234' => ['0x12', '0x34']\nfunction parseCommands(commands: string): string[] | null {\n // all commands are 1 byte = 2 hex chars\n if (commands.length % 2) return null\n if (!/^0x[0-9A-Fa-f]+$/.test(commands)) return null\n const res: string[] = []\n // iterate over pairs of chars\n for (let i = 2; i < commands.length; i += 2) {\n res.push(`0x${commands.slice(i, i + 2)}`)\n }\n return res\n}\n\nexport const uniUniversalRouter = (): HumanizerUniMatcher => {\n const ifaceUniversalRouter = new Interface(UniswapUniversalRouter)\n return {\n [`${\n ifaceUniversalRouter.getFunction(\n 'execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall) => {\n const [commands, inputs, deadline] = ifaceUniversalRouter.parseTransaction(call)?.args || []\n const parsedCommands = parseCommands(commands)\n const parsed: HumanizerVisualization[][] = []\n\n parsedCommands\n ? parsedCommands.forEach((command: string, index: number) => {\n if (command === COMMANDS.V3_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V3_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMax),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.SWEEP) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.SWEEP\n const params = extractParams(inputsDetails, inputs[index])\n if (\n ['0x0000000000000000000000000000000000000001', accountOp.accountAddr].includes(\n params.recipient\n )\n )\n parsed.push([\n getAction('Take'),\n getLabel('at least'),\n getToken(params.token, params.amountMin)\n ])\n else\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.amountMin),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.PAY_PORTION) {\n // @NOTE: this is used for paying fee although its already calculated in the humanized response\n // @NOTE: no need to be displayed but we can add warning id the fee is too high?\n // const { inputsDetails } = COMMANDS_DESCRIPTIONS.PAY_PORTION\n // const params = extractParams(inputsDetails, inputs[index])\n // parsed.push({\n // ...call,\n // fullVisualization: [\n // getAction('Pay fee'),\n // getLabel('of'),\n // // bips are fee. can be 0 or within 10-9999 and converts to %\n // // https://docs.uniswap.org/contracts/v2/guides/interface-integration/custom-interface-linking#constraints\n // getLabel(`${Number(params.bips) / 100}%`)\n // ]\n // })\n } else if (command === COMMANDS.TRANSFER) {\n // when we swap with exact out the ui displays amount X for out token\n // the actual swap is X + small fee\n // and this is the small fee that is to be sent to the fee collector of uniswap\n // at later stage of the humanizer pipeline if swap with the same token is present exactly before this transfer\n // we will subtract the amount from the swap and remove this call from the visualization\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.TRANSFER\n const params = extractParams(inputsDetails, inputs[index])\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.value),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[0], params.amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.PERMIT2_PERMIT) {\n const {\n permit: {\n details: { token, amount /* expiration, nonce */ },\n spender\n // sigDeadline\n }\n // signature\n } = extractParams(COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index])\n parsed.push([\n getAction('Grant approval'),\n getLabel('for'),\n getToken(token, amount),\n getLabel('to'),\n getAddressVisualization(spender)\n ])\n } else if (command === COMMANDS.WRAP_ETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.WRAP_ETH\n const params = extractParams(inputsDetails, inputs[index])\n params.amountMin && parsed.push(getWrapping(ZeroAddress, params.amountMin))\n } else if (command === COMMANDS.UNWRAP_WETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.UNWRAP_WETH\n const params = extractParams(inputsDetails, inputs[index])\n\n params.amountMin &&\n parsed.push([\n getAction('Unwrap'),\n getToken(ZeroAddress, params.amountMin),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ])\n } else parsed.push(getUnknownVisualization('Uni V3', call))\n })\n : parsed.push(getUnknownVisualization('Uniswap V3', call))\n\n return uniReduce(parsed)\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"uniUniversalRouter.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniUniversalRouter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniswapUniversalRouter } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getToken,\n getUnknownVisualization,\n getWrapping\n} from '../../utils'\nimport { COMMANDS, COMMANDS_DESCRIPTIONS } from './Commands'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst coder = new AbiCoder()\n\nconst extractParams = (inputsDetails: any, input: any) => {\n const types = inputsDetails.map((i: any) => i.type)\n const decodedInput = coder.decode(types, input)\n\n const params: any = {}\n inputsDetails.forEach((item: any, index: number) => {\n params[item.name] = decodedInput[index]\n })\n\n return params\n}\n\n// this function splits uniswap commands from single hex string to multiple hex strings\n// '0x1234' => ['0x12', '0x34']\nfunction parseCommands(commands: string): string[] | null {\n // all commands are 1 byte = 2 hex chars\n if (commands.length % 2) return null\n if (!/^0x[0-9A-Fa-f]+$/.test(commands)) return null\n const res: string[] = []\n // iterate over pairs of chars\n for (let i = 2; i < commands.length; i += 2) {\n res.push(`0x${commands.slice(i, i + 2)}`)\n }\n return res\n}\n\nexport const uniUniversalRouter = (): HumanizerUniMatcher => {\n const ifaceUniversalRouter = new Interface(UniswapUniversalRouter)\n return {\n [`${\n ifaceUniversalRouter.getFunction(\n 'execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall) => {\n const [commands, inputs, deadline] = ifaceUniversalRouter.parseTransaction(call)?.args || []\n const parsedCommands = parseCommands(commands)\n const parsed: HumanizerVisualization[][] = []\n\n parsedCommands\n ? parsedCommands.forEach((command: string, index: number) => {\n if (command === COMMANDS.V3_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V3_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V3_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = parsePath(params.path)\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMax),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.SWEEP) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.SWEEP\n const params = extractParams(inputsDetails, inputs[index])\n if (\n ['0x0000000000000000000000000000000000000001', accountOp.accountAddr].includes(\n params.recipient\n )\n )\n parsed.push([\n getAction('Take'),\n getLabel('at least'),\n getToken(params.token, params.amountMin)\n ])\n else\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.amountMin),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.PAY_PORTION) {\n // @NOTE: this is used for paying fee although its already calculated in the humanized response\n // @NOTE: no need to be displayed but we can add warning id the fee is too high?\n // const { inputsDetails } = COMMANDS_DESCRIPTIONS.PAY_PORTION\n // const params = extractParams(inputsDetails, inputs[index])\n // parsed.push({\n // ...call,\n // fullVisualization: [\n // getAction('Pay fee'),\n // getLabel('of'),\n // // bips are fee. can be 0 or within 10-9999 and converts to %\n // // https://docs.uniswap.org/contracts/v2/guides/interface-integration/custom-interface-linking#constraints\n // getLabel(`${Number(params.bips) / 100}%`)\n // ]\n // })\n } else if (command === COMMANDS.TRANSFER) {\n // when we swap with exact out the ui displays amount X for out token\n // the actual swap is X + small fee\n // and this is the small fee that is to be sent to the fee collector of uniswap\n // at later stage of the humanizer pipeline if swap with the same token is present exactly before this transfer\n // we will subtract the amount from the swap and remove this call from the visualization\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.TRANSFER\n const params = extractParams(inputsDetails, inputs[index])\n parsed.push([\n getAction('Send'),\n getToken(params.token, params.value),\n getLabel('to'),\n getAddressVisualization(params.recipient)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_IN) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_IN\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMin),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.V2_SWAP_EXACT_OUT) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.V2_SWAP_EXACT_OUT\n const params = extractParams(inputsDetails, inputs[index])\n const path = params.path\n\n parsed.push([\n getAction('Swap up to'),\n getToken(path[0], params.amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], params.amountOut),\n getDeadline(deadline)\n ])\n } else if (command === COMMANDS.PERMIT2_PERMIT) {\n const {\n permit: {\n details: { token, amount /* expiration, nonce */ },\n spender\n // sigDeadline\n }\n // signature\n } = extractParams(COMMANDS_DESCRIPTIONS.PERMIT2_PERMIT.inputsDetails, inputs[index])\n parsed.push([\n getAction('Grant approval'),\n getLabel('for'),\n getToken(token, amount),\n getLabel('to'),\n getAddressVisualization(spender)\n ])\n } else if (command === COMMANDS.WRAP_ETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.WRAP_ETH\n const params = extractParams(inputsDetails, inputs[index])\n params.amountMin && parsed.push(getWrapping(ZeroAddress, params.amountMin))\n } else if (command === COMMANDS.UNWRAP_WETH) {\n const { inputsDetails } = COMMANDS_DESCRIPTIONS.UNWRAP_WETH\n const params = extractParams(inputsDetails, inputs[index])\n\n params.amountMin &&\n parsed.push([\n getAction('Unwrap'),\n getToken(ZeroAddress, params.amountMin),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ])\n } else parsed.push(getUnknownVisualization('Uni V3', call))\n })\n : parsed.push(getUnknownVisualization('Uniswap V3', call))\n\n return uniReduce(parsed)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js index 34f19e632..db0ba7e44 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js @@ -1,33 +1,36 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { UniV2Router } from '../../const/abis'; -import { getAction, getDeadline, getLabel, getToken } from '../../utils'; -import { getUniRecipientText } from './utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniV2Mapping = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const utils_2 = require("./utils"); const uniV2Mapping = () => { - const iface = new Interface(UniV2Router); + const iface = new ethers_1.Interface(abis_1.UniV2Router); return { // ordered in the same order as the router [iface.getFunction('swapExactTokensForTokens')?.selector]: (accountOp, call) => { const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []; const outputAsset = path[path.length - 1]; return [ - getAction('Swap'), - getToken(path[0], amountIn), - getLabel('for at least'), - getToken(outputAsset, amountOutMin), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(outputAsset, amountOutMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapTokensForExactTokens')?.selector]: (accountOp, call) => { const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []; const outputAsset = path[path.length - 1]; return [ - getAction('Swap up to'), - getToken(path[0], amountInMax), - getLabel('for'), - getToken(outputAsset, amountOut), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[0], amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(outputAsset, amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapExactETHForTokens')?.selector]: (accountOp, call) => { @@ -35,34 +38,34 @@ const uniV2Mapping = () => { const [amountOutMin, path, to, deadline] = args || []; const outputAsset = path[path.length - 1]; return [ - getAction('Swap'), - getToken(ZeroAddress, value), - getLabel('for for at least'), - getToken(outputAsset, amountOutMin), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, value), + (0, utils_1.getLabel)('for for at least'), + (0, utils_1.getToken)(outputAsset, amountOutMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapTokensForExactETH')?.selector]: (accountOp, call) => { const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []; return [ - getAction('Swap up to'), - getToken(path[0], amountInMax), - getLabel('for'), - getToken(ZeroAddress, amountOut), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[0], amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapExactTokensForETH')?.selector]: (accountOp, call) => { const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []; return [ - getAction('Swap'), - getToken(path[0], amountIn), - getLabel('for at least'), - getToken(ZeroAddress, amountOutMin), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountOutMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('swapETHForExactTokens')?.selector]: (accountOp, call) => { @@ -70,65 +73,65 @@ const uniV2Mapping = () => { const [amountOut, path, to, deadline] = args || []; const outputAsset = path[path.length - 1]; return [ - getAction('Swap up to'), - getToken(ZeroAddress, value), - getLabel('for'), - getToken(outputAsset, amountOut), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, value), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(outputAsset, amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, // Liquidity [iface.getFunction('addLiquidity')?.selector]: (accountOp, call) => { const [tokenA, tokenB, amountADesired, amountBDesired /* amountAMin */ /* amountBMin */, , , to, deadline] = iface.parseTransaction(call)?.args || []; return [ - getAction('Add liquidity'), - getToken(tokenA, amountADesired), - getLabel('and'), - getToken(tokenB, amountBDesired), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Add liquidity'), + (0, utils_1.getToken)(tokenA, amountADesired), + (0, utils_1.getLabel)('and'), + (0, utils_1.getToken)(tokenB, amountBDesired), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('addLiquidityETH')?.selector]: (accountOp, call) => { const { args, value } = iface.parseTransaction(call) || { args: [], value: BigInt(0) }; const [token, amountTokenDesired /* amountTokenMin */ /* amountETHMin */, , , to, deadline] = args; return [ - getAction('Add liquidity'), - getToken(token, amountTokenDesired), - getLabel('and'), - getToken(ZeroAddress, value), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Add liquidity'), + (0, utils_1.getToken)(token, amountTokenDesired), + (0, utils_1.getLabel)('and'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, value), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('removeLiquidity')?.selector]: (accountOp, call) => { const [tokenA, tokenB /* liquidity */, , amountAMin, amountBMin, to, deadline] = iface.parseTransaction(call)?.args || []; return [ - getAction('Remove liquidity'), - getLabel('at least'), - getToken(tokenA, amountAMin), - getLabel('and'), - getToken(tokenB, amountBMin), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Remove liquidity'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(tokenA, amountAMin), + (0, utils_1.getLabel)('and'), + (0, utils_1.getToken)(tokenB, amountBMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; }, [iface.getFunction('removeLiquidityETH')?.selector]: (accountOp, call) => { const [token /* liquidity */, , amountTokenMin, amountETHMin, to, deadline] = iface.parseTransaction(call)?.args || []; return [ - getAction('Remove liquidity'), - getLabel('at least'), - getToken(token, amountTokenMin), - getLabel('and'), - getToken(ZeroAddress, amountETHMin), - ...getUniRecipientText(accountOp.accountAddr, to), - getDeadline(deadline) + (0, utils_1.getAction)('Remove liquidity'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(token, amountTokenMin), + (0, utils_1.getLabel)('and'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountETHMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to), + (0, utils_1.getDeadline)(deadline) ]; } // NOTE: We currently do not support *WithPermit functions cause they require an ecrecover signature // Uniswap will detect we don't support it cause it will fail on requesting eth_signTypedData_v4 }; }; -export { uniV2Mapping }; +exports.uniV2Mapping = uniV2Mapping; //# sourceMappingURL=uniV2.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map index 599af7416..49d54ade8 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV2.js.map @@ -1 +1 @@ -{"version":3,"file":"uniV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV2Router } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getToken } from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText } from './utils'\n\nconst uniV2Mapping = (): HumanizerUniMatcher => {\n const iface = new Interface(UniV2Router)\n return {\n // ordered in the same order as the router\n [iface.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactETHForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOutMin, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, value),\n getLabel('for for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactTokensForETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapETHForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOut, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, value),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n // Liquidity\n [iface.getFunction('addLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired /* amountAMin */ /* amountBMin */,\n ,\n ,\n to,\n deadline\n ] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(tokenA, amountADesired),\n getLabel('and'),\n getToken(tokenB, amountBDesired),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('addLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const { args, value } = iface.parseTransaction(call) || { args: [], value: BigInt(0) }\n const [token, amountTokenDesired /* amountTokenMin */ /* amountETHMin */, , , to, deadline] =\n args\n return [\n getAction('Add liquidity'),\n getToken(token, amountTokenDesired),\n getLabel('and'),\n getToken(ZeroAddress, value),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [tokenA, tokenB /* liquidity */, , amountAMin, amountBMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(tokenA, amountAMin),\n getLabel('and'),\n getToken(tokenB, amountBMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [token /* liquidity */, , amountTokenMin, amountETHMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(token, amountTokenMin),\n getLabel('and'),\n getToken(ZeroAddress, amountETHMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n // NOTE: We currently do not support *WithPermit functions cause they require an ecrecover signature\n // Uniswap will detect we don't support it cause it will fail on requesting eth_signTypedData_v4\n }\n}\n\nexport { uniV2Mapping }\n"]} \ No newline at end of file +{"version":3,"file":"uniV2.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV2Router } from '../../const/abis'\nimport { IrCall } from '../../interfaces'\nimport { getAction, getDeadline, getLabel, getToken } from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText } from './utils'\n\nconst uniV2Mapping = (): HumanizerUniMatcher => {\n const iface = new Interface(UniV2Router)\n return {\n // ordered in the same order as the router\n [iface.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactETHForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOutMin, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap'),\n getToken(ZeroAddress, value),\n getLabel('for for at least'),\n getToken(outputAsset, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapTokensForExactETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountOut, amountInMax, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(ZeroAddress, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapExactTokensForETH')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [amountIn, amountOutMin, path, to, deadline] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(ZeroAddress, amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('swapETHForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const { args, value } = iface.parseTransaction(call) || { value: BigInt(0) }\n const [amountOut, path, to, deadline] = args || []\n const outputAsset = path[path.length - 1]\n return [\n getAction('Swap up to'),\n getToken(ZeroAddress, value),\n getLabel('for'),\n getToken(outputAsset, amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n // Liquidity\n [iface.getFunction('addLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired /* amountAMin */ /* amountBMin */,\n ,\n ,\n to,\n deadline\n ] = iface.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(tokenA, amountADesired),\n getLabel('and'),\n getToken(tokenB, amountBDesired),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('addLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const { args, value } = iface.parseTransaction(call) || { args: [], value: BigInt(0) }\n const [token, amountTokenDesired /* amountTokenMin */ /* amountETHMin */, , , to, deadline] =\n args\n return [\n getAction('Add liquidity'),\n getToken(token, amountTokenDesired),\n getLabel('and'),\n getToken(ZeroAddress, value),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidity')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [tokenA, tokenB /* liquidity */, , amountAMin, amountBMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(tokenA, amountAMin),\n getLabel('and'),\n getToken(tokenB, amountBMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n },\n [iface.getFunction('removeLiquidityETH')?.selector!]: (accountOp: AccountOp, call: IrCall) => {\n const [token /* liquidity */, , amountTokenMin, amountETHMin, to, deadline] =\n iface.parseTransaction(call)?.args || []\n return [\n getAction('Remove liquidity'),\n getLabel('at least'),\n getToken(token, amountTokenMin),\n getLabel('and'),\n getToken(ZeroAddress, amountETHMin),\n ...getUniRecipientText(accountOp.accountAddr, to),\n getDeadline(deadline)\n ]\n }\n // NOTE: We currently do not support *WithPermit functions cause they require an ecrecover signature\n // Uniswap will detect we don't support it cause it will fail on requesting eth_signTypedData_v4\n }\n}\n\nexport { uniV2Mapping }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js index 28ca76899..57f4b09fd 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js @@ -1,9 +1,12 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { UniV3Router, UniV3Router2 } from '../../const/abis'; -import { getAction, getAddressVisualization, getDeadline, getLabel, getRecipientText, getToken, getUnknownVisualization } from '../../utils'; -import { getUniRecipientText, parsePath, uniReduce } from './utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniV3Mapping = exports.uniV32Mapping = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const utils_2 = require("./utils"); const uniV32Mapping = () => { - const ifaceV32 = new Interface(UniV3Router2); + const ifaceV32 = new ethers_1.Interface(abis_1.UniV3Router2); return { // 0x5ae401dc [ifaceV32.getFunction('multicall(uint256 deadline,bytes[])')?.selector]: (accountOp, call) => { @@ -12,10 +15,10 @@ const uniV32Mapping = () => { const parsed = calls.map((data) => { const sigHash = data.slice(0, 10); const humanizer = mappingResult[sigHash]; - return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [(0, utils_1.getAction)('Unknown action')]; }); - const res = uniReduce(parsed); - return res.length ? [...res, getDeadline(deadline)] : getUnknownVisualization('Uni V3', call); + const res = (0, utils_2.uniReduce)(parsed); + return res.length ? [...res, (0, utils_1.getDeadline)(deadline)] : (0, utils_1.getUnknownVisualization)('Uni V3', call); }, // 0xac9650d8 [ifaceV32.getFunction('multicall(bytes[])')?.selector]: (accountOp, call) => { @@ -24,9 +27,9 @@ const uniV32Mapping = () => { const parsed = calls.map((data) => { const sigHash = data.slice(0, 10); const humanizer = mappingResult[sigHash]; - return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [(0, utils_1.getAction)('Unknown action')]; }); - return uniReduce(parsed); + return (0, utils_2.uniReduce)(parsed); }, // 0x1f0464d1 [ifaceV32.getFunction('multicall(bytes32 prevBlockHash, bytes[])')?.selector]: (accountOp, call) => { @@ -35,11 +38,11 @@ const uniV32Mapping = () => { const parsed = calls.map((data) => { const sigHash = data.slice(0, 10); const humanizer = mappingResult[sigHash]; - return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [(0, utils_1.getAction)('Unknown action')]; }); return parsed.length - ? uniReduce(parsed) - : [...getUnknownVisualization('Uni V3', call), getLabel(`after block ${prevBlockHash}`)]; + ? (0, utils_2.uniReduce)(parsed) + : [...(0, utils_1.getUnknownVisualization)('Uni V3', call), (0, utils_1.getLabel)(`after block ${prevBlockHash}`)]; }, // NOTE: selfPermit is not supported cause it requires an ecrecover signature // 0x04e45aaf @@ -47,152 +50,152 @@ const uniV32Mapping = () => { const [params] = ifaceV32.parseTransaction(call)?.args || []; // @TODO: consider fees return [ - getAction('Swap'), - getToken(params.tokenIn, params.amountIn), - getLabel('for at least'), - getToken(params.tokenOut, params.amountOutMinimum), - ...getUniRecipientText(accountOp.accountAddr, params.recipient) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(params.tokenIn, params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(params.tokenOut, params.amountOutMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient) ]; }, // 0x414bf389 [ifaceV32.getFunction('exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))')?.selector]: (accountOp, call) => { const [params] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Swap'), - getToken(params.tokenIn, params.amountIn), - getLabel('for at least'), - getToken(params.tokenOut, params.amountOutMinimum), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(params.tokenIn, params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(params.tokenOut, params.amountOutMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0xb858183f [ifaceV32.getFunction('exactInput')?.selector]: (accountOp, call) => { const [params] = ifaceV32.parseTransaction(call)?.args || []; - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); return [ - getAction('Swap'), - getToken(path[0], params.amountIn), - getLabel('for at least'), - getToken(path[path.length - 1], params.amountOutMinimum), - ...getUniRecipientText(accountOp.accountAddr, params.recipient) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[path.length - 1], params.amountOutMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient) ]; }, // 0x5023b4df [ifaceV32.getFunction('exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)')?.selector]: (accountOp, call) => { const [params] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Swap up to'), - getToken(params.tokenIn, params.amountInMaximum), - getLabel('for'), - getToken(params.tokenOut, params.amountOut), - ...getUniRecipientText(accountOp.accountAddr, params.recipient) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(params.tokenIn, params.amountInMaximum), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(params.tokenOut, params.amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient) ]; }, // 0xdb3e2198 [ifaceV32.getFunction('exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)')?.selector]: (accountOp, call) => { const [params] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Swap up to'), - getToken(params.tokenIn, params.amountInMaximum), - getLabel('for'), - getToken(params.tokenOut, params.amountOut), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(params.tokenIn, params.amountInMaximum), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(params.tokenOut, params.amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0x12210e8a [ifaceV32.getFunction('refundETH()')?.selector]: (accountOp, call) => { - return [getAction('Withdraw'), getToken(ZeroAddress, call.value)]; + return [(0, utils_1.getAction)('Withdraw'), (0, utils_1.getToken)(ethers_1.ZeroAddress, call.value)]; }, // 0x09b81346 [ifaceV32.getFunction('exactOutput')?.selector]: (accountOp, call) => { const [params] = ifaceV32.parseTransaction(call)?.args || []; - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); return [ - getAction('Swap up to'), - getToken(path[path.length - 1], params.amountInMaximum), - getLabel('for'), - getToken(path[0], params.amountOut), - ...getUniRecipientText(accountOp.accountAddr, params.recipient) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[path.length - 1], params.amountInMaximum), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[0], params.amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient) ]; }, // 0x42712a67 [ifaceV32.getFunction('swapTokensForExactTokens')?.selector]: (accountOp, call) => { const [amountOut, amountInMax, path, to] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Swap up to'), - getToken(path[0], amountInMax), - getLabel('for'), - getToken(path[path.length - 1], amountOut), - ...getUniRecipientText(accountOp.accountAddr, to) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[0], amountInMax), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[path.length - 1], amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to) ]; }, // 0x472b43f3 [ifaceV32.getFunction('swapExactTokensForTokens')?.selector]: (accountOp, call) => { const [amountIn, amountOutMin, path, to] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Swap'), - getToken(path[0], amountIn), - getLabel('for at least'), - getToken(path[path.length - 1], amountOutMin), - ...getUniRecipientText(accountOp.accountAddr, to) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[path.length - 1], amountOutMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, to) ]; }, // 0x49616997 [ifaceV32.getFunction('unwrapWETH9(uint256)')?.selector]: (_accountOp, call) => { const [amountMin] = ifaceV32.parseTransaction(call)?.args || []; - return [getAction('Unwrap'), getToken(ZeroAddress, amountMin)]; + return [(0, utils_1.getAction)('Unwrap'), (0, utils_1.getToken)(ethers_1.ZeroAddress, amountMin)]; }, // 0x49404b7c [ifaceV32.getFunction('unwrapWETH9(uint256,address recipient)')?.selector]: (accountOp, call) => { const [amountMin, recipient] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Unwrap'), - getToken(ZeroAddress, amountMin), - ...getUniRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Unwrap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, recipient) ]; }, // 0xe90a182f [ifaceV32.getFunction('sweepToken(address,uint256)')?.selector]: (_accountOp, call) => { const [token, amountMinimum] = ifaceV32.parseTransaction(call)?.args || []; - return [getAction('Sweep'), getLabel('at least'), getToken(token, amountMinimum)]; + return [(0, utils_1.getAction)('Sweep'), (0, utils_1.getLabel)('at least'), (0, utils_1.getToken)(token, amountMinimum)]; }, // 0xdf2ab5bb [ifaceV32.getFunction('sweepToken(address,uint256,address)')?.selector]: (accountOp, call) => { const [token, amountMinimum, recipient] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Sweep'), - getLabel('at least'), - getToken(token, amountMinimum), - ...getUniRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Sweep'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(token, amountMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, recipient) ]; }, // 0x3068c554 [ifaceV32.getFunction('sweepTokenWithFee(address,uint256,uint256,address)')?.selector]: (_accountOp, call) => { const [token, amountMinimum, feeBips, feeRecipient] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Sweep'), - getLabel('at least'), - getToken(token, amountMinimum), - getLabel('with fee'), - getToken(token, feeBips), - getLabel('to'), - getAddressVisualization(feeRecipient) + (0, utils_1.getAction)('Sweep'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(token, amountMinimum), + (0, utils_1.getLabel)('with fee'), + (0, utils_1.getToken)(token, feeBips), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(feeRecipient) ]; }, // 0xe0e189a0 [`${ifaceV32.getFunction('sweepTokenWithFee(address,uint256,address,uint256,address)')?.selector}`]: (accountOp, call) => { const [token, amountMinimum, recipient, feeBips, feeRecipient] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Sweep'), - getLabel('at least'), - getToken(token, amountMinimum), - getLabel('with fee'), - getToken(token, feeBips), - getLabel('to'), - getAddressVisualization(feeRecipient), - ...getUniRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Sweep'), + (0, utils_1.getLabel)('at least'), + (0, utils_1.getToken)(token, amountMinimum), + (0, utils_1.getLabel)('with fee'), + (0, utils_1.getToken)(token, feeBips), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(feeRecipient), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, recipient) ]; }, // 0x88316456 @@ -205,18 +208,19 @@ const uniV32Mapping = () => { // amount1Desired, amount0Min, amount1Min, recipient, deadline]] = ifaceV32.parseTransaction(call)?.args || []; return [ - getAction('Add liquidity'), - getToken(token0, amount0Min), - getToken(token1, amount1Min), - getLabel('pair'), - ...getRecipientText(accountOp.accountAddr, recipient), - getDeadline(deadline) + (0, utils_1.getAction)('Add liquidity'), + (0, utils_1.getToken)(token0, amount0Min), + (0, utils_1.getToken)(token1, amount1Min), + (0, utils_1.getLabel)('pair'), + ...(0, utils_1.getRecipientText)(accountOp.accountAddr, recipient), + (0, utils_1.getDeadline)(deadline) ]; } }; }; +exports.uniV32Mapping = uniV32Mapping; const uniV3Mapping = () => { - const ifaceV3 = new Interface(UniV3Router); + const ifaceV3 = new ethers_1.Interface(abis_1.UniV3Router); return { // 0xac9650d8 [ifaceV3.getFunction('multicall')?.selector]: (accountOp, call) => { @@ -226,9 +230,9 @@ const uniV3Mapping = () => { const parsed = calls.map((data) => { const sigHash = data.slice(0, 10); const humanizer = mappingResult[sigHash]; - return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]; + return humanizer ? humanizer(accountOp, { ...call, data }) : [(0, utils_1.getAction)('Unknown action')]; }); - return parsed.length ? uniReduce(parsed) : getUnknownVisualization('Uni V3', call); + return parsed.length ? (0, utils_2.uniReduce)(parsed) : (0, utils_1.getUnknownVisualization)('Uni V3', call); }, // ------------------------------------------------------------------------------------------------- // NOTE: selfPermit is not supported cause it requires an ecrecover signature @@ -237,79 +241,79 @@ const uniV3Mapping = () => { const [params] = ifaceV3.parseTransaction(call)?.args || []; // @TODO: consider fees return [ - getAction('Swap'), - getToken(params.tokenIn, params.amountIn), - getLabel('for at least'), - getToken(params.tokenOut, params.amountOutMinimum), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(params.tokenIn, params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(params.tokenOut, params.amountOutMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0xc04b8d59 [ifaceV3.getFunction('exactInput')?.selector]: (accountOp, call) => { const [params] = ifaceV3.parseTransaction(call)?.args || []; - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); return [ - getAction('Swap'), - getToken(path[0], params.amountIn), - getLabel('for at least'), - getToken(path[path.length - 1], params.amountOutMinimum), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap'), + (0, utils_1.getToken)(path[0], params.amountIn), + (0, utils_1.getLabel)('for at least'), + (0, utils_1.getToken)(path[path.length - 1], params.amountOutMinimum), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0xdb3e2198 [ifaceV3.getFunction('exactOutputSingle')?.selector]: (accountOp, call) => { const [params] = ifaceV3.parseTransaction(call)?.args || []; return [ - getAction('Swap up to'), - getToken(params.tokenIn, params.amountInMaximum), - getLabel('for'), - getToken(params.tokenOut, params.amountOut), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(params.tokenIn, params.amountInMaximum), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(params.tokenOut, params.amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0xf28c0498 [ifaceV3.getFunction('exactOutput')?.selector]: (accountOp, call) => { const [params] = ifaceV3.parseTransaction(call)?.args || []; - const path = parsePath(params.path); + const path = (0, utils_2.parsePath)(params.path); return [ - getAction('Swap up to'), - getToken(path[path.length - 1], params.amountInMaximum), - getLabel('for'), - getToken(path[0], params.amountOut), - ...getUniRecipientText(accountOp.accountAddr, params.recipient), - getDeadline(params.deadline) + (0, utils_1.getAction)('Swap up to'), + (0, utils_1.getToken)(path[path.length - 1], params.amountInMaximum), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(path[0], params.amountOut), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, params.recipient), + (0, utils_1.getDeadline)(params.deadline) ]; }, // 0x49404b7c [ifaceV3.getFunction('unwrapWETH9')?.selector]: (accountOp, call) => { const [amountMin, recipient] = ifaceV3.parseTransaction(call)?.args || []; return [ - getAction('Unwrap'), - getToken(ZeroAddress, amountMin), - ...getUniRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Unwrap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountMin), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, recipient) ]; }, // 0x9b2c0a37 [ifaceV3.getFunction('unwrapWETH9WithFee')?.selector]: (accountOp, call) => { const [amountMin, recipient, feeBips, feeRecipient] = ifaceV3.parseTransaction(call)?.args || []; return [ - getAction('Unwrap'), - getToken(ZeroAddress, amountMin), - getLabel('with fee'), - getToken(ZeroAddress, feeBips), - getLabel('to'), - getAddressVisualization(feeRecipient), - ...getUniRecipientText(accountOp.accountAddr, recipient) + (0, utils_1.getAction)('Unwrap'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, amountMin), + (0, utils_1.getLabel)('with fee'), + (0, utils_1.getToken)(ethers_1.ZeroAddress, feeBips), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(feeRecipient), + ...(0, utils_2.getUniRecipientText)(accountOp.accountAddr, recipient) ]; }, // 0x12210e8a [ifaceV3.getFunction('refundETH()')?.selector]: () => { - return [getAction('Refund')]; + return [(0, utils_1.getAction)('Refund')]; } }; }; -export { uniV32Mapping, uniV3Mapping }; +exports.uniV3Mapping = uniV3Mapping; //# sourceMappingURL=uniV3.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map index 35c49ff34..3671fc82a 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/uniV3.js.map @@ -1 +1 @@ -{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV3Router, UniV3Router2 } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst uniV32Mapping = (): HumanizerUniMatcher => {\n const ifaceV32 = new Interface(UniV3Router2)\n return {\n // 0x5ae401dc\n [ifaceV32.getFunction('multicall(uint256 deadline,bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [deadline, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n const res = uniReduce(parsed)\n return res.length ? [...res, getDeadline(deadline)] : getUnknownVisualization('Uni V3', call)\n },\n // 0xac9650d8\n [ifaceV32.getFunction('multicall(bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n return uniReduce(parsed)\n },\n // 0x1f0464d1\n [ifaceV32.getFunction('multicall(bytes32 prevBlockHash, bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [prevBlockHash, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n return parsed.length\n ? uniReduce(parsed)\n : [...getUnknownVisualization('Uni V3', call), getLabel(`after block ${prevBlockHash}`)]\n },\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x04e45aaf\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x414bf389\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xb858183f\n [ifaceV32.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x5023b4df\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0xdb3e2198\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n\n // 0x12210e8a\n [ifaceV32.getFunction('refundETH()')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n return [getAction('Withdraw'), getToken(ZeroAddress, call.value)]\n },\n // 0x09b81346\n [ifaceV32.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x42712a67\n [ifaceV32.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountOut, amountInMax, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x472b43f3\n [ifaceV32.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountIn, amountOutMin, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x49616997\n [ifaceV32.getFunction('unwrapWETH9(uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Unwrap'), getToken(ZeroAddress, amountMin)]\n },\n // 0x49404b7c\n [ifaceV32.getFunction('unwrapWETH9(uint256,address recipient)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0xe90a182f\n [ifaceV32.getFunction('sweepToken(address,uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Sweep'), getLabel('at least'), getToken(token, amountMinimum)]\n },\n // 0xdf2ab5bb\n [ifaceV32.getFunction('sweepToken(address,uint256,address)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x3068c554\n [ifaceV32.getFunction('sweepTokenWithFee(address,uint256,uint256,address)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient)\n ]\n },\n // 0xe0e189a0\n [`${\n ifaceV32.getFunction('sweepTokenWithFee(address,uint256,address,uint256,address)')?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x88316456\n [`${\n ifaceV32.getFunction(\n 'mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [\n [\n token0,\n token1,\n ,\n ,\n ,\n ,\n ,\n // fee,\n // tickLower,\n // tickUpper,\n // amount0Desired,\n // amount1Desired,\n amount0Min,\n amount1Min,\n recipient,\n deadline\n ]\n ] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(token0, amount0Min),\n getToken(token1, amount1Min),\n getLabel('pair'),\n ...getRecipientText(accountOp.accountAddr, recipient),\n getDeadline(deadline)\n ]\n }\n }\n}\n\nconst uniV3Mapping = (): HumanizerUniMatcher => {\n const ifaceV3 = new Interface(UniV3Router)\n return {\n // 0xac9650d8\n [ifaceV3.getFunction('multicall')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const args = ifaceV3.parseTransaction(call)?.args || []\n const calls = args[args.length - 1]\n const mappingResult = uniV3Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n\n return parsed.length ? uniReduce(parsed) : getUnknownVisualization('Uni V3', call)\n },\n // -------------------------------------------------------------------------------------------------\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x414bf389\n [ifaceV3.getFunction('exactInputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xc04b8d59\n [ifaceV3.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xdb3e2198\n [ifaceV3.getFunction('exactOutputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xf28c0498\n [ifaceV3.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0x49404b7c\n [ifaceV3.getFunction('unwrapWETH9')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x9b2c0a37\n [ifaceV3.getFunction('unwrapWETH9WithFee')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient, feeBips, feeRecipient] =\n ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n getLabel('with fee'),\n getToken(ZeroAddress, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x12210e8a\n [ifaceV3.getFunction('refundETH()')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Refund')]\n }\n }\n}\n\nexport { uniV32Mapping, uniV3Mapping }\n"]} \ No newline at end of file +{"version":3,"file":"uniV3.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/uniV3.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { UniV3Router, UniV3Router2 } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport {\n getAction,\n getAddressVisualization,\n getDeadline,\n getLabel,\n getRecipientText,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { HumanizerUniMatcher } from './interfaces'\nimport { getUniRecipientText, parsePath, uniReduce } from './utils'\n\nconst uniV32Mapping = (): HumanizerUniMatcher => {\n const ifaceV32 = new Interface(UniV3Router2)\n return {\n // 0x5ae401dc\n [ifaceV32.getFunction('multicall(uint256 deadline,bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ) => {\n const [deadline, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n const res = uniReduce(parsed)\n return res.length ? [...res, getDeadline(deadline)] : getUnknownVisualization('Uni V3', call)\n },\n // 0xac9650d8\n [ifaceV32.getFunction('multicall(bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n return uniReduce(parsed)\n },\n // 0x1f0464d1\n [ifaceV32.getFunction('multicall(bytes32 prevBlockHash, bytes[])')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [prevBlockHash, calls] = ifaceV32.parseTransaction(call)?.args || []\n const mappingResult = uniV32Mapping()\n const parsed: HumanizerVisualization[][] = calls.map(\n (data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n }\n )\n return parsed.length\n ? uniReduce(parsed)\n : [...getUnknownVisualization('Uni V3', call), getLabel(`after block ${prevBlockHash}`)]\n },\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x04e45aaf\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x414bf389\n [ifaceV32.getFunction(\n 'exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96))'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xb858183f\n [ifaceV32.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x5023b4df\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0xdb3e2198\n [ifaceV32.getFunction(\n 'exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params)'\n )?.selector!]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n\n // 0x12210e8a\n [ifaceV32.getFunction('refundETH()')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n return [getAction('Withdraw'), getToken(ZeroAddress, call.value)]\n },\n // 0x09b81346\n [ifaceV32.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV32.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient)\n ]\n },\n // 0x42712a67\n [ifaceV32.getFunction('swapTokensForExactTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountOut, amountInMax, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(path[0], amountInMax),\n getLabel('for'),\n getToken(path[path.length - 1], amountOut),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x472b43f3\n [ifaceV32.getFunction('swapExactTokensForTokens')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountIn, amountOutMin, path, to] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Swap'),\n getToken(path[0], amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], amountOutMin),\n ...getUniRecipientText(accountOp.accountAddr, to)\n ]\n },\n // 0x49616997\n [ifaceV32.getFunction('unwrapWETH9(uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Unwrap'), getToken(ZeroAddress, amountMin)]\n },\n // 0x49404b7c\n [ifaceV32.getFunction('unwrapWETH9(uint256,address recipient)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0xe90a182f\n [ifaceV32.getFunction('sweepToken(address,uint256)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum] = ifaceV32.parseTransaction(call)?.args || []\n return [getAction('Sweep'), getLabel('at least'), getToken(token, amountMinimum)]\n },\n // 0xdf2ab5bb\n [ifaceV32.getFunction('sweepToken(address,uint256,address)')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x3068c554\n [ifaceV32.getFunction('sweepTokenWithFee(address,uint256,uint256,address)')?.selector!]: (\n _accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [token, amountMinimum, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient)\n ]\n },\n // 0xe0e189a0\n [`${\n ifaceV32.getFunction('sweepTokenWithFee(address,uint256,address,uint256,address)')?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [token, amountMinimum, recipient, feeBips, feeRecipient] =\n ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Sweep'),\n getLabel('at least'),\n getToken(token, amountMinimum),\n getLabel('with fee'),\n getToken(token, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x88316456\n [`${\n ifaceV32.getFunction(\n 'mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))'\n )?.selector\n }`]: (accountOp: AccountOp, call: IrCall): HumanizerVisualization[] => {\n const [\n [\n token0,\n token1,\n ,\n ,\n ,\n ,\n ,\n // fee,\n // tickLower,\n // tickUpper,\n // amount0Desired,\n // amount1Desired,\n amount0Min,\n amount1Min,\n recipient,\n deadline\n ]\n ] = ifaceV32.parseTransaction(call)?.args || []\n return [\n getAction('Add liquidity'),\n getToken(token0, amount0Min),\n getToken(token1, amount1Min),\n getLabel('pair'),\n ...getRecipientText(accountOp.accountAddr, recipient),\n getDeadline(deadline)\n ]\n }\n }\n}\n\nconst uniV3Mapping = (): HumanizerUniMatcher => {\n const ifaceV3 = new Interface(UniV3Router)\n return {\n // 0xac9650d8\n [ifaceV3.getFunction('multicall')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const args = ifaceV3.parseTransaction(call)?.args || []\n const calls = args[args.length - 1]\n const mappingResult = uniV3Mapping()\n const parsed = calls.map((data: string): HumanizerVisualization[] => {\n const sigHash = data.slice(0, 10)\n const humanizer = mappingResult[sigHash]\n return humanizer ? humanizer(accountOp, { ...call, data }) : [getAction('Unknown action')]\n })\n\n return parsed.length ? uniReduce(parsed) : getUnknownVisualization('Uni V3', call)\n },\n // -------------------------------------------------------------------------------------------------\n // NOTE: selfPermit is not supported cause it requires an ecrecover signature\n // 0x414bf389\n [ifaceV3.getFunction('exactInputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n // @TODO: consider fees\n return [\n getAction('Swap'),\n getToken(params.tokenIn, params.amountIn),\n getLabel('for at least'),\n getToken(params.tokenOut, params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xc04b8d59\n [ifaceV3.getFunction('exactInput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap'),\n getToken(path[0], params.amountIn),\n getLabel('for at least'),\n getToken(path[path.length - 1], params.amountOutMinimum),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xdb3e2198\n [ifaceV3.getFunction('exactOutputSingle')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Swap up to'),\n getToken(params.tokenIn, params.amountInMaximum),\n getLabel('for'),\n getToken(params.tokenOut, params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0xf28c0498\n [ifaceV3.getFunction('exactOutput')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [params] = ifaceV3.parseTransaction(call)?.args || []\n const path = parsePath(params.path)\n return [\n getAction('Swap up to'),\n getToken(path[path.length - 1], params.amountInMaximum),\n getLabel('for'),\n getToken(path[0], params.amountOut),\n ...getUniRecipientText(accountOp.accountAddr, params.recipient),\n getDeadline(params.deadline)\n ]\n },\n // 0x49404b7c\n [ifaceV3.getFunction('unwrapWETH9')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient] = ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x9b2c0a37\n [ifaceV3.getFunction('unwrapWETH9WithFee')?.selector!]: (\n accountOp: AccountOp,\n call: IrCall\n ): HumanizerVisualization[] => {\n const [amountMin, recipient, feeBips, feeRecipient] =\n ifaceV3.parseTransaction(call)?.args || []\n return [\n getAction('Unwrap'),\n getToken(ZeroAddress, amountMin),\n getLabel('with fee'),\n getToken(ZeroAddress, feeBips),\n getLabel('to'),\n getAddressVisualization(feeRecipient),\n ...getUniRecipientText(accountOp.accountAddr, recipient)\n ]\n },\n // 0x12210e8a\n [ifaceV3.getFunction('refundETH()')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Refund')]\n }\n }\n}\n\nexport { uniV32Mapping, uniV3Mapping }\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.js b/dist/src/libs/humanizer/modules/Uniswap/utils.js index 8ca25ff0e..7191d9424 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/utils.js +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.js @@ -1,7 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniReduce = exports.joinWithAndLabel = exports.getUniRecipientText = exports.parsePath = void 0; /* eslint-disable no-continue */ -import { ZeroAddress } from 'ethers'; -import { getLabel, getRecipientText } from '../../utils'; -export function parsePath(pathBytes) { +const ethers_1 = require("ethers"); +const utils_1 = require("../../utils"); +function parsePath(pathBytes) { // some decodePacked fun // can we do this with Ethers AbiCoder? probably not const path = []; @@ -11,12 +14,15 @@ export function parsePath(pathBytes) { } return path; } -export const getUniRecipientText = (accAddr, recAddr) => ['0x0000000000000000000000000000000000000001', ZeroAddress].includes(recAddr) +exports.parsePath = parsePath; +const getUniRecipientText = (accAddr, recAddr) => ['0x0000000000000000000000000000000000000001', ethers_1.ZeroAddress].includes(recAddr) ? [] - : getRecipientText(accAddr, recAddr); -export const joinWithAndLabel = (humanizations) => { - return humanizations.reduce((acc, arr) => [...acc, ...arr, getLabel('and')], []).slice(0, -1); + : (0, utils_1.getRecipientText)(accAddr, recAddr); +exports.getUniRecipientText = getUniRecipientText; +const joinWithAndLabel = (humanizations) => { + return humanizations.reduce((acc, arr) => [...acc, ...arr, (0, utils_1.getLabel)('and')], []).slice(0, -1); }; +exports.joinWithAndLabel = joinWithAndLabel; const isSwap = (call) => call && call.length >= 4 && call[0].content?.includes('Swap') && @@ -35,7 +41,7 @@ const isSend = (call) => call && call[1].type === 'token' && call[2]?.content?.includes('to') && call[3].type === 'address'; -export const uniReduce = (_calls) => { +const uniReduce = (_calls) => { const calls = _calls; const originalCallsLength = calls.length; for (let i = 0; i < calls.length; i++) { @@ -47,7 +53,7 @@ export const uniReduce = (_calls) => { isSwap(calls[i]) && isWrap(calls[j]) && calls[j][1].value === calls[i][1].value) { - calls[i][1].address = ZeroAddress; + calls[i][1].address = ethers_1.ZeroAddress; calls.splice(j, 1); } // looks for unwrap after the swap @@ -57,7 +63,7 @@ export const uniReduce = (_calls) => { isSwap(calls[i]) && isUnwrap(calls[j]) && calls[j][1].value === calls[i][3].value) { - calls[i][3].address = ZeroAddress; + calls[i][3].address = ethers_1.ZeroAddress; calls.splice(j, 1); } // looks for swaps to merge @@ -95,6 +101,7 @@ export const uniReduce = (_calls) => { } } } - return originalCallsLength === calls.length ? joinWithAndLabel(calls) : uniReduce(calls); + return originalCallsLength === calls.length ? (0, exports.joinWithAndLabel)(calls) : (0, exports.uniReduce)(calls); }; +exports.uniReduce = uniReduce; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Uniswap/utils.js.map b/dist/src/libs/humanizer/modules/Uniswap/utils.js.map index 0a7ea678f..424d237d7 100644 --- a/dist/src/libs/humanizer/modules/Uniswap/utils.js.map +++ b/dist/src/libs/humanizer/modules/Uniswap/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-continue */\nimport { ZeroAddress } from 'ethers'\n\nimport { HumanizerVisualization } from '../../interfaces'\nimport { getLabel, getRecipientText } from '../../utils'\n\nexport function parsePath(pathBytes: any) {\n // some decodePacked fun\n // can we do this with Ethers AbiCoder? probably not\n const path = []\n // address, uint24\n for (let i = 2; i < pathBytes.length; i += 46) {\n path.push(`0x${pathBytes.substr(i, 40)}`)\n }\n return path\n}\n\nexport const getUniRecipientText = (accAddr: string, recAddr: string): HumanizerVisualization[] =>\n ['0x0000000000000000000000000000000000000001', ZeroAddress].includes(recAddr)\n ? []\n : getRecipientText(accAddr, recAddr)\n\nexport const joinWithAndLabel = (\n humanizations: HumanizerVisualization[][]\n): HumanizerVisualization[] => {\n return humanizations.reduce((acc, arr) => [...acc, ...arr, getLabel('and')], []).slice(0, -1)\n}\n\nconst isSwap = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Swap') &&\n call[1].type === 'token' &&\n call[3].type === 'token'\n\nconst isTake = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length === 3 &&\n call[0].content?.includes('Take') &&\n call[1].content === 'at least' &&\n call[2].type === 'token'\n\nconst isWrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Wrap') && call[1].type === 'token'\n\nconst isUnwrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Unwrap') && call[1].type === 'token'\n\nconst isSend = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Send') &&\n call[1].type === 'token' &&\n call[2]?.content?.includes('to') &&\n call[3].type === 'address'\nexport const uniReduce = (_calls: HumanizerVisualization[][]): HumanizerVisualization[] => {\n const calls = _calls\n const originalCallsLength = calls.length\n for (let i = 0; i < calls.length; i++) {\n for (let j = 0; j < calls.length; j++) {\n // looks for wraps before the swap\n if (\n j < i &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isWrap(calls[j]) &&\n calls[j]![1].value === calls[i]![1].value\n ) {\n calls[i]![1].address = ZeroAddress\n calls.splice(j, 1)\n }\n // looks for unwrap after the swap\n if (\n i < j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isUnwrap(calls[j]) &&\n calls[j]![1].value === calls[i]![3].value\n ) {\n calls[i]![3].address = ZeroAddress\n calls.splice(j, 1)\n }\n\n // looks for swaps to merge\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isSwap(calls[j]!) &&\n calls[i]![1].address === calls[j]![1].address &&\n calls[i]![3].address === calls[j]![3].address\n ) {\n calls[i]![1].value = calls[i]![1].value! + calls[j]![1].value!\n calls[i]![3].value = calls[i]![3].value! + calls[j]![3].value!\n calls.splice(j, 1)\n }\n\n // looks for fee payment to subtract\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSend(calls[j]) &&\n isSwap(calls[i]!) &&\n calls[i]![3].value! / 400n >= calls[j]![1].value!\n ) {\n calls[i]![3].value = calls[i]![3].value! - calls[j]![1].value!\n calls.splice(j, 1)\n }\n\n // looks for take (sweep) action to infer the swap minimum by\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isTake(calls[j]!) &&\n calls[i]![3].address === calls[j]![2].address\n ) {\n calls[i]![3].value =\n calls[i]![3].value! > calls[j]![2].value! ? calls[i]![3].value : calls[j]![2].value\n calls.splice(j, 1)\n }\n }\n }\n return originalCallsLength === calls.length ? joinWithAndLabel(calls) : uniReduce(calls)\n}\n"]} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Uniswap/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-continue */\nimport { ZeroAddress } from 'ethers'\n\nimport { HumanizerVisualization } from '../../interfaces'\nimport { getLabel, getRecipientText } from '../../utils'\n\nexport function parsePath(pathBytes: any) {\n // some decodePacked fun\n // can we do this with Ethers AbiCoder? probably not\n const path = []\n // address, uint24\n for (let i = 2; i < pathBytes.length; i += 46) {\n path.push(`0x${pathBytes.substr(i, 40)}`)\n }\n return path\n}\n\nexport const getUniRecipientText = (accAddr: string, recAddr: string): HumanizerVisualization[] =>\n ['0x0000000000000000000000000000000000000001', ZeroAddress].includes(recAddr)\n ? []\n : getRecipientText(accAddr, recAddr)\n\nexport const joinWithAndLabel = (\n humanizations: HumanizerVisualization[][]\n): HumanizerVisualization[] => {\n return humanizations.reduce((acc, arr) => [...acc, ...arr, getLabel('and')], []).slice(0, -1)\n}\n\nconst isSwap = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Swap') &&\n call[1].type === 'token' &&\n call[3].type === 'token'\n\nconst isTake = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length === 3 &&\n call[0].content?.includes('Take') &&\n call[1].content === 'at least' &&\n call[2].type === 'token'\n\nconst isWrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Wrap') && call[1].type === 'token'\n\nconst isUnwrap = (call: HumanizerVisualization[] | undefined) =>\n call && call.length >= 2 && call[0].content?.includes('Unwrap') && call[1].type === 'token'\n\nconst isSend = (call: HumanizerVisualization[] | undefined) =>\n call &&\n call.length >= 4 &&\n call[0].content?.includes('Send') &&\n call[1].type === 'token' &&\n call[2]?.content?.includes('to') &&\n call[3].type === 'address'\nexport const uniReduce = (_calls: HumanizerVisualization[][]): HumanizerVisualization[] => {\n const calls = _calls\n const originalCallsLength = calls.length\n for (let i = 0; i < calls.length; i++) {\n for (let j = 0; j < calls.length; j++) {\n // looks for wraps before the swap\n if (\n j < i &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isWrap(calls[j]) &&\n calls[j]![1].value === calls[i]![1].value\n ) {\n calls[i]![1].address = ZeroAddress\n calls.splice(j, 1)\n }\n // looks for unwrap after the swap\n if (\n i < j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]) &&\n isUnwrap(calls[j]) &&\n calls[j]![1].value === calls[i]![3].value\n ) {\n calls[i]![3].address = ZeroAddress\n calls.splice(j, 1)\n }\n\n // looks for swaps to merge\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isSwap(calls[j]!) &&\n calls[i]![1].address === calls[j]![1].address &&\n calls[i]![3].address === calls[j]![3].address\n ) {\n calls[i]![1].value = calls[i]![1].value! + calls[j]![1].value!\n calls[i]![3].value = calls[i]![3].value! + calls[j]![3].value!\n calls.splice(j, 1)\n }\n\n // looks for fee payment to subtract\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSend(calls[j]) &&\n isSwap(calls[i]!) &&\n calls[i]![3].value! / 400n >= calls[j]![1].value!\n ) {\n calls[i]![3].value = calls[i]![3].value! - calls[j]![1].value!\n calls.splice(j, 1)\n }\n\n // looks for take (sweep) action to infer the swap minimum by\n if (\n i !== j &&\n calls[i] &&\n calls[j] &&\n isSwap(calls[i]!) &&\n isTake(calls[j]!) &&\n calls[i]![3].address === calls[j]![2].address\n ) {\n calls[i]![3].value =\n calls[i]![3].value! > calls[j]![2].value! ? calls[i]![3].value : calls[j]![2].value\n calls.splice(j, 1)\n }\n }\n }\n return originalCallsLength === calls.length ? joinWithAndLabel(calls) : uniReduce(calls)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js index 360810be4..f135dfd9e 100644 --- a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js @@ -1,29 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WALLETSupplyControllerMapping = void 0; +const tslib_1 = require("tslib"); /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Interface } from 'ethers'; -import WALLETSupplyControllerABI from '../../../../../contracts/compiled/WALLETSupplyController.json'; -import { getAction, getLabel } from '../../utils'; +const ethers_1 = require("ethers"); +const WALLETSupplyController_json_1 = tslib_1.__importDefault(require("../../../../../contracts/compiled/WALLETSupplyController.json")); +const utils_1 = require("../../utils"); // eslint-disable-next-line @typescript-eslint/no-unused-vars -export const WALLETSupplyControllerMapping = () => { - const iface = new Interface(WALLETSupplyControllerABI); +const WALLETSupplyControllerMapping = () => { + const iface = new ethers_1.Interface(WALLETSupplyController_json_1.default); return { [iface.getFunction('claim')?.selector]: (call) => { const { toBurnBps } = iface.parseTransaction(call).args; const burnPercentage = toBurnBps.toString() / 100; return burnPercentage > 0 - ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)] - : [getAction('Claim rewards')]; + ? [(0, utils_1.getAction)('Claim rewards'), (0, utils_1.getLabel)(`with ${burnPercentage}% burn`)] + : [(0, utils_1.getAction)('Claim rewards')]; }, [iface.getFunction('claimWithRootUpdate')?.selector]: (call) => { const { toBurnBps } = iface.parseTransaction(call).args; const burnPercentage = toBurnBps.toString() / 100; return burnPercentage > 0 - ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)] - : [getAction('Claim rewards')]; + ? [(0, utils_1.getAction)('Claim rewards'), (0, utils_1.getLabel)(`with ${burnPercentage}% burn`)] + : [(0, utils_1.getAction)('Claim rewards')]; }, // eslint-disable-next-line @typescript-eslint/no-unused-vars [iface.getFunction('mintVesting')?.selector]: () => { - return [getAction('Claim vested tokens')]; + return [(0, utils_1.getAction)('Claim vested tokens')]; } }; }; +exports.WALLETSupplyControllerMapping = WALLETSupplyControllerMapping; //# sourceMappingURL=WALLETSupplyController.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map index f069937f2..7402df210 100644 --- a/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map +++ b/dist/src/libs/humanizer/modules/WALLET/WALLETSupplyController.js.map @@ -1 +1 @@ -{"version":3,"file":"WALLETSupplyController.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/WALLETSupplyController.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,yBAAyB,MAAM,+DAA+D,CAAA;AAErG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAE3C,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAEtD,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAA4B,EAAE;YAClF,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YACjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,QAAS,CAAC,EAAE,CACrD,IAAY,EACc,EAAE;YAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YAEjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,6DAA6D;QAC7D,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,GAA6B,EAAE;YAC5E,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAA;QAC3C,CAAC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Interface } from 'ethers'\n\nimport WALLETSupplyControllerABI from '../../../../../contracts/compiled/WALLETSupplyController.json'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getLabel } from '../../utils'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETSupplyControllerMapping = (): {\n [key: string]: (arg1: IrCall) => HumanizerVisualization[]\n} => {\n const iface = new Interface(WALLETSupplyControllerABI)\n\n return {\n [iface.getFunction('claim')?.selector!]: (call: IrCall): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n [iface.getFunction('claimWithRootUpdate')?.selector!]: (\n call: IrCall\n ): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [iface.getFunction('mintVesting')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Claim vested tokens')]\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"WALLETSupplyController.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/WALLETSupplyController.ts"],"names":[],"mappings":";;;;AAAA,sDAAsD;AACtD,mCAAkC;AAElC,wIAAqG;AAErG,uCAAiD;AAEjD,6DAA6D;AACtD,MAAM,6BAA6B,GAAG,GAE3C,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,qCAAyB,CAAC,CAAA;IAEtD,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAA4B,EAAE;YAClF,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YACjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,IAAA,iBAAS,EAAC,eAAe,CAAC,EAAE,IAAA,gBAAQ,EAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,IAAA,iBAAS,EAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,QAAS,CAAC,EAAE,CACrD,IAAY,EACc,EAAE;YAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACxD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;YAEjD,OAAO,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,CAAC,IAAA,iBAAS,EAAC,eAAe,CAAC,EAAE,IAAA,gBAAQ,EAAC,QAAQ,cAAc,QAAQ,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC,IAAA,iBAAS,EAAC,eAAe,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,6DAA6D;QAC7D,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,QAAS,CAAC,EAAE,GAA6B,EAAE;YAC5E,OAAO,CAAC,IAAA,iBAAS,EAAC,qBAAqB,CAAC,CAAC,CAAA;QAC3C,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AA5BY,QAAA,6BAA6B,iCA4BzC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Interface } from 'ethers'\n\nimport WALLETSupplyControllerABI from '../../../../../contracts/compiled/WALLETSupplyController.json'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getLabel } from '../../utils'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETSupplyControllerMapping = (): {\n [key: string]: (arg1: IrCall) => HumanizerVisualization[]\n} => {\n const iface = new Interface(WALLETSupplyControllerABI)\n\n return {\n [iface.getFunction('claim')?.selector!]: (call: IrCall): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n [iface.getFunction('claimWithRootUpdate')?.selector!]: (\n call: IrCall\n ): HumanizerVisualization[] => {\n const { toBurnBps } = iface.parseTransaction(call)!.args\n const burnPercentage = toBurnBps.toString() / 100\n\n return burnPercentage > 0\n ? [getAction('Claim rewards'), getLabel(`with ${burnPercentage}% burn`)]\n : [getAction('Claim rewards')]\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [iface.getFunction('mintVesting')?.selector!]: (): HumanizerVisualization[] => {\n return [getAction('Claim vested tokens')]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.js b/dist/src/libs/humanizer/modules/WALLET/index.js index e1510a43f..b3784b6a8 100644 --- a/dist/src/libs/humanizer/modules/WALLET/index.js +++ b/dist/src/libs/humanizer/modules/WALLET/index.js @@ -1,62 +1,65 @@ -import { Interface } from 'ethers'; -import { STK_WALLET, WALLET_STAKING_ADDR, WALLET_TOKEN } from '../../../../consts/addresses'; -import { StkWallet } from '../../const/abis/stkWallet'; -import { checkIfUnknownAction, getAction, getLabel, getToken, getUnknownVisualization } from '../../utils'; -import { StakingPools } from './stakingPools'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WALLETModule = void 0; +const ethers_1 = require("ethers"); +const addresses_1 = require("../../../../consts/addresses"); +const stkWallet_1 = require("../../const/abis/stkWallet"); +const utils_1 = require("../../utils"); +const stakingPools_1 = require("./stakingPools"); // update return ir to be {...ir,calls:newCalls} instead of {calls:newCalls} everywhere -import { WALLETSupplyControllerMapping } from './WALLETSupplyController'; +const WALLETSupplyController_1 = require("./WALLETSupplyController"); const stakingAddresses = [ '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935', '0xb6456b57f03352be48bf101b46c1752a0813491a', '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e' ]; -const stkWalletIface = new Interface(StkWallet); +const stkWalletIface = new ethers_1.Interface(stkWallet_1.StkWallet); // eslint-disable-next-line @typescript-eslint/no-unused-vars -export const WALLETModule = (_, irCalls) => { +const WALLETModule = (_, irCalls) => { const matcher = { - supplyController: WALLETSupplyControllerMapping(), - stakingPool: StakingPools(), + supplyController: (0, WALLETSupplyController_1.WALLETSupplyControllerMapping)(), + stakingPool: (0, stakingPools_1.StakingPools)(), stkWallet: { [stkWalletIface.getFunction('wrapAll').selector]: () => { return [ - getAction('Wrap all'), - getToken(WALLET_STAKING_ADDR, 0n), - getLabel('to'), - getToken(STK_WALLET, 0n) + (0, utils_1.getAction)('Wrap all'), + (0, utils_1.getToken)(addresses_1.WALLET_STAKING_ADDR, 0n), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(addresses_1.STK_WALLET, 0n) ]; }, [stkWalletIface.getFunction('wrap').selector]: ({ data }) => { const [shareAmount] = stkWalletIface.parseTransaction({ data }).args; return [ - getAction('Wrap'), - getToken(WALLET_STAKING_ADDR, shareAmount), - getLabel('to'), - getToken(STK_WALLET, 0n) + (0, utils_1.getAction)('Wrap'), + (0, utils_1.getToken)(addresses_1.WALLET_STAKING_ADDR, shareAmount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getToken)(addresses_1.STK_WALLET, 0n) ]; }, [stkWalletIface.getFunction('unwrap').selector]: ({ data }) => { const [shareAmount] = stkWalletIface.parseTransaction({ data }).args; return [ - getAction('Unwrap'), - getToken(STK_WALLET, 0n), - getLabel('for'), - getToken(WALLET_STAKING_ADDR, shareAmount) + (0, utils_1.getAction)('Unwrap'), + (0, utils_1.getToken)(addresses_1.STK_WALLET, 0n), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(addresses_1.WALLET_STAKING_ADDR, shareAmount) ]; }, [stkWalletIface.getFunction('stakeAndWrap').selector]: ({ data }) => { const [amount] = stkWalletIface.parseTransaction({ data }).args; return [ - getAction('Stake and wrap'), - getToken(WALLET_TOKEN, amount), - getLabel('for'), - getToken(STK_WALLET, 0n) + (0, utils_1.getAction)('Stake and wrap'), + (0, utils_1.getToken)(addresses_1.WALLET_TOKEN, amount), + (0, utils_1.getLabel)('for'), + (0, utils_1.getToken)(addresses_1.STK_WALLET, 0n) ]; } } }; const newCalls = irCalls.map((call) => { if (stakingAddresses.includes(call.to.toLowerCase()) && - (!call.fullVisualization || checkIfUnknownAction(call.fullVisualization))) { + (!call.fullVisualization || (0, utils_1.checkIfUnknownAction)(call.fullVisualization))) { if (matcher.stakingPool[call.data.slice(0, 10)]) { return { ...call, @@ -65,7 +68,7 @@ export const WALLETModule = (_, irCalls) => { } return { ...call, - fullVisualization: getUnknownVisualization('staking', call) + fullVisualization: (0, utils_1.getUnknownVisualization)('staking', call) }; } if (matcher.supplyController[call.data.slice(0, 10)]) { @@ -74,7 +77,7 @@ export const WALLETModule = (_, irCalls) => { fullVisualization: matcher.supplyController[call.data.slice(0, 10)](call) }; } - if (call.to === STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) { + if (call.to === addresses_1.STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) { return { ...call, fullVisualization: matcher.stkWallet[call.data.slice(0, 10)](call) @@ -84,4 +87,5 @@ export const WALLETModule = (_, irCalls) => { }); return newCalls; }; +exports.WALLETModule = WALLETModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/index.js.map b/dist/src/libs/humanizer/modules/WALLET/index.js.map index fca01eb6c..6a931cc21 100644 --- a/dist/src/libs/humanizer/modules/WALLET/index.js.map +++ b/dist/src/libs/humanizer/modules/WALLET/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { STK_WALLET, WALLET_STAKING_ADDR, WALLET_TOKEN } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { StkWallet } from '../../const/abis/stkWallet'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getLabel,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { StakingPools } from './stakingPools'\n// update return ir to be {...ir,calls:newCalls} instead of {calls:newCalls} everywhere\nimport { WALLETSupplyControllerMapping } from './WALLETSupplyController'\n\nconst stakingAddresses = [\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935',\n '0xb6456b57f03352be48bf101b46c1752a0813491a',\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e'\n]\n\nconst stkWalletIface = new Interface(StkWallet)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n supplyController: WALLETSupplyControllerMapping(),\n stakingPool: StakingPools(),\n stkWallet: {\n [stkWalletIface.getFunction('wrapAll')!.selector]: () => {\n return [\n getAction('Wrap all'),\n getToken(WALLET_STAKING_ADDR, 0n),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('wrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Wrap'),\n getToken(WALLET_STAKING_ADDR, shareAmount),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('unwrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Unwrap'),\n getToken(STK_WALLET, 0n),\n getLabel('for'),\n getToken(WALLET_STAKING_ADDR, shareAmount)\n ]\n },\n [stkWalletIface.getFunction('stakeAndWrap')!.selector]: ({ data }: IrCall) => {\n const [amount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Stake and wrap'),\n getToken(WALLET_TOKEN, amount),\n getLabel('for'),\n getToken(STK_WALLET, 0n)\n ]\n }\n }\n }\n const newCalls = irCalls.map((call: IrCall) => {\n if (\n stakingAddresses.includes(call.to.toLowerCase()) &&\n (!call.fullVisualization || checkIfUnknownAction(call.fullVisualization))\n ) {\n if (matcher.stakingPool[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stakingPool[call.data.slice(0, 10)](call)\n }\n }\n return {\n ...call,\n fullVisualization: getUnknownVisualization('staking', call)\n }\n }\n if (matcher.supplyController[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.supplyController[call.data.slice(0, 10)](call)\n }\n }\n\n if (call.to === STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stkWallet[call.data.slice(0, 10)](call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { STK_WALLET, WALLET_STAKING_ADDR, WALLET_TOKEN } from '../../../../consts/addresses'\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { StkWallet } from '../../const/abis/stkWallet'\nimport { HumanizerCallModule, IrCall } from '../../interfaces'\nimport {\n checkIfUnknownAction,\n getAction,\n getLabel,\n getToken,\n getUnknownVisualization\n} from '../../utils'\nimport { StakingPools } from './stakingPools'\n// update return ir to be {...ir,calls:newCalls} instead of {calls:newCalls} everywhere\nimport { WALLETSupplyControllerMapping } from './WALLETSupplyController'\n\nconst stakingAddresses = [\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935',\n '0xb6456b57f03352be48bf101b46c1752a0813491a',\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e'\n]\n\nconst stkWalletIface = new Interface(StkWallet)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const WALLETModule: HumanizerCallModule = (_: AccountOp, irCalls: IrCall[]) => {\n const matcher = {\n supplyController: WALLETSupplyControllerMapping(),\n stakingPool: StakingPools(),\n stkWallet: {\n [stkWalletIface.getFunction('wrapAll')!.selector]: () => {\n return [\n getAction('Wrap all'),\n getToken(WALLET_STAKING_ADDR, 0n),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('wrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Wrap'),\n getToken(WALLET_STAKING_ADDR, shareAmount),\n getLabel('to'),\n getToken(STK_WALLET, 0n)\n ]\n },\n [stkWalletIface.getFunction('unwrap')!.selector]: ({ data }: IrCall) => {\n const [shareAmount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Unwrap'),\n getToken(STK_WALLET, 0n),\n getLabel('for'),\n getToken(WALLET_STAKING_ADDR, shareAmount)\n ]\n },\n [stkWalletIface.getFunction('stakeAndWrap')!.selector]: ({ data }: IrCall) => {\n const [amount] = stkWalletIface.parseTransaction({ data })!.args\n\n return [\n getAction('Stake and wrap'),\n getToken(WALLET_TOKEN, amount),\n getLabel('for'),\n getToken(STK_WALLET, 0n)\n ]\n }\n }\n }\n const newCalls = irCalls.map((call: IrCall) => {\n if (\n stakingAddresses.includes(call.to.toLowerCase()) &&\n (!call.fullVisualization || checkIfUnknownAction(call.fullVisualization))\n ) {\n if (matcher.stakingPool[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stakingPool[call.data.slice(0, 10)](call)\n }\n }\n return {\n ...call,\n fullVisualization: getUnknownVisualization('staking', call)\n }\n }\n if (matcher.supplyController[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.supplyController[call.data.slice(0, 10)](call)\n }\n }\n\n if (call.to === STK_WALLET && matcher.stkWallet[call.data.slice(0, 10)]) {\n return {\n ...call,\n fullVisualization: matcher.stkWallet[call.data.slice(0, 10)](call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js index 425c2be50..70c7af0d9 100644 --- a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js @@ -1,6 +1,9 @@ -import { Interface } from 'ethers'; -import { StakingPool } from '../../const/abis'; -import { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StakingPools = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); const STAKING_POOLS = { '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': { baseToken: '0x88800092ff476844f74dc2fc427974bbee2794ae', @@ -17,45 +20,46 @@ const STAKING_POOLS = { } }; // const WALLET_TOKEN_ADDR = '0x88800092ff476844f74dc2fc427974bbee2794ae' -export const StakingPools = () => { - const iface = new Interface(StakingPool); +const StakingPools = () => { + const iface = new ethers_1.Interface(abis_1.StakingPool); return { [iface.getFunction('enter')?.selector]: (call) => { const { amount } = iface.parseTransaction(call).args; return [ - getAction('Deposit'), - getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount), - getLabel('to'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Deposit'), + (0, utils_1.getToken)(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount), + (0, utils_1.getLabel)('to'), + (0, utils_1.getAddressVisualization)(call.to) ]; }, [iface.getFunction('leave')?.selector]: (call) => { const { shares } = iface.parseTransaction(call).args; return [ - getAction('Leave'), - getLabel('with'), - getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Leave'), + (0, utils_1.getLabel)('with'), + (0, utils_1.getToken)(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + (0, utils_1.getAddressVisualization)(call.to) ]; }, [iface.getFunction('withdraw')?.selector]: (call) => { const { shares } = iface.parseTransaction(call).args; return [ - getAction('Withdraw'), - getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Withdraw'), + (0, utils_1.getToken)(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ]; }, [iface.getFunction('rageLeave')?.selector]: (call) => { const { shares } = iface.parseTransaction(call).args; return [ - getAction('Rage leave'), - getLabel('with'), - getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Rage leave'), + (0, utils_1.getLabel)('with'), + (0, utils_1.getToken)(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares), + (0, utils_1.getAddressVisualization)(call.to) ]; } }; }; +exports.StakingPools = StakingPools; //# sourceMappingURL=stakingPools.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map index 4dc99c96a..761124489 100644 --- a/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map +++ b/dist/src/libs/humanizer/modules/WALLET/stakingPools.js.map @@ -1 +1 @@ -{"version":3,"file":"stakingPools.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/stakingPools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEpF,MAAM,aAAa,GAAiD;IAClE,4CAA4C,EAAE;QAC5C,SAAS,EAAE,4CAA4C;QACvD,IAAI,EAAE,qBAAqB;KAC5B;IACD,4CAA4C,EAAE;QAC5C,SAAS,EAAE,4CAA4C;QACvD,IAAI,EAAE,kBAAkB;KACzB;IACD,+BAA+B;IAC/B,4CAA4C,EAAE;QAC5C,SAAS,EAAE,4CAA4C;QACvD,IAAI,EAAE,4BAA4B;KACnC;CACF,CAAA;AACD,yEAAyE;AAEzE,MAAM,CAAC,MAAM,YAAY,GAAG,GAA+D,EAAE;IAC3F,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;IACxC,OAAO;QACL,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACxD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,OAAO;gBACL,SAAS,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;gBAChE,QAAQ,CAAC,IAAI,CAAC;gBACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YACxD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YAErD,OAAO;gBACL,SAAS,CAAC,OAAO,CAAC;gBAClB,QAAQ,CAAC,MAAM,CAAC;gBAChB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;gBAChE,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;QACD,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,OAAO;gBACL,SAAS,CAAC,UAAU,CAAC;gBACrB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;gBAChE,QAAQ,CAAC,MAAM,CAAC;gBAChB,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;QAED,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAS,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE;YAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,IAAI,CAAA;YACrD,OAAO;gBACL,SAAS,CAAC,YAAY,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC;gBAChB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;gBAChE,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { Interface } from 'ethers'\n\nimport { StakingPool } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst STAKING_POOLS: { [key: string]: { [key: string]: string } } = {\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': {\n baseToken: '0x88800092ff476844f74dc2fc427974bbee2794ae',\n name: 'WALLET Staking Pool'\n },\n '0xb6456b57f03352be48bf101b46c1752a0813491a': {\n baseToken: '0xade00c28244d5ce17d72e40330b1c318cd12b7c3',\n name: 'ADX Staking Pool'\n },\n // this is on polygon for tests\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e': {\n baseToken: '0xe9415e904143e42007865e6864f7f632bd054a08',\n name: 'WALLET Staking Pool (Test)'\n }\n}\n// const WALLET_TOKEN_ADDR = '0x88800092ff476844f74dc2fc427974bbee2794ae'\n\nexport const StakingPools = (): { [key: string]: (c: IrCall) => HumanizerVisualization[] } => {\n const iface = new Interface(StakingPool)\n return {\n [iface.getFunction('enter')?.selector!]: (call: IrCall) => {\n const { amount } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('leave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Withdraw'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n },\n\n [iface.getFunction('rageLeave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Rage leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"stakingPools.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/WALLET/stakingPools.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from 'ethers'\n\nimport { StakingPool } from '../../const/abis'\nimport { HumanizerVisualization, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel, getToken } from '../../utils'\n\nconst STAKING_POOLS: { [key: string]: { [key: string]: string } } = {\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935': {\n baseToken: '0x88800092ff476844f74dc2fc427974bbee2794ae',\n name: 'WALLET Staking Pool'\n },\n '0xb6456b57f03352be48bf101b46c1752a0813491a': {\n baseToken: '0xade00c28244d5ce17d72e40330b1c318cd12b7c3',\n name: 'ADX Staking Pool'\n },\n // this is on polygon for tests\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e': {\n baseToken: '0xe9415e904143e42007865e6864f7f632bd054a08',\n name: 'WALLET Staking Pool (Test)'\n }\n}\n// const WALLET_TOKEN_ADDR = '0x88800092ff476844f74dc2fc427974bbee2794ae'\n\nexport const StakingPools = (): { [key: string]: (c: IrCall) => HumanizerVisualization[] } => {\n const iface = new Interface(StakingPool)\n return {\n [iface.getFunction('enter')?.selector!]: (call: IrCall) => {\n const { amount } = iface.parseTransaction(call)!.args\n return [\n getAction('Deposit'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, amount),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('leave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n\n return [\n getAction('Leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n },\n [iface.getFunction('withdraw')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Withdraw'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n },\n\n [iface.getFunction('rageLeave')?.selector!]: (call: IrCall) => {\n const { shares } = iface.parseTransaction(call)!.args\n return [\n getAction('Rage leave'),\n getLabel('with'),\n getToken(STAKING_POOLS[call.to.toLowerCase()].baseToken, shares),\n getAddressVisualization(call.to)\n ]\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.js b/dist/src/libs/humanizer/modules/Wrapping/index.js index 75c85652c..d9a2d3387 100644 --- a/dist/src/libs/humanizer/modules/Wrapping/index.js +++ b/dist/src/libs/humanizer/modules/Wrapping/index.js @@ -1,3 +1,5 @@ -import { wrappingModule } from './wrapping'; -export default wrappingModule; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const wrapping_1 = require("./wrapping"); +exports.default = wrapping_1.wrappingModule; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/index.js.map b/dist/src/libs/humanizer/modules/Wrapping/index.js.map index 7a7ae332e..0ebbb3858 100644 --- a/dist/src/libs/humanizer/modules/Wrapping/index.js.map +++ b/dist/src/libs/humanizer/modules/Wrapping/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAe,cAAc,CAAA","sourcesContent":["import { wrappingModule } from './wrapping'\n\nexport default wrappingModule\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/index.ts"],"names":[],"mappings":";;AAAA,yCAA2C;AAE3C,kBAAe,yBAAc,CAAA","sourcesContent":["import { wrappingModule } from './wrapping'\n\nexport default wrappingModule\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js index 9d94fdffb..94c6af9d7 100644 --- a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js @@ -1,8 +1,11 @@ -import { Interface, ZeroAddress } from 'ethers'; -import { WETH } from '../../const/abis'; -import { getUnknownVisualization, getUnwrapping, getWrapping } from '../../utils'; -export const wrappingModule = (_, irCalls, humanizerMeta) => { - const iface = new Interface(WETH); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wrappingModule = void 0; +const ethers_1 = require("ethers"); +const abis_1 = require("../../const/abis"); +const utils_1 = require("../../utils"); +const wrappingModule = (_, irCalls, humanizerMeta) => { + const iface = new ethers_1.Interface(abis_1.WETH); const newCalls = irCalls.map((call) => { const knownAddressData = humanizerMeta?.knownAddresses[call.to.toLowerCase()]; if (knownAddressData?.name === 'Wrapped ETH' || @@ -15,7 +18,7 @@ export const wrappingModule = (_, irCalls, humanizerMeta) => { if (call.data.slice(0, 10) === iface.getFunction('deposit')?.selector) { return { ...call, - fullVisualization: getWrapping(ZeroAddress, call.value) + fullVisualization: (0, utils_1.getWrapping)(ethers_1.ZeroAddress, call.value) }; } // 0x2e1a7d4d @@ -23,17 +26,18 @@ export const wrappingModule = (_, irCalls, humanizerMeta) => { const [amount] = iface.parseTransaction(call)?.args || []; return { ...call, - fullVisualization: getUnwrapping(ZeroAddress, amount) + fullVisualization: (0, utils_1.getUnwrapping)(ethers_1.ZeroAddress, amount) }; } if (!call?.fullVisualization) return { ...call, - fullVisualization: getUnknownVisualization('wrapped', call) + fullVisualization: (0, utils_1.getUnknownVisualization)('wrapped', call) }; } return call; }); return newCalls; }; +exports.wrappingModule = wrappingModule; //# sourceMappingURL=wrapping.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map index 0c61dcd82..a722fdc23 100644 --- a/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map +++ b/dist/src/libs/humanizer/modules/Wrapping/wrapping.js.map @@ -1 +1 @@ -{"version":3,"file":"wrapping.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/wrapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEjF,MAAM,CAAC,MAAM,cAAc,GAAwB,CACjD,CAAY,EACZ,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QAC5C,MAAM,gBAAgB,GAAG,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7E,IACE,gBAAgB,EAAE,IAAI,KAAK,aAAa;YACxC,gBAAgB,EAAE,IAAI,KAAK,MAAM;YACjC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;YAC1C,gBAAgB,EAAE,IAAI,KAAK,QAAQ;YACnC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,QAAQ;YAC5C,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,EAC3C;YACA,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE;gBACrE,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;iBACxD,CAAA;aACF;YACD,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;gBACtE,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;gBACzD,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC;iBACtD,CAAA;aACF;YACD,IAAI,CAAC,IAAI,EAAE,iBAAiB;gBAC1B,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC;iBAC5D,CAAA;SACJ;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { WETH } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getUnknownVisualization, getUnwrapping, getWrapping } from '../../utils'\n\nexport const wrappingModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const iface = new Interface(WETH)\n const newCalls = irCalls.map((call: IrCall) => {\n const knownAddressData = humanizerMeta?.knownAddresses[call.to.toLowerCase()]\n if (\n knownAddressData?.name === 'Wrapped ETH' ||\n knownAddressData?.name === 'WETH' ||\n knownAddressData?.token?.symbol === 'WETH' ||\n knownAddressData?.name === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WAVAX'\n ) {\n // 0xd0e30db0\n if (call.data.slice(0, 10) === iface.getFunction('deposit')?.selector) {\n return {\n ...call,\n fullVisualization: getWrapping(ZeroAddress, call.value)\n }\n }\n // 0x2e1a7d4d\n if (call.data.slice(0, 10) === iface.getFunction('withdraw')?.selector) {\n const [amount] = iface.parseTransaction(call)?.args || []\n return {\n ...call,\n fullVisualization: getUnwrapping(ZeroAddress, amount)\n }\n }\n if (!call?.fullVisualization)\n return {\n ...call,\n fullVisualization: getUnknownVisualization('wrapped', call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"wrapping.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/Wrapping/wrapping.ts"],"names":[],"mappings":";;;AAAA,mCAA+C;AAG/C,2CAAuC;AAEvC,uCAAiF;AAE1E,MAAM,cAAc,GAAwB,CACjD,CAAY,EACZ,OAAiB,EACjB,aAA4B,EAC5B,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,WAAI,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QAC5C,MAAM,gBAAgB,GAAG,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7E,IACE,gBAAgB,EAAE,IAAI,KAAK,aAAa;YACxC,gBAAgB,EAAE,IAAI,KAAK,MAAM;YACjC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;YAC1C,gBAAgB,EAAE,IAAI,KAAK,QAAQ;YACnC,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,QAAQ;YAC5C,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,EAC3C;YACA,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE;gBACrE,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,IAAA,mBAAW,EAAC,oBAAW,EAAE,IAAI,CAAC,KAAK,CAAC;iBACxD,CAAA;aACF;YACD,aAAa;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;gBACtE,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;gBACzD,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,IAAA,qBAAa,EAAC,oBAAW,EAAE,MAAM,CAAC;iBACtD,CAAA;aACF;YACD,IAAI,CAAC,IAAI,EAAE,iBAAiB;gBAC1B,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,IAAA,+BAAuB,EAAC,SAAS,EAAE,IAAI,CAAC;iBAC5D,CAAA;SACJ;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAxCY,QAAA,cAAc,kBAwC1B","sourcesContent":["import { Interface, ZeroAddress } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { WETH } from '../../const/abis'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getUnknownVisualization, getUnwrapping, getWrapping } from '../../utils'\n\nexport const wrappingModule: HumanizerCallModule = (\n _: AccountOp,\n irCalls: IrCall[],\n humanizerMeta: HumanizerMeta\n) => {\n const iface = new Interface(WETH)\n const newCalls = irCalls.map((call: IrCall) => {\n const knownAddressData = humanizerMeta?.knownAddresses[call.to.toLowerCase()]\n if (\n knownAddressData?.name === 'Wrapped ETH' ||\n knownAddressData?.name === 'WETH' ||\n knownAddressData?.token?.symbol === 'WETH' ||\n knownAddressData?.name === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WMATIC' ||\n knownAddressData?.token?.symbol === 'WAVAX'\n ) {\n // 0xd0e30db0\n if (call.data.slice(0, 10) === iface.getFunction('deposit')?.selector) {\n return {\n ...call,\n fullVisualization: getWrapping(ZeroAddress, call.value)\n }\n }\n // 0x2e1a7d4d\n if (call.data.slice(0, 10) === iface.getFunction('withdraw')?.selector) {\n const [amount] = iface.parseTransaction(call)?.args || []\n return {\n ...call,\n fullVisualization: getUnwrapping(ZeroAddress, amount)\n }\n }\n if (!call?.fullVisualization)\n return {\n ...call,\n fullVisualization: getUnknownVisualization('wrapped', call)\n }\n }\n return call\n })\n return newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js index 0a3dd8f07..1e52f44f7 100644 --- a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js @@ -1,11 +1,14 @@ -import { Interface } from 'ethers'; -import { AmbireAccount } from '../../const/abis/AmbireAccount'; -import { getAction, getAddressVisualization, getLabel } from '../../utils'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.embeddedAmbireOperationHumanizer = void 0; +const ethers_1 = require("ethers"); +const AmbireAccount_1 = require("../../const/abis/AmbireAccount"); +const utils_1 = require("../../utils"); // the purpose of this module is simply to visualize attempts to hide ambire operations within the current account op // such thing can be done if the dapp requests a tryCatch/executeBySelfSingle/executeBySelf function call directed to the current account // this call will be executed without needing extra authentication. For more details check out AmbireAccount.sol -export const embeddedAmbireOperationHumanizer = (accountOp, irCalls) => { - const iface = new Interface(AmbireAccount); +const embeddedAmbireOperationHumanizer = (accountOp, irCalls) => { + const iface = new ethers_1.Interface(AmbireAccount_1.AmbireAccount); const matcher = { [iface.getFunction('tryCatch').selector]: (originalCall) => { const { to, value, data } = iface.decodeFunctionData('tryCatch', originalCall.data); @@ -43,9 +46,9 @@ export const embeddedAmbireOperationHumanizer = (accountOp, irCalls) => { newCalls.push({ ...call, fullVisualization: [ - getAction('Execute calls'), - getLabel('from'), - getAddressVisualization(call.to) + (0, utils_1.getAction)('Execute calls'), + (0, utils_1.getLabel)('from'), + (0, utils_1.getAddressVisualization)(call.to) ] }); return; @@ -60,7 +63,8 @@ export const embeddedAmbireOperationHumanizer = (accountOp, irCalls) => { (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10)) && !call.fullVisualization?.length)); return hasParsableCalls - ? embeddedAmbireOperationHumanizer(accountOp, newCalls, {}) + ? (0, exports.embeddedAmbireOperationHumanizer)(accountOp, newCalls, {}) : newCalls; }; +exports.embeddedAmbireOperationHumanizer = embeddedAmbireOperationHumanizer; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map index 0543e93fc..29482070f 100644 --- a/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map +++ b/dist/src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, Result } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AmbireAccount } from '../../const/abis/AmbireAccount'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\n// the purpose of this module is simply to visualize attempts to hide ambire operations within the current account op\n// such thing can be done if the dapp requests a tryCatch/executeBySelfSingle/executeBySelf function call directed to the current account\n// this call will be executed without needing extra authentication. For more details check out AmbireAccount.sol\nexport const embeddedAmbireOperationHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[]\n) => {\n const iface = new Interface(AmbireAccount)\n const matcher: { [selector: string]: (originalCall: IrCall) => IrCall[] } = {\n [iface.getFunction('tryCatch')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatch', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('tryCatchLimit')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatchLimit', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelfSingle')!.selector]: (originalCall: IrCall) => {\n const {\n call: { to, value, data }\n } = iface.decodeFunctionData('executeBySelfSingle', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelf')!.selector]: (originalCall: IrCall) => {\n const { calls } = iface.decodeFunctionData('executeBySelf', originalCall.data)\n // ethers returns Result type, which we do not want to leak in the result\n return calls.map(({ to, value, data }: Result) => ({ ...originalCall, to, value, data }))\n }\n }\n const functionSelectorsCallableFromSigner = ['execute', 'executeMultiple', 'executeBySender'].map(\n (i) => iface.getFunction(i)!.selector\n )\n const functionSelectorsCallableFromSelf = [\n 'tryCatch',\n 'tryCatch',\n 'executeBySelfSingle',\n 'executeBySelf'\n ].map((i) => iface.getFunction(i)!.selector)\n const newCalls: IrCall[] = []\n\n irCalls.forEach((call) => {\n if (\n call.to?.toLowerCase() === accountOp.accountAddr.toLowerCase() &&\n matcher[call.data.slice(0, 10)]\n ) {\n newCalls.push(...matcher[call.data.slice(0, 10)](call))\n return\n }\n if (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10))) {\n newCalls.push({\n ...call,\n fullVisualization: [\n getAction('Execute calls'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n })\n return\n }\n newCalls.push(call)\n })\n\n // if an attacker hides some call deeper inside a method, callable from self\n const hasParsableCalls = newCalls.some(\n (call) =>\n // we could unwrap more\n functionSelectorsCallableFromSelf.includes(call.data.slice(0, 10)) ||\n // an unwrapped call could get humanization here\n (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10)) &&\n !call.fullVisualization?.length)\n )\n\n return hasParsableCalls\n ? embeddedAmbireOperationHumanizer(accountOp, newCalls, {} as HumanizerMeta)\n : newCalls\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/libs/humanizer/modules/embeddedAmbireOperationHumanizer/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, Result } from 'ethers'\n\nimport { AccountOp } from '../../../accountOp/accountOp'\nimport { AmbireAccount } from '../../const/abis/AmbireAccount'\nimport { HumanizerCallModule, HumanizerMeta, IrCall } from '../../interfaces'\nimport { getAction, getAddressVisualization, getLabel } from '../../utils'\n\n// the purpose of this module is simply to visualize attempts to hide ambire operations within the current account op\n// such thing can be done if the dapp requests a tryCatch/executeBySelfSingle/executeBySelf function call directed to the current account\n// this call will be executed without needing extra authentication. For more details check out AmbireAccount.sol\nexport const embeddedAmbireOperationHumanizer: HumanizerCallModule = (\n accountOp: AccountOp,\n irCalls: IrCall[]\n) => {\n const iface = new Interface(AmbireAccount)\n const matcher: { [selector: string]: (originalCall: IrCall) => IrCall[] } = {\n [iface.getFunction('tryCatch')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatch', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('tryCatchLimit')!.selector]: (originalCall: IrCall) => {\n const { to, value, data } = iface.decodeFunctionData('tryCatchLimit', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelfSingle')!.selector]: (originalCall: IrCall) => {\n const {\n call: { to, value, data }\n } = iface.decodeFunctionData('executeBySelfSingle', originalCall.data)\n return [{ ...originalCall, to, value, data }]\n },\n [iface.getFunction('executeBySelf')!.selector]: (originalCall: IrCall) => {\n const { calls } = iface.decodeFunctionData('executeBySelf', originalCall.data)\n // ethers returns Result type, which we do not want to leak in the result\n return calls.map(({ to, value, data }: Result) => ({ ...originalCall, to, value, data }))\n }\n }\n const functionSelectorsCallableFromSigner = ['execute', 'executeMultiple', 'executeBySender'].map(\n (i) => iface.getFunction(i)!.selector\n )\n const functionSelectorsCallableFromSelf = [\n 'tryCatch',\n 'tryCatch',\n 'executeBySelfSingle',\n 'executeBySelf'\n ].map((i) => iface.getFunction(i)!.selector)\n const newCalls: IrCall[] = []\n\n irCalls.forEach((call) => {\n if (\n call.to?.toLowerCase() === accountOp.accountAddr.toLowerCase() &&\n matcher[call.data.slice(0, 10)]\n ) {\n newCalls.push(...matcher[call.data.slice(0, 10)](call))\n return\n }\n if (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10))) {\n newCalls.push({\n ...call,\n fullVisualization: [\n getAction('Execute calls'),\n getLabel('from'),\n getAddressVisualization(call.to)\n ]\n })\n return\n }\n newCalls.push(call)\n })\n\n // if an attacker hides some call deeper inside a method, callable from self\n const hasParsableCalls = newCalls.some(\n (call) =>\n // we could unwrap more\n functionSelectorsCallableFromSelf.includes(call.data.slice(0, 10)) ||\n // an unwrapped call could get humanization here\n (functionSelectorsCallableFromSigner.includes(call.data.slice(0, 10)) &&\n !call.fullVisualization?.length)\n )\n\n return hasParsableCalls\n ? embeddedAmbireOperationHumanizer(accountOp, newCalls, {} as HumanizerMeta)\n : newCalls\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.js b/dist/src/libs/humanizer/testHelpers.js index 5d6dcc022..cfbd0c021 100644 --- a/dist/src/libs/humanizer/testHelpers.js +++ b/dist/src/libs/humanizer/testHelpers.js @@ -1,4 +1,7 @@ -export const compareHumanizerVisualizations = (_calls, _expectedVisualizations) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.compareVisualizations = exports.compareHumanizerVisualizations = void 0; +const compareHumanizerVisualizations = (_calls, _expectedVisualizations) => { const calls = _calls.map((c) => ({ ...c, fullVisualization: c.fullVisualization?.map((v) => ({ ...v, id: null })) @@ -10,10 +13,12 @@ export const compareHumanizerVisualizations = (_calls, _expectedVisualizations) expect(call.fullVisualization || []).toEqual(expectedVisualizations[i]); }); }; -export const compareVisualizations = (v1, v2) => { +exports.compareHumanizerVisualizations = compareHumanizerVisualizations; +const compareVisualizations = (v1, v2) => { expect(v1.length).toBe(v2.length); v1.forEach((v, i) => { expect({ ...v2[i], id: null }).toMatchObject({ ...v, id: null }); }); }; +exports.compareVisualizations = compareVisualizations; //# sourceMappingURL=testHelpers.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/testHelpers.js.map b/dist/src/libs/humanizer/testHelpers.js.map index 9212dbdbf..720b44c6d 100644 --- a/dist/src/libs/humanizer/testHelpers.js.map +++ b/dist/src/libs/humanizer/testHelpers.js.map @@ -1 +1 @@ -{"version":3,"file":"testHelpers.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/testHelpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,MAAgB,EAChB,uBAAmD,EACnD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC;QACJ,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE,CAAC,CAAC,CAAA;IACH,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAChE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACpC,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACxD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,EAA4B,EAC5B,EAA4B,EAC5B,EAAE;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IACjC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA","sourcesContent":["import { HumanizerVisualization, IrCall } from './interfaces'\n\nexport const compareHumanizerVisualizations = (\n _calls: IrCall[],\n _expectedVisualizations: HumanizerVisualization[][]\n) => {\n const calls = _calls.map((c) => ({\n ...c,\n fullVisualization: c.fullVisualization?.map((v) => ({ ...v, id: null }))\n }))\n const expectedVisualizations = _expectedVisualizations.map((vs) =>\n vs.map((v) => ({ ...v, id: null }))\n )\n expect(calls.length).toBe(expectedVisualizations.length)\n calls.forEach((call, i) => {\n expect(call.fullVisualization?.length || 0).toBe(expectedVisualizations[i].length)\n expect(call.fullVisualization || []).toEqual(expectedVisualizations[i])\n })\n}\n\nexport const compareVisualizations = (\n v1: HumanizerVisualization[],\n v2: HumanizerVisualization[]\n) => {\n expect(v1.length).toBe(v2.length)\n v1.forEach((v, i) => {\n expect({ ...v2[i], id: null }).toMatchObject({ ...v, id: null })\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"testHelpers.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/testHelpers.ts"],"names":[],"mappings":";;;AAEO,MAAM,8BAA8B,GAAG,CAC5C,MAAgB,EAChB,uBAAmD,EACnD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC;QACJ,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE,CAAC,CAAC,CAAA;IACH,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAChE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACpC,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACxD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAhBY,QAAA,8BAA8B,kCAgB1C;AAEM,MAAM,qBAAqB,GAAG,CACnC,EAA4B,EAC5B,EAA4B,EAC5B,EAAE;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IACjC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AARY,QAAA,qBAAqB,yBAQjC","sourcesContent":["import { HumanizerVisualization, IrCall } from './interfaces'\n\nexport const compareHumanizerVisualizations = (\n _calls: IrCall[],\n _expectedVisualizations: HumanizerVisualization[][]\n) => {\n const calls = _calls.map((c) => ({\n ...c,\n fullVisualization: c.fullVisualization?.map((v) => ({ ...v, id: null }))\n }))\n const expectedVisualizations = _expectedVisualizations.map((vs) =>\n vs.map((v) => ({ ...v, id: null }))\n )\n expect(calls.length).toBe(expectedVisualizations.length)\n calls.forEach((call, i) => {\n expect(call.fullVisualization?.length || 0).toBe(expectedVisualizations[i].length)\n expect(call.fullVisualization || []).toEqual(expectedVisualizations[i])\n })\n}\n\nexport const compareVisualizations = (\n v1: HumanizerVisualization[],\n v2: HumanizerVisualization[]\n) => {\n expect(v1.length).toBe(v2.length)\n v1.forEach((v, i) => {\n expect({ ...v2[i], id: null }).toMatchObject({ ...v, id: null })\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.js b/dist/src/libs/humanizer/utils.js index 7a91e9237..0d3874ccf 100644 --- a/dist/src/libs/humanizer/utils.js +++ b/dist/src/libs/humanizer/utils.js @@ -1,55 +1,70 @@ -import { ZeroAddress } from 'ethers'; -import { geckoIdMapper } from '../../consts/coingecko'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.eToNative = exports.uintToAddress = exports.EMPTY_HUMANIZER_META = exports.getKnownName = exports.getUnwrapping = exports.getWrapping = exports.getUnknownVisualization = exports.checkIfUnknownAction = exports.getNativePrice = exports.getLink = exports.getDeadline = exports.getDeadlineText = exports.getRecipientText = exports.getOnBehalfOf = exports.getText = exports.getChain = exports.getTokenWithChain = exports.getToken = exports.getAddressVisualization = exports.getImage = exports.getAction = exports.getLabel = exports.randomId = exports.getWarning = void 0; +const ethers_1 = require("ethers"); +const coingecko_1 = require("../../consts/coingecko"); const baseUrlCena = 'https://cena.ambire.com/api/v3'; -export function getWarning(content, level = 'caution') { +function getWarning(content, level = 'caution') { return { content, level }; } -export const randomId = () => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); -export function getLabel(content, isBold) { - return { type: 'label', content, id: randomId(), isBold }; +exports.getWarning = getWarning; +const randomId = () => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); +exports.randomId = randomId; +function getLabel(content, isBold) { + return { type: 'label', content, id: (0, exports.randomId)(), isBold }; } -export function getAction(content) { - return { type: 'action', content, id: randomId() }; +exports.getLabel = getLabel; +function getAction(content) { + return { type: 'action', content, id: (0, exports.randomId)() }; } -export function getImage(content) { - return { type: 'image', content, id: randomId() }; +exports.getAction = getAction; +function getImage(content) { + return { type: 'image', content, id: (0, exports.randomId)() }; } -export function getAddressVisualization(_address) { +exports.getImage = getImage; +function getAddressVisualization(_address) { const address = _address.toLowerCase(); - return { type: 'address', address, id: randomId() }; + return { type: 'address', address, id: (0, exports.randomId)() }; } -export function getToken(_address, amount, isHidden, chainId) { +exports.getAddressVisualization = getAddressVisualization; +function getToken(_address, amount, isHidden, chainId) { const address = _address.toLowerCase(); return { type: 'token', address, value: BigInt(amount), - id: randomId(), + id: (0, exports.randomId)(), isHidden, chainId }; } -export function getTokenWithChain(address, amount, chainId) { +exports.getToken = getToken; +function getTokenWithChain(address, amount, chainId) { return getToken(address, amount, undefined, chainId); } -export function getChain(chainId) { - return { type: 'chain', id: randomId(), chainId }; +exports.getTokenWithChain = getTokenWithChain; +function getChain(chainId) { + return { type: 'chain', id: (0, exports.randomId)(), chainId }; } -export function getText(text) { - return { type: 'text', content: text, id: randomId() }; +exports.getChain = getChain; +function getText(text) { + return { type: 'text', content: text, id: (0, exports.randomId)() }; } -export function getOnBehalfOf(onBehalfOf, sender) { +exports.getText = getText; +function getOnBehalfOf(onBehalfOf, sender) { return onBehalfOf.toLowerCase() !== sender.toLowerCase() ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)] : []; } +exports.getOnBehalfOf = getOnBehalfOf; // @TODO on some humanization of uniswap there is recipient 0x000...000 -export function getRecipientText(from, recipient) { +function getRecipientText(from, recipient) { return from.toLowerCase() === recipient.toLowerCase() ? [] : [getLabel('and send it to'), getAddressVisualization(recipient)]; } -export function getDeadlineText(deadline) { +exports.getRecipientText = getRecipientText; +function getDeadlineText(deadline) { const minute = 60000n; const diff = BigInt(deadline) - BigInt(Date.now()); if (diff < 0 && diff > -minute * 2n) @@ -62,24 +77,27 @@ export function getDeadlineText(deadline) { return `expires in ${Math.floor(Number(diff / minute))} minutes`; return `valid until ${new Date(Number(deadline)).toLocaleString()}`; } -export function getDeadline(deadlineSecs) { +exports.getDeadlineText = getDeadlineText; +function getDeadline(deadlineSecs) { const deadline = BigInt(deadlineSecs) * 1000n; return { type: 'deadline', value: deadline, - id: randomId() + id: (0, exports.randomId)() }; } -export function getLink(url, content) { - return { type: 'link', url, content, id: randomId() }; +exports.getDeadline = getDeadline; +function getLink(url, content) { + return { type: 'link', url, content, id: (0, exports.randomId)() }; } +exports.getLink = getLink; /** * Make a request to coingecko to fetch the latest price of the native token. * This is used by benzina and hence we cannot wrap the errors in emitError */ // @TODO this shouldn't be here, a more suitable place would be portfolio/gecko -export async function getNativePrice(network, fetch) { - const platformId = geckoIdMapper(ZeroAddress, network); +async function getNativePrice(network, fetch) { + const platformId = (0, coingecko_1.geckoIdMapper)(ethers_1.ZeroAddress, network); if (!platformId) { throw new Error(`getNativePrice: ${network.name} is not supported`); } @@ -91,30 +109,38 @@ export async function getNativePrice(network, fetch) { } return response[platformId].usd; } -export function checkIfUnknownAction(v) { +exports.getNativePrice = getNativePrice; +function checkIfUnknownAction(v) { return !!(v && v[0]?.type === 'action' && v?.[0]?.content?.startsWith('Unknown action')); } -export function getUnknownVisualization(name, call) { +exports.checkIfUnknownAction = checkIfUnknownAction; +function getUnknownVisualization(name, call) { const unknownVisualization = [ getAction(`Unknown action (${name})`), getLabel('to'), getAddressVisualization(call.to) ]; if (call.value) - unknownVisualization.push(...[getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]); + unknownVisualization.push(...[getLabel('and'), getAction('Send'), getToken(ethers_1.ZeroAddress, call.value)]); return unknownVisualization; } -export function getWrapping(address, amount) { +exports.getUnknownVisualization = getUnknownVisualization; +function getWrapping(address, amount) { return [getAction('Wrap'), getToken(address, amount)]; } -export function getUnwrapping(address, amount) { +exports.getWrapping = getWrapping; +function getUnwrapping(address, amount) { return [getAction('Unwrap'), getToken(address, amount)]; } +exports.getUnwrapping = getUnwrapping; // @TODO cant this be used in the
-export function getKnownName(humanizerMeta, address) { +function getKnownName(humanizerMeta, address) { return humanizerMeta?.knownAddresses?.[address.toLowerCase()]?.name; } -export const EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }; -export const uintToAddress = (uint) => `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`; -export const eToNative = (address) => address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ZeroAddress : address; +exports.getKnownName = getKnownName; +exports.EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }; +const uintToAddress = (uint) => `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`; +exports.uintToAddress = uintToAddress; +const eToNative = (address) => address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ethers_1.ZeroAddress : address; +exports.eToNative = eToNative; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/src/libs/humanizer/utils.js.map b/dist/src/libs/humanizer/utils.js.map index 71f38dc70..e6c801498 100644 --- a/dist/src/libs/humanizer/utils.js.map +++ b/dist/src/libs/humanizer/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAKtD,MAAM,WAAW,GAAG,gCAAgC,CAAA;AAEpD,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,QAAmC,SAAS;IAE5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAC3B,CAAC;AACD,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;AAEzF,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAAgB;IACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAA;AAC3D,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AACpD,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AACnD,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,QAAgB,EAChB,MAAc,EACd,QAAkB,EAClB,OAAgB;IAEhB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACtC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,QAAQ,EAAE;QACd,QAAQ;QACR,OAAO;KACR,CAAA;AACH,CAAC;AACD,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,MAAc,EACd,OAAgB;IAEhB,OAAO,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAc;IAC9D,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE;QACtD,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC,CAAC,EAAE,CAAA;AACR,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IAC9D,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE;QACnD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAA;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAElD,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,kBAAkB,CAAA;IAC9D,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAA;IACtC,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,+BAA+B,CAAA;IACzD,IAAI,IAAI,GAAG,GAAG,GAAG,MAAM;QAAE,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,UAAU,CAAA;IACzF,OAAO,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAA6B;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAA;IAC7C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,QAAQ;QACf,EAAE,EAAE,QAAQ,EAAE;KACf,CAAA;AACH,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,OAAe;IAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AACvD,CAAC;AAED;;;GAGG;AACH,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB,EAAE,KAAY;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,mBAAmB,CAAC,CAAA;KACpE;IAED,MAAM,QAAQ,GAAG,GAAG,WAAW,qBAAqB,UAAU,oBAAoB,CAAA;IAClF,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;IACpC,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAEhC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;QACtD,MAAM,IAAI,KAAK,CAAC,0DAA0D,OAAO,CAAC,IAAI,GAAG,CAAC,CAAA;KAC3F;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAuC;IAC1E,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAA;AAC1F,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,IAAY;IAChE,MAAM,oBAAoB,GAAG;QAC3B,SAAS,CAAC,mBAAmB,IAAI,GAAG,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC;QACd,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;KACjC,CAAA;IACD,IAAI,IAAI,CAAC,KAAK;QACZ,oBAAoB,CAAC,IAAI,CACvB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAC3E,CAAA;IACH,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc;IACzD,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,MAAc;IAC3D,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AACzD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAC1B,aAAwC,EACxC,OAAe;IAEf,OAAO,aAAa,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAA;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAA;AAEhF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE,CACpD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAA;AAE/D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAU,EAAE,CACnD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { HumanizerMeta, HumanizerVisualization, HumanizerWarning, IrCall } from './interfaces'\n\nconst baseUrlCena = 'https://cena.ambire.com/api/v3'\n\nexport function getWarning(\n content: string,\n level: HumanizerWarning['level'] = 'caution'\n): HumanizerWarning {\n return { content, level }\n}\nexport const randomId = (): number => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)\n\nexport function getLabel(content: string, isBold?: boolean): HumanizerVisualization {\n return { type: 'label', content, id: randomId(), isBold }\n}\nexport function getAction(content: string): HumanizerVisualization {\n return { type: 'action', content, id: randomId() }\n}\nexport function getImage(content: string): HumanizerVisualization {\n return { type: 'image', content, id: randomId() }\n}\nexport function getAddressVisualization(_address: string): HumanizerVisualization {\n const address = _address.toLowerCase()\n return { type: 'address', address, id: randomId() }\n}\n\nexport function getToken(\n _address: string,\n amount: bigint,\n isHidden?: boolean,\n chainId?: bigint\n): HumanizerVisualization {\n const address = _address.toLowerCase()\n return {\n type: 'token',\n address,\n value: BigInt(amount),\n id: randomId(),\n isHidden,\n chainId\n }\n}\nexport function getTokenWithChain(\n address: string,\n amount: bigint,\n chainId?: bigint\n): HumanizerVisualization {\n return getToken(address, amount, undefined, chainId)\n}\n\nexport function getChain(chainId: bigint): HumanizerVisualization {\n return { type: 'chain', id: randomId(), chainId }\n}\n\nexport function getText(text: string): HumanizerVisualization {\n return { type: 'text', content: text, id: randomId() }\n}\n\nexport function getOnBehalfOf(onBehalfOf: string, sender: string): HumanizerVisualization[] {\n return onBehalfOf.toLowerCase() !== sender.toLowerCase()\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []\n}\n\n// @TODO on some humanization of uniswap there is recipient 0x000...000\nexport function getRecipientText(from: string, recipient: string): HumanizerVisualization[] {\n return from.toLowerCase() === recipient.toLowerCase()\n ? []\n : [getLabel('and send it to'), getAddressVisualization(recipient)]\n}\n\nexport function getDeadlineText(deadline: bigint): string {\n const minute = 60000n\n const diff = BigInt(deadline) - BigInt(Date.now())\n\n if (diff < 0 && diff > -minute * 2n) return 'expired just now'\n if (diff < 0) return 'already expired'\n if (diff < minute) return 'expires in less than a minute'\n if (diff < 30n * minute) return `expires in ${Math.floor(Number(diff / minute))} minutes`\n return `valid until ${new Date(Number(deadline)).toLocaleString()}`\n}\n\nexport function getDeadline(deadlineSecs: bigint | number): HumanizerVisualization {\n const deadline = BigInt(deadlineSecs) * 1000n\n return {\n type: 'deadline',\n value: deadline,\n id: randomId()\n }\n}\nexport function getLink(url: string, content: string): HumanizerVisualization {\n return { type: 'link', url, content, id: randomId() }\n}\n\n/**\n * Make a request to coingecko to fetch the latest price of the native token.\n * This is used by benzina and hence we cannot wrap the errors in emitError\n */\n// @TODO this shouldn't be here, a more suitable place would be portfolio/gecko\nexport async function getNativePrice(network: Network, fetch: Fetch): Promise {\n const platformId = geckoIdMapper(ZeroAddress, network)\n if (!platformId) {\n throw new Error(`getNativePrice: ${network.name} is not supported`)\n }\n\n const queryUrl = `${baseUrlCena}/simple/price?ids=${platformId}&vs_currencies=usd`\n let response = await fetch(queryUrl)\n response = await response.json()\n\n if (!response[platformId] || !response[platformId].usd) {\n throw new Error(`getNativePrice: could not fetch native token price for ${network.name} `)\n }\n\n return response[platformId].usd\n}\n\nexport function checkIfUnknownAction(v: HumanizerVisualization[] | undefined): boolean {\n return !!(v && v[0]?.type === 'action' && v?.[0]?.content?.startsWith('Unknown action'))\n}\n\nexport function getUnknownVisualization(name: string, call: IrCall): HumanizerVisualization[] {\n const unknownVisualization = [\n getAction(`Unknown action (${name})`),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n if (call.value)\n unknownVisualization.push(\n ...[getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n )\n return unknownVisualization\n}\n\nexport function getWrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Wrap'), getToken(address, amount)]\n}\n\nexport function getUnwrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Unwrap'), getToken(address, amount)]\n}\n\n// @TODO cant this be used in the
\nexport function getKnownName(\n humanizerMeta: HumanizerMeta | undefined,\n address: string\n): string | undefined {\n return humanizerMeta?.knownAddresses?.[address.toLowerCase()]?.name\n}\n\nexport const EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }\n\nexport const uintToAddress = (uint: bigint): string =>\n `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`\n\nexport const eToNative = (address: string): string =>\n address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ZeroAddress : address\n"]} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/libs/humanizer/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { ZeroAddress } from 'ethers'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { HumanizerMeta, HumanizerVisualization, HumanizerWarning, IrCall } from './interfaces'\n\nconst baseUrlCena = 'https://cena.ambire.com/api/v3'\n\nexport function getWarning(\n content: string,\n level: HumanizerWarning['level'] = 'caution'\n): HumanizerWarning {\n return { content, level }\n}\nexport const randomId = (): number => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)\n\nexport function getLabel(content: string, isBold?: boolean): HumanizerVisualization {\n return { type: 'label', content, id: randomId(), isBold }\n}\nexport function getAction(content: string): HumanizerVisualization {\n return { type: 'action', content, id: randomId() }\n}\nexport function getImage(content: string): HumanizerVisualization {\n return { type: 'image', content, id: randomId() }\n}\nexport function getAddressVisualization(_address: string): HumanizerVisualization {\n const address = _address.toLowerCase()\n return { type: 'address', address, id: randomId() }\n}\n\nexport function getToken(\n _address: string,\n amount: bigint,\n isHidden?: boolean,\n chainId?: bigint\n): HumanizerVisualization {\n const address = _address.toLowerCase()\n return {\n type: 'token',\n address,\n value: BigInt(amount),\n id: randomId(),\n isHidden,\n chainId\n }\n}\nexport function getTokenWithChain(\n address: string,\n amount: bigint,\n chainId?: bigint\n): HumanizerVisualization {\n return getToken(address, amount, undefined, chainId)\n}\n\nexport function getChain(chainId: bigint): HumanizerVisualization {\n return { type: 'chain', id: randomId(), chainId }\n}\n\nexport function getText(text: string): HumanizerVisualization {\n return { type: 'text', content: text, id: randomId() }\n}\n\nexport function getOnBehalfOf(onBehalfOf: string, sender: string): HumanizerVisualization[] {\n return onBehalfOf.toLowerCase() !== sender.toLowerCase()\n ? [getLabel('on behalf of'), getAddressVisualization(onBehalfOf)]\n : []\n}\n\n// @TODO on some humanization of uniswap there is recipient 0x000...000\nexport function getRecipientText(from: string, recipient: string): HumanizerVisualization[] {\n return from.toLowerCase() === recipient.toLowerCase()\n ? []\n : [getLabel('and send it to'), getAddressVisualization(recipient)]\n}\n\nexport function getDeadlineText(deadline: bigint): string {\n const minute = 60000n\n const diff = BigInt(deadline) - BigInt(Date.now())\n\n if (diff < 0 && diff > -minute * 2n) return 'expired just now'\n if (diff < 0) return 'already expired'\n if (diff < minute) return 'expires in less than a minute'\n if (diff < 30n * minute) return `expires in ${Math.floor(Number(diff / minute))} minutes`\n return `valid until ${new Date(Number(deadline)).toLocaleString()}`\n}\n\nexport function getDeadline(deadlineSecs: bigint | number): HumanizerVisualization {\n const deadline = BigInt(deadlineSecs) * 1000n\n return {\n type: 'deadline',\n value: deadline,\n id: randomId()\n }\n}\nexport function getLink(url: string, content: string): HumanizerVisualization {\n return { type: 'link', url, content, id: randomId() }\n}\n\n/**\n * Make a request to coingecko to fetch the latest price of the native token.\n * This is used by benzina and hence we cannot wrap the errors in emitError\n */\n// @TODO this shouldn't be here, a more suitable place would be portfolio/gecko\nexport async function getNativePrice(network: Network, fetch: Fetch): Promise {\n const platformId = geckoIdMapper(ZeroAddress, network)\n if (!platformId) {\n throw new Error(`getNativePrice: ${network.name} is not supported`)\n }\n\n const queryUrl = `${baseUrlCena}/simple/price?ids=${platformId}&vs_currencies=usd`\n let response = await fetch(queryUrl)\n response = await response.json()\n\n if (!response[platformId] || !response[platformId].usd) {\n throw new Error(`getNativePrice: could not fetch native token price for ${network.name} `)\n }\n\n return response[platformId].usd\n}\n\nexport function checkIfUnknownAction(v: HumanizerVisualization[] | undefined): boolean {\n return !!(v && v[0]?.type === 'action' && v?.[0]?.content?.startsWith('Unknown action'))\n}\n\nexport function getUnknownVisualization(name: string, call: IrCall): HumanizerVisualization[] {\n const unknownVisualization = [\n getAction(`Unknown action (${name})`),\n getLabel('to'),\n getAddressVisualization(call.to)\n ]\n if (call.value)\n unknownVisualization.push(\n ...[getLabel('and'), getAction('Send'), getToken(ZeroAddress, call.value)]\n )\n return unknownVisualization\n}\n\nexport function getWrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Wrap'), getToken(address, amount)]\n}\n\nexport function getUnwrapping(address: string, amount: bigint): HumanizerVisualization[] {\n return [getAction('Unwrap'), getToken(address, amount)]\n}\n\n// @TODO cant this be used in the
\nexport function getKnownName(\n humanizerMeta: HumanizerMeta | undefined,\n address: string\n): string | undefined {\n return humanizerMeta?.knownAddresses?.[address.toLowerCase()]?.name\n}\n\nexport const EMPTY_HUMANIZER_META = { abis: { NO_ABI: {} }, knownAddresses: {} }\n\nexport const uintToAddress = (uint: bigint): string =>\n `0x${BigInt(uint).toString(16).slice(-40).padStart(40, '0')}`\n\nexport const eToNative = (address: string): string =>\n address.slice(2).toLocaleLowerCase() === 'e'.repeat(40) ? ZeroAddress : address\n"]} \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.js b/dist/src/libs/keyIterator/keyIterator.js index 450048fa4..f13c8dde6 100644 --- a/dist/src/libs/keyIterator/keyIterator.js +++ b/dist/src/libs/keyIterator/keyIterator.js @@ -1,29 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KeyIterator = exports.getPrivateKeyFromSeed = exports.isValidPrivateKey = void 0; /* eslint-disable new-cap */ -import { HDNodeWallet, Mnemonic, Wallet } from 'ethers'; -import { SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET } from '../../consts/derivation'; -import { getHdPathFromTemplate } from '../../utils/hdPath'; -import { isDerivedForSmartAccountKeyOnly } from '../account/account'; -import { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'; -export function isValidPrivateKey(value) { +const ethers_1 = require("ethers"); +const derivation_1 = require("../../consts/derivation"); +const hdPath_1 = require("../../utils/hdPath"); +const account_1 = require("../account/account"); +const keys_1 = require("../keys/keys"); +function isValidPrivateKey(value) { try { - return !!new Wallet(value); + return !!new ethers_1.Wallet(value); } catch { return false; } } -export const getPrivateKeyFromSeed = (seed, keyIndex, hdPathTemplate) => { - const mnemonic = Mnemonic.fromPhrase(seed); - const wallet = HDNodeWallet.fromMnemonic(mnemonic, getHdPathFromTemplate(hdPathTemplate, keyIndex)); +exports.isValidPrivateKey = isValidPrivateKey; +const getPrivateKeyFromSeed = (seed, keyIndex, hdPathTemplate) => { + const mnemonic = ethers_1.Mnemonic.fromPhrase(seed); + const wallet = ethers_1.HDNodeWallet.fromMnemonic(mnemonic, (0, hdPath_1.getHdPathFromTemplate)(hdPathTemplate, keyIndex)); if (wallet) { return wallet.privateKey; } throw new Error('Getting the private key from the seed phrase failed.'); }; +exports.getPrivateKeyFromSeed = getPrivateKeyFromSeed; /** * Serves for retrieving a range of addresses/keys from a given private key or seed phrase */ -export class KeyIterator { +class KeyIterator { type = 'internal'; subType; #privateKey = null; @@ -36,7 +41,7 @@ export class KeyIterator { this.subType = 'private-key'; return; } - if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) { + if (ethers_1.Mnemonic.isValidMnemonic(_privKeyOrSeed)) { this.#seedPhrase = _privKeyOrSeed; this.subType = 'seed'; return; @@ -49,17 +54,17 @@ export class KeyIterator { if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate) throw new Error('keyIterator: invalid or missing arguments'); if (this.#privateKey) { - const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + const shouldDerive = from >= derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; // Before v4.31.0, private keys for accounts used as smart account keys // were derived. That's no longer the case. Importing private keys // does not generate smart accounts anymore. if (!shouldDerive) - keys.push(new Wallet(this.#privateKey).address); + keys.push(new ethers_1.Wallet(this.#privateKey).address); } if (this.#seedPhrase) { - const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase); + const mnemonic = ethers_1.Mnemonic.fromPhrase(this.#seedPhrase); for (let i = from; i <= to; i++) { - const wallet = HDNodeWallet.fromMnemonic(mnemonic, getHdPathFromTemplate(hdPathTemplate, i)); + const wallet = ethers_1.HDNodeWallet.fromMnemonic(mnemonic, (0, hdPath_1.getHdPathFromTemplate)(hdPathTemplate, i)); keys.push(wallet.address); } } @@ -81,15 +86,15 @@ export class KeyIterator { console.error('keyIterator: no seed phrase provided'); return []; } - const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate); + const privateKey = (0, exports.getPrivateKeyFromSeed)(this.#seedPhrase, index, hdPathTemplate); return [ { - addr: new Wallet(privateKey).address, + addr: new ethers_1.Wallet(privateKey).address, type: 'internal', - label: getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) || - getDefaultKeyLabel(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), i), + label: (0, keys_1.getExistingKeyLabel)(keystoreKeys, acc.account.addr, this.type) || + (0, keys_1.getDefaultKeyLabel)(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), i), privateKey, - dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index), + dedicatedToOneSA: (0, account_1.isDerivedForSmartAccountKeyOnly)(index), meta: { createdAt: new Date().getTime() } @@ -105,7 +110,7 @@ export class KeyIterator { // Before v4.31.0, private keys for accounts used as smart account keys // were derived. That's no longer the case. Importing private keys // does not generate smart accounts anymore. - const isPrivateKeyThatShouldBeDerived = isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; + const isPrivateKeyThatShouldBeDerived = isValidPrivateKey(this.#privateKey) && index >= derivation_1.SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET; if (isPrivateKeyThatShouldBeDerived) { // Should never happen console.error('keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'); @@ -113,10 +118,10 @@ export class KeyIterator { } return [ { - addr: new Wallet(this.#privateKey).address, + addr: new ethers_1.Wallet(this.#privateKey).address, type: 'internal', - label: getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) || - getDefaultKeyLabel(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), 0), + label: (0, keys_1.getExistingKeyLabel)(keystoreKeys, acc.account.addr, this.type) || + (0, keys_1.getDefaultKeyLabel)(keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)), 0), privateKey: this.#privateKey, dedicatedToOneSA: false, meta: { @@ -130,8 +135,9 @@ export class KeyIterator { isSeedMatching(seedPhraseToCompareWith) { if (!this.#seedPhrase) return false; - return (Mnemonic.fromPhrase(this.#seedPhrase).phrase === - Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase); + return (ethers_1.Mnemonic.fromPhrase(this.#seedPhrase).phrase === + ethers_1.Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase); } } +exports.KeyIterator = KeyIterator; //# sourceMappingURL=keyIterator.js.map \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.js.map b/dist/src/libs/keyIterator/keyIterator.js.map index d3284a6f8..77032ae8f 100644 --- a/dist/src/libs/keyIterator/keyIterator.js.map +++ b/dist/src/libs/keyIterator/keyIterator.js.map @@ -1 +1 @@ -{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable new-cap */\nimport { HDNodeWallet, Mnemonic, Wallet } from 'ethers'\n\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport { SelectedAccountForImport } from '../../interfaces/account'\nimport { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { getHdPathFromTemplate } from '../../utils/hdPath'\nimport { isDerivedForSmartAccountKeyOnly } from '../account/account'\nimport { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'\n\nexport function isValidPrivateKey(value: string): boolean {\n try {\n return !!new Wallet(value)\n } catch {\n return false\n }\n}\n\nexport const getPrivateKeyFromSeed = (\n seed: string,\n keyIndex: number,\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n) => {\n const mnemonic = Mnemonic.fromPhrase(seed)\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, keyIndex)\n )\n if (wallet) {\n return wallet.privateKey\n }\n\n throw new Error('Getting the private key from the seed phrase failed.')\n}\n\n/**\n * Serves for retrieving a range of addresses/keys from a given private key or seed phrase\n */\nexport class KeyIterator implements KeyIteratorInterface {\n type = 'internal'\n\n subType: 'seed' | 'private-key'\n\n #privateKey: string | null = null\n\n #seedPhrase: string | null = null\n\n constructor(_privKeyOrSeed: string) {\n if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided')\n\n if (isValidPrivateKey(_privKeyOrSeed)) {\n this.#privateKey = _privKeyOrSeed\n this.subType = 'private-key'\n return\n }\n\n if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) {\n this.#seedPhrase = _privKeyOrSeed\n this.subType = 'seed'\n return\n }\n\n throw new Error('keyIterator: invalid argument provided to constructor')\n }\n\n async retrieve(\n fromToArr: { from: number; to: number }[],\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n ) {\n const keys: string[] = []\n\n fromToArr.forEach(({ from, to }) => {\n if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate)\n throw new Error('keyIterator: invalid or missing arguments')\n\n if (this.#privateKey) {\n const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n if (!shouldDerive) keys.push(new Wallet(this.#privateKey).address)\n }\n\n if (this.#seedPhrase) {\n const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase)\n\n for (let i = from; i <= to; i++) {\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, i)\n )\n keys.push(wallet.address)\n }\n }\n })\n\n return keys\n }\n\n retrieveInternalKeys(\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) {\n return selectedAccountsForImport.flatMap((acc) => {\n // Should never happen\n if (!['seed', 'private-key'].includes(this.subType)) {\n console.error('keyIterator: invalid subType', this.subType)\n return []\n }\n\n return acc.accountKeys.flatMap(({ index }: { index: number }, i) => {\n // In case it is a seed, the private keys have to be extracted\n if (this.subType === 'seed') {\n if (!this.#seedPhrase) {\n // Should never happen\n console.error('keyIterator: no seed phrase provided')\n return []\n }\n\n const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate)\n return [\n {\n addr: new Wallet(privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n i\n ),\n privateKey,\n dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index),\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n }\n\n // So the subType is 'private-key' then\n if (!this.#privateKey) {\n // Should never happen\n console.error('keyIterator: no private key provided')\n return []\n }\n\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n const isPrivateKeyThatShouldBeDerived =\n isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n if (isPrivateKeyThatShouldBeDerived) {\n // Should never happen\n console.error(\n 'keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'\n )\n return []\n }\n\n return [\n {\n addr: new Wallet(this.#privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n 0\n ),\n privateKey: this.#privateKey,\n dedicatedToOneSA: false,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n })\n })\n }\n\n isSeedMatching(seedPhraseToCompareWith: string) {\n if (!this.#seedPhrase) return false\n\n return (\n Mnemonic.fromPhrase(this.#seedPhrase).phrase ===\n Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase\n )\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable new-cap */\nimport { HDNodeWallet, Mnemonic, Wallet } from 'ethers'\n\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport { SelectedAccountForImport } from '../../interfaces/account'\nimport { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { getHdPathFromTemplate } from '../../utils/hdPath'\nimport { isDerivedForSmartAccountKeyOnly } from '../account/account'\nimport { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'\n\nexport function isValidPrivateKey(value: string): boolean {\n try {\n return !!new Wallet(value)\n } catch {\n return false\n }\n}\n\nexport const getPrivateKeyFromSeed = (\n seed: string,\n keyIndex: number,\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n) => {\n const mnemonic = Mnemonic.fromPhrase(seed)\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, keyIndex)\n )\n if (wallet) {\n return wallet.privateKey\n }\n\n throw new Error('Getting the private key from the seed phrase failed.')\n}\n\n/**\n * Serves for retrieving a range of addresses/keys from a given private key or seed phrase\n */\nexport class KeyIterator implements KeyIteratorInterface {\n type = 'internal'\n\n subType: 'seed' | 'private-key'\n\n #privateKey: string | null = null\n\n #seedPhrase: string | null = null\n\n constructor(_privKeyOrSeed: string) {\n if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided')\n\n if (isValidPrivateKey(_privKeyOrSeed)) {\n this.#privateKey = _privKeyOrSeed\n this.subType = 'private-key'\n return\n }\n\n if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) {\n this.#seedPhrase = _privKeyOrSeed\n this.subType = 'seed'\n return\n }\n\n throw new Error('keyIterator: invalid argument provided to constructor')\n }\n\n async retrieve(\n fromToArr: { from: number; to: number }[],\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n ) {\n const keys: string[] = []\n\n fromToArr.forEach(({ from, to }) => {\n if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate)\n throw new Error('keyIterator: invalid or missing arguments')\n\n if (this.#privateKey) {\n const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n if (!shouldDerive) keys.push(new Wallet(this.#privateKey).address)\n }\n\n if (this.#seedPhrase) {\n const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase)\n\n for (let i = from; i <= to; i++) {\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, i)\n )\n keys.push(wallet.address)\n }\n }\n })\n\n return keys\n }\n\n retrieveInternalKeys(\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) {\n return selectedAccountsForImport.flatMap((acc) => {\n // Should never happen\n if (!['seed', 'private-key'].includes(this.subType)) {\n console.error('keyIterator: invalid subType', this.subType)\n return []\n }\n\n return acc.accountKeys.flatMap(({ index }: { index: number }, i) => {\n // In case it is a seed, the private keys have to be extracted\n if (this.subType === 'seed') {\n if (!this.#seedPhrase) {\n // Should never happen\n console.error('keyIterator: no seed phrase provided')\n return []\n }\n\n const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate)\n return [\n {\n addr: new Wallet(privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n i\n ),\n privateKey,\n dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index),\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n }\n\n // So the subType is 'private-key' then\n if (!this.#privateKey) {\n // Should never happen\n console.error('keyIterator: no private key provided')\n return []\n }\n\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n const isPrivateKeyThatShouldBeDerived =\n isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n if (isPrivateKeyThatShouldBeDerived) {\n // Should never happen\n console.error(\n 'keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'\n )\n return []\n }\n\n return [\n {\n addr: new Wallet(this.#privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n 0\n ),\n privateKey: this.#privateKey,\n dedicatedToOneSA: false,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n })\n })\n }\n\n isSeedMatching(seedPhraseToCompareWith: string) {\n if (!this.#seedPhrase) return false\n\n return (\n Mnemonic.fromPhrase(this.#seedPhrase).phrase ===\n Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase\n )\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/keys/keys.js b/dist/src/libs/keys/keys.js index acacf4674..aeaf35b1f 100644 --- a/dist/src/libs/keys/keys.js +++ b/dist/src/libs/keys/keys.js @@ -1,10 +1,14 @@ -import { BIP44_STANDARD_DERIVATION_TEMPLATE } from '../../consts/derivation'; -export const DEFAULT_KEY_LABEL_PATTERN = /^Key (\d+)$/; -export const getDefaultKeyLabel = (prevKeys, i) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.migrateKeystoreSeedsWithoutHdPathTemplate = exports.getShouldMigrateKeystoreSeedsWithoutHdPath = exports.migrateKeyMetaNullToKeyMetaCreatedAt = exports.getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = exports.migrateKeyPreferencesToKeystoreKeys = exports.getAccountKeysCount = exports.getExistingKeyLabel = exports.getDefaultKeyLabel = exports.DEFAULT_KEY_LABEL_PATTERN = void 0; +const derivation_1 = require("../../consts/derivation"); +exports.DEFAULT_KEY_LABEL_PATTERN = /^Key (\d+)$/; +const getDefaultKeyLabel = (prevKeys, i) => { const number = prevKeys.length + i + 1; return `Key ${number}`; }; -export const getExistingKeyLabel = (keys, addr, accountAdderType) => { +exports.getDefaultKeyLabel = getDefaultKeyLabel; +const getExistingKeyLabel = (keys, addr, accountAdderType) => { let key; if (accountAdderType) { key = keys.find((k) => k.addr === addr && k.type === accountAdderType); @@ -14,14 +18,16 @@ export const getExistingKeyLabel = (keys, addr, accountAdderType) => { } return key?.label; }; -export const getAccountKeysCount = ({ accountAddr, accounts, keys }) => { +exports.getExistingKeyLabel = getExistingKeyLabel; +const getAccountKeysCount = ({ accountAddr, accounts, keys }) => { const account = accounts.find((x) => x.addr === accountAddr); return keys.filter((x) => account?.associatedKeys.includes(x.addr)).length; }; +exports.getAccountKeysCount = getAccountKeysCount; // As of version 4.33.0, we no longer store the key preferences in a separate object called keyPreferences in the storage. // Migration is needed because each preference (like key label) // is now part of the Key interface and managed by the KeystoreController. -export function migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys) { +function migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys) { return keystoreKeys.map((key) => { if (key.label) return key; @@ -32,13 +38,15 @@ export function migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys return key; }); } +exports.migrateKeyPreferencesToKeystoreKeys = migrateKeyPreferencesToKeystoreKeys; // As of version 4.33.0, we introduced createdAt prop to the Key interface to help with sorting and add more details for the Keys. -export const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys) => keystoreKeys.some((key) => { +const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys) => keystoreKeys.some((key) => { const internalKeyWithoutMeta = key.type === 'internal' && !key.meta; const externalKeyWithoutCreatedAt = key.type !== 'internal' && !('createdAt' in key.meta); return internalKeyWithoutMeta || externalKeyWithoutCreatedAt; }); -export function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys) { +exports.getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = getShouldMigrateKeyMetaNullToKeyMetaCreatedAt; +function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys) { return keystoreKeys.map((key) => { if (!key.meta) return { ...key, meta: { createdAt: null } }; @@ -47,16 +55,19 @@ export function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys) { return key; }); } +exports.migrateKeyMetaNullToKeyMetaCreatedAt = migrateKeyMetaNullToKeyMetaCreatedAt; // As of version v4.33.0, user can change the HD path when importing a seed. // Migration is needed because previously the HD path was not stored, // and the default used was `BIP44_STANDARD_DERIVATION_TEMPLATE`. -export const getShouldMigrateKeystoreSeedsWithoutHdPath = (keystoreSeeds) => +const getShouldMigrateKeystoreSeedsWithoutHdPath = (keystoreSeeds) => // @ts-ignore TS complains, but we know that keystoreSeeds is either an array of strings or an array of objects !!keystoreSeeds?.length && keystoreSeeds.every((seed) => typeof seed === 'string'); -export function migrateKeystoreSeedsWithoutHdPathTemplate(prevKeystoreSeeds) { +exports.getShouldMigrateKeystoreSeedsWithoutHdPath = getShouldMigrateKeystoreSeedsWithoutHdPath; +function migrateKeystoreSeedsWithoutHdPathTemplate(prevKeystoreSeeds) { return prevKeystoreSeeds.map((seed) => ({ seed, - hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE + hdPathTemplate: derivation_1.BIP44_STANDARD_DERIVATION_TEMPLATE })); } +exports.migrateKeystoreSeedsWithoutHdPathTemplate = migrateKeystoreSeedsWithoutHdPathTemplate; //# sourceMappingURL=keys.js.map \ No newline at end of file diff --git a/dist/src/libs/keys/keys.js.map b/dist/src/libs/keys/keys.js.map index 6209fd744..e978e7255 100644 --- a/dist/src/libs/keys/keys.js.map +++ b/dist/src/libs/keys/keys.js.map @@ -1 +1 @@ -{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/libs/keys/keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { BIP44_STANDARD_DERIVATION_TEMPLATE, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Key, KeystoreSeed, StoredKey } from '../../interfaces/keystore'\n\nexport const DEFAULT_KEY_LABEL_PATTERN = /^Key (\\d+)$/\nexport const getDefaultKeyLabel = (prevKeys: Key[], i: number) => {\n const number = prevKeys.length + i + 1\n\n return `Key ${number}`\n}\n\nexport const getExistingKeyLabel = (keys: Key[], addr: string, accountAdderType?: Key['type']) => {\n let key: Key | undefined\n if (accountAdderType) {\n key = keys.find((k) => k.addr === addr && k.type === accountAdderType)\n } else {\n key = keys.find((k) => k.addr === addr)\n }\n return key?.label\n}\n\nexport const getAccountKeysCount = ({\n accountAddr,\n accounts,\n keys\n}: {\n accountAddr: AccountId\n accounts: Account[]\n keys: Key[]\n}) => {\n const account = accounts.find((x) => x.addr === accountAddr)\n\n return keys.filter((x) => account?.associatedKeys.includes(x.addr)).length\n}\n\n// As of version 4.33.0, we no longer store the key preferences in a separate object called keyPreferences in the storage.\n// Migration is needed because each preference (like key label)\n// is now part of the Key interface and managed by the KeystoreController.\nexport function migrateKeyPreferencesToKeystoreKeys(\n keyPreferences: {\n addr: Key['addr']\n type: Key['type']\n label: string\n }[],\n keystoreKeys: StoredKey[]\n) {\n return keystoreKeys.map((key) => {\n if (key.label) return key\n\n const keyPref = keyPreferences.find((k) => k.addr === key.addr && k.type === key.type)\n\n if (keyPref) {\n return { ...key, label: keyPref.label }\n }\n\n return key\n })\n}\n\n// As of version 4.33.0, we introduced createdAt prop to the Key interface to help with sorting and add more details for the Keys.\nexport const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys: StoredKey[]) =>\n keystoreKeys.some((key) => {\n const internalKeyWithoutMeta = key.type === 'internal' && !key.meta\n const externalKeyWithoutCreatedAt = key.type !== 'internal' && !('createdAt' in key.meta)\n\n return internalKeyWithoutMeta || externalKeyWithoutCreatedAt\n })\nexport function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys: StoredKey[]) {\n return keystoreKeys.map((key) => {\n if (!key.meta) return { ...key, meta: { createdAt: null } } as StoredKey\n if (!key.meta.createdAt) return { ...key, meta: { ...key.meta, createdAt: null } } as StoredKey\n\n return key\n })\n}\n\n// As of version v4.33.0, user can change the HD path when importing a seed.\n// Migration is needed because previously the HD path was not stored,\n// and the default used was `BIP44_STANDARD_DERIVATION_TEMPLATE`.\nexport const getShouldMigrateKeystoreSeedsWithoutHdPath = (\n keystoreSeeds: string[] | KeystoreSeed[]\n) =>\n // @ts-ignore TS complains, but we know that keystoreSeeds is either an array of strings or an array of objects\n !!keystoreSeeds?.length && keystoreSeeds.every((seed) => typeof seed === 'string')\nexport function migrateKeystoreSeedsWithoutHdPathTemplate(\n prevKeystoreSeeds: string[]\n): { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }[] {\n return prevKeystoreSeeds.map((seed) => ({\n seed,\n hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE\n }))\n}\n"]} \ No newline at end of file +{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/libs/keys/keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { BIP44_STANDARD_DERIVATION_TEMPLATE, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Key, KeystoreSeed, StoredKey } from '../../interfaces/keystore'\n\nexport const DEFAULT_KEY_LABEL_PATTERN = /^Key (\\d+)$/\nexport const getDefaultKeyLabel = (prevKeys: Key[], i: number) => {\n const number = prevKeys.length + i + 1\n\n return `Key ${number}`\n}\n\nexport const getExistingKeyLabel = (keys: Key[], addr: string, accountAdderType?: Key['type']) => {\n let key: Key | undefined\n if (accountAdderType) {\n key = keys.find((k) => k.addr === addr && k.type === accountAdderType)\n } else {\n key = keys.find((k) => k.addr === addr)\n }\n return key?.label\n}\n\nexport const getAccountKeysCount = ({\n accountAddr,\n accounts,\n keys\n}: {\n accountAddr: AccountId\n accounts: Account[]\n keys: Key[]\n}) => {\n const account = accounts.find((x) => x.addr === accountAddr)\n\n return keys.filter((x) => account?.associatedKeys.includes(x.addr)).length\n}\n\n// As of version 4.33.0, we no longer store the key preferences in a separate object called keyPreferences in the storage.\n// Migration is needed because each preference (like key label)\n// is now part of the Key interface and managed by the KeystoreController.\nexport function migrateKeyPreferencesToKeystoreKeys(\n keyPreferences: {\n addr: Key['addr']\n type: Key['type']\n label: string\n }[],\n keystoreKeys: StoredKey[]\n) {\n return keystoreKeys.map((key) => {\n if (key.label) return key\n\n const keyPref = keyPreferences.find((k) => k.addr === key.addr && k.type === key.type)\n\n if (keyPref) {\n return { ...key, label: keyPref.label }\n }\n\n return key\n })\n}\n\n// As of version 4.33.0, we introduced createdAt prop to the Key interface to help with sorting and add more details for the Keys.\nexport const getShouldMigrateKeyMetaNullToKeyMetaCreatedAt = (keystoreKeys: StoredKey[]) =>\n keystoreKeys.some((key) => {\n const internalKeyWithoutMeta = key.type === 'internal' && !key.meta\n const externalKeyWithoutCreatedAt = key.type !== 'internal' && !('createdAt' in key.meta)\n\n return internalKeyWithoutMeta || externalKeyWithoutCreatedAt\n })\nexport function migrateKeyMetaNullToKeyMetaCreatedAt(keystoreKeys: StoredKey[]) {\n return keystoreKeys.map((key) => {\n if (!key.meta) return { ...key, meta: { createdAt: null } } as StoredKey\n if (!key.meta.createdAt) return { ...key, meta: { ...key.meta, createdAt: null } } as StoredKey\n\n return key\n })\n}\n\n// As of version v4.33.0, user can change the HD path when importing a seed.\n// Migration is needed because previously the HD path was not stored,\n// and the default used was `BIP44_STANDARD_DERIVATION_TEMPLATE`.\nexport const getShouldMigrateKeystoreSeedsWithoutHdPath = (\n keystoreSeeds: string[] | KeystoreSeed[]\n) =>\n // @ts-ignore TS complains, but we know that keystoreSeeds is either an array of strings or an array of objects\n !!keystoreSeeds?.length && keystoreSeeds.every((seed) => typeof seed === 'string')\nexport function migrateKeystoreSeedsWithoutHdPathTemplate(\n prevKeystoreSeeds: string[]\n): { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }[] {\n return prevKeystoreSeeds.map((seed) => ({\n seed,\n hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE\n }))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.js b/dist/src/libs/keystoreSigner/keystoreSigner.js index 43f5565ca..c7f495989 100644 --- a/dist/src/libs/keystoreSigner/keystoreSigner.js +++ b/dist/src/libs/keystoreSigner/keystoreSigner.js @@ -1,6 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KeystoreSigner = void 0; /* eslint-disable new-cap */ -import { getBytes, isHexString, Wallet } from 'ethers'; -export class KeystoreSigner { +const ethers_1 = require("ethers"); +class KeystoreSigner { key; #signer; constructor(_key, _privKey) { @@ -9,7 +12,7 @@ export class KeystoreSigner { if (!_privKey) throw new Error('keystoreSigner: no decrypted private key provided in constructor'); this.key = _key; - this.#signer = new Wallet(_privKey); + this.#signer = new ethers_1.Wallet(_privKey); } async signRawTransaction(params) { const sig = await this.#signer.signTransaction(params); @@ -36,14 +39,15 @@ export class KeystoreSigner { // or you might do ethers.hexlify() if you don't care // therefore, it's the job of the client to think what he wants // to pass. Throwing an error here might save debuging hours - if (!isHexString(hex)) { + if (!(0, ethers_1.isHexString)(hex)) { throw new Error('Keystore signer, signMessage: passed value is not a hex'); } - return this.#signer.signMessage(getBytes(hex)); + return this.#signer.signMessage((0, ethers_1.getBytes)(hex)); } async sendTransaction(transaction) { const transactionRes = await this.#signer.sendTransaction(transaction); return transactionRes; } } +exports.KeystoreSigner = KeystoreSigner; //# sourceMappingURL=keystoreSigner.js.map \ No newline at end of file diff --git a/dist/src/libs/keystoreSigner/keystoreSigner.js.map b/dist/src/libs/keystoreSigner/keystoreSigner.js.map index 1d51b2230..7d5a9c83f 100644 --- a/dist/src/libs/keystoreSigner/keystoreSigner.js.map +++ b/dist/src/libs/keystoreSigner/keystoreSigner.js.map @@ -1 +1 @@ -{"version":3,"file":"keystoreSigner.js","sourceRoot":"","sources":["../../../../src/libs/keystoreSigner/keystoreSigner.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAK1E,MAAM,OAAO,cAAc;IACzB,GAAG,CAAK;IAER,OAAO,CAAQ;IAEf,YAAY,IAAS,EAAE,QAAiB;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAC5E,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QAErF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAA0B;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAEtD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAA0B;QAC5C,sGAAsG;QACtG,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE;YACnC,6CAA6C;YAC7C,OAAO,YAAY,CAAC,KAAK,CAAC,YAAY,CAAA;SACvC;QACD,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAC1C,YAAY,CAAC,MAAM,EACnB,YAAY,CAAC,KAAK,EAClB,YAAY,CAAC,OAAO,CACrB,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,gDAAgD;QAChD,yDAAyD;QACzD,mBAAmB;QACnB,mBAAmB;QACnB,sDAAsD;QACtD,qDAAqD;QACrD,uEAAuE;QACvE,qDAAqD;QACrD,+DAA+D;QAC/D,4DAA4D;QAC5D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;SAC3E;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAA+B;QACnD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAEtE,OAAO,cAAc,CAAA;IACvB,CAAC;CACF","sourcesContent":["/* eslint-disable new-cap */\nimport { getBytes, isHexString, TransactionRequest, Wallet } from 'ethers'\n\nimport { Key, KeystoreSigner as KeystoreSignerInterface } from '../../interfaces/keystore'\nimport { TypedMessage } from '../../interfaces/userRequest'\n\nexport class KeystoreSigner implements KeystoreSignerInterface {\n key: Key\n\n #signer: Wallet\n\n constructor(_key: Key, _privKey?: string) {\n if (!_key) throw new Error('keystoreSigner: no key provided in constructor')\n if (!_privKey)\n throw new Error('keystoreSigner: no decrypted private key provided in constructor')\n\n this.key = _key\n this.#signer = new Wallet(_privKey)\n }\n\n async signRawTransaction(params: TransactionRequest) {\n const sig = await this.#signer.signTransaction(params)\n\n return sig\n }\n\n async signTypedData(typedMessage: TypedMessage) {\n // remove EIP712Domain because otherwise signTypedData throws: ambiguous primary types or unused types\n if (typedMessage.types.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typedMessage.types.EIP712Domain\n }\n // @ts-ignore\n const sig = await this.#signer.signTypedData(\n typedMessage.domain,\n typedMessage.types,\n typedMessage.message\n )\n\n return sig\n }\n\n async signMessage(hex: string): Promise {\n // interface implementation expects a hex number\n // if something different is passed, we have two options:\n // * throw an error\n // * convert to hex\n // converting to hex is not so straightforward, though\n // you might do ethers.toUtf8Bytes() if it's a string\n // or you might do ethers.toBeHex() for a number with a specific length\n // or you might do ethers.hexlify() if you don't care\n // therefore, it's the job of the client to think what he wants\n // to pass. Throwing an error here might save debuging hours\n if (!isHexString(hex)) {\n throw new Error('Keystore signer, signMessage: passed value is not a hex')\n }\n\n return this.#signer.signMessage(getBytes(hex))\n }\n\n async sendTransaction(transaction: TransactionRequest) {\n const transactionRes = await this.#signer.sendTransaction(transaction)\n\n return transactionRes\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"keystoreSigner.js","sourceRoot":"","sources":["../../../../src/libs/keystoreSigner/keystoreSigner.ts"],"names":[],"mappings":";;;AAAA,4BAA4B;AAC5B,mCAA0E;AAK1E,MAAa,cAAc;IACzB,GAAG,CAAK;IAER,OAAO,CAAQ;IAEf,YAAY,IAAS,EAAE,QAAiB;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAC5E,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QAErF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAA0B;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAEtD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAA0B;QAC5C,sGAAsG;QACtG,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE;YACnC,6CAA6C;YAC7C,OAAO,YAAY,CAAC,KAAK,CAAC,YAAY,CAAA;SACvC;QACD,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAC1C,YAAY,CAAC,MAAM,EACnB,YAAY,CAAC,KAAK,EAClB,YAAY,CAAC,OAAO,CACrB,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,gDAAgD;QAChD,yDAAyD;QACzD,mBAAmB;QACnB,mBAAmB;QACnB,sDAAsD;QACtD,qDAAqD;QACrD,uEAAuE;QACvE,qDAAqD;QACrD,+DAA+D;QAC/D,4DAA4D;QAC5D,IAAI,CAAC,IAAA,oBAAW,EAAC,GAAG,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;SAC3E;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAA,iBAAQ,EAAC,GAAG,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAA+B;QACnD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAEtE,OAAO,cAAc,CAAA;IACvB,CAAC;CACF;AA3DD,wCA2DC","sourcesContent":["/* eslint-disable new-cap */\nimport { getBytes, isHexString, TransactionRequest, Wallet } from 'ethers'\n\nimport { Key, KeystoreSigner as KeystoreSignerInterface } from '../../interfaces/keystore'\nimport { TypedMessage } from '../../interfaces/userRequest'\n\nexport class KeystoreSigner implements KeystoreSignerInterface {\n key: Key\n\n #signer: Wallet\n\n constructor(_key: Key, _privKey?: string) {\n if (!_key) throw new Error('keystoreSigner: no key provided in constructor')\n if (!_privKey)\n throw new Error('keystoreSigner: no decrypted private key provided in constructor')\n\n this.key = _key\n this.#signer = new Wallet(_privKey)\n }\n\n async signRawTransaction(params: TransactionRequest) {\n const sig = await this.#signer.signTransaction(params)\n\n return sig\n }\n\n async signTypedData(typedMessage: TypedMessage) {\n // remove EIP712Domain because otherwise signTypedData throws: ambiguous primary types or unused types\n if (typedMessage.types.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typedMessage.types.EIP712Domain\n }\n // @ts-ignore\n const sig = await this.#signer.signTypedData(\n typedMessage.domain,\n typedMessage.types,\n typedMessage.message\n )\n\n return sig\n }\n\n async signMessage(hex: string): Promise {\n // interface implementation expects a hex number\n // if something different is passed, we have two options:\n // * throw an error\n // * convert to hex\n // converting to hex is not so straightforward, though\n // you might do ethers.toUtf8Bytes() if it's a string\n // or you might do ethers.toBeHex() for a number with a specific length\n // or you might do ethers.hexlify() if you don't care\n // therefore, it's the job of the client to think what he wants\n // to pass. Throwing an error here might save debuging hours\n if (!isHexString(hex)) {\n throw new Error('Keystore signer, signMessage: passed value is not a hex')\n }\n\n return this.#signer.signMessage(getBytes(hex))\n }\n\n async sendTransaction(transaction: TransactionRequest) {\n const transactionRes = await this.#signer.sendTransaction(transaction)\n\n return transactionRes\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.js b/dist/src/libs/ledger/ledger.js index 3b8415f5c..3a7f06da4 100644 --- a/dist/src/libs/ledger/ledger.js +++ b/dist/src/libs/ledger/ledger.js @@ -1,10 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeLedgerMessage = void 0; /** * Used to "translate" error codes (inside the messages) returned by the Ledger * device into a human-readable messages. Although alongside the raw error codes * there is a message incoming from Ledger too, it's not self-explanatory and * can be difficult for the end users to understand. */ -export const normalizeLedgerMessage = (error) => { +const normalizeLedgerMessage = (error) => { if (!error || // Generic error returned by the Ledger transport (@ledgerhq/hw-transport) error.toLowerCase().includes('access denied')) @@ -32,4 +35,5 @@ export const normalizeLedgerMessage = (error) => { return error; return `Cannot connect to your Ledger device. Close all other apps that may be accessing it (including apps on your computer). Ensure device is responsive. Ensure Ledger firmware and Ethereum App are up to date. Device error: ${error}`; }; +exports.normalizeLedgerMessage = normalizeLedgerMessage; //# sourceMappingURL=ledger.js.map \ No newline at end of file diff --git a/dist/src/libs/ledger/ledger.js.map b/dist/src/libs/ledger/ledger.js.map index 84bb5b0d4..4b1a49dea 100644 --- a/dist/src/libs/ledger/ledger.js.map +++ b/dist/src/libs/ledger/ledger.js.map @@ -1 +1 @@ -{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../../src/libs/ledger/ledger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IACE,CAAC,KAAK;QACN,0EAA0E;QAC1E,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAE7C,OAAO,yEAAyE,CAAA;IAElF,IACE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACxB;QACA,OAAO,qGAAqG,CAAA;KAC7G;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACxD,OAAO,iEAAiE,CAAA;KACzE;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,+GAA+G,CAAA;KACvH;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,iCAAiC,CAAA;KACzC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;QAC/D,OAAO,4MAA4M,CAAA;KACpN;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAAE,OAAO,KAAK,CAAA;IAE/F,OAAO,6NAA6N,KAAK,EAAE,CAAA;AAC7O,CAAC,CAAA","sourcesContent":["/**\n * Used to \"translate\" error codes (inside the messages) returned by the Ledger\n * device into a human-readable messages. Although alongside the raw error codes\n * there is a message incoming from Ledger too, it's not self-explanatory and\n * can be difficult for the end users to understand.\n */\nexport const normalizeLedgerMessage = (error?: string): string => {\n if (\n !error ||\n // Generic error returned by the Ledger transport (@ledgerhq/hw-transport)\n error.toLowerCase().includes('access denied')\n )\n return 'Cannot connect to your Ledger device. Please make sure it is connected.'\n\n if (\n error.includes('0x5515') ||\n error.includes('0x6b0c') ||\n error.includes('0x650f') ||\n error.includes('0x6511')\n ) {\n return 'Cannot connect to your Ledger device. Please make sure it is unlocked and running the Ethereum app.'\n }\n if (error.includes('0x6e00') || error.includes('0x6b00')) {\n return 'Your Ledger device requires a firmware and Ethereum App update.'\n }\n if (error.includes('0x6d00')) {\n return \"Your Ledger doesn't recognize the command sent. Please update device firmware and Ethereum App and try again.\"\n }\n if (error.includes('0x6985')) {\n return 'Rejected by your Ledger device.'\n }\n if (error.toLowerCase().includes('please enable blind signing')) {\n return 'Blind Signing is disabled on your Ledger device. To sign this transaction, please enable Blind Signing (formerly called Contract Data) in the Ethereum app settings on your Ledger device, then try again.'\n }\n\n // Indicates a custom timeout error, no need to normalize\n if (error.includes('Cannot connect to your Ledger device for an extended period')) return error\n\n return `Cannot connect to your Ledger device. Close all other apps that may be accessing it (including apps on your computer). Ensure device is responsive. Ensure Ledger firmware and Ethereum App are up to date. Device error: ${error}`\n}\n"]} \ No newline at end of file +{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../../src/libs/ledger/ledger.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACI,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IACE,CAAC,KAAK;QACN,0EAA0E;QAC1E,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAE7C,OAAO,yEAAyE,CAAA;IAElF,IACE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACxB;QACA,OAAO,qGAAqG,CAAA;KAC7G;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACxD,OAAO,iEAAiE,CAAA;KACzE;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,+GAA+G,CAAA;KACvH;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5B,OAAO,iCAAiC,CAAA;KACzC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;QAC/D,OAAO,4MAA4M,CAAA;KACpN;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAAE,OAAO,KAAK,CAAA;IAE/F,OAAO,6NAA6N,KAAK,EAAE,CAAA;AAC7O,CAAC,CAAA;AAjCY,QAAA,sBAAsB,0BAiClC","sourcesContent":["/**\n * Used to \"translate\" error codes (inside the messages) returned by the Ledger\n * device into a human-readable messages. Although alongside the raw error codes\n * there is a message incoming from Ledger too, it's not self-explanatory and\n * can be difficult for the end users to understand.\n */\nexport const normalizeLedgerMessage = (error?: string): string => {\n if (\n !error ||\n // Generic error returned by the Ledger transport (@ledgerhq/hw-transport)\n error.toLowerCase().includes('access denied')\n )\n return 'Cannot connect to your Ledger device. Please make sure it is connected.'\n\n if (\n error.includes('0x5515') ||\n error.includes('0x6b0c') ||\n error.includes('0x650f') ||\n error.includes('0x6511')\n ) {\n return 'Cannot connect to your Ledger device. Please make sure it is unlocked and running the Ethereum app.'\n }\n if (error.includes('0x6e00') || error.includes('0x6b00')) {\n return 'Your Ledger device requires a firmware and Ethereum App update.'\n }\n if (error.includes('0x6d00')) {\n return \"Your Ledger doesn't recognize the command sent. Please update device firmware and Ethereum App and try again.\"\n }\n if (error.includes('0x6985')) {\n return 'Rejected by your Ledger device.'\n }\n if (error.toLowerCase().includes('please enable blind signing')) {\n return 'Blind Signing is disabled on your Ledger device. To sign this transaction, please enable Blind Signing (formerly called Contract Data) in the Ethereum app settings on your Ledger device, then try again.'\n }\n\n // Indicates a custom timeout error, no need to normalize\n if (error.includes('Cannot connect to your Ledger device for an extended period')) return error\n\n return `Cannot connect to your Ledger device. Close all other apps that may be accessing it (including apps on your computer). Ensure device is responsive. Ensure Ledger firmware and Ethereum App are up to date. Device error: ${error}`\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.js b/dist/src/libs/magicLink/magicLink.js index ad9474fa2..554f676f9 100644 --- a/dist/src/libs/magicLink/magicLink.js +++ b/dist/src/libs/magicLink/magicLink.js @@ -1,4 +1,7 @@ -export async function requestMagicLink(email, relayerUrl, fetch, options) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.requestMagicLink = void 0; +async function requestMagicLink(email, relayerUrl, fetch, options) { const flow = options?.flow; const resp = await fetch(`${relayerUrl}/email-vault/request-key/${email}${flow ? `?flow=${flow}` : ''}`); const result = await resp.json(); @@ -10,4 +13,5 @@ export async function requestMagicLink(email, relayerUrl, fetch, options) { throw new Error(`magicLink: error getting magic link: ${result.message}`); return result.data; } +exports.requestMagicLink = requestMagicLink; //# sourceMappingURL=magicLink.js.map \ No newline at end of file diff --git a/dist/src/libs/magicLink/magicLink.js.map b/dist/src/libs/magicLink/magicLink.js.map index abbbf9498..a07599a29 100644 --- a/dist/src/libs/magicLink/magicLink.js.map +++ b/dist/src/libs/magicLink/magicLink.js.map @@ -1 +1 @@ -{"version":3,"file":"magicLink.js","sourceRoot":"","sources":["../../../../src/libs/magicLink/magicLink.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAAkB,EAClB,KAAY,EACZ,OAAyD;IAEzD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;IAE1B,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,UAAU,4BAA4B,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAA;IACD,MAAM,MAAM,GAA2B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACxD,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,EAAE,WAAW;QAC9C,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CACH,GAAG,UAAU,4BAA4B,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAC1F,CAAA;QACH,CAAC,EAAE,IAAI,CAAC,CAAA;IAEV,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9F,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC","sourcesContent":["import { MagicLinkFlow } from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport interface MagicLinkData {\n key: string\n secret?: String // this will not be return in prod mode\n expiry: number\n}\n\nexport interface RequestMagicLinkResult {\n success: Boolean\n data: MagicLinkData\n message: String\n}\n\nexport async function requestMagicLink(\n email: String,\n relayerUrl: String,\n fetch: Fetch,\n options?: { autoConfirm?: boolean; flow?: MagicLinkFlow }\n): Promise {\n const flow = options?.flow\n\n const resp = await fetch(\n `${relayerUrl}/email-vault/request-key/${email}${flow ? `?flow=${flow}` : ''}`\n )\n const result: RequestMagicLinkResult = await resp.json()\n if (result?.data?.secret && options?.autoConfirm)\n setTimeout(() => {\n fetch(\n `${relayerUrl}/email-vault/confirm-key/${email}/${result.data.key}/${result.data.secret}`\n )\n }, 2000)\n\n if (!result.success) throw new Error(`magicLink: error getting magic link: ${result.message}`)\n return result.data\n}\n"]} \ No newline at end of file +{"version":3,"file":"magicLink.js","sourceRoot":"","sources":["../../../../src/libs/magicLink/magicLink.ts"],"names":[],"mappings":";;;AAeO,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAAkB,EAClB,KAAY,EACZ,OAAyD;IAEzD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;IAE1B,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,UAAU,4BAA4B,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAA;IACD,MAAM,MAAM,GAA2B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACxD,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,EAAE,WAAW;QAC9C,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CACH,GAAG,UAAU,4BAA4B,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAC1F,CAAA;QACH,CAAC,EAAE,IAAI,CAAC,CAAA;IAEV,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9F,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC;AArBD,4CAqBC","sourcesContent":["import { MagicLinkFlow } from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\n\nexport interface MagicLinkData {\n key: string\n secret?: String // this will not be return in prod mode\n expiry: number\n}\n\nexport interface RequestMagicLinkResult {\n success: Boolean\n data: MagicLinkData\n message: String\n}\n\nexport async function requestMagicLink(\n email: String,\n relayerUrl: String,\n fetch: Fetch,\n options?: { autoConfirm?: boolean; flow?: MagicLinkFlow }\n): Promise {\n const flow = options?.flow\n\n const resp = await fetch(\n `${relayerUrl}/email-vault/request-key/${email}${flow ? `?flow=${flow}` : ''}`\n )\n const result: RequestMagicLinkResult = await resp.json()\n if (result?.data?.secret && options?.autoConfirm)\n setTimeout(() => {\n fetch(\n `${relayerUrl}/email-vault/confirm-key/${email}/${result.data.key}/${result.data.secret}`\n )\n }, 2000)\n\n if (!result.success) throw new Error(`magicLink: error getting magic link: ${result.message}`)\n return result.data\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/main/main.js b/dist/src/libs/main/main.js index 63823e02c..05fdd8035 100644 --- a/dist/src/libs/main/main.js +++ b/dist/src/libs/main/main.js @@ -1,8 +1,12 @@ -import generateSpoofSig from '../../utils/generateSpoofSig'; -import { isSmartAccount } from '../account/account'; -import { getAccountOpsByNetwork } from '../actions/actions'; -import { adjustEntryPointAuthorization } from '../signMessage/signMessage'; -export const batchCallsFromUserRequests = ({ accountAddr, networkId, userRequests }) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAccountOpsForSimulation = exports.makeBasicAccountOpAction = exports.makeSmartAccountOpAction = exports.buildSwitchAccountUserRequest = exports.ACCOUNT_SWITCH_USER_REQUEST = exports.batchCallsFromUserRequests = void 0; +const tslib_1 = require("tslib"); +const generateSpoofSig_1 = tslib_1.__importDefault(require("../../utils/generateSpoofSig")); +const account_1 = require("../account/account"); +const actions_1 = require("../actions/actions"); +const signMessage_1 = require("../signMessage/signMessage"); +const batchCallsFromUserRequests = ({ accountAddr, networkId, userRequests }) => { return userRequests.filter((r) => r.action.kind === 'calls').reduce((uCalls, req) => { if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) { const { calls } = req.action; @@ -11,10 +15,11 @@ export const batchCallsFromUserRequests = ({ accountAddr, networkId, userRequest return uCalls; }, []); }; -export const ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'; -export const buildSwitchAccountUserRequest = ({ nextUserRequest, selectedAccountAddr, networkId, session, dappPromise }) => { +exports.batchCallsFromUserRequests = batchCallsFromUserRequests; +exports.ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'; +const buildSwitchAccountUserRequest = ({ nextUserRequest, selectedAccountAddr, networkId, session, dappPromise }) => { return { - id: ACCOUNT_SWITCH_USER_REQUEST, + id: exports.ACCOUNT_SWITCH_USER_REQUEST, action: { kind: 'switchAccount', params: { @@ -34,10 +39,11 @@ export const buildSwitchAccountUserRequest = ({ nextUserRequest, selectedAccount } }; }; -export const makeSmartAccountOpAction = ({ account, networkId, nonce, actionsQueue, userRequests, entryPointAuthorizationSignature }) => { +exports.buildSwitchAccountUserRequest = buildSwitchAccountUserRequest; +const makeSmartAccountOpAction = ({ account, networkId, nonce, actionsQueue, userRequests, entryPointAuthorizationSignature }) => { const accountOpAction = actionsQueue.find((a) => a.type === 'accountOp' && a.id === `${account.addr}-${networkId}`); if (accountOpAction) { - accountOpAction.accountOp.calls = batchCallsFromUserRequests({ + accountOpAction.accountOp.calls = (0, exports.batchCallsFromUserRequests)({ accountAddr: account.addr, networkId, userRequests @@ -63,16 +69,16 @@ export const makeSmartAccountOpAction = ({ account, networkId, nonce, actionsQue gasLimit: null, gasFeePayment: null, nonce, - signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null, + signature: account.associatedKeys[0] ? (0, generateSpoofSig_1.default)(account.associatedKeys[0]) : null, accountOpToExecuteBefore: null, - calls: batchCallsFromUserRequests({ + calls: (0, exports.batchCallsFromUserRequests)({ accountAddr: account.addr, networkId, userRequests }), meta: { entryPointAuthorization: entryPointAuthorizationSignature - ? adjustEntryPointAuthorization(entryPointAuthorizationSignature) + ? (0, signMessage_1.adjustEntryPointAuthorization)(entryPointAuthorizationSignature) : undefined, paymasterService } @@ -83,7 +89,8 @@ export const makeSmartAccountOpAction = ({ account, networkId, nonce, actionsQue accountOp }; }; -export const makeBasicAccountOpAction = ({ account, networkId, nonce, userRequest }) => { +exports.makeSmartAccountOpAction = makeSmartAccountOpAction; +const makeBasicAccountOpAction = ({ account, networkId, nonce, userRequest }) => { const { calls } = userRequest.action; const accountOp = { accountAddr: account.addr, @@ -93,7 +100,7 @@ export const makeBasicAccountOpAction = ({ account, networkId, nonce, userReques gasLimit: null, gasFeePayment: null, nonce, - signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null, + signature: account.associatedKeys[0] ? (0, generateSpoofSig_1.default)(account.associatedKeys[0]) : null, accountOpToExecuteBefore: null, calls: calls.map((call) => ({ ...call, fromUserRequestId: userRequest.id })) }; @@ -104,15 +111,17 @@ export const makeBasicAccountOpAction = ({ account, networkId, nonce, userReques accountOp }; }; -export const getAccountOpsForSimulation = (account, visibleActionsQueue, network, op) => { - const isSmart = isSmartAccount(account); +exports.makeBasicAccountOpAction = makeBasicAccountOpAction; +const getAccountOpsForSimulation = (account, visibleActionsQueue, network, op) => { + const isSmart = (0, account_1.isSmartAccount)(account); // if there's an op and the account is either smart or the network supports // state override, we pass it along. We do not support simulation for // EOAs on networks without state override (but it works for SA) if (op && (isSmart || (network && !network.rpcNoStateOverride))) return { [op.networkId]: [op] }; if (isSmart) - return getAccountOpsByNetwork(account.addr, visibleActionsQueue) || {}; + return (0, actions_1.getAccountOpsByNetwork)(account.addr, visibleActionsQueue) || {}; return {}; }; +exports.getAccountOpsForSimulation = getAccountOpsForSimulation; //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/src/libs/main/main.js.map b/dist/src/libs/main/main.js.map index aaee1632b..baa4f304a 100644 --- a/dist/src/libs/main/main.js.map +++ b/dist/src/libs/main/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/libs/main/main.ts"],"names":[],"mappings":"AAKA,OAAO,gBAAgB,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAE1E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,WAAW,EACX,SAAS,EACT,YAAY,EAKb,EAAU,EAAE;IACX,OAAQ,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAuB,CAAC,MAAM,CACxF,CAAC,MAAc,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;YAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAe,CAAA;YACrC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;SAC7E;QACD,OAAO,MAAM,CAAA;IACf,CAAC,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,6BAA6B,CAAA;AAExE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,OAAO,EACP,WAAW,EAOZ,EAAe,EAAE;IAChB,OAAO;QACL,EAAE,EAAE,2BAA2B;QAC/B,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE;gBACN,WAAW,EAAE,mBAAmB;gBAChC,mBAAmB,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW;gBACrD,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;gBAC5C,SAAS;aACV;SACF;QACD,OAAO;QACP,IAAI,EAAE;YACJ,YAAY,EAAE,KAAK;SACpB;QACD,WAAW,EAAE;YACX,GAAG,WAAW;YACd,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;SAClB;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,gCAAgC,EAQjC,EAAmB,EAAE;IACpB,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE,CAC1C,CAAA;IAEhC,IAAI,eAAe,EAAE;QACnB,eAAe,CAAC,SAAS,CAAC,KAAK,GAAG,0BAA0B,CAAC;YAC3D,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,SAAS;YACT,YAAY;SACb,CAAC,CAAA;QACF,4DAA4D;QAC5D,4DAA4D;QAC5D,+CAA+C;QAC/C,eAAe,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;QACvC,OAAO,eAAe,CAAA;KACvB;IAED,iDAAiD;IACjD,MAAM,2BAA2B,GAAG,YAAY,CAAC,IAAI,CACnD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,IAAI;QACrC,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS;QAChC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAC5B,CAAA;IACD,MAAM,gBAAgB,GAAG,2BAA2B;QAClD,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,gBAAgB;QACnD,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,SAAS,GAAiC;QAC9C,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,SAAS;QACT,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,KAAK;QACL,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACzF,wBAAwB,EAAE,IAAI;QAC9B,KAAK,EAAE,0BAA0B,CAAC;YAChC,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,SAAS;YACT,YAAY;SACb,CAAC;QACF,IAAI,EAAE;YACJ,uBAAuB,EAAE,gCAAgC;gBACvD,CAAC,CAAC,6BAA6B,CAAC,gCAAgC,CAAC;gBACjE,CAAC,CAAC,SAAS;YACb,gBAAgB;SACjB;KACF,CAAA;IAED,OAAO;QACL,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE;QAClC,IAAI,EAAE,WAAW;QACjB,SAAS;KACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,OAAO,EACP,SAAS,EACT,KAAK,EACL,WAAW,EAMZ,EAAmB,EAAE;IACpB,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,MAAe,CAAA;IAC7C,MAAM,SAAS,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,SAAS;QACT,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,KAAK;QACL,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACzF,wBAAwB,EAAE,IAAI;QAC9B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;KAC7E,CAAA;IAED,OAAO;QACL,6FAA6F;QAC7F,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW;QACjB,SAAS;KACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAgB,EAChB,mBAA6B,EAC7B,OAAiB,EACjB,EAAqB,EAGrB,EAAE;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAEvC,2EAA2E;IAC3E,qEAAqE;IACrE,gEAAgE;IAChE,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;IAEhG,IAAI,OAAO;QAAE,OAAO,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,CAAA;IAEnF,OAAO,EAAE,CAAA;AACX,CAAC,CAAA","sourcesContent":["import { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport generateSpoofSig from '../../utils/generateSpoofSig'\nimport { isSmartAccount } from '../account/account'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getAccountOpsByNetwork } from '../actions/actions'\nimport { adjustEntryPointAuthorization } from '../signMessage/signMessage'\n\nexport const batchCallsFromUserRequests = ({\n accountAddr,\n networkId,\n userRequests\n}: {\n accountAddr: AccountId\n networkId: NetworkId\n userRequests: UserRequest[]\n}): Call[] => {\n return (userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.forEach((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n}\n\nexport const ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'\n\nexport const buildSwitchAccountUserRequest = ({\n nextUserRequest,\n selectedAccountAddr,\n networkId,\n session,\n dappPromise\n}: {\n nextUserRequest: UserRequest\n selectedAccountAddr: string\n networkId: Network['id']\n session: DappProviderRequest['session']\n dappPromise: DappUserRequest['dappPromise']\n}): UserRequest => {\n return {\n id: ACCOUNT_SWITCH_USER_REQUEST,\n action: {\n kind: 'switchAccount',\n params: {\n accountAddr: selectedAccountAddr,\n switchToAccountAddr: nextUserRequest.meta.accountAddr,\n nextRequestType: nextUserRequest.action.kind,\n networkId\n }\n },\n session,\n meta: {\n isSignAction: false\n },\n dappPromise: {\n ...dappPromise,\n resolve: () => {}\n }\n }\n}\n\nexport const makeSmartAccountOpAction = ({\n account,\n networkId,\n nonce,\n actionsQueue,\n userRequests,\n entryPointAuthorizationSignature\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n actionsQueue: Action[]\n userRequests: UserRequest[]\n entryPointAuthorizationSignature?: string\n}): AccountOpAction => {\n const accountOpAction = actionsQueue.find(\n (a) => a.type === 'accountOp' && a.id === `${account.addr}-${networkId}`\n ) as AccountOpAction | undefined\n\n if (accountOpAction) {\n accountOpAction.accountOp.calls = batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n })\n // the nonce might have changed during estimation because of\n // a nonce discrepancy issue. This makes sure we're with the\n // latest nonce should the user decide to batch\n accountOpAction.accountOp.nonce = nonce\n return accountOpAction\n }\n\n // find the user request with a paymaster service\n const userReqWithPaymasterService = userRequests.find(\n (req) =>\n req.meta.accountAddr === account.addr &&\n req.meta.networkId === networkId &&\n req.meta.paymasterService\n )\n const paymasterService = userReqWithPaymasterService\n ? userReqWithPaymasterService.meta.paymasterService\n : undefined\n\n const accountOp: AccountOpAction['accountOp'] = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n }),\n meta: {\n entryPointAuthorization: entryPointAuthorizationSignature\n ? adjustEntryPointAuthorization(entryPointAuthorizationSignature)\n : undefined,\n paymasterService\n }\n }\n\n return {\n id: `${account.addr}-${networkId}`, // SA accountOpAction id\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const makeBasicAccountOpAction = ({\n account,\n networkId,\n nonce,\n userRequest\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n userRequest: UserRequest\n}): AccountOpAction => {\n const { calls } = userRequest.action as Calls\n const accountOp = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: calls.map((call) => ({ ...call, fromUserRequestId: userRequest.id }))\n }\n\n return {\n // BA accountOpAction id same as the userRequest's id because for each call we have an action\n id: userRequest.id,\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const getAccountOpsForSimulation = (\n account: Account,\n visibleActionsQueue: Action[],\n network?: Network,\n op?: AccountOp | null\n): {\n [key: string]: AccountOp[]\n} => {\n const isSmart = isSmartAccount(account)\n\n // if there's an op and the account is either smart or the network supports\n // state override, we pass it along. We do not support simulation for\n // EOAs on networks without state override (but it works for SA)\n if (op && (isSmart || (network && !network.rpcNoStateOverride))) return { [op.networkId]: [op] }\n\n if (isSmart) return getAccountOpsByNetwork(account.addr, visibleActionsQueue) || {}\n\n return {}\n}\n"]} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/libs/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountOpAction, Action } from '../../controllers/actions/actions'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport generateSpoofSig from '../../utils/generateSpoofSig'\nimport { isSmartAccount } from '../account/account'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getAccountOpsByNetwork } from '../actions/actions'\nimport { adjustEntryPointAuthorization } from '../signMessage/signMessage'\n\nexport const batchCallsFromUserRequests = ({\n accountAddr,\n networkId,\n userRequests\n}: {\n accountAddr: AccountId\n networkId: NetworkId\n userRequests: UserRequest[]\n}): Call[] => {\n return (userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.forEach((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n}\n\nexport const ACCOUNT_SWITCH_USER_REQUEST = 'ACCOUNT_SWITCH_USER_REQUEST'\n\nexport const buildSwitchAccountUserRequest = ({\n nextUserRequest,\n selectedAccountAddr,\n networkId,\n session,\n dappPromise\n}: {\n nextUserRequest: UserRequest\n selectedAccountAddr: string\n networkId: Network['id']\n session: DappProviderRequest['session']\n dappPromise: DappUserRequest['dappPromise']\n}): UserRequest => {\n return {\n id: ACCOUNT_SWITCH_USER_REQUEST,\n action: {\n kind: 'switchAccount',\n params: {\n accountAddr: selectedAccountAddr,\n switchToAccountAddr: nextUserRequest.meta.accountAddr,\n nextRequestType: nextUserRequest.action.kind,\n networkId\n }\n },\n session,\n meta: {\n isSignAction: false\n },\n dappPromise: {\n ...dappPromise,\n resolve: () => {}\n }\n }\n}\n\nexport const makeSmartAccountOpAction = ({\n account,\n networkId,\n nonce,\n actionsQueue,\n userRequests,\n entryPointAuthorizationSignature\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n actionsQueue: Action[]\n userRequests: UserRequest[]\n entryPointAuthorizationSignature?: string\n}): AccountOpAction => {\n const accountOpAction = actionsQueue.find(\n (a) => a.type === 'accountOp' && a.id === `${account.addr}-${networkId}`\n ) as AccountOpAction | undefined\n\n if (accountOpAction) {\n accountOpAction.accountOp.calls = batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n })\n // the nonce might have changed during estimation because of\n // a nonce discrepancy issue. This makes sure we're with the\n // latest nonce should the user decide to batch\n accountOpAction.accountOp.nonce = nonce\n return accountOpAction\n }\n\n // find the user request with a paymaster service\n const userReqWithPaymasterService = userRequests.find(\n (req) =>\n req.meta.accountAddr === account.addr &&\n req.meta.networkId === networkId &&\n req.meta.paymasterService\n )\n const paymasterService = userReqWithPaymasterService\n ? userReqWithPaymasterService.meta.paymasterService\n : undefined\n\n const accountOp: AccountOpAction['accountOp'] = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: batchCallsFromUserRequests({\n accountAddr: account.addr,\n networkId,\n userRequests\n }),\n meta: {\n entryPointAuthorization: entryPointAuthorizationSignature\n ? adjustEntryPointAuthorization(entryPointAuthorizationSignature)\n : undefined,\n paymasterService\n }\n }\n\n return {\n id: `${account.addr}-${networkId}`, // SA accountOpAction id\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const makeBasicAccountOpAction = ({\n account,\n networkId,\n nonce,\n userRequest\n}: {\n account: Account\n networkId: string\n nonce: bigint | null\n userRequest: UserRequest\n}): AccountOpAction => {\n const { calls } = userRequest.action as Calls\n const accountOp = {\n accountAddr: account.addr,\n networkId,\n signingKeyAddr: null,\n signingKeyType: null,\n gasLimit: null,\n gasFeePayment: null,\n nonce,\n signature: account.associatedKeys[0] ? generateSpoofSig(account.associatedKeys[0]) : null,\n accountOpToExecuteBefore: null, // @TODO from pending recoveries\n calls: calls.map((call) => ({ ...call, fromUserRequestId: userRequest.id }))\n }\n\n return {\n // BA accountOpAction id same as the userRequest's id because for each call we have an action\n id: userRequest.id,\n type: 'accountOp',\n accountOp\n }\n}\n\nexport const getAccountOpsForSimulation = (\n account: Account,\n visibleActionsQueue: Action[],\n network?: Network,\n op?: AccountOp | null\n): {\n [key: string]: AccountOp[]\n} => {\n const isSmart = isSmartAccount(account)\n\n // if there's an op and the account is either smart or the network supports\n // state override, we pass it along. We do not support simulation for\n // EOAs on networks without state override (but it works for SA)\n if (op && (isSmart || (network && !network.rpcNoStateOverride))) return { [op.networkId]: [op] }\n\n if (isSmart) return getAccountOpsByNetwork(account.addr, visibleActionsQueue) || {}\n\n return {}\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/networks/networks.js b/dist/src/libs/networks/networks.js index f74b4712e..b7502e860 100644 --- a/dist/src/libs/networks/networks.js +++ b/dist/src/libs/networks/networks.js @@ -1,11 +1,14 @@ +"use strict"; /* eslint-disable import/no-extraneous-dependencies */ -import { AMBIRE_ACCOUNT_FACTORY, OPTIMISTIC_ORACLE, SINGLETON } from '../../consts/deploy'; -import { networks as predefinedNetworks } from '../../consts/networks'; -import { Bundler } from '../../services/bundlers/bundler'; -import { getRpcProvider } from '../../services/provider'; -import { getSASupport } from '../deployless/simulateDeployCall'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hasRelayerSupport = exports.canForce4337 = exports.migrateNetworkPreferencesToNetworks = exports.getFeatures = exports.getFeaturesByNetworkProperties = exports.getNetworkInfo = exports.getNetworksWithFailedRPC = exports.is4337Enabled = exports.relayerAdditionalNetworks = void 0; +const deploy_1 = require("../../consts/deploy"); +const networks_1 = require("../../consts/networks"); +const bundler_1 = require("../../services/bundlers/bundler"); +const provider_1 = require("../../services/provider"); +const simulateDeployCall_1 = require("../deployless/simulateDeployCall"); // bnb, gnosis, fantom, metis -export const relayerAdditionalNetworks = [ +exports.relayerAdditionalNetworks = [ { chainId: 56n, name: 'binance-smart-chain' @@ -29,7 +32,7 @@ export const relayerAdditionalNetworks = [ // if he has not, we check if the network is predefinedNetwork and we // have specifically disabled 4337 // finally, we fallback to the bundler support -export function is4337Enabled(hasBundlerSupport, network, force4337) { +function is4337Enabled(hasBundlerSupport, network, force4337) { if (!hasBundlerSupport) return false; // the user has chosen to use 4337 @@ -41,9 +44,11 @@ export function is4337Enabled(hasBundlerSupport, network, force4337) { // this will be true in this case return hasBundlerSupport; } -export const getNetworksWithFailedRPC = ({ providers }) => { +exports.is4337Enabled = is4337Enabled; +const getNetworksWithFailedRPC = ({ providers }) => { return Object.keys(providers).filter((networkId) => typeof providers[networkId].isWorking === 'boolean' && !providers[networkId].isWorking); }; +exports.getNetworksWithFailedRPC = getNetworksWithFailedRPC; async function retryRequest(init, counter = 0) { if (counter >= 2) { throw new Error('flagged'); @@ -55,7 +60,7 @@ async function retryRequest(init, counter = 0) { }); return result; } -export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalArgs) { +async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalArgs) { let networkInfo = { force4337: optionalArgs?.force4337, chainId, @@ -77,7 +82,7 @@ export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalA }); }; let flagged = false; - const provider = getRpcProvider([rpcUrl], chainId); + const provider = (0, provider_1.getRpcProvider)([rpcUrl], chainId); const raiseFlagged = (e, returnData) => { if (e.message === 'flagged') { flagged = true; @@ -88,16 +93,16 @@ export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalA Promise.all([ (async () => { const responses = await Promise.all([ - retryRequest(() => provider.getCode(SINGLETON)), - retryRequest(() => provider.getCode(AMBIRE_ACCOUNT_FACTORY)), - retryRequest(() => getSASupport(provider)), - Bundler.isNetworkSupported(fetch, chainId).catch(() => false) + retryRequest(() => provider.getCode(deploy_1.SINGLETON)), + retryRequest(() => provider.getCode(deploy_1.AMBIRE_ACCOUNT_FACTORY)), + retryRequest(() => (0, simulateDeployCall_1.getSASupport)(provider)), + bundler_1.Bundler.isNetworkSupported(fetch, chainId).catch(() => false) // retryRequest(() => provider.getCode(ERC_4337_ENTRYPOINT)), ]).catch((e) => raiseFlagged(e, ['0x', '0x', { addressMatches: false, supportsStateOverride: false }])); const [singletonCode, factoryCode, saSupport, hasBundlerSupport] = responses; const areContractsDeployed = factoryCode !== '0x'; // const has4337 = entryPointCode !== '0x' && hasBundler - const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId); + const predefinedNetwork = networks_1.networks.find((net) => net.chainId === chainId); // Ambire support is as follows: // - either the addresses match after simulation, that's perfect // - or we can't do the simulation with this RPC but we have the factory @@ -120,7 +125,7 @@ export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalA callback(networkInfo); })(), (async () => { - const oracleCode = await retryRequest(() => provider.getCode(OPTIMISTIC_ORACLE)).catch((e) => raiseFlagged(e, '0x')); + const oracleCode = await retryRequest(() => provider.getCode(deploy_1.OPTIMISTIC_ORACLE)).catch((e) => raiseFlagged(e, '0x')); const isOptimistic = oracleCode !== '0x'; networkInfo = { ...networkInfo, isOptimistic }; callback(networkInfo); @@ -155,8 +160,9 @@ export async function getNetworkInfo(fetch, rpcUrl, chainId, callback, optionalA callback(networkInfo); provider.destroy(); } +exports.getNetworkInfo = getNetworkInfo; // call this if you have the network props already calculated -export function getFeaturesByNetworkProperties(networkInfo) { +function getFeaturesByNetworkProperties(networkInfo) { const features = [ { id: 'saSupport', @@ -203,7 +209,7 @@ export function getFeaturesByNetworkProperties(networkInfo) { : 'Unfortunately, this network doesn’t support Smart Accounts. It can be used only with Basic Accounts (EOAs).' }); } - const predefinedNetSettings = predefinedNetworks.find((net) => net.chainId === chainId); + const predefinedNetSettings = networks_1.networks.find((net) => net.chainId === chainId); const erc4337Settings = { enabled: is4337Enabled(erc4337.enabled, predefinedNetSettings, force4337), hasPaymaster: predefinedNetSettings @@ -229,7 +235,7 @@ export function getFeaturesByNetworkProperties(networkInfo) { } } if ([rpcNoStateOverride].every((p) => p !== 'LOADING')) { - const isPredefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId); + const isPredefinedNetwork = networks_1.networks.find((net) => net.chainId === chainId); if (!rpcNoStateOverride && isPredefinedNetwork) { updateFeature('simulation', { level: 'success', @@ -263,11 +269,13 @@ export function getFeaturesByNetworkProperties(networkInfo) { } return features; } +exports.getFeaturesByNetworkProperties = getFeaturesByNetworkProperties; // call this if you have only the rpcUrls and chainId // this method makes an RPC request, calculates the network info and returns the features -export function getFeatures(networkInfo) { +function getFeatures(networkInfo) { return getFeaturesByNetworkProperties(networkInfo); } +exports.getFeatures = getFeatures; // Since v4.24.0, a new Network interface has been introduced, // that replaces the old NetworkDescriptor, NetworkPreference, and CustomNetwork. // Previously, only NetworkPreferences were stored, with other network properties @@ -275,11 +283,11 @@ export function getFeatures(networkInfo) { // Now, all network properties are pre-calculated and stored in a structured format: { [key: NetworkId]: Network } in the storage. // This function migrates the data from the old NetworkPreferences to the new structure // to ensure compatibility and prevent breaking the extension after updating to v4.24.0 -export async function migrateNetworkPreferencesToNetworks(networkPreferences) { - const predefinedNetworkIds = predefinedNetworks.map((n) => n.id); +async function migrateNetworkPreferencesToNetworks(networkPreferences) { + const predefinedNetworkIds = networks_1.networks.map((n) => n.id); const customNetworkIds = Object.keys(networkPreferences).filter((k) => !predefinedNetworkIds.includes(k)); const networksToStore = {}; - predefinedNetworks.forEach((n) => { + networks_1.networks.forEach((n) => { networksToStore[n.id] = n; }); customNetworkIds.forEach((networkId) => { @@ -307,17 +315,20 @@ export async function migrateNetworkPreferencesToNetworks(networkPreferences) { ...preference, ...networkInfo, features: getFeaturesByNetworkProperties(networkInfo), - hasRelayer: !!relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId), + hasRelayer: !!exports.relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId), predefined: false }; }); return networksToStore; } +exports.migrateNetworkPreferencesToNetworks = migrateNetworkPreferencesToNetworks; // is the user allowed to change the network settings to 4337 -export function canForce4337(network) { +function canForce4337(network) { return network && network.allowForce4337; } -export function hasRelayerSupport(network) { - return (network.hasRelayer || !!relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)); +exports.canForce4337 = canForce4337; +function hasRelayerSupport(network) { + return (network.hasRelayer || !!exports.relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)); } +exports.hasRelayerSupport = hasRelayerSupport; //# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/libs/networks/networks.js.map b/dist/src/libs/networks/networks.js.map index b30d9e885..2fafa09af 100644 --- a/dist/src/libs/networks/networks.js.map +++ b/dist/src/libs/networks/networks.js.map @@ -1 +1 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/libs/networks/networks.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC1F,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAWtE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAE/D,6BAA6B;AAC7B,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC;QACE,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,qBAAqB;KAC5B;IACD;QACE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;KACf;IACD;QACE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;KACf;IACD;QACE,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,WAAW;KAClB;CACF,CAAA;AAED,uBAAuB;AACvB,yDAAyD;AACzD,gFAAgF;AAChF,qEAAqE;AACrE,kCAAkC;AAClC,8CAA8C;AAC9C,MAAM,UAAU,aAAa,CAC3B,iBAA0B,EAC1B,OAAiB,EACjB,SAAmB;IAEnB,IAAI,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAA;IAEpC,kCAAkC;IAClC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAoB,CAAA;IAExD,iCAAiC;IACjC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAA;IAEjE,iCAAiC;IACjC,OAAO,iBAAiB,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EAAE,SAAS,EAA+B,EAAY,EAAE;IAC/F,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAClC,CAAC,SAAS,EAAE,EAAE,CACZ,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CACzF,CAAA;AACH,CAAC,CAAA;AAED,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,OAAO,GAAG,CAAC;IACrD,IAAI,OAAO,IAAI,CAAC,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;KAC3B;IAED,MAAM,OAAO,GAAiB,IAAI,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;QAC5C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;QACtD,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAY,EACZ,MAAc,EACd,OAAe,EACf,QAAgE,EAChE,YAEC;IAED,IAAI,WAAW,GAAoC;QACjD,SAAS,EAAE,YAAY,EAAE,SAAS;QAClC,OAAO;QACP,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,SAAS;QACvB,kBAAkB,EAAE,SAAS;QAC7B,OAAO,EAAE,SAAS;QAClB,oBAAoB,EAAE,SAAS;QAC/B,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,aAAa,EAAE,SAAS;QACxB,OAAO,EAAE,SAAS;KACnB,CAAA;IACD,QAAQ,CAAC,WAAW,CAAC,CAAA;IAErB,MAAM,OAAO,GAAG,CAAC,OAAe,KAAK,EAA8B,EAAE;QACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAA;QAC9C,CAAC,CAA0C,CAAA;IAC7C,CAAC,CAAA;IAED,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;IAElD,MAAM,YAAY,GAAG,CAAC,CAAQ,EAAE,UAAe,EAAO,EAAE;QACtD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE;YAC3B,OAAO,GAAG,IAAI,CAAA;SACf;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC;YACV,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAClC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC/C,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;oBAC5D,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBAC1C,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;oBAC7D,6DAA6D;iBAC9D,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CACpB,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,CACvF,CAAA;gBACD,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,GAAG,SAAS,CAAA;gBAC5E,MAAM,oBAAoB,GAAG,WAAW,KAAK,IAAI,CAAA;gBACjD,wDAAwD;gBACxD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;gBAEnF,gCAAgC;gBAChC,gEAAgE;gBAChE,wEAAwE;gBACxE,0BAA0B;gBAC1B,MAAM,cAAc,GAClB,SAAS,CAAC,cAAc,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,IAAI,oBAAoB,CAAC,CAAA;gBACxF,WAAW,GAAG;oBACZ,GAAG,WAAW;oBACd,YAAY,EAAE,aAAa,KAAK,IAAI;oBACpC,WAAW,EAAE,cAAc,IAAI,aAAa,KAAK,IAAI;oBACrD,oBAAoB;oBACpB,kBAAkB,EAChB,iBAAiB,IAAI,iBAAiB,CAAC,kBAAkB,KAAK,IAAI;wBAChE,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB;oBACtC,OAAO,EAAE;wBACP,OAAO,EAAE,aAAa,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,CAAC;wBACrF,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;wBAChF,iBAAiB;qBAClB;iBACF,CAAA;gBAED,QAAQ,CAAC,WAAW,CAAC,CAAA;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CACpF,CAAC,CAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CACpC,CAAA;gBACD,MAAM,YAAY,GAAG,UAAU,KAAK,IAAI,CAAA;gBAExC,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,CAAA;gBAE9C,QAAQ,CAAC,WAAW,CAAC,CAAA;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CACrF,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CACtB,CAAA;gBACD,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,EAAE,CAAA;gBAE5D,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,CAAA;gBAE5C,QAAQ,CAAC,WAAW,CAAC,CAAA;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,2CAA2C,MAAM,CAAC,OAAO,CAAC,EAAE,CAC7D,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACb,KAAK,EAAE,sDAAsD;iBAC9D,CAAC,CAAC,CAAA;gBACH,yBAAyB;gBACzB,IAAI,UAAU,GAAG,IAAI,CAAA;gBACrB,IAAI,aAAa,GAAG,IAAI,CAAA;gBACxB,IAAI,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,EAAE;oBAClC,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAA;oBACnD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;wBACxB,UAAU,GAAG,aAAa,CAAC,UAAU,CAAA;wBACrC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAA;qBAC5C;iBACF;gBACD,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA;gBAE3D,QAAQ,CAAC,WAAW,CAAC,CAAA;YACvB,CAAC,CAAC,EAAE;SACL,CAAC;QACF,OAAO,EAAE;KACV,CAAC,CAAA;IAEF,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAA;IAChF,QAAQ,CAAC,WAAW,CAAC,CAAA;IAErB,QAAQ,CAAC,OAAO,EAAE,CAAA;AACpB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,8BAA8B,CAC5C,WAAsE;IAEtE,MAAM,QAAQ,GAAqB;QACjC;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,uBAAuB;YAC9B,KAAK,EAAE,SAAS;SACjB;QACD;YACE,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,SAAS;SACjB;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,SAAS;SACjB;KACF,CAAA;IAED,IAAI,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IAE1E,MAAM,EACJ,OAAO,EACP,WAAW,EACX,oBAAoB,EACpB,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,SAAS,EACV,GAAG,WAAW,CAAA;IAEf,MAAM,aAAa,GAAG,CACpB,EAAU,EACV,MAIC,EACD,EAAE;QACF,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAEtD,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;SACpC;IACH,CAAC,CAAA;IACD,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE;QACpC,OAAO;YACL;gBACE,EAAE,EAAE,SAAS;gBACb,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,sGAAsG;aAC5G;SACF,CAAA;KACF;IAED,IACE,CAAC,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,KAAK,CACzE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CACvB,EACD;QACA,IAAI,CAAC,WAAW,EAAE;YAChB,aAAa,CAAC,WAAW,EAAE;gBACzB,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,0CAA0C;gBACjD,GAAG,EAAE,YAAY;oBACf,CAAC,CAAC,oHAAoH;oBACtH,CAAC,CAAC,6GAA6G;aAClH,CAAC,CAAA;SACH;QAED,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;QAEvF,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,aAAa,CACnB,OAA2B,CAAC,OAAO,EACpC,qBAAqB,EACrB,SAAgC,CACjC;YACD,YAAY,EAAE,qBAAqB;gBACjC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,YAAY;gBAC5C,CAAC,CAAE,OAA2B,CAAC,YAAY;SAC9C,CAAA;QAED,MAAM,KAAK,GAAI,eAAuB,EAAE,OAAO;YAC7C,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,uBAAuB,CAAA;QAE3B,IAAI,WAAW,IAAI,oBAAoB,EAAE;YACvC,aAAa,CAAC,WAAW,EAAE;gBACzB,KAAK;gBACL,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,yFAAyF;aAC/F,CAAC,CAAA;SACH;aAAM,IAAI,WAAW,IAAI,CAAC,oBAAoB,EAAE;YAC/C,aAAa,CAAC,WAAW,EAAE;gBACzB,KAAK;gBACL,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,uRAAuR;aAC7R,CAAC,CAAA;SACH;KACF;IAED,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE;QACtD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;QACrF,IAAI,CAAC,kBAAkB,IAAI,mBAAmB,EAAE;YAC9C,aAAa,CAAC,YAAY,EAAE;gBAC1B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,2CAA2C;gBAClD,GAAG,EAAE,kKAAkK;aACxK,CAAC,CAAA;SACH;aAAM,IAAI,CAAC,kBAAkB,EAAE;YAC9B,aAAa,CAAC,YAAY,EAAE;gBAC1B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,+CAA+C;gBACtD,GAAG,EAAE,kQAAkQ;aACxQ,CAAC,CAAA;SACH;aAAM;YACL,aAAa,CAAC,YAAY,EAAE;gBAC1B,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,yCAAyC;gBAChD,GAAG,EAAE,4QAA4Q;aAClR,CAAC,CAAA;SACH;KACF;IAED,IAAI,aAAa,KAAK,SAAS,EAAE;QAC/B,MAAM,gBAAgB,GAAG,aAAa,IAAI,aAAa,KAAK,EAAE,CAAA;QAC9D,aAAa,CAAC,QAAQ,EAAE;YACtB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAC9C,GAAG,EAAE,gBAAgB;gBACnB,CAAC,CAAC,2EAA2E;gBAC7E,CAAC,CAAC,2FAA2F;SAChG,CAAC,CAAA;KACH;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qDAAqD;AACrD,yFAAyF;AACzF,MAAM,UAAU,WAAW,CACzB,WAAwD;IAExD,OAAO,8BAA8B,CAAC,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,8DAA8D;AAC9D,iFAAiF;AACjF,iFAAiF;AACjF,mEAAmE;AACnE,kIAAkI;AAClI,uFAAuF;AACvF,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,mCAAmC,CAAC,kBAEzD;IACC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzC,CAAA;IAED,MAAM,eAAe,GAAkC,EAAE,CAAA;IAEzD,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,gBAAgB,CAAC,OAAO,CAAC,CAAC,SAAoB,EAAE,EAAE;QAChD,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,WAAW,GAAG;YAClB,OAAO,EAAE,UAAU,CAAC,OAAQ;YAC5B,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,KAAK;YAC5C,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,KAAK;YAC9C,kBAAkB,EAAE,UAAU,CAAC,kBAAkB,IAAI,IAAI;YACzD,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI;gBAC7B,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,KAAK;gBACnB,iBAAiB,EAAE,KAAK;aACzB;YACD,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,IAAI,KAAK;YAC9D,UAAU,EAAE,EAAE,MAAM,EAAG,UAAkB,CAAC,MAAM,IAAI,KAAK,EAAE;YAC3D,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,EAAE;YACvC,aAAa,EAAE,UAAU,CAAC,aAAa,IAAI,EAAE;YAC7C,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;YACpC,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,KAAK;SAC/C,CAAA;QACD,OAAQ,UAAkB,CAAC,MAAM,CAAA;QACjC,eAAe,CAAC,SAAS,CAAC,GAAG;YAC3B,EAAE,EAAE,SAAS;YACb,GAAG,UAAU;YACb,GAAG,WAAW;YACd,QAAQ,EAAE,8BAA8B,CAAC,WAAW,CAAC;YACrD,UAAU,EAAE,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,UAAU,CAAC,OAAQ,CAAC;YAC1F,UAAU,EAAE,KAAK;SACP,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,OAAiB;IAC5C,OAAO,OAAO,IAAI,OAAO,CAAC,cAAc,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,CACL,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CACjG,CAAA;AACH,CAAC","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nimport { AMBIRE_ACCOUNT_FACTORY, OPTIMISTIC_ORACLE, SINGLETON } from '../../consts/deploy'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n Erc4337settings,\n Network,\n NetworkFeature,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSASupport } from '../deployless/simulateDeployCall'\n\n// bnb, gnosis, fantom, metis\nexport const relayerAdditionalNetworks = [\n {\n chainId: 56n,\n name: 'binance-smart-chain'\n },\n {\n chainId: 100n,\n name: 'gnosis'\n },\n {\n chainId: 250n,\n name: 'fantom'\n },\n {\n chainId: 1088n,\n name: 'andromeda'\n }\n]\n\n// 4337 network support\n// if it is supported on the network (hasBundlerSupport),\n// we check if the user has specifically enabled it through settings (force4337)\n// if he has not, we check if the network is predefinedNetwork and we\n// have specifically disabled 4337\n// finally, we fallback to the bundler support\nexport function is4337Enabled(\n hasBundlerSupport: boolean,\n network?: Network,\n force4337?: boolean\n): boolean {\n if (!hasBundlerSupport) return false\n\n // the user has chosen to use 4337\n if (force4337 !== undefined) return force4337 as boolean\n\n // if we have set it specifically\n if (network && network.predefined) return network.erc4337.enabled\n\n // this will be true in this case\n return hasBundlerSupport\n}\n\nexport const getNetworksWithFailedRPC = ({ providers }: { providers: RPCProviders }): string[] => {\n return Object.keys(providers).filter(\n (networkId) =>\n typeof providers[networkId].isWorking === 'boolean' && !providers[networkId].isWorking\n )\n}\n\nasync function retryRequest(init: Function, counter = 0): Promise {\n if (counter >= 2) {\n throw new Error('flagged')\n }\n\n const promise: Promise = init()\n const result = await promise.catch(async () => {\n const retryRes = await retryRequest(init, counter + 1)\n return retryRes\n })\n\n return result\n}\n\nexport async function getNetworkInfo(\n fetch: Fetch,\n rpcUrl: string,\n chainId: bigint,\n callback: (networkInfo: NetworkInfoLoading) => void,\n optionalArgs?: {\n force4337?: boolean\n }\n) {\n let networkInfo: NetworkInfoLoading = {\n force4337: optionalArgs?.force4337,\n chainId,\n isSAEnabled: 'LOADING',\n hasSingleton: 'LOADING',\n isOptimistic: 'LOADING',\n rpcNoStateOverride: 'LOADING',\n erc4337: 'LOADING',\n areContractsDeployed: 'LOADING',\n feeOptions: 'LOADING',\n platformId: 'LOADING',\n nativeAssetId: 'LOADING',\n flagged: 'LOADING'\n }\n callback(networkInfo)\n\n const timeout = (time: number = 30000): Promise<'timeout reached'> => {\n return new Promise((resolve) => {\n setTimeout(resolve, time, 'timeout reached')\n }) as unknown as Promise<'timeout reached'>\n }\n\n let flagged = false\n const provider = getRpcProvider([rpcUrl], chainId)\n\n const raiseFlagged = (e: Error, returnData: any): any => {\n if (e.message === 'flagged') {\n flagged = true\n }\n\n return returnData\n }\n\n const info = await Promise.race([\n Promise.all([\n (async () => {\n const responses = await Promise.all([\n retryRequest(() => provider.getCode(SINGLETON)),\n retryRequest(() => provider.getCode(AMBIRE_ACCOUNT_FACTORY)),\n retryRequest(() => getSASupport(provider)),\n Bundler.isNetworkSupported(fetch, chainId).catch(() => false)\n // retryRequest(() => provider.getCode(ERC_4337_ENTRYPOINT)),\n ]).catch((e: Error) =>\n raiseFlagged(e, ['0x', '0x', { addressMatches: false, supportsStateOverride: false }])\n )\n const [singletonCode, factoryCode, saSupport, hasBundlerSupport] = responses\n const areContractsDeployed = factoryCode !== '0x'\n // const has4337 = entryPointCode !== '0x' && hasBundler\n const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n\n // Ambire support is as follows:\n // - either the addresses match after simulation, that's perfect\n // - or we can't do the simulation with this RPC but we have the factory\n // deployed on the network\n const supportsAmbire =\n saSupport.addressMatches || (!saSupport.supportsStateOverride && areContractsDeployed)\n networkInfo = {\n ...networkInfo,\n hasSingleton: singletonCode !== '0x',\n isSAEnabled: supportsAmbire && singletonCode !== '0x',\n areContractsDeployed,\n rpcNoStateOverride:\n predefinedNetwork && predefinedNetwork.rpcNoStateOverride === true\n ? true\n : !saSupport.supportsStateOverride,\n erc4337: {\n enabled: is4337Enabled(hasBundlerSupport, predefinedNetwork, optionalArgs?.force4337),\n hasPaymaster: predefinedNetwork ? predefinedNetwork.erc4337.hasPaymaster : false,\n hasBundlerSupport\n }\n }\n\n callback(networkInfo)\n })(),\n (async () => {\n const oracleCode = await retryRequest(() => provider.getCode(OPTIMISTIC_ORACLE)).catch(\n (e: Error) => raiseFlagged(e, '0x')\n )\n const isOptimistic = oracleCode !== '0x'\n\n networkInfo = { ...networkInfo, isOptimistic }\n\n callback(networkInfo)\n })(),\n (async () => {\n const block = await retryRequest(() => provider.getBlock('latest')).catch((e: Error) =>\n raiseFlagged(e, null)\n )\n const feeOptions = { is1559: block?.baseFeePerGas !== null }\n\n networkInfo = { ...networkInfo, feeOptions }\n\n callback(networkInfo)\n })(),\n (async () => {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n // set the coingecko info\n let platformId = null\n let nativeAssetId = null\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n networkInfo = { ...networkInfo, platformId, nativeAssetId }\n\n callback(networkInfo)\n })()\n ]),\n timeout()\n ])\n\n networkInfo = { ...networkInfo, flagged: flagged || info === 'timeout reached' }\n callback(networkInfo)\n\n provider.destroy()\n}\n\n// call this if you have the network props already calculated\nexport function getFeaturesByNetworkProperties(\n networkInfo: NetworkInfo | NetworkInfoLoading | undefined\n): NetworkFeature[] {\n const features: NetworkFeature[] = [\n {\n id: 'saSupport',\n title: 'Ambire Smart Accounts',\n level: 'loading'\n },\n {\n id: 'simulation',\n title: 'Transaction simulation',\n level: 'loading'\n },\n {\n id: 'prices',\n title: 'Token prices',\n level: 'loading'\n }\n ]\n\n if (!networkInfo) return features.map((f) => ({ ...f, level: 'initial' }))\n\n const {\n flagged,\n isSAEnabled,\n areContractsDeployed,\n erc4337,\n rpcNoStateOverride,\n nativeAssetId,\n chainId,\n hasSingleton,\n force4337\n } = networkInfo\n\n const updateFeature = (\n id: string,\n update: {\n msg: string\n title?: string\n level: 'success' | 'danger' | 'warning' | 'loading'\n }\n ) => {\n const foundFeature = features.find((f) => f.id === id)\n\n if (foundFeature) {\n Object.assign(foundFeature, update)\n }\n }\n if (flagged && flagged !== 'LOADING') {\n return [\n {\n id: 'flagged',\n title: 'RPC error',\n level: 'danger',\n msg: 'We were unable to fetch the network information with the provided RPC. Try choosing a different RPC.'\n }\n ]\n }\n\n if (\n [isSAEnabled, areContractsDeployed, erc4337, hasSingleton, force4337].every(\n (p) => p !== 'LOADING'\n )\n ) {\n if (!isSAEnabled) {\n updateFeature('saSupport', {\n level: 'danger',\n title: 'Smart contract wallets are not supported',\n msg: hasSingleton\n ? 'We were unable to detect Smart Account support on the network with the provided RPC. Try choosing a different RPC.'\n : 'Unfortunately, this network doesn’t support Smart Accounts. It can be used only with Basic Accounts (EOAs).'\n })\n }\n\n const predefinedNetSettings = predefinedNetworks.find((net) => net.chainId === chainId)\n\n const erc4337Settings = {\n enabled: is4337Enabled(\n (erc4337 as Erc4337settings).enabled,\n predefinedNetSettings,\n force4337 as boolean | undefined\n ),\n hasPaymaster: predefinedNetSettings\n ? predefinedNetSettings.erc4337.hasPaymaster\n : (erc4337 as Erc4337settings).hasPaymaster\n }\n\n const title = (erc4337Settings as any)?.enabled\n ? 'Ambire Smart Accounts via ERC-4337 (Account Abstraction)'\n : 'Ambire Smart Accounts'\n\n if (isSAEnabled && areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'success',\n msg: \"This network supports Smart Accounts, and Ambire Wallet's smart contracts are deployed.\"\n })\n } else if (isSAEnabled && !areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'warning',\n msg: \"This network supports Smart Accounts, but Ambire Wallet's contracts have not yet been deployed. You can deploy them by using a Basic Account and the Deploy contracts option to unlock the Smart Accounts feature. Otherwise, only Basic Accounts (EOAs) can be used on this network.\"\n })\n }\n }\n\n if ([rpcNoStateOverride].every((p) => p !== 'LOADING')) {\n const isPredefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n if (!rpcNoStateOverride && isPredefinedNetwork) {\n updateFeature('simulation', {\n level: 'success',\n title: 'Transaction simulation is fully supported',\n msg: 'Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security.'\n })\n } else if (!rpcNoStateOverride) {\n updateFeature('simulation', {\n level: 'warning',\n title: 'Transaction simulation is partially supported',\n msg: 'Transaction simulation, one of our security features that predicts the outcome of a transaction before it is broadcast to the blockchain, is not fully functioning on this chain. The reasons might be network or RPC limitations. Try choosing a different RPC.'\n })\n } else {\n updateFeature('simulation', {\n level: 'danger',\n title: 'Transaction simulation is not supported',\n msg: \"Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security. Unfortunately, this feature isn't available for the current network or RPC. Try choosing a different RPC.\"\n })\n }\n }\n\n if (nativeAssetId !== 'LOADING') {\n const hasNativeAssetId = nativeAssetId && nativeAssetId !== ''\n updateFeature('prices', {\n level: hasNativeAssetId ? 'success' : 'danger',\n msg: hasNativeAssetId\n ? 'We pull token price information in real-time using third-party providers.'\n : \"Our third-party providers don't support this network yet, so we cannot show token prices.\"\n })\n }\n\n return features\n}\n\n// call this if you have only the rpcUrls and chainId\n// this method makes an RPC request, calculates the network info and returns the features\nexport function getFeatures(\n networkInfo: NetworkInfoLoading | undefined\n): NetworkFeature[] {\n return getFeaturesByNetworkProperties(networkInfo)\n}\n\n// Since v4.24.0, a new Network interface has been introduced,\n// that replaces the old NetworkDescriptor, NetworkPreference, and CustomNetwork.\n// Previously, only NetworkPreferences were stored, with other network properties\n// being calculated in a getter each time the networks were needed.\n// Now, all network properties are pre-calculated and stored in a structured format: { [key: NetworkId]: Network } in the storage.\n// This function migrates the data from the old NetworkPreferences to the new structure\n// to ensure compatibility and prevent breaking the extension after updating to v4.24.0\nexport async function migrateNetworkPreferencesToNetworks(networkPreferences: {\n [key: NetworkId]: Partial\n}) {\n const predefinedNetworkIds = predefinedNetworks.map((n) => n.id)\n const customNetworkIds = Object.keys(networkPreferences).filter(\n (k) => !predefinedNetworkIds.includes(k)\n )\n\n const networksToStore: { [key: NetworkId]: Network } = {}\n\n predefinedNetworks.forEach((n) => {\n networksToStore[n.id] = n\n })\n customNetworkIds.forEach((networkId: NetworkId) => {\n const preference = networkPreferences[networkId]\n const networkInfo = {\n chainId: preference.chainId!,\n isSAEnabled: preference.isSAEnabled ?? false,\n isOptimistic: preference.isOptimistic ?? false,\n rpcNoStateOverride: preference.rpcNoStateOverride ?? true,\n erc4337: preference.erc4337 ?? {\n enabled: false,\n hasPaymaster: false,\n hasBundlerSupport: false\n },\n areContractsDeployed: preference.areContractsDeployed ?? false,\n feeOptions: { is1559: (preference as any).is1559 ?? false },\n platformId: preference.platformId ?? '',\n nativeAssetId: preference.nativeAssetId ?? '',\n flagged: preference.flagged ?? false,\n hasSingleton: preference.hasSingleton ?? false\n }\n delete (preference as any).is1559\n networksToStore[networkId] = {\n id: networkId,\n ...preference,\n ...networkInfo,\n features: getFeaturesByNetworkProperties(networkInfo),\n hasRelayer: !!relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId!),\n predefined: false\n } as Network\n })\n\n return networksToStore\n}\n\n// is the user allowed to change the network settings to 4337\nexport function canForce4337(network?: Network) {\n return network && network.allowForce4337\n}\n\nexport function hasRelayerSupport(network: Network) {\n return (\n network.hasRelayer || !!relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n )\n}\n"]} \ No newline at end of file +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../../src/libs/networks/networks.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nimport { AMBIRE_ACCOUNT_FACTORY, OPTIMISTIC_ORACLE, SINGLETON } from '../../consts/deploy'\nimport { networks as predefinedNetworks } from '../../consts/networks'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n Erc4337settings,\n Network,\n NetworkFeature,\n NetworkId,\n NetworkInfo,\n NetworkInfoLoading\n} from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { Bundler } from '../../services/bundlers/bundler'\nimport { getRpcProvider } from '../../services/provider'\nimport { getSASupport } from '../deployless/simulateDeployCall'\n\n// bnb, gnosis, fantom, metis\nexport const relayerAdditionalNetworks = [\n {\n chainId: 56n,\n name: 'binance-smart-chain'\n },\n {\n chainId: 100n,\n name: 'gnosis'\n },\n {\n chainId: 250n,\n name: 'fantom'\n },\n {\n chainId: 1088n,\n name: 'andromeda'\n }\n]\n\n// 4337 network support\n// if it is supported on the network (hasBundlerSupport),\n// we check if the user has specifically enabled it through settings (force4337)\n// if he has not, we check if the network is predefinedNetwork and we\n// have specifically disabled 4337\n// finally, we fallback to the bundler support\nexport function is4337Enabled(\n hasBundlerSupport: boolean,\n network?: Network,\n force4337?: boolean\n): boolean {\n if (!hasBundlerSupport) return false\n\n // the user has chosen to use 4337\n if (force4337 !== undefined) return force4337 as boolean\n\n // if we have set it specifically\n if (network && network.predefined) return network.erc4337.enabled\n\n // this will be true in this case\n return hasBundlerSupport\n}\n\nexport const getNetworksWithFailedRPC = ({ providers }: { providers: RPCProviders }): string[] => {\n return Object.keys(providers).filter(\n (networkId) =>\n typeof providers[networkId].isWorking === 'boolean' && !providers[networkId].isWorking\n )\n}\n\nasync function retryRequest(init: Function, counter = 0): Promise {\n if (counter >= 2) {\n throw new Error('flagged')\n }\n\n const promise: Promise = init()\n const result = await promise.catch(async () => {\n const retryRes = await retryRequest(init, counter + 1)\n return retryRes\n })\n\n return result\n}\n\nexport async function getNetworkInfo(\n fetch: Fetch,\n rpcUrl: string,\n chainId: bigint,\n callback: (networkInfo: NetworkInfoLoading) => void,\n optionalArgs?: {\n force4337?: boolean\n }\n) {\n let networkInfo: NetworkInfoLoading = {\n force4337: optionalArgs?.force4337,\n chainId,\n isSAEnabled: 'LOADING',\n hasSingleton: 'LOADING',\n isOptimistic: 'LOADING',\n rpcNoStateOverride: 'LOADING',\n erc4337: 'LOADING',\n areContractsDeployed: 'LOADING',\n feeOptions: 'LOADING',\n platformId: 'LOADING',\n nativeAssetId: 'LOADING',\n flagged: 'LOADING'\n }\n callback(networkInfo)\n\n const timeout = (time: number = 30000): Promise<'timeout reached'> => {\n return new Promise((resolve) => {\n setTimeout(resolve, time, 'timeout reached')\n }) as unknown as Promise<'timeout reached'>\n }\n\n let flagged = false\n const provider = getRpcProvider([rpcUrl], chainId)\n\n const raiseFlagged = (e: Error, returnData: any): any => {\n if (e.message === 'flagged') {\n flagged = true\n }\n\n return returnData\n }\n\n const info = await Promise.race([\n Promise.all([\n (async () => {\n const responses = await Promise.all([\n retryRequest(() => provider.getCode(SINGLETON)),\n retryRequest(() => provider.getCode(AMBIRE_ACCOUNT_FACTORY)),\n retryRequest(() => getSASupport(provider)),\n Bundler.isNetworkSupported(fetch, chainId).catch(() => false)\n // retryRequest(() => provider.getCode(ERC_4337_ENTRYPOINT)),\n ]).catch((e: Error) =>\n raiseFlagged(e, ['0x', '0x', { addressMatches: false, supportsStateOverride: false }])\n )\n const [singletonCode, factoryCode, saSupport, hasBundlerSupport] = responses\n const areContractsDeployed = factoryCode !== '0x'\n // const has4337 = entryPointCode !== '0x' && hasBundler\n const predefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n\n // Ambire support is as follows:\n // - either the addresses match after simulation, that's perfect\n // - or we can't do the simulation with this RPC but we have the factory\n // deployed on the network\n const supportsAmbire =\n saSupport.addressMatches || (!saSupport.supportsStateOverride && areContractsDeployed)\n networkInfo = {\n ...networkInfo,\n hasSingleton: singletonCode !== '0x',\n isSAEnabled: supportsAmbire && singletonCode !== '0x',\n areContractsDeployed,\n rpcNoStateOverride:\n predefinedNetwork && predefinedNetwork.rpcNoStateOverride === true\n ? true\n : !saSupport.supportsStateOverride,\n erc4337: {\n enabled: is4337Enabled(hasBundlerSupport, predefinedNetwork, optionalArgs?.force4337),\n hasPaymaster: predefinedNetwork ? predefinedNetwork.erc4337.hasPaymaster : false,\n hasBundlerSupport\n }\n }\n\n callback(networkInfo)\n })(),\n (async () => {\n const oracleCode = await retryRequest(() => provider.getCode(OPTIMISTIC_ORACLE)).catch(\n (e: Error) => raiseFlagged(e, '0x')\n )\n const isOptimistic = oracleCode !== '0x'\n\n networkInfo = { ...networkInfo, isOptimistic }\n\n callback(networkInfo)\n })(),\n (async () => {\n const block = await retryRequest(() => provider.getBlock('latest')).catch((e: Error) =>\n raiseFlagged(e, null)\n )\n const feeOptions = { is1559: block?.baseFeePerGas !== null }\n\n networkInfo = { ...networkInfo, feeOptions }\n\n callback(networkInfo)\n })(),\n (async () => {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n // set the coingecko info\n let platformId = null\n let nativeAssetId = null\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n networkInfo = { ...networkInfo, platformId, nativeAssetId }\n\n callback(networkInfo)\n })()\n ]),\n timeout()\n ])\n\n networkInfo = { ...networkInfo, flagged: flagged || info === 'timeout reached' }\n callback(networkInfo)\n\n provider.destroy()\n}\n\n// call this if you have the network props already calculated\nexport function getFeaturesByNetworkProperties(\n networkInfo: NetworkInfo | NetworkInfoLoading | undefined\n): NetworkFeature[] {\n const features: NetworkFeature[] = [\n {\n id: 'saSupport',\n title: 'Ambire Smart Accounts',\n level: 'loading'\n },\n {\n id: 'simulation',\n title: 'Transaction simulation',\n level: 'loading'\n },\n {\n id: 'prices',\n title: 'Token prices',\n level: 'loading'\n }\n ]\n\n if (!networkInfo) return features.map((f) => ({ ...f, level: 'initial' }))\n\n const {\n flagged,\n isSAEnabled,\n areContractsDeployed,\n erc4337,\n rpcNoStateOverride,\n nativeAssetId,\n chainId,\n hasSingleton,\n force4337\n } = networkInfo\n\n const updateFeature = (\n id: string,\n update: {\n msg: string\n title?: string\n level: 'success' | 'danger' | 'warning' | 'loading'\n }\n ) => {\n const foundFeature = features.find((f) => f.id === id)\n\n if (foundFeature) {\n Object.assign(foundFeature, update)\n }\n }\n if (flagged && flagged !== 'LOADING') {\n return [\n {\n id: 'flagged',\n title: 'RPC error',\n level: 'danger',\n msg: 'We were unable to fetch the network information with the provided RPC. Try choosing a different RPC.'\n }\n ]\n }\n\n if (\n [isSAEnabled, areContractsDeployed, erc4337, hasSingleton, force4337].every(\n (p) => p !== 'LOADING'\n )\n ) {\n if (!isSAEnabled) {\n updateFeature('saSupport', {\n level: 'danger',\n title: 'Smart contract wallets are not supported',\n msg: hasSingleton\n ? 'We were unable to detect Smart Account support on the network with the provided RPC. Try choosing a different RPC.'\n : 'Unfortunately, this network doesn’t support Smart Accounts. It can be used only with Basic Accounts (EOAs).'\n })\n }\n\n const predefinedNetSettings = predefinedNetworks.find((net) => net.chainId === chainId)\n\n const erc4337Settings = {\n enabled: is4337Enabled(\n (erc4337 as Erc4337settings).enabled,\n predefinedNetSettings,\n force4337 as boolean | undefined\n ),\n hasPaymaster: predefinedNetSettings\n ? predefinedNetSettings.erc4337.hasPaymaster\n : (erc4337 as Erc4337settings).hasPaymaster\n }\n\n const title = (erc4337Settings as any)?.enabled\n ? 'Ambire Smart Accounts via ERC-4337 (Account Abstraction)'\n : 'Ambire Smart Accounts'\n\n if (isSAEnabled && areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'success',\n msg: \"This network supports Smart Accounts, and Ambire Wallet's smart contracts are deployed.\"\n })\n } else if (isSAEnabled && !areContractsDeployed) {\n updateFeature('saSupport', {\n title,\n level: 'warning',\n msg: \"This network supports Smart Accounts, but Ambire Wallet's contracts have not yet been deployed. You can deploy them by using a Basic Account and the Deploy contracts option to unlock the Smart Accounts feature. Otherwise, only Basic Accounts (EOAs) can be used on this network.\"\n })\n }\n }\n\n if ([rpcNoStateOverride].every((p) => p !== 'LOADING')) {\n const isPredefinedNetwork = predefinedNetworks.find((net) => net.chainId === chainId)\n if (!rpcNoStateOverride && isPredefinedNetwork) {\n updateFeature('simulation', {\n level: 'success',\n title: 'Transaction simulation is fully supported',\n msg: 'Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security.'\n })\n } else if (!rpcNoStateOverride) {\n updateFeature('simulation', {\n level: 'warning',\n title: 'Transaction simulation is partially supported',\n msg: 'Transaction simulation, one of our security features that predicts the outcome of a transaction before it is broadcast to the blockchain, is not fully functioning on this chain. The reasons might be network or RPC limitations. Try choosing a different RPC.'\n })\n } else {\n updateFeature('simulation', {\n level: 'danger',\n title: 'Transaction simulation is not supported',\n msg: \"Transaction simulation helps predict the outcome of a transaction and your future account balance before it’s broadcasted to the blockchain, enhancing security. Unfortunately, this feature isn't available for the current network or RPC. Try choosing a different RPC.\"\n })\n }\n }\n\n if (nativeAssetId !== 'LOADING') {\n const hasNativeAssetId = nativeAssetId && nativeAssetId !== ''\n updateFeature('prices', {\n level: hasNativeAssetId ? 'success' : 'danger',\n msg: hasNativeAssetId\n ? 'We pull token price information in real-time using third-party providers.'\n : \"Our third-party providers don't support this network yet, so we cannot show token prices.\"\n })\n }\n\n return features\n}\n\n// call this if you have only the rpcUrls and chainId\n// this method makes an RPC request, calculates the network info and returns the features\nexport function getFeatures(\n networkInfo: NetworkInfoLoading | undefined\n): NetworkFeature[] {\n return getFeaturesByNetworkProperties(networkInfo)\n}\n\n// Since v4.24.0, a new Network interface has been introduced,\n// that replaces the old NetworkDescriptor, NetworkPreference, and CustomNetwork.\n// Previously, only NetworkPreferences were stored, with other network properties\n// being calculated in a getter each time the networks were needed.\n// Now, all network properties are pre-calculated and stored in a structured format: { [key: NetworkId]: Network } in the storage.\n// This function migrates the data from the old NetworkPreferences to the new structure\n// to ensure compatibility and prevent breaking the extension after updating to v4.24.0\nexport async function migrateNetworkPreferencesToNetworks(networkPreferences: {\n [key: NetworkId]: Partial\n}) {\n const predefinedNetworkIds = predefinedNetworks.map((n) => n.id)\n const customNetworkIds = Object.keys(networkPreferences).filter(\n (k) => !predefinedNetworkIds.includes(k)\n )\n\n const networksToStore: { [key: NetworkId]: Network } = {}\n\n predefinedNetworks.forEach((n) => {\n networksToStore[n.id] = n\n })\n customNetworkIds.forEach((networkId: NetworkId) => {\n const preference = networkPreferences[networkId]\n const networkInfo = {\n chainId: preference.chainId!,\n isSAEnabled: preference.isSAEnabled ?? false,\n isOptimistic: preference.isOptimistic ?? false,\n rpcNoStateOverride: preference.rpcNoStateOverride ?? true,\n erc4337: preference.erc4337 ?? {\n enabled: false,\n hasPaymaster: false,\n hasBundlerSupport: false\n },\n areContractsDeployed: preference.areContractsDeployed ?? false,\n feeOptions: { is1559: (preference as any).is1559 ?? false },\n platformId: preference.platformId ?? '',\n nativeAssetId: preference.nativeAssetId ?? '',\n flagged: preference.flagged ?? false,\n hasSingleton: preference.hasSingleton ?? false\n }\n delete (preference as any).is1559\n networksToStore[networkId] = {\n id: networkId,\n ...preference,\n ...networkInfo,\n features: getFeaturesByNetworkProperties(networkInfo),\n hasRelayer: !!relayerAdditionalNetworks.find((net) => net.chainId === preference.chainId!),\n predefined: false\n } as Network\n })\n\n return networksToStore\n}\n\n// is the user allowed to change the network settings to 4337\nexport function canForce4337(network?: Network) {\n return network && network.allowForce4337\n}\n\nexport function hasRelayerSupport(network: Network) {\n return (\n network.hasRelayer || !!relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n )\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.js b/dist/src/libs/paymaster/abstractPaymaster.js index a31566002..7cc0d1406 100644 --- a/dist/src/libs/paymaster/abstractPaymaster.js +++ b/dist/src/libs/paymaster/abstractPaymaster.js @@ -1,6 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractPaymaster = void 0; /** * Use this mainly as a typehint to prevent dependancy cicles */ -export class AbstractPaymaster { +class AbstractPaymaster { } +exports.AbstractPaymaster = AbstractPaymaster; //# sourceMappingURL=abstractPaymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/abstractPaymaster.js.map b/dist/src/libs/paymaster/abstractPaymaster.js.map index e95a9ad3c..067ee09df 100644 --- a/dist/src/libs/paymaster/abstractPaymaster.js.map +++ b/dist/src/libs/paymaster/abstractPaymaster.js.map @@ -1 +1 @@ -{"version":3,"file":"abstractPaymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/abstractPaymaster.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,OAAgB,iBAAiB;CAmBtC","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\n\n/**\n * Use this mainly as a typehint to prevent dependancy cicles\n */\nexport abstract class AbstractPaymaster {\n abstract init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): void\n\n abstract shouldIncludePayment(): boolean\n\n abstract getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined\n\n abstract getEstimationData(): PaymasterEstimationData | null\n\n abstract isSponsored(): boolean\n\n abstract isUsable(): boolean\n\n abstract call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise\n}\n"]} \ No newline at end of file +{"version":3,"file":"abstractPaymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/abstractPaymaster.ts"],"names":[],"mappings":";;;AAaA;;GAEG;AACH,MAAsB,iBAAiB;CAmBtC;AAnBD,8CAmBC","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\n\n/**\n * Use this mainly as a typehint to prevent dependancy cicles\n */\nexport abstract class AbstractPaymaster {\n abstract init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider): void\n\n abstract shouldIncludePayment(): boolean\n\n abstract getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined\n\n abstract getEstimationData(): PaymasterEstimationData | null\n\n abstract isSponsored(): boolean\n\n abstract isUsable(): boolean\n\n abstract call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.js b/dist/src/libs/paymaster/paymaster.js index dba28c4be..a3cbf0222 100644 --- a/dist/src/libs/paymaster/paymaster.js +++ b/dist/src/libs/paymaster/paymaster.js @@ -1,27 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Paymaster = exports.getPaymasterDataForEstimate = void 0; +const tslib_1 = require("tslib"); /* eslint-disable no-console */ -import { AbiCoder, Contract, toBeHex } from 'ethers'; -import entryPointAbi from '../../../contracts/compiled/EntryPoint.json'; -import { FEE_COLLECTOR } from '../../consts/addresses'; -import { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; -import { failedPaymasters } from '../../services/paymaster/FailedPaymasters'; -import { getFeeCall } from '../calls/calls'; -import { getPaymasterData, getPaymasterStubData } from '../erc7677/erc7677'; -import { RelayerPaymasterError, SponsorshipPaymasterError } from '../errorDecoder/customErrors'; -import { getHumanReadableBroadcastError } from '../errorHumanizer'; -import { PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE } from '../errorHumanizer/broadcastErrorHumanizer'; -import { getFeeTokenForEstimate } from '../estimate/estimateHelpers'; -import { getCleanUserOp, getSigForCalculations } from '../userOperation/userOperation'; -import { AbstractPaymaster } from './abstractPaymaster'; -export function getPaymasterDataForEstimate() { - const abiCoder = new AbiCoder(); +const ethers_1 = require("ethers"); +const EntryPoint_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/EntryPoint.json")); +const addresses_1 = require("../../consts/addresses"); +const deploy_1 = require("../../consts/deploy"); +const FailedPaymasters_1 = require("../../services/paymaster/FailedPaymasters"); +const calls_1 = require("../calls/calls"); +const erc7677_1 = require("../erc7677/erc7677"); +const customErrors_1 = require("../errorDecoder/customErrors"); +const errorHumanizer_1 = require("../errorHumanizer"); +const broadcastErrorHumanizer_1 = require("../errorHumanizer/broadcastErrorHumanizer"); +const estimateHelpers_1 = require("../estimate/estimateHelpers"); +const userOperation_1 = require("../userOperation/userOperation"); +const abstractPaymaster_1 = require("./abstractPaymaster"); +function getPaymasterDataForEstimate() { + const abiCoder = new ethers_1.AbiCoder(); return { - paymaster: AMBIRE_PAYMASTER, - paymasterVerificationGasLimit: toBeHex(100000), - paymasterPostOpGasLimit: toBeHex(0), - paymasterData: abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, getSigForCalculations()]) + paymaster: deploy_1.AMBIRE_PAYMASTER, + paymasterVerificationGasLimit: (0, ethers_1.toBeHex)(100000), + paymasterPostOpGasLimit: (0, ethers_1.toBeHex)(0), + paymasterData: abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, (0, userOperation_1.getSigForCalculations)()]) }; } -export class Paymaster extends AbstractPaymaster { +exports.getPaymasterDataForEstimate = getPaymasterDataForEstimate; +class Paymaster extends abstractPaymaster_1.AbstractPaymaster { callRelayer; type = 'None'; sponsorDataEstimation; @@ -41,7 +46,7 @@ export class Paymaster extends AbstractPaymaster { try { this.paymasterService = op.meta.paymasterService; const response = await Promise.race([ - getPaymasterStubData(op.meta.paymasterService, userOp, network), + (0, erc7677_1.getPaymasterStubData)(op.meta.paymasterService, userOp, network), new Promise((_resolve, reject) => { setTimeout(() => reject(new Error('Sponsorship error, request too slow')), 5000); }) @@ -56,7 +61,7 @@ export class Paymaster extends AbstractPaymaster { } } // has the paymaster dried up - const seenInsufficientFunds = failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]; + const seenInsufficientFunds = FailedPaymasters_1.failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]; if (network.erc4337.hasPaymaster && !seenInsufficientFunds) { this.type = 'Ambire'; return; @@ -64,15 +69,15 @@ export class Paymaster extends AbstractPaymaster { // for custom networks, check if the paymaster there has balance if (!network.predefined || seenInsufficientFunds) { try { - const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider); - const paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER); + const ep = new ethers_1.Contract(deploy_1.ERC_4337_ENTRYPOINT, EntryPoint_json_1.default, provider); + const paymasterBalance = await ep.balanceOf(deploy_1.AMBIRE_PAYMASTER); // if the network paymaster has failed because of insufficient funds, // disable it before getting a top up const minBalance = seenInsufficientFunds ? seenInsufficientFunds.lastSeenBalance : 0n; if (paymasterBalance > minBalance) { this.type = 'Ambire'; if (seenInsufficientFunds) - failedPaymasters.removeInsufficientFunds(network); + FailedPaymasters_1.failedPaymasters.removeInsufficientFunds(network); return; } } @@ -90,16 +95,16 @@ export class Paymaster extends AbstractPaymaster { if (!this.network) throw new Error('network not set, did you call init?'); if (this.type === 'Ambire') { - const feeToken = getFeeTokenForEstimate(feeTokens, this.network); + const feeToken = (0, estimateHelpers_1.getFeeTokenForEstimate)(feeTokens, this.network); if (!feeToken) return undefined; - return getFeeCall(feeToken); + return (0, calls_1.getFeeCall)(feeToken); } // hardcode USDC gas tank 0 for sponsorships if (this.type === 'ERC7677') { - const abiCoder = new AbiCoder(); + const abiCoder = new ethers_1.AbiCoder(); return { - to: FEE_COLLECTOR, + to: addresses_1.FEE_COLLECTOR, value: 0n, data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC']) }; @@ -123,8 +128,8 @@ export class Paymaster extends AbstractPaymaster { // retry the request 3 times before declaring it a failure if (counter >= 3) { const e = new Error('Ambire relayer error timeout'); - const convertedError = new RelayerPaymasterError(e); - const { message } = getHumanReadableBroadcastError(convertedError); + const convertedError = new customErrors_1.RelayerPaymasterError(e); + const { message } = (0, errorHumanizer_1.getHumanReadableBroadcastError)(convertedError); return { success: false, message, @@ -140,7 +145,7 @@ export class Paymaster extends AbstractPaymaster { ]); return { success: true, - paymaster: this.type === 'Ambire' ? AMBIRE_PAYMASTER : response.paymaster, + paymaster: this.type === 'Ambire' ? deploy_1.AMBIRE_PAYMASTER : response.paymaster, paymasterData: this.type === 'Ambire' ? response.data.paymasterData : response.paymasterData }; } @@ -156,8 +161,8 @@ export class Paymaster extends AbstractPaymaster { const increment = counter + 1; return this.#retryPaymasterRequest(apiCall, increment); } - const convertedError = this.type === 'ERC7677' ? new SponsorshipPaymasterError() : new RelayerPaymasterError(e); - const { message } = getHumanReadableBroadcastError(convertedError); + const convertedError = this.type === 'ERC7677' ? new customErrors_1.SponsorshipPaymasterError() : new customErrors_1.RelayerPaymasterError(e); + const { message } = (0, errorHumanizer_1.getHumanReadableBroadcastError)(convertedError); return { success: false, message, @@ -172,11 +177,11 @@ export class Paymaster extends AbstractPaymaster { throw new Error('network not set, did you call init?'); // request the paymaster with a timeout window const localUserOp = { ...userOp }; - localUserOp.paymaster = AMBIRE_PAYMASTER; + localUserOp.paymaster = deploy_1.AMBIRE_PAYMASTER; return this.#retryPaymasterRequest(() => { return this.callRelayer(`/v2/paymaster/${op.networkId}/sign`, 'POST', { - userOperation: getCleanUserOp(localUserOp)[0], - paymaster: AMBIRE_PAYMASTER, + userOperation: (0, userOperation_1.getCleanUserOp)(localUserOp)[0], + paymaster: deploy_1.AMBIRE_PAYMASTER, bytecode: acc.creation.bytecode, salt: acc.creation.salt, key: acc.associatedKeys[0], @@ -199,13 +204,13 @@ export class Paymaster extends AbstractPaymaster { localUserOp.paymaster = sponsorData.paymaster; localUserOp.paymasterData = sponsorData.paymasterData; const response = await this.#retryPaymasterRequest(() => { - return getPaymasterData(this.paymasterService, localUserOp, network); + return (0, erc7677_1.getPaymasterData)(this.paymasterService, localUserOp, network); }); if (!response.success && - response.message !== PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE && + response.message !== broadcastErrorHumanizer_1.PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE && op.meta && op.meta.paymasterService) { - failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id); + FailedPaymasters_1.failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id); } return response; } @@ -217,4 +222,5 @@ export class Paymaster extends AbstractPaymaster { throw new Error('Paymaster not configured. Please contact support'); } } +exports.Paymaster = Paymaster; //# sourceMappingURL=paymaster.js.map \ No newline at end of file diff --git a/dist/src/libs/paymaster/paymaster.js.map b/dist/src/libs/paymaster/paymaster.js.map index fc1f62be6..040ef352f 100644 --- a/dist/src/libs/paymaster/paymaster.js.map +++ b/dist/src/libs/paymaster/paymaster.js.map @@ -1 +1 @@ -{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/paymaster.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { AbiCoder, Contract, toBeHex } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { getPaymasterData, getPaymasterStubData } from '../erc7677/erc7677'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterService,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { RelayerPaymasterError, SponsorshipPaymasterError } from '../errorDecoder/customErrors'\nimport { getHumanReadableBroadcastError } from '../errorHumanizer'\nimport { PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE } from '../errorHumanizer/broadcastErrorHumanizer'\nimport { getFeeTokenForEstimate } from '../estimate/estimateHelpers'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp, getSigForCalculations } from '../userOperation/userOperation'\nimport { AbstractPaymaster } from './abstractPaymaster'\n\ntype PaymasterType = 'Ambire' | 'ERC7677' | 'None'\n\nexport function getPaymasterDataForEstimate(): PaymasterEstimationData {\n const abiCoder = new AbiCoder()\n return {\n paymaster: AMBIRE_PAYMASTER,\n paymasterVerificationGasLimit: toBeHex(100000) as Hex,\n paymasterPostOpGasLimit: toBeHex(0) as Hex,\n paymasterData: abiCoder.encode(\n ['uint48', 'uint48', 'bytes'],\n [0, 0, getSigForCalculations()]\n ) as Hex\n }\n}\n\nexport class Paymaster extends AbstractPaymaster {\n callRelayer: Function\n\n type: PaymasterType = 'None'\n\n sponsorDataEstimation: PaymasterEstimationData | undefined\n\n paymasterService: PaymasterService | null = null\n\n network: Network | null = null\n\n provider: RPCProvider | null = null\n\n errorCallback: Function | undefined = undefined\n\n constructor(callRelayer: Function, errorCallback: Function) {\n super()\n this.callRelayer = callRelayer\n this.errorCallback = errorCallback\n }\n\n async init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider) {\n this.network = network\n this.provider = provider\n\n if (op.meta?.paymasterService && !op.meta?.paymasterService.failed) {\n try {\n this.paymasterService = op.meta.paymasterService\n const response = await Promise.race([\n getPaymasterStubData(op.meta.paymasterService, userOp, network),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Sponsorship error, request too slow')), 5000)\n })\n ])\n this.sponsorDataEstimation = response as PaymasterEstimationData\n this.type = 'ERC7677'\n return\n } catch (e) {\n // TODO: error handling\n console.log(e)\n }\n }\n\n // has the paymaster dried up\n const seenInsufficientFunds =\n failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]\n\n if (network.erc4337.hasPaymaster && !seenInsufficientFunds) {\n this.type = 'Ambire'\n return\n }\n\n // for custom networks, check if the paymaster there has balance\n if (!network.predefined || seenInsufficientFunds) {\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n const paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n\n // if the network paymaster has failed because of insufficient funds,\n // disable it before getting a top up\n const minBalance = seenInsufficientFunds ? seenInsufficientFunds.lastSeenBalance : 0n\n if (paymasterBalance > minBalance) {\n this.type = 'Ambire'\n if (seenInsufficientFunds) failedPaymasters.removeInsufficientFunds(network)\n return\n }\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n }\n\n this.type = 'None'\n }\n\n shouldIncludePayment(): boolean {\n return this.type === 'Ambire' || this.type === 'ERC7677'\n }\n\n getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined {\n if (!this.network) throw new Error('network not set, did you call init?')\n\n if (this.type === 'Ambire') {\n const feeToken = getFeeTokenForEstimate(feeTokens, this.network)\n if (!feeToken) return undefined\n\n return getFeeCall(feeToken)\n }\n\n // hardcode USDC gas tank 0 for sponsorships\n if (this.type === 'ERC7677') {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n }\n\n return undefined\n }\n\n getEstimationData(): PaymasterEstimationData | null {\n if (this.type === 'ERC7677') return this.sponsorDataEstimation as PaymasterEstimationData\n\n if (this.type === 'Ambire') return getPaymasterDataForEstimate()\n\n return null\n }\n\n isSponsored(): boolean {\n return this.type === 'ERC7677'\n }\n\n isUsable() {\n return this.type !== 'None'\n }\n\n async #retryPaymasterRequest(\n apiCall: Function,\n counter = 0\n ): Promise {\n // retry the request 3 times before declaring it a failure\n if (counter >= 3) {\n const e = new Error('Ambire relayer error timeout')\n const convertedError = new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n\n try {\n const response = await Promise.race([\n apiCall(),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Ambire relayer error timeout')), 8000)\n })\n ])\n\n return {\n success: true,\n paymaster: this.type === 'Ambire' ? AMBIRE_PAYMASTER : response.paymaster,\n paymasterData: this.type === 'Ambire' ? response.data.paymasterData : response.paymasterData\n }\n } catch (e: any) {\n if (e.message === 'Ambire relayer error timeout') {\n if (this.errorCallback) {\n this.errorCallback({\n level: 'major',\n message: 'Paymaster is not responding. Retrying...',\n error: new Error('Paymaster call timeout')\n })\n }\n const increment = counter + 1\n return this.#retryPaymasterRequest(apiCall, increment)\n }\n\n const convertedError =\n this.type === 'ERC7677' ? new SponsorshipPaymasterError() : new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n }\n\n async #ambireCall(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation\n ): Promise {\n if (!this.provider) throw new Error('provider not set, did you call init?')\n if (!this.network) throw new Error('network not set, did you call init?')\n\n // request the paymaster with a timeout window\n const localUserOp = { ...userOp }\n localUserOp.paymaster = AMBIRE_PAYMASTER\n return this.#retryPaymasterRequest(() => {\n return this.callRelayer(`/v2/paymaster/${op.networkId}/sign`, 'POST', {\n userOperation: getCleanUserOp(localUserOp)[0],\n paymaster: AMBIRE_PAYMASTER,\n bytecode: acc.creation!.bytecode,\n salt: acc.creation!.salt,\n key: acc.associatedKeys[0],\n // eslint-disable-next-line no-underscore-dangle\n rpcUrl: this.provider!._getConnection().url,\n bundler: userOp.bundler\n })\n })\n }\n\n async #erc7677Call(op: AccountOp, userOp: UserOperation, network: Network) {\n const sponsorData = this.sponsorDataEstimation as PaymasterEstimationData\n\n // no need to do an extra call if the dapp has already provided sponsorship\n if ('isFinal' in sponsorData && sponsorData.isFinal)\n return {\n success: true,\n paymaster: sponsorData.paymaster,\n paymasterData: sponsorData.paymasterData\n }\n\n const localUserOp = { ...userOp }\n localUserOp.paymaster = sponsorData.paymaster\n localUserOp.paymasterData = sponsorData.paymasterData\n const response = await this.#retryPaymasterRequest(() => {\n return getPaymasterData(this.paymasterService as PaymasterService, localUserOp, network)\n })\n\n if (\n !response.success &&\n (response as PaymasterErrorReponse).message !== PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE &&\n op.meta &&\n op.meta.paymasterService\n ) {\n failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id)\n }\n\n return response\n }\n\n async call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise {\n if (this.type === 'Ambire') return this.#ambireCall(acc, op, userOp)\n\n if (this.type === 'ERC7677') return this.#erc7677Call(op, userOp, network)\n\n throw new Error('Paymaster not configured. Please contact support')\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../../../src/libs/paymaster/paymaster.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { AbiCoder, Contract, toBeHex } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { AccountOp } from '../accountOp/accountOp'\nimport { Call } from '../accountOp/types'\nimport { getFeeCall } from '../calls/calls'\nimport { getPaymasterData, getPaymasterStubData } from '../erc7677/erc7677'\nimport {\n PaymasterErrorReponse,\n PaymasterEstimationData,\n PaymasterService,\n PaymasterSuccessReponse\n} from '../erc7677/types'\nimport { RelayerPaymasterError, SponsorshipPaymasterError } from '../errorDecoder/customErrors'\nimport { getHumanReadableBroadcastError } from '../errorHumanizer'\nimport { PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE } from '../errorHumanizer/broadcastErrorHumanizer'\nimport { getFeeTokenForEstimate } from '../estimate/estimateHelpers'\nimport { TokenResult } from '../portfolio'\nimport { UserOperation } from '../userOperation/types'\nimport { getCleanUserOp, getSigForCalculations } from '../userOperation/userOperation'\nimport { AbstractPaymaster } from './abstractPaymaster'\n\ntype PaymasterType = 'Ambire' | 'ERC7677' | 'None'\n\nexport function getPaymasterDataForEstimate(): PaymasterEstimationData {\n const abiCoder = new AbiCoder()\n return {\n paymaster: AMBIRE_PAYMASTER,\n paymasterVerificationGasLimit: toBeHex(100000) as Hex,\n paymasterPostOpGasLimit: toBeHex(0) as Hex,\n paymasterData: abiCoder.encode(\n ['uint48', 'uint48', 'bytes'],\n [0, 0, getSigForCalculations()]\n ) as Hex\n }\n}\n\nexport class Paymaster extends AbstractPaymaster {\n callRelayer: Function\n\n type: PaymasterType = 'None'\n\n sponsorDataEstimation: PaymasterEstimationData | undefined\n\n paymasterService: PaymasterService | null = null\n\n network: Network | null = null\n\n provider: RPCProvider | null = null\n\n errorCallback: Function | undefined = undefined\n\n constructor(callRelayer: Function, errorCallback: Function) {\n super()\n this.callRelayer = callRelayer\n this.errorCallback = errorCallback\n }\n\n async init(op: AccountOp, userOp: UserOperation, network: Network, provider: RPCProvider) {\n this.network = network\n this.provider = provider\n\n if (op.meta?.paymasterService && !op.meta?.paymasterService.failed) {\n try {\n this.paymasterService = op.meta.paymasterService\n const response = await Promise.race([\n getPaymasterStubData(op.meta.paymasterService, userOp, network),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Sponsorship error, request too slow')), 5000)\n })\n ])\n this.sponsorDataEstimation = response as PaymasterEstimationData\n this.type = 'ERC7677'\n return\n } catch (e) {\n // TODO: error handling\n console.log(e)\n }\n }\n\n // has the paymaster dried up\n const seenInsufficientFunds =\n failedPaymasters.insufficientFundsNetworks[Number(this.network.chainId)]\n\n if (network.erc4337.hasPaymaster && !seenInsufficientFunds) {\n this.type = 'Ambire'\n return\n }\n\n // for custom networks, check if the paymaster there has balance\n if (!network.predefined || seenInsufficientFunds) {\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n const paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n\n // if the network paymaster has failed because of insufficient funds,\n // disable it before getting a top up\n const minBalance = seenInsufficientFunds ? seenInsufficientFunds.lastSeenBalance : 0n\n if (paymasterBalance > minBalance) {\n this.type = 'Ambire'\n if (seenInsufficientFunds) failedPaymasters.removeInsufficientFunds(network)\n return\n }\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n }\n\n this.type = 'None'\n }\n\n shouldIncludePayment(): boolean {\n return this.type === 'Ambire' || this.type === 'ERC7677'\n }\n\n getFeeCallForEstimation(feeTokens: TokenResult[]): Call | undefined {\n if (!this.network) throw new Error('network not set, did you call init?')\n\n if (this.type === 'Ambire') {\n const feeToken = getFeeTokenForEstimate(feeTokens, this.network)\n if (!feeToken) return undefined\n\n return getFeeCall(feeToken)\n }\n\n // hardcode USDC gas tank 0 for sponsorships\n if (this.type === 'ERC7677') {\n const abiCoder = new AbiCoder()\n return {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n }\n\n return undefined\n }\n\n getEstimationData(): PaymasterEstimationData | null {\n if (this.type === 'ERC7677') return this.sponsorDataEstimation as PaymasterEstimationData\n\n if (this.type === 'Ambire') return getPaymasterDataForEstimate()\n\n return null\n }\n\n isSponsored(): boolean {\n return this.type === 'ERC7677'\n }\n\n isUsable() {\n return this.type !== 'None'\n }\n\n async #retryPaymasterRequest(\n apiCall: Function,\n counter = 0\n ): Promise {\n // retry the request 3 times before declaring it a failure\n if (counter >= 3) {\n const e = new Error('Ambire relayer error timeout')\n const convertedError = new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n\n try {\n const response = await Promise.race([\n apiCall(),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('Ambire relayer error timeout')), 8000)\n })\n ])\n\n return {\n success: true,\n paymaster: this.type === 'Ambire' ? AMBIRE_PAYMASTER : response.paymaster,\n paymasterData: this.type === 'Ambire' ? response.data.paymasterData : response.paymasterData\n }\n } catch (e: any) {\n if (e.message === 'Ambire relayer error timeout') {\n if (this.errorCallback) {\n this.errorCallback({\n level: 'major',\n message: 'Paymaster is not responding. Retrying...',\n error: new Error('Paymaster call timeout')\n })\n }\n const increment = counter + 1\n return this.#retryPaymasterRequest(apiCall, increment)\n }\n\n const convertedError =\n this.type === 'ERC7677' ? new SponsorshipPaymasterError() : new RelayerPaymasterError(e)\n const { message } = getHumanReadableBroadcastError(convertedError)\n return {\n success: false,\n message,\n error: e\n }\n }\n }\n\n async #ambireCall(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation\n ): Promise {\n if (!this.provider) throw new Error('provider not set, did you call init?')\n if (!this.network) throw new Error('network not set, did you call init?')\n\n // request the paymaster with a timeout window\n const localUserOp = { ...userOp }\n localUserOp.paymaster = AMBIRE_PAYMASTER\n return this.#retryPaymasterRequest(() => {\n return this.callRelayer(`/v2/paymaster/${op.networkId}/sign`, 'POST', {\n userOperation: getCleanUserOp(localUserOp)[0],\n paymaster: AMBIRE_PAYMASTER,\n bytecode: acc.creation!.bytecode,\n salt: acc.creation!.salt,\n key: acc.associatedKeys[0],\n // eslint-disable-next-line no-underscore-dangle\n rpcUrl: this.provider!._getConnection().url,\n bundler: userOp.bundler\n })\n })\n }\n\n async #erc7677Call(op: AccountOp, userOp: UserOperation, network: Network) {\n const sponsorData = this.sponsorDataEstimation as PaymasterEstimationData\n\n // no need to do an extra call if the dapp has already provided sponsorship\n if ('isFinal' in sponsorData && sponsorData.isFinal)\n return {\n success: true,\n paymaster: sponsorData.paymaster,\n paymasterData: sponsorData.paymasterData\n }\n\n const localUserOp = { ...userOp }\n localUserOp.paymaster = sponsorData.paymaster\n localUserOp.paymasterData = sponsorData.paymasterData\n const response = await this.#retryPaymasterRequest(() => {\n return getPaymasterData(this.paymasterService as PaymasterService, localUserOp, network)\n })\n\n if (\n !response.success &&\n (response as PaymasterErrorReponse).message !== PAYMASTER_DOWN_BROADCAST_ERROR_MESSAGE &&\n op.meta &&\n op.meta.paymasterService\n ) {\n failedPaymasters.addFailedSponsorship(op.meta.paymasterService.id)\n }\n\n return response\n }\n\n async call(\n acc: Account,\n op: AccountOp,\n userOp: UserOperation,\n network: Network\n ): Promise {\n if (this.type === 'Ambire') return this.#ambireCall(acc, op, userOp)\n\n if (this.type === 'ERC7677') return this.#erc7677Call(op, userOp, network)\n\n throw new Error('Paymaster not configured. Please contact support')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/polling/polling.js b/dist/src/libs/polling/polling.js index 30c97d3fa..6754aaeba 100644 --- a/dist/src/libs/polling/polling.js +++ b/dist/src/libs/polling/polling.js @@ -1,9 +1,13 @@ -import EventEmitter from '../../controllers/eventEmitter/eventEmitter'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Polling = void 0; +const tslib_1 = require("tslib"); +const eventEmitter_1 = tslib_1.__importDefault(require("../../controllers/eventEmitter/eventEmitter")); const DEFAULT_TIMEOUT = 60000; // DOCS // the purpouse ofthis class is to make requests until a specific case is satisfied, unallowed error occures or the time runs out // used for checking if the magicLink, sent to the email, has been clicked, making the emailAddress confirmed and eligible for email vult -export class Polling extends EventEmitter { +class Polling extends eventEmitter_1.default { state; defaultTimeout = 2000; allowableErrors = [401]; @@ -48,4 +52,5 @@ export class Polling extends EventEmitter { return promise; } } +exports.Polling = Polling; //# sourceMappingURL=polling.js.map \ No newline at end of file diff --git a/dist/src/libs/polling/polling.js.map b/dist/src/libs/polling/polling.js.map index 497dd2b32..157d366f8 100644 --- a/dist/src/libs/polling/polling.js.map +++ b/dist/src/libs/polling/polling.js.map @@ -1 +1 @@ -{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../../../src/libs/polling/polling.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,6CAA6C,CAAA;AAEtE,MAAM,eAAe,GAAG,KAAK,CAAA;AAC7B,OAAO;AACP,iIAAiI;AACjI,yIAAyI;AACzI,MAAM,OAAO,OAAQ,SAAQ,YAAY;IACvC,KAAK,CAGJ;IAED,cAAc,GAAW,IAAI,CAAA;IAE7B,eAAe,GAAa,CAAC,GAAG,CAAC,CAAA;IAEjC,SAAS,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAExC,YAAY,eAA0B;QACpC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,KAAK;SACf,CAAA;QACD,IAAI,eAAe;YAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAY,EACZ,MAAW,EACX,OAAwB,EACxB,UAA2B,EAC3B,OAAgB,EAChB,WAAoB;QAEpB,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,CAAA;QACpC,MAAM,OAAO,GAAa,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,sDAAsD;QACtD,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,KAAK,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;aACV,CAAA;YACD,IAAI,UAAU,IAAI,UAAU,EAAE;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;iBAC/B,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;iBACjD,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;YACnD,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;gBACvF,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;gBACnB,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE;gBACzB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;aACvB;YAED,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,EAAE;gBACzE,OAAO,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;aAC3D;YAED,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;YAE3C,OAAO,OAAO,CACZ,MAAM,IAAI,CAAC,IAAI,CACb,EAAE,EACF,MAAM,EACN,GAAG,EAAE,CAAC,IAAI,EACV,UAAU,EACV,OAAO,IAAI,eAAe,EAC1B,IAAI,CAAC,cAAc,CACpB,CACF,CAAA;QACH,CAAC,EAAE,WAAW,CAAC,CAChB,CAAA;QACD,OAAO,IAAI,OAAO,EAAE,CAAA;QACpB,OAAO,OAAO,CAAA;IAChB,CAAC;CACF","sourcesContent":["import EventEmitter from '../../controllers/eventEmitter/eventEmitter'\n\nconst DEFAULT_TIMEOUT = 60000\n// DOCS\n// the purpouse ofthis class is to make requests until a specific case is satisfied, unallowed error occures or the time runs out\n// used for checking if the magicLink, sent to the email, has been clicked, making the emailAddress confirmed and eligible for email vult\nexport class Polling extends EventEmitter {\n state: {\n isError: boolean\n error?: any\n }\n\n defaultTimeout: number = 2000\n\n allowableErrors: number[] = [401]\n\n startTime: number = new Date().getTime()\n\n constructor(allowableErrors?: number[]) {\n super()\n this.state = {\n isError: false\n }\n if (allowableErrors) this.allowableErrors = allowableErrors\n }\n\n async exec(\n fn: Function,\n params: any,\n cleanup: Function | null,\n shouldStop: Function | null,\n timeout?: number,\n pollingtime?: number\n ): Promise {\n const execTimeout = pollingtime || 0\n const promise: T | null = await new Promise((resolve) =>\n // eslint-disable-next-line no-promise-executor-return\n setTimeout(async () => {\n this.state = {\n isError: false,\n error: {}\n }\n if (shouldStop && shouldStop()) return resolve(null)\n const result = await fn(...params)\n .catch((error: any) => ({ isError: true, error }))\n .then((res: any) => ({ isError: false, ...res }))\n if (result.isError && this.allowableErrors.includes(result?.error?.output?.res?.status)) {\n this.state = result\n this.emitUpdate()\n } else if (result.isError) {\n return resolve(result)\n }\n\n if (new Date().getTime() - this.startTime >= (timeout || DEFAULT_TIMEOUT)) {\n return resolve({ ...result, error: new Error('timeout') })\n }\n\n if (!result.isError) return resolve(result)\n\n return resolve(\n await this.exec(\n fn,\n params,\n () => null,\n shouldStop,\n timeout || DEFAULT_TIMEOUT,\n this.defaultTimeout\n )\n )\n }, execTimeout)\n )\n cleanup && cleanup()\n return promise\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../../../src/libs/polling/polling.ts"],"names":[],"mappings":";;;;AAAA,uGAAsE;AAEtE,MAAM,eAAe,GAAG,KAAK,CAAA;AAC7B,OAAO;AACP,iIAAiI;AACjI,yIAAyI;AACzI,MAAa,OAAQ,SAAQ,sBAAY;IACvC,KAAK,CAGJ;IAED,cAAc,GAAW,IAAI,CAAA;IAE7B,eAAe,GAAa,CAAC,GAAG,CAAC,CAAA;IAEjC,SAAS,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAExC,YAAY,eAA0B;QACpC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,KAAK;SACf,CAAA;QACD,IAAI,eAAe;YAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAY,EACZ,MAAW,EACX,OAAwB,EACxB,UAA2B,EAC3B,OAAgB,EAChB,WAAoB;QAEpB,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,CAAA;QACpC,MAAM,OAAO,GAAa,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,sDAAsD;QACtD,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,KAAK,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;aACV,CAAA;YACD,IAAI,UAAU,IAAI,UAAU,EAAE;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;iBAC/B,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;iBACjD,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;YACnD,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;gBACvF,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;gBACnB,IAAI,CAAC,UAAU,EAAE,CAAA;aAClB;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE;gBACzB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;aACvB;YAED,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,EAAE;gBACzE,OAAO,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;aAC3D;YAED,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;YAE3C,OAAO,OAAO,CACZ,MAAM,IAAI,CAAC,IAAI,CACb,EAAE,EACF,MAAM,EACN,GAAG,EAAE,CAAC,IAAI,EACV,UAAU,EACV,OAAO,IAAI,eAAe,EAC1B,IAAI,CAAC,cAAc,CACpB,CACF,CAAA;QACH,CAAC,EAAE,WAAW,CAAC,CAChB,CAAA;QACD,OAAO,IAAI,OAAO,EAAE,CAAA;QACpB,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AApED,0BAoEC","sourcesContent":["import EventEmitter from '../../controllers/eventEmitter/eventEmitter'\n\nconst DEFAULT_TIMEOUT = 60000\n// DOCS\n// the purpouse ofthis class is to make requests until a specific case is satisfied, unallowed error occures or the time runs out\n// used for checking if the magicLink, sent to the email, has been clicked, making the emailAddress confirmed and eligible for email vult\nexport class Polling extends EventEmitter {\n state: {\n isError: boolean\n error?: any\n }\n\n defaultTimeout: number = 2000\n\n allowableErrors: number[] = [401]\n\n startTime: number = new Date().getTime()\n\n constructor(allowableErrors?: number[]) {\n super()\n this.state = {\n isError: false\n }\n if (allowableErrors) this.allowableErrors = allowableErrors\n }\n\n async exec(\n fn: Function,\n params: any,\n cleanup: Function | null,\n shouldStop: Function | null,\n timeout?: number,\n pollingtime?: number\n ): Promise {\n const execTimeout = pollingtime || 0\n const promise: T | null = await new Promise((resolve) =>\n // eslint-disable-next-line no-promise-executor-return\n setTimeout(async () => {\n this.state = {\n isError: false,\n error: {}\n }\n if (shouldStop && shouldStop()) return resolve(null)\n const result = await fn(...params)\n .catch((error: any) => ({ isError: true, error }))\n .then((res: any) => ({ isError: false, ...res }))\n if (result.isError && this.allowableErrors.includes(result?.error?.output?.res?.status)) {\n this.state = result\n this.emitUpdate()\n } else if (result.isError) {\n return resolve(result)\n }\n\n if (new Date().getTime() - this.startTime >= (timeout || DEFAULT_TIMEOUT)) {\n return resolve({ ...result, error: new Error('timeout') })\n }\n\n if (!result.isError) return resolve(result)\n\n return resolve(\n await this.exec(\n fn,\n params,\n () => null,\n shouldStop,\n timeout || DEFAULT_TIMEOUT,\n this.defaultTimeout\n )\n )\n }, execTimeout)\n )\n cleanup && cleanup()\n return promise\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.js b/dist/src/libs/portfolio/batcher.js index 08ca2fea1..981160c9c 100644 --- a/dist/src/libs/portfolio/batcher.js +++ b/dist/src/libs/portfolio/batcher.js @@ -1,4 +1,6 @@ -export default function batcher(fetch, requestGenerator, timeoutSettings, batchDebounce = 0) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function batcher(fetch, requestGenerator, timeoutSettings, batchDebounce = 0) { let queue = []; async function resolveQueue() { // Note: intentionally just using the first values in the queue @@ -60,4 +62,5 @@ export default function batcher(fetch, requestGenerator, timeoutSettings, batchD }); }; } +exports.default = batcher; //# sourceMappingURL=batcher.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/batcher.js.map b/dist/src/libs/portfolio/batcher.js.map index a66f4c80d..c924d9ef6 100644 --- a/dist/src/libs/portfolio/batcher.js.map +++ b/dist/src/libs/portfolio/batcher.js.map @@ -1 +1 @@ -{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/batcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport interface QueueElement {\n resolve: Function\n reject: Function\n fetch: Fetch\n data: any\n}\n\nexport interface Request {\n url: string\n queueSegment: QueueElement[]\n}\n\nexport type RequestGenerator = (queue: QueueElement[]) => Request[]\n\nexport default function batcher(\n fetch: Fetch,\n requestGenerator: RequestGenerator,\n timeoutSettings?: {\n timeoutAfter: number\n timeoutErrorMessage: string\n },\n batchDebounce: number = 0\n): Function {\n let queue: QueueElement[] = []\n\n async function resolveQueue() {\n // Note: intentionally just using the first values in the queue\n if (queue.length === 0) return\n const queueCopy = queue\n queue = []\n await Promise.all(\n // we let the requestGenerator split the queue into parts, each of it will be resolved with it's own url\n // this allows the possibility of one queue being resolved with multiple requests, for example if the API needs to be called\n // separately for each network\n // useful also if the API is limited to a certain # and we want to paginate\n requestGenerator(queueCopy).map(async ({ url, queueSegment }) => {\n try {\n const fetchPromise = fetch(url).then(async (resp) => {\n const body = await resp.json()\n if (resp.status !== 200) throw body\n if (body.hasOwnProperty('message')) throw body\n if (body.hasOwnProperty('error')) throw body\n if (Array.isArray(body)) {\n if (body.length !== queueSegment.length)\n throw new Error('internal error: queue length and response length mismatch')\n queueSegment.forEach(({ resolve }, i) => resolve(body[i]))\n } else if (queueSegment.every((x) => typeof x.data.responseIdentifier === 'string')) {\n queueSegment.forEach(({ resolve, data }) =>\n resolve(body[data.responseIdentifier as string])\n )\n } else throw body\n })\n\n if (timeoutSettings) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('Request timed out'))\n }, timeoutSettings.timeoutAfter)\n })\n await Promise.race([fetchPromise, timeoutPromise])\n } else {\n await fetchPromise\n }\n } catch (e: any) {\n if (e.message === 'Request timed out' && timeoutSettings) {\n console.error(timeoutSettings.timeoutErrorMessage)\n }\n queueSegment.forEach(({ reject }) => reject(e))\n }\n })\n )\n }\n return async (data: any): Promise => {\n // always do the setTimeout - if it's a second or third batchedCall within a tick, all setTimeouts will fire but only the first will perform work\n setTimeout(resolveQueue, batchDebounce)\n return new Promise((resolve, reject) => {\n queue.push({ resolve, reject, fetch, data })\n })\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/batcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport interface QueueElement {\n resolve: Function\n reject: Function\n fetch: Fetch\n data: any\n}\n\nexport interface Request {\n url: string\n queueSegment: QueueElement[]\n}\n\nexport type RequestGenerator = (queue: QueueElement[]) => Request[]\n\nexport default function batcher(\n fetch: Fetch,\n requestGenerator: RequestGenerator,\n timeoutSettings?: {\n timeoutAfter: number\n timeoutErrorMessage: string\n },\n batchDebounce: number = 0\n): Function {\n let queue: QueueElement[] = []\n\n async function resolveQueue() {\n // Note: intentionally just using the first values in the queue\n if (queue.length === 0) return\n const queueCopy = queue\n queue = []\n await Promise.all(\n // we let the requestGenerator split the queue into parts, each of it will be resolved with it's own url\n // this allows the possibility of one queue being resolved with multiple requests, for example if the API needs to be called\n // separately for each network\n // useful also if the API is limited to a certain # and we want to paginate\n requestGenerator(queueCopy).map(async ({ url, queueSegment }) => {\n try {\n const fetchPromise = fetch(url).then(async (resp) => {\n const body = await resp.json()\n if (resp.status !== 200) throw body\n if (body.hasOwnProperty('message')) throw body\n if (body.hasOwnProperty('error')) throw body\n if (Array.isArray(body)) {\n if (body.length !== queueSegment.length)\n throw new Error('internal error: queue length and response length mismatch')\n queueSegment.forEach(({ resolve }, i) => resolve(body[i]))\n } else if (queueSegment.every((x) => typeof x.data.responseIdentifier === 'string')) {\n queueSegment.forEach(({ resolve, data }) =>\n resolve(body[data.responseIdentifier as string])\n )\n } else throw body\n })\n\n if (timeoutSettings) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('Request timed out'))\n }, timeoutSettings.timeoutAfter)\n })\n await Promise.race([fetchPromise, timeoutPromise])\n } else {\n await fetchPromise\n }\n } catch (e: any) {\n if (e.message === 'Request timed out' && timeoutSettings) {\n console.error(timeoutSettings.timeoutErrorMessage)\n }\n queueSegment.forEach(({ reject }) => reject(e))\n }\n })\n )\n }\n return async (data: any): Promise => {\n // always do the setTimeout - if it's a second or third batchedCall within a tick, all setTimeouts will fire but only the first will perform work\n setTimeout(resolveQueue, batchDebounce)\n return new Promise((resolve, reject) => {\n queue.push({ resolve, reject, fetch, data })\n })\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/customToken.js b/dist/src/libs/portfolio/customToken.js index e37e91ffb..2adf580fc 100644 --- a/dist/src/libs/portfolio/customToken.js +++ b/dist/src/libs/portfolio/customToken.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=customToken.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.js b/dist/src/libs/portfolio/gecko.js index 53ed0c57d..1d66f1ffc 100644 --- a/dist/src/libs/portfolio/gecko.js +++ b/dist/src/libs/portfolio/gecko.js @@ -1,17 +1,22 @@ -import dotenv from 'dotenv'; -import { geckoIdMapper } from '../../consts/coingecko'; -import { paginate } from './pagination'; -dotenv.config(); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.geckoRequestBatcher = exports.geckoResponseIdentifier = void 0; +const tslib_1 = require("tslib"); +const dotenv_1 = tslib_1.__importDefault(require("dotenv")); +const coingecko_1 = require("../../consts/coingecko"); +const pagination_1 = require("./pagination"); +dotenv_1.default.config(); // max tokens per request; we seem to have faster results when it's lower const BATCH_LIMIT = 40; -export function geckoResponseIdentifier(tokenAddr, network) { - return geckoIdMapper(tokenAddr, network) || tokenAddr.toLowerCase(); +function geckoResponseIdentifier(tokenAddr, network) { + return (0, coingecko_1.geckoIdMapper)(tokenAddr, network) || tokenAddr.toLowerCase(); } -export function geckoRequestBatcher(queue) { +exports.geckoResponseIdentifier = geckoResponseIdentifier; +function geckoRequestBatcher(queue) { const segments = {}; // eslint-disable-next-line no-restricted-syntax for (const queueItem of queue) { - const geckoId = geckoIdMapper(queueItem.data.address, queueItem.data.network); + const geckoId = (0, coingecko_1.geckoIdMapper)(queueItem.data.address, queueItem.data.network); // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com) // since it would return nothing. // This can happen when adding a custom network that doesn't have a CoinGecko platform ID. @@ -30,7 +35,7 @@ export function geckoRequestBatcher(queue) { // deduplicating is OK because we use a key-based mapping (responseIdentifier) to map the responses // @TODO deduplication should happen BEFORE the pagination but without dropping items from queueSegment const pages = Object.entries(segments) - .map(([key, queueSegment]) => paginate(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))) + .map(([key, queueSegment]) => (0, pagination_1.paginate)(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))) .flat(1); const dedup = (x) => x.filter((y, i) => x.indexOf(y) === i); return pages.map(({ key, queueSegment }) => { @@ -40,10 +45,11 @@ export function geckoRequestBatcher(queue) { const mainApiUrl = 'https://cena.ambire.com'; let url; if (key.endsWith('natives')) - url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(queueSegment.map((x) => geckoIdMapper(x.data.address, x.data.network))).join('%2C')}&vs_currencies=${baseCurrency}`; + url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(queueSegment.map((x) => (0, coingecko_1.geckoIdMapper)(x.data.address, x.data.network))).join('%2C')}&vs_currencies=${baseCurrency}`; else url = `${mainApiUrl}/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(queueSegment.map((x) => x.data.address)).join('%2C')}&vs_currencies=${baseCurrency}`; return { url, queueSegment }; }); } +exports.geckoRequestBatcher = geckoRequestBatcher; //# sourceMappingURL=gecko.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/gecko.js.map b/dist/src/libs/portfolio/gecko.js.map index 3fab8de39..f99ff02ed 100644 --- a/dist/src/libs/portfolio/gecko.js.map +++ b/dist/src/libs/portfolio/gecko.js.map @@ -1 +1 @@ -{"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/gecko.ts"],"names":[],"mappings":"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","sourcesContent":["import dotenv from 'dotenv'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Network } from '../../interfaces/network'\nimport { QueueElement, Request } from './batcher'\nimport { paginate } from './pagination'\n\ndotenv.config()\n\n// max tokens per request; we seem to have faster results when it's lower\nconst BATCH_LIMIT = 40\n\nexport function geckoResponseIdentifier(tokenAddr: string, network: Network): string {\n return geckoIdMapper(tokenAddr, network) || tokenAddr.toLowerCase()\n}\n\nexport function geckoRequestBatcher(queue: QueueElement[]): Request[] {\n const segments: { [key: string]: any[] } = {}\n\n // eslint-disable-next-line no-restricted-syntax\n for (const queueItem of queue) {\n const geckoId = geckoIdMapper(queueItem.data.address, queueItem.data.network)\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n // eslint-disable-next-line no-continue\n if (!geckoId && !queueItem.data.network.platformId) continue\n\n let segmentId: string = queueItem.data.baseCurrency\n\n if (geckoId) segmentId += ':natives'\n else segmentId += `:${queueItem.data.network.id}`\n\n if (!segments[segmentId]) segments[segmentId] = []\n segments[segmentId].push(queueItem)\n }\n // deduplicating is OK because we use a key-based mapping (responseIdentifier) to map the responses\n // @TODO deduplication should happen BEFORE the pagination but without dropping items from queueSegment\n const pages = Object.entries(segments)\n .map(([key, queueSegment]) =>\n paginate(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))\n )\n .flat(1)\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n return pages.map(({ key, queueSegment }) => {\n // This is OK because we're segmented by baseCurrency\n const baseCurrency = queueSegment[0]!.data.baseCurrency\n const geckoPlatform = queueSegment[0]!.data.network.platformId\n\n const mainApiUrl = 'https://cena.ambire.com'\n\n let url\n if (key.endsWith('natives'))\n url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(\n queueSegment.map((x) => geckoIdMapper(x.data.address, x.data.network))\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n else\n url = `${mainApiUrl}/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(\n queueSegment.map((x) => x.data.address)\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n return { url, queueSegment }\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/gecko.ts"],"names":[],"mappings":"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","sourcesContent":["import dotenv from 'dotenv'\n\nimport { geckoIdMapper } from '../../consts/coingecko'\nimport { Network } from '../../interfaces/network'\nimport { QueueElement, Request } from './batcher'\nimport { paginate } from './pagination'\n\ndotenv.config()\n\n// max tokens per request; we seem to have faster results when it's lower\nconst BATCH_LIMIT = 40\n\nexport function geckoResponseIdentifier(tokenAddr: string, network: Network): string {\n return geckoIdMapper(tokenAddr, network) || tokenAddr.toLowerCase()\n}\n\nexport function geckoRequestBatcher(queue: QueueElement[]): Request[] {\n const segments: { [key: string]: any[] } = {}\n\n // eslint-disable-next-line no-restricted-syntax\n for (const queueItem of queue) {\n const geckoId = geckoIdMapper(queueItem.data.address, queueItem.data.network)\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n // eslint-disable-next-line no-continue\n if (!geckoId && !queueItem.data.network.platformId) continue\n\n let segmentId: string = queueItem.data.baseCurrency\n\n if (geckoId) segmentId += ':natives'\n else segmentId += `:${queueItem.data.network.id}`\n\n if (!segments[segmentId]) segments[segmentId] = []\n segments[segmentId].push(queueItem)\n }\n // deduplicating is OK because we use a key-based mapping (responseIdentifier) to map the responses\n // @TODO deduplication should happen BEFORE the pagination but without dropping items from queueSegment\n const pages = Object.entries(segments)\n .map(([key, queueSegment]) =>\n paginate(queueSegment, BATCH_LIMIT).map((page) => ({ key, queueSegment: page }))\n )\n .flat(1)\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n return pages.map(({ key, queueSegment }) => {\n // This is OK because we're segmented by baseCurrency\n const baseCurrency = queueSegment[0]!.data.baseCurrency\n const geckoPlatform = queueSegment[0]!.data.network.platformId\n\n const mainApiUrl = 'https://cena.ambire.com'\n\n let url\n if (key.endsWith('natives'))\n url = `${mainApiUrl}/api/v3/simple/price?ids=${dedup(\n queueSegment.map((x) => geckoIdMapper(x.data.address, x.data.network))\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n else\n url = `${mainApiUrl}/api/v3/simple/token_price/${geckoPlatform}?contract_addresses=${dedup(\n queueSegment.map((x) => x.data.address)\n ).join('%2C')}&vs_currencies=${baseCurrency}`\n return { url, queueSegment }\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.js b/dist/src/libs/portfolio/getNetworksWithAssets.js index 776b91a55..6c6bbcbe7 100644 --- a/dist/src/libs/portfolio/getNetworksWithAssets.js +++ b/dist/src/libs/portfolio/getNetworksWithAssets.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const getAccountNetworksWithAssets = (accountId, accountState, storageStateByAccount, providers) => { const networksWithAssets = { ...storageStateByAccount[accountId] }; Object.keys(accountState).forEach((networkId) => { @@ -16,5 +18,5 @@ const getAccountNetworksWithAssets = (accountId, accountState, storageStateByAcc }); return networksWithAssets; }; -export default getAccountNetworksWithAssets; +exports.default = getAccountNetworksWithAssets; //# sourceMappingURL=getNetworksWithAssets.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getNetworksWithAssets.js.map b/dist/src/libs/portfolio/getNetworksWithAssets.js.map index 6357725f3..33d8eba13 100644 --- a/dist/src/libs/portfolio/getNetworksWithAssets.js.map +++ b/dist/src/libs/portfolio/getNetworksWithAssets.js.map @@ -1 +1 @@ -{"version":3,"file":"getNetworksWithAssets.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getNetworksWithAssets.ts"],"names":[],"mappings":"AAIA,MAAM,4BAA4B,GAAG,CACnC,SAAoB,EACpB,YAA0B,EAC1B,qBAEC,EACD,SAAuB,EACH,EAAE;IACtB,MAAM,kBAAkB,GAAG,EAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAA;IAElE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAE9C,mCAAmC;QACnC,IAAI,CAAC,MAAM,IAAI,SAAS;YAAE,OAAM;QAEhC,iCAAiC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAChF,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QAE3E,yCAAyC;QACzC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC,eAAe,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,eAAe,4BAA4B,CAAA","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { AccountAssetsState, AccountState } from './interfaces'\n\nconst getAccountNetworksWithAssets = (\n accountId: AccountId,\n accountState: AccountState,\n storageStateByAccount: {\n [accountId: string]: AccountAssetsState\n },\n providers: RPCProviders\n): AccountAssetsState => {\n const networksWithAssets = { ...storageStateByAccount[accountId] }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const result = accountState[networkId]?.result\n\n // RPC is down or an error occurred\n if (!result || isRPCDown) return\n\n // RPC is up and we have a result\n const nonZeroTokens = result.tokens.filter(({ amount }) => Number(amount) !== 0)\n const hasCollectibles = result.collections && result.collections.length > 0\n\n // The account has assets on this network\n networksWithAssets[networkId] = !!nonZeroTokens.length || !!hasCollectibles\n })\n\n return networksWithAssets\n}\n\nexport default getAccountNetworksWithAssets\n"]} \ No newline at end of file +{"version":3,"file":"getNetworksWithAssets.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getNetworksWithAssets.ts"],"names":[],"mappings":";;AAIA,MAAM,4BAA4B,GAAG,CACnC,SAAoB,EACpB,YAA0B,EAC1B,qBAEC,EACD,SAAuB,EACH,EAAE;IACtB,MAAM,kBAAkB,GAAG,EAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAA;IAElE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAE9C,mCAAmC;QACnC,IAAI,CAAC,MAAM,IAAI,SAAS;YAAE,OAAM;QAEhC,iCAAiC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAChF,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QAE3E,yCAAyC;QACzC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC,eAAe,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,kBAAe,4BAA4B,CAAA","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { AccountAssetsState, AccountState } from './interfaces'\n\nconst getAccountNetworksWithAssets = (\n accountId: AccountId,\n accountState: AccountState,\n storageStateByAccount: {\n [accountId: string]: AccountAssetsState\n },\n providers: RPCProviders\n): AccountAssetsState => {\n const networksWithAssets = { ...storageStateByAccount[accountId] }\n\n Object.keys(accountState).forEach((networkId) => {\n if (!providers[networkId]) return\n\n const isRPCDown = !providers[networkId].isWorking\n const result = accountState[networkId]?.result\n\n // RPC is down or an error occurred\n if (!result || isRPCDown) return\n\n // RPC is up and we have a result\n const nonZeroTokens = result.tokens.filter(({ amount }) => Number(amount) !== 0)\n const hasCollectibles = result.collections && result.collections.length > 0\n\n // The account has assets on this network\n networksWithAssets[networkId] = !!nonZeroTokens.length || !!hasCollectibles\n })\n\n return networksWithAssets\n}\n\nexport default getAccountNetworksWithAssets\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.js b/dist/src/libs/portfolio/getOnchainBalances.js index 4a92c6f8f..e514feb9e 100644 --- a/dist/src/libs/portfolio/getOnchainBalances.js +++ b/dist/src/libs/portfolio/getOnchainBalances.js @@ -1,10 +1,13 @@ -import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; -import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; -import { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'; -import { getAccountDeployParams, isSmartAccount } from '../account/account'; -import { callToTuple, toSingletonCall } from '../accountOp/accountOp'; -import { DeploylessMode, parseErr } from '../deployless/deployless'; -import { getFlags, overrideSymbol } from './helpers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getTokens = exports.getNFTs = exports.getDeploylessOpts = void 0; +const deploy_1 = require("../../consts/deploy"); +const deployless_1 = require("../../consts/deployless"); +const simulationStateOverride_1 = require("../../utils/simulationStateOverride"); +const account_1 = require("../account/account"); +const accountOp_1 = require("../accountOp/accountOp"); +const deployless_2 = require("../deployless/deployless"); +const helpers_1 = require("./helpers"); class SimulationError extends Error { simulationErrorMsg; beforeNonce; @@ -18,7 +21,7 @@ class SimulationError extends Error { } function handleSimulationError(error, beforeNonce, afterNonce, simulationOps) { if (error !== '0x') - throw new SimulationError(parseErr(error) || error, beforeNonce, afterNonce); + throw new SimulationError((0, deployless_2.parseErr)(error) || error, beforeNonce, afterNonce); // If the afterNonce is 0, it means that we reverted, even if the error is empty // In both BalanceOracle and NFTOracle, afterSimulation and therefore afterNonce will be left empty if (afterNonce === 0n) @@ -43,15 +46,16 @@ function handleSimulationError(error, beforeNonce, afterNonce, simulationOps) { throw new SimulationError('Failed to increment the nonce to the final account op nonce', beforeNonce, afterNonce); } } -export function getDeploylessOpts(accountAddr, supportsStateOverride, opts) { +function getDeploylessOpts(accountAddr, supportsStateOverride, opts) { return { blockTag: opts.blockTag, - from: DEPLOYLESS_SIMULATION_FROM, - mode: supportsStateOverride && opts.isEOA ? DeploylessMode.StateOverride : DeploylessMode.Detect, - stateToOverride: supportsStateOverride && opts.isEOA ? getEoaSimulationStateOverride(accountAddr) : null + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, + mode: supportsStateOverride && opts.isEOA ? deployless_2.DeploylessMode.StateOverride : deployless_2.DeploylessMode.Detect, + stateToOverride: supportsStateOverride && opts.isEOA ? (0, simulationStateOverride_1.getEoaSimulationStateOverride)(accountAddr) : null }; } -export async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limits) { +exports.getDeploylessOpts = getDeploylessOpts; +async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs, limits) { const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts); const mapToken = (token) => { return { @@ -73,11 +77,11 @@ export async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs return [collections.map((token) => [token.error, mapToken(token)]), {}]; } const { accountOps, account } = opts.simulation; - const [factory, factoryCalldata] = getAccountDeployParams(account); + const [factory, factoryCalldata] = (0, account_1.getAccountDeployParams)(account); const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({ // EOA starts from a fake, specified nonce - nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx), - calls: calls.map(toSingletonCall).map(callToTuple) + nonce: (0, account_1.isSmartAccount)(account) ? nonce : BigInt(deployless_1.EOA_SIMULATION_NONCE) + BigInt(idx), + calls: calls.map(accountOp_1.toSingletonCall).map(accountOp_1.callToTuple) })); const [before, after, simulationErr, , , deltaAddressesMapping] = await deployless.call('simulateAndGetAllNFTs', [ accountAddr, @@ -132,7 +136,8 @@ export async function getNFTs(network, deployless, opts, accountAddr, tokenAddrs {} ]; } -export async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { +exports.getNFTs = getNFTs; +async function getTokens(network, deployless, opts, accountAddr, tokenAddrs) { const mapToken = (token, address) => { return { amount: token.amount, @@ -140,9 +145,9 @@ export async function getTokens(network, deployless, opts, accountAddr, tokenAdd decimals: Number(token.decimals), symbol: address === '0x0000000000000000000000000000000000000000' ? network.nativeAssetSymbol - : overrideSymbol(address, network.id, token.symbol), + : (0, helpers_1.overrideSymbol)(address, network.id, token.symbol), address, - flags: getFlags({}, network.id, network.id, address) + flags: (0, helpers_1.getFlags)({}, network.id, network.id, address) }; }; const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts); @@ -158,10 +163,10 @@ export async function getTokens(network, deployless, opts, accountAddr, tokenAdd const { accountOps, account } = opts.simulation; const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({ // EOA starts from a fake, specified nonce - nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx), - calls: calls.map(toSingletonCall).map(callToTuple) + nonce: (0, account_1.isSmartAccount)(account) ? nonce : BigInt(deployless_1.EOA_SIMULATION_NONCE) + BigInt(idx), + calls: calls.map(accountOp_1.toSingletonCall).map(accountOp_1.callToTuple) })); - const [factory, factoryCalldata] = getAccountDeployParams(account); + const [factory, factoryCalldata] = (0, account_1.getAccountDeployParams)(account); const [before, after, simulationErr, , blockNumber, deltaAddressesMapping] = await deployless.call('simulateAndGetBalances', [ accountAddr, account.associatedKeys, @@ -214,4 +219,5 @@ export async function getTokens(network, deployless, opts, accountAddr, tokenAdd } ]; } +exports.getTokens = getTokens; //# sourceMappingURL=getOnchainBalances.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/getOnchainBalances.js.map b/dist/src/libs/portfolio/getOnchainBalances.js.map index e17c205c7..e788f400e 100644 --- a/dist/src/libs/portfolio/getOnchainBalances.js.map +++ b/dist/src/libs/portfolio/getOnchainBalances.js.map @@ -1 +1 @@ -{"version":3,"file":"getOnchainBalances.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getOnchainBalances.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { callToTuple, toSingletonCall } from '../accountOp/accountOp'\nimport { Deployless, DeploylessMode, parseErr } from '../deployless/deployless'\nimport { getFlags, overrideSymbol } from './helpers'\nimport {\n CollectionResult,\n GetOptions,\n LimitsOptions,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nclass SimulationError extends Error {\n public simulationErrorMsg: string\n\n public beforeNonce: bigint\n\n public afterNonce: bigint\n\n constructor(message: string, beforeNonce: bigint, afterNonce: bigint) {\n super(`simulation error: ${message}`)\n this.simulationErrorMsg = message\n this.beforeNonce = beforeNonce\n this.afterNonce = afterNonce\n }\n}\n\nfunction handleSimulationError(\n error: string,\n beforeNonce: bigint,\n afterNonce: bigint,\n simulationOps: { nonce: bigint | null; calls: [string, string, string][] }[]\n) {\n if (error !== '0x') throw new SimulationError(parseErr(error) || error, beforeNonce, afterNonce)\n\n // If the afterNonce is 0, it means that we reverted, even if the error is empty\n // In both BalanceOracle and NFTOracle, afterSimulation and therefore afterNonce will be left empty\n if (afterNonce === 0n) throw new SimulationError('Simulation reverted', beforeNonce, afterNonce)\n\n if (afterNonce < beforeNonce)\n throw new SimulationError(\n 'lower \"after\" nonce, should not be possible',\n beforeNonce,\n afterNonce\n )\n if (simulationOps.length && afterNonce === beforeNonce)\n throw new SimulationError(\n 'Account op passed for simulation but the nonce did not increment. Perhaps wrong nonce set in Account op',\n beforeNonce,\n afterNonce\n )\n\n // make sure the afterNonce (after all the accOps execution) is\n // at least the same as the final nonce in the simulationOps\n const nonces: bigint[] = simulationOps\n .map((op) => op.nonce ?? -1n)\n .filter((nonce) => nonce !== -1n)\n .sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n if (nonces.length && afterNonce < nonces[nonces.length - 1] + 1n) {\n throw new SimulationError(\n 'Failed to increment the nonce to the final account op nonce',\n beforeNonce,\n afterNonce\n )\n }\n}\n\nexport function getDeploylessOpts(\n accountAddr: string,\n supportsStateOverride: boolean,\n opts: Partial\n) {\n return {\n blockTag: opts.blockTag,\n from: DEPLOYLESS_SIMULATION_FROM,\n mode:\n supportsStateOverride && opts.isEOA ? DeploylessMode.StateOverride : DeploylessMode.Detect,\n stateToOverride:\n supportsStateOverride && opts.isEOA ? getEoaSimulationStateOverride(accountAddr) : null\n }\n}\n\nexport async function getNFTs(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: [string, any][],\n limits: LimitsOptions\n): Promise<[[TokenError, CollectionResult][], {}][]> {\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n const mapToken = (token: any) => {\n return {\n name: token.name,\n networkId: network.id,\n symbol: token.symbol,\n amount: BigInt(token.nfts.length),\n decimals: 1,\n collectibles: [...token.nfts]\n } as CollectionResult\n }\n\n if (!opts.simulation) {\n const collections = (\n await deployless.call(\n 'getAllNFTs',\n [\n accountAddr,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) =>\n x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput)\n ),\n limits.erc721Tokens\n ],\n deploylessOpts\n )\n )[0]\n\n return [collections.map((token: any) => [token.error, mapToken(token)]), {}]\n }\n\n const { accountOps, account } = opts.simulation\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [before, after, simulationErr, , , deltaAddressesMapping] = await deployless.call(\n 'simulateAndGetAllNFTs',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) => (x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput))),\n limits.erc721Tokens,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens: (CollectionResult & { addr: any })[] | null = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...mapToken(simulationToken),\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n\n return [\n before[0].map((beforeToken: any, i: number) => {\n const simulationToken = simulationTokens\n ? simulationTokens.find(\n (token: any) => token.addr.toLowerCase() === tokenAddrs[i][0].toLowerCase()\n )\n : null\n\n const token = mapToken(beforeToken)\n const receiving: bigint[] = []\n const sending: bigint[] = []\n\n token.collectibles.forEach((oldCollectible: bigint) => {\n // the first check is required because if there are no changes we will always have !undefined from the second check\n if (\n simulationToken?.collectibles &&\n !simulationToken?.collectibles?.includes(oldCollectible)\n )\n sending.push(oldCollectible)\n })\n simulationToken?.collectibles?.forEach((newCollectible: bigint) => {\n if (!token.collectibles.includes(newCollectible)) receiving.push(newCollectible)\n })\n\n return [\n beforeToken.error,\n {\n ...token,\n // Please refer to getTokens() for more info regarding `amountBeforeSimulation` calc\n simulationAmount: simulationToken ? simulationToken.amount - token.amount : undefined,\n amountPostSimulation: simulationToken ? simulationToken.amount : token.amount,\n postSimulation: { receiving, sending }\n }\n ]\n }),\n {}\n ]\n}\n\nexport async function getTokens(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: string[]\n): Promise<[[TokenError, TokenResult][], MetaData][]> {\n const mapToken = (token: any, address: string) => {\n return {\n amount: token.amount,\n networkId: network.id,\n decimals: Number(token.decimals),\n symbol:\n address === '0x0000000000000000000000000000000000000000'\n ? network.nativeAssetSymbol\n : overrideSymbol(address, network.id, token.symbol),\n address,\n flags: getFlags({}, network.id, network.id, address)\n } as TokenResult\n }\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n if (!opts.simulation) {\n const [results, blockNumber] = await deployless.call(\n 'getBalances',\n [accountAddr, tokenAddrs],\n deploylessOpts\n )\n\n return [\n results.map((token: any, i: number) => [token.error, mapToken(token, tokenAddrs[i])]),\n {\n blockNumber\n }\n ]\n }\n const { accountOps, account } = opts.simulation\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const [before, after, simulationErr, , blockNumber, deltaAddressesMapping] =\n await deployless.call(\n 'simulateAndGetBalances',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...simulationToken,\n amount: simulationToken.amount,\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n return [\n before[0].map((token: any, i: number) => {\n const simulation = simulationTokens\n ? simulationTokens.find((simulationToken: any) => simulationToken.addr === tokenAddrs[i])\n : null\n\n // Here's the math before `simulationAmount` and `amountPostSimulation`.\n // AccountA initial balance: 10 USDC.\n // AccountA attempts to transfer 5 USDC (not signed yet).\n // An external entity sends 3 USDC to AccountA on-chain.\n // Deployless simulation contract processing:\n // - Balance before simulation (before[0]): 10 USDC + 3 USDC = 13 USDC.\n // - Balance after simulation (after[0]): 10 USDC - 5 USDC + 3 USDC = 8 USDC.\n // Simulation-only balance displayed on the Sign Screen (we will call it `simulationAmount`):\n // - difference between after simulation and before: 8 USDC - 13 USDC = -5 USDC\n // Final balance displayed on the Dashboard (we will call it `amountPostSimulation`):\n // - after[0], 8 USDC.\n return [\n token.error,\n {\n ...mapToken(token, tokenAddrs[i]),\n simulationAmount: simulation ? simulation.amount - token.amount : undefined,\n amountPostSimulation: simulation ? simulation.amount : token.amount\n }\n ]\n }),\n {\n blockNumber,\n beforeNonce,\n afterNonce\n }\n ]\n}\n"]} \ No newline at end of file +{"version":3,"file":"getOnchainBalances.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/getOnchainBalances.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Network } from '../../interfaces/network'\nimport { getEoaSimulationStateOverride } from '../../utils/simulationStateOverride'\nimport { getAccountDeployParams, isSmartAccount } from '../account/account'\nimport { callToTuple, toSingletonCall } from '../accountOp/accountOp'\nimport { Deployless, DeploylessMode, parseErr } from '../deployless/deployless'\nimport { getFlags, overrideSymbol } from './helpers'\nimport {\n CollectionResult,\n GetOptions,\n LimitsOptions,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nclass SimulationError extends Error {\n public simulationErrorMsg: string\n\n public beforeNonce: bigint\n\n public afterNonce: bigint\n\n constructor(message: string, beforeNonce: bigint, afterNonce: bigint) {\n super(`simulation error: ${message}`)\n this.simulationErrorMsg = message\n this.beforeNonce = beforeNonce\n this.afterNonce = afterNonce\n }\n}\n\nfunction handleSimulationError(\n error: string,\n beforeNonce: bigint,\n afterNonce: bigint,\n simulationOps: { nonce: bigint | null; calls: [string, string, string][] }[]\n) {\n if (error !== '0x') throw new SimulationError(parseErr(error) || error, beforeNonce, afterNonce)\n\n // If the afterNonce is 0, it means that we reverted, even if the error is empty\n // In both BalanceOracle and NFTOracle, afterSimulation and therefore afterNonce will be left empty\n if (afterNonce === 0n) throw new SimulationError('Simulation reverted', beforeNonce, afterNonce)\n\n if (afterNonce < beforeNonce)\n throw new SimulationError(\n 'lower \"after\" nonce, should not be possible',\n beforeNonce,\n afterNonce\n )\n if (simulationOps.length && afterNonce === beforeNonce)\n throw new SimulationError(\n 'Account op passed for simulation but the nonce did not increment. Perhaps wrong nonce set in Account op',\n beforeNonce,\n afterNonce\n )\n\n // make sure the afterNonce (after all the accOps execution) is\n // at least the same as the final nonce in the simulationOps\n const nonces: bigint[] = simulationOps\n .map((op) => op.nonce ?? -1n)\n .filter((nonce) => nonce !== -1n)\n .sort((a, b) => {\n if (a === b) return 0\n if (a > b) return 1\n return -1\n })\n if (nonces.length && afterNonce < nonces[nonces.length - 1] + 1n) {\n throw new SimulationError(\n 'Failed to increment the nonce to the final account op nonce',\n beforeNonce,\n afterNonce\n )\n }\n}\n\nexport function getDeploylessOpts(\n accountAddr: string,\n supportsStateOverride: boolean,\n opts: Partial\n) {\n return {\n blockTag: opts.blockTag,\n from: DEPLOYLESS_SIMULATION_FROM,\n mode:\n supportsStateOverride && opts.isEOA ? DeploylessMode.StateOverride : DeploylessMode.Detect,\n stateToOverride:\n supportsStateOverride && opts.isEOA ? getEoaSimulationStateOverride(accountAddr) : null\n }\n}\n\nexport async function getNFTs(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: [string, any][],\n limits: LimitsOptions\n): Promise<[[TokenError, CollectionResult][], {}][]> {\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n const mapToken = (token: any) => {\n return {\n name: token.name,\n networkId: network.id,\n symbol: token.symbol,\n amount: BigInt(token.nfts.length),\n decimals: 1,\n collectibles: [...token.nfts]\n } as CollectionResult\n }\n\n if (!opts.simulation) {\n const collections = (\n await deployless.call(\n 'getAllNFTs',\n [\n accountAddr,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) =>\n x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput)\n ),\n limits.erc721Tokens\n ],\n deploylessOpts\n )\n )[0]\n\n return [collections.map((token: any) => [token.error, mapToken(token)]), {}]\n }\n\n const { accountOps, account } = opts.simulation\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [before, after, simulationErr, , , deltaAddressesMapping] = await deployless.call(\n 'simulateAndGetAllNFTs',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs.map(([address]) => address),\n tokenAddrs.map(([, x]) => (x.enumerable ? [] : x.tokens.slice(0, limits.erc721TokensInput))),\n limits.erc721Tokens,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens: (CollectionResult & { addr: any })[] | null = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...mapToken(simulationToken),\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n\n return [\n before[0].map((beforeToken: any, i: number) => {\n const simulationToken = simulationTokens\n ? simulationTokens.find(\n (token: any) => token.addr.toLowerCase() === tokenAddrs[i][0].toLowerCase()\n )\n : null\n\n const token = mapToken(beforeToken)\n const receiving: bigint[] = []\n const sending: bigint[] = []\n\n token.collectibles.forEach((oldCollectible: bigint) => {\n // the first check is required because if there are no changes we will always have !undefined from the second check\n if (\n simulationToken?.collectibles &&\n !simulationToken?.collectibles?.includes(oldCollectible)\n )\n sending.push(oldCollectible)\n })\n simulationToken?.collectibles?.forEach((newCollectible: bigint) => {\n if (!token.collectibles.includes(newCollectible)) receiving.push(newCollectible)\n })\n\n return [\n beforeToken.error,\n {\n ...token,\n // Please refer to getTokens() for more info regarding `amountBeforeSimulation` calc\n simulationAmount: simulationToken ? simulationToken.amount - token.amount : undefined,\n amountPostSimulation: simulationToken ? simulationToken.amount : token.amount,\n postSimulation: { receiving, sending }\n }\n ]\n }),\n {}\n ]\n}\n\nexport async function getTokens(\n network: Network,\n deployless: Deployless,\n opts: Partial,\n accountAddr: string,\n tokenAddrs: string[]\n): Promise<[[TokenError, TokenResult][], MetaData][]> {\n const mapToken = (token: any, address: string) => {\n return {\n amount: token.amount,\n networkId: network.id,\n decimals: Number(token.decimals),\n symbol:\n address === '0x0000000000000000000000000000000000000000'\n ? network.nativeAssetSymbol\n : overrideSymbol(address, network.id, token.symbol),\n address,\n flags: getFlags({}, network.id, network.id, address)\n } as TokenResult\n }\n const deploylessOpts = getDeploylessOpts(accountAddr, !network.rpcNoStateOverride, opts)\n if (!opts.simulation) {\n const [results, blockNumber] = await deployless.call(\n 'getBalances',\n [accountAddr, tokenAddrs],\n deploylessOpts\n )\n\n return [\n results.map((token: any, i: number) => [token.error, mapToken(token, tokenAddrs[i])]),\n {\n blockNumber\n }\n ]\n }\n const { accountOps, account } = opts.simulation\n const simulationOps = accountOps.map(({ nonce, calls }, idx) => ({\n // EOA starts from a fake, specified nonce\n nonce: isSmartAccount(account) ? nonce : BigInt(EOA_SIMULATION_NONCE) + BigInt(idx),\n calls: calls.map(toSingletonCall).map(callToTuple)\n }))\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const [before, after, simulationErr, , blockNumber, deltaAddressesMapping] =\n await deployless.call(\n 'simulateAndGetBalances',\n [\n accountAddr,\n account.associatedKeys,\n tokenAddrs,\n factory,\n factoryCalldata,\n simulationOps.map((op) => Object.values(op))\n ],\n deploylessOpts\n )\n\n const beforeNonce = before[1]\n const afterNonce = after[1]\n handleSimulationError(simulationErr, beforeNonce, afterNonce, simulationOps)\n\n // simulation was performed if the nonce is changed\n const hasSimulation = afterNonce !== beforeNonce\n\n const simulationTokens = hasSimulation\n ? after[0].map((simulationToken: any, tokenIndex: number) => ({\n ...simulationToken,\n amount: simulationToken.amount,\n addr: deltaAddressesMapping[tokenIndex]\n }))\n : null\n return [\n before[0].map((token: any, i: number) => {\n const simulation = simulationTokens\n ? simulationTokens.find((simulationToken: any) => simulationToken.addr === tokenAddrs[i])\n : null\n\n // Here's the math before `simulationAmount` and `amountPostSimulation`.\n // AccountA initial balance: 10 USDC.\n // AccountA attempts to transfer 5 USDC (not signed yet).\n // An external entity sends 3 USDC to AccountA on-chain.\n // Deployless simulation contract processing:\n // - Balance before simulation (before[0]): 10 USDC + 3 USDC = 13 USDC.\n // - Balance after simulation (after[0]): 10 USDC - 5 USDC + 3 USDC = 8 USDC.\n // Simulation-only balance displayed on the Sign Screen (we will call it `simulationAmount`):\n // - difference between after simulation and before: 8 USDC - 13 USDC = -5 USDC\n // Final balance displayed on the Dashboard (we will call it `amountPostSimulation`):\n // - after[0], 8 USDC.\n return [\n token.error,\n {\n ...mapToken(token, tokenAddrs[i]),\n simulationAmount: simulation ? simulation.amount - token.amount : undefined,\n amountPostSimulation: simulation ? simulation.amount : token.amount\n }\n ]\n }),\n {\n blockNumber,\n beforeNonce,\n afterNonce\n }\n ]\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.js b/dist/src/libs/portfolio/helpers.js index 61a2cec7d..e87dd3a32 100644 --- a/dist/src/libs/portfolio/helpers.js +++ b/dist/src/libs/portfolio/helpers.js @@ -1,8 +1,12 @@ -import { Contract, formatUnits, ZeroAddress } from 'ethers'; -import IERC20 from '../../../contracts/compiled/IERC20.json'; -import gasTankFeeTokens from '../../consts/gasTankFeeTokens'; -import { PINNED_TOKENS } from '../../consts/pinnedTokens'; -import { isSmartAccount } from '../account/account'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processTokens = exports.tokenFilter = exports.getTokensReadyToLearn = exports.getUpdatedHints = exports.stripExternalHintsAPIResponse = exports.getPinnedGasTankTokens = exports.getAccountPortfolioTotal = exports.addHiddenTokenValueToTotal = exports.getTotal = exports.getTokenBalanceInUSD = exports.getTokenAmount = exports.shouldGetAdditionalPortfolio = exports.validateERC20Token = exports.getFlags = exports.overrideSymbol = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const IERC20_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/IERC20.json")); +const gasTankFeeTokens_1 = tslib_1.__importDefault(require("../../consts/gasTankFeeTokens")); +const pinnedTokens_1 = require("../../consts/pinnedTokens"); +const account_1 = require("../account/account"); const usdcEMapping = { avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664', moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3', @@ -10,14 +14,15 @@ const usdcEMapping = { polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607' }; -export function overrideSymbol(address, networkId, symbol) { +function overrideSymbol(address, networkId, symbol) { // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) { return 'USDC.E'; } return symbol; } -export function getFlags(networkData, networkId, tokenNetwork, address) { +exports.overrideSymbol = overrideSymbol; +function getFlags(networkData, networkId, tokenNetwork, address) { const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId); const onGasTank = networkId === 'gasTank'; let rewardsType = null; @@ -25,10 +30,10 @@ export function getFlags(networkData, networkId, tokenNetwork, address) { rewardsType = 'wallet-rewards'; if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase()) rewardsType = 'wallet-vesting'; - const foundFeeToken = gasTankFeeTokens.find((t) => t.address.toLowerCase() === address.toLowerCase() && + const foundFeeToken = gasTankFeeTokens_1.default.find((t) => t.address.toLowerCase() === address.toLowerCase() && (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)); const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType; - const isFeeToken = address === ZeroAddress || + const isFeeToken = address === ethers_1.ZeroAddress || // disable if not in gas tank (foundFeeToken && !foundFeeToken.disableAsFeeToken) || networkId === 'gasTank'; @@ -39,8 +44,9 @@ export function getFlags(networkData, networkId, tokenNetwork, address) { isFeeToken }; } -export const validateERC20Token = async (token, accountId, provider) => { - const erc20 = new Contract(token?.address, IERC20.abi, provider); +exports.getFlags = getFlags; +const validateERC20Token = async (token, accountId, provider) => { + const erc20 = new ethers_1.Contract(token?.address, IERC20_json_1.default.abi, provider); const type = 'erc20'; let isValid = true; let hasError = false; @@ -66,41 +72,47 @@ export const validateERC20Token = async (token, accountId, provider) => { isValid = isValid && !hasError; return [isValid, type]; }; -export const shouldGetAdditionalPortfolio = (account) => { - return isSmartAccount(account); +exports.validateERC20Token = validateERC20Token; +const shouldGetAdditionalPortfolio = (account) => { + return (0, account_1.isSmartAccount)(account); }; +exports.shouldGetAdditionalPortfolio = shouldGetAdditionalPortfolio; // fetch the amountPostSimulation for the token if set // otherwise, the token.amount -export const getTokenAmount = (token) => { +const getTokenAmount = (token) => { return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount; }; -export const getTokenBalanceInUSD = (token) => { - const amount = getTokenAmount(token); +exports.getTokenAmount = getTokenAmount; +const getTokenBalanceInUSD = (token) => { + const amount = (0, exports.getTokenAmount)(token); const { decimals, priceIn } = token; - const balance = parseFloat(formatUnits(amount, decimals)); + const balance = parseFloat((0, ethers_1.formatUnits)(amount, decimals)); const price = priceIn.find(({ baseCurrency }) => baseCurrency === 'usd')?.price || 0; return balance * price; }; -export const getTotal = (t, excludeHiddenTokens = true) => t.reduce((cur, token) => { +exports.getTokenBalanceInUSD = getTokenBalanceInUSD; +const getTotal = (t, excludeHiddenTokens = true) => t.reduce((cur, token) => { const localCur = cur; // Add index signature to the type of localCur if (token.flags.isHidden && excludeHiddenTokens) return localCur; // eslint-disable-next-line no-restricted-syntax for (const x of token.priceIn) { const currentAmount = localCur[x.baseCurrency] || 0; - const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals; + const tokenAmount = Number((0, exports.getTokenAmount)(token)) / 10 ** token.decimals; localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price; } return localCur; }, {}); -export const addHiddenTokenValueToTotal = (totalWithoutHiddenTokens, tokens) => { +exports.getTotal = getTotal; +const addHiddenTokenValueToTotal = (totalWithoutHiddenTokens, tokens) => { return tokens.reduce((cur, token) => { if (!token.flags.isHidden) return cur; - return cur + getTokenBalanceInUSD(token); + return cur + (0, exports.getTokenBalanceInUSD)(token); }, totalWithoutHiddenTokens); }; -export const getAccountPortfolioTotal = (accountPortfolio, excludeNetworks = [], excludeHiddenTokens = true) => { +exports.addHiddenTokenValueToTotal = addHiddenTokenValueToTotal; +const getAccountPortfolioTotal = (accountPortfolio, excludeNetworks = [], excludeHiddenTokens = true) => { if (!accountPortfolio) return 0; return Object.keys(accountPortfolio).reduce((acc, key) => { @@ -110,12 +122,13 @@ export const getAccountPortfolioTotal = (accountPortfolio, excludeNetworks = [], const tokenList = networkData?.result?.tokens || []; let networkTotalAmountUSD = networkData?.result?.total.usd || 0; if (!excludeHiddenTokens) { - networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList); + networkTotalAmountUSD = (0, exports.addHiddenTokenValueToTotal)(networkTotalAmountUSD, tokenList); } return acc + networkTotalAmountUSD; }, 0); }; -export const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) => { +exports.getAccountPortfolioTotal = getAccountPortfolioTotal; +const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, accountId, gasTankTokens) => { if (!availableGasTankAssets) return []; // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens @@ -126,7 +139,7 @@ export const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, const isAlreadyPinned = !!acc.find((accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()); if (isGasTankToken || isAlreadyPinned) return acc; - const correspondingPinnedToken = PINNED_TOKENS.find((pinnedToken) => (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) && + const correspondingPinnedToken = pinnedTokens_1.PINNED_TOKENS.find((pinnedToken) => (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) && pinnedToken.address === token.address && pinnedToken.networkId === token.network); if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) { @@ -153,7 +166,8 @@ export const getPinnedGasTankTokens = (availableGasTankAssets, hasNonZeroTokens, return acc; }, []); }; -export const stripExternalHintsAPIResponse = (response) => { +exports.getPinnedGasTankTokens = getPinnedGasTankTokens; +const stripExternalHintsAPIResponse = (response) => { if (!response) return null; const { erc20s, erc721s, lastUpdate } = response; @@ -163,6 +177,7 @@ export const stripExternalHintsAPIResponse = (response) => { lastUpdate }; }; +exports.stripExternalHintsAPIResponse = stripExternalHintsAPIResponse; const getLowercaseAddressArrayForNetwork = (array, networkId) => array .filter((item) => !networkId || item.networkId === networkId) .map((item) => item.address.toLowerCase()); @@ -173,7 +188,7 @@ const getLowercaseAddressArrayForNetwork = (array, networkId) => array * - updates the timestamp of learned tokens * - returns the updated hints */ -export function getUpdatedHints( +function getUpdatedHints( // Can only be null in case of no external api hints latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints, key, customTokens) { const previousHints = { ...storagePreviousHints }; @@ -204,7 +219,7 @@ latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints }); if (networkLearnedTokenAddresses.length) { // Lowercase all addresses outside of the loop for better performance - const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(PINNED_TOKENS, networkId); + const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(pinnedTokens_1.PINNED_TOKENS, networkId); const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId); const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n); const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(networkTokensWithBalance, networkId); @@ -240,12 +255,14 @@ latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints learnedNfts }; } -export const getTokensReadyToLearn = (toBeLearnedTokens, resultTokens) => { +exports.getUpdatedHints = getUpdatedHints; +const getTokensReadyToLearn = (toBeLearnedTokens, resultTokens) => { if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length) return []; return toBeLearnedTokens.filter((address) => resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)); }; -export const tokenFilter = (token, nativeToken, network, hasNonZeroTokens, additionalHints, isTokenPreference) => { +exports.getTokensReadyToLearn = getTokensReadyToLearn; +const tokenFilter = (token, nativeToken, network, hasNonZeroTokens, additionalHints, isTokenPreference) => { // Never add ERC20 tokens that represent the network's native token. // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`. // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard. @@ -253,16 +270,16 @@ export const tokenFilter = (token, nativeToken, network, hasNonZeroTokens, addit const isERC20NativeRepresentation = (token.symbol === nativeToken?.symbol || network.oldNativeAssetSymbols?.includes(token.symbol)) && token.amount === nativeToken.amount && - token.address !== ZeroAddress; + token.address !== ethers_1.ZeroAddress; if (isERC20NativeRepresentation) return false; // always include tokens added as a preference if (isTokenPreference) return true; // always include > 0 amount and native token - if (token.amount > 0 || token.address === ZeroAddress) + if (token.amount > 0 || token.address === ethers_1.ZeroAddress) return true; - const isPinned = !!PINNED_TOKENS.find((pinnedToken) => { + const isPinned = !!pinnedTokens_1.PINNED_TOKENS.find((pinnedToken) => { return pinnedToken.networkId === network.id && pinnedToken.address === token.address; }); // make the comparison to lowercase as otherwise, it doesn't work @@ -275,14 +292,15 @@ export const tokenFilter = (token, nativeToken, network, hasNonZeroTokens, addit const pinnedRequested = isPinned && !hasNonZeroTokens; return isInAdditionalHints || pinnedRequested; }; +exports.tokenFilter = tokenFilter; /** * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details) * and set the token.flags.isHidden flag. */ -export const processTokens = (tokenResults, network, hasNonZeroTokens, additionalHints, tokenPreferences) => { +const processTokens = (tokenResults, network, hasNonZeroTokens, additionalHints, tokenPreferences) => { // We need to know the native token in order to execute our filtration logic in tokenFilter. // For performance reasons, we define it here once, instead of during every single iteration in the reduce method. - const nativeToken = tokenResults.find((token) => token.address === ZeroAddress); + const nativeToken = tokenResults.find((token) => token.address === ethers_1.ZeroAddress); return tokenResults.reduce((tokens, tokenResult) => { const token = { ...tokenResult }; const preference = tokenPreferences?.find((tokenPreference) => { @@ -291,9 +309,10 @@ export const processTokens = (tokenResults, network, hasNonZeroTokens, additiona if (preference) { token.flags.isHidden = preference.isHidden; } - if (tokenFilter(token, nativeToken, network, hasNonZeroTokens, additionalHints, !!preference)) + if ((0, exports.tokenFilter)(token, nativeToken, network, hasNonZeroTokens, additionalHints, !!preference)) tokens.push(token); return tokens; }, []); }; +exports.processTokens = processTokens; //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.js.map b/dist/src/libs/portfolio/helpers.js.map index 4841f7d74..717a6aedd 100644 --- a/dist/src/libs/portfolio/helpers.js.map +++ b/dist/src/libs/portfolio/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, formatUnits, ZeroAddress } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { isSmartAccount } from '../account/account'\nimport { CustomToken, TokenPreference } from './customToken'\nimport {\n AccountState,\n AdditionalPortfolioNetworkResult,\n PreviousHintsStorage,\n StrippedExternalHintsAPIResponse,\n TokenResult\n} from './interfaces'\n\nconst usdcEMapping: { [key: string]: string } = {\n avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',\n moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3',\n arbitrum: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607'\n}\n\nexport function overrideSymbol(address: string, networkId: string, symbol: string) {\n // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol\n if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) {\n return 'USDC.E'\n }\n\n return symbol\n}\n\nexport function getFlags(\n networkData: any,\n networkId: NetworkId,\n tokenNetwork: NetworkId,\n address: string\n) {\n const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId)\n const onGasTank = networkId === 'gasTank'\n\n let rewardsType = null\n if (networkData?.xWalletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-rewards'\n if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-vesting'\n\n const foundFeeToken = gasTankFeeTokens.find(\n (t) =>\n t.address.toLowerCase() === address.toLowerCase() &&\n (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)\n )\n\n const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType\n const isFeeToken =\n address === ZeroAddress ||\n // disable if not in gas tank\n (foundFeeToken && !foundFeeToken.disableAsFeeToken) ||\n networkId === 'gasTank'\n\n return {\n onGasTank,\n rewardsType,\n canTopUpGasTank,\n isFeeToken\n }\n}\n\nexport const validateERC20Token = async (\n token: { address: string; networkId: NetworkId },\n accountId: string,\n provider: RPCProvider\n) => {\n const erc20 = new Contract(token?.address, IERC20.abi, provider)\n\n const type = 'erc20'\n let isValid = true\n let hasError = false\n\n const [balance, symbol, decimals] = (await Promise.all([\n erc20.balanceOf(accountId).catch(() => {\n hasError = true\n }),\n erc20.symbol().catch(() => {\n hasError = true\n }),\n erc20.decimals().catch(() => {\n hasError = true\n })\n ]).catch(() => {\n hasError = true\n isValid = false\n })) || [undefined, undefined, undefined]\n\n if (\n typeof balance === 'undefined' ||\n typeof symbol === 'undefined' ||\n typeof decimals === 'undefined'\n ) {\n isValid = false\n }\n\n isValid = isValid && !hasError\n return [isValid, type]\n}\n\nexport const shouldGetAdditionalPortfolio = (account: Account) => {\n return isSmartAccount(account)\n}\n\n// fetch the amountPostSimulation for the token if set\n// otherwise, the token.amount\nexport const getTokenAmount = (token: TokenResult): bigint => {\n return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount\n}\n\nexport const getTokenBalanceInUSD = (token: TokenResult) => {\n const amount = getTokenAmount(token)\n const { decimals, priceIn } = token\n const balance = parseFloat(formatUnits(amount, decimals))\n const price =\n priceIn.find(({ baseCurrency }: { baseCurrency: string }) => baseCurrency === 'usd')?.price || 0\n\n return balance * price\n}\n\nexport const getTotal = (t: TokenResult[], excludeHiddenTokens: boolean = true) =>\n t.reduce((cur: { [key: string]: number }, token: TokenResult) => {\n const localCur = cur // Add index signature to the type of localCur\n if (token.flags.isHidden && excludeHiddenTokens) return localCur\n // eslint-disable-next-line no-restricted-syntax\n for (const x of token.priceIn) {\n const currentAmount = localCur[x.baseCurrency] || 0\n\n const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals\n localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price\n }\n\n return localCur\n }, {})\n\nexport const addHiddenTokenValueToTotal = (\n totalWithoutHiddenTokens: number,\n tokens: TokenResult[]\n) => {\n return tokens.reduce((cur: number, token: TokenResult) => {\n if (!token.flags.isHidden) return cur\n\n return cur + getTokenBalanceInUSD(token)\n }, totalWithoutHiddenTokens)\n}\n\nexport const getAccountPortfolioTotal = (\n accountPortfolio: AccountState,\n excludeNetworks: Network['id'][] = [],\n excludeHiddenTokens = true\n) => {\n if (!accountPortfolio) return 0\n\n return Object.keys(accountPortfolio).reduce((acc, key) => {\n if (excludeNetworks.includes(key)) return acc\n\n const networkData = accountPortfolio[key]\n const tokenList = networkData?.result?.tokens || []\n let networkTotalAmountUSD = networkData?.result?.total.usd || 0\n\n if (!excludeHiddenTokens) {\n networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList)\n }\n\n return acc + networkTotalAmountUSD\n }, 0)\n}\n\nexport const getPinnedGasTankTokens = (\n availableGasTankAssets: TokenResult[],\n hasNonZeroTokens: boolean,\n accountId: AccountId,\n gasTankTokens: TokenResult[]\n) => {\n if (!availableGasTankAssets) return []\n // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens\n if (hasNonZeroTokens) return []\n\n return availableGasTankAssets.reduce((acc: TokenResult[], token: any) => {\n const isGasTankToken = !!gasTankTokens.find(\n (gasTankToken: TokenResult) =>\n gasTankToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n const isAlreadyPinned = !!acc.find(\n (accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n\n if (isGasTankToken || isAlreadyPinned) return acc\n\n const correspondingPinnedToken = PINNED_TOKENS.find(\n (pinnedToken) =>\n (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) &&\n pinnedToken.address === token.address &&\n pinnedToken.networkId === token.network\n )\n\n if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) {\n acc.push({\n address: token.address,\n symbol: token.symbol.toUpperCase(),\n amount: 0n,\n networkId: correspondingPinnedToken.networkId,\n decimals: token.decimals,\n priceIn: [\n {\n baseCurrency: 'usd',\n price: token.price\n }\n ],\n flags: {\n rewardsType: null,\n canTopUpGasTank: true,\n isFeeToken: true,\n onGasTank: true\n }\n })\n }\n return acc\n }, [])\n}\n\nexport const stripExternalHintsAPIResponse = (\n response: StrippedExternalHintsAPIResponse | null\n): StrippedExternalHintsAPIResponse | null => {\n if (!response) return null\n\n const { erc20s, erc721s, lastUpdate } = response\n\n return {\n erc20s,\n erc721s,\n lastUpdate\n }\n}\n\nconst getLowercaseAddressArrayForNetwork = (\n array: { address: string; networkId?: NetworkId }[],\n networkId: NetworkId\n) =>\n array\n .filter((item) => !networkId || item.networkId === networkId)\n .map((item) => item.address.toLowerCase())\n\n/**\n * Tasks:\n * - updates the external hints for [network:account] with the latest from the external API\n * - cleans the learned tokens by removing non-ERC20 items\n * - updates the timestamp of learned tokens\n * - returns the updated hints\n */\nexport function getUpdatedHints(\n // Can only be null in case of no external api hints\n latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null,\n tokens: TokenResult[],\n tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'],\n networkId: NetworkId,\n storagePreviousHints: PreviousHintsStorage,\n key: string,\n customTokens: CustomToken[]\n): PreviousHintsStorage {\n const previousHints = { ...storagePreviousHints }\n\n if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}\n if (!previousHints.learnedTokens) previousHints.learnedTokens = {}\n\n const { learnedTokens, learnedNfts } = previousHints\n const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []\n const networkLearnedTokens = learnedTokens[networkId] || {}\n\n // The keys in learnedTokens are addresses of tokens\n const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens)\n\n // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens.\n // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens.\n // For instance, a SmartContract address can be passed as a learned token.\n // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio.\n // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance,\n // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`.\n // Note:\n // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter).\n // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen,\n // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway.\n const unknownBalanceError = '0x756e6b6e'\n const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter(\n (tokenAddress) => {\n const hasError = !!tokenErrors?.find(\n (errorToken) =>\n errorToken.address.toLowerCase() === tokenAddress.toLowerCase() &&\n errorToken.error === unknownBalanceError\n )\n\n return hasError\n }\n )\n\n if (networkLearnedTokenAddresses.length) {\n // Lowercase all addresses outside of the loop for better performance\n const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(\n PINNED_TOKENS,\n networkId\n )\n const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId)\n const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n)\n const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(\n networkTokensWithBalance,\n networkId\n )\n const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) =>\n hint.toLowerCase()\n )\n\n // Update the timestamp of learned tokens\n // and self-clean non-ERC20 items.\n // eslint-disable-next-line no-restricted-syntax\n for (const address of networkLearnedTokenAddresses) {\n const lowercaseAddress = address.toLowerCase()\n\n // Delete non-ERC20 items from the learned tokens\n if (\n networkLearnedTokenAddressesHavingError.find(\n (errorToken) => errorToken.toLowerCase() === lowercaseAddress\n )\n ) {\n delete learnedTokens[networkId][lowercaseAddress]\n // eslint-disable-next-line no-continue\n continue\n }\n\n const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress)\n const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress)\n const isTokenInExternalAPIHints =\n lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress)\n const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress)\n\n if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) {\n // Don't set the timestamp back to null if the account doesn't have balance for the token\n // as learnedTokens aren't account specific and one account can have balance for the token\n // while other don't\n learnedTokens[networkId][address] = Date.now().toString()\n }\n }\n }\n // Update the external hints for [network:account] with the latest from the external API\n previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI\n\n return {\n fromExternalAPI: previousHints.fromExternalAPI,\n learnedTokens,\n learnedNfts\n }\n}\n\nexport const getTokensReadyToLearn = (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => {\n if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length)\n return []\n\n return toBeLearnedTokens.filter((address) =>\n resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)\n )\n}\n\nexport const tokenFilter = (\n token: TokenResult,\n nativeToken: TokenResult,\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n isTokenPreference: boolean\n): boolean => {\n // Never add ERC20 tokens that represent the network's native token.\n // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`.\n // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard.\n // From a user's perspective, the token is duplicated and counted twice in the balance.\n const isERC20NativeRepresentation =\n (token.symbol === nativeToken?.symbol ||\n network.oldNativeAssetSymbols?.includes(token.symbol)) &&\n token.amount === nativeToken.amount &&\n token.address !== ZeroAddress\n\n if (isERC20NativeRepresentation) return false\n\n // always include tokens added as a preference\n if (isTokenPreference) return true\n\n // always include > 0 amount and native token\n if (token.amount > 0 || token.address === ZeroAddress) return true\n\n const isPinned = !!PINNED_TOKENS.find((pinnedToken) => {\n return pinnedToken.networkId === network.id && pinnedToken.address === token.address\n })\n\n // make the comparison to lowercase as otherwise, it doesn't work\n const hintsLowerCase = additionalHints\n ? additionalHints.map((hint) => hint.toLowerCase())\n : undefined\n const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase())\n\n // if the amount is 0\n // return the token if it's pinned and requested\n const pinnedRequested = isPinned && !hasNonZeroTokens\n\n return isInAdditionalHints || pinnedRequested\n}\n\n/**\n * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details)\n * and set the token.flags.isHidden flag.\n */\nexport const processTokens = (\n tokenResults: TokenResult[],\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n tokenPreferences: TokenPreference[]\n): TokenResult[] => {\n // We need to know the native token in order to execute our filtration logic in tokenFilter.\n // For performance reasons, we define it here once, instead of during every single iteration in the reduce method.\n const nativeToken = tokenResults.find((token) => token.address === ZeroAddress)\n\n return tokenResults.reduce((tokens, tokenResult) => {\n const token = { ...tokenResult }\n\n const preference = tokenPreferences?.find((tokenPreference) => {\n return tokenPreference.address === token.address && tokenPreference.networkId === network.id\n })\n\n if (preference) {\n token.flags.isHidden = preference.isHidden\n }\n\n if (tokenFilter(token, nativeToken!, network, hasNonZeroTokens, additionalHints, !!preference))\n tokens.push(token)\n\n return tokens\n }, [] as TokenResult[])\n}\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, formatUnits, ZeroAddress } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { isSmartAccount } from '../account/account'\nimport { CustomToken, TokenPreference } from './customToken'\nimport {\n AccountState,\n AdditionalPortfolioNetworkResult,\n PreviousHintsStorage,\n StrippedExternalHintsAPIResponse,\n TokenResult\n} from './interfaces'\n\nconst usdcEMapping: { [key: string]: string } = {\n avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',\n moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3',\n arbitrum: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607'\n}\n\nexport function overrideSymbol(address: string, networkId: string, symbol: string) {\n // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol\n if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) {\n return 'USDC.E'\n }\n\n return symbol\n}\n\nexport function getFlags(\n networkData: any,\n networkId: NetworkId,\n tokenNetwork: NetworkId,\n address: string\n) {\n const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId)\n const onGasTank = networkId === 'gasTank'\n\n let rewardsType = null\n if (networkData?.xWalletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-rewards'\n if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-vesting'\n\n const foundFeeToken = gasTankFeeTokens.find(\n (t) =>\n t.address.toLowerCase() === address.toLowerCase() &&\n (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)\n )\n\n const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType\n const isFeeToken =\n address === ZeroAddress ||\n // disable if not in gas tank\n (foundFeeToken && !foundFeeToken.disableAsFeeToken) ||\n networkId === 'gasTank'\n\n return {\n onGasTank,\n rewardsType,\n canTopUpGasTank,\n isFeeToken\n }\n}\n\nexport const validateERC20Token = async (\n token: { address: string; networkId: NetworkId },\n accountId: string,\n provider: RPCProvider\n) => {\n const erc20 = new Contract(token?.address, IERC20.abi, provider)\n\n const type = 'erc20'\n let isValid = true\n let hasError = false\n\n const [balance, symbol, decimals] = (await Promise.all([\n erc20.balanceOf(accountId).catch(() => {\n hasError = true\n }),\n erc20.symbol().catch(() => {\n hasError = true\n }),\n erc20.decimals().catch(() => {\n hasError = true\n })\n ]).catch(() => {\n hasError = true\n isValid = false\n })) || [undefined, undefined, undefined]\n\n if (\n typeof balance === 'undefined' ||\n typeof symbol === 'undefined' ||\n typeof decimals === 'undefined'\n ) {\n isValid = false\n }\n\n isValid = isValid && !hasError\n return [isValid, type]\n}\n\nexport const shouldGetAdditionalPortfolio = (account: Account) => {\n return isSmartAccount(account)\n}\n\n// fetch the amountPostSimulation for the token if set\n// otherwise, the token.amount\nexport const getTokenAmount = (token: TokenResult): bigint => {\n return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount\n}\n\nexport const getTokenBalanceInUSD = (token: TokenResult) => {\n const amount = getTokenAmount(token)\n const { decimals, priceIn } = token\n const balance = parseFloat(formatUnits(amount, decimals))\n const price =\n priceIn.find(({ baseCurrency }: { baseCurrency: string }) => baseCurrency === 'usd')?.price || 0\n\n return balance * price\n}\n\nexport const getTotal = (t: TokenResult[], excludeHiddenTokens: boolean = true) =>\n t.reduce((cur: { [key: string]: number }, token: TokenResult) => {\n const localCur = cur // Add index signature to the type of localCur\n if (token.flags.isHidden && excludeHiddenTokens) return localCur\n // eslint-disable-next-line no-restricted-syntax\n for (const x of token.priceIn) {\n const currentAmount = localCur[x.baseCurrency] || 0\n\n const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals\n localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price\n }\n\n return localCur\n }, {})\n\nexport const addHiddenTokenValueToTotal = (\n totalWithoutHiddenTokens: number,\n tokens: TokenResult[]\n) => {\n return tokens.reduce((cur: number, token: TokenResult) => {\n if (!token.flags.isHidden) return cur\n\n return cur + getTokenBalanceInUSD(token)\n }, totalWithoutHiddenTokens)\n}\n\nexport const getAccountPortfolioTotal = (\n accountPortfolio: AccountState,\n excludeNetworks: Network['id'][] = [],\n excludeHiddenTokens = true\n) => {\n if (!accountPortfolio) return 0\n\n return Object.keys(accountPortfolio).reduce((acc, key) => {\n if (excludeNetworks.includes(key)) return acc\n\n const networkData = accountPortfolio[key]\n const tokenList = networkData?.result?.tokens || []\n let networkTotalAmountUSD = networkData?.result?.total.usd || 0\n\n if (!excludeHiddenTokens) {\n networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList)\n }\n\n return acc + networkTotalAmountUSD\n }, 0)\n}\n\nexport const getPinnedGasTankTokens = (\n availableGasTankAssets: TokenResult[],\n hasNonZeroTokens: boolean,\n accountId: AccountId,\n gasTankTokens: TokenResult[]\n) => {\n if (!availableGasTankAssets) return []\n // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens\n if (hasNonZeroTokens) return []\n\n return availableGasTankAssets.reduce((acc: TokenResult[], token: any) => {\n const isGasTankToken = !!gasTankTokens.find(\n (gasTankToken: TokenResult) =>\n gasTankToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n const isAlreadyPinned = !!acc.find(\n (accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n\n if (isGasTankToken || isAlreadyPinned) return acc\n\n const correspondingPinnedToken = PINNED_TOKENS.find(\n (pinnedToken) =>\n (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) &&\n pinnedToken.address === token.address &&\n pinnedToken.networkId === token.network\n )\n\n if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) {\n acc.push({\n address: token.address,\n symbol: token.symbol.toUpperCase(),\n amount: 0n,\n networkId: correspondingPinnedToken.networkId,\n decimals: token.decimals,\n priceIn: [\n {\n baseCurrency: 'usd',\n price: token.price\n }\n ],\n flags: {\n rewardsType: null,\n canTopUpGasTank: true,\n isFeeToken: true,\n onGasTank: true\n }\n })\n }\n return acc\n }, [])\n}\n\nexport const stripExternalHintsAPIResponse = (\n response: StrippedExternalHintsAPIResponse | null\n): StrippedExternalHintsAPIResponse | null => {\n if (!response) return null\n\n const { erc20s, erc721s, lastUpdate } = response\n\n return {\n erc20s,\n erc721s,\n lastUpdate\n }\n}\n\nconst getLowercaseAddressArrayForNetwork = (\n array: { address: string; networkId?: NetworkId }[],\n networkId: NetworkId\n) =>\n array\n .filter((item) => !networkId || item.networkId === networkId)\n .map((item) => item.address.toLowerCase())\n\n/**\n * Tasks:\n * - updates the external hints for [network:account] with the latest from the external API\n * - cleans the learned tokens by removing non-ERC20 items\n * - updates the timestamp of learned tokens\n * - returns the updated hints\n */\nexport function getUpdatedHints(\n // Can only be null in case of no external api hints\n latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null,\n tokens: TokenResult[],\n tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'],\n networkId: NetworkId,\n storagePreviousHints: PreviousHintsStorage,\n key: string,\n customTokens: CustomToken[]\n): PreviousHintsStorage {\n const previousHints = { ...storagePreviousHints }\n\n if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}\n if (!previousHints.learnedTokens) previousHints.learnedTokens = {}\n\n const { learnedTokens, learnedNfts } = previousHints\n const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []\n const networkLearnedTokens = learnedTokens[networkId] || {}\n\n // The keys in learnedTokens are addresses of tokens\n const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens)\n\n // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens.\n // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens.\n // For instance, a SmartContract address can be passed as a learned token.\n // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio.\n // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance,\n // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`.\n // Note:\n // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter).\n // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen,\n // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway.\n const unknownBalanceError = '0x756e6b6e'\n const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter(\n (tokenAddress) => {\n const hasError = !!tokenErrors?.find(\n (errorToken) =>\n errorToken.address.toLowerCase() === tokenAddress.toLowerCase() &&\n errorToken.error === unknownBalanceError\n )\n\n return hasError\n }\n )\n\n if (networkLearnedTokenAddresses.length) {\n // Lowercase all addresses outside of the loop for better performance\n const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(\n PINNED_TOKENS,\n networkId\n )\n const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId)\n const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n)\n const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(\n networkTokensWithBalance,\n networkId\n )\n const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) =>\n hint.toLowerCase()\n )\n\n // Update the timestamp of learned tokens\n // and self-clean non-ERC20 items.\n // eslint-disable-next-line no-restricted-syntax\n for (const address of networkLearnedTokenAddresses) {\n const lowercaseAddress = address.toLowerCase()\n\n // Delete non-ERC20 items from the learned tokens\n if (\n networkLearnedTokenAddressesHavingError.find(\n (errorToken) => errorToken.toLowerCase() === lowercaseAddress\n )\n ) {\n delete learnedTokens[networkId][lowercaseAddress]\n // eslint-disable-next-line no-continue\n continue\n }\n\n const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress)\n const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress)\n const isTokenInExternalAPIHints =\n lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress)\n const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress)\n\n if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) {\n // Don't set the timestamp back to null if the account doesn't have balance for the token\n // as learnedTokens aren't account specific and one account can have balance for the token\n // while other don't\n learnedTokens[networkId][address] = Date.now().toString()\n }\n }\n }\n // Update the external hints for [network:account] with the latest from the external API\n previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI\n\n return {\n fromExternalAPI: previousHints.fromExternalAPI,\n learnedTokens,\n learnedNfts\n }\n}\n\nexport const getTokensReadyToLearn = (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => {\n if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length)\n return []\n\n return toBeLearnedTokens.filter((address) =>\n resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)\n )\n}\n\nexport const tokenFilter = (\n token: TokenResult,\n nativeToken: TokenResult,\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n isTokenPreference: boolean\n): boolean => {\n // Never add ERC20 tokens that represent the network's native token.\n // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`.\n // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard.\n // From a user's perspective, the token is duplicated and counted twice in the balance.\n const isERC20NativeRepresentation =\n (token.symbol === nativeToken?.symbol ||\n network.oldNativeAssetSymbols?.includes(token.symbol)) &&\n token.amount === nativeToken.amount &&\n token.address !== ZeroAddress\n\n if (isERC20NativeRepresentation) return false\n\n // always include tokens added as a preference\n if (isTokenPreference) return true\n\n // always include > 0 amount and native token\n if (token.amount > 0 || token.address === ZeroAddress) return true\n\n const isPinned = !!PINNED_TOKENS.find((pinnedToken) => {\n return pinnedToken.networkId === network.id && pinnedToken.address === token.address\n })\n\n // make the comparison to lowercase as otherwise, it doesn't work\n const hintsLowerCase = additionalHints\n ? additionalHints.map((hint) => hint.toLowerCase())\n : undefined\n const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase())\n\n // if the amount is 0\n // return the token if it's pinned and requested\n const pinnedRequested = isPinned && !hasNonZeroTokens\n\n return isInAdditionalHints || pinnedRequested\n}\n\n/**\n * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details)\n * and set the token.flags.isHidden flag.\n */\nexport const processTokens = (\n tokenResults: TokenResult[],\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n tokenPreferences: TokenPreference[]\n): TokenResult[] => {\n // We need to know the native token in order to execute our filtration logic in tokenFilter.\n // For performance reasons, we define it here once, instead of during every single iteration in the reduce method.\n const nativeToken = tokenResults.find((token) => token.address === ZeroAddress)\n\n return tokenResults.reduce((tokens, tokenResult) => {\n const token = { ...tokenResult }\n\n const preference = tokenPreferences?.find((tokenPreference) => {\n return tokenPreference.address === token.address && tokenPreference.networkId === network.id\n })\n\n if (preference) {\n token.flags.isHidden = preference.isHidden\n }\n\n if (tokenFilter(token, nativeToken!, network, hasNonZeroTokens, additionalHints, !!preference))\n tokens.push(token)\n\n return tokens\n }, [] as TokenResult[])\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.js b/dist/src/libs/portfolio/icons.js index bb659c089..771d1bece 100644 --- a/dist/src/libs/portfolio/icons.js +++ b/dist/src/libs/portfolio/icons.js @@ -1,4 +1,7 @@ +"use strict"; /* eslint-disable import/no-extraneous-dependencies */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getZapperIcon = exports.getHardcodedIcon = exports.getIconId = void 0; const customIcons = { '0xb468a1e5596cfbcdf561f21a10490d99b4bb7b68': 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg/220px-Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg', '0x88800092ff476844f74dc2fc427974bbee2794ae': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/ambire_logo_white_bg_250x250.png', @@ -10,13 +13,16 @@ const customIcons = { '0xade00c28244d5ce17d72e40330b1c318cd12b7c3': 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/official-logos/Ambire-AdEx/Ambire_AdEx_Symbol_color_white_bg.png' // ADX-TOKEN }; const zapperStorageTokenIcons = 'https://storage.googleapis.com/zapper-fi-assets/tokens'; -export function getIconId(networkId, address) { +function getIconId(networkId, address) { return `${networkId.toLowerCase()}:${address.toLowerCase()}`; } -export function getHardcodedIcon(address) { +exports.getIconId = getIconId; +function getHardcodedIcon(address) { return customIcons[address.toLowerCase()] || null; } -export function getZapperIcon(networkId, address) { +exports.getHardcodedIcon = getHardcodedIcon; +function getZapperIcon(networkId, address) { return `${zapperStorageTokenIcons}/${networkId.toLowerCase()}/${address.toLowerCase()}.png`; } +exports.getZapperIcon = getZapperIcon; //# sourceMappingURL=icons.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/icons.js.map b/dist/src/libs/portfolio/icons.js.map index af5db31f6..ba37d261b 100644 --- a/dist/src/libs/portfolio/icons.js.map +++ b/dist/src/libs/portfolio/icons.js.map @@ -1 +1 @@ -{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/icons.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,MAAM,WAAW,GAAQ;IACvB,4CAA4C,EAC1C,2KAA2K;IAC7K,4CAA4C,EAC1C,uGAAuG;IACzG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,2FAA2F;IAC7F,4CAA4C,EAC1C,gGAAgG;IAClG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,8FAA8F;IAChG,4CAA4C,EAC1C,iIAAiI,CAAC,YAAY;CACjJ,CAAA;AAED,MAAM,uBAAuB,GAAG,wDAAwD,CAAA;AAExF,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,OAAe;IAC1D,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,OAAe;IAC9D,OAAO,GAAG,uBAAuB,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM,CAAA;AAC7F,CAAC","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nconst customIcons: any = {\n '0xb468a1e5596cfbcdf561f21a10490d99b4bb7b68':\n 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg/220px-Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg', // TEST Polygon ELMO token,\n '0x88800092ff476844f74dc2fc427974bbee2794ae':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/ambire_logo_white_bg_250x250.png', // Ambire Wallet Token\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // xWallet\n '0xb6456b57f03352be48bf101b46c1752a0813491a':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/vaporwave-adex-2.png', // ADX-STAKING\n '0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/ADX-loyalty%40256x256.png', // ADX-LOYALTY\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // Polygons test xWallet\n '0xe9415e904143e42007865e6864f7f632bd054a08':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png', // Polygons test Wallet\n '0xade00c28244d5ce17d72e40330b1c318cd12b7c3':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/official-logos/Ambire-AdEx/Ambire_AdEx_Symbol_color_white_bg.png' // ADX-TOKEN\n}\n\nconst zapperStorageTokenIcons = 'https://storage.googleapis.com/zapper-fi-assets/tokens'\n\nexport function getIconId(networkId: string, address: string): string {\n return `${networkId.toLowerCase()}:${address.toLowerCase()}`\n}\n\nexport function getHardcodedIcon(address: string): string | null {\n return customIcons[address.toLowerCase()] || null\n}\n\nexport function getZapperIcon(networkId: string, address: string) {\n return `${zapperStorageTokenIcons}/${networkId.toLowerCase()}/${address.toLowerCase()}.png`\n}\n"]} \ No newline at end of file +{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/icons.ts"],"names":[],"mappings":";AAAA,sDAAsD;;;AAEtD,MAAM,WAAW,GAAQ;IACvB,4CAA4C,EAC1C,2KAA2K;IAC7K,4CAA4C,EAC1C,uGAAuG;IACzG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,2FAA2F;IAC7F,4CAA4C,EAC1C,gGAAgG;IAClG,4CAA4C,EAC1C,0FAA0F;IAC5F,4CAA4C,EAC1C,8FAA8F;IAChG,4CAA4C,EAC1C,iIAAiI,CAAC,YAAY;CACjJ,CAAA;AAED,MAAM,uBAAuB,GAAG,wDAAwD,CAAA;AAExF,SAAgB,SAAS,CAAC,SAAiB,EAAE,OAAe;IAC1D,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAA;AAC9D,CAAC;AAFD,8BAEC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,OAAO,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAA;AACnD,CAAC;AAFD,4CAEC;AAED,SAAgB,aAAa,CAAC,SAAiB,EAAE,OAAe;IAC9D,OAAO,GAAG,uBAAuB,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM,CAAA;AAC7F,CAAC;AAFD,sCAEC","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\n\nconst customIcons: any = {\n '0xb468a1e5596cfbcdf561f21a10490d99b4bb7b68':\n 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg/220px-Jeff_Sessions_with_Elmo_and_Rosita_%28cropped%29.jpg', // TEST Polygon ELMO token,\n '0x88800092ff476844f74dc2fc427974bbee2794ae':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/ambire_logo_white_bg_250x250.png', // Ambire Wallet Token\n '0x47cd7e91c3cbaaf266369fe8518345fc4fc12935':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // xWallet\n '0xb6456b57f03352be48bf101b46c1752a0813491a':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/vaporwave-adex-2.png', // ADX-STAKING\n '0xd9a4cb9dc9296e111c66dfacab8be034ee2e1c2c':\n 'https://raw.githubusercontent.com/AmbireTech/adex-brand/master/logos/ADX-loyalty%40256x256.png', // ADX-LOYALTY\n '0xec3b10ce9cabab5dbf49f946a623e294963fbb4e':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/xwallet_250x250.png', // Polygons test xWallet\n '0xe9415e904143e42007865e6864f7f632bd054a08':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/logos/Ambire_logo_250x250.png', // Polygons test Wallet\n '0xade00c28244d5ce17d72e40330b1c318cd12b7c3':\n 'https://raw.githubusercontent.com/AmbireTech/ambire-brand/main/official-logos/Ambire-AdEx/Ambire_AdEx_Symbol_color_white_bg.png' // ADX-TOKEN\n}\n\nconst zapperStorageTokenIcons = 'https://storage.googleapis.com/zapper-fi-assets/tokens'\n\nexport function getIconId(networkId: string, address: string): string {\n return `${networkId.toLowerCase()}:${address.toLowerCase()}`\n}\n\nexport function getHardcodedIcon(address: string): string | null {\n return customIcons[address.toLowerCase()] || null\n}\n\nexport function getZapperIcon(networkId: string, address: string) {\n return `${zapperStorageTokenIcons}/${networkId.toLowerCase()}/${address.toLowerCase()}.png`\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.js b/dist/src/libs/portfolio/index.js index 849b5b12a..b350542ba 100644 --- a/dist/src/libs/portfolio/index.js +++ b/dist/src/libs/portfolio/index.js @@ -1,3 +1,6 @@ -import { Portfolio } from './portfolio'; -export { Portfolio }; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Portfolio = void 0; +const portfolio_1 = require("./portfolio"); +Object.defineProperty(exports, "Portfolio", { enumerable: true, get: function () { return portfolio_1.Portfolio; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/index.js.map b/dist/src/libs/portfolio/index.js.map index d16031619..7aff9e383 100644 --- a/dist/src/libs/portfolio/index.js.map +++ b/dist/src/libs/portfolio/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,CAAA","sourcesContent":["import {\n AddrVestingData,\n ClaimableRewardsData,\n CollectionResult,\n GetOptions,\n Price,\n TokenResult\n} from './interfaces'\nimport { Portfolio } from './portfolio'\n\nexport { Portfolio }\n\nexport type {\n Price,\n TokenResult,\n ClaimableRewardsData,\n AddrVestingData,\n CollectionResult,\n GetOptions\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/index.ts"],"names":[],"mappings":";;;AAQA,2CAAuC;AAE9B,0FAFA,qBAAS,OAEA","sourcesContent":["import {\n AddrVestingData,\n ClaimableRewardsData,\n CollectionResult,\n GetOptions,\n Price,\n TokenResult\n} from './interfaces'\nimport { Portfolio } from './portfolio'\n\nexport { Portfolio }\n\nexport type {\n Price,\n TokenResult,\n ClaimableRewardsData,\n AddrVestingData,\n CollectionResult,\n GetOptions\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.js b/dist/src/libs/portfolio/interfaces.js index c30bb68c1..db9191150 100644 --- a/dist/src/libs/portfolio/interfaces.js +++ b/dist/src/libs/portfolio/interfaces.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.js b/dist/src/libs/portfolio/migrations/tokenPreferences.js index e4a6c0412..3f16a03e1 100644 --- a/dist/src/libs/portfolio/migrations/tokenPreferences.js +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.migrateTokenPreferences = void 0; const inferStorageVersion = (tokenPreferences) => { if (tokenPreferences.some(({ symbol, decimals }) => !!symbol || !!decimals)) { return 1; @@ -42,5 +45,5 @@ const migrateTokenPreferences = (tokenPreferences, customTokens) => { shouldUpdateStorage: false }; }; -export { migrateTokenPreferences }; +exports.migrateTokenPreferences = migrateTokenPreferences; //# sourceMappingURL=tokenPreferences.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/migrations/tokenPreferences.js.map b/dist/src/libs/portfolio/migrations/tokenPreferences.js.map index ea85e99f4..f58924882 100644 --- a/dist/src/libs/portfolio/migrations/tokenPreferences.js.map +++ b/dist/src/libs/portfolio/migrations/tokenPreferences.js.map @@ -1 +1 @@ -{"version":3,"file":"tokenPreferences.js","sourceRoot":"","sources":["../../../../../src/libs/portfolio/migrations/tokenPreferences.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC3E,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,SAAS;QACT,QAAQ;KACT,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACpC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,QAAQ;QACR,SAAS;KACV,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,uBAAuB,GAAG,CAC9B,gBAAyC,EACzC,YAA4B,EAC5B,EAAE;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAE5D,UAAU;IACV,IAAI,cAAc,KAAK,CAAC,EAAE;QACxB,OAAO;YACL,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACvD,YAAY,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACnD,mBAAmB,EAAE,IAAI;SAC1B,CAAA;KACF;IAED,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE,YAAY,IAAI,EAAE;QAChC,mBAAmB,EAAE,KAAK;KAC3B,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAA","sourcesContent":["import { CustomToken, LegacyTokenPreference } from '../customToken'\n\nconst inferStorageVersion = (tokenPreferences: LegacyTokenPreference[]) => {\n if (tokenPreferences.some(({ symbol, decimals }) => !!symbol || !!decimals)) {\n return 1\n }\n\n return 2\n}\n\nconst migrateHiddenTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ isHidden }) => isHidden)\n .map(({ address, networkId, isHidden }) => ({\n address,\n networkId,\n isHidden\n }))\n}\n\nconst migrateCustomTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ standard }) => !!standard)\n .map(({ address, standard, networkId }) => ({\n address,\n standard,\n networkId\n }))\n}\n\n/**\n * Migrates legacy token preferences to token preferences and custom tokens\n * if necessary.\n */\nconst migrateTokenPreferences = (\n tokenPreferences: LegacyTokenPreference[],\n customTokens?: CustomToken[]\n) => {\n const storageVersion = inferStorageVersion(tokenPreferences)\n\n // Migrate\n if (storageVersion === 1) {\n return {\n tokenPreferences: migrateHiddenTokens(tokenPreferences),\n customTokens: migrateCustomTokens(tokenPreferences),\n shouldUpdateStorage: true\n }\n }\n\n return {\n tokenPreferences,\n customTokens: customTokens || [],\n shouldUpdateStorage: false\n }\n}\n\nexport { migrateTokenPreferences }\n"]} \ No newline at end of file +{"version":3,"file":"tokenPreferences.js","sourceRoot":"","sources":["../../../../../src/libs/portfolio/migrations/tokenPreferences.ts"],"names":[],"mappings":";;;AAEA,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC3E,OAAO,CAAC,CAAA;KACT;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,SAAS;QACT,QAAQ;KACT,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,gBAAyC,EAAE,EAAE;IACxE,OAAO,gBAAgB;SACpB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACpC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,QAAQ;QACR,SAAS;KACV,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,uBAAuB,GAAG,CAC9B,gBAAyC,EACzC,YAA4B,EAC5B,EAAE;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAE5D,UAAU;IACV,IAAI,cAAc,KAAK,CAAC,EAAE;QACxB,OAAO;YACL,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACvD,YAAY,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YACnD,mBAAmB,EAAE,IAAI;SAC1B,CAAA;KACF;IAED,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE,YAAY,IAAI,EAAE;QAChC,mBAAmB,EAAE,KAAK;KAC3B,CAAA;AACH,CAAC,CAAA;AAEQ,0DAAuB","sourcesContent":["import { CustomToken, LegacyTokenPreference } from '../customToken'\n\nconst inferStorageVersion = (tokenPreferences: LegacyTokenPreference[]) => {\n if (tokenPreferences.some(({ symbol, decimals }) => !!symbol || !!decimals)) {\n return 1\n }\n\n return 2\n}\n\nconst migrateHiddenTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ isHidden }) => isHidden)\n .map(({ address, networkId, isHidden }) => ({\n address,\n networkId,\n isHidden\n }))\n}\n\nconst migrateCustomTokens = (tokenPreferences: LegacyTokenPreference[]) => {\n return tokenPreferences\n .filter(({ standard }) => !!standard)\n .map(({ address, standard, networkId }) => ({\n address,\n standard,\n networkId\n }))\n}\n\n/**\n * Migrates legacy token preferences to token preferences and custom tokens\n * if necessary.\n */\nconst migrateTokenPreferences = (\n tokenPreferences: LegacyTokenPreference[],\n customTokens?: CustomToken[]\n) => {\n const storageVersion = inferStorageVersion(tokenPreferences)\n\n // Migrate\n if (storageVersion === 1) {\n return {\n tokenPreferences: migrateHiddenTokens(tokenPreferences),\n customTokens: migrateCustomTokens(tokenPreferences),\n shouldUpdateStorage: true\n }\n }\n\n return {\n tokenPreferences,\n customTokens: customTokens || [],\n shouldUpdateStorage: false\n }\n}\n\nexport { migrateTokenPreferences }\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.js b/dist/src/libs/portfolio/pagination.js index f55229d76..b3fa577ee 100644 --- a/dist/src/libs/portfolio/pagination.js +++ b/dist/src/libs/portfolio/pagination.js @@ -1,4 +1,7 @@ -export function paginate(input, limit) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.flattenResults = exports.paginate = void 0; +function paginate(input, limit) { const pages = []; let from = 0; for (let i = 1; i <= Math.ceil(input.length / limit); i++) { @@ -7,7 +10,8 @@ export function paginate(input, limit) { } return pages; } -export function flattenResults(everything) { +exports.paginate = paginate; +function flattenResults(everything) { return Promise.all(everything).then((results) => { if (!results || !results.length) { return [[], {}]; @@ -28,4 +32,5 @@ export function flattenResults(everything) { return [allTokens, metadata]; }); } +exports.flattenResults = flattenResults; //# sourceMappingURL=pagination.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pagination.js.map b/dist/src/libs/portfolio/pagination.js.map index 66232aa07..ebd217607 100644 --- a/dist/src/libs/portfolio/pagination.js.map +++ b/dist/src/libs/portfolio/pagination.js.map @@ -1 +1 @@ -{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pagination.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,QAAQ,CACtB,KAAkE,EAClE,KAAa;IAEb,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAA+E;IAE/E,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAC/B,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;SAChB;QAED,MAAM,SAAS,GAAU,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAa,EAAE,CAAA;QAE3B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9C,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,CAAA;gBAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;oBAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;iBAC9B;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtC,QAAQ,GAAG,EAAE,GAAI,IAAiB,EAAE,CAAA;iBACrC;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {\n CollectionResult,\n ERC721Enumerable,\n ERC721Innumerable,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nexport function paginate(\n input: string[] | [string, ERC721Enumerable | ERC721Innumerable][],\n limit: number\n): any[][] {\n const pages = []\n let from = 0\n for (let i = 1; i <= Math.ceil(input.length / limit); i++) {\n pages.push(input.slice(from, i * limit))\n from += limit\n }\n return pages\n}\n\nexport function flattenResults(\n everything: Promise<[[string, TokenResult | CollectionResult][], MetaData][]>[]\n): Promise<[[TokenError, TokenResult | CollectionResult][], MetaData | {}]> {\n return Promise.all(everything).then((results) => {\n if (!results || !results.length) {\n return [[], {}]\n }\n\n const allTokens: any[] = []\n let metadata: MetaData = {}\n\n results.forEach((result) => {\n if (Array.isArray(result) && result.length > 0) {\n const [hintsArray, meta] = result\n\n if (Array.isArray(hintsArray)) {\n allTokens.push(...hintsArray)\n }\n if (Object.keys(metadata).length === 0) {\n metadata = { ...(meta as MetaData) }\n }\n }\n })\n\n return [allTokens, metadata]\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pagination.ts"],"names":[],"mappings":";;;AASA,SAAgB,QAAQ,CACtB,KAAkE,EAClE,KAAa;IAEb,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAXD,4BAWC;AAED,SAAgB,cAAc,CAC5B,UAA+E;IAE/E,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAC/B,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;SAChB;QAED,MAAM,SAAS,GAAU,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAa,EAAE,CAAA;QAE3B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9C,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,CAAA;gBAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;oBAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;iBAC9B;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtC,QAAQ,GAAG,EAAE,GAAI,IAAiB,EAAE,CAAA;iBACrC;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACJ,CAAC;AA1BD,wCA0BC","sourcesContent":["import {\n CollectionResult,\n ERC721Enumerable,\n ERC721Innumerable,\n MetaData,\n TokenError,\n TokenResult\n} from './interfaces'\n\nexport function paginate(\n input: string[] | [string, ERC721Enumerable | ERC721Innumerable][],\n limit: number\n): any[][] {\n const pages = []\n let from = 0\n for (let i = 1; i <= Math.ceil(input.length / limit); i++) {\n pages.push(input.slice(from, i * limit))\n from += limit\n }\n return pages\n}\n\nexport function flattenResults(\n everything: Promise<[[string, TokenResult | CollectionResult][], MetaData][]>[]\n): Promise<[[TokenError, TokenResult | CollectionResult][], MetaData | {}]> {\n return Promise.all(everything).then((results) => {\n if (!results || !results.length) {\n return [[], {}]\n }\n\n const allTokens: any[] = []\n let metadata: MetaData = {}\n\n results.forEach((result) => {\n if (Array.isArray(result) && result.length > 0) {\n const [hintsArray, meta] = result\n\n if (Array.isArray(hintsArray)) {\n allTokens.push(...hintsArray)\n }\n if (Object.keys(metadata).length === 0) {\n metadata = { ...(meta as MetaData) }\n }\n }\n })\n\n return [allTokens, metadata]\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.js b/dist/src/libs/portfolio/pendingAmountsHelper.js index 7f11a3bc3..cee11f10d 100644 --- a/dist/src/libs/portfolio/pendingAmountsHelper.js +++ b/dist/src/libs/portfolio/pendingAmountsHelper.js @@ -1,4 +1,7 @@ -import { AccountOpStatus } from '../accountOp/accountOp'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.calculatePendingAmounts = void 0; +const accountOp_1 = require("../accountOp/accountOp"); /** * Function for calculating the pending balance and the delta amounts * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token. @@ -37,7 +40,7 @@ import { AccountOpStatus } from '../accountOp/accountOp'; * - This is similar to the previous case, but here the AccOp has been broadcasted. * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount. */ -export const calculatePendingAmounts = (latestAmount, pendingAmount, amountPostSimulation, simulationDelta, // pending delta (this is the amount of the simulation itself) +const calculatePendingAmounts = (latestAmount, pendingAmount, amountPostSimulation, simulationDelta, // pending delta (this is the amount of the simulation itself) simulatedAccountOp) => { let latestPendingDelta = pendingAmount - latestAmount; // Dynamically calculate the threshold as 0.0001% of the pendingAmount @@ -77,7 +80,7 @@ simulatedAccountOp) => { // When we broadcast the AccountOp, we set the status of the simulated AccountOp to `BroadcastedButNotConfirmed` // until the transaction is confirmed or the user forcefully refreshes their portfolio balance and clears the simulation. // When the SimulatedAccountOp has the status `BroadcastedButNotConfirmed`, we know that the pending badge is `pendingToBeConfirmed`. - const hasPendingToBeConfirmed = simulatedAccountOp?.status === AccountOpStatus.BroadcastedButNotConfirmed; + const hasPendingToBeConfirmed = simulatedAccountOp?.status === accountOp_1.AccountOpStatus.BroadcastedButNotConfirmed; if (hasPendingToBeConfirmed) { // Main scenario #2. result.pendingToBeConfirmed = simulationDelta; @@ -94,4 +97,5 @@ simulatedAccountOp) => { } return result; }; +exports.calculatePendingAmounts = calculatePendingAmounts; //# sourceMappingURL=pendingAmountsHelper.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/pendingAmountsHelper.js.map b/dist/src/libs/portfolio/pendingAmountsHelper.js.map index b396da9ff..d23ace06c 100644 --- a/dist/src/libs/portfolio/pendingAmountsHelper.js.map +++ b/dist/src/libs/portfolio/pendingAmountsHelper.js.map @@ -1 +1 @@ -{"version":3,"file":"pendingAmountsHelper.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pendingAmountsHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,YAAoB,EACpB,aAAqB,EACrB,oBAA6B,EAC7B,eAAwB,EAAE,8DAA8D;AACxF,kBAA8B,EACP,EAAE;IACzB,IAAI,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAA;IAErD,sEAAsE;IACtE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,QAAU,CAAC,CAAC,CAAC,MAAM,CAAA;IAE1E,4FAA4F;IAC5F,+EAA+E;IAC/E,kGAAkG;IAClG,wEAAwE;IACxE,0EAA0E;IAC1E,4GAA4G;IAC5G,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAA;IAEnF,gDAAgD;IAChD,IAAI,CAAC,iBAAiB,EAAE;QACtB,kBAAkB,GAAG,EAAE,CAAA;KACxB;IAED,oCAAoC;IACpC,IAAI,kBAAkB,KAAK,EAAE,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAA;IAE9D,IAAI,cAAc,CAAA;IAElB,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,kBAAkB,IAAI,CAAC,oBAAoB,EAAE;QAC/C,cAAc,GAAG,aAAa,CAAA;KAC/B;SAAM;QACL,4FAA4F;QAC5F,cAAc,GAAG,oBAAqB,CAAA;KACvC;IAED,sDAAsD;IACtD,oGAAoG;IACpG,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,IAAI;QACf,cAAc;KACf,CAAA;IAED,IAAI,eAAe,EAAE;QACnB,gHAAgH;QAChH,yHAAyH;QACzH,qIAAqI;QACrI,MAAM,uBAAuB,GAC3B,kBAAkB,EAAE,MAAM,KAAK,eAAe,CAAC,0BAA0B,CAAA;QAE3E,IAAI,uBAAuB,EAAE;YAC3B,oBAAoB;YACpB,MAAM,CAAC,oBAAoB,GAAG,eAAe,CAAA;SAC9C;aAAM;YACL,oBAAoB;YACpB,MAAM,CAAC,iBAAiB,GAAG,eAAe,CAAA;SAC3C;KACF;IAED,IAAI,kBAAkB,EAAE;QACtB,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB;YACvD,CAAC,CAAC,MAAM,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,oBAAoB;YACvE,CAAC,CAAC,kBAAkB,CAAA,CAAC,oBAAoB;KAC5C;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { AccountOp, AccountOpStatus } from '../accountOp/accountOp'\nimport { PendingAmounts } from './interfaces'\n\n/**\n * Function for calculating the pending balance and the delta amounts\n * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token.\n *\n * While calculating the balance is a routine operation,\n * calculating the pending delta and determining its state (whether it needs to be signed or confirmed)\n * can be quite challenging.\n *\n * We use this function's output to display PendingToBeSigned, PendingToBeConfirmed, or both badges on the Dashboard.\n *\n * Here's the main mechanism for handling the pending state and simulation:\n * 1. Once we have an AccountOp, we perform a simulation against the pending block. The `PendingToBeSigned` badge is shown.\n * 2. After broadcasting the AccountOp, we update its status to `PendingToBeConfirmed`. The `PendingToBeConfirmed` badge appears.\n * 3. After broadcasting, we ensure the AccountPortfolio is not updated immediately to avoid losing the simulation and badge.\n * 4. Even if we try updating with the previous simulation, it won't work as the account nonce will already be incremented.\n * 5. Once the transaction is confirmed, the AccountPortfolio is updated. The simulation and the `PendingToBeConfirmed` badge clear.\n * 6. If the user refreshes or the transaction delays, the portfolio updates automatically, clearing the simulation. This is acceptable.\n *\n * Let's review the main scenarios where we encounter simulation (simulatedAccountOp), followed by a discussion of corner cases.\n *\n * Main scenarios:\n * 1. If there is an AccOp that has not yet been signed, we return the `pendingToBeSigned` amount.\n * 2. If there is an AccOp that has been signed and broadcasted (but not yet confirmed),\n * we display the `pendingToBeConfirmed` badge, reflecting the corresponding amount.\n * 3. If we detect a delta between the pending and latest token amounts, it indicates that there is something awaiting confirmation.\n * In this case, we also return the `pendingToBeConfirmed` amount.\n * For example, if someone sends you tokens outside of the extension, the extension will show the `pendingToBeConfirmed` amount.\n *\n * Rare scenarios:\n * 1. It is possible to have both `pendingToBeSigned` and `pendingToBeConfirmed` badges in the following scenario:\n * - If someone sends you tokens, the `latestPendingDelta` is triggered.\n * At the same time, if you have an AccOp waiting to be signed, both badges will be displayed,\n * and the amounts for `pendingToBeSigned` and `pendingToBeConfirmed` will be calculated.\n * 2. If you sign and broadcast an AccOp while the `latestPendingDelta` also has a value,\n * the `pendingToBeConfirmed` badge will be displayed, representing the sum of both `simulationDelta` and `pendingLatestDelta`.\n * - This is similar to the previous case, but here the AccOp has been broadcasted.\n * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount.\n */\nexport const calculatePendingAmounts = (\n latestAmount: bigint,\n pendingAmount: bigint,\n amountPostSimulation?: bigint,\n simulationDelta?: bigint, // pending delta (this is the amount of the simulation itself)\n simulatedAccountOp?: AccountOp\n): PendingAmounts | null => {\n let latestPendingDelta = pendingAmount - latestAmount\n\n // Dynamically calculate the threshold as 0.0001% of the pendingAmount\n // Use a minimum threshold of 10000n to avoid a zero threshold\n const threshold = pendingAmount > 0n ? pendingAmount / 1_000_000n : 10000n\n\n // Check if the change in latestPendingDelta is significant (>= threshold or <= -threshold).\n // This helps to avoid processing insignificant changes in the pending balance.\n // This is important for handling tokens with pending balances, such as those deposited into AAVE.\n // With AAVE each block generates a small amount of interest or rewards,\n // which is constantly displaying on dashboard as pending to be confirmed.\n // The percentage change helps determine if the change in pending balance is significant enough to consider.\n const significantChange = Math.abs(Number(latestPendingDelta)) >= Number(threshold)\n\n // Ignore changes without significant difference\n if (!significantChange) {\n latestPendingDelta = 0n\n }\n\n // There is no Pending state changes\n if (latestPendingDelta === 0n && !simulationDelta) return null\n\n let pendingBalance\n\n // If there is a latest/pending block delta, but there is no a simulation,\n // set the pending token's balance to equal to the pending block amount.\n if (latestPendingDelta && !amountPostSimulation) {\n pendingBalance = pendingAmount\n } else {\n // Otherwise, if we have a simulation, the pending balance is equal to the simulation amount\n pendingBalance = amountPostSimulation!\n }\n\n // Okay, we already know that we have a pending state,\n // but in the following lines, we need to set the pendingToBeSigned and pendingToBeConfirmed states.\n const result: PendingAmounts = {\n isPending: true,\n pendingBalance\n }\n\n if (simulationDelta) {\n // When we broadcast the AccountOp, we set the status of the simulated AccountOp to `BroadcastedButNotConfirmed`\n // until the transaction is confirmed or the user forcefully refreshes their portfolio balance and clears the simulation.\n // When the SimulatedAccountOp has the status `BroadcastedButNotConfirmed`, we know that the pending badge is `pendingToBeConfirmed`.\n const hasPendingToBeConfirmed =\n simulatedAccountOp?.status === AccountOpStatus.BroadcastedButNotConfirmed\n\n if (hasPendingToBeConfirmed) {\n // Main scenario #2.\n result.pendingToBeConfirmed = simulationDelta\n } else {\n // Main scenario #1.\n result.pendingToBeSigned = simulationDelta\n }\n }\n\n if (latestPendingDelta) {\n result.pendingToBeConfirmed = result.pendingToBeConfirmed\n ? result.pendingToBeConfirmed + latestPendingDelta // Rare scenario #2.\n : latestPendingDelta // Main scenario #3.\n }\n\n return result\n}\n"]} \ No newline at end of file +{"version":3,"file":"pendingAmountsHelper.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/pendingAmountsHelper.ts"],"names":[],"mappings":";;;AAAA,sDAAmE;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACI,MAAM,uBAAuB,GAAG,CACrC,YAAoB,EACpB,aAAqB,EACrB,oBAA6B,EAC7B,eAAwB,EAAE,8DAA8D;AACxF,kBAA8B,EACP,EAAE;IACzB,IAAI,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAA;IAErD,sEAAsE;IACtE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,QAAU,CAAC,CAAC,CAAC,MAAM,CAAA;IAE1E,4FAA4F;IAC5F,+EAA+E;IAC/E,kGAAkG;IAClG,wEAAwE;IACxE,0EAA0E;IAC1E,4GAA4G;IAC5G,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAA;IAEnF,gDAAgD;IAChD,IAAI,CAAC,iBAAiB,EAAE;QACtB,kBAAkB,GAAG,EAAE,CAAA;KACxB;IAED,oCAAoC;IACpC,IAAI,kBAAkB,KAAK,EAAE,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAA;IAE9D,IAAI,cAAc,CAAA;IAElB,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,kBAAkB,IAAI,CAAC,oBAAoB,EAAE;QAC/C,cAAc,GAAG,aAAa,CAAA;KAC/B;SAAM;QACL,4FAA4F;QAC5F,cAAc,GAAG,oBAAqB,CAAA;KACvC;IAED,sDAAsD;IACtD,oGAAoG;IACpG,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,IAAI;QACf,cAAc;KACf,CAAA;IAED,IAAI,eAAe,EAAE;QACnB,gHAAgH;QAChH,yHAAyH;QACzH,qIAAqI;QACrI,MAAM,uBAAuB,GAC3B,kBAAkB,EAAE,MAAM,KAAK,2BAAe,CAAC,0BAA0B,CAAA;QAE3E,IAAI,uBAAuB,EAAE;YAC3B,oBAAoB;YACpB,MAAM,CAAC,oBAAoB,GAAG,eAAe,CAAA;SAC9C;aAAM;YACL,oBAAoB;YACpB,MAAM,CAAC,iBAAiB,GAAG,eAAe,CAAA;SAC3C;KACF;IAED,IAAI,kBAAkB,EAAE;QACtB,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB;YACvD,CAAC,CAAC,MAAM,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,oBAAoB;YACvE,CAAC,CAAC,kBAAkB,CAAA,CAAC,oBAAoB;KAC5C;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAtEY,QAAA,uBAAuB,2BAsEnC","sourcesContent":["import { AccountOp, AccountOpStatus } from '../accountOp/accountOp'\nimport { PendingAmounts } from './interfaces'\n\n/**\n * Function for calculating the pending balance and the delta amounts\n * for pendingToBeSigned and pendingToBeConfirmed states (referred to as token badges) of a token.\n *\n * While calculating the balance is a routine operation,\n * calculating the pending delta and determining its state (whether it needs to be signed or confirmed)\n * can be quite challenging.\n *\n * We use this function's output to display PendingToBeSigned, PendingToBeConfirmed, or both badges on the Dashboard.\n *\n * Here's the main mechanism for handling the pending state and simulation:\n * 1. Once we have an AccountOp, we perform a simulation against the pending block. The `PendingToBeSigned` badge is shown.\n * 2. After broadcasting the AccountOp, we update its status to `PendingToBeConfirmed`. The `PendingToBeConfirmed` badge appears.\n * 3. After broadcasting, we ensure the AccountPortfolio is not updated immediately to avoid losing the simulation and badge.\n * 4. Even if we try updating with the previous simulation, it won't work as the account nonce will already be incremented.\n * 5. Once the transaction is confirmed, the AccountPortfolio is updated. The simulation and the `PendingToBeConfirmed` badge clear.\n * 6. If the user refreshes or the transaction delays, the portfolio updates automatically, clearing the simulation. This is acceptable.\n *\n * Let's review the main scenarios where we encounter simulation (simulatedAccountOp), followed by a discussion of corner cases.\n *\n * Main scenarios:\n * 1. If there is an AccOp that has not yet been signed, we return the `pendingToBeSigned` amount.\n * 2. If there is an AccOp that has been signed and broadcasted (but not yet confirmed),\n * we display the `pendingToBeConfirmed` badge, reflecting the corresponding amount.\n * 3. If we detect a delta between the pending and latest token amounts, it indicates that there is something awaiting confirmation.\n * In this case, we also return the `pendingToBeConfirmed` amount.\n * For example, if someone sends you tokens outside of the extension, the extension will show the `pendingToBeConfirmed` amount.\n *\n * Rare scenarios:\n * 1. It is possible to have both `pendingToBeSigned` and `pendingToBeConfirmed` badges in the following scenario:\n * - If someone sends you tokens, the `latestPendingDelta` is triggered.\n * At the same time, if you have an AccOp waiting to be signed, both badges will be displayed,\n * and the amounts for `pendingToBeSigned` and `pendingToBeConfirmed` will be calculated.\n * 2. If you sign and broadcast an AccOp while the `latestPendingDelta` also has a value,\n * the `pendingToBeConfirmed` badge will be displayed, representing the sum of both `simulationDelta` and `pendingLatestDelta`.\n * - This is similar to the previous case, but here the AccOp has been broadcasted.\n * When there is a delta between the latest and pending block amounts, both deltas are summed, resulting in the `pendingToBeConfirmed` amount.\n */\nexport const calculatePendingAmounts = (\n latestAmount: bigint,\n pendingAmount: bigint,\n amountPostSimulation?: bigint,\n simulationDelta?: bigint, // pending delta (this is the amount of the simulation itself)\n simulatedAccountOp?: AccountOp\n): PendingAmounts | null => {\n let latestPendingDelta = pendingAmount - latestAmount\n\n // Dynamically calculate the threshold as 0.0001% of the pendingAmount\n // Use a minimum threshold of 10000n to avoid a zero threshold\n const threshold = pendingAmount > 0n ? pendingAmount / 1_000_000n : 10000n\n\n // Check if the change in latestPendingDelta is significant (>= threshold or <= -threshold).\n // This helps to avoid processing insignificant changes in the pending balance.\n // This is important for handling tokens with pending balances, such as those deposited into AAVE.\n // With AAVE each block generates a small amount of interest or rewards,\n // which is constantly displaying on dashboard as pending to be confirmed.\n // The percentage change helps determine if the change in pending balance is significant enough to consider.\n const significantChange = Math.abs(Number(latestPendingDelta)) >= Number(threshold)\n\n // Ignore changes without significant difference\n if (!significantChange) {\n latestPendingDelta = 0n\n }\n\n // There is no Pending state changes\n if (latestPendingDelta === 0n && !simulationDelta) return null\n\n let pendingBalance\n\n // If there is a latest/pending block delta, but there is no a simulation,\n // set the pending token's balance to equal to the pending block amount.\n if (latestPendingDelta && !amountPostSimulation) {\n pendingBalance = pendingAmount\n } else {\n // Otherwise, if we have a simulation, the pending balance is equal to the simulation amount\n pendingBalance = amountPostSimulation!\n }\n\n // Okay, we already know that we have a pending state,\n // but in the following lines, we need to set the pendingToBeSigned and pendingToBeConfirmed states.\n const result: PendingAmounts = {\n isPending: true,\n pendingBalance\n }\n\n if (simulationDelta) {\n // When we broadcast the AccountOp, we set the status of the simulated AccountOp to `BroadcastedButNotConfirmed`\n // until the transaction is confirmed or the user forcefully refreshes their portfolio balance and clears the simulation.\n // When the SimulatedAccountOp has the status `BroadcastedButNotConfirmed`, we know that the pending badge is `pendingToBeConfirmed`.\n const hasPendingToBeConfirmed =\n simulatedAccountOp?.status === AccountOpStatus.BroadcastedButNotConfirmed\n\n if (hasPendingToBeConfirmed) {\n // Main scenario #2.\n result.pendingToBeConfirmed = simulationDelta\n } else {\n // Main scenario #1.\n result.pendingToBeSigned = simulationDelta\n }\n }\n\n if (latestPendingDelta) {\n result.pendingToBeConfirmed = result.pendingToBeConfirmed\n ? result.pendingToBeConfirmed + latestPendingDelta // Rare scenario #2.\n : latestPendingDelta // Main scenario #3.\n }\n\n return result\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.js b/dist/src/libs/portfolio/portfolio.js index 7646b475e..41de3dec4 100644 --- a/dist/src/libs/portfolio/portfolio.js +++ b/dist/src/libs/portfolio/portfolio.js @@ -1,17 +1,21 @@ +"use strict"; /* eslint-disable no-restricted-syntax */ /* eslint-disable guard-for-in */ -import { getAddress, ZeroAddress } from 'ethers'; -import BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'; -import NFTGetter from '../../../contracts/compiled/NFTGetter.json'; -import gasTankFeeTokens from '../../consts/gasTankFeeTokens'; -import { PINNED_TOKENS } from '../../consts/pinnedTokens'; -import { fromDescriptor } from '../deployless/deployless'; -import batcher from './batcher'; -import { geckoRequestBatcher, geckoResponseIdentifier } from './gecko'; -import { getNFTs, getTokens } from './getOnchainBalances'; -import { stripExternalHintsAPIResponse } from './helpers'; -import { flattenResults, paginate } from './pagination'; -export const LIMITS = { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Portfolio = exports.getEmptyHints = exports.PORTFOLIO_LIB_ERROR_NAMES = exports.LIMITS = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const BalanceGetter_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/BalanceGetter.json")); +const NFTGetter_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/NFTGetter.json")); +const gasTankFeeTokens_1 = tslib_1.__importDefault(require("../../consts/gasTankFeeTokens")); +const pinnedTokens_1 = require("../../consts/pinnedTokens"); +const deployless_1 = require("../deployless/deployless"); +const batcher_1 = tslib_1.__importDefault(require("./batcher")); +const gecko_1 = require("./gecko"); +const getOnchainBalances_1 = require("./getOnchainBalances"); +const helpers_1 = require("./helpers"); +const pagination_1 = require("./pagination"); +exports.LIMITS = { // we have to be conservative with erc721Tokens because if we pass 30x20 (worst case) tokenIds, that's 30x20 extra words which is 19kb // proxy mode input is limited to 24kb deploylessProxyMode: { erc20: 100, erc721: 30, erc721TokensInput: 20, erc721Tokens: 50 }, @@ -23,7 +27,7 @@ export const LIMITS = { erc721Tokens: 70 } }; -export const PORTFOLIO_LIB_ERROR_NAMES = { +exports.PORTFOLIO_LIB_ERROR_NAMES = { /** External hints API (Velcro) request failed but fallback is sufficient */ NonCriticalApiHintsError: 'NonCriticalApiHintsError', /** External API (Velcro) hints are older than X minutes */ @@ -33,10 +37,11 @@ export const PORTFOLIO_LIB_ERROR_NAMES = { /** One or more cena request has failed */ PriceFetchError: 'PriceFetchError' }; -export const getEmptyHints = () => ({ +const getEmptyHints = () => ({ erc20s: [], erc721s: {} }); +exports.getEmptyHints = getEmptyHints; const defaultOptions = { baseCurrency: 'usd', blockTag: 'latest', @@ -45,14 +50,14 @@ const defaultOptions = { fetchPinned: true, isEOA: false }; -export class Portfolio { +class Portfolio { network; batchedVelcroDiscovery; batchedGecko; deploylessTokens; deploylessNfts; constructor(fetch, provider, network, velcroUrl) { - this.batchedVelcroDiscovery = batcher(fetch, (queue) => { + this.batchedVelcroDiscovery = (0, batcher_1.default)(fetch, (queue) => { const baseCurrencies = [...new Set(queue.map((x) => x.data.baseCurrency))]; return baseCurrencies.map((baseCurrency) => { const queueSegment = queue.filter((x) => x.data.baseCurrency === baseCurrency); @@ -67,13 +72,13 @@ export class Portfolio { timeoutAfter: 3000, timeoutErrorMessage: `Velcro discovery timed out on ${network.id}` }); - this.batchedGecko = batcher(fetch, geckoRequestBatcher, { + this.batchedGecko = (0, batcher_1.default)(fetch, gecko_1.geckoRequestBatcher, { timeoutAfter: 3000, timeoutErrorMessage: `Cena request timed out on ${network.id}` }); this.network = network; - this.deploylessTokens = fromDescriptor(provider, BalanceGetter, !network.rpcNoStateOverride); - this.deploylessNfts = fromDescriptor(provider, NFTGetter, !network.rpcNoStateOverride); + this.deploylessTokens = (0, deployless_1.fromDescriptor)(provider, BalanceGetter_json_1.default, !network.rpcNoStateOverride); + this.deploylessNfts = (0, deployless_1.fromDescriptor)(provider, NFTGetter_json_1.default, !network.rpcNoStateOverride); } async get(accountAddr, opts = {}) { const errors = []; @@ -87,7 +92,7 @@ export class Portfolio { const networkId = this.network.id; // Make sure portfolio lib still works, even in the case Velcro discovery fails. // Because of this, we fall back to Velcro default response. - let hints = getEmptyHints(); + let hints = (0, exports.getEmptyHints)(); let hintsFromExternalAPI = null; try { // if the network doesn't have a relayer, velcro will not work @@ -100,7 +105,7 @@ export class Portfolio { }); if (hintsFromExternalAPI) { hintsFromExternalAPI.lastUpdate = Date.now(); - hints = stripExternalHintsAPIResponse(hintsFromExternalAPI); + hints = (0, helpers_1.stripExternalHintsAPIResponse)(hintsFromExternalAPI); } } } @@ -113,15 +118,15 @@ export class Portfolio { const isLastUpdateTooOld = Date.now() - lastUpdate > TEN_MINUTES; errors.push({ name: isLastUpdateTooOld - ? PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError - : PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError, + ? exports.PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError + : exports.PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError, message: errorMesssage, level: 'critical' }); } else { errors.push({ - name: PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError, + name: exports.PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError, message: errorMesssage, level: 'silent' }); @@ -143,19 +148,19 @@ export class Portfolio { hints.erc20s = [...hints.erc20s, ...localOpts.additionalErc20Hints]; } if (localOpts.fetchPinned) { - hints.erc20s = [...hints.erc20s, ...PINNED_TOKENS.map((x) => x.address)]; + hints.erc20s = [...hints.erc20s, ...pinnedTokens_1.PINNED_TOKENS.map((x) => x.address)]; } // add the fee tokens hints.erc20s = [ ...hints.erc20s, - ...gasTankFeeTokens.filter((x) => x.networkId === this.network.id).map((x) => x.address) + ...gasTankFeeTokens_1.default.filter((x) => x.networkId === this.network.id).map((x) => x.address) ]; const checksummedErc20Hints = hints.erc20s .map((address) => { try { // getAddress may throw an error. This will break the portfolio // if the error isn't caught - return getAddress(address); + return (0, ethers_1.getAddress)(address); } catch { return null; @@ -163,7 +168,7 @@ export class Portfolio { }) .filter(Boolean); // Remove duplicates and always add ZeroAddress - hints.erc20s = [...new Set(checksummedErc20Hints.concat(ZeroAddress))]; + hints.erc20s = [...new Set(checksummedErc20Hints.concat(ethers_1.ZeroAddress))]; // This also allows getting prices, this is used for more exotic tokens that cannot be retrieved via Coingecko const priceCache = localOpts.priceCache || new Map(); for (const addr in hintsFromExternalAPI?.prices || {}) { @@ -177,12 +182,12 @@ export class Portfolio { const discoveryDone = Date.now(); // .isLimitedAt24kbData should be the same for both instances; @TODO more elegant check? const limits = this.deploylessTokens.isLimitedAt24kbData - ? LIMITS.deploylessProxyMode - : LIMITS.deploylessStateOverrideMode; + ? exports.LIMITS.deploylessProxyMode + : exports.LIMITS.deploylessStateOverrideMode; const collectionsHints = Object.entries(hints.erc721s); const [tokensWithErr, collectionsWithErr] = await Promise.all([ - flattenResults(paginate(hints.erc20s, limits.erc20).map((page) => getTokens(this.network, this.deploylessTokens, localOpts, accountAddr, page))), - flattenResults(paginate(collectionsHints, limits.erc721).map((page) => getNFTs(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits))) + (0, pagination_1.flattenResults)((0, pagination_1.paginate)(hints.erc20s, limits.erc20).map((page) => (0, getOnchainBalances_1.getTokens)(this.network, this.deploylessTokens, localOpts, accountAddr, page))), + (0, pagination_1.flattenResults)((0, pagination_1.paginate)(collectionsHints, limits.erc721).map((page) => (0, getOnchainBalances_1.getNFTs)(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits))) ]); const [tokensWithErrResult, metaData] = tokensWithErr; const { blockNumber, beforeNonce, afterNonce } = metaData; @@ -243,7 +248,7 @@ export class Portfolio { network: this.network, baseCurrency, // this is what to look for in the coingecko response object - responseIdentifier: geckoResponseIdentifier(token.address, this.network) + responseIdentifier: (0, gecko_1.geckoResponseIdentifier)(token.address, this.network) }); priceIn = Object.entries(priceData || {}).map(([baseCurr, price]) => ({ baseCurrency: baseCurr, @@ -257,9 +262,9 @@ export class Portfolio { priceIn = []; // Avoid duplicate errors, because this.bachedGecko is called for each token and if // there is an error it will most likely be the same for all tokens - if (!errors.find((x) => x.name === PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage)) { + if (!errors.find((x) => x.name === exports.PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage)) { errors.push({ - name: PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError, + name: exports.PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError, message: errorMessage, level: 'warning' }); @@ -272,7 +277,7 @@ export class Portfolio { })); const priceUpdateDone = Date.now(); return { - hintsFromExternalAPI: stripExternalHintsAPIResponse(hintsFromExternalAPI), + hintsFromExternalAPI: (0, helpers_1.stripExternalHintsAPIResponse)(hintsFromExternalAPI), errors, updateStarted: start, discoveryTime: discoveryDone - start, @@ -282,10 +287,10 @@ export class Portfolio { tokens: tokensWithPrices, feeTokens: tokensWithPrices.filter((t) => { // return the native token - if (t.address === ZeroAddress && + if (t.address === ethers_1.ZeroAddress && t.networkId.toLowerCase() === this.network.id.toLowerCase()) return true; - return gasTankFeeTokens.find((gasTankT) => gasTankT.address.toLowerCase() === t.address.toLowerCase() && + return gasTankFeeTokens_1.default.find((gasTankT) => gasTankT.address.toLowerCase() === t.address.toLowerCase() && gasTankT.networkId.toLowerCase() === t.networkId.toLowerCase()); }), beforeNonce, @@ -298,4 +303,5 @@ export class Portfolio { }; } } +exports.Portfolio = Portfolio; //# sourceMappingURL=portfolio.js.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/portfolio.js.map b/dist/src/libs/portfolio/portfolio.js.map index 2ac1602d6..540a842aa 100644 --- a/dist/src/libs/portfolio/portfolio.js.map +++ b/dist/src/libs/portfolio/portfolio.js.map @@ -1 +1 @@ -{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable guard-for-in */\n\nimport { getAddress, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Deployless, fromDescriptor } from '../deployless/deployless'\nimport batcher from './batcher'\nimport { geckoRequestBatcher, geckoResponseIdentifier } from './gecko'\nimport { getNFTs, getTokens } from './getOnchainBalances'\nimport { stripExternalHintsAPIResponse } from './helpers'\nimport {\n CollectionResult,\n ExternalHintsAPIResponse,\n GetOptions,\n Hints,\n Limits,\n LimitsOptions,\n PortfolioLibGetResult,\n PriceCache,\n TokenError,\n TokenResult\n} from './interfaces'\nimport { flattenResults, paginate } from './pagination'\n\nexport const LIMITS: Limits = {\n // we have to be conservative with erc721Tokens because if we pass 30x20 (worst case) tokenIds, that's 30x20 extra words which is 19kb\n // proxy mode input is limited to 24kb\n deploylessProxyMode: { erc20: 100, erc721: 30, erc721TokensInput: 20, erc721Tokens: 50 },\n // theoretical capacity is 1666/450\n deploylessStateOverrideMode: {\n erc20: 350,\n erc721: 70,\n erc721TokensInput: 70,\n erc721Tokens: 70\n }\n}\n\nexport const PORTFOLIO_LIB_ERROR_NAMES = {\n /** External hints API (Velcro) request failed but fallback is sufficient */\n NonCriticalApiHintsError: 'NonCriticalApiHintsError',\n /** External API (Velcro) hints are older than X minutes */\n StaleApiHintsError: 'StaleApiHintsError',\n /** No external API (Velcro) hints are available- the request failed without fallback */\n NoApiHintsError: 'NoApiHintsError',\n /** One or more cena request has failed */\n PriceFetchError: 'PriceFetchError'\n}\n\nexport const getEmptyHints = (): Hints => ({\n erc20s: [],\n erc721s: {}\n})\n\nconst defaultOptions: GetOptions = {\n baseCurrency: 'usd',\n blockTag: 'latest',\n priceRecency: 0,\n previousHintsFromExternalAPI: null,\n fetchPinned: true,\n isEOA: false\n}\n\nexport class Portfolio {\n network: Network\n\n private batchedVelcroDiscovery: Function\n\n private batchedGecko: Function\n\n private deploylessTokens: Deployless\n\n private deploylessNfts: Deployless\n\n constructor(\n fetch: Fetch,\n provider: Provider | JsonRpcProvider,\n network: Network,\n velcroUrl?: string\n ) {\n this.batchedVelcroDiscovery = batcher(\n fetch,\n (queue) => {\n const baseCurrencies = [...new Set(queue.map((x) => x.data.baseCurrency))]\n return baseCurrencies.map((baseCurrency) => {\n const queueSegment = queue.filter((x) => x.data.baseCurrency === baseCurrency)\n const url = `${velcroUrl}/multi-hints?networks=${queueSegment\n .map((x) => x.data.networkId)\n .join(',')}&accounts=${queueSegment\n .map((x) => x.data.accountAddr)\n .join(',')}&baseCurrency=${baseCurrency}`\n return { queueSegment, url }\n })\n },\n {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Velcro discovery timed out on ${network.id}`\n }\n )\n this.batchedGecko = batcher(fetch, geckoRequestBatcher, {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Cena request timed out on ${network.id}`\n })\n this.network = network\n this.deploylessTokens = fromDescriptor(provider, BalanceGetter, !network.rpcNoStateOverride)\n this.deploylessNfts = fromDescriptor(provider, NFTGetter, !network.rpcNoStateOverride)\n }\n\n async get(accountAddr: string, opts: Partial = {}): Promise {\n const errors: PortfolioLibGetResult['errors'] = []\n const localOpts = { ...defaultOptions, ...opts }\n const disableAutoDiscovery = localOpts.disableAutoDiscovery || false\n const { baseCurrency } = localOpts\n if (localOpts.simulation && localOpts.simulation.account.addr !== accountAddr)\n throw new Error('wrong account passed')\n\n // Get hints (addresses to check on-chain) via Velcro\n const start = Date.now()\n const networkId = this.network.id\n\n // Make sure portfolio lib still works, even in the case Velcro discovery fails.\n // Because of this, we fall back to Velcro default response.\n let hints: Hints = getEmptyHints()\n let hintsFromExternalAPI: ExternalHintsAPIResponse | null = null\n\n try {\n // if the network doesn't have a relayer, velcro will not work\n // but we should not record an error if such is the case\n if (this.network.hasRelayer && !disableAutoDiscovery) {\n hintsFromExternalAPI = await this.batchedVelcroDiscovery({\n networkId,\n accountAddr,\n baseCurrency\n })\n\n if (hintsFromExternalAPI) {\n hintsFromExternalAPI.lastUpdate = Date.now()\n hints = stripExternalHintsAPIResponse(hintsFromExternalAPI) as Hints\n }\n }\n } catch (error: any) {\n const errorMesssage = `Failed to fetch hints from Velcro for networkId (${networkId}): ${error.message}`\n if (localOpts.previousHintsFromExternalAPI) {\n hints = { ...localOpts.previousHintsFromExternalAPI }\n const TEN_MINUTES = 10 * 60 * 1000\n const lastUpdate = localOpts.previousHintsFromExternalAPI.lastUpdate\n const isLastUpdateTooOld = Date.now() - lastUpdate > TEN_MINUTES\n\n errors.push({\n name: isLastUpdateTooOld\n ? PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError\n : PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError,\n message: errorMesssage,\n level: 'critical'\n })\n } else {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError,\n message: errorMesssage,\n level: 'silent'\n })\n }\n\n // It's important for DX to see this error\n // eslint-disable-next-line no-console\n console.error(errorMesssage)\n }\n\n // Please note 2 things:\n // 1. Velcro hints data takes advantage over previous hints because, in most cases, Velcro data is more up-to-date than the previously cached hints.\n // 2. There is only one use-case where the previous hints data is more recent, and that is when we find an NFT token via a pending simulation.\n // In order to support it, we have to apply a complex deep merging algorithm (which may become problematic if the Velcro API changes)\n // and also have to introduce an algorithm for self-cleaning outdated/previous NFT tokens.\n // However, we have chosen to keep it as simple as possible and disregard this rare case.\n if (localOpts.additionalErc721Hints) {\n hints.erc721s = { ...localOpts.additionalErc721Hints, ...hints.erc721s }\n }\n\n if (localOpts.additionalErc20Hints) {\n hints.erc20s = [...hints.erc20s, ...localOpts.additionalErc20Hints]\n }\n\n if (localOpts.fetchPinned) {\n hints.erc20s = [...hints.erc20s, ...PINNED_TOKENS.map((x) => x.address)]\n }\n\n // add the fee tokens\n hints.erc20s = [\n ...hints.erc20s,\n ...gasTankFeeTokens.filter((x) => x.networkId === this.network.id).map((x) => x.address)\n ]\n\n const checksummedErc20Hints = hints.erc20s\n .map((address) => {\n try {\n // getAddress may throw an error. This will break the portfolio\n // if the error isn't caught\n return getAddress(address)\n } catch {\n return null\n }\n })\n .filter(Boolean) as string[]\n\n // Remove duplicates and always add ZeroAddress\n hints.erc20s = [...new Set(checksummedErc20Hints.concat(ZeroAddress))]\n\n // This also allows getting prices, this is used for more exotic tokens that cannot be retrieved via Coingecko\n const priceCache: PriceCache = localOpts.priceCache || new Map()\n for (const addr in hintsFromExternalAPI?.prices || {}) {\n const priceHint = hintsFromExternalAPI?.prices[addr]\n // eslint-disable-next-line no-continue\n if (!priceHint) continue\n // @TODO consider validating the external response here, before doing the .set; or validating the whole velcro response\n priceCache.set(addr, [start, Array.isArray(priceHint) ? priceHint : [priceHint]])\n }\n const discoveryDone = Date.now()\n\n // .isLimitedAt24kbData should be the same for both instances; @TODO more elegant check?\n const limits: LimitsOptions = this.deploylessTokens.isLimitedAt24kbData\n ? LIMITS.deploylessProxyMode\n : LIMITS.deploylessStateOverrideMode\n const collectionsHints = Object.entries(hints.erc721s)\n const [tokensWithErr, collectionsWithErr] = await Promise.all([\n flattenResults(\n paginate(hints.erc20s, limits.erc20).map((page) =>\n getTokens(this.network, this.deploylessTokens, localOpts, accountAddr, page)\n )\n ),\n flattenResults(\n paginate(collectionsHints, limits.erc721).map((page) =>\n getNFTs(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits)\n )\n )\n ])\n\n const [tokensWithErrResult, metaData] = tokensWithErr\n const { blockNumber, beforeNonce, afterNonce } = metaData as {\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n }\n const [collectionsWithErrResult] = collectionsWithErr\n\n // Re-map/filter into our format\n const getPriceFromCache = (address: string) => {\n const cached = priceCache.get(address)\n if (!cached) return null\n const [timestamp, entry] = cached\n const eligible = entry.filter((x) => x.baseCurrency === baseCurrency)\n // by using `start` instead of `Date.now()`, we make sure that prices updated from Velcro will not be updated again\n // even if priceRecency is 0\n if (start - timestamp <= localOpts.priceRecency! && eligible.length) return eligible\n return null\n }\n\n const tokenFilter = ([error, result]: [TokenError, TokenResult]): boolean =>\n error === '0x' && !!result.symbol\n\n const tokensWithoutPrices = tokensWithErrResult\n .filter((_tokensWithErrResult: [TokenError, TokenResult]) =>\n tokenFilter(_tokensWithErrResult)\n )\n .map(([, result]: [any, TokenResult]) => result)\n\n const unfilteredCollections = collectionsWithErrResult.map(([error, x], i) => {\n const address = collectionsHints[i][0] as unknown as string\n return [\n error,\n {\n ...x,\n address,\n priceIn: getPriceFromCache(address) || []\n }\n ] as [string, CollectionResult]\n })\n\n const collections = unfilteredCollections\n .filter((preFilterCollection) => tokenFilter(preFilterCollection))\n .map(([, collection]) => collection)\n\n const oracleCallDone = Date.now()\n\n // Update prices and set the priceIn for each token by reference,\n // updating the final tokens array as a result\n const tokensWithPrices: TokenResult[] = await Promise.all(\n tokensWithoutPrices.map(async (token: { address: string }) => {\n let priceIn: TokenResult['priceIn'] = []\n const cachedPriceIn = getPriceFromCache(token.address)\n\n if (cachedPriceIn) {\n priceIn = cachedPriceIn\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n if (!this.network.platformId) {\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n try {\n const priceData = await this.batchedGecko({\n ...token,\n network: this.network,\n baseCurrency,\n // this is what to look for in the coingecko response object\n responseIdentifier: geckoResponseIdentifier(token.address, this.network)\n })\n\n priceIn = Object.entries(priceData || {}).map(([baseCurr, price]) => ({\n baseCurrency: baseCurr,\n price: price as number\n }))\n if (priceIn.length) priceCache.set(token.address, [Date.now(), priceIn])\n } catch (error: any) {\n const errorMessage = error?.message || 'Unknown error'\n priceIn = []\n\n // Avoid duplicate errors, because this.bachedGecko is called for each token and if\n // there is an error it will most likely be the same for all tokens\n if (\n !errors.find(\n (x) =>\n x.name === PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage\n )\n ) {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError,\n message: errorMessage,\n level: 'warning'\n })\n }\n }\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n })\n )\n\n const priceUpdateDone = Date.now()\n\n return {\n hintsFromExternalAPI: stripExternalHintsAPIResponse(hintsFromExternalAPI),\n errors,\n updateStarted: start,\n discoveryTime: discoveryDone - start,\n oracleCallTime: oracleCallDone - discoveryDone,\n priceUpdateTime: priceUpdateDone - oracleCallDone,\n priceCache,\n tokens: tokensWithPrices,\n feeTokens: tokensWithPrices.filter((t) => {\n // return the native token\n if (\n t.address === ZeroAddress &&\n t.networkId.toLowerCase() === this.network.id.toLowerCase()\n )\n return true\n\n return gasTankFeeTokens.find(\n (gasTankT) =>\n gasTankT.address.toLowerCase() === t.address.toLowerCase() &&\n gasTankT.networkId.toLowerCase() === t.networkId.toLowerCase()\n )\n }),\n beforeNonce,\n afterNonce,\n blockNumber,\n tokenErrors: tokensWithErrResult\n .filter(([error, result]: [string, TokenResult]) => error !== '0x' || result.symbol === '')\n .map(([error, result]: [string, TokenResult]) => ({ error, address: result.address })),\n collections\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable guard-for-in */\n\nimport { getAddress, JsonRpcProvider, Provider, ZeroAddress } from 'ethers'\n\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { Deployless, fromDescriptor } from '../deployless/deployless'\nimport batcher from './batcher'\nimport { geckoRequestBatcher, geckoResponseIdentifier } from './gecko'\nimport { getNFTs, getTokens } from './getOnchainBalances'\nimport { stripExternalHintsAPIResponse } from './helpers'\nimport {\n CollectionResult,\n ExternalHintsAPIResponse,\n GetOptions,\n Hints,\n Limits,\n LimitsOptions,\n PortfolioLibGetResult,\n PriceCache,\n TokenError,\n TokenResult\n} from './interfaces'\nimport { flattenResults, paginate } from './pagination'\n\nexport const LIMITS: Limits = {\n // we have to be conservative with erc721Tokens because if we pass 30x20 (worst case) tokenIds, that's 30x20 extra words which is 19kb\n // proxy mode input is limited to 24kb\n deploylessProxyMode: { erc20: 100, erc721: 30, erc721TokensInput: 20, erc721Tokens: 50 },\n // theoretical capacity is 1666/450\n deploylessStateOverrideMode: {\n erc20: 350,\n erc721: 70,\n erc721TokensInput: 70,\n erc721Tokens: 70\n }\n}\n\nexport const PORTFOLIO_LIB_ERROR_NAMES = {\n /** External hints API (Velcro) request failed but fallback is sufficient */\n NonCriticalApiHintsError: 'NonCriticalApiHintsError',\n /** External API (Velcro) hints are older than X minutes */\n StaleApiHintsError: 'StaleApiHintsError',\n /** No external API (Velcro) hints are available- the request failed without fallback */\n NoApiHintsError: 'NoApiHintsError',\n /** One or more cena request has failed */\n PriceFetchError: 'PriceFetchError'\n}\n\nexport const getEmptyHints = (): Hints => ({\n erc20s: [],\n erc721s: {}\n})\n\nconst defaultOptions: GetOptions = {\n baseCurrency: 'usd',\n blockTag: 'latest',\n priceRecency: 0,\n previousHintsFromExternalAPI: null,\n fetchPinned: true,\n isEOA: false\n}\n\nexport class Portfolio {\n network: Network\n\n private batchedVelcroDiscovery: Function\n\n private batchedGecko: Function\n\n private deploylessTokens: Deployless\n\n private deploylessNfts: Deployless\n\n constructor(\n fetch: Fetch,\n provider: Provider | JsonRpcProvider,\n network: Network,\n velcroUrl?: string\n ) {\n this.batchedVelcroDiscovery = batcher(\n fetch,\n (queue) => {\n const baseCurrencies = [...new Set(queue.map((x) => x.data.baseCurrency))]\n return baseCurrencies.map((baseCurrency) => {\n const queueSegment = queue.filter((x) => x.data.baseCurrency === baseCurrency)\n const url = `${velcroUrl}/multi-hints?networks=${queueSegment\n .map((x) => x.data.networkId)\n .join(',')}&accounts=${queueSegment\n .map((x) => x.data.accountAddr)\n .join(',')}&baseCurrency=${baseCurrency}`\n return { queueSegment, url }\n })\n },\n {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Velcro discovery timed out on ${network.id}`\n }\n )\n this.batchedGecko = batcher(fetch, geckoRequestBatcher, {\n timeoutAfter: 3000,\n timeoutErrorMessage: `Cena request timed out on ${network.id}`\n })\n this.network = network\n this.deploylessTokens = fromDescriptor(provider, BalanceGetter, !network.rpcNoStateOverride)\n this.deploylessNfts = fromDescriptor(provider, NFTGetter, !network.rpcNoStateOverride)\n }\n\n async get(accountAddr: string, opts: Partial = {}): Promise {\n const errors: PortfolioLibGetResult['errors'] = []\n const localOpts = { ...defaultOptions, ...opts }\n const disableAutoDiscovery = localOpts.disableAutoDiscovery || false\n const { baseCurrency } = localOpts\n if (localOpts.simulation && localOpts.simulation.account.addr !== accountAddr)\n throw new Error('wrong account passed')\n\n // Get hints (addresses to check on-chain) via Velcro\n const start = Date.now()\n const networkId = this.network.id\n\n // Make sure portfolio lib still works, even in the case Velcro discovery fails.\n // Because of this, we fall back to Velcro default response.\n let hints: Hints = getEmptyHints()\n let hintsFromExternalAPI: ExternalHintsAPIResponse | null = null\n\n try {\n // if the network doesn't have a relayer, velcro will not work\n // but we should not record an error if such is the case\n if (this.network.hasRelayer && !disableAutoDiscovery) {\n hintsFromExternalAPI = await this.batchedVelcroDiscovery({\n networkId,\n accountAddr,\n baseCurrency\n })\n\n if (hintsFromExternalAPI) {\n hintsFromExternalAPI.lastUpdate = Date.now()\n hints = stripExternalHintsAPIResponse(hintsFromExternalAPI) as Hints\n }\n }\n } catch (error: any) {\n const errorMesssage = `Failed to fetch hints from Velcro for networkId (${networkId}): ${error.message}`\n if (localOpts.previousHintsFromExternalAPI) {\n hints = { ...localOpts.previousHintsFromExternalAPI }\n const TEN_MINUTES = 10 * 60 * 1000\n const lastUpdate = localOpts.previousHintsFromExternalAPI.lastUpdate\n const isLastUpdateTooOld = Date.now() - lastUpdate > TEN_MINUTES\n\n errors.push({\n name: isLastUpdateTooOld\n ? PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError\n : PORTFOLIO_LIB_ERROR_NAMES.NonCriticalApiHintsError,\n message: errorMesssage,\n level: 'critical'\n })\n } else {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError,\n message: errorMesssage,\n level: 'silent'\n })\n }\n\n // It's important for DX to see this error\n // eslint-disable-next-line no-console\n console.error(errorMesssage)\n }\n\n // Please note 2 things:\n // 1. Velcro hints data takes advantage over previous hints because, in most cases, Velcro data is more up-to-date than the previously cached hints.\n // 2. There is only one use-case where the previous hints data is more recent, and that is when we find an NFT token via a pending simulation.\n // In order to support it, we have to apply a complex deep merging algorithm (which may become problematic if the Velcro API changes)\n // and also have to introduce an algorithm for self-cleaning outdated/previous NFT tokens.\n // However, we have chosen to keep it as simple as possible and disregard this rare case.\n if (localOpts.additionalErc721Hints) {\n hints.erc721s = { ...localOpts.additionalErc721Hints, ...hints.erc721s }\n }\n\n if (localOpts.additionalErc20Hints) {\n hints.erc20s = [...hints.erc20s, ...localOpts.additionalErc20Hints]\n }\n\n if (localOpts.fetchPinned) {\n hints.erc20s = [...hints.erc20s, ...PINNED_TOKENS.map((x) => x.address)]\n }\n\n // add the fee tokens\n hints.erc20s = [\n ...hints.erc20s,\n ...gasTankFeeTokens.filter((x) => x.networkId === this.network.id).map((x) => x.address)\n ]\n\n const checksummedErc20Hints = hints.erc20s\n .map((address) => {\n try {\n // getAddress may throw an error. This will break the portfolio\n // if the error isn't caught\n return getAddress(address)\n } catch {\n return null\n }\n })\n .filter(Boolean) as string[]\n\n // Remove duplicates and always add ZeroAddress\n hints.erc20s = [...new Set(checksummedErc20Hints.concat(ZeroAddress))]\n\n // This also allows getting prices, this is used for more exotic tokens that cannot be retrieved via Coingecko\n const priceCache: PriceCache = localOpts.priceCache || new Map()\n for (const addr in hintsFromExternalAPI?.prices || {}) {\n const priceHint = hintsFromExternalAPI?.prices[addr]\n // eslint-disable-next-line no-continue\n if (!priceHint) continue\n // @TODO consider validating the external response here, before doing the .set; or validating the whole velcro response\n priceCache.set(addr, [start, Array.isArray(priceHint) ? priceHint : [priceHint]])\n }\n const discoveryDone = Date.now()\n\n // .isLimitedAt24kbData should be the same for both instances; @TODO more elegant check?\n const limits: LimitsOptions = this.deploylessTokens.isLimitedAt24kbData\n ? LIMITS.deploylessProxyMode\n : LIMITS.deploylessStateOverrideMode\n const collectionsHints = Object.entries(hints.erc721s)\n const [tokensWithErr, collectionsWithErr] = await Promise.all([\n flattenResults(\n paginate(hints.erc20s, limits.erc20).map((page) =>\n getTokens(this.network, this.deploylessTokens, localOpts, accountAddr, page)\n )\n ),\n flattenResults(\n paginate(collectionsHints, limits.erc721).map((page) =>\n getNFTs(this.network, this.deploylessNfts, localOpts, accountAddr, page, limits)\n )\n )\n ])\n\n const [tokensWithErrResult, metaData] = tokensWithErr\n const { blockNumber, beforeNonce, afterNonce } = metaData as {\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n }\n const [collectionsWithErrResult] = collectionsWithErr\n\n // Re-map/filter into our format\n const getPriceFromCache = (address: string) => {\n const cached = priceCache.get(address)\n if (!cached) return null\n const [timestamp, entry] = cached\n const eligible = entry.filter((x) => x.baseCurrency === baseCurrency)\n // by using `start` instead of `Date.now()`, we make sure that prices updated from Velcro will not be updated again\n // even if priceRecency is 0\n if (start - timestamp <= localOpts.priceRecency! && eligible.length) return eligible\n return null\n }\n\n const tokenFilter = ([error, result]: [TokenError, TokenResult]): boolean =>\n error === '0x' && !!result.symbol\n\n const tokensWithoutPrices = tokensWithErrResult\n .filter((_tokensWithErrResult: [TokenError, TokenResult]) =>\n tokenFilter(_tokensWithErrResult)\n )\n .map(([, result]: [any, TokenResult]) => result)\n\n const unfilteredCollections = collectionsWithErrResult.map(([error, x], i) => {\n const address = collectionsHints[i][0] as unknown as string\n return [\n error,\n {\n ...x,\n address,\n priceIn: getPriceFromCache(address) || []\n }\n ] as [string, CollectionResult]\n })\n\n const collections = unfilteredCollections\n .filter((preFilterCollection) => tokenFilter(preFilterCollection))\n .map(([, collection]) => collection)\n\n const oracleCallDone = Date.now()\n\n // Update prices and set the priceIn for each token by reference,\n // updating the final tokens array as a result\n const tokensWithPrices: TokenResult[] = await Promise.all(\n tokensWithoutPrices.map(async (token: { address: string }) => {\n let priceIn: TokenResult['priceIn'] = []\n const cachedPriceIn = getPriceFromCache(token.address)\n\n if (cachedPriceIn) {\n priceIn = cachedPriceIn\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n if (!this.network.platformId) {\n return {\n ...(token as TokenResult),\n priceIn\n }\n }\n\n try {\n const priceData = await this.batchedGecko({\n ...token,\n network: this.network,\n baseCurrency,\n // this is what to look for in the coingecko response object\n responseIdentifier: geckoResponseIdentifier(token.address, this.network)\n })\n\n priceIn = Object.entries(priceData || {}).map(([baseCurr, price]) => ({\n baseCurrency: baseCurr,\n price: price as number\n }))\n if (priceIn.length) priceCache.set(token.address, [Date.now(), priceIn])\n } catch (error: any) {\n const errorMessage = error?.message || 'Unknown error'\n priceIn = []\n\n // Avoid duplicate errors, because this.bachedGecko is called for each token and if\n // there is an error it will most likely be the same for all tokens\n if (\n !errors.find(\n (x) =>\n x.name === PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError && x.message === errorMessage\n )\n ) {\n errors.push({\n name: PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError,\n message: errorMessage,\n level: 'warning'\n })\n }\n }\n\n return {\n ...(token as TokenResult),\n priceIn\n }\n })\n )\n\n const priceUpdateDone = Date.now()\n\n return {\n hintsFromExternalAPI: stripExternalHintsAPIResponse(hintsFromExternalAPI),\n errors,\n updateStarted: start,\n discoveryTime: discoveryDone - start,\n oracleCallTime: oracleCallDone - discoveryDone,\n priceUpdateTime: priceUpdateDone - oracleCallDone,\n priceCache,\n tokens: tokensWithPrices,\n feeTokens: tokensWithPrices.filter((t) => {\n // return the native token\n if (\n t.address === ZeroAddress &&\n t.networkId.toLowerCase() === this.network.id.toLowerCase()\n )\n return true\n\n return gasTankFeeTokens.find(\n (gasTankT) =>\n gasTankT.address.toLowerCase() === t.address.toLowerCase() &&\n gasTankT.networkId.toLowerCase() === t.networkId.toLowerCase()\n )\n }),\n beforeNonce,\n afterNonce,\n blockNumber,\n tokenErrors: tokensWithErrResult\n .filter(([error, result]: [string, TokenResult]) => error !== '0x' || result.symbol === '')\n .map(([error, result]: [string, TokenResult]) => ({ error, address: result.address })),\n collections\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.js b/dist/src/libs/proxyDeploy/bytecode.js index 89d0c85dc..0b0319879 100644 --- a/dist/src/libs/proxyDeploy/bytecode.js +++ b/dist/src/libs/proxyDeploy/bytecode.js @@ -1,20 +1,25 @@ -import { PROXY_AMBIRE_4337_ACCOUNT, PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'; -import { getRpcProvider } from '../../services/provider'; -import { getProxyDeployBytecode, getStorageSlotsFromArtifact } from './deploy'; -export async function getBytecode(priLevels) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.get4437Bytecode = exports.getBytecode = void 0; +const deploy_1 = require("../../consts/deploy"); +const provider_1 = require("../../services/provider"); +const deploy_2 = require("./deploy"); +async function getBytecode(priLevels) { // get the bytecode and deploy it - return getProxyDeployBytecode(PROXY_AMBIRE_ACCOUNT, priLevels, { - ...getStorageSlotsFromArtifact(null) + return (0, deploy_2.getProxyDeployBytecode)(deploy_1.PROXY_AMBIRE_ACCOUNT, priLevels, { + ...(0, deploy_2.getStorageSlotsFromArtifact)(null) }); } -export async function get4437Bytecode(network, priLevels) { - const provider = getRpcProvider(network.rpcUrls, network.chainId); - const code = await provider.getCode(PROXY_AMBIRE_4337_ACCOUNT); +exports.getBytecode = getBytecode; +async function get4437Bytecode(network, priLevels) { + const provider = (0, provider_1.getRpcProvider)(network.rpcUrls, network.chainId); + const code = await provider.getCode(deploy_1.PROXY_AMBIRE_4337_ACCOUNT); if (code === '0x') throw new Error('No proxy ambire account mined for the specified network'); // get the bytecode and deploy it - return getProxyDeployBytecode(PROXY_AMBIRE_4337_ACCOUNT, priLevels, { - ...getStorageSlotsFromArtifact(null) + return (0, deploy_2.getProxyDeployBytecode)(deploy_1.PROXY_AMBIRE_4337_ACCOUNT, priLevels, { + ...(0, deploy_2.getStorageSlotsFromArtifact)(null) }); } +exports.get4437Bytecode = get4437Bytecode; //# sourceMappingURL=bytecode.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/bytecode.js.map b/dist/src/libs/proxyDeploy/bytecode.js.map index bb75a0e44..03222d839 100644 --- a/dist/src/libs/proxyDeploy/bytecode.js.map +++ b/dist/src/libs/proxyDeploy/bytecode.js.map @@ -1 +1 @@ -{"version":3,"file":"bytecode.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/bytecode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAErF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAc,MAAM,UAAU,CAAA;AAE1F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAuB;IACvD,iCAAiC;IACjC,OAAO,sBAAsB,CAAC,oBAAoB,EAAE,SAAS,EAAE;QAC7D,GAAG,2BAA2B,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,SAAuB;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAE7F,iCAAiC;IACjC,OAAO,sBAAsB,CAAC,yBAAyB,EAAE,SAAS,EAAE;QAClE,GAAG,2BAA2B,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { PROXY_AMBIRE_4337_ACCOUNT, PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getProxyDeployBytecode, getStorageSlotsFromArtifact, PrivLevels } from './deploy'\n\nexport async function getBytecode(priLevels: PrivLevels[]): Promise {\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\nexport async function get4437Bytecode(network: Network, priLevels: PrivLevels[]): Promise {\n const provider = getRpcProvider(network.rpcUrls, network.chainId)\n const code = await provider.getCode(PROXY_AMBIRE_4337_ACCOUNT)\n if (code === '0x') throw new Error('No proxy ambire account mined for the specified network')\n\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_4337_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"bytecode.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/bytecode.ts"],"names":[],"mappings":";;;AAAA,gDAAqF;AAErF,sDAAwD;AACxD,qCAA0F;AAEnF,KAAK,UAAU,WAAW,CAAC,SAAuB;IACvD,iCAAiC;IACjC,OAAO,IAAA,+BAAsB,EAAC,6BAAoB,EAAE,SAAS,EAAE;QAC7D,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AALD,kCAKC;AACM,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,SAAuB;IAC7E,MAAM,QAAQ,GAAG,IAAA,yBAAc,EAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,kCAAyB,CAAC,CAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAE7F,iCAAiC;IACjC,OAAO,IAAA,+BAAsB,EAAC,kCAAyB,EAAE,SAAS,EAAE;QAClE,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC;AATD,0CASC","sourcesContent":["import { PROXY_AMBIRE_4337_ACCOUNT, PROXY_AMBIRE_ACCOUNT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { getRpcProvider } from '../../services/provider'\nimport { getProxyDeployBytecode, getStorageSlotsFromArtifact, PrivLevels } from './deploy'\n\nexport async function getBytecode(priLevels: PrivLevels[]): Promise {\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\nexport async function get4437Bytecode(network: Network, priLevels: PrivLevels[]): Promise {\n const provider = getRpcProvider(network.rpcUrls, network.chainId)\n const code = await provider.getCode(PROXY_AMBIRE_4337_ACCOUNT)\n if (code === '0x') throw new Error('No proxy ambire account mined for the specified network')\n\n // get the bytecode and deploy it\n return getProxyDeployBytecode(PROXY_AMBIRE_4337_ACCOUNT, priLevels, {\n ...getStorageSlotsFromArtifact(null)\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js b/dist/src/libs/proxyDeploy/deploy.js index 5ed134b91..a722aa8d5 100644 --- a/dist/src/libs/proxyDeploy/deploy.js +++ b/dist/src/libs/proxyDeploy/deploy.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getStorageSlotsFromArtifact = exports.getProxyDeployBytecode = exports.privSlot = void 0; const abi = require('ethereumjs-abi'); const keccak256 = require('js-sha3').keccak256; // @TODO: fix the any @@ -12,10 +15,11 @@ function evmPush(data) { return Buffer.concat([opCodeBuf, data]); } // @TODO: fix the any -export function privSlot(slotNumber, keyType, key, valueType) { +function privSlot(slotNumber, keyType, key, valueType) { const buf = abi.rawEncode([keyType, valueType], [key, slotNumber]); return keccak256(buf); } +exports.privSlot = privSlot; // @TODO: fix the any function sstoreCode(slotNumber, keyType, key, valueType, valueBuf) { // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless @@ -26,7 +30,7 @@ function sstoreCode(slotNumber, keyType, key, valueType, valueBuf) { Buffer.from('55', 'hex') ]); } -export function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlot: 0 }) { +function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlot: 0 }) { const slotNumber = opts.privSlot ?? 0; if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels'); @@ -44,7 +48,8 @@ export function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { throw new Error('invalid address'); return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(masterAddrBuf).toString('hex')}5af43d82803e903d91602b57fd5bf3`; } -export function getStorageSlotsFromArtifact(buildInfo) { +exports.getProxyDeployBytecode = getProxyDeployBytecode; +function getStorageSlotsFromArtifact(buildInfo) { if (!buildInfo) return { privSlot: 0 }; const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']; @@ -55,4 +60,5 @@ export function getStorageSlotsFromArtifact(buildInfo) { const slotNumber = storageVariableNodes.findIndex((x) => x.name === 'privileges'); return { privSlot: slotNumber }; } +exports.getStorageSlotsFromArtifact = getStorageSlotsFromArtifact; //# sourceMappingURL=deploy.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js.map b/dist/src/libs/proxyDeploy/deploy.js.map index a5ac85102..f85b4e2bb 100644 --- a/dist/src/libs/proxyDeploy/deploy.js.map +++ b/dist/src/libs/proxyDeploy/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["const abi = require('ethereumjs-abi')\nconst keccak256 = require('js-sha3').keccak256\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const buf = abi.rawEncode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["const abi = require('ethereumjs-abi')\nconst keccak256 = require('js-sha3').keccak256\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const buf = abi.rawEncode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js index 87956f3e0..7e6621160 100644 --- a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js @@ -1,5 +1,9 @@ -import { getCreate2Address, keccak256, toBeHex } from 'ethers'; -export function getAmbireAccountAddress(factoryAddress, bytecode) { - return getCreate2Address(factoryAddress, toBeHex(0, 32), keccak256(bytecode)); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAmbireAccountAddress = void 0; +const ethers_1 = require("ethers"); +function getAmbireAccountAddress(factoryAddress, bytecode) { + return (0, ethers_1.getCreate2Address)(factoryAddress, (0, ethers_1.toBeHex)(0, 32), (0, ethers_1.keccak256)(bytecode)); } +exports.getAmbireAccountAddress = getAmbireAccountAddress; //# sourceMappingURL=getAmbireAddressTwo.js.map \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map index 822742604..8e72db197 100644 --- a/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map +++ b/dist/src/libs/proxyDeploy/getAmbireAddressTwo.js.map @@ -1 +1 @@ -{"version":3,"file":"getAmbireAddressTwo.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/getAmbireAddressTwo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAE9D,MAAM,UAAU,uBAAuB,CAAC,cAAsB,EAAE,QAAgB;IAC9E,OAAO,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC/E,CAAC","sourcesContent":["import { getCreate2Address, keccak256, toBeHex } from 'ethers'\n\nexport function getAmbireAccountAddress(factoryAddress: string, bytecode: string) {\n return getCreate2Address(factoryAddress, toBeHex(0, 32), keccak256(bytecode))\n}\n"]} \ No newline at end of file +{"version":3,"file":"getAmbireAddressTwo.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/getAmbireAddressTwo.ts"],"names":[],"mappings":";;;AAAA,mCAA8D;AAE9D,SAAgB,uBAAuB,CAAC,cAAsB,EAAE,QAAgB;IAC9E,OAAO,IAAA,0BAAiB,EAAC,cAAc,EAAE,IAAA,gBAAO,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC,CAAA;AAC/E,CAAC;AAFD,0DAEC","sourcesContent":["import { getCreate2Address, keccak256, toBeHex } from 'ethers'\n\nexport function getAmbireAccountAddress(factoryAddress: string, bytecode: string) {\n return getCreate2Address(factoryAddress, toBeHex(0, 32), keccak256(bytecode))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.js b/dist/src/libs/relayerCall/relayerCall.js index beac9d263..ff2b80d4f 100644 --- a/dist/src/libs/relayerCall/relayerCall.js +++ b/dist/src/libs/relayerCall/relayerCall.js @@ -1,5 +1,8 @@ -import { parse, stringify } from '../richJson/richJson'; -export class RelayerError extends Error { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.relayerCall = exports.relayerCallUncaught = exports.RELAYER_DOWN_MESSAGE = exports.RelayerError = void 0; +const richJson_1 = require("../richJson/richJson"); +class RelayerError extends Error { input; output; constructor(message, input, output) { @@ -8,8 +11,9 @@ export class RelayerError extends Error { this.output = output; } } -export const RELAYER_DOWN_MESSAGE = 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'; -export async function relayerCallUncaught(url, fetch, method = 'GET', body = null, headers = null) { +exports.RelayerError = RelayerError; +exports.RELAYER_DOWN_MESSAGE = 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'; +async function relayerCallUncaught(url, fetch, method = 'GET', body = null, headers = null) { if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method)) return { success: false, message: 'bad method' }; if (!url) @@ -22,12 +26,12 @@ export async function relayerCallUncaught(url, fetch, method = 'GET', body = nul 'Content-Type': 'application/json', ...headers }, - body: body ? stringify(body) : undefined + body: body ? (0, richJson_1.stringify)(body) : undefined }); const text = await res.text(); const isStatusOk = res.status < 300 && res.status >= 200; try { - const json = parse(text); + const json = (0, richJson_1.parse)(text); if (!json.hasOwnProperty('success')) { return { success: isStatusOk, ...json, status: res.status }; } @@ -38,11 +42,12 @@ export async function relayerCallUncaught(url, fetch, method = 'GET', body = nul success: false, data: text, status: res.status, - message: RELAYER_DOWN_MESSAGE + message: exports.RELAYER_DOWN_MESSAGE }; } } -export async function relayerCall(path, method = 'GET', body = null, headers = null) { +exports.relayerCallUncaught = relayerCallUncaught; +async function relayerCall(path, method = 'GET', body = null, headers = null) { const res = await relayerCallUncaught(this.url + path, this.fetch, method, body, headers); if (!res.success) { const firstError = res.errorState && res.errorState.length ? res.errorState[0].message : res.message; @@ -50,4 +55,5 @@ export async function relayerCall(path, method = 'GET', body = null, headers = n } return res; } +exports.relayerCall = relayerCall; //# sourceMappingURL=relayerCall.js.map \ No newline at end of file diff --git a/dist/src/libs/relayerCall/relayerCall.js.map b/dist/src/libs/relayerCall/relayerCall.js.map index ad68caff3..6bade4de7 100644 --- a/dist/src/libs/relayerCall/relayerCall.js.map +++ b/dist/src/libs/relayerCall/relayerCall.js.map @@ -1 +1 @@ -{"version":3,"file":"relayerCall.js","sourceRoot":"","sources":["../../../../src/libs/relayerCall/relayerCall.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-prototype-builtins */\nimport { Fetch } from '../../interfaces/fetch'\nimport { parse, stringify } from '../richJson/richJson'\n\nexport class RelayerError extends Error {\n public input: any\n\n public output: any\n\n constructor(message: string, input: any, output: any) {\n super(message)\n this.input = input\n this.output = output\n }\n}\nexport const RELAYER_DOWN_MESSAGE =\n 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'\n\nexport async function relayerCallUncaught(\n url: string,\n fetch: Fetch,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n) {\n if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method))\n return { success: false, message: 'bad method' }\n if (!url) return { success: false, message: 'no url or path' }\n if (body && ['GET', 'DELETE', 'HEAD'].includes(method))\n return { success: false, message: 'should not have a body' }\n\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: body ? stringify(body) : undefined\n })\n\n const text = await res.text()\n const isStatusOk = res.status < 300 && res.status >= 200\n try {\n const json = parse(text)\n if (!json.hasOwnProperty('success')) {\n return { success: isStatusOk, ...json, status: res.status }\n }\n return { ...json, success: json.success && isStatusOk, status: res.status }\n } catch (e) {\n return {\n success: false,\n data: text,\n status: res.status,\n message: RELAYER_DOWN_MESSAGE\n }\n }\n}\n\nexport async function relayerCall(\n this: {\n url: string\n fetch: Fetch\n },\n path: string,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n): Promise {\n const res = await relayerCallUncaught(this.url + path, this.fetch, method, body, headers)\n if (!res.success) {\n const firstError =\n res.errorState && res.errorState.length ? res.errorState[0].message : res.message\n throw new RelayerError(firstError, { url: this.url, path, method, body, headers }, { res })\n }\n return res\n}\n"]} \ No newline at end of file +{"version":3,"file":"relayerCall.js","sourceRoot":"","sources":["../../../../src/libs/relayerCall/relayerCall.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-prototype-builtins */\nimport { Fetch } from '../../interfaces/fetch'\nimport { parse, stringify } from '../richJson/richJson'\n\nexport class RelayerError extends Error {\n public input: any\n\n public output: any\n\n constructor(message: string, input: any, output: any) {\n super(message)\n this.input = input\n this.output = output\n }\n}\nexport const RELAYER_DOWN_MESSAGE =\n 'Currently, the Ambire relayer seems to be temporarily down. Please try again a few moments later'\n\nexport async function relayerCallUncaught(\n url: string,\n fetch: Fetch,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n) {\n if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method))\n return { success: false, message: 'bad method' }\n if (!url) return { success: false, message: 'no url or path' }\n if (body && ['GET', 'DELETE', 'HEAD'].includes(method))\n return { success: false, message: 'should not have a body' }\n\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: body ? stringify(body) : undefined\n })\n\n const text = await res.text()\n const isStatusOk = res.status < 300 && res.status >= 200\n try {\n const json = parse(text)\n if (!json.hasOwnProperty('success')) {\n return { success: isStatusOk, ...json, status: res.status }\n }\n return { ...json, success: json.success && isStatusOk, status: res.status }\n } catch (e) {\n return {\n success: false,\n data: text,\n status: res.status,\n message: RELAYER_DOWN_MESSAGE\n }\n }\n}\n\nexport async function relayerCall(\n this: {\n url: string\n fetch: Fetch\n },\n path: string,\n method: string = 'GET',\n body: any = null,\n headers: any = null\n): Promise {\n const res = await relayerCallUncaught(this.url + path, this.fetch, method, body, headers)\n if (!res.success) {\n const firstError =\n res.errorState && res.errorState.length ? res.errorState[0].message : res.message\n throw new RelayerError(firstError, { url: this.url, path, method, body, headers }, { res })\n }\n return res\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.js b/dist/src/libs/richJson/richJson.js index 3ede266ed..157804de0 100644 --- a/dist/src/libs/richJson/richJson.js +++ b/dist/src/libs/richJson/richJson.js @@ -1,3 +1,4 @@ +"use strict"; /** * * richJson lib @@ -13,7 +14,9 @@ * * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well. */ -export function stringify(obj) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = exports.stringify = void 0; +function stringify(obj) { return JSON.stringify(obj, (key, value) => { if (typeof value === 'bigint') { return { $bigint: value.toString() }; @@ -29,7 +32,8 @@ export function stringify(obj) { return value; }); } -export function parse(json) { +exports.stringify = stringify; +function parse(json) { return JSON.parse(json, (key, value) => { if (value?.$bigint) { return BigInt(value.$bigint); @@ -47,4 +51,5 @@ export function parse(json) { return value; }); } +exports.parse = parse; //# sourceMappingURL=richJson.js.map \ No newline at end of file diff --git a/dist/src/libs/richJson/richJson.js.map b/dist/src/libs/richJson/richJson.js.map index 2775ebf60..d7fd10e4f 100644 --- a/dist/src/libs/richJson/richJson.js.map +++ b/dist/src/libs/richJson/richJson.js.map @@ -1 +1 @@ -{"version":3,"file":"richJson.js","sourceRoot":"","sources":["../../../../src/libs/richJson/richJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAA;SACrC;QAED,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,MAAM,KAAK,GAAQ,EAAE,CAAA;YAErB,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,aAAa;gBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACrC,IAAI,KAAK,EAAE,OAAO,EAAE;YAClB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SAC7B;QAED,IAAI,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,IAAI,QAAQ,KAAK,SAAS,EAAE;oBAC1B,aAAa;oBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;iBAClC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n *\n * richJson lib\n *\n * JSON.serialize and JSON.parse don't support BigInt values.\n * To address this limitation, we have created this small library that adds support for BigInt numbers\n * during JSON serialization and parsing.\n *\n * Limitations: The library does not currently support BigInt values in new Map, Set, or Uint8Array.\n * However, extending and adding support can be easily accomplished if needed.\n * @credits: https://dev.to/benlesh/bigint-and-json-stringify-json-parse-2m8p\n *\n *\n * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well.\n */\n\nexport function stringify(obj: any): string {\n return JSON.stringify(obj, (key, value) => {\n if (typeof value === 'bigint') {\n return { $bigint: value.toString() }\n }\n\n if (value instanceof Error) {\n const error: any = {}\n\n Object.getOwnPropertyNames(value).forEach((propName) => {\n // @ts-ignore\n error[propName] = value[propName]\n })\n\n return error\n }\n\n return value\n })\n}\n\nexport function parse(json: string) {\n return JSON.parse(json, (key, value) => {\n if (value?.$bigint) {\n return BigInt(value.$bigint)\n }\n\n if (value?.stack?.startsWith('Error')) {\n const error = new Error(value.message)\n Object.getOwnPropertyNames(value).forEach((propName) => {\n if (propName !== 'message') {\n // @ts-ignore\n error[propName] = value[propName]\n }\n })\n\n return error\n }\n\n return value\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"richJson.js","sourceRoot":"","sources":["../../../../src/libs/richJson/richJson.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,SAAgB,SAAS,CAAC,GAAQ;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAA;SACrC;QAED,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,MAAM,KAAK,GAAQ,EAAE,CAAA;YAErB,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,aAAa;gBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAnBD,8BAmBC;AAED,SAAgB,KAAK,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACrC,IAAI,KAAK,EAAE,OAAO,EAAE;YAClB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SAC7B;QAED,IAAI,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrD,IAAI,QAAQ,KAAK,SAAS,EAAE;oBAC1B,aAAa;oBACb,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;iBAClC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AApBD,sBAoBC","sourcesContent":["/**\n *\n * richJson lib\n *\n * JSON.serialize and JSON.parse don't support BigInt values.\n * To address this limitation, we have created this small library that adds support for BigInt numbers\n * during JSON serialization and parsing.\n *\n * Limitations: The library does not currently support BigInt values in new Map, Set, or Uint8Array.\n * However, extending and adding support can be easily accomplished if needed.\n * @credits: https://dev.to/benlesh/bigint-and-json-stringify-json-parse-2m8p\n *\n *\n * Additionally, JSON.serialize and JSON.parse do not properly serialize the Error object, so we extend that functionality here as well.\n */\n\nexport function stringify(obj: any): string {\n return JSON.stringify(obj, (key, value) => {\n if (typeof value === 'bigint') {\n return { $bigint: value.toString() }\n }\n\n if (value instanceof Error) {\n const error: any = {}\n\n Object.getOwnPropertyNames(value).forEach((propName) => {\n // @ts-ignore\n error[propName] = value[propName]\n })\n\n return error\n }\n\n return value\n })\n}\n\nexport function parse(json: string) {\n return JSON.parse(json, (key, value) => {\n if (value?.$bigint) {\n return BigInt(value.$bigint)\n }\n\n if (value?.stack?.startsWith('Error')) {\n const error = new Error(value.message)\n Object.getOwnPropertyNames(value).forEach((propName) => {\n if (propName !== 'message') {\n // @ts-ignore\n error[propName] = value[propName]\n }\n })\n\n return error\n }\n\n return value\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.js b/dist/src/libs/selectedAccount/errors.js index 75c214529..bdd6d1e8b 100644 --- a/dist/src/libs/selectedAccount/errors.js +++ b/dist/src/libs/selectedAccount/errors.js @@ -1,10 +1,13 @@ -import { DeFiPositionsError } from '../defiPositions/types'; -import { getNetworksWithFailedRPC } from '../networks/networks'; -import { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getNetworksWithDeFiPositionsErrorErrors = exports.getNetworksWithPortfolioErrorErrors = exports.getNetworksWithFailedRPCErrors = void 0; +const types_1 = require("../defiPositions/types"); +const networks_1 = require("../networks/networks"); +const portfolio_1 = require("../portfolio/portfolio"); const TEN_MINUTES = 10 * 60 * 1000; -export const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAssets }) => { +const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAssets }) => { const errors = []; - const networkIds = getNetworksWithFailedRPC({ providers }).filter((networkId) => (Object.keys(networksWithAssets).includes(networkId) && + const networkIds = (0, networks_1.getNetworksWithFailedRPC)({ providers }).filter((networkId) => (Object.keys(networksWithAssets).includes(networkId) && networksWithAssets[networkId] === true) || !Object.keys(networksWithAssets).includes(networkId)); const networksData = networkIds.map((id) => networks.find((n) => n.id === id)); @@ -46,6 +49,7 @@ export const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWi }); return errors; }; +exports.getNetworksWithFailedRPCErrors = getNetworksWithFailedRPCErrors; const addPortfolioError = (errors, networkId, newError) => { const newErrors = [...errors]; const existingError = newErrors.find((error) => error.id === newError); @@ -61,17 +65,17 @@ const addPortfolioError = (errors, networkId, newError) => { title = 'Failed to retrieve the portfolio data'; text = 'Account balance and visible assets may be inaccurate.'; break; - case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError: + case portfolio_1.PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError: title = 'Failed to retrieve prices'; text = 'Account balance and asset prices may be inaccurate.'; type = 'warning'; break; - case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError: + case portfolio_1.PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError: title = 'Automatic asset discovery is temporarily unavailable'; text = 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'; break; - case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError: + case portfolio_1.PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError: title = 'Automatic asset discovery is temporarily unavailable'; text = 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'; @@ -92,7 +96,7 @@ const addPortfolioError = (errors, networkId, newError) => { } return newErrors; }; -export const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountLatest, providers }) => { +const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountLatest, providers }) => { let errors = []; const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => { const portfolioForNetwork = selectedAccountLatest[network]; @@ -143,7 +147,8 @@ export const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountL }; }); }; -export const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState, providers, networksWithPositions }) => { +exports.getNetworksWithPortfolioErrorErrors = getNetworksWithPortfolioErrorErrors; +const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState, providers, networksWithPositions }) => { const isLoading = Object.keys(currentAccountState).some((networkId) => { const networkState = currentAccountState[networkId]; return networkState.isLoading; @@ -171,10 +176,10 @@ export const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccou (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)) return; if (networkState.error) { - if (networkState.error === DeFiPositionsError.AssetPriceError) { + if (networkState.error === types_1.DeFiPositionsError.AssetPriceError) { networkNamesWithAssetPriceCriticalError.push(network.name); } - else if (networkState.error === DeFiPositionsError.CriticalError) { + else if (networkState.error === types_1.DeFiPositionsError.CriticalError) { networkNamesWithUnknownCriticalError.push(network.name); } } @@ -223,4 +228,5 @@ export const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccou } return errors; }; +exports.getNetworksWithDeFiPositionsErrorErrors = getNetworksWithDeFiPositionsErrorErrors; //# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.js.map b/dist/src/libs/selectedAccount/errors.js.map index 9c3ac9d92..16c0570b1 100644 --- a/dist/src/libs/selectedAccount/errors.js.map +++ b/dist/src/libs/selectedAccount/errors.js.map @@ -1 +1 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\n\nconst TEN_MINUTES = 10 * 60 * 1000\n\nexport type Action = {\n label: 'Select'\n actionName: 'select-rpc-url'\n meta: { network: Network }\n}\n\nexport type SelectedAccountBalanceError = {\n id: string\n networkIds: NetworkId[]\n type: 'error' | 'warning'\n title: string\n text?: string\n actions?: Action[]\n}\n\nexport const getNetworksWithFailedRPCErrors = ({\n providers,\n networks,\n networksWithAssets\n}: {\n providers: RPCProviders\n networks: Network[]\n networksWithAssets: AccountAssetsState\n}): SelectedAccountBalanceError[] => {\n const errors: SelectedAccountBalanceError[] = []\n const networkIds = getNetworksWithFailedRPC({ providers }).filter(\n (networkId) =>\n (Object.keys(networksWithAssets).includes(networkId) &&\n networksWithAssets[networkId] === true) ||\n !Object.keys(networksWithAssets).includes(networkId)\n )\n\n const networksData = networkIds.map((id) => networks.find((n: Network) => n.id === id)!)\n\n const allFailed = networksData.length === networks.length\n\n const networksWithMultipleRpcUrls = allFailed\n ? []\n : networksData.filter((n) => n?.rpcUrls?.length > 1)\n\n const networksToGroupInSingleBanner = allFailed\n ? networksData\n : networksData.filter((n) => n?.rpcUrls?.length <= 1)\n\n if (!networksData.length) return errors\n\n networksWithMultipleRpcUrls.forEach((n) => {\n errors.push({\n id: `custom-rpcs-down-${n.id}`,\n networkIds: [n.id],\n type: 'error',\n title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.',\n actions: [\n {\n label: 'Select',\n actionName: 'select-rpc-url',\n meta: { network: n }\n }\n ]\n })\n })\n\n if (!networksToGroupInSingleBanner.length) return errors\n\n errors.push({\n id: 'rpcs-down',\n networkIds: networksToGroupInSingleBanner.map((n) => n.id),\n type: 'error',\n title: `Failed to retrieve network data for ${networksToGroupInSingleBanner\n .map((n) => n.name)\n .join(', ')} (RPC malfunction)`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.'\n })\n\n return errors\n}\n\nconst addPortfolioError = (\n errors: SelectedAccountBalanceError[],\n networkId: NetworkId,\n newError: keyof typeof PORTFOLIO_LIB_ERROR_NAMES | 'portfolio-critical'\n) => {\n const newErrors = [...errors]\n const existingError = newErrors.find((error) => error.id === newError)\n\n if (existingError) {\n existingError.networkIds.push(networkId)\n } else {\n let title = ''\n let text = ''\n let type: 'error' | 'warning' = 'error'\n\n switch (newError) {\n case 'portfolio-critical':\n title = 'Failed to retrieve the portfolio data'\n text = 'Account balance and visible assets may be inaccurate.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError:\n title = 'Failed to retrieve prices'\n text = 'Account balance and asset prices may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'\n type = 'warning'\n break\n default:\n break\n }\n\n if (!title) return newErrors\n\n newErrors.push({\n id: newError,\n networkIds: [networkId],\n type,\n title,\n text\n })\n }\n\n return newErrors\n}\n\nexport const getNetworksWithPortfolioErrorErrors = ({\n networks,\n selectedAccountLatest,\n providers\n}: {\n networks: Network[]\n selectedAccountLatest: SelectedAccountPortfolioState\n providers: RPCProviders\n}): SelectedAccountBalanceError[] => {\n let errors: SelectedAccountBalanceError[] = []\n\n const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n\n return portfolioForNetwork?.isLoading\n })\n\n // Otherwise networks are appended to the banner one by one, which looks weird\n if (portfolioLoading) return []\n\n if (!Object.keys(selectedAccountLatest).length) return []\n\n Object.keys(selectedAccountLatest).forEach((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n const criticalError = portfolioForNetwork?.criticalError\n const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate\n\n // Don't display an error banner if the last successful update was less than 10 minutes ago\n if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES)\n return\n\n if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) return\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n // In case of additional networks don't check the RPC as there isn't one\n if (\n criticalError &&\n (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)\n ) {\n errors = addPortfolioError(errors, network, 'portfolio-critical')\n return\n }\n\n portfolioForNetwork?.errors.forEach((err: any) => {\n errors = addPortfolioError(errors, network, err.name)\n })\n })\n\n return errors.map(({ title, networkIds, ...rest }) => {\n const networkNames = networkIds.reduce((acc, id, index) => {\n let networkName = networks.find((n) => n.id === id)?.name\n const isLast = index === networkIds.length - 1\n const isOnly = networkIds.length === 1\n\n if (id === 'gasTank') networkName = 'Gas Tank'\n else if (id === 'rewards') networkName = 'Rewards'\n\n if (!networkName) return acc\n\n return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`\n }, '')\n\n return {\n ...rest,\n title: `${title} on ${networkNames}`,\n networkIds\n }\n })\n}\n\nexport const getNetworksWithDeFiPositionsErrorErrors = ({\n networks,\n currentAccountState,\n providers,\n networksWithPositions\n}: {\n networks: Network[]\n currentAccountState: DefiPositionsAccountState\n providers: RPCProviders\n networksWithPositions: NetworksWithPositions\n}) => {\n const isLoading = Object.keys(currentAccountState).some((networkId) => {\n const networkState = currentAccountState[networkId]\n return networkState.isLoading\n })\n\n if (isLoading) return []\n\n const networkNamesWithUnknownCriticalError: string[] = []\n const networkNamesWithAssetPriceCriticalError: string[] = []\n const providersWithErrors: {\n [providerName: string]: string[]\n } = {}\n\n Object.keys(currentAccountState).forEach((networkId) => {\n const providersWithPositions = networksWithPositions[networkId]\n // Ignore networks that don't have positions\n // but ensure that we have a successful response stored (the network key is present)\n if (providersWithPositions && !providersWithPositions.length) return\n\n const networkState = currentAccountState[networkId]\n const network = networks.find((n) => n.id === networkId)\n const rpcProvider = providers[networkId]\n const lastSuccessfulUpdate = networkState.updatedAt\n\n if (\n !network ||\n !networkState ||\n (typeof lastSuccessfulUpdate === 'number' &&\n Date.now() - lastSuccessfulUpdate < TEN_MINUTES) ||\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)\n )\n return\n\n if (networkState.error) {\n if (networkState.error === DeFiPositionsError.AssetPriceError) {\n networkNamesWithAssetPriceCriticalError.push(network.name)\n } else if (networkState.error === DeFiPositionsError.CriticalError) {\n networkNamesWithUnknownCriticalError.push(network.name)\n }\n }\n\n const providerNamesWithErrors =\n networkState.providerErrors\n ?.filter(({ providerName }) => {\n // Display all errors if there hasn't been a successful update\n // for the network.\n if (!networksWithPositions[networkId]) return true\n // Exclude providers without positions\n return networksWithPositions[networkId].includes(providerName)\n })\n .map((e) => e.providerName) || []\n\n if (providerNamesWithErrors.length) {\n providerNamesWithErrors.forEach((providerName) => {\n if (!providersWithErrors[providerName]) providersWithErrors[providerName] = []\n\n providersWithErrors[providerName].push(network.name)\n })\n }\n })\n\n const providerErrors: SelectedAccountBalanceError[] = Object.entries(providersWithErrors).map(\n ([providerName, networkNames]) => {\n return {\n id: `${providerName}-defi-positions-error`,\n type: 'error',\n networkIds: networkNames.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n ),\n title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}`\n }\n }\n )\n\n const errors = providerErrors\n\n if (networkNamesWithUnknownCriticalError.length) {\n errors.push({\n id: 'defi-critical',\n type: 'error',\n title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithUnknownCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n if (networkNamesWithAssetPriceCriticalError.length) {\n errors.push({\n id: 'defi-prices',\n type: 'warning',\n title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithAssetPriceCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n\n return errors\n}\n"]} \ No newline at end of file +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\n\nconst TEN_MINUTES = 10 * 60 * 1000\n\nexport type Action = {\n label: 'Select'\n actionName: 'select-rpc-url'\n meta: { network: Network }\n}\n\nexport type SelectedAccountBalanceError = {\n id: string\n networkIds: NetworkId[]\n type: 'error' | 'warning'\n title: string\n text?: string\n actions?: Action[]\n}\n\nexport const getNetworksWithFailedRPCErrors = ({\n providers,\n networks,\n networksWithAssets\n}: {\n providers: RPCProviders\n networks: Network[]\n networksWithAssets: AccountAssetsState\n}): SelectedAccountBalanceError[] => {\n const errors: SelectedAccountBalanceError[] = []\n const networkIds = getNetworksWithFailedRPC({ providers }).filter(\n (networkId) =>\n (Object.keys(networksWithAssets).includes(networkId) &&\n networksWithAssets[networkId] === true) ||\n !Object.keys(networksWithAssets).includes(networkId)\n )\n\n const networksData = networkIds.map((id) => networks.find((n: Network) => n.id === id)!)\n\n const allFailed = networksData.length === networks.length\n\n const networksWithMultipleRpcUrls = allFailed\n ? []\n : networksData.filter((n) => n?.rpcUrls?.length > 1)\n\n const networksToGroupInSingleBanner = allFailed\n ? networksData\n : networksData.filter((n) => n?.rpcUrls?.length <= 1)\n\n if (!networksData.length) return errors\n\n networksWithMultipleRpcUrls.forEach((n) => {\n errors.push({\n id: `custom-rpcs-down-${n.id}`,\n networkIds: [n.id],\n type: 'error',\n title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.',\n actions: [\n {\n label: 'Select',\n actionName: 'select-rpc-url',\n meta: { network: n }\n }\n ]\n })\n })\n\n if (!networksToGroupInSingleBanner.length) return errors\n\n errors.push({\n id: 'rpcs-down',\n networkIds: networksToGroupInSingleBanner.map((n) => n.id),\n type: 'error',\n title: `Failed to retrieve network data for ${networksToGroupInSingleBanner\n .map((n) => n.name)\n .join(', ')} (RPC malfunction)`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.'\n })\n\n return errors\n}\n\nconst addPortfolioError = (\n errors: SelectedAccountBalanceError[],\n networkId: NetworkId,\n newError: keyof typeof PORTFOLIO_LIB_ERROR_NAMES | 'portfolio-critical'\n) => {\n const newErrors = [...errors]\n const existingError = newErrors.find((error) => error.id === newError)\n\n if (existingError) {\n existingError.networkIds.push(networkId)\n } else {\n let title = ''\n let text = ''\n let type: 'error' | 'warning' = 'error'\n\n switch (newError) {\n case 'portfolio-critical':\n title = 'Failed to retrieve the portfolio data'\n text = 'Account balance and visible assets may be inaccurate.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError:\n title = 'Failed to retrieve prices'\n text = 'Account balance and asset prices may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'\n type = 'warning'\n break\n default:\n break\n }\n\n if (!title) return newErrors\n\n newErrors.push({\n id: newError,\n networkIds: [networkId],\n type,\n title,\n text\n })\n }\n\n return newErrors\n}\n\nexport const getNetworksWithPortfolioErrorErrors = ({\n networks,\n selectedAccountLatest,\n providers\n}: {\n networks: Network[]\n selectedAccountLatest: SelectedAccountPortfolioState\n providers: RPCProviders\n}): SelectedAccountBalanceError[] => {\n let errors: SelectedAccountBalanceError[] = []\n\n const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n\n return portfolioForNetwork?.isLoading\n })\n\n // Otherwise networks are appended to the banner one by one, which looks weird\n if (portfolioLoading) return []\n\n if (!Object.keys(selectedAccountLatest).length) return []\n\n Object.keys(selectedAccountLatest).forEach((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n const criticalError = portfolioForNetwork?.criticalError\n const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate\n\n // Don't display an error banner if the last successful update was less than 10 minutes ago\n if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES)\n return\n\n if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) return\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n // In case of additional networks don't check the RPC as there isn't one\n if (\n criticalError &&\n (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)\n ) {\n errors = addPortfolioError(errors, network, 'portfolio-critical')\n return\n }\n\n portfolioForNetwork?.errors.forEach((err: any) => {\n errors = addPortfolioError(errors, network, err.name)\n })\n })\n\n return errors.map(({ title, networkIds, ...rest }) => {\n const networkNames = networkIds.reduce((acc, id, index) => {\n let networkName = networks.find((n) => n.id === id)?.name\n const isLast = index === networkIds.length - 1\n const isOnly = networkIds.length === 1\n\n if (id === 'gasTank') networkName = 'Gas Tank'\n else if (id === 'rewards') networkName = 'Rewards'\n\n if (!networkName) return acc\n\n return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`\n }, '')\n\n return {\n ...rest,\n title: `${title} on ${networkNames}`,\n networkIds\n }\n })\n}\n\nexport const getNetworksWithDeFiPositionsErrorErrors = ({\n networks,\n currentAccountState,\n providers,\n networksWithPositions\n}: {\n networks: Network[]\n currentAccountState: DefiPositionsAccountState\n providers: RPCProviders\n networksWithPositions: NetworksWithPositions\n}) => {\n const isLoading = Object.keys(currentAccountState).some((networkId) => {\n const networkState = currentAccountState[networkId]\n return networkState.isLoading\n })\n\n if (isLoading) return []\n\n const networkNamesWithUnknownCriticalError: string[] = []\n const networkNamesWithAssetPriceCriticalError: string[] = []\n const providersWithErrors: {\n [providerName: string]: string[]\n } = {}\n\n Object.keys(currentAccountState).forEach((networkId) => {\n const providersWithPositions = networksWithPositions[networkId]\n // Ignore networks that don't have positions\n // but ensure that we have a successful response stored (the network key is present)\n if (providersWithPositions && !providersWithPositions.length) return\n\n const networkState = currentAccountState[networkId]\n const network = networks.find((n) => n.id === networkId)\n const rpcProvider = providers[networkId]\n const lastSuccessfulUpdate = networkState.updatedAt\n\n if (\n !network ||\n !networkState ||\n (typeof lastSuccessfulUpdate === 'number' &&\n Date.now() - lastSuccessfulUpdate < TEN_MINUTES) ||\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)\n )\n return\n\n if (networkState.error) {\n if (networkState.error === DeFiPositionsError.AssetPriceError) {\n networkNamesWithAssetPriceCriticalError.push(network.name)\n } else if (networkState.error === DeFiPositionsError.CriticalError) {\n networkNamesWithUnknownCriticalError.push(network.name)\n }\n }\n\n const providerNamesWithErrors =\n networkState.providerErrors\n ?.filter(({ providerName }) => {\n // Display all errors if there hasn't been a successful update\n // for the network.\n if (!networksWithPositions[networkId]) return true\n // Exclude providers without positions\n return networksWithPositions[networkId].includes(providerName)\n })\n .map((e) => e.providerName) || []\n\n if (providerNamesWithErrors.length) {\n providerNamesWithErrors.forEach((providerName) => {\n if (!providersWithErrors[providerName]) providersWithErrors[providerName] = []\n\n providersWithErrors[providerName].push(network.name)\n })\n }\n })\n\n const providerErrors: SelectedAccountBalanceError[] = Object.entries(providersWithErrors).map(\n ([providerName, networkNames]) => {\n return {\n id: `${providerName}-defi-positions-error`,\n type: 'error',\n networkIds: networkNames.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n ),\n title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}`\n }\n }\n )\n\n const errors = providerErrors\n\n if (networkNamesWithUnknownCriticalError.length) {\n errors.push({\n id: 'defi-critical',\n type: 'error',\n title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithUnknownCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n if (networkNamesWithAssetPriceCriticalError.length) {\n errors.push({\n id: 'defi-prices',\n type: 'warning',\n title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithAssetPriceCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n\n return errors\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.js b/dist/src/libs/selectedAccount/selectedAccount.js index cebbca543..56064ab20 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.js +++ b/dist/src/libs/selectedAccount/selectedAccount.js @@ -1,7 +1,10 @@ -import { getAddress } from 'ethers'; -import { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'; -import { AssetType } from '../defiPositions/types'; -export const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositionsAccountState, areDefiPositionsLoading) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.calculateSelectedAccountPortfolio = exports.isNetworkReady = exports.updatePortfolioStateWithDefiPositions = void 0; +const ethers_1 = require("ethers"); +const formatters_1 = require("../../utils/numbers/formatters"); +const types_1 = require("../defiPositions/types"); +const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositionsAccountState, areDefiPositionsLoading) => { if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading) return portfolioAccountState; Object.keys(portfolioAccountState).forEach((networkId) => { @@ -18,33 +21,33 @@ export const updatePortfolioStateWithDefiPositions = (portfolioAccountState, def } posByProv.positions.forEach((pos) => { pos.assets - .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset) + .filter((a) => a.type !== types_1.AssetType.Liquidity && a.protocolAsset) .forEach((a) => { const tokenInPortfolioIndex = tokens.findIndex((t) => { - return (getAddress(t.address) === getAddress(a.protocolAsset.address) && + return ((0, ethers_1.getAddress)(t.address) === (0, ethers_1.getAddress)(a.protocolAsset.address) && t.networkId === networkId); }); if (tokenInPortfolioIndex !== -1) { const tokenInPortfolio = tokens[tokenInPortfolioIndex]; const priceUSD = tokenInPortfolio.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; const tokenBalanceUSD = priceUSD - ? Number(safeTokenAmountAndNumberMultiplication(BigInt(tokenInPortfolio.amount), tokenInPortfolio.decimals, priceUSD)) + ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(tokenInPortfolio.amount), tokenInPortfolio.decimals, priceUSD)) : undefined; networkBalance -= tokenBalanceUSD || 0; // deduct portfolio token balance tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex); } // Add only the balance of the collateral tokens to the network balance - if (a.type === AssetType.Collateral) { + if (a.type === types_1.AssetType.Collateral) { const protocolPriceUSD = a.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; const protocolTokenBalanceUSD = protocolPriceUSD - ? Number(safeTokenAmountAndNumberMultiplication(BigInt(a.amount), Number(a.protocolAsset.decimals), protocolPriceUSD)) + ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(a.amount), Number(a.protocolAsset.decimals), protocolPriceUSD)) : undefined; networkBalance += protocolTokenBalanceUSD || 0; } tokens.push({ amount: a.amount, // Only list the borrowed asset with no price - priceIn: a.type === AssetType.Collateral ? a.priceIn : [], + priceIn: a.type === types_1.AssetType.Collateral ? a.priceIn : [], decimals: Number(a.protocolAsset.decimals), address: a.protocolAsset.address, symbol: a.protocolAsset.symbol, @@ -66,6 +69,7 @@ export const updatePortfolioStateWithDefiPositions = (portfolioAccountState, def }); return portfolioAccountState; }; +exports.updatePortfolioStateWithDefiPositions = updatePortfolioStateWithDefiPositions; const stripPortfolioState = (portfolioState) => { const strippedState = {}; Object.keys(portfolioState).forEach((networkId) => { @@ -85,9 +89,10 @@ const stripPortfolioState = (portfolioState) => { }); return strippedState; }; -export const isNetworkReady = (networkData) => { +const isNetworkReady = (networkData) => { return (networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading); }; +exports.isNetworkReady = isNetworkReady; const calculateTokenArray = (networkId, latestTokens, pendingTokens, isPendingValid) => { if (networkId === 'gasTank' || networkId === 'rewards') { return latestTokens; @@ -114,7 +119,7 @@ const calculateTokenArray = (networkId, latestTokens, pendingTokens, isPendingVa }; }); }; -export function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingStateSelectedAccount, accountPortfolio, hasSignAccountOp) { +function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingStateSelectedAccount, accountPortfolio, hasSignAccountOp) { const collections = []; const tokens = []; let newTotalBalance = 0; @@ -165,7 +170,7 @@ export function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pe Object.keys(selectedAccountData).forEach((network) => { const networkData = selectedAccountData[network]; const result = networkData?.result; - if (networkData && isNetworkReady(networkData) && result) { + if (networkData && (0, exports.isNetworkReady)(networkData) && result) { const networkTotal = Number(result?.total?.usd) || 0; newTotalBalance += networkTotal; const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []; @@ -175,7 +180,7 @@ export function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pe tokens.push(...tokensArray); collections.push(...networkCollections); } - if (!isNetworkReady(networkData)) { + if (!(0, exports.isNetworkReady)(networkData)) { allReady = false; } }); @@ -189,4 +194,5 @@ export function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pe pending: stripPortfolioState(pendingStateSelectedAccount) }; } +exports.calculateSelectedAccountPortfolio = calculateSelectedAccountPortfolio; //# sourceMappingURL=selectedAccount.js.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.js.map b/dist/src/libs/selectedAccount/selectedAccount.js.map index e6e388b70..7a222dfd9 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.js.map +++ b/dist/src/libs/selectedAccount/selectedAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport {\n SelectedAccountPortfolio,\n SelectedAccountPortfolioState,\n SelectedAccountPortfolioTokenResult\n} from '../../interfaces/selectedAccount'\nimport { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport {\n AccountState as DefiPositionsAccountState,\n AssetType,\n PositionsByProvider\n} from '../defiPositions/types'\nimport {\n AccountState,\n CollectionResult,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult\n} from '../portfolio/interfaces'\n\nexport const updatePortfolioStateWithDefiPositions = (\n portfolioAccountState: AccountState,\n defiPositionsAccountState: DefiPositionsAccountState,\n areDefiPositionsLoading: boolean\n) => {\n if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading)\n return portfolioAccountState\n\n Object.keys(portfolioAccountState).forEach((networkId) => {\n const networkState = portfolioAccountState[networkId]\n\n if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return\n\n let tokens = networkState.result.tokens || []\n let networkBalance = networkState.result.total?.usd || 0\n\n const positions = defiPositionsAccountState[networkId] || {}\n\n positions.positionsByProvider?.forEach((posByProv: PositionsByProvider) => {\n if (posByProv.type === 'liquidity-pool') {\n networkBalance += posByProv.positionInUSD || 0\n return\n }\n\n posByProv.positions.forEach((pos) => {\n pos.assets\n .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset)\n .forEach((a) => {\n const tokenInPortfolioIndex = tokens.findIndex((t) => {\n return (\n getAddress(t.address) === getAddress(a.protocolAsset!.address) &&\n t.networkId === networkId\n )\n })\n\n if (tokenInPortfolioIndex !== -1) {\n const tokenInPortfolio = tokens[tokenInPortfolioIndex]\n const priceUSD = tokenInPortfolio.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n const tokenBalanceUSD = priceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio.amount),\n tokenInPortfolio.decimals,\n priceUSD\n )\n )\n : undefined\n\n networkBalance -= tokenBalanceUSD || 0 // deduct portfolio token balance\n tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex)\n }\n\n // Add only the balance of the collateral tokens to the network balance\n if (a.type === AssetType.Collateral) {\n const protocolPriceUSD = a.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const protocolTokenBalanceUSD = protocolPriceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(a.amount),\n Number(a.protocolAsset!.decimals),\n protocolPriceUSD\n )\n )\n : undefined\n\n networkBalance += protocolTokenBalanceUSD || 0\n }\n tokens.push({\n amount: a.amount,\n // Only list the borrowed asset with no price\n priceIn: a.type === AssetType.Collateral ? a.priceIn : [],\n decimals: Number(a.protocolAsset!.decimals),\n address: a.protocolAsset!.address,\n symbol: a.protocolAsset!.symbol,\n networkId,\n flags: {\n canTopUpGasTank: false,\n isFeeToken: false,\n onGasTank: false,\n rewardsType: null\n }\n })\n })\n })\n })\n\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.total.usd = networkBalance\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.tokens = tokens\n })\n\n return portfolioAccountState\n}\n\nconst stripPortfolioState = (portfolioState: AccountState) => {\n const strippedState: SelectedAccountPortfolioState = {}\n\n Object.keys(portfolioState).forEach((networkId) => {\n const networkState = portfolioState[networkId]\n if (!networkState) return\n\n if (!networkState.result) {\n strippedState[networkId] = networkState\n return\n }\n\n // A trick to exclude specific keys\n const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } =\n networkState.result\n\n strippedState[networkId] = {\n ...networkState,\n result\n }\n })\n\n return strippedState\n}\n\nexport const isNetworkReady = (networkData: NetworkState | undefined) => {\n return (\n networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading\n )\n}\n\nconst calculateTokenArray = (\n networkId: string,\n latestTokens: TokenResult[],\n pendingTokens: TokenResult[],\n isPendingValid: boolean\n) => {\n if (networkId === 'gasTank' || networkId === 'rewards') {\n return latestTokens\n }\n // If the pending state is older or there are no pending tokens\n // we shouldn't trust it to build the tokens array\n if (isPendingValid && pendingTokens.length) {\n return pendingTokens.map((pendingToken) => {\n const latestToken = latestTokens.find((latest) => {\n return latest.address === pendingToken.address\n })\n\n return {\n ...pendingToken,\n latestAmount: latestToken?.amount,\n pendingAmount: pendingToken.amount\n }\n })\n }\n\n // Add only latestAmount to the tokens\n return latestTokens.map((token) => {\n return {\n ...token,\n latestAmount: token.amount\n }\n })\n}\n\nexport function calculateSelectedAccountPortfolio(\n latestStateSelectedAccount: AccountState,\n pendingStateSelectedAccount: AccountState,\n accountPortfolio: SelectedAccountPortfolio | null,\n hasSignAccountOp?: boolean\n) {\n const collections: CollectionResult[] = []\n const tokens: SelectedAccountPortfolioTokenResult[] = []\n\n let newTotalBalance: number = 0\n\n const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length\n let allReady = !!hasLatest\n\n const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length\n if (!hasLatest && !hasPending) {\n return {\n tokens: accountPortfolio?.tokens || [],\n collections: accountPortfolio?.collections || [],\n totalBalance: accountPortfolio?.totalBalance || 0,\n isAllReady: false,\n networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {},\n latest: latestStateSelectedAccount,\n pending: pendingStateSelectedAccount\n } as SelectedAccountPortfolio\n }\n\n let selectedAccountData = latestStateSelectedAccount\n\n /**\n * Replaces the latest state if the following conditions are true:\n * - There is no critical error in the pending state.\n * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation).\n */\n const validSelectedAccountPendingState: AccountState = {}\n const simulatedAccountOps: NetworkSimulatedAccountOp = {}\n\n Object.keys(pendingStateSelectedAccount).forEach((network) => {\n const pendingNetworkData = pendingStateSelectedAccount[network]\n const latestNetworkData = latestStateSelectedAccount[network]\n\n // Compare the block numbers to determine if the pending state is newer\n if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) {\n const isPendingNewer =\n pendingNetworkData.result.blockNumber! >= latestNetworkData.result.blockNumber!\n\n if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) {\n validSelectedAccountPendingState[network] = pendingNetworkData\n }\n }\n\n // Store the simulated account op\n const accountOp = pendingNetworkData?.accountOps?.[0]\n\n if (accountOp) {\n simulatedAccountOps[network] = accountOp\n }\n })\n\n if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) {\n selectedAccountData = {\n ...selectedAccountData,\n ...validSelectedAccountPendingState\n }\n }\n\n Object.keys(selectedAccountData).forEach((network: string) => {\n const networkData = selectedAccountData[network]\n const result = networkData?.result\n if (networkData && isNetworkReady(networkData) && result) {\n const networkTotal = Number(result?.total?.usd) || 0\n newTotalBalance += networkTotal\n\n const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []\n const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []\n const networkCollections = result?.collections || []\n\n const tokensArray = calculateTokenArray(\n network,\n latestTokens,\n pendingTokens,\n !!validSelectedAccountPendingState[network]\n )\n\n tokens.push(...tokensArray)\n collections.push(...networkCollections)\n }\n\n if (!isNetworkReady(networkData)) {\n allReady = false\n }\n })\n\n return {\n totalBalance: newTotalBalance,\n tokens,\n collections,\n isAllReady: allReady,\n networkSimulatedAccountOp: simulatedAccountOps,\n latest: stripPortfolioState(latestStateSelectedAccount),\n pending: stripPortfolioState(pendingStateSelectedAccount)\n } as SelectedAccountPortfolio\n}\n"]} \ No newline at end of file +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport {\n SelectedAccountPortfolio,\n SelectedAccountPortfolioState,\n SelectedAccountPortfolioTokenResult\n} from '../../interfaces/selectedAccount'\nimport { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport {\n AccountState as DefiPositionsAccountState,\n AssetType,\n PositionsByProvider\n} from '../defiPositions/types'\nimport {\n AccountState,\n CollectionResult,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult\n} from '../portfolio/interfaces'\n\nexport const updatePortfolioStateWithDefiPositions = (\n portfolioAccountState: AccountState,\n defiPositionsAccountState: DefiPositionsAccountState,\n areDefiPositionsLoading: boolean\n) => {\n if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading)\n return portfolioAccountState\n\n Object.keys(portfolioAccountState).forEach((networkId) => {\n const networkState = portfolioAccountState[networkId]\n\n if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return\n\n let tokens = networkState.result.tokens || []\n let networkBalance = networkState.result.total?.usd || 0\n\n const positions = defiPositionsAccountState[networkId] || {}\n\n positions.positionsByProvider?.forEach((posByProv: PositionsByProvider) => {\n if (posByProv.type === 'liquidity-pool') {\n networkBalance += posByProv.positionInUSD || 0\n return\n }\n\n posByProv.positions.forEach((pos) => {\n pos.assets\n .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset)\n .forEach((a) => {\n const tokenInPortfolioIndex = tokens.findIndex((t) => {\n return (\n getAddress(t.address) === getAddress(a.protocolAsset!.address) &&\n t.networkId === networkId\n )\n })\n\n if (tokenInPortfolioIndex !== -1) {\n const tokenInPortfolio = tokens[tokenInPortfolioIndex]\n const priceUSD = tokenInPortfolio.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n const tokenBalanceUSD = priceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio.amount),\n tokenInPortfolio.decimals,\n priceUSD\n )\n )\n : undefined\n\n networkBalance -= tokenBalanceUSD || 0 // deduct portfolio token balance\n tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex)\n }\n\n // Add only the balance of the collateral tokens to the network balance\n if (a.type === AssetType.Collateral) {\n const protocolPriceUSD = a.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const protocolTokenBalanceUSD = protocolPriceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(a.amount),\n Number(a.protocolAsset!.decimals),\n protocolPriceUSD\n )\n )\n : undefined\n\n networkBalance += protocolTokenBalanceUSD || 0\n }\n tokens.push({\n amount: a.amount,\n // Only list the borrowed asset with no price\n priceIn: a.type === AssetType.Collateral ? a.priceIn : [],\n decimals: Number(a.protocolAsset!.decimals),\n address: a.protocolAsset!.address,\n symbol: a.protocolAsset!.symbol,\n networkId,\n flags: {\n canTopUpGasTank: false,\n isFeeToken: false,\n onGasTank: false,\n rewardsType: null\n }\n })\n })\n })\n })\n\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.total.usd = networkBalance\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.tokens = tokens\n })\n\n return portfolioAccountState\n}\n\nconst stripPortfolioState = (portfolioState: AccountState) => {\n const strippedState: SelectedAccountPortfolioState = {}\n\n Object.keys(portfolioState).forEach((networkId) => {\n const networkState = portfolioState[networkId]\n if (!networkState) return\n\n if (!networkState.result) {\n strippedState[networkId] = networkState\n return\n }\n\n // A trick to exclude specific keys\n const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } =\n networkState.result\n\n strippedState[networkId] = {\n ...networkState,\n result\n }\n })\n\n return strippedState\n}\n\nexport const isNetworkReady = (networkData: NetworkState | undefined) => {\n return (\n networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading\n )\n}\n\nconst calculateTokenArray = (\n networkId: string,\n latestTokens: TokenResult[],\n pendingTokens: TokenResult[],\n isPendingValid: boolean\n) => {\n if (networkId === 'gasTank' || networkId === 'rewards') {\n return latestTokens\n }\n // If the pending state is older or there are no pending tokens\n // we shouldn't trust it to build the tokens array\n if (isPendingValid && pendingTokens.length) {\n return pendingTokens.map((pendingToken) => {\n const latestToken = latestTokens.find((latest) => {\n return latest.address === pendingToken.address\n })\n\n return {\n ...pendingToken,\n latestAmount: latestToken?.amount,\n pendingAmount: pendingToken.amount\n }\n })\n }\n\n // Add only latestAmount to the tokens\n return latestTokens.map((token) => {\n return {\n ...token,\n latestAmount: token.amount\n }\n })\n}\n\nexport function calculateSelectedAccountPortfolio(\n latestStateSelectedAccount: AccountState,\n pendingStateSelectedAccount: AccountState,\n accountPortfolio: SelectedAccountPortfolio | null,\n hasSignAccountOp?: boolean\n) {\n const collections: CollectionResult[] = []\n const tokens: SelectedAccountPortfolioTokenResult[] = []\n\n let newTotalBalance: number = 0\n\n const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length\n let allReady = !!hasLatest\n\n const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length\n if (!hasLatest && !hasPending) {\n return {\n tokens: accountPortfolio?.tokens || [],\n collections: accountPortfolio?.collections || [],\n totalBalance: accountPortfolio?.totalBalance || 0,\n isAllReady: false,\n networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {},\n latest: latestStateSelectedAccount,\n pending: pendingStateSelectedAccount\n } as SelectedAccountPortfolio\n }\n\n let selectedAccountData = latestStateSelectedAccount\n\n /**\n * Replaces the latest state if the following conditions are true:\n * - There is no critical error in the pending state.\n * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation).\n */\n const validSelectedAccountPendingState: AccountState = {}\n const simulatedAccountOps: NetworkSimulatedAccountOp = {}\n\n Object.keys(pendingStateSelectedAccount).forEach((network) => {\n const pendingNetworkData = pendingStateSelectedAccount[network]\n const latestNetworkData = latestStateSelectedAccount[network]\n\n // Compare the block numbers to determine if the pending state is newer\n if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) {\n const isPendingNewer =\n pendingNetworkData.result.blockNumber! >= latestNetworkData.result.blockNumber!\n\n if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) {\n validSelectedAccountPendingState[network] = pendingNetworkData\n }\n }\n\n // Store the simulated account op\n const accountOp = pendingNetworkData?.accountOps?.[0]\n\n if (accountOp) {\n simulatedAccountOps[network] = accountOp\n }\n })\n\n if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) {\n selectedAccountData = {\n ...selectedAccountData,\n ...validSelectedAccountPendingState\n }\n }\n\n Object.keys(selectedAccountData).forEach((network: string) => {\n const networkData = selectedAccountData[network]\n const result = networkData?.result\n if (networkData && isNetworkReady(networkData) && result) {\n const networkTotal = Number(result?.total?.usd) || 0\n newTotalBalance += networkTotal\n\n const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []\n const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []\n const networkCollections = result?.collections || []\n\n const tokensArray = calculateTokenArray(\n network,\n latestTokens,\n pendingTokens,\n !!validSelectedAccountPendingState[network]\n )\n\n tokens.push(...tokensArray)\n collections.push(...networkCollections)\n }\n\n if (!isNetworkReady(networkData)) {\n allReady = false\n }\n })\n\n return {\n totalBalance: newTotalBalance,\n tokens,\n collections,\n isAllReady: allReady,\n networkSimulatedAccountOp: simulatedAccountOps,\n latest: stripPortfolioState(latestStateSelectedAccount),\n pending: stripPortfolioState(pendingStateSelectedAccount)\n } as SelectedAccountPortfolio\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.js b/dist/src/libs/signMessage/signMessage.js index 7763ce41e..72c92f043 100644 --- a/dist/src/libs/signMessage/signMessage.js +++ b/dist/src/libs/signMessage/signMessage.js @@ -1,19 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.adjustEntryPointAuthorization = exports.getEntryPointAuthorization = exports.getEIP712Signature = exports.getPlainTextSignature = exports.getExecuteSignature = exports.verifyMessage = exports.mapSignatureV = exports.wrapCounterfactualSign = exports.getTypedData = exports.getAmbireReadableTypedData = exports.wrapWallet = exports.wrapStandard = exports.wrapUnprotected = exports.EIP_1271_NOT_SUPPORTED_BY = void 0; +const tslib_1 = require("tslib"); /* eslint-disable no-param-reassign */ -import { AbiCoder, getAddress, getBytes, hashMessage, hexlify, Interface, isHexString, toBeHex, toUtf8Bytes, TypedDataEncoder } from 'ethers'; -import UniversalSigValidator from '../../../contracts/compiled/UniversalSigValidator.json'; -import { PERMIT_2_ADDRESS, UNISWAP_UNIVERSAL_ROUTERS } from '../../consts/addresses'; -import hexStringToUint8Array from '../../utils/hexStringToUint8Array'; -import isSameAddr from '../../utils/isSameAddr'; -import { stripHexPrefix } from '../../utils/stripHexPrefix'; -import { accountOpSignableHash, callToTuple, getSignableHash } from '../accountOp/accountOp'; -import { fromDescriptor } from '../deployless/deployless'; -import { relayerAdditionalNetworks } from '../networks/networks'; -import { getActivatorCall } from '../userOperation/userOperation'; +const ethers_1 = require("ethers"); +const UniversalSigValidator_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/UniversalSigValidator.json")); +const addresses_1 = require("../../consts/addresses"); +const hexStringToUint8Array_1 = tslib_1.__importDefault(require("../../utils/hexStringToUint8Array")); +const isSameAddr_1 = tslib_1.__importDefault(require("../../utils/isSameAddr")); +const stripHexPrefix_1 = require("../../utils/stripHexPrefix"); +const accountOp_1 = require("../accountOp/accountOp"); +const deployless_1 = require("../deployless/deployless"); +const networks_1 = require("../networks/networks"); +const userOperation_1 = require("../userOperation/userOperation"); // EIP6492 signature ends in magicBytes, which ends with a 0x92, // which makes it is impossible for it to collide with a valid ecrecover signature if packed in the r,s,v format, // as 0x92 is not a valid value for v. const magicBytes = '6492649264926492649264926492649264926492649264926492649264926492'; -export const EIP_1271_NOT_SUPPORTED_BY = [ +exports.EIP_1271_NOT_SUPPORTED_BY = [ 'opensea.io', 'paraswap.xyz', 'blur.io', @@ -26,34 +30,37 @@ export const EIP_1271_NOT_SUPPORTED_BY = [ * For Unprotected signatures, we need to append 00 at the end * for ambire to recognize it */ -export const wrapUnprotected = (signature) => { +const wrapUnprotected = (signature) => { return `${signature}00`; }; +exports.wrapUnprotected = wrapUnprotected; /** * For EIP-712 signatures, we need to append 01 at the end * for ambire to recognize it. * For v1 contracts, we do ETH sign at the 01 slot, which we'll * call standard from now on */ -export const wrapStandard = (signature) => { +const wrapStandard = (signature) => { return `${signature}01`; }; +exports.wrapStandard = wrapStandard; /** * For v2 accounts acting as signers, we need to append the v2 wallet * addr that's the signer and a 02 mode at the end to indicate it's a wallet: * {sig+mode}{wallet_32bytes}{mode} */ -export const wrapWallet = (signature, walletAddr) => { - const wallet32bytes = `${stripHexPrefix(toBeHex(0, 12))}${stripHexPrefix(walletAddr)}`; +const wrapWallet = (signature, walletAddr) => { + const wallet32bytes = `${(0, stripHexPrefix_1.stripHexPrefix)((0, ethers_1.toBeHex)(0, 12))}${(0, stripHexPrefix_1.stripHexPrefix)(walletAddr)}`; return `${signature}${wallet32bytes}02`; }; -export const getAmbireReadableTypedData = (chainId, verifyingAddr, v1Execute) => { +exports.wrapWallet = wrapWallet; +const getAmbireReadableTypedData = (chainId, verifyingAddr, v1Execute) => { const domain = { name: 'Ambire', version: '1', chainId: chainId.toString(), verifyingContract: verifyingAddr, - salt: toBeHex(0, 32) + salt: (0, ethers_1.toBeHex)(0, 32) }; const types = { EIP712Domain: [ @@ -98,16 +105,17 @@ export const getAmbireReadableTypedData = (chainId, verifyingAddr, v1Execute) => primaryType: 'AmbireOperation' }; }; +exports.getAmbireReadableTypedData = getAmbireReadableTypedData; /** * Return the typed data for EIP-712 sign */ -export const getTypedData = (chainId, verifyingAddr, msgHash) => { +const getTypedData = (chainId, verifyingAddr, msgHash) => { const domain = { name: 'Ambire', version: '1', chainId: chainId.toString(), verifyingContract: verifyingAddr, - salt: toBeHex(0, 32) + salt: (0, ethers_1.toBeHex)(0, 32) }; const types = { EIP712Domain: [ @@ -149,6 +157,7 @@ export const getTypedData = (chainId, verifyingAddr, msgHash) => { primaryType: 'AmbireOperation' }; }; +exports.getTypedData = getTypedData; /** * Produce EIP6492 signature for Predeploy Contracts * @@ -158,20 +167,22 @@ export const getTypedData = (chainId, verifyingAddr, msgHash) => { * @param {object} account * @returns {string} - EIP6492 signature */ -export const wrapCounterfactualSign = (signature, creation) => { +const wrapCounterfactualSign = (signature, creation) => { const ABI = ['function deploy(bytes code, uint256 salt)']; - const iface = new Interface(ABI); + const iface = new ethers_1.Interface(ABI); const factoryCallData = iface.encodeFunctionData('deploy', [creation.bytecode, creation.salt]); - const coder = new AbiCoder(); + const coder = new ethers_1.AbiCoder(); // EIP6492 signature return (coder.encode(['address', 'bytes', 'bytes'], [creation.factoryAddr, factoryCallData, signature]) + magicBytes); }; -export function mapSignatureV(sigRaw) { - const sig = hexStringToUint8Array(sigRaw); +exports.wrapCounterfactualSign = wrapCounterfactualSign; +function mapSignatureV(sigRaw) { + const sig = (0, hexStringToUint8Array_1.default)(sigRaw); if (sig[64] < 27) sig[64] += 27; - return hexlify(sig); + return (0, ethers_1.hexlify)(sig); } +exports.mapSignatureV = mapSignatureV; /** * Verifies the signature of a message using the provided signer and signature * via a "magic" universal validator contract using the provided provider to @@ -181,10 +192,10 @@ export function mapSignatureV(sigRaw) { * * Note: you only need to pass one of: typedData, finalDigest, message */ -export async function verifyMessage({ network, provider, signer, signature, message, typedData, finalDigest }) { +async function verifyMessage({ network, provider, signer, signature, message, typedData, finalDigest }) { if (message) { try { - finalDigest = hashMessage(message); + finalDigest = (0, ethers_1.hashMessage)(message); if (!finalDigest) throw Error('Hashing the message returned no (falsy) result.'); } @@ -209,10 +220,10 @@ export async function verifyMessage({ network, provider, signer, signature, mess // an AmbireOperation if ('AmbireReadableOperation' in typedData.types) { const ambireReadableOperation = typedData.message; - finalDigest = hexlify(getSignableHash(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(callToTuple))); + finalDigest = (0, ethers_1.hexlify)((0, accountOp_1.getSignableHash)(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(accountOp_1.callToTuple))); } else { - finalDigest = TypedDataEncoder.hash(typedData.domain, typesWithoutEIP712Domain, typedData.message); + finalDigest = ethers_1.TypedDataEncoder.hash(typedData.domain, typesWithoutEIP712Domain, typedData.message); } if (!finalDigest) throw Error('Hashing the typedData returned no (falsy) result.'); @@ -223,10 +234,10 @@ export async function verifyMessage({ network, provider, signer, signature, mess } // this 'magic' universal validator contract will deploy itself within the eth_call, try to verify the signature using // ERC-6492, ERC-1271 and ecrecover, and return the value to us - const coder = new AbiCoder(); + const coder = new ethers_1.AbiCoder(); let callResult; try { - const deploylessVerify = fromDescriptor(provider, UniversalSigValidator, !network.rpcNoStateOverride); + const deploylessVerify = (0, deployless_1.fromDescriptor)(provider, UniversalSigValidator_json_1.default, !network.rpcNoStateOverride); const deploylessRes = await deploylessVerify.call('isValidSigWithSideEffects', [ signer, finalDigest, @@ -252,27 +263,29 @@ export async function verifyMessage({ network, provider, signer, signature, mess throw new Error(`Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details:: ${coder.decode(['string'], `0x${callResult.slice(10)}`)[0]}`); throw new Error(`Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details: unexpected result from the UniversalValidator: ${callResult}`); } +exports.verifyMessage = verifyMessage; // Authorize the execute calls according to the version of the smart account -export async function getExecuteSignature(network, accountOp, accountState, signer) { +async function getExecuteSignature(network, accountOp, accountState, signer) { // if we're authorizing calls for a v1 contract, we do a sign message // on the hash of the calls if (!accountState.isV2) { - const message = hexlify(accountOpSignableHash(accountOp, network.chainId)); - return wrapStandard(await signer.signMessage(message)); + const message = (0, ethers_1.hexlify)((0, accountOp_1.accountOpSignableHash)(accountOp, network.chainId)); + return (0, exports.wrapStandard)(await signer.signMessage(message)); } // txns for v2 contracts are always eip-712 so we put the hash of the calls // in eip-712 format - const typedData = getTypedData(network.chainId, accountState.accountAddr, hexlify(accountOpSignableHash(accountOp, network.chainId))); - return wrapStandard(await signer.signTypedData(typedData)); + const typedData = (0, exports.getTypedData)(network.chainId, accountState.accountAddr, (0, ethers_1.hexlify)((0, accountOp_1.accountOpSignableHash)(accountOp, network.chainId))); + return (0, exports.wrapStandard)(await signer.signTypedData(typedData)); } -export async function getPlainTextSignature(message, network, account, accountState, signer) { +exports.getExecuteSignature = getExecuteSignature; +async function getPlainTextSignature(message, network, account, accountState, signer) { const dedicatedToOneSA = signer.key.dedicatedToOneSA; let messageHex; if (message instanceof Uint8Array) { - messageHex = hexlify(message); + messageHex = (0, ethers_1.hexlify)(message); } - else if (!isHexString(message)) { - messageHex = hexlify(toUtf8Bytes(message)); + else if (!(0, ethers_1.isHexString)(message)) { + messageHex = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)(message)); } else { messageHex = message; @@ -282,27 +295,27 @@ export async function getPlainTextSignature(message, network, account, accountSt return signature; } if (!accountState.isV2) { - const lowercaseHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.toLowerCase().slice(2))); - const checksummedHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.slice(2))); + const lowercaseHexAddrWithout0x = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)(account.addr.toLowerCase().slice(2))); + const checksummedHexAddrWithout0x = (0, ethers_1.hexlify)((0, ethers_1.toUtf8Bytes)(account.addr.slice(2))); const asciiAddrLowerCase = account.addr.toLowerCase(); - const humanReadableMsg = message instanceof Uint8Array ? hexlify(message) : message; + const humanReadableMsg = message instanceof Uint8Array ? (0, ethers_1.hexlify)(message) : message; const isAsciiAddressInMessage = humanReadableMsg.toLowerCase().includes(asciiAddrLowerCase); const isLowercaseHexAddressInMessage = humanReadableMsg.includes(lowercaseHexAddrWithout0x.slice(2)); const isChecksummedHexAddressInMessage = humanReadableMsg.includes(checksummedHexAddrWithout0x.slice(2)); if (!network.predefined && - !relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)) { + !networks_1.relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)) { throw new Error(`Signing messages is disallowed for v1 accounts on ${network.name}`); } if (isAsciiAddressInMessage || isLowercaseHexAddressInMessage || isChecksummedHexAddressInMessage) { - return wrapUnprotected(await signer.signMessage(messageHex)); + return (0, exports.wrapUnprotected)(await signer.signMessage(messageHex)); } throw new Error('Signing messages is disallowed for v1 accounts. Please contact support to proceed'); } // if it's safe, we proceed if (dedicatedToOneSA) { - return wrapUnprotected(await signer.signMessage(messageHex)); + return (0, exports.wrapUnprotected)(await signer.signMessage(messageHex)); } // in case of only_standard priv key, we transform the data // for signing to EIP-712. This is because the key is not labeled safe @@ -310,10 +323,11 @@ export async function getPlainTextSignature(message, network, account, accountSt // This is important as this key could be a metamask one and someone // could be phishing him into approving an Ambire Op without him // knowing - const typedData = getTypedData(network.chainId, account.addr, hashMessage(getBytes(messageHex))); - return wrapStandard(await signer.signTypedData(typedData)); + const typedData = (0, exports.getTypedData)(network.chainId, account.addr, (0, ethers_1.hashMessage)((0, ethers_1.getBytes)(messageHex))); + return (0, exports.wrapStandard)(await signer.signTypedData(typedData)); } -export async function getEIP712Signature(message, account, accountState, signer, network) { +exports.getPlainTextSignature = getPlainTextSignature; +async function getEIP712Signature(message, account, accountState, signer, network) { if (!message.types.EIP712Domain) { throw new Error('Ambire only supports signing EIP712 typed data messages. Please try again with a valid EIP712 message.'); } @@ -329,12 +343,12 @@ export async function getEIP712Signature(message, account, accountState, signer, if (asString.indexOf(account.addr.toLowerCase()) !== -1 || (message.domain.name === 'Permit2' && message.domain.verifyingContract && - getAddress(message.domain.verifyingContract) === PERMIT_2_ADDRESS && + (0, ethers_1.getAddress)(message.domain.verifyingContract) === addresses_1.PERMIT_2_ADDRESS && message.message && message.message.spender && - UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] && - UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === getAddress(message.message.spender))) { - return wrapUnprotected(await signer.signTypedData(message)); + addresses_1.UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] && + addresses_1.UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === (0, ethers_1.getAddress)(message.message.spender))) { + return (0, exports.wrapUnprotected)(await signer.signTypedData(message)); } throw new Error('Signing this eip-712 message is disallowed for v1 accounts as it does not contain the smart account address and therefore deemed unsafe'); } @@ -346,31 +360,34 @@ export async function getEIP712Signature(message, account, accountState, signer, } if ('AmbireReadableOperation' in message.types) { const ambireReadableOperation = message.message; - if (isSameAddr(ambireReadableOperation.addr, account.addr)) { + if ((0, isSameAddr_1.default)(ambireReadableOperation.addr, account.addr)) { throw new Error('signature error: trying to sign an AmbireReadableOperation for the same address. Please contact support'); } - const hash = hexlify(getSignableHash(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(callToTuple))); - const ambireOperation = getTypedData(ambireReadableOperation.chainId, account.addr, hash); - const signature = wrapStandard(await signer.signTypedData(ambireOperation)); - return wrapWallet(signature, account.addr); + const hash = (0, ethers_1.hexlify)((0, accountOp_1.getSignableHash)(ambireReadableOperation.addr, ambireReadableOperation.chainId, ambireReadableOperation.nonce, ambireReadableOperation.calls.map(accountOp_1.callToTuple))); + const ambireOperation = (0, exports.getTypedData)(ambireReadableOperation.chainId, account.addr, hash); + const signature = (0, exports.wrapStandard)(await signer.signTypedData(ambireOperation)); + return (0, exports.wrapWallet)(signature, account.addr); } - return wrapUnprotected(await signer.signTypedData(message)); + return (0, exports.wrapUnprotected)(await signer.signTypedData(message)); } +exports.getEIP712Signature = getEIP712Signature; // get the typedData for the first ERC-4337 deploy txn -export async function getEntryPointAuthorization(addr, chainId, nonce) { - const hash = getSignableHash(addr, chainId, nonce, [callToTuple(getActivatorCall(addr))]); - return getTypedData(chainId, addr, hexlify(hash)); +async function getEntryPointAuthorization(addr, chainId, nonce) { + const hash = (0, accountOp_1.getSignableHash)(addr, chainId, nonce, [(0, accountOp_1.callToTuple)((0, userOperation_1.getActivatorCall)(addr))]); + return (0, exports.getTypedData)(chainId, addr, (0, ethers_1.hexlify)(hash)); } -export function adjustEntryPointAuthorization(signature) { +exports.getEntryPointAuthorization = getEntryPointAuthorization; +function adjustEntryPointAuthorization(signature) { let entryPointSig = signature; // if thet signature is wrapepd in magicBytes because of eip-6492, unwrap it if (signature.endsWith(magicBytes)) { - const coder = new AbiCoder(); + const coder = new ethers_1.AbiCoder(); const decoded = coder.decode(['address', 'bytes', 'bytes'], signature.substring(0, signature.length - magicBytes.length)); entryPointSig = decoded[2]; } // since normally when we sign an EIP-712 request, we wrap it in Unprotected, // we adjust the entry point authorization signature so we could execute a txn - return wrapStandard(entryPointSig.substring(0, entryPointSig.length - 2)); + return (0, exports.wrapStandard)(entryPointSig.substring(0, entryPointSig.length - 2)); } +exports.adjustEntryPointAuthorization = adjustEntryPointAuthorization; //# sourceMappingURL=signMessage.js.map \ No newline at end of file diff --git a/dist/src/libs/signMessage/signMessage.js.map b/dist/src/libs/signMessage/signMessage.js.map index 3cd452dea..cff10223e 100644 --- a/dist/src/libs/signMessage/signMessage.js.map +++ b/dist/src/libs/signMessage/signMessage.js.map @@ -1 +1 @@ -{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/libs/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n AbiCoder,\n getAddress,\n getBytes,\n hashMessage,\n hexlify,\n Interface,\n isHexString,\n JsonRpcProvider,\n toBeHex,\n toUtf8Bytes,\n TypedDataDomain,\n TypedDataEncoder,\n TypedDataField\n} from 'ethers'\n\nimport UniversalSigValidator from '../../../contracts/compiled/UniversalSigValidator.json'\nimport { PERMIT_2_ADDRESS, UNISWAP_UNIVERSAL_ROUTERS } from '../../consts/addresses'\nimport { Account, AccountCreation, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { KeystoreSigner } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { TypedMessage } from '../../interfaces/userRequest'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport isSameAddr from '../../utils/isSameAddr'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix'\nimport {\n AccountOp,\n accountOpSignableHash,\n callToTuple,\n getSignableHash\n} from '../accountOp/accountOp'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { relayerAdditionalNetworks } from '../networks/networks'\nimport { getActivatorCall } from '../userOperation/userOperation'\n\n// EIP6492 signature ends in magicBytes, which ends with a 0x92,\n// which makes it is impossible for it to collide with a valid ecrecover signature if packed in the r,s,v format,\n// as 0x92 is not a valid value for v.\nconst magicBytes = '6492649264926492649264926492649264926492649264926492649264926492'\n\nexport const EIP_1271_NOT_SUPPORTED_BY = [\n 'opensea.io',\n 'paraswap.xyz',\n 'blur.io',\n 'aevo.xyz',\n 'socialscan.io',\n 'tally.xyz',\n 'questn.com'\n]\n\n/**\n * For Unprotected signatures, we need to append 00 at the end\n * for ambire to recognize it\n */\nexport const wrapUnprotected = (signature: string) => {\n return `${signature}00`\n}\n\n/**\n * For EIP-712 signatures, we need to append 01 at the end\n * for ambire to recognize it.\n * For v1 contracts, we do ETH sign at the 01 slot, which we'll\n * call standard from now on\n */\nexport const wrapStandard = (signature: string) => {\n return `${signature}01`\n}\n\n/**\n * For v2 accounts acting as signers, we need to append the v2 wallet\n * addr that's the signer and a 02 mode at the end to indicate it's a wallet:\n * {sig+mode}{wallet_32bytes}{mode}\n */\nexport const wrapWallet = (signature: string, walletAddr: string) => {\n const wallet32bytes = `${stripHexPrefix(toBeHex(0, 12))}${stripHexPrefix(walletAddr)}`\n return `${signature}${wallet32bytes}02`\n}\n\n// allow v1 accounts to have v2 signers\ninterface AmbireReadableOperation {\n addr: Hex\n chainId: bigint\n nonce: bigint\n calls: { to: Hex; value: bigint; data: Hex }[]\n}\n\nexport const getAmbireReadableTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n v1Execute: AmbireReadableOperation\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n Calls: [\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' }\n ],\n AmbireReadableOperation: [\n { name: 'account', type: 'address' },\n { name: 'chainId', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'calls', type: 'Calls[]' }\n ]\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message: v1Execute,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Return the typed data for EIP-712 sign\n */\nexport const getTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n msgHash: string\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n AmbireOperation: [\n { name: 'account', type: 'address' },\n { name: 'hash', type: 'bytes32' }\n ]\n }\n const message = {\n account: verifyingAddr,\n hash: msgHash\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Produce EIP6492 signature for Predeploy Contracts\n *\n * More info: https://eips.ethereum.org/EIPS/eip-6492\n *\n * @param {string} signature - origin ERC-1271 signature\n * @param {object} account\n * @returns {string} - EIP6492 signature\n */\nexport const wrapCounterfactualSign = (signature: string, creation: AccountCreation) => {\n const ABI = ['function deploy(bytes code, uint256 salt)']\n const iface = new Interface(ABI)\n const factoryCallData = iface.encodeFunctionData('deploy', [creation.bytecode, creation.salt])\n\n const coder = new AbiCoder()\n\n // EIP6492 signature\n return (\n coder.encode(\n ['address', 'bytes', 'bytes'],\n [creation.factoryAddr, factoryCallData, signature]\n ) + magicBytes\n )\n}\n\nexport function mapSignatureV(sigRaw: string) {\n const sig = hexStringToUint8Array(sigRaw)\n if (sig[64] < 27) sig[64] += 27\n return hexlify(sig)\n}\n\ntype Props = {\n network?: Network\n provider?: JsonRpcProvider\n signer?: string\n signature: string | Uint8Array\n message?: string | Uint8Array\n typedData?: {\n domain: TypedDataDomain\n types: Record>\n message: Record\n }\n finalDigest?: string\n}\n\n/**\n * Verifies the signature of a message using the provided signer and signature\n * via a \"magic\" universal validator contract using the provided provider to\n * verify the signature on-chain. The contract deploys itself within the\n * `eth_call`, tries to verify the signature using ERC-6492, ERC-1271, and\n * `ecrecover`, and returns the value to the function.\n *\n * Note: you only need to pass one of: typedData, finalDigest, message\n */\nexport async function verifyMessage({\n network,\n provider,\n signer,\n signature,\n message,\n typedData,\n finalDigest\n}: (\n | Required>\n | Required>\n | Required>\n) &\n Props): Promise {\n if (message) {\n try {\n finalDigest = hashMessage(message)\n if (!finalDigest) throw Error('Hashing the message returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (standard) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n } else if (typedData) {\n // To resolve the \"ambiguous primary types or unused types\" error, remove\n // the `EIP712Domain` from `types` object. The domain type is inbuilt in\n // the EIP712 standard and hence TypedDataEncoder so you do not need to\n // specify it in the types, see:\n // {@link https://ethereum.stackexchange.com/a/151930}\n const typesWithoutEIP712Domain = { ...typedData.types }\n if (typesWithoutEIP712Domain.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typesWithoutEIP712Domain.EIP712Domain\n }\n\n try {\n // the final digest for AmbireReadableOperation is the execute hash\n // as it's wrapped in mode.standard and onchain gets transformed to\n // an AmbireOperation\n if ('AmbireReadableOperation' in typedData.types) {\n const ambireReadableOperation = typedData.message as AmbireReadableOperation\n finalDigest = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n } else {\n finalDigest = TypedDataEncoder.hash(\n typedData.domain,\n typesWithoutEIP712Domain,\n typedData.message\n )\n }\n\n if (!finalDigest) throw Error('Hashing the typedData returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (typed data) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n }\n\n // this 'magic' universal validator contract will deploy itself within the eth_call, try to verify the signature using\n // ERC-6492, ERC-1271 and ecrecover, and return the value to us\n const coder = new AbiCoder()\n let callResult\n try {\n const deploylessVerify = fromDescriptor(\n provider!,\n UniversalSigValidator,\n !network!.rpcNoStateOverride\n )\n const deploylessRes = await deploylessVerify.call('isValidSigWithSideEffects', [\n signer,\n finalDigest,\n signature\n ])\n if (deploylessRes[0] === true) callResult = '0x01'\n else if (deploylessRes[0] === false) callResult = '0x00'\n else callResult = deploylessRes[0]\n } catch (e: any) {\n throw new Error(\n `Validating the just signed message failed. Please try again or contact Ambire support if the issue persists. Error details: UniversalValidator call failed, more details: ${\n // TODO: Use the `reason` from the decodeError(e) instead, when this case is better handled in there\n e?.message || 'missing'\n }`\n )\n }\n\n if (callResult === '0x01') return true\n if (callResult === '0x00') return false\n if (callResult.startsWith('0x08c379a0'))\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details:: ${\n coder.decode(['string'], `0x${callResult.slice(10)}`)[0]\n }`\n )\n\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details: unexpected result from the UniversalValidator: ${callResult}`\n )\n}\n\n// Authorize the execute calls according to the version of the smart account\nexport async function getExecuteSignature(\n network: Network,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n) {\n // if we're authorizing calls for a v1 contract, we do a sign message\n // on the hash of the calls\n if (!accountState.isV2) {\n const message = hexlify(accountOpSignableHash(accountOp, network.chainId))\n return wrapStandard(await signer.signMessage(message))\n }\n\n // txns for v2 contracts are always eip-712 so we put the hash of the calls\n // in eip-712 format\n const typedData = getTypedData(\n network.chainId,\n accountState.accountAddr,\n hexlify(accountOpSignableHash(accountOp, network.chainId))\n )\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getPlainTextSignature(\n message: string | Uint8Array,\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n): Promise {\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n\n let messageHex\n if (message instanceof Uint8Array) {\n messageHex = hexlify(message)\n } else if (!isHexString(message)) {\n messageHex = hexlify(toUtf8Bytes(message))\n } else {\n messageHex = message\n }\n\n if (!account.creation) {\n const signature = await signer.signMessage(messageHex)\n return signature\n }\n\n if (!accountState.isV2) {\n const lowercaseHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.toLowerCase().slice(2)))\n const checksummedHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.slice(2)))\n const asciiAddrLowerCase = account.addr.toLowerCase()\n const humanReadableMsg = message instanceof Uint8Array ? hexlify(message) : message\n\n const isAsciiAddressInMessage = humanReadableMsg.toLowerCase().includes(asciiAddrLowerCase)\n const isLowercaseHexAddressInMessage = humanReadableMsg.includes(\n lowercaseHexAddrWithout0x.slice(2)\n )\n const isChecksummedHexAddressInMessage = humanReadableMsg.includes(\n checksummedHexAddrWithout0x.slice(2)\n )\n\n if (\n !network.predefined &&\n !relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n ) {\n throw new Error(`Signing messages is disallowed for v1 accounts on ${network.name}`)\n }\n\n if (\n isAsciiAddressInMessage ||\n isLowercaseHexAddressInMessage ||\n isChecksummedHexAddressInMessage\n ) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n throw new Error(\n 'Signing messages is disallowed for v1 accounts. Please contact support to proceed'\n )\n }\n\n // if it's safe, we proceed\n if (dedicatedToOneSA) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n // in case of only_standard priv key, we transform the data\n // for signing to EIP-712. This is because the key is not labeled safe\n // and it should inform the user that he's performing an Ambire Op.\n // This is important as this key could be a metamask one and someone\n // could be phishing him into approving an Ambire Op without him\n // knowing\n const typedData = getTypedData(network!.chainId, account.addr, hashMessage(getBytes(messageHex)))\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getEIP712Signature(\n message: TypedMessage,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner,\n network: Network\n): Promise {\n if (!message.types.EIP712Domain) {\n throw new Error(\n 'Ambire only supports signing EIP712 typed data messages. Please try again with a valid EIP712 message.'\n )\n }\n if (!message.primaryType) {\n throw new Error(\n 'The primaryType is missing in the typed data message incoming. Please try again with a valid EIP712 message.'\n )\n }\n\n if (!account.creation) {\n const signature = await signer.signTypedData(message)\n return signature\n }\n\n if (!accountState.isV2) {\n const asString = JSON.stringify(message).toLowerCase()\n if (\n asString.indexOf(account.addr.toLowerCase()) !== -1 ||\n (message.domain.name === 'Permit2' &&\n message.domain.verifyingContract &&\n getAddress(message.domain.verifyingContract) === PERMIT_2_ADDRESS &&\n message.message &&\n message.message.spender &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === getAddress(message.message.spender))\n ) {\n return wrapUnprotected(await signer.signTypedData(message))\n }\n\n throw new Error(\n 'Signing this eip-712 message is disallowed for v1 accounts as it does not contain the smart account address and therefore deemed unsafe'\n )\n }\n\n // we do not allow signers who are not dedicated to one account to sign eip-712\n // messsages in v2 as it could lead to reusing that key from\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n if (!dedicatedToOneSA) {\n throw new Error(\n `Signer with address ${signer.key.addr} does not have privileges to execute this operation. Please choose a different signer and try again`\n )\n }\n\n if ('AmbireReadableOperation' in message.types) {\n const ambireReadableOperation = message.message as AmbireReadableOperation\n if (isSameAddr(ambireReadableOperation.addr, account.addr)) {\n throw new Error(\n 'signature error: trying to sign an AmbireReadableOperation for the same address. Please contact support'\n )\n }\n\n const hash = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n const ambireOperation = getTypedData(ambireReadableOperation.chainId, account.addr, hash)\n const signature = wrapStandard(await signer.signTypedData(ambireOperation))\n return wrapWallet(signature, account.addr)\n }\n\n return wrapUnprotected(await signer.signTypedData(message))\n}\n\n// get the typedData for the first ERC-4337 deploy txn\nexport async function getEntryPointAuthorization(addr: AccountId, chainId: bigint, nonce: bigint) {\n const hash = getSignableHash(addr, chainId, nonce, [callToTuple(getActivatorCall(addr))])\n return getTypedData(chainId, addr, hexlify(hash))\n}\n\nexport function adjustEntryPointAuthorization(signature: string): string {\n let entryPointSig = signature\n\n // if thet signature is wrapepd in magicBytes because of eip-6492, unwrap it\n if (signature.endsWith(magicBytes)) {\n const coder = new AbiCoder()\n const decoded = coder.decode(\n ['address', 'bytes', 'bytes'],\n signature.substring(0, signature.length - magicBytes.length)\n )\n entryPointSig = decoded[2]\n }\n\n // since normally when we sign an EIP-712 request, we wrap it in Unprotected,\n // we adjust the entry point authorization signature so we could execute a txn\n return wrapStandard(entryPointSig.substring(0, entryPointSig.length - 2))\n}\n"]} \ No newline at end of file +{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../src/libs/signMessage/signMessage.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n AbiCoder,\n getAddress,\n getBytes,\n hashMessage,\n hexlify,\n Interface,\n isHexString,\n JsonRpcProvider,\n toBeHex,\n toUtf8Bytes,\n TypedDataDomain,\n TypedDataEncoder,\n TypedDataField\n} from 'ethers'\n\nimport UniversalSigValidator from '../../../contracts/compiled/UniversalSigValidator.json'\nimport { PERMIT_2_ADDRESS, UNISWAP_UNIVERSAL_ROUTERS } from '../../consts/addresses'\nimport { Account, AccountCreation, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { Hex } from '../../interfaces/hex'\nimport { KeystoreSigner } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { TypedMessage } from '../../interfaces/userRequest'\nimport hexStringToUint8Array from '../../utils/hexStringToUint8Array'\nimport isSameAddr from '../../utils/isSameAddr'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix'\nimport {\n AccountOp,\n accountOpSignableHash,\n callToTuple,\n getSignableHash\n} from '../accountOp/accountOp'\nimport { fromDescriptor } from '../deployless/deployless'\nimport { relayerAdditionalNetworks } from '../networks/networks'\nimport { getActivatorCall } from '../userOperation/userOperation'\n\n// EIP6492 signature ends in magicBytes, which ends with a 0x92,\n// which makes it is impossible for it to collide with a valid ecrecover signature if packed in the r,s,v format,\n// as 0x92 is not a valid value for v.\nconst magicBytes = '6492649264926492649264926492649264926492649264926492649264926492'\n\nexport const EIP_1271_NOT_SUPPORTED_BY = [\n 'opensea.io',\n 'paraswap.xyz',\n 'blur.io',\n 'aevo.xyz',\n 'socialscan.io',\n 'tally.xyz',\n 'questn.com'\n]\n\n/**\n * For Unprotected signatures, we need to append 00 at the end\n * for ambire to recognize it\n */\nexport const wrapUnprotected = (signature: string) => {\n return `${signature}00`\n}\n\n/**\n * For EIP-712 signatures, we need to append 01 at the end\n * for ambire to recognize it.\n * For v1 contracts, we do ETH sign at the 01 slot, which we'll\n * call standard from now on\n */\nexport const wrapStandard = (signature: string) => {\n return `${signature}01`\n}\n\n/**\n * For v2 accounts acting as signers, we need to append the v2 wallet\n * addr that's the signer and a 02 mode at the end to indicate it's a wallet:\n * {sig+mode}{wallet_32bytes}{mode}\n */\nexport const wrapWallet = (signature: string, walletAddr: string) => {\n const wallet32bytes = `${stripHexPrefix(toBeHex(0, 12))}${stripHexPrefix(walletAddr)}`\n return `${signature}${wallet32bytes}02`\n}\n\n// allow v1 accounts to have v2 signers\ninterface AmbireReadableOperation {\n addr: Hex\n chainId: bigint\n nonce: bigint\n calls: { to: Hex; value: bigint; data: Hex }[]\n}\n\nexport const getAmbireReadableTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n v1Execute: AmbireReadableOperation\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n Calls: [\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' }\n ],\n AmbireReadableOperation: [\n { name: 'account', type: 'address' },\n { name: 'chainId', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'calls', type: 'Calls[]' }\n ]\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message: v1Execute,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Return the typed data for EIP-712 sign\n */\nexport const getTypedData = (\n chainId: bigint,\n verifyingAddr: string,\n msgHash: string\n): TypedMessage => {\n const domain: TypedDataDomain = {\n name: 'Ambire',\n version: '1',\n chainId: chainId.toString(),\n verifyingContract: verifyingAddr,\n salt: toBeHex(0, 32)\n }\n const types = {\n EIP712Domain: [\n {\n name: 'name',\n type: 'string'\n },\n {\n name: 'version',\n type: 'string'\n },\n {\n name: 'chainId',\n type: 'uint256'\n },\n {\n name: 'verifyingContract',\n type: 'address'\n },\n {\n name: 'salt',\n type: 'bytes32'\n }\n ],\n AmbireOperation: [\n { name: 'account', type: 'address' },\n { name: 'hash', type: 'bytes32' }\n ]\n }\n const message = {\n account: verifyingAddr,\n hash: msgHash\n }\n\n return {\n kind: 'typedMessage',\n domain,\n types,\n message,\n primaryType: 'AmbireOperation'\n }\n}\n\n/**\n * Produce EIP6492 signature for Predeploy Contracts\n *\n * More info: https://eips.ethereum.org/EIPS/eip-6492\n *\n * @param {string} signature - origin ERC-1271 signature\n * @param {object} account\n * @returns {string} - EIP6492 signature\n */\nexport const wrapCounterfactualSign = (signature: string, creation: AccountCreation) => {\n const ABI = ['function deploy(bytes code, uint256 salt)']\n const iface = new Interface(ABI)\n const factoryCallData = iface.encodeFunctionData('deploy', [creation.bytecode, creation.salt])\n\n const coder = new AbiCoder()\n\n // EIP6492 signature\n return (\n coder.encode(\n ['address', 'bytes', 'bytes'],\n [creation.factoryAddr, factoryCallData, signature]\n ) + magicBytes\n )\n}\n\nexport function mapSignatureV(sigRaw: string) {\n const sig = hexStringToUint8Array(sigRaw)\n if (sig[64] < 27) sig[64] += 27\n return hexlify(sig)\n}\n\ntype Props = {\n network?: Network\n provider?: JsonRpcProvider\n signer?: string\n signature: string | Uint8Array\n message?: string | Uint8Array\n typedData?: {\n domain: TypedDataDomain\n types: Record>\n message: Record\n }\n finalDigest?: string\n}\n\n/**\n * Verifies the signature of a message using the provided signer and signature\n * via a \"magic\" universal validator contract using the provided provider to\n * verify the signature on-chain. The contract deploys itself within the\n * `eth_call`, tries to verify the signature using ERC-6492, ERC-1271, and\n * `ecrecover`, and returns the value to the function.\n *\n * Note: you only need to pass one of: typedData, finalDigest, message\n */\nexport async function verifyMessage({\n network,\n provider,\n signer,\n signature,\n message,\n typedData,\n finalDigest\n}: (\n | Required>\n | Required>\n | Required>\n) &\n Props): Promise {\n if (message) {\n try {\n finalDigest = hashMessage(message)\n if (!finalDigest) throw Error('Hashing the message returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (standard) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n } else if (typedData) {\n // To resolve the \"ambiguous primary types or unused types\" error, remove\n // the `EIP712Domain` from `types` object. The domain type is inbuilt in\n // the EIP712 standard and hence TypedDataEncoder so you do not need to\n // specify it in the types, see:\n // {@link https://ethereum.stackexchange.com/a/151930}\n const typesWithoutEIP712Domain = { ...typedData.types }\n if (typesWithoutEIP712Domain.EIP712Domain) {\n // eslint-disable-next-line no-param-reassign\n delete typesWithoutEIP712Domain.EIP712Domain\n }\n\n try {\n // the final digest for AmbireReadableOperation is the execute hash\n // as it's wrapped in mode.standard and onchain gets transformed to\n // an AmbireOperation\n if ('AmbireReadableOperation' in typedData.types) {\n const ambireReadableOperation = typedData.message as AmbireReadableOperation\n finalDigest = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n } else {\n finalDigest = TypedDataEncoder.hash(\n typedData.domain,\n typesWithoutEIP712Domain,\n typedData.message\n )\n }\n\n if (!finalDigest) throw Error('Hashing the typedData returned no (falsy) result.')\n } catch (e: any) {\n throw Error(\n `Preparing the just signed (typed data) message for validation failed. Please try again or contact Ambire support if the issue persists. Error details: ${\n e?.message || 'missing'\n }`\n )\n }\n }\n\n // this 'magic' universal validator contract will deploy itself within the eth_call, try to verify the signature using\n // ERC-6492, ERC-1271 and ecrecover, and return the value to us\n const coder = new AbiCoder()\n let callResult\n try {\n const deploylessVerify = fromDescriptor(\n provider!,\n UniversalSigValidator,\n !network!.rpcNoStateOverride\n )\n const deploylessRes = await deploylessVerify.call('isValidSigWithSideEffects', [\n signer,\n finalDigest,\n signature\n ])\n if (deploylessRes[0] === true) callResult = '0x01'\n else if (deploylessRes[0] === false) callResult = '0x00'\n else callResult = deploylessRes[0]\n } catch (e: any) {\n throw new Error(\n `Validating the just signed message failed. Please try again or contact Ambire support if the issue persists. Error details: UniversalValidator call failed, more details: ${\n // TODO: Use the `reason` from the decodeError(e) instead, when this case is better handled in there\n e?.message || 'missing'\n }`\n )\n }\n\n if (callResult === '0x01') return true\n if (callResult === '0x00') return false\n if (callResult.startsWith('0x08c379a0'))\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details:: ${\n coder.decode(['string'], `0x${callResult.slice(10)}`)[0]\n }`\n )\n\n throw new Error(\n `Ambire failed to validate the signature. Please make sure you are signing with the correct key or device. If the problem persists, please contact Ambire support. Error details: unexpected result from the UniversalValidator: ${callResult}`\n )\n}\n\n// Authorize the execute calls according to the version of the smart account\nexport async function getExecuteSignature(\n network: Network,\n accountOp: AccountOp,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n) {\n // if we're authorizing calls for a v1 contract, we do a sign message\n // on the hash of the calls\n if (!accountState.isV2) {\n const message = hexlify(accountOpSignableHash(accountOp, network.chainId))\n return wrapStandard(await signer.signMessage(message))\n }\n\n // txns for v2 contracts are always eip-712 so we put the hash of the calls\n // in eip-712 format\n const typedData = getTypedData(\n network.chainId,\n accountState.accountAddr,\n hexlify(accountOpSignableHash(accountOp, network.chainId))\n )\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getPlainTextSignature(\n message: string | Uint8Array,\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner\n): Promise {\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n\n let messageHex\n if (message instanceof Uint8Array) {\n messageHex = hexlify(message)\n } else if (!isHexString(message)) {\n messageHex = hexlify(toUtf8Bytes(message))\n } else {\n messageHex = message\n }\n\n if (!account.creation) {\n const signature = await signer.signMessage(messageHex)\n return signature\n }\n\n if (!accountState.isV2) {\n const lowercaseHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.toLowerCase().slice(2)))\n const checksummedHexAddrWithout0x = hexlify(toUtf8Bytes(account.addr.slice(2)))\n const asciiAddrLowerCase = account.addr.toLowerCase()\n const humanReadableMsg = message instanceof Uint8Array ? hexlify(message) : message\n\n const isAsciiAddressInMessage = humanReadableMsg.toLowerCase().includes(asciiAddrLowerCase)\n const isLowercaseHexAddressInMessage = humanReadableMsg.includes(\n lowercaseHexAddrWithout0x.slice(2)\n )\n const isChecksummedHexAddressInMessage = humanReadableMsg.includes(\n checksummedHexAddrWithout0x.slice(2)\n )\n\n if (\n !network.predefined &&\n !relayerAdditionalNetworks.find((net) => net.chainId === network.chainId)\n ) {\n throw new Error(`Signing messages is disallowed for v1 accounts on ${network.name}`)\n }\n\n if (\n isAsciiAddressInMessage ||\n isLowercaseHexAddressInMessage ||\n isChecksummedHexAddressInMessage\n ) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n throw new Error(\n 'Signing messages is disallowed for v1 accounts. Please contact support to proceed'\n )\n }\n\n // if it's safe, we proceed\n if (dedicatedToOneSA) {\n return wrapUnprotected(await signer.signMessage(messageHex))\n }\n\n // in case of only_standard priv key, we transform the data\n // for signing to EIP-712. This is because the key is not labeled safe\n // and it should inform the user that he's performing an Ambire Op.\n // This is important as this key could be a metamask one and someone\n // could be phishing him into approving an Ambire Op without him\n // knowing\n const typedData = getTypedData(network!.chainId, account.addr, hashMessage(getBytes(messageHex)))\n return wrapStandard(await signer.signTypedData(typedData))\n}\n\nexport async function getEIP712Signature(\n message: TypedMessage,\n account: Account,\n accountState: AccountOnchainState,\n signer: KeystoreSigner,\n network: Network\n): Promise {\n if (!message.types.EIP712Domain) {\n throw new Error(\n 'Ambire only supports signing EIP712 typed data messages. Please try again with a valid EIP712 message.'\n )\n }\n if (!message.primaryType) {\n throw new Error(\n 'The primaryType is missing in the typed data message incoming. Please try again with a valid EIP712 message.'\n )\n }\n\n if (!account.creation) {\n const signature = await signer.signTypedData(message)\n return signature\n }\n\n if (!accountState.isV2) {\n const asString = JSON.stringify(message).toLowerCase()\n if (\n asString.indexOf(account.addr.toLowerCase()) !== -1 ||\n (message.domain.name === 'Permit2' &&\n message.domain.verifyingContract &&\n getAddress(message.domain.verifyingContract) === PERMIT_2_ADDRESS &&\n message.message &&\n message.message.spender &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] &&\n UNISWAP_UNIVERSAL_ROUTERS[Number(network.chainId)] === getAddress(message.message.spender))\n ) {\n return wrapUnprotected(await signer.signTypedData(message))\n }\n\n throw new Error(\n 'Signing this eip-712 message is disallowed for v1 accounts as it does not contain the smart account address and therefore deemed unsafe'\n )\n }\n\n // we do not allow signers who are not dedicated to one account to sign eip-712\n // messsages in v2 as it could lead to reusing that key from\n const dedicatedToOneSA = signer.key.dedicatedToOneSA\n if (!dedicatedToOneSA) {\n throw new Error(\n `Signer with address ${signer.key.addr} does not have privileges to execute this operation. Please choose a different signer and try again`\n )\n }\n\n if ('AmbireReadableOperation' in message.types) {\n const ambireReadableOperation = message.message as AmbireReadableOperation\n if (isSameAddr(ambireReadableOperation.addr, account.addr)) {\n throw new Error(\n 'signature error: trying to sign an AmbireReadableOperation for the same address. Please contact support'\n )\n }\n\n const hash = hexlify(\n getSignableHash(\n ambireReadableOperation.addr,\n ambireReadableOperation.chainId,\n ambireReadableOperation.nonce,\n ambireReadableOperation.calls.map(callToTuple)\n )\n )\n const ambireOperation = getTypedData(ambireReadableOperation.chainId, account.addr, hash)\n const signature = wrapStandard(await signer.signTypedData(ambireOperation))\n return wrapWallet(signature, account.addr)\n }\n\n return wrapUnprotected(await signer.signTypedData(message))\n}\n\n// get the typedData for the first ERC-4337 deploy txn\nexport async function getEntryPointAuthorization(addr: AccountId, chainId: bigint, nonce: bigint) {\n const hash = getSignableHash(addr, chainId, nonce, [callToTuple(getActivatorCall(addr))])\n return getTypedData(chainId, addr, hexlify(hash))\n}\n\nexport function adjustEntryPointAuthorization(signature: string): string {\n let entryPointSig = signature\n\n // if thet signature is wrapepd in magicBytes because of eip-6492, unwrap it\n if (signature.endsWith(magicBytes)) {\n const coder = new AbiCoder()\n const decoded = coder.decode(\n ['address', 'bytes', 'bytes'],\n signature.substring(0, signature.length - magicBytes.length)\n )\n entryPointSig = decoded[2]\n }\n\n // since normally when we sign an EIP-712 request, we wrap it in Unprotected,\n // we adjust the entry point authorization signature so we could execute a txn\n return wrapStandard(entryPointSig.substring(0, entryPointSig.length - 2))\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.js b/dist/src/libs/singleton/singleton.js index e39838a1c..1628c9695 100644 --- a/dist/src/libs/singleton/singleton.js +++ b/dist/src/libs/singleton/singleton.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getGasUsed = void 0; // Special exception for the singleton deployer: // Estimation on various networks depends entirely on the RPC // implementation of eth_estimateGas. On ethereum, the RPC tends @@ -17,11 +20,12 @@ // The backside to this is that txns to the singleton can overestimate. // Overestimation is now so bad, though. If the real gas is lower, the funds // will not be taken from the user. Underestimation is worse as txn fails. -export function getGasUsed(gasUsed) { +function getGasUsed(gasUsed) { if (gasUsed < 4500000n) return 4500000n; if (gasUsed > 10000000n) return gasUsed * 5n; return gasUsed; } +exports.getGasUsed = getGasUsed; //# sourceMappingURL=singleton.js.map \ No newline at end of file diff --git a/dist/src/libs/singleton/singleton.js.map b/dist/src/libs/singleton/singleton.js.map index da9b0d0c1..f1c3100bc 100644 --- a/dist/src/libs/singleton/singleton.js.map +++ b/dist/src/libs/singleton/singleton.js.map @@ -1 +1 @@ -{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../../../src/libs/singleton/singleton.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,6DAA6D;AAC7D,gEAAgE;AAChE,kEAAkE;AAClE,0CAA0C;AAC1C,EAAE;AACF,sEAAsE;AACtE,kEAAkE;AAClE,mDAAmD;AACnD,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,yBAAyB;AACzB,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAEvC,IAAI,OAAO,GAAG,SAAS;QAAE,OAAO,OAAO,GAAG,EAAE,CAAA;IAE5C,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["// Special exception for the singleton deployer:\n// Estimation on various networks depends entirely on the RPC\n// implementation of eth_estimateGas. On ethereum, the RPC tends\n// to return ~6kk for our deploy contracts call, which is great as\n// the txn will pass (it needs about 4kk).\n//\n// On polygon though, it returns ~600k, meaning the txn will fail with\n// out of gas without any warnings to the user. That's why we need\n// to manually up the gasUsed to at least 4500000n,\n//\n// Then come networks with wild gas estimations above 10m (Arbitrum, Mantle)\n// Because of the blob updates, networks fees on this networks have lowered\n// dramatically. But no RPC can estimate correctly how much gas is need to\n// correctly deploy on the network. That's why we do a multiplication by 5\n// and hope for the best.\n//\n// The backside to this is that txns to the singleton can overestimate.\n// Overestimation is now so bad, though. If the real gas is lower, the funds\n// will not be taken from the user. Underestimation is worse as txn fails.\nexport function getGasUsed(gasUsed: bigint): bigint {\n if (gasUsed < 4500000n) return 4500000n\n\n if (gasUsed > 10000000n) return gasUsed * 5n\n\n return gasUsed\n}\n"]} \ No newline at end of file +{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../../../src/libs/singleton/singleton.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAChD,6DAA6D;AAC7D,gEAAgE;AAChE,kEAAkE;AAClE,0CAA0C;AAC1C,EAAE;AACF,sEAAsE;AACtE,kEAAkE;AAClE,mDAAmD;AACnD,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,yBAAyB;AACzB,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,SAAgB,UAAU,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAEvC,IAAI,OAAO,GAAG,SAAS;QAAE,OAAO,OAAO,GAAG,EAAE,CAAA;IAE5C,OAAO,OAAO,CAAA;AAChB,CAAC;AAND,gCAMC","sourcesContent":["// Special exception for the singleton deployer:\n// Estimation on various networks depends entirely on the RPC\n// implementation of eth_estimateGas. On ethereum, the RPC tends\n// to return ~6kk for our deploy contracts call, which is great as\n// the txn will pass (it needs about 4kk).\n//\n// On polygon though, it returns ~600k, meaning the txn will fail with\n// out of gas without any warnings to the user. That's why we need\n// to manually up the gasUsed to at least 4500000n,\n//\n// Then come networks with wild gas estimations above 10m (Arbitrum, Mantle)\n// Because of the blob updates, networks fees on this networks have lowered\n// dramatically. But no RPC can estimate correctly how much gas is need to\n// correctly deploy on the network. That's why we do a multiplication by 5\n// and hope for the best.\n//\n// The backside to this is that txns to the singleton can overestimate.\n// Overestimation is now so bad, though. If the real gas is lower, the funds\n// will not be taken from the user. Underestimation is worse as txn fails.\nexport function getGasUsed(gasUsed: bigint): bigint {\n if (gasUsed < 4500000n) return 4500000n\n\n if (gasUsed > 10000000n) return gasUsed * 5n\n\n return gasUsed\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.js b/dist/src/libs/swapAndBridge/swapAndBridge.js index 863947429..cd756c47e 100644 --- a/dist/src/libs/swapAndBridge/swapAndBridge.js +++ b/dist/src/libs/swapAndBridge/swapAndBridge.js @@ -1,7 +1,11 @@ -import { Contract, getAddress, Interface, MaxUint256 } from 'ethers'; -import ERC20 from '../../../contracts/compiled/IERC20.json'; -import { isSmartAccount } from '../account/account'; -import { getTokenBalanceInUSD } from '../portfolio/helpers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getActiveRoutesForAccount = exports.buildSwapAndBridgeUserRequests = exports.getActiveRoutesUpdateInterval = exports.getActiveRoutesLowestServiceTime = exports.getQuoteRouteSteps = exports.getIsNetworkSupported = exports.getIsBridgeTxn = exports.convertPortfolioTokenToSocketAPIToken = exports.getIsTokenEligibleForSwapAndBridge = exports.sortPortfolioTokenList = exports.sortTokenListResponse = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const IERC20_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/IERC20.json")); +const account_1 = require("../account/account"); +const helpers_1 = require("../portfolio/helpers"); const sortTokensByPendingAndBalance = (a, b) => { // Pending tokens go on top const isAPending = typeof a.amountPostSimulation === 'bigint' && a.amountPostSimulation !== BigInt(a.amount); @@ -11,13 +15,13 @@ const sortTokensByPendingAndBalance = (a, b) => { if (!isAPending && isBPending) return 1; // Otherwise, higher balance comes first - const aBalanceUSD = getTokenBalanceInUSD(a); - const bBalanceUSD = getTokenBalanceInUSD(b); + const aBalanceUSD = (0, helpers_1.getTokenBalanceInUSD)(a); + const bBalanceUSD = (0, helpers_1.getTokenBalanceInUSD)(b); if (aBalanceUSD !== bBalanceUSD) return bBalanceUSD - aBalanceUSD; return 0; }; -export const sortTokenListResponse = (tokenListResponse, accountPortfolioTokenList) => { +const sortTokenListResponse = (tokenListResponse, accountPortfolioTokenList) => { return tokenListResponse.sort((a, b) => { const aInPortfolio = accountPortfolioTokenList.find((t) => t.address === a.address); const bInPortfolio = accountPortfolioTokenList.find((t) => t.address === b.address); @@ -35,7 +39,8 @@ export const sortTokenListResponse = (tokenListResponse, accountPortfolioTokenLi return (a.name || '').localeCompare(b.name || ''); }); }; -export const sortPortfolioTokenList = (accountPortfolioTokenList) => { +exports.sortTokenListResponse = sortTokenListResponse; +const sortPortfolioTokenList = (accountPortfolioTokenList) => { return accountPortfolioTokenList.sort((a, b) => { const comparisonResult = sortTokensByPendingAndBalance(a, b); if (comparisonResult !== 0) @@ -44,11 +49,12 @@ export const sortPortfolioTokenList = (accountPortfolioTokenList) => { return (a.symbol || '').localeCompare(b.symbol || ''); }); }; +exports.sortPortfolioTokenList = sortPortfolioTokenList; /** * Determines if a token is eligible for swapping and bridging. * Not all tokens in the portfolio are eligible. */ -export const getIsTokenEligibleForSwapAndBridge = (token) => { +const getIsTokenEligibleForSwapAndBridge = (token) => { // Prevent filtering out tokens with amountPostSimulation = 0 if the actual amount is positive. // This ensures the token remains in the list when sending the full amount of it const amount = token.amountPostSimulation === 0n && token.amount > 0n @@ -63,7 +69,8 @@ export const getIsTokenEligibleForSwapAndBridge = (token) => { !token.flags.rewardsType && hasPositiveBalance); }; -export const convertPortfolioTokenToSocketAPIToken = (portfolioToken, chainId) => { +exports.getIsTokenEligibleForSwapAndBridge = getIsTokenEligibleForSwapAndBridge; +const convertPortfolioTokenToSocketAPIToken = (portfolioToken, chainId) => { const { address, decimals, symbol } = portfolioToken; // Although name and symbol will be the same, it's better than having "No name" in the UI (valid use-case) const name = symbol; @@ -73,6 +80,7 @@ export const convertPortfolioTokenToSocketAPIToken = (portfolioToken, chainId) = const logoURI = ''; return { address, chainId, decimals, symbol, name, icon, logoURI }; }; +exports.convertPortfolioTokenToSocketAPIToken = convertPortfolioTokenToSocketAPIToken; const getQuoteRouteSteps = (userTxs) => { return userTxs.reduce((stepsAcc, tx) => { if (tx.userTxType === 'fund-movr') { @@ -96,6 +104,7 @@ const getQuoteRouteSteps = (userTxs) => { return stepsAcc; }, []); }; +exports.getQuoteRouteSteps = getQuoteRouteSteps; const getActiveRoutesLowestServiceTime = (activeRoutes) => { const serviceTimes = []; activeRoutes.forEach((r) => r.route.userTxs.forEach((tx) => { @@ -105,6 +114,7 @@ const getActiveRoutesLowestServiceTime = (activeRoutes) => { })); return serviceTimes.sort((a, b) => a - b)[0]; }; +exports.getActiveRoutesLowestServiceTime = getActiveRoutesLowestServiceTime; const getActiveRoutesUpdateInterval = (minServiceTime) => { if (!minServiceTime) return 7000; @@ -118,13 +128,14 @@ const getActiveRoutesUpdateInterval = (minServiceTime) => { return 12000; return 15000; }; +exports.getActiveRoutesUpdateInterval = getActiveRoutesUpdateInterval; const buildRevokeApprovalIfNeeded = async (userTx, account, provider) => { if (!userTx.approvalData) return; - const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider); - const requiredAmount = isSmartAccount(account) + const erc20Contract = new ethers_1.Contract(userTx.approvalData.approvalTokenAddress, IERC20_json_1.default.abi, provider); + const requiredAmount = (0, account_1.isSmartAccount)(account) ? BigInt(userTx.approvalData.minimumApprovalAmount) - : MaxUint256; + : ethers_1.MaxUint256; const approveCallData = erc20Contract.interface.encodeFunctionData('approve', [ userTx.approvalData.allowanceTarget, requiredAmount @@ -152,10 +163,10 @@ const buildRevokeApprovalIfNeeded = async (userTx, account, provider) => { }; }; const buildSwapAndBridgeUserRequests = async (userTx, networkId, account, provider) => { - if (isSmartAccount(account)) { + if ((0, account_1.isSmartAccount)(account)) { const calls = []; if (userTx.approvalData) { - const erc20Interface = new Interface(ERC20.abi); + const erc20Interface = new ethers_1.Interface(IERC20_json_1.default.abi); const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider); if (revokeApproval) calls.push(revokeApproval); @@ -195,10 +206,10 @@ const buildSwapAndBridgeUserRequests = async (userTx, networkId, account, provid const requests = []; let shouldBuildSwapOrBridgeTx = true; if (userTx.approvalData) { - const erc20Interface = new Interface(ERC20.abi); + const erc20Interface = new ethers_1.Interface(IERC20_json_1.default.abi); let shouldApprove = true; try { - const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider); + const erc20Contract = new ethers_1.Contract(userTx.approvalData.approvalTokenAddress, IERC20_json_1.default.abi, provider); const allowance = await erc20Contract.allowance(userTx.approvalData.owner, userTx.approvalData.allowanceTarget); // check if an approval already exists if (BigInt(allowance) >= BigInt(userTx.approvalData.minimumApprovalAmount)) @@ -232,7 +243,7 @@ const buildSwapAndBridgeUserRequests = async (userTx, networkId, account, provid value: BigInt('0'), data: erc20Interface.encodeFunctionData('approve', [ userTx.approvalData.allowanceTarget, - MaxUint256 // approve the max possible amount for better UX on BA + ethers_1.MaxUint256 // approve the max possible amount for better UX on BA ]), fromUserRequestId: `${userTx.activeRouteId}-approval` } @@ -276,20 +287,23 @@ const buildSwapAndBridgeUserRequests = async (userTx, networkId, account, provid } return requests; }; -export const getIsBridgeTxn = (userTxType) => userTxType === 'fund-movr'; +exports.buildSwapAndBridgeUserRequests = buildSwapAndBridgeUserRequests; +const getIsBridgeTxn = (userTxType) => userTxType === 'fund-movr'; +exports.getIsBridgeTxn = getIsBridgeTxn; /** * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0 * there are 16 networks supported, so user could have (many) custom networks that are not. */ -export const getIsNetworkSupported = (supportedChainIds, network) => { +const getIsNetworkSupported = (supportedChainIds, network) => { // Assume supported if missing (and receive no results when attempting to use // a not-supported network) than the alternative - blocking the UI. if (!supportedChainIds.length || !network) return true; return supportedChainIds.includes(network.chainId); }; +exports.getIsNetworkSupported = getIsNetworkSupported; const getActiveRoutesForAccount = (accountAddress, activeRoutes) => { - return activeRoutes.filter((r) => getAddress(r.route.sender || r.route.userAddress) === accountAddress); + return activeRoutes.filter((r) => (0, ethers_1.getAddress)(r.route.sender || r.route.userAddress) === accountAddress); }; -export { getQuoteRouteSteps, getActiveRoutesLowestServiceTime, getActiveRoutesUpdateInterval, buildSwapAndBridgeUserRequests, getActiveRoutesForAccount }; +exports.getActiveRoutesForAccount = getActiveRoutesForAccount; //# sourceMappingURL=swapAndBridge.js.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.js.map b/dist/src/libs/swapAndBridge/swapAndBridge.js.map index ba329cb34..8eb8b1cda 100644 --- a/dist/src/libs/swapAndBridge/swapAndBridge.js.map +++ b/dist/src/libs/swapAndBridge/swapAndBridge.js.map @@ -1 +1 @@ -{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEpE,OAAO,KAAK,MAAM,yCAAyC,CAAA;AAc3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAE3D,MAAM,6BAA6B,GAAG,CAAC,CAAc,EAAE,CAAc,EAAE,EAAE;IACvE,2BAA2B;IAC3B,MAAM,UAAU,GACd,OAAO,CAAC,CAAC,oBAAoB,KAAK,QAAQ,IAAI,CAAC,CAAC,oBAAoB,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC3F,MAAM,UAAU,GACd,OAAO,CAAC,CAAC,oBAAoB,KAAK,QAAQ,IAAI,CAAC,CAAC,oBAAoB,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE3F,IAAI,UAAU,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,CAAA;IACxC,IAAI,CAAC,UAAU,IAAI,UAAU;QAAE,OAAO,CAAC,CAAA;IAEvC,wCAAwC;IACxC,MAAM,WAAW,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAA;IAC3C,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,WAAW,GAAG,WAAW,CAAA;IAEjE,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,iBAAyC,EACzC,yBAAwC,EACxC,EAAE;IACF,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAiB,EAAE,CAAiB,EAAE,EAAE;QACrE,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;QACnF,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;QAEnF,wCAAwC;QACxC,IAAI,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC,CAAA;QAC5C,IAAI,CAAC,YAAY,IAAI,YAAY;YAAE,OAAO,CAAC,CAAA;QAE3C,IAAI,YAAY,IAAI,YAAY,EAAE;YAChC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YAClF,IAAI,gBAAgB,KAAK,CAAC;gBAAE,OAAO,gBAAgB,CAAA;SACpD;QAED,+BAA+B;QAC/B,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,yBAAwC,EAAE,EAAE;IACjF,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5D,IAAI,gBAAgB,KAAK,CAAC;YAAE,OAAO,gBAAgB,CAAA;QAEnD,+BAA+B;QAC/B,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,KAAkB,EAAE,EAAE;IACvE,+FAA+F;IAC/F,gFAAgF;IAChF,MAAM,MAAM,GACV,KAAK,CAAC,oBAAoB,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QACpD,CAAC,CAAC,KAAK,CAAC,MAAM;QACd,CAAC,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,CAAA;IAChD,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7C,OAAO;IACL,+EAA+E;IAC/E,+EAA+E;IAC/E,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS;QACtB,oEAAoE;QACpE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW;QACxB,kBAAkB,CACnB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAG,CACnD,cAA2B,EAC3B,OAAe,EACC,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAA;IACpD,0GAA0G;IAC1G,MAAM,IAAI,GAAG,MAAM,CAAA;IACnB,0EAA0E;IAC1E,sDAAsD;IACtD,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,MAAM,OAAO,GAAG,EAAE,CAAA;IAElB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AACpE,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,OAA0B,EAAE,EAAE;IACxD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,QAAyB,EAAE,EAAE,EAAE,EAAE;QACtD,IAAI,EAAE,CAAC,UAAU,KAAK,WAAW,EAAE;YACjC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;SAC9E;QACD,IAAI,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE;YAChC,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,EAAE,CAAC,WAAW;aAC5B,CAAC,CAAA;SACH;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA;AAED,MAAM,gCAAgC,GAAG,CAAC,YAA2B,EAAE,EAAE;IACvE,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAC7B,IAAK,EAA4B,CAAC,WAAW,EAAE;YAC7C,YAAY,CAAC,IAAI,CAAE,EAA4B,CAAC,WAAW,CAAC,CAAA;SAC7D;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC,CAAA;AAED,MAAM,6BAA6B,GAAG,CAAC,cAAuB,EAAE,EAAE;IAChE,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAA;IAEhC,IAAI,cAAc,GAAG,EAAE;QAAE,OAAO,IAAI,CAAA;IACpC,IAAI,cAAc,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,cAAc,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,cAAc,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IAEvC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,KAAK,EACvC,MAAuC,EACvC,OAAgB,EAChB,QAAqB,EACM,EAAE;IAC7B,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAM;IAChC,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IACjG,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC;QACnD,CAAC,CAAC,UAAU,CAAA;IACd,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE;QAC5E,MAAM,CAAC,YAAY,CAAC,eAAe;QACnC,cAAc;KACf,CAAC,CAAA;IAEF,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI;QACF,MAAM,QAAQ,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,oBAAoB;YAC5C,IAAI,EAAE,eAAe;SACtB,CAAC,CAAA;KACH;IAAC,OAAO,CAAC,EAAE;QACV,KAAK,GAAG,IAAI,CAAA;KACb;IAED,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,oBAAoB;QAC5C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QAClB,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE;YAC1D,MAAM,CAAC,YAAY,CAAC,eAAe;YACnC,MAAM,CAAC,CAAC,CAAC;SACV,CAAC;KACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,8BAA8B,GAAG,KAAK,EAC1C,MAAuC,EACvC,SAAiB,EACjB,OAAgB,EAChB,QAAqB,EACrB,EAAE;IACF,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAW,EAAE,CAAA;QACxB,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAE/C,MAAM,cAAc,GAAG,MAAM,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnF,IAAI,cAAc;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAE9C,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,oBAAoB;gBAC5C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;gBAClB,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE;oBACjD,MAAM,CAAC,YAAY,CAAC,eAAe;oBACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC;iBAClD,CAAC;gBACF,iBAAiB,EAAE,MAAM,CAAC,aAAa;aAChC,CAAC,CAAA;SACX;QAED,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,MAAM,CAAC,QAAQ;YACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,iBAAiB,EAAE,MAAM,CAAC,aAAa;SAChC,CAAC,CAAA;QAEV,OAAO;YACL;gBACE,EAAE,EAAE,MAAM,CAAC,aAAa;gBACxB,MAAM,EAAE;oBACN,IAAI,EAAE,OAAgB;oBACtB,KAAK;iBACN;gBACD,IAAI,EAAE;oBACJ,YAAY,EAAE,IAAI;oBAClB,SAAS;oBACT,WAAW,EAAE,OAAO,CAAC,IAAI;oBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,mBAAmB,EAAE,IAAI;iBAC1B;aACiB;SACrB,CAAA;KACF;IACD,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,IAAI,yBAAyB,GAAG,IAAI,CAAA;IACpC,IAAI,MAAM,CAAC,YAAY,EAAE;QACvB,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,aAAa,GAAG,IAAI,CAAA;QACxB,IAAI;YACF,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,MAAM,CAAC,YAAY,CAAC,oBAAoB,EACxC,KAAK,CAAC,GAAG,EACT,QAAQ,CACT,CAAA;YACD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,EACzB,MAAM,CAAC,YAAY,CAAC,eAAe,CACpC,CAAA;YACD,sCAAsC;YACtC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC;gBACxE,aAAa,GAAG,KAAK,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;SACrB;QAED,IAAI,aAAa,EAAE;YACjB,MAAM,cAAc,GAAG,MAAM,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnF,IAAI,cAAc,EAAE;gBAClB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,MAAM,CAAC,aAAa,kBAAkB;oBAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE;oBAC3D,IAAI,EAAE;wBACJ,YAAY,EAAE,IAAI;wBAClB,SAAS;wBACT,WAAW,EAAE,OAAO,CAAC,IAAI;wBACzB,mBAAmB,EAAE,IAAI;wBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;qBACpC;iBACiB,CAAC,CAAA;aACtB;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,MAAM,CAAC,aAAa,WAAW;gBACtC,MAAM,EAAE;oBACN,IAAI,EAAE,OAAgB;oBACtB,KAAK,EAAE;wBACL;4BACE,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,oBAAoB;4BAC5C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;4BAClB,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE;gCACjD,MAAM,CAAC,YAAY,CAAC,eAAe;gCACnC,UAAU,CAAC,sDAAsD;6BAClE,CAAC;4BACF,iBAAiB,EAAE,GAAG,MAAM,CAAC,aAAa,WAAW;yBAC9C;qBACV;iBACF;gBACD,IAAI,EAAE;oBACJ,YAAY,EAAE,IAAI;oBAClB,SAAS;oBACT,WAAW,EAAE,OAAO,CAAC,IAAI;oBACzB,mBAAmB,EAAE,IAAI;oBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;iBACpC;aACiB,CAAC,CAAA;YACrB,kGAAkG;YAClG,sDAAsD;YACtD,yBAAyB,GAAG,KAAK,CAAA;SAClC;KACF;IAED,IAAI,yBAAyB,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,MAAM,CAAC,aAAa;YACxB,MAAM,EAAE;gBACN,IAAI,EAAE,OAAgB;gBACtB,KAAK,EAAE;oBACL;wBACE,EAAE,EAAE,MAAM,CAAC,QAAQ;wBACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC3B,IAAI,EAAE,MAAM,CAAC,MAAM;wBACnB,iBAAiB,EAAE,MAAM,CAAC,aAAa;qBAChC;iBACV;aACF;YACD,IAAI,EAAE;gBACJ,YAAY,EAAE,IAAI;gBAClB,SAAS;gBACT,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,mBAAmB,EAAE,IAAI;gBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC;SACiB,CAAC,CAAA;KACtB;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAyC,EAAE,EAAE,CAC1E,UAAU,KAAK,WAAW,CAAA;AAE5B;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,iBAAuC,EACvC,OAAiB,EACjB,EAAE;IACF,6EAA6E;IAC7E,mEAAmE;IACnE,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEtD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,MAAM,yBAAyB,GAAG,CAAC,cAAsB,EAAE,YAA2B,EAAE,EAAE;IACxF,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,cAAc,CAC5E,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,EAC1B,CAAA","sourcesContent":["import { Contract, getAddress, Interface, MaxUint256 } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport {\n ActiveRoute,\n SocketAPIBridgeUserTx,\n SocketAPISendTransactionRequest,\n SocketAPIStep,\n SocketAPIToken,\n SocketAPIUserTx,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { SignUserRequest } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../account/account'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\nimport { getTokenBalanceInUSD } from '../portfolio/helpers'\n\nconst sortTokensByPendingAndBalance = (a: TokenResult, b: TokenResult) => {\n // Pending tokens go on top\n const isAPending =\n typeof a.amountPostSimulation === 'bigint' && a.amountPostSimulation !== BigInt(a.amount)\n const isBPending =\n typeof b.amountPostSimulation === 'bigint' && b.amountPostSimulation !== BigInt(b.amount)\n\n if (isAPending && !isBPending) return -1\n if (!isAPending && isBPending) return 1\n\n // Otherwise, higher balance comes first\n const aBalanceUSD = getTokenBalanceInUSD(a)\n const bBalanceUSD = getTokenBalanceInUSD(b)\n if (aBalanceUSD !== bBalanceUSD) return bBalanceUSD - aBalanceUSD\n\n return 0\n}\n\nexport const sortTokenListResponse = (\n tokenListResponse: SwapAndBridgeToToken[],\n accountPortfolioTokenList: TokenResult[]\n) => {\n return tokenListResponse.sort((a: SocketAPIToken, b: SocketAPIToken) => {\n const aInPortfolio = accountPortfolioTokenList.find((t) => t.address === a.address)\n const bInPortfolio = accountPortfolioTokenList.find((t) => t.address === b.address)\n\n // Tokens in portfolio should come first\n if (aInPortfolio && !bInPortfolio) return -1\n if (!aInPortfolio && bInPortfolio) return 1\n\n if (aInPortfolio && bInPortfolio) {\n const comparisonResult = sortTokensByPendingAndBalance(aInPortfolio, bInPortfolio)\n if (comparisonResult !== 0) return comparisonResult\n }\n\n // Otherwise, just alphabetical\n return (a.name || '').localeCompare(b.name || '')\n })\n}\n\nexport const sortPortfolioTokenList = (accountPortfolioTokenList: TokenResult[]) => {\n return accountPortfolioTokenList.sort((a, b) => {\n const comparisonResult = sortTokensByPendingAndBalance(a, b)\n if (comparisonResult !== 0) return comparisonResult\n\n // Otherwise, just alphabetical\n return (a.symbol || '').localeCompare(b.symbol || '')\n })\n}\n\n/**\n * Determines if a token is eligible for swapping and bridging.\n * Not all tokens in the portfolio are eligible.\n */\nexport const getIsTokenEligibleForSwapAndBridge = (token: TokenResult) => {\n // Prevent filtering out tokens with amountPostSimulation = 0 if the actual amount is positive.\n // This ensures the token remains in the list when sending the full amount of it\n const amount =\n token.amountPostSimulation === 0n && token.amount > 0n\n ? token.amount\n : token.amountPostSimulation ?? token.amount\n const hasPositiveBalance = Number(amount) > 0\n return (\n // The same token can be in the Gas Tank (or as a Reward) and in the portfolio.\n // Exclude the one in the Gas Tank (swapping Gas Tank tokens is not supported).\n !token.flags.onGasTank &&\n // And exclude the rewards ones (swapping rewards is not supported).\n !token.flags.rewardsType &&\n hasPositiveBalance\n )\n}\n\nexport const convertPortfolioTokenToSocketAPIToken = (\n portfolioToken: TokenResult,\n chainId: number\n): SocketAPIToken => {\n const { address, decimals, symbol } = portfolioToken\n // Although name and symbol will be the same, it's better than having \"No name\" in the UI (valid use-case)\n const name = symbol\n // Fine for not having both icon props, because this would fallback to the\n // icon discovery method used for the portfolio tokens\n const icon = ''\n const logoURI = ''\n\n return { address, chainId, decimals, symbol, name, icon, logoURI }\n}\n\nconst getQuoteRouteSteps = (userTxs: SocketAPIUserTx[]) => {\n return userTxs.reduce((stepsAcc: SocketAPIStep[], tx) => {\n if (tx.userTxType === 'fund-movr') {\n tx.steps.forEach((s) => stepsAcc.push({ ...s, userTxIndex: tx.userTxIndex }))\n }\n if (tx.userTxType === 'dex-swap') {\n stepsAcc.push({\n chainId: tx.chainId,\n fromAmount: tx.fromAmount,\n fromAsset: tx.fromAsset,\n gasFees: tx.gasFees,\n minAmountOut: tx.minAmountOut,\n protocol: tx.protocol,\n swapSlippage: tx.swapSlippage,\n toAmount: tx.toAmount,\n toAsset: tx.toAsset,\n type: 'swap',\n userTxIndex: tx.userTxIndex\n })\n }\n return stepsAcc\n }, [])\n}\n\nconst getActiveRoutesLowestServiceTime = (activeRoutes: ActiveRoute[]) => {\n const serviceTimes: number[] = []\n\n activeRoutes.forEach((r) =>\n r.route.userTxs.forEach((tx) => {\n if ((tx as SocketAPIBridgeUserTx).serviceTime) {\n serviceTimes.push((tx as SocketAPIBridgeUserTx).serviceTime)\n }\n })\n )\n\n return serviceTimes.sort((a, b) => a - b)[0]\n}\n\nconst getActiveRoutesUpdateInterval = (minServiceTime?: number) => {\n if (!minServiceTime) return 7000\n\n if (minServiceTime < 60) return 5000\n if (minServiceTime <= 180) return 6000\n if (minServiceTime <= 300) return 8000\n if (minServiceTime <= 600) return 12000\n\n return 15000\n}\n\nconst buildRevokeApprovalIfNeeded = async (\n userTx: SocketAPISendTransactionRequest,\n account: Account,\n provider: RPCProvider\n): Promise => {\n if (!userTx.approvalData) return\n const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider)\n const requiredAmount = isSmartAccount(account)\n ? BigInt(userTx.approvalData.minimumApprovalAmount)\n : MaxUint256\n const approveCallData = erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n requiredAmount\n ])\n\n let fails = false\n try {\n await provider.call({\n from: account.addr,\n to: userTx.approvalData.approvalTokenAddress,\n data: approveCallData\n })\n } catch (e) {\n fails = true\n }\n\n if (!fails) return\n\n return {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(0)\n ])\n }\n}\n\nconst buildSwapAndBridgeUserRequests = async (\n userTx: SocketAPISendTransactionRequest,\n networkId: string,\n account: Account,\n provider: RPCProvider\n) => {\n if (isSmartAccount(account)) {\n const calls: Call[] = []\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) calls.push(revokeApproval)\n\n calls.push({\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(userTx.approvalData.minimumApprovalAmount)\n ]),\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n }\n\n calls.push({\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n\n return [\n {\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n activeRouteId: userTx.activeRouteId,\n isSwapAndBridgeCall: true\n }\n } as SignUserRequest\n ]\n }\n const requests: SignUserRequest[] = []\n let shouldBuildSwapOrBridgeTx = true\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n let shouldApprove = true\n try {\n const erc20Contract = new Contract(\n userTx.approvalData.approvalTokenAddress,\n ERC20.abi,\n provider\n )\n const allowance = await erc20Contract.allowance(\n userTx.approvalData.owner,\n userTx.approvalData.allowanceTarget\n )\n // check if an approval already exists\n if (BigInt(allowance) >= BigInt(userTx.approvalData.minimumApprovalAmount))\n shouldApprove = false\n } catch (error) {\n console.error(error)\n }\n\n if (shouldApprove) {\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) {\n requests.push({\n id: `${userTx.activeRouteId}-revoke-approval`,\n action: { kind: 'calls' as const, calls: [revokeApproval] },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n requests.push({\n id: `${userTx.activeRouteId}-approval`,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n MaxUint256 // approve the max possible amount for better UX on BA\n ]),\n fromUserRequestId: `${userTx.activeRouteId}-approval`\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n // first build only the approval tx and then when confirmed this func will be called a second time\n // and then only the swap or bridge tx will be created\n shouldBuildSwapOrBridgeTx = false\n }\n }\n\n if (shouldBuildSwapOrBridgeTx) {\n requests.push({\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n return requests\n}\n\nexport const getIsBridgeTxn = (userTxType: SocketAPIUserTx['userTxType']) =>\n userTxType === 'fund-movr'\n\n/**\n * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0\n * there are 16 networks supported, so user could have (many) custom networks that are not.\n */\nexport const getIsNetworkSupported = (\n supportedChainIds: Network['chainId'][],\n network?: Network\n) => {\n // Assume supported if missing (and receive no results when attempting to use\n // a not-supported network) than the alternative - blocking the UI.\n if (!supportedChainIds.length || !network) return true\n\n return supportedChainIds.includes(network.chainId)\n}\n\nconst getActiveRoutesForAccount = (accountAddress: string, activeRoutes: ActiveRoute[]) => {\n return activeRoutes.filter(\n (r) => getAddress(r.route.sender || r.route.userAddress) === accountAddress\n )\n}\n\nexport {\n getQuoteRouteSteps,\n getActiveRoutesLowestServiceTime,\n getActiveRoutesUpdateInterval,\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n}\n"]} \ No newline at end of file +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, getAddress, Interface, MaxUint256 } from 'ethers'\n\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { Account } from '../../interfaces/account'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport {\n ActiveRoute,\n SocketAPIBridgeUserTx,\n SocketAPISendTransactionRequest,\n SocketAPIStep,\n SocketAPIToken,\n SocketAPIUserTx,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { SignUserRequest } from '../../interfaces/userRequest'\nimport { isSmartAccount } from '../account/account'\nimport { Call } from '../accountOp/types'\nimport { TokenResult } from '../portfolio'\nimport { getTokenBalanceInUSD } from '../portfolio/helpers'\n\nconst sortTokensByPendingAndBalance = (a: TokenResult, b: TokenResult) => {\n // Pending tokens go on top\n const isAPending =\n typeof a.amountPostSimulation === 'bigint' && a.amountPostSimulation !== BigInt(a.amount)\n const isBPending =\n typeof b.amountPostSimulation === 'bigint' && b.amountPostSimulation !== BigInt(b.amount)\n\n if (isAPending && !isBPending) return -1\n if (!isAPending && isBPending) return 1\n\n // Otherwise, higher balance comes first\n const aBalanceUSD = getTokenBalanceInUSD(a)\n const bBalanceUSD = getTokenBalanceInUSD(b)\n if (aBalanceUSD !== bBalanceUSD) return bBalanceUSD - aBalanceUSD\n\n return 0\n}\n\nexport const sortTokenListResponse = (\n tokenListResponse: SwapAndBridgeToToken[],\n accountPortfolioTokenList: TokenResult[]\n) => {\n return tokenListResponse.sort((a: SocketAPIToken, b: SocketAPIToken) => {\n const aInPortfolio = accountPortfolioTokenList.find((t) => t.address === a.address)\n const bInPortfolio = accountPortfolioTokenList.find((t) => t.address === b.address)\n\n // Tokens in portfolio should come first\n if (aInPortfolio && !bInPortfolio) return -1\n if (!aInPortfolio && bInPortfolio) return 1\n\n if (aInPortfolio && bInPortfolio) {\n const comparisonResult = sortTokensByPendingAndBalance(aInPortfolio, bInPortfolio)\n if (comparisonResult !== 0) return comparisonResult\n }\n\n // Otherwise, just alphabetical\n return (a.name || '').localeCompare(b.name || '')\n })\n}\n\nexport const sortPortfolioTokenList = (accountPortfolioTokenList: TokenResult[]) => {\n return accountPortfolioTokenList.sort((a, b) => {\n const comparisonResult = sortTokensByPendingAndBalance(a, b)\n if (comparisonResult !== 0) return comparisonResult\n\n // Otherwise, just alphabetical\n return (a.symbol || '').localeCompare(b.symbol || '')\n })\n}\n\n/**\n * Determines if a token is eligible for swapping and bridging.\n * Not all tokens in the portfolio are eligible.\n */\nexport const getIsTokenEligibleForSwapAndBridge = (token: TokenResult) => {\n // Prevent filtering out tokens with amountPostSimulation = 0 if the actual amount is positive.\n // This ensures the token remains in the list when sending the full amount of it\n const amount =\n token.amountPostSimulation === 0n && token.amount > 0n\n ? token.amount\n : token.amountPostSimulation ?? token.amount\n const hasPositiveBalance = Number(amount) > 0\n return (\n // The same token can be in the Gas Tank (or as a Reward) and in the portfolio.\n // Exclude the one in the Gas Tank (swapping Gas Tank tokens is not supported).\n !token.flags.onGasTank &&\n // And exclude the rewards ones (swapping rewards is not supported).\n !token.flags.rewardsType &&\n hasPositiveBalance\n )\n}\n\nexport const convertPortfolioTokenToSocketAPIToken = (\n portfolioToken: TokenResult,\n chainId: number\n): SocketAPIToken => {\n const { address, decimals, symbol } = portfolioToken\n // Although name and symbol will be the same, it's better than having \"No name\" in the UI (valid use-case)\n const name = symbol\n // Fine for not having both icon props, because this would fallback to the\n // icon discovery method used for the portfolio tokens\n const icon = ''\n const logoURI = ''\n\n return { address, chainId, decimals, symbol, name, icon, logoURI }\n}\n\nconst getQuoteRouteSteps = (userTxs: SocketAPIUserTx[]) => {\n return userTxs.reduce((stepsAcc: SocketAPIStep[], tx) => {\n if (tx.userTxType === 'fund-movr') {\n tx.steps.forEach((s) => stepsAcc.push({ ...s, userTxIndex: tx.userTxIndex }))\n }\n if (tx.userTxType === 'dex-swap') {\n stepsAcc.push({\n chainId: tx.chainId,\n fromAmount: tx.fromAmount,\n fromAsset: tx.fromAsset,\n gasFees: tx.gasFees,\n minAmountOut: tx.minAmountOut,\n protocol: tx.protocol,\n swapSlippage: tx.swapSlippage,\n toAmount: tx.toAmount,\n toAsset: tx.toAsset,\n type: 'swap',\n userTxIndex: tx.userTxIndex\n })\n }\n return stepsAcc\n }, [])\n}\n\nconst getActiveRoutesLowestServiceTime = (activeRoutes: ActiveRoute[]) => {\n const serviceTimes: number[] = []\n\n activeRoutes.forEach((r) =>\n r.route.userTxs.forEach((tx) => {\n if ((tx as SocketAPIBridgeUserTx).serviceTime) {\n serviceTimes.push((tx as SocketAPIBridgeUserTx).serviceTime)\n }\n })\n )\n\n return serviceTimes.sort((a, b) => a - b)[0]\n}\n\nconst getActiveRoutesUpdateInterval = (minServiceTime?: number) => {\n if (!minServiceTime) return 7000\n\n if (minServiceTime < 60) return 5000\n if (minServiceTime <= 180) return 6000\n if (minServiceTime <= 300) return 8000\n if (minServiceTime <= 600) return 12000\n\n return 15000\n}\n\nconst buildRevokeApprovalIfNeeded = async (\n userTx: SocketAPISendTransactionRequest,\n account: Account,\n provider: RPCProvider\n): Promise => {\n if (!userTx.approvalData) return\n const erc20Contract = new Contract(userTx.approvalData.approvalTokenAddress, ERC20.abi, provider)\n const requiredAmount = isSmartAccount(account)\n ? BigInt(userTx.approvalData.minimumApprovalAmount)\n : MaxUint256\n const approveCallData = erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n requiredAmount\n ])\n\n let fails = false\n try {\n await provider.call({\n from: account.addr,\n to: userTx.approvalData.approvalTokenAddress,\n data: approveCallData\n })\n } catch (e) {\n fails = true\n }\n\n if (!fails) return\n\n return {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Contract.interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(0)\n ])\n }\n}\n\nconst buildSwapAndBridgeUserRequests = async (\n userTx: SocketAPISendTransactionRequest,\n networkId: string,\n account: Account,\n provider: RPCProvider\n) => {\n if (isSmartAccount(account)) {\n const calls: Call[] = []\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) calls.push(revokeApproval)\n\n calls.push({\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n BigInt(userTx.approvalData.minimumApprovalAmount)\n ]),\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n }\n\n calls.push({\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call)\n\n return [\n {\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n activeRouteId: userTx.activeRouteId,\n isSwapAndBridgeCall: true\n }\n } as SignUserRequest\n ]\n }\n const requests: SignUserRequest[] = []\n let shouldBuildSwapOrBridgeTx = true\n if (userTx.approvalData) {\n const erc20Interface = new Interface(ERC20.abi)\n let shouldApprove = true\n try {\n const erc20Contract = new Contract(\n userTx.approvalData.approvalTokenAddress,\n ERC20.abi,\n provider\n )\n const allowance = await erc20Contract.allowance(\n userTx.approvalData.owner,\n userTx.approvalData.allowanceTarget\n )\n // check if an approval already exists\n if (BigInt(allowance) >= BigInt(userTx.approvalData.minimumApprovalAmount))\n shouldApprove = false\n } catch (error) {\n console.error(error)\n }\n\n if (shouldApprove) {\n const revokeApproval = await buildRevokeApprovalIfNeeded(userTx, account, provider)\n if (revokeApproval) {\n requests.push({\n id: `${userTx.activeRouteId}-revoke-approval`,\n action: { kind: 'calls' as const, calls: [revokeApproval] },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n requests.push({\n id: `${userTx.activeRouteId}-approval`,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.approvalData.approvalTokenAddress,\n value: BigInt('0'),\n data: erc20Interface.encodeFunctionData('approve', [\n userTx.approvalData.allowanceTarget,\n MaxUint256 // approve the max possible amount for better UX on BA\n ]),\n fromUserRequestId: `${userTx.activeRouteId}-approval`\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n // first build only the approval tx and then when confirmed this func will be called a second time\n // and then only the swap or bridge tx will be created\n shouldBuildSwapOrBridgeTx = false\n }\n }\n\n if (shouldBuildSwapOrBridgeTx) {\n requests.push({\n id: userTx.activeRouteId,\n action: {\n kind: 'calls' as const,\n calls: [\n {\n to: userTx.txTarget,\n value: BigInt(userTx.value),\n data: userTx.txData,\n fromUserRequestId: userTx.activeRouteId\n } as Call\n ]\n },\n meta: {\n isSignAction: true,\n networkId,\n accountAddr: account.addr,\n isSwapAndBridgeCall: true,\n activeRouteId: userTx.activeRouteId\n }\n } as SignUserRequest)\n }\n return requests\n}\n\nexport const getIsBridgeTxn = (userTxType: SocketAPIUserTx['userTxType']) =>\n userTxType === 'fund-movr'\n\n/**\n * Checks if a network is supported by our Swap & Bridge service provider. As of v4.43.0\n * there are 16 networks supported, so user could have (many) custom networks that are not.\n */\nexport const getIsNetworkSupported = (\n supportedChainIds: Network['chainId'][],\n network?: Network\n) => {\n // Assume supported if missing (and receive no results when attempting to use\n // a not-supported network) than the alternative - blocking the UI.\n if (!supportedChainIds.length || !network) return true\n\n return supportedChainIds.includes(network.chainId)\n}\n\nconst getActiveRoutesForAccount = (accountAddress: string, activeRoutes: ActiveRoute[]) => {\n return activeRoutes.filter(\n (r) => getAddress(r.route.sender || r.route.userAddress) === accountAddress\n )\n}\n\nexport {\n getQuoteRouteSteps,\n getActiveRoutesLowestServiceTime,\n getActiveRoutesUpdateInterval,\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js index d51657c22..1a46d2401 100644 --- a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js @@ -1,13 +1,17 @@ -import EmittableError from '../../classes/EmittableError'; -import SwapAndBridgeError from '../../classes/SwapAndBridgeError'; -import SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHumanReadableSwapAndBridgeError = void 0; +const tslib_1 = require("tslib"); +const EmittableError_1 = tslib_1.__importDefault(require("../../classes/EmittableError")); +const SwapAndBridgeError_1 = tslib_1.__importDefault(require("../../classes/SwapAndBridgeError")); +const SwapAndBridgeProviderApiError_1 = tslib_1.__importDefault(require("../../classes/SwapAndBridgeProviderApiError")); const MSG_MAX_LENGTH = 225; -export function getHumanReadableSwapAndBridgeError(e) { +function getHumanReadableSwapAndBridgeError(e) { // These errors should be thrown as they are // as they are already human-readable - if (e instanceof EmittableError || - e instanceof SwapAndBridgeProviderApiError || - e instanceof SwapAndBridgeError) { + if (e instanceof EmittableError_1.default || + e instanceof SwapAndBridgeProviderApiError_1.default || + e instanceof SwapAndBridgeError_1.default) { return e; } // Last resort (fallback) error handling @@ -18,4 +22,5 @@ export function getHumanReadableSwapAndBridgeError(e) { const errorMessage = `Unexpected error happened in the Swap & Bridge flow. Try again later or contact Ambire support. Details: <${message}>`; return new Error(errorMessage); } +exports.getHumanReadableSwapAndBridgeError = getHumanReadableSwapAndBridgeError; //# sourceMappingURL=swapAndBridgeErrorHumanizer.js.map \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map index 2c689f78c..94b147e0b 100644 --- a/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map +++ b/dist/src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.js.map @@ -1 +1 @@ -{"version":3,"file":"swapAndBridgeErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,kBAAkB,MAAM,kCAAkC,CAAA;AACjE,OAAO,6BAA6B,MAAM,6CAA6C,CAAA;AAEvF,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,MAAM,UAAU,kCAAkC,CAChD,CAAoF;IAEpF,4CAA4C;IAC5C,qCAAqC;IACrC,IACE,CAAC,YAAY,cAAc;QAC3B,CAAC,YAAY,6BAA6B;QAC1C,CAAC,YAAY,kBAAkB,EAC/B;QACA,OAAO,CAAC,CAAA;KACT;IAED,wCAAwC;IACxC,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;IACxC,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc;QAAE,OAAO,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAA;IAC3F,MAAM,YAAY,GAAG,6GAA6G,OAAO,GAAG,CAAA;IAE5I,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;AAChC,CAAC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\n\nconst MSG_MAX_LENGTH = 225\n\nexport function getHumanReadableSwapAndBridgeError(\n e: EmittableError | SwapAndBridgeProviderApiError | SwapAndBridgeError | Error | any\n) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (\n e instanceof EmittableError ||\n e instanceof SwapAndBridgeProviderApiError ||\n e instanceof SwapAndBridgeError\n ) {\n return e\n }\n\n // Last resort (fallback) error handling\n let message = e?.message || 'no details'\n // Protection against crazy long error messages\n if (message.length > MSG_MAX_LENGTH) message = `${message.substring(0, MSG_MAX_LENGTH)}...`\n const errorMessage = `Unexpected error happened in the Swap & Bridge flow. Try again later or contact Ambire support. Details: <${message}>`\n\n return new Error(errorMessage)\n}\n"]} \ No newline at end of file +{"version":3,"file":"swapAndBridgeErrorHumanizer.js","sourceRoot":"","sources":["../../../../src/libs/swapAndBridge/swapAndBridgeErrorHumanizer.ts"],"names":[],"mappings":";;;;AAAA,0FAAyD;AACzD,kGAAiE;AACjE,wHAAuF;AAEvF,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,SAAgB,kCAAkC,CAChD,CAAoF;IAEpF,4CAA4C;IAC5C,qCAAqC;IACrC,IACE,CAAC,YAAY,wBAAc;QAC3B,CAAC,YAAY,uCAA6B;QAC1C,CAAC,YAAY,4BAAkB,EAC/B;QACA,OAAO,CAAC,CAAA;KACT;IAED,wCAAwC;IACxC,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;IACxC,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc;QAAE,OAAO,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAA;IAC3F,MAAM,YAAY,GAAG,6GAA6G,OAAO,GAAG,CAAA;IAE5I,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;AAChC,CAAC;AApBD,gFAoBC","sourcesContent":["import EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\n\nconst MSG_MAX_LENGTH = 225\n\nexport function getHumanReadableSwapAndBridgeError(\n e: EmittableError | SwapAndBridgeProviderApiError | SwapAndBridgeError | Error | any\n) {\n // These errors should be thrown as they are\n // as they are already human-readable\n if (\n e instanceof EmittableError ||\n e instanceof SwapAndBridgeProviderApiError ||\n e instanceof SwapAndBridgeError\n ) {\n return e\n }\n\n // Last resort (fallback) error handling\n let message = e?.message || 'no details'\n // Protection against crazy long error messages\n if (message.length > MSG_MAX_LENGTH) message = `${message.substring(0, MSG_MAX_LENGTH)}...`\n const errorMessage = `Unexpected error happened in the Swap & Bridge flow. Try again later or contact Ambire support. Details: <${message}>`\n\n return new Error(errorMessage)\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.js b/dist/src/libs/tracer/debugTraceCall.js index d13150775..a2ae20dd2 100644 --- a/dist/src/libs/tracer/debugTraceCall.js +++ b/dist/src/libs/tracer/debugTraceCall.js @@ -1,14 +1,18 @@ -import { getAddress, Interface, toQuantity } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'; -import NFTGetter from '../../../contracts/compiled/NFTGetter.json'; -import { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'; -import { EOA_SIMULATION_NONCE } from '../../consts/deployless'; -import { getAccountDeployParams, getSpoof, isSmartAccount } from '../account/account'; -import { callToTuple, getSignableCalls } from '../accountOp/accountOp'; -import { DeploylessMode, fromDescriptor } from '../deployless/deployless'; -import { getDeploylessOpts } from '../portfolio/getOnchainBalances'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.debugTraceCall = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const BalanceGetter_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/BalanceGetter.json")); +const NFTGetter_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/NFTGetter.json")); +const deploy_1 = require("../../consts/deploy"); +const deployless_1 = require("../../consts/deployless"); +const account_1 = require("../account/account"); +const accountOp_1 = require("../accountOp/accountOp"); +const deployless_2 = require("../deployless/deployless"); +const getOnchainBalances_1 = require("../portfolio/getOnchainBalances"); const NFT_COLLECTION_LIMIT = 100; // if using EOA, use the first and only call of the account op // if it's SA, make the data execute or deployAndExecute, @@ -18,39 +22,39 @@ function getFunctionParams(account, op, accountState) { const call = op.calls[0]; return { to: call.to, - value: toQuantity(call.value.toString()), + value: (0, ethers_1.toQuantity)(call.value.toString()), data: call.data, from: op.accountAddr }; } - const saAbi = new Interface(AmbireAccount.abi); - const factoryAbi = new Interface(AmbireFactory.abi); + const saAbi = new ethers_1.Interface(AmbireAccount_json_1.default.abi); + const factoryAbi = new ethers_1.Interface(AmbireFactory_json_1.default.abi); const callData = accountState.isDeployed - ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)]) + ? saAbi.encodeFunctionData('execute', [(0, accountOp_1.getSignableCalls)(op), (0, account_1.getSpoof)(account)]) : factoryAbi.encodeFunctionData('deployAndExecute', [ account.creation.bytecode, account.creation.salt, - getSignableCalls(op), - getSpoof(account) + (0, accountOp_1.getSignableCalls)(op), + (0, account_1.getSpoof)(account) ]); return { - from: DEPLOYLESS_SIMULATION_FROM, + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, to: accountState.isDeployed ? account.addr : account.creation.factoryAddr, value: 0, data: callData }; } -export async function debugTraceCall(account, op, provider, accountState, gasUsed, gasPrices, supportsStateOverride, overrideData) { +async function debugTraceCall(account, op, provider, accountState, gasUsed, gasPrices, supportsStateOverride, overrideData) { const opts = { blockTag: 'latest', - from: DEPLOYLESS_SIMULATION_FROM, - mode: DeploylessMode.ProxyContract, - isEOA: !isSmartAccount(account) + from: deploy_1.DEPLOYLESS_SIMULATION_FROM, + mode: deployless_2.DeploylessMode.ProxyContract, + isEOA: !(0, account_1.isSmartAccount)(account) }; - const deploylessOpts = getDeploylessOpts(account.addr, supportsStateOverride, opts); - const [factory, factoryCalldata] = getAccountDeployParams(account); + const deploylessOpts = (0, getOnchainBalances_1.getDeploylessOpts)(account.addr, supportsStateOverride, opts); + const [factory, factoryCalldata] = (0, account_1.getAccountDeployParams)(account); const simulationOps = [ - [isSmartAccount(account) ? op.nonce : BigInt(EOA_SIMULATION_NONCE), op.calls.map(callToTuple)] + [(0, account_1.isSmartAccount)(account) ? op.nonce : BigInt(deployless_1.EOA_SIMULATION_NONCE), op.calls.map(accountOp_1.callToTuple)] ]; const fast = gasPrices.find((gas) => gas.name === 'fast'); if (!fast) @@ -60,11 +64,11 @@ export async function debugTraceCall(account, op, provider, accountState, gasUse const results = await provider.send('debug_traceCall', [ { to: params.to, - value: toQuantity(params.value.toString()), + value: (0, ethers_1.toQuantity)(params.value.toString()), data: params.data, from: params.from, - gasPrice: toQuantity(gasPrice.toString()), - gas: toQuantity(gasUsed.toString()) + gasPrice: (0, ethers_1.toQuantity)(gasPrice.toString()), + gas: (0, ethers_1.toQuantity)(gasUsed.toString()) }, 'latest', { @@ -105,7 +109,7 @@ export async function debugTraceCall(account, op, provider, accountState, gasUse } ]); const foundTokens = [ - ...new Set(results.filter((i) => i?.erc === 20).map((i) => getAddress(i.address))) + ...new Set(results.filter((i) => i?.erc === 20).map((i) => (0, ethers_1.getAddress)(i.address))) ]; const foundNftTransfersObject = results .filter((i) => i?.erc === 721) @@ -115,10 +119,10 @@ export async function debugTraceCall(account, op, provider, accountState, gasUse res[i.address].add(i.tokenId); return res; }, {}); - const foundNftTransfers = Object.entries(foundNftTransfersObject).map(([address, id]) => [getAddress(address), Array.from(id).map((i) => BigInt(i))]); + const foundNftTransfers = Object.entries(foundNftTransfersObject).map(([address, id]) => [(0, ethers_1.getAddress)(address), Array.from(id).map((i) => BigInt(i))]); // we set the 3rd param to "true" as we don't need state override - const deploylessTokens = fromDescriptor(provider, BalanceGetter, true); - const deploylessNfts = fromDescriptor(provider, NFTGetter, true); + const deploylessTokens = (0, deployless_2.fromDescriptor)(provider, BalanceGetter_json_1.default, true); + const deploylessNfts = (0, deployless_2.fromDescriptor)(provider, NFTGetter_json_1.default, true); const getNftsPromise = deploylessNfts.call('simulateAndGetAllNFTs', [ op.accountAddr, account.associatedKeys, @@ -147,4 +151,5 @@ export async function debugTraceCall(account, op, provider, accountState, gasUse }) }; } +exports.debugTraceCall = debugTraceCall; //# sourceMappingURL=debugTraceCall.js.map \ No newline at end of file diff --git a/dist/src/libs/tracer/debugTraceCall.js.map b/dist/src/libs/tracer/debugTraceCall.js.map index 3bac861be..18e85fbed 100644 --- a/dist/src/libs/tracer/debugTraceCall.js.map +++ b/dist/src/libs/tracer/debugTraceCall.js.map @@ -1 +1 @@ -{"version":3,"file":"debugTraceCall.js","sourceRoot":"","sources":["../../../../src/libs/tracer/debugTraceCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, JsonRpcProvider, toQuantity } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { getAccountDeployParams, getSpoof, isSmartAccount } from '../account/account'\nimport { AccountOp, callToTuple, getSignableCalls } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { GasRecommendation } from '../gasPrice/gasPrice'\nimport { getDeploylessOpts } from '../portfolio/getOnchainBalances'\n\nconst NFT_COLLECTION_LIMIT = 100\n// if using EOA, use the first and only call of the account op\n// if it's SA, make the data execute or deployAndExecute,\n// set the spoof+addr and pass all the calls\nfunction getFunctionParams(account: Account, op: AccountOp, accountState: AccountOnchainState) {\n if (!account.creation) {\n const call = op.calls[0]\n return {\n to: call.to,\n value: toQuantity(call.value.toString()),\n data: call.data,\n from: op.accountAddr\n }\n }\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n return {\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData\n }\n}\n\nexport async function debugTraceCall(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider,\n accountState: AccountOnchainState,\n gasUsed: bigint,\n gasPrices: GasRecommendation[],\n supportsStateOverride: boolean,\n overrideData?: any\n): Promise<{ tokens: string[]; nfts: [string, bigint[]][] }> {\n const opts = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n mode: DeploylessMode.ProxyContract,\n isEOA: !isSmartAccount(account)\n }\n const deploylessOpts = getDeploylessOpts(account.addr, supportsStateOverride, opts)\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const simulationOps = [\n [isSmartAccount(account) ? op.nonce : BigInt(EOA_SIMULATION_NONCE), op.calls.map(callToTuple)]\n ]\n const fast = gasPrices.find((gas: any) => gas.name === 'fast')\n if (!fast) return { tokens: [], nfts: [] }\n\n const gasPrice =\n 'gasPrice' in fast ? fast.gasPrice : fast.baseFeePerGas + fast.maxPriorityFeePerGas\n\n const params = getFunctionParams(account, op, accountState)\n const results: ({ erc: 20; address: string } | { erc: 721; address: string; tokenId: string })[] =\n await provider.send('debug_traceCall', [\n {\n to: params.to,\n value: toQuantity(params.value.toString()),\n data: params.data,\n from: params.from,\n gasPrice: toQuantity(gasPrice.toString()),\n gas: toQuantity(gasUsed.toString())\n },\n 'latest',\n {\n tracer: `{\n discovered: [],\n fault: function (log) {},\n step: function (log) {\n const found = this.discovered.map(ob => ob.address)\n if (log.contract && log.contract.getAddress() && found.indexOf(toHex(log.contract.getAddress())) === -1) {\n this.discovered.push({\n erc: 20,\n address: toHex(log.contract.getAddress())\n })\n }\n if (log.op.toString() === 'LOG4') {\n this.discovered.push({\n erc: 721,\n address: toHex(log.contract.getAddress()),\n tokenId: '0x' + log.stack.peek(5).toString(16)\n })\n }\n },\n result: function () {\n return this.discovered\n }\n }`,\n\n enableMemory: false,\n enableReturnData: true,\n disableStorage: true,\n stateOverrides: supportsStateOverride\n ? {\n [params.from]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n },\n ...overrideData\n }\n : {}\n }\n ])\n\n const foundTokens = [\n ...new Set(results.filter((i) => i?.erc === 20).map((i) => getAddress(i.address)))\n ]\n const foundNftTransfersObject = results\n .filter((i) => i?.erc === 721)\n .reduce((res: { [address: string]: Set }, i: any) => {\n if (!res[i?.address]) res[i?.address] = new Set()\n res[i.address].add(i.tokenId)\n return res\n }, {})\n const foundNftTransfers: [string, bigint[]][] = Object.entries(foundNftTransfersObject).map(\n ([address, id]) => [getAddress(address), Array.from(id).map((i) => BigInt(i))]\n )\n\n // we set the 3rd param to \"true\" as we don't need state override\n const deploylessTokens = fromDescriptor(provider, BalanceGetter, true)\n const deploylessNfts = fromDescriptor(provider, NFTGetter, true)\n\n const getNftsPromise = deploylessNfts.call(\n 'simulateAndGetAllNFTs',\n [\n op.accountAddr,\n account.associatedKeys,\n foundNftTransfers.map(([address]) => address),\n foundNftTransfers.map(([, x]) => x),\n NFT_COLLECTION_LIMIT,\n factory,\n factoryCalldata,\n simulationOps\n ],\n deploylessOpts\n )\n\n const [[tokensWithErr], [before, after, , , , deltaAddressesMapping]] = await Promise.all([\n deploylessTokens.call('getBalances', [op.accountAddr, foundTokens], opts),\n getNftsPromise\n ])\n\n const beforeNftCollections = before[0]\n const afterNftCollections = after[0]\n return {\n tokens: foundTokens.filter((addr, i) => tokensWithErr[i].error === '0x'),\n nfts: foundNftTransfers.filter((nft, i) => {\n if (beforeNftCollections[i][3] === '0x') return true\n const foundAfterToken = afterNftCollections.find(\n (t: any, j: number) =>\n deltaAddressesMapping[j].toLowerCase() === foundNftTransfers[i][0].toLowerCase()\n )\n if (!foundAfterToken || !foundAfterToken[0]) return false\n\n return foundAfterToken[0][3] === '0x'\n })\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"debugTraceCall.js","sourceRoot":"","sources":["../../../../src/libs/tracer/debugTraceCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, Interface, JsonRpcProvider, toQuantity } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport BalanceGetter from '../../../contracts/compiled/BalanceGetter.json'\nimport NFTGetter from '../../../contracts/compiled/NFTGetter.json'\nimport { DEPLOYLESS_SIMULATION_FROM } from '../../consts/deploy'\nimport { EOA_SIMULATION_NONCE } from '../../consts/deployless'\nimport { Account, AccountOnchainState } from '../../interfaces/account'\nimport { getAccountDeployParams, getSpoof, isSmartAccount } from '../account/account'\nimport { AccountOp, callToTuple, getSignableCalls } from '../accountOp/accountOp'\nimport { DeploylessMode, fromDescriptor } from '../deployless/deployless'\nimport { GasRecommendation } from '../gasPrice/gasPrice'\nimport { getDeploylessOpts } from '../portfolio/getOnchainBalances'\n\nconst NFT_COLLECTION_LIMIT = 100\n// if using EOA, use the first and only call of the account op\n// if it's SA, make the data execute or deployAndExecute,\n// set the spoof+addr and pass all the calls\nfunction getFunctionParams(account: Account, op: AccountOp, accountState: AccountOnchainState) {\n if (!account.creation) {\n const call = op.calls[0]\n return {\n to: call.to,\n value: toQuantity(call.value.toString()),\n data: call.data,\n from: op.accountAddr\n }\n }\n\n const saAbi = new Interface(AmbireAccount.abi)\n const factoryAbi = new Interface(AmbireFactory.abi)\n const callData = accountState.isDeployed\n ? saAbi.encodeFunctionData('execute', [getSignableCalls(op), getSpoof(account)])\n : factoryAbi.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(op),\n getSpoof(account)\n ])\n\n return {\n from: DEPLOYLESS_SIMULATION_FROM,\n to: accountState.isDeployed ? account.addr : account.creation.factoryAddr,\n value: 0,\n data: callData\n }\n}\n\nexport async function debugTraceCall(\n account: Account,\n op: AccountOp,\n provider: JsonRpcProvider,\n accountState: AccountOnchainState,\n gasUsed: bigint,\n gasPrices: GasRecommendation[],\n supportsStateOverride: boolean,\n overrideData?: any\n): Promise<{ tokens: string[]; nfts: [string, bigint[]][] }> {\n const opts = {\n blockTag: 'latest',\n from: DEPLOYLESS_SIMULATION_FROM,\n mode: DeploylessMode.ProxyContract,\n isEOA: !isSmartAccount(account)\n }\n const deploylessOpts = getDeploylessOpts(account.addr, supportsStateOverride, opts)\n const [factory, factoryCalldata] = getAccountDeployParams(account)\n const simulationOps = [\n [isSmartAccount(account) ? op.nonce : BigInt(EOA_SIMULATION_NONCE), op.calls.map(callToTuple)]\n ]\n const fast = gasPrices.find((gas: any) => gas.name === 'fast')\n if (!fast) return { tokens: [], nfts: [] }\n\n const gasPrice =\n 'gasPrice' in fast ? fast.gasPrice : fast.baseFeePerGas + fast.maxPriorityFeePerGas\n\n const params = getFunctionParams(account, op, accountState)\n const results: ({ erc: 20; address: string } | { erc: 721; address: string; tokenId: string })[] =\n await provider.send('debug_traceCall', [\n {\n to: params.to,\n value: toQuantity(params.value.toString()),\n data: params.data,\n from: params.from,\n gasPrice: toQuantity(gasPrice.toString()),\n gas: toQuantity(gasUsed.toString())\n },\n 'latest',\n {\n tracer: `{\n discovered: [],\n fault: function (log) {},\n step: function (log) {\n const found = this.discovered.map(ob => ob.address)\n if (log.contract && log.contract.getAddress() && found.indexOf(toHex(log.contract.getAddress())) === -1) {\n this.discovered.push({\n erc: 20,\n address: toHex(log.contract.getAddress())\n })\n }\n if (log.op.toString() === 'LOG4') {\n this.discovered.push({\n erc: 721,\n address: toHex(log.contract.getAddress()),\n tokenId: '0x' + log.stack.peek(5).toString(16)\n })\n }\n },\n result: function () {\n return this.discovered\n }\n }`,\n\n enableMemory: false,\n enableReturnData: true,\n disableStorage: true,\n stateOverrides: supportsStateOverride\n ? {\n [params.from]: {\n balance: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n },\n ...overrideData\n }\n : {}\n }\n ])\n\n const foundTokens = [\n ...new Set(results.filter((i) => i?.erc === 20).map((i) => getAddress(i.address)))\n ]\n const foundNftTransfersObject = results\n .filter((i) => i?.erc === 721)\n .reduce((res: { [address: string]: Set }, i: any) => {\n if (!res[i?.address]) res[i?.address] = new Set()\n res[i.address].add(i.tokenId)\n return res\n }, {})\n const foundNftTransfers: [string, bigint[]][] = Object.entries(foundNftTransfersObject).map(\n ([address, id]) => [getAddress(address), Array.from(id).map((i) => BigInt(i))]\n )\n\n // we set the 3rd param to \"true\" as we don't need state override\n const deploylessTokens = fromDescriptor(provider, BalanceGetter, true)\n const deploylessNfts = fromDescriptor(provider, NFTGetter, true)\n\n const getNftsPromise = deploylessNfts.call(\n 'simulateAndGetAllNFTs',\n [\n op.accountAddr,\n account.associatedKeys,\n foundNftTransfers.map(([address]) => address),\n foundNftTransfers.map(([, x]) => x),\n NFT_COLLECTION_LIMIT,\n factory,\n factoryCalldata,\n simulationOps\n ],\n deploylessOpts\n )\n\n const [[tokensWithErr], [before, after, , , , deltaAddressesMapping]] = await Promise.all([\n deploylessTokens.call('getBalances', [op.accountAddr, foundTokens], opts),\n getNftsPromise\n ])\n\n const beforeNftCollections = before[0]\n const afterNftCollections = after[0]\n return {\n tokens: foundTokens.filter((addr, i) => tokensWithErr[i].error === '0x'),\n nfts: foundNftTransfers.filter((nft, i) => {\n if (beforeNftCollections[i][3] === '0x') return true\n const foundAfterToken = afterNftCollections.find(\n (t: any, j: number) =>\n deltaAddressesMapping[j].toLowerCase() === foundNftTransfers[i][0].toLowerCase()\n )\n if (!foundAfterToken || !foundAfterToken[0]) return false\n\n return foundAfterToken[0][3] === '0x'\n })\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.js b/dist/src/libs/transfer/amount.js index 7bb1a563c..b5b934970 100644 --- a/dist/src/libs/transfer/amount.js +++ b/dist/src/libs/transfer/amount.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSanitizedAmount = void 0; /** * Removes any extra decimals from the amount. * @example getSanitizedAmount('1.123456', 2) => '1.12' @@ -8,5 +11,5 @@ const getSanitizedAmount = (amount, decimals) => { sanitizedAmount[1] = sanitizedAmount[1].slice(0, decimals); return sanitizedAmount.join('.'); }; -export { getSanitizedAmount }; +exports.getSanitizedAmount = getSanitizedAmount; //# sourceMappingURL=amount.js.map \ No newline at end of file diff --git a/dist/src/libs/transfer/amount.js.map b/dist/src/libs/transfer/amount.js.map index 4238f65db..babc6e7b0 100644 --- a/dist/src/libs/transfer/amount.js.map +++ b/dist/src/libs/transfer/amount.js.map @@ -1 +1 @@ -{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../src/libs/transfer/amount.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IACtE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEzC,IAAI,eAAe,CAAC,CAAC,CAAC;QAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAElF,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA","sourcesContent":["/**\n * Removes any extra decimals from the amount.\n * @example getSanitizedAmount('1.123456', 2) => '1.12'\n */\nconst getSanitizedAmount = (amount: string, decimals: number): string => {\n const sanitizedAmount = amount.split('.')\n\n if (sanitizedAmount[1]) sanitizedAmount[1] = sanitizedAmount[1].slice(0, decimals)\n\n return sanitizedAmount.join('.')\n}\n\nexport { getSanitizedAmount }\n"]} \ No newline at end of file +{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../src/libs/transfer/amount.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IACtE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEzC,IAAI,eAAe,CAAC,CAAC,CAAC;QAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAElF,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC,CAAA;AAEQ,gDAAkB","sourcesContent":["/**\n * Removes any extra decimals from the amount.\n * @example getSanitizedAmount('1.123456', 2) => '1.12'\n */\nconst getSanitizedAmount = (amount: string, decimals: number): string => {\n const sanitizedAmount = amount.split('.')\n\n if (sanitizedAmount[1]) sanitizedAmount[1] = sanitizedAmount[1].slice(0, decimals)\n\n return sanitizedAmount.join('.')\n}\n\nexport { getSanitizedAmount }\n"]} \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.js b/dist/src/libs/transfer/userRequest.js index f0f2ed758..c1a3e72d7 100644 --- a/dist/src/libs/transfer/userRequest.js +++ b/dist/src/libs/transfer/userRequest.js @@ -1,18 +1,22 @@ -import { Interface, parseUnits } from 'ethers'; -import IERC20 from '../../../contracts/compiled/IERC20.json'; -import WALLETSupplyControllerABI from '../../../contracts/compiled/WALLETSupplyController.json'; -import WETH from '../../../contracts/compiled/WETH.json'; -import { FEE_COLLECTOR, SUPPLY_CONTROLLER_ADDR, WALLET_STAKING_ADDR } from '../../consts/addresses'; -import { networks } from '../../consts/networks'; -import { getSanitizedAmount } from './amount'; -const ERC20 = new Interface(IERC20.abi); -const supplyControllerInterface = new Interface(WALLETSupplyControllerABI); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildMintVestingRequest = exports.buildClaimWalletRequest = exports.buildTransferUserRequest = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const IERC20_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/IERC20.json")); +const WALLETSupplyController_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/WALLETSupplyController.json")); +const WETH_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/WETH.json")); +const addresses_1 = require("../../consts/addresses"); +const networks_1 = require("../../consts/networks"); +const amount_1 = require("./amount"); +const ERC20 = new ethers_1.Interface(IERC20_json_1.default.abi); +const supplyControllerInterface = new ethers_1.Interface(WALLETSupplyController_json_1.default); function buildMintVestingRequest({ selectedAccount, selectedToken, addrVestingData }) { const txn = { kind: 'calls', calls: [ { - to: SUPPLY_CONTROLLER_ADDR, + to: addresses_1.SUPPLY_CONTROLLER_ADDR, value: BigInt(0), data: supplyControllerInterface.encodeFunctionData('mintVesting', [ addrVestingData?.addr, @@ -32,18 +36,19 @@ function buildMintVestingRequest({ selectedAccount, selectedToken, addrVestingDa } }; } +exports.buildMintVestingRequest = buildMintVestingRequest; function buildClaimWalletRequest({ selectedAccount, selectedToken, claimableRewardsData }) { const txn = { kind: 'calls', calls: [ { - to: SUPPLY_CONTROLLER_ADDR, + to: addresses_1.SUPPLY_CONTROLLER_ADDR, value: BigInt(0), data: supplyControllerInterface.encodeFunctionData('claimWithRootUpdate', [ claimableRewardsData?.totalClaimable, claimableRewardsData?.proof, 0, - WALLET_STAKING_ADDR, + addresses_1.WALLET_STAKING_ADDR, claimableRewardsData?.root, claimableRewardsData?.signedRoot ]) @@ -60,28 +65,29 @@ function buildClaimWalletRequest({ selectedAccount, selectedToken, claimableRewa } }; } +exports.buildClaimWalletRequest = buildClaimWalletRequest; function buildTransferUserRequest({ amount, selectedToken, selectedAccount, recipientAddress: _recipientAddress }) { if (!selectedToken || !selectedAccount || !_recipientAddress) return null; // if the request is a top up, the recipient is the relayer const recipientAddress = _recipientAddress?.toLowerCase(); - const sanitizedAmount = getSanitizedAmount(amount, selectedToken.decimals); - const bigNumberHexAmount = `0x${parseUnits(sanitizedAmount, Number(selectedToken.decimals)).toString(16)}`; + const sanitizedAmount = (0, amount_1.getSanitizedAmount)(amount, selectedToken.decimals); + const bigNumberHexAmount = `0x${(0, ethers_1.parseUnits)(sanitizedAmount, Number(selectedToken.decimals)).toString(16)}`; // if the top up is a native one, we should wrap the native before sending it // as otherwise a Transfer event is not emitted and the top up will not be // recorded const isNativeTopUp = Number(selectedToken.address) === 0 && - recipientAddress.toLowerCase() === FEE_COLLECTOR.toLowerCase(); + recipientAddress.toLowerCase() === addresses_1.FEE_COLLECTOR.toLowerCase(); if (isNativeTopUp) { // if not predefined network, we cannot make a native top up - const network = networks.find((net) => net.id === selectedToken.networkId); + const network = networks_1.networks.find((net) => net.id === selectedToken.networkId); if (!network) return null; // if a wrapped addr is not specified, we cannot make a native top up const wrappedAddr = network.wrappedAddr; if (!wrappedAddr) return null; - const wrapped = new Interface(WETH); + const wrapped = new ethers_1.Interface(WETH_json_1.default); const deposit = wrapped.encodeFunctionData('deposit'); const calls = { kind: 'calls', @@ -137,5 +143,5 @@ function buildTransferUserRequest({ amount, selectedToken, selectedAccount, reci } }; } -export { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }; +exports.buildTransferUserRequest = buildTransferUserRequest; //# sourceMappingURL=userRequest.js.map \ No newline at end of file diff --git a/dist/src/libs/transfer/userRequest.js.map b/dist/src/libs/transfer/userRequest.js.map index 73d29038b..5885066b1 100644 --- a/dist/src/libs/transfer/userRequest.js.map +++ b/dist/src/libs/transfer/userRequest.js.map @@ -1 +1 @@ -{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../../src/libs/transfer/userRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, parseUnits } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport WALLETSupplyControllerABI from '../../../contracts/compiled/WALLETSupplyController.json'\nimport WETH from '../../../contracts/compiled/WETH.json'\nimport { FEE_COLLECTOR, SUPPLY_CONTROLLER_ADDR, WALLET_STAKING_ADDR } from '../../consts/addresses'\nimport { networks } from '../../consts/networks'\nimport { Calls, SignUserRequest } from '../../interfaces/userRequest'\nimport { AddrVestingData, ClaimableRewardsData, TokenResult } from '../portfolio'\nimport { getSanitizedAmount } from './amount'\n\nconst ERC20 = new Interface(IERC20.abi)\nconst supplyControllerInterface = new Interface(WALLETSupplyControllerABI)\n\ninterface BuildUserRequestParams {\n amount: string\n selectedToken: TokenResult\n selectedAccount: string\n recipientAddress: string\n}\n\nfunction buildMintVestingRequest({\n selectedAccount,\n selectedToken,\n addrVestingData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n addrVestingData: AddrVestingData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('mintVesting', [\n addrVestingData?.addr,\n addrVestingData?.end,\n addrVestingData?.rate\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildClaimWalletRequest({\n selectedAccount,\n selectedToken,\n claimableRewardsData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n claimableRewardsData: ClaimableRewardsData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('claimWithRootUpdate', [\n claimableRewardsData?.totalClaimable,\n claimableRewardsData?.proof,\n 0, // penalty bps, at the moment we run with 0; it's a safety feature to hardcode it\n WALLET_STAKING_ADDR, // staking pool addr\n claimableRewardsData?.root,\n claimableRewardsData?.signedRoot\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildTransferUserRequest({\n amount,\n selectedToken,\n selectedAccount,\n recipientAddress: _recipientAddress\n}: BuildUserRequestParams): SignUserRequest | null {\n if (!selectedToken || !selectedAccount || !_recipientAddress) return null\n\n // if the request is a top up, the recipient is the relayer\n const recipientAddress = _recipientAddress?.toLowerCase()\n const sanitizedAmount = getSanitizedAmount(amount, selectedToken.decimals)\n\n const bigNumberHexAmount = `0x${parseUnits(\n sanitizedAmount,\n Number(selectedToken.decimals)\n ).toString(16)}`\n\n // if the top up is a native one, we should wrap the native before sending it\n // as otherwise a Transfer event is not emitted and the top up will not be\n // recorded\n const isNativeTopUp =\n Number(selectedToken.address) === 0 &&\n recipientAddress.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n if (isNativeTopUp) {\n // if not predefined network, we cannot make a native top up\n const network = networks.find((net) => net.id === selectedToken.networkId)\n if (!network) return null\n\n // if a wrapped addr is not specified, we cannot make a native top up\n const wrappedAddr = network.wrappedAddr\n if (!wrappedAddr) return null\n\n const wrapped = new Interface(WETH)\n const deposit = wrapped.encodeFunctionData('deposit')\n const calls: Calls = {\n kind: 'calls' as const,\n calls: [\n {\n to: wrappedAddr,\n value: BigInt(bigNumberHexAmount),\n data: deposit\n },\n {\n to: wrappedAddr,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: calls,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n }\n\n const txn = {\n kind: 'calls' as const,\n calls: [\n {\n to: selectedToken.address,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n\n if (Number(selectedToken.address) === 0) {\n txn.calls = [\n {\n to: recipientAddress,\n value: BigInt(bigNumberHexAmount),\n data: '0x'\n }\n ]\n }\n\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nexport { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }\n"]} \ No newline at end of file +{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../../src/libs/transfer/userRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface, parseUnits } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport WALLETSupplyControllerABI from '../../../contracts/compiled/WALLETSupplyController.json'\nimport WETH from '../../../contracts/compiled/WETH.json'\nimport { FEE_COLLECTOR, SUPPLY_CONTROLLER_ADDR, WALLET_STAKING_ADDR } from '../../consts/addresses'\nimport { networks } from '../../consts/networks'\nimport { Calls, SignUserRequest } from '../../interfaces/userRequest'\nimport { AddrVestingData, ClaimableRewardsData, TokenResult } from '../portfolio'\nimport { getSanitizedAmount } from './amount'\n\nconst ERC20 = new Interface(IERC20.abi)\nconst supplyControllerInterface = new Interface(WALLETSupplyControllerABI)\n\ninterface BuildUserRequestParams {\n amount: string\n selectedToken: TokenResult\n selectedAccount: string\n recipientAddress: string\n}\n\nfunction buildMintVestingRequest({\n selectedAccount,\n selectedToken,\n addrVestingData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n addrVestingData: AddrVestingData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('mintVesting', [\n addrVestingData?.addr,\n addrVestingData?.end,\n addrVestingData?.rate\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildClaimWalletRequest({\n selectedAccount,\n selectedToken,\n claimableRewardsData\n}: {\n selectedAccount: string\n selectedToken: TokenResult\n claimableRewardsData: ClaimableRewardsData\n}): SignUserRequest {\n const txn = {\n kind: 'calls' as Calls['kind'],\n calls: [\n {\n to: SUPPLY_CONTROLLER_ADDR,\n value: BigInt(0),\n data: supplyControllerInterface.encodeFunctionData('claimWithRootUpdate', [\n claimableRewardsData?.totalClaimable,\n claimableRewardsData?.proof,\n 0, // penalty bps, at the moment we run with 0; it's a safety feature to hardcode it\n WALLET_STAKING_ADDR, // staking pool addr\n claimableRewardsData?.root,\n claimableRewardsData?.signedRoot\n ])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nfunction buildTransferUserRequest({\n amount,\n selectedToken,\n selectedAccount,\n recipientAddress: _recipientAddress\n}: BuildUserRequestParams): SignUserRequest | null {\n if (!selectedToken || !selectedAccount || !_recipientAddress) return null\n\n // if the request is a top up, the recipient is the relayer\n const recipientAddress = _recipientAddress?.toLowerCase()\n const sanitizedAmount = getSanitizedAmount(amount, selectedToken.decimals)\n\n const bigNumberHexAmount = `0x${parseUnits(\n sanitizedAmount,\n Number(selectedToken.decimals)\n ).toString(16)}`\n\n // if the top up is a native one, we should wrap the native before sending it\n // as otherwise a Transfer event is not emitted and the top up will not be\n // recorded\n const isNativeTopUp =\n Number(selectedToken.address) === 0 &&\n recipientAddress.toLowerCase() === FEE_COLLECTOR.toLowerCase()\n if (isNativeTopUp) {\n // if not predefined network, we cannot make a native top up\n const network = networks.find((net) => net.id === selectedToken.networkId)\n if (!network) return null\n\n // if a wrapped addr is not specified, we cannot make a native top up\n const wrappedAddr = network.wrappedAddr\n if (!wrappedAddr) return null\n\n const wrapped = new Interface(WETH)\n const deposit = wrapped.encodeFunctionData('deposit')\n const calls: Calls = {\n kind: 'calls' as const,\n calls: [\n {\n to: wrappedAddr,\n value: BigInt(bigNumberHexAmount),\n data: deposit\n },\n {\n to: wrappedAddr,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n return {\n id: new Date().getTime(),\n action: calls,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n }\n\n const txn = {\n kind: 'calls' as const,\n calls: [\n {\n to: selectedToken.address,\n value: BigInt(0),\n data: ERC20.encodeFunctionData('transfer', [recipientAddress, bigNumberHexAmount])\n }\n ]\n }\n\n if (Number(selectedToken.address) === 0) {\n txn.calls = [\n {\n to: recipientAddress,\n value: BigInt(bigNumberHexAmount),\n data: '0x'\n }\n ]\n }\n\n return {\n id: new Date().getTime(),\n action: txn,\n meta: {\n isSignAction: true,\n networkId: selectedToken.networkId,\n accountAddr: selectedAccount\n }\n }\n}\n\nexport { buildTransferUserRequest, buildClaimWalletRequest, buildMintVestingRequest }\n"]} \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.js b/dist/src/libs/trezor/trezor.js index b40a93998..1ce04ade4 100644 --- a/dist/src/libs/trezor/trezor.js +++ b/dist/src/libs/trezor/trezor.js @@ -1,9 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeTrezorMessage = exports.getMessageFromTrezorErrorCode = void 0; /** * Used to "translate" error codes returned by the Trezor device into a * human-readable messages. Although there is a message incoming from Trezor, * it's not self-explanatory and can be difficult for the end users to understand. */ -export const getMessageFromTrezorErrorCode = (errorCode, errorMsg) => { +const getMessageFromTrezorErrorCode = (errorCode, errorMsg) => { if (!errorCode && !errorMsg) return 'Could not connect to your Trezor device. Please try again.'; if (errorCode === 'Method_Interrupted') @@ -15,15 +18,17 @@ export const getMessageFromTrezorErrorCode = (errorCode, errorMsg) => { return 'Trezor device got disconnected.'; return `${errorMsg} (${errorCode ?? 'no error code incoming'})`; }; +exports.getMessageFromTrezorErrorCode = getMessageFromTrezorErrorCode; /** * Used to "translate" errors thrown by the Trezor device into a human-readable * messages. Some of them are not self-explanatory and can be difficult for the * end users to understand. */ -export const normalizeTrezorMessage = (error) => { +const normalizeTrezorMessage = (error) => { if (!error || error?.includes('handshake failed')) { return 'Could not connect to your Trezor device. Please try again.'; } return error; }; +exports.normalizeTrezorMessage = normalizeTrezorMessage; //# sourceMappingURL=trezor.js.map \ No newline at end of file diff --git a/dist/src/libs/trezor/trezor.js.map b/dist/src/libs/trezor/trezor.js.map index 9e23e673e..67a872dc4 100644 --- a/dist/src/libs/trezor/trezor.js.map +++ b/dist/src/libs/trezor/trezor.js.map @@ -1 +1 @@ -{"version":3,"file":"trezor.js","sourceRoot":"","sources":["../../../../src/libs/trezor/trezor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAkB,EAAE,QAAiB,EAAU,EAAE;IAC7F,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,4DAA4D,CAAA;IAEhG,IAAI,SAAS,KAAK,oBAAoB;QACpC,OAAO,sDAAsD,CAAA;IAE/D,IAAI,SAAS,KAAK,yBAAyB;QAAE,OAAO,iCAAiC,CAAA;IAErF,IACE,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,mCAAmC,CAAC;QACtE,SAAS,KAAK,qBAAqB;QAEnC,OAAO,iCAAiC,CAAA;IAE1C,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,wBAAwB,GAAG,CAAA;AACjE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QACjD,OAAO,4DAA4D,CAAA;KACpE;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["/**\n * Used to \"translate\" error codes returned by the Trezor device into a\n * human-readable messages. Although there is a message incoming from Trezor,\n * it's not self-explanatory and can be difficult for the end users to understand.\n */\nexport const getMessageFromTrezorErrorCode = (errorCode?: string, errorMsg?: string): string => {\n if (!errorCode && !errorMsg) return 'Could not connect to your Trezor device. Please try again.'\n\n if (errorCode === 'Method_Interrupted')\n return 'Closing the Trezor popup interrupted the connection.'\n\n if (errorCode === 'Failure_ActionCancelled') return 'Rejected by your Trezor device.'\n\n if (\n errorMsg?.toLowerCase()?.includes('device disconnected during action') ||\n errorCode === 'Device_Disconnected'\n )\n return 'Trezor device got disconnected.'\n\n return `${errorMsg} (${errorCode ?? 'no error code incoming'})`\n}\n\n/**\n * Used to \"translate\" errors thrown by the Trezor device into a human-readable\n * messages. Some of them are not self-explanatory and can be difficult for the\n * end users to understand.\n */\nexport const normalizeTrezorMessage = (error?: string): string => {\n if (!error || error?.includes('handshake failed')) {\n return 'Could not connect to your Trezor device. Please try again.'\n }\n\n return error\n}\n"]} \ No newline at end of file +{"version":3,"file":"trezor.js","sourceRoot":"","sources":["../../../../src/libs/trezor/trezor.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACI,MAAM,6BAA6B,GAAG,CAAC,SAAkB,EAAE,QAAiB,EAAU,EAAE;IAC7F,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,4DAA4D,CAAA;IAEhG,IAAI,SAAS,KAAK,oBAAoB;QACpC,OAAO,sDAAsD,CAAA;IAE/D,IAAI,SAAS,KAAK,yBAAyB;QAAE,OAAO,iCAAiC,CAAA;IAErF,IACE,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,mCAAmC,CAAC;QACtE,SAAS,KAAK,qBAAqB;QAEnC,OAAO,iCAAiC,CAAA;IAE1C,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,wBAAwB,GAAG,CAAA;AACjE,CAAC,CAAA;AAfY,QAAA,6BAA6B,iCAezC;AAED;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QACjD,OAAO,4DAA4D,CAAA;KACpE;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AANY,QAAA,sBAAsB,0BAMlC","sourcesContent":["/**\n * Used to \"translate\" error codes returned by the Trezor device into a\n * human-readable messages. Although there is a message incoming from Trezor,\n * it's not self-explanatory and can be difficult for the end users to understand.\n */\nexport const getMessageFromTrezorErrorCode = (errorCode?: string, errorMsg?: string): string => {\n if (!errorCode && !errorMsg) return 'Could not connect to your Trezor device. Please try again.'\n\n if (errorCode === 'Method_Interrupted')\n return 'Closing the Trezor popup interrupted the connection.'\n\n if (errorCode === 'Failure_ActionCancelled') return 'Rejected by your Trezor device.'\n\n if (\n errorMsg?.toLowerCase()?.includes('device disconnected during action') ||\n errorCode === 'Device_Disconnected'\n )\n return 'Trezor device got disconnected.'\n\n return `${errorMsg} (${errorCode ?? 'no error code incoming'})`\n}\n\n/**\n * Used to \"translate\" errors thrown by the Trezor device into a human-readable\n * messages. Some of them are not self-explanatory and can be difficult for the\n * end users to understand.\n */\nexport const normalizeTrezorMessage = (error?: string): string => {\n if (!error || error?.includes('handshake failed')) {\n return 'Could not connect to your Trezor device. Please try again.'\n }\n\n return error\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/userOperation/types.js b/dist/src/libs/userOperation/types.js index 718fd38ae..11e638d1e 100644 --- a/dist/src/libs/userOperation/types.js +++ b/dist/src/libs/userOperation/types.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.js b/dist/src/libs/userOperation/userOperation.js index 01a033c58..5489a1239 100644 --- a/dist/src/libs/userOperation/userOperation.js +++ b/dist/src/libs/userOperation/userOperation.js @@ -1,10 +1,14 @@ -import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, toBeHex } from 'ethers'; -import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'; -import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'; -import { AMBIRE_ACCOUNT_FACTORY, AMBIRE_PAYMASTER, AMBIRE_PAYMASTER_SIGNER, ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; -import { SPOOF_SIGTYPE } from '../../consts/signatures'; -import { callToTuple } from '../accountOp/accountOp'; -export function calculateCallDataCost(callData) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseLogs = exports.getUserOpHash = exports.ENTRY_POINT_AUTHORIZATION_REQUEST_ID = exports.shouldAskForEntryPointAuthorization = exports.shouldIncludeActivatorCall = exports.isErc4337Broadcast = exports.getUserOperation = exports.shouldUseOneTimeNonce = exports.getRequestType = exports.getOneTimeNonce = exports.getCleanUserOp = exports.getActivatorCall = exports.getSigForCalculations = exports.getPaymasterSpoof = exports.calculateCallDataCost = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireAccount.json")); +const AmbireFactory_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/AmbireFactory.json")); +const deploy_1 = require("../../consts/deploy"); +const signatures_1 = require("../../consts/signatures"); +const accountOp_1 = require("../accountOp/accountOp"); +function calculateCallDataCost(callData) { if (callData === '0x') return 0n; const bytes = Buffer.from(callData.substring(2)); @@ -12,21 +16,24 @@ export function calculateCallDataCost(callData) { const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes); return zeroBytes * 4n + nonZeroBytes * 16n; } -export function getPaymasterSpoof() { - const abiCoder = new AbiCoder(); - const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE; +exports.calculateCallDataCost = calculateCallDataCost; +function getPaymasterSpoof() { + const abiCoder = new ethers_1.AbiCoder(); + const spoofSig = abiCoder.encode(['address'], [deploy_1.AMBIRE_PAYMASTER_SIGNER]) + signatures_1.SPOOF_SIGTYPE; const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig]); - return hexlify(concat([AMBIRE_PAYMASTER, simulationData])); + return (0, ethers_1.hexlify)((0, ethers_1.concat)([deploy_1.AMBIRE_PAYMASTER, simulationData])); } -export function getSigForCalculations() { +exports.getPaymasterSpoof = getPaymasterSpoof; +function getSigForCalculations() { return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'; } +exports.getSigForCalculations = getSigForCalculations; // get the call to give privileges to the entry point -export function getActivatorCall(addr) { - const saAbi = new Interface(AmbireAccount.abi); +function getActivatorCall(addr) { + const saAbi = new ethers_1.Interface(AmbireAccount_json_1.default.abi); const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [ - ERC_4337_ENTRYPOINT, - ENTRY_POINT_MARKER + deploy_1.ERC_4337_ENTRYPOINT, + deploy_1.ENTRY_POINT_MARKER ]); return { to: addr, @@ -34,6 +41,7 @@ export function getActivatorCall(addr) { data: givePermsToEntryPointData }; } +exports.getActivatorCall = getActivatorCall; /** * When we use abi.encode or send the user operation to the bundler, * we need to strip it of the specific ambire-common properties that we use @@ -41,9 +49,10 @@ export function getActivatorCall(addr) { * @param UserOperation userOp * @returns EntryPoint userOp */ -export function getCleanUserOp(userOp) { +function getCleanUserOp(userOp) { return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]; } +exports.getCleanUserOp = getCleanUserOp; /** * Get the nonce we're expecting in validateUserOp * when we're going through the activation | recovery @@ -51,52 +60,55 @@ export function getCleanUserOp(userOp) { * @param UserOperation userOperation * @returns hex string */ -export function getOneTimeNonce(userOperation) { +function getOneTimeNonce(userOperation) { if (!userOperation.paymaster || !userOperation.paymasterVerificationGasLimit || !userOperation.paymasterPostOpGasLimit || !userOperation.paymasterData) { throw new Error('One time nonce could not be encoded because paymaster data is missing'); } - const abiCoder = new AbiCoder(); - return `0x${keccak256(abiCoder.encode(['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'], [ + const abiCoder = new ethers_1.AbiCoder(); + return `0x${(0, ethers_1.keccak256)(abiCoder.encode(['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'], [ userOperation.factory && userOperation.factoryData - ? concat([userOperation.factory, userOperation.factoryData]) + ? (0, ethers_1.concat)([userOperation.factory, userOperation.factoryData]) : '0x', userOperation.callData, - concat([ - toBeHex(userOperation.verificationGasLimit, 16), - toBeHex(userOperation.callGasLimit, 16) + (0, ethers_1.concat)([ + (0, ethers_1.toBeHex)(userOperation.verificationGasLimit, 16), + (0, ethers_1.toBeHex)(userOperation.callGasLimit, 16) ]), userOperation.preVerificationGas, - concat([ - toBeHex(userOperation.maxPriorityFeePerGas, 16), - toBeHex(userOperation.maxFeePerGas, 16) + (0, ethers_1.concat)([ + (0, ethers_1.toBeHex)(userOperation.maxPriorityFeePerGas, 16), + (0, ethers_1.toBeHex)(userOperation.maxFeePerGas, 16) ]), - concat([ + (0, ethers_1.concat)([ userOperation.paymaster, - toBeHex(userOperation.paymasterVerificationGasLimit, 16), - toBeHex(userOperation.paymasterPostOpGasLimit, 16), + (0, ethers_1.toBeHex)(userOperation.paymasterVerificationGasLimit, 16), + (0, ethers_1.toBeHex)(userOperation.paymasterPostOpGasLimit, 16), userOperation.paymasterData ]) - ])).substring(18)}${toBeHex(0, 8).substring(2)}`; + ])).substring(18)}${(0, ethers_1.toBeHex)(0, 8).substring(2)}`; } -export function getRequestType(accountState) { +exports.getOneTimeNonce = getOneTimeNonce; +function getRequestType(accountState) { return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'; } -export function shouldUseOneTimeNonce(accountState) { +exports.getRequestType = getRequestType; +function shouldUseOneTimeNonce(accountState) { return getRequestType(accountState) !== 'standard'; } -export function getUserOperation(account, accountState, accountOp, bundler, entryPointSig) { +exports.shouldUseOneTimeNonce = shouldUseOneTimeNonce; +function getUserOperation(account, accountState, accountOp, bundler, entryPointSig) { const userOp = { sender: accountOp.accountAddr, - nonce: toBeHex(accountState.erc4337Nonce), + nonce: (0, ethers_1.toBeHex)(accountState.erc4337Nonce), callData: '0x', - callGasLimit: toBeHex(0), - verificationGasLimit: toBeHex(0), - preVerificationGas: toBeHex(0), - maxFeePerGas: toBeHex(1), - maxPriorityFeePerGas: toBeHex(1), + callGasLimit: (0, ethers_1.toBeHex)(0), + verificationGasLimit: (0, ethers_1.toBeHex)(0), + preVerificationGas: (0, ethers_1.toBeHex)(0), + maxFeePerGas: (0, ethers_1.toBeHex)(1), + maxPriorityFeePerGas: (0, ethers_1.toBeHex)(1), signature: '0x', requestType: getRequestType(accountState), bundler @@ -107,12 +119,12 @@ export function getUserOperation(account, accountState, accountOp, bundler, entr throw new Error('Account creation properties are missing'); if (!entryPointSig) throw new Error('No entry point authorization signature provided'); - const factoryInterface = new Interface(AmbireFactory.abi); + const factoryInterface = new ethers_1.Interface(AmbireFactory_json_1.default.abi); userOp.factory = account.creation.factoryAddr; userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [ account.creation.bytecode, account.creation.salt, - [callToTuple(getActivatorCall(accountOp.accountAddr))], + [(0, accountOp_1.callToTuple)(getActivatorCall(accountOp.accountAddr))], entryPointSig ]); } @@ -121,7 +133,8 @@ export function getUserOperation(account, accountState, accountOp, bundler, entr userOp.activatorCall = getActivatorCall(accountOp.accountAddr); return userOp; } -export function isErc4337Broadcast(acc, network, accountState) { +exports.getUserOperation = getUserOperation; +function isErc4337Broadcast(acc, network, accountState) { // a special exception for gnosis which was a hardcoded chain but // now it's not. The bundler doesn't support state override on gnosis // so if the account IS deployed AND does NOT have 4337 privileges, @@ -132,55 +145,58 @@ export function isErc4337Broadcast(acc, network, accountState) { network.erc4337.enabled && accountState.isV2 && !!acc.creation && - getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY); + (0, ethers_1.getAddress)(acc.creation.factoryAddr) === deploy_1.AMBIRE_ACCOUNT_FACTORY); } +exports.isErc4337Broadcast = isErc4337Broadcast; // for special cases where we broadcast a 4337 operation with an EOA, // add the activator call so the use has the entry point attached -export function shouldIncludeActivatorCall(network, account, accountState, is4337Broadcast = true) { +function shouldIncludeActivatorCall(network, account, accountState, is4337Broadcast = true) { return (account.creation && - account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY && + account.creation.factoryAddr === deploy_1.AMBIRE_ACCOUNT_FACTORY && accountState.isV2 && network.erc4337.enabled && !accountState.isErc4337Enabled && (accountState.isDeployed || !is4337Broadcast)); } +exports.shouldIncludeActivatorCall = shouldIncludeActivatorCall; // if the account is v2 and the network is 4337 and the account hasn't // authorized the entry point, he should be asked to do so // // addition: if the account is the 0.7.0 one -export function shouldAskForEntryPointAuthorization(network, account, accountState, alreadySigned) { +function shouldAskForEntryPointAuthorization(network, account, accountState, alreadySigned) { if (alreadySigned) return false; return (account.creation && - account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY && + account.creation.factoryAddr === deploy_1.AMBIRE_ACCOUNT_FACTORY && accountState.isV2 && !accountState.isDeployed && network.erc4337.enabled && !accountState.isErc4337Enabled); } -export const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'; -export function getUserOpHash(userOp, chainId) { - const abiCoder = new AbiCoder(); - const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData]) : '0x'; - const hashInitCode = keccak256(initCode); - const hashCallData = keccak256(userOp.callData); - const accountGasLimits = concat([ - toBeHex(userOp.verificationGasLimit.toString(), 16), - toBeHex(userOp.callGasLimit.toString(), 16) +exports.shouldAskForEntryPointAuthorization = shouldAskForEntryPointAuthorization; +exports.ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'; +function getUserOpHash(userOp, chainId) { + const abiCoder = new ethers_1.AbiCoder(); + const initCode = userOp.factory ? (0, ethers_1.concat)([userOp.factory, userOp.factoryData]) : '0x'; + const hashInitCode = (0, ethers_1.keccak256)(initCode); + const hashCallData = (0, ethers_1.keccak256)(userOp.callData); + const accountGasLimits = (0, ethers_1.concat)([ + (0, ethers_1.toBeHex)(userOp.verificationGasLimit.toString(), 16), + (0, ethers_1.toBeHex)(userOp.callGasLimit.toString(), 16) ]); - const gasFees = concat([ - toBeHex(userOp.maxPriorityFeePerGas.toString(), 16), - toBeHex(userOp.maxFeePerGas.toString(), 16) + const gasFees = (0, ethers_1.concat)([ + (0, ethers_1.toBeHex)(userOp.maxPriorityFeePerGas.toString(), 16), + (0, ethers_1.toBeHex)(userOp.maxFeePerGas.toString(), 16) ]); const paymasterAndData = userOp.paymaster - ? concat([ + ? (0, ethers_1.concat)([ userOp.paymaster, - toBeHex(userOp.paymasterVerificationGasLimit.toString(), 16), - toBeHex(userOp.paymasterPostOpGasLimit.toString(), 16), + (0, ethers_1.toBeHex)(userOp.paymasterVerificationGasLimit.toString(), 16), + (0, ethers_1.toBeHex)(userOp.paymasterPostOpGasLimit.toString(), 16), userOp.paymasterData ]) : '0x'; - const hashPaymasterAndData = keccak256(paymasterAndData); + const hashPaymasterAndData = (0, ethers_1.keccak256)(paymasterAndData); const packed = abiCoder.encode(['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'], [ userOp.sender, userOp.nonce, @@ -191,12 +207,13 @@ export function getUserOpHash(userOp, chainId) { gasFees, hashPaymasterAndData ]); - const packedHash = keccak256(packed); - return keccak256(abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])); + const packedHash = (0, ethers_1.keccak256)(packed); + return (0, ethers_1.keccak256)(abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, deploy_1.ERC_4337_ENTRYPOINT, chainId])); } +exports.getUserOpHash = getUserOpHash; // try to parse the UserOperationEvent to understand whether // the user op is a success or a failure -export const parseLogs = (logs, userOpHash, userOpsLength // benzina only +const parseLogs = (logs, userOpHash, userOpsLength // benzina only ) => { if (userOpHash === '' && userOpsLength !== 1) return null; @@ -207,7 +224,7 @@ export const parseLogs = (logs, userOpHash, userOpsLength // benzina only (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)) { // decode data for UserOperationEvent: // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)' - const coder = new AbiCoder(); + const coder = new ethers_1.AbiCoder(); userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data); } } @@ -222,4 +239,5 @@ export const parseLogs = (logs, userOpHash, userOpsLength // benzina only success: userOpLog[1] }; }; +exports.parseLogs = parseLogs; //# sourceMappingURL=userOperation.js.map \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.js.map b/dist/src/libs/userOperation/userOperation.js.map index 749d5bfe1..f0409c8f0 100644 --- a/dist/src/libs/userOperation/userOperation.js.map +++ b/dist/src/libs/userOperation/userOperation.js.map @@ -1 +1 @@ -{"version":3,"file":"userOperation.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers'\nimport { Network } from 'interfaces/network'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { BUNDLER } from '../../consts/bundlers'\nimport {\n AMBIRE_ACCOUNT_FACTORY,\n AMBIRE_PAYMASTER,\n AMBIRE_PAYMASTER_SIGNER,\n ENTRY_POINT_MARKER,\n ERC_4337_ENTRYPOINT\n} from '../../consts/deploy'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport { Account, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { AccountOp, callToTuple } from '../accountOp/accountOp'\nimport { UserOperation, UserOperationEventData, UserOpRequestType } from './types'\n\nexport function calculateCallDataCost(callData: string): bigint {\n if (callData === '0x') return 0n\n const bytes = Buffer.from(callData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n return zeroBytes * 4n + nonZeroBytes * 16n\n}\n\nexport function getPaymasterSpoof() {\n const abiCoder = new AbiCoder()\n const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE\n const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig])\n return hexlify(concat([AMBIRE_PAYMASTER, simulationData]))\n}\n\nexport function getSigForCalculations() {\n return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n}\n\n// get the call to give privileges to the entry point\nexport function getActivatorCall(addr: AccountId) {\n const saAbi = new Interface(AmbireAccount.abi)\n const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [\n ERC_4337_ENTRYPOINT,\n ENTRY_POINT_MARKER\n ])\n return {\n to: addr,\n value: 0n,\n data: givePermsToEntryPointData\n }\n}\n\n/**\n * When we use abi.encode or send the user operation to the bundler,\n * we need to strip it of the specific ambire-common properties that we use\n *\n * @param UserOperation userOp\n * @returns EntryPoint userOp\n */\nexport function getCleanUserOp(userOp: UserOperation) {\n return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]\n}\n\n/**\n * Get the nonce we're expecting in validateUserOp\n * when we're going through the activation | recovery\n *\n * @param UserOperation userOperation\n * @returns hex string\n */\nexport function getOneTimeNonce(userOperation: UserOperation) {\n if (\n !userOperation.paymaster ||\n !userOperation.paymasterVerificationGasLimit ||\n !userOperation.paymasterPostOpGasLimit ||\n !userOperation.paymasterData\n ) {\n throw new Error('One time nonce could not be encoded because paymaster data is missing')\n }\n\n const abiCoder = new AbiCoder()\n return `0x${keccak256(\n abiCoder.encode(\n ['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'],\n [\n userOperation.factory && userOperation.factoryData\n ? concat([userOperation.factory, userOperation.factoryData])\n : '0x',\n userOperation.callData,\n concat([\n toBeHex(userOperation.verificationGasLimit, 16),\n toBeHex(userOperation.callGasLimit, 16)\n ]),\n userOperation.preVerificationGas,\n concat([\n toBeHex(userOperation.maxPriorityFeePerGas, 16),\n toBeHex(userOperation.maxFeePerGas, 16)\n ]),\n concat([\n userOperation.paymaster,\n toBeHex(userOperation.paymasterVerificationGasLimit, 16),\n toBeHex(userOperation.paymasterPostOpGasLimit, 16),\n userOperation.paymasterData\n ])\n ]\n )\n ).substring(18)}${toBeHex(0, 8).substring(2)}`\n}\n\nexport function getRequestType(accountState: AccountOnchainState): UserOpRequestType {\n return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'\n}\n\nexport function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean {\n return getRequestType(accountState) !== 'standard'\n}\n\nexport function getUserOperation(\n account: Account,\n accountState: AccountOnchainState,\n accountOp: AccountOp,\n bundler: BUNDLER,\n entryPointSig?: string\n): UserOperation {\n const userOp: UserOperation = {\n sender: accountOp.accountAddr,\n nonce: toBeHex(accountState.erc4337Nonce),\n callData: '0x',\n callGasLimit: toBeHex(0),\n verificationGasLimit: toBeHex(0),\n preVerificationGas: toBeHex(0),\n maxFeePerGas: toBeHex(1),\n maxPriorityFeePerGas: toBeHex(1),\n signature: '0x',\n requestType: getRequestType(accountState),\n bundler\n }\n\n // if the account is not deployed, prepare the deploy in the initCode\n if (!accountState.isDeployed) {\n if (!account.creation) throw new Error('Account creation properties are missing')\n if (!entryPointSig) throw new Error('No entry point authorization signature provided')\n\n const factoryInterface = new Interface(AmbireFactory.abi)\n userOp.factory = account.creation.factoryAddr\n userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n [callToTuple(getActivatorCall(accountOp.accountAddr))],\n entryPointSig\n ])\n }\n\n // if the request type is activator, add the activator call\n if (userOp.requestType === 'activator')\n userOp.activatorCall = getActivatorCall(accountOp.accountAddr)\n\n return userOp\n}\n\nexport function isErc4337Broadcast(\n acc: Account,\n network: Network,\n accountState: AccountOnchainState\n): boolean {\n // a special exception for gnosis which was a hardcoded chain but\n // now it's not. The bundler doesn't support state override on gnosis\n // so if the account IS deployed AND does NOT have 4337 privileges,\n // it won't be able to use the edge case as the bundler will block\n // the estimation. That's why we will use the relayer in this case\n const canBroadcast4337 =\n network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed\n\n return (\n canBroadcast4337 &&\n network.erc4337.enabled &&\n accountState.isV2 &&\n !!acc.creation &&\n getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n}\n\n// for special cases where we broadcast a 4337 operation with an EOA,\n// add the activator call so the use has the entry point attached\nexport function shouldIncludeActivatorCall(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n is4337Broadcast = true\n) {\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled &&\n (accountState.isDeployed || !is4337Broadcast)\n )\n}\n\n// if the account is v2 and the network is 4337 and the account hasn't\n// authorized the entry point, he should be asked to do so\n//\n// addition: if the account is the 0.7.0 one\nexport function shouldAskForEntryPointAuthorization(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n alreadySigned: boolean\n) {\n if (alreadySigned) return false\n\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n !accountState.isDeployed &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled\n )\n}\n\nexport const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'\n\nexport function getUserOpHash(userOp: UserOperation, chainId: bigint) {\n const abiCoder = new AbiCoder()\n const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData!]) : '0x'\n const hashInitCode = keccak256(initCode)\n const hashCallData = keccak256(userOp.callData)\n const accountGasLimits = concat([\n toBeHex(userOp.verificationGasLimit.toString(), 16),\n toBeHex(userOp.callGasLimit.toString(), 16)\n ])\n const gasFees = concat([\n toBeHex(userOp.maxPriorityFeePerGas.toString(), 16),\n toBeHex(userOp.maxFeePerGas.toString(), 16)\n ])\n const paymasterAndData = userOp.paymaster\n ? concat([\n userOp.paymaster,\n toBeHex(userOp.paymasterVerificationGasLimit!.toString(), 16),\n toBeHex(userOp.paymasterPostOpGasLimit!.toString(), 16),\n userOp.paymasterData!\n ])\n : '0x'\n const hashPaymasterAndData = keccak256(paymasterAndData)\n const packed = abiCoder.encode(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'],\n [\n userOp.sender,\n userOp.nonce,\n hashInitCode,\n hashCallData,\n accountGasLimits,\n userOp.preVerificationGas,\n gasFees,\n hashPaymasterAndData\n ]\n )\n const packedHash = keccak256(packed)\n return keccak256(\n abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])\n )\n}\n\n// try to parse the UserOperationEvent to understand whether\n// the user op is a success or a failure\nexport const parseLogs = (\n logs: readonly Log[],\n userOpHash: string,\n userOpsLength?: number // benzina only\n): UserOperationEventData | null => {\n if (userOpHash === '' && userOpsLength !== 1) return null\n\n let userOpLog = null\n logs.forEach((log: Log) => {\n try {\n if (\n log.topics.length === 4 &&\n (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)\n ) {\n // decode data for UserOperationEvent:\n // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n const coder = new AbiCoder()\n userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data)\n }\n } catch (e: any) {\n /* silence is bitcoin */\n }\n })\n\n if (!userOpLog) return null\n\n return {\n nonce: userOpLog[0],\n success: userOpLog[1]\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"userOperation.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers'\nimport { Network } from 'interfaces/network'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { BUNDLER } from '../../consts/bundlers'\nimport {\n AMBIRE_ACCOUNT_FACTORY,\n AMBIRE_PAYMASTER,\n AMBIRE_PAYMASTER_SIGNER,\n ENTRY_POINT_MARKER,\n ERC_4337_ENTRYPOINT\n} from '../../consts/deploy'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport { Account, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { AccountOp, callToTuple } from '../accountOp/accountOp'\nimport { UserOperation, UserOperationEventData, UserOpRequestType } from './types'\n\nexport function calculateCallDataCost(callData: string): bigint {\n if (callData === '0x') return 0n\n const bytes = Buffer.from(callData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n return zeroBytes * 4n + nonZeroBytes * 16n\n}\n\nexport function getPaymasterSpoof() {\n const abiCoder = new AbiCoder()\n const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE\n const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig])\n return hexlify(concat([AMBIRE_PAYMASTER, simulationData]))\n}\n\nexport function getSigForCalculations() {\n return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n}\n\n// get the call to give privileges to the entry point\nexport function getActivatorCall(addr: AccountId) {\n const saAbi = new Interface(AmbireAccount.abi)\n const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [\n ERC_4337_ENTRYPOINT,\n ENTRY_POINT_MARKER\n ])\n return {\n to: addr,\n value: 0n,\n data: givePermsToEntryPointData\n }\n}\n\n/**\n * When we use abi.encode or send the user operation to the bundler,\n * we need to strip it of the specific ambire-common properties that we use\n *\n * @param UserOperation userOp\n * @returns EntryPoint userOp\n */\nexport function getCleanUserOp(userOp: UserOperation) {\n return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]\n}\n\n/**\n * Get the nonce we're expecting in validateUserOp\n * when we're going through the activation | recovery\n *\n * @param UserOperation userOperation\n * @returns hex string\n */\nexport function getOneTimeNonce(userOperation: UserOperation) {\n if (\n !userOperation.paymaster ||\n !userOperation.paymasterVerificationGasLimit ||\n !userOperation.paymasterPostOpGasLimit ||\n !userOperation.paymasterData\n ) {\n throw new Error('One time nonce could not be encoded because paymaster data is missing')\n }\n\n const abiCoder = new AbiCoder()\n return `0x${keccak256(\n abiCoder.encode(\n ['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'],\n [\n userOperation.factory && userOperation.factoryData\n ? concat([userOperation.factory, userOperation.factoryData])\n : '0x',\n userOperation.callData,\n concat([\n toBeHex(userOperation.verificationGasLimit, 16),\n toBeHex(userOperation.callGasLimit, 16)\n ]),\n userOperation.preVerificationGas,\n concat([\n toBeHex(userOperation.maxPriorityFeePerGas, 16),\n toBeHex(userOperation.maxFeePerGas, 16)\n ]),\n concat([\n userOperation.paymaster,\n toBeHex(userOperation.paymasterVerificationGasLimit, 16),\n toBeHex(userOperation.paymasterPostOpGasLimit, 16),\n userOperation.paymasterData\n ])\n ]\n )\n ).substring(18)}${toBeHex(0, 8).substring(2)}`\n}\n\nexport function getRequestType(accountState: AccountOnchainState): UserOpRequestType {\n return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'\n}\n\nexport function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean {\n return getRequestType(accountState) !== 'standard'\n}\n\nexport function getUserOperation(\n account: Account,\n accountState: AccountOnchainState,\n accountOp: AccountOp,\n bundler: BUNDLER,\n entryPointSig?: string\n): UserOperation {\n const userOp: UserOperation = {\n sender: accountOp.accountAddr,\n nonce: toBeHex(accountState.erc4337Nonce),\n callData: '0x',\n callGasLimit: toBeHex(0),\n verificationGasLimit: toBeHex(0),\n preVerificationGas: toBeHex(0),\n maxFeePerGas: toBeHex(1),\n maxPriorityFeePerGas: toBeHex(1),\n signature: '0x',\n requestType: getRequestType(accountState),\n bundler\n }\n\n // if the account is not deployed, prepare the deploy in the initCode\n if (!accountState.isDeployed) {\n if (!account.creation) throw new Error('Account creation properties are missing')\n if (!entryPointSig) throw new Error('No entry point authorization signature provided')\n\n const factoryInterface = new Interface(AmbireFactory.abi)\n userOp.factory = account.creation.factoryAddr\n userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n [callToTuple(getActivatorCall(accountOp.accountAddr))],\n entryPointSig\n ])\n }\n\n // if the request type is activator, add the activator call\n if (userOp.requestType === 'activator')\n userOp.activatorCall = getActivatorCall(accountOp.accountAddr)\n\n return userOp\n}\n\nexport function isErc4337Broadcast(\n acc: Account,\n network: Network,\n accountState: AccountOnchainState\n): boolean {\n // a special exception for gnosis which was a hardcoded chain but\n // now it's not. The bundler doesn't support state override on gnosis\n // so if the account IS deployed AND does NOT have 4337 privileges,\n // it won't be able to use the edge case as the bundler will block\n // the estimation. That's why we will use the relayer in this case\n const canBroadcast4337 =\n network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed\n\n return (\n canBroadcast4337 &&\n network.erc4337.enabled &&\n accountState.isV2 &&\n !!acc.creation &&\n getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n}\n\n// for special cases where we broadcast a 4337 operation with an EOA,\n// add the activator call so the use has the entry point attached\nexport function shouldIncludeActivatorCall(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n is4337Broadcast = true\n) {\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled &&\n (accountState.isDeployed || !is4337Broadcast)\n )\n}\n\n// if the account is v2 and the network is 4337 and the account hasn't\n// authorized the entry point, he should be asked to do so\n//\n// addition: if the account is the 0.7.0 one\nexport function shouldAskForEntryPointAuthorization(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n alreadySigned: boolean\n) {\n if (alreadySigned) return false\n\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n !accountState.isDeployed &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled\n )\n}\n\nexport const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'\n\nexport function getUserOpHash(userOp: UserOperation, chainId: bigint) {\n const abiCoder = new AbiCoder()\n const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData!]) : '0x'\n const hashInitCode = keccak256(initCode)\n const hashCallData = keccak256(userOp.callData)\n const accountGasLimits = concat([\n toBeHex(userOp.verificationGasLimit.toString(), 16),\n toBeHex(userOp.callGasLimit.toString(), 16)\n ])\n const gasFees = concat([\n toBeHex(userOp.maxPriorityFeePerGas.toString(), 16),\n toBeHex(userOp.maxFeePerGas.toString(), 16)\n ])\n const paymasterAndData = userOp.paymaster\n ? concat([\n userOp.paymaster,\n toBeHex(userOp.paymasterVerificationGasLimit!.toString(), 16),\n toBeHex(userOp.paymasterPostOpGasLimit!.toString(), 16),\n userOp.paymasterData!\n ])\n : '0x'\n const hashPaymasterAndData = keccak256(paymasterAndData)\n const packed = abiCoder.encode(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'],\n [\n userOp.sender,\n userOp.nonce,\n hashInitCode,\n hashCallData,\n accountGasLimits,\n userOp.preVerificationGas,\n gasFees,\n hashPaymasterAndData\n ]\n )\n const packedHash = keccak256(packed)\n return keccak256(\n abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])\n )\n}\n\n// try to parse the UserOperationEvent to understand whether\n// the user op is a success or a failure\nexport const parseLogs = (\n logs: readonly Log[],\n userOpHash: string,\n userOpsLength?: number // benzina only\n): UserOperationEventData | null => {\n if (userOpHash === '' && userOpsLength !== 1) return null\n\n let userOpLog = null\n logs.forEach((log: Log) => {\n try {\n if (\n log.topics.length === 4 &&\n (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)\n ) {\n // decode data for UserOperationEvent:\n // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n const coder = new AbiCoder()\n userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data)\n }\n } catch (e: any) {\n /* silence is bitcoin */\n }\n })\n\n if (!userOpLog) return null\n\n return {\n nonce: userOpLog[0],\n success: userOpLog[1]\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/address/address.js b/dist/src/services/address/address.js index 1f6ae52c7..1cd990e8d 100644 --- a/dist/src/services/address/address.js +++ b/dist/src/services/address/address.js @@ -1,15 +1,19 @@ -import { FEE_COLLECTOR } from '../../consts/addresses'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isHumanizerKnownTokenOrSmartContract = exports.isValidAddress = void 0; +const addresses_1 = require("../../consts/addresses"); const isValidAddress = (address) => /^0x[a-fA-F0-9]{40}$/.test(address); +exports.isValidAddress = isValidAddress; const isHumanizerKnownTokenOrSmartContract = (humanizerInfo, _address) => { const address = _address.toLowerCase(); // humanizer keys (addresses) are lowercase // In order to humanize the fee collector as "Gas Tank", it is included in the // "names" in the humanizer (all others are smart contract addresses). But the // fee collector is not a smart contract (or token). It is an EOA. - if (address === FEE_COLLECTOR.toLowerCase()) + if (address === addresses_1.FEE_COLLECTOR.toLowerCase()) return false; return (Object.keys(humanizerInfo.tokens).includes(address) || // token addresses Object.keys(humanizerInfo.names).includes(address) // smart contract addresses ); }; -export { isValidAddress, isHumanizerKnownTokenOrSmartContract }; +exports.isHumanizerKnownTokenOrSmartContract = isHumanizerKnownTokenOrSmartContract; //# sourceMappingURL=address.js.map \ No newline at end of file diff --git a/dist/src/services/address/address.js.map b/dist/src/services/address/address.js.map index de710f433..a25629b6a 100644 --- a/dist/src/services/address/address.js.map +++ b/dist/src/services/address/address.js.map @@ -1 +1 @@ -{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../../src/services/address/address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAE/E,MAAM,oCAAoC,GAAG,CAC3C,aAAgC,EAChC,QAAgB,EAChB,EAAE;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAC,2CAA2C;IAElF,8EAA8E;IAC9E,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,OAAO,KAAK,aAAa,CAAC,WAAW,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,kBAAkB;QACzE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,2BAA2B;KAC/E,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,oCAAoC,EAAE,CAAA","sourcesContent":["import { HumanizerInfoType } from '../../../v1/hooks/useConstants'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\n\nconst isValidAddress = (address: string) => /^0x[a-fA-F0-9]{40}$/.test(address)\n\nconst isHumanizerKnownTokenOrSmartContract = (\n humanizerInfo: HumanizerInfoType,\n _address: string\n) => {\n const address = _address.toLowerCase() // humanizer keys (addresses) are lowercase\n\n // In order to humanize the fee collector as \"Gas Tank\", it is included in the\n // \"names\" in the humanizer (all others are smart contract addresses). But the\n // fee collector is not a smart contract (or token). It is an EOA.\n if (address === FEE_COLLECTOR.toLowerCase()) return false\n\n return (\n Object.keys(humanizerInfo.tokens).includes(address) || // token addresses\n Object.keys(humanizerInfo.names).includes(address) // smart contract addresses\n )\n}\n\nexport { isValidAddress, isHumanizerKnownTokenOrSmartContract }\n"]} \ No newline at end of file +{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../../src/services/address/address.ts"],"names":[],"mappings":";;;AACA,sDAAsD;AAEtD,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAmBtE,wCAAc;AAjBvB,MAAM,oCAAoC,GAAG,CAC3C,aAAgC,EAChC,QAAgB,EAChB,EAAE;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAC,2CAA2C;IAElF,8EAA8E;IAC9E,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,OAAO,KAAK,yBAAa,CAAC,WAAW,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,kBAAkB;QACzE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,2BAA2B;KAC/E,CAAA;AACH,CAAC,CAAA;AAEwB,oFAAoC","sourcesContent":["import { HumanizerInfoType } from '../../../v1/hooks/useConstants'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\n\nconst isValidAddress = (address: string) => /^0x[a-fA-F0-9]{40}$/.test(address)\n\nconst isHumanizerKnownTokenOrSmartContract = (\n humanizerInfo: HumanizerInfoType,\n _address: string\n) => {\n const address = _address.toLowerCase() // humanizer keys (addresses) are lowercase\n\n // In order to humanize the fee collector as \"Gas Tank\", it is included in the\n // \"names\" in the humanizer (all others are smart contract addresses). But the\n // fee collector is not a smart contract (or token). It is an EOA.\n if (address === FEE_COLLECTOR.toLowerCase()) return false\n\n return (\n Object.keys(humanizerInfo.tokens).includes(address) || // token addresses\n Object.keys(humanizerInfo.names).includes(address) // smart contract addresses\n )\n}\n\nexport { isValidAddress, isHumanizerKnownTokenOrSmartContract }\n"]} \ No newline at end of file diff --git a/dist/src/services/address/index.js b/dist/src/services/address/index.js index 1db1e7d56..3e925cda2 100644 --- a/dist/src/services/address/index.js +++ b/dist/src/services/address/index.js @@ -1,2 +1,5 @@ -export * from './address'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./address"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/address/index.js.map b/dist/src/services/address/index.js.map index 29da07908..61483f5bd 100644 --- a/dist/src/services/address/index.js.map +++ b/dist/src/services/address/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/address/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA","sourcesContent":["export * from './address'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/address/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB","sourcesContent":["export * from './address'\n"]} \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.js b/dist/src/services/assetInfo/assetInfo.js index 758f126e9..34be407a7 100644 --- a/dist/src/services/assetInfo/assetInfo.js +++ b/dist/src/services/assetInfo/assetInfo.js @@ -1,11 +1,14 @@ -import { JsonRpcProvider } from 'ethers'; -import { Portfolio } from '../../libs/portfolio'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveAssetInfo = exports.executeBatchedFetch = void 0; +const ethers_1 = require("ethers"); +const portfolio_1 = require("../../libs/portfolio"); const RANDOM_ADDRESS = '0x0000000000000000000000000000000000000001'; const scheduledActions = {}; -export async function executeBatchedFetch(network) { - const provider = new JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0]); +async function executeBatchedFetch(network) { + const provider = new ethers_1.JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0]); const allAddresses = Array.from(new Set(scheduledActions[network.id]?.data.map((i) => i.address))) || []; - const portfolio = new Portfolio(fetch, provider, network); + const portfolio = new portfolio_1.Portfolio(fetch, provider, network); const options = { disableAutoDiscovery: true, additionalErc20Hints: allAddresses, @@ -26,10 +29,11 @@ export async function executeBatchedFetch(network) { i.callback({ tokenInfo, nftInfo }); }); } +exports.executeBatchedFetch = executeBatchedFetch; /** * Resolves symbol and decimals for tokens or name for nfts. */ -export async function resolveAssetInfo(address, network, callback) { +async function resolveAssetInfo(address, network, callback) { if (!scheduledActions[network.id]?.data?.length) { scheduledActions[network.id] = { promise: new Promise((resolve, reject) => { @@ -48,4 +52,5 @@ export async function resolveAssetInfo(address, network, callback) { // we are returning a promise so we can await the full execution return scheduledActions[network.id]?.promise; } +exports.resolveAssetInfo = resolveAssetInfo; //# sourceMappingURL=assetInfo.js.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/assetInfo.js.map b/dist/src/services/assetInfo/assetInfo.js.map index 7f97ee116..9dad00484 100644 --- a/dist/src/services/assetInfo/assetInfo.js.map +++ b/dist/src/services/assetInfo/assetInfo.js.map @@ -1 +1 @@ -{"version":3,"file":"assetInfo.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/assetInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAGxC,OAAO,EAAc,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,cAAc,GAAG,4CAA4C,CAAA;AACnE,MAAM,gBAAgB,GAKlB,EAAE,CAAA;AAEN,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAgB;IACxD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAClF,MAAM,YAAY,GAChB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACrF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChE,MAAM,OAAO,GAAwB;QACnC,oBAAoB,EAAE,IAAI;QAC1B,oBAAoB,EAAE,YAAY;QAClC,qBAAqB,EAAE,MAAM,CAAC,WAAW,CACvC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtB,CAAC;YACD;gBACE,MAAM,EAAE,CAAC,GAAG,CAAC;gBACb,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CACH;KACF,CAAA;IACD,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAEtE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,SAAS,GACb,CAAC,CAAC,CAAC,OAAO;YACV,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CACjE,CAAC,CAAA;QACJ,MAAM,OAAO,GACX,CAAC,CAAC,CAAC,OAAO;YACV,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CACjE,CAAC,CAAA;QAEJ,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAAgB,EAChB,QAGU;IAEV,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QAC/C,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;YAC7B,OAAO,EAAE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACvC,UAAU,CAAC,KAAK,IAAI,EAAE;oBACpB,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;oBAChD,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;oBACxC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACZ,CAAC,EAAE,GAAG,CAAC,CAAA;YACT,CAAC,CAAC;YACF,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;SAC9B,CAAA;KACF;SAAM;QACL,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;KAC/D;IACD,gEAAgE;IAChE,OAAO,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAA;AAC9C,CAAC","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { GetOptions, Portfolio } from '../../libs/portfolio'\n\nconst RANDOM_ADDRESS = '0x0000000000000000000000000000000000000001'\nconst scheduledActions: {\n [network in NetworkId]?: {\n promise: Promise\n data: { callback: Function; address: string }[]\n }\n} = {}\n\nexport async function executeBatchedFetch(network: Network): Promise {\n const provider = new JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0])\n const allAddresses =\n Array.from(new Set(scheduledActions[network.id]?.data.map((i) => i.address))) || []\n const portfolio = new Portfolio(fetch as any, provider, network)\n const options: Partial = {\n disableAutoDiscovery: true,\n additionalErc20Hints: allAddresses,\n additionalErc721Hints: Object.fromEntries(\n allAddresses.map((i) => [\n i,\n {\n tokens: ['1'],\n isKnown: false\n }\n ])\n )\n }\n const portfolioResponse = await portfolio.get(RANDOM_ADDRESS, options)\n\n scheduledActions[network.id]?.data.forEach((i) => {\n const tokenInfo =\n (i.address,\n portfolioResponse.tokens.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n const nftInfo =\n (i.address,\n portfolioResponse.collections.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n\n i.callback({ tokenInfo, nftInfo })\n })\n}\n\n/**\n * Resolves symbol and decimals for tokens or name for nfts.\n */\nexport async function resolveAssetInfo(\n address: string,\n network: Network,\n callback: (arg: {\n tokenInfo?: { decimals: number; symbol: string }\n nftInfo?: { name: string }\n }) => void\n): Promise {\n if (!scheduledActions[network.id]?.data?.length) {\n scheduledActions[network.id] = {\n promise: new Promise((resolve, reject) => {\n setTimeout(async () => {\n await executeBatchedFetch(network).catch(reject)\n scheduledActions[network.id] = undefined\n resolve(0)\n }, 500)\n }),\n data: [{ address, callback }]\n }\n } else {\n scheduledActions[network.id]?.data.push({ address, callback })\n }\n // we are returning a promise so we can await the full execution\n return scheduledActions[network.id]?.promise\n}\n"]} \ No newline at end of file +{"version":3,"file":"assetInfo.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/assetInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { GetOptions, Portfolio } from '../../libs/portfolio'\n\nconst RANDOM_ADDRESS = '0x0000000000000000000000000000000000000001'\nconst scheduledActions: {\n [network in NetworkId]?: {\n promise: Promise\n data: { callback: Function; address: string }[]\n }\n} = {}\n\nexport async function executeBatchedFetch(network: Network): Promise {\n const provider = new JsonRpcProvider(network.selectedRpcUrl || network.rpcUrls[0])\n const allAddresses =\n Array.from(new Set(scheduledActions[network.id]?.data.map((i) => i.address))) || []\n const portfolio = new Portfolio(fetch as any, provider, network)\n const options: Partial = {\n disableAutoDiscovery: true,\n additionalErc20Hints: allAddresses,\n additionalErc721Hints: Object.fromEntries(\n allAddresses.map((i) => [\n i,\n {\n tokens: ['1'],\n isKnown: false\n }\n ])\n )\n }\n const portfolioResponse = await portfolio.get(RANDOM_ADDRESS, options)\n\n scheduledActions[network.id]?.data.forEach((i) => {\n const tokenInfo =\n (i.address,\n portfolioResponse.tokens.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n const nftInfo =\n (i.address,\n portfolioResponse.collections.find(\n (t) => t.address.toLocaleLowerCase() === i.address.toLowerCase()\n ))\n\n i.callback({ tokenInfo, nftInfo })\n })\n}\n\n/**\n * Resolves symbol and decimals for tokens or name for nfts.\n */\nexport async function resolveAssetInfo(\n address: string,\n network: Network,\n callback: (arg: {\n tokenInfo?: { decimals: number; symbol: string }\n nftInfo?: { name: string }\n }) => void\n): Promise {\n if (!scheduledActions[network.id]?.data?.length) {\n scheduledActions[network.id] = {\n promise: new Promise((resolve, reject) => {\n setTimeout(async () => {\n await executeBatchedFetch(network).catch(reject)\n scheduledActions[network.id] = undefined\n resolve(0)\n }, 500)\n }),\n data: [{ address, callback }]\n }\n } else {\n scheduledActions[network.id]?.data.push({ address, callback })\n }\n // we are returning a promise so we can await the full execution\n return scheduledActions[network.id]?.promise\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.js b/dist/src/services/assetInfo/index.js index 88a1baecb..0934cfc65 100644 --- a/dist/src/services/assetInfo/index.js +++ b/dist/src/services/assetInfo/index.js @@ -1,2 +1,5 @@ -export * from './assetInfo'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./assetInfo"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/assetInfo/index.js.map b/dist/src/services/assetInfo/index.js.map index c12ceac20..f25c70984 100644 --- a/dist/src/services/assetInfo/index.js.map +++ b/dist/src/services/assetInfo/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA","sourcesContent":["export * from './assetInfo'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/assetInfo/index.ts"],"names":[],"mappings":";;;AAAA,sDAA2B","sourcesContent":["export * from './assetInfo'\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.js b/dist/src/services/bundlers/DevBundlerSwitcher.js index 4760d62d0..2a5672646 100644 --- a/dist/src/services/bundlers/DevBundlerSwitcher.js +++ b/dist/src/services/bundlers/DevBundlerSwitcher.js @@ -1,16 +1,20 @@ -import { BrokenBiconomyBroadcast } from './brokenBiconomyBroadcast'; -import { BundlerSwitcher } from './bundlerSwitcher'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DevBundlerSwitcher = void 0; +const brokenBiconomyBroadcast_1 = require("./brokenBiconomyBroadcast"); +const bundlerSwitcher_1 = require("./bundlerSwitcher"); /** * DANGER * This class is made only for testing purposes where we forcefully * set a broken bundler as the main one to test if fallback is working */ -export class DevBundlerSwitcher extends BundlerSwitcher { +class DevBundlerSwitcher extends bundlerSwitcher_1.BundlerSwitcher { constructor(network, getSignAccountOpStatus, noStateUpdateStatuses, usedBundlers) { super(network, getSignAccountOpStatus, noStateUpdateStatuses); - this.bundler = new BrokenBiconomyBroadcast(); + this.bundler = new brokenBiconomyBroadcast_1.BrokenBiconomyBroadcast(); if (usedBundlers) this.usedBundlers.push(...usedBundlers); } } +exports.DevBundlerSwitcher = DevBundlerSwitcher; //# sourceMappingURL=DevBundlerSwitcher.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/DevBundlerSwitcher.js.map b/dist/src/services/bundlers/DevBundlerSwitcher.js.map index f49da51f5..69ea9279a 100644 --- a/dist/src/services/bundlers/DevBundlerSwitcher.js.map +++ b/dist/src/services/bundlers/DevBundlerSwitcher.js.map @@ -1 +1 @@ -{"version":3,"file":"DevBundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/DevBundlerSwitcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,YACE,OAAgB,EAChB,sBAAgC,EAChC,qBAA4B,EAC5B,YAAwB;QAExB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAA;QAC5C,IAAI,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAA;IAC3D,CAAC;CACF","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { BrokenBiconomyBroadcast } from './brokenBiconomyBroadcast'\nimport { BundlerSwitcher } from './bundlerSwitcher'\n\n/**\n * DANGER\n * This class is made only for testing purposes where we forcefully\n * set a broken bundler as the main one to test if fallback is working\n */\nexport class DevBundlerSwitcher extends BundlerSwitcher {\n constructor(\n network: Network,\n getSignAccountOpStatus: Function,\n noStateUpdateStatuses: any[],\n usedBundlers?: BUNDLER[]\n ) {\n super(network, getSignAccountOpStatus, noStateUpdateStatuses)\n this.bundler = new BrokenBiconomyBroadcast()\n if (usedBundlers) this.usedBundlers.push(...usedBundlers)\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"DevBundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/DevBundlerSwitcher.ts"],"names":[],"mappings":";;;AAEA,uEAAmE;AACnE,uDAAmD;AAEnD;;;;GAIG;AACH,MAAa,kBAAmB,SAAQ,iCAAe;IACrD,YACE,OAAgB,EAChB,sBAAgC,EAChC,qBAA4B,EAC5B,YAAwB;QAExB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,iDAAuB,EAAE,CAAA;QAC5C,IAAI,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAA;IAC3D,CAAC;CACF;AAXD,gDAWC","sourcesContent":["import { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { BrokenBiconomyBroadcast } from './brokenBiconomyBroadcast'\nimport { BundlerSwitcher } from './bundlerSwitcher'\n\n/**\n * DANGER\n * This class is made only for testing purposes where we forcefully\n * set a broken bundler as the main one to test if fallback is working\n */\nexport class DevBundlerSwitcher extends BundlerSwitcher {\n constructor(\n network: Network,\n getSignAccountOpStatus: Function,\n noStateUpdateStatuses: any[],\n usedBundlers?: BUNDLER[]\n ) {\n super(network, getSignAccountOpStatus, noStateUpdateStatuses)\n this.bundler = new BrokenBiconomyBroadcast()\n if (usedBundlers) this.usedBundlers.push(...usedBundlers)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.js b/dist/src/services/bundlers/biconomy.js index fbce2c4f7..6c22292a5 100644 --- a/dist/src/services/bundlers/biconomy.js +++ b/dist/src/services/bundlers/biconomy.js @@ -1,7 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Biconomy = void 0; /* eslint-disable class-methods-use-this */ -import { BICONOMY } from '../../consts/bundlers'; -import { Bundler } from './bundler'; -export class Biconomy extends Bundler { +const bundlers_1 = require("../../consts/bundlers"); +const bundler_1 = require("./bundler"); +class Biconomy extends bundler_1.Bundler { getUrl(network) { return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`; } @@ -67,7 +70,8 @@ export class Biconomy extends Bundler { return userOpStatus; } getName() { - return BICONOMY; + return bundlers_1.BICONOMY; } } +exports.Biconomy = Biconomy; //# sourceMappingURL=biconomy.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.js.map b/dist/src/services/bundlers/biconomy.js.map index 5e9e85c07..a04797eaf 100644 --- a/dist/src/services/bundlers/biconomy.js.map +++ b/dist/src/services/bundlers/biconomy.js.map @@ -1 +1 @@ -{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":"AAGA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAW,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,OAAO,QAAS,SAAQ,OAAO;IACzB,MAAM,CAAC,OAAgB;QAC/B,OAAO,sCAAsC,OAAO,CAAC,OAAO,iDAAiD,CAAA;IAC/G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ;aAC1B,IAAI,CAAC,iCAAiC,EAAE,CAAC,UAAU,CAAC,CAAC;aACrD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEd,OAAO;gBACL,KAAK,EAAE,WAAW;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,IAAI,YAAY,GAAiB;YAC/B,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,QAAQ,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,KAAK,iBAAiB;oBACpB,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,KAAK,8BAA8B;oBACjC,YAAY,GAAG;wBACb,MAAM,EAAE,UAAU;qBACnB,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP;oBACE,MAAK;aACR;SACF;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF","sourcesContent":["/* eslint-disable no-console */\nimport { Network } from 'interfaces/network'\n\n/* eslint-disable class-methods-use-this */\nimport { BICONOMY, BUNDLER } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Biconomy extends Bundler {\n protected getUrl(network: Network): string {\n return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('biconomy_getGasFeeValues', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n const result = await provider\n .send('biconomy_getUserOperationStatus', [userOpHash])\n .catch((e) => {\n console.log('biconomy_getUserOperationStatus returned an error')\n console.log(e)\n\n return {\n state: 'NOT_FOUND'\n }\n })\n\n let userOpStatus: UserOpStatus = {\n status: 'not_found'\n }\n if (result.state) {\n switch (result.state) {\n case 'NOT_FOUND':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n // currently, we don't handle the middle stage called bundler mempool\n // it can be treated the same way as not_found - which means it will\n // query the bundler again until it has a txnId\n case 'BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n case 'DROPPED_FROM_BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'rejected'\n }\n break\n\n case 'SUBMITTED':\n case 'FAILED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n case 'CONFIRMED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n default:\n break\n }\n }\n\n return userOpStatus\n }\n\n public getName(): BUNDLER {\n return BICONOMY\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":";;;AAGA,2CAA2C;AAC3C,oDAAyD;AACzD,uCAAmC;AAGnC,MAAa,QAAS,SAAQ,iBAAO;IACzB,MAAM,CAAC,OAAgB;QAC/B,OAAO,sCAAsC,OAAO,CAAC,OAAO,iDAAiD,CAAA;IAC/G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ;aAC1B,IAAI,CAAC,iCAAiC,EAAE,CAAC,UAAU,CAAC,CAAC;aACrD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEd,OAAO;gBACL,KAAK,EAAE,WAAW;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,IAAI,YAAY,GAAiB;YAC/B,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,QAAQ,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,KAAK,iBAAiB;oBACpB,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,KAAK,8BAA8B;oBACjC,YAAY,GAAG;wBACb,MAAM,EAAE,UAAU;qBACnB,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP;oBACE,MAAK;aACR;SACF;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,mBAAQ,CAAA;IACjB,CAAC;CACF;AA/ED,4BA+EC","sourcesContent":["/* eslint-disable no-console */\nimport { Network } from 'interfaces/network'\n\n/* eslint-disable class-methods-use-this */\nimport { BICONOMY, BUNDLER } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Biconomy extends Bundler {\n protected getUrl(network: Network): string {\n return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('biconomy_getGasFeeValues', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n const result = await provider\n .send('biconomy_getUserOperationStatus', [userOpHash])\n .catch((e) => {\n console.log('biconomy_getUserOperationStatus returned an error')\n console.log(e)\n\n return {\n state: 'NOT_FOUND'\n }\n })\n\n let userOpStatus: UserOpStatus = {\n status: 'not_found'\n }\n if (result.state) {\n switch (result.state) {\n case 'NOT_FOUND':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n // currently, we don't handle the middle stage called bundler mempool\n // it can be treated the same way as not_found - which means it will\n // query the bundler again until it has a txnId\n case 'BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n case 'DROPPED_FROM_BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'rejected'\n }\n break\n\n case 'SUBMITTED':\n case 'FAILED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n case 'CONFIRMED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n default:\n break\n }\n }\n\n return userOpStatus\n }\n\n public getName(): BUNDLER {\n return BICONOMY\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.js b/dist/src/services/bundlers/brokenBiconomyBroadcast.js index b61dbbd40..82d8b4d40 100644 --- a/dist/src/services/bundlers/brokenBiconomyBroadcast.js +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.js @@ -1,6 +1,9 @@ +"use strict"; /* eslint-disable class-methods-use-this */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Biconomy } from './biconomy'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrokenBiconomyBroadcast = void 0; +const biconomy_1 = require("./biconomy"); /** * DANGER * This class is made purely for the intention of using it for tests @@ -8,9 +11,10 @@ import { Biconomy } from './biconomy'; * When broadcast fails, estimation should switch to pimlico * and continue on */ -export class BrokenBiconomyBroadcast extends Biconomy { +class BrokenBiconomyBroadcast extends biconomy_1.Biconomy { broadcast(userOperation, network) { throw new Error('Internal error from bundler'); } } +exports.BrokenBiconomyBroadcast = BrokenBiconomyBroadcast; //# sourceMappingURL=brokenBiconomyBroadcast.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map b/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map index 5739e212a..1fb6eb9cb 100644 --- a/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map +++ b/dist/src/services/bundlers/brokenBiconomyBroadcast.js.map @@ -1 +1 @@ -{"version":3,"file":"brokenBiconomyBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenBiconomyBroadcast.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sDAAsD;AAItD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,OAAO,uBAAwB,SAAQ,QAAQ;IACnD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Biconomy } from './biconomy'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to pimlico\n * and continue on\n */\nexport class BrokenBiconomyBroadcast extends Biconomy {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"brokenBiconomyBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenBiconomyBroadcast.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,sDAAsD;;;AAItD,yCAAqC;AAErC;;;;;;GAMG;AACH,MAAa,uBAAwB,SAAQ,mBAAQ;IACnD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,0DAIC","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Biconomy } from './biconomy'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to pimlico\n * and continue on\n */\nexport class BrokenBiconomyBroadcast extends Biconomy {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.js b/dist/src/services/bundlers/brokenPimlicoBroadcast.js index 49edc33ff..96b362051 100644 --- a/dist/src/services/bundlers/brokenPimlicoBroadcast.js +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.js @@ -1,6 +1,9 @@ +"use strict"; /* eslint-disable class-methods-use-this */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Pimlico } from './pimlico'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrokenPimlicoBroadcast = void 0; +const pimlico_1 = require("./pimlico"); /** * DANGER * This class is made purely for the intention of using it for tests @@ -8,9 +11,10 @@ import { Pimlico } from './pimlico'; * When broadcast fails, estimation should switch to biconomy * and continue on */ -export class BrokenPimlicoBroadcast extends Pimlico { +class BrokenPimlicoBroadcast extends pimlico_1.Pimlico { broadcast(userOperation, network) { throw new Error('Internal error from bundler'); } } +exports.BrokenPimlicoBroadcast = BrokenPimlicoBroadcast; //# sourceMappingURL=brokenPimlicoBroadcast.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map b/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map index 9e4605d86..80a3cd3fc 100644 --- a/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map +++ b/dist/src/services/bundlers/brokenPimlicoBroadcast.js.map @@ -1 +1 @@ -{"version":3,"file":"brokenPimlicoBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenPimlicoBroadcast.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sDAAsD;AAItD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;;GAMG;AACH,MAAM,OAAO,sBAAuB,SAAQ,OAAO;IACjD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Pimlico } from './pimlico'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to biconomy\n * and continue on\n */\nexport class BrokenPimlicoBroadcast extends Pimlico {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"brokenPimlicoBroadcast.js","sourceRoot":"","sources":["../../../../src/services/bundlers/brokenPimlicoBroadcast.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,sDAAsD;;;AAItD,uCAAmC;AAEnC;;;;;;GAMG;AACH,MAAa,sBAAuB,SAAQ,iBAAO;IACjD,SAAS,CAAC,aAA4B,EAAE,OAAgB;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,wDAIC","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { Network } from '../../interfaces/network'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { Pimlico } from './pimlico'\n\n/**\n * DANGER\n * This class is made purely for the intention of using it for tests\n * where the broadcast fails but everything else should work.\n * When broadcast fails, estimation should switch to biconomy\n * and continue on\n */\nexport class BrokenPimlicoBroadcast extends Pimlico {\n broadcast(userOperation: UserOperation, network: Network): Promise {\n throw new Error('Internal error from bundler')\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.js b/dist/src/services/bundlers/bundler.js index 9a1736364..fc59afbc7 100644 --- a/dist/src/services/bundlers/bundler.js +++ b/dist/src/services/bundlers/bundler.js @@ -1,18 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Bundler = void 0; /* eslint-disable no-restricted-syntax */ /* eslint-disable class-methods-use-this */ -import { toBeHex } from 'ethers'; -import { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; -import { decodeError } from '../../libs/errorDecoder'; -import { BundlerError } from '../../libs/errorDecoder/customErrors'; -import { privSlot } from '../../libs/proxyDeploy/deploy'; -import { getCleanUserOp } from '../../libs/userOperation/userOperation'; -import { getRpcProvider } from '../provider'; +const ethers_1 = require("ethers"); +const deploy_1 = require("../../consts/deploy"); +const errorDecoder_1 = require("../../libs/errorDecoder"); +const customErrors_1 = require("../../libs/errorDecoder/customErrors"); +const deploy_2 = require("../../libs/proxyDeploy/deploy"); +const userOperation_1 = require("../../libs/userOperation/userOperation"); +const provider_1 = require("../provider"); require('dotenv').config(); function addExtra(gasInWei, percentageIncrease) { const percent = 100n / percentageIncrease; - return toBeHex(gasInWei + gasInWei / percent); + return (0, ethers_1.toBeHex)(gasInWei + gasInWei / percent); } -export class Bundler { +class Bundler { /** * The default pollWaitTime. This is used to determine * how many milliseconds to wait until before another request to the @@ -25,37 +28,37 @@ export class Bundler { * @param network */ getProvider(network) { - return getRpcProvider([this.getUrl(network)], network.chainId); + return (0, provider_1.getRpcProvider)([this.getUrl(network)], network.chainId); } async sendEstimateReq(userOperation, network, shouldStateOverride = false) { const provider = this.getProvider(network); if (shouldStateOverride) { return provider.send('eth_estimateUserOperationGas', [ - getCleanUserOp(userOperation)[0], - ERC_4337_ENTRYPOINT, + (0, userOperation_1.getCleanUserOp)(userOperation)[0], + deploy_1.ERC_4337_ENTRYPOINT, { [userOperation.sender]: { stateDiff: { // add privileges to the entry point - [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER + [`0x${(0, deploy_2.privSlot)(0, 'address', deploy_1.ERC_4337_ENTRYPOINT, 'bytes32')}`]: deploy_1.ENTRY_POINT_MARKER } } } ]); } return provider.send('eth_estimateUserOperationGas', [ - getCleanUserOp(userOperation)[0], - ERC_4337_ENTRYPOINT + (0, userOperation_1.getCleanUserOp)(userOperation)[0], + deploy_1.ERC_4337_ENTRYPOINT ]); } async estimate(userOperation, network, shouldStateOverride = false) { const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride); return { - preVerificationGas: toBeHex(estimatiton.preVerificationGas), - verificationGasLimit: toBeHex(estimatiton.verificationGasLimit), - callGasLimit: toBeHex(estimatiton.callGasLimit), - paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit), - paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) + preVerificationGas: (0, ethers_1.toBeHex)(estimatiton.preVerificationGas), + verificationGasLimit: (0, ethers_1.toBeHex)(estimatiton.verificationGasLimit), + callGasLimit: (0, ethers_1.toBeHex)(estimatiton.callGasLimit), + paymasterVerificationGasLimit: (0, ethers_1.toBeHex)(estimatiton.paymasterVerificationGasLimit), + paymasterPostOpGasLimit: (0, ethers_1.toBeHex)(estimatiton.paymasterPostOpGasLimit) }; } /** @@ -77,8 +80,8 @@ export class Bundler { async broadcast(userOperation, network) { const provider = this.getProvider(network); return provider.send('eth_sendUserOperation', [ - getCleanUserOp(userOperation)[0], - ERC_4337_ENTRYPOINT + (0, userOperation_1.getCleanUserOp)(userOperation)[0], + deploy_1.ERC_4337_ENTRYPOINT ]); } // use this request to check if the bundler supports the network @@ -134,8 +137,9 @@ export class Bundler { } // used when catching errors from bundler requests decodeBundlerError(e) { - const error = new BundlerError(e.message, this.getName()); - return decodeError(error); + const error = new customErrors_1.BundlerError(e.message, this.getName()); + return (0, errorDecoder_1.decodeError)(error); } } +exports.Bundler = Bundler; //# sourceMappingURL=bundler.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundler.js.map b/dist/src/services/bundlers/bundler.js.map index 6778fb227..9fb924f09 100644 --- a/dist/src/services/bundlers/bundler.js.map +++ b/dist/src/services/bundlers/bundler.js.map @@ -1 +1 @@ -{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable class-methods-use-this */\nimport { toBeHex } from 'ethers'\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { decodeError } from '../../libs/errorDecoder'\nimport { BundlerError } from '../../libs/errorDecoder/customErrors'\nimport { DecodedError } from '../../libs/errorDecoder/types'\nimport { BundlerEstimateResult } from '../../libs/estimate/interfaces'\nimport { privSlot } from '../../libs/proxyDeploy/deploy'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { getCleanUserOp } from '../../libs/userOperation/userOperation'\nimport { getRpcProvider } from '../provider'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nrequire('dotenv').config()\n\nfunction addExtra(gasInWei: bigint, percentageIncrease: bigint): Hex {\n const percent = 100n / percentageIncrease\n return toBeHex(gasInWei + gasInWei / percent) as Hex\n}\n\nexport abstract class Bundler {\n /**\n * The default pollWaitTime. This is used to determine\n * how many milliseconds to wait until before another request to the\n * bundler for the receipt is sent\n */\n public pollWaitTime = 1500\n\n /**\n * Define the bundler URL\n */\n protected abstract getUrl(network: Network): string\n\n /**\n * Each bundler has their own gas prices. Define and fetch them\n */\n protected abstract getGasPrice(network: Network): Promise\n\n /**\n * Each bundler has it's own handler for giving information back\n */\n public abstract getStatus(network: Network, userOpHash: string): Promise\n\n /**\n * Each bundler needs to return its own na,e\n */\n public abstract getName(): BUNDLER\n\n /**\n * Get the bundler RPC\n *\n * @param network\n */\n protected getProvider(network: Network): RPCProvider {\n return getRpcProvider([this.getUrl(network)], network.chainId)\n }\n\n private async sendEstimateReq(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const provider = this.getProvider(network)\n\n if (shouldStateOverride) {\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT,\n {\n [userOperation.sender]: {\n stateDiff: {\n // add privileges to the entry point\n [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER\n }\n }\n }\n ])\n }\n\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n async estimate(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride)\n return {\n preVerificationGas: toBeHex(estimatiton.preVerificationGas) as Hex,\n verificationGasLimit: toBeHex(estimatiton.verificationGasLimit) as Hex,\n callGasLimit: toBeHex(estimatiton.callGasLimit) as Hex,\n paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit) as Hex,\n paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) as Hex\n }\n }\n\n /**\n * Get the transaction receipt from the userOperationHash if ready\n *\n * @param userOperationHash\n * @returns Receipt | null\n */\n async getReceipt(userOperationHash: string, network: Network) {\n const provider = this.getProvider(network)\n return provider.send('eth_getUserOperationReceipt', [userOperationHash])\n }\n\n /**\n * Broadcast a userOperation to the specified bundler and get a userOperationHash in return\n *\n * @param UserOperation userOperation\n * @returns userOperationHash\n */\n async broadcast(userOperation: UserOperation, network: Network): Promise {\n const provider = this.getProvider(network)\n return provider.send('eth_sendUserOperation', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n // use this request to check if the bundler supports the network\n static async isNetworkSupported(fetch: Fetch, chainId: bigint) {\n const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`\n const result = await fetch(url)\n return result.status === 200\n }\n\n async fetchGasPrices(\n network: Network,\n errorCallback: Function,\n counter: number = 0\n ): Promise {\n const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1\n if (counter >= (hasFallback ? 2 : 5)) throw new Error(\"Couldn't fetch gas prices\")\n\n let response\n\n try {\n response = await Promise.race([\n this.getGasPrice(network),\n new Promise((_resolve, reject) => {\n setTimeout(\n () => reject(new Error('fetching bundler gas prices failed, request too slow')),\n hasFallback ? 4500 : 6000\n )\n })\n ])\n } catch (e: any) {\n // report the error back only if there's no fallback\n if (!hasFallback) {\n errorCallback({\n level: 'major',\n message: 'Estimating gas prices from the bundler timed out. Retrying...',\n error: new Error('Budler gas prices estimation timeout')\n })\n }\n\n const increment = counter + 1\n return this.fetchGasPrices(network, errorCallback, increment)\n }\n\n const results = response as GasSpeeds\n return {\n slow: {\n maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n),\n maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n)\n },\n medium: {\n maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n),\n maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n)\n },\n fast: {\n maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n),\n maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n)\n },\n ape: {\n maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n),\n maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n)\n }\n }\n }\n\n // used when catching errors from bundler requests\n decodeBundlerError(e: Error): DecodedError {\n const error = new BundlerError(e.message, this.getName())\n return decodeError(error)\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable class-methods-use-this */\nimport { toBeHex } from 'ethers'\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { decodeError } from '../../libs/errorDecoder'\nimport { BundlerError } from '../../libs/errorDecoder/customErrors'\nimport { DecodedError } from '../../libs/errorDecoder/types'\nimport { BundlerEstimateResult } from '../../libs/estimate/interfaces'\nimport { privSlot } from '../../libs/proxyDeploy/deploy'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { getCleanUserOp } from '../../libs/userOperation/userOperation'\nimport { getRpcProvider } from '../provider'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nrequire('dotenv').config()\n\nfunction addExtra(gasInWei: bigint, percentageIncrease: bigint): Hex {\n const percent = 100n / percentageIncrease\n return toBeHex(gasInWei + gasInWei / percent) as Hex\n}\n\nexport abstract class Bundler {\n /**\n * The default pollWaitTime. This is used to determine\n * how many milliseconds to wait until before another request to the\n * bundler for the receipt is sent\n */\n public pollWaitTime = 1500\n\n /**\n * Define the bundler URL\n */\n protected abstract getUrl(network: Network): string\n\n /**\n * Each bundler has their own gas prices. Define and fetch them\n */\n protected abstract getGasPrice(network: Network): Promise\n\n /**\n * Each bundler has it's own handler for giving information back\n */\n public abstract getStatus(network: Network, userOpHash: string): Promise\n\n /**\n * Each bundler needs to return its own na,e\n */\n public abstract getName(): BUNDLER\n\n /**\n * Get the bundler RPC\n *\n * @param network\n */\n protected getProvider(network: Network): RPCProvider {\n return getRpcProvider([this.getUrl(network)], network.chainId)\n }\n\n private async sendEstimateReq(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const provider = this.getProvider(network)\n\n if (shouldStateOverride) {\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT,\n {\n [userOperation.sender]: {\n stateDiff: {\n // add privileges to the entry point\n [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER\n }\n }\n }\n ])\n }\n\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n async estimate(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride)\n return {\n preVerificationGas: toBeHex(estimatiton.preVerificationGas) as Hex,\n verificationGasLimit: toBeHex(estimatiton.verificationGasLimit) as Hex,\n callGasLimit: toBeHex(estimatiton.callGasLimit) as Hex,\n paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit) as Hex,\n paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) as Hex\n }\n }\n\n /**\n * Get the transaction receipt from the userOperationHash if ready\n *\n * @param userOperationHash\n * @returns Receipt | null\n */\n async getReceipt(userOperationHash: string, network: Network) {\n const provider = this.getProvider(network)\n return provider.send('eth_getUserOperationReceipt', [userOperationHash])\n }\n\n /**\n * Broadcast a userOperation to the specified bundler and get a userOperationHash in return\n *\n * @param UserOperation userOperation\n * @returns userOperationHash\n */\n async broadcast(userOperation: UserOperation, network: Network): Promise {\n const provider = this.getProvider(network)\n return provider.send('eth_sendUserOperation', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n // use this request to check if the bundler supports the network\n static async isNetworkSupported(fetch: Fetch, chainId: bigint) {\n const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`\n const result = await fetch(url)\n return result.status === 200\n }\n\n async fetchGasPrices(\n network: Network,\n errorCallback: Function,\n counter: number = 0\n ): Promise {\n const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1\n if (counter >= (hasFallback ? 2 : 5)) throw new Error(\"Couldn't fetch gas prices\")\n\n let response\n\n try {\n response = await Promise.race([\n this.getGasPrice(network),\n new Promise((_resolve, reject) => {\n setTimeout(\n () => reject(new Error('fetching bundler gas prices failed, request too slow')),\n hasFallback ? 4500 : 6000\n )\n })\n ])\n } catch (e: any) {\n // report the error back only if there's no fallback\n if (!hasFallback) {\n errorCallback({\n level: 'major',\n message: 'Estimating gas prices from the bundler timed out. Retrying...',\n error: new Error('Budler gas prices estimation timeout')\n })\n }\n\n const increment = counter + 1\n return this.fetchGasPrices(network, errorCallback, increment)\n }\n\n const results = response as GasSpeeds\n return {\n slow: {\n maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n),\n maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n)\n },\n medium: {\n maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n),\n maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n)\n },\n fast: {\n maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n),\n maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n)\n },\n ape: {\n maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n),\n maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n)\n }\n }\n }\n\n // used when catching errors from bundler requests\n decodeBundlerError(e: Error): DecodedError {\n const error = new BundlerError(e.message, this.getName())\n return decodeError(error)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.js b/dist/src/services/bundlers/bundlerSwitcher.js index f739834b2..037d06508 100644 --- a/dist/src/services/bundlers/bundlerSwitcher.js +++ b/dist/src/services/bundlers/bundlerSwitcher.js @@ -1,6 +1,9 @@ +"use strict"; /* eslint-disable class-methods-use-this */ -import { getBundlerByName, getDefaultBundler } from './getBundler'; -export class BundlerSwitcher { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BundlerSwitcher = void 0; +const getBundler_1 = require("./getBundler"); +class BundlerSwitcher { network; bundler; usedBundlers = []; @@ -13,7 +16,7 @@ export class BundlerSwitcher { noStateUpdateStatuses = []; constructor(network, getSignAccountOpStatus, noStateUpdateStatuses) { this.network = network; - this.bundler = getDefaultBundler(network); + this.bundler = (0, getBundler_1.getDefaultBundler)(network); this.usedBundlers.push(this.bundler.getName()); this.getSignAccountOpStatus = getSignAccountOpStatus; this.noStateUpdateStatuses = noStateUpdateStatuses; @@ -50,9 +53,10 @@ export class BundlerSwitcher { const availableBundlers = this.network.erc4337.bundlers.filter((bundler) => { return this.usedBundlers.indexOf(bundler) === -1; }); - this.bundler = getBundlerByName(availableBundlers[0]); + this.bundler = (0, getBundler_1.getBundlerByName)(availableBundlers[0]); this.usedBundlers.push(this.bundler.getName()); return this.bundler; } } +exports.BundlerSwitcher = BundlerSwitcher; //# sourceMappingURL=bundlerSwitcher.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/bundlerSwitcher.js.map b/dist/src/services/bundlers/bundlerSwitcher.js.map index 79f20e521..ed6a3bddc 100644 --- a/dist/src/services/bundlers/bundlerSwitcher.js.map +++ b/dist/src/services/bundlers/bundlerSwitcher.js.map @@ -1 +1 @@ -{"version":3,"file":"bundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundlerSwitcher.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAK3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAElE,MAAM,OAAO,eAAe;IAChB,OAAO,CAAS;IAEhB,OAAO,CAAS;IAEhB,YAAY,GAAc,EAAE,CAAA;IAEtC,2DAA2D;IACjD,sBAAsB,CAAU;IAE1C,QAAQ;IACR,qEAAqE;IACrE,oEAAoE;IACpE,iDAAiD;IACvC,qBAAqB,GAAU,EAAE,CAAA;IAE3C,YAAY,OAAgB,EAAE,sBAAgC,EAAE,qBAA4B;QAC1F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QACpD,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;IACpD,CAAC;IAES,WAAW;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAA;QAC9C,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,SAAS,CAAC,YAA0B;QAClC,sEAAsE;QACtE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAAE,OAAO,KAAK,CAAA;QAEzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAA;QAErC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAEhD,OAAO,CACL,CAAC,YAAY;YACb,YAAY,CAAC,KAAK,KAAK,eAAe;YACtC,YAAY,CAAC,KAAK,KAAK,cAAc,CACtC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;SACnD;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Bundler } from './bundler'\nimport { getBundlerByName, getDefaultBundler } from './getBundler'\n\nexport class BundlerSwitcher {\n protected network: Network\n\n protected bundler: Bundler\n\n protected usedBundlers: BUNDLER[] = []\n\n // a function to retrieve the current sign account op state\n protected getSignAccountOpStatus: Function\n\n // TODO:\n // no typehints here as importing typehints from signAccountOp causes\n // a dependancy cicle. Types should be removed from signAccountOp in\n // a different file before proceeding to fix this\n protected noStateUpdateStatuses: any[] = []\n\n constructor(network: Network, getSignAccountOpStatus: Function, noStateUpdateStatuses: any[]) {\n this.network = network\n this.bundler = getDefaultBundler(network)\n this.usedBundlers.push(this.bundler.getName())\n this.getSignAccountOpStatus = getSignAccountOpStatus\n this.noStateUpdateStatuses = noStateUpdateStatuses\n }\n\n protected hasBundlers() {\n const bundlers = this.network.erc4337.bundlers\n return bundlers && bundlers.length > 1\n }\n\n getBundler(): Bundler {\n return this.bundler\n }\n\n userHasCommitted(): boolean {\n return this.noStateUpdateStatuses.includes(this.getSignAccountOpStatus())\n }\n\n canSwitch(bundlerError: Error | null): boolean {\n // don't switch the bundler if the account op is in a state of signing\n if (this.userHasCommitted()) return false\n\n if (!this.hasBundlers()) return false\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n\n if (availableBundlers.length === 0) return false\n\n return (\n !bundlerError ||\n bundlerError.cause === 'biconomy: 400' ||\n bundlerError.cause === 'pimlico: 500'\n )\n }\n\n switch(): Bundler {\n if (!this.hasBundlers()) {\n throw new Error('no available bundlers to switch')\n }\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n this.bundler = getBundlerByName(availableBundlers[0])\n this.usedBundlers.push(this.bundler.getName())\n return this.bundler\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"bundlerSwitcher.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundlerSwitcher.ts"],"names":[],"mappings":";AAAA,2CAA2C;;;AAK3C,6CAAkE;AAElE,MAAa,eAAe;IAChB,OAAO,CAAS;IAEhB,OAAO,CAAS;IAEhB,YAAY,GAAc,EAAE,CAAA;IAEtC,2DAA2D;IACjD,sBAAsB,CAAU;IAE1C,QAAQ;IACR,qEAAqE;IACrE,oEAAoE;IACpE,iDAAiD;IACvC,qBAAqB,GAAU,EAAE,CAAA;IAE3C,YAAY,OAAgB,EAAE,sBAAgC,EAAE,qBAA4B;QAC1F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,IAAA,8BAAiB,EAAC,OAAO,CAAC,CAAA;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QACpD,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;IACpD,CAAC;IAES,WAAW;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAA;QAC9C,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,SAAS,CAAC,YAA0B;QAClC,sEAAsE;QACtE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAAE,OAAO,KAAK,CAAA;QAEzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAA;QAErC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAEhD,OAAO,CACL,CAAC,YAAY;YACb,YAAY,CAAC,KAAK,KAAK,eAAe;YACtC,YAAY,CAAC,KAAK,KAAK,cAAc,CACtC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;SACnD;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,IAAA,6BAAgB,EAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AApED,0CAoEC","sourcesContent":["/* eslint-disable class-methods-use-this */\n\nimport { BUNDLER } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Bundler } from './bundler'\nimport { getBundlerByName, getDefaultBundler } from './getBundler'\n\nexport class BundlerSwitcher {\n protected network: Network\n\n protected bundler: Bundler\n\n protected usedBundlers: BUNDLER[] = []\n\n // a function to retrieve the current sign account op state\n protected getSignAccountOpStatus: Function\n\n // TODO:\n // no typehints here as importing typehints from signAccountOp causes\n // a dependancy cicle. Types should be removed from signAccountOp in\n // a different file before proceeding to fix this\n protected noStateUpdateStatuses: any[] = []\n\n constructor(network: Network, getSignAccountOpStatus: Function, noStateUpdateStatuses: any[]) {\n this.network = network\n this.bundler = getDefaultBundler(network)\n this.usedBundlers.push(this.bundler.getName())\n this.getSignAccountOpStatus = getSignAccountOpStatus\n this.noStateUpdateStatuses = noStateUpdateStatuses\n }\n\n protected hasBundlers() {\n const bundlers = this.network.erc4337.bundlers\n return bundlers && bundlers.length > 1\n }\n\n getBundler(): Bundler {\n return this.bundler\n }\n\n userHasCommitted(): boolean {\n return this.noStateUpdateStatuses.includes(this.getSignAccountOpStatus())\n }\n\n canSwitch(bundlerError: Error | null): boolean {\n // don't switch the bundler if the account op is in a state of signing\n if (this.userHasCommitted()) return false\n\n if (!this.hasBundlers()) return false\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n\n if (availableBundlers.length === 0) return false\n\n return (\n !bundlerError ||\n bundlerError.cause === 'biconomy: 400' ||\n bundlerError.cause === 'pimlico: 500'\n )\n }\n\n switch(): Bundler {\n if (!this.hasBundlers()) {\n throw new Error('no available bundlers to switch')\n }\n\n const availableBundlers = this.network.erc4337.bundlers!.filter((bundler) => {\n return this.usedBundlers.indexOf(bundler) === -1\n })\n this.bundler = getBundlerByName(availableBundlers[0])\n this.usedBundlers.push(this.bundler.getName())\n return this.bundler\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.js b/dist/src/services/bundlers/getBundler.js index fd1896c2c..80cb99fa5 100644 --- a/dist/src/services/bundlers/getBundler.js +++ b/dist/src/services/bundlers/getBundler.js @@ -1,22 +1,27 @@ -import { BICONOMY, PIMLICO } from '../../consts/bundlers'; -import { Biconomy } from './biconomy'; -import { Pimlico } from './pimlico'; -export function getBundlerByName(bundlerName) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getDefaultBundler = exports.getBundlerByName = void 0; +const bundlers_1 = require("../../consts/bundlers"); +const biconomy_1 = require("./biconomy"); +const pimlico_1 = require("./pimlico"); +function getBundlerByName(bundlerName) { switch (bundlerName) { - case PIMLICO: - return new Pimlico(); - case BICONOMY: - return new Biconomy(); + case bundlers_1.PIMLICO: + return new pimlico_1.Pimlico(); + case bundlers_1.BICONOMY: + return new biconomy_1.Biconomy(); default: throw new Error('Bundler settings error'); } } +exports.getBundlerByName = getBundlerByName; /** * Get the default bundler for the network without any extra logic. * If it's set, get it. If not, use pimlico */ -export function getDefaultBundler(network) { - const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : PIMLICO; +function getDefaultBundler(network) { + const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : bundlers_1.PIMLICO; return getBundlerByName(bundlerName); } +exports.getDefaultBundler = getDefaultBundler; //# sourceMappingURL=getBundler.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/getBundler.js.map b/dist/src/services/bundlers/getBundler.js.map index a17318d81..5cfe6eb3d 100644 --- a/dist/src/services/bundlers/getBundler.js.map +++ b/dist/src/services/bundlers/getBundler.js.map @@ -1 +1 @@ -{"version":3,"file":"getBundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/getBundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAW,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,QAAQ,WAAW,EAAE;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,OAAO,EAAE,CAAA;QAEtB,KAAK,QAAQ;YACX,OAAO,IAAI,QAAQ,EAAE,CAAA;QAEvB;YACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC5C;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAA;IAC7F,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC","sourcesContent":["import { BICONOMY, BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Biconomy } from './biconomy'\nimport { Bundler } from './bundler'\nimport { Pimlico } from './pimlico'\n\nexport function getBundlerByName(bundlerName: BUNDLER): Bundler {\n switch (bundlerName) {\n case PIMLICO:\n return new Pimlico()\n\n case BICONOMY:\n return new Biconomy()\n\n default:\n throw new Error('Bundler settings error')\n }\n}\n\n/**\n * Get the default bundler for the network without any extra logic.\n * If it's set, get it. If not, use pimlico\n */\nexport function getDefaultBundler(network: Network): Bundler {\n const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : PIMLICO\n return getBundlerByName(bundlerName)\n}\n"]} \ No newline at end of file +{"version":3,"file":"getBundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/getBundler.ts"],"names":[],"mappings":";;;AAAA,oDAAkE;AAElE,yCAAqC;AAErC,uCAAmC;AAEnC,SAAgB,gBAAgB,CAAC,WAAoB;IACnD,QAAQ,WAAW,EAAE;QACnB,KAAK,kBAAO;YACV,OAAO,IAAI,iBAAO,EAAE,CAAA;QAEtB,KAAK,mBAAQ;YACX,OAAO,IAAI,mBAAQ,EAAE,CAAA;QAEvB;YACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC5C;AACH,CAAC;AAXD,4CAWC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAO,CAAA;IAC7F,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAHD,8CAGC","sourcesContent":["import { BICONOMY, BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Network } from '../../interfaces/network'\nimport { Biconomy } from './biconomy'\nimport { Bundler } from './bundler'\nimport { Pimlico } from './pimlico'\n\nexport function getBundlerByName(bundlerName: BUNDLER): Bundler {\n switch (bundlerName) {\n case PIMLICO:\n return new Pimlico()\n\n case BICONOMY:\n return new Biconomy()\n\n default:\n throw new Error('Bundler settings error')\n }\n}\n\n/**\n * Get the default bundler for the network without any extra logic.\n * If it's set, get it. If not, use pimlico\n */\nexport function getDefaultBundler(network: Network): Bundler {\n const bundlerName = network.erc4337.defaultBundler ? network.erc4337.defaultBundler : PIMLICO\n return getBundlerByName(bundlerName)\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.js b/dist/src/services/bundlers/pimlico.js index c61f44230..ee68a620e 100644 --- a/dist/src/services/bundlers/pimlico.js +++ b/dist/src/services/bundlers/pimlico.js @@ -1,6 +1,9 @@ -import { PIMLICO } from '../../consts/bundlers'; -import { Bundler } from './bundler'; -export class Pimlico extends Bundler { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pimlico = void 0; +const bundlers_1 = require("../../consts/bundlers"); +const bundler_1 = require("./bundler"); +class Pimlico extends bundler_1.Bundler { getUrl(network) { return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`; } @@ -17,7 +20,8 @@ export class Pimlico extends Bundler { return provider.send('pimlico_getUserOperationStatus', [userOpHash]); } getName() { - return PIMLICO; + return bundlers_1.PIMLICO; } } +exports.Pimlico = Pimlico; //# sourceMappingURL=pimlico.js.map \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.js.map b/dist/src/services/bundlers/pimlico.js.map index 81a2ffe9f..8c8fc21df 100644 --- a/dist/src/services/bundlers/pimlico.js.map +++ b/dist/src/services/bundlers/pimlico.js.map @@ -1 +1 @@ -{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,OAAO,OAAQ,SAAQ,OAAO;IACxB,MAAM,CAAC,OAAgB;QAC/B,OAAO,6BAA6B,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAA;IAC3G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,OAAO;QACZ,OAAO,OAAO,CAAA;IAChB,CAAC;CACF","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { Network } from 'interfaces/network'\n\nimport { BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Pimlico extends Bundler {\n protected getUrl(network: Network): string {\n return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('pimlico_getUserOperationGasPrice', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n return provider.send('pimlico_getUserOperationStatus', [userOpHash])\n }\n\n public getName(): BUNDLER {\n return PIMLICO\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":";;;AAGA,oDAAwD;AACxD,uCAAmC;AAGnC,MAAa,OAAQ,SAAQ,iBAAO;IACxB,MAAM,CAAC,OAAgB;QAC/B,OAAO,6BAA6B,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAA;IAC3G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,OAAO;QACZ,OAAO,kBAAO,CAAA;IAChB,CAAC;CACF;AAtBD,0BAsBC","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { Network } from 'interfaces/network'\n\nimport { BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Pimlico extends Bundler {\n protected getUrl(network: Network): string {\n return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('pimlico_getUserOperationGasPrice', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n return provider.send('pimlico_getUserOperationStatus', [userOpHash])\n }\n\n public getName(): BUNDLER {\n return PIMLICO\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/types.js b/dist/src/services/bundlers/types.js index 718fd38ae..11e638d1e 100644 --- a/dist/src/services/bundlers/types.js +++ b/dist/src/services/bundlers/types.js @@ -1,2 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.js b/dist/src/services/ensDomains/ensDomains.js index 1768d975c..f124a0e9c 100644 --- a/dist/src/services/ensDomains/ensDomains.js +++ b/dist/src/services/ensDomains/ensDomains.js @@ -1,15 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reverseLookupEns = exports.getBip44Items = exports.resolveENSDomain = exports.isCorrectAddress = void 0; +const tslib_1 = require("tslib"); // @ts-ignore -import constants from 'bip44-constants'; -import { isAddress } from 'ethers'; +const bip44_constants_1 = tslib_1.__importDefault(require("bip44-constants")); +const ethers_1 = require("ethers"); // @ts-ignore -import { normalize } from '@ensdomains/eth-ens-namehash'; -import { networks } from '../../consts/networks'; -import { getRpcProvider } from '../provider'; +const eth_ens_namehash_1 = require("@ensdomains/eth-ens-namehash"); +const networks_1 = require("../../consts/networks"); +const provider_1 = require("../provider"); const BIP44_BASE_VALUE = 2147483648; const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'; const normalizeDomain = (domain) => { try { - return normalize(domain); + return (0, eth_ens_namehash_1.normalize)(domain); } catch (e) { return null; @@ -27,16 +31,17 @@ async function resolveForCoin(resolver, bip44Item) { } return resolver.getAddress(); } -export function isCorrectAddress(address) { - return !(ADDRESS_ZERO === address) && isAddress(address); +function isCorrectAddress(address) { + return !(ADDRESS_ZERO === address) && (0, ethers_1.isAddress)(address); } +exports.isCorrectAddress = isCorrectAddress; // @TODO: Get RPC provider url from settings controller async function resolveENSDomain(domain, bip44Item) { const normalizedDomainName = normalizeDomain(domain); if (!normalizedDomainName) return ''; - const ethereum = networks.find((x) => x.id === 'ethereum'); - const provider = getRpcProvider(ethereum.rpcUrls, ethereum.chainId); + const ethereum = networks_1.networks.find((x) => x.id === 'ethereum'); + const provider = (0, provider_1.getRpcProvider)(ethereum.rpcUrls, ethereum.chainId); const resolver = await provider.getResolver(normalizedDomainName); if (!resolver) return ''; @@ -58,13 +63,15 @@ async function resolveENSDomain(domain, bip44Item) { provider?.destroy(); } } +exports.resolveENSDomain = resolveENSDomain; function getBip44Items(coinTicker) { if (!coinTicker) return null; - return constants.filter((item) => item[1] === coinTicker); + return bip44_constants_1.default.filter((item) => item[1] === coinTicker); } +exports.getBip44Items = getBip44Items; async function reverseLookupEns(address, provider) { return provider.lookupAddress(address); } -export { resolveENSDomain, getBip44Items, reverseLookupEns }; +exports.reverseLookupEns = reverseLookupEns; //# sourceMappingURL=ensDomains.js.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/ensDomains.js.map b/dist/src/services/ensDomains/ensDomains.js.map index fe8aabba6..782054d3a 100644 --- a/dist/src/services/ensDomains/ensDomains.js.map +++ b/dist/src/services/ensDomains/ensDomains.js.map @@ -1 +1 @@ -{"version":3,"file":"ensDomains.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/ensDomains.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore\nimport constants from 'bip44-constants'\nimport { isAddress } from 'ethers'\n\n// @ts-ignore\nimport { normalize } from '@ensdomains/eth-ens-namehash'\n\nimport { networks } from '../../consts/networks'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { getRpcProvider } from '../provider'\n\nconst BIP44_BASE_VALUE = 2147483648\nconst ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'\n\nconst normalizeDomain = (domain: string) => {\n try {\n return normalize(domain)\n } catch (e) {\n return null\n }\n}\n\nfunction getNormalisedCoinType(bip44Item: number[][]) {\n return bip44Item[0].length ? bip44Item[0][0] - BIP44_BASE_VALUE : null\n}\n\nasync function resolveForCoin(resolver: any, bip44Item?: number[][]) {\n if (bip44Item && bip44Item.length === 1) {\n const coinType = getNormalisedCoinType(bip44Item)\n if (!coinType) return null\n return resolver.getAddress(coinType)\n }\n return resolver.getAddress()\n}\n\nexport function isCorrectAddress(address: string) {\n return !(ADDRESS_ZERO === address) && isAddress(address)\n}\n\n// @TODO: Get RPC provider url from settings controller\nasync function resolveENSDomain(domain: string, bip44Item?: number[][]): Promise {\n const normalizedDomainName = normalizeDomain(domain)\n if (!normalizedDomainName) return ''\n const ethereum = networks.find((x) => x.id === 'ethereum')!\n const provider = getRpcProvider(ethereum.rpcUrls, ethereum.chainId)\n const resolver = await provider.getResolver(normalizedDomainName)\n if (!resolver) return ''\n try {\n const ethAddress = await resolver.getAddress()\n const addressForCoin = await resolveForCoin(resolver, bip44Item).catch(() => null)\n return isCorrectAddress(addressForCoin) ? addressForCoin : ethAddress\n } catch (e: any) {\n // If the error comes from an internal server error don't\n // show it to the user, because it happens when a domain\n // doesn't exist and we already show a message for that.\n // https://dnssec-oracle.ens.domains/ 500 (ISE)\n if (e.message?.includes('500_SERVER_ERROR')) return ''\n\n throw e\n } finally {\n provider?.destroy()\n }\n}\n\nfunction getBip44Items(coinTicker: string) {\n if (!coinTicker) return null\n return constants.filter((item: string[]) => item[1] === coinTicker)\n}\n\nasync function reverseLookupEns(address: string, provider: RPCProvider) {\n return provider.lookupAddress(address)\n}\n\nexport { resolveENSDomain, getBip44Items, reverseLookupEns }\n"]} \ No newline at end of file +{"version":3,"file":"ensDomains.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/ensDomains.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore\nimport constants from 'bip44-constants'\nimport { isAddress } from 'ethers'\n\n// @ts-ignore\nimport { normalize } from '@ensdomains/eth-ens-namehash'\n\nimport { networks } from '../../consts/networks'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { getRpcProvider } from '../provider'\n\nconst BIP44_BASE_VALUE = 2147483648\nconst ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'\n\nconst normalizeDomain = (domain: string) => {\n try {\n return normalize(domain)\n } catch (e) {\n return null\n }\n}\n\nfunction getNormalisedCoinType(bip44Item: number[][]) {\n return bip44Item[0].length ? bip44Item[0][0] - BIP44_BASE_VALUE : null\n}\n\nasync function resolveForCoin(resolver: any, bip44Item?: number[][]) {\n if (bip44Item && bip44Item.length === 1) {\n const coinType = getNormalisedCoinType(bip44Item)\n if (!coinType) return null\n return resolver.getAddress(coinType)\n }\n return resolver.getAddress()\n}\n\nexport function isCorrectAddress(address: string) {\n return !(ADDRESS_ZERO === address) && isAddress(address)\n}\n\n// @TODO: Get RPC provider url from settings controller\nasync function resolveENSDomain(domain: string, bip44Item?: number[][]): Promise {\n const normalizedDomainName = normalizeDomain(domain)\n if (!normalizedDomainName) return ''\n const ethereum = networks.find((x) => x.id === 'ethereum')!\n const provider = getRpcProvider(ethereum.rpcUrls, ethereum.chainId)\n const resolver = await provider.getResolver(normalizedDomainName)\n if (!resolver) return ''\n try {\n const ethAddress = await resolver.getAddress()\n const addressForCoin = await resolveForCoin(resolver, bip44Item).catch(() => null)\n return isCorrectAddress(addressForCoin) ? addressForCoin : ethAddress\n } catch (e: any) {\n // If the error comes from an internal server error don't\n // show it to the user, because it happens when a domain\n // doesn't exist and we already show a message for that.\n // https://dnssec-oracle.ens.domains/ 500 (ISE)\n if (e.message?.includes('500_SERVER_ERROR')) return ''\n\n throw e\n } finally {\n provider?.destroy()\n }\n}\n\nfunction getBip44Items(coinTicker: string) {\n if (!coinTicker) return null\n return constants.filter((item: string[]) => item[1] === coinTicker)\n}\n\nasync function reverseLookupEns(address: string, provider: RPCProvider) {\n return provider.lookupAddress(address)\n}\n\nexport { resolveENSDomain, getBip44Items, reverseLookupEns }\n"]} \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.js b/dist/src/services/ensDomains/index.js index 8a4e0c12e..767d1a6dc 100644 --- a/dist/src/services/ensDomains/index.js +++ b/dist/src/services/ensDomains/index.js @@ -1,2 +1,5 @@ -export * from './ensDomains'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./ensDomains"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/ensDomains/index.js.map b/dist/src/services/ensDomains/index.js.map index f1342d1ea..fd4ac28eb 100644 --- a/dist/src/services/ensDomains/index.js.map +++ b/dist/src/services/ensDomains/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA","sourcesContent":["export * from './ensDomains'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/ensDomains/index.ts"],"names":[],"mappings":";;;AAAA,uDAA4B","sourcesContent":["export * from './ensDomains'\n"]} \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.js b/dist/src/services/explorers/jiffyscan.js index ed10e4241..b46ac33bd 100644 --- a/dist/src/services/explorers/jiffyscan.js +++ b/dist/src/services/explorers/jiffyscan.js @@ -1,4 +1,7 @@ -export async function fetchUserOp(userOpHash, fetchFn) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchUserOp = void 0; +async function fetchUserOp(userOpHash, fetchFn) { const url = `https://api.jiffyscan.xyz/v0/getUserOp?hash=${userOpHash}`; return Promise.race([ fetchFn(url, { @@ -16,4 +19,5 @@ export async function fetchUserOp(userOpHash, fetchFn) { return null; }); } +exports.fetchUserOp = fetchUserOp; //# sourceMappingURL=jiffyscan.js.map \ No newline at end of file diff --git a/dist/src/services/explorers/jiffyscan.js.map b/dist/src/services/explorers/jiffyscan.js.map index a24884361..b65bcaca4 100644 --- a/dist/src/services/explorers/jiffyscan.js.map +++ b/dist/src/services/explorers/jiffyscan.js.map @@ -1 +1 @@ -{"version":3,"file":"jiffyscan.js","sourceRoot":"","sources":["../../../../src/services/explorers/jiffyscan.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,OAAc;IAClE,MAAM,GAAG,GAAG,+CAA+C,UAAU,EAAE,CAAA;IAEvE,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,EAAE;YACX,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE;aAC3D;SACF,CAAC;QACF,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC,CAAC;KACH,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport async function fetchUserOp(userOpHash: string, fetchFn: Fetch) {\n const url = `https://api.jiffyscan.xyz/v0/getUserOp?hash=${userOpHash}`\n\n return Promise.race([\n fetchFn(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': process.env.REACT_APP_JIFFYSCAN_API_KEY || ''\n }\n }),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('jiffy scan timeout')), 2500)\n })\n ]).catch((e) => {\n console.log(e)\n return null\n })\n}\n"]} \ No newline at end of file +{"version":3,"file":"jiffyscan.js","sourceRoot":"","sources":["../../../../src/services/explorers/jiffyscan.ts"],"names":[],"mappings":";;;AAEO,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,OAAc;IAClE,MAAM,GAAG,GAAG,+CAA+C,UAAU,EAAE,CAAA;IAEvE,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,EAAE;YACX,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE;aAC3D;SACF,CAAC;QACF,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC,CAAC;KACH,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAlBD,kCAkBC","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\n\nexport async function fetchUserOp(userOpHash: string, fetchFn: Fetch) {\n const url = `https://api.jiffyscan.xyz/v0/getUserOp?hash=${userOpHash}`\n\n return Promise.race([\n fetchFn(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': process.env.REACT_APP_JIFFYSCAN_API_KEY || ''\n }\n }),\n new Promise((_resolve, reject) => {\n setTimeout(() => reject(new Error('jiffy scan timeout')), 2500)\n })\n ]).catch((e) => {\n console.log(e)\n return null\n })\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.js b/dist/src/services/paymaster/FailedPaymasters.js index 0ac2db903..05ce024e0 100644 --- a/dist/src/services/paymaster/FailedPaymasters.js +++ b/dist/src/services/paymaster/FailedPaymasters.js @@ -1,12 +1,16 @@ +"use strict"; /* eslint-disable no-console */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.failedPaymasters = exports.FailedPaymasters = void 0; +const tslib_1 = require("tslib"); /* * a singleton for recording failed paymaster requests */ -import { Contract } from 'ethers'; -import entryPointAbi from '../../../contracts/compiled/EntryPoint.json'; -import { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'; +const ethers_1 = require("ethers"); +const EntryPoint_json_1 = tslib_1.__importDefault(require("../../../contracts/compiled/EntryPoint.json")); +const deploy_1 = require("../../consts/deploy"); // so the app can fallback to a standard Paymaster if a sponsorship fails -export class FailedPaymasters { +class FailedPaymasters { failedSponsorshipIds = []; insufficientFundsNetworks = {}; addFailedSponsorship(id) { @@ -18,8 +22,8 @@ export class FailedPaymasters { async addInsufficientFunds(provider, network) { let paymasterBalance = 0n; try { - const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider); - paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER); + const ep = new ethers_1.Contract(deploy_1.ERC_4337_ENTRYPOINT, EntryPoint_json_1.default, provider); + paymasterBalance = await ep.balanceOf(deploy_1.AMBIRE_PAYMASTER); } catch (e) { console.log('failed to retrieve the balance of the paymaster'); @@ -36,5 +40,6 @@ export class FailedPaymasters { delete this.insufficientFundsNetworks[Number(network.chainId)]; } } -export const failedPaymasters = new FailedPaymasters(); +exports.FailedPaymasters = FailedPaymasters; +exports.failedPaymasters = new FailedPaymasters(); //# sourceMappingURL=FailedPaymasters.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/FailedPaymasters.js.map b/dist/src/services/paymaster/FailedPaymasters.js.map index 9a7dbf4a2..16d2bbc74 100644 --- a/dist/src/services/paymaster/FailedPaymasters.js.map +++ b/dist/src/services/paymaster/FailedPaymasters.js.map @@ -1 +1 @@ -{"version":3,"file":"FailedPaymasters.js","sourceRoot":"","sources":["../../../../src/services/paymaster/FailedPaymasters.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,aAAa,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAI3E,yEAAyE;AACzE,MAAM,OAAO,gBAAgB;IAC3B,oBAAoB,GAAa,EAAE,CAAA;IAEnC,yBAAyB,GAIrB,EAAE,CAAA;IAEN,oBAAoB,CAAC,EAAU;QAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,oBAAoB,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAqB,EAAE,OAAgB;QAChE,IAAI,gBAAgB,GAAG,EAAE,CAAA;QACzB,IAAI;YACF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAA;YACrE,gBAAgB,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;SACxD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAC9D,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;SACjB;QAED,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG;YACxD,eAAe,EAAE,gBAAgB;SAClC,CAAA;IACH,CAAC;IAED,oBAAoB,CAAC,OAAgB;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,uBAAuB,CAAC,OAAgB;QACtC,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["/* eslint-disable no-console */\n\n/*\n * a singleton for recording failed paymaster requests\n */\nimport { Contract } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\n\n// so the app can fallback to a standard Paymaster if a sponsorship fails\nexport class FailedPaymasters {\n failedSponsorshipIds: number[] = []\n\n insufficientFundsNetworks: {\n [chainId: number]: {\n lastSeenBalance: bigint\n }\n } = {}\n\n addFailedSponsorship(id: number) {\n this.failedSponsorshipIds.push(id)\n }\n\n hasFailedSponsorship(id: number): boolean {\n return this.failedSponsorshipIds.includes(id)\n }\n\n async addInsufficientFunds(provider: RPCProvider, network: Network) {\n let paymasterBalance = 0n\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n\n this.insufficientFundsNetworks[Number(network.chainId)] = {\n lastSeenBalance: paymasterBalance\n }\n }\n\n hasInsufficientFunds(network: Network) {\n return !!this.insufficientFundsNetworks[Number(network.chainId)]\n }\n\n removeInsufficientFunds(network: Network) {\n delete this.insufficientFundsNetworks[Number(network.chainId)]\n }\n}\n\nexport const failedPaymasters = new FailedPaymasters()\n"]} \ No newline at end of file +{"version":3,"file":"FailedPaymasters.js","sourceRoot":"","sources":["../../../../src/services/paymaster/FailedPaymasters.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;AAE/B;;GAEG;AACH,mCAAiC;AAEjC,0GAAuE;AACvE,gDAA2E;AAI3E,yEAAyE;AACzE,MAAa,gBAAgB;IAC3B,oBAAoB,GAAa,EAAE,CAAA;IAEnC,yBAAyB,GAIrB,EAAE,CAAA;IAEN,oBAAoB,CAAC,EAAU;QAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,oBAAoB,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAqB,EAAE,OAAgB;QAChE,IAAI,gBAAgB,GAAG,EAAE,CAAA;QACzB,IAAI;YACF,MAAM,EAAE,GAAG,IAAI,iBAAQ,CAAC,4BAAmB,EAAE,yBAAa,EAAE,QAAQ,CAAC,CAAA;YACrE,gBAAgB,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,yBAAgB,CAAC,CAAA;SACxD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAC9D,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;SACjB;QAED,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG;YACxD,eAAe,EAAE,gBAAgB;SAClC,CAAA;IACH,CAAC;IAED,oBAAoB,CAAC,OAAgB;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,uBAAuB,CAAC,OAAgB;QACtC,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAvCD,4CAuCC;AAEY,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["/* eslint-disable no-console */\n\n/*\n * a singleton for recording failed paymaster requests\n */\nimport { Contract } from 'ethers'\n\nimport entryPointAbi from '../../../contracts/compiled/EntryPoint.json'\nimport { AMBIRE_PAYMASTER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\n\n// so the app can fallback to a standard Paymaster if a sponsorship fails\nexport class FailedPaymasters {\n failedSponsorshipIds: number[] = []\n\n insufficientFundsNetworks: {\n [chainId: number]: {\n lastSeenBalance: bigint\n }\n } = {}\n\n addFailedSponsorship(id: number) {\n this.failedSponsorshipIds.push(id)\n }\n\n hasFailedSponsorship(id: number): boolean {\n return this.failedSponsorshipIds.includes(id)\n }\n\n async addInsufficientFunds(provider: RPCProvider, network: Network) {\n let paymasterBalance = 0n\n try {\n const ep = new Contract(ERC_4337_ENTRYPOINT, entryPointAbi, provider)\n paymasterBalance = await ep.balanceOf(AMBIRE_PAYMASTER)\n } catch (e) {\n console.log('failed to retrieve the balance of the paymaster')\n console.error(e)\n }\n\n this.insufficientFundsNetworks[Number(network.chainId)] = {\n lastSeenBalance: paymasterBalance\n }\n }\n\n hasInsufficientFunds(network: Network) {\n return !!this.insufficientFundsNetworks[Number(network.chainId)]\n }\n\n removeInsufficientFunds(network: Network) {\n delete this.insufficientFundsNetworks[Number(network.chainId)]\n }\n}\n\nexport const failedPaymasters = new FailedPaymasters()\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.js b/dist/src/services/paymaster/PaymasterFactory.js index f044a5c8f..aae8e5ce7 100644 --- a/dist/src/services/paymaster/PaymasterFactory.js +++ b/dist/src/services/paymaster/PaymasterFactory.js @@ -1,16 +1,19 @@ -import { Paymaster } from '../../libs/paymaster/paymaster'; -import { relayerCall } from '../../libs/relayerCall/relayerCall'; -import { failedPaymasters } from './FailedPaymasters'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PaymasterFactory = void 0; +const paymaster_1 = require("../../libs/paymaster/paymaster"); +const relayerCall_1 = require("../../libs/relayerCall/relayerCall"); +const FailedPaymasters_1 = require("./FailedPaymasters"); // a factory for creating paymaster objects // this is needed as we'd like to create paymasters at will with easy // access to app properties like relayerUrl and Fetch // so we init the PaymasterFactory in the main controller and use it // throught the app as a singleton -export class PaymasterFactory { +class PaymasterFactory { callRelayer = undefined; errorCallback = undefined; init(relayerUrl, fetch, errorCallback) { - this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch }); + this.callRelayer = relayerCall_1.relayerCall.bind({ url: relayerUrl, fetch }); this.errorCallback = errorCallback; } async create(op, userOp, network, provider) { @@ -20,13 +23,14 @@ export class PaymasterFactory { // mark it like so in the meta for the paymaster to know const localOp = { ...op }; const paymasterServiceId = op.meta?.paymasterService?.id; - if (paymasterServiceId && failedPaymasters.hasFailedSponsorship(paymasterServiceId)) { + if (paymasterServiceId && FailedPaymasters_1.failedPaymasters.hasFailedSponsorship(paymasterServiceId)) { if (localOp.meta && localOp.meta.paymasterService) localOp.meta.paymasterService.failed = true; } - const paymaster = new Paymaster(this.callRelayer, this.errorCallback); + const paymaster = new paymaster_1.Paymaster(this.callRelayer, this.errorCallback); await paymaster.init(localOp, userOp, network, provider); return paymaster; } } +exports.PaymasterFactory = PaymasterFactory; //# sourceMappingURL=PaymasterFactory.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/PaymasterFactory.js.map b/dist/src/services/paymaster/PaymasterFactory.js.map index 9c093a811..65827884f 100644 --- a/dist/src/services/paymaster/PaymasterFactory.js.map +++ b/dist/src/services/paymaster/PaymasterFactory.js.map @@ -1 +1 @@ -{"version":3,"file":"PaymasterFactory.js","sourceRoot":"","sources":["../../../../src/services/paymaster/PaymasterFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,2CAA2C;AAC3C,qEAAqE;AACrE,qDAAqD;AACrD,oEAAoE;AACpE,kCAAkC;AAClC,MAAM,OAAO,gBAAgB;IAC3B,WAAW,GAAyB,SAAS,CAAA;IAE7C,aAAa,GAAyB,SAAS,CAAA;IAE/C,IAAI,CAAC,UAAkB,EAAE,KAAY,EAAE,aAAuB;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAa,EACb,MAAqB,EACrB,OAAgB,EAChB,QAAqB;QAErB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YACpE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAEpC,0DAA0D;QAC1D,wDAAwD;QACxD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,CAAA;QACzB,MAAM,kBAAkB,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAA;QACxD,IAAI,kBAAkB,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;YACnF,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAA;SAC/F;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACrE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QACxD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../../libs/accountOp/accountOp'\nimport { AbstractPaymaster } from '../../libs/paymaster/abstractPaymaster'\nimport { Paymaster } from '../../libs/paymaster/paymaster'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { failedPaymasters } from './FailedPaymasters'\n\n// a factory for creating paymaster objects\n// this is needed as we'd like to create paymasters at will with easy\n// access to app properties like relayerUrl and Fetch\n// so we init the PaymasterFactory in the main controller and use it\n// throught the app as a singleton\nexport class PaymasterFactory {\n callRelayer: Function | undefined = undefined\n\n errorCallback: Function | undefined = undefined\n\n init(relayerUrl: string, fetch: Fetch, errorCallback: Function) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.errorCallback = errorCallback\n }\n\n async create(\n op: AccountOp,\n userOp: UserOperation,\n network: Network,\n provider: RPCProvider\n ): Promise {\n if (this.callRelayer === undefined || this.errorCallback === undefined)\n throw new Error('call init first')\n\n // check whether the sponsorship has failed and if it has,\n // mark it like so in the meta for the paymaster to know\n const localOp = { ...op }\n const paymasterServiceId = op.meta?.paymasterService?.id\n if (paymasterServiceId && failedPaymasters.hasFailedSponsorship(paymasterServiceId)) {\n if (localOp.meta && localOp.meta.paymasterService) localOp.meta.paymasterService.failed = true\n }\n\n const paymaster = new Paymaster(this.callRelayer, this.errorCallback)\n await paymaster.init(localOp, userOp, network, provider)\n return paymaster\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"PaymasterFactory.js","sourceRoot":"","sources":["../../../../src/services/paymaster/PaymasterFactory.ts"],"names":[],"mappings":";;;AAKA,8DAA0D;AAC1D,oEAAgE;AAEhE,yDAAqD;AAErD,2CAA2C;AAC3C,qEAAqE;AACrE,qDAAqD;AACrD,oEAAoE;AACpE,kCAAkC;AAClC,MAAa,gBAAgB;IAC3B,WAAW,GAAyB,SAAS,CAAA;IAE7C,aAAa,GAAyB,SAAS,CAAA;IAE/C,IAAI,CAAC,UAAkB,EAAE,KAAY,EAAE,aAAuB;QAC5D,IAAI,CAAC,WAAW,GAAG,yBAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAa,EACb,MAAqB,EACrB,OAAgB,EAChB,QAAqB;QAErB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YACpE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAEpC,0DAA0D;QAC1D,wDAAwD;QACxD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,CAAA;QACzB,MAAM,kBAAkB,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAA;QACxD,IAAI,kBAAkB,IAAI,mCAAgB,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;YACnF,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAA;SAC/F;QAED,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACrE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QACxD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF;AA/BD,4CA+BC","sourcesContent":["import { Fetch } from '../../interfaces/fetch'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { AccountOp } from '../../libs/accountOp/accountOp'\nimport { AbstractPaymaster } from '../../libs/paymaster/abstractPaymaster'\nimport { Paymaster } from '../../libs/paymaster/paymaster'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { failedPaymasters } from './FailedPaymasters'\n\n// a factory for creating paymaster objects\n// this is needed as we'd like to create paymasters at will with easy\n// access to app properties like relayerUrl and Fetch\n// so we init the PaymasterFactory in the main controller and use it\n// throught the app as a singleton\nexport class PaymasterFactory {\n callRelayer: Function | undefined = undefined\n\n errorCallback: Function | undefined = undefined\n\n init(relayerUrl: string, fetch: Fetch, errorCallback: Function) {\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.errorCallback = errorCallback\n }\n\n async create(\n op: AccountOp,\n userOp: UserOperation,\n network: Network,\n provider: RPCProvider\n ): Promise {\n if (this.callRelayer === undefined || this.errorCallback === undefined)\n throw new Error('call init first')\n\n // check whether the sponsorship has failed and if it has,\n // mark it like so in the meta for the paymaster to know\n const localOp = { ...op }\n const paymasterServiceId = op.meta?.paymasterService?.id\n if (paymasterServiceId && failedPaymasters.hasFailedSponsorship(paymasterServiceId)) {\n if (localOp.meta && localOp.meta.paymasterService) localOp.meta.paymasterService.failed = true\n }\n\n const paymaster = new Paymaster(this.callRelayer, this.errorCallback)\n await paymaster.init(localOp, userOp, network, provider)\n return paymaster\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/paymaster/index.js b/dist/src/services/paymaster/index.js index 001f51370..3b82dceba 100644 --- a/dist/src/services/paymaster/index.js +++ b/dist/src/services/paymaster/index.js @@ -1,3 +1,6 @@ -import { PaymasterFactory } from './PaymasterFactory'; -export const paymasterFactory = new PaymasterFactory(); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.paymasterFactory = void 0; +const PaymasterFactory_1 = require("./PaymasterFactory"); +exports.paymasterFactory = new PaymasterFactory_1.PaymasterFactory(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/paymaster/index.js.map b/dist/src/services/paymaster/index.js.map index 016b57f77..e66791ba9 100644 --- a/dist/src/services/paymaster/index.js.map +++ b/dist/src/services/paymaster/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/paymaster/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["import { PaymasterFactory } from './PaymasterFactory'\n\nexport const paymasterFactory = new PaymasterFactory()\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/paymaster/index.ts"],"names":[],"mappings":";;;AAAA,yDAAqD;AAExC,QAAA,gBAAgB,GAAG,IAAI,mCAAgB,EAAE,CAAA","sourcesContent":["import { PaymasterFactory } from './PaymasterFactory'\n\nexport const paymasterFactory = new PaymasterFactory()\n"]} \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.js b/dist/src/services/provider/getRpcProvider.js index 75047ac35..5a734483e 100644 --- a/dist/src/services/provider/getRpcProvider.js +++ b/dist/src/services/provider/getRpcProvider.js @@ -1,4 +1,7 @@ -import { JsonRpcProvider, Network } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getRpcProvider = void 0; +const ethers_1 = require("ethers"); const getRpcProvider = (rpcUrls, chainId, selectedRpcUrl, options) => { if (!rpcUrls.length) { throw new Error('rpcUrls must be a non-empty array'); @@ -10,12 +13,12 @@ const getRpcProvider = (rpcUrls, chainId, selectedRpcUrl, options) => { rpcUrl = prefUrl; } if (chainId) { - const staticNetwork = Network.from(Number(chainId)); + const staticNetwork = ethers_1.Network.from(Number(chainId)); if (staticNetwork) { - return new JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options }); + return new ethers_1.JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options }); } } - return new JsonRpcProvider(rpcUrl); + return new ethers_1.JsonRpcProvider(rpcUrl); }; -export { getRpcProvider }; +exports.getRpcProvider = getRpcProvider; //# sourceMappingURL=getRpcProvider.js.map \ No newline at end of file diff --git a/dist/src/services/provider/getRpcProvider.js.map b/dist/src/services/provider/getRpcProvider.js.map index a92913a0d..fa93918c5 100644 --- a/dist/src/services/provider/getRpcProvider.js.map +++ b/dist/src/services/provider/getRpcProvider.js.map @@ -1 +1 @@ -{"version":3,"file":"getRpcProvider.js","sourceRoot":"","sources":["../../../../src/services/provider/getRpcProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAQjD,MAAM,cAAc,GAAG,CACrB,OAAoC,EACpC,OAAyB,EACzB,cAAuB,EACvB,OAAyB,EACzB,EAAE;IACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;KACrD;IAED,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAEvB,IAAI,cAAc,EAAE;QAClB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAA;QACzD,IAAI,OAAO;YAAE,MAAM,GAAG,OAAO,CAAA;KAC9B;IAED,IAAI,OAAO,EAAE;QACX,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAEnD,IAAI,aAAa,EAAE;YACjB,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;SACjF;KACF;IAED,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA","sourcesContent":["import { JsonRpcProvider, Network } from 'ethers'\n\nimport { Network as NetworkInterface } from '../../interfaces/network'\n\ninterface ProviderOptions {\n batchMaxCount: number\n}\n\nconst getRpcProvider = (\n rpcUrls: NetworkInterface['rpcUrls'],\n chainId?: bigint | number,\n selectedRpcUrl?: string,\n options?: ProviderOptions\n) => {\n if (!rpcUrls.length) {\n throw new Error('rpcUrls must be a non-empty array')\n }\n\n let rpcUrl = rpcUrls[0]\n\n if (selectedRpcUrl) {\n const prefUrl = rpcUrls.find((u) => u === selectedRpcUrl)\n if (prefUrl) rpcUrl = prefUrl\n }\n\n if (chainId) {\n const staticNetwork = Network.from(Number(chainId))\n\n if (staticNetwork) {\n return new JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options })\n }\n }\n\n return new JsonRpcProvider(rpcUrl)\n}\n\nexport { getRpcProvider }\n"]} \ No newline at end of file +{"version":3,"file":"getRpcProvider.js","sourceRoot":"","sources":["../../../../src/services/provider/getRpcProvider.ts"],"names":[],"mappings":";;;AAAA,mCAAiD;AAQjD,MAAM,cAAc,GAAG,CACrB,OAAoC,EACpC,OAAyB,EACzB,cAAuB,EACvB,OAAyB,EACzB,EAAE;IACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;KACrD;IAED,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAEvB,IAAI,cAAc,EAAE;QAClB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAA;QACzD,IAAI,OAAO;YAAE,MAAM,GAAG,OAAO,CAAA;KAC9B;IAED,IAAI,OAAO,EAAE;QACX,MAAM,aAAa,GAAG,gBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAEnD,IAAI,aAAa,EAAE;YACjB,OAAO,IAAI,wBAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;SACjF;KACF;IAED,OAAO,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC,CAAA;AAEQ,wCAAc","sourcesContent":["import { JsonRpcProvider, Network } from 'ethers'\n\nimport { Network as NetworkInterface } from '../../interfaces/network'\n\ninterface ProviderOptions {\n batchMaxCount: number\n}\n\nconst getRpcProvider = (\n rpcUrls: NetworkInterface['rpcUrls'],\n chainId?: bigint | number,\n selectedRpcUrl?: string,\n options?: ProviderOptions\n) => {\n if (!rpcUrls.length) {\n throw new Error('rpcUrls must be a non-empty array')\n }\n\n let rpcUrl = rpcUrls[0]\n\n if (selectedRpcUrl) {\n const prefUrl = rpcUrls.find((u) => u === selectedRpcUrl)\n if (prefUrl) rpcUrl = prefUrl\n }\n\n if (chainId) {\n const staticNetwork = Network.from(Number(chainId))\n\n if (staticNetwork) {\n return new JsonRpcProvider(rpcUrl, staticNetwork, { staticNetwork, ...options })\n }\n }\n\n return new JsonRpcProvider(rpcUrl)\n}\n\nexport { getRpcProvider }\n"]} \ No newline at end of file diff --git a/dist/src/services/provider/index.js b/dist/src/services/provider/index.js index 99cc98294..39387c857 100644 --- a/dist/src/services/provider/index.js +++ b/dist/src/services/provider/index.js @@ -1,2 +1,5 @@ -export * from './getRpcProvider'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./getRpcProvider"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/provider/index.js.map b/dist/src/services/provider/index.js.map index fad17be69..f1829022b 100644 --- a/dist/src/services/provider/index.js.map +++ b/dist/src/services/provider/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA","sourcesContent":["export * from './getRpcProvider'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/provider/index.ts"],"names":[],"mappings":";;;AAAA,2DAAgC","sourcesContent":["export * from './getRpcProvider'\n"]} \ No newline at end of file diff --git a/dist/src/services/socket/api.js b/dist/src/services/socket/api.js index 0009118d1..d50b212e9 100644 --- a/dist/src/services/socket/api.js +++ b/dist/src/services/socket/api.js @@ -1,17 +1,22 @@ -import { getAddress } from 'ethers'; -import SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'; -import { AMBIRE_FEE_TAKER_ADDRESSES, AMBIRE_WALLET_TOKEN_ON_BASE, AMBIRE_WALLET_TOKEN_ON_ETHEREUM, ETH_ON_OPTIMISM_LEGACY_ADDRESS, FEE_PERCENT, NULL_ADDRESS, ZERO_ADDRESS } from './constants'; -const convertZeroAddressToNullAddressIfNeeded = (addr) => addr === ZERO_ADDRESS ? NULL_ADDRESS : addr; -const convertNullAddressToZeroAddressIfNeeded = (addr) => addr === NULL_ADDRESS ? ZERO_ADDRESS : addr; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SocketAPI = exports.normalizeIncomingSocketToken = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const SwapAndBridgeProviderApiError_1 = tslib_1.__importDefault(require("../../classes/SwapAndBridgeProviderApiError")); +const constants_1 = require("./constants"); +const convertZeroAddressToNullAddressIfNeeded = (addr) => addr === constants_1.ZERO_ADDRESS ? constants_1.NULL_ADDRESS : addr; +const convertNullAddressToZeroAddressIfNeeded = (addr) => addr === constants_1.NULL_ADDRESS ? constants_1.ZERO_ADDRESS : addr; const normalizeIncomingSocketTokenAddress = (address) => // incoming token addresses from Socket are all lowercased -getAddress( +(0, ethers_1.getAddress)( // native token addresses come as null address instead of the zero address convertNullAddressToZeroAddressIfNeeded(address)); -export const normalizeIncomingSocketToken = (token) => ({ +const normalizeIncomingSocketToken = (token) => ({ ...token, address: normalizeIncomingSocketTokenAddress(token.address) }); +exports.normalizeIncomingSocketToken = normalizeIncomingSocketToken; const normalizeOutgoingSocketTokenAddress = (address) => // Socket expects to receive null address instead of the zero address for native tokens. convertZeroAddressToNullAddressIfNeeded( @@ -21,7 +26,7 @@ const normalizeOutgoingSocketToken = (token) => ({ ...token, address: normalizeOutgoingSocketTokenAddress(token.address) }); -export class SocketAPI { +class SocketAPI { #fetch; #baseUrl = 'https://api.socket.tech/v2'; #headers; @@ -71,7 +76,7 @@ export class SocketAPI { const message = e?.message || 'no message'; const status = e?.status ? `, status: <${e.status}>` : ''; const error = `${errorPrefix} Upstream error: <${message}>${status}`; - throw new SwapAndBridgeProviderApiError(error); + throw new SwapAndBridgeProviderApiError_1.default(error); } let responseBody; try { @@ -80,7 +85,7 @@ export class SocketAPI { catch (e) { const message = e?.message || 'no message'; const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`; - throw new SwapAndBridgeProviderApiError(error); + throw new SwapAndBridgeProviderApiError_1.default(error); } // Socket API returns 500 status code with a message in the body, even // in case of a bad request. Not necessarily an internal server error. @@ -93,7 +98,7 @@ export class SocketAPI { const specificErrorCode = responseBody?.message?.details?.error?.code; const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''; const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`; - throw new SwapAndBridgeProviderApiError(error); + throw new SwapAndBridgeProviderApiError_1.default(error); } // Always attempt to update health status (if needed) when a response was // successful, in case the API was previously unhealthy (to recover). @@ -126,19 +131,19 @@ export class SocketAPI { // Exception for Optimism, strip out the legacy ETH address // TODO: Remove when Socket removes the legacy ETH address from their response if (toChainId === 10) - response = response.filter((token) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS); + response = response.filter((token) => token.address !== constants_1.ETH_ON_OPTIMISM_LEGACY_ADDRESS); // Exception for Ethereum, duplicate ETH tokens are incoming from the API. // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH. // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest. if (toChainId === 1) - response = response.filter((token) => token.address !== ZERO_ADDRESS); + response = response.filter((token) => token.address !== constants_1.ZERO_ADDRESS); // Since v4.41.0 we request the shortlist from Socket, which does not include // the Ambire $WALLET token. So adding it manually on the supported chains. if (toChainId === 1) - response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM); + response.unshift(constants_1.AMBIRE_WALLET_TOKEN_ON_ETHEREUM); if (toChainId === 8453) - response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE); - return response.map(normalizeIncomingSocketToken); + response.unshift(constants_1.AMBIRE_WALLET_TOKEN_ON_BASE); + return response.map(exports.normalizeIncomingSocketToken); } async getToken({ address, chainId }) { const params = new URLSearchParams({ @@ -152,7 +157,7 @@ export class SocketAPI { }); if (!response.isSupported || !response.token) return null; - return normalizeIncomingSocketToken(response.token); + return (0, exports.normalizeIncomingSocketToken)(response.token); } async quote({ fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmount, userAddress, isSmartAccount, sort, isOG }) { const params = new URLSearchParams({ @@ -168,11 +173,11 @@ export class SocketAPI { defaultSwapSlippage: '1', uniqueRoutesPerBridge: 'true' }); - const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]; + const feeTakerAddress = constants_1.AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]; const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG; if (shouldIncludeConvenienceFee) { params.append('feeTakerAddress', feeTakerAddress); - params.append('feePercent', FEE_PERCENT.toString()); + params.append('feePercent', constants_1.FEE_PERCENT.toString()); } // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as // batching is currently not not supported by Mayan (and funds get lost). @@ -185,21 +190,21 @@ export class SocketAPI { }); return { ...response, - fromAsset: normalizeIncomingSocketToken(response.fromAsset), - toAsset: normalizeIncomingSocketToken(response.toAsset), + fromAsset: (0, exports.normalizeIncomingSocketToken)(response.fromAsset), + toAsset: (0, exports.normalizeIncomingSocketToken)(response.toAsset), routes: response.routes.map((route) => ({ ...route, userTxs: route.userTxs.map((userTx) => ({ ...userTx, ...('fromAsset' in userTx && { - fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) + fromAsset: (0, exports.normalizeIncomingSocketToken)(userTx.fromAsset) }), - toAsset: normalizeIncomingSocketToken(userTx.toAsset), + toAsset: (0, exports.normalizeIncomingSocketToken)(userTx.toAsset), ...('steps' in userTx && { steps: userTx.steps.map((step) => ({ ...step, - fromAsset: normalizeIncomingSocketToken(step.fromAsset), - toAsset: normalizeIncomingSocketToken(step.toAsset) + fromAsset: (0, exports.normalizeIncomingSocketToken)(step.fromAsset), + toAsset: (0, exports.normalizeIncomingSocketToken)(step.toAsset) })) }) })) @@ -267,19 +272,19 @@ export class SocketAPI { }); return { ...response, - fromAsset: normalizeIncomingSocketToken(response.fromAsset), + fromAsset: (0, exports.normalizeIncomingSocketToken)(response.fromAsset), fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress), - toAsset: normalizeIncomingSocketToken(response.toAsset), + toAsset: (0, exports.normalizeIncomingSocketToken)(response.toAsset), toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress), userTxs: response.userTxs.map((userTx) => ({ ...userTx, - ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }), - toAsset: normalizeIncomingSocketToken(userTx.toAsset), + ...('fromAsset' in userTx && { fromAsset: (0, exports.normalizeIncomingSocketToken)(userTx.fromAsset) }), + toAsset: (0, exports.normalizeIncomingSocketToken)(userTx.toAsset), ...('steps' in userTx && { steps: userTx.steps.map((step) => ({ ...step, - fromAsset: normalizeIncomingSocketToken(step.fromAsset), - toAsset: normalizeIncomingSocketToken(step.toAsset) + fromAsset: (0, exports.normalizeIncomingSocketToken)(step.fromAsset), + toAsset: (0, exports.normalizeIncomingSocketToken)(step.toAsset) })) }) })) @@ -295,4 +300,5 @@ export class SocketAPI { return response; } } +exports.SocketAPI = SocketAPI; //# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/dist/src/services/socket/api.js.map b/dist/src/services/socket/api.js.map index cb9281f29..7fdf2bd51 100644 --- a/dist/src/services/socket/api.js.map +++ b/dist/src/services/socket/api.js.map @@ -1 +1 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\nimport { InviteController } from '../../controllers/invite/invite'\nimport { CustomResponse, Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIActiveRoutes,\n SocketAPIQuote,\n SocketAPIResponse,\n SocketAPISendTransactionRequest,\n SocketAPISupportedChain,\n SocketAPIToken,\n SocketRouteStatus\n} from '../../interfaces/swapAndBridge'\nimport {\n AMBIRE_FEE_TAKER_ADDRESSES,\n AMBIRE_WALLET_TOKEN_ON_BASE,\n AMBIRE_WALLET_TOKEN_ON_ETHEREUM,\n ETH_ON_OPTIMISM_LEGACY_ADDRESS,\n FEE_PERCENT,\n NULL_ADDRESS,\n ZERO_ADDRESS\n} from './constants'\n\nconst convertZeroAddressToNullAddressIfNeeded = (addr: string) =>\n addr === ZERO_ADDRESS ? NULL_ADDRESS : addr\n\nconst convertNullAddressToZeroAddressIfNeeded = (addr: string) =>\n addr === NULL_ADDRESS ? ZERO_ADDRESS : addr\n\nconst normalizeIncomingSocketTokenAddress = (address: string) =>\n // incoming token addresses from Socket are all lowercased\n getAddress(\n // native token addresses come as null address instead of the zero address\n convertNullAddressToZeroAddressIfNeeded(address)\n )\nexport const normalizeIncomingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeIncomingSocketTokenAddress(token.address)\n})\n\nconst normalizeOutgoingSocketTokenAddress = (address: string) =>\n // Socket expects to receive null address instead of the zero address for native tokens.\n convertZeroAddressToNullAddressIfNeeded(\n // Socket works only with all lowercased token addresses, otherwise, bad request\n address.toLocaleLowerCase()\n )\nconst normalizeOutgoingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeOutgoingSocketTokenAddress(token.address)\n})\n\nexport class SocketAPI {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n try {\n const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers })\n if (!response.ok) return false\n\n const body = await response.json()\n return !!body.ok\n } catch {\n return false\n }\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n async updateHealthIfNeeded() {\n // Update health status only if previously unhealthy\n if (this.isHealthy) return\n\n await this.updateHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n /**\n * Processes Socket API responses and throws custom errors for various\n * failures, including handling the API's unique response structure.\n */\n async #handleResponse({\n fetchPromise,\n errorPrefix\n }: {\n fetchPromise: Promise\n errorPrefix: string\n }): Promise {\n let response: CustomResponse\n\n try {\n response = await fetchPromise\n } catch (e: any) {\n const message = e?.message || 'no message'\n const status = e?.status ? `, status: <${e.status}>` : ''\n const error = `${errorPrefix} Upstream error: <${message}>${status}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n let responseBody: SocketAPIResponse\n try {\n responseBody = await response.json()\n } catch (e: any) {\n const message = e?.message || 'no message'\n const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Socket API returns 500 status code with a message in the body, even\n // in case of a bad request. Not necessarily an internal server error.\n if (!response.ok || !responseBody?.success) {\n // API returns 2 types of errors, a generic one, on the top level:\n const genericErrorMessage = responseBody?.message?.error || 'no message'\n // ... and a detailed one, nested in the `details` object:\n const specificError = responseBody?.message?.details?.error?.message\n const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''\n const specificErrorCode = responseBody?.message?.details?.error?.code\n const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''\n const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Always attempt to update health status (if needed) when a response was\n // successful, in case the API was previously unhealthy (to recover).\n // Do not wait on purpose, to not block or delay the response\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateHealthIfNeeded()\n\n return responseBody.result\n }\n\n async getSupportedChains(): Promise {\n const url = `${this.#baseUrl}/supported/chains`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.'\n })\n\n return response\n }\n\n async getToTokenList({\n fromChainId,\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n toChainId: toChainId.toString(),\n // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens),\n // which makes serialization and deserialization of this controller computationally expensive.\n isShortList: 'true'\n })\n const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`\n\n let response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported receive tokens. Please reload to try again.'\n })\n\n // Exception for Optimism, strip out the legacy ETH address\n // TODO: Remove when Socket removes the legacy ETH address from their response\n if (toChainId === 10)\n response = response.filter(\n (token: SocketAPIToken) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS\n )\n\n // Exception for Ethereum, duplicate ETH tokens are incoming from the API.\n // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH.\n // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest.\n if (toChainId === 1)\n response = response.filter((token: SocketAPIToken) => token.address !== ZERO_ADDRESS)\n\n // Since v4.41.0 we request the shortlist from Socket, which does not include\n // the Ambire $WALLET token. So adding it manually on the supported chains.\n if (toChainId === 1) response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM)\n if (toChainId === 8453) response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE)\n\n return response.map(normalizeIncomingSocketToken)\n }\n\n async getToken({\n address,\n chainId\n }: {\n address: string\n chainId: number\n }): Promise {\n const params = new URLSearchParams({\n address: address.toString(),\n chainId: chainId.toString()\n })\n const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`\n\n const response = await this.#handleResponse<{ isSupported: boolean; token: SocketAPIToken }>({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to retrieve token information by address.'\n })\n\n if (!response.isSupported || !response.token) return null\n\n return normalizeIncomingSocketToken(response.token)\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress,\n isSmartAccount,\n sort,\n isOG\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n isOG: InviteController['isOG']\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress),\n toChainId: toChainId.toString(),\n toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress),\n fromAmount: fromAmount.toString(),\n userAddress,\n isContractCall: isSmartAccount.toString(), // only get quotes with that are compatible with contracts\n sort,\n singleTxOnly: 'false',\n defaultSwapSlippage: '1',\n uniqueRoutesPerBridge: 'true'\n })\n const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]\n const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG\n if (shouldIncludeConvenienceFee) {\n params.append('feeTakerAddress', feeTakerAddress)\n params.append('feePercent', FEE_PERCENT.toString())\n }\n // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as\n // batching is currently not not supported by Mayan (and funds get lost).\n if (isSmartAccount) params.append('excludeBridges', ['mayan'].join(','))\n\n const url = `${this.#baseUrl}/quote?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to fetch the quote.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n routes: response.routes.map((route) => ({\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && {\n fromAsset: normalizeIncomingSocketToken(userTx.fromAsset)\n }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }))\n }\n }\n\n async startRoute({\n fromChainId,\n toChainId,\n fromAssetAddress,\n toAssetAddress,\n route\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n const params = {\n fromChainId,\n toChainId,\n fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress),\n toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress),\n includeFirstTxDetails: true,\n route: {\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined,\n toAsset: {\n ...userTx.toAsset,\n address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address)\n },\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n steps: userTx.steps\n ? // @ts-ignore fromAsset exists on one of the two userTx sub-types\n userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeOutgoingSocketToken(step.fromAsset),\n toAsset: normalizeOutgoingSocketToken(step.toAsset)\n }))\n : undefined\n }))\n }\n }\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(params)\n }),\n errorPrefix: 'Unable to start the route.'\n })\n\n return response\n }\n\n async getRouteStatus({\n activeRouteId,\n userTxIndex,\n txHash\n }: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n const params = new URLSearchParams({\n activeRouteId: activeRouteId.toString(),\n userTxIndex: userTxIndex.toString(),\n txHash\n })\n const url = `${this.#baseUrl}/route/prepare?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to get the route status. Please check back later to proceed.'\n })\n\n return response\n }\n\n async updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n ): Promise {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to update the active route.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress),\n userTxs: (response.userTxs as SocketAPIActiveRoutes['userTxs']).map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to start the next step.'\n })\n\n return response\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\nimport { InviteController } from '../../controllers/invite/invite'\nimport { CustomResponse, Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIActiveRoutes,\n SocketAPIQuote,\n SocketAPIResponse,\n SocketAPISendTransactionRequest,\n SocketAPISupportedChain,\n SocketAPIToken,\n SocketRouteStatus\n} from '../../interfaces/swapAndBridge'\nimport {\n AMBIRE_FEE_TAKER_ADDRESSES,\n AMBIRE_WALLET_TOKEN_ON_BASE,\n AMBIRE_WALLET_TOKEN_ON_ETHEREUM,\n ETH_ON_OPTIMISM_LEGACY_ADDRESS,\n FEE_PERCENT,\n NULL_ADDRESS,\n ZERO_ADDRESS\n} from './constants'\n\nconst convertZeroAddressToNullAddressIfNeeded = (addr: string) =>\n addr === ZERO_ADDRESS ? NULL_ADDRESS : addr\n\nconst convertNullAddressToZeroAddressIfNeeded = (addr: string) =>\n addr === NULL_ADDRESS ? ZERO_ADDRESS : addr\n\nconst normalizeIncomingSocketTokenAddress = (address: string) =>\n // incoming token addresses from Socket are all lowercased\n getAddress(\n // native token addresses come as null address instead of the zero address\n convertNullAddressToZeroAddressIfNeeded(address)\n )\nexport const normalizeIncomingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeIncomingSocketTokenAddress(token.address)\n})\n\nconst normalizeOutgoingSocketTokenAddress = (address: string) =>\n // Socket expects to receive null address instead of the zero address for native tokens.\n convertZeroAddressToNullAddressIfNeeded(\n // Socket works only with all lowercased token addresses, otherwise, bad request\n address.toLocaleLowerCase()\n )\nconst normalizeOutgoingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeOutgoingSocketTokenAddress(token.address)\n})\n\nexport class SocketAPI {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n try {\n const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers })\n if (!response.ok) return false\n\n const body = await response.json()\n return !!body.ok\n } catch {\n return false\n }\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n async updateHealthIfNeeded() {\n // Update health status only if previously unhealthy\n if (this.isHealthy) return\n\n await this.updateHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n /**\n * Processes Socket API responses and throws custom errors for various\n * failures, including handling the API's unique response structure.\n */\n async #handleResponse({\n fetchPromise,\n errorPrefix\n }: {\n fetchPromise: Promise\n errorPrefix: string\n }): Promise {\n let response: CustomResponse\n\n try {\n response = await fetchPromise\n } catch (e: any) {\n const message = e?.message || 'no message'\n const status = e?.status ? `, status: <${e.status}>` : ''\n const error = `${errorPrefix} Upstream error: <${message}>${status}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n let responseBody: SocketAPIResponse\n try {\n responseBody = await response.json()\n } catch (e: any) {\n const message = e?.message || 'no message'\n const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Socket API returns 500 status code with a message in the body, even\n // in case of a bad request. Not necessarily an internal server error.\n if (!response.ok || !responseBody?.success) {\n // API returns 2 types of errors, a generic one, on the top level:\n const genericErrorMessage = responseBody?.message?.error || 'no message'\n // ... and a detailed one, nested in the `details` object:\n const specificError = responseBody?.message?.details?.error?.message\n const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''\n const specificErrorCode = responseBody?.message?.details?.error?.code\n const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''\n const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Always attempt to update health status (if needed) when a response was\n // successful, in case the API was previously unhealthy (to recover).\n // Do not wait on purpose, to not block or delay the response\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateHealthIfNeeded()\n\n return responseBody.result\n }\n\n async getSupportedChains(): Promise {\n const url = `${this.#baseUrl}/supported/chains`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.'\n })\n\n return response\n }\n\n async getToTokenList({\n fromChainId,\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n toChainId: toChainId.toString(),\n // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens),\n // which makes serialization and deserialization of this controller computationally expensive.\n isShortList: 'true'\n })\n const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`\n\n let response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported receive tokens. Please reload to try again.'\n })\n\n // Exception for Optimism, strip out the legacy ETH address\n // TODO: Remove when Socket removes the legacy ETH address from their response\n if (toChainId === 10)\n response = response.filter(\n (token: SocketAPIToken) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS\n )\n\n // Exception for Ethereum, duplicate ETH tokens are incoming from the API.\n // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH.\n // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest.\n if (toChainId === 1)\n response = response.filter((token: SocketAPIToken) => token.address !== ZERO_ADDRESS)\n\n // Since v4.41.0 we request the shortlist from Socket, which does not include\n // the Ambire $WALLET token. So adding it manually on the supported chains.\n if (toChainId === 1) response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM)\n if (toChainId === 8453) response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE)\n\n return response.map(normalizeIncomingSocketToken)\n }\n\n async getToken({\n address,\n chainId\n }: {\n address: string\n chainId: number\n }): Promise {\n const params = new URLSearchParams({\n address: address.toString(),\n chainId: chainId.toString()\n })\n const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`\n\n const response = await this.#handleResponse<{ isSupported: boolean; token: SocketAPIToken }>({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to retrieve token information by address.'\n })\n\n if (!response.isSupported || !response.token) return null\n\n return normalizeIncomingSocketToken(response.token)\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress,\n isSmartAccount,\n sort,\n isOG\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n isOG: InviteController['isOG']\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress),\n toChainId: toChainId.toString(),\n toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress),\n fromAmount: fromAmount.toString(),\n userAddress,\n isContractCall: isSmartAccount.toString(), // only get quotes with that are compatible with contracts\n sort,\n singleTxOnly: 'false',\n defaultSwapSlippage: '1',\n uniqueRoutesPerBridge: 'true'\n })\n const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]\n const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG\n if (shouldIncludeConvenienceFee) {\n params.append('feeTakerAddress', feeTakerAddress)\n params.append('feePercent', FEE_PERCENT.toString())\n }\n // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as\n // batching is currently not not supported by Mayan (and funds get lost).\n if (isSmartAccount) params.append('excludeBridges', ['mayan'].join(','))\n\n const url = `${this.#baseUrl}/quote?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to fetch the quote.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n routes: response.routes.map((route) => ({\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && {\n fromAsset: normalizeIncomingSocketToken(userTx.fromAsset)\n }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }))\n }\n }\n\n async startRoute({\n fromChainId,\n toChainId,\n fromAssetAddress,\n toAssetAddress,\n route\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n const params = {\n fromChainId,\n toChainId,\n fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress),\n toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress),\n includeFirstTxDetails: true,\n route: {\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined,\n toAsset: {\n ...userTx.toAsset,\n address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address)\n },\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n steps: userTx.steps\n ? // @ts-ignore fromAsset exists on one of the two userTx sub-types\n userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeOutgoingSocketToken(step.fromAsset),\n toAsset: normalizeOutgoingSocketToken(step.toAsset)\n }))\n : undefined\n }))\n }\n }\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(params)\n }),\n errorPrefix: 'Unable to start the route.'\n })\n\n return response\n }\n\n async getRouteStatus({\n activeRouteId,\n userTxIndex,\n txHash\n }: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n const params = new URLSearchParams({\n activeRouteId: activeRouteId.toString(),\n userTxIndex: userTxIndex.toString(),\n txHash\n })\n const url = `${this.#baseUrl}/route/prepare?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to get the route status. Please check back later to proceed.'\n })\n\n return response\n }\n\n async updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n ): Promise {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to update the active route.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress),\n userTxs: (response.userTxs as SocketAPIActiveRoutes['userTxs']).map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to start the next step.'\n })\n\n return response\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/socket/constants.js b/dist/src/services/socket/constants.js index 0769d7366..bcf1b3edf 100644 --- a/dist/src/services/socket/constants.js +++ b/dist/src/services/socket/constants.js @@ -1,13 +1,16 @@ -export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AMBIRE_FEE_TAKER_ADDRESSES = exports.AMBIRE_WALLET_TOKEN_ON_BASE = exports.AMBIRE_WALLET_TOKEN_ON_ETHEREUM = exports.FEE_PERCENT = exports.ETH_ON_OPTIMISM_LEGACY_ADDRESS = exports.NULL_ADDRESS = exports.ZERO_ADDRESS = void 0; +exports.ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; // Some services (like Socket) use the null token address to represent the // native token as the ZERO_ADDRESS is not standard for it. -export const NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; -export const ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'; +exports.NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; +exports.ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'; /** * The % of fee to be cut from the source input token amount. * Can be up to three decimal places and cannot be more than 5%. */ -export const FEE_PERCENT = 0.25; +exports.FEE_PERCENT = 0.25; const AMBIRE_WALLET_TOKEN_COMMON_PROPS = { name: 'Ambire Wallet', symbol: 'WALLET', @@ -15,17 +18,17 @@ const AMBIRE_WALLET_TOKEN_COMMON_PROPS = { logoURI: 'https://media.socket.tech/tokens/all/WALLET', icon: '' // will fallback to get the icon from the same place as the portfolio }; -export const AMBIRE_WALLET_TOKEN_ON_ETHEREUM = { +exports.AMBIRE_WALLET_TOKEN_ON_ETHEREUM = { chainId: 1, address: '0x88800092fF476844f74dC2FC427974BBee2794Ae', ...AMBIRE_WALLET_TOKEN_COMMON_PROPS }; -export const AMBIRE_WALLET_TOKEN_ON_BASE = { +exports.AMBIRE_WALLET_TOKEN_ON_BASE = { chainId: 8453, address: '0x0BbbEad62f7647AE8323d2cb243A0DB74B7C2b80', ...AMBIRE_WALLET_TOKEN_COMMON_PROPS }; -export const AMBIRE_FEE_TAKER_ADDRESSES = { +exports.AMBIRE_FEE_TAKER_ADDRESSES = { 324: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', 1101: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', 5000: '0x942f9CE5D9a33a82F88D233AEb3292E680230348', diff --git a/dist/src/services/socket/constants.js.map b/dist/src/services/socket/constants.js.map index 1a4650ce1..4eec5c4ea 100644 --- a/dist/src/services/socket/constants.js.map +++ b/dist/src/services/socket/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/services/socket/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AACxE,0EAA0E;AAC1E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AAExE,MAAM,CAAC,MAAM,8BAA8B,GAAG,4CAA4C,CAAA;AAE1F;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAA;AAE/B,MAAM,gCAAgC,GAAG;IACvC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE,EAAE,CAAC,qEAAqE;CAC/E,CAAA;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAkC;IACvE,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,CAAC,EAAE,4CAA4C;IAC/C,EAAE,EAAE,4CAA4C;IAChD,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;CACtD,CAAA","sourcesContent":["export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n// Some services (like Socket) use the null token address to represent the\n// native token as the ZERO_ADDRESS is not standard for it.\nexport const NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'\n\n/**\n * The % of fee to be cut from the source input token amount.\n * Can be up to three decimal places and cannot be more than 5%.\n */\nexport const FEE_PERCENT = 0.25\n\nconst AMBIRE_WALLET_TOKEN_COMMON_PROPS = {\n name: 'Ambire Wallet',\n symbol: 'WALLET',\n decimals: 18,\n logoURI: 'https://media.socket.tech/tokens/all/WALLET',\n icon: '' // will fallback to get the icon from the same place as the portfolio\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_ETHEREUM = {\n chainId: 1,\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_BASE = {\n chainId: 8453,\n address: '0x0BbbEad62f7647AE8323d2cb243A0DB74B7C2b80',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_FEE_TAKER_ADDRESSES: { [chainId: number]: string } = {\n 324: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1101: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 5000: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 34443: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 43114: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 59144: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 534352: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1313161554: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 81457: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1: '0xDCe4f65Aa650B3FaFEa9892E807C1770d6e9c618',\n 10: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 137: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 8453: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 56: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 42161: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 100: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 7777777: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001'\n}\n"]} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/services/socket/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,4CAA4C,CAAA;AACxE,0EAA0E;AAC1E,2DAA2D;AAC9C,QAAA,YAAY,GAAG,4CAA4C,CAAA;AAE3D,QAAA,8BAA8B,GAAG,4CAA4C,CAAA;AAE1F;;;GAGG;AACU,QAAA,WAAW,GAAG,IAAI,CAAA;AAE/B,MAAM,gCAAgC,GAAG;IACvC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE,EAAE,CAAC,qEAAqE;CAC/E,CAAA;AAEY,QAAA,+BAA+B,GAAG;IAC7C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAEY,QAAA,2BAA2B,GAAG;IACzC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,4CAA4C;IACrD,GAAG,gCAAgC;CACpC,CAAA;AAEY,QAAA,0BAA0B,GAAkC;IACvE,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,CAAC,EAAE,4CAA4C;IAC/C,EAAE,EAAE,4CAA4C;IAChD,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,4CAA4C;IAClD,EAAE,EAAE,4CAA4C;IAChD,KAAK,EAAE,4CAA4C;IACnD,GAAG,EAAE,4CAA4C;IACjD,OAAO,EAAE,4CAA4C;CACtD,CAAA","sourcesContent":["export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n// Some services (like Socket) use the null token address to represent the\n// native token as the ZERO_ADDRESS is not standard for it.\nexport const NULL_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const ETH_ON_OPTIMISM_LEGACY_ADDRESS = '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'\n\n/**\n * The % of fee to be cut from the source input token amount.\n * Can be up to three decimal places and cannot be more than 5%.\n */\nexport const FEE_PERCENT = 0.25\n\nconst AMBIRE_WALLET_TOKEN_COMMON_PROPS = {\n name: 'Ambire Wallet',\n symbol: 'WALLET',\n decimals: 18,\n logoURI: 'https://media.socket.tech/tokens/all/WALLET',\n icon: '' // will fallback to get the icon from the same place as the portfolio\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_ETHEREUM = {\n chainId: 1,\n address: '0x88800092fF476844f74dC2FC427974BBee2794Ae',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_WALLET_TOKEN_ON_BASE = {\n chainId: 8453,\n address: '0x0BbbEad62f7647AE8323d2cb243A0DB74B7C2b80',\n ...AMBIRE_WALLET_TOKEN_COMMON_PROPS\n}\n\nexport const AMBIRE_FEE_TAKER_ADDRESSES: { [chainId: number]: string } = {\n 324: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1101: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 5000: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 34443: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 43114: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 59144: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 534352: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1313161554: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 81457: '0x942f9CE5D9a33a82F88D233AEb3292E680230348',\n 1: '0xDCe4f65Aa650B3FaFEa9892E807C1770d6e9c618',\n 10: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 137: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 8453: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 56: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 42161: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 100: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001',\n 7777777: '0xDA1c734b7843f18E9B1A25Bb997A45975315C001'\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.js b/dist/src/services/unstoppableDomains/index.js index b44b58d28..c1fe973f7 100644 --- a/dist/src/services/unstoppableDomains/index.js +++ b/dist/src/services/unstoppableDomains/index.js @@ -1,2 +1,5 @@ -export * from './unstoppableDomains'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./unstoppableDomains"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/index.js.map b/dist/src/services/unstoppableDomains/index.js.map index 1d64c3787..13243e294 100644 --- a/dist/src/services/unstoppableDomains/index.js.map +++ b/dist/src/services/unstoppableDomains/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA","sourcesContent":["export * from './unstoppableDomains'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC","sourcesContent":["export * from './unstoppableDomains'\n"]} \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.js b/dist/src/services/unstoppableDomains/unstoppableDomains.js index d3165ee68..aaf37ecc3 100644 --- a/dist/src/services/unstoppableDomains/unstoppableDomains.js +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.js @@ -1,16 +1,19 @@ -import { Resolution } from '@unstoppabledomains/resolution'; -import { networks } from '../../consts/networks'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reverseLookupUD = exports.resolveUDomain = void 0; +const resolution_1 = require("@unstoppabledomains/resolution"); +const networks_1 = require("../../consts/networks"); // @TODO: Get RPC urls from settings controller -const resolution = new Resolution({ +const resolution = new resolution_1.Resolution({ sourceConfig: { uns: { locations: { Layer1: { - url: networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '', + url: networks_1.networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '', network: 'mainnet' }, Layer2: { - url: networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '', + url: networks_1.networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '', network: 'polygon-mainnet' } } @@ -53,8 +56,9 @@ async function resolveUDomain(domain, currency, chain) { } return ''; } +exports.resolveUDomain = resolveUDomain; async function reverseLookupUD(address) { return resolution.reverse(address); } -export { resolveUDomain, reverseLookupUD }; +exports.reverseLookupUD = reverseLookupUD; //# sourceMappingURL=unstoppableDomains.js.map \ No newline at end of file diff --git a/dist/src/services/unstoppableDomains/unstoppableDomains.js.map b/dist/src/services/unstoppableDomains/unstoppableDomains.js.map index d79f6d567..5f4da7b5f 100644 --- a/dist/src/services/unstoppableDomains/unstoppableDomains.js.map +++ b/dist/src/services/unstoppableDomains/unstoppableDomains.js.map @@ -1 +1 @@ -{"version":3,"file":"unstoppableDomains.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/unstoppableDomains.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolution } from '@unstoppabledomains/resolution'\n\nimport { networks } from '../../consts/networks'\n\n// @TODO: Get RPC urls from settings controller\nconst resolution = new Resolution({\n sourceConfig: {\n uns: {\n locations: {\n Layer1: {\n url: networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '',\n network: 'mainnet'\n },\n Layer2: {\n url: networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '',\n network: 'polygon-mainnet'\n }\n }\n }\n }\n})\n\nfunction getMessage(e?: string) {\n if (e === 'UnregisteredDomain') return 'Domain is not registered'\n if (e === 'RecordNotFound') return 'Crypto record is not found (or empty)'\n if (e === 'UnspecifiedResolver') return 'Domain is not configured (empty resolver)'\n if (e === 'UnsupportedDomain') return 'Domain is not supported'\n return 'Domain is not registered'\n}\n\nasync function resolveAddress(domain: string) {\n return resolution\n .addr(domain, 'ETH')\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveAddressMultiChain(domain: string, currency: string, chain: string) {\n return resolution\n .multiChainAddr(domain, currency, chain)\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveUDomain(domain: string, currency?: any, chain?: any): Promise {\n const [nativeUDAddress, customUDAddress] = await Promise.all([\n resolveAddress(domain),\n resolveAddressMultiChain(domain, currency, chain)\n ])\n\n if (customUDAddress.success && 'address' in customUDAddress && customUDAddress.address) {\n return customUDAddress.address\n }\n\n if (nativeUDAddress.success && 'address' in nativeUDAddress && nativeUDAddress.address) {\n return nativeUDAddress.address\n }\n\n return ''\n}\n\nasync function reverseLookupUD(address: string): Promise {\n return resolution.reverse(address)\n}\n\nexport { resolveUDomain, reverseLookupUD }\n"]} \ No newline at end of file +{"version":3,"file":"unstoppableDomains.js","sourceRoot":"","sources":["../../../../src/services/unstoppableDomains/unstoppableDomains.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolution } from '@unstoppabledomains/resolution'\n\nimport { networks } from '../../consts/networks'\n\n// @TODO: Get RPC urls from settings controller\nconst resolution = new Resolution({\n sourceConfig: {\n uns: {\n locations: {\n Layer1: {\n url: networks.find((x) => x.id === 'ethereum')?.rpcUrls?.[0] || '',\n network: 'mainnet'\n },\n Layer2: {\n url: networks.find((x) => x.id === 'polygon')?.rpcUrls?.[0] || '',\n network: 'polygon-mainnet'\n }\n }\n }\n }\n})\n\nfunction getMessage(e?: string) {\n if (e === 'UnregisteredDomain') return 'Domain is not registered'\n if (e === 'RecordNotFound') return 'Crypto record is not found (or empty)'\n if (e === 'UnspecifiedResolver') return 'Domain is not configured (empty resolver)'\n if (e === 'UnsupportedDomain') return 'Domain is not supported'\n return 'Domain is not registered'\n}\n\nasync function resolveAddress(domain: string) {\n return resolution\n .addr(domain, 'ETH')\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveAddressMultiChain(domain: string, currency: string, chain: string) {\n return resolution\n .multiChainAddr(domain, currency, chain)\n .then((addr) => ({ success: true, address: addr }))\n .catch((e) => ({ success: false, code: e.code, message: getMessage(e.code) }))\n}\n\nasync function resolveUDomain(domain: string, currency?: any, chain?: any): Promise {\n const [nativeUDAddress, customUDAddress] = await Promise.all([\n resolveAddress(domain),\n resolveAddressMultiChain(domain, currency, chain)\n ])\n\n if (customUDAddress.success && 'address' in customUDAddress && customUDAddress.address) {\n return customUDAddress.address\n }\n\n if (nativeUDAddress.success && 'address' in nativeUDAddress && nativeUDAddress.address) {\n return nativeUDAddress.address\n }\n\n return ''\n}\n\nasync function reverseLookupUD(address: string): Promise {\n return resolution.reverse(address)\n}\n\nexport { resolveUDomain, reverseLookupUD }\n"]} \ No newline at end of file diff --git a/dist/src/services/validations/index.js b/dist/src/services/validations/index.js index d85c63e49..e79da0890 100644 --- a/dist/src/services/validations/index.js +++ b/dist/src/services/validations/index.js @@ -1,2 +1,5 @@ -export * from './validate'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./validate"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/services/validations/index.js.map b/dist/src/services/validations/index.js.map index 96b3e4f71..1dfc96b08 100644 --- a/dist/src/services/validations/index.js.map +++ b/dist/src/services/validations/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/validations/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA","sourcesContent":["export * from './validate'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/validations/index.ts"],"names":[],"mappings":";;;AAAA,qDAA0B","sourcesContent":["export * from './validate'\n"]} \ No newline at end of file diff --git a/dist/src/services/validations/validate.js b/dist/src/services/validations/validate.js index 17941e6c5..f244ec1e7 100644 --- a/dist/src/services/validations/validate.js +++ b/dist/src/services/validations/validate.js @@ -1,8 +1,13 @@ -import { getAddress, parseUnits } from 'ethers'; -import isEmail from 'validator/es/lib/isEmail'; -import { getTokenAmount } from '../../libs/portfolio/helpers'; -import { getSanitizedAmount } from '../../libs/transfer/amount'; -import { isValidAddress } from '../address'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isValidURL = exports.isValidPassword = exports.isValidCode = exports.validateSendNftAddress = exports.validateSendTransferAmount = exports.validateSendTransferAddress = exports.validateAddAuthSignerAddress = exports.isEmail = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const isEmail_1 = tslib_1.__importDefault(require("validator/es/lib/isEmail")); +exports.isEmail = isEmail_1.default; +const helpers_1 = require("../../libs/portfolio/helpers"); +const amount_1 = require("../../libs/transfer/amount"); +const address_1 = require("../address"); const validateAddress = (address) => { if (!(address && address.length)) { return { @@ -10,14 +15,14 @@ const validateAddress = (address) => { message: '' }; } - if (!(address && isValidAddress(address))) { + if (!(address && (0, address_1.isValidAddress)(address))) { return { success: false, message: 'Invalid address.' }; } try { - getAddress(address); + (0, ethers_1.getAddress)(address); } catch { return { @@ -39,9 +44,10 @@ const validateAddAuthSignerAddress = (address, selectedAcc) => { } return { success: true, message: '' }; }; +exports.validateAddAuthSignerAddress = validateAddAuthSignerAddress; const validateSendTransferAddress = (address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, isRecipientDomainResolving, isSWWarningVisible, isSWWarningAgreed) => { // Basic validation is handled in the AddressInput component and we don't want to overwrite it. - if (!isValidAddress(address) || isRecipientDomainResolving) { + if (!(0, address_1.isValidAddress)(address) || isRecipientDomainResolving) { return { success: true, message: '' @@ -87,8 +93,9 @@ const validateSendTransferAddress = (address, selectedAcc, addressConfirmed, isR } return { success: true, message: '' }; }; +exports.validateSendTransferAddress = validateSendTransferAddress; const validateSendTransferAmount = (amount, maxAmount, maxAmountInFiat, selectedAsset) => { - const sanitizedAmount = getSanitizedAmount(amount, selectedAsset.decimals); + const sanitizedAmount = (0, amount_1.getSanitizedAmount)(amount, selectedAsset.decimals); if (!(sanitizedAmount && sanitizedAmount.length)) { return { success: false, @@ -108,8 +115,8 @@ const validateSendTransferAmount = (amount, maxAmount, maxAmountInFiat, selected success: false, message: 'Token amount too low.' }; - const currentAmount = parseUnits(sanitizedAmount, selectedAsset.decimals); - if (currentAmount > getTokenAmount(selectedAsset)) { + const currentAmount = (0, ethers_1.parseUnits)(sanitizedAmount, selectedAsset.decimals); + if (currentAmount > (0, helpers_1.getTokenAmount)(selectedAsset)) { return { success: false, message: `The amount is greater than the asset's balance: ${Number(maxAmount) || 0} ${selectedAsset?.symbol}${maxAmountInFiat ? `/ ${Number(maxAmountInFiat)} USD.` : ''}` @@ -126,6 +133,7 @@ const validateSendTransferAmount = (amount, maxAmount, maxAmountInFiat, selected } return { success: true, message: '' }; }; +exports.validateSendTransferAmount = validateSendTransferAmount; const validateSendNftAddress = (address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, metadata, selectedNetwork, network, isUDAddress, isEnsAddress, isRecipientDomainResolving) => { const isValidAddr = validateSendTransferAddress(address, selectedAcc, addressConfirmed, isRecipientAddressUnknown, isRecipientHumanizerKnownTokenOrSmartContract, isUDAddress, isEnsAddress, isRecipientDomainResolving); if (!isValidAddr.success) @@ -146,11 +154,14 @@ const validateSendNftAddress = (address, selectedAcc, addressConfirmed, isRecipi } return { success: true, message: '' }; }; +exports.validateSendNftAddress = validateSendNftAddress; const isValidCode = (code) => code.length === 6; +exports.isValidCode = isValidCode; const isValidPassword = (password) => password.length >= 8; +exports.isValidPassword = isValidPassword; function isValidURL(url) { const urlRegex = /^(?:https?|ftp):\/\/(?:\w+:{0,1}\w*@)?(?:\S+)(?::\d+)?(?:\/|\/(?:[\w#!:.?+=&%@!\-\/]))?$/; return urlRegex.test(url); } -export { isEmail, validateAddAuthSignerAddress, validateSendTransferAddress, validateSendTransferAmount, validateSendNftAddress, isValidCode, isValidPassword, isValidURL }; +exports.isValidURL = isValidURL; //# sourceMappingURL=validate.js.map \ No newline at end of file diff --git a/dist/src/services/validations/validate.js.map b/dist/src/services/validations/validate.js.map index 7b9c8c3c3..9f74b24e0 100644 --- a/dist/src/services/validations/validate.js.map +++ b/dist/src/services/validations/validate.js.map @@ -1 +1 @@ -{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/services/validations/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,OAAO,MAAM,0BAA0B,CAAA;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAO3C,MAAM,eAAe,GAAG,CAAC,OAAe,EAAsB,EAAE;IAC9D,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;QAChC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;SACZ,CAAA;KACF;IAED,IAAI,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,kBAAkB;SAC5B,CAAA;KACF;IAED,IAAI;QACF,UAAU,CAAC,OAAO,CAAC,CAAA;KACpB;IAAC,MAAM;QACN,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,qDAAqD;SAC/D,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,4BAA4B,GAAG,CAAC,OAAe,EAAE,WAAgB,EAAsB,EAAE;IAC7F,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,CAAC,WAAW,CAAC,OAAO;QAAE,OAAO,WAAW,CAAA;IAE5C,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,KAAK,WAAW,EAAE;QACrD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,wEAAwE;SAClF,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,CAClC,OAAe,EACf,WAAmB,EACnB,gBAAqB,EACrB,yBAAkC,EAClC,6CAAsD,EACtD,WAAoB,EACpB,YAAqB,EACrB,0BAAmC,EACnC,kBAA4B,EAC5B,iBAA2B,EACP,EAAE;IACtB,+FAA+F;IAC/F,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,0BAA0B,EAAE;QAC1D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE;SACZ,CAAA;KACF;IAED,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE;QACtE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,4EAA4E;SACtF,CAAA;KACF;IAED,IAAI,6CAA6C,EAAE;QACjD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,8EAA8E;SACxF,CAAA;KACF;IAED,IACE,yBAAyB;QACzB,CAAC,gBAAgB;QACjB,CAAC,WAAW;QACZ,CAAC,YAAY;QACb,CAAC,0BAA0B,EAC3B;QACA,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EACL,uGAAuG;SAC1G,CAAA;KACF;IAED,IACE,yBAAyB;QACzB,CAAC,gBAAgB;QACjB,CAAC,WAAW,IAAI,YAAY,CAAC;QAC7B,CAAC,0BAA0B,EAC3B;QACA,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAA;QACzE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,uCAAuC,IAAI,wFAAwF;SAC7I,CAAA;KACF;IAED,IAAI,yBAAyB,IAAI,gBAAgB,IAAI,kBAAkB,IAAI,CAAC,iBAAiB,EAAE;QAC7F,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,+DAA+D;SACzE,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CACjC,MAAc,EACd,SAAiB,EACjB,eAAuB,EACvB,aAA0B,EACN,EAAE;IACtB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAE1E,IAAI,CAAC,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;QAChD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;SACZ,CAAA;KACF;IAED,IAAI,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE;QACrD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oCAAoC;SAC9C,CAAA;KACF;IAED,IAAI;QACF,IAAI,eAAe,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,EAAE;YAC9D,IAAI,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC,QAAQ;gBAC5D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,uBAAuB;iBACjC,CAAA;YAEH,MAAM,aAAa,GAAW,UAAU,CAAC,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;YAEjF,IAAI,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,EAAE;gBACjD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,mDAAmD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAChF,aAAa,EAAE,MACjB,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;iBAChE,CAAA;aACF;SACF;KACF;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEhB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iBAAiB;SAC3B,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAC7B,OAAe,EACf,WAAgB,EAChB,gBAAqB,EACrB,yBAAkC,EAClC,6CAAsD,EACtD,QAAa,EACb,eAAoB,EACpB,OAAY,EACZ,WAAoB,EACpB,YAAqB,EACrB,0BAAmC,EACf,EAAE;IACtB,MAAM,WAAW,GAAG,2BAA2B,CAC7C,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,yBAAyB,EACzB,6CAA6C,EAC7C,WAAW,EACX,YAAY,EACZ,0BAA0B,CAC3B,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,OAAO;QAAE,OAAO,WAAW,CAAA;IAE5C,IACE,QAAQ;QACR,WAAW;QACX,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EACnE;QACA,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oDAAoD;SAC9D,CAAA;KACF;IAED,IAAI,eAAe,IAAI,OAAO,IAAI,eAAe,CAAC,EAAE,KAAK,OAAO,EAAE;QAChE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,8CAA8C;SACxD,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;AAEvD,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAA;AAElE,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,QAAQ,GACZ,0FAA0F,CAAA;IAE5F,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED,OAAO,EACL,OAAO,EACP,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,UAAU,EACX,CAAA","sourcesContent":["import { getAddress, parseUnits } from 'ethers'\nimport isEmail from 'validator/es/lib/isEmail'\n\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { isValidAddress } from '../address'\n\ntype ValidateReturnType = {\n success: boolean\n message: string\n}\n\nconst validateAddress = (address: string): ValidateReturnType => {\n if (!(address && address.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(address && isValidAddress(address))) {\n return {\n success: false,\n message: 'Invalid address.'\n }\n }\n\n try {\n getAddress(address)\n } catch {\n return {\n success: false,\n message: 'Invalid checksum. Verify the address and try again.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateAddAuthSignerAddress = (address: string, selectedAcc: any): ValidateReturnType => {\n const isValidAddr = validateAddress(address)\n if (!isValidAddr.success) return isValidAddr\n\n if (address && selectedAcc && address === selectedAcc) {\n return {\n success: false,\n message: 'The entered address should be different than your own account address.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAddress = (\n address: string,\n selectedAcc: string,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean,\n isSWWarningVisible?: boolean,\n isSWWarningAgreed?: boolean\n): ValidateReturnType => {\n // Basic validation is handled in the AddressInput component and we don't want to overwrite it.\n if (!isValidAddress(address) || isRecipientDomainResolving) {\n return {\n success: true,\n message: ''\n }\n }\n\n if (selectedAcc && address.toLowerCase() === selectedAcc.toLowerCase()) {\n return {\n success: false,\n message: 'The entered address should be different than the your own account address.'\n }\n }\n\n if (isRecipientHumanizerKnownTokenOrSmartContract) {\n return {\n success: false,\n message: 'You are trying to send tokens to a smart contract. Doing so would burn them.'\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n !isUDAddress &&\n !isEnsAddress &&\n !isRecipientDomainResolving\n ) {\n return {\n success: false,\n message:\n \"You're trying to send to an unknown address. If you're really sure, confirm using the checkbox below.\"\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n (isUDAddress || isEnsAddress) &&\n !isRecipientDomainResolving\n ) {\n const name = isUDAddress ? 'Unstoppable domain' : 'Ethereum Name Service'\n return {\n success: false,\n message: `You're trying to send to an unknown ${name}. If you really trust the person who gave it to you, confirm using the checkbox below.`\n }\n }\n\n if (isRecipientAddressUnknown && addressConfirmed && isSWWarningVisible && !isSWWarningAgreed) {\n return {\n success: false,\n message: 'Please confirm that the recipient address is not an exchange.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAmount = (\n amount: string,\n maxAmount: number,\n maxAmountInFiat: number,\n selectedAsset: TokenResult\n): ValidateReturnType => {\n const sanitizedAmount = getSanitizedAmount(amount, selectedAsset.decimals)\n\n if (!(sanitizedAmount && sanitizedAmount.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(sanitizedAmount && Number(sanitizedAmount) > 0)) {\n return {\n success: false,\n message: 'The amount must be greater than 0.'\n }\n }\n\n try {\n if (sanitizedAmount && selectedAsset && selectedAsset.decimals) {\n if (Number(sanitizedAmount) < 1 / 10 ** selectedAsset.decimals)\n return {\n success: false,\n message: 'Token amount too low.'\n }\n\n const currentAmount: bigint = parseUnits(sanitizedAmount, selectedAsset.decimals)\n\n if (currentAmount > getTokenAmount(selectedAsset)) {\n return {\n success: false,\n message: `The amount is greater than the asset's balance: ${Number(maxAmount) || 0} ${\n selectedAsset?.symbol\n }${maxAmountInFiat ? `/ ${Number(maxAmountInFiat)} USD.` : ''}`\n }\n }\n }\n } catch (e) {\n console.error(e)\n\n return {\n success: false,\n message: 'Invalid amount.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendNftAddress = (\n address: string,\n selectedAcc: any,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n metadata: any,\n selectedNetwork: any,\n network: any,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean\n): ValidateReturnType => {\n const isValidAddr = validateSendTransferAddress(\n address,\n selectedAcc,\n addressConfirmed,\n isRecipientAddressUnknown,\n isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n isRecipientDomainResolving\n )\n if (!isValidAddr.success) return isValidAddr\n\n if (\n metadata &&\n selectedAcc &&\n metadata.owner?.address.toLowerCase() !== selectedAcc.toLowerCase()\n ) {\n return {\n success: false,\n message: \"The NFT you're trying to send is not owned by you!\"\n }\n }\n\n if (selectedNetwork && network && selectedNetwork.id !== network) {\n return {\n success: false,\n message: 'The selected network is not the correct one.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst isValidCode = (code: string) => code.length === 6\n\nconst isValidPassword = (password: string) => password.length >= 8\n\nfunction isValidURL(url: string) {\n const urlRegex =\n /^(?:https?|ftp):\\/\\/(?:\\w+:{0,1}\\w*@)?(?:\\S+)(?::\\d+)?(?:\\/|\\/(?:[\\w#!:.?+=&%@!\\-\\/]))?$/\n\n return urlRegex.test(url)\n}\n\nexport {\n isEmail,\n validateAddAuthSignerAddress,\n validateSendTransferAddress,\n validateSendTransferAmount,\n validateSendNftAddress,\n isValidCode,\n isValidPassword,\n isValidURL\n}\n"]} \ No newline at end of file +{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/services/validations/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, parseUnits } from 'ethers'\nimport isEmail from 'validator/es/lib/isEmail'\n\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { isValidAddress } from '../address'\n\ntype ValidateReturnType = {\n success: boolean\n message: string\n}\n\nconst validateAddress = (address: string): ValidateReturnType => {\n if (!(address && address.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(address && isValidAddress(address))) {\n return {\n success: false,\n message: 'Invalid address.'\n }\n }\n\n try {\n getAddress(address)\n } catch {\n return {\n success: false,\n message: 'Invalid checksum. Verify the address and try again.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateAddAuthSignerAddress = (address: string, selectedAcc: any): ValidateReturnType => {\n const isValidAddr = validateAddress(address)\n if (!isValidAddr.success) return isValidAddr\n\n if (address && selectedAcc && address === selectedAcc) {\n return {\n success: false,\n message: 'The entered address should be different than your own account address.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAddress = (\n address: string,\n selectedAcc: string,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean,\n isSWWarningVisible?: boolean,\n isSWWarningAgreed?: boolean\n): ValidateReturnType => {\n // Basic validation is handled in the AddressInput component and we don't want to overwrite it.\n if (!isValidAddress(address) || isRecipientDomainResolving) {\n return {\n success: true,\n message: ''\n }\n }\n\n if (selectedAcc && address.toLowerCase() === selectedAcc.toLowerCase()) {\n return {\n success: false,\n message: 'The entered address should be different than the your own account address.'\n }\n }\n\n if (isRecipientHumanizerKnownTokenOrSmartContract) {\n return {\n success: false,\n message: 'You are trying to send tokens to a smart contract. Doing so would burn them.'\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n !isUDAddress &&\n !isEnsAddress &&\n !isRecipientDomainResolving\n ) {\n return {\n success: false,\n message:\n \"You're trying to send to an unknown address. If you're really sure, confirm using the checkbox below.\"\n }\n }\n\n if (\n isRecipientAddressUnknown &&\n !addressConfirmed &&\n (isUDAddress || isEnsAddress) &&\n !isRecipientDomainResolving\n ) {\n const name = isUDAddress ? 'Unstoppable domain' : 'Ethereum Name Service'\n return {\n success: false,\n message: `You're trying to send to an unknown ${name}. If you really trust the person who gave it to you, confirm using the checkbox below.`\n }\n }\n\n if (isRecipientAddressUnknown && addressConfirmed && isSWWarningVisible && !isSWWarningAgreed) {\n return {\n success: false,\n message: 'Please confirm that the recipient address is not an exchange.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendTransferAmount = (\n amount: string,\n maxAmount: number,\n maxAmountInFiat: number,\n selectedAsset: TokenResult\n): ValidateReturnType => {\n const sanitizedAmount = getSanitizedAmount(amount, selectedAsset.decimals)\n\n if (!(sanitizedAmount && sanitizedAmount.length)) {\n return {\n success: false,\n message: ''\n }\n }\n\n if (!(sanitizedAmount && Number(sanitizedAmount) > 0)) {\n return {\n success: false,\n message: 'The amount must be greater than 0.'\n }\n }\n\n try {\n if (sanitizedAmount && selectedAsset && selectedAsset.decimals) {\n if (Number(sanitizedAmount) < 1 / 10 ** selectedAsset.decimals)\n return {\n success: false,\n message: 'Token amount too low.'\n }\n\n const currentAmount: bigint = parseUnits(sanitizedAmount, selectedAsset.decimals)\n\n if (currentAmount > getTokenAmount(selectedAsset)) {\n return {\n success: false,\n message: `The amount is greater than the asset's balance: ${Number(maxAmount) || 0} ${\n selectedAsset?.symbol\n }${maxAmountInFiat ? `/ ${Number(maxAmountInFiat)} USD.` : ''}`\n }\n }\n }\n } catch (e) {\n console.error(e)\n\n return {\n success: false,\n message: 'Invalid amount.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst validateSendNftAddress = (\n address: string,\n selectedAcc: any,\n addressConfirmed: any,\n isRecipientAddressUnknown: boolean,\n isRecipientHumanizerKnownTokenOrSmartContract: boolean,\n metadata: any,\n selectedNetwork: any,\n network: any,\n isUDAddress: boolean,\n isEnsAddress: boolean,\n isRecipientDomainResolving: boolean\n): ValidateReturnType => {\n const isValidAddr = validateSendTransferAddress(\n address,\n selectedAcc,\n addressConfirmed,\n isRecipientAddressUnknown,\n isRecipientHumanizerKnownTokenOrSmartContract,\n isUDAddress,\n isEnsAddress,\n isRecipientDomainResolving\n )\n if (!isValidAddr.success) return isValidAddr\n\n if (\n metadata &&\n selectedAcc &&\n metadata.owner?.address.toLowerCase() !== selectedAcc.toLowerCase()\n ) {\n return {\n success: false,\n message: \"The NFT you're trying to send is not owned by you!\"\n }\n }\n\n if (selectedNetwork && network && selectedNetwork.id !== network) {\n return {\n success: false,\n message: 'The selected network is not the correct one.'\n }\n }\n\n return { success: true, message: '' }\n}\n\nconst isValidCode = (code: string) => code.length === 6\n\nconst isValidPassword = (password: string) => password.length >= 8\n\nfunction isValidURL(url: string) {\n const urlRegex =\n /^(?:https?|ftp):\\/\\/(?:\\w+:{0,1}\\w*@)?(?:\\S+)(?::\\d+)?(?:\\/|\\/(?:[\\w#!:.?+=&%@!\\-\\/]))?$/\n\n return urlRegex.test(url)\n}\n\nexport {\n isEmail,\n validateAddAuthSignerAddress,\n validateSendTransferAddress,\n validateSendTransferAmount,\n validateSendNftAddress,\n isValidCode,\n isValidPassword,\n isValidURL\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/accounts.js b/dist/src/utils/accounts.js index 60db53655..37785760a 100644 --- a/dist/src/utils/accounts.js +++ b/dist/src/utils/accounts.js @@ -1,5 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getIsViewOnly = void 0; const getIsViewOnly = (keys, accountKeys) => { return keys.every((k) => !accountKeys.includes(k.addr)); }; -export { getIsViewOnly }; +exports.getIsViewOnly = getIsViewOnly; //# sourceMappingURL=accounts.js.map \ No newline at end of file diff --git a/dist/src/utils/accounts.js.map b/dist/src/utils/accounts.js.map index e6ea4ebf7..5c64694bf 100644 --- a/dist/src/utils/accounts.js.map +++ b/dist/src/utils/accounts.js.map @@ -1 +1 @@ -{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,WAAqB,EAAE,EAAE;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,CAAA","sourcesContent":["import { Key } from 'interfaces/keystore'\n\nconst getIsViewOnly = (keys: Key[], accountKeys: string[]) => {\n return keys.every((k) => !accountKeys.includes(k.addr))\n}\n\nexport { getIsViewOnly }\n"]} \ No newline at end of file +{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,WAAqB,EAAE,EAAE;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA;AAEQ,sCAAa","sourcesContent":["import { Key } from 'interfaces/keystore'\n\nconst getIsViewOnly = (keys: Key[], accountKeys: string[]) => {\n return keys.every((k) => !accountKeys.includes(k.addr))\n}\n\nexport { getIsViewOnly }\n"]} \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.js b/dist/src/utils/addHexPrefix.js index bfeac9e0f..e110f3c43 100644 --- a/dist/src/utils/addHexPrefix.js +++ b/dist/src/utils/addHexPrefix.js @@ -1,11 +1,15 @@ -import { isHexPrefixed } from './isHexPrefixed'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addHexPrefix = void 0; +const isHexPrefixed_1 = require("./isHexPrefixed"); /** * Adds "0x" to a given `String` if it does not already start with "0x". */ -export const addHexPrefix = (str) => { +const addHexPrefix = (str) => { if (typeof str !== 'string') { return str; } - return isHexPrefixed(str) ? str : `0x${str}`; + return (0, isHexPrefixed_1.isHexPrefixed)(str) ? str : `0x${str}`; }; +exports.addHexPrefix = addHexPrefix; //# sourceMappingURL=addHexPrefix.js.map \ No newline at end of file diff --git a/dist/src/utils/addHexPrefix.js.map b/dist/src/utils/addHexPrefix.js.map index f6daa5537..4c18f4681 100644 --- a/dist/src/utils/addHexPrefix.js.map +++ b/dist/src/utils/addHexPrefix.js.map @@ -1 +1 @@ -{"version":3,"file":"addHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/addHexPrefix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,OAAO,GAAG,CAAA;KACX;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Adds \"0x\" to a given `String` if it does not already start with \"0x\".\n */\nexport const addHexPrefix = (str: string) => {\n if (typeof str !== 'string') {\n return str\n }\n\n return isHexPrefixed(str) ? str : `0x${str}`\n}\n"]} \ No newline at end of file +{"version":3,"file":"addHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/addHexPrefix.ts"],"names":[],"mappings":";;;AAAA,mDAA+C;AAE/C;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,OAAO,GAAG,CAAA;KACX;IAED,OAAO,IAAA,6BAAa,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;AAC9C,CAAC,CAAA;AANY,QAAA,YAAY,gBAMxB","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Adds \"0x\" to a given `String` if it does not already start with \"0x\".\n */\nexport const addHexPrefix = (str: string) => {\n if (typeof str !== 'string') {\n return str\n }\n\n return isHexPrefixed(str) ? str : `0x${str}`\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/benzin.js b/dist/src/utils/benzin.js index d76cedc93..3c55f55f1 100644 --- a/dist/src/utils/benzin.js +++ b/dist/src/utils/benzin.js @@ -1,8 +1,11 @@ -import { isIdentifiedByRelayer, isIdentifiedByUserOpHash } from '../libs/accountOp/submittedAccountOp'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getBenzinUrlParams = void 0; +const submittedAccountOp_1 = require("../libs/accountOp/submittedAccountOp"); const getBenzinUrlParams = ({ chainId, txnId, identifiedBy, isInternal }) => { - const userOpHash = identifiedBy && isIdentifiedByUserOpHash(identifiedBy) ? identifiedBy.identifier : undefined; - const relayerId = identifiedBy && isIdentifiedByRelayer(identifiedBy) ? identifiedBy.identifier : undefined; + const userOpHash = identifiedBy && (0, submittedAccountOp_1.isIdentifiedByUserOpHash)(identifiedBy) ? identifiedBy.identifier : undefined; + const relayerId = identifiedBy && (0, submittedAccountOp_1.isIdentifiedByRelayer)(identifiedBy) ? identifiedBy.identifier : undefined; return `?chainId=${String(chainId)}${txnId ? `&txnId=${txnId}` : ''}${userOpHash ? `&userOpHash=${userOpHash}` : ''}${relayerId ? `&relayerId=${relayerId}` : ''}${identifiedBy?.bundler ? `&bundler=${identifiedBy?.bundler}` : ''}${isInternal ? '&isInternal' : ''}`; }; -export { getBenzinUrlParams }; +exports.getBenzinUrlParams = getBenzinUrlParams; //# sourceMappingURL=benzin.js.map \ No newline at end of file diff --git a/dist/src/utils/benzin.js.map b/dist/src/utils/benzin.js.map index ff73292e7..7dd434b80 100644 --- a/dist/src/utils/benzin.js.map +++ b/dist/src/utils/benzin.js.map @@ -1 +1 @@ -{"version":3,"file":"benzin.js","sourceRoot":"","sources":["../../../src/utils/benzin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,sCAAsC,CAAA;AAE7C,MAAM,kBAAkB,GAAG,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EAMX,EAAU,EAAE;IACX,MAAM,UAAU,GACd,YAAY,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE9F,MAAM,SAAS,GACb,YAAY,IAAI,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3F,OAAO,YAAY,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GACjE,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC,CAAC,EAC7C,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAC3C,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAChE,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACtC,CAAC,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA","sourcesContent":["import {\n AccountOpIdentifiedBy,\n isIdentifiedByRelayer,\n isIdentifiedByUserOpHash\n} from '../libs/accountOp/submittedAccountOp'\n\nconst getBenzinUrlParams = ({\n chainId,\n txnId,\n identifiedBy,\n isInternal\n}: {\n chainId?: string | number | bigint\n txnId?: string | null\n identifiedBy?: AccountOpIdentifiedBy\n isInternal?: boolean\n}): string => {\n const userOpHash =\n identifiedBy && isIdentifiedByUserOpHash(identifiedBy) ? identifiedBy.identifier : undefined\n\n const relayerId =\n identifiedBy && isIdentifiedByRelayer(identifiedBy) ? identifiedBy.identifier : undefined\n\n return `?chainId=${String(chainId)}${txnId ? `&txnId=${txnId}` : ''}${\n userOpHash ? `&userOpHash=${userOpHash}` : ''\n }${relayerId ? `&relayerId=${relayerId}` : ''}${\n identifiedBy?.bundler ? `&bundler=${identifiedBy?.bundler}` : ''\n }${isInternal ? '&isInternal' : ''}`\n}\n\nexport { getBenzinUrlParams }\n"]} \ No newline at end of file +{"version":3,"file":"benzin.js","sourceRoot":"","sources":["../../../src/utils/benzin.ts"],"names":[],"mappings":";;;AAAA,6EAI6C;AAE7C,MAAM,kBAAkB,GAAG,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EAMX,EAAU,EAAE;IACX,MAAM,UAAU,GACd,YAAY,IAAI,IAAA,6CAAwB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE9F,MAAM,SAAS,GACb,YAAY,IAAI,IAAA,0CAAqB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3F,OAAO,YAAY,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GACjE,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC,CAAC,EAC7C,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAC3C,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAChE,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACtC,CAAC,CAAA;AAEQ,gDAAkB","sourcesContent":["import {\n AccountOpIdentifiedBy,\n isIdentifiedByRelayer,\n isIdentifiedByUserOpHash\n} from '../libs/accountOp/submittedAccountOp'\n\nconst getBenzinUrlParams = ({\n chainId,\n txnId,\n identifiedBy,\n isInternal\n}: {\n chainId?: string | number | bigint\n txnId?: string | null\n identifiedBy?: AccountOpIdentifiedBy\n isInternal?: boolean\n}): string => {\n const userOpHash =\n identifiedBy && isIdentifiedByUserOpHash(identifiedBy) ? identifiedBy.identifier : undefined\n\n const relayerId =\n identifiedBy && isIdentifiedByRelayer(identifiedBy) ? identifiedBy.identifier : undefined\n\n return `?chainId=${String(chainId)}${txnId ? `&txnId=${txnId}` : ''}${\n userOpHash ? `&userOpHash=${userOpHash}` : ''\n }${relayerId ? `&relayerId=${relayerId}` : ''}${\n identifiedBy?.bundler ? `&bundler=${identifiedBy?.bundler}` : ''\n }${isInternal ? '&isInternal' : ''}`\n}\n\nexport { getBenzinUrlParams }\n"]} \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.js b/dist/src/utils/formatDecimals/formatDecimals.js index 10cb46fe3..a31040d8e 100644 --- a/dist/src/utils/formatDecimals/formatDecimals.js +++ b/dist/src/utils/formatDecimals/formatDecimals.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const DEFAULT_DECIMALS = 2; const DECIMAL_RULES = { value: { @@ -95,5 +97,5 @@ const formatDecimals = (value = undefined, type = 'default') => { const decimals = indexOfFirstNonZero + DECIMAL_RULES[type].max; return formatNumber(absoluteValue, withDollarPrefix, decimals, sign, type); }; -export default formatDecimals; +exports.default = formatDecimals; //# sourceMappingURL=formatDecimals.js.map \ No newline at end of file diff --git a/dist/src/utils/formatDecimals/formatDecimals.js.map b/dist/src/utils/formatDecimals/formatDecimals.js.map index b8dd047c1..518c1e538 100644 --- a/dist/src/utils/formatDecimals/formatDecimals.js.map +++ b/dist/src/utils/formatDecimals/formatDecimals.js.map @@ -1 +1 @@ -{"version":3,"file":"formatDecimals.js","sourceRoot":"","sources":["../../../../src/utils/formatDecimals/formatDecimals.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAC1B,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP;CACF,CAAA;AACD,MAAM,wBAAwB,GAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAEjE;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAE,cAAsB,CAAC,EAAE,EAAE;IAC1E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAA,CAAC,0DAA0D;IAE3G,IAAI,MAAM,GAAG,UAAU,CAAA;IAEvB,sEAAsE;IACtE,OACE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EACvE;QACA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,4BAA4B;KAC1D;IAED,0EAA0E;IAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;KAC7B;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,gCAAgC,GAAG,CAAC,KAAa,EAAE,IAAgB,EAAE,EAAE;IAC3E,sDAAsD;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3C,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;IAEhF,OAAO,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAA;AACnF,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,iBAA0B,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAEhF,MAAM,YAAY,GAAG,CACnB,KAAa,EACb,gBAAyB,EACzB,QAAgB,EAChB,IAAY,EACZ,IAAgB,EAChB,EAAE;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACrC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjD,4DAA4D;IAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACnD,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9F,MAAM,wBAAwB,GAAG,GAAG,gBAAgB,IAAI,gBAAgB,EAAE,CAAA;IAC1E,MAAM,+BAA+B,GAAG,mBAAmB,CACzD,wBAAwB,EACxB,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;IAED,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,+BAA+B,EAAE,CAAA;AAClF,CAAC,CAAA;AAED,mFAAmF;AACnF,6DAA6D;AAC7D,MAAM,cAAc,GAAG,CAAC,QAA4B,SAAS,EAAE,OAAmB,SAAS,EAAE,EAAE;IAC7F,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAEtE,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAA;QAE/D,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAA;KAC5C;IACD,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAA;IAE3E,qEAAqE;IACrE,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAEjC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,IAAI,aAAa,GAAG,IAAI,EAAE;YACxB,OAAO,GAAG,IAAI,QAAQ,CAAA;SACvB;QAED,OAAO,YAAY,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;KACnF;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,IAAI,aAAa,GAAG,OAAO,EAAE;YAC3B,OAAO,GAAG,IAAI,UAAU,CAAA;SACzB;KACF;IAED,MAAM,mBAAmB,GAAG,gCAAgC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAEzE,MAAM,QAAQ,GAAG,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IAE9D,OAAO,YAAY,CAAC,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC5E,CAAC,CAAA;AAED,eAAe,cAAc,CAAA","sourcesContent":["type FormatType = 'value' | 'price' | 'amount' | 'default' | 'precise'\n\nconst DEFAULT_DECIMALS = 2\nconst DECIMAL_RULES = {\n value: {\n min: 2,\n max: 2\n },\n price: {\n min: 2,\n max: 2\n },\n amount: {\n min: 0,\n max: 2\n },\n default: {\n min: 0,\n max: 2\n },\n precise: {\n min: 0,\n max: 8\n }\n}\nconst TYPES_WITH_DOLLAR_PREFIX: FormatType[] = ['value', 'price']\n\n/**\n * Removes trailing zeros from a decimal string.\n * @example\n * removeTrailingZeros('1.0500') // '1.05'\n */\nconst removeTrailingZeros = (decimalStr: string, minDecimals: number = 0) => {\n if (!decimalStr.includes('.')) return decimalStr // If there's no decimal point, return the original string\n\n let result = decimalStr\n\n // Loop from the end of the string until a non-zero character is found\n while (\n result.endsWith('0') &&\n (!minDecimals || result.length - 1 - result.indexOf('.') > minDecimals)\n ) {\n result = result.slice(0, -1) // Remove the last character\n }\n\n // If the string ends with a decimal point after removing zeros, remove it\n if (result.endsWith('.')) {\n result = result.slice(0, -1)\n }\n\n return result\n}\n\nconst getIndexOfFirstNonZeroInDecimals = (value: number, type: FormatType) => {\n // Fixes scientific notation when converting to string\n const decimalValue = value.toFixed(value < 1 ? 16 : 2)\n const valueString = decimalValue.toString()\n const indexOfDot = valueString.indexOf('.')\n if (indexOfDot === -1) return 0\n const decimals = valueString.slice(indexOfDot + 1)\n const indexOfFirstNonZero = decimals.split('').findIndex((char) => char !== '0')\n\n return indexOfFirstNonZero === -1 ? DECIMAL_RULES[type].min : indexOfFirstNonZero\n}\n\nconst getPrefix = (widthDollarPrefix: boolean) => (widthDollarPrefix ? '$' : '')\n\nconst formatNumber = (\n value: number,\n withDollarPrefix: boolean,\n decimals: number,\n sign: string,\n type: FormatType\n) => {\n const stringValue = value.toFixed(16)\n const [integer, decimal] = stringValue.split('.')\n // Display the number with the determined number of decimals\n const decimalFormatted = decimal.slice(0, decimals)\n // Add commas to the integer part of the number. E.g. 1000 -> 1,000\n const integerFormatted = Number(integer).toLocaleString('en-US', { maximumFractionDigits: 0 })\n const reconstructedStringValue = `${integerFormatted}.${decimalFormatted}`\n const stringValueWithoutTrailingZeros = removeTrailingZeros(\n reconstructedStringValue,\n type ? DECIMAL_RULES[type].min : undefined\n )\n\n return `${sign}${getPrefix(withDollarPrefix)}${stringValueWithoutTrailingZeros}`\n}\n\n// A function that formats a number to a string with a specific number of decimals.\n// Based on the passed type it will add a dollar sign prefix.\nconst formatDecimals = (value: number | undefined = undefined, type: FormatType = 'default') => {\n const withDollarPrefix = TYPES_WITH_DOLLAR_PREFIX.includes(type || '')\n\n if (value === 0) {\n if (type === 'amount') return `${getPrefix(withDollarPrefix)}0`\n\n return `${getPrefix(withDollarPrefix)}0.00`\n }\n if (!value || Number.isNaN(value)) return `${getPrefix(withDollarPrefix)}-`\n\n // The absolute value is used to determine the number of decimals and\n // then the actual value is formatted with the determined number of decimals.\n const absoluteValue = Math.abs(value)\n const sign = value < 0 ? '-' : ''\n\n if (type === 'value') {\n if (absoluteValue < 0.01) {\n return `${sign}<$0.01`\n }\n\n return formatNumber(absoluteValue, withDollarPrefix, DEFAULT_DECIMALS, sign, type)\n }\n\n if (type === 'amount') {\n if (absoluteValue < 0.00001) {\n return `${sign}<0.00001`\n }\n }\n\n const indexOfFirstNonZero = getIndexOfFirstNonZeroInDecimals(value, type)\n\n const decimals = indexOfFirstNonZero + DECIMAL_RULES[type].max\n\n return formatNumber(absoluteValue, withDollarPrefix, decimals, sign, type)\n}\n\nexport default formatDecimals\n"]} \ No newline at end of file +{"version":3,"file":"formatDecimals.js","sourceRoot":"","sources":["../../../../src/utils/formatDecimals/formatDecimals.ts"],"names":[],"mappings":"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","sourcesContent":["type FormatType = 'value' | 'price' | 'amount' | 'default' | 'precise'\n\nconst DEFAULT_DECIMALS = 2\nconst DECIMAL_RULES = {\n value: {\n min: 2,\n max: 2\n },\n price: {\n min: 2,\n max: 2\n },\n amount: {\n min: 0,\n max: 2\n },\n default: {\n min: 0,\n max: 2\n },\n precise: {\n min: 0,\n max: 8\n }\n}\nconst TYPES_WITH_DOLLAR_PREFIX: FormatType[] = ['value', 'price']\n\n/**\n * Removes trailing zeros from a decimal string.\n * @example\n * removeTrailingZeros('1.0500') // '1.05'\n */\nconst removeTrailingZeros = (decimalStr: string, minDecimals: number = 0) => {\n if (!decimalStr.includes('.')) return decimalStr // If there's no decimal point, return the original string\n\n let result = decimalStr\n\n // Loop from the end of the string until a non-zero character is found\n while (\n result.endsWith('0') &&\n (!minDecimals || result.length - 1 - result.indexOf('.') > minDecimals)\n ) {\n result = result.slice(0, -1) // Remove the last character\n }\n\n // If the string ends with a decimal point after removing zeros, remove it\n if (result.endsWith('.')) {\n result = result.slice(0, -1)\n }\n\n return result\n}\n\nconst getIndexOfFirstNonZeroInDecimals = (value: number, type: FormatType) => {\n // Fixes scientific notation when converting to string\n const decimalValue = value.toFixed(value < 1 ? 16 : 2)\n const valueString = decimalValue.toString()\n const indexOfDot = valueString.indexOf('.')\n if (indexOfDot === -1) return 0\n const decimals = valueString.slice(indexOfDot + 1)\n const indexOfFirstNonZero = decimals.split('').findIndex((char) => char !== '0')\n\n return indexOfFirstNonZero === -1 ? DECIMAL_RULES[type].min : indexOfFirstNonZero\n}\n\nconst getPrefix = (widthDollarPrefix: boolean) => (widthDollarPrefix ? '$' : '')\n\nconst formatNumber = (\n value: number,\n withDollarPrefix: boolean,\n decimals: number,\n sign: string,\n type: FormatType\n) => {\n const stringValue = value.toFixed(16)\n const [integer, decimal] = stringValue.split('.')\n // Display the number with the determined number of decimals\n const decimalFormatted = decimal.slice(0, decimals)\n // Add commas to the integer part of the number. E.g. 1000 -> 1,000\n const integerFormatted = Number(integer).toLocaleString('en-US', { maximumFractionDigits: 0 })\n const reconstructedStringValue = `${integerFormatted}.${decimalFormatted}`\n const stringValueWithoutTrailingZeros = removeTrailingZeros(\n reconstructedStringValue,\n type ? DECIMAL_RULES[type].min : undefined\n )\n\n return `${sign}${getPrefix(withDollarPrefix)}${stringValueWithoutTrailingZeros}`\n}\n\n// A function that formats a number to a string with a specific number of decimals.\n// Based on the passed type it will add a dollar sign prefix.\nconst formatDecimals = (value: number | undefined = undefined, type: FormatType = 'default') => {\n const withDollarPrefix = TYPES_WITH_DOLLAR_PREFIX.includes(type || '')\n\n if (value === 0) {\n if (type === 'amount') return `${getPrefix(withDollarPrefix)}0`\n\n return `${getPrefix(withDollarPrefix)}0.00`\n }\n if (!value || Number.isNaN(value)) return `${getPrefix(withDollarPrefix)}-`\n\n // The absolute value is used to determine the number of decimals and\n // then the actual value is formatted with the determined number of decimals.\n const absoluteValue = Math.abs(value)\n const sign = value < 0 ? '-' : ''\n\n if (type === 'value') {\n if (absoluteValue < 0.01) {\n return `${sign}<$0.01`\n }\n\n return formatNumber(absoluteValue, withDollarPrefix, DEFAULT_DECIMALS, sign, type)\n }\n\n if (type === 'amount') {\n if (absoluteValue < 0.00001) {\n return `${sign}<0.00001`\n }\n }\n\n const indexOfFirstNonZero = getIndexOfFirstNonZeroInDecimals(value, type)\n\n const decimals = indexOfFirstNonZero + DECIMAL_RULES[type].max\n\n return formatNumber(absoluteValue, withDollarPrefix, decimals, sign, type)\n}\n\nexport default formatDecimals\n"]} \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.js b/dist/src/utils/generateSpoofSig.js index 3dc6ec5b5..ea4e91450 100644 --- a/dist/src/utils/generateSpoofSig.js +++ b/dist/src/utils/generateSpoofSig.js @@ -1,9 +1,11 @@ -import { AbiCoder } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); const generateSpoofSig = (signer) => { const SPOOF_SIGTYPE = '03'; - const abiCoder = new AbiCoder(); + const abiCoder = new ethers_1.AbiCoder(); const signature = abiCoder.encode(['address'], [signer]) + SPOOF_SIGTYPE; return signature; }; -export default generateSpoofSig; +exports.default = generateSpoofSig; //# sourceMappingURL=generateSpoofSig.js.map \ No newline at end of file diff --git a/dist/src/utils/generateSpoofSig.js.map b/dist/src/utils/generateSpoofSig.js.map index 5897d34e1..8f7a0f91c 100644 --- a/dist/src/utils/generateSpoofSig.js.map +++ b/dist/src/utils/generateSpoofSig.js.map @@ -1 +1 @@ -{"version":3,"file":"generateSpoofSig.js","sourceRoot":"","sources":["../../../src/utils/generateSpoofSig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAA;IAC1B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAA;IAExE,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,eAAe,gBAAgB,CAAA","sourcesContent":["import { AbiCoder } from 'ethers'\n\nconst generateSpoofSig = (signer: string) => {\n const SPOOF_SIGTYPE = '03'\n const abiCoder = new AbiCoder()\n const signature = abiCoder.encode(['address'], [signer]) + SPOOF_SIGTYPE\n\n return signature\n}\n\nexport default generateSpoofSig\n"]} \ No newline at end of file +{"version":3,"file":"generateSpoofSig.js","sourceRoot":"","sources":["../../../src/utils/generateSpoofSig.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAA;IAC1B,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAA;IAExE,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,kBAAe,gBAAgB,CAAA","sourcesContent":["import { AbiCoder } from 'ethers'\n\nconst generateSpoofSig = (signer: string) => {\n const SPOOF_SIGTYPE = '03'\n const abiCoder = new AbiCoder()\n const signature = abiCoder.encode(['address'], [signer]) + SPOOF_SIGTYPE\n\n return signature\n}\n\nexport default generateSpoofSig\n"]} \ No newline at end of file diff --git a/dist/src/utils/hdPath.js b/dist/src/utils/hdPath.js index e71205d8e..8091d3bfb 100644 --- a/dist/src/utils/hdPath.js +++ b/dist/src/utils/hdPath.js @@ -1,8 +1,12 @@ -export const getHdPathFromTemplate = (hdPathTemplate, index) => { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHDPathIndices = exports.getHdPathFromTemplate = void 0; +const getHdPathFromTemplate = (hdPathTemplate, index) => { return hdPathTemplate.replace('', index.toString()); }; +exports.getHdPathFromTemplate = getHdPathFromTemplate; const HARDENED_OFFSET = 0x80000000; -export const getHDPathIndices = (hdPathTemplate, insertIdx = 0) => { +const getHDPathIndices = (hdPathTemplate, insertIdx = 0) => { const path = hdPathTemplate.split('/').slice(1); const indices = []; let usedX = false; @@ -35,4 +39,5 @@ export const getHDPathIndices = (hdPathTemplate, insertIdx = 0) => { throw new Error('Only HD paths with up to 5 indices are allowed.'); return indices; }; +exports.getHDPathIndices = getHDPathIndices; //# sourceMappingURL=hdPath.js.map \ No newline at end of file diff --git a/dist/src/utils/hdPath.js.map b/dist/src/utils/hdPath.js.map index 046fa1506..735ec5039 100644 --- a/dist/src/utils/hdPath.js.map +++ b/dist/src/utils/hdPath.js.map @@ -1 +1 @@ -{"version":3,"file":"hdPath.js","sourceRoot":"","sources":["../../../src/utils/hdPath.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,cAAqC,EAAE,KAAa,EAAE,EAAE;IAC5F,OAAO,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,UAAU,CAAA;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,cAAqC,EAAE,SAAS,GAAG,CAAC,EAAE,EAAE;IACvF,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAA;QAChD,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,8EAA8E;QAC9E,uEAAuE;QACvE,6EAA6E;QAC7E,qBAAqB;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE;YAClC,GAAG,IAAI,SAAS,CAAA;YAChB,KAAK,GAAG,IAAI,CAAA;SACb;aAAM,IAAI,UAAU,EAAE;YACrB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;SAC9C;aAAM;YACL,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;SACpB;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,gFAAgF;IAChF,kCAAkC;IAClC,IAAI,KAAK,KAAK,KAAK,EAAE;QACnB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;KACxB;IACD,uEAAuE;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC1F,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\n\nexport const getHdPathFromTemplate = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, index: number) => {\n return hdPathTemplate.replace('', index.toString())\n}\n\nconst HARDENED_OFFSET = 0x80000000\nexport const getHDPathIndices = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, insertIdx = 0) => {\n const path = hdPathTemplate.split('/').slice(1)\n const indices = []\n let usedX = false\n path.forEach((_idx) => {\n const isHardened = _idx[_idx.length - 1] === \"'\"\n let idx = isHardened ? HARDENED_OFFSET : 0\n // If there is an `` in the path string, we will use it to insert our\n // index. This is useful for e.g. Ledger Live path. Most paths have the\n // changing index as the last one, so having an `` in the path isn't\n // usually necessary.\n if (_idx.indexOf('') > -1) {\n idx += insertIdx\n usedX = true\n } else if (isHardened) {\n idx += Number(_idx.slice(0, _idx.length - 1))\n } else {\n idx += Number(_idx)\n }\n indices.push(idx)\n })\n // If this path string does not include an ``, we just append the index\n // to the end of the extracted set\n if (usedX === false) {\n indices.push(insertIdx)\n }\n // Sanity check -- Lattice firmware will throw an error for large paths\n if (indices.length > 5) throw new Error('Only HD paths with up to 5 indices are allowed.')\n return indices\n}\n"]} \ No newline at end of file +{"version":3,"file":"hdPath.js","sourceRoot":"","sources":["../../../src/utils/hdPath.ts"],"names":[],"mappings":";;;AAEO,MAAM,qBAAqB,GAAG,CAAC,cAAqC,EAAE,KAAa,EAAE,EAAE;IAC5F,OAAO,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC9D,CAAC,CAAA;AAFY,QAAA,qBAAqB,yBAEjC;AAED,MAAM,eAAe,GAAG,UAAU,CAAA;AAC3B,MAAM,gBAAgB,GAAG,CAAC,cAAqC,EAAE,SAAS,GAAG,CAAC,EAAE,EAAE;IACvF,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAA;QAChD,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,8EAA8E;QAC9E,uEAAuE;QACvE,6EAA6E;QAC7E,qBAAqB;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE;YAClC,GAAG,IAAI,SAAS,CAAA;YAChB,KAAK,GAAG,IAAI,CAAA;SACb;aAAM,IAAI,UAAU,EAAE;YACrB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;SAC9C;aAAM;YACL,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;SACpB;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,gFAAgF;IAChF,kCAAkC;IAClC,IAAI,KAAK,KAAK,KAAK,EAAE;QACnB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;KACxB;IACD,uEAAuE;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC1F,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AA7BY,QAAA,gBAAgB,oBA6B5B","sourcesContent":["import { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\n\nexport const getHdPathFromTemplate = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, index: number) => {\n return hdPathTemplate.replace('', index.toString())\n}\n\nconst HARDENED_OFFSET = 0x80000000\nexport const getHDPathIndices = (hdPathTemplate: HD_PATH_TEMPLATE_TYPE, insertIdx = 0) => {\n const path = hdPathTemplate.split('/').slice(1)\n const indices = []\n let usedX = false\n path.forEach((_idx) => {\n const isHardened = _idx[_idx.length - 1] === \"'\"\n let idx = isHardened ? HARDENED_OFFSET : 0\n // If there is an `` in the path string, we will use it to insert our\n // index. This is useful for e.g. Ledger Live path. Most paths have the\n // changing index as the last one, so having an `` in the path isn't\n // usually necessary.\n if (_idx.indexOf('') > -1) {\n idx += insertIdx\n usedX = true\n } else if (isHardened) {\n idx += Number(_idx.slice(0, _idx.length - 1))\n } else {\n idx += Number(_idx)\n }\n indices.push(idx)\n })\n // If this path string does not include an ``, we just append the index\n // to the end of the extracted set\n if (usedX === false) {\n indices.push(insertIdx)\n }\n // Sanity check -- Lattice firmware will throw an error for large paths\n if (indices.length > 5) throw new Error('Only HD paths with up to 5 indices are allowed.')\n return indices\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.js b/dist/src/utils/hexStringToUint8Array.js index 66cfdf525..1ad7335f7 100644 --- a/dist/src/utils/hexStringToUint8Array.js +++ b/dist/src/utils/hexStringToUint8Array.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function hexStringToUint8Array(hexString) { // Remove '0x' prefix if present if (hexString.startsWith('0x')) { @@ -15,5 +17,5 @@ function hexStringToUint8Array(hexString) { } return uint8Array; } -export default hexStringToUint8Array; +exports.default = hexStringToUint8Array; //# sourceMappingURL=hexStringToUint8Array.js.map \ No newline at end of file diff --git a/dist/src/utils/hexStringToUint8Array.js.map b/dist/src/utils/hexStringToUint8Array.js.map index 852cade2b..dca14652f 100644 --- a/dist/src/utils/hexStringToUint8Array.js.map +++ b/dist/src/utils/hexStringToUint8Array.js.map @@ -1 +1 @@ -{"version":3,"file":"hexStringToUint8Array.js","sourceRoot":"","sources":["../../../src/utils/hexStringToUint8Array.ts"],"names":[],"mappings":"AAAA,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC9B,6CAA6C;QAC7C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KAC/B;IAED,2CAA2C;IAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;KACrE;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAA;KAC9B;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,eAAe,qBAAqB,CAAA","sourcesContent":["function hexStringToUint8Array(hexString: string) {\n // Remove '0x' prefix if present\n if (hexString.startsWith('0x')) {\n // eslint-disable-next-line no-param-reassign\n hexString = hexString.slice(2)\n }\n\n // Ensure the hex string has an even length\n if (hexString.length % 2 !== 0) {\n throw new Error('Hex string must have an even number of characters')\n }\n\n const uint8Array = new Uint8Array(hexString.length / 2)\n\n for (let i = 0; i < hexString.length; i += 2) {\n const byteValue = parseInt(hexString.substr(i, 2), 16)\n uint8Array[i / 2] = byteValue\n }\n\n return uint8Array\n}\n\nexport default hexStringToUint8Array\n"]} \ No newline at end of file +{"version":3,"file":"hexStringToUint8Array.js","sourceRoot":"","sources":["../../../src/utils/hexStringToUint8Array.ts"],"names":[],"mappings":";;AAAA,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC9B,6CAA6C;QAC7C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KAC/B;IAED,2CAA2C;IAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;KACrE;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAA;KAC9B;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,kBAAe,qBAAqB,CAAA","sourcesContent":["function hexStringToUint8Array(hexString: string) {\n // Remove '0x' prefix if present\n if (hexString.startsWith('0x')) {\n // eslint-disable-next-line no-param-reassign\n hexString = hexString.slice(2)\n }\n\n // Ensure the hex string has an even length\n if (hexString.length % 2 !== 0) {\n throw new Error('Hex string must have an even number of characters')\n }\n\n const uint8Array = new Uint8Array(hexString.length / 2)\n\n for (let i = 0; i < hexString.length; i += 2) {\n const byteValue = parseInt(hexString.substr(i, 2), 16)\n uint8Array[i / 2] = byteValue\n }\n\n return uint8Array\n}\n\nexport default hexStringToUint8Array\n"]} \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.js b/dist/src/utils/isHexPrefixed.js index 1bf5a286a..e412a7acb 100644 --- a/dist/src/utils/isHexPrefixed.js +++ b/dist/src/utils/isHexPrefixed.js @@ -1,10 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isHexPrefixed = void 0; /** * Returns a `Boolean` on whether or not the a `String` starts with '0x' */ -export const isHexPrefixed = (str) => { +const isHexPrefixed = (str) => { if (typeof str !== 'string') { throw new Error(`isHexPrefixed \`str\` value must be type 'string', is currently type ${typeof str}`); } return str.slice(0, 2) === '0x'; }; +exports.isHexPrefixed = isHexPrefixed; //# sourceMappingURL=isHexPrefixed.js.map \ No newline at end of file diff --git a/dist/src/utils/isHexPrefixed.js.map b/dist/src/utils/isHexPrefixed.js.map index 1ce48c12e..e36ea7e3c 100644 --- a/dist/src/utils/isHexPrefixed.js.map +++ b/dist/src/utils/isHexPrefixed.js.map @@ -1 +1 @@ -{"version":3,"file":"isHexPrefixed.js","sourceRoot":"","sources":["../../../src/utils/isHexPrefixed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CACb,wEAAwE,OAAO,GAAG,EAAE,CACrF,CAAA;KACF;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;AACjC,CAAC,CAAA","sourcesContent":["/**\n * Returns a `Boolean` on whether or not the a `String` starts with '0x'\n */\nexport const isHexPrefixed = (str: string) => {\n if (typeof str !== 'string') {\n throw new Error(\n `isHexPrefixed \\`str\\` value must be type 'string', is currently type ${typeof str}`\n )\n }\n\n return str.slice(0, 2) === '0x'\n}\n"]} \ No newline at end of file +{"version":3,"file":"isHexPrefixed.js","sourceRoot":"","sources":["../../../src/utils/isHexPrefixed.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CACb,wEAAwE,OAAO,GAAG,EAAE,CACrF,CAAA;KACF;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;AACjC,CAAC,CAAA;AARY,QAAA,aAAa,iBAQzB","sourcesContent":["/**\n * Returns a `Boolean` on whether or not the a `String` starts with '0x'\n */\nexport const isHexPrefixed = (str: string) => {\n if (typeof str !== 'string') {\n throw new Error(\n `isHexPrefixed \\`str\\` value must be type 'string', is currently type ${typeof str}`\n )\n }\n\n return str.slice(0, 2) === '0x'\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.js b/dist/src/utils/isSameAddr.js index e0a06580f..bf695bcd1 100644 --- a/dist/src/utils/isSameAddr.js +++ b/dist/src/utils/isSameAddr.js @@ -1,6 +1,8 @@ -import { getAddress } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ethers_1 = require("ethers"); const isSameAddr = (one, two) => { - return getAddress(one) === getAddress(two); + return (0, ethers_1.getAddress)(one) === (0, ethers_1.getAddress)(two); }; -export default isSameAddr; +exports.default = isSameAddr; //# sourceMappingURL=isSameAddr.js.map \ No newline at end of file diff --git a/dist/src/utils/isSameAddr.js.map b/dist/src/utils/isSameAddr.js.map index ce2779c28..190d93893 100644 --- a/dist/src/utils/isSameAddr.js.map +++ b/dist/src/utils/isSameAddr.js.map @@ -1 +1 @@ -{"version":3,"file":"isSameAddr.js","sourceRoot":"","sources":["../../../src/utils/isSameAddr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;IAC9C,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { getAddress } from 'ethers'\n\nconst isSameAddr = (one: string, two: string) => {\n return getAddress(one) === getAddress(two)\n}\n\nexport default isSameAddr\n"]} \ No newline at end of file +{"version":3,"file":"isSameAddr.js","sourceRoot":"","sources":["../../../src/utils/isSameAddr.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AAEnC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;IAC9C,OAAO,IAAA,mBAAU,EAAC,GAAG,CAAC,KAAK,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,kBAAe,UAAU,CAAA","sourcesContent":["import { getAddress } from 'ethers'\n\nconst isSameAddr = (one: string, two: string) => {\n return getAddress(one) === getAddress(two)\n}\n\nexport default isSameAddr\n"]} \ No newline at end of file diff --git a/dist/src/utils/networks.js b/dist/src/utils/networks.js index 5273f1cdc..6fc667fe5 100644 --- a/dist/src/utils/networks.js +++ b/dist/src/utils/networks.js @@ -1,6 +1,9 @@ -import { JsonRpcProvider } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertToAmbireNetworkFormat = exports.checkIsRpcUrlWorking = exports.rollProviderUrlsAndFindWorking = void 0; +const ethers_1 = require("ethers"); const checkIsRpcUrlWorking = async (rpcUrl) => { - const provider = new JsonRpcProvider(rpcUrl); + const provider = new ethers_1.JsonRpcProvider(rpcUrl); try { await provider.getBlockNumber(); } @@ -11,6 +14,7 @@ const checkIsRpcUrlWorking = async (rpcUrl) => { provider.destroy(); return true; }; +exports.checkIsRpcUrlWorking = checkIsRpcUrlWorking; const rollProviderUrlsAndFindWorking = async (rpcUrls, index) => { const isProviderWorking = await checkIsRpcUrlWorking(rpcUrls[index]); if (isProviderWorking) { @@ -22,6 +26,7 @@ const rollProviderUrlsAndFindWorking = async (rpcUrls, index) => { } return null; }; +exports.rollProviderUrlsAndFindWorking = rollProviderUrlsAndFindWorking; const convertToAmbireNetworkFormat = async (network) => { const freeHttpRpcUrls = network.rpc.filter((rpcUrl) => { const isHttpOrHttps = rpcUrl.startsWith('http'); @@ -75,5 +80,5 @@ const convertToAmbireNetworkFormat = async (network) => { predefined: false }; }; -export { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }; +exports.convertToAmbireNetworkFormat = convertToAmbireNetworkFormat; //# sourceMappingURL=networks.js.map \ No newline at end of file diff --git a/dist/src/utils/networks.js.map b/dist/src/utils/networks.js.map index 097731874..39df5750f 100644 --- a/dist/src/utils/networks.js.map +++ b/dist/src/utils/networks.js.map @@ -1 +1 @@ -{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/utils/networks.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { ChainlistNetwork, Network } from '../interfaces/network'\n\nconst checkIsRpcUrlWorking = async (rpcUrl: string) => {\n const provider = new JsonRpcProvider(rpcUrl)\n\n try {\n await provider.getBlockNumber()\n } catch {\n provider?.destroy()\n return false\n }\n\n provider.destroy()\n\n return true\n}\n\nconst rollProviderUrlsAndFindWorking = async (\n rpcUrls: string[],\n index: number\n): Promise => {\n const isProviderWorking = await checkIsRpcUrlWorking(rpcUrls[index])\n\n if (isProviderWorking) {\n return rpcUrls[index]\n }\n\n const nextIndex = index + 1\n\n if (rpcUrls.length > nextIndex) {\n return rollProviderUrlsAndFindWorking(rpcUrls, nextIndex)\n }\n\n return null\n}\n\nconst convertToAmbireNetworkFormat = async (network: ChainlistNetwork): Promise => {\n const freeHttpRpcUrls = network.rpc.filter((rpcUrl: string) => {\n const isHttpOrHttps = rpcUrl.startsWith('http')\n\n if (!isHttpOrHttps) return false\n\n const isApiKeyRequired = /${.+}/.test(rpcUrl)\n\n return !isApiKeyRequired\n })\n const workingRpcUrl = await rollProviderUrlsAndFindWorking(freeHttpRpcUrls, 0)\n\n let platformId = null\n let nativeAssetId = null\n\n try {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(network.chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n\n // set the coingecko info\n\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n } catch (e) {\n console.error(e)\n // do nothing\n }\n\n return {\n id: network.name.toLowerCase(),\n name: network.name,\n chainId: BigInt(network.chainId),\n rpcUrls: [workingRpcUrl ?? network.rpc[0]],\n explorerUrl: network.explorers[0].url,\n selectedRpcUrl: workingRpcUrl || '',\n platformId,\n nativeAssetId,\n nativeAssetSymbol: network.nativeCurrency.symbol,\n // Not needed for benzin\n hasRelayer: false,\n rpcNoStateOverride: false, // TODO\n reestimateOn: 0,\n areContractsDeployed: false, // TODO\n features: [],\n feeOptions: { is1559: false },\n flagged: false,\n hasSingleton: false,\n iconUrls: [],\n erc4337: { enabled: false, hasPaymaster: false },\n isSAEnabled: false,\n predefined: false\n }\n}\n\nexport { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }\n"]} \ No newline at end of file +{"version":3,"file":"networks.js","sourceRoot":"","sources":["../../../src/utils/networks.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAIxC,MAAM,oBAAoB,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACpD,MAAM,QAAQ,GAAG,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAA;IAE5C,IAAI;QACF,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAA;KAChC;IAAC,MAAM;QACN,QAAQ,EAAE,OAAO,EAAE,CAAA;QACnB,OAAO,KAAK,CAAA;KACb;IAED,QAAQ,CAAC,OAAO,EAAE,CAAA;IAElB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAmFwC,oDAAoB;AAjF7D,MAAM,8BAA8B,GAAG,KAAK,EAC1C,OAAiB,EACjB,KAAa,EACW,EAAE;IAC1B,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAEpE,IAAI,iBAAiB,EAAE;QACrB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAA;KACtB;IAED,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAA;IAE3B,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE;QAC9B,OAAO,8BAA8B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;KAC1D;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAgEQ,wEAA8B;AA9DvC,MAAM,4BAA4B,GAAG,KAAK,EAAE,OAAyB,EAAoB,EAAE;IACzF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;QAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAE/C,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAA;QAEhC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE7C,OAAO,CAAC,gBAAgB,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,MAAM,8BAA8B,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;IAE9E,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,IAAI,aAAa,GAAG,IAAI,CAAA;IAExB,IAAI;QACF,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,2CAA2C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CACrE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACb,KAAK,EAAE,sDAAsD;SAC9D,CAAC,CAAC,CAAA;QAEH,yBAAyB;QAEzB,IAAI,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,EAAE;YAClC,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAA;YACnD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBACxB,UAAU,GAAG,aAAa,CAAC,UAAU,CAAA;gBACrC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAA;aAC5C;SACF;KACF;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,aAAa;KACd;IAED,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;QACrC,cAAc,EAAE,aAAa,IAAI,EAAE;QACnC,UAAU;QACV,aAAa;QACb,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM;QAChD,wBAAwB;QACxB,UAAU,EAAE,KAAK;QACjB,kBAAkB,EAAE,KAAK;QACzB,YAAY,EAAE,CAAC;QACf,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC7B,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE;QAChD,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;KAClB,CAAA;AACH,CAAC,CAAA;AAE8D,oEAA4B","sourcesContent":["import { JsonRpcProvider } from 'ethers'\n\nimport { ChainlistNetwork, Network } from '../interfaces/network'\n\nconst checkIsRpcUrlWorking = async (rpcUrl: string) => {\n const provider = new JsonRpcProvider(rpcUrl)\n\n try {\n await provider.getBlockNumber()\n } catch {\n provider?.destroy()\n return false\n }\n\n provider.destroy()\n\n return true\n}\n\nconst rollProviderUrlsAndFindWorking = async (\n rpcUrls: string[],\n index: number\n): Promise => {\n const isProviderWorking = await checkIsRpcUrlWorking(rpcUrls[index])\n\n if (isProviderWorking) {\n return rpcUrls[index]\n }\n\n const nextIndex = index + 1\n\n if (rpcUrls.length > nextIndex) {\n return rollProviderUrlsAndFindWorking(rpcUrls, nextIndex)\n }\n\n return null\n}\n\nconst convertToAmbireNetworkFormat = async (network: ChainlistNetwork): Promise => {\n const freeHttpRpcUrls = network.rpc.filter((rpcUrl: string) => {\n const isHttpOrHttps = rpcUrl.startsWith('http')\n\n if (!isHttpOrHttps) return false\n\n const isApiKeyRequired = /${.+}/.test(rpcUrl)\n\n return !isApiKeyRequired\n })\n const workingRpcUrl = await rollProviderUrlsAndFindWorking(freeHttpRpcUrls, 0)\n\n let platformId = null\n let nativeAssetId = null\n\n try {\n const coingeckoRequest = await fetch(\n `https://cena.ambire.com/api/v3/platform/${Number(network.chainId)}`\n ).catch(() => ({\n error: 'currently, we cannot fetch the coingecko information'\n }))\n\n // set the coingecko info\n\n if (!('error' in coingeckoRequest)) {\n const coingeckoInfo = await coingeckoRequest.json()\n if (!coingeckoInfo.error) {\n platformId = coingeckoInfo.platformId\n nativeAssetId = coingeckoInfo.nativeAssetId\n }\n }\n } catch (e) {\n console.error(e)\n // do nothing\n }\n\n return {\n id: network.name.toLowerCase(),\n name: network.name,\n chainId: BigInt(network.chainId),\n rpcUrls: [workingRpcUrl ?? network.rpc[0]],\n explorerUrl: network.explorers[0].url,\n selectedRpcUrl: workingRpcUrl || '',\n platformId,\n nativeAssetId,\n nativeAssetSymbol: network.nativeCurrency.symbol,\n // Not needed for benzin\n hasRelayer: false,\n rpcNoStateOverride: false, // TODO\n reestimateOn: 0,\n areContractsDeployed: false, // TODO\n features: [],\n feeOptions: { is1559: false },\n flagged: false,\n hasSingleton: false,\n iconUrls: [],\n erc4337: { enabled: false, hasPaymaster: false },\n isSAEnabled: false,\n predefined: false\n }\n}\n\nexport { rollProviderUrlsAndFindWorking, checkIsRpcUrlWorking, convertToAmbireNetworkFormat }\n"]} \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.js b/dist/src/utils/numbers/formatters.js index c6ca45778..912fc28df 100644 --- a/dist/src/utils/numbers/formatters.js +++ b/dist/src/utils/numbers/formatters.js @@ -1,4 +1,7 @@ -import { formatUnits, parseUnits } from 'ethers'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.safeTokenAmountAndNumberMultiplication = exports.convertTokenPriceToBigInt = void 0; +const ethers_1 = require("ethers"); /** * Converts floating point token price to big int */ @@ -16,14 +19,15 @@ const convertTokenPriceToBigInt = (tokenPrice) => { } // Regular number handling const tokenPriceDecimals = tokenPriceString.split('.')[1]?.length || 0; - const tokenPriceBigInt = parseUnits(tokenPriceString, tokenPriceDecimals); + const tokenPriceBigInt = (0, ethers_1.parseUnits)(tokenPriceString, tokenPriceDecimals); return { tokenPriceBigInt, tokenPriceDecimals }; }; +exports.convertTokenPriceToBigInt = convertTokenPriceToBigInt; const safeTokenAmountAndNumberMultiplication = (amount, decimals, tokenPrice) => { const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice); - return formatUnits(amount * tokenPriceBigInt, + return (0, ethers_1.formatUnits)(amount * tokenPriceBigInt, // Shift the decimal point by the number of decimals in the token price decimals + tokenPriceDecimals); }; -export { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }; +exports.safeTokenAmountAndNumberMultiplication = safeTokenAmountAndNumberMultiplication; //# sourceMappingURL=formatters.js.map \ No newline at end of file diff --git a/dist/src/utils/numbers/formatters.js.map b/dist/src/utils/numbers/formatters.js.map index 516d6c5a5..ada0fee70 100644 --- a/dist/src/utils/numbers/formatters.js.map +++ b/dist/src/utils/numbers/formatters.js.map @@ -1 +1 @@ -{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../src/utils/numbers/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEhD;;GAEG;AACH,MAAM,yBAAyB,GAAG,CAChC,UAAkB,EAIlB,EAAE;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAE3C,+BAA+B;IAC/B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAClC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAE9C,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,yBAAyB,CACtF,MAAM,CAAC,IAAI,CAAC,CACb,CAAA;QAED,OAAO;YACL,gBAAgB;YAChB,kBAAkB,EAAE,YAAY,GAAG,QAAQ;SAC5C,CAAA;KACF;IAED,0BAA0B;IAC1B,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAA;IACtE,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;IAEzE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,sCAAsC,GAAG,CAC7C,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,EAAE;IACF,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAEtF,OAAO,WAAW,CAChB,MAAM,GAAG,gBAAgB;IACzB,uEAAuE;IACvE,QAAQ,GAAG,kBAAkB,CAC9B,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,yBAAyB,EAAE,sCAAsC,EAAE,CAAA","sourcesContent":["import { formatUnits, parseUnits } from 'ethers'\n\n/**\n * Converts floating point token price to big int\n */\nconst convertTokenPriceToBigInt = (\n tokenPrice: number\n): {\n tokenPriceBigInt: bigint\n tokenPriceDecimals: number\n} => {\n const tokenPriceString = String(tokenPrice)\n\n // Scientific notation handling\n if (tokenPriceString.includes('e')) {\n const [base, rawExponent] = tokenPriceString.split('e')\n const exponent = Math.abs(Number(rawExponent))\n\n const { tokenPriceBigInt, tokenPriceDecimals: baseDecimals } = convertTokenPriceToBigInt(\n Number(base)\n )\n\n return {\n tokenPriceBigInt,\n tokenPriceDecimals: baseDecimals + exponent\n }\n }\n\n // Regular number handling\n const tokenPriceDecimals = tokenPriceString.split('.')[1]?.length || 0\n const tokenPriceBigInt = parseUnits(tokenPriceString, tokenPriceDecimals)\n\n return { tokenPriceBigInt, tokenPriceDecimals }\n}\n\nconst safeTokenAmountAndNumberMultiplication = (\n amount: bigint,\n decimals: number,\n tokenPrice: number\n) => {\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n return formatUnits(\n amount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n decimals + tokenPriceDecimals\n )\n}\n\nexport { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }\n"]} \ No newline at end of file +{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../src/utils/numbers/formatters.ts"],"names":[],"mappings":";;;AAAA,mCAAgD;AAEhD;;GAEG;AACH,MAAM,yBAAyB,GAAG,CAChC,UAAkB,EAIlB,EAAE;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAE3C,+BAA+B;IAC/B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAClC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAE9C,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,yBAAyB,CACtF,MAAM,CAAC,IAAI,CAAC,CACb,CAAA;QAED,OAAO;YACL,gBAAgB;YAChB,kBAAkB,EAAE,YAAY,GAAG,QAAQ;SAC5C,CAAA;KACF;IAED,0BAA0B;IAC1B,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAA;IACtE,MAAM,gBAAgB,GAAG,IAAA,mBAAU,EAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;IAEzE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAA;AACjD,CAAC,CAAA;AAgBQ,8DAAyB;AAdlC,MAAM,sCAAsC,GAAG,CAC7C,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,EAAE;IACF,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAEtF,OAAO,IAAA,oBAAW,EAChB,MAAM,GAAG,gBAAgB;IACzB,uEAAuE;IACvE,QAAQ,GAAG,kBAAkB,CAC9B,CAAA;AACH,CAAC,CAAA;AAEmC,wFAAsC","sourcesContent":["import { formatUnits, parseUnits } from 'ethers'\n\n/**\n * Converts floating point token price to big int\n */\nconst convertTokenPriceToBigInt = (\n tokenPrice: number\n): {\n tokenPriceBigInt: bigint\n tokenPriceDecimals: number\n} => {\n const tokenPriceString = String(tokenPrice)\n\n // Scientific notation handling\n if (tokenPriceString.includes('e')) {\n const [base, rawExponent] = tokenPriceString.split('e')\n const exponent = Math.abs(Number(rawExponent))\n\n const { tokenPriceBigInt, tokenPriceDecimals: baseDecimals } = convertTokenPriceToBigInt(\n Number(base)\n )\n\n return {\n tokenPriceBigInt,\n tokenPriceDecimals: baseDecimals + exponent\n }\n }\n\n // Regular number handling\n const tokenPriceDecimals = tokenPriceString.split('.')[1]?.length || 0\n const tokenPriceBigInt = parseUnits(tokenPriceString, tokenPriceDecimals)\n\n return { tokenPriceBigInt, tokenPriceDecimals }\n}\n\nconst safeTokenAmountAndNumberMultiplication = (\n amount: bigint,\n decimals: number,\n tokenPrice: number\n) => {\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n return formatUnits(\n amount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n decimals + tokenPriceDecimals\n )\n}\n\nexport { convertTokenPriceToBigInt, safeTokenAmountAndNumberMultiplication }\n"]} \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.js b/dist/src/utils/shortenAddress.js index 30572ca0f..9086ead5d 100644 --- a/dist/src/utils/shortenAddress.js +++ b/dist/src/utils/shortenAddress.js @@ -1,5 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); const shortenAddress = (address, maxLength = 30) => address.length <= maxLength ? address : `${address.slice(0, maxLength / 2 - 1)}...${address.slice(-maxLength / 2 + 2)}`; -export default shortenAddress; +exports.default = shortenAddress; //# sourceMappingURL=shortenAddress.js.map \ No newline at end of file diff --git a/dist/src/utils/shortenAddress.js.map b/dist/src/utils/shortenAddress.js.map index f60c34a4e..1be42c566 100644 --- a/dist/src/utils/shortenAddress.js.map +++ b/dist/src/utils/shortenAddress.js.map @@ -1 +1 @@ -{"version":3,"file":"shortenAddress.js","sourceRoot":"","sources":["../../../src/utils/shortenAddress.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,YAAoB,EAAE,EAAU,EAAE,CACzE,OAAO,CAAC,MAAM,IAAI,SAAS;IACzB,CAAC,CAAC,OAAO;IACT,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;AAErF,eAAe,cAAc,CAAA","sourcesContent":["const shortenAddress = (address: string, maxLength: number = 30): string =>\n address.length <= maxLength\n ? address\n : `${address.slice(0, maxLength / 2 - 1)}...${address.slice(-maxLength / 2 + 2)}`\n\nexport default shortenAddress\n"]} \ No newline at end of file +{"version":3,"file":"shortenAddress.js","sourceRoot":"","sources":["../../../src/utils/shortenAddress.ts"],"names":[],"mappings":";;AAAA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,YAAoB,EAAE,EAAU,EAAE,CACzE,OAAO,CAAC,MAAM,IAAI,SAAS;IACzB,CAAC,CAAC,OAAO;IACT,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;AAErF,kBAAe,cAAc,CAAA","sourcesContent":["const shortenAddress = (address: string, maxLength: number = 30): string =>\n address.length <= maxLength\n ? address\n : `${address.slice(0, maxLength / 2 - 1)}...${address.slice(-maxLength / 2 + 2)}`\n\nexport default shortenAddress\n"]} \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.js b/dist/src/utils/simulationStateOverride.js index e709394ff..d59edd564 100644 --- a/dist/src/utils/simulationStateOverride.js +++ b/dist/src/utils/simulationStateOverride.js @@ -1,23 +1,28 @@ -import { toBeHex } from 'ethers'; -import AmbireAccount from '../../contracts/compiled/AmbireAccount.json'; -import { EOA_SIMULATION_NONCE } from '../consts/deployless'; -import { privSlot } from '../libs/proxyDeploy/deploy'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getEoaSimulationStateOverride = void 0; +const tslib_1 = require("tslib"); +const ethers_1 = require("ethers"); +const AmbireAccount_json_1 = tslib_1.__importDefault(require("../../contracts/compiled/AmbireAccount.json")); +const deployless_1 = require("../consts/deployless"); +const deploy_1 = require("../libs/proxyDeploy/deploy"); /** * * @param accountAddr account address * @returns the state override object required for transaction simulation and estimation */ -export function getEoaSimulationStateOverride(accountAddr) { +function getEoaSimulationStateOverride(accountAddr) { return { [accountAddr]: { - code: AmbireAccount.binRuntime, + code: AmbireAccount_json_1.default.binRuntime, stateDiff: { // if we use 0x00...01 we get a geth bug: "invalid argument 2: hex number with leading zero digits\" - on some RPC providers - [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + [`0x${(0, deploy_1.privSlot)(0, 'address', accountAddr, 'bytes32')}`]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', // any number with leading zeros is not supported on some RPCs - [toBeHex(1, 32)]: EOA_SIMULATION_NONCE + [(0, ethers_1.toBeHex)(1, 32)]: deployless_1.EOA_SIMULATION_NONCE } } }; } +exports.getEoaSimulationStateOverride = getEoaSimulationStateOverride; //# sourceMappingURL=simulationStateOverride.js.map \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.js.map b/dist/src/utils/simulationStateOverride.js.map index 4ace4a3c6..9d89ad3ef 100644 --- a/dist/src/utils/simulationStateOverride.js.map +++ b/dist/src/utils/simulationStateOverride.js.map @@ -1 +1 @@ -{"version":3,"file":"simulationStateOverride.js","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,aAAa,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,OAAO;QACL,CAAC,WAAW,CAAC,EAAE;YACb,IAAI,EAAE,aAAa,CAAC,UAAU;YAC9B,SAAS,EAAE;gBACT,4HAA4H;gBAC5H,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,EACrD,oEAAoE;gBACtE,8DAA8D;gBAC9D,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB;aACvC;SACF;KACF,CAAA;AACH,CAAC","sourcesContent":["import { toBeHex } from 'ethers'\n\nimport AmbireAccount from '../../contracts/compiled/AmbireAccount.json'\nimport { EOA_SIMULATION_NONCE } from '../consts/deployless'\nimport { privSlot } from '../libs/proxyDeploy/deploy'\n\n/**\n *\n * @param accountAddr account address\n * @returns the state override object required for transaction simulation and estimation\n */\nexport function getEoaSimulationStateOverride(accountAddr: string) {\n return {\n [accountAddr]: {\n code: AmbireAccount.binRuntime,\n stateDiff: {\n // if we use 0x00...01 we get a geth bug: \"invalid argument 2: hex number with leading zero digits\\\" - on some RPC providers\n [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]:\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',\n // any number with leading zeros is not supported on some RPCs\n [toBeHex(1, 32)]: EOA_SIMULATION_NONCE\n }\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"simulationStateOverride.js","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAEhC,6GAAuE;AACvE,qDAA2D;AAC3D,uDAAqD;AAErD;;;;GAIG;AACH,SAAgB,6BAA6B,CAAC,WAAmB;IAC/D,OAAO;QACL,CAAC,WAAW,CAAC,EAAE;YACb,IAAI,EAAE,4BAAa,CAAC,UAAU;YAC9B,SAAS,EAAE;gBACT,4HAA4H;gBAC5H,CAAC,KAAK,IAAA,iBAAQ,EAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,EACrD,oEAAoE;gBACtE,8DAA8D;gBAC9D,CAAC,IAAA,gBAAO,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,iCAAoB;aACvC;SACF;KACF,CAAA;AACH,CAAC;AAbD,sEAaC","sourcesContent":["import { toBeHex } from 'ethers'\n\nimport AmbireAccount from '../../contracts/compiled/AmbireAccount.json'\nimport { EOA_SIMULATION_NONCE } from '../consts/deployless'\nimport { privSlot } from '../libs/proxyDeploy/deploy'\n\n/**\n *\n * @param accountAddr account address\n * @returns the state override object required for transaction simulation and estimation\n */\nexport function getEoaSimulationStateOverride(accountAddr: string) {\n return {\n [accountAddr]: {\n code: AmbireAccount.binRuntime,\n stateDiff: {\n // if we use 0x00...01 we get a geth bug: \"invalid argument 2: hex number with leading zero digits\\\" - on some RPC providers\n [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]:\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',\n // any number with leading zeros is not supported on some RPCs\n [toBeHex(1, 32)]: EOA_SIMULATION_NONCE\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.js b/dist/src/utils/stripHexPrefix.js index b7bc41d00..0e2ab47ca 100644 --- a/dist/src/utils/stripHexPrefix.js +++ b/dist/src/utils/stripHexPrefix.js @@ -1,10 +1,14 @@ -import { isHexPrefixed } from './isHexPrefixed'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stripHexPrefix = void 0; +const isHexPrefixed_1 = require("./isHexPrefixed"); /** * Removes '0x' from a given `String` if present */ -export const stripHexPrefix = (str) => { +const stripHexPrefix = (str) => { if (typeof str !== 'string') return str; - return isHexPrefixed(str) ? str.slice(2) : str; + return (0, isHexPrefixed_1.isHexPrefixed)(str) ? str.slice(2) : str; }; +exports.stripHexPrefix = stripHexPrefix; //# sourceMappingURL=stripHexPrefix.js.map \ No newline at end of file diff --git a/dist/src/utils/stripHexPrefix.js.map b/dist/src/utils/stripHexPrefix.js.map index bde7ee38c..91bd81e0d 100644 --- a/dist/src/utils/stripHexPrefix.js.map +++ b/dist/src/utils/stripHexPrefix.js.map @@ -1 +1 @@ -{"version":3,"file":"stripHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/stripHexPrefix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IAEvC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAChD,CAAC,CAAA","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Removes '0x' from a given `String` if present\n */\nexport const stripHexPrefix = (str: string) => {\n if (typeof str !== 'string') return str\n\n return isHexPrefixed(str) ? str.slice(2) : str\n}\n"]} \ No newline at end of file +{"version":3,"file":"stripHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/stripHexPrefix.ts"],"names":[],"mappings":";;;AAAA,mDAA+C;AAE/C;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IAEvC,OAAO,IAAA,6BAAa,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAChD,CAAC,CAAA;AAJY,QAAA,cAAc,kBAI1B","sourcesContent":["import { isHexPrefixed } from './isHexPrefixed'\n\n/**\n * Removes '0x' from a given `String` if present\n */\nexport const stripHexPrefix = (str: string) => {\n if (typeof str !== 'string') return str\n\n return isHexPrefixed(str) ? str.slice(2) : str\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/wait.js b/dist/src/utils/wait.js index e0d69e466..4af0e46d3 100644 --- a/dist/src/utils/wait.js +++ b/dist/src/utils/wait.js @@ -1,6 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable no-promise-executor-return */ function wait(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } -export default wait; +exports.default = wait; //# sourceMappingURL=wait.js.map \ No newline at end of file diff --git a/dist/src/utils/wait.js.map b/dist/src/utils/wait.js.map index 920d23c4f..1ba3063f4 100644 --- a/dist/src/utils/wait.js.map +++ b/dist/src/utils/wait.js.map @@ -1 +1 @@ -{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/utils/wait.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,eAAe,IAAI,CAAA","sourcesContent":["/* eslint-disable no-promise-executor-return */\nfunction wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport default wait\n"]} \ No newline at end of file +{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/utils/wait.ts"],"names":[],"mappings":";;AAAA,+CAA+C;AAC/C,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,kBAAe,IAAI,CAAA","sourcesContent":["/* eslint-disable no-promise-executor-return */\nfunction wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport default wait\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.js b/dist/v1/hooks/useConstants/index.js index a4ed64d41..18f3db4d3 100644 --- a/dist/v1/hooks/useConstants/index.js +++ b/dist/v1/hooks/useConstants/index.js @@ -1,4 +1,7 @@ -import useConstants from './useConstants'; -export * from './types'; -export default useConstants; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +const useConstants_1 = tslib_1.__importDefault(require("./useConstants")); +tslib_1.__exportStar(require("./types"), exports); +exports.default = useConstants_1.default; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/index.js.map b/dist/v1/hooks/useConstants/index.js.map index 4344082e3..30810ef66 100644 --- a/dist/v1/hooks/useConstants/index.js.map +++ b/dist/v1/hooks/useConstants/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC,cAAc,SAAS,CAAA;AACvB,eAAe,YAAY,CAAA","sourcesContent":["import useConstants from './useConstants'\n\nexport * from './types'\nexport default useConstants\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/index.ts"],"names":[],"mappings":";;;AAAA,0EAAyC;AAEzC,kDAAuB;AACvB,kBAAe,sBAAY,CAAA","sourcesContent":["import useConstants from './useConstants'\n\nexport * from './types'\nexport default useConstants\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.js b/dist/v1/hooks/useConstants/types.js index afc796d2a..7b3be07a4 100644 --- a/dist/v1/hooks/useConstants/types.js +++ b/dist/v1/hooks/useConstants/types.js @@ -1,3 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var AbiType; (function (AbiType) { AbiType["Constructor"] = "constructor"; @@ -46,5 +48,4 @@ var StateMutability; StateMutability["Pure"] = "pure"; StateMutability["View"] = "view"; })(StateMutability || (StateMutability = {})); -export {}; //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/types.js.map b/dist/v1/hooks/useConstants/types.js.map index 4a095390d..7c72044dd 100644 --- a/dist/v1/hooks/useConstants/types.js.map +++ b/dist/v1/hooks/useConstants/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/types.ts"],"names":[],"mappings":"AAiFA,IAAK,OAMJ;AAND,WAAK,OAAO;IACV,sCAA2B,CAAA;IAC3B,0BAAe,CAAA;IACf,gCAAqB,CAAA;IACrB,gCAAqB,CAAA;IACrB,8BAAmB,CAAA;AACrB,CAAC,EANI,OAAO,KAAP,OAAO,QAMX;AAeD,IAAK,SA+BJ;AA/BD,WAAK,SAAS;IACZ,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,sCAAyB,CAAA;IACzB,kCAAqB,CAAA;IACrB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;AACrB,CAAC,EA/BI,SAAS,KAAT,SAAS,QA+Bb;AAED,IAAK,eAKJ;AALD,WAAK,eAAe;IAClB,4CAAyB,CAAA;IACzB,sCAAmB,CAAA;IACnB,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EALI,eAAe,KAAf,eAAe,QAKnB","sourcesContent":["export interface UseConstantsProps {\n fetch: any\n endpoint: string\n}\n\nexport interface UseConstantsReturnType {\n constants: ConstantsType | null\n isLoading: boolean\n retryFetch: () => void\n getAdexToStakingTransfersLogs: () => Promise\n hasError: boolean\n}\n\nexport interface AdexToStakingTransfersLogsType {\n jsonrpc: string\n id: number\n result: object[]\n}\n\nexport interface ResultEndpointResponse {\n tokenList: ConstantsType['tokenList']\n humanizerInfo: ConstantsType['humanizerInfo']\n customTokens: ConstantsType['customTokens']\n}\n\n// All the below types are generated with the help of QuickType app.\n// However, they are not directly copy-pasted, but manually wired-up,\n// because the raw generated types were a bit misleading and too specific\n// (expecially for the `HumanizerInfoAbisType`).\n// {@link https://app.quicktype.io/}\nexport interface ConstantsType {\n tokenList: { [key: string]: TokenList[] }\n humanizerInfo: HumanizerInfoType\n lastFetched: number\n customTokens: CustomToken[]\n}\n\ninterface CustomToken {\n id: string\n customPrice: boolean\n symbol: string\n name: string\n image: {\n [key: string]: string\n }\n platforms: {\n [key: string]: string\n }\n contract_address: string\n baseToken: string\n decimals: number\n abi: string\n abiFunction: string\n}\n\ninterface TokenList {\n address: string\n symbol: string\n coingeckoId?: null | string\n decimals?: number\n decmals?: number\n}\n\n// @NOTE humanizer library uses different structure\nexport interface HumanizerInfoType {\n abis: HumanizerInfoAbisType\n tokens: { [key: string]: Array }\n names: { [address: string]: string }\n yearnVaults: Vault[]\n tesseractVaults: Vault[]\n}\n\ninterface Vault {\n name: string\n network: 'ethereum' | 'polygon'\n addr: string\n baseToken: string\n decimals?: number\n abiName?: string\n}\n\nenum AbiType {\n Constructor = 'constructor',\n Event = 'event',\n Fallback = 'fallback',\n Function = 'function',\n Receive = 'receive'\n}\n\ninterface Input {\n indexed?: boolean\n internalType?: string\n name: string\n type: InputType\n components?: Input[]\n}\n\ninterface Output {\n name: string\n type: InputType\n}\n\nenum InputType {\n Address = 'address',\n Address14 = 'address[14]',\n Address20 = 'address[20]',\n Address7 = 'address[7]',\n Bool = 'bool',\n Bytes = 'bytes',\n Bytes32 = 'bytes32',\n Bytes325 = 'bytes32[5]',\n Bytes4 = 'bytes4',\n Int24 = 'int24',\n Int256 = 'int256',\n String = 'string',\n Tuple = 'tuple',\n TypeAddress = 'address[]',\n TypeBytes = 'bytes[]',\n TypeTuple = 'tuple[]',\n TypeUint128 = 'uint128[]',\n TypeUint256 = 'uint256[]',\n Uint128 = 'uint128',\n Uint16 = 'uint16',\n Uint160 = 'uint160',\n Uint24 = 'uint24',\n Uint256 = 'uint256',\n Uint25618 = 'uint256[18]',\n Uint2569 = 'uint256[9]',\n Uint32 = 'uint32',\n Uint40 = 'uint40',\n Uint8 = 'uint8',\n Uint82 = 'uint8[2]',\n Uint88 = 'uint8[8]'\n}\n\nenum StateMutability {\n Nonpayable = 'nonpayable',\n Payable = 'payable',\n Pure = 'pure',\n View = 'view'\n}\n\ninterface HumanizerInfoAbiType {\n constant?: boolean\n payable?: boolean\n anonymous?: boolean\n outputs?: Output[]\n inputs?: Input[]\n stateMutability?: StateMutability\n type: AbiType\n gas?: number\n}\n\ntype HumanizerInfoAbisKeysType =\n | 'AaveWethGatewayV2'\n | 'PancakeRouter'\n | 'UniV2Router'\n | 'UniV3Router'\n | 'UniV3Router2'\n | 'WETH'\n | 'AaveLendingPoolV2'\n | 'MovrRouter'\n | 'MovrAnyswap'\n | 'ERC721'\n | 'YearnVault'\n | 'IdentityFactory'\n | 'Batcher'\n | 'StakingPool'\n | 'WyvernExchange'\n | 'Swappin'\n | 'ERC20'\n | 'SwappinOwn'\n\ntype HumanizerInfoAbisType = {\n [key in HumanizerInfoAbisKeysType]: HumanizerInfoAbiType[]\n}\n"]} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/types.ts"],"names":[],"mappings":";;AAiFA,IAAK,OAMJ;AAND,WAAK,OAAO;IACV,sCAA2B,CAAA;IAC3B,0BAAe,CAAA;IACf,gCAAqB,CAAA;IACrB,gCAAqB,CAAA;IACrB,8BAAmB,CAAA;AACrB,CAAC,EANI,OAAO,KAAP,OAAO,QAMX;AAeD,IAAK,SA+BJ;AA/BD,WAAK,SAAS;IACZ,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,sCAAyB,CAAA;IACzB,kCAAqB,CAAA;IACrB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;AACrB,CAAC,EA/BI,SAAS,KAAT,SAAS,QA+Bb;AAED,IAAK,eAKJ;AALD,WAAK,eAAe;IAClB,4CAAyB,CAAA;IACzB,sCAAmB,CAAA;IACnB,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EALI,eAAe,KAAf,eAAe,QAKnB","sourcesContent":["export interface UseConstantsProps {\n fetch: any\n endpoint: string\n}\n\nexport interface UseConstantsReturnType {\n constants: ConstantsType | null\n isLoading: boolean\n retryFetch: () => void\n getAdexToStakingTransfersLogs: () => Promise\n hasError: boolean\n}\n\nexport interface AdexToStakingTransfersLogsType {\n jsonrpc: string\n id: number\n result: object[]\n}\n\nexport interface ResultEndpointResponse {\n tokenList: ConstantsType['tokenList']\n humanizerInfo: ConstantsType['humanizerInfo']\n customTokens: ConstantsType['customTokens']\n}\n\n// All the below types are generated with the help of QuickType app.\n// However, they are not directly copy-pasted, but manually wired-up,\n// because the raw generated types were a bit misleading and too specific\n// (expecially for the `HumanizerInfoAbisType`).\n// {@link https://app.quicktype.io/}\nexport interface ConstantsType {\n tokenList: { [key: string]: TokenList[] }\n humanizerInfo: HumanizerInfoType\n lastFetched: number\n customTokens: CustomToken[]\n}\n\ninterface CustomToken {\n id: string\n customPrice: boolean\n symbol: string\n name: string\n image: {\n [key: string]: string\n }\n platforms: {\n [key: string]: string\n }\n contract_address: string\n baseToken: string\n decimals: number\n abi: string\n abiFunction: string\n}\n\ninterface TokenList {\n address: string\n symbol: string\n coingeckoId?: null | string\n decimals?: number\n decmals?: number\n}\n\n// @NOTE humanizer library uses different structure\nexport interface HumanizerInfoType {\n abis: HumanizerInfoAbisType\n tokens: { [key: string]: Array }\n names: { [address: string]: string }\n yearnVaults: Vault[]\n tesseractVaults: Vault[]\n}\n\ninterface Vault {\n name: string\n network: 'ethereum' | 'polygon'\n addr: string\n baseToken: string\n decimals?: number\n abiName?: string\n}\n\nenum AbiType {\n Constructor = 'constructor',\n Event = 'event',\n Fallback = 'fallback',\n Function = 'function',\n Receive = 'receive'\n}\n\ninterface Input {\n indexed?: boolean\n internalType?: string\n name: string\n type: InputType\n components?: Input[]\n}\n\ninterface Output {\n name: string\n type: InputType\n}\n\nenum InputType {\n Address = 'address',\n Address14 = 'address[14]',\n Address20 = 'address[20]',\n Address7 = 'address[7]',\n Bool = 'bool',\n Bytes = 'bytes',\n Bytes32 = 'bytes32',\n Bytes325 = 'bytes32[5]',\n Bytes4 = 'bytes4',\n Int24 = 'int24',\n Int256 = 'int256',\n String = 'string',\n Tuple = 'tuple',\n TypeAddress = 'address[]',\n TypeBytes = 'bytes[]',\n TypeTuple = 'tuple[]',\n TypeUint128 = 'uint128[]',\n TypeUint256 = 'uint256[]',\n Uint128 = 'uint128',\n Uint16 = 'uint16',\n Uint160 = 'uint160',\n Uint24 = 'uint24',\n Uint256 = 'uint256',\n Uint25618 = 'uint256[18]',\n Uint2569 = 'uint256[9]',\n Uint32 = 'uint32',\n Uint40 = 'uint40',\n Uint8 = 'uint8',\n Uint82 = 'uint8[2]',\n Uint88 = 'uint8[8]'\n}\n\nenum StateMutability {\n Nonpayable = 'nonpayable',\n Payable = 'payable',\n Pure = 'pure',\n View = 'view'\n}\n\ninterface HumanizerInfoAbiType {\n constant?: boolean\n payable?: boolean\n anonymous?: boolean\n outputs?: Output[]\n inputs?: Input[]\n stateMutability?: StateMutability\n type: AbiType\n gas?: number\n}\n\ntype HumanizerInfoAbisKeysType =\n | 'AaveWethGatewayV2'\n | 'PancakeRouter'\n | 'UniV2Router'\n | 'UniV3Router'\n | 'UniV3Router2'\n | 'WETH'\n | 'AaveLendingPoolV2'\n | 'MovrRouter'\n | 'MovrAnyswap'\n | 'ERC721'\n | 'YearnVault'\n | 'IdentityFactory'\n | 'Batcher'\n | 'StakingPool'\n | 'WyvernExchange'\n | 'Swappin'\n | 'ERC20'\n | 'SwappinOwn'\n\ntype HumanizerInfoAbisType = {\n [key in HumanizerInfoAbisKeysType]: HumanizerInfoAbiType[]\n}\n"]} \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.js b/dist/v1/hooks/useConstants/useConstants.js index fbb5f12d0..4c3ecccff 100644 --- a/dist/v1/hooks/useConstants/useConstants.js +++ b/dist/v1/hooks/useConstants/useConstants.js @@ -1,13 +1,15 @@ -import { useCallback, useEffect, useState } from 'react'; -import { fetchCaught } from '../../services/fetch'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const react_1 = require("react"); +const fetch_1 = require("../../services/fetch"); const useConstants = ({ fetch, endpoint }) => { - const [data, setData] = useState(null); - const [adexToStakingTransfers, setAdexToStakingTransfers] = useState(null); - const [hasError, setHasError] = useState(false); - const [isLoading, setIsLoading] = useState(true); - const fetchConstants = useCallback(async () => { + const [data, setData] = (0, react_1.useState)(null); + const [adexToStakingTransfers, setAdexToStakingTransfers] = (0, react_1.useState)(null); + const [hasError, setHasError] = (0, react_1.useState)(false); + const [isLoading, setIsLoading] = (0, react_1.useState)(true); + const fetchConstants = (0, react_1.useCallback)(async () => { try { - const response = await fetchCaught(fetch, `${endpoint}/result.json`).then((res) => res.body); + const response = await (0, fetch_1.fetchCaught)(fetch, `${endpoint}/result.json`).then((res) => res.body); if (!response) throw new Error('Failed to get the constants.'); const { tokenList, humanizerInfo, customTokens } = response; @@ -28,14 +30,14 @@ const useConstants = ({ fetch, endpoint }) => { setIsLoading(false); } }, [fetch, endpoint]); - useEffect(() => { + (0, react_1.useEffect)(() => { fetchConstants(); }, [fetchConstants]); const getAdexToStakingTransfersLogs = async () => { if (adexToStakingTransfers) return adexToStakingTransfers; try { - const adexToStakingTransfersLogs = await fetchCaught(fetch, `${endpoint}/adexToStakingTransfers.json`).then((res) => res.body || null); + const adexToStakingTransfersLogs = await (0, fetch_1.fetchCaught)(fetch, `${endpoint}/adexToStakingTransfers.json`).then((res) => res.body || null); setAdexToStakingTransfers(adexToStakingTransfersLogs); return adexToStakingTransfersLogs; } @@ -51,5 +53,5 @@ const useConstants = ({ fetch, endpoint }) => { hasError }; }; -export default useConstants; +exports.default = useConstants; //# sourceMappingURL=useConstants.js.map \ No newline at end of file diff --git a/dist/v1/hooks/useConstants/useConstants.js.map b/dist/v1/hooks/useConstants/useConstants.js.map index d8f1a0545..2ad827511 100644 --- a/dist/v1/hooks/useConstants/useConstants.js.map +++ b/dist/v1/hooks/useConstants/useConstants.js.map @@ -1 +1 @@ -{"version":3,"file":"useConstants.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/useConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AASlD,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB,EAA0B,EAAE;IACtF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAA;IAC5D,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GACvD,QAAQ,CAAwC,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAA;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAA;IAEzD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,KAAK,EACL,GAAG,QAAQ,cAAc,CAC1B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAEzB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAE9D,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAA;YAE3D,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC;oBACN,SAAS;oBACT,aAAa;oBACb,YAAY;oBACZ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;iBACxB,CAAC,CAAA;gBACF,WAAW,CAAC,KAAK,CAAC,CAAA;gBAClB,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;SACH;QAAC,OAAO,CAAC,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,CAAA;YACjB,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,YAAY,CAAC,KAAK,CAAC,CAAA;SACpB;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAA;IAClB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAEpB,MAAM,6BAA6B,GAAG,KAAK,IAAI,EAAE;QAC/C,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QAEzD,IAAI;YACF,MAAM,0BAA0B,GAAG,MAAM,WAAW,CAClD,KAAK,EACL,GAAG,QAAQ,8BAA8B,CAC1C,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;YAEjC,yBAAyB,CAAC,0BAA0B,CAAC,CAAA;YACrD,OAAO,0BAA0B,CAAA;SAClC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,IAAI,CAAA;SACZ;IACH,CAAC,CAAA;IAED,OAAO;QACL,SAAS,EAAE,IAAI;QACf,6BAA6B;QAC7B,SAAS;QACT,UAAU,EAAE,cAAc;QAC1B,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AAED,eAAe,YAAY,CAAA","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\n\nimport { fetchCaught } from '../../services/fetch'\nimport {\n AdexToStakingTransfersLogsType,\n ConstantsType,\n ResultEndpointResponse,\n UseConstantsProps,\n UseConstantsReturnType\n} from './types'\n\nconst useConstants = ({ fetch, endpoint }: UseConstantsProps): UseConstantsReturnType => {\n const [data, setData] = useState(null)\n const [adexToStakingTransfers, setAdexToStakingTransfers] =\n useState(null)\n const [hasError, setHasError] = useState(false)\n const [isLoading, setIsLoading] = useState(true)\n\n const fetchConstants = useCallback(async () => {\n try {\n const response = await fetchCaught(\n fetch,\n `${endpoint}/result.json`\n ).then((res) => res.body)\n\n if (!response) throw new Error('Failed to get the constants.')\n\n const { tokenList, humanizerInfo, customTokens } = response\n\n setIsLoading(() => {\n setData({\n tokenList,\n humanizerInfo,\n customTokens,\n lastFetched: Date.now()\n })\n setHasError(false)\n return false\n })\n } catch (e) {\n setHasError(true)\n setData(null)\n setIsLoading(false)\n }\n }, [fetch, endpoint])\n\n useEffect(() => {\n fetchConstants()\n }, [fetchConstants])\n\n const getAdexToStakingTransfersLogs = async () => {\n if (adexToStakingTransfers) return adexToStakingTransfers\n\n try {\n const adexToStakingTransfersLogs = await fetchCaught(\n fetch,\n `${endpoint}/adexToStakingTransfers.json`\n ).then((res) => res.body || null)\n\n setAdexToStakingTransfers(adexToStakingTransfersLogs)\n return adexToStakingTransfersLogs\n } catch (e) {\n return null\n }\n }\n\n return {\n constants: data,\n getAdexToStakingTransfersLogs,\n isLoading,\n retryFetch: fetchConstants,\n hasError\n }\n}\n\nexport default useConstants\n"]} \ No newline at end of file +{"version":3,"file":"useConstants.js","sourceRoot":"","sources":["../../../../v1/hooks/useConstants/useConstants.ts"],"names":[],"mappings":";;AAAA,iCAAwD;AAExD,gDAAkD;AASlD,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB,EAA0B,EAAE;IACtF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAuB,IAAI,CAAC,CAAA;IAC5D,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GACvD,IAAA,gBAAQ,EAAwC,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAA;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAU,IAAI,CAAC,CAAA;IAEzD,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,KAAK,IAAI,EAAE;QAC5C,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAW,EAChC,KAAK,EACL,GAAG,QAAQ,cAAc,CAC1B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAEzB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAE9D,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAA;YAE3D,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC;oBACN,SAAS;oBACT,aAAa;oBACb,YAAY;oBACZ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;iBACxB,CAAC,CAAA;gBACF,WAAW,CAAC,KAAK,CAAC,CAAA;gBAClB,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;SACH;QAAC,OAAO,CAAC,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,CAAA;YACjB,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,YAAY,CAAC,KAAK,CAAC,CAAA;SACpB;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAErB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAA;IAClB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAEpB,MAAM,6BAA6B,GAAG,KAAK,IAAI,EAAE;QAC/C,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QAEzD,IAAI;YACF,MAAM,0BAA0B,GAAG,MAAM,IAAA,mBAAW,EAClD,KAAK,EACL,GAAG,QAAQ,8BAA8B,CAC1C,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;YAEjC,yBAAyB,CAAC,0BAA0B,CAAC,CAAA;YACrD,OAAO,0BAA0B,CAAA;SAClC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,IAAI,CAAA;SACZ;IACH,CAAC,CAAA;IAED,OAAO;QACL,SAAS,EAAE,IAAI;QACf,6BAA6B;QAC7B,SAAS;QACT,UAAU,EAAE,cAAc;QAC1B,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,YAAY,CAAA","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\n\nimport { fetchCaught } from '../../services/fetch'\nimport {\n AdexToStakingTransfersLogsType,\n ConstantsType,\n ResultEndpointResponse,\n UseConstantsProps,\n UseConstantsReturnType\n} from './types'\n\nconst useConstants = ({ fetch, endpoint }: UseConstantsProps): UseConstantsReturnType => {\n const [data, setData] = useState(null)\n const [adexToStakingTransfers, setAdexToStakingTransfers] =\n useState(null)\n const [hasError, setHasError] = useState(false)\n const [isLoading, setIsLoading] = useState(true)\n\n const fetchConstants = useCallback(async () => {\n try {\n const response = await fetchCaught(\n fetch,\n `${endpoint}/result.json`\n ).then((res) => res.body)\n\n if (!response) throw new Error('Failed to get the constants.')\n\n const { tokenList, humanizerInfo, customTokens } = response\n\n setIsLoading(() => {\n setData({\n tokenList,\n humanizerInfo,\n customTokens,\n lastFetched: Date.now()\n })\n setHasError(false)\n return false\n })\n } catch (e) {\n setHasError(true)\n setData(null)\n setIsLoading(false)\n }\n }, [fetch, endpoint])\n\n useEffect(() => {\n fetchConstants()\n }, [fetchConstants])\n\n const getAdexToStakingTransfersLogs = async () => {\n if (adexToStakingTransfers) return adexToStakingTransfers\n\n try {\n const adexToStakingTransfersLogs = await fetchCaught(\n fetch,\n `${endpoint}/adexToStakingTransfers.json`\n ).then((res) => res.body || null)\n\n setAdexToStakingTransfers(adexToStakingTransfersLogs)\n return adexToStakingTransfersLogs\n } catch (e) {\n return null\n }\n }\n\n return {\n constants: data,\n getAdexToStakingTransfersLogs,\n isLoading,\n retryFetch: fetchConstants,\n hasError\n }\n}\n\nexport default useConstants\n"]} \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.js b/dist/v1/services/fetch/fetch.js index 94363a0b1..22e548a10 100644 --- a/dist/v1/services/fetch/fetch.js +++ b/dist/v1/services/fetch/fetch.js @@ -1,4 +1,7 @@ -export async function fetchPost(_fetch, url, body) { +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchCaught = exports.fetchGet = exports.fetchPost = void 0; +async function fetchPost(_fetch, url, body) { const r = await _fetch(url, { headers: { 'content-type': 'application/json' }, method: 'POST', @@ -6,7 +9,8 @@ export async function fetchPost(_fetch, url, body) { }); return r.json(); } -export async function fetchGet(_fetch, url) { +exports.fetchPost = fetchPost; +async function fetchGet(_fetch, url) { const response = await _fetch(url, { method: 'GET', headers: { @@ -17,7 +21,8 @@ export async function fetchGet(_fetch, url) { throw new Error('Failed to fetch'); return response.json(); } -export async function fetchCaught(_fetch, url, params) { +exports.fetchGet = fetchGet; +async function fetchCaught(_fetch, url, params) { let resp; try { resp = await _fetch(url, params); @@ -36,4 +41,5 @@ export async function fetchCaught(_fetch, url, params) { } return { body, resp, errMsg: '' }; } +exports.fetchCaught = fetchCaught; //# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/dist/v1/services/fetch/fetch.js.map b/dist/v1/services/fetch/fetch.js.map index 61b66a613..baac52b1c 100644 --- a/dist/v1/services/fetch/fetch.js.map +++ b/dist/v1/services/fetch/fetch.js.map @@ -1 +1 @@ -{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../v1/services/fetch/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAW,EAAE,GAAW,EAAE,IAAS;IACjE,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IACF,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAW,EAAE,GAAW;IACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAW,EACX,GAAQ,EACR,MAAY;IAMZ,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;KACjC;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAA;KACzD;IACD,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;KACzB;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAA;KAC/E;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACnC,CAAC","sourcesContent":["export async function fetchPost(_fetch: any, url: string, body: any) {\n const r = await _fetch(url, {\n headers: { 'content-type': 'application/json' },\n method: 'POST',\n body: JSON.stringify(body)\n })\n return r.json()\n}\n\nexport async function fetchGet(_fetch: any, url: string) {\n const response = await _fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (response.status !== 200) throw new Error('Failed to fetch')\n return response.json()\n}\n\nexport async function fetchCaught(\n _fetch: any,\n url: any,\n params?: any\n): Promise<{\n body?: R\n resp?: any\n errMsg: string\n}> {\n let resp\n try {\n resp = await _fetch(url, params)\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${e && e.message}` }\n }\n let body\n try {\n body = await resp.json()\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${resp.status}, ${e && e.message}`, resp }\n }\n return { body, resp, errMsg: '' }\n}\n"]} \ No newline at end of file +{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../v1/services/fetch/fetch.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,SAAS,CAAC,MAAW,EAAE,GAAW,EAAE,IAAS;IACjE,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IACF,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AACjB,CAAC;AAPD,8BAOC;AAEM,KAAK,UAAU,QAAQ,CAAC,MAAW,EAAE,GAAW;IACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AATD,4BASC;AAEM,KAAK,UAAU,WAAW,CAC/B,MAAW,EACX,GAAQ,EACR,MAAY;IAMZ,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;KACjC;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAA;KACzD;IACD,IAAI,IAAI,CAAA;IACR,IAAI;QACF,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;KACzB;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,MAAM,EAAE,qBAAqB,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAA;KAC/E;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACnC,CAAC;AAxBD,kCAwBC","sourcesContent":["export async function fetchPost(_fetch: any, url: string, body: any) {\n const r = await _fetch(url, {\n headers: { 'content-type': 'application/json' },\n method: 'POST',\n body: JSON.stringify(body)\n })\n return r.json()\n}\n\nexport async function fetchGet(_fetch: any, url: string) {\n const response = await _fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (response.status !== 200) throw new Error('Failed to fetch')\n return response.json()\n}\n\nexport async function fetchCaught(\n _fetch: any,\n url: any,\n params?: any\n): Promise<{\n body?: R\n resp?: any\n errMsg: string\n}> {\n let resp\n try {\n resp = await _fetch(url, params)\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${e && e.message}` }\n }\n let body\n try {\n body = await resp.json()\n } catch (e: any) {\n console.error(e)\n return { errMsg: `Unexpected error: ${resp.status}, ${e && e.message}`, resp }\n }\n return { body, resp, errMsg: '' }\n}\n"]} \ No newline at end of file diff --git a/dist/v1/services/fetch/index.js b/dist/v1/services/fetch/index.js index 20e81ff75..4b49634b8 100644 --- a/dist/v1/services/fetch/index.js +++ b/dist/v1/services/fetch/index.js @@ -1,2 +1,5 @@ -export * from './fetch'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./fetch"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/v1/services/fetch/index.js.map b/dist/v1/services/fetch/index.js.map index 72d6bef64..a6ced3828 100644 --- a/dist/v1/services/fetch/index.js.map +++ b/dist/v1/services/fetch/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/services/fetch/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA","sourcesContent":["export * from './fetch'\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../v1/services/fetch/index.ts"],"names":[],"mappings":";;;AAAA,kDAAuB","sourcesContent":["export * from './fetch'\n"]} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4c7b50558..0e360085b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,8 @@ "lib": ["ESNext", "DOM"], "types": ["node", "jest", "mocha", "chrome"], "target": "ESNext", - "moduleResolution": "node", + "module": "nodenext", + "moduleResolution": "nodenext", "allowSyntheticDefaultImports": true, "skipLibCheck": true, "allowJs": true, From 8a94608364cf51ac176b71c1c1958bf65670a2e4 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Wed, 5 Feb 2025 14:02:16 +0200 Subject: [PATCH 6/8] Remove tscondig option baseUrl. Fix files with invalid module path imports --- dist/src/interfaces/userRequest.d.ts | 2 +- dist/src/interfaces/userRequest.d.ts.map | 2 +- dist/src/interfaces/userRequest.js.map | 2 +- dist/src/libs/userOperation/userOperation.d.ts | 2 +- dist/src/libs/userOperation/userOperation.d.ts.map | 2 +- dist/src/libs/userOperation/userOperation.js.map | 2 +- dist/src/services/bundlers/biconomy.d.ts | 2 +- dist/src/services/bundlers/biconomy.d.ts.map | 2 +- dist/src/services/bundlers/biconomy.js.map | 2 +- dist/src/services/bundlers/pimlico.d.ts | 2 +- dist/src/services/bundlers/pimlico.d.ts.map | 2 +- dist/src/services/bundlers/pimlico.js.map | 2 +- dist/src/utils/accounts.d.ts | 2 +- dist/src/utils/accounts.d.ts.map | 2 +- dist/src/utils/accounts.js.map | 2 +- src/interfaces/userRequest.ts | 2 +- src/libs/userOperation/userOperation.ts | 2 +- src/services/bundlers/biconomy.ts | 2 +- src/services/bundlers/pimlico.ts | 2 +- src/utils/accounts.ts | 2 +- tsconfig.json | 1 - 21 files changed, 20 insertions(+), 21 deletions(-) diff --git a/dist/src/interfaces/userRequest.d.ts b/dist/src/interfaces/userRequest.d.ts index 06b3d22e2..7c2bde83e 100644 --- a/dist/src/interfaces/userRequest.d.ts +++ b/dist/src/interfaces/userRequest.d.ts @@ -1,4 +1,4 @@ -import { SignMessageAction } from 'controllers/actions/actions'; +import { SignMessageAction } from '../controllers/actions/actions'; import { TypedDataDomain, TypedDataField } from 'ethers'; import { PaymasterService } from '../libs/erc7677/types'; import { AccountId } from './account'; diff --git a/dist/src/interfaces/userRequest.d.ts.map b/dist/src/interfaces/userRequest.d.ts.map index cc35c5fa5..96b7d2212 100644 --- a/dist/src/interfaces/userRequest.d.ts.map +++ b/dist/src/interfaces/userRequest.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"userRequest.d.ts","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"userRequest.d.ts","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/userRequest.js.map b/dist/src/interfaces/userRequest.js.map index 4ca86dd7b..bee682a6c 100644 --- a/dist/src/interfaces/userRequest.js.map +++ b/dist/src/interfaces/userRequest.js.map @@ -1 +1 @@ -{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"","sourcesContent":["import { SignMessageAction } from 'controllers/actions/actions'\nimport { TypedDataDomain, TypedDataField } from 'ethers'\n\nimport { PaymasterService } from '../libs/erc7677/types'\nimport { AccountId } from './account'\nimport { DappProviderRequest } from './dapp'\nimport { NetworkId } from './network'\n\nexport interface Calls {\n kind: 'calls'\n calls: {\n to: string\n value: bigint\n data: string\n id?: string\n }[]\n}\nexport interface PlainTextMessage {\n kind: 'message'\n message: string | Uint8Array\n}\n\nexport interface TypedMessage {\n kind: 'typedMessage'\n domain: TypedDataDomain\n types: Record>\n message: Record\n primaryType: keyof TypedMessage['types']\n}\n// @TODO: move this type and it's deps (PlainTextMessage, TypedMessage) to another place,\n// probably interfaces\nexport interface Message {\n fromActionId: SignMessageAction['id']\n accountAddr: AccountId\n networkId: NetworkId\n content: PlainTextMessage | TypedMessage\n signature: string | null\n}\n\nexport interface SignUserRequest {\n id: string | number\n action: Calls | PlainTextMessage | TypedMessage | { kind: 'benzin' }\n session?: DappProviderRequest['session']\n meta: {\n isSignAction: true\n accountAddr: AccountId\n networkId: NetworkId\n paymasterService?: PaymasterService\n isWalletSendCalls?: boolean\n submittedAccountOp?: any\n [key: string]: any\n }\n // defined only when SignUserRequest is built from a DappRequest\n dappPromise?: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport interface DappUserRequest {\n id: string | number\n action: {\n kind: Exclude\n params: any\n }\n session: DappProviderRequest['session']\n meta: {\n isSignAction: false\n [key: string]: any\n }\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport type UserRequest = DappUserRequest | SignUserRequest\n"]} \ No newline at end of file +{"version":3,"file":"userRequest.js","sourceRoot":"","sources":["../../../src/interfaces/userRequest.ts"],"names":[],"mappings":"","sourcesContent":["import { SignMessageAction } from '../controllers/actions/actions'\nimport { TypedDataDomain, TypedDataField } from 'ethers'\n\nimport { PaymasterService } from '../libs/erc7677/types'\nimport { AccountId } from './account'\nimport { DappProviderRequest } from './dapp'\nimport { NetworkId } from './network'\n\nexport interface Calls {\n kind: 'calls'\n calls: {\n to: string\n value: bigint\n data: string\n id?: string\n }[]\n}\nexport interface PlainTextMessage {\n kind: 'message'\n message: string | Uint8Array\n}\n\nexport interface TypedMessage {\n kind: 'typedMessage'\n domain: TypedDataDomain\n types: Record>\n message: Record\n primaryType: keyof TypedMessage['types']\n}\n// @TODO: move this type and it's deps (PlainTextMessage, TypedMessage) to another place,\n// probably interfaces\nexport interface Message {\n fromActionId: SignMessageAction['id']\n accountAddr: AccountId\n networkId: NetworkId\n content: PlainTextMessage | TypedMessage\n signature: string | null\n}\n\nexport interface SignUserRequest {\n id: string | number\n action: Calls | PlainTextMessage | TypedMessage | { kind: 'benzin' }\n session?: DappProviderRequest['session']\n meta: {\n isSignAction: true\n accountAddr: AccountId\n networkId: NetworkId\n paymasterService?: PaymasterService\n isWalletSendCalls?: boolean\n submittedAccountOp?: any\n [key: string]: any\n }\n // defined only when SignUserRequest is built from a DappRequest\n dappPromise?: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport interface DappUserRequest {\n id: string | number\n action: {\n kind: Exclude\n params: any\n }\n session: DappProviderRequest['session']\n meta: {\n isSignAction: false\n [key: string]: any\n }\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n}\n\nexport type UserRequest = DappUserRequest | SignUserRequest\n"]} \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.d.ts b/dist/src/libs/userOperation/userOperation.d.ts index fde8a9e82..2f0a905fd 100644 --- a/dist/src/libs/userOperation/userOperation.d.ts +++ b/dist/src/libs/userOperation/userOperation.d.ts @@ -1,5 +1,5 @@ import { Log } from 'ethers'; -import { Network } from 'interfaces/network'; +import { Network } from '../../interfaces/network'; import { BUNDLER } from '../../consts/bundlers'; import { Account, AccountId, AccountOnchainState } from '../../interfaces/account'; import { AccountOp } from '../accountOp/accountOp'; diff --git a/dist/src/libs/userOperation/userOperation.d.ts.map b/dist/src/libs/userOperation/userOperation.d.ts.map index 6f2814f73..16f1b6f6a 100644 --- a/dist/src/libs/userOperation/userOperation.d.ts.map +++ b/dist/src/libs/userOperation/userOperation.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"userOperation.d.ts","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+D,GAAG,EAAW,MAAM,QAAQ,CAAA;AAClG,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAS/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAElF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAgB,iBAAiB,WAKhC;AAED,wBAAgB,qBAAqB,WAEpC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS;;;;EAW/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;IAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,aAAa,UAqC3D;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,mBAAmB,GAAG,iBAAiB,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAEhF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,CAmCf;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAgBT;AAID,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,eAAe,UAAO,kBAUvB;AAMD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,OAAO,kBAYvB;AAED,eAAO,MAAM,oCAAoC,yCAAyC,CAAA;AAE1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAuCnE;AAID,eAAO,MAAM,SAAS,SACd,SAAS,GAAG,EAAE,cACR,MAAM,kBACF,MAAM,KACrB,sBAAsB,GAAG,IA0B3B,CAAA"} \ No newline at end of file +{"version":3,"file":"userOperation.d.ts","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+D,GAAG,EAAW,MAAM,QAAQ,CAAA;AAClG,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAS/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAElF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAgB,iBAAiB,WAKhC;AAED,wBAAgB,qBAAqB,WAEpC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS;;;;EAW/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;IAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,aAAa,UAqC3D;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,mBAAmB,GAAG,iBAAiB,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAEhF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,CAmCf;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAgBT;AAID,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,eAAe,UAAO,kBAUvB;AAMD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,OAAO,kBAYvB;AAED,eAAO,MAAM,oCAAoC,yCAAyC,CAAA;AAE1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAuCnE;AAID,eAAO,MAAM,SAAS,SACd,SAAS,GAAG,EAAE,cACR,MAAM,kBACF,MAAM,KACrB,sBAAsB,GAAG,IA0B3B,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/userOperation/userOperation.js.map b/dist/src/libs/userOperation/userOperation.js.map index f0409c8f0..3d914add1 100644 --- a/dist/src/libs/userOperation/userOperation.js.map +++ b/dist/src/libs/userOperation/userOperation.js.map @@ -1 +1 @@ -{"version":3,"file":"userOperation.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers'\nimport { Network } from 'interfaces/network'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { BUNDLER } from '../../consts/bundlers'\nimport {\n AMBIRE_ACCOUNT_FACTORY,\n AMBIRE_PAYMASTER,\n AMBIRE_PAYMASTER_SIGNER,\n ENTRY_POINT_MARKER,\n ERC_4337_ENTRYPOINT\n} from '../../consts/deploy'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport { Account, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { AccountOp, callToTuple } from '../accountOp/accountOp'\nimport { UserOperation, UserOperationEventData, UserOpRequestType } from './types'\n\nexport function calculateCallDataCost(callData: string): bigint {\n if (callData === '0x') return 0n\n const bytes = Buffer.from(callData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n return zeroBytes * 4n + nonZeroBytes * 16n\n}\n\nexport function getPaymasterSpoof() {\n const abiCoder = new AbiCoder()\n const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE\n const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig])\n return hexlify(concat([AMBIRE_PAYMASTER, simulationData]))\n}\n\nexport function getSigForCalculations() {\n return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n}\n\n// get the call to give privileges to the entry point\nexport function getActivatorCall(addr: AccountId) {\n const saAbi = new Interface(AmbireAccount.abi)\n const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [\n ERC_4337_ENTRYPOINT,\n ENTRY_POINT_MARKER\n ])\n return {\n to: addr,\n value: 0n,\n data: givePermsToEntryPointData\n }\n}\n\n/**\n * When we use abi.encode or send the user operation to the bundler,\n * we need to strip it of the specific ambire-common properties that we use\n *\n * @param UserOperation userOp\n * @returns EntryPoint userOp\n */\nexport function getCleanUserOp(userOp: UserOperation) {\n return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]\n}\n\n/**\n * Get the nonce we're expecting in validateUserOp\n * when we're going through the activation | recovery\n *\n * @param UserOperation userOperation\n * @returns hex string\n */\nexport function getOneTimeNonce(userOperation: UserOperation) {\n if (\n !userOperation.paymaster ||\n !userOperation.paymasterVerificationGasLimit ||\n !userOperation.paymasterPostOpGasLimit ||\n !userOperation.paymasterData\n ) {\n throw new Error('One time nonce could not be encoded because paymaster data is missing')\n }\n\n const abiCoder = new AbiCoder()\n return `0x${keccak256(\n abiCoder.encode(\n ['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'],\n [\n userOperation.factory && userOperation.factoryData\n ? concat([userOperation.factory, userOperation.factoryData])\n : '0x',\n userOperation.callData,\n concat([\n toBeHex(userOperation.verificationGasLimit, 16),\n toBeHex(userOperation.callGasLimit, 16)\n ]),\n userOperation.preVerificationGas,\n concat([\n toBeHex(userOperation.maxPriorityFeePerGas, 16),\n toBeHex(userOperation.maxFeePerGas, 16)\n ]),\n concat([\n userOperation.paymaster,\n toBeHex(userOperation.paymasterVerificationGasLimit, 16),\n toBeHex(userOperation.paymasterPostOpGasLimit, 16),\n userOperation.paymasterData\n ])\n ]\n )\n ).substring(18)}${toBeHex(0, 8).substring(2)}`\n}\n\nexport function getRequestType(accountState: AccountOnchainState): UserOpRequestType {\n return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'\n}\n\nexport function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean {\n return getRequestType(accountState) !== 'standard'\n}\n\nexport function getUserOperation(\n account: Account,\n accountState: AccountOnchainState,\n accountOp: AccountOp,\n bundler: BUNDLER,\n entryPointSig?: string\n): UserOperation {\n const userOp: UserOperation = {\n sender: accountOp.accountAddr,\n nonce: toBeHex(accountState.erc4337Nonce),\n callData: '0x',\n callGasLimit: toBeHex(0),\n verificationGasLimit: toBeHex(0),\n preVerificationGas: toBeHex(0),\n maxFeePerGas: toBeHex(1),\n maxPriorityFeePerGas: toBeHex(1),\n signature: '0x',\n requestType: getRequestType(accountState),\n bundler\n }\n\n // if the account is not deployed, prepare the deploy in the initCode\n if (!accountState.isDeployed) {\n if (!account.creation) throw new Error('Account creation properties are missing')\n if (!entryPointSig) throw new Error('No entry point authorization signature provided')\n\n const factoryInterface = new Interface(AmbireFactory.abi)\n userOp.factory = account.creation.factoryAddr\n userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n [callToTuple(getActivatorCall(accountOp.accountAddr))],\n entryPointSig\n ])\n }\n\n // if the request type is activator, add the activator call\n if (userOp.requestType === 'activator')\n userOp.activatorCall = getActivatorCall(accountOp.accountAddr)\n\n return userOp\n}\n\nexport function isErc4337Broadcast(\n acc: Account,\n network: Network,\n accountState: AccountOnchainState\n): boolean {\n // a special exception for gnosis which was a hardcoded chain but\n // now it's not. The bundler doesn't support state override on gnosis\n // so if the account IS deployed AND does NOT have 4337 privileges,\n // it won't be able to use the edge case as the bundler will block\n // the estimation. That's why we will use the relayer in this case\n const canBroadcast4337 =\n network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed\n\n return (\n canBroadcast4337 &&\n network.erc4337.enabled &&\n accountState.isV2 &&\n !!acc.creation &&\n getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n}\n\n// for special cases where we broadcast a 4337 operation with an EOA,\n// add the activator call so the use has the entry point attached\nexport function shouldIncludeActivatorCall(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n is4337Broadcast = true\n) {\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled &&\n (accountState.isDeployed || !is4337Broadcast)\n )\n}\n\n// if the account is v2 and the network is 4337 and the account hasn't\n// authorized the entry point, he should be asked to do so\n//\n// addition: if the account is the 0.7.0 one\nexport function shouldAskForEntryPointAuthorization(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n alreadySigned: boolean\n) {\n if (alreadySigned) return false\n\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n !accountState.isDeployed &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled\n )\n}\n\nexport const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'\n\nexport function getUserOpHash(userOp: UserOperation, chainId: bigint) {\n const abiCoder = new AbiCoder()\n const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData!]) : '0x'\n const hashInitCode = keccak256(initCode)\n const hashCallData = keccak256(userOp.callData)\n const accountGasLimits = concat([\n toBeHex(userOp.verificationGasLimit.toString(), 16),\n toBeHex(userOp.callGasLimit.toString(), 16)\n ])\n const gasFees = concat([\n toBeHex(userOp.maxPriorityFeePerGas.toString(), 16),\n toBeHex(userOp.maxFeePerGas.toString(), 16)\n ])\n const paymasterAndData = userOp.paymaster\n ? concat([\n userOp.paymaster,\n toBeHex(userOp.paymasterVerificationGasLimit!.toString(), 16),\n toBeHex(userOp.paymasterPostOpGasLimit!.toString(), 16),\n userOp.paymasterData!\n ])\n : '0x'\n const hashPaymasterAndData = keccak256(paymasterAndData)\n const packed = abiCoder.encode(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'],\n [\n userOp.sender,\n userOp.nonce,\n hashInitCode,\n hashCallData,\n accountGasLimits,\n userOp.preVerificationGas,\n gasFees,\n hashPaymasterAndData\n ]\n )\n const packedHash = keccak256(packed)\n return keccak256(\n abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])\n )\n}\n\n// try to parse the UserOperationEvent to understand whether\n// the user op is a success or a failure\nexport const parseLogs = (\n logs: readonly Log[],\n userOpHash: string,\n userOpsLength?: number // benzina only\n): UserOperationEventData | null => {\n if (userOpHash === '' && userOpsLength !== 1) return null\n\n let userOpLog = null\n logs.forEach((log: Log) => {\n try {\n if (\n log.topics.length === 4 &&\n (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)\n ) {\n // decode data for UserOperationEvent:\n // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n const coder = new AbiCoder()\n userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data)\n }\n } catch (e: any) {\n /* silence is bitcoin */\n }\n })\n\n if (!userOpLog) return null\n\n return {\n nonce: userOpLog[0],\n success: userOpLog[1]\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"userOperation.js","sourceRoot":"","sources":["../../../../src/libs/userOperation/userOperation.ts"],"names":[],"mappings":";;;;AAAA,mCAAkG;AAGlG,gHAA0E;AAC1E,gHAA0E;AAE1E,gDAM4B;AAC5B,wDAAuD;AAEvD,sDAA+D;AAG/D,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAA;IAC7D,OAAO,SAAS,GAAG,EAAE,GAAG,YAAY,GAAG,GAAG,CAAA;AAC5C,CAAC;AAND,sDAMC;AAED,SAAgB,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,gCAAuB,CAAC,CAAC,GAAG,0BAAa,CAAA;IACxF,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IACvF,OAAO,IAAA,gBAAO,EAAC,IAAA,eAAM,EAAC,CAAC,yBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;AAC5D,CAAC;AALD,8CAKC;AAED,SAAgB,qBAAqB;IACnC,OAAO,wIAAwI,CAAA;AACjJ,CAAC;AAFD,sDAEC;AAED,qDAAqD;AACrD,SAAgB,gBAAgB,CAAC,IAAe;IAC9C,MAAM,KAAK,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,yBAAyB,GAAG,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;QAC7E,4BAAmB;QACnB,2BAAkB;KACnB,CAAC,CAAA;IACF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,yBAAyB;KAChC,CAAA;AACH,CAAC;AAXD,4CAWC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,MAAqB;IAClD,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AACzE,CAAC;AAFD,wCAEC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,aAA4B;IAC1D,IACE,CAAC,aAAa,CAAC,SAAS;QACxB,CAAC,aAAa,CAAC,6BAA6B;QAC5C,CAAC,aAAa,CAAC,uBAAuB;QACtC,CAAC,aAAa,CAAC,aAAa,EAC5B;QACA,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;KACzF;IAED,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;IAC/B,OAAO,KAAK,IAAA,kBAAS,EACnB,QAAQ,CAAC,MAAM,CACb,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAC5D;QACE,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,WAAW;YAChD,CAAC,CAAC,IAAA,eAAM,EAAC,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YAC5D,CAAC,CAAC,IAAI;QACR,aAAa,CAAC,QAAQ;QACtB,IAAA,eAAM,EAAC;YACL,IAAA,gBAAO,EAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC/C,IAAA,gBAAO,EAAC,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC;SACxC,CAAC;QACF,aAAa,CAAC,kBAAkB;QAChC,IAAA,eAAM,EAAC;YACL,IAAA,gBAAO,EAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC/C,IAAA,gBAAO,EAAC,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC;SACxC,CAAC;QACF,IAAA,eAAM,EAAC;YACL,aAAa,CAAC,SAAS;YACvB,IAAA,gBAAO,EAAC,aAAa,CAAC,6BAA6B,EAAE,EAAE,CAAC;YACxD,IAAA,gBAAO,EAAC,aAAa,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAClD,aAAa,CAAC,aAAa;SAC5B,CAAC;KACH,CACF,CACF,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAA,gBAAO,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;AAChD,CAAC;AArCD,0CAqCC;AAED,SAAgB,cAAc,CAAC,YAAiC;IAC9D,OAAO,YAAY,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAA;AAC7F,CAAC;AAFD,wCAEC;AAED,SAAgB,qBAAqB,CAAC,YAAiC;IACrE,OAAO,cAAc,CAAC,YAAY,CAAC,KAAK,UAAU,CAAA;AACpD,CAAC;AAFD,sDAEC;AAED,SAAgB,gBAAgB,CAC9B,OAAgB,EAChB,YAAiC,EACjC,SAAoB,EACpB,OAAgB,EAChB,aAAsB;IAEtB,MAAM,MAAM,GAAkB;QAC5B,MAAM,EAAE,SAAS,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAA,gBAAO,EAAC,YAAY,CAAC,YAAY,CAAC;QACzC,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAA,gBAAO,EAAC,CAAC,CAAC;QACxB,oBAAoB,EAAE,IAAA,gBAAO,EAAC,CAAC,CAAC;QAChC,kBAAkB,EAAE,IAAA,gBAAO,EAAC,CAAC,CAAC;QAC9B,YAAY,EAAE,IAAA,gBAAO,EAAC,CAAC,CAAC;QACxB,oBAAoB,EAAE,IAAA,gBAAO,EAAC,CAAC,CAAC;QAChC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,cAAc,CAAC,YAAY,CAAC;QACzC,OAAO;KACR,CAAA;IAED,qEAAqE;IACrE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QACjF,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAEtF,MAAM,gBAAgB,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;QACzD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAA;QAC7C,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;YAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;YACrB,CAAC,IAAA,uBAAW,EAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACtD,aAAa;SACd,CAAC,CAAA;KACH;IAED,2DAA2D;IAC3D,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;QACpC,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAEhE,OAAO,MAAM,CAAA;AACf,CAAC;AAzCD,4CAyCC;AAED,SAAgB,kBAAkB,CAChC,GAAY,EACZ,OAAgB,EAChB,YAAiC;IAEjC,iEAAiE;IACjE,qEAAqE;IACrE,mEAAmE;IACnE,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,gBAAgB,GACpB,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,YAAY,CAAC,gBAAgB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAA;IAEvF,OAAO,CACL,gBAAgB;QAChB,OAAO,CAAC,OAAO,CAAC,OAAO;QACvB,YAAY,CAAC,IAAI;QACjB,CAAC,CAAC,GAAG,CAAC,QAAQ;QACd,IAAA,mBAAU,EAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,+BAAsB,CAChE,CAAA;AACH,CAAC;AApBD,gDAoBC;AAED,qEAAqE;AACrE,iEAAiE;AACjE,SAAgB,0BAA0B,CACxC,OAAgB,EAChB,OAAgB,EAChB,YAAiC,EACjC,eAAe,GAAG,IAAI;IAEtB,OAAO,CACL,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,QAAQ,CAAC,WAAW,KAAK,+BAAsB;QACvD,YAAY,CAAC,IAAI;QACjB,OAAO,CAAC,OAAO,CAAC,OAAO;QACvB,CAAC,YAAY,CAAC,gBAAgB;QAC9B,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,CAC9C,CAAA;AACH,CAAC;AAdD,gEAcC;AAED,sEAAsE;AACtE,0DAA0D;AAC1D,EAAE;AACF,4CAA4C;AAC5C,SAAgB,mCAAmC,CACjD,OAAgB,EAChB,OAAgB,EAChB,YAAiC,EACjC,aAAsB;IAEtB,IAAI,aAAa;QAAE,OAAO,KAAK,CAAA;IAE/B,OAAO,CACL,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,QAAQ,CAAC,WAAW,KAAK,+BAAsB;QACvD,YAAY,CAAC,IAAI;QACjB,CAAC,YAAY,CAAC,UAAU;QACxB,OAAO,CAAC,OAAO,CAAC,OAAO;QACvB,CAAC,YAAY,CAAC,gBAAgB,CAC/B,CAAA;AACH,CAAC;AAhBD,kFAgBC;AAEY,QAAA,oCAAoC,GAAG,sCAAsC,CAAA;AAE1F,SAAgB,aAAa,CAAC,MAAqB,EAAE,OAAe;IAClE,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,eAAM,EAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtF,MAAM,YAAY,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,YAAY,GAAG,IAAA,kBAAS,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC/C,MAAM,gBAAgB,GAAG,IAAA,eAAM,EAAC;QAC9B,IAAA,gBAAO,EAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QACnD,IAAA,gBAAO,EAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5C,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,IAAA,eAAM,EAAC;QACrB,IAAA,gBAAO,EAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QACnD,IAAA,gBAAO,EAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5C,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS;QACvC,CAAC,CAAC,IAAA,eAAM,EAAC;YACL,MAAM,CAAC,SAAS;YAChB,IAAA,gBAAO,EAAC,MAAM,CAAC,6BAA8B,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC7D,IAAA,gBAAO,EAAC,MAAM,CAAC,uBAAwB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,aAAc;SACtB,CAAC;QACJ,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,oBAAoB,GAAG,IAAA,kBAAS,EAAC,gBAAgB,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC5B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EACxF;QACE,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,KAAK;QACZ,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,MAAM,CAAC,kBAAkB;QACzB,OAAO;QACP,oBAAoB;KACrB,CACF,CAAA;IACD,MAAM,UAAU,GAAG,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAA;IACpC,OAAO,IAAA,kBAAS,EACd,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,4BAAmB,EAAE,OAAO,CAAC,CAAC,CAC/F,CAAA;AACH,CAAC;AAvCD,sCAuCC;AAED,4DAA4D;AAC5D,wCAAwC;AACjC,MAAM,SAAS,GAAG,CACvB,IAAoB,EACpB,UAAkB,EAClB,aAAsB,CAAC,eAAe;EACP,EAAE;IACjC,IAAI,UAAU,KAAK,EAAE,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEzD,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;QACxB,IAAI;YACF,IACE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBACvB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,IAAI,aAAa,KAAK,CAAC,CAAC,EACjF;gBACA,sCAAsC;gBACtC,uLAAuL;gBACvL,MAAM,KAAK,GAAG,IAAI,iBAAQ,EAAE,CAAA;gBAC5B,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;aAC9E;SACF;QAAC,OAAO,CAAM,EAAE;YACf,wBAAwB;SACzB;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAE3B,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QACnB,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;KACtB,CAAA;AACH,CAAC,CAAA;AA9BY,QAAA,SAAS,aA8BrB","sourcesContent":["import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers'\nimport { Network } from '../../interfaces/network'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport { BUNDLER } from '../../consts/bundlers'\nimport {\n AMBIRE_ACCOUNT_FACTORY,\n AMBIRE_PAYMASTER,\n AMBIRE_PAYMASTER_SIGNER,\n ENTRY_POINT_MARKER,\n ERC_4337_ENTRYPOINT\n} from '../../consts/deploy'\nimport { SPOOF_SIGTYPE } from '../../consts/signatures'\nimport { Account, AccountId, AccountOnchainState } from '../../interfaces/account'\nimport { AccountOp, callToTuple } from '../accountOp/accountOp'\nimport { UserOperation, UserOperationEventData, UserOpRequestType } from './types'\n\nexport function calculateCallDataCost(callData: string): bigint {\n if (callData === '0x') return 0n\n const bytes = Buffer.from(callData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n return zeroBytes * 4n + nonZeroBytes * 16n\n}\n\nexport function getPaymasterSpoof() {\n const abiCoder = new AbiCoder()\n const spoofSig = abiCoder.encode(['address'], [AMBIRE_PAYMASTER_SIGNER]) + SPOOF_SIGTYPE\n const simulationData = abiCoder.encode(['uint48', 'uint48', 'bytes'], [0, 0, spoofSig])\n return hexlify(concat([AMBIRE_PAYMASTER, simulationData]))\n}\n\nexport function getSigForCalculations() {\n return '0x0dc2d37f7b285a2243b2e1e6ba7195c578c72b395c0f76556f8961b0bca97ddc44e2d7a249598f56081a375837d2b82414c3c94940db3c1e64110108021161ca1c01'\n}\n\n// get the call to give privileges to the entry point\nexport function getActivatorCall(addr: AccountId) {\n const saAbi = new Interface(AmbireAccount.abi)\n const givePermsToEntryPointData = saAbi.encodeFunctionData('setAddrPrivilege', [\n ERC_4337_ENTRYPOINT,\n ENTRY_POINT_MARKER\n ])\n return {\n to: addr,\n value: 0n,\n data: givePermsToEntryPointData\n }\n}\n\n/**\n * When we use abi.encode or send the user operation to the bundler,\n * we need to strip it of the specific ambire-common properties that we use\n *\n * @param UserOperation userOp\n * @returns EntryPoint userOp\n */\nexport function getCleanUserOp(userOp: UserOperation) {\n return [(({ requestType, activatorCall, bundler, ...o }) => o)(userOp)]\n}\n\n/**\n * Get the nonce we're expecting in validateUserOp\n * when we're going through the activation | recovery\n *\n * @param UserOperation userOperation\n * @returns hex string\n */\nexport function getOneTimeNonce(userOperation: UserOperation) {\n if (\n !userOperation.paymaster ||\n !userOperation.paymasterVerificationGasLimit ||\n !userOperation.paymasterPostOpGasLimit ||\n !userOperation.paymasterData\n ) {\n throw new Error('One time nonce could not be encoded because paymaster data is missing')\n }\n\n const abiCoder = new AbiCoder()\n return `0x${keccak256(\n abiCoder.encode(\n ['bytes', 'bytes', 'bytes32', 'uint256', 'bytes32', 'bytes'],\n [\n userOperation.factory && userOperation.factoryData\n ? concat([userOperation.factory, userOperation.factoryData])\n : '0x',\n userOperation.callData,\n concat([\n toBeHex(userOperation.verificationGasLimit, 16),\n toBeHex(userOperation.callGasLimit, 16)\n ]),\n userOperation.preVerificationGas,\n concat([\n toBeHex(userOperation.maxPriorityFeePerGas, 16),\n toBeHex(userOperation.maxFeePerGas, 16)\n ]),\n concat([\n userOperation.paymaster,\n toBeHex(userOperation.paymasterVerificationGasLimit, 16),\n toBeHex(userOperation.paymasterPostOpGasLimit, 16),\n userOperation.paymasterData\n ])\n ]\n )\n ).substring(18)}${toBeHex(0, 8).substring(2)}`\n}\n\nexport function getRequestType(accountState: AccountOnchainState): UserOpRequestType {\n return accountState.isDeployed && !accountState.isErc4337Enabled ? 'activator' : 'standard'\n}\n\nexport function shouldUseOneTimeNonce(accountState: AccountOnchainState): boolean {\n return getRequestType(accountState) !== 'standard'\n}\n\nexport function getUserOperation(\n account: Account,\n accountState: AccountOnchainState,\n accountOp: AccountOp,\n bundler: BUNDLER,\n entryPointSig?: string\n): UserOperation {\n const userOp: UserOperation = {\n sender: accountOp.accountAddr,\n nonce: toBeHex(accountState.erc4337Nonce),\n callData: '0x',\n callGasLimit: toBeHex(0),\n verificationGasLimit: toBeHex(0),\n preVerificationGas: toBeHex(0),\n maxFeePerGas: toBeHex(1),\n maxPriorityFeePerGas: toBeHex(1),\n signature: '0x',\n requestType: getRequestType(accountState),\n bundler\n }\n\n // if the account is not deployed, prepare the deploy in the initCode\n if (!accountState.isDeployed) {\n if (!account.creation) throw new Error('Account creation properties are missing')\n if (!entryPointSig) throw new Error('No entry point authorization signature provided')\n\n const factoryInterface = new Interface(AmbireFactory.abi)\n userOp.factory = account.creation.factoryAddr\n userOp.factoryData = factoryInterface.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n [callToTuple(getActivatorCall(accountOp.accountAddr))],\n entryPointSig\n ])\n }\n\n // if the request type is activator, add the activator call\n if (userOp.requestType === 'activator')\n userOp.activatorCall = getActivatorCall(accountOp.accountAddr)\n\n return userOp\n}\n\nexport function isErc4337Broadcast(\n acc: Account,\n network: Network,\n accountState: AccountOnchainState\n): boolean {\n // a special exception for gnosis which was a hardcoded chain but\n // now it's not. The bundler doesn't support state override on gnosis\n // so if the account IS deployed AND does NOT have 4337 privileges,\n // it won't be able to use the edge case as the bundler will block\n // the estimation. That's why we will use the relayer in this case\n const canBroadcast4337 =\n network.chainId !== 100n || accountState.isErc4337Enabled || !accountState.isDeployed\n\n return (\n canBroadcast4337 &&\n network.erc4337.enabled &&\n accountState.isV2 &&\n !!acc.creation &&\n getAddress(acc.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n}\n\n// for special cases where we broadcast a 4337 operation with an EOA,\n// add the activator call so the use has the entry point attached\nexport function shouldIncludeActivatorCall(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n is4337Broadcast = true\n) {\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled &&\n (accountState.isDeployed || !is4337Broadcast)\n )\n}\n\n// if the account is v2 and the network is 4337 and the account hasn't\n// authorized the entry point, he should be asked to do so\n//\n// addition: if the account is the 0.7.0 one\nexport function shouldAskForEntryPointAuthorization(\n network: Network,\n account: Account,\n accountState: AccountOnchainState,\n alreadySigned: boolean\n) {\n if (alreadySigned) return false\n\n return (\n account.creation &&\n account.creation.factoryAddr === AMBIRE_ACCOUNT_FACTORY &&\n accountState.isV2 &&\n !accountState.isDeployed &&\n network.erc4337.enabled &&\n !accountState.isErc4337Enabled\n )\n}\n\nexport const ENTRY_POINT_AUTHORIZATION_REQUEST_ID = 'ENTRY_POINT_AUTHORIZATION_REQUEST_ID'\n\nexport function getUserOpHash(userOp: UserOperation, chainId: bigint) {\n const abiCoder = new AbiCoder()\n const initCode = userOp.factory ? concat([userOp.factory, userOp.factoryData!]) : '0x'\n const hashInitCode = keccak256(initCode)\n const hashCallData = keccak256(userOp.callData)\n const accountGasLimits = concat([\n toBeHex(userOp.verificationGasLimit.toString(), 16),\n toBeHex(userOp.callGasLimit.toString(), 16)\n ])\n const gasFees = concat([\n toBeHex(userOp.maxPriorityFeePerGas.toString(), 16),\n toBeHex(userOp.maxFeePerGas.toString(), 16)\n ])\n const paymasterAndData = userOp.paymaster\n ? concat([\n userOp.paymaster,\n toBeHex(userOp.paymasterVerificationGasLimit!.toString(), 16),\n toBeHex(userOp.paymasterPostOpGasLimit!.toString(), 16),\n userOp.paymasterData!\n ])\n : '0x'\n const hashPaymasterAndData = keccak256(paymasterAndData)\n const packed = abiCoder.encode(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'],\n [\n userOp.sender,\n userOp.nonce,\n hashInitCode,\n hashCallData,\n accountGasLimits,\n userOp.preVerificationGas,\n gasFees,\n hashPaymasterAndData\n ]\n )\n const packedHash = keccak256(packed)\n return keccak256(\n abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, ERC_4337_ENTRYPOINT, chainId])\n )\n}\n\n// try to parse the UserOperationEvent to understand whether\n// the user op is a success or a failure\nexport const parseLogs = (\n logs: readonly Log[],\n userOpHash: string,\n userOpsLength?: number // benzina only\n): UserOperationEventData | null => {\n if (userOpHash === '' && userOpsLength !== 1) return null\n\n let userOpLog = null\n logs.forEach((log: Log) => {\n try {\n if (\n log.topics.length === 4 &&\n (log.topics[1].toLowerCase() === userOpHash.toLowerCase() || userOpsLength === 1)\n ) {\n // decode data for UserOperationEvent:\n // 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n const coder = new AbiCoder()\n userOpLog = coder.decode(['uint256', 'bool', 'uint256', 'uint256'], log.data)\n }\n } catch (e: any) {\n /* silence is bitcoin */\n }\n })\n\n if (!userOpLog) return null\n\n return {\n nonce: userOpLog[0],\n success: userOpLog[1]\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.d.ts b/dist/src/services/bundlers/biconomy.d.ts index ff4d6d1e8..c83d3ea76 100644 --- a/dist/src/services/bundlers/biconomy.d.ts +++ b/dist/src/services/bundlers/biconomy.d.ts @@ -1,4 +1,4 @@ -import { Network } from 'interfaces/network'; +import { Network } from '../../interfaces/network'; import { BUNDLER } from '../../consts/bundlers'; import { Bundler } from './bundler'; import { GasSpeeds, UserOpStatus } from './types'; diff --git a/dist/src/services/bundlers/biconomy.d.ts.map b/dist/src/services/bundlers/biconomy.d.ts.map index b2821fe59..2f98dede2 100644 --- a/dist/src/services/bundlers/biconomy.d.ts.map +++ b/dist/src/services/bundlers/biconomy.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"biconomy.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAG5C,OAAO,EAAY,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,QAAS,SAAQ,OAAO;IACnC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA8D5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file +{"version":3,"file":"biconomy.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAY,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,QAAS,SAAQ,OAAO;IACnC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA8D5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file diff --git a/dist/src/services/bundlers/biconomy.js.map b/dist/src/services/bundlers/biconomy.js.map index a04797eaf..60abbd326 100644 --- a/dist/src/services/bundlers/biconomy.js.map +++ b/dist/src/services/bundlers/biconomy.js.map @@ -1 +1 @@ -{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":";;;AAGA,2CAA2C;AAC3C,oDAAyD;AACzD,uCAAmC;AAGnC,MAAa,QAAS,SAAQ,iBAAO;IACzB,MAAM,CAAC,OAAgB;QAC/B,OAAO,sCAAsC,OAAO,CAAC,OAAO,iDAAiD,CAAA;IAC/G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ;aAC1B,IAAI,CAAC,iCAAiC,EAAE,CAAC,UAAU,CAAC,CAAC;aACrD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEd,OAAO;gBACL,KAAK,EAAE,WAAW;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,IAAI,YAAY,GAAiB;YAC/B,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,QAAQ,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,KAAK,iBAAiB;oBACpB,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,KAAK,8BAA8B;oBACjC,YAAY,GAAG;wBACb,MAAM,EAAE,UAAU;qBACnB,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP;oBACE,MAAK;aACR;SACF;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,mBAAQ,CAAA;IACjB,CAAC;CACF;AA/ED,4BA+EC","sourcesContent":["/* eslint-disable no-console */\nimport { Network } from 'interfaces/network'\n\n/* eslint-disable class-methods-use-this */\nimport { BICONOMY, BUNDLER } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Biconomy extends Bundler {\n protected getUrl(network: Network): string {\n return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('biconomy_getGasFeeValues', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n const result = await provider\n .send('biconomy_getUserOperationStatus', [userOpHash])\n .catch((e) => {\n console.log('biconomy_getUserOperationStatus returned an error')\n console.log(e)\n\n return {\n state: 'NOT_FOUND'\n }\n })\n\n let userOpStatus: UserOpStatus = {\n status: 'not_found'\n }\n if (result.state) {\n switch (result.state) {\n case 'NOT_FOUND':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n // currently, we don't handle the middle stage called bundler mempool\n // it can be treated the same way as not_found - which means it will\n // query the bundler again until it has a txnId\n case 'BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n case 'DROPPED_FROM_BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'rejected'\n }\n break\n\n case 'SUBMITTED':\n case 'FAILED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n case 'CONFIRMED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n default:\n break\n }\n }\n\n return userOpStatus\n }\n\n public getName(): BUNDLER {\n return BICONOMY\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"biconomy.js","sourceRoot":"","sources":["../../../../src/services/bundlers/biconomy.ts"],"names":[],"mappings":";;;AAGA,2CAA2C;AAC3C,oDAAyD;AACzD,uCAAmC;AAGnC,MAAa,QAAS,SAAQ,iBAAO;IACzB,MAAM,CAAC,OAAgB;QAC/B,OAAO,sCAAsC,OAAO,CAAC,OAAO,iDAAiD,CAAA;IAC/G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ;aAC1B,IAAI,CAAC,iCAAiC,EAAE,CAAC,UAAU,CAAC,CAAC;aACrD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEd,OAAO;gBACL,KAAK,EAAE,WAAW;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,IAAI,YAAY,GAAiB;YAC/B,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,QAAQ,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,KAAK,iBAAiB;oBACpB,YAAY,GAAG;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAA;oBACD,MAAK;gBAEP,KAAK,8BAA8B;oBACjC,YAAY,GAAG;wBACb,MAAM,EAAE,UAAU;qBACnB,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW,CAAC;gBACjB,KAAK,QAAQ;oBACX,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP,KAAK,WAAW;oBACd,YAAY,GAAG;wBACb,MAAM,EAAE,OAAO;wBACf,eAAe,EAAE,MAAM,CAAC,eAAe;qBACxC,CAAA;oBACD,MAAK;gBAEP;oBACE,MAAK;aACR;SACF;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,mBAAQ,CAAA;IACjB,CAAC;CACF;AA/ED,4BA+EC","sourcesContent":["/* eslint-disable no-console */\nimport { Network } from '../../interfaces/network'\n\n/* eslint-disable class-methods-use-this */\nimport { BICONOMY, BUNDLER } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Biconomy extends Bundler {\n protected getUrl(network: Network): string {\n return `https://bundler.biconomy.io/api/v3/${network.chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('biconomy_getGasFeeValues', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n const result = await provider\n .send('biconomy_getUserOperationStatus', [userOpHash])\n .catch((e) => {\n console.log('biconomy_getUserOperationStatus returned an error')\n console.log(e)\n\n return {\n state: 'NOT_FOUND'\n }\n })\n\n let userOpStatus: UserOpStatus = {\n status: 'not_found'\n }\n if (result.state) {\n switch (result.state) {\n case 'NOT_FOUND':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n // currently, we don't handle the middle stage called bundler mempool\n // it can be treated the same way as not_found - which means it will\n // query the bundler again until it has a txnId\n case 'BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'not_found'\n }\n break\n\n case 'DROPPED_FROM_BUNDLER_MEMPOOL':\n userOpStatus = {\n status: 'rejected'\n }\n break\n\n case 'SUBMITTED':\n case 'FAILED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n case 'CONFIRMED':\n userOpStatus = {\n status: 'found',\n transactionHash: result.transactionHash\n }\n break\n\n default:\n break\n }\n }\n\n return userOpStatus\n }\n\n public getName(): BUNDLER {\n return BICONOMY\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.d.ts b/dist/src/services/bundlers/pimlico.d.ts index f89249249..4780b959b 100644 --- a/dist/src/services/bundlers/pimlico.d.ts +++ b/dist/src/services/bundlers/pimlico.d.ts @@ -1,4 +1,4 @@ -import { Network } from 'interfaces/network'; +import { Network } from '../../interfaces/network'; import { BUNDLER } from '../../consts/bundlers'; import { Bundler } from './bundler'; import { GasSpeeds, UserOpStatus } from './types'; diff --git a/dist/src/services/bundlers/pimlico.d.ts.map b/dist/src/services/bundlers/pimlico.d.ts.map index 5a5610cba..610b7bffd 100644 --- a/dist/src/services/bundlers/pimlico.d.ts.map +++ b/dist/src/services/bundlers/pimlico.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pimlico.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAW,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,OAAQ,SAAQ,OAAO;IAClC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file +{"version":3,"file":"pimlico.d.ts","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAW,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEjD,qBAAa,OAAQ,SAAQ,OAAO;IAClC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;cAI1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK5E,OAAO,IAAI,OAAO;CAG1B"} \ No newline at end of file diff --git a/dist/src/services/bundlers/pimlico.js.map b/dist/src/services/bundlers/pimlico.js.map index 8c8fc21df..d33eb0c16 100644 --- a/dist/src/services/bundlers/pimlico.js.map +++ b/dist/src/services/bundlers/pimlico.js.map @@ -1 +1 @@ -{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":";;;AAGA,oDAAwD;AACxD,uCAAmC;AAGnC,MAAa,OAAQ,SAAQ,iBAAO;IACxB,MAAM,CAAC,OAAgB;QAC/B,OAAO,6BAA6B,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAA;IAC3G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,OAAO;QACZ,OAAO,kBAAO,CAAA;IAChB,CAAC;CACF;AAtBD,0BAsBC","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { Network } from 'interfaces/network'\n\nimport { BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Pimlico extends Bundler {\n protected getUrl(network: Network): string {\n return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('pimlico_getUserOperationGasPrice', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n return provider.send('pimlico_getUserOperationStatus', [userOpHash])\n }\n\n public getName(): BUNDLER {\n return PIMLICO\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"pimlico.js","sourceRoot":"","sources":["../../../../src/services/bundlers/pimlico.ts"],"names":[],"mappings":";;;AAGA,oDAAwD;AACxD,uCAAmC;AAGnC,MAAa,OAAQ,SAAQ,iBAAO;IACxB,MAAM,CAAC,OAAgB;QAC/B,OAAO,6BAA6B,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAA;IAC3G,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,OAAO;QACZ,OAAO,kBAAO,CAAA;IAChB,CAAC;CACF;AAtBD,0BAsBC","sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { Network } from '../../interfaces/network'\n\nimport { BUNDLER, PIMLICO } from '../../consts/bundlers'\nimport { Bundler } from './bundler'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nexport class Pimlico extends Bundler {\n protected getUrl(network: Network): string {\n return `https://api.pimlico.io/v2/${network.chainId}/rpc?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}`\n }\n\n protected async getGasPrice(network: Network): Promise {\n const provider = this.getProvider(network)\n const prices: any = await provider.send('pimlico_getUserOperationGasPrice', [])\n prices.medium = prices.standard\n prices.ape = prices.fast\n delete prices.standard\n return prices\n }\n\n public async getStatus(network: Network, userOpHash: string): Promise {\n const provider = this.getProvider(network)\n return provider.send('pimlico_getUserOperationStatus', [userOpHash])\n }\n\n public getName(): BUNDLER {\n return PIMLICO\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/accounts.d.ts b/dist/src/utils/accounts.d.ts index 8e2b34992..c18aa2378 100644 --- a/dist/src/utils/accounts.d.ts +++ b/dist/src/utils/accounts.d.ts @@ -1,4 +1,4 @@ -import { Key } from 'interfaces/keystore'; +import { Key } from '../interfaces/keystore'; declare const getIsViewOnly: (keys: Key[], accountKeys: string[]) => boolean; export { getIsViewOnly }; //# sourceMappingURL=accounts.d.ts.map \ No newline at end of file diff --git a/dist/src/utils/accounts.d.ts.map b/dist/src/utils/accounts.d.ts.map index 6e4afc441..246ad27bf 100644 --- a/dist/src/utils/accounts.d.ts.map +++ b/dist/src/utils/accounts.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,QAAA,MAAM,aAAa,SAAU,GAAG,EAAE,eAAe,MAAM,EAAE,YAExD,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"} \ No newline at end of file +{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAE5C,QAAA,MAAM,aAAa,SAAU,GAAG,EAAE,eAAe,MAAM,EAAE,YAExD,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"} \ No newline at end of file diff --git a/dist/src/utils/accounts.js.map b/dist/src/utils/accounts.js.map index 5c64694bf..6754b4539 100644 --- a/dist/src/utils/accounts.js.map +++ b/dist/src/utils/accounts.js.map @@ -1 +1 @@ -{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,WAAqB,EAAE,EAAE;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA;AAEQ,sCAAa","sourcesContent":["import { Key } from 'interfaces/keystore'\n\nconst getIsViewOnly = (keys: Key[], accountKeys: string[]) => {\n return keys.every((k) => !accountKeys.includes(k.addr))\n}\n\nexport { getIsViewOnly }\n"]} \ No newline at end of file +{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/utils/accounts.ts"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,WAAqB,EAAE,EAAE;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA;AAEQ,sCAAa","sourcesContent":["import { Key } from '../interfaces/keystore'\n\nconst getIsViewOnly = (keys: Key[], accountKeys: string[]) => {\n return keys.every((k) => !accountKeys.includes(k.addr))\n}\n\nexport { getIsViewOnly }\n"]} \ No newline at end of file diff --git a/src/interfaces/userRequest.ts b/src/interfaces/userRequest.ts index 7bc69e2b3..48e61c86d 100644 --- a/src/interfaces/userRequest.ts +++ b/src/interfaces/userRequest.ts @@ -1,4 +1,4 @@ -import { SignMessageAction } from 'controllers/actions/actions' +import { SignMessageAction } from '../controllers/actions/actions' import { TypedDataDomain, TypedDataField } from 'ethers' import { PaymasterService } from '../libs/erc7677/types' diff --git a/src/libs/userOperation/userOperation.ts b/src/libs/userOperation/userOperation.ts index 075a4f996..13e6f4e76 100644 --- a/src/libs/userOperation/userOperation.ts +++ b/src/libs/userOperation/userOperation.ts @@ -1,5 +1,5 @@ import { AbiCoder, concat, getAddress, hexlify, Interface, keccak256, Log, toBeHex } from 'ethers' -import { Network } from 'interfaces/network' +import { Network } from '../../interfaces/network' import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json' import AmbireFactory from '../../../contracts/compiled/AmbireFactory.json' diff --git a/src/services/bundlers/biconomy.ts b/src/services/bundlers/biconomy.ts index cd4e8911b..03c8e1aff 100644 --- a/src/services/bundlers/biconomy.ts +++ b/src/services/bundlers/biconomy.ts @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -import { Network } from 'interfaces/network' +import { Network } from '../../interfaces/network' /* eslint-disable class-methods-use-this */ import { BICONOMY, BUNDLER } from '../../consts/bundlers' diff --git a/src/services/bundlers/pimlico.ts b/src/services/bundlers/pimlico.ts index cac6f59c8..1d7d74398 100644 --- a/src/services/bundlers/pimlico.ts +++ b/src/services/bundlers/pimlico.ts @@ -1,5 +1,5 @@ /* eslint-disable class-methods-use-this */ -import { Network } from 'interfaces/network' +import { Network } from '../../interfaces/network' import { BUNDLER, PIMLICO } from '../../consts/bundlers' import { Bundler } from './bundler' diff --git a/src/utils/accounts.ts b/src/utils/accounts.ts index 0516bc4ab..4acf7bbf3 100644 --- a/src/utils/accounts.ts +++ b/src/utils/accounts.ts @@ -1,4 +1,4 @@ -import { Key } from 'interfaces/keystore' +import { Key } from '../interfaces/keystore' const getIsViewOnly = (keys: Key[], accountKeys: string[]) => { return keys.every((k) => !accountKeys.includes(k.addr)) diff --git a/tsconfig.json b/tsconfig.json index 0e360085b..1b6f6e4b8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "baseUrl": "src/", "noEmit": false, "noEmitOnError": true, "noEmitHelpers": true, From 3fca8cd4c2995d971e8ad0804d3661179a638c65 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Mon, 10 Feb 2025 00:06:46 +0200 Subject: [PATCH 7/8] Remove ethereumjs-abi and js-sha3 --- dist/src/libs/proxyDeploy/deploy.d.ts | 2 +- dist/src/libs/proxyDeploy/deploy.d.ts.map | 2 +- dist/src/libs/proxyDeploy/deploy.js | 8 ++++---- dist/src/libs/proxyDeploy/deploy.js.map | 2 +- package-lock.json | 2 -- package.json | 2 -- src/libs/proxyDeploy/deploy.ts | 6 +++--- 7 files changed, 10 insertions(+), 14 deletions(-) diff --git a/dist/src/libs/proxyDeploy/deploy.d.ts b/dist/src/libs/proxyDeploy/deploy.d.ts index 76071b454..78ae1ccc8 100644 --- a/dist/src/libs/proxyDeploy/deploy.d.ts +++ b/dist/src/libs/proxyDeploy/deploy.d.ts @@ -1,4 +1,4 @@ -export declare function privSlot(slotNumber: any, keyType: any, key: any, valueType: any): any; +export declare function privSlot(slotNumber: any, keyType: any, key: any, valueType: any): string; export interface PrivLevels { addr: string; hash: string; diff --git a/dist/src/libs/proxyDeploy/deploy.d.ts.map b/dist/src/libs/proxyDeploy/deploy.d.ts.map index f6608b060..7b2418968 100644 --- a/dist/src/libs/proxyDeploy/deploy.d.ts.map +++ b/dist/src/libs/proxyDeploy/deploy.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAcA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAG/E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CACpC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,IAAI;;CAAkB,UAoBvB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,GAAG;;EAazD"} \ No newline at end of file +{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAaA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,UAI/E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CACpC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,IAAI;;CAAkB,UAoBvB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,GAAG;;EAazD"} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js b/dist/src/libs/proxyDeploy/deploy.js index a722aa8d5..3d0b59e18 100644 --- a/dist/src/libs/proxyDeploy/deploy.js +++ b/dist/src/libs/proxyDeploy/deploy.js @@ -1,8 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStorageSlotsFromArtifact = exports.getProxyDeployBytecode = exports.privSlot = void 0; -const abi = require('ethereumjs-abi'); -const keccak256 = require('js-sha3').keccak256; +const ethers_1 = require("ethers"); // @TODO: fix the any function evmPush(data) { if (data.length < 1) @@ -16,8 +15,9 @@ function evmPush(data) { } // @TODO: fix the any function privSlot(slotNumber, keyType, key, valueType) { - const buf = abi.rawEncode([keyType, valueType], [key, slotNumber]); - return keccak256(buf); + const abiCoder = new ethers_1.AbiCoder(); + const buf = abiCoder.encode([keyType, valueType], [key, slotNumber]); + return (0, ethers_1.keccak256)(buf); } exports.privSlot = privSlot; // @TODO: fix the any diff --git a/dist/src/libs/proxyDeploy/deploy.js.map b/dist/src/libs/proxyDeploy/deploy.js.map index f85b4e2bb..06b68cfe9 100644 --- a/dist/src/libs/proxyDeploy/deploy.js.map +++ b/dist/src/libs/proxyDeploy/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":";;;AAAA,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;AAE9C,qBAAqB;AACrB,SAAS,OAAO,CAAC,IAAS;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACxD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,qBAAqB;AACrB,SAAgB,QAAQ,CAAC,UAAe,EAAE,OAAY,EAAE,GAAQ,EAAE,SAAc;IAC9E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAA;IAClE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC;AAHD,4BAGC;AAED,qBAAqB;AACrB,SAAS,UAAU,CAAC,UAAe,EAAE,OAAY,EAAE,GAAQ,EAAE,SAAc,EAAE,QAAa;IACxF,qHAAqH;IACrH,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;KACzB,CAAC,CAAA;AACJ,CAAC;AAOD,SAAgB,sBAAsB,CACpC,kBAA0B,EAC1B,UAAwB,EACxB,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE;IAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA;IACrC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAC7F,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,+CAA+C;IAC/C,6EAA6E;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA,CAAC,iDAAiD;IACpG,IAAI,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IAE3F,4DAA4D;IAC5D,IAAI,aAAa,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACjE,OAAO,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,OAAO,CACzE,aAAa,CACd,CAAC,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAA;AACnD,CAAC;AAvBD,wDAuBC;AAED,SAAgB,2BAA2B,CAAC,SAAc;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,qBAAqB,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACrF,IAAI,CAAC,qBAAqB;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAClD,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CACvD,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,oBAAoB,IAAI,EAAE,CAAC,IAAI,KAAK,eAAe,CACjF,CAAA;IACD,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,qBAAqB,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,aAAa,CACnF,CAAA;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;IAEtF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;AACjC,CAAC;AAbD,kEAaC","sourcesContent":["const abi = require('ethereumjs-abi')\nconst keccak256 = require('js-sha3').keccak256\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const buf = abi.rawEncode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, keccak256 } from 'ethers'\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const abiCoder = new AbiCoder()\n const buf = abiCoder.encode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 586d6622c..37dee968a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,11 +52,9 @@ "eslint-plugin-prettier": "4.0.0", "eslint-plugin-react": "7.27.1", "eslint-plugin-react-hooks": "4.3.0", - "ethereumjs-abi": "^0.6.8", "hardhat": "^2.14.0", "hardhat-gas-reporter": "^1.0.9", "jest": "^29.6.1", - "js-sha3": "^0.8.0", "node-fetch": "^2.7.0", "node-rsa": "^1.0.6", "prettier": "^2.5.0", diff --git a/package.json b/package.json index 78ba83460..0d999a7dc 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,9 @@ "eslint-plugin-prettier": "4.0.0", "eslint-plugin-react": "7.27.1", "eslint-plugin-react-hooks": "4.3.0", - "ethereumjs-abi": "^0.6.8", "hardhat": "^2.14.0", "hardhat-gas-reporter": "^1.0.9", "jest": "^29.6.1", - "js-sha3": "^0.8.0", "node-fetch": "^2.7.0", "node-rsa": "^1.0.6", "prettier": "^2.5.0", diff --git a/src/libs/proxyDeploy/deploy.ts b/src/libs/proxyDeploy/deploy.ts index 75aa0ffc3..5aa011eb2 100644 --- a/src/libs/proxyDeploy/deploy.ts +++ b/src/libs/proxyDeploy/deploy.ts @@ -1,5 +1,4 @@ -const abi = require('ethereumjs-abi') -const keccak256 = require('js-sha3').keccak256 +import { AbiCoder, keccak256 } from 'ethers' // @TODO: fix the any function evmPush(data: any) { @@ -13,7 +12,8 @@ function evmPush(data: any) { // @TODO: fix the any export function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) { - const buf = abi.rawEncode([keyType, valueType], [key, slotNumber]) + const abiCoder = new AbiCoder() + const buf = abiCoder.encode([keyType, valueType], [key, slotNumber]) return keccak256(buf) } From e188e16f4b60ed0aeaf4658bcea276a5ad444e95 Mon Sep 17 00:00:00 2001 From: Cvetan Mihaylov Date: Wed, 12 Feb 2025 11:29:29 +0200 Subject: [PATCH 8/8] Update build --- dist/src/controllers/actions/actions.js | 2 +- dist/src/controllers/actions/actions.js.map | 2 +- .../defiPositions/defiPositions.d.ts | 5 +- .../defiPositions/defiPositions.d.ts.map | 2 +- .../defiPositions/defiPositions.js | 9 +- .../defiPositions/defiPositions.js.map | 2 +- .../controllers/emailVault/emailVault.d.ts | 5 +- .../emailVault/emailVault.d.ts.map | 2 +- dist/src/controllers/emailVault/emailVault.js | 27 +++++- .../controllers/emailVault/emailVault.js.map | 2 +- dist/src/controllers/keystore/keystore.d.ts | 7 +- .../controllers/keystore/keystore.d.ts.map | 2 +- dist/src/controllers/keystore/keystore.js | 40 +++++--- dist/src/controllers/keystore/keystore.js.map | 2 +- dist/src/controllers/main/main.d.ts | 4 +- dist/src/controllers/main/main.d.ts.map | 2 +- dist/src/controllers/main/main.js | 33 +++---- dist/src/controllers/main/main.js.map | 2 +- dist/src/controllers/portfolio/portfolio.d.ts | 5 +- .../controllers/portfolio/portfolio.d.ts.map | 2 +- dist/src/controllers/portfolio/portfolio.js | 21 +++-- .../controllers/portfolio/portfolio.js.map | 2 +- .../selectedAccount/selectedAccount.d.ts | 1 + .../selectedAccount/selectedAccount.d.ts.map | 2 +- .../selectedAccount/selectedAccount.js | 10 +- .../selectedAccount/selectedAccount.js.map | 2 +- .../signAccountOp/signAccountOp.js | 2 +- .../signAccountOp/signAccountOp.js.map | 2 +- .../swapAndBridge/swapAndBridge.js | 2 +- .../swapAndBridge/swapAndBridge.js.map | 2 +- dist/src/interfaces/banner.d.ts | 3 + dist/src/interfaces/banner.d.ts.map | 2 +- dist/src/interfaces/banner.js.map | 2 +- dist/src/interfaces/keystore.d.ts | 1 + dist/src/interfaces/keystore.d.ts.map | 2 +- dist/src/interfaces/keystore.js.map | 2 +- dist/src/interfaces/selectedAccount.d.ts | 6 ++ dist/src/interfaces/selectedAccount.d.ts.map | 2 +- dist/src/interfaces/selectedAccount.js.map | 2 +- dist/src/libs/banners/banners.d.ts.map | 2 +- dist/src/libs/banners/banners.js.map | 2 +- dist/src/libs/defiPositions/types.d.ts | 2 + dist/src/libs/defiPositions/types.d.ts.map | 2 +- dist/src/libs/defiPositions/types.js.map | 2 +- dist/src/libs/deployless/deployless.js | 2 +- dist/src/libs/deployless/deployless.js.map | 2 +- dist/src/libs/errorHumanizer/helpers.js | 4 +- dist/src/libs/errorHumanizer/helpers.js.map | 2 +- dist/src/libs/keyIterator/keyIterator.d.ts | 4 +- .../src/libs/keyIterator/keyIterator.d.ts.map | 2 +- dist/src/libs/keyIterator/keyIterator.js | 14 ++- dist/src/libs/keyIterator/keyIterator.js.map | 2 +- dist/src/libs/portfolio/helpers.d.ts | 4 +- dist/src/libs/portfolio/helpers.d.ts.map | 2 +- dist/src/libs/portfolio/helpers.js | 16 +++- dist/src/libs/portfolio/helpers.js.map | 2 +- dist/src/libs/portfolio/interfaces.d.ts | 1 + dist/src/libs/portfolio/interfaces.d.ts.map | 2 +- dist/src/libs/portfolio/interfaces.js.map | 2 +- dist/src/libs/proxyDeploy/deploy.d.ts.map | 2 +- dist/src/libs/proxyDeploy/deploy.js | 8 +- dist/src/libs/proxyDeploy/deploy.js.map | 2 +- dist/src/libs/selectedAccount/errors.d.ts | 5 +- dist/src/libs/selectedAccount/errors.d.ts.map | 2 +- dist/src/libs/selectedAccount/errors.js | 66 +++++++------- dist/src/libs/selectedAccount/errors.js.map | 2 +- .../libs/selectedAccount/selectedAccount.d.ts | 2 +- .../selectedAccount/selectedAccount.d.ts.map | 2 +- .../libs/selectedAccount/selectedAccount.js | 91 ++++++++++++------- .../selectedAccount/selectedAccount.js.map | 2 +- .../src/libs/swapAndBridge/swapAndBridge.d.ts | 2 +- dist/src/services/bundlers/bundler.js | 2 +- dist/src/services/bundlers/bundler.js.map | 2 +- dist/src/services/socket/api.d.ts.map | 2 +- dist/src/services/socket/api.js | 6 +- dist/src/services/socket/api.js.map | 2 +- dist/src/utils/simulationStateOverride.js | 2 +- dist/src/utils/simulationStateOverride.js.map | 2 +- 78 files changed, 300 insertions(+), 200 deletions(-) diff --git a/dist/src/controllers/actions/actions.js b/dist/src/controllers/actions/actions.js index 265ef7f8f..a18a77ea0 100644 --- a/dist/src/controllers/actions/actions.js +++ b/dist/src/controllers/actions/actions.js @@ -142,12 +142,12 @@ class ActionsController extends eventEmitter_1.default { } } #setCurrentAction(nextAction) { + this.currentAction = nextAction; if (nextAction && nextAction.id === this.currentAction?.id) { this.openActionWindow(); this.emitUpdate(); return; } - this.currentAction = nextAction; if (!this.currentAction) { !!this.actionWindow.windowProps?.id && this.#windowManager.remove(this.actionWindow.windowProps.id); diff --git a/dist/src/controllers/actions/actions.js.map b/dist/src/controllers/actions/actions.js.map index f35e0beb6..116dbbb0d 100644 --- a/dist/src/controllers/actions/actions.js.map +++ b/dist/src/controllers/actions/actions.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { Account } from '../../interfaces/account'\nimport {\n AccountOpAction,\n Action,\n BenzinAction,\n DappRequestAction,\n SignMessageAction,\n SwitchAccountAction\n} from '../../interfaces/actions'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { WindowManager, WindowProps } from '../../interfaces/window'\n// eslint-disable-next-line import/no-cycle\nimport { messageOnNewAction } from '../../libs/actions/actions'\nimport { getDappActionRequestsBanners } from '../../libs/banners/banners'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n// Kind of inevitable, the AccountsController has SelectedAccountController, which has ActionsController\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\n// TODO: Temporarily. Refactor imports across the codebase to ref /interfaces/actions instead.\nexport type {\n SwitchAccountAction,\n Action,\n AccountOpAction,\n SignMessageAction,\n BenzinAction,\n DappRequestAction\n}\n\nexport type ActionPosition = 'first' | 'last'\n\nexport type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'\n\n/**\n * The ActionsController is responsible for storing the converted userRequests\n * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue\n * For most userRequests, there is a corresponding action in the actionsQueue\n * containing the details of the userRequest needed for displaying it to the user.\n * However, some userRequests can be batched together, resulting in a single action created for multiple requests.\n *\n * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected,\n * or until the user forcefully closes the window using the system close icon (X).\n * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen.\n */\nexport class ActionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n actionWindow: {\n windowProps: WindowProps\n openWindowPromise?: Promise\n focusWindowPromise?: Promise\n loaded: boolean\n pendingMessage: {\n message: string\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n } | null\n } = {\n windowProps: null,\n loaded: false,\n pendingMessage: null\n }\n\n actionsQueue: Action[] = []\n\n currentAction: Action | null = null\n\n #onActionWindowClose: () => void\n\n get visibleActionsQueue(): Action[] {\n return this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr\n }\n\n return true\n })\n }\n\n constructor({\n selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose\n }: {\n selectedAccount: SelectedAccountController\n windowManager: WindowManager\n notificationManager: NotificationManager\n onActionWindowClose: () => void\n }) {\n super()\n\n this.#selectedAccount = selectedAccount\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n this.#onActionWindowClose = onActionWindowClose\n\n this.#windowManager.event.on('windowRemoved', async (winId: number) => {\n if (\n winId === this.actionWindow.windowProps?.id ||\n (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)\n ) {\n this.actionWindow.windowProps = null\n this.actionWindow.loaded = false\n this.actionWindow.pendingMessage = null\n this.currentAction = null\n\n this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp')\n if (this.visibleActionsQueue.length) {\n await this.#notificationManager.create({\n title:\n this.actionsQueue.length > 1\n ? `${this.actionsQueue.length} transactions queued`\n : 'Transaction queued',\n message: 'Queued pending transactions are available on your Dashboard.'\n })\n }\n this.#onActionWindowClose()\n this.emitUpdate()\n }\n })\n\n this.#windowManager.event.on('windowFocusChange', async (winId: number) => {\n if (this.actionWindow.windowProps) {\n if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) {\n this.actionWindow.windowProps.focused = true\n this.emitUpdate()\n } else if (\n this.actionWindow.windowProps.id !== winId &&\n this.actionWindow.windowProps.focused\n ) {\n this.actionWindow.windowProps.focused = false\n this.emitUpdate()\n }\n }\n })\n }\n\n addOrUpdateAction(\n newAction: Action,\n position: ActionPosition = 'last',\n executionType: ActionExecutionType = 'open-action-window'\n ) {\n // remove the benzin action if a new actions is added\n this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin')\n if (this.currentAction && this.currentAction.type === 'benzin') {\n this.currentAction = null\n }\n\n const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id)\n if (actionIndex !== -1) {\n this.actionsQueue[actionIndex] = newAction\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n this.sendNewActionMessage(newAction, 'updated')\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n return\n }\n\n if (position === 'first') {\n this.actionsQueue.unshift(newAction)\n } else {\n this.actionsQueue.push(newAction)\n }\n\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n }\n\n removeAction(actionId: Action['id'], shouldOpenNextAction: boolean = true) {\n this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId)\n if (shouldOpenNextAction) {\n this.#setCurrentAction(this.visibleActionsQueue[0] || null)\n }\n }\n\n #setCurrentAction(nextAction: Action | null) {\n if (nextAction && nextAction.id === this.currentAction?.id) {\n this.openActionWindow()\n this.emitUpdate()\n return\n }\n\n this.currentAction = nextAction\n\n if (!this.currentAction) {\n !!this.actionWindow.windowProps?.id &&\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n } else {\n this.openActionWindow()\n }\n\n this.emitUpdate()\n }\n\n setCurrentActionById(actionId: Action['id']) {\n const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString())\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n setCurrentActionByIndex(actionIndex: number) {\n const action = this.visibleActionsQueue[actionIndex]\n\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n sendNewActionMessage(newAction: Action, type: 'queued' | 'updated') {\n if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') {\n if (this.actionWindow.loaded) {\n const message = messageOnNewAction(newAction, type)\n if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' })\n } else {\n const message = messageOnNewAction(newAction, type)\n if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }\n }\n }\n }\n\n async openActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (this.actionWindow.windowProps) {\n this.focusActionWindow()\n } else {\n try {\n this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => {\n this.actionWindow.openWindowPromise = undefined\n })\n this.actionWindow.windowProps = await this.actionWindow.openWindowPromise\n this.emitUpdate()\n } catch (err) {\n console.error('Error opening action window:', err)\n }\n }\n }\n\n async focusActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps)\n return\n try {\n this.actionWindow.focusWindowPromise = this.#windowManager\n .focus(this.actionWindow.windowProps)\n .finally(() => {\n this.actionWindow.focusWindowPromise = undefined\n })\n this.emitUpdate()\n } catch (err) {\n console.error('Error focusing action window:', err)\n }\n }\n\n closeActionWindow() {\n if (!this.actionWindow.windowProps) return\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n }\n\n setWindowLoaded() {\n if (!this.actionWindow.windowProps) return\n this.actionWindow.loaded = true\n\n if (this.actionWindow.pendingMessage) {\n this.#windowManager.sendWindowToastMessage(\n this.actionWindow.pendingMessage.message,\n this.actionWindow.pendingMessage.options\n )\n this.actionWindow.pendingMessage = null\n }\n this.emitUpdate()\n }\n\n removeAccountData(address: Account['addr']) {\n this.actionsQueue = this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr !== address\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== address\n }\n\n return true\n })\n\n this.emitUpdate()\n }\n\n get banners() {\n return getDappActionRequestsBanners(this.visibleActionsQueue)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n visibleActionsQueue: this.visibleActionsQueue,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/controllers/actions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport { Account } from '../../interfaces/account'\nimport {\n AccountOpAction,\n Action,\n BenzinAction,\n DappRequestAction,\n SignMessageAction,\n SwitchAccountAction\n} from '../../interfaces/actions'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { WindowManager, WindowProps } from '../../interfaces/window'\n// eslint-disable-next-line import/no-cycle\nimport { messageOnNewAction } from '../../libs/actions/actions'\nimport { getDappActionRequestsBanners } from '../../libs/banners/banners'\nimport { ENTRY_POINT_AUTHORIZATION_REQUEST_ID } from '../../libs/userOperation/userOperation'\nimport EventEmitter from '../eventEmitter/eventEmitter'\n// Kind of inevitable, the AccountsController has SelectedAccountController, which has ActionsController\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\n// TODO: Temporarily. Refactor imports across the codebase to ref /interfaces/actions instead.\nexport type {\n SwitchAccountAction,\n Action,\n AccountOpAction,\n SignMessageAction,\n BenzinAction,\n DappRequestAction\n}\n\nexport type ActionPosition = 'first' | 'last'\n\nexport type ActionExecutionType = 'queue' | 'queue-but-open-action-window' | 'open-action-window'\n\n/**\n * The ActionsController is responsible for storing the converted userRequests\n * from the MainController into actions. After adding an action an action-window will be opened with the first action form actionsQueue\n * For most userRequests, there is a corresponding action in the actionsQueue\n * containing the details of the userRequest needed for displaying it to the user.\n * However, some userRequests can be batched together, resulting in a single action created for multiple requests.\n *\n * After being opened, the action-window will remain visible to the user until all actions are resolved or rejected,\n * or until the user forcefully closes the window using the system close icon (X).\n * All pending/unresolved actions can be accessed later from the banners on the Dashboard screen.\n */\nexport class ActionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n actionWindow: {\n windowProps: WindowProps\n openWindowPromise?: Promise\n focusWindowPromise?: Promise\n loaded: boolean\n pendingMessage: {\n message: string\n options?: {\n timeout?: number\n type?: 'error' | 'success' | 'info' | 'warning'\n sticky?: boolean\n }\n } | null\n } = {\n windowProps: null,\n loaded: false,\n pendingMessage: null\n }\n\n actionsQueue: Action[] = []\n\n currentAction: Action | null = null\n\n #onActionWindowClose: () => void\n\n get visibleActionsQueue(): Action[] {\n return this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr === this.#selectedAccount.account?.addr\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== this.#selectedAccount.account?.addr\n }\n\n return true\n })\n }\n\n constructor({\n selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose\n }: {\n selectedAccount: SelectedAccountController\n windowManager: WindowManager\n notificationManager: NotificationManager\n onActionWindowClose: () => void\n }) {\n super()\n\n this.#selectedAccount = selectedAccount\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n this.#onActionWindowClose = onActionWindowClose\n\n this.#windowManager.event.on('windowRemoved', async (winId: number) => {\n if (\n winId === this.actionWindow.windowProps?.id ||\n (!this.visibleActionsQueue.length && this.currentAction && this.actionWindow.windowProps)\n ) {\n this.actionWindow.windowProps = null\n this.actionWindow.loaded = false\n this.actionWindow.pendingMessage = null\n this.currentAction = null\n\n this.actionsQueue = this.actionsQueue.filter((a) => a.type === 'accountOp')\n if (this.visibleActionsQueue.length) {\n await this.#notificationManager.create({\n title:\n this.actionsQueue.length > 1\n ? `${this.actionsQueue.length} transactions queued`\n : 'Transaction queued',\n message: 'Queued pending transactions are available on your Dashboard.'\n })\n }\n this.#onActionWindowClose()\n this.emitUpdate()\n }\n })\n\n this.#windowManager.event.on('windowFocusChange', async (winId: number) => {\n if (this.actionWindow.windowProps) {\n if (this.actionWindow.windowProps.id === winId && !this.actionWindow.windowProps.focused) {\n this.actionWindow.windowProps.focused = true\n this.emitUpdate()\n } else if (\n this.actionWindow.windowProps.id !== winId &&\n this.actionWindow.windowProps.focused\n ) {\n this.actionWindow.windowProps.focused = false\n this.emitUpdate()\n }\n }\n })\n }\n\n addOrUpdateAction(\n newAction: Action,\n position: ActionPosition = 'last',\n executionType: ActionExecutionType = 'open-action-window'\n ) {\n // remove the benzin action if a new actions is added\n this.actionsQueue = this.actionsQueue.filter((a) => a.type !== 'benzin')\n if (this.currentAction && this.currentAction.type === 'benzin') {\n this.currentAction = null\n }\n\n const actionIndex = this.actionsQueue.findIndex((a) => a.id === newAction.id)\n if (actionIndex !== -1) {\n this.actionsQueue[actionIndex] = newAction\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n this.sendNewActionMessage(newAction, 'updated')\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n return\n }\n\n if (position === 'first') {\n this.actionsQueue.unshift(newAction)\n } else {\n this.actionsQueue.push(newAction)\n }\n\n if (executionType !== 'queue') {\n let currentAction = null\n if (executionType === 'open-action-window') {\n currentAction = this.visibleActionsQueue.find((a) => a.id === newAction.id) || null\n } else if (executionType === 'queue-but-open-action-window') {\n this.sendNewActionMessage(newAction, 'queued')\n currentAction = this.currentAction || this.visibleActionsQueue[0] || null\n }\n this.#setCurrentAction(currentAction)\n } else {\n this.emitUpdate()\n }\n }\n\n removeAction(actionId: Action['id'], shouldOpenNextAction: boolean = true) {\n this.actionsQueue = this.actionsQueue.filter((a) => a.id !== actionId)\n if (shouldOpenNextAction) {\n this.#setCurrentAction(this.visibleActionsQueue[0] || null)\n }\n }\n\n #setCurrentAction(nextAction: Action | null) {\n this.currentAction = nextAction\n\n if (nextAction && nextAction.id === this.currentAction?.id) {\n this.openActionWindow()\n this.emitUpdate()\n return\n }\n\n if (!this.currentAction) {\n !!this.actionWindow.windowProps?.id &&\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n } else {\n this.openActionWindow()\n }\n\n this.emitUpdate()\n }\n\n setCurrentActionById(actionId: Action['id']) {\n const action = this.visibleActionsQueue.find((a) => a.id.toString() === actionId.toString())\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n setCurrentActionByIndex(actionIndex: number) {\n const action = this.visibleActionsQueue[actionIndex]\n\n if (!action) {\n const entryPointAction = this.visibleActionsQueue.find(\n (a) => a.id.toString() === ENTRY_POINT_AUTHORIZATION_REQUEST_ID\n )\n if (entryPointAction) this.#setCurrentAction(entryPointAction)\n\n return\n }\n\n this.#setCurrentAction(action)\n }\n\n sendNewActionMessage(newAction: Action, type: 'queued' | 'updated') {\n if (this.visibleActionsQueue.length > 1 && newAction.type !== 'benzin') {\n if (this.actionWindow.loaded) {\n const message = messageOnNewAction(newAction, type)\n if (message) this.#windowManager.sendWindowToastMessage(message, { type: 'success' })\n } else {\n const message = messageOnNewAction(newAction, type)\n if (message) this.actionWindow.pendingMessage = { message, options: { type: 'success' } }\n }\n }\n }\n\n async openActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (this.actionWindow.windowProps) {\n this.focusActionWindow()\n } else {\n try {\n this.actionWindow.openWindowPromise = this.#windowManager.open().finally(() => {\n this.actionWindow.openWindowPromise = undefined\n })\n this.actionWindow.windowProps = await this.actionWindow.openWindowPromise\n this.emitUpdate()\n } catch (err) {\n console.error('Error opening action window:', err)\n }\n }\n }\n\n async focusActionWindow() {\n await this.actionWindow.focusWindowPromise\n await this.actionWindow.openWindowPromise\n if (!this.visibleActionsQueue.length || !this.currentAction || !this.actionWindow.windowProps)\n return\n try {\n this.actionWindow.focusWindowPromise = this.#windowManager\n .focus(this.actionWindow.windowProps)\n .finally(() => {\n this.actionWindow.focusWindowPromise = undefined\n })\n this.emitUpdate()\n } catch (err) {\n console.error('Error focusing action window:', err)\n }\n }\n\n closeActionWindow() {\n if (!this.actionWindow.windowProps) return\n this.#windowManager.remove(this.actionWindow.windowProps.id)\n }\n\n setWindowLoaded() {\n if (!this.actionWindow.windowProps) return\n this.actionWindow.loaded = true\n\n if (this.actionWindow.pendingMessage) {\n this.#windowManager.sendWindowToastMessage(\n this.actionWindow.pendingMessage.message,\n this.actionWindow.pendingMessage.options\n )\n this.actionWindow.pendingMessage = null\n }\n this.emitUpdate()\n }\n\n removeAccountData(address: Account['addr']) {\n this.actionsQueue = this.actionsQueue.filter((a) => {\n if (a.type === 'accountOp') {\n return a.accountOp.accountAddr !== address\n }\n if (a.type === 'signMessage') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'benzin') {\n return a.userRequest.meta.accountAddr !== address\n }\n if (a.type === 'switchAccount') {\n return a.userRequest.meta.switchToAccountAddr !== address\n }\n\n return true\n })\n\n this.emitUpdate()\n }\n\n get banners() {\n return getDappActionRequestsBanners(this.visibleActionsQueue)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n visibleActionsQueue: this.visibleActionsQueue,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.d.ts b/dist/src/controllers/defiPositions/defiPositions.d.ts index 69ced7f87..7a43b915a 100644 --- a/dist/src/controllers/defiPositions/defiPositions.d.ts +++ b/dist/src/controllers/defiPositions/defiPositions.d.ts @@ -15,7 +15,10 @@ export declare class DefiPositionsController extends EventEmitter { providers: ProvidersController; networks: NetworksController; }); - updatePositions(networkId?: NetworkId): Promise; + updatePositions(opts?: { + networkId?: NetworkId; + maxDataAgeMs?: number; + }): Promise; removeNetworkData(networkId: NetworkId): void; getDefiPositionsState(accountAddr: string): AccountState; getNetworksWithPositions(accountAddr: string): import("../../libs/defiPositions/types").NetworksWithPositions; diff --git a/dist/src/controllers/defiPositions/defiPositions.d.ts.map b/dist/src/controllers/defiPositions/defiPositions.d.ts.map index 2c38a03c7..bba1c47d2 100644 --- a/dist/src/controllers/defiPositions/defiPositions.d.ts.map +++ b/dist/src/controllers/defiPositions/defiPositions.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"defiPositions.d.ts","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,OAAO,EACL,YAAY,EAMb,MAAM,gCAAgC,CAAA;AACvC,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,qBAAa,uBAAwB,SAAQ,YAAY;;gBAiB3C,EACV,KAAK,EACL,OAAO,EACP,eAAe,EACf,SAAS,EACT,QAAQ,EACT,EAAE;QACD,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,eAAe,EAAE,yBAAyB,CAAA;QAC1C,SAAS,EAAE,mBAAmB,CAAA;QAC9B,QAAQ,EAAE,kBAAkB,CAAA;KAC7B;IAqDK,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS;IA4L3C,iBAAiB,CAAC,SAAS,EAAE,SAAS;IAOtC,qBAAqB,CAAC,WAAW,EAAE,MAAM;IAIzC,wBAAwB,CAAC,WAAW,EAAE,MAAM;IAI5C,iBAAiB,CAAC,WAAW,EAAE,MAAM;IAQrC,MAAM;;;CAMP"} \ No newline at end of file +{"version":3,"file":"defiPositions.d.ts","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,OAAO,EACL,YAAY,EAMb,MAAM,gCAAgC,CAAA;AACvC,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,qBAAa,uBAAwB,SAAQ,YAAY;;gBAiB3C,EACV,KAAK,EACL,OAAO,EACP,eAAe,EACf,SAAS,EACT,QAAQ,EACT,EAAE;QACD,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,eAAe,EAAE,yBAAyB,CAAA;QAC1C,SAAS,EAAE,mBAAmB,CAAA;QAC9B,QAAQ,EAAE,kBAAkB,CAAA;KAC7B;IAyDK,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IA6L7E,iBAAiB,CAAC,SAAS,EAAE,SAAS;IAOtC,qBAAqB,CAAC,WAAW,EAAE,MAAM;IAIzC,wBAAwB,CAAC,WAAW,EAAE,MAAM;IAI5C,iBAAiB,CAAC,WAAW,EAAE,MAAM;IAQrC,MAAM;;;CAMP"} \ No newline at end of file diff --git a/dist/src/controllers/defiPositions/defiPositions.js b/dist/src/controllers/defiPositions/defiPositions.js index 098fa89c9..a135f0b24 100644 --- a/dist/src/controllers/defiPositions/defiPositions.js +++ b/dist/src/controllers/defiPositions/defiPositions.js @@ -33,11 +33,11 @@ class DefiPositionsController extends eventEmitter_1.default { error: errorMessage }); } - #getCanSkipUpdate(accountAddr, networkId) { + #getCanSkipUpdate(accountAddr, networkId, maxDataAgeMs = this.#minUpdateInterval) { const networkState = this.#state[accountAddr][networkId]; if (networkState.error || networkState.providerErrors?.length) return false; - const isWithinMinUpdateInterval = networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval; + const isWithinMinUpdateInterval = networkState.updatedAt && Date.now() - networkState.updatedAt < maxDataAgeMs; return isWithinMinUpdateInterval || networkState.isLoading; } async #updateNetworksWithPositions(accountId, accountState) { @@ -46,7 +46,8 @@ class DefiPositionsController extends eventEmitter_1.default { this.emitUpdate(); await this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts); } - async updatePositions(networkId) { + async updatePositions(opts) { + const { networkId, maxDataAgeMs } = opts || {}; if (!this.#selectedAccount.account) return; const selectedAccountAddr = this.#selectedAccount.account.addr; @@ -64,7 +65,7 @@ class DefiPositionsController extends eventEmitter_1.default { updatedAt: undefined }; } - if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) { + if (this.#getCanSkipUpdate(selectedAccountAddr, n.id, maxDataAgeMs)) { // Emit an update so that the current account data getter is updated this.emitUpdate(); return; diff --git a/dist/src/controllers/defiPositions/defiPositions.js.map b/dist/src/controllers/defiPositions/defiPositions.js.map index f24df34db..a39a9e35e 100644 --- a/dist/src/controllers/defiPositions/defiPositions.js.map +++ b/dist/src/controllers/defiPositions/defiPositions.js.map @@ -1 +1 @@ -{"version":3,"file":"defiPositions.js","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { getAssetValue } from '../../libs/defiPositions/helpers'\nimport { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'\nimport getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'\nimport {\n AccountState,\n DeFiPositionsError,\n DeFiPositionsState,\n NetworksWithPositionsByAccounts,\n PositionsByProvider,\n ProviderName\n} from '../../libs/defiPositions/types'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport class DefiPositionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #fetch: Fetch\n\n #storage: Storage\n\n #minUpdateInterval: number = 60 * 1000 // 1 minute\n\n #state: DeFiPositionsState = {}\n\n #networksWithPositionsByAccounts: NetworksWithPositionsByAccounts = {}\n\n constructor({\n fetch,\n storage,\n selectedAccount,\n providers,\n networks\n }: {\n fetch: Fetch\n storage: Storage\n selectedAccount: SelectedAccountController\n providers: ProvidersController\n networks: NetworksController\n }) {\n super()\n\n this.#fetch = fetch\n this.#storage = storage\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n }\n\n #setProviderError(\n accountAddr: string,\n networkId: string,\n providerName: ProviderName,\n errorMessage: string\n ) {\n if (!this.#state[accountAddr][networkId].providerErrors) {\n this.#state[accountAddr][networkId].providerErrors = []\n }\n\n this.#state[accountAddr][networkId].providerErrors!.push({\n providerName,\n error: errorMessage\n })\n }\n\n #getCanSkipUpdate(accountAddr: string, networkId: string) {\n const networkState = this.#state[accountAddr][networkId]\n\n if (networkState.error || networkState.providerErrors?.length) return false\n const isWithinMinUpdateInterval =\n networkState.updatedAt && Date.now() - networkState.updatedAt < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n async #updateNetworksWithPositions(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {})\n\n this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set(\n 'networksWithPositionsByAccounts',\n this.#networksWithPositionsByAccounts\n )\n }\n\n async updatePositions(networkId?: NetworkId) {\n if (!this.#selectedAccount.account) return\n\n const selectedAccountAddr = this.#selectedAccount.account.addr\n const networksToUpdate = networkId\n ? this.#networks.networks.filter((n) => n.id === networkId)\n : this.#networks.networks\n\n if (!this.#state[selectedAccountAddr]) {\n this.#state[selectedAccountAddr] = {}\n }\n\n await Promise.all(\n networksToUpdate.map(async (n) => {\n if (!this.#state[selectedAccountAddr][n.id]) {\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: [],\n updatedAt: undefined\n }\n }\n\n if (this.#getCanSkipUpdate(selectedAccountAddr, n.id)) {\n // Emit an update so that the current account data getter is updated\n this.emitUpdate()\n return\n }\n\n this.#state[selectedAccountAddr][n.id].isLoading = true\n this.emitUpdate()\n\n const networkState = this.#state[selectedAccountAddr][n.id]\n // Reset provider errors before updating\n networkState.providerErrors = []\n networkState.error = undefined\n\n try {\n const previousPositions = networkState.positionsByProvider\n const [aavePositions, uniV3Positions] = await Promise.all([\n getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getAAVEPositions error:', e)\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'AAVE v3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null\n }\n ),\n getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getUniV3Positions error:', e)\n\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'Uniswap V3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null\n }\n )\n ])\n\n const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length\n\n this.#state[selectedAccountAddr][n.id] = {\n ...networkState,\n isLoading: false,\n positionsByProvider: [aavePositions, uniV3Positions].filter(\n Boolean\n ) as PositionsByProvider[],\n updatedAt: hasErrors ? networkState.updatedAt : Date.now()\n }\n await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => {\n console.error('#setAssetPrices error:', e)\n this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError\n })\n } catch (e: any) {\n const prevPositionsByProvider = networkState.positionsByProvider\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: prevPositionsByProvider || [],\n error: DeFiPositionsError.CriticalError\n }\n console.error(`updatePositions error on ${n.id}`, e)\n } finally {\n this.emitUpdate()\n }\n })\n )\n\n await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr])\n }\n\n async #setAssetPrices(accountAddr: string, networkId: string) {\n const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId\n\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n if (!platformId) throw new Error('Missing `platformId`')\n\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n\n const networkState = this.#state[accountAddr][networkId]\n\n const addresses: string[] = []\n\n networkState.positionsByProvider.forEach((providerPos) => {\n providerPos.positions.forEach((p) => {\n p.assets.forEach((a) => {\n addresses.push(a.address)\n })\n })\n })\n\n const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(\n addresses\n ).join('%2C')}&vs_currencies=usd`\n\n const resp = await this.#fetch(cenaUrl)\n const body = await resp.json()\n if (resp.status !== 200) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('message')) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('error')) throw body\n\n const positionsByProviderWithPrices = this.#state[accountAddr][\n networkId\n ].positionsByProvider.map((positionsByProvider) => {\n if (positionsByProvider.providerName.toLowerCase().includes('aave'))\n return positionsByProvider\n\n const updatedPositions = positionsByProvider.positions.map((position) => {\n let positionInUSD = position.additionalData.positionInUSD || 0\n\n const updatedAssets = position.assets.map((asset) => {\n const priceData = body[asset.address.toLowerCase()]\n if (!priceData) return asset\n\n const priceIn = Object.entries(priceData).map(([currency, price]) => ({\n baseCurrency: currency,\n price: price as number\n }))\n\n const value = getAssetValue(asset.amount, asset.decimals, priceIn)\n\n positionInUSD += value\n\n return {\n ...asset,\n value,\n priceIn\n }\n })\n\n return {\n ...position,\n assets: updatedAssets,\n additionalData: { ...position.additionalData, positionInUSD }\n }\n })\n\n let positionInUSD = positionsByProvider.positionInUSD\n\n // Already set in the corresponding lib\n if (!positionInUSD) {\n positionInUSD = updatedPositions.reduce((prevPositionValue, position) => {\n return prevPositionValue + (position.additionalData.positionInUSD || 0)\n }, 0)\n }\n\n return { ...positionsByProvider, positions: updatedPositions, positionInUSD }\n })\n\n this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices\n }\n\n removeNetworkData(networkId: NetworkId) {\n Object.keys(this.#state).forEach((accountId) => {\n delete this.#state[accountId][networkId]\n })\n this.emitUpdate()\n }\n\n getDefiPositionsState(accountAddr: string) {\n return this.#state[accountAddr] || {}\n }\n\n getNetworksWithPositions(accountAddr: string) {\n return this.#networksWithPositionsByAccounts[accountAddr] || []\n }\n\n removeAccountData(accountAddr: string) {\n delete this.#state[accountAddr]\n delete this.#networksWithPositionsByAccounts[accountAddr]\n this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts)\n\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"defiPositions.js","sourceRoot":"","sources":["../../../../src/controllers/defiPositions/defiPositions.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { NetworkId } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport { getAssetValue } from '../../libs/defiPositions/helpers'\nimport { getAAVEPositions, getUniV3Positions } from '../../libs/defiPositions/providers'\nimport getAccountNetworksWithPositions from '../../libs/defiPositions/providers/helpers/networksWithPositions'\nimport {\n AccountState,\n DeFiPositionsError,\n DeFiPositionsState,\n NetworksWithPositionsByAccounts,\n PositionsByProvider,\n ProviderName\n} from '../../libs/defiPositions/types'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n// eslint-disable-next-line import/no-cycle\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nexport class DefiPositionsController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #fetch: Fetch\n\n #storage: Storage\n\n #minUpdateInterval: number = 60 * 1000 // 1 minute\n\n #state: DeFiPositionsState = {}\n\n #networksWithPositionsByAccounts: NetworksWithPositionsByAccounts = {}\n\n constructor({\n fetch,\n storage,\n selectedAccount,\n providers,\n networks\n }: {\n fetch: Fetch\n storage: Storage\n selectedAccount: SelectedAccountController\n providers: ProvidersController\n networks: NetworksController\n }) {\n super()\n\n this.#fetch = fetch\n this.#storage = storage\n this.#selectedAccount = selectedAccount\n this.#providers = providers\n this.#networks = networks\n }\n\n #setProviderError(\n accountAddr: string,\n networkId: string,\n providerName: ProviderName,\n errorMessage: string\n ) {\n if (!this.#state[accountAddr][networkId].providerErrors) {\n this.#state[accountAddr][networkId].providerErrors = []\n }\n\n this.#state[accountAddr][networkId].providerErrors!.push({\n providerName,\n error: errorMessage\n })\n }\n\n #getCanSkipUpdate(\n accountAddr: string,\n networkId: string,\n maxDataAgeMs = this.#minUpdateInterval\n ) {\n const networkState = this.#state[accountAddr][networkId]\n\n if (networkState.error || networkState.providerErrors?.length) return false\n const isWithinMinUpdateInterval =\n networkState.updatedAt && Date.now() - networkState.updatedAt < maxDataAgeMs\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n async #updateNetworksWithPositions(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = await this.#storage.get('networksWithPositionsByAccounts', {})\n\n this.#networksWithPositionsByAccounts[accountId] = getAccountNetworksWithPositions(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set(\n 'networksWithPositionsByAccounts',\n this.#networksWithPositionsByAccounts\n )\n }\n\n async updatePositions(opts?: { networkId?: NetworkId; maxDataAgeMs?: number }) {\n const { networkId, maxDataAgeMs } = opts || {}\n if (!this.#selectedAccount.account) return\n\n const selectedAccountAddr = this.#selectedAccount.account.addr\n const networksToUpdate = networkId\n ? this.#networks.networks.filter((n) => n.id === networkId)\n : this.#networks.networks\n\n if (!this.#state[selectedAccountAddr]) {\n this.#state[selectedAccountAddr] = {}\n }\n\n await Promise.all(\n networksToUpdate.map(async (n) => {\n if (!this.#state[selectedAccountAddr][n.id]) {\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: [],\n updatedAt: undefined\n }\n }\n\n if (this.#getCanSkipUpdate(selectedAccountAddr, n.id, maxDataAgeMs)) {\n // Emit an update so that the current account data getter is updated\n this.emitUpdate()\n return\n }\n\n this.#state[selectedAccountAddr][n.id].isLoading = true\n this.emitUpdate()\n\n const networkState = this.#state[selectedAccountAddr][n.id]\n // Reset provider errors before updating\n networkState.providerErrors = []\n networkState.error = undefined\n\n try {\n const previousPositions = networkState.positionsByProvider\n const [aavePositions, uniV3Positions] = await Promise.all([\n getAAVEPositions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getAAVEPositions error:', e)\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'AAVE v3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'AAVE v3') || null\n }\n ),\n getUniV3Positions(selectedAccountAddr, this.#providers.providers[n.id], n).catch(\n (e: any) => {\n console.error('getUniV3Positions error:', e)\n\n this.#setProviderError(\n selectedAccountAddr,\n n.id,\n 'Uniswap V3',\n e?.message || 'Unknown error'\n )\n // We should consider changing the structure of positions in a way\n // that this isn't needed. This is done so if there is an error,\n // old data can still be displayed\n return previousPositions?.find((p) => p.providerName === 'Uniswap V3') || null\n }\n )\n ])\n\n const hasErrors = !!this.#state[selectedAccountAddr][n.id].providerErrors?.length\n\n this.#state[selectedAccountAddr][n.id] = {\n ...networkState,\n isLoading: false,\n positionsByProvider: [aavePositions, uniV3Positions].filter(\n Boolean\n ) as PositionsByProvider[],\n updatedAt: hasErrors ? networkState.updatedAt : Date.now()\n }\n await this.#setAssetPrices(selectedAccountAddr, n.id).catch((e) => {\n console.error('#setAssetPrices error:', e)\n this.#state[selectedAccountAddr][n.id].error = DeFiPositionsError.AssetPriceError\n })\n } catch (e: any) {\n const prevPositionsByProvider = networkState.positionsByProvider\n this.#state[selectedAccountAddr][n.id] = {\n isLoading: false,\n positionsByProvider: prevPositionsByProvider || [],\n error: DeFiPositionsError.CriticalError\n }\n console.error(`updatePositions error on ${n.id}`, e)\n } finally {\n this.emitUpdate()\n }\n })\n )\n\n await this.#updateNetworksWithPositions(selectedAccountAddr, this.#state[selectedAccountAddr])\n }\n\n async #setAssetPrices(accountAddr: string, networkId: string) {\n const platformId = this.#networks.networks.find((n) => n.id === networkId)?.platformId\n\n // If we can't determine the Gecko platform ID, we shouldn't make a request to price (cena.ambire.com)\n // since it would return nothing.\n // This can happen when adding a custom network that doesn't have a CoinGecko platform ID.\n if (!platformId) throw new Error('Missing `platformId`')\n\n const dedup = (x: any[]) => x.filter((y, i) => x.indexOf(y) === i)\n\n const networkState = this.#state[accountAddr][networkId]\n\n const addresses: string[] = []\n\n networkState.positionsByProvider.forEach((providerPos) => {\n providerPos.positions.forEach((p) => {\n p.assets.forEach((a) => {\n addresses.push(a.address)\n })\n })\n })\n\n const cenaUrl = `https://cena.ambire.com/api/v3/simple/token_price/${platformId}?contract_addresses=${dedup(\n addresses\n ).join('%2C')}&vs_currencies=usd`\n\n const resp = await this.#fetch(cenaUrl)\n const body = await resp.json()\n if (resp.status !== 200) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('message')) throw body\n // eslint-disable-next-line no-prototype-builtins\n if (body.hasOwnProperty('error')) throw body\n\n const positionsByProviderWithPrices = this.#state[accountAddr][\n networkId\n ].positionsByProvider.map((positionsByProvider) => {\n if (positionsByProvider.providerName.toLowerCase().includes('aave'))\n return positionsByProvider\n\n const updatedPositions = positionsByProvider.positions.map((position) => {\n let positionInUSD = position.additionalData.positionInUSD || 0\n\n const updatedAssets = position.assets.map((asset) => {\n const priceData = body[asset.address.toLowerCase()]\n if (!priceData) return asset\n\n const priceIn = Object.entries(priceData).map(([currency, price]) => ({\n baseCurrency: currency,\n price: price as number\n }))\n\n const value = getAssetValue(asset.amount, asset.decimals, priceIn)\n\n positionInUSD += value\n\n return {\n ...asset,\n value,\n priceIn\n }\n })\n\n return {\n ...position,\n assets: updatedAssets,\n additionalData: { ...position.additionalData, positionInUSD }\n }\n })\n\n let positionInUSD = positionsByProvider.positionInUSD\n\n // Already set in the corresponding lib\n if (!positionInUSD) {\n positionInUSD = updatedPositions.reduce((prevPositionValue, position) => {\n return prevPositionValue + (position.additionalData.positionInUSD || 0)\n }, 0)\n }\n\n return { ...positionsByProvider, positions: updatedPositions, positionInUSD }\n })\n\n this.#state[accountAddr][networkId].positionsByProvider = positionsByProviderWithPrices\n }\n\n removeNetworkData(networkId: NetworkId) {\n Object.keys(this.#state).forEach((accountId) => {\n delete this.#state[accountId][networkId]\n })\n this.emitUpdate()\n }\n\n getDefiPositionsState(accountAddr: string) {\n return this.#state[accountAddr] || {}\n }\n\n getNetworksWithPositions(accountAddr: string) {\n return this.#networksWithPositionsByAccounts[accountAddr] || []\n }\n\n removeAccountData(accountAddr: string) {\n delete this.#state[accountAddr]\n delete this.#networksWithPositionsByAccounts[accountAddr]\n this.#storage.set('networksWithPositionsByAccounts', this.#networksWithPositionsByAccounts)\n\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.d.ts b/dist/src/controllers/emailVault/emailVault.d.ts index 7b1fb2db0..851ec44d1 100644 --- a/dist/src/controllers/emailVault/emailVault.d.ts +++ b/dist/src/controllers/emailVault/emailVault.d.ts @@ -31,9 +31,9 @@ declare const STATUS_WRAPPED_METHODS: { /** * EmailVaultController * @class - * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries + * The purpose of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries * The most important thing it achieves is handling magicLink and session keys with polling. - * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc. + * Emits the proper states e.g. loading, ready, awaiting email magicLink confirmation etc. * Extended documentation about the EV and its internal mechanisms * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation */ @@ -66,6 +66,7 @@ export declare class EmailVaultController extends EventEmitter { fulfillSyncRequests(email: string, password: string): Promise; cleanMagicAndSessionKeys(): Promise; cancelEmailConfirmation(): void; + dismissBanner(): void; get keystoreRecoveryEmail(): string | undefined; get hasKeystoreRecovery(): boolean; get hasConfirmedRecoveryEmail(): boolean; diff --git a/dist/src/controllers/emailVault/emailVault.d.ts.map b/dist/src/controllers/emailVault/emailVault.d.ts.map index 115528da0..37148ecbe 100644 --- a/dist/src/controllers/emailVault/emailVault.d.ts.map +++ b/dist/src/controllers/emailVault/emailVault.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"emailVault.d.ts","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EACL,cAAc,EAEd,aAAa,EAGd,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAMlD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,wBAAwB,6BAA6B;IACrD,eAAe,oBAAoB;IACnC,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,IAAI,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAOD,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACxB,CAAA;AAMD,QAAA,MAAM,sBAAsB;;;;;;CAMlB,CAAA;AAEV;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;;IACpD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,kBAAkB,CAAe;IAsBzC,OAAO,EAAE,OAAO,CAAQ;IAExB,UAAU,EAAE,IAAI,CAAa;IAE7B,gBAAgB,EAAE;QAChB,KAAK,EAAE;YAAE,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAA;SAAE,CAAA;QAC1C,aAAa,CAAC,EAAE,KAAK,CAAA;QACrB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;KACjB,CAEA;IAED,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;gBAG9E,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE;YAYhC,IAAI;IAsBlB,IAAI,YAAY,IAAI,eAAe,CAMlC;IAeK,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa;IA6E3E,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAuBpD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAwCrD,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAyDlC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IA2FlD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IA6D7C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM;IAuBhE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IA+BnD,wBAAwB;IAY9B,uBAAuB;IAMvB,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAY9C;IAED,IAAI,mBAAmB,YAEtB;IAED,IAAI,yBAAyB,IAAI,OAAO,CAQvC;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAiCtB;IAED,MAAM;;;;;;;;CAWP"} \ No newline at end of file +{"version":3,"file":"emailVault.d.ts","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EACL,cAAc,EAEd,aAAa,EAGd,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAMlD,OAAO,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,wBAAwB,6BAA6B;IACrD,eAAe,oBAAoB;IACnC,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,IAAI,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAQD,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACxB,CAAA;AAMD,QAAA,MAAM,sBAAsB;;;;;;CAMlB,CAAA;AAEV;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;;IACpD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,kBAAkB,CAAe;IAsBzC,OAAO,EAAE,OAAO,CAAQ;IAExB,UAAU,EAAE,IAAI,CAAa;IAE7B,gBAAgB,EAAE;QAChB,KAAK,EAAE;YAAE,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAA;SAAE,CAAA;QAC1C,aAAa,CAAC,EAAE,KAAK,CAAA;QACrB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;KACjB,CAEA;IAID,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAyB;gBAG9E,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE;YAYhC,IAAI;IAwBlB,IAAI,YAAY,IAAI,eAAe,CAMlC;IAeK,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa;IA6E3E,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAuBpD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAwCrD,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAyDlC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IA2FlD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IA6D7C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM;IAuBhE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IA+BnD,wBAAwB;IAY9B,uBAAuB;IAMvB,aAAa;IAQb,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAY9C;IAED,IAAI,mBAAmB,YAEtB;IAED,IAAI,yBAAyB,IAAI,OAAO,CAQvC;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CA2CtB;IAED,MAAM;;;;;;;;CAWP"} \ No newline at end of file diff --git a/dist/src/controllers/emailVault/emailVault.js b/dist/src/controllers/emailVault/emailVault.js index f8e9d8a26..fd6dfd42d 100644 --- a/dist/src/controllers/emailVault/emailVault.js +++ b/dist/src/controllers/emailVault/emailVault.js @@ -23,6 +23,7 @@ const RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'; const EMAIL_VAULT_STORAGE_KEY = 'emailVault'; const MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'; const SESSION_KEYS_STORAGE_KEY = 'sessionKeys'; +const SETUP_BANNER_DISMISSED_AT_STORAGE_KEY = 'emailVaultSetupBannerDismissedAt'; function base64UrlEncode(str) { return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); } @@ -36,9 +37,9 @@ const STATUS_WRAPPED_METHODS = { /** * EmailVaultController * @class - * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries + * The purpose of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries * The most important thing it achieves is handling magicLink and session keys with polling. - * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc. + * Emits the proper states e.g. loading, ready, awaiting email magicLink confirmation etc. * Extended documentation about the EV and its internal mechanisms * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation */ @@ -60,6 +61,7 @@ class EmailVaultController extends eventEmitter_1.default { emailVaultStates = { email: {} }; + #setupBannerDismissedAt = 0; statuses = STATUS_WRAPPED_METHODS; constructor(storage, fetch, relayerUrl, keyStore, options) { super(); @@ -78,14 +80,16 @@ class EmailVaultController extends eventEmitter_1.default { // and then we call it's methods await (0, wait_1.default)(1); this.emitUpdate(); - const [emailVaultState, magicLinkKey] = await Promise.all([ + const [emailVaultState, magicLinkKey, dismissedAt] = await Promise.all([ this.storage.get(EMAIL_VAULT_STORAGE_KEY, { email: {} }), - this.storage.get(MAGIC_LINK_STORAGE_KEY, {}) + this.storage.get(MAGIC_LINK_STORAGE_KEY, {}), + this.storage.get(SETUP_BANNER_DISMISSED_AT_STORAGE_KEY, this.#setupBannerDismissedAt) ]); this.emailVaultStates = emailVaultState; this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey); + this.#setupBannerDismissedAt = dismissedAt; this.lastUpdate = new Date(); this.isReady = true; this.emitUpdate(); @@ -465,6 +469,12 @@ class EmailVaultController extends eventEmitter_1.default { this.#isWaitingEmailConfirmation = false; this.emitUpdate(); } + dismissBanner() { + this.#setupBannerDismissedAt = Date.now(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.storage.set(SETUP_BANNER_DISMISSED_AT_STORAGE_KEY, this.#setupBannerDismissedAt); + this.emitUpdate(); + } get keystoreRecoveryEmail() { const keyStoreUid = this.#keyStore.keyStoreUid; const EVEmails = Object.keys(this.emailVaultStates.email); @@ -488,15 +498,22 @@ class EmailVaultController extends eventEmitter_1.default { } get banners() { const banners = []; + const now = Date.now(); + const ONE_WEEK = 1000 * 60 * 60 * 24 * 7; + const isDismissed = this.#setupBannerDismissedAt > 0 && now - this.#setupBannerDismissedAt < ONE_WEEK; // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore) // and if the keystore secret backup is not enabled already - if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) { + if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery && !isDismissed) { banners.push({ id: 'keystore-secret-backup', type: 'info', title: 'Enable device password reset via email', text: "Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.", actions: [ + { + label: 'Dismiss', + actionName: 'dismiss-email-vault' + }, { label: 'Enable', actionName: 'backup-keystore-secret' diff --git a/dist/src/controllers/emailVault/emailVault.js.map b/dist/src/controllers/emailVault/emailVault.js.map index e596d0737..fc3294695 100644 --- a/dist/src/controllers/emailVault/emailVault.js.map +++ b/dist/src/controllers/emailVault/emailVault.js.map @@ -1 +1 @@ -{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable no-await-in-loop */\nimport crypto from 'crypto'\n\nimport { Banner } from '../../interfaces/banner'\nimport {\n EmailVaultData,\n EmailVaultOperation,\n MagicLinkFlow,\n OperationRequestType,\n SecretType\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { getKeySyncBanner } from '../../libs/banners/banners'\nimport { EmailVault } from '../../libs/emailVault/emailVault'\nimport { requestMagicLink } from '../../libs/magicLink/magicLink'\nimport { Polling } from '../../libs/polling/polling'\nimport wait from '../../utils/wait'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\n\nexport enum EmailVaultState {\n Loading = 'loading',\n WaitingEmailConfirmation = 'WaitingEmailConfirmation',\n UploadingSecret = 'UploadingSecret',\n Ready = 'Ready'\n}\n\nexport type MagicLinkKey = {\n key: string\n expiry: Date\n confirmed: boolean\n}\n\nconst RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'\nconst EMAIL_VAULT_STORAGE_KEY = 'emailVault'\nconst MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'\nconst SESSION_KEYS_STORAGE_KEY = 'sessionKeys'\n\nexport type MagicLinkKeys = {\n [email: string]: MagicLinkKey\n}\n\nexport type SessionKeys = {\n [email: string]: string\n}\n\nfunction base64UrlEncode(str: string) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nconst STATUS_WRAPPED_METHODS = {\n getEmailVaultInfo: 'INITIAL',\n uploadKeyStoreSecret: 'INITIAL',\n recoverKeyStore: 'INITIAL',\n requestKeysSync: 'INITIAL',\n finalizeSyncKeys: 'INITIAL'\n} as const\n\n/**\n * EmailVaultController\n * @class\n * The purpouse of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries\n * The most important thing it achieves is handling magicLink and session keys with polling.\n * Emits the porper states e.g. loading, ready, awaiting email magicLink confirmation etc.\n * Extended documentation about the EV and its internal mechanisms\n * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation\n */\nexport class EmailVaultController extends EventEmitter {\n private storage: Storage\n\n private initialLoadPromise: Promise\n\n #isWaitingEmailConfirmation: boolean = false\n\n #isUploadingSecret: boolean = false\n\n #emailVault: EmailVault\n\n #magicLinkKeys: MagicLinkKeys = {}\n\n #sessionKeys: SessionKeys = {}\n\n #shouldStopConfirmationPolling: boolean = false\n\n #autoConfirmMagicLink: boolean = false\n\n #fetch: Fetch\n\n #relayerUrl: string\n\n #keyStore: KeystoreController\n\n isReady: boolean = false\n\n lastUpdate: Date = new Date()\n\n emailVaultStates: {\n email: { [email: string]: EmailVaultData }\n criticalError?: Error\n errors?: Error[]\n } = {\n email: {}\n }\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n relayerUrl: string,\n keyStore: KeystoreController,\n options?: { autoConfirmMagicLink?: boolean }\n ) {\n super()\n this.#fetch = fetch\n this.#relayerUrl = relayerUrl\n this.storage = storage\n this.#emailVault = new EmailVault(fetch, relayerUrl)\n this.#keyStore = keyStore\n this.initialLoadPromise = this.load()\n this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false\n }\n\n private async load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n const [emailVaultState, magicLinkKey] = await Promise.all([\n this.storage.get(EMAIL_VAULT_STORAGE_KEY, {\n email: {}\n }),\n this.storage.get(MAGIC_LINK_STORAGE_KEY, {})\n ])\n\n this.emailVaultStates = emailVaultState\n this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey)\n\n this.lastUpdate = new Date()\n this.isReady = true\n this.emitUpdate()\n }\n\n get currentState(): EmailVaultState {\n if (!this.isReady) return EmailVaultState.Loading\n if (this.#isWaitingEmailConfirmation) return EmailVaultState.WaitingEmailConfirmation\n if (this.#isUploadingSecret) return EmailVaultState.UploadingSecret\n\n return EmailVaultState.Ready\n }\n\n async #requestSessionKey(email: string) {\n // if magicLinkKey => get sessionKey\n const key = (await this.#getMagicLinkKey(email))?.key\n if (!key) return\n this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key)\n\n // store magicLinkKey and sessionKey\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n }\n\n async handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow) {\n await this.initialLoadPromise\n const currentKey = (await this.#getMagicLinkKey(email))?.key\n if (currentKey) {\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n return\n }\n\n this.#isWaitingEmailConfirmation = true\n this.#shouldStopConfirmationPolling = false\n this.emitUpdate()\n\n const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, {\n autoConfirm: this.#autoConfirmMagicLink,\n flow\n })\n\n const polling = new Polling()\n polling.onUpdate(async () => {\n if (polling.state.isError && polling.state.error.output.res.status === 401) {\n this.#isWaitingEmailConfirmation = true\n this.emitUpdate()\n } else if (polling.state.isError) {\n this.emitError({\n message: `Can't request magic link for email ${email}: ${polling.state.error.message}`,\n level: 'major',\n error: new Error(\n `Can't request magic link for email ${email}: ${polling.state.error.message}`\n )\n })\n this.emailVaultStates.errors = [polling.state.error]\n this.emitUpdate()\n }\n })\n\n const ev: (EmailVaultData & { error?: any; canceled?: boolean }) | null = await polling.exec(\n this.#emailVault.getEmailVaultInfo.bind(this.#emailVault),\n [email, newKey.key],\n () => {\n this.#isWaitingEmailConfirmation = false\n },\n () => this.#shouldStopConfirmationPolling,\n 3 * 60 * 1000,\n 1000\n )\n\n if (this.#shouldStopConfirmationPolling) {\n this.emitUpdate()\n return\n }\n\n if (ev && !ev.error) {\n this.#isWaitingEmailConfirmation = false\n this.#magicLinkKeys[email] = {\n key: newKey.key,\n expiry: new Date(newKey.expiry),\n confirmed: true\n }\n fn && (await fn())\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys)\n this.#requestSessionKey(email)\n } else {\n this.emitError({\n message: `Unexpected error getting email vault for ${email}`,\n level: 'major',\n error: new Error(`Unexpected error getting email vault for ${email}`)\n })\n }\n this.emitUpdate()\n }\n\n async #getSessionKey(email: string): Promise {\n await this.initialLoadPromise\n return this.#sessionKeys[email]\n }\n\n getMagicLinkKeyByEmail(email: string): MagicLinkKey | null {\n const result = this.#magicLinkKeys[email]\n if (!result || !result.confirmed) return null\n if (Date.now() >= result.expiry.getTime()) return null\n return result\n }\n\n async #getMagicLinkKey(email: string): Promise {\n // if we have valid magicLinkKey => returns it else null\n await this.initialLoadPromise\n\n return this.getMagicLinkKeyByEmail(email)\n }\n\n #parseMagicLinkKeys(mks: any): MagicLinkKeys {\n return Object.fromEntries(\n Object.keys(mks).map((email) => [\n email,\n { ...mks[email], expiry: new Date(mks[email].expiry) }\n ])\n )\n }\n\n async getEmailVaultInfo(email: string, flow?: MagicLinkFlow) {\n await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow))\n }\n\n async #getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise {\n const [existsSessionKey, magicLinkKey] = await Promise.all([\n this.#getSessionKey(email),\n this.#getMagicLinkKey(email)\n ])\n const key = existsSessionKey || magicLinkKey?.key\n\n let emailVault: EmailVaultData | null = null\n if (key) {\n emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e: any) => {\n this.emitError({\n message: `Error getting email vault for ${email} ${e.message}`,\n level: 'major',\n error: new Error(`Error getting email vault for ${email} ${e.message}`)\n })\n this.emailVaultStates.errors = []\n this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]\n\n return null\n })\n } else {\n await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow)\n }\n\n if (emailVault) {\n this.emailVaultStates.email[email] = emailVault\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n if (!existsSessionKey) {\n await this.#requestSessionKey(email)\n }\n }\n\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n async uploadKeyStoreSecret(email: string) {\n await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email))\n }\n\n async #uploadKeyStoreSecret(email: string) {\n if (!this.emailVaultStates.email[email]) {\n await this.#getEmailVaultInfo(email, 'setup')\n }\n\n let result: Boolean | null = false\n let magicKey = await this.#getMagicLinkKey(email)\n\n if (!magicKey?.key && !this.#shouldStopConfirmationPolling) {\n await this.handleMagicLinkKey(\n email,\n async () => {\n magicKey = await this.#getMagicLinkKey(email)\n },\n 'setup'\n )\n }\n\n if (this.#shouldStopConfirmationPolling) {\n this.#isUploadingSecret = false\n // Set status to ERROR, but don't emit an error message\n throw new Error('')\n }\n\n if (magicKey?.key) {\n this.#isUploadingSecret = true\n const randomBytes = crypto.randomBytes(32)\n // toString('base64url') doesn't work for some reason in the browser extension\n const newSecret = base64UrlEncode(randomBytes.toString('base64'))\n await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false)\n const keyStoreUid = await this.#keyStore.getKeyStoreUid()\n result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret)\n } else\n this.emitError({\n message: 'Email key not confirmed',\n level: 'minor',\n error: new Error('uploadKeyStoreSecret: not confirmed magic link key')\n })\n\n if (result) {\n await this.#getEmailVaultInfo(email, 'setup')\n } else {\n this.emitError({\n level: 'minor',\n message: 'Error upload keyStore to email vault',\n error: new Error('error upload keyStore to email vault')\n })\n }\n\n this.#isUploadingSecret = false\n this.emitUpdate()\n }\n\n async recoverKeyStore(email: string, newPassword: string) {\n await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword))\n }\n\n async #recoverKeyStore(email: string, newPassword: string): Promise {\n const uid = await this.#keyStore.getKeyStoreUid()\n const state = this.emailVaultStates\n if (!state.email[email]) {\n this.emitError({\n message: `You are not logged in with ${email} on this device.`,\n level: 'major',\n error: new Error(`Keystore recovery: email ${email} not imported`)\n })\n return\n }\n\n if (!state.email[email].availableSecrets[uid]) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error('Keystore recovery: no keystore secret for this device')\n })\n return\n }\n if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error(`Keystore recovery: no keystore secret for email ${email}`)\n })\n return\n }\n\n if (email !== this.keystoreRecoveryEmail) {\n return\n }\n const emitExpiredMagicLinkError = () => {\n this.emitError({\n message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`,\n level: 'major',\n error: new Error(`Keystore recovery: magic link expired for ${email}`)\n })\n\n // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated.\n // The application relies on this flag to make decisions regarding\n // which step the user should be in during the Forgotten Password flow.\n this.emitUpdate()\n }\n\n const key = (await this.#getMagicLinkKey(email))?.key\n\n if (!key) {\n emitExpiredMagicLinkError()\n return\n }\n\n let result\n try {\n result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid)\n } catch (e: any) {\n if (e?.output?.res?.message === 'invalid key') {\n emitExpiredMagicLinkError()\n return\n }\n }\n\n if (!result || !result.value) {\n this.emitError({\n message:\n 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support',\n level: 'major',\n error: new Error(\n \"Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.\"\n )\n })\n\n return\n }\n\n // Once we are here - it means we pass all the above validations,\n // and we are ready to change the keystore password secret\n this.emailVaultStates.email[email].availableSecrets[result.key] = result\n\n await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value)\n await this.#keyStore.removeSecret('password')\n await this.#keyStore.addSecret('password', newPassword, '', false)\n\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n this.emitUpdate()\n }\n\n async requestKeysSync(email: string, keys: string[]) {\n await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys))\n }\n\n async #requestKeysSync(email: string, keys: string[]) {\n const [magicLinkKey, keyStoreUid] = await Promise.all([\n this.#getMagicLinkKey(email),\n this.#keyStore.getKeyStoreUid()\n ])\n\n const operations: EmailVaultOperation[] = keys.map((key) => ({\n type: OperationRequestType.requestKeySync,\n requester: keyStoreUid,\n key\n }))\n if (magicLinkKey) {\n const newOperations = (await this.#emailVault.operations(\n email,\n magicLinkKey.key,\n operations\n ))!\n this.emailVaultStates.email[email].operations = newOperations\n this.emitUpdate()\n }\n await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys))\n }\n\n async #finalizeSyncKeys(email: string, operations: EmailVaultOperation[]) {\n const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (authKey) {\n const cloudOperations = await this.#emailVault\n .getOperations(email, authKey, operations)\n .catch((e) => {\n this.emitError({\n message: `Can't pull operations: ${e}`,\n level: 'major',\n error: new Error(`Can't pull operations: ${e}`)\n })\n })\n if (!cloudOperations) {\n this.emitError({\n message: \"Can't pull operations\",\n level: 'major',\n error: new Error(\"Can't pull operations\")\n })\n }\n\n // Promise.all makes race conditions\n for (let i = 0; i < cloudOperations!.length; i++) {\n const op = cloudOperations![i]\n if (op.type === 'requestKeySync' && op.value) {\n const { privateKey } = JSON.parse(op.value || '{}')\n await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true)\n }\n }\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations))\n }\n }\n\n async finalizeSyncKeys(email: string, keys: string[], password: string) {\n const operations: any[] = keys\n .map((key) => {\n const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key)\n if (!res) {\n this.emitError({\n message: `No sync request for key ${key}`,\n level: 'major',\n error: new Error(`No sync request for key ${key}`)\n })\n return null\n }\n return { ...res, password }\n })\n .filter((x) => x)\n await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations))\n }\n\n // DOCS\n // this function:\n // - checks if there are sync requests via the operations route of the relayer\n // - exports the encrypted private key and sends it back to the relayer (fulfills)\n // @TODO add password\n async fulfillSyncRequests(email: string, password: string) {\n await this.#getEmailVaultInfo(email)\n const operations = this.emailVaultStates.email[email].operations\n const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (key) {\n // pull keys from keystore for every operation\n const newOperations: EmailVaultOperation[] = await Promise.all(\n operations.map(async (op): Promise => {\n if (op.type === 'requestKeySync') {\n return {\n ...op,\n value: JSON.stringify({\n privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(\n op.key,\n op.requester\n )\n }),\n password\n }\n }\n return op\n })\n )\n await this.#emailVault.operations(email, key, newOperations)\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password))\n }\n this.emitUpdate()\n }\n\n async cleanMagicAndSessionKeys() {\n this.#magicLinkKeys = {}\n this.#sessionKeys = {}\n\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n\n this.emitUpdate()\n }\n\n cancelEmailConfirmation() {\n this.#shouldStopConfirmationPolling = true\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n get keystoreRecoveryEmail(): string | undefined {\n const keyStoreUid = this.#keyStore.keyStoreUid\n const EVEmails = Object.keys(this.emailVaultStates.email)\n\n if (!keyStoreUid || !EVEmails.length) return\n\n return EVEmails.find((email) => {\n return (\n this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type ===\n SecretType.KeyStore\n )\n })\n }\n\n get hasKeystoreRecovery() {\n return !!this.keystoreRecoveryEmail\n }\n\n get hasConfirmedRecoveryEmail(): boolean {\n if (!this.isReady) return false\n\n const recoveryEmail = this.keystoreRecoveryEmail\n\n if (!recoveryEmail) return false\n\n return !!this.getMagicLinkKeyByEmail(recoveryEmail)\n }\n\n get banners(): Banner[] {\n const banners: Banner[] = []\n\n // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore)\n // and if the keystore secret backup is not enabled already\n if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery) {\n banners.push({\n id: 'keystore-secret-backup',\n type: 'info',\n title: 'Enable device password reset via email',\n text: \"Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.\",\n actions: [\n {\n label: 'Enable',\n actionName: 'backup-keystore-secret'\n }\n ]\n })\n }\n\n Object.keys(this.emailVaultStates.email).forEach((email) => {\n const emailVaultData = this.emailVaultStates?.email?.[email]\n Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => {\n const keystoreKeys = this.#keyStore.keys.filter((key) =>\n accInfo.associatedKeys.includes(key.addr)\n )\n\n if (keystoreKeys.length) return\n banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys))\n })\n })\n\n return banners\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n currentState: this.currentState, // includes the getter in the stringified instance\n hasKeystoreRecovery: this.hasKeystoreRecovery,\n hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail,\n banners: this.banners, // includes the getter in the stringified instance,\n keystoreRecoveryEmail: this.keystoreRecoveryEmail\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"emailVault.js","sourceRoot":"","sources":["../../../../src/controllers/emailVault/emailVault.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable no-await-in-loop */\nimport crypto from 'crypto'\n\nimport { Banner } from '../../interfaces/banner'\nimport {\n EmailVaultData,\n EmailVaultOperation,\n MagicLinkFlow,\n OperationRequestType,\n SecretType\n} from '../../interfaces/emailVault'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Storage } from '../../interfaces/storage'\nimport { getKeySyncBanner } from '../../libs/banners/banners'\nimport { EmailVault } from '../../libs/emailVault/emailVault'\nimport { requestMagicLink } from '../../libs/magicLink/magicLink'\nimport { Polling } from '../../libs/polling/polling'\nimport wait from '../../utils/wait'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\n\nexport enum EmailVaultState {\n Loading = 'loading',\n WaitingEmailConfirmation = 'WaitingEmailConfirmation',\n UploadingSecret = 'UploadingSecret',\n Ready = 'Ready'\n}\n\nexport type MagicLinkKey = {\n key: string\n expiry: Date\n confirmed: boolean\n}\n\nconst RECOVERY_SECRET_ID = 'EmailVaultRecoverySecret'\nconst EMAIL_VAULT_STORAGE_KEY = 'emailVault'\nconst MAGIC_LINK_STORAGE_KEY = 'magicLinkKeys'\nconst SESSION_KEYS_STORAGE_KEY = 'sessionKeys'\nconst SETUP_BANNER_DISMISSED_AT_STORAGE_KEY = 'emailVaultSetupBannerDismissedAt'\n\nexport type MagicLinkKeys = {\n [email: string]: MagicLinkKey\n}\n\nexport type SessionKeys = {\n [email: string]: string\n}\n\nfunction base64UrlEncode(str: string) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nconst STATUS_WRAPPED_METHODS = {\n getEmailVaultInfo: 'INITIAL',\n uploadKeyStoreSecret: 'INITIAL',\n recoverKeyStore: 'INITIAL',\n requestKeysSync: 'INITIAL',\n finalizeSyncKeys: 'INITIAL'\n} as const\n\n/**\n * EmailVaultController\n * @class\n * The purpose of this controller is to provide easy interface to the EmailVault, keystore and magic link libraries\n * The most important thing it achieves is handling magicLink and session keys with polling.\n * Emits the proper states e.g. loading, ready, awaiting email magicLink confirmation etc.\n * Extended documentation about the EV and its internal mechanisms\n * https://github.com/AmbireTech/ambire-common/wiki/Email-Vault-Documentation\n */\nexport class EmailVaultController extends EventEmitter {\n private storage: Storage\n\n private initialLoadPromise: Promise\n\n #isWaitingEmailConfirmation: boolean = false\n\n #isUploadingSecret: boolean = false\n\n #emailVault: EmailVault\n\n #magicLinkKeys: MagicLinkKeys = {}\n\n #sessionKeys: SessionKeys = {}\n\n #shouldStopConfirmationPolling: boolean = false\n\n #autoConfirmMagicLink: boolean = false\n\n #fetch: Fetch\n\n #relayerUrl: string\n\n #keyStore: KeystoreController\n\n isReady: boolean = false\n\n lastUpdate: Date = new Date()\n\n emailVaultStates: {\n email: { [email: string]: EmailVaultData }\n criticalError?: Error\n errors?: Error[]\n } = {\n email: {}\n }\n\n #setupBannerDismissedAt: number = 0\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n relayerUrl: string,\n keyStore: KeystoreController,\n options?: { autoConfirmMagicLink?: boolean }\n ) {\n super()\n this.#fetch = fetch\n this.#relayerUrl = relayerUrl\n this.storage = storage\n this.#emailVault = new EmailVault(fetch, relayerUrl)\n this.#keyStore = keyStore\n this.initialLoadPromise = this.load()\n this.#autoConfirmMagicLink = options?.autoConfirmMagicLink || false\n }\n\n private async load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n const [emailVaultState, magicLinkKey, dismissedAt] = await Promise.all([\n this.storage.get(EMAIL_VAULT_STORAGE_KEY, {\n email: {}\n }),\n this.storage.get(MAGIC_LINK_STORAGE_KEY, {}),\n this.storage.get(SETUP_BANNER_DISMISSED_AT_STORAGE_KEY, this.#setupBannerDismissedAt)\n ])\n\n this.emailVaultStates = emailVaultState\n this.#magicLinkKeys = this.#parseMagicLinkKeys(magicLinkKey)\n this.#setupBannerDismissedAt = dismissedAt\n\n this.lastUpdate = new Date()\n this.isReady = true\n this.emitUpdate()\n }\n\n get currentState(): EmailVaultState {\n if (!this.isReady) return EmailVaultState.Loading\n if (this.#isWaitingEmailConfirmation) return EmailVaultState.WaitingEmailConfirmation\n if (this.#isUploadingSecret) return EmailVaultState.UploadingSecret\n\n return EmailVaultState.Ready\n }\n\n async #requestSessionKey(email: string) {\n // if magicLinkKey => get sessionKey\n const key = (await this.#getMagicLinkKey(email))?.key\n if (!key) return\n this.#sessionKeys[email] = await this.#emailVault.getSessionKey(email, key)\n\n // store magicLinkKey and sessionKey\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n }\n\n async handleMagicLinkKey(email: string, fn?: Function, flow?: MagicLinkFlow) {\n await this.initialLoadPromise\n const currentKey = (await this.#getMagicLinkKey(email))?.key\n if (currentKey) {\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n return\n }\n\n this.#isWaitingEmailConfirmation = true\n this.#shouldStopConfirmationPolling = false\n this.emitUpdate()\n\n const newKey = await requestMagicLink(email, this.#relayerUrl, this.#fetch, {\n autoConfirm: this.#autoConfirmMagicLink,\n flow\n })\n\n const polling = new Polling()\n polling.onUpdate(async () => {\n if (polling.state.isError && polling.state.error.output.res.status === 401) {\n this.#isWaitingEmailConfirmation = true\n this.emitUpdate()\n } else if (polling.state.isError) {\n this.emitError({\n message: `Can't request magic link for email ${email}: ${polling.state.error.message}`,\n level: 'major',\n error: new Error(\n `Can't request magic link for email ${email}: ${polling.state.error.message}`\n )\n })\n this.emailVaultStates.errors = [polling.state.error]\n this.emitUpdate()\n }\n })\n\n const ev: (EmailVaultData & { error?: any; canceled?: boolean }) | null = await polling.exec(\n this.#emailVault.getEmailVaultInfo.bind(this.#emailVault),\n [email, newKey.key],\n () => {\n this.#isWaitingEmailConfirmation = false\n },\n () => this.#shouldStopConfirmationPolling,\n 3 * 60 * 1000,\n 1000\n )\n\n if (this.#shouldStopConfirmationPolling) {\n this.emitUpdate()\n return\n }\n\n if (ev && !ev.error) {\n this.#isWaitingEmailConfirmation = false\n this.#magicLinkKeys[email] = {\n key: newKey.key,\n expiry: new Date(newKey.expiry),\n confirmed: true\n }\n fn && (await fn())\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys)\n this.#requestSessionKey(email)\n } else {\n this.emitError({\n message: `Unexpected error getting email vault for ${email}`,\n level: 'major',\n error: new Error(`Unexpected error getting email vault for ${email}`)\n })\n }\n this.emitUpdate()\n }\n\n async #getSessionKey(email: string): Promise {\n await this.initialLoadPromise\n return this.#sessionKeys[email]\n }\n\n getMagicLinkKeyByEmail(email: string): MagicLinkKey | null {\n const result = this.#magicLinkKeys[email]\n if (!result || !result.confirmed) return null\n if (Date.now() >= result.expiry.getTime()) return null\n return result\n }\n\n async #getMagicLinkKey(email: string): Promise {\n // if we have valid magicLinkKey => returns it else null\n await this.initialLoadPromise\n\n return this.getMagicLinkKeyByEmail(email)\n }\n\n #parseMagicLinkKeys(mks: any): MagicLinkKeys {\n return Object.fromEntries(\n Object.keys(mks).map((email) => [\n email,\n { ...mks[email], expiry: new Date(mks[email].expiry) }\n ])\n )\n }\n\n async getEmailVaultInfo(email: string, flow?: MagicLinkFlow) {\n await this.withStatus('getEmailVaultInfo', () => this.#getEmailVaultInfo(email, flow))\n }\n\n async #getEmailVaultInfo(email: string, flow?: MagicLinkFlow): Promise {\n const [existsSessionKey, magicLinkKey] = await Promise.all([\n this.#getSessionKey(email),\n this.#getMagicLinkKey(email)\n ])\n const key = existsSessionKey || magicLinkKey?.key\n\n let emailVault: EmailVaultData | null = null\n if (key) {\n emailVault = await this.#emailVault.getEmailVaultInfo(email, key).catch((e: any) => {\n this.emitError({\n message: `Error getting email vault for ${email} ${e.message}`,\n level: 'major',\n error: new Error(`Error getting email vault for ${email} ${e.message}`)\n })\n this.emailVaultStates.errors = []\n this.emailVaultStates.errors = [new Error('error retrieving data for email vault')]\n\n return null\n })\n } else {\n await this.handleMagicLinkKey(email, () => this.#getEmailVaultInfo(email, flow), flow)\n }\n\n if (emailVault) {\n this.emailVaultStates.email[email] = emailVault\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n if (!existsSessionKey) {\n await this.#requestSessionKey(email)\n }\n }\n\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n async uploadKeyStoreSecret(email: string) {\n await this.withStatus('uploadKeyStoreSecret', () => this.#uploadKeyStoreSecret(email))\n }\n\n async #uploadKeyStoreSecret(email: string) {\n if (!this.emailVaultStates.email[email]) {\n await this.#getEmailVaultInfo(email, 'setup')\n }\n\n let result: Boolean | null = false\n let magicKey = await this.#getMagicLinkKey(email)\n\n if (!magicKey?.key && !this.#shouldStopConfirmationPolling) {\n await this.handleMagicLinkKey(\n email,\n async () => {\n magicKey = await this.#getMagicLinkKey(email)\n },\n 'setup'\n )\n }\n\n if (this.#shouldStopConfirmationPolling) {\n this.#isUploadingSecret = false\n // Set status to ERROR, but don't emit an error message\n throw new Error('')\n }\n\n if (magicKey?.key) {\n this.#isUploadingSecret = true\n const randomBytes = crypto.randomBytes(32)\n // toString('base64url') doesn't work for some reason in the browser extension\n const newSecret = base64UrlEncode(randomBytes.toString('base64'))\n await this.#keyStore.addSecret(RECOVERY_SECRET_ID, newSecret, '', false)\n const keyStoreUid = await this.#keyStore.getKeyStoreUid()\n result = await this.#emailVault.addKeyStoreSecret(email, magicKey.key, keyStoreUid, newSecret)\n } else\n this.emitError({\n message: 'Email key not confirmed',\n level: 'minor',\n error: new Error('uploadKeyStoreSecret: not confirmed magic link key')\n })\n\n if (result) {\n await this.#getEmailVaultInfo(email, 'setup')\n } else {\n this.emitError({\n level: 'minor',\n message: 'Error upload keyStore to email vault',\n error: new Error('error upload keyStore to email vault')\n })\n }\n\n this.#isUploadingSecret = false\n this.emitUpdate()\n }\n\n async recoverKeyStore(email: string, newPassword: string) {\n await this.withStatus('recoverKeyStore', () => this.#recoverKeyStore(email, newPassword))\n }\n\n async #recoverKeyStore(email: string, newPassword: string): Promise {\n const uid = await this.#keyStore.getKeyStoreUid()\n const state = this.emailVaultStates\n if (!state.email[email]) {\n this.emitError({\n message: `You are not logged in with ${email} on this device.`,\n level: 'major',\n error: new Error(`Keystore recovery: email ${email} not imported`)\n })\n return\n }\n\n if (!state.email[email].availableSecrets[uid]) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error('Keystore recovery: no keystore secret for this device')\n })\n return\n }\n if (state.email[email].availableSecrets[uid].type !== SecretType.KeyStore) {\n this.emitError({\n message: `Resetting the password on this device is not enabled for ${email}.`,\n level: 'major',\n error: new Error(`Keystore recovery: no keystore secret for email ${email}`)\n })\n return\n }\n\n if (email !== this.keystoreRecoveryEmail) {\n return\n }\n const emitExpiredMagicLinkError = () => {\n this.emitError({\n message: `The time allotted for changing your password has expired for ${email}. Please verify your email again!`,\n level: 'major',\n error: new Error(`Keystore recovery: magic link expired for ${email}`)\n })\n\n // Here, we want to emit an update so that the `hasConfirmedRecoveryEmail` getter can be recalculated.\n // The application relies on this flag to make decisions regarding\n // which step the user should be in during the Forgotten Password flow.\n this.emitUpdate()\n }\n\n const key = (await this.#getMagicLinkKey(email))?.key\n\n if (!key) {\n emitExpiredMagicLinkError()\n return\n }\n\n let result\n try {\n result = await this.#emailVault.retrieveKeyStoreSecret(email, key, uid)\n } catch (e: any) {\n if (e?.output?.res?.message === 'invalid key') {\n emitExpiredMagicLinkError()\n return\n }\n }\n\n if (!result || !result.value) {\n this.emitError({\n message:\n 'Something goes wrong while we are resetting your password! Please try again! If the problem persists, please contact support',\n level: 'major',\n error: new Error(\n \"Keystore recovery: retrieveKeyStoreSecret doesn't return result or result.value.\"\n )\n })\n\n return\n }\n\n // Once we are here - it means we pass all the above validations,\n // and we are ready to change the keystore password secret\n this.emailVaultStates.email[email].availableSecrets[result.key] = result\n\n await this.#keyStore.unlockWithSecret(RECOVERY_SECRET_ID, result.value)\n await this.#keyStore.removeSecret('password')\n await this.#keyStore.addSecret('password', newPassword, '', false)\n\n await this.storage.set(EMAIL_VAULT_STORAGE_KEY, this.emailVaultStates)\n this.emitUpdate()\n }\n\n async requestKeysSync(email: string, keys: string[]) {\n await this.withStatus('requestKeysSync', () => this.#requestKeysSync(email, keys))\n }\n\n async #requestKeysSync(email: string, keys: string[]) {\n const [magicLinkKey, keyStoreUid] = await Promise.all([\n this.#getMagicLinkKey(email),\n this.#keyStore.getKeyStoreUid()\n ])\n\n const operations: EmailVaultOperation[] = keys.map((key) => ({\n type: OperationRequestType.requestKeySync,\n requester: keyStoreUid,\n key\n }))\n if (magicLinkKey) {\n const newOperations = (await this.#emailVault.operations(\n email,\n magicLinkKey.key,\n operations\n ))!\n this.emailVaultStates.email[email].operations = newOperations\n this.emitUpdate()\n }\n await this.handleMagicLinkKey(email, () => this.#requestKeysSync(email, keys))\n }\n\n async #finalizeSyncKeys(email: string, operations: EmailVaultOperation[]) {\n const authKey = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (authKey) {\n const cloudOperations = await this.#emailVault\n .getOperations(email, authKey, operations)\n .catch((e) => {\n this.emitError({\n message: `Can't pull operations: ${e}`,\n level: 'major',\n error: new Error(`Can't pull operations: ${e}`)\n })\n })\n if (!cloudOperations) {\n this.emitError({\n message: \"Can't pull operations\",\n level: 'major',\n error: new Error(\"Can't pull operations\")\n })\n }\n\n // Promise.all makes race conditions\n for (let i = 0; i < cloudOperations!.length; i++) {\n const op = cloudOperations![i]\n if (op.type === 'requestKeySync' && op.value) {\n const { privateKey } = JSON.parse(op.value || '{}')\n await this.#keyStore.importKeyWithPublicKeyEncryption(privateKey, true)\n }\n }\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.#finalizeSyncKeys(email, operations))\n }\n }\n\n async finalizeSyncKeys(email: string, keys: string[], password: string) {\n const operations: any[] = keys\n .map((key) => {\n const res = this.emailVaultStates.email[email].operations.find((op) => op.key === key)\n if (!res) {\n this.emitError({\n message: `No sync request for key ${key}`,\n level: 'major',\n error: new Error(`No sync request for key ${key}`)\n })\n return null\n }\n return { ...res, password }\n })\n .filter((x) => x)\n await this.withStatus('finalizeSyncKeys', () => this.#finalizeSyncKeys(email, operations))\n }\n\n // DOCS\n // this function:\n // - checks if there are sync requests via the operations route of the relayer\n // - exports the encrypted private key and sends it back to the relayer (fulfills)\n // @TODO add password\n async fulfillSyncRequests(email: string, password: string) {\n await this.#getEmailVaultInfo(email)\n const operations = this.emailVaultStates.email[email].operations\n const key = (await this.#getMagicLinkKey(email))?.key || (await this.#getSessionKey(email))\n if (key) {\n // pull keys from keystore for every operation\n const newOperations: EmailVaultOperation[] = await Promise.all(\n operations.map(async (op): Promise => {\n if (op.type === 'requestKeySync') {\n return {\n ...op,\n value: JSON.stringify({\n privateKey: await this.#keyStore.exportKeyWithPublicKeyEncryption(\n op.key,\n op.requester\n )\n }),\n password\n }\n }\n return op\n })\n )\n await this.#emailVault.operations(email, key, newOperations)\n this.emitUpdate()\n } else {\n await this.handleMagicLinkKey(email, () => this.fulfillSyncRequests(email, password))\n }\n this.emitUpdate()\n }\n\n async cleanMagicAndSessionKeys() {\n this.#magicLinkKeys = {}\n this.#sessionKeys = {}\n\n await Promise.all([\n this.storage.set(MAGIC_LINK_STORAGE_KEY, this.#magicLinkKeys),\n this.storage.set(SESSION_KEYS_STORAGE_KEY, this.#sessionKeys)\n ])\n\n this.emitUpdate()\n }\n\n cancelEmailConfirmation() {\n this.#shouldStopConfirmationPolling = true\n this.#isWaitingEmailConfirmation = false\n this.emitUpdate()\n }\n\n dismissBanner() {\n this.#setupBannerDismissedAt = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.storage.set(SETUP_BANNER_DISMISSED_AT_STORAGE_KEY, this.#setupBannerDismissedAt)\n\n this.emitUpdate()\n }\n\n get keystoreRecoveryEmail(): string | undefined {\n const keyStoreUid = this.#keyStore.keyStoreUid\n const EVEmails = Object.keys(this.emailVaultStates.email)\n\n if (!keyStoreUid || !EVEmails.length) return\n\n return EVEmails.find((email) => {\n return (\n this.emailVaultStates.email[email].availableSecrets[keyStoreUid]?.type ===\n SecretType.KeyStore\n )\n })\n }\n\n get hasKeystoreRecovery() {\n return !!this.keystoreRecoveryEmail\n }\n\n get hasConfirmedRecoveryEmail(): boolean {\n if (!this.isReady) return false\n\n const recoveryEmail = this.keystoreRecoveryEmail\n\n if (!recoveryEmail) return false\n\n return !!this.getMagicLinkKeyByEmail(recoveryEmail)\n }\n\n get banners(): Banner[] {\n const banners: Banner[] = []\n\n const now = Date.now()\n const ONE_WEEK = 1000 * 60 * 60 * 24 * 7\n\n const isDismissed =\n this.#setupBannerDismissedAt > 0 && now - this.#setupBannerDismissedAt < ONE_WEEK\n\n // Show the banner if the keystore is already configured and the `password` secret is already set (for HW and ViewOnly accounts the app can run without keystore)\n // and if the keystore secret backup is not enabled already\n if (this.#keyStore.hasPasswordSecret && !this.hasKeystoreRecovery && !isDismissed) {\n banners.push({\n id: 'keystore-secret-backup',\n type: 'info',\n title: 'Enable device password reset via email',\n text: \"Email Vault recovers your device password. It is securely stored in Ambire's infrastructure cloud.\",\n actions: [\n {\n label: 'Dismiss',\n actionName: 'dismiss-email-vault'\n },\n {\n label: 'Enable',\n actionName: 'backup-keystore-secret'\n }\n ]\n })\n }\n\n Object.keys(this.emailVaultStates.email).forEach((email) => {\n const emailVaultData = this.emailVaultStates?.email?.[email]\n Object.values(emailVaultData.availableAccounts || {}).forEach((accInfo) => {\n const keystoreKeys = this.#keyStore.keys.filter((key) =>\n accInfo.associatedKeys.includes(key.addr)\n )\n\n if (keystoreKeys.length) return\n banners.push(getKeySyncBanner(accInfo.addr, email, accInfo.associatedKeys))\n })\n })\n\n return banners\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n currentState: this.currentState, // includes the getter in the stringified instance\n hasKeystoreRecovery: this.hasKeystoreRecovery,\n hasConfirmedRecoveryEmail: this.hasConfirmedRecoveryEmail,\n banners: this.banners, // includes the getter in the stringified instance,\n keystoreRecoveryEmail: this.keystoreRecoveryEmail\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.d.ts b/dist/src/controllers/keystore/keystore.d.ts index a0c88871d..75d908e3f 100644 --- a/dist/src/controllers/keystore/keystore.d.ts +++ b/dist/src/controllers/keystore/keystore.d.ts @@ -57,7 +57,7 @@ export declare class KeystoreController extends EventEmitter { addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean): Promise; removeSecret(secretId: string): Promise; get keys(): Key[]; - addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed): Promise; + addSeedToTemp({ seed, seedPassphrase, hdPathTemplate }: KeystoreSeed): Promise; deleteTempSeed(shouldUpdate?: boolean): void; moveTempSeedToKeystoreSeeds(): Promise; addSeed(keystoreSeed: KeystoreSeed): Promise; @@ -79,10 +79,7 @@ export declare class KeystoreController extends EventEmitter { exportKeyWithPublicKeyEncryption(keyAddress: string, publicKey: string): Promise; importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean): Promise; getSigner(keyAddress: Key['addr'], keyType: Key['type']): Promise; - getSavedSeed(): Promise<{ - seed: string; - hdPathTemplate: HD_PATH_TEMPLATE_TYPE; - }>; + getSavedSeed(): Promise; changeKeystorePassword(newSecret: string, oldSecret?: string): Promise; updateKeyPreferences(keys: { addr: Key['addr']; diff --git a/dist/src/controllers/keystore/keystore.d.ts.map b/dist/src/controllers/keystore/keystore.d.ts.map index 21e588341..19b0d8640 100644 --- a/dist/src/controllers/keystore/keystore.d.ts.map +++ b/dist/src/controllers/keystore/keystore.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/keystore/keystore.js b/dist/src/controllers/keystore/keystore.js index 52c86a68b..5e6ba3ed6 100644 --- a/dist/src/controllers/keystore/keystore.js +++ b/dist/src/controllers/keystore/keystore.js @@ -302,7 +302,7 @@ class KeystoreController extends eventEmitter_1.default { }; }); } - async #getEncryptedSeed(seed) { + async #getEncryptedSeedPhrase(seed, seedPassphrase) { await this.#initialLoadPromise; if (this.#mainKey === null) throw new EmittableError_1.default({ @@ -329,9 +329,14 @@ class KeystoreController extends eventEmitter_1.default { // Set up the cipher const counter = new aes_js_1.default.Counter(this.#mainKey.iv); // TS compiler fails to detect we check for null above const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); // TS compiler fails to detect we check for null above\ - return (0, ethers_1.hexlify)(aesCtr.encrypt(new TextEncoder().encode(seed))); + return { + seed: (0, ethers_1.hexlify)(aesCtr.encrypt(new TextEncoder().encode(seed))), + passphrase: seedPassphrase + ? (0, ethers_1.hexlify)(aesCtr.encrypt(new TextEncoder().encode(seedPassphrase))) + : null + }; } - async addSeedToTemp({ seed, hdPathTemplate }) { + async addSeedToTemp({ seed, seedPassphrase, hdPathTemplate }) { const validHdPath = derivation_1.DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate); if (!validHdPath) throw new EmittableError_1.default({ @@ -339,10 +344,8 @@ class KeystoreController extends eventEmitter_1.default { level: 'major', error: new Error('keystore: hd path to temp seed incorrect') }); - this.#tempSeed = { - seed: await this.#getEncryptedSeed(seed), - hdPathTemplate - }; + const { seed: seedPhrase, passphrase } = await this.#getEncryptedSeedPhrase(seed, seedPassphrase); + this.#tempSeed = { seed: seedPhrase, seedPassphrase: passphrase, hdPathTemplate }; this.emitUpdate(); } deleteTempSeed(shouldUpdate = true) { @@ -382,11 +385,9 @@ class KeystoreController extends eventEmitter_1.default { await this.#initialLoadPromise; await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds()); } - async #addSeed({ seed, hdPathTemplate }) { - this.#keystoreSeeds.push({ - seed: await this.#getEncryptedSeed(seed), - hdPathTemplate - }); + async #addSeed({ seed, seedPassphrase, hdPathTemplate }) { + const { seed: seedPhrase, passphrase } = await this.#getEncryptedSeedPhrase(seed, seedPassphrase); + this.#keystoreSeeds.push({ seed: seedPhrase, seedPassphrase: passphrase, hdPathTemplate }); await this.#storage.set('keystoreSeeds', this.#keystoreSeeds); this.emitUpdate(); } @@ -554,7 +555,10 @@ class KeystoreController extends eventEmitter_1.default { } async sendSeedToUi() { const decrypted = await this.getSavedSeed(); - this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed }); + this.#windowManager.sendWindowUiMessage({ + seed: decrypted.seed, + seedPassphrase: decrypted.seedPassphrase + }); } async #getPrivateKey(keyAddress) { await this.#initialLoadPromise; @@ -652,6 +656,16 @@ class KeystoreController extends eventEmitter_1.default { const aesCtr = new aes_js_1.default.ModeOfOperation.ctr(this.#mainKey.key, counter); const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes); const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes); + if (this.#keystoreSeeds[0].seedPassphrase) { + const encryptedSeedPassphraseBytes = (0, ethers_1.getBytes)(this.#keystoreSeeds[0].seedPassphrase); + const decryptedSeedPassphraseBytes = aesCtr.decrypt(encryptedSeedPassphraseBytes); + const decryptedSeedPassphrase = new TextDecoder().decode(decryptedSeedPassphraseBytes); + return { + seed: decryptedSeed, + seedPassphrase: decryptedSeedPassphrase, + hdPathTemplate + }; + } return { seed: decryptedSeed, hdPathTemplate }; } async #changeKeystorePassword(newSecret, oldSecret) { diff --git a/dist/src/controllers/keystore/keystore.js.map b/dist/src/controllers/keystore/keystore.js.map index 4913d7251..2e20a0ecb 100644 --- a/dist/src/controllers/keystore/keystore.js.map +++ b/dist/src/controllers/keystore/keystore.js.map @@ -1 +1 @@ -{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable new-cap */\n/* eslint-disable @typescript-eslint/no-shadow */\nimport aes from 'aes-js'\n// import { entropyToMnemonic } from 'bip39'\nimport {\n decryptWithPrivateKey,\n Encrypted,\n encryptWithPublicKey,\n publicKeyByPrivateKey\n} from 'eth-crypto'\nimport {\n concat,\n getBytes,\n hexlify,\n keccak256,\n Mnemonic,\n randomBytes,\n toUtf8Bytes,\n Wallet\n} from 'ethers'\nimport scrypt from 'scrypt-js'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { DERIVATION_OPTIONS, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Banner } from '../../interfaces/banner'\nimport {\n ExternalKey,\n InternalKey,\n Key,\n KeyPreferences,\n KeystoreSeed,\n KeystoreSignerType,\n MainKey,\n MainKeyEncryptedWithSecret,\n ReadyToAddKeys,\n StoredKey\n} from '../../interfaces/keystore'\nimport { Storage } from '../../interfaces/storage'\nimport { WindowManager } from '../../interfaces/window'\nimport {\n getDefaultKeyLabel,\n getShouldMigrateKeyMetaNullToKeyMetaCreatedAt,\n getShouldMigrateKeystoreSeedsWithoutHdPath,\n migrateKeyMetaNullToKeyMetaCreatedAt,\n migrateKeyPreferencesToKeystoreKeys,\n migrateKeystoreSeedsWithoutHdPathTemplate\n} from '../../libs/keys/keys'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }\nconst CIPHER = 'aes-128-ctr'\nconst KEYSTORE_UNEXPECTED_ERROR_MESSAGE =\n 'Keystore unexpected error. If the problem persists, please contact support.'\n\nconst STATUS_WRAPPED_METHODS = {\n unlockWithSecret: 'INITIAL',\n addSecret: 'INITIAL',\n addSeed: 'INITIAL',\n moveTempSeedToKeystoreSeeds: 'INITIAL',\n deleteSavedSeed: 'INITIAL',\n removeSecret: 'INITIAL',\n addKeys: 'INITIAL',\n addKeysExternallyStored: 'INITIAL',\n changeKeystorePassword: 'INITIAL',\n updateKeyPreferences: 'INITIAL'\n} as const\n\nfunction getBytesForSecret(secret: string): ArrayLike {\n // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24\n return toUtf8Bytes(secret, 'NFKC')\n}\n\n/**\n * The KeystoreController is a class that manages a collection of encrypted keys.\n * It provides methods for adding, removing, and retrieving keys. The keys are\n * encrypted using a main key, which is itself encrypted using one or more secrets.\n *\n * Docs:\n * - Secrets are strings that are used to encrypt the mainKey; the mainKey\n * could be encrypted with many secrets\n * - All individual keys are encrypted with the mainKey\n * - The mainKey is kept in memory, but only for the unlockedTime\n * Design decisions:\n * - decided to store all keys in the Keystore, even if the private key itself\n * is not stored there; simply because it's called a Keystore and the name\n * implies the functionality\n * - handle HW wallets in it, so that we handle everything uniformly with a\n * single API; also, it allows future flexibility to have the concept of\n * optional unlocking built-in; if we have interactivity, we can add\n * `keystore.signExtraInputRequired(key)` which returns what we need from the user\n * - `signWithkey` is presumed to be non-interactive at least from `Keystore`\n * point of view (requiring no extra user inputs). This could be wrong, if\n * hardware wallets require extra input - they normally always do, but with\n * the web SDKs we \"outsource\" this to the HW wallet software itself;\n * this may not be true on mobile\n */\nexport class KeystoreController extends EventEmitter {\n #mainKey: MainKey | null\n\n // Secrets are strings that are used to encrypt the mainKey.\n // The mainKey could be encrypted with many secrets.\n #keystoreSecrets: MainKeyEncryptedWithSecret[] = []\n\n #storage: Storage\n\n #keystoreSeeds: KeystoreSeed[] = []\n\n // when importing a seed, save it temporary here before deciding\n // whether to place it in #keystoreSeeds or delete it\n //\n // this should be done only if there isn't a saved seed already\n #tempSeed: KeystoreSeed | null = null\n\n #keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n\n #keystoreKeys: StoredKey[] = []\n\n keyStoreUid: string | null\n\n isReadyToStoreKeys: boolean = false\n\n errorMessage: string = ''\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #windowManager: WindowManager\n\n constructor(\n _storage: Storage,\n _keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>,\n windowManager: WindowManager\n ) {\n super()\n this.#storage = _storage\n this.#keystoreSigners = _keystoreSigners\n this.#mainKey = null\n this.keyStoreUid = null\n this.#windowManager = windowManager\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([\n this.#storage.get('keystoreSeeds', []),\n this.#storage.get('keyStoreUid', null),\n this.#storage.get('keystoreKeys', []),\n this.#storage.get('keyPreferences', [])\n ])\n this.keyStoreUid = keyStoreUid\n\n if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) {\n // Cast to the old type (string[]) to avoid TS errors\n const preMigrationKeystoreSeeds = keystoreSeeds as unknown as string[]\n this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n } else {\n this.#keystoreSeeds = keystoreSeeds\n }\n\n const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0\n if (shouldMigrateKeyPreferencesToKeystoreKeys) {\n this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n await this.#storage.remove('keyPreferences')\n } else {\n this.#keystoreKeys = keystoreKeys\n }\n\n if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) {\n this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to pull keys from storage')\n })\n }\n\n try {\n this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', [])\n this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n lock() {\n this.#mainKey = null\n if (this.#tempSeed) this.deleteTempSeed(false)\n this.emitUpdate()\n }\n\n get isUnlocked() {\n return !!this.#mainKey\n }\n\n async getKeyStoreUid() {\n const uid = this.keyStoreUid\n if (!uid) throw new Error('keystore: adding secret before get uid')\n\n return uid\n }\n\n // @TODO time before unlocking\n async #unlockWithSecret(secretId: string, secret: string) {\n await this.#initialLoadPromise\n\n // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct\n if (!this.#keystoreSecrets.length) {\n throw new EmittableError({\n message:\n 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: no secrets yet')\n })\n }\n\n const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId)\n if (!secretEntry) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: secret not found')\n })\n }\n\n const { scryptParams, aesEncrypted } = secretEntry\n if (aesEncrypted.cipherType !== CIPHER) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`)\n })\n }\n // @TODO: progressCallback?\n\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n getBytes(scryptParams.salt),\n scryptParams.N,\n scryptParams.r,\n scryptParams.p,\n scryptParams.dkLen,\n () => {}\n )\n const iv = getBytes(aesEncrypted.iv)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext]))\n if (mac !== aesEncrypted.mac) {\n this.errorMessage = 'Incorrect password. Please try again.'\n this.emitUpdate()\n\n const error = new Error(this.errorMessage)\n throw new EmittableError({ level: 'silent', message: this.errorMessage, error })\n }\n this.errorMessage = ''\n\n const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext))\n this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }\n }\n\n async unlockWithSecret(secretId: string, secret: string) {\n await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret))\n }\n\n async #addSecret(\n secretId: string,\n secret: string,\n extraEntropy: string = '',\n leaveUnlocked: boolean = false\n ) {\n await this.#initialLoadPromise\n\n // @TODO test\n if (this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: trying to add duplicate secret ${secretId}`)\n })\n\n let mainKey: MainKey | null = this.#mainKey\n // We are not unlocked\n if (!mainKey) {\n if (!this.#keystoreSecrets.length) {\n const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(\n 0,\n 16\n )\n mainKey = {\n key,\n iv: randomBytes(16)\n }\n } else\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: must unlock keystore before adding secret')\n })\n\n if (leaveUnlocked) {\n this.#mainKey = mainKey\n }\n }\n\n const salt = randomBytes(32)\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n salt,\n scryptDefaults.N,\n scryptDefaults.r,\n scryptDefaults.p,\n scryptDefaults.dkLen,\n () => {}\n )\n const iv = randomBytes(16)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv])))\n const mac = keccak256(concat([macPrefix, ciphertext]))\n\n this.#keystoreSecrets.push({\n id: secretId,\n scryptParams: { salt: hexlify(salt), ...scryptDefaults },\n aesEncrypted: {\n cipherType: CIPHER,\n ciphertext: hexlify(ciphertext),\n iv: hexlify(iv),\n mac: hexlify(mac)\n }\n })\n // Persist the new secrets\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n\n // produce uid if one doesn't exist (should be created when the first secret is added)\n if (!this.keyStoreUid) {\n const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv]))))\n this.keyStoreUid = uid\n await this.#storage.set('keyStoreUid', uid)\n }\n\n this.isReadyToStoreKeys = true\n }\n\n async addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean) {\n await this.withStatus('addSecret', () =>\n this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)\n )\n }\n\n async #removeSecret(secretId: string) {\n await this.#initialLoadPromise\n\n if (!this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: secret$ ${secretId} not found`)\n })\n\n this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId)\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n }\n\n async removeSecret(secretId: string) {\n await this.withStatus('removeSecret', () => this.#removeSecret(secretId))\n }\n\n get keys(): Key[] {\n return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => {\n // Written with this 'internal' type guard (if) on purpose, because this\n // way TypeScript will be able to narrow down the types properly and infer\n // the return type of the map function correctly.\n if (type === 'internal') {\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: false\n }\n }\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta: meta as ExternalKey['meta'],\n isExternallyStored: true\n }\n })\n }\n\n async #getEncryptedSeed(seed: KeystoreSeed['seed']): Promise {\n await this.#initialLoadPromise\n\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n if (!Mnemonic.isValidMnemonic(seed)) {\n throw new EmittableError({\n message: 'You are trying to store an invalid seed phrase.',\n level: 'major',\n error: new Error('keystore: trying to add an invalid seed phrase')\n })\n }\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\\\n return hexlify(aesCtr.encrypt(new TextEncoder().encode(seed)))\n }\n\n async addSeedToTemp({ seed, hdPathTemplate }: KeystoreSeed) {\n const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate)\n if (!validHdPath)\n throw new EmittableError({\n message:\n 'Incorrect derivation path when trying to update the temp seed. Please contact support',\n level: 'major',\n error: new Error('keystore: hd path to temp seed incorrect')\n })\n\n this.#tempSeed = {\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n }\n\n this.emitUpdate()\n }\n\n deleteTempSeed(shouldUpdate = true) {\n this.#tempSeed = null\n if (shouldUpdate) this.emitUpdate()\n }\n\n async #moveTempSeedToKeystoreSeeds() {\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n if (!this.#tempSeed) {\n throw new EmittableError({\n message:\n 'Imported seed no longer exists in the extension. If you want to save it, please re-import it',\n level: 'major',\n error: new Error('keystore: imported seed deleted although a request to save it was made')\n })\n }\n\n this.#keystoreSeeds.push(this.#tempSeed)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n this.#tempSeed = null\n this.emitUpdate()\n }\n\n async moveTempSeedToKeystoreSeeds() {\n await this.#initialLoadPromise\n await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds())\n }\n\n async #addSeed({ seed, hdPathTemplate }: KeystoreSeed) {\n this.#keystoreSeeds.push({\n seed: await this.#getEncryptedSeed(seed),\n hdPathTemplate\n })\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async addSeed(keystoreSeed: KeystoreSeed) {\n await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed))\n }\n\n async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#tempSeed) throw new Error('keystore: no temp seed at the moment')\n\n const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n this.#tempSeed.hdPathTemplate = nextHdPathTemplate\n\n this.emitUpdate()\n }\n\n async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore\n this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async #addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.#initialLoadPromise\n\n if (!keysToAdd.length) return\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniqueKeys: { addr: Key['addr']; type: Key['type'] }[] = []\n const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => {\n if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) {\n return false\n }\n\n uniqueKeys.push({ addr, type })\n return true\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys = uniqueKeysToAdd\n .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n privKey: null\n }))\n // No need to re-add keys that are already added (with the same type / device)\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd))\n }\n\n async #addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.#initialLoadPromise\n if (!keysToAdd.length) return\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniquePrivateKeysToAddSet = new Set()\n const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => {\n if (!uniquePrivateKeysToAddSet.has(privateKey)) {\n uniquePrivateKeysToAddSet.add(privateKey)\n return true\n }\n return false\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys: StoredKey[] = uniqueKeysToAdd\n .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => {\n // eslint-disable-next-line no-param-reassign\n privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), // TODO: consider a MAC?\n meta\n }\n })\n // No need to re-add keys that are already added, private key never changes\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.withStatus('addKeys', () => this.#addKeys(keysToAdd))\n }\n\n async removeKey(addr: Key['addr'], type: Key['type']) {\n await this.#initialLoadPromise\n if (!this.isUnlocked)\n throw new EmittableError({\n message:\n 'Extension not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n const keys = this.#keystoreKeys\n if (!keys.find((x) => x.addr === addr && x.type === type))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(\n `keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`\n )\n })\n\n this.#keystoreKeys = keys.filter((key) => {\n const isMatching = key.addr === addr && key.type === type\n\n return !isMatching\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n\n async exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string) {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n const wallet = new Wallet(decryptedPrivateKey)\n const keyBackup = await wallet.encrypt(passphrase)\n return JSON.stringify(keyBackup)\n }\n\n async sendPrivateKeyToUi(keyAddress: string) {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` })\n }\n\n async sendSeedToUi() {\n const decrypted = await this.getSavedSeed()\n this.#windowManager.sendWindowUiMessage({ seed: decrypted.seed })\n }\n\n async #getPrivateKey(keyAddress: string): Promise {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress)\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n // decrypt the pk of keyAddress with the keystore's key\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n // encrypt the pk of keyAddress with publicKey\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n return aes.utils.hex.fromBytes(decryptedBytes)\n }\n\n /**\n * Export with public key encrypt\n *\n * @param keyAddress string - the address of the key you want to export\n * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId)\n * @returns Encrypted\n */\n async exportKeyWithPublicKeyEncryption(\n keyAddress: string,\n publicKey: string\n ): Promise {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey)\n\n return result\n }\n\n async importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean) {\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const privateKey: string = await decryptWithPrivateKey(\n hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))),\n encryptedSk\n )\n if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key')\n\n const keyToAdd: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n } = {\n addr: new Wallet(privateKey).address,\n privateKey,\n label: getDefaultKeyLabel(this.keys, 0),\n type: 'internal',\n dedicatedToOneSA,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n\n await this.addKeys([keyToAdd])\n }\n\n async getSigner(keyAddress: Key['addr'], keyType: Key['type']) {\n await this.#initialLoadPromise\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n const { addr, type, label, dedicatedToOneSA, meta } = storedKey\n\n const key = {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: type !== 'internal'\n }\n\n const SignerInitializer = this.#keystoreSigners[key.type]\n if (!SignerInitializer) throw new Error('keystore: unsupported signer type')\n\n if (key.type === 'internal') {\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key, decryptedPrivateKey)\n }\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key)\n }\n\n async getSavedSeed() {\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate\n const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes)\n const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes)\n return { seed: decryptedSeed, hdPathTemplate }\n }\n\n async #changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.#initialLoadPromise\n\n // In the case the user wants to change their device password,\n // they should also provide the previous password (oldSecret).\n //\n // However, in the case of KeyStore recovery, the user may have already forgotten the password,\n // but the Keystore is already unlocked with the recovery secret.\n // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it.\n //\n // However, there is one problem if we leave it that way:\n //\n // 1. If the user recovers and unlocks the Keystore.\n // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab).\n // 3. And later decides to change the old password from Settings.\n // 4. Then they would not be able to do it because they don't know the old password.\n //\n // We are going to discuss it in the next meeting, but for now, we are leaving it as it is.\n // The long-term solution would be to refactor EmailVault recovery logic\n // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase.\n if (oldSecret) await this.#unlockWithSecret('password', oldSecret)\n\n if (!this.isUnlocked)\n throw new EmittableError({\n message: 'App not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n\n await this.#removeSecret('password')\n await this.#addSecret('password', newSecret, '', true)\n }\n\n async changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.withStatus('changeKeystorePassword', () =>\n this.#changeKeystorePassword(newSecret, oldSecret)\n )\n }\n\n async updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys))\n }\n\n async #updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => {\n const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type)\n\n if (!key) return keystoreKey\n\n return { ...keystoreKey, ...key.preferences }\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n this.emitUpdate()\n }\n\n async deleteSavedSeed() {\n await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed())\n }\n\n async #deleteSavedSeed() {\n await this.#initialLoadPromise\n\n this.#keystoreSeeds = []\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n resetErrorState() {\n this.errorMessage = ''\n this.emitUpdate()\n }\n\n get hasPasswordSecret() {\n return this.#keystoreSecrets.some((x) => x.id === 'password')\n }\n\n get hasKeystoreSavedSeed() {\n return !!this.#keystoreSeeds.length\n }\n\n get hasKeystoreTempSeed() {\n return !!this.#tempSeed\n }\n\n get banners(): Banner[] {\n if (!this.#tempSeed) return []\n\n return [\n {\n id: 'tempSeed',\n type: 'warning',\n category: 'temp-seed-not-confirmed',\n title: 'You have an unsaved imported seed',\n text: '',\n actions: [\n {\n label: 'Check',\n actionName: 'confirm-temp-seed'\n }\n ]\n }\n ]\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isUnlocked: this.isUnlocked, // includes the getter in the stringified instance\n keys: this.keys,\n hasPasswordSecret: this.hasPasswordSecret,\n hasKeystoreSavedSeed: this.hasKeystoreSavedSeed,\n hasKeystoreTempSeed: this.hasKeystoreTempSeed,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/controllers/keystore/keystore.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable new-cap */\n/* eslint-disable @typescript-eslint/no-shadow */\nimport aes from 'aes-js'\n// import { entropyToMnemonic } from 'bip39'\nimport {\n decryptWithPrivateKey,\n Encrypted,\n encryptWithPublicKey,\n publicKeyByPrivateKey\n} from 'eth-crypto'\nimport {\n concat,\n getBytes,\n hexlify,\n keccak256,\n Mnemonic,\n randomBytes,\n toUtf8Bytes,\n Wallet\n} from 'ethers'\nimport scrypt from 'scrypt-js'\n\nimport EmittableError from '../../classes/EmittableError'\nimport { DERIVATION_OPTIONS, HD_PATH_TEMPLATE_TYPE } from '../../consts/derivation'\nimport { Banner } from '../../interfaces/banner'\nimport {\n ExternalKey,\n InternalKey,\n Key,\n KeyPreferences,\n KeystoreSeed,\n KeystoreSignerType,\n MainKey,\n MainKeyEncryptedWithSecret,\n ReadyToAddKeys,\n StoredKey\n} from '../../interfaces/keystore'\nimport { Storage } from '../../interfaces/storage'\nimport { WindowManager } from '../../interfaces/window'\nimport {\n getDefaultKeyLabel,\n getShouldMigrateKeyMetaNullToKeyMetaCreatedAt,\n getShouldMigrateKeystoreSeedsWithoutHdPath,\n migrateKeyMetaNullToKeyMetaCreatedAt,\n migrateKeyPreferencesToKeystoreKeys,\n migrateKeystoreSeedsWithoutHdPathTemplate\n} from '../../libs/keys/keys'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\n\nconst scryptDefaults = { N: 131072, r: 8, p: 1, dkLen: 64 }\nconst CIPHER = 'aes-128-ctr'\nconst KEYSTORE_UNEXPECTED_ERROR_MESSAGE =\n 'Keystore unexpected error. If the problem persists, please contact support.'\n\nconst STATUS_WRAPPED_METHODS = {\n unlockWithSecret: 'INITIAL',\n addSecret: 'INITIAL',\n addSeed: 'INITIAL',\n moveTempSeedToKeystoreSeeds: 'INITIAL',\n deleteSavedSeed: 'INITIAL',\n removeSecret: 'INITIAL',\n addKeys: 'INITIAL',\n addKeysExternallyStored: 'INITIAL',\n changeKeystorePassword: 'INITIAL',\n updateKeyPreferences: 'INITIAL'\n} as const\n\nfunction getBytesForSecret(secret: string): ArrayLike {\n // see https://github.com/ethers-io/ethers.js/blob/v5/packages/json-wallets/src.ts/utils.ts#L19-L24\n return toUtf8Bytes(secret, 'NFKC')\n}\n\n/**\n * The KeystoreController is a class that manages a collection of encrypted keys.\n * It provides methods for adding, removing, and retrieving keys. The keys are\n * encrypted using a main key, which is itself encrypted using one or more secrets.\n *\n * Docs:\n * - Secrets are strings that are used to encrypt the mainKey; the mainKey\n * could be encrypted with many secrets\n * - All individual keys are encrypted with the mainKey\n * - The mainKey is kept in memory, but only for the unlockedTime\n * Design decisions:\n * - decided to store all keys in the Keystore, even if the private key itself\n * is not stored there; simply because it's called a Keystore and the name\n * implies the functionality\n * - handle HW wallets in it, so that we handle everything uniformly with a\n * single API; also, it allows future flexibility to have the concept of\n * optional unlocking built-in; if we have interactivity, we can add\n * `keystore.signExtraInputRequired(key)` which returns what we need from the user\n * - `signWithkey` is presumed to be non-interactive at least from `Keystore`\n * point of view (requiring no extra user inputs). This could be wrong, if\n * hardware wallets require extra input - they normally always do, but with\n * the web SDKs we \"outsource\" this to the HW wallet software itself;\n * this may not be true on mobile\n */\nexport class KeystoreController extends EventEmitter {\n #mainKey: MainKey | null\n\n // Secrets are strings that are used to encrypt the mainKey.\n // The mainKey could be encrypted with many secrets.\n #keystoreSecrets: MainKeyEncryptedWithSecret[] = []\n\n #storage: Storage\n\n #keystoreSeeds: KeystoreSeed[] = []\n\n // when importing a seed, save it temporary here before deciding\n // whether to place it in #keystoreSeeds or delete it\n //\n // this should be done only if there isn't a saved seed already\n #tempSeed: KeystoreSeed | null = null\n\n #keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n\n #keystoreKeys: StoredKey[] = []\n\n keyStoreUid: string | null\n\n isReadyToStoreKeys: boolean = false\n\n errorMessage: string = ''\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #windowManager: WindowManager\n\n constructor(\n _storage: Storage,\n _keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>,\n windowManager: WindowManager\n ) {\n super()\n this.#storage = _storage\n this.#keystoreSigners = _keystoreSigners\n this.#mainKey = null\n this.keyStoreUid = null\n this.#windowManager = windowManager\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n const [keystoreSeeds, keyStoreUid, keystoreKeys, keyPreferences] = await Promise.all([\n this.#storage.get('keystoreSeeds', []),\n this.#storage.get('keyStoreUid', null),\n this.#storage.get('keystoreKeys', []),\n this.#storage.get('keyPreferences', [])\n ])\n this.keyStoreUid = keyStoreUid\n\n if (getShouldMigrateKeystoreSeedsWithoutHdPath(keystoreSeeds)) {\n // Cast to the old type (string[]) to avoid TS errors\n const preMigrationKeystoreSeeds = keystoreSeeds as unknown as string[]\n this.#keystoreSeeds = migrateKeystoreSeedsWithoutHdPathTemplate(preMigrationKeystoreSeeds)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n } else {\n this.#keystoreSeeds = keystoreSeeds\n }\n\n const shouldMigrateKeyPreferencesToKeystoreKeys = keyPreferences.length > 0\n if (shouldMigrateKeyPreferencesToKeystoreKeys) {\n this.#keystoreKeys = migrateKeyPreferencesToKeystoreKeys(keyPreferences, keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n await this.#storage.remove('keyPreferences')\n } else {\n this.#keystoreKeys = keystoreKeys\n }\n\n if (getShouldMigrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)) {\n this.#keystoreKeys = migrateKeyMetaNullToKeyMetaCreatedAt(this.#keystoreKeys)\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to pull keys from storage')\n })\n }\n\n try {\n this.#keystoreSecrets = await this.#storage.get('keystoreSecrets', [])\n this.isReadyToStoreKeys = this.#keystoreSecrets.length > 0\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when initiating the Keystore. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: failed to getMainKeyEncryptedWithSecrets() from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n lock() {\n this.#mainKey = null\n if (this.#tempSeed) this.deleteTempSeed(false)\n this.emitUpdate()\n }\n\n get isUnlocked() {\n return !!this.#mainKey\n }\n\n async getKeyStoreUid() {\n const uid = this.keyStoreUid\n if (!uid) throw new Error('keystore: adding secret before get uid')\n\n return uid\n }\n\n // @TODO time before unlocking\n async #unlockWithSecret(secretId: string, secret: string) {\n await this.#initialLoadPromise\n\n // @TODO should we check if already locked? probably not cause this function can be used in order to verify if a secret is correct\n if (!this.#keystoreSecrets.length) {\n throw new EmittableError({\n message:\n 'Trying to unlock Ambire, but the lock mechanism was not fully configured yet. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: no secrets yet')\n })\n }\n\n const secretEntry = this.#keystoreSecrets.find((x) => x.id === secretId)\n if (!secretEntry) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: secret not found')\n })\n }\n\n const { scryptParams, aesEncrypted } = secretEntry\n if (aesEncrypted.cipherType !== CIPHER) {\n throw new EmittableError({\n message:\n 'Something went wrong when trying to unlock Ambire. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error(`keystore: unsupported cipherType ${aesEncrypted.cipherType}`)\n })\n }\n // @TODO: progressCallback?\n\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n getBytes(scryptParams.salt),\n scryptParams.N,\n scryptParams.r,\n scryptParams.p,\n scryptParams.dkLen,\n () => {}\n )\n const iv = getBytes(aesEncrypted.iv)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const mac = keccak256(concat([macPrefix, aesEncrypted.ciphertext]))\n if (mac !== aesEncrypted.mac) {\n this.errorMessage = 'Incorrect password. Please try again.'\n this.emitUpdate()\n\n const error = new Error(this.errorMessage)\n throw new EmittableError({ level: 'silent', message: this.errorMessage, error })\n }\n this.errorMessage = ''\n\n const decrypted = aesCtr.decrypt(getBytes(aesEncrypted.ciphertext))\n this.#mainKey = { key: decrypted.slice(0, 16), iv: decrypted.slice(16, 32) }\n }\n\n async unlockWithSecret(secretId: string, secret: string) {\n await this.withStatus('unlockWithSecret', () => this.#unlockWithSecret(secretId, secret))\n }\n\n async #addSecret(\n secretId: string,\n secret: string,\n extraEntropy: string = '',\n leaveUnlocked: boolean = false\n ) {\n await this.#initialLoadPromise\n\n // @TODO test\n if (this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: trying to add duplicate secret ${secretId}`)\n })\n\n let mainKey: MainKey | null = this.#mainKey\n // We are not unlocked\n if (!mainKey) {\n if (!this.#keystoreSecrets.length) {\n const key = getBytes(keccak256(concat([randomBytes(32), toUtf8Bytes(extraEntropy)]))).slice(\n 0,\n 16\n )\n mainKey = {\n key,\n iv: randomBytes(16)\n }\n } else\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: must unlock keystore before adding secret')\n })\n\n if (leaveUnlocked) {\n this.#mainKey = mainKey\n }\n }\n\n const salt = randomBytes(32)\n const key = await scrypt.scrypt(\n getBytesForSecret(secret),\n salt,\n scryptDefaults.N,\n scryptDefaults.r,\n scryptDefaults.p,\n scryptDefaults.dkLen,\n () => {}\n )\n const iv = randomBytes(16)\n const derivedKey = key.slice(0, 16)\n const macPrefix = key.slice(16, 32)\n const counter = new aes.Counter(iv)\n const aesCtr = new aes.ModeOfOperation.ctr(derivedKey, counter)\n const ciphertext = aesCtr.encrypt(getBytes(concat([mainKey.key, mainKey.iv])))\n const mac = keccak256(concat([macPrefix, ciphertext]))\n\n this.#keystoreSecrets.push({\n id: secretId,\n scryptParams: { salt: hexlify(salt), ...scryptDefaults },\n aesEncrypted: {\n cipherType: CIPHER,\n ciphertext: hexlify(ciphertext),\n iv: hexlify(iv),\n mac: hexlify(mac)\n }\n })\n // Persist the new secrets\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n\n // produce uid if one doesn't exist (should be created when the first secret is added)\n if (!this.keyStoreUid) {\n const uid = publicKeyByPrivateKey(hexlify(getBytes(concat([mainKey.key, mainKey.iv]))))\n this.keyStoreUid = uid\n await this.#storage.set('keyStoreUid', uid)\n }\n\n this.isReadyToStoreKeys = true\n }\n\n async addSecret(secretId: string, secret: string, extraEntropy: string, leaveUnlocked: boolean) {\n await this.withStatus('addSecret', () =>\n this.#addSecret(secretId, secret, extraEntropy, leaveUnlocked)\n )\n }\n\n async #removeSecret(secretId: string) {\n await this.#initialLoadPromise\n\n if (!this.#keystoreSecrets.find((x) => x.id === secretId))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(`keystore: secret$ ${secretId} not found`)\n })\n\n this.#keystoreSecrets = this.#keystoreSecrets.filter((x) => x.id !== secretId)\n await this.#storage.set('keystoreSecrets', this.#keystoreSecrets)\n }\n\n async removeSecret(secretId: string) {\n await this.withStatus('removeSecret', () => this.#removeSecret(secretId))\n }\n\n get keys(): Key[] {\n return this.#keystoreKeys.map(({ addr, type, label, dedicatedToOneSA, meta }) => {\n // Written with this 'internal' type guard (if) on purpose, because this\n // way TypeScript will be able to narrow down the types properly and infer\n // the return type of the map function correctly.\n if (type === 'internal') {\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: false\n }\n }\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta: meta as ExternalKey['meta'],\n isExternallyStored: true\n }\n })\n }\n\n async #getEncryptedSeedPhrase(\n seed: KeystoreSeed['seed'],\n seedPassphrase?: KeystoreSeed['seedPassphrase']\n ): Promise<{\n seed: string\n passphrase: string | null\n }> {\n await this.#initialLoadPromise\n\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n if (!Mnemonic.isValidMnemonic(seed)) {\n throw new EmittableError({\n message: 'You are trying to store an invalid seed phrase.',\n level: 'major',\n error: new Error('keystore: trying to add an invalid seed phrase')\n })\n }\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\\\n return {\n seed: hexlify(aesCtr.encrypt(new TextEncoder().encode(seed))),\n passphrase: seedPassphrase\n ? hexlify(aesCtr.encrypt(new TextEncoder().encode(seedPassphrase)))\n : null\n }\n }\n\n async addSeedToTemp({ seed, seedPassphrase, hdPathTemplate }: KeystoreSeed) {\n const validHdPath = DERIVATION_OPTIONS.some((o) => o.value === hdPathTemplate)\n if (!validHdPath)\n throw new EmittableError({\n message:\n 'Incorrect derivation path when trying to update the temp seed. Please contact support',\n level: 'major',\n error: new Error('keystore: hd path to temp seed incorrect')\n })\n\n const { seed: seedPhrase, passphrase } = await this.#getEncryptedSeedPhrase(\n seed,\n seedPassphrase\n )\n\n this.#tempSeed = { seed: seedPhrase, seedPassphrase: passphrase, hdPathTemplate }\n\n this.emitUpdate()\n }\n\n deleteTempSeed(shouldUpdate = true) {\n this.#tempSeed = null\n if (shouldUpdate) this.emitUpdate()\n }\n\n async #moveTempSeedToKeystoreSeeds() {\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Currently we support only one seed phrase to be added to the keystore\n // this fist seed phrase will become the saved seed phrase of the wallet\n if (this.#keystoreSeeds.length) {\n throw new EmittableError({\n message: 'You can have only one saved seed in the extension',\n level: 'major',\n error: new Error(\n 'keystore: seed phase already added. Storing multiple seed phrases not supported yet'\n )\n })\n }\n\n if (!this.#tempSeed) {\n throw new EmittableError({\n message:\n 'Imported seed no longer exists in the extension. If you want to save it, please re-import it',\n level: 'major',\n error: new Error('keystore: imported seed deleted although a request to save it was made')\n })\n }\n\n this.#keystoreSeeds.push(this.#tempSeed)\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n this.#tempSeed = null\n this.emitUpdate()\n }\n\n async moveTempSeedToKeystoreSeeds() {\n await this.#initialLoadPromise\n await this.withStatus('moveTempSeedToKeystoreSeeds', () => this.#moveTempSeedToKeystoreSeeds())\n }\n\n async #addSeed({ seed, seedPassphrase, hdPathTemplate }: KeystoreSeed) {\n const { seed: seedPhrase, passphrase } = await this.#getEncryptedSeedPhrase(\n seed,\n seedPassphrase\n )\n\n this.#keystoreSeeds.push({ seed: seedPhrase, seedPassphrase: passphrase, hdPathTemplate })\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async addSeed(keystoreSeed: KeystoreSeed) {\n await this.withStatus('addSeed', () => this.#addSeed(keystoreSeed))\n }\n\n async changeTempSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#tempSeed) throw new Error('keystore: no temp seed at the moment')\n\n const isTheSameHdPathTemplate = this.#tempSeed.hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n this.#tempSeed.hdPathTemplate = nextHdPathTemplate\n\n this.emitUpdate()\n }\n\n async changeSavedSeedHdPathTemplateIfNeeded(nextHdPathTemplate?: HD_PATH_TEMPLATE_TYPE) {\n if (!nextHdPathTemplate) return // should never happen\n\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const isTheSameHdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate === nextHdPathTemplate\n if (isTheSameHdPathTemplate) return\n\n // As of v4.33.0 we support only one seed phrase (saved seed) to be added to the keystore\n this.#keystoreSeeds[0].hdPathTemplate = nextHdPathTemplate\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n async #addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.#initialLoadPromise\n\n if (!keysToAdd.length) return\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniqueKeys: { addr: Key['addr']; type: Key['type'] }[] = []\n const uniqueKeysToAdd = keysToAdd.filter(({ addr, type }) => {\n if (uniqueKeys.some((x) => x.addr === addr && x.type === type)) {\n return false\n }\n\n uniqueKeys.push({ addr, type })\n return true\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys = uniqueKeysToAdd\n .map(({ addr, type, label, dedicatedToOneSA, meta }) => ({\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n privKey: null\n }))\n // No need to re-add keys that are already added (with the same type / device)\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeysExternallyStored(keysToAdd: ExternalKey[]) {\n await this.withStatus('addKeysExternallyStored', () => this.#addKeysExternallyStored(keysToAdd))\n }\n\n async #addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.#initialLoadPromise\n if (!keysToAdd.length) return\n if (this.#mainKey === null)\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error('keystore: needs to be unlocked')\n })\n\n // Strip out keys with duplicated private keys. One unique key is enough.\n const uniquePrivateKeysToAddSet = new Set()\n const uniqueKeysToAdd = keysToAdd.filter(({ privateKey }) => {\n if (!uniquePrivateKeysToAddSet.has(privateKey)) {\n uniquePrivateKeysToAddSet.add(privateKey)\n return true\n }\n return false\n })\n\n if (!uniqueKeysToAdd.length) return\n\n const keys = this.#keystoreKeys\n\n const newKeys: StoredKey[] = uniqueKeysToAdd\n .map(({ addr, type, label, privateKey, dedicatedToOneSA, meta }) => {\n // eslint-disable-next-line no-param-reassign\n privateKey = privateKey.substring(0, 2) === '0x' ? privateKey.substring(2) : privateKey\n\n // Set up the cipher\n const counter = new aes.Counter(this.#mainKey!.iv) // TS compiler fails to detect we check for null above\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey!.key, counter) // TS compiler fails to detect we check for null above\n\n return {\n addr,\n type,\n label,\n dedicatedToOneSA,\n privKey: hexlify(aesCtr.encrypt(aes.utils.hex.toBytes(privateKey))), // TODO: consider a MAC?\n meta\n }\n })\n // No need to re-add keys that are already added, private key never changes\n .filter(({ addr, type }) => !keys.some((x) => x.addr === addr && x.type === type))\n\n if (!newKeys.length) return\n\n const nextKeys = [...keys, ...newKeys]\n\n this.#keystoreKeys = nextKeys\n await this.#storage.set('keystoreKeys', nextKeys)\n }\n\n async addKeys(keysToAdd: ReadyToAddKeys['internal']) {\n await this.withStatus('addKeys', () => this.#addKeys(keysToAdd))\n }\n\n async removeKey(addr: Key['addr'], type: Key['type']) {\n await this.#initialLoadPromise\n if (!this.isUnlocked)\n throw new EmittableError({\n message:\n 'Extension not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n const keys = this.#keystoreKeys\n if (!keys.find((x) => x.addr === addr && x.type === type))\n throw new EmittableError({\n message: KEYSTORE_UNEXPECTED_ERROR_MESSAGE,\n level: 'major',\n error: new Error(\n `keystore: trying to remove key that does not exist: address: ${addr}, type: ${type}`\n )\n })\n\n this.#keystoreKeys = keys.filter((key) => {\n const isMatching = key.addr === addr && key.type === type\n\n return !isMatching\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n }\n\n async exportKeyWithPasscode(keyAddress: Key['addr'], keyType: Key['type'], passphrase: string) {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n const wallet = new Wallet(decryptedPrivateKey)\n const keyBackup = await wallet.encrypt(passphrase)\n return JSON.stringify(keyBackup)\n }\n\n async sendPrivateKeyToUi(keyAddress: string) {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n this.#windowManager.sendWindowUiMessage({ privateKey: `0x${decryptedPrivateKey}` })\n }\n\n async sendSeedToUi() {\n const decrypted = await this.getSavedSeed()\n this.#windowManager.sendWindowUiMessage({\n seed: decrypted.seed,\n seedPassphrase: decrypted.seedPassphrase\n })\n }\n\n async #getPrivateKey(keyAddress: string): Promise {\n await this.#initialLoadPromise\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const keys = this.#keystoreKeys\n\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress)\n if (!storedKey) throw new Error('keystore: key not found')\n if (storedKey.type !== 'internal') throw new Error('keystore: key does not have privateKey')\n\n // decrypt the pk of keyAddress with the keystore's key\n const encryptedBytes = getBytes(storedKey.privKey as string)\n const counter = new aes.Counter(this.#mainKey.iv)\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n // encrypt the pk of keyAddress with publicKey\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n return aes.utils.hex.fromBytes(decryptedBytes)\n }\n\n /**\n * Export with public key encrypt\n *\n * @param keyAddress string - the address of the key you want to export\n * @param publicKey string - the public key, with which to asymmetrically encrypt it (used for key sync with other device's keystoreId)\n * @returns Encrypted\n */\n async exportKeyWithPublicKeyEncryption(\n keyAddress: string,\n publicKey: string\n ): Promise {\n const decryptedPrivateKey = await this.#getPrivateKey(keyAddress)\n const result = await encryptWithPublicKey(publicKey, decryptedPrivateKey)\n\n return result\n }\n\n async importKeyWithPublicKeyEncryption(encryptedSk: Encrypted, dedicatedToOneSA: boolean) {\n if (this.#mainKey === null) throw new Error('keystore: needs to be unlocked')\n const privateKey: string = await decryptWithPrivateKey(\n hexlify(getBytes(concat([this.#mainKey.key, this.#mainKey.iv]))),\n encryptedSk\n )\n if (!privateKey) throw new Error('keystore: wrong encryptedSk or private key')\n\n const keyToAdd: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n } = {\n addr: new Wallet(privateKey).address,\n privateKey,\n label: getDefaultKeyLabel(this.keys, 0),\n type: 'internal',\n dedicatedToOneSA,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n\n await this.addKeys([keyToAdd])\n }\n\n async getSigner(keyAddress: Key['addr'], keyType: Key['type']) {\n await this.#initialLoadPromise\n const keys = this.#keystoreKeys\n const storedKey = keys.find((x: StoredKey) => x.addr === keyAddress && x.type === keyType)\n\n if (!storedKey) throw new Error('keystore: key not found')\n const { addr, type, label, dedicatedToOneSA, meta } = storedKey\n\n const key = {\n addr,\n type,\n label,\n dedicatedToOneSA,\n meta,\n isExternallyStored: type !== 'internal'\n }\n\n const SignerInitializer = this.#keystoreSigners[key.type]\n if (!SignerInitializer) throw new Error('keystore: unsupported signer type')\n\n if (key.type === 'internal') {\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n\n const encryptedBytes = getBytes(storedKey.privKey as string)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedBytes = aesCtr.decrypt(encryptedBytes)\n const decryptedPrivateKey = aes.utils.hex.fromBytes(decryptedBytes)\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key, decryptedPrivateKey)\n }\n\n // @ts-ignore TODO: Figure out the correct type definition\n return new SignerInitializer(key)\n }\n\n async getSavedSeed() {\n await this.#initialLoadPromise\n\n if (!this.isUnlocked) throw new Error('keystore: not unlocked')\n if (!this.#keystoreSeeds.length) throw new Error('keystore: no seed phrase added yet')\n\n const hdPathTemplate = this.#keystoreSeeds[0].hdPathTemplate\n const encryptedSeedBytes = getBytes(this.#keystoreSeeds[0].seed)\n // @ts-ignore\n const counter = new aes.Counter(this.#mainKey.iv)\n // @ts-ignore\n const aesCtr = new aes.ModeOfOperation.ctr(this.#mainKey.key, counter)\n const decryptedSeedBytes = aesCtr.decrypt(encryptedSeedBytes)\n const decryptedSeed = new TextDecoder().decode(decryptedSeedBytes)\n\n if (this.#keystoreSeeds[0].seedPassphrase) {\n const encryptedSeedPassphraseBytes = getBytes(this.#keystoreSeeds[0].seedPassphrase)\n const decryptedSeedPassphraseBytes = aesCtr.decrypt(encryptedSeedPassphraseBytes)\n const decryptedSeedPassphrase = new TextDecoder().decode(decryptedSeedPassphraseBytes)\n\n return {\n seed: decryptedSeed,\n seedPassphrase: decryptedSeedPassphrase,\n hdPathTemplate\n } as KeystoreSeed\n }\n\n return { seed: decryptedSeed, hdPathTemplate }\n }\n\n async #changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.#initialLoadPromise\n\n // In the case the user wants to change their device password,\n // they should also provide the previous password (oldSecret).\n //\n // However, in the case of KeyStore recovery, the user may have already forgotten the password,\n // but the Keystore is already unlocked with the recovery secret.\n // Therefore, in the last case, we can't provide the oldSecret, and we should not validate it.\n //\n // However, there is one problem if we leave it that way:\n //\n // 1. If the user recovers and unlocks the Keystore.\n // 2. But doesn't enter a new 'password' in the recovery flow (just closes the tab).\n // 3. And later decides to change the old password from Settings.\n // 4. Then they would not be able to do it because they don't know the old password.\n //\n // We are going to discuss it in the next meeting, but for now, we are leaving it as it is.\n // The long-term solution would be to refactor EmailVault recovery logic\n // and not unlock the Keystore with the recovery secret unless the user provides a new passphrase.\n if (oldSecret) await this.#unlockWithSecret('password', oldSecret)\n\n if (!this.isUnlocked)\n throw new EmittableError({\n message: 'App not unlocked. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('keystore: not unlocked')\n })\n\n await this.#removeSecret('password')\n await this.#addSecret('password', newSecret, '', true)\n }\n\n async changeKeystorePassword(newSecret: string, oldSecret?: string) {\n await this.withStatus('changeKeystorePassword', () =>\n this.#changeKeystorePassword(newSecret, oldSecret)\n )\n }\n\n async updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n await this.withStatus('updateKeyPreferences', async () => this.#updateKeyPreferences(keys))\n }\n\n async #updateKeyPreferences(\n keys: { addr: Key['addr']; type: Key['type']; preferences: KeyPreferences }[]\n ) {\n this.#keystoreKeys = this.#keystoreKeys.map((keystoreKey) => {\n const key = keys.find((k) => k.addr === keystoreKey.addr && k.type === keystoreKey.type)\n\n if (!key) return keystoreKey\n\n return { ...keystoreKey, ...key.preferences }\n })\n await this.#storage.set('keystoreKeys', this.#keystoreKeys)\n this.emitUpdate()\n }\n\n async deleteSavedSeed() {\n await this.withStatus('deleteSavedSeed', () => this.#deleteSavedSeed())\n }\n\n async #deleteSavedSeed() {\n await this.#initialLoadPromise\n\n this.#keystoreSeeds = []\n await this.#storage.set('keystoreSeeds', this.#keystoreSeeds)\n\n this.emitUpdate()\n }\n\n resetErrorState() {\n this.errorMessage = ''\n this.emitUpdate()\n }\n\n get hasPasswordSecret() {\n return this.#keystoreSecrets.some((x) => x.id === 'password')\n }\n\n get hasKeystoreSavedSeed() {\n return !!this.#keystoreSeeds.length\n }\n\n get hasKeystoreTempSeed() {\n return !!this.#tempSeed\n }\n\n get banners(): Banner[] {\n if (!this.#tempSeed) return []\n\n return [\n {\n id: 'tempSeed',\n type: 'warning',\n category: 'temp-seed-not-confirmed',\n title: 'You have an unsaved imported seed',\n text: '',\n actions: [\n {\n label: 'Check',\n actionName: 'confirm-temp-seed'\n }\n ]\n }\n ]\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n isUnlocked: this.isUnlocked, // includes the getter in the stringified instance\n keys: this.keys,\n hasPasswordSecret: this.hasPasswordSecret,\n hasKeystoreSavedSeed: this.hasKeystoreSavedSeed,\n hasKeystoreTempSeed: this.hasKeystoreTempSeed,\n banners: this.banners\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/main/main.d.ts b/dist/src/controllers/main/main.d.ts index b4bf375ef..66349affb 100644 --- a/dist/src/controllers/main/main.d.ts +++ b/dist/src/controllers/main/main.d.ts @@ -110,7 +110,7 @@ export declare class MainController extends EventEmitter { * It's not a problem to call it many times consecutively as all methods have internal * caching mechanisms to prevent unnecessary calls. */ - onLoad(isFirstLoad?: boolean): void; + onPopupOpen(): void; lock(): void; selectAccount(toAccountAddr: string): Promise; importSmartAccountFromSavedSeed(seed?: string): Promise; @@ -130,7 +130,7 @@ export declare class MainController extends EventEmitter { forceUpdate?: boolean; networkId?: NetworkId; }): Promise; - updateSelectedAccountPortfolio(forceUpdate?: boolean, network?: Network): Promise; + updateSelectedAccountPortfolio(forceUpdate?: boolean, network?: Network, maxDataAgeMs?: number): Promise; buildUserRequestFromDAppRequest(request: DappProviderRequest, dappPromise: { session: { name: string; diff --git a/dist/src/controllers/main/main.d.ts.map b/dist/src/controllers/main/main.d.ts.map index 234f19802..0903d9091 100644 --- a/dist/src/controllers/main/main.d.ts.map +++ b/dist/src/controllers/main/main.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/main/main.js b/dist/src/controllers/main/main.js index 7a47b184e..914293296 100644 --- a/dist/src/controllers/main/main.js +++ b/dist/src/controllers/main/main.js @@ -219,16 +219,16 @@ class MainController extends eventEmitter_1.default { * It's not a problem to call it many times consecutively as all methods have internal * caching mechanisms to prevent unnecessary calls. */ - onLoad(isFirstLoad = false) { + onPopupOpen() { + const FIVE_MINUTES = 1000 * 60 * 5; const selectedAccountAddr = this.selectedAccount.account?.addr; - const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length; - this.defiPositions.updatePositions(); this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr)); - if (!hasBroadcastedButNotConfirmed) { - this.updateSelectedAccountPortfolio(); + if (!this.activity.broadcastedButNotConfirmed.length) { + // Update defi positions together with the portfolio for simplicity + this.defiPositions.updatePositions({ maxDataAgeMs: FIVE_MINUTES }); + this.updateSelectedAccountPortfolio(undefined, undefined, FIVE_MINUTES); } - // The first time the app loads, we update the account state elsewhere - if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading) + if (selectedAccountAddr && !this.accounts.areAccountStatesLoading) this.accounts.updateAccountState(selectedAccountAddr); } async #load() { @@ -242,7 +242,9 @@ class MainController extends eventEmitter_1.default { await this.providers.initialLoadPromise; await this.accounts.initialLoadPromise; await this.selectedAccount.initialLoadPromise; - this.onLoad(true); + this.defiPositions.updatePositions(); + this.updateSelectedAccountPortfolio(); + this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr)); /** * Listener that gets triggered as a finalization step of adding new * accounts via the AccountAdder controller flow. @@ -680,11 +682,8 @@ class MainController extends eventEmitter_1.default { return uCalls; }, []); } - async reloadSelectedAccount(options = { - forceUpdate: true, - networkId: undefined - }) { - const { forceUpdate, networkId } = options; + async reloadSelectedAccount(options) { + const { forceUpdate = true, networkId } = options || {}; const networkToUpdate = networkId ? this.networks.networks.find((n) => n.id === networkId) : undefined; @@ -706,7 +705,7 @@ class MainController extends eventEmitter_1.default { // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard), // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper. this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate), - this.defiPositions.updatePositions(networkId) + this.defiPositions.updatePositions({ networkId }) ]); } #updateIsOffline() { @@ -741,15 +740,17 @@ class MainController extends eventEmitter_1.default { this.emitUpdate(); } } + // TODO: Refactor this to accept an optional object with options + async updateSelectedAccountPortfolio( // eslint-disable-next-line default-param-last - async updateSelectedAccountPortfolio(forceUpdate = false, network) { + forceUpdate = false, network, maxDataAgeMs) { await this.#initialLoadPromise; if (!this.selectedAccount.account) return; const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId; const networkData = network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId); const accountOpsToBeSimulatedByNetwork = (0, main_1.getAccountOpsForSimulation)(this.selectedAccount.account, this.actions.visibleActionsQueue, networkData, this.signAccountOp?.accountOp); - await this.portfolio.updateSelectedAccount(this.selectedAccount.account.addr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate }); + await this.portfolio.updateSelectedAccount(this.selectedAccount.account.addr, network, accountOpsToBeSimulatedByNetwork, { forceUpdate, maxDataAgeMs }); this.#updateIsOffline(); } #getUserRequestAccountError(dappOrigin, fromAccountAddr) { diff --git a/dist/src/controllers/main/main.js.map b/dist/src/controllers/main/main.js.map index f14dcc60f..00e9037e6 100644 --- a/dist/src/controllers/main/main.js.map +++ b/dist/src/controllers/main/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/brace-style */\n\nimport { ethErrors } from 'eth-rpc-errors'\nimport { getAddress, getBigInt, Interface, isAddress } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'\nimport { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'\nimport {\n BIP44_LEDGER_DERIVATION_TEMPLATE,\n BIP44_STANDARD_DERIVATION_TEMPLATE\n} from '../../consts/derivation'\nimport {\n Account,\n AccountId,\n AccountOnchainState,\n AccountWithNetworkMeta\n} from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n ExternalSignerControllers,\n Key,\n KeystoreSignerType,\n TxnRequest\n} from '../../interfaces/keystore'\nimport { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Storage } from '../../interfaces/storage'\nimport { SocketAPISendTransactionRequest } from '../../interfaces/swapAndBridge'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport { WindowManager } from '../../interfaces/window'\nimport { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport {\n AccountOpIdentifiedBy,\n getDappIdentifier,\n pollTxnId,\n SubmittedAccountOp\n} from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport {\n dappRequestMethodToActionKind,\n getAccountOpActionsByNetwork,\n getAccountOpFromAction\n} from '../../libs/actions/actions'\nimport { getAccountOpBanners } from '../../libs/banners/banners'\nimport { getPaymasterService } from '../../libs/erc7677/erc7677'\nimport {\n getHumanReadableBroadcastError,\n getHumanReadableEstimationError\n} from '../../libs/errorHumanizer'\nimport { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'\nimport { estimate } from '../../libs/estimate/estimate'\nimport { EstimateResult } from '../../libs/estimate/interfaces'\nimport { GasRecommendation, getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'\nimport { humanizeAccountOp } from '../../libs/humanizer'\nimport { KeyIterator } from '../../libs/keyIterator/keyIterator'\nimport {\n ACCOUNT_SWITCH_USER_REQUEST,\n buildSwitchAccountUserRequest,\n getAccountOpsForSimulation,\n makeBasicAccountOpAction,\n makeSmartAccountOpAction\n} from '../../libs/main/main'\nimport { relayerAdditionalNetworks } from '../../libs/networks/networks'\nimport { GetOptions, TokenResult } from '../../libs/portfolio/interfaces'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { parse } from '../../libs/richJson/richJson'\nimport { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'\nimport {\n adjustEntryPointAuthorization,\n getEntryPointAuthorization\n} from '../../libs/signMessage/signMessage'\nimport {\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { debugTraceCall } from '../../libs/tracer/debugTraceCall'\nimport {\n buildClaimWalletRequest,\n buildMintVestingRequest,\n buildTransferUserRequest\n} from '../../libs/transfer/userRequest'\nimport {\n ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n isErc4337Broadcast,\n shouldAskForEntryPointAuthorization\n} from '../../libs/userOperation/userOperation'\nimport { getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { SocketAPI } from '../../services/socket/api'\nimport { getIsViewOnly } from '../../utils/accounts'\nimport shortenAddress from '../../utils/shortenAddress'\nimport wait from '../../utils/wait'\nimport { AccountAdderController } from '../accountAdder/accountAdder'\nimport { AccountsController } from '../accounts/accounts'\nimport {\n AccountOpAction,\n ActionExecutionType,\n ActionPosition,\n ActionsController,\n SignMessageAction\n} from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport { AddressBookController } from '../addressBook/addressBook'\nimport { DappsController } from '../dapps/dapps'\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport { DomainsController } from '../domains/domains'\nimport { EmailVaultController } from '../emailVault/emailVault'\nimport EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n/* eslint-disable no-underscore-dangle */\nimport { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'\nimport { SignMessageController } from '../signMessage/signMessage'\nimport { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'\n\nconst STATUS_WRAPPED_METHODS = {\n onAccountAdderSuccess: 'INITIAL',\n signAccountOp: 'INITIAL',\n broadcastSignedAccountOp: 'INITIAL',\n removeAccount: 'INITIAL',\n handleAccountAdderInitLedger: 'INITIAL',\n handleAccountAdderInitLattice: 'INITIAL',\n importSmartAccountFromDefaultSeed: 'INITIAL',\n buildSwapAndBridgeUserRequest: 'INITIAL',\n importSmartAccountFromSavedSeed: 'INITIAL',\n selectAccount: 'INITIAL'\n} as const\n\nexport class MainController extends EventEmitter {\n #storage: Storage\n\n fetch: Fetch\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n callRelayer: Function\n\n isReady: boolean = false\n\n invite: InviteController\n\n keystore: KeystoreController\n\n /**\n * Hardware wallets (usually) need an additional (external signer) controller,\n * that is app-specific (web, mobile) and is used to interact with the device.\n * (example: LedgerController, TrezorController, LatticeController)\n */\n #externalSignerControllers: ExternalSignerControllers = {}\n\n // Subcontrollers\n networks: NetworksController\n\n providers: ProvidersController\n\n accountAdder: AccountAdderController\n\n portfolio: PortfolioController\n\n defiPositions: DefiPositionsController\n\n dapps: DappsController\n\n actions: ActionsController\n\n // Public sub-structures\n // @TODO emailVaults\n emailVault: EmailVaultController\n\n signMessage: SignMessageController\n\n swapAndBridge: SwapAndBridgeController\n\n signAccountOp: SignAccountOpController | null = null\n\n signAccOpInitError: string | null = null\n\n activity: ActivityController\n\n addressBook: AddressBookController\n\n domains: DomainsController\n\n accounts: AccountsController\n\n selectedAccount: SelectedAccountController\n\n userRequests: UserRequest[] = []\n\n userRequestWaitingAccountSwitch: UserRequest[] = []\n\n // network => GasRecommendation[]\n gasPrices: { [key: string]: GasRecommendation[] } = {}\n\n // network => BundlerGasPrice\n bundlerGasPrices: { [key: string]: { speeds: GasSpeeds; bundler: BUNDLER } } = {}\n\n accountOpsToBeConfirmed: { [key: string]: { [key: string]: AccountOp } } = {}\n\n // TODO: Temporary solution to expose the fee payer key during Account Op broadcast.\n feePayerKey: Key | null = null\n\n lastUpdate: Date = new Date()\n\n isOffline: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n #signAccountOpSigningPromise?: Promise\n\n #signAccountOpBroadcastPromise?: Promise\n\n constructor({\n storage,\n fetch,\n relayerUrl,\n velcroUrl,\n socketApiKey,\n keystoreSigners,\n externalSignerControllers,\n windowManager,\n notificationManager\n }: {\n storage: Storage\n fetch: Fetch\n relayerUrl: string\n velcroUrl: string\n socketApiKey: string\n keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n externalSignerControllers: ExternalSignerControllers\n windowManager: WindowManager\n notificationManager: NotificationManager\n }) {\n super()\n this.#storage = storage\n this.fetch = fetch\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n\n this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage })\n this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager)\n this.#externalSignerControllers = externalSignerControllers\n this.networks = new NetworksController(\n this.#storage,\n this.fetch,\n async (network: Network) => {\n this.providers.setProvider(network)\n await this.reloadSelectedAccount({ networkId: network.id })\n },\n (networkId: NetworkId) => {\n this.providers.removeProvider(networkId)\n }\n )\n this.providers = new ProvidersController(this.networks)\n this.accounts = new AccountsController(\n this.#storage,\n this.providers,\n this.networks,\n async (accounts) => {\n const defaultSelectedAccount = getDefaultSelectedAccount(accounts)\n if (defaultSelectedAccount) {\n await this.#selectAccount(defaultSelectedAccount.addr)\n }\n },\n this.providers.updateProviderIsWorking.bind(this.providers),\n this.#updateIsOffline.bind(this)\n )\n this.selectedAccount = new SelectedAccountController({\n storage: this.#storage,\n accounts: this.accounts\n })\n this.portfolio = new PortfolioController(\n this.#storage,\n this.fetch,\n this.providers,\n this.networks,\n this.accounts,\n relayerUrl,\n velcroUrl\n )\n this.defiPositions = new DefiPositionsController({\n fetch: this.fetch,\n storage,\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n providers: this.providers\n })\n this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore)\n this.accountAdder = new AccountAdderController({\n accounts: this.accounts,\n keystore: this.keystore,\n networks: this.networks,\n providers: this.providers,\n relayerUrl,\n fetch: this.fetch\n })\n this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount)\n this.signMessage = new SignMessageController(\n this.keystore,\n this.providers,\n this.networks,\n this.accounts,\n this.#externalSignerControllers\n )\n const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch })\n this.dapps = new DappsController(this.#storage)\n this.actions = new ActionsController({\n selectedAccount: this.selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose: () => {\n const userRequestsToRejectOnWindowClose = this.userRequests.filter(\n (r) => r.action.kind !== 'calls'\n )\n userRequestsToRejectOnWindowClose.forEach((r) =>\n r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())\n )\n this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls')\n this.userRequestWaitingAccountSwitch = []\n this.emitUpdate()\n }\n })\n this.selectedAccount.initControllers({\n portfolio: this.portfolio,\n defiPositions: this.defiPositions,\n actions: this.actions,\n networks: this.networks,\n providers: this.providers\n })\n\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch })\n this.activity = new ActivityController(\n this.#storage,\n this.fetch,\n this.callRelayer,\n this.accounts,\n this.selectedAccount,\n this.providers,\n this.networks,\n async (network: Network) => {\n await this.setContractsDeployedToTrueIfDeployed(network)\n }\n )\n this.swapAndBridge = new SwapAndBridgeController({\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n activity: this.activity,\n invite: this.invite,\n socketAPI,\n storage: this.#storage,\n actions: this.actions\n })\n this.domains = new DomainsController(this.providers.providers)\n this.#initialLoadPromise = this.#load()\n paymasterFactory.init(relayerUrl, fetch, (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n })\n }\n\n /**\n * - Updates the selected account's account state, portfolio and defi positions\n * - Calls batchReverseLookup for all accounts\n *\n * It's not a problem to call it many times consecutively as all methods have internal\n * caching mechanisms to prevent unnecessary calls.\n */\n onLoad(isFirstLoad: boolean = false) {\n const selectedAccountAddr = this.selectedAccount.account?.addr\n const hasBroadcastedButNotConfirmed = !!this.activity.broadcastedButNotConfirmed.length\n this.defiPositions.updatePositions()\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n if (!hasBroadcastedButNotConfirmed) {\n this.updateSelectedAccountPortfolio()\n }\n // The first time the app loads, we update the account state elsewhere\n if (selectedAccountAddr && !isFirstLoad && !this.accounts.areAccountStatesLoading)\n this.accounts.updateAccountState(selectedAccountAddr)\n }\n\n async #load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n await this.networks.initialLoadPromise\n await this.providers.initialLoadPromise\n await this.accounts.initialLoadPromise\n await this.selectedAccount.initialLoadPromise\n\n this.onLoad(true)\n /**\n * Listener that gets triggered as a finalization step of adding new\n * accounts via the AccountAdder controller flow.\n *\n * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these\n * changes are reflected for view-only accounts as well. Because the\n * view-only accounts import flow bypasses the AccountAdder, this method\n * won't click for them. Their on add success flow continues in the\n * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case.\n */\n const onAccountAdderSuccess = () => {\n if (this.accountAdder.addAccountsStatus !== 'SUCCESS') return\n\n return this.withStatus(\n 'onAccountAdderSuccess',\n async () => {\n // Add accounts first, because some of the next steps have validation\n // if accounts exists.\n await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts)\n\n // Then add keys, because some of the next steps could have validation\n // if keys exists. Should be separate (not combined in Promise.all,\n // since firing multiple keystore actions is not possible\n // (the #wrapKeystoreAction listens for the first one to finish and\n // skips the parallel one, if one is requested).\n\n await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal)\n await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external)\n\n // Update the saved seed `hdPathTemplate` if accounts were added from\n // the saved seed, so when user opts in to \"Import a new Smart Account\n // from the saved Seed Phrase\" the next account is derived based\n // on the latest `hdPathTemplate` chosen in the AccountAdder.\n if (this.accountAdder.isInitializedWithSavedSeed)\n this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n if (this.keystore.hasKeystoreTempSeed)\n this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n },\n true\n )\n }\n this.accountAdder.onUpdate(onAccountAdderSuccess)\n\n this.isReady = true\n this.emitUpdate()\n }\n\n lock() {\n this.keystore.lock()\n this.emailVault.cleanMagicAndSessionKeys()\n this.selectedAccount.setDashboardNetworkFilter(null)\n }\n\n async selectAccount(toAccountAddr: string) {\n await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true)\n }\n\n async #selectAccount(toAccountAddr: string | null) {\n await this.#initialLoadPromise\n if (!toAccountAddr) {\n await this.selectedAccount.setAccount(null)\n\n this.emitUpdate()\n return\n }\n\n const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr)\n if (!accountToSelect) {\n console.error(`Account with address ${toAccountAddr} does not exist`)\n return\n }\n\n this.isOffline = false\n // call closeActionWindow while still on the currently selected account to allow proper\n // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl...\n if (this.actions?.currentAction?.type !== 'switchAccount') {\n this.actions.closeActionWindow()\n }\n this.selectedAccount.setAccount(accountToSelect)\n this.swapAndBridge.onAccountChange()\n this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr])\n // forceEmitUpdate to update the getters in the FE state of the ctrl\n await this.forceEmitUpdate()\n await this.actions.forceEmitUpdate()\n await this.addressBook.forceEmitUpdate()\n // Don't await these as they are not critical for the account selection\n // and if the user decides to quickly change to another account withStatus\n // will block the UI until these are resolved.\n this.reloadSelectedAccount({ forceUpdate: false })\n this.emitUpdate()\n }\n\n async importSmartAccountFromSavedSeed(seed?: string) {\n await this.withStatus(\n 'importSmartAccountFromSavedSeed',\n async () => {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n if (seed && !this.keystore.hasKeystoreSavedSeed) {\n await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE })\n }\n\n const savedSeed = await this.keystore.getSavedSeed()\n if (!savedSeed) {\n throw new EmittableError({\n message:\n 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.',\n level: 'major',\n error: new Error('failed to retrieve saved seed phrase from keystore')\n })\n }\n\n const keyIterator = new KeyIterator(savedSeed.seed)\n await this.accountAdder.init({\n keyIterator,\n hdPathTemplate: savedSeed.hdPathTemplate,\n pageSize: 1,\n shouldGetAccountsUsedOnNetworks: false,\n shouldSearchForLinkedAccounts: false\n })\n\n let currentPage: number = 1\n let isAccountAlreadyAdded: boolean\n let nextSmartAccount: AccountWithNetworkMeta | undefined\n\n const findNextSmartAccount = async () => {\n do {\n // eslint-disable-next-line no-await-in-loop\n await this.accountAdder.setPage({ page: currentPage })\n\n nextSmartAccount = this.accountAdder.accountsOnPage.find(\n ({ isLinked, account }) => !isLinked && isSmartAccount(account)\n )?.account\n\n if (!nextSmartAccount) break\n\n isAccountAlreadyAdded = !!this.accounts.accounts.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n (a) => a.addr === nextSmartAccount!.addr\n )\n\n currentPage++\n } while (isAccountAlreadyAdded)\n }\n\n await findNextSmartAccount()\n\n if (!nextSmartAccount) {\n throw new EmittableError({\n message:\n 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.',\n level: 'major',\n error: new Error('Internal error: Failed to find a smart account to add')\n })\n }\n\n this.accountAdder.selectAccount(nextSmartAccount)\n\n const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts()\n\n await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, {\n internal: readyToAddKeys,\n external: []\n })\n },\n true\n )\n }\n\n initSignAccOp(actionId: AccountOpAction['id']): null | void {\n const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue)\n if (!accountOp) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'\n return null\n }\n\n const network = this.networks.networks.find((net) => net.id === accountOp.networkId)\n\n if (\n !this.selectedAccount.account ||\n this.selectedAccount.account.addr !== accountOp.accountAddr\n ) {\n this.signAccOpInitError =\n 'Attempting to initialize an accountOp for an account other than the currently selected one.'\n return null\n }\n\n if (!network) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process as we are unable to locate the specified network.'\n return null\n }\n\n // on init, set the accountOp nonce to the latest one we know\n // it could happen that the user inits a userRequest with an old\n // accountState and therefore caching the old nonce in the accountOp.\n // we make sure the latest nonce is set when initing signAccountOp\n const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]\n if (state) accountOp.nonce = state.nonce\n\n this.signAccOpInitError = null\n\n this.signAccountOp = new SignAccountOpController(\n this.accounts,\n this.keystore,\n this.portfolio,\n this.#externalSignerControllers,\n this.selectedAccount.account,\n network,\n actionId,\n accountOp,\n () => {\n this.estimateSignAccountOp()\n },\n () => {\n return this.isSignRequestStillActive\n }\n )\n\n this.emitUpdate()\n\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n }\n\n async handleSignAndBroadcastAccountOp() {\n await this.withStatus(\n 'signAccountOp',\n async () => {\n const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done\n if (wasAlreadySigned) return Promise.resolve()\n\n if (!this.signAccountOp) {\n const message =\n 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'\n const error = new Error('SignAccountOp is not initialized')\n this.emitError({ level: 'major', message, error })\n return Promise.reject(error)\n }\n\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => {\n this.#signAccountOpSigningPromise = undefined\n })\n\n return this.#signAccountOpSigningPromise\n },\n true\n )\n\n // Error handling on the prev step will notify the user, it's fine to return here\n if (this.signAccountOp?.status?.type !== SigningStatus.Done) return\n\n return this.withStatus(\n 'broadcastSignedAccountOp',\n async () => {\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => {\n this.#signAccountOpBroadcastPromise = undefined\n })\n return this.#signAccountOpBroadcastPromise\n },\n true\n )\n }\n\n destroySignAccOp() {\n if (!this.signAccountOp) return\n\n this.feePayerKey = null\n this.signAccountOp = null\n this.signAccOpInitError = null\n\n // NOTE: no need to update the portfolio here as an update is\n // fired upon removeUserRequest\n\n this.emitUpdate()\n }\n\n async traceCall(estimation: EstimateResult) {\n const accountOp = this.signAccountOp?.accountOp\n if (!accountOp) return\n\n const network = this.networks.networks.find((net) => net.id === accountOp?.networkId)\n if (!network) return\n\n try {\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)!\n const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n const provider = this.providers.providers[network.id]\n const gasPrice = this.gasPrices[network.id]\n const { tokens, nfts } = await debugTraceCall(\n account,\n accountOp,\n provider,\n state,\n estimation.gasUsed,\n gasPrice,\n !network.rpcNoStateOverride\n )\n const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id)\n const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id)\n // update the portfolio only if new tokens were found through tracing\n if (learnedNewTokens || learnedNewNfts) {\n this.portfolio\n .updateSelectedAccount(\n accountOp.accountAddr,\n network,\n getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n accountOp\n ),\n { forceUpdate: true }\n )\n // fire an update request to refresh the warnings if any\n .then(() => this.signAccountOp?.update({}))\n }\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: 'Error in main.traceCall',\n error: e\n })\n }\n }\n\n async handleSignMessage() {\n const accountAddr = this.signMessage.messageToSign?.accountAddr\n const networkId = this.signMessage.messageToSign?.networkId\n\n // Could (rarely) happen if not even a single account state is fetched yet\n const shouldForceUpdateAndWaitForAccountState =\n accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (shouldForceUpdateAndWaitForAccountState)\n await this.accounts.updateAccountState(accountAddr, 'latest', [networkId])\n\n const isAccountStateStillMissing =\n !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (isAccountStateStillMissing) {\n const message =\n 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'\n const error = new Error(\n `The account state of ${accountAddr} is missing for the network with id ${networkId}.`\n )\n return this.emitError({ level: 'major', message, error })\n }\n\n await this.signMessage.sign()\n\n const signedMessage = this.signMessage.signedMessage\n // Error handling on the prev step will notify the user, it's fine to return here\n if (!signedMessage) return\n\n if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0],\n networkId: signedMessage.networkId,\n nonce:\n this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}\n accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(\n signedMessage.signature as string\n )\n\n this.actions.addOrUpdateAction(accountOpAction, 'first')\n }\n\n await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr)\n await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId)\n\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The Message was successfully signed.'\n })\n }\n\n async #handleAccountAdderInitLedger(\n LedgerKeyIterator: any // TODO: KeyIterator type mismatch\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const ledgerCtrl = this.#externalSignerControllers.ledger\n if (!ledgerCtrl) {\n const message =\n 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n // Once a session with the Ledger device gets initiated, the user might\n // use the device with another app. In this scenario, when coming back to\n // Ambire (the second time a connection gets requested onwards),\n // the Ledger device throws with \"invalid channel\" error.\n // To overcome this, always make sure to clean up before starting\n // a new session when retrieving keys, in case there already is one.\n if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp()\n\n const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE\n await ledgerCtrl.unlock(hdPathTemplate)\n\n if (!ledgerCtrl.walletSDK) {\n const message = 'Could not establish connection with the Ledger device'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl })\n await this.accountAdder.init({ keyIterator, hdPathTemplate })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Ledger device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLedger(LedgerKeyIterator: any /* TODO: KeyIterator type mismatch */) {\n await this.withStatus('handleAccountAdderInitLedger', async () =>\n this.#handleAccountAdderInitLedger(LedgerKeyIterator)\n )\n }\n\n async #handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const latticeCtrl = this.#externalSignerControllers.lattice\n if (!latticeCtrl) {\n const message =\n 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE\n await latticeCtrl.unlock(hdPathTemplate, undefined, true)\n\n const { walletSDK } = latticeCtrl\n await this.accountAdder.init({\n keyIterator: new LatticeKeyIterator({ walletSDK }),\n hdPathTemplate\n })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n await this.withStatus('handleAccountAdderInitLattice', async () =>\n this.#handleAccountAdderInitLattice(LatticeKeyIterator)\n )\n }\n\n async updateAccountsOpsStatuses(): Promise<{ newestOpTimestamp: number }> {\n await this.#initialLoadPromise\n\n const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } =\n await this.activity.updateAccountsOpsStatuses()\n\n if (shouldEmitUpdate) {\n this.emitUpdate()\n\n if (shouldUpdatePortfolio) {\n this.updateSelectedAccountPortfolio(true)\n }\n }\n\n updatedAccountsOps.forEach((op) => {\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op)\n })\n\n return { newestOpTimestamp }\n }\n\n // call this function after a call to the singleton has been made\n // it will check if the factory has been deployed and update the network settings if it has been\n async setContractsDeployedToTrueIfDeployed(network: Network) {\n await this.#initialLoadPromise\n if (network.areContractsDeployed) return\n\n const provider = this.providers.providers[network.id]\n if (!provider) return\n\n const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY)\n if (factoryCode === '0x') return\n await this.networks.updateNetwork({ areContractsDeployed: true }, network.id)\n }\n\n #removeAccountKeyData(address: Account['addr']) {\n // Compute account keys that are only associated with this account\n const accountAssociatedKeys =\n this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []\n const keysInKeystore = this.keystore.keys\n const importedAccountKeys = keysInKeystore.filter((key) =>\n accountAssociatedKeys.includes(key.addr)\n )\n const solelyAccountKeys = importedAccountKeys.filter((key) => {\n const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some(\n (acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)\n )\n\n return !isKeyAssociatedWithOtherAccounts\n })\n\n // Remove account keys from the keystore\n solelyAccountKeys.forEach((key) => {\n this.keystore.removeKey(key.addr, key.type).catch((e) => {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account key',\n error: e\n })\n })\n })\n }\n\n async removeAccount(address: Account['addr']) {\n await this.withStatus('removeAccount', async () => {\n try {\n this.#removeAccountKeyData(address)\n // Remove account data from sub-controllers\n await this.accounts.removeAccountData(address)\n this.portfolio.removeAccountData(address)\n await this.activity.removeAccountData(address)\n this.actions.removeAccountData(address)\n this.signMessage.removeAccountData(address)\n this.defiPositions.removeAccountData(address)\n\n if (this.selectedAccount.account?.addr === address) {\n await this.#selectAccount(this.accounts.accounts[0]?.addr)\n }\n\n if (this.signAccountOp?.account.addr === address) {\n this.destroySignAccOp()\n }\n\n this.emitUpdate()\n } catch (e: any) {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account',\n error: e || new Error('Failed to remove account')\n })\n }\n })\n }\n\n async #ensureAccountInfo(accountAddr: AccountId, networkId: NetworkId) {\n await this.#initialLoadPromise\n // Initial sanity check: does this account even exist?\n if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) {\n this.signAccOpInitError = `Account ${accountAddr} does not exist`\n return\n }\n // If this still didn't work, re-load\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n await this.accounts.updateAccountState(accountAddr, 'pending', [networkId])\n // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`\n }\n\n #batchCallsFromUserRequests(accountAddr: AccountId, networkId: NetworkId): Call[] {\n // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind\n return (this.userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n }\n\n async reloadSelectedAccount(\n options: {\n forceUpdate?: boolean\n networkId?: NetworkId\n } = {\n forceUpdate: true,\n networkId: undefined\n }\n ) {\n const { forceUpdate, networkId } = options\n const networkToUpdate = networkId\n ? this.networks.networks.find((n) => n.id === networkId)\n : undefined\n if (!this.selectedAccount.account) return\n\n this.selectedAccount.resetSelectedAccountPortfolio()\n await Promise.all([\n // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon),\n // it's very likely that the account state is already in the process of being updated.\n // If we try to run the same action, `withStatus` validation will throw an error.\n // So, we perform this safety check to prevent the error.\n // However, even if we don't trigger an update here, it's not a big problem,\n // as the account state will be updated anyway, and its update will be very recent.\n !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr\n ? this.accounts.updateAccountState(\n this.selectedAccount.account.addr,\n 'pending',\n networkId ? [networkId] : undefined\n )\n : Promise.resolve(),\n // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally,\n // as the PortfolioController already exposes flags that are highly sufficient for the UX.\n // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard),\n // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper.\n this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate),\n this.defiPositions.updatePositions(networkId)\n ])\n }\n\n #updateIsOffline() {\n const oldIsOffline = this.isOffline\n const accountAddr = this.selectedAccount.account?.addr\n\n if (!accountAddr) return\n\n // We have to make calculations based on the state of the portfolio\n // and not the selected account portfolio the flag isOffline\n // and the errors of the selected account portfolio should\n // come in the same tick. Otherwise the UI may flash the wrong error.\n const latestState = this.portfolio.getLatestPortfolioState(accountAddr)\n const latestStateKeys = Object.keys(latestState)\n\n const isAllReady = latestStateKeys.every((networkId) => {\n return isNetworkReady(latestState[networkId])\n })\n\n if (!isAllReady) return\n\n const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => {\n const state = latestState[networkId]\n\n return !!state?.criticalError\n })\n\n const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => {\n const provider = this.providers.providers[networkId]\n const isWorking = provider.isWorking\n\n return typeof isWorking === 'boolean' && !isWorking\n })\n\n // Update isOffline if either all portfolio networks have errors or we've failed to fetch\n // the account state for every account. This is because either update may fail first.\n this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors\n\n if (oldIsOffline !== this.isOffline) {\n this.emitUpdate()\n }\n }\n\n // eslint-disable-next-line default-param-last\n async updateSelectedAccountPortfolio(forceUpdate: boolean = false, network?: Network) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId\n const networkData =\n network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n this.selectedAccount.account,\n this.actions.visibleActionsQueue,\n networkData,\n this.signAccountOp?.accountOp\n )\n\n await this.portfolio.updateSelectedAccount(\n this.selectedAccount.account.addr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate }\n )\n this.#updateIsOffline()\n }\n\n #getUserRequestAccountError(dappOrigin: string, fromAccountAddr: string): string | null {\n if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) {\n const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr)\n\n if (isAddressInAccounts) return null\n\n return 'The dApp is trying to sign using an address that is not imported in the extension.'\n }\n const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr\n\n if (isAddressSelected) return null\n\n return 'The dApp is trying to sign using an address that is not selected in the extension.'\n }\n\n async buildUserRequestFromDAppRequest(\n request: DappProviderRequest,\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n ) {\n await this.#initialLoadPromise\n let userRequest = null\n let actionPosition: ActionPosition = 'last'\n const kind = dappRequestMethodToActionKind(request.method)\n const dapp = this.dapps.getDapp(request.origin)\n\n if (kind === 'calls') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n const isWalletSendCalls = !!request.params[0].calls\n const accountAddr = getAddress(request.params[0].from)\n\n const calls: Calls['calls'] = isWalletSendCalls\n ? request.params[0].calls\n : [request.params[0]]\n const paymasterService = isWalletSendCalls\n ? getPaymasterService(network.chainId, request.params[0].capabilities)\n : null\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data || '0x',\n value: call.value ? getBigInt(call.value) : 0n\n }))\n },\n meta: {\n isSignAction: true,\n isWalletSendCalls,\n accountAddr,\n networkId: network.id,\n paymasterService\n },\n dappPromise\n } as SignUserRequest\n if (!this.selectedAccount.account.creation) {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n } else if (kind === 'message') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[1])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'message',\n message: msg[0]\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else if (kind === 'typedMessage') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[0])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n let typedData = msg?.[1]\n\n try {\n typedData = parse(typedData)\n } catch (error) {\n throw ethErrors.rpc.invalidRequest('Invalid typedData provided')\n }\n\n if (\n !typedData?.types ||\n !typedData?.domain ||\n !typedData?.message ||\n !typedData?.primaryType\n ) {\n throw ethErrors.rpc.methodNotSupported(\n 'Invalid typedData format - only typedData v4 is supported'\n )\n }\n\n if (\n msgAddress === this.selectedAccount.account.addr &&\n (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)\n ) {\n throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'typedMessage',\n types: typedData.types,\n domain: typedData.domain,\n message: typedData.message,\n primaryType: typedData.primaryType\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else {\n userRequest = {\n id: new Date().getTime(),\n session: request.session,\n action: { kind, params: request.params },\n meta: { isSignAction: false },\n dappPromise\n } as DappUserRequest\n }\n\n if (userRequest.action.kind !== 'calls') {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n\n if (!userRequest) return\n\n const isASignOperationRequestedForAnotherAccount =\n userRequest.meta.isSignAction &&\n userRequest.meta.accountAddr !== this.selectedAccount.account?.addr\n\n // We can simply add the user request if it's not a sign operation\n // for another account\n if (!isASignOperationRequestedForAnotherAccount) {\n await this.addUserRequest(\n userRequest,\n actionPosition,\n actionPosition === 'first' || isSmartAccount(this.selectedAccount.account)\n ? 'open-action-window'\n : 'queue-but-open-action-window'\n )\n return\n }\n\n const accountError = this.#getUserRequestAccountError(\n dappPromise.session.origin,\n userRequest.meta.accountAddr\n )\n\n if (accountError) {\n dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError))\n return\n }\n\n const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId))\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n this.userRequestWaitingAccountSwitch.push(userRequest)\n await this.addUserRequest(\n buildSwitchAccountUserRequest({\n nextUserRequest: userRequest,\n networkId: network.id,\n selectedAccountAddr: userRequest.meta.accountAddr,\n session: dappPromise.session,\n dappPromise\n }),\n 'last',\n 'open-action-window'\n )\n }\n\n async buildTransferUserRequest(\n amount: string,\n recipientAddress: string,\n selectedToken: TokenResult,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const userRequest = buildTransferUserRequest({\n selectedAccount: this.selectedAccount.account.addr,\n amount,\n selectedToken,\n recipientAddress\n })\n\n if (!userRequest) {\n this.emitError({\n level: 'major',\n message: 'Unexpected error while building transfer request',\n error: new Error(\n 'buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest'\n )\n })\n return\n }\n\n await this.addUserRequest(userRequest, 'last', actionExecutionType)\n }\n\n async buildSwapAndBridgeUserRequest(activeRouteId?: number) {\n await this.withStatus(\n 'buildSwapAndBridgeUserRequest',\n async () => {\n if (!this.selectedAccount.account) return\n let transaction: SocketAPISendTransactionRequest | null | undefined = null\n\n const activeRoute = this.swapAndBridge.activeRoutes.find(\n (r) => r.activeRouteId === activeRouteId\n )\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n transaction = await this.swapAndBridge.getRouteStartUserTx()\n }\n\n if (activeRoute) {\n this.removeUserRequest(activeRoute.activeRouteId, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined })\n if (!isSmartAccount(this.selectedAccount.account)) {\n this.removeUserRequest(`${activeRouteId}-revoke-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.removeUserRequest(`${activeRouteId}-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n }\n transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId)\n }\n\n if (!this.selectedAccount.account || !transaction) {\n const errorDetails = `missing ${\n this.selectedAccount.account ? 'selected account' : 'transaction'\n } info`\n const error = new SwapAndBridgeError(\n `Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`\n )\n throw new EmittableError({ message: error.message, level: 'major', error })\n }\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === transaction!.chainId\n )!\n\n // TODO: Consider refining the error handling in here, because this\n // swallows errors and doesn't provide any feedback to the user.\n const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(\n transaction,\n network.id,\n this.selectedAccount.account,\n this.providers.providers[network.id]\n )\n\n for (let i = 0; i < swapAndBridgeUserRequests.length; i++) {\n if (i === 0) {\n this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window')\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue')\n }\n }\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n await this.swapAndBridge.addActiveRoute({\n activeRouteId: transaction.activeRouteId,\n userTxIndex: transaction.userTxIndex\n })\n }\n\n if (activeRouteId) {\n this.swapAndBridge.updateActiveRoute(\n activeRouteId,\n {\n userTxIndex: transaction.userTxIndex,\n userTxHash: null\n },\n true\n )\n }\n },\n true\n )\n }\n\n buildClaimWalletUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const claimableRewardsData =\n this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData\n\n if (!claimableRewardsData) return\n\n const userRequest: UserRequest = buildClaimWalletRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n claimableRewardsData\n })\n\n this.addUserRequest(userRequest)\n }\n\n buildMintVestingUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData\n\n if (!addrVestingData) return\n const userRequest: UserRequest = buildMintVestingRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n addrVestingData\n })\n\n this.addUserRequest(userRequest)\n }\n\n resolveUserRequest(data: any, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return // TODO: emit error\n\n userRequest.dappPromise?.resolve(data)\n // These requests are transitionary initiated internally (not dApp requests) that block dApp requests\n // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives\n if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) {\n setTimeout(() => {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }, 300)\n } else {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }\n }\n\n rejectUserRequest(err: string, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return\n\n if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n this.userRequests = this.userRequests.filter(\n (r) =>\n !(\n r.action.kind === 'calls' &&\n r.meta.accountAddr === userRequest.meta.accountAddr &&\n r.meta.networkId === userRequest.meta.networkId\n )\n )\n }\n\n // if the userRequest that is about to be removed is an approval request\n // find and remove the associated pending transaction request if there is any\n // this is valid scenario for a swap & bridge txs with a BA\n if (userRequest.action.kind === 'calls') {\n const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr)!\n\n if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) {\n this.removeUserRequest(userRequest.meta.activeRouteId)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`)\n }\n }\n\n userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err))\n this.removeUserRequest(requestId)\n }\n\n rejectSignAccountOpCall(callId: string) {\n if (!this.signAccountOp) return\n\n const { calls, networkId, accountAddr } = this.signAccountOp.accountOp\n\n const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId\n if (requestId) {\n const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId)\n const userRequest = this.userRequests[userRequestIndex] as SignUserRequest\n if (userRequest.action.kind === 'calls') {\n ;(userRequest.action as Calls).calls = (userRequest.action as Calls).calls.filter(\n (c) => c.id !== callId\n )\n\n if (userRequest.action.calls.length === 0) {\n // the reject will remove the userRequest which will rebuild the action and update the signAccountOp\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.find((a) => a.addr === accountAddr)!,\n networkId,\n nonce: this.accounts.accountStates[accountAddr][networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n\n this.actions.addOrUpdateAction(accountOpAction)\n this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n }\n } else {\n this.emitError({\n message: 'Reject call: the call was not found or was not linked to a user request',\n level: 'major',\n error: new Error(\n `Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`\n )\n })\n }\n }\n\n removeActiveRoute(activeRouteId: number) {\n const userRequest = this.userRequests.find((r) =>\n [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(\n r.id\n )\n )\n\n if (userRequest) {\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n this.swapAndBridge.removeActiveRoute(activeRouteId)\n }\n }\n\n async addUserRequest(\n req: UserRequest,\n actionPosition: ActionPosition = 'last',\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (req.action.kind === 'calls') {\n ;(req.action as Calls).calls.forEach((_, i) => {\n ;(req.action as Calls).calls[i].id = `${req.id}-${i}`\n })\n }\n if (actionPosition === 'first') {\n this.userRequests.unshift(req)\n } else {\n this.userRequests.push(req)\n }\n\n const { id, action, meta } = req\n if (action.kind === 'calls') {\n // @TODO\n // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching\n // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network,\n // and be recalculated when one gets dismissed\n // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise;\n // 4) manage recalc on removeUserRequest too in order to handle EOAs\n // @TODO consider re-using this whole block in removeUserRequest\n await this.#ensureAccountInfo(meta.accountAddr, meta.networkId)\n if (this.signAccOpInitError) {\n return req.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message: this.signAccOpInitError\n })\n )\n }\n\n if (this.#signAccountOpSigningPromise) await this.#signAccountOpSigningPromise\n if (this.#signAccountOpBroadcastPromise) await this.#signAccountOpBroadcastPromise\n\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)!\n const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]\n\n if (isSmartAccount(account)) {\n const network = this.networks.networks.find((n) => n.id === meta.networkId)!\n\n // find me the accountOp for the network if any, it's always 1 for SA\n const currentAccountOpAction = this.actions.actionsQueue.find(\n (a) =>\n a.type === 'accountOp' &&\n a.accountOp.accountAddr === account.addr &&\n a.accountOp.networkId === network.id\n ) as AccountOpAction | undefined\n\n const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(\n account.addr,\n (message) =>\n message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n message.networkId === network.id\n )\n\n const hasAuthorized =\n !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization ||\n !!entryPointAuthorizationMessageFromHistory\n\n if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) {\n await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType)\n this.emitUpdate()\n return\n }\n\n const accountOpAction = makeSmartAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue,\n entryPointAuthorizationSignature:\n entryPointAuthorizationMessageFromHistory?.signature ?? undefined\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n if (this.signAccountOp) {\n if (this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n } else {\n // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation.\n // It's necessary to continue operating with the token `amountPostSimulation` amount.\n this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n const accountOpAction = makeBasicAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequest: req\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n }\n } else {\n let actionType: 'dappRequest' | 'benzin' | 'signMessage' | 'switchAccount' = 'dappRequest'\n\n if (req.action.kind === 'typedMessage' || req.action.kind === 'message') {\n actionType = 'signMessage'\n\n if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) {\n const msgReq = this.userRequests.find((uReq) => uReq.id === id)\n if (!msgReq) return\n msgReq.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message:\n 'Rejected: Please complete your pending message request before initiating a new one.'\n })\n )\n this.userRequests.splice(this.userRequests.indexOf(msgReq), 1)\n return\n }\n }\n if (req.action.kind === 'benzin') actionType = 'benzin'\n if (req.action.kind === 'switchAccount') actionType = 'switchAccount'\n\n this.actions.addOrUpdateAction(\n {\n id,\n type: actionType,\n userRequest: req as UserRequest as never\n },\n actionPosition,\n actionExecutionType\n )\n }\n\n this.emitUpdate()\n }\n\n // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations\n // first one sounds more reasonable\n // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue)\n removeUserRequest(\n id: UserRequest['id'],\n options: {\n shouldRemoveSwapAndBridgeRoute: boolean\n shouldUpdateAccount?: boolean\n shouldOpenNextRequest?: boolean\n } = {\n shouldRemoveSwapAndBridgeRoute: true,\n shouldUpdateAccount: true,\n shouldOpenNextRequest: true\n }\n ) {\n const req = this.userRequests.find((uReq) => uReq.id === id)\n if (!req) return\n\n // remove from the request queue\n this.userRequests.splice(this.userRequests.indexOf(req), 1)\n\n // update the pending stuff to be signed\n const { action, meta } = req\n if (action.kind === 'calls') {\n const network = this.networks.networks.find((net) => net.id === meta.networkId)!\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)\n if (!account)\n throw new Error(\n `batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`\n )\n\n if (isSmartAccount(account)) {\n const accountOpIndex = this.actions.actionsQueue.findIndex(\n (a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`\n )\n const accountOpAction = this.actions.actionsQueue[accountOpIndex] as\n | AccountOpAction\n | undefined\n // accountOp has just been rejected or broadcasted\n if (!accountOpAction) {\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n this.emitUpdate()\n return\n }\n\n accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(\n meta.accountAddr,\n meta.networkId\n )\n if (accountOpAction.accountOp.calls.length) {\n this.actions.addOrUpdateAction(accountOpAction)\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null })\n this.estimateSignAccountOp()\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(\n `${meta.accountAddr}-${meta.networkId}`,\n options.shouldOpenNextRequest\n )\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n } else if (id === ACCOUNT_SWITCH_USER_REQUEST) {\n const requestsToAdd = this.userRequestWaitingAccountSwitch.filter(\n (r) => r.meta.accountAddr === this.selectedAccount.account!.addr\n )\n this.actions.removeAction(\n id,\n this.selectedAccount.account?.addr !== (action as any).params!.switchToAccountAddr\n )\n ;(async () => {\n // eslint-disable-next-line no-restricted-syntax\n for (const r of requestsToAdd) {\n this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1)\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(r)\n }\n })()\n } else {\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n }\n this.emitUpdate()\n }\n\n async addEntryPointAuthorization(\n req: UserRequest,\n network: Network,\n accountState: AccountOnchainState,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (\n this.actions.visibleActionsQueue.find(\n (a) =>\n a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n (a as SignMessageAction).userRequest.meta.networkId === req.meta.networkId\n )\n ) {\n this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return\n }\n\n const typedMessageAction = await getEntryPointAuthorization(\n req.meta.accountAddr,\n network.chainId,\n BigInt(accountState.nonce)\n )\n await this.addUserRequest(\n {\n id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n action: typedMessageAction,\n meta: {\n isSignAction: true,\n accountAddr: req.meta.accountAddr,\n networkId: req.meta.networkId\n },\n session: req.session,\n dappPromise: req?.dappPromise\n ? { reject: req?.dappPromise?.reject, resolve: () => {} }\n : undefined\n } as SignUserRequest,\n 'first',\n actionExecutionType\n )\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.networks.addNetwork(network)\n await this.updateSelectedAccountPortfolio()\n }\n\n async removeNetwork(id: NetworkId) {\n await this.networks.removeNetwork(id)\n this.portfolio.removeNetworkData(id)\n this.defiPositions.removeNetworkData(id)\n this.accountAdder.removeNetworkData(id)\n }\n\n async resolveAccountOpAction(data: any, actionId: AccountOpAction['id']) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp } = accountOpAction as AccountOpAction\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!network) return\n\n const meta: SignUserRequest['meta'] = {\n isSignAction: true,\n accountAddr: accountOp.accountAddr,\n chainId: network.chainId,\n networkId: '',\n txnId: null,\n userOpHash: null\n }\n if (data.submittedAccountOp) {\n // can be undefined, check submittedAccountOp.ts\n meta.txnId = data.submittedAccountOp.txnId\n\n meta.identifiedBy = data.submittedAccountOp.identifiedBy\n meta.submittedAccountOp = data.submittedAccountOp\n }\n\n const benzinUserRequest: SignUserRequest = {\n id: new Date().getTime(),\n action: { kind: 'benzin' },\n meta\n }\n await this.addUserRequest(benzinUserRequest, 'first')\n\n this.actions.removeAction(actionId)\n\n // handle wallet_sendCalls before pollTxnId as 1) it's faster\n // 2) the identifier is different\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const walletSendCallsUserReq = this.userRequests.find(\n (r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls\n )\n if (walletSendCallsUserReq) {\n walletSendCallsUserReq.dappPromise?.resolve({\n hash: getDappIdentifier(data.submittedAccountOp)\n })\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(walletSendCallsUserReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n // Note: this may take a while!\n const txnId = await pollTxnId(\n data.submittedAccountOp.identifiedBy,\n network,\n this.fetch,\n this.callRelayer\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId)\n if (uReq) {\n if (txnId) {\n uReq.dappPromise?.resolve({ hash: txnId })\n } else {\n uReq.dappPromise?.reject(\n ethErrors.rpc.transactionRejected({\n message: 'Transaction rejected by the bundler'\n })\n )\n }\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(uReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n this.emitUpdate()\n }\n\n rejectAccountOpAction(\n err: string,\n actionId: AccountOpAction['id'],\n shouldOpenNextAction: boolean\n ) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp, id } = accountOpAction as AccountOpAction\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(actionId, shouldOpenNextAction)\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n if (call.fromUserRequestId) this.rejectUserRequest(err, call.fromUserRequestId)\n }\n\n this.emitUpdate()\n }\n\n async #updateGasPrice() {\n await this.#initialLoadPromise\n\n // if there's no signAccountOp initialized, we don't want to fetch gas\n const accOp = this.signAccountOp?.accountOp ?? null\n if (!accOp) return undefined\n\n const network = this.networks.networks.find((net) => net.id === accOp.networkId)\n if (!network) return undefined // shouldn't happen\n\n const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr)\n if (!account) return undefined // shouldn't happen\n\n const is4337 = isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[accOp.accountAddr][accOp.networkId]\n )\n const bundler = this.signAccountOp\n ? this.signAccountOp.bundlerSwitcher.getBundler()\n : getDefaultBundler(network)\n const bundlerFetch = async () => {\n if (!is4337) return null\n const errorCallback = (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n }\n return bundler.fetchGasPrices(network, errorCallback).catch((e) => {\n this.emitError({\n level: 'silent',\n message: \"Failed to fetch the bundler's gas price\",\n error: e\n })\n })\n }\n const [gasPriceData, bundlerGas] = await Promise.all([\n getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => {\n this.emitError({\n level: 'major',\n message: `Unable to get gas price for ${network.id}`,\n error: new Error(`Failed to fetch gas price: ${e?.message}`)\n })\n return null\n }),\n bundlerFetch()\n ])\n\n if (gasPriceData && gasPriceData.gasPrice) this.gasPrices[network.id] = gasPriceData.gasPrice\n if (bundlerGas)\n this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }\n\n return {\n blockGasLimit: gasPriceData?.blockGasLimit\n }\n }\n\n async updateSignAccountOpGasPrice() {\n if (!this.signAccountOp) return\n\n const accOp = this.signAccountOp.accountOp\n const gasData = await this.#updateGasPrice()\n\n // there's a chance signAccountOp gets destroyed between the time\n // the first \"if (!this.signAccountOp) return\" is performed and\n // the time we get here. To prevent issues, we check one more time\n if (!this.signAccountOp) return\n\n this.signAccountOp.update({\n gasPrices: this.gasPrices[accOp.networkId],\n bundlerGasPrices: this.bundlerGasPrices[accOp.networkId],\n blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined\n })\n this.emitUpdate()\n }\n\n // @TODO: protect this from race conditions/simultanous executions\n async estimateSignAccountOp() {\n try {\n if (!this.signAccountOp) return\n\n // make a local copy to avoid updating the main reference\n const localAccountOp: AccountOp = { ...this.signAccountOp.accountOp }\n\n await this.#initialLoadPromise\n // new accountOps should have spoof signatures so that they can be easily simulated\n // this is not used by the Estimator, because it iterates through all associatedKeys and\n // it knows which ones are authenticated, and it can generate it's own spoofSig\n // @TODO\n // accountOp.signature = `${}03`\n\n // TODO check if needed data in accountStates are available\n // this.accountStates[accountOp.accountAddr][accountOp.networkId].\n const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr)\n\n // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment.\n // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee.\n //\n // If the current account is an EOA, only this account can pay the fee,\n // and there's no need for checking other EOA accounts native balances.\n // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here.\n //\n // we're excluding the view only accounts from the natives to check\n // in all cases EXCEPT the case where we're making an estimation for\n // the view only account itself. In all other, view only accounts options\n // should not be present as the user cannot pay the fee with them (no key)\n const nativeToCheck = account?.creation\n ? this.accounts.accounts\n .filter(\n (acc) =>\n !isSmartAccount(acc) &&\n (acc.addr === localAccountOp.accountAddr ||\n !getIsViewOnly(this.keystore.keys, acc.associatedKeys))\n )\n .map((acc) => acc.addr)\n : []\n\n if (!account)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`\n )\n const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId)\n if (!network)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`\n )\n\n // Take the fee tokens from two places: the user's tokens and his gasTank\n // The gasTank tokens participate on each network as they belong everywhere\n // NOTE: at some point we should check all the \"?\" signs below and if\n // an error pops out, we should notify the user about it\n const networkFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[\n localAccountOp.networkId\n ]?.result?.feeTokens ?? []\n const gasTankFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result\n ?.tokens ?? []\n\n const feeTokens =\n [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []\n\n // can be read from the UI\n const humanization = humanizeAccountOp(localAccountOp, {})\n humanization.forEach((call: any) => {\n if (!call.fullVisualization) return\n\n call.fullVisualization.forEach(async (visualization: any) => {\n if (visualization.type !== 'address' || !visualization.address) return\n\n await this.domains.reverseLookup(visualization.address)\n })\n })\n\n const additionalHints: GetOptions['additionalErc20Hints'] = humanization\n .map((call: any) =>\n !call.fullVisualization\n ? []\n : call.fullVisualization.map((vis: any) =>\n vis.address && isAddress(vis.address) ? getAddress(vis.address) : ''\n )\n )\n .flat()\n .filter((x: any) => isAddress(x))\n\n this.portfolio.addTokensToBeLearned(additionalHints, network.id)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n this.signAccountOp.accountOp\n )\n\n const [, estimation] = await Promise.all([\n // NOTE: we are not emitting an update here because the portfolio controller will do that\n // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as\n // it may have different needs\n this.portfolio.updateSelectedAccount(\n localAccountOp.accountAddr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate: true }\n ),\n estimate(\n this.providers.providers[localAccountOp.networkId],\n network,\n account,\n localAccountOp,\n this.accounts.accountStates,\n nativeToCheck,\n // @TODO - first time calling this, portfolio is still not loaded.\n feeTokens,\n (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n },\n this.signAccountOp.bundlerSwitcher,\n {\n is4337Broadcast: isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]\n )\n }\n ).catch((e) => {\n const { message } = getHumanReadableEstimationError(e)\n\n this.emitError({\n level: 'major',\n message,\n error: e\n })\n return null\n })\n ])\n\n // @race\n // if the signAccountOp has been deleted, don't continue as the request has already finished\n if (!this.signAccountOp) return\n\n if (estimation) {\n const currentNonceAhead =\n BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n)\n\n // if the nonce from the estimation is bigger than the one in localAccountOp,\n // override the accountState and accountOp with the newly detected nonce\n if (currentNonceAhead) {\n localAccountOp.nonce = BigInt(estimation.currentAccountNonce)\n this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n\n if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId])\n this.accounts.accountStates[localAccountOp.accountAddr][\n localAccountOp.networkId\n ].nonce = localAccountOp.nonce\n }\n\n const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'\n const lastTxn = this.activity.getLastTxn(localAccountOp.networkId)\n const SAHasOldNonceOnARelayerNetwork =\n isSmartAccount(account) &&\n !network.erc4337.enabled &&\n lastTxn &&\n localAccountOp.nonce === lastTxn.nonce &&\n lastTxn.success &&\n lastTxn.status === AccountOpStatus.Success\n\n if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n return\n }\n }\n\n if (\n estimation &&\n estimation.nonFatalErrors &&\n estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') &&\n this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]\n ) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n\n // returning here means estimation will not be set => better UX as\n // the user will not see the warning but instead\n // just wait for the new estimation\n return\n }\n\n // check if an RBF should be applied for the incoming transaction\n // for SA conditions are: take the last broadcast but not confirmed accOp\n // and check if the nonce is the same as the current nonce (non 4337 txns)\n // for EOA: check the last broadcast but not confirmed txn across SA\n // as the EOA could've broadcast a txn there + it's own history and\n // compare the highest found nonce\n const rbfAccountOps: { [key: string]: SubmittedAccountOp | null } = {}\n nativeToCheck.push(localAccountOp.accountAddr)\n nativeToCheck.forEach((accId) => {\n const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId)\n\n // the accountState of the nativeToCheck may no be initialized\n const currentNonce =\n this.accounts.accountStates &&\n this.accounts.accountStates[accId] &&\n this.accounts.accountStates[accId][localAccountOp.networkId]\n ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce\n : null\n\n rbfAccountOps[accId] =\n notConfirmedOp &&\n !notConfirmedOp.gasFeePayment?.isERC4337 &&\n currentNonce &&\n currentNonce === notConfirmedOp.nonce\n ? notConfirmedOp\n : null\n })\n\n // if there's an estimation error, override the pending results\n if (estimation && estimation.error) {\n this.portfolio.overridePendingResults(localAccountOp)\n }\n // update the signAccountOp controller once estimation finishes;\n // this eliminates the infinite loading bug if the estimation comes slower\n if (this.signAccountOp && estimation) {\n this.signAccountOp.update({ estimation, rbfAccountOps })\n }\n } catch (error: any) {\n this.signAccountOp?.calculateWarnings()\n this.emitError({\n level: 'silent',\n message: 'Estimation error',\n error\n })\n }\n }\n\n /**\n * There are 4 ways to broadcast an AccountOp:\n * 1. For basic accounts (EOA), there is only one way to do that. After\n * signing the transaction, the serialized signed transaction object gets\n * send to the network.\n * 2. For smart accounts, when EOA pays the fee. Two signatures are needed\n * for this. The first one is the signature of the AccountOp itself. The\n * second one is the signature of the transaction that will be executed\n * by the smart account.\n * 3. For smart accounts that broadcast the ERC-4337 way.\n * 4. for smart accounts, when the Relayer does the broadcast.\n *\n */\n async #broadcastSignedAccountOp() {\n const accountOp = this.signAccountOp?.accountOp\n const estimation = this.signAccountOp?.estimation\n const actionId = this.signAccountOp?.fromActionId\n const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher\n const contactSupportPrompt = 'Please try again or contact support if the problem persists.'\n\n if (\n !accountOp ||\n !estimation ||\n !actionId ||\n !accountOp.signingKeyAddr ||\n !accountOp.signingKeyType ||\n !accountOp.signature ||\n !bundlerSwitcher\n ) {\n const message = `Missing mandatory transaction details. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const provider = this.providers.providers[accountOp.networkId]\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!provider) {\n const networkName = network?.name || `network with id ${accountOp.networkId}`\n const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!account) {\n const addr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Account with address ${addr} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!network) {\n const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n let transactionRes: {\n txnId?: string\n nonce: number\n identifiedBy: AccountOpIdentifiedBy\n } | null = null\n\n // Basic account (EOA)\n if (!isSmartAccount(account)) {\n try {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`\n return await this.throwBroadcastAccountOp({ message, accountState })\n }\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const gasFeePayment = accountOp.gasFeePayment!\n const { to, value, data } = accountOp.calls[0]\n const rawTxn: TxnRequest = {\n to: to ?? undefined,\n value,\n data,\n chainId: network!.chainId,\n nonce: await provider.getTransactionCount(accountOp.accountAddr),\n gasLimit: gasFeePayment.simulatedGasLimit\n }\n\n // if it's eip1559, send it as such. If no, go to legacy\n if (gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account but EOA pays the fee\n else if (\n account.creation &&\n accountOp.gasFeePayment &&\n accountOp.gasFeePayment.paidBy !== account.addr\n ) {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`\n\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n let data\n let to\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n to = accountOp.accountAddr\n data = ambireAccount.encodeFunctionData('execute', [\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n } else {\n const ambireFactory = new Interface(AmbireFactory.abi)\n to = account.creation.factoryAddr\n data = ambireFactory.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n }\n\n try {\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const rawTxn: TxnRequest = {\n to,\n data,\n // We ultimately do a smart contract call, which means we don't need\n // to send any `value` from the EOA address. The actual `value` will\n // get taken from the value encoded in the `data` field.\n value: BigInt(0),\n chainId: network.chainId,\n nonce: await provider.getTransactionCount(accountOp.gasFeePayment!.paidBy),\n gasLimit: accountOp.gasFeePayment.simulatedGasLimit\n }\n\n if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account, the ERC-4337 way\n else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) {\n const userOperation = accountOp.asUserOperation\n if (!userOperation) {\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n // broadcast through bundler's service\n let userOperationHash\n const bundler = bundlerSwitcher.getBundler()\n try {\n userOperationHash = await bundler.broadcast(userOperation, network)\n } catch (e: any) {\n let retryMsg\n\n // if the signAccountOp is still active (it should be)\n // try to switch the bundler and ask the user to try again\n // TODO: explore more error case where we switch the bundler\n if (this.signAccountOp) {\n const decodedError = bundler.decodeBundlerError(e)\n const humanReadable = getHumanReadableBroadcastError(decodedError)\n const switcher = this.signAccountOp.bundlerSwitcher\n this.signAccountOp.updateStatus(SigningStatus.ReadyToSign)\n\n if (switcher.canSwitch(humanReadable)) {\n switcher.switch()\n this.estimateSignAccountOp()\n this.#updateGasPrice()\n retryMsg = 'Broadcast failed because bundler was down. Please try again'\n }\n }\n\n return this.throwBroadcastAccountOp({\n error: e,\n accountState,\n provider,\n network,\n message: retryMsg\n })\n }\n if (!userOperationHash) {\n return this.throwBroadcastAccountOp({\n message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.'\n })\n }\n\n transactionRes = {\n nonce: Number(userOperation.nonce),\n identifiedBy: {\n type: 'UserOperation',\n identifier: userOperationHash,\n bundler: bundler.getName()\n }\n }\n }\n // Smart account, the Relayer way\n else {\n try {\n const body = {\n gasLimit: Number(accountOp.gasFeePayment!.simulatedGasLimit),\n txns: getSignableCalls(accountOp),\n signature: accountOp.signature,\n signer: { address: accountOp.signingKeyAddr },\n nonce: Number(accountOp.nonce)\n }\n const additionalRelayerNetwork = relayerAdditionalNetworks.find(\n (net) => net.chainId === network.chainId\n )\n const relayerNetworkId = additionalRelayerNetwork\n ? additionalRelayerNetwork.name\n : accountOp.networkId\n const response = await this.callRelayer(\n `/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`,\n 'POST',\n body\n )\n if (!response.success) throw new Error(response.message)\n\n transactionRes = {\n txnId: response.txId,\n nonce: Number(accountOp.nonce),\n identifiedBy: {\n type: 'Relayer',\n identifier: response.id\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true })\n }\n }\n\n if (!transactionRes)\n return this.throwBroadcastAccountOp({\n message: 'No transaction response received after being broadcasted.'\n })\n\n this.portfolio.markSimulationAsBroadcasted(account.addr, network.id)\n\n const submittedAccountOp: SubmittedAccountOp = {\n ...accountOp,\n status: AccountOpStatus.BroadcastedButNotConfirmed,\n txnId: transactionRes.txnId,\n nonce: BigInt(transactionRes.nonce),\n identifiedBy: transactionRes.identifiedBy,\n timestamp: new Date().getTime(),\n isSingletonDeploy: !!accountOp.calls.find(\n (call) => call.to && getAddress(call.to) === SINGLETON\n )\n }\n await this.activity.addAccountOp(submittedAccountOp)\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp)\n await this.resolveAccountOpAction(\n {\n networkId: network.id,\n isUserOp: !!accountOp?.asUserOperation,\n submittedAccountOp\n },\n actionId\n )\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The transaction was successfully signed and broadcasted to the network.'\n })\n return Promise.resolve(submittedAccountOp)\n }\n\n // ! IMPORTANT !\n // Banners that depend on async data from sub-controllers should be implemented\n // in the sub-controllers themselves. This is because updates in the sub-controllers\n // will not trigger emitUpdate in the MainController, therefore the banners will\n // remain the same until a subsequent update in the MainController.\n get banners(): Banner[] {\n if (!this.selectedAccount.account || !this.networks.isInitialized) return []\n\n const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.selectedAccount.account.addr,\n this.swapAndBridge.activeRoutes\n )\n const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter(\n (r) => r.routeStatus === 'ready'\n )\n\n const accountOpBanners = getAccountOpBanners({\n accountOpActionsByNetwork: getAccountOpActionsByNetwork(\n this.selectedAccount.account.addr,\n this.actions.actionsQueue\n ),\n selectedAccount: this.selectedAccount.account.addr,\n accounts: this.accounts.accounts,\n networks: this.networks.networks,\n swapAndBridgeRoutesPendingSignature\n })\n\n return [...accountOpBanners]\n }\n\n // Technically this is an anti-pattern, but it's the only way to\n // test the error handling in the method.\n protected throwBroadcastAccountOp({\n message: humanReadableMessage,\n error: _err,\n accountState,\n isRelayer = false,\n provider = undefined,\n network = undefined\n }: {\n message?: string\n error?: Error\n accountState?: AccountOnchainState\n isRelayer?: boolean\n provider?: RPCProvider\n network?: Network\n }) {\n const originalMessage = _err?.message\n let message = humanReadableMessage\n let isReplacementFeeLow = false\n\n if (originalMessage) {\n if (originalMessage.includes('replacement fee too low')) {\n message =\n 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'\n isReplacementFeeLow = true\n this.estimateSignAccountOp()\n } else if (\n originalMessage.includes('pimlico_getUserOperationGasPrice') ||\n originalMessage.includes('preVerificationGas')\n ) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n } else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) {\n message = `Signer key not supported on this network.${\n !accountState?.isV2\n ? 'You can add/change signers from the web wallet or contact support.'\n : 'Please contact support.'\n }`\n } else if (originalMessage.includes('underpriced')) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n } else if (originalMessage.includes('Failed to fetch') && isRelayer) {\n message =\n 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'\n }\n }\n\n if (!message) {\n message = getHumanReadableBroadcastError(_err || new Error('')).message\n\n // if the message states that the paymaster doesn't have sufficient amount,\n // add it to the failedPaymasters to disable it until a top-up is made\n if (message.includes(insufficientPaymasterFunds) && provider && network) {\n failedPaymasters.addInsufficientFunds(provider, network).then(() => {\n this.estimateSignAccountOp()\n })\n }\n }\n\n // To enable another try for signing in case of broadcast fail\n // broadcast is called in the FE only after successful signing\n this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow)\n this.feePayerKey = null\n\n return Promise.reject(\n new EmittableError({ level: 'major', message, error: _err || new Error(message) })\n )\n }\n\n get isSignRequestStillActive(): boolean {\n if (!this.signAccountOp) return false\n\n return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp!.fromActionId)\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n banners: this.banners,\n isSignRequestStillActive: this.isSignRequestStillActive\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/controllers/main/main.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/brace-style */\n\nimport { ethErrors } from 'eth-rpc-errors'\nimport { getAddress, getBigInt, Interface, isAddress } from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport AmbireFactory from '../../../contracts/compiled/AmbireFactory.json'\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS } from '../../consts/dappCommunication'\nimport { AMBIRE_ACCOUNT_FACTORY, SINGLETON } from '../../consts/deploy'\nimport {\n BIP44_LEDGER_DERIVATION_TEMPLATE,\n BIP44_STANDARD_DERIVATION_TEMPLATE\n} from '../../consts/derivation'\nimport {\n Account,\n AccountId,\n AccountOnchainState,\n AccountWithNetworkMeta\n} from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { DappProviderRequest } from '../../interfaces/dapp'\nimport { Fetch } from '../../interfaces/fetch'\nimport {\n ExternalSignerControllers,\n Key,\n KeystoreSignerType,\n TxnRequest\n} from '../../interfaces/keystore'\nimport { AddNetworkRequestParams, Network, NetworkId } from '../../interfaces/network'\nimport { NotificationManager } from '../../interfaces/notification'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { Storage } from '../../interfaces/storage'\nimport { SocketAPISendTransactionRequest } from '../../interfaces/swapAndBridge'\nimport { Calls, DappUserRequest, SignUserRequest, UserRequest } from '../../interfaces/userRequest'\nimport { WindowManager } from '../../interfaces/window'\nimport { getDefaultSelectedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport {\n AccountOpIdentifiedBy,\n getDappIdentifier,\n pollTxnId,\n SubmittedAccountOp\n} from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport {\n dappRequestMethodToActionKind,\n getAccountOpActionsByNetwork,\n getAccountOpFromAction\n} from '../../libs/actions/actions'\nimport { getAccountOpBanners } from '../../libs/banners/banners'\nimport { getPaymasterService } from '../../libs/erc7677/erc7677'\nimport {\n getHumanReadableBroadcastError,\n getHumanReadableEstimationError\n} from '../../libs/errorHumanizer'\nimport { insufficientPaymasterFunds } from '../../libs/errorHumanizer/errors'\nimport { estimate } from '../../libs/estimate/estimate'\nimport { EstimateResult } from '../../libs/estimate/interfaces'\nimport { GasRecommendation, getGasPriceRecommendations } from '../../libs/gasPrice/gasPrice'\nimport { humanizeAccountOp } from '../../libs/humanizer'\nimport { KeyIterator } from '../../libs/keyIterator/keyIterator'\nimport {\n ACCOUNT_SWITCH_USER_REQUEST,\n buildSwitchAccountUserRequest,\n getAccountOpsForSimulation,\n makeBasicAccountOpAction,\n makeSmartAccountOpAction\n} from '../../libs/main/main'\nimport { relayerAdditionalNetworks } from '../../libs/networks/networks'\nimport { GetOptions, TokenResult } from '../../libs/portfolio/interfaces'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { parse } from '../../libs/richJson/richJson'\nimport { isNetworkReady } from '../../libs/selectedAccount/selectedAccount'\nimport {\n adjustEntryPointAuthorization,\n getEntryPointAuthorization\n} from '../../libs/signMessage/signMessage'\nimport {\n buildSwapAndBridgeUserRequests,\n getActiveRoutesForAccount\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { debugTraceCall } from '../../libs/tracer/debugTraceCall'\nimport {\n buildClaimWalletRequest,\n buildMintVestingRequest,\n buildTransferUserRequest\n} from '../../libs/transfer/userRequest'\nimport {\n ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n isErc4337Broadcast,\n shouldAskForEntryPointAuthorization\n} from '../../libs/userOperation/userOperation'\nimport { getDefaultBundler } from '../../services/bundlers/getBundler'\nimport { GasSpeeds } from '../../services/bundlers/types'\nimport { paymasterFactory } from '../../services/paymaster'\nimport { failedPaymasters } from '../../services/paymaster/FailedPaymasters'\nimport { SocketAPI } from '../../services/socket/api'\nimport { getIsViewOnly } from '../../utils/accounts'\nimport shortenAddress from '../../utils/shortenAddress'\nimport wait from '../../utils/wait'\nimport { AccountAdderController } from '../accountAdder/accountAdder'\nimport { AccountsController } from '../accounts/accounts'\nimport {\n AccountOpAction,\n ActionExecutionType,\n ActionPosition,\n ActionsController,\n SignMessageAction\n} from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport { AddressBookController } from '../addressBook/addressBook'\nimport { DappsController } from '../dapps/dapps'\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport { DomainsController } from '../domains/domains'\nimport { EmailVaultController } from '../emailVault/emailVault'\nimport EventEmitter, { ErrorRef, Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { KeystoreController } from '../keystore/keystore'\nimport { NetworksController } from '../networks/networks'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n/* eslint-disable no-underscore-dangle */\nimport { SignAccountOpController, SigningStatus } from '../signAccountOp/signAccountOp'\nimport { SignMessageController } from '../signMessage/signMessage'\nimport { SwapAndBridgeController, SwapAndBridgeFormStatus } from '../swapAndBridge/swapAndBridge'\n\nconst STATUS_WRAPPED_METHODS = {\n onAccountAdderSuccess: 'INITIAL',\n signAccountOp: 'INITIAL',\n broadcastSignedAccountOp: 'INITIAL',\n removeAccount: 'INITIAL',\n handleAccountAdderInitLedger: 'INITIAL',\n handleAccountAdderInitLattice: 'INITIAL',\n importSmartAccountFromDefaultSeed: 'INITIAL',\n buildSwapAndBridgeUserRequest: 'INITIAL',\n importSmartAccountFromSavedSeed: 'INITIAL',\n selectAccount: 'INITIAL'\n} as const\n\nexport class MainController extends EventEmitter {\n #storage: Storage\n\n fetch: Fetch\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n callRelayer: Function\n\n isReady: boolean = false\n\n invite: InviteController\n\n keystore: KeystoreController\n\n /**\n * Hardware wallets (usually) need an additional (external signer) controller,\n * that is app-specific (web, mobile) and is used to interact with the device.\n * (example: LedgerController, TrezorController, LatticeController)\n */\n #externalSignerControllers: ExternalSignerControllers = {}\n\n // Subcontrollers\n networks: NetworksController\n\n providers: ProvidersController\n\n accountAdder: AccountAdderController\n\n portfolio: PortfolioController\n\n defiPositions: DefiPositionsController\n\n dapps: DappsController\n\n actions: ActionsController\n\n // Public sub-structures\n // @TODO emailVaults\n emailVault: EmailVaultController\n\n signMessage: SignMessageController\n\n swapAndBridge: SwapAndBridgeController\n\n signAccountOp: SignAccountOpController | null = null\n\n signAccOpInitError: string | null = null\n\n activity: ActivityController\n\n addressBook: AddressBookController\n\n domains: DomainsController\n\n accounts: AccountsController\n\n selectedAccount: SelectedAccountController\n\n userRequests: UserRequest[] = []\n\n userRequestWaitingAccountSwitch: UserRequest[] = []\n\n // network => GasRecommendation[]\n gasPrices: { [key: string]: GasRecommendation[] } = {}\n\n // network => BundlerGasPrice\n bundlerGasPrices: { [key: string]: { speeds: GasSpeeds; bundler: BUNDLER } } = {}\n\n accountOpsToBeConfirmed: { [key: string]: { [key: string]: AccountOp } } = {}\n\n // TODO: Temporary solution to expose the fee payer key during Account Op broadcast.\n feePayerKey: Key | null = null\n\n lastUpdate: Date = new Date()\n\n isOffline: boolean = false\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n #windowManager: WindowManager\n\n #notificationManager: NotificationManager\n\n #signAccountOpSigningPromise?: Promise\n\n #signAccountOpBroadcastPromise?: Promise\n\n constructor({\n storage,\n fetch,\n relayerUrl,\n velcroUrl,\n socketApiKey,\n keystoreSigners,\n externalSignerControllers,\n windowManager,\n notificationManager\n }: {\n storage: Storage\n fetch: Fetch\n relayerUrl: string\n velcroUrl: string\n socketApiKey: string\n keystoreSigners: Partial<{ [key in Key['type']]: KeystoreSignerType }>\n externalSignerControllers: ExternalSignerControllers\n windowManager: WindowManager\n notificationManager: NotificationManager\n }) {\n super()\n this.#storage = storage\n this.fetch = fetch\n this.#windowManager = windowManager\n this.#notificationManager = notificationManager\n\n this.invite = new InviteController({ relayerUrl, fetch, storage: this.#storage })\n this.keystore = new KeystoreController(this.#storage, keystoreSigners, windowManager)\n this.#externalSignerControllers = externalSignerControllers\n this.networks = new NetworksController(\n this.#storage,\n this.fetch,\n async (network: Network) => {\n this.providers.setProvider(network)\n await this.reloadSelectedAccount({ networkId: network.id })\n },\n (networkId: NetworkId) => {\n this.providers.removeProvider(networkId)\n }\n )\n this.providers = new ProvidersController(this.networks)\n this.accounts = new AccountsController(\n this.#storage,\n this.providers,\n this.networks,\n async (accounts) => {\n const defaultSelectedAccount = getDefaultSelectedAccount(accounts)\n if (defaultSelectedAccount) {\n await this.#selectAccount(defaultSelectedAccount.addr)\n }\n },\n this.providers.updateProviderIsWorking.bind(this.providers),\n this.#updateIsOffline.bind(this)\n )\n this.selectedAccount = new SelectedAccountController({\n storage: this.#storage,\n accounts: this.accounts\n })\n this.portfolio = new PortfolioController(\n this.#storage,\n this.fetch,\n this.providers,\n this.networks,\n this.accounts,\n relayerUrl,\n velcroUrl\n )\n this.defiPositions = new DefiPositionsController({\n fetch: this.fetch,\n storage,\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n providers: this.providers\n })\n this.emailVault = new EmailVaultController(this.#storage, this.fetch, relayerUrl, this.keystore)\n this.accountAdder = new AccountAdderController({\n accounts: this.accounts,\n keystore: this.keystore,\n networks: this.networks,\n providers: this.providers,\n relayerUrl,\n fetch: this.fetch\n })\n this.addressBook = new AddressBookController(this.#storage, this.accounts, this.selectedAccount)\n this.signMessage = new SignMessageController(\n this.keystore,\n this.providers,\n this.networks,\n this.accounts,\n this.#externalSignerControllers\n )\n const socketAPI = new SocketAPI({ apiKey: socketApiKey, fetch: this.fetch })\n this.dapps = new DappsController(this.#storage)\n this.actions = new ActionsController({\n selectedAccount: this.selectedAccount,\n windowManager,\n notificationManager,\n onActionWindowClose: () => {\n const userRequestsToRejectOnWindowClose = this.userRequests.filter(\n (r) => r.action.kind !== 'calls'\n )\n userRequestsToRejectOnWindowClose.forEach((r) =>\n r.dappPromise?.reject(ethErrors.provider.userRejectedRequest())\n )\n this.userRequests = this.userRequests.filter((r) => r.action.kind === 'calls')\n this.userRequestWaitingAccountSwitch = []\n this.emitUpdate()\n }\n })\n this.selectedAccount.initControllers({\n portfolio: this.portfolio,\n defiPositions: this.defiPositions,\n actions: this.actions,\n networks: this.networks,\n providers: this.providers\n })\n\n this.callRelayer = relayerCall.bind({ url: relayerUrl, fetch: this.fetch })\n this.activity = new ActivityController(\n this.#storage,\n this.fetch,\n this.callRelayer,\n this.accounts,\n this.selectedAccount,\n this.providers,\n this.networks,\n async (network: Network) => {\n await this.setContractsDeployedToTrueIfDeployed(network)\n }\n )\n this.swapAndBridge = new SwapAndBridgeController({\n selectedAccount: this.selectedAccount,\n networks: this.networks,\n activity: this.activity,\n invite: this.invite,\n socketAPI,\n storage: this.#storage,\n actions: this.actions\n })\n this.domains = new DomainsController(this.providers.providers)\n this.#initialLoadPromise = this.#load()\n paymasterFactory.init(relayerUrl, fetch, (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n })\n }\n\n /**\n * - Updates the selected account's account state, portfolio and defi positions\n * - Calls batchReverseLookup for all accounts\n *\n * It's not a problem to call it many times consecutively as all methods have internal\n * caching mechanisms to prevent unnecessary calls.\n */\n onPopupOpen() {\n const FIVE_MINUTES = 1000 * 60 * 5\n const selectedAccountAddr = this.selectedAccount.account?.addr\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n if (!this.activity.broadcastedButNotConfirmed.length) {\n // Update defi positions together with the portfolio for simplicity\n this.defiPositions.updatePositions({ maxDataAgeMs: FIVE_MINUTES })\n this.updateSelectedAccountPortfolio(undefined, undefined, FIVE_MINUTES)\n }\n\n if (selectedAccountAddr && !this.accounts.areAccountStatesLoading)\n this.accounts.updateAccountState(selectedAccountAddr)\n }\n\n async #load(): Promise {\n this.isReady = false\n // #load is called in the constructor which is synchronous\n // we await (1 ms/next tick) for the constructor to extend the EventEmitter class\n // and then we call it's methods\n await wait(1)\n this.emitUpdate()\n await this.networks.initialLoadPromise\n await this.providers.initialLoadPromise\n await this.accounts.initialLoadPromise\n await this.selectedAccount.initialLoadPromise\n\n this.defiPositions.updatePositions()\n this.updateSelectedAccountPortfolio()\n this.domains.batchReverseLookup(this.accounts.accounts.map((a) => a.addr))\n /**\n * Listener that gets triggered as a finalization step of adding new\n * accounts via the AccountAdder controller flow.\n *\n * VIEW-ONLY ACCOUNTS: In case of changes in this method, make sure these\n * changes are reflected for view-only accounts as well. Because the\n * view-only accounts import flow bypasses the AccountAdder, this method\n * won't click for them. Their on add success flow continues in the\n * MAIN_CONTROLLER_ADD_VIEW_ONLY_ACCOUNTS action case.\n */\n const onAccountAdderSuccess = () => {\n if (this.accountAdder.addAccountsStatus !== 'SUCCESS') return\n\n return this.withStatus(\n 'onAccountAdderSuccess',\n async () => {\n // Add accounts first, because some of the next steps have validation\n // if accounts exists.\n await this.accounts.addAccounts(this.accountAdder.readyToAddAccounts)\n\n // Then add keys, because some of the next steps could have validation\n // if keys exists. Should be separate (not combined in Promise.all,\n // since firing multiple keystore actions is not possible\n // (the #wrapKeystoreAction listens for the first one to finish and\n // skips the parallel one, if one is requested).\n\n await this.keystore.addKeys(this.accountAdder.readyToAddKeys.internal)\n await this.keystore.addKeysExternallyStored(this.accountAdder.readyToAddKeys.external)\n\n // Update the saved seed `hdPathTemplate` if accounts were added from\n // the saved seed, so when user opts in to \"Import a new Smart Account\n // from the saved Seed Phrase\" the next account is derived based\n // on the latest `hdPathTemplate` chosen in the AccountAdder.\n if (this.accountAdder.isInitializedWithSavedSeed)\n this.keystore.changeSavedSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n if (this.keystore.hasKeystoreTempSeed)\n this.keystore.changeTempSeedHdPathTemplateIfNeeded(this.accountAdder.hdPathTemplate)\n },\n true\n )\n }\n this.accountAdder.onUpdate(onAccountAdderSuccess)\n\n this.isReady = true\n this.emitUpdate()\n }\n\n lock() {\n this.keystore.lock()\n this.emailVault.cleanMagicAndSessionKeys()\n this.selectedAccount.setDashboardNetworkFilter(null)\n }\n\n async selectAccount(toAccountAddr: string) {\n await this.withStatus('selectAccount', async () => this.#selectAccount(toAccountAddr), true)\n }\n\n async #selectAccount(toAccountAddr: string | null) {\n await this.#initialLoadPromise\n if (!toAccountAddr) {\n await this.selectedAccount.setAccount(null)\n\n this.emitUpdate()\n return\n }\n\n const accountToSelect = this.accounts.accounts.find((acc) => acc.addr === toAccountAddr)\n if (!accountToSelect) {\n console.error(`Account with address ${toAccountAddr} does not exist`)\n return\n }\n\n this.isOffline = false\n // call closeActionWindow while still on the currently selected account to allow proper\n // state cleanup of the controllers like actionsCtrl, signAccountOpCtrl, signMessageCtrl...\n if (this.actions?.currentAction?.type !== 'switchAccount') {\n this.actions.closeActionWindow()\n }\n this.selectedAccount.setAccount(accountToSelect)\n this.swapAndBridge.onAccountChange()\n this.dapps.broadcastDappSessionEvent('accountsChanged', [toAccountAddr])\n // forceEmitUpdate to update the getters in the FE state of the ctrl\n await this.forceEmitUpdate()\n await this.actions.forceEmitUpdate()\n await this.addressBook.forceEmitUpdate()\n // Don't await these as they are not critical for the account selection\n // and if the user decides to quickly change to another account withStatus\n // will block the UI until these are resolved.\n this.reloadSelectedAccount({ forceUpdate: false })\n this.emitUpdate()\n }\n\n async importSmartAccountFromSavedSeed(seed?: string) {\n await this.withStatus(\n 'importSmartAccountFromSavedSeed',\n async () => {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n if (seed && !this.keystore.hasKeystoreSavedSeed) {\n await this.keystore.addSeed({ seed, hdPathTemplate: BIP44_STANDARD_DERIVATION_TEMPLATE })\n }\n\n const savedSeed = await this.keystore.getSavedSeed()\n if (!savedSeed) {\n throw new EmittableError({\n message:\n 'Failed to retrieve saved seed phrase from keystore. Please try again or contact Ambire support if the issue persists.',\n level: 'major',\n error: new Error('failed to retrieve saved seed phrase from keystore')\n })\n }\n\n const keyIterator = new KeyIterator(savedSeed.seed)\n await this.accountAdder.init({\n keyIterator,\n hdPathTemplate: savedSeed.hdPathTemplate,\n pageSize: 1,\n shouldGetAccountsUsedOnNetworks: false,\n shouldSearchForLinkedAccounts: false\n })\n\n let currentPage: number = 1\n let isAccountAlreadyAdded: boolean\n let nextSmartAccount: AccountWithNetworkMeta | undefined\n\n const findNextSmartAccount = async () => {\n do {\n // eslint-disable-next-line no-await-in-loop\n await this.accountAdder.setPage({ page: currentPage })\n\n nextSmartAccount = this.accountAdder.accountsOnPage.find(\n ({ isLinked, account }) => !isLinked && isSmartAccount(account)\n )?.account\n\n if (!nextSmartAccount) break\n\n isAccountAlreadyAdded = !!this.accounts.accounts.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n (a) => a.addr === nextSmartAccount!.addr\n )\n\n currentPage++\n } while (isAccountAlreadyAdded)\n }\n\n await findNextSmartAccount()\n\n if (!nextSmartAccount) {\n throw new EmittableError({\n message:\n 'Internal error while looking for account to add. Please start the process all over again and if the issue persists contact Ambire support.',\n level: 'major',\n error: new Error('Internal error: Failed to find a smart account to add')\n })\n }\n\n this.accountAdder.selectAccount(nextSmartAccount)\n\n const readyToAddKeys = this.accountAdder.retrieveInternalKeysOfSelectedAccounts()\n\n await this.accountAdder.addAccounts(this.accountAdder.selectedAccounts, {\n internal: readyToAddKeys,\n external: []\n })\n },\n true\n )\n }\n\n initSignAccOp(actionId: AccountOpAction['id']): null | void {\n const accountOp = getAccountOpFromAction(actionId, this.actions.actionsQueue)\n if (!accountOp) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process because no transaction has been found for the specified account and network.'\n return null\n }\n\n const network = this.networks.networks.find((net) => net.id === accountOp.networkId)\n\n if (\n !this.selectedAccount.account ||\n this.selectedAccount.account.addr !== accountOp.accountAddr\n ) {\n this.signAccOpInitError =\n 'Attempting to initialize an accountOp for an account other than the currently selected one.'\n return null\n }\n\n if (!network) {\n this.signAccOpInitError =\n 'We cannot initiate the signing process as we are unable to locate the specified network.'\n return null\n }\n\n // on init, set the accountOp nonce to the latest one we know\n // it could happen that the user inits a userRequest with an old\n // accountState and therefore caching the old nonce in the accountOp.\n // we make sure the latest nonce is set when initing signAccountOp\n const state = this.accounts.accountStates?.[accountOp.accountAddr]?.[accountOp.networkId]\n if (state) accountOp.nonce = state.nonce\n\n this.signAccOpInitError = null\n\n this.signAccountOp = new SignAccountOpController(\n this.accounts,\n this.keystore,\n this.portfolio,\n this.#externalSignerControllers,\n this.selectedAccount.account,\n network,\n actionId,\n accountOp,\n () => {\n this.estimateSignAccountOp()\n },\n () => {\n return this.isSignRequestStillActive\n }\n )\n\n this.emitUpdate()\n\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n }\n\n async handleSignAndBroadcastAccountOp() {\n await this.withStatus(\n 'signAccountOp',\n async () => {\n const wasAlreadySigned = this.signAccountOp?.status?.type === SigningStatus.Done\n if (wasAlreadySigned) return Promise.resolve()\n\n if (!this.signAccountOp) {\n const message =\n 'The signing process was not initialized as expected. Please try again later or contact Ambire support if the issue persists.'\n const error = new Error('SignAccountOp is not initialized')\n this.emitError({ level: 'major', message, error })\n return Promise.reject(error)\n }\n\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpSigningPromise = this.signAccountOp.sign().finally(() => {\n this.#signAccountOpSigningPromise = undefined\n })\n\n return this.#signAccountOpSigningPromise\n },\n true\n )\n\n // Error handling on the prev step will notify the user, it's fine to return here\n if (this.signAccountOp?.status?.type !== SigningStatus.Done) return\n\n return this.withStatus(\n 'broadcastSignedAccountOp',\n async () => {\n // Reset the promise in the `finally` block to ensure it doesn't remain unresolved if an error is thrown\n this.#signAccountOpBroadcastPromise = this.#broadcastSignedAccountOp().finally(() => {\n this.#signAccountOpBroadcastPromise = undefined\n })\n return this.#signAccountOpBroadcastPromise\n },\n true\n )\n }\n\n destroySignAccOp() {\n if (!this.signAccountOp) return\n\n this.feePayerKey = null\n this.signAccountOp = null\n this.signAccOpInitError = null\n\n // NOTE: no need to update the portfolio here as an update is\n // fired upon removeUserRequest\n\n this.emitUpdate()\n }\n\n async traceCall(estimation: EstimateResult) {\n const accountOp = this.signAccountOp?.accountOp\n if (!accountOp) return\n\n const network = this.networks.networks.find((net) => net.id === accountOp?.networkId)\n if (!network) return\n\n try {\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)!\n const state = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n const provider = this.providers.providers[network.id]\n const gasPrice = this.gasPrices[network.id]\n const { tokens, nfts } = await debugTraceCall(\n account,\n accountOp,\n provider,\n state,\n estimation.gasUsed,\n gasPrice,\n !network.rpcNoStateOverride\n )\n const learnedNewTokens = this.portfolio.addTokensToBeLearned(tokens, network.id)\n const learnedNewNfts = await this.portfolio.learnNfts(nfts, network.id)\n // update the portfolio only if new tokens were found through tracing\n if (learnedNewTokens || learnedNewNfts) {\n this.portfolio\n .updateSelectedAccount(\n accountOp.accountAddr,\n network,\n getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n accountOp\n ),\n { forceUpdate: true }\n )\n // fire an update request to refresh the warnings if any\n .then(() => this.signAccountOp?.update({}))\n }\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: 'Error in main.traceCall',\n error: e\n })\n }\n }\n\n async handleSignMessage() {\n const accountAddr = this.signMessage.messageToSign?.accountAddr\n const networkId = this.signMessage.messageToSign?.networkId\n\n // Could (rarely) happen if not even a single account state is fetched yet\n const shouldForceUpdateAndWaitForAccountState =\n accountAddr && networkId && !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (shouldForceUpdateAndWaitForAccountState)\n await this.accounts.updateAccountState(accountAddr, 'latest', [networkId])\n\n const isAccountStateStillMissing =\n !accountAddr || !networkId || !this.accounts.accountStates?.[accountAddr]?.[networkId]\n if (isAccountStateStillMissing) {\n const message =\n 'Unable to sign the message. During the preparation step, required account data failed to get received. Please try again later or contact Ambire support.'\n const error = new Error(\n `The account state of ${accountAddr} is missing for the network with id ${networkId}.`\n )\n return this.emitError({ level: 'major', message, error })\n }\n\n await this.signMessage.sign()\n\n const signedMessage = this.signMessage.signedMessage\n // Error handling on the prev step will notify the user, it's fine to return here\n if (!signedMessage) return\n\n if (signedMessage.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.filter((a) => a.addr === signedMessage.accountAddr)[0],\n networkId: signedMessage.networkId,\n nonce:\n this.accounts.accountStates[signedMessage.accountAddr][signedMessage.networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n if (!accountOpAction.accountOp.meta) accountOpAction.accountOp.meta = {}\n accountOpAction.accountOp.meta.entryPointAuthorization = adjustEntryPointAuthorization(\n signedMessage.signature as string\n )\n\n this.actions.addOrUpdateAction(accountOpAction, 'first')\n }\n\n await this.activity.addSignedMessage(signedMessage, signedMessage.accountAddr)\n await this.resolveUserRequest({ hash: signedMessage.signature }, signedMessage.fromActionId)\n\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The Message was successfully signed.'\n })\n }\n\n async #handleAccountAdderInitLedger(\n LedgerKeyIterator: any // TODO: KeyIterator type mismatch\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const ledgerCtrl = this.#externalSignerControllers.ledger\n if (!ledgerCtrl) {\n const message =\n 'Could not initialize connection with your Ledger device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n // Once a session with the Ledger device gets initiated, the user might\n // use the device with another app. In this scenario, when coming back to\n // Ambire (the second time a connection gets requested onwards),\n // the Ledger device throws with \"invalid channel\" error.\n // To overcome this, always make sure to clean up before starting\n // a new session when retrieving keys, in case there already is one.\n if (ledgerCtrl.walletSDK) await ledgerCtrl.cleanUp()\n\n const hdPathTemplate = BIP44_LEDGER_DERIVATION_TEMPLATE\n await ledgerCtrl.unlock(hdPathTemplate)\n\n if (!ledgerCtrl.walletSDK) {\n const message = 'Could not establish connection with the Ledger device'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const keyIterator = new LedgerKeyIterator({ controller: ledgerCtrl })\n await this.accountAdder.init({ keyIterator, hdPathTemplate })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Ledger device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLedger(LedgerKeyIterator: any /* TODO: KeyIterator type mismatch */) {\n await this.withStatus('handleAccountAdderInitLedger', async () =>\n this.#handleAccountAdderInitLedger(LedgerKeyIterator)\n )\n }\n\n async #handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n if (this.accountAdder.isInitialized) this.accountAdder.reset()\n\n try {\n const latticeCtrl = this.#externalSignerControllers.lattice\n if (!latticeCtrl) {\n const message =\n 'Could not initialize connection with your Lattice1 device. Please try again later or contact Ambire support.'\n throw new EmittableError({ message, level: 'major', error: new Error(message) })\n }\n\n const hdPathTemplate = BIP44_STANDARD_DERIVATION_TEMPLATE\n await latticeCtrl.unlock(hdPathTemplate, undefined, true)\n\n const { walletSDK } = latticeCtrl\n await this.accountAdder.init({\n keyIterator: new LatticeKeyIterator({ walletSDK }),\n hdPathTemplate\n })\n\n return await this.accountAdder.setPage({ page: 1 })\n } catch (error: any) {\n const message = error?.message || 'Could not unlock the Lattice1 device. Please try again.'\n throw new EmittableError({ message, level: 'major', error })\n }\n }\n\n async handleAccountAdderInitLattice(\n LatticeKeyIterator: any /* TODO: KeyIterator type mismatch */\n ) {\n await this.withStatus('handleAccountAdderInitLattice', async () =>\n this.#handleAccountAdderInitLattice(LatticeKeyIterator)\n )\n }\n\n async updateAccountsOpsStatuses(): Promise<{ newestOpTimestamp: number }> {\n await this.#initialLoadPromise\n\n const { shouldEmitUpdate, shouldUpdatePortfolio, updatedAccountsOps, newestOpTimestamp } =\n await this.activity.updateAccountsOpsStatuses()\n\n if (shouldEmitUpdate) {\n this.emitUpdate()\n\n if (shouldUpdatePortfolio) {\n this.updateSelectedAccountPortfolio(true)\n }\n }\n\n updatedAccountsOps.forEach((op) => {\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op)\n })\n\n return { newestOpTimestamp }\n }\n\n // call this function after a call to the singleton has been made\n // it will check if the factory has been deployed and update the network settings if it has been\n async setContractsDeployedToTrueIfDeployed(network: Network) {\n await this.#initialLoadPromise\n if (network.areContractsDeployed) return\n\n const provider = this.providers.providers[network.id]\n if (!provider) return\n\n const factoryCode = await provider.getCode(AMBIRE_ACCOUNT_FACTORY)\n if (factoryCode === '0x') return\n await this.networks.updateNetwork({ areContractsDeployed: true }, network.id)\n }\n\n #removeAccountKeyData(address: Account['addr']) {\n // Compute account keys that are only associated with this account\n const accountAssociatedKeys =\n this.accounts.accounts.find((acc) => acc.addr === address)?.associatedKeys || []\n const keysInKeystore = this.keystore.keys\n const importedAccountKeys = keysInKeystore.filter((key) =>\n accountAssociatedKeys.includes(key.addr)\n )\n const solelyAccountKeys = importedAccountKeys.filter((key) => {\n const isKeyAssociatedWithOtherAccounts = this.accounts.accounts.some(\n (acc) => acc.addr !== address && acc.associatedKeys.includes(key.addr)\n )\n\n return !isKeyAssociatedWithOtherAccounts\n })\n\n // Remove account keys from the keystore\n solelyAccountKeys.forEach((key) => {\n this.keystore.removeKey(key.addr, key.type).catch((e) => {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account key',\n error: e\n })\n })\n })\n }\n\n async removeAccount(address: Account['addr']) {\n await this.withStatus('removeAccount', async () => {\n try {\n this.#removeAccountKeyData(address)\n // Remove account data from sub-controllers\n await this.accounts.removeAccountData(address)\n this.portfolio.removeAccountData(address)\n await this.activity.removeAccountData(address)\n this.actions.removeAccountData(address)\n this.signMessage.removeAccountData(address)\n this.defiPositions.removeAccountData(address)\n\n if (this.selectedAccount.account?.addr === address) {\n await this.#selectAccount(this.accounts.accounts[0]?.addr)\n }\n\n if (this.signAccountOp?.account.addr === address) {\n this.destroySignAccOp()\n }\n\n this.emitUpdate()\n } catch (e: any) {\n throw new EmittableError({\n level: 'major',\n message: 'Failed to remove account',\n error: e || new Error('Failed to remove account')\n })\n }\n })\n }\n\n async #ensureAccountInfo(accountAddr: AccountId, networkId: NetworkId) {\n await this.#initialLoadPromise\n // Initial sanity check: does this account even exist?\n if (!this.accounts.accounts.find((x) => x.addr === accountAddr)) {\n this.signAccOpInitError = `Account ${accountAddr} does not exist`\n return\n }\n // If this still didn't work, re-load\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n await this.accounts.updateAccountState(accountAddr, 'pending', [networkId])\n // If this still didn't work, throw error: this prob means that we're calling for a non-existent acc/network\n if (!this.accounts.accountStates[accountAddr]?.[networkId])\n this.signAccOpInitError = `Failed to retrieve account info for ${networkId}, because of one of the following reasons: 1) network doesn't exist, 2) RPC is down for this network`\n }\n\n #batchCallsFromUserRequests(accountAddr: AccountId, networkId: NetworkId): Call[] {\n // Note: we use reduce instead of filter/map so that the compiler can deduce that we're checking .kind\n return (this.userRequests.filter((r) => r.action.kind === 'calls') as SignUserRequest[]).reduce(\n (uCalls: Call[], req) => {\n if (req.meta.networkId === networkId && req.meta.accountAddr === accountAddr) {\n const { calls } = req.action as Calls\n calls.map((call) => uCalls.push({ ...call, fromUserRequestId: req.id }))\n }\n return uCalls\n },\n []\n )\n }\n\n async reloadSelectedAccount(options?: { forceUpdate?: boolean; networkId?: NetworkId }) {\n const { forceUpdate = true, networkId } = options || {}\n const networkToUpdate = networkId\n ? this.networks.networks.find((n) => n.id === networkId)\n : undefined\n if (!this.selectedAccount.account) return\n\n this.selectedAccount.resetSelectedAccountPortfolio()\n await Promise.all([\n // When we trigger `reloadSelectedAccount` (for instance, from Dashboard -> Refresh balance icon),\n // it's very likely that the account state is already in the process of being updated.\n // If we try to run the same action, `withStatus` validation will throw an error.\n // So, we perform this safety check to prevent the error.\n // However, even if we don't trigger an update here, it's not a big problem,\n // as the account state will be updated anyway, and its update will be very recent.\n !this.accounts.areAccountStatesLoading && this.selectedAccount.account?.addr\n ? this.accounts.updateAccountState(\n this.selectedAccount.account.addr,\n 'pending',\n networkId ? [networkId] : undefined\n )\n : Promise.resolve(),\n // `updateSelectedAccountPortfolio` doesn't rely on `withStatus` validation internally,\n // as the PortfolioController already exposes flags that are highly sufficient for the UX.\n // Additionally, if we trigger the portfolio update twice (i.e., running a long-living interval + force update from the Dashboard),\n // there won't be any error thrown, as all portfolio updates are queued and they don't use the `withStatus` helper.\n this.updateSelectedAccountPortfolio(forceUpdate, networkToUpdate),\n this.defiPositions.updatePositions({ networkId })\n ])\n }\n\n #updateIsOffline() {\n const oldIsOffline = this.isOffline\n const accountAddr = this.selectedAccount.account?.addr\n\n if (!accountAddr) return\n\n // We have to make calculations based on the state of the portfolio\n // and not the selected account portfolio the flag isOffline\n // and the errors of the selected account portfolio should\n // come in the same tick. Otherwise the UI may flash the wrong error.\n const latestState = this.portfolio.getLatestPortfolioState(accountAddr)\n const latestStateKeys = Object.keys(latestState)\n\n const isAllReady = latestStateKeys.every((networkId) => {\n return isNetworkReady(latestState[networkId])\n })\n\n if (!isAllReady) return\n\n const allPortfolioNetworksHaveErrors = latestStateKeys.every((networkId) => {\n const state = latestState[networkId]\n\n return !!state?.criticalError\n })\n\n const allNetworkRpcsAreDown = Object.keys(this.providers.providers).every((networkId) => {\n const provider = this.providers.providers[networkId]\n const isWorking = provider.isWorking\n\n return typeof isWorking === 'boolean' && !isWorking\n })\n\n // Update isOffline if either all portfolio networks have errors or we've failed to fetch\n // the account state for every account. This is because either update may fail first.\n this.isOffline = !!allNetworkRpcsAreDown || !!allPortfolioNetworksHaveErrors\n\n if (oldIsOffline !== this.isOffline) {\n this.emitUpdate()\n }\n }\n\n // TODO: Refactor this to accept an optional object with options\n async updateSelectedAccountPortfolio(\n // eslint-disable-next-line default-param-last\n forceUpdate: boolean = false,\n network?: Network,\n maxDataAgeMs?: number\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const signAccountOpNetworkId = this.signAccountOp?.accountOp.networkId\n const networkData =\n network || this.networks.networks.find((n) => n.id === signAccountOpNetworkId)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n this.selectedAccount.account,\n this.actions.visibleActionsQueue,\n networkData,\n this.signAccountOp?.accountOp\n )\n\n await this.portfolio.updateSelectedAccount(\n this.selectedAccount.account.addr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate, maxDataAgeMs }\n )\n this.#updateIsOffline()\n }\n\n #getUserRequestAccountError(dappOrigin: string, fromAccountAddr: string): string | null {\n if (ORIGINS_WHITELISTED_TO_ALL_ACCOUNTS.includes(dappOrigin)) {\n const isAddressInAccounts = this.accounts.accounts.some((a) => a.addr === fromAccountAddr)\n\n if (isAddressInAccounts) return null\n\n return 'The dApp is trying to sign using an address that is not imported in the extension.'\n }\n const isAddressSelected = this.selectedAccount.account?.addr === fromAccountAddr\n\n if (isAddressSelected) return null\n\n return 'The dApp is trying to sign using an address that is not selected in the extension.'\n }\n\n async buildUserRequestFromDAppRequest(\n request: DappProviderRequest,\n dappPromise: {\n session: { name: string; origin: string; icon: string }\n resolve: (data: any) => void\n reject: (data: any) => void\n }\n ) {\n await this.#initialLoadPromise\n let userRequest = null\n let actionPosition: ActionPosition = 'last'\n const kind = dappRequestMethodToActionKind(request.method)\n const dapp = this.dapps.getDapp(request.origin)\n\n if (kind === 'calls') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n const isWalletSendCalls = !!request.params[0].calls\n const accountAddr = getAddress(request.params[0].from)\n\n const calls: Calls['calls'] = isWalletSendCalls\n ? request.params[0].calls\n : [request.params[0]]\n const paymasterService = isWalletSendCalls\n ? getPaymasterService(network.chainId, request.params[0].capabilities)\n : null\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data || '0x',\n value: call.value ? getBigInt(call.value) : 0n\n }))\n },\n meta: {\n isSignAction: true,\n isWalletSendCalls,\n accountAddr,\n networkId: network.id,\n paymasterService\n },\n dappPromise\n } as SignUserRequest\n if (!this.selectedAccount.account.creation) {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n } else if (kind === 'message') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[1])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'message',\n message: msg[0]\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else if (kind === 'typedMessage') {\n if (!this.selectedAccount.account) throw ethErrors.rpc.internal()\n\n const msg = request.params\n if (!msg) {\n throw ethErrors.rpc.invalidRequest('No msg request to sign')\n }\n const msgAddress = getAddress(msg?.[0])\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === Number(dapp?.chainId)\n )\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n let typedData = msg?.[1]\n\n try {\n typedData = parse(typedData)\n } catch (error) {\n throw ethErrors.rpc.invalidRequest('Invalid typedData provided')\n }\n\n if (\n !typedData?.types ||\n !typedData?.domain ||\n !typedData?.message ||\n !typedData?.primaryType\n ) {\n throw ethErrors.rpc.methodNotSupported(\n 'Invalid typedData format - only typedData v4 is supported'\n )\n }\n\n if (\n msgAddress === this.selectedAccount.account.addr &&\n (typedData.primaryType === 'AmbireOperation' || !!typedData.types.AmbireOperation)\n ) {\n throw ethErrors.rpc.methodNotSupported('Signing an AmbireOperation is not allowed')\n }\n\n userRequest = {\n id: new Date().getTime(),\n action: {\n kind: 'typedMessage',\n types: typedData.types,\n domain: typedData.domain,\n message: typedData.message,\n primaryType: typedData.primaryType\n },\n session: request.session,\n meta: {\n isSignAction: true,\n accountAddr: msgAddress,\n networkId: network.id\n },\n dappPromise\n } as SignUserRequest\n } else {\n userRequest = {\n id: new Date().getTime(),\n session: request.session,\n action: { kind, params: request.params },\n meta: { isSignAction: false },\n dappPromise\n } as DappUserRequest\n }\n\n if (userRequest.action.kind !== 'calls') {\n const otherUserRequestFromSameDapp = this.userRequests.find(\n (r) => r.dappPromise?.session?.origin === dappPromise?.session?.origin\n )\n\n if (!otherUserRequestFromSameDapp && !!dappPromise?.session?.origin) {\n actionPosition = 'first'\n }\n }\n\n if (!userRequest) return\n\n const isASignOperationRequestedForAnotherAccount =\n userRequest.meta.isSignAction &&\n userRequest.meta.accountAddr !== this.selectedAccount.account?.addr\n\n // We can simply add the user request if it's not a sign operation\n // for another account\n if (!isASignOperationRequestedForAnotherAccount) {\n await this.addUserRequest(\n userRequest,\n actionPosition,\n actionPosition === 'first' || isSmartAccount(this.selectedAccount.account)\n ? 'open-action-window'\n : 'queue-but-open-action-window'\n )\n return\n }\n\n const accountError = this.#getUserRequestAccountError(\n dappPromise.session.origin,\n userRequest.meta.accountAddr\n )\n\n if (accountError) {\n dappPromise.reject(ethErrors.provider.userRejectedRequest(accountError))\n return\n }\n\n const network = this.networks.networks.find((n) => Number(n.chainId) === Number(dapp?.chainId))\n\n if (!network) {\n throw ethErrors.provider.chainDisconnected('Transaction failed - unknown network')\n }\n\n this.userRequestWaitingAccountSwitch.push(userRequest)\n await this.addUserRequest(\n buildSwitchAccountUserRequest({\n nextUserRequest: userRequest,\n networkId: network.id,\n selectedAccountAddr: userRequest.meta.accountAddr,\n session: dappPromise.session,\n dappPromise\n }),\n 'last',\n 'open-action-window'\n )\n }\n\n async buildTransferUserRequest(\n amount: string,\n recipientAddress: string,\n selectedToken: TokenResult,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n await this.#initialLoadPromise\n if (!this.selectedAccount.account) return\n\n const userRequest = buildTransferUserRequest({\n selectedAccount: this.selectedAccount.account.addr,\n amount,\n selectedToken,\n recipientAddress\n })\n\n if (!userRequest) {\n this.emitError({\n level: 'major',\n message: 'Unexpected error while building transfer request',\n error: new Error(\n 'buildUserRequestFromTransferRequest: bad parameters passed to buildTransferUserRequest'\n )\n })\n return\n }\n\n await this.addUserRequest(userRequest, 'last', actionExecutionType)\n }\n\n async buildSwapAndBridgeUserRequest(activeRouteId?: number) {\n await this.withStatus(\n 'buildSwapAndBridgeUserRequest',\n async () => {\n if (!this.selectedAccount.account) return\n let transaction: SocketAPISendTransactionRequest | null | undefined = null\n\n const activeRoute = this.swapAndBridge.activeRoutes.find(\n (r) => r.activeRouteId === activeRouteId\n )\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n transaction = await this.swapAndBridge.getRouteStartUserTx()\n }\n\n if (activeRoute) {\n this.removeUserRequest(activeRoute.activeRouteId, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.swapAndBridge.updateActiveRoute(activeRoute.activeRouteId, { error: undefined })\n if (!isSmartAccount(this.selectedAccount.account)) {\n this.removeUserRequest(`${activeRouteId}-revoke-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n this.removeUserRequest(`${activeRouteId}-approval`, {\n shouldRemoveSwapAndBridgeRoute: false,\n shouldOpenNextRequest: false\n })\n }\n transaction = await this.swapAndBridge.getNextRouteUserTx(activeRoute.activeRouteId)\n }\n\n if (!this.selectedAccount.account || !transaction) {\n const errorDetails = `missing ${\n this.selectedAccount.account ? 'selected account' : 'transaction'\n } info`\n const error = new SwapAndBridgeError(\n `Something went wrong when preparing your request. Please try again later or contact Ambire support. Error details: <${errorDetails}>`\n )\n throw new EmittableError({ message: error.message, level: 'major', error })\n }\n\n const network = this.networks.networks.find(\n (n) => Number(n.chainId) === transaction!.chainId\n )!\n\n // TODO: Consider refining the error handling in here, because this\n // swallows errors and doesn't provide any feedback to the user.\n const swapAndBridgeUserRequests = await buildSwapAndBridgeUserRequests(\n transaction,\n network.id,\n this.selectedAccount.account,\n this.providers.providers[network.id]\n )\n\n for (let i = 0; i < swapAndBridgeUserRequests.length; i++) {\n if (i === 0) {\n this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'open-action-window')\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(swapAndBridgeUserRequests[i], 'last', 'queue')\n }\n }\n\n if (this.swapAndBridge.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit) {\n await this.swapAndBridge.addActiveRoute({\n activeRouteId: transaction.activeRouteId,\n userTxIndex: transaction.userTxIndex\n })\n }\n\n if (activeRouteId) {\n this.swapAndBridge.updateActiveRoute(\n activeRouteId,\n {\n userTxIndex: transaction.userTxIndex,\n userTxHash: null\n },\n true\n )\n }\n },\n true\n )\n }\n\n buildClaimWalletUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const claimableRewardsData =\n this.selectedAccount.portfolio.latest.rewards?.result?.claimableRewardsData\n\n if (!claimableRewardsData) return\n\n const userRequest: UserRequest = buildClaimWalletRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n claimableRewardsData\n })\n\n this.addUserRequest(userRequest)\n }\n\n buildMintVestingUserRequest(token: TokenResult) {\n if (!this.selectedAccount.account) return\n\n const addrVestingData = this.selectedAccount.portfolio.latest.rewards?.result?.addrVestingData\n\n if (!addrVestingData) return\n const userRequest: UserRequest = buildMintVestingRequest({\n selectedAccount: this.selectedAccount.account.addr,\n selectedToken: token,\n addrVestingData\n })\n\n this.addUserRequest(userRequest)\n }\n\n resolveUserRequest(data: any, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return // TODO: emit error\n\n userRequest.dappPromise?.resolve(data)\n // These requests are transitionary initiated internally (not dApp requests) that block dApp requests\n // before being resolved. The timeout prevents the action-window from closing before the actual dApp request arrives\n if (['unlock', 'dappConnect'].includes(userRequest.action.kind)) {\n setTimeout(() => {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }, 300)\n } else {\n this.removeUserRequest(requestId)\n this.emitUpdate()\n }\n }\n\n rejectUserRequest(err: string, requestId: UserRequest['id']) {\n const userRequest = this.userRequests.find((r) => r.id === requestId)\n if (!userRequest) return\n\n if (requestId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID) {\n this.userRequests = this.userRequests.filter(\n (r) =>\n !(\n r.action.kind === 'calls' &&\n r.meta.accountAddr === userRequest.meta.accountAddr &&\n r.meta.networkId === userRequest.meta.networkId\n )\n )\n }\n\n // if the userRequest that is about to be removed is an approval request\n // find and remove the associated pending transaction request if there is any\n // this is valid scenario for a swap & bridge txs with a BA\n if (userRequest.action.kind === 'calls') {\n const acc = this.accounts.accounts.find((a) => a.addr === userRequest.meta.accountAddr)!\n\n if (!isSmartAccount(acc) && userRequest.meta.isSwapAndBridgeCall) {\n this.removeUserRequest(userRequest.meta.activeRouteId)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-approval`)\n this.removeUserRequest(`${userRequest.meta.activeRouteId}-revoke-approval`)\n }\n }\n\n userRequest.dappPromise?.reject(ethErrors.provider.userRejectedRequest(err))\n this.removeUserRequest(requestId)\n }\n\n rejectSignAccountOpCall(callId: string) {\n if (!this.signAccountOp) return\n\n const { calls, networkId, accountAddr } = this.signAccountOp.accountOp\n\n const requestId = calls.find((c) => c.id === callId)?.fromUserRequestId\n if (requestId) {\n const userRequestIndex = this.userRequests.findIndex((r) => r.id === requestId)\n const userRequest = this.userRequests[userRequestIndex] as SignUserRequest\n if (userRequest.action.kind === 'calls') {\n ;(userRequest.action as Calls).calls = (userRequest.action as Calls).calls.filter(\n (c) => c.id !== callId\n )\n\n if (userRequest.action.calls.length === 0) {\n // the reject will remove the userRequest which will rebuild the action and update the signAccountOp\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n const accountOpAction = makeSmartAccountOpAction({\n account: this.accounts.accounts.find((a) => a.addr === accountAddr)!,\n networkId,\n nonce: this.accounts.accountStates[accountAddr][networkId].nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue\n })\n\n this.actions.addOrUpdateAction(accountOpAction)\n this.signAccountOp?.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n }\n } else {\n this.emitError({\n message: 'Reject call: the call was not found or was not linked to a user request',\n level: 'major',\n error: new Error(\n `Error: rejectAccountOpCall: userRequest for call with id ${callId} was not found`\n )\n })\n }\n }\n\n removeActiveRoute(activeRouteId: number) {\n const userRequest = this.userRequests.find((r) =>\n [activeRouteId, `${activeRouteId}-approval`, `${activeRouteId}-revoke-approval`].includes(\n r.id\n )\n )\n\n if (userRequest) {\n this.rejectUserRequest('User rejected the transaction request.', userRequest.id)\n } else {\n this.swapAndBridge.removeActiveRoute(activeRouteId)\n }\n }\n\n async addUserRequest(\n req: UserRequest,\n actionPosition: ActionPosition = 'last',\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (req.action.kind === 'calls') {\n ;(req.action as Calls).calls.forEach((_, i) => {\n ;(req.action as Calls).calls[i].id = `${req.id}-${i}`\n })\n }\n if (actionPosition === 'first') {\n this.userRequests.unshift(req)\n } else {\n this.userRequests.push(req)\n }\n\n const { id, action, meta } = req\n if (action.kind === 'calls') {\n // @TODO\n // one solution would be to, instead of checking, have a promise that we always await here, that is responsible for fetching\n // account data; however, this won't work with EOA accountOps, which have to always pick the first userRequest for a particular acc/network,\n // and be recalculated when one gets dismissed\n // although it could work like this: 1) await the promise, 2) check if exists 3) if not, re-trigger the promise;\n // 4) manage recalc on removeUserRequest too in order to handle EOAs\n // @TODO consider re-using this whole block in removeUserRequest\n await this.#ensureAccountInfo(meta.accountAddr, meta.networkId)\n if (this.signAccOpInitError) {\n return req.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message: this.signAccOpInitError\n })\n )\n }\n\n if (this.#signAccountOpSigningPromise) await this.#signAccountOpSigningPromise\n if (this.#signAccountOpBroadcastPromise) await this.#signAccountOpBroadcastPromise\n\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)!\n const accountState = this.accounts.accountStates[meta.accountAddr][meta.networkId]\n\n if (isSmartAccount(account)) {\n const network = this.networks.networks.find((n) => n.id === meta.networkId)!\n\n // find me the accountOp for the network if any, it's always 1 for SA\n const currentAccountOpAction = this.actions.actionsQueue.find(\n (a) =>\n a.type === 'accountOp' &&\n a.accountOp.accountAddr === account.addr &&\n a.accountOp.networkId === network.id\n ) as AccountOpAction | undefined\n\n const entryPointAuthorizationMessageFromHistory = await this.activity.findMessage(\n account.addr,\n (message) =>\n message.fromActionId === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n message.networkId === network.id\n )\n\n const hasAuthorized =\n !!currentAccountOpAction?.accountOp?.meta?.entryPointAuthorization ||\n !!entryPointAuthorizationMessageFromHistory\n\n if (shouldAskForEntryPointAuthorization(network, account, accountState, hasAuthorized)) {\n await this.addEntryPointAuthorization(req, network, accountState, actionExecutionType)\n this.emitUpdate()\n return\n }\n\n const accountOpAction = makeSmartAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequests: this.userRequests,\n actionsQueue: this.actions.actionsQueue,\n entryPointAuthorizationSignature:\n entryPointAuthorizationMessageFromHistory?.signature ?? undefined\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n if (this.signAccountOp) {\n if (this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls })\n this.estimateSignAccountOp()\n }\n } else {\n // Even without an initialized SignAccountOpController or Screen, we should still update the portfolio and run the simulation.\n // It's necessary to continue operating with the token `amountPostSimulation` amount.\n this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n const accountOpAction = makeBasicAccountOpAction({\n account,\n networkId: meta.networkId,\n nonce: accountState.nonce,\n userRequest: req\n })\n this.actions.addOrUpdateAction(accountOpAction, actionPosition, actionExecutionType)\n }\n } else {\n let actionType: 'dappRequest' | 'benzin' | 'signMessage' | 'switchAccount' = 'dappRequest'\n\n if (req.action.kind === 'typedMessage' || req.action.kind === 'message') {\n actionType = 'signMessage'\n\n if (this.actions.visibleActionsQueue.find((a) => a.type === 'signMessage')) {\n const msgReq = this.userRequests.find((uReq) => uReq.id === id)\n if (!msgReq) return\n msgReq.dappPromise?.reject(\n ethErrors.provider.custom({\n code: 1001,\n message:\n 'Rejected: Please complete your pending message request before initiating a new one.'\n })\n )\n this.userRequests.splice(this.userRequests.indexOf(msgReq), 1)\n return\n }\n }\n if (req.action.kind === 'benzin') actionType = 'benzin'\n if (req.action.kind === 'switchAccount') actionType = 'switchAccount'\n\n this.actions.addOrUpdateAction(\n {\n id,\n type: actionType,\n userRequest: req as UserRequest as never\n },\n actionPosition,\n actionExecutionType\n )\n }\n\n this.emitUpdate()\n }\n\n // @TODO allow this to remove multiple OR figure out a way to debounce re-estimations\n // first one sounds more reasonable\n // although the second one can't hurt and can help (or no debounce, just a one-at-a-time queue)\n removeUserRequest(\n id: UserRequest['id'],\n options: {\n shouldRemoveSwapAndBridgeRoute: boolean\n shouldUpdateAccount?: boolean\n shouldOpenNextRequest?: boolean\n } = {\n shouldRemoveSwapAndBridgeRoute: true,\n shouldUpdateAccount: true,\n shouldOpenNextRequest: true\n }\n ) {\n const req = this.userRequests.find((uReq) => uReq.id === id)\n if (!req) return\n\n // remove from the request queue\n this.userRequests.splice(this.userRequests.indexOf(req), 1)\n\n // update the pending stuff to be signed\n const { action, meta } = req\n if (action.kind === 'calls') {\n const network = this.networks.networks.find((net) => net.id === meta.networkId)!\n const account = this.accounts.accounts.find((x) => x.addr === meta.accountAddr)\n if (!account)\n throw new Error(\n `batchCallsFromUserRequests: tried to run for non-existent account ${meta.accountAddr}`\n )\n\n if (isSmartAccount(account)) {\n const accountOpIndex = this.actions.actionsQueue.findIndex(\n (a) => a.type === 'accountOp' && a.id === `${meta.accountAddr}-${meta.networkId}`\n )\n const accountOpAction = this.actions.actionsQueue[accountOpIndex] as\n | AccountOpAction\n | undefined\n // accountOp has just been rejected or broadcasted\n if (!accountOpAction) {\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n this.emitUpdate()\n return\n }\n\n accountOpAction.accountOp.calls = this.#batchCallsFromUserRequests(\n meta.accountAddr,\n meta.networkId\n )\n if (accountOpAction.accountOp.calls.length) {\n this.actions.addOrUpdateAction(accountOpAction)\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.signAccountOp.update({ calls: accountOpAction.accountOp.calls, estimation: null })\n this.estimateSignAccountOp()\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === accountOpAction.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(\n `${meta.accountAddr}-${meta.networkId}`,\n options.shouldOpenNextRequest\n )\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n } else {\n if (this.signAccountOp && this.signAccountOp.fromActionId === req.id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n\n if (options.shouldUpdateAccount) this.updateSelectedAccountPortfolio(true, network)\n }\n if (this.swapAndBridge.activeRoutes.length && options.shouldRemoveSwapAndBridgeRoute) {\n this.swapAndBridge.removeActiveRoute(meta.activeRouteId)\n }\n } else if (id === ACCOUNT_SWITCH_USER_REQUEST) {\n const requestsToAdd = this.userRequestWaitingAccountSwitch.filter(\n (r) => r.meta.accountAddr === this.selectedAccount.account!.addr\n )\n this.actions.removeAction(\n id,\n this.selectedAccount.account?.addr !== (action as any).params!.switchToAccountAddr\n )\n ;(async () => {\n // eslint-disable-next-line no-restricted-syntax\n for (const r of requestsToAdd) {\n this.userRequestWaitingAccountSwitch.splice(this.userRequests.indexOf(r), 1)\n // eslint-disable-next-line no-await-in-loop\n await this.addUserRequest(r)\n }\n })()\n } else {\n this.actions.removeAction(id, options.shouldOpenNextRequest)\n }\n this.emitUpdate()\n }\n\n async addEntryPointAuthorization(\n req: UserRequest,\n network: Network,\n accountState: AccountOnchainState,\n actionExecutionType: ActionExecutionType = 'open-action-window'\n ) {\n if (\n this.actions.visibleActionsQueue.find(\n (a) =>\n a.id === ENTRY_POINT_AUTHORIZATION_REQUEST_ID &&\n (a as SignMessageAction).userRequest.meta.networkId === req.meta.networkId\n )\n ) {\n this.actions.setCurrentActionById(ENTRY_POINT_AUTHORIZATION_REQUEST_ID)\n return\n }\n\n const typedMessageAction = await getEntryPointAuthorization(\n req.meta.accountAddr,\n network.chainId,\n BigInt(accountState.nonce)\n )\n await this.addUserRequest(\n {\n id: ENTRY_POINT_AUTHORIZATION_REQUEST_ID,\n action: typedMessageAction,\n meta: {\n isSignAction: true,\n accountAddr: req.meta.accountAddr,\n networkId: req.meta.networkId\n },\n session: req.session,\n dappPromise: req?.dappPromise\n ? { reject: req?.dappPromise?.reject, resolve: () => {} }\n : undefined\n } as SignUserRequest,\n 'first',\n actionExecutionType\n )\n }\n\n async addNetwork(network: AddNetworkRequestParams) {\n await this.networks.addNetwork(network)\n await this.updateSelectedAccountPortfolio()\n }\n\n async removeNetwork(id: NetworkId) {\n await this.networks.removeNetwork(id)\n this.portfolio.removeNetworkData(id)\n this.defiPositions.removeNetworkData(id)\n this.accountAdder.removeNetworkData(id)\n }\n\n async resolveAccountOpAction(data: any, actionId: AccountOpAction['id']) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp } = accountOpAction as AccountOpAction\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!network) return\n\n const meta: SignUserRequest['meta'] = {\n isSignAction: true,\n accountAddr: accountOp.accountAddr,\n chainId: network.chainId,\n networkId: '',\n txnId: null,\n userOpHash: null\n }\n if (data.submittedAccountOp) {\n // can be undefined, check submittedAccountOp.ts\n meta.txnId = data.submittedAccountOp.txnId\n\n meta.identifiedBy = data.submittedAccountOp.identifiedBy\n meta.submittedAccountOp = data.submittedAccountOp\n }\n\n const benzinUserRequest: SignUserRequest = {\n id: new Date().getTime(),\n action: { kind: 'benzin' },\n meta\n }\n await this.addUserRequest(benzinUserRequest, 'first')\n\n this.actions.removeAction(actionId)\n\n // handle wallet_sendCalls before pollTxnId as 1) it's faster\n // 2) the identifier is different\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const walletSendCallsUserReq = this.userRequests.find(\n (r) => r.id === call.fromUserRequestId && r.meta.isWalletSendCalls\n )\n if (walletSendCallsUserReq) {\n walletSendCallsUserReq.dappPromise?.resolve({\n hash: getDappIdentifier(data.submittedAccountOp)\n })\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(walletSendCallsUserReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n // Note: this may take a while!\n const txnId = await pollTxnId(\n data.submittedAccountOp.identifiedBy,\n network,\n this.fetch,\n this.callRelayer\n )\n\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n const uReq = this.userRequests.find((r) => r.id === call.fromUserRequestId)\n if (uReq) {\n if (txnId) {\n uReq.dappPromise?.resolve({ hash: txnId })\n } else {\n uReq.dappPromise?.reject(\n ethErrors.rpc.transactionRejected({\n message: 'Transaction rejected by the bundler'\n })\n )\n }\n\n // eslint-disable-next-line no-await-in-loop\n this.removeUserRequest(uReq.id, {\n shouldRemoveSwapAndBridgeRoute: false,\n // Since `resolveAccountOpAction` is invoked only when we broadcast a transaction,\n // we don't want to update the account portfolio immediately, as we would lose the simulation.\n // The simulation is required to calculate the pending badges (see: calculatePendingAmounts()).\n // Once the transaction is confirmed, delayed, or the user manually refreshes the portfolio,\n // the account will be updated automatically.\n shouldUpdateAccount: false\n })\n }\n }\n\n this.emitUpdate()\n }\n\n rejectAccountOpAction(\n err: string,\n actionId: AccountOpAction['id'],\n shouldOpenNextAction: boolean\n ) {\n const accountOpAction = this.actions.actionsQueue.find((a) => a.id === actionId)\n if (!accountOpAction) return\n\n const { accountOp, id } = accountOpAction as AccountOpAction\n\n if (this.signAccountOp && this.signAccountOp.fromActionId === id) {\n this.destroySignAccOp()\n }\n this.actions.removeAction(actionId, shouldOpenNextAction)\n // eslint-disable-next-line no-restricted-syntax\n for (const call of accountOp.calls) {\n if (call.fromUserRequestId) this.rejectUserRequest(err, call.fromUserRequestId)\n }\n\n this.emitUpdate()\n }\n\n async #updateGasPrice() {\n await this.#initialLoadPromise\n\n // if there's no signAccountOp initialized, we don't want to fetch gas\n const accOp = this.signAccountOp?.accountOp ?? null\n if (!accOp) return undefined\n\n const network = this.networks.networks.find((net) => net.id === accOp.networkId)\n if (!network) return undefined // shouldn't happen\n\n const account = this.accounts.accounts.find((x) => x.addr === accOp.accountAddr)\n if (!account) return undefined // shouldn't happen\n\n const is4337 = isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[accOp.accountAddr][accOp.networkId]\n )\n const bundler = this.signAccountOp\n ? this.signAccountOp.bundlerSwitcher.getBundler()\n : getDefaultBundler(network)\n const bundlerFetch = async () => {\n if (!is4337) return null\n const errorCallback = (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n }\n return bundler.fetchGasPrices(network, errorCallback).catch((e) => {\n this.emitError({\n level: 'silent',\n message: \"Failed to fetch the bundler's gas price\",\n error: e\n })\n })\n }\n const [gasPriceData, bundlerGas] = await Promise.all([\n getGasPriceRecommendations(this.providers.providers[network.id], network).catch((e) => {\n this.emitError({\n level: 'major',\n message: `Unable to get gas price for ${network.id}`,\n error: new Error(`Failed to fetch gas price: ${e?.message}`)\n })\n return null\n }),\n bundlerFetch()\n ])\n\n if (gasPriceData && gasPriceData.gasPrice) this.gasPrices[network.id] = gasPriceData.gasPrice\n if (bundlerGas)\n this.bundlerGasPrices[network.id] = { speeds: bundlerGas, bundler: bundler.getName() }\n\n return {\n blockGasLimit: gasPriceData?.blockGasLimit\n }\n }\n\n async updateSignAccountOpGasPrice() {\n if (!this.signAccountOp) return\n\n const accOp = this.signAccountOp.accountOp\n const gasData = await this.#updateGasPrice()\n\n // there's a chance signAccountOp gets destroyed between the time\n // the first \"if (!this.signAccountOp) return\" is performed and\n // the time we get here. To prevent issues, we check one more time\n if (!this.signAccountOp) return\n\n this.signAccountOp.update({\n gasPrices: this.gasPrices[accOp.networkId],\n bundlerGasPrices: this.bundlerGasPrices[accOp.networkId],\n blockGasLimit: gasData && gasData.blockGasLimit ? gasData.blockGasLimit : undefined\n })\n this.emitUpdate()\n }\n\n // @TODO: protect this from race conditions/simultanous executions\n async estimateSignAccountOp() {\n try {\n if (!this.signAccountOp) return\n\n // make a local copy to avoid updating the main reference\n const localAccountOp: AccountOp = { ...this.signAccountOp.accountOp }\n\n await this.#initialLoadPromise\n // new accountOps should have spoof signatures so that they can be easily simulated\n // this is not used by the Estimator, because it iterates through all associatedKeys and\n // it knows which ones are authenticated, and it can generate it's own spoofSig\n // @TODO\n // accountOp.signature = `${}03`\n\n // TODO check if needed data in accountStates are available\n // this.accountStates[accountOp.accountAddr][accountOp.networkId].\n const account = this.accounts.accounts.find((x) => x.addr === localAccountOp.accountAddr)\n\n // Here, we list EOA accounts for which you can also obtain an estimation of the AccountOp payment.\n // In the case of operating with a smart account (an account with creation code), all other EOAs can pay the fee.\n //\n // If the current account is an EOA, only this account can pay the fee,\n // and there's no need for checking other EOA accounts native balances.\n // This is already handled and estimated as a fee option in the estimate library, which is why we pass an empty array here.\n //\n // we're excluding the view only accounts from the natives to check\n // in all cases EXCEPT the case where we're making an estimation for\n // the view only account itself. In all other, view only accounts options\n // should not be present as the user cannot pay the fee with them (no key)\n const nativeToCheck = account?.creation\n ? this.accounts.accounts\n .filter(\n (acc) =>\n !isSmartAccount(acc) &&\n (acc.addr === localAccountOp.accountAddr ||\n !getIsViewOnly(this.keystore.keys, acc.associatedKeys))\n )\n .map((acc) => acc.addr)\n : []\n\n if (!account)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.accountAddr}: account does not exist`\n )\n const network = this.networks.networks.find((x) => x.id === localAccountOp.networkId)\n if (!network)\n throw new Error(\n `estimateSignAccountOp: ${localAccountOp.networkId}: network does not exist`\n )\n\n // Take the fee tokens from two places: the user's tokens and his gasTank\n // The gasTank tokens participate on each network as they belong everywhere\n // NOTE: at some point we should check all the \"?\" signs below and if\n // an error pops out, we should notify the user about it\n const networkFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.[\n localAccountOp.networkId\n ]?.result?.feeTokens ?? []\n const gasTankFeeTokens =\n this.portfolio.getLatestPortfolioState(localAccountOp.accountAddr)?.gasTank?.result\n ?.tokens ?? []\n\n const feeTokens =\n [...networkFeeTokens, ...gasTankFeeTokens].filter((t) => t.flags.isFeeToken) || []\n\n // can be read from the UI\n const humanization = humanizeAccountOp(localAccountOp, {})\n humanization.forEach((call: any) => {\n if (!call.fullVisualization) return\n\n call.fullVisualization.forEach(async (visualization: any) => {\n if (visualization.type !== 'address' || !visualization.address) return\n\n await this.domains.reverseLookup(visualization.address)\n })\n })\n\n const additionalHints: GetOptions['additionalErc20Hints'] = humanization\n .map((call: any) =>\n !call.fullVisualization\n ? []\n : call.fullVisualization.map((vis: any) =>\n vis.address && isAddress(vis.address) ? getAddress(vis.address) : ''\n )\n )\n .flat()\n .filter((x: any) => isAddress(x))\n\n this.portfolio.addTokensToBeLearned(additionalHints, network.id)\n\n const accountOpsToBeSimulatedByNetwork = getAccountOpsForSimulation(\n account,\n this.actions.visibleActionsQueue,\n network,\n this.signAccountOp.accountOp\n )\n\n const [, estimation] = await Promise.all([\n // NOTE: we are not emitting an update here because the portfolio controller will do that\n // NOTE: the portfolio controller has it's own logic of constructing/caching providers, this is intentional, as\n // it may have different needs\n this.portfolio.updateSelectedAccount(\n localAccountOp.accountAddr,\n network,\n accountOpsToBeSimulatedByNetwork,\n { forceUpdate: true }\n ),\n estimate(\n this.providers.providers[localAccountOp.networkId],\n network,\n account,\n localAccountOp,\n this.accounts.accountStates,\n nativeToCheck,\n // @TODO - first time calling this, portfolio is still not loaded.\n feeTokens,\n (e: ErrorRef) => {\n if (!this.signAccountOp) return\n this.emitError(e)\n },\n this.signAccountOp.bundlerSwitcher,\n {\n is4337Broadcast: isErc4337Broadcast(\n account,\n network,\n this.accounts.accountStates[localAccountOp.accountAddr][localAccountOp.networkId]\n )\n }\n ).catch((e) => {\n const { message } = getHumanReadableEstimationError(e)\n\n this.emitError({\n level: 'major',\n message,\n error: e\n })\n return null\n })\n ])\n\n // @race\n // if the signAccountOp has been deleted, don't continue as the request has already finished\n if (!this.signAccountOp) return\n\n if (estimation) {\n const currentNonceAhead =\n BigInt(estimation.currentAccountNonce) > (localAccountOp.nonce ?? 0n)\n\n // if the nonce from the estimation is bigger than the one in localAccountOp,\n // override the accountState and accountOp with the newly detected nonce\n if (currentNonceAhead) {\n localAccountOp.nonce = BigInt(estimation.currentAccountNonce)\n this.signAccountOp.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n\n if (this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId])\n this.accounts.accountStates[localAccountOp.accountAddr][\n localAccountOp.networkId\n ].nonce = localAccountOp.nonce\n }\n\n const hasNonceDiscrepancy = estimation.error?.cause === 'NONCE_FAILURE'\n const lastTxn = this.activity.getLastTxn(localAccountOp.networkId)\n const SAHasOldNonceOnARelayerNetwork =\n isSmartAccount(account) &&\n !network.erc4337.enabled &&\n lastTxn &&\n localAccountOp.nonce === lastTxn.nonce &&\n lastTxn.success &&\n lastTxn.status === AccountOpStatus.Success\n\n if (hasNonceDiscrepancy || SAHasOldNonceOnARelayerNetwork) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n return\n }\n }\n\n if (\n estimation &&\n estimation.nonFatalErrors &&\n estimation.nonFatalErrors.find((err) => err.cause === '4337_INVALID_NONCE') &&\n this.accounts.accountStates?.[localAccountOp.accountAddr]?.[localAccountOp.networkId]\n ) {\n this.accounts\n .updateAccountState(localAccountOp.accountAddr, 'pending', [localAccountOp.networkId])\n .then(() => this.estimateSignAccountOp())\n .catch((error) =>\n this.emitError({\n level: 'major',\n message:\n 'Failed to refetch the account state. Please try again to initialize your transaction',\n error\n })\n )\n\n // returning here means estimation will not be set => better UX as\n // the user will not see the warning but instead\n // just wait for the new estimation\n return\n }\n\n // check if an RBF should be applied for the incoming transaction\n // for SA conditions are: take the last broadcast but not confirmed accOp\n // and check if the nonce is the same as the current nonce (non 4337 txns)\n // for EOA: check the last broadcast but not confirmed txn across SA\n // as the EOA could've broadcast a txn there + it's own history and\n // compare the highest found nonce\n const rbfAccountOps: { [key: string]: SubmittedAccountOp | null } = {}\n nativeToCheck.push(localAccountOp.accountAddr)\n nativeToCheck.forEach((accId) => {\n const notConfirmedOp = this.activity.getNotConfirmedOpIfAny(accId, localAccountOp.networkId)\n\n // the accountState of the nativeToCheck may no be initialized\n const currentNonce =\n this.accounts.accountStates &&\n this.accounts.accountStates[accId] &&\n this.accounts.accountStates[accId][localAccountOp.networkId]\n ? this.accounts.accountStates[accId][localAccountOp.networkId].nonce\n : null\n\n rbfAccountOps[accId] =\n notConfirmedOp &&\n !notConfirmedOp.gasFeePayment?.isERC4337 &&\n currentNonce &&\n currentNonce === notConfirmedOp.nonce\n ? notConfirmedOp\n : null\n })\n\n // if there's an estimation error, override the pending results\n if (estimation && estimation.error) {\n this.portfolio.overridePendingResults(localAccountOp)\n }\n // update the signAccountOp controller once estimation finishes;\n // this eliminates the infinite loading bug if the estimation comes slower\n if (this.signAccountOp && estimation) {\n this.signAccountOp.update({ estimation, rbfAccountOps })\n }\n } catch (error: any) {\n this.signAccountOp?.calculateWarnings()\n this.emitError({\n level: 'silent',\n message: 'Estimation error',\n error\n })\n }\n }\n\n /**\n * There are 4 ways to broadcast an AccountOp:\n * 1. For basic accounts (EOA), there is only one way to do that. After\n * signing the transaction, the serialized signed transaction object gets\n * send to the network.\n * 2. For smart accounts, when EOA pays the fee. Two signatures are needed\n * for this. The first one is the signature of the AccountOp itself. The\n * second one is the signature of the transaction that will be executed\n * by the smart account.\n * 3. For smart accounts that broadcast the ERC-4337 way.\n * 4. for smart accounts, when the Relayer does the broadcast.\n *\n */\n async #broadcastSignedAccountOp() {\n const accountOp = this.signAccountOp?.accountOp\n const estimation = this.signAccountOp?.estimation\n const actionId = this.signAccountOp?.fromActionId\n const bundlerSwitcher = this.signAccountOp?.bundlerSwitcher\n const contactSupportPrompt = 'Please try again or contact support if the problem persists.'\n\n if (\n !accountOp ||\n !estimation ||\n !actionId ||\n !accountOp.signingKeyAddr ||\n !accountOp.signingKeyType ||\n !accountOp.signature ||\n !bundlerSwitcher\n ) {\n const message = `Missing mandatory transaction details. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const provider = this.providers.providers[accountOp.networkId]\n const account = this.accounts.accounts.find((acc) => acc.addr === accountOp.accountAddr)\n const network = this.networks.networks.find((n) => n.id === accountOp.networkId)\n\n if (!provider) {\n const networkName = network?.name || `network with id ${accountOp.networkId}`\n const message = `Provider for ${networkName} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!account) {\n const addr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Account with address ${addr} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n if (!network) {\n const message = `Network with id ${accountOp.networkId} not found. ${contactSupportPrompt}`\n return this.throwBroadcastAccountOp({ message })\n }\n\n const accountState = this.accounts.accountStates[accountOp.accountAddr][accountOp.networkId]\n let transactionRes: {\n txnId?: string\n nonce: number\n identifiedBy: AccountOpIdentifiedBy\n } | null = null\n\n // Basic account (EOA)\n if (!isSmartAccount(account)) {\n try {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found. ${contactSupportPrompt}`\n return await this.throwBroadcastAccountOp({ message, accountState })\n }\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const gasFeePayment = accountOp.gasFeePayment!\n const { to, value, data } = accountOp.calls[0]\n const rawTxn: TxnRequest = {\n to: to ?? undefined,\n value,\n data,\n chainId: network!.chainId,\n nonce: await provider.getTransactionCount(accountOp.accountAddr),\n gasLimit: gasFeePayment.simulatedGasLimit\n }\n\n // if it's eip1559, send it as such. If no, go to legacy\n if (gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account but EOA pays the fee\n else if (\n account.creation &&\n accountOp.gasFeePayment &&\n accountOp.gasFeePayment.paidBy !== account.addr\n ) {\n const feePayerKeys = this.keystore.keys.filter(\n (key) => key.addr === accountOp.gasFeePayment!.paidBy\n )\n const feePayerKey =\n // Temporarily prioritize the key with the same type as the signing key.\n // TODO: Implement a way to choose the key type to broadcast with.\n feePayerKeys.find((key) => key.type === accountOp.signingKeyType) || feePayerKeys[0]\n if (!feePayerKey) {\n const missingKeyAddr = shortenAddress(accountOp.gasFeePayment!.paidBy, 13)\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Key with address ${missingKeyAddr} for account with address ${accAddr} not found.`\n\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n this.feePayerKey = feePayerKey\n this.emitUpdate()\n\n let data\n let to\n if (accountState.isDeployed) {\n const ambireAccount = new Interface(AmbireAccount.abi)\n to = accountOp.accountAddr\n data = ambireAccount.encodeFunctionData('execute', [\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n } else {\n const ambireFactory = new Interface(AmbireFactory.abi)\n to = account.creation.factoryAddr\n data = ambireFactory.encodeFunctionData('deployAndExecute', [\n account.creation.bytecode,\n account.creation.salt,\n getSignableCalls(accountOp),\n accountOp.signature\n ])\n }\n\n try {\n const signer = await this.keystore.getSigner(feePayerKey.addr, feePayerKey.type)\n if (signer.init) signer.init(this.#externalSignerControllers[feePayerKey.type])\n\n const rawTxn: TxnRequest = {\n to,\n data,\n // We ultimately do a smart contract call, which means we don't need\n // to send any `value` from the EOA address. The actual `value` will\n // get taken from the value encoded in the `data` field.\n value: BigInt(0),\n chainId: network.chainId,\n nonce: await provider.getTransactionCount(accountOp.gasFeePayment!.paidBy),\n gasLimit: accountOp.gasFeePayment.simulatedGasLimit\n }\n\n if (accountOp.gasFeePayment.maxPriorityFeePerGas !== undefined) {\n rawTxn.maxFeePerGas = accountOp.gasFeePayment.gasPrice\n rawTxn.maxPriorityFeePerGas = accountOp.gasFeePayment.maxPriorityFeePerGas\n rawTxn.type = 2\n } else {\n rawTxn.gasPrice = accountOp.gasFeePayment.gasPrice\n rawTxn.type = 0\n }\n\n const signedTxn = await signer.signRawTransaction(rawTxn)\n const broadcastRes = await provider.broadcastTransaction(signedTxn)\n transactionRes = {\n txnId: broadcastRes.hash,\n nonce: broadcastRes.nonce,\n identifiedBy: {\n type: 'Transaction',\n identifier: broadcastRes.hash\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState })\n }\n }\n // Smart account, the ERC-4337 way\n else if (accountOp.gasFeePayment && accountOp.gasFeePayment.isERC4337) {\n const userOperation = accountOp.asUserOperation\n if (!userOperation) {\n const accAddr = shortenAddress(accountOp.accountAddr, 13)\n const message = `Trying to broadcast an ERC-4337 request but userOperation is not set for the account with address ${accAddr}`\n return this.throwBroadcastAccountOp({ message, accountState })\n }\n\n // broadcast through bundler's service\n let userOperationHash\n const bundler = bundlerSwitcher.getBundler()\n try {\n userOperationHash = await bundler.broadcast(userOperation, network)\n } catch (e: any) {\n let retryMsg\n\n // if the signAccountOp is still active (it should be)\n // try to switch the bundler and ask the user to try again\n // TODO: explore more error case where we switch the bundler\n if (this.signAccountOp) {\n const decodedError = bundler.decodeBundlerError(e)\n const humanReadable = getHumanReadableBroadcastError(decodedError)\n const switcher = this.signAccountOp.bundlerSwitcher\n this.signAccountOp.updateStatus(SigningStatus.ReadyToSign)\n\n if (switcher.canSwitch(humanReadable)) {\n switcher.switch()\n this.estimateSignAccountOp()\n this.#updateGasPrice()\n retryMsg = 'Broadcast failed because bundler was down. Please try again'\n }\n }\n\n return this.throwBroadcastAccountOp({\n error: e,\n accountState,\n provider,\n network,\n message: retryMsg\n })\n }\n if (!userOperationHash) {\n return this.throwBroadcastAccountOp({\n message: 'Bundler broadcast failed. Please try broadcasting by an EOA or contact support.'\n })\n }\n\n transactionRes = {\n nonce: Number(userOperation.nonce),\n identifiedBy: {\n type: 'UserOperation',\n identifier: userOperationHash,\n bundler: bundler.getName()\n }\n }\n }\n // Smart account, the Relayer way\n else {\n try {\n const body = {\n gasLimit: Number(accountOp.gasFeePayment!.simulatedGasLimit),\n txns: getSignableCalls(accountOp),\n signature: accountOp.signature,\n signer: { address: accountOp.signingKeyAddr },\n nonce: Number(accountOp.nonce)\n }\n const additionalRelayerNetwork = relayerAdditionalNetworks.find(\n (net) => net.chainId === network.chainId\n )\n const relayerNetworkId = additionalRelayerNetwork\n ? additionalRelayerNetwork.name\n : accountOp.networkId\n const response = await this.callRelayer(\n `/identity/${accountOp.accountAddr}/${relayerNetworkId}/submit`,\n 'POST',\n body\n )\n if (!response.success) throw new Error(response.message)\n\n transactionRes = {\n txnId: response.txId,\n nonce: Number(accountOp.nonce),\n identifiedBy: {\n type: 'Relayer',\n identifier: response.id\n }\n }\n } catch (error: any) {\n return this.throwBroadcastAccountOp({ error, accountState, isRelayer: true })\n }\n }\n\n if (!transactionRes)\n return this.throwBroadcastAccountOp({\n message: 'No transaction response received after being broadcasted.'\n })\n\n this.portfolio.markSimulationAsBroadcasted(account.addr, network.id)\n\n const submittedAccountOp: SubmittedAccountOp = {\n ...accountOp,\n status: AccountOpStatus.BroadcastedButNotConfirmed,\n txnId: transactionRes.txnId,\n nonce: BigInt(transactionRes.nonce),\n identifiedBy: transactionRes.identifiedBy,\n timestamp: new Date().getTime(),\n isSingletonDeploy: !!accountOp.calls.find(\n (call) => call.to && getAddress(call.to) === SINGLETON\n )\n }\n await this.activity.addAccountOp(submittedAccountOp)\n this.swapAndBridge.handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(submittedAccountOp)\n await this.resolveAccountOpAction(\n {\n networkId: network.id,\n isUserOp: !!accountOp?.asUserOperation,\n submittedAccountOp\n },\n actionId\n )\n await this.#notificationManager.create({\n title: 'Done!',\n message: 'The transaction was successfully signed and broadcasted to the network.'\n })\n return Promise.resolve(submittedAccountOp)\n }\n\n // ! IMPORTANT !\n // Banners that depend on async data from sub-controllers should be implemented\n // in the sub-controllers themselves. This is because updates in the sub-controllers\n // will not trigger emitUpdate in the MainController, therefore the banners will\n // remain the same until a subsequent update in the MainController.\n get banners(): Banner[] {\n if (!this.selectedAccount.account || !this.networks.isInitialized) return []\n\n const activeSwapAndBridgeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.selectedAccount.account.addr,\n this.swapAndBridge.activeRoutes\n )\n const swapAndBridgeRoutesPendingSignature = activeSwapAndBridgeRoutesForSelectedAccount.filter(\n (r) => r.routeStatus === 'ready'\n )\n\n const accountOpBanners = getAccountOpBanners({\n accountOpActionsByNetwork: getAccountOpActionsByNetwork(\n this.selectedAccount.account.addr,\n this.actions.actionsQueue\n ),\n selectedAccount: this.selectedAccount.account.addr,\n accounts: this.accounts.accounts,\n networks: this.networks.networks,\n swapAndBridgeRoutesPendingSignature\n })\n\n return [...accountOpBanners]\n }\n\n // Technically this is an anti-pattern, but it's the only way to\n // test the error handling in the method.\n protected throwBroadcastAccountOp({\n message: humanReadableMessage,\n error: _err,\n accountState,\n isRelayer = false,\n provider = undefined,\n network = undefined\n }: {\n message?: string\n error?: Error\n accountState?: AccountOnchainState\n isRelayer?: boolean\n provider?: RPCProvider\n network?: Network\n }) {\n const originalMessage = _err?.message\n let message = humanReadableMessage\n let isReplacementFeeLow = false\n\n if (originalMessage) {\n if (originalMessage.includes('replacement fee too low')) {\n message =\n 'Replacement fee is insufficient. Fees have been automatically adjusted so please try submitting your transaction again.'\n isReplacementFeeLow = true\n this.estimateSignAccountOp()\n } else if (\n originalMessage.includes('pimlico_getUserOperationGasPrice') ||\n originalMessage.includes('preVerificationGas')\n ) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n } else if (originalMessage.includes('INSUFFICIENT_PRIVILEGE')) {\n message = `Signer key not supported on this network.${\n !accountState?.isV2\n ? 'You can add/change signers from the web wallet or contact support.'\n : 'Please contact support.'\n }`\n } else if (originalMessage.includes('underpriced')) {\n message =\n 'Transaction fee underpriced. Please select a higher transaction speed and try again'\n this.updateSignAccountOpGasPrice()\n this.estimateSignAccountOp()\n } else if (originalMessage.includes('Failed to fetch') && isRelayer) {\n message =\n 'Currently, the Ambire relayer seems to be down. Please try again a few moments later or broadcast with a Basic Account'\n }\n }\n\n if (!message) {\n message = getHumanReadableBroadcastError(_err || new Error('')).message\n\n // if the message states that the paymaster doesn't have sufficient amount,\n // add it to the failedPaymasters to disable it until a top-up is made\n if (message.includes(insufficientPaymasterFunds) && provider && network) {\n failedPaymasters.addInsufficientFunds(provider, network).then(() => {\n this.estimateSignAccountOp()\n })\n }\n }\n\n // To enable another try for signing in case of broadcast fail\n // broadcast is called in the FE only after successful signing\n this.signAccountOp?.updateStatus(SigningStatus.ReadyToSign, isReplacementFeeLow)\n this.feePayerKey = null\n\n return Promise.reject(\n new EmittableError({ level: 'major', message, error: _err || new Error(message) })\n )\n }\n\n get isSignRequestStillActive(): boolean {\n if (!this.signAccountOp) return false\n\n return !!this.actions.actionsQueue.find((a) => a.id === this.signAccountOp!.fromActionId)\n }\n\n // includes the getters in the stringified instance\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n banners: this.banners,\n isSignRequestStillActive: this.isSignRequestStillActive\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.d.ts b/dist/src/controllers/portfolio/portfolio.d.ts index 012abfc1e..342026125 100644 --- a/dist/src/controllers/portfolio/portfolio.d.ts +++ b/dist/src/controllers/portfolio/portfolio.d.ts @@ -30,11 +30,12 @@ export declare class PortfolioController extends EventEmitter { getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string): Promise; protected updatePortfolioState(accountId: string, network: Network, portfolioLib: Portfolio, portfolioProps: Partial & { blockTag: 'latest' | 'pending'; - }, forceUpdate: boolean): Promise; + }, forceUpdate: boolean, maxDataAgeMs?: number): Promise; updateSelectedAccount(accountId: AccountId, network?: Network, accountOps?: { [key: string]: AccountOp[]; }, opts?: { - forceUpdate: boolean; + forceUpdate?: boolean; + maxDataAgeMs?: number; }): Promise; markSimulationAsBroadcasted(accountId: string, networkId: string): void; addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId): boolean; diff --git a/dist/src/controllers/portfolio/portfolio.d.ts.map b/dist/src/controllers/portfolio/portfolio.d.ts.map index f587ebe68..5091c21f6 100644 --- a/dist/src/controllers/portfolio/portfolio.d.ts.map +++ b/dist/src/controllers/portfolio/portfolio.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/controllers/portfolio/portfolio.js b/dist/src/controllers/portfolio/portfolio.js index ab90607b8..35b5f7641 100644 --- a/dist/src/controllers/portfolio/portfolio.js +++ b/dist/src/controllers/portfolio/portfolio.js @@ -333,17 +333,17 @@ class PortfolioController extends eventEmitter_1.default { }; this.emitUpdate(); } - #getCanSkipUpdate(networkState, forceUpdate) { + #getCanSkipUpdate(networkState, forceUpdate, maxDataAgeMs = this.#minUpdateInterval) { const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical'); if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors) return false; const updateStarted = networkState.result?.updateStarted || 0; - const isWithinMinUpdateInterval = !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval; + const isWithinMinUpdateInterval = !!updateStarted && Date.now() - updateStarted < maxDataAgeMs; return isWithinMinUpdateInterval || networkState.isLoading; } // By our convention, we always stick with private (#) instead of protected methods. // However, we made a compromise here to allow Jest tests to mock updatePortfolioState. - async updatePortfolioState(accountId, network, portfolioLib, portfolioProps, forceUpdate) { + async updatePortfolioState(accountId, network, portfolioLib, portfolioProps, forceUpdate, maxDataAgeMs) { const blockTag = portfolioProps.blockTag; const stateKeys = { latest: this.#latest, @@ -355,7 +355,7 @@ class PortfolioController extends eventEmitter_1.default { // and portfolio will not be updated accountState[network.id] = { isLoading: false, isReady: false, errors: [] }; } - const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate); + const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate, maxDataAgeMs); if (canSkipUpdate) return false; this.#setNetworkLoading(accountId, blockTag, network.id, true); @@ -381,7 +381,7 @@ class PortfolioController extends eventEmitter_1.default { // Update the last successful update only if there are no critical errors. lastSuccessfulUpdate = Date.now(); } - const processedTokens = (0, helpers_1.processTokens)(result.tokens, network, hasNonZeroTokens, additionalHintsErc20Hints, this.tokenPreferences); + const processedTokens = (0, helpers_1.processTokens)(result.tokens, network, hasNonZeroTokens, additionalHintsErc20Hints, this.tokenPreferences, this.customTokens); accountState[network.id] = { isReady: true, isLoading: false, @@ -465,6 +465,11 @@ class PortfolioController extends eventEmitter_1.default { ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []), ...this.customTokens .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20') + .map(({ address }) => address), + // We have to add the token preferences to ensure that the user can always see all hidden tokens + // in settings, regardless of the selected account + ...this.tokenPreferences + .filter(({ networkId }) => networkId === network.id) .map(({ address }) => address) ]; // TODO: Add custom ERC721 tokens to the hints @@ -482,7 +487,7 @@ class PortfolioController extends eventEmitter_1.default { this.updatePortfolioState(accountId, network, portfolioLib, { blockTag: 'latest', ...allHints - }, forceUpdate), + }, forceUpdate, opts?.maxDataAgeMs), this.updatePortfolioState(accountId, network, portfolioLib, { blockTag: 'pending', ...(currentAccountOps && { @@ -493,7 +498,7 @@ class PortfolioController extends eventEmitter_1.default { }), isEOA: !(0, account_1.isSmartAccount)(selectedAccount), ...allHints - }, forceUpdate) + }, forceUpdate, opts?.maxDataAgeMs) ]); // Persist latest state in previousHints in the disk storage for further requests if (isSuccessfulLatestUpdate && @@ -507,7 +512,7 @@ class PortfolioController extends eventEmitter_1.default { // Either a valid response or there is no external API to fetch hints from const isExternalHintsApiResponseValid = !!networkResult?.hintsFromExternalAPI || !network.hasRelayer; if (isExternalHintsApiResponseValid) { - const updatedStoragePreviousHints = (0, helpers_1.getUpdatedHints)(networkResult.hintsFromExternalAPI || null, networkResult.tokens, networkResult.tokenErrors, network.id, this.#previousHints, key, this.customTokens); + const updatedStoragePreviousHints = (0, helpers_1.getUpdatedHints)(networkResult.hintsFromExternalAPI || null, networkResult.tokens, networkResult.tokenErrors, network.id, this.#previousHints, key, this.customTokens, this.tokenPreferences); // Updating hints is only needed when the external API response is valid. // learnTokens and learnNfts update storage separately, so we don't need to update them here // if the external API response is invalid. diff --git a/dist/src/controllers/portfolio/portfolio.js.map b/dist/src/controllers/portfolio/portfolio.js.map index a5cd55b65..2f7050b79 100644 --- a/dist/src/controllers/portfolio/portfolio.js.map +++ b/dist/src/controllers/portfolio/portfolio.js.map @@ -1 +1 @@ -{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, ZeroAddress } from 'ethers'\n\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network, NetworkId } from '../../interfaces/network'\n/* eslint-disable @typescript-eslint/no-shadow */\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'\nimport { Portfolio } from '../../libs/portfolio'\n/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'\nimport getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'\nimport {\n getFlags,\n getPinnedGasTankTokens,\n getTokensReadyToLearn,\n getTotal,\n getUpdatedHints,\n processTokens,\n shouldGetAdditionalPortfolio,\n validateERC20Token\n} from '../../libs/portfolio/helpers'\n/* eslint-disable no-restricted-syntax */\n// eslint-disable-next-line import/no-cycle\nimport {\n AccountAssetsState,\n AccountState,\n GetOptions,\n NetworkState,\n PortfolioControllerState,\n PreviousHintsStorage,\n TemporaryTokens,\n TokenResult\n} from '../../libs/portfolio/interfaces'\nimport { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\n/* eslint-disable @typescript-eslint/no-shadow */\n\nconst LEARNED_TOKENS_NETWORK_LIMIT = 50\n\nexport class PortfolioController extends EventEmitter {\n #latest: PortfolioControllerState\n\n #pending: PortfolioControllerState\n\n // A queue to prevent race conditions when calling `updateSelectedAccount`.\n // All calls are queued by network and account.\n // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue.\n // If a previous call is still running, the new call will be queued and executed only after the first one completes,\n // regardless of whether it succeeds or fails.\n // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause\n // the response of the latest call to be overwritten by a slower previous call.\n #queue: {\n [accountId: string]: {\n [networkId: NetworkId]: Promise\n }\n }\n\n #toBeLearnedTokens: { [network in NetworkId]: string[] }\n\n customTokens: CustomToken[] = []\n\n tokenPreferences: TokenPreference[] = []\n\n validTokens: any = { erc20: {}, erc721: {} }\n\n temporaryTokens: TemporaryTokens = {}\n\n #portfolioLibs: Map\n\n #storage: Storage\n\n #fetch: Fetch\n\n #callRelayer: Function\n\n #velcroUrl: string\n\n #networksWithAssetsByAccounts: {\n [accountId: string]: AccountAssetsState\n } = {}\n\n #minUpdateInterval: number = 20000 // 20 seconds\n\n /**\n * Hints stored in storage, divided into three categories:\n * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails.\n * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing.\n * - learnedNfts: Hints of learned NFTs.\n */\n #previousHints: PreviousHintsStorage = {\n fromExternalAPI: {},\n learnedTokens: {},\n learnedNfts: {}\n }\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #accounts: AccountsController\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n relayerUrl: string,\n velcroUrl: string\n ) {\n super()\n this.#latest = {}\n this.#pending = {}\n this.#queue = {}\n this.#portfolioLibs = new Map()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#velcroUrl = velcroUrl\n this.#providers = providers\n this.#networks = networks\n this.#accounts = accounts\n this.temporaryTokens = {}\n this.#toBeLearnedTokens = {}\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n await this.#networks.initialLoadPromise\n await this.#accounts.initialLoadPromise\n const storageTokenPreferences = await this.#storage.get('tokenPreferences', [])\n const storageCustomTokens = await this.#storage.get('customTokens', [])\n\n const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(\n storageTokenPreferences,\n storageCustomTokens\n )\n\n this.tokenPreferences = tokenPreferences\n this.customTokens = customTokens\n\n if (shouldUpdateStorage) {\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n this.#previousHints = await this.#storage.get('previousHints', {})\n const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {})\n const isOldStructure = Object.keys(networksWithAssets).every(\n (key) =>\n Array.isArray(networksWithAssets[key]) &&\n networksWithAssets[key].every((item: any) => typeof item === 'string')\n )\n if (!isOldStructure) {\n this.#networksWithAssetsByAccounts = networksWithAssets\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('portfolio: failed to pull keys from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n async #updatePortfolioOnTokenChange(networkId: NetworkId, selectedAccountAddr?: string) {\n // As this function currently only updates the portfolio we can skip it altogether\n // if skipPortfolioUpdate is set to true\n if (!selectedAccountAddr) return\n\n const networkData = this.#networks.networks.find(({ id }) => id === networkId)\n await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, {\n forceUpdate: true\n })\n }\n\n async addCustomToken(\n customToken: CustomToken,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n const isTokenAlreadyAdded = this.customTokens.some(\n ({ address, networkId }) =>\n address.toLowerCase() === customToken.address.toLowerCase() &&\n networkId === customToken.networkId\n )\n\n if (isTokenAlreadyAdded) return\n\n this.customTokens.push(customToken)\n\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n async removeCustomToken(\n customToken: Omit,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n this.customTokens = this.customTokens.filter(\n (token) =>\n !(\n token.address.toLowerCase() === customToken.address.toLowerCase() &&\n token.networkId === customToken.networkId\n )\n )\n const existingPreference = this.tokenPreferences.some(\n (pref) => pref.address === customToken.address && pref.networkId === customToken.networkId\n )\n\n // Delete custom token preference if it exists\n if (existingPreference) {\n await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio)\n await this.#storage.set('customTokens', this.customTokens)\n } else {\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n await this.#storage.set('customTokens', this.customTokens)\n }\n }\n\n async toggleHideToken(\n tokenPreference: TokenPreference,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n\n const existingPreference = this.tokenPreferences.find(\n ({ address, networkId }) =>\n address.toLowerCase() === tokenPreference.address.toLowerCase() &&\n networkId === tokenPreference.networkId\n )\n\n // Push the token as hidden\n if (!existingPreference) {\n this.tokenPreferences.push({ ...tokenPreference, isHidden: true })\n // Remove the token preference if the user decides to show it again\n } else if (existingPreference.isHidden) {\n this.tokenPreferences = this.tokenPreferences.filter(\n ({ address, networkId }) =>\n !(address === tokenPreference.address && networkId === tokenPreference.networkId)\n )\n } else {\n // Should happen only after migration\n existingPreference.isHidden = !existingPreference.isHidden\n }\n\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr)\n }\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n }\n\n async #updateNetworksWithAssets(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = this.#networksWithAssetsByAccounts\n\n this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n }\n\n #setNetworkLoading(\n accountId: AccountId,\n stateKey: 'latest' | 'pending',\n network: string,\n isLoading: boolean,\n error?: any\n ) {\n const states = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = states[stateKey][accountId]\n if (!accountState[network]) accountState[network] = { errors: [], isReady: false, isLoading }\n accountState[network]!.isLoading = isLoading\n if (error) accountState[network]!.criticalError = error\n }\n\n removeNetworkData(networkId: NetworkId) {\n for (const accountState of [this.#latest, this.#pending]) {\n for (const accountId of Object.keys(accountState)) {\n delete accountState[accountId][networkId]\n }\n }\n this.emitUpdate()\n }\n\n // make the pending results the same as the latest ones\n overridePendingResults(accountOp: AccountOp) {\n if (\n this.#pending[accountOp.accountAddr] &&\n this.#pending[accountOp.accountAddr][accountOp.networkId] &&\n this.#latest[accountOp.accountAddr] &&\n this.#latest[accountOp.accountAddr][accountOp.networkId]\n ) {\n this.#pending[accountOp.accountAddr][accountOp.networkId]!.result =\n this.#latest[accountOp.accountAddr][accountOp.networkId]!.result\n this.emitUpdate()\n }\n }\n\n async updateTokenValidationByStandard(\n token: { address: TokenResult['address']; networkId: TokenResult['networkId'] },\n accountId: AccountId\n ) {\n await this.#initialLoadPromise\n if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return\n\n const [isValid, standard]: [boolean, string] = (await validateERC20Token(\n token,\n accountId,\n this.#providers.providers[token.networkId]\n )) as [boolean, string]\n\n this.validTokens[standard] = {\n ...this.validTokens[standard],\n [`${token.address}-${token.networkId}`]: isValid\n }\n\n this.emitUpdate()\n }\n\n initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network) {\n const providers = this.#providers.providers\n const key = `${networkId}:${accountId}`\n // Initialize a new Portfolio lib if:\n // 1. It does not exist in the portfolioLibs map\n // 2. The network RPC URL has changed\n if (\n !this.#portfolioLibs.has(key) ||\n this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !==\n // eslint-disable-next-line no-underscore-dangle\n providers[network.id]?._getConnection().url\n ) {\n this.#portfolioLibs.set(\n key,\n new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)\n )\n }\n return this.#portfolioLibs.get(key)!\n }\n\n async getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string) {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n\n if (!network) throw new Error('network not found')\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network)\n\n const temporaryTokensToFetch =\n (this.temporaryTokens[network.id] &&\n this.temporaryTokens[network.id].result?.tokens.filter(\n (x) => x.address !== additionalHint\n )) ||\n []\n\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result\n }\n this.emitUpdate()\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)],\n disableAutoDiscovery: true\n })\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: {\n tokens: result.tokens\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n this.temporaryTokens[network.id].isLoading = false\n this.temporaryTokens[network.id].errors.push(e)\n this.emitUpdate()\n return false\n }\n }\n\n async #getAdditionalPortfolio(accountId: AccountId, forceUpdate?: boolean) {\n const rewardsOrGasTankState =\n this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank\n const canSkipUpdate = rewardsOrGasTankState\n ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate)\n : false\n\n if (canSkipUpdate) return\n\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n const start = Date.now()\n const accountState = this.#latest[accountId]\n\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', true)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', true)\n this.emitUpdate()\n\n let res: any\n try {\n res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`)\n } catch (e: any) {\n console.error('relayer error for portfolio additional')\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e)\n this.emitUpdate()\n return\n }\n\n if (!res) throw new Error('portfolio controller: no res, should never happen')\n\n const rewardsTokens = [\n res.data.rewards.xWalletClaimableBalance || [],\n res.data.rewards.walletClaimableBalance || []\n ]\n .flat()\n .map((t: any) => ({\n ...t,\n symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol,\n flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address)\n }))\n\n accountState.rewards = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n ...res.data.rewards,\n lastSuccessfulUpdate: Date.now(),\n updateStarted: start,\n tokens: rewardsTokens,\n total: getTotal(rewardsTokens)\n }\n }\n\n const gasTankTokens = res.data.gasTank.balance.map((t: any) => ({\n ...t,\n flags: getFlags(res.data, 'gasTank', t.networkId, t.address)\n }))\n\n accountState.gasTank = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n updateStarted: start,\n lastSuccessfulUpdate: Date.now(),\n tokens: [\n ...gasTankTokens,\n ...getPinnedGasTankTokens(\n res.data.gasTank.availableGasTankAssets,\n hasNonZeroTokens,\n accountId,\n gasTankTokens\n )\n ],\n total: getTotal(gasTankTokens)\n }\n }\n\n this.emitUpdate()\n }\n\n #getCanSkipUpdate(networkState?: NetworkState, forceUpdate?: boolean) {\n const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical')\n\n if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors)\n return false\n const updateStarted = networkState.result?.updateStarted || 0\n const isWithinMinUpdateInterval =\n !!updateStarted && Date.now() - updateStarted < this.#minUpdateInterval\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n // By our convention, we always stick with private (#) instead of protected methods.\n // However, we made a compromise here to allow Jest tests to mock updatePortfolioState.\n protected async updatePortfolioState(\n accountId: string,\n network: Network,\n portfolioLib: Portfolio,\n portfolioProps: Partial & { blockTag: 'latest' | 'pending' },\n forceUpdate: boolean\n ): Promise {\n const blockTag = portfolioProps.blockTag\n const stateKeys = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = stateKeys[blockTag][accountId]\n if (!accountState[network.id]) {\n // isLoading must be false here, otherwise canSkipUpdate will return true\n // and portfolio will not be updated\n accountState[network.id] = { isLoading: false, isReady: false, errors: [] }\n }\n const canSkipUpdate = this.#getCanSkipUpdate(accountState[network.id], forceUpdate)\n\n if (canSkipUpdate) return false\n\n this.#setNetworkLoading(accountId, blockTag, network.id, true)\n this.emitUpdate()\n\n const state = accountState[network.id]!\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n priceCache: state.result?.priceCache,\n fetchPinned: !hasNonZeroTokens,\n ...portfolioProps\n })\n\n const hasCriticalError = result.errors.some((e) => e.level === 'critical')\n const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []\n let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0\n\n // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user\n // is likely expecting a change in the portfolio.\n if (forceUpdate && hasCriticalError) {\n lastSuccessfulUpdate = 0\n } else if (!hasCriticalError) {\n // Update the last successful update only if there are no critical errors.\n lastSuccessfulUpdate = Date.now()\n }\n\n const processedTokens = processTokens(\n result.tokens,\n network,\n hasNonZeroTokens,\n additionalHintsErc20Hints,\n this.tokenPreferences\n )\n\n accountState[network.id] = {\n isReady: true,\n isLoading: false,\n errors: result.errors,\n result: {\n ...result,\n lastSuccessfulUpdate,\n tokens: processedTokens,\n total: getTotal(processedTokens)\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n state.isLoading = false\n state.criticalError = e\n if (forceUpdate && state.result) {\n // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user\n // is likely expecting a change in the portfolio.\n state.result.lastSuccessfulUpdate = 0\n }\n this.emitUpdate()\n\n return false\n }\n }\n\n // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this\n // controller doesn't have to update this controller every time that those are updated\n\n // The recommended behavior of the application that this API encourages is:\n // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount\n // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a\n // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance\n // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks\n // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations)\n\n // the purpose of this function is to call it when an account is selected or the queue of accountOps changes\n async updateSelectedAccount(\n accountId: AccountId,\n network?: Network,\n accountOps?: { [key: string]: AccountOp[] },\n opts?: { forceUpdate: boolean }\n ) {\n await this.#initialLoadPromise\n const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId)\n if (!selectedAccount) throw new Error('selected account does not exist')\n if (!this.#latest[accountId]) this.#latest[accountId] = {}\n if (!this.#pending[accountId]) this.#pending[accountId] = {}\n\n const accountState = this.#latest[accountId]\n const pendingState = this.#pending[accountId]\n\n if (shouldGetAdditionalPortfolio(selectedAccount)) {\n this.#getAdditionalPortfolio(accountId, opts?.forceUpdate)\n }\n\n const networks = network ? [network] : this.#networks.networks\n await Promise.all(\n networks.map(async (network) => {\n const key = `${network.id}:${accountId}`\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network)\n\n const currentAccountOps = accountOps?.[network.id]?.filter(\n (op) => op.accountAddr === accountId\n )\n const simulatedAccountOps = pendingState[network.id]?.accountOps\n\n if (!this.#queue?.[accountId]?.[network.id])\n this.#queue[accountId] = {\n ...this.#queue[accountId],\n [network.id]: Promise.resolve()\n }\n\n const updatePromise = async (): Promise => {\n // We are performing the following extended check because both (or one of both) variables may have an undefined value.\n // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent.\n // However, when one of the variables is not set, two cases arise:\n // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object.\n // 2. No change occurs if both variables are undefined.\n const areAccountOpsChanged =\n currentAccountOps && simulatedAccountOps\n ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps)\n : currentAccountOps !== simulatedAccountOps\n const forceUpdate = opts?.forceUpdate || areAccountOpsChanged\n\n const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]\n\n const additionalErc20Hints = [\n ...Object.keys(\n (this.#previousHints?.learnedTokens &&\n this.#previousHints?.learnedTokens[network.id]) ??\n {}\n ),\n ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []),\n ...this.customTokens\n .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20')\n .map(({ address }) => address)\n ]\n // TODO: Add custom ERC721 tokens to the hints\n const additionalErc721Hints = Object.fromEntries(\n Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [\n getAddress(k),\n { isKnown: false, tokens: v.map((i) => i.toString()) }\n ])\n )\n const allHints = {\n previousHintsFromExternalAPI,\n additionalErc20Hints,\n additionalErc721Hints\n }\n\n const [isSuccessfulLatestUpdate] = await Promise.all([\n // Latest state update\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'latest',\n ...allHints\n },\n forceUpdate\n ),\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'pending',\n ...(currentAccountOps && {\n simulation: {\n account: selectedAccount,\n accountOps: currentAccountOps\n }\n }),\n isEOA: !isSmartAccount(selectedAccount),\n ...allHints\n },\n forceUpdate\n )\n ])\n\n // Persist latest state in previousHints in the disk storage for further requests\n if (\n isSuccessfulLatestUpdate &&\n !areAccountOpsChanged &&\n accountState[network.id]?.result\n ) {\n const networkResult = accountState[network.id]!.result\n const readyToLearnTokens = getTokensReadyToLearn(\n this.#toBeLearnedTokens[network.id],\n networkResult!.tokens\n )\n\n if (readyToLearnTokens.length) {\n await this.learnTokens(readyToLearnTokens, network.id)\n }\n\n // Either a valid response or there is no external API to fetch hints from\n const isExternalHintsApiResponseValid =\n !!networkResult?.hintsFromExternalAPI || !network.hasRelayer\n\n if (isExternalHintsApiResponseValid) {\n const updatedStoragePreviousHints = getUpdatedHints(\n networkResult!.hintsFromExternalAPI || null,\n networkResult!.tokens,\n networkResult!.tokenErrors,\n network.id,\n this.#previousHints,\n key,\n this.customTokens\n )\n\n // Updating hints is only needed when the external API response is valid.\n // learnTokens and learnNfts update storage separately, so we don't need to update them here\n // if the external API response is invalid.\n this.#previousHints = updatedStoragePreviousHints\n await this.#storage.set('previousHints', updatedStoragePreviousHints)\n }\n }\n\n // We cache the previously simulated AccountOps\n // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState.\n // This allows us to identify any differences between the two.\n if (currentAccountOps) {\n pendingState[network.id]!.accountOps = currentAccountOps\n }\n }\n\n // Chain the new updatePromise to the current queue\n this.#queue[accountId][network.id] = this.#queue[accountId][network.id]\n .then(updatePromise)\n .catch(() => updatePromise())\n\n // Ensure the method waits for the entire queue to resolve\n await this.#queue[accountId][network.id]\n })\n )\n\n await this.#updateNetworksWithAssets(accountId, accountState)\n this.emitUpdate()\n }\n\n markSimulationAsBroadcasted(accountId: string, networkId: string) {\n const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]\n\n if (!simulation) return\n\n simulation.status = AccountOpStatus.BroadcastedButNotConfirmed\n\n this.emitUpdate()\n }\n\n addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId) {\n if (!tokenAddresses.length) return false\n if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []\n\n let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]\n\n const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.filter((address) => {\n let normalizedAddress\n try {\n normalizedAddress = getAddress(address)\n } catch (e) {\n console.error('Error while normalizing token address', e)\n }\n\n return normalizedAddress && !alreadyLearned.includes(normalizedAddress)\n })\n\n if (!tokensToLearn.length) return false\n\n networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]\n\n this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens\n return true\n }\n\n // Learn new tokens from humanizer and debug_traceCall\n // return: whether new tokens have been learned\n async learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise {\n if (!tokenAddresses) return false\n\n if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}\n\n let networkLearnedTokens: PreviousHintsStorage['learnedTokens'][''] =\n this.#previousHints.learnedTokens[networkId] || {}\n\n const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.reduce((acc: { [key: string]: null }, address) => {\n if (address === ZeroAddress) return acc\n if (alreadyLearned.includes(getAddress(address))) return acc\n\n acc[address] = acc[address] || null // Keep the timestamp of all learned tokens\n return acc\n }, {})\n\n if (!Object.keys(tokensToLearn).length) return false\n // Add new tokens in the beginning of the list\n networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }\n\n // Reached limit\n if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) {\n // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order.\n // This ensures that tokens with the most recent timestamps are prioritized for retention,\n // and tokens with the oldest timestamps are deleted last when the limit is exceeded.\n const learnedTokensArray = Object.entries(networkLearnedTokens).sort(\n (a, b) => Number(b[1]) - Number(a[1])\n )\n\n networkLearnedTokens = Object.fromEntries(\n learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)\n )\n }\n\n this.#previousHints.learnedTokens[networkId] = networkLearnedTokens\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n async learnNfts(\n nftsData: [string, bigint[]][] | undefined,\n networkId: NetworkId\n ): Promise {\n if (!nftsData?.length) return false\n if (!this.#previousHints.learnedNfts) this.#previousHints.learnedNfts = {}\n const networkLearnedNfts: PreviousHintsStorage['learnedNfts'][''] =\n this.#previousHints.learnedNfts[networkId] || {}\n\n const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat()\n const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts)\n .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`))\n .flat()\n if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false\n nftsData.forEach(([addr, ids]) => {\n if (addr === ZeroAddress) return\n if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids\n else networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]]))\n })\n\n this.#previousHints.learnedNfts[networkId] = networkLearnedNfts\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n removeAccountData(address: Account['addr']) {\n delete this.#latest[address]\n delete this.#pending[address]\n delete this.#networksWithAssetsByAccounts[address]\n\n this.#networks.networks.forEach((network) => {\n const key = `${network.id}:${address}`\n\n if (key in this.#previousHints.fromExternalAPI) {\n delete this.#previousHints.fromExternalAPI[key]\n }\n if (key in this.#portfolioLibs) {\n this.#portfolioLibs.delete(key)\n }\n })\n this.#storage.set('previousHints', this.#previousHints)\n this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n\n this.emitUpdate()\n }\n\n getLatestPortfolioState(accountAddr: string) {\n return this.#latest[accountAddr] || {}\n }\n\n getPendingPortfolioState(accountAddr: string) {\n return this.#pending[accountAddr] || {}\n }\n\n getNetworksWithAssets(accountAddr: string) {\n return this.#networksWithAssetsByAccounts[accountAddr] || []\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../../src/controllers/portfolio/portfolio.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress, ZeroAddress } from 'ethers'\n\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Network, NetworkId } from '../../interfaces/network'\n/* eslint-disable @typescript-eslint/no-shadow */\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, AccountOpStatus, isAccountOpsIntentEqual } from '../../libs/accountOp/accountOp'\nimport { Portfolio } from '../../libs/portfolio'\n/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { CustomToken, TokenPreference } from '../../libs/portfolio/customToken'\nimport getAccountNetworksWithAssets from '../../libs/portfolio/getNetworksWithAssets'\nimport {\n getFlags,\n getPinnedGasTankTokens,\n getTokensReadyToLearn,\n getTotal,\n getUpdatedHints,\n processTokens,\n shouldGetAdditionalPortfolio,\n validateERC20Token\n} from '../../libs/portfolio/helpers'\n/* eslint-disable no-restricted-syntax */\n// eslint-disable-next-line import/no-cycle\nimport {\n AccountAssetsState,\n AccountState,\n GetOptions,\n NetworkState,\n PortfolioControllerState,\n PreviousHintsStorage,\n TemporaryTokens,\n TokenResult\n} from '../../libs/portfolio/interfaces'\nimport { migrateTokenPreferences } from '../../libs/portfolio/migrations/tokenPreferences'\nimport { relayerCall } from '../../libs/relayerCall/relayerCall'\nimport { AccountsController } from '../accounts/accounts'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\nimport { ProvidersController } from '../providers/providers'\n\n/* eslint-disable @typescript-eslint/no-shadow */\n\nconst LEARNED_TOKENS_NETWORK_LIMIT = 50\n\nexport class PortfolioController extends EventEmitter {\n #latest: PortfolioControllerState\n\n #pending: PortfolioControllerState\n\n // A queue to prevent race conditions when calling `updateSelectedAccount`.\n // All calls are queued by network and account.\n // Each time `updateSelectedAccount` is invoked to update the latest or pending state, the call is added to the queue.\n // If a previous call is still running, the new call will be queued and executed only after the first one completes,\n // regardless of whether it succeeds or fails.\n // Before implementing this queue, multiple `updateSelectedAccount` calls made in a short period of time could cause\n // the response of the latest call to be overwritten by a slower previous call.\n #queue: {\n [accountId: string]: {\n [networkId: NetworkId]: Promise\n }\n }\n\n #toBeLearnedTokens: { [network in NetworkId]: string[] }\n\n customTokens: CustomToken[] = []\n\n tokenPreferences: TokenPreference[] = []\n\n validTokens: any = { erc20: {}, erc721: {} }\n\n temporaryTokens: TemporaryTokens = {}\n\n #portfolioLibs: Map\n\n #storage: Storage\n\n #fetch: Fetch\n\n #callRelayer: Function\n\n #velcroUrl: string\n\n #networksWithAssetsByAccounts: {\n [accountId: string]: AccountAssetsState\n } = {}\n\n #minUpdateInterval: number = 20000 // 20 seconds\n\n /**\n * Hints stored in storage, divided into three categories:\n * - fromExternalAPI: Hints fetched from an external API, used when the external API response fails.\n * - learnedTokens: Hints of learned tokens, each with a timestamp indicating the last time the token was seen with a balance and not included in fromExternalAPI hints. This helps prioritize tokens not yet found by Velcro during cleansing.\n * - learnedNfts: Hints of learned NFTs.\n */\n #previousHints: PreviousHintsStorage = {\n fromExternalAPI: {},\n learnedTokens: {},\n learnedNfts: {}\n }\n\n #providers: ProvidersController\n\n #networks: NetworksController\n\n #accounts: AccountsController\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n constructor(\n storage: Storage,\n fetch: Fetch,\n providers: ProvidersController,\n networks: NetworksController,\n accounts: AccountsController,\n relayerUrl: string,\n velcroUrl: string\n ) {\n super()\n this.#latest = {}\n this.#pending = {}\n this.#queue = {}\n this.#portfolioLibs = new Map()\n this.#storage = storage\n this.#fetch = fetch\n this.#callRelayer = relayerCall.bind({ url: relayerUrl, fetch })\n this.#velcroUrl = velcroUrl\n this.#providers = providers\n this.#networks = networks\n this.#accounts = accounts\n this.temporaryTokens = {}\n this.#toBeLearnedTokens = {}\n\n this.#initialLoadPromise = this.#load()\n }\n\n async #load() {\n try {\n await this.#networks.initialLoadPromise\n await this.#accounts.initialLoadPromise\n const storageTokenPreferences = await this.#storage.get('tokenPreferences', [])\n const storageCustomTokens = await this.#storage.get('customTokens', [])\n\n const { tokenPreferences, customTokens, shouldUpdateStorage } = migrateTokenPreferences(\n storageTokenPreferences,\n storageCustomTokens\n )\n\n this.tokenPreferences = tokenPreferences\n this.customTokens = customTokens\n\n if (shouldUpdateStorage) {\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n this.#previousHints = await this.#storage.get('previousHints', {})\n const networksWithAssets = await this.#storage.get('networksWithAssetsByAccount', {})\n const isOldStructure = Object.keys(networksWithAssets).every(\n (key) =>\n Array.isArray(networksWithAssets[key]) &&\n networksWithAssets[key].every((item: any) => typeof item === 'string')\n )\n if (!isOldStructure) {\n this.#networksWithAssetsByAccounts = networksWithAssets\n }\n } catch (e) {\n this.emitError({\n message:\n 'Something went wrong when loading portfolio. Please try again or contact support if the problem persists.',\n level: 'major',\n error: new Error('portfolio: failed to pull keys from storage')\n })\n }\n\n this.emitUpdate()\n }\n\n async #updatePortfolioOnTokenChange(networkId: NetworkId, selectedAccountAddr?: string) {\n // As this function currently only updates the portfolio we can skip it altogether\n // if skipPortfolioUpdate is set to true\n if (!selectedAccountAddr) return\n\n const networkData = this.#networks.networks.find(({ id }) => id === networkId)\n await this.updateSelectedAccount(selectedAccountAddr, networkData, undefined, {\n forceUpdate: true\n })\n }\n\n async addCustomToken(\n customToken: CustomToken,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n const isTokenAlreadyAdded = this.customTokens.some(\n ({ address, networkId }) =>\n address.toLowerCase() === customToken.address.toLowerCase() &&\n networkId === customToken.networkId\n )\n\n if (isTokenAlreadyAdded) return\n\n this.customTokens.push(customToken)\n\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n\n await this.#storage.set('customTokens', this.customTokens)\n }\n\n async removeCustomToken(\n customToken: Omit,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n this.customTokens = this.customTokens.filter(\n (token) =>\n !(\n token.address.toLowerCase() === customToken.address.toLowerCase() &&\n token.networkId === customToken.networkId\n )\n )\n const existingPreference = this.tokenPreferences.some(\n (pref) => pref.address === customToken.address && pref.networkId === customToken.networkId\n )\n\n // Delete custom token preference if it exists\n if (existingPreference) {\n await this.toggleHideToken(customToken, selectedAccountAddr, shouldUpdatePortfolio)\n await this.#storage.set('customTokens', this.customTokens)\n } else {\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(customToken.networkId, selectedAccountAddr)\n }\n await this.#storage.set('customTokens', this.customTokens)\n }\n }\n\n async toggleHideToken(\n tokenPreference: TokenPreference,\n selectedAccountAddr?: string,\n shouldUpdatePortfolio?: boolean\n ) {\n await this.#initialLoadPromise\n\n const existingPreference = this.tokenPreferences.find(\n ({ address, networkId }) =>\n address.toLowerCase() === tokenPreference.address.toLowerCase() &&\n networkId === tokenPreference.networkId\n )\n\n // Push the token as hidden\n if (!existingPreference) {\n this.tokenPreferences.push({ ...tokenPreference, isHidden: true })\n // Remove the token preference if the user decides to show it again\n } else if (existingPreference.isHidden) {\n this.tokenPreferences = this.tokenPreferences.filter(\n ({ address, networkId }) =>\n !(address === tokenPreference.address && networkId === tokenPreference.networkId)\n )\n } else {\n // Should happen only after migration\n existingPreference.isHidden = !existingPreference.isHidden\n }\n\n this.emitUpdate()\n if (shouldUpdatePortfolio) {\n await this.#updatePortfolioOnTokenChange(tokenPreference.networkId, selectedAccountAddr)\n }\n await this.#storage.set('tokenPreferences', this.tokenPreferences)\n }\n\n async #updateNetworksWithAssets(accountId: AccountId, accountState: AccountState) {\n const storageStateByAccount = this.#networksWithAssetsByAccounts\n\n this.#networksWithAssetsByAccounts[accountId] = getAccountNetworksWithAssets(\n accountId,\n accountState,\n storageStateByAccount,\n this.#providers.providers\n )\n\n this.emitUpdate()\n await this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n }\n\n #setNetworkLoading(\n accountId: AccountId,\n stateKey: 'latest' | 'pending',\n network: string,\n isLoading: boolean,\n error?: any\n ) {\n const states = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = states[stateKey][accountId]\n if (!accountState[network]) accountState[network] = { errors: [], isReady: false, isLoading }\n accountState[network]!.isLoading = isLoading\n if (error) accountState[network]!.criticalError = error\n }\n\n removeNetworkData(networkId: NetworkId) {\n for (const accountState of [this.#latest, this.#pending]) {\n for (const accountId of Object.keys(accountState)) {\n delete accountState[accountId][networkId]\n }\n }\n this.emitUpdate()\n }\n\n // make the pending results the same as the latest ones\n overridePendingResults(accountOp: AccountOp) {\n if (\n this.#pending[accountOp.accountAddr] &&\n this.#pending[accountOp.accountAddr][accountOp.networkId] &&\n this.#latest[accountOp.accountAddr] &&\n this.#latest[accountOp.accountAddr][accountOp.networkId]\n ) {\n this.#pending[accountOp.accountAddr][accountOp.networkId]!.result =\n this.#latest[accountOp.accountAddr][accountOp.networkId]!.result\n this.emitUpdate()\n }\n }\n\n async updateTokenValidationByStandard(\n token: { address: TokenResult['address']; networkId: TokenResult['networkId'] },\n accountId: AccountId\n ) {\n await this.#initialLoadPromise\n if (this.validTokens.erc20[`${token.address}-${token.networkId}`] === true) return\n\n const [isValid, standard]: [boolean, string] = (await validateERC20Token(\n token,\n accountId,\n this.#providers.providers[token.networkId]\n )) as [boolean, string]\n\n this.validTokens[standard] = {\n ...this.validTokens[standard],\n [`${token.address}-${token.networkId}`]: isValid\n }\n\n this.emitUpdate()\n }\n\n initializePortfolioLibIfNeeded(accountId: AccountId, networkId: NetworkId, network: Network) {\n const providers = this.#providers.providers\n const key = `${networkId}:${accountId}`\n // Initialize a new Portfolio lib if:\n // 1. It does not exist in the portfolioLibs map\n // 2. The network RPC URL has changed\n if (\n !this.#portfolioLibs.has(key) ||\n this.#portfolioLibs.get(key)?.network?.selectedRpcUrl !==\n // eslint-disable-next-line no-underscore-dangle\n providers[network.id]?._getConnection().url\n ) {\n this.#portfolioLibs.set(\n key,\n new Portfolio(this.#fetch, providers[network.id], network, this.#velcroUrl)\n )\n }\n return this.#portfolioLibs.get(key)!\n }\n\n async getTemporaryTokens(accountId: AccountId, networkId: NetworkId, additionalHint: string) {\n const network = this.#networks.networks.find((x) => x.id === networkId)\n\n if (!network) throw new Error('network not found')\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, networkId, network)\n\n const temporaryTokensToFetch =\n (this.temporaryTokens[network.id] &&\n this.temporaryTokens[network.id].result?.tokens.filter(\n (x) => x.address !== additionalHint\n )) ||\n []\n\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: this.temporaryTokens[network.id] && this.temporaryTokens[network.id].result\n }\n this.emitUpdate()\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n additionalErc20Hints: [additionalHint, ...temporaryTokensToFetch.map((x) => x.address)],\n disableAutoDiscovery: true\n })\n this.temporaryTokens[network.id] = {\n isLoading: false,\n errors: [],\n result: {\n tokens: result.tokens\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n this.temporaryTokens[network.id].isLoading = false\n this.temporaryTokens[network.id].errors.push(e)\n this.emitUpdate()\n return false\n }\n }\n\n async #getAdditionalPortfolio(accountId: AccountId, forceUpdate?: boolean) {\n const rewardsOrGasTankState =\n this.#latest[accountId]?.rewards || this.#latest[accountId]?.gasTank\n const canSkipUpdate = rewardsOrGasTankState\n ? this.#getCanSkipUpdate(rewardsOrGasTankState, forceUpdate)\n : false\n\n if (canSkipUpdate) return\n\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n const start = Date.now()\n const accountState = this.#latest[accountId]\n\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', true)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', true)\n this.emitUpdate()\n\n let res: any\n try {\n res = await this.#callRelayer(`/v2/identity/${accountId}/portfolio-additional`)\n } catch (e: any) {\n console.error('relayer error for portfolio additional')\n this.#setNetworkLoading(accountId, 'latest', 'gasTank', false, e)\n this.#setNetworkLoading(accountId, 'latest', 'rewards', false, e)\n this.emitUpdate()\n return\n }\n\n if (!res) throw new Error('portfolio controller: no res, should never happen')\n\n const rewardsTokens = [\n res.data.rewards.xWalletClaimableBalance || [],\n res.data.rewards.walletClaimableBalance || []\n ]\n .flat()\n .map((t: any) => ({\n ...t,\n symbol: t.address === '0x47Cd7E91C3CBaAF266369fe8518345fc4FC12935' ? 'xWALLET' : t.symbol,\n flags: getFlags(res.data.rewards, 'rewards', t.networkId, t.address)\n }))\n\n accountState.rewards = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n ...res.data.rewards,\n lastSuccessfulUpdate: Date.now(),\n updateStarted: start,\n tokens: rewardsTokens,\n total: getTotal(rewardsTokens)\n }\n }\n\n const gasTankTokens = res.data.gasTank.balance.map((t: any) => ({\n ...t,\n flags: getFlags(res.data, 'gasTank', t.networkId, t.address)\n }))\n\n accountState.gasTank = {\n isReady: true,\n isLoading: false,\n errors: [],\n result: {\n updateStarted: start,\n lastSuccessfulUpdate: Date.now(),\n tokens: [\n ...gasTankTokens,\n ...getPinnedGasTankTokens(\n res.data.gasTank.availableGasTankAssets,\n hasNonZeroTokens,\n accountId,\n gasTankTokens\n )\n ],\n total: getTotal(gasTankTokens)\n }\n }\n\n this.emitUpdate()\n }\n\n #getCanSkipUpdate(\n networkState?: NetworkState,\n forceUpdate?: boolean,\n maxDataAgeMs: number = this.#minUpdateInterval\n ) {\n const hasImportantErrors = networkState?.errors.some((e) => e.level === 'critical')\n\n if (forceUpdate || !networkState || networkState.criticalError || hasImportantErrors)\n return false\n const updateStarted = networkState.result?.updateStarted || 0\n const isWithinMinUpdateInterval = !!updateStarted && Date.now() - updateStarted < maxDataAgeMs\n\n return isWithinMinUpdateInterval || networkState.isLoading\n }\n\n // By our convention, we always stick with private (#) instead of protected methods.\n // However, we made a compromise here to allow Jest tests to mock updatePortfolioState.\n protected async updatePortfolioState(\n accountId: string,\n network: Network,\n portfolioLib: Portfolio,\n portfolioProps: Partial & { blockTag: 'latest' | 'pending' },\n forceUpdate: boolean,\n maxDataAgeMs?: number\n ): Promise {\n const blockTag = portfolioProps.blockTag\n const stateKeys = {\n latest: this.#latest,\n pending: this.#pending\n }\n const accountState = stateKeys[blockTag][accountId]\n if (!accountState[network.id]) {\n // isLoading must be false here, otherwise canSkipUpdate will return true\n // and portfolio will not be updated\n accountState[network.id] = { isLoading: false, isReady: false, errors: [] }\n }\n const canSkipUpdate = this.#getCanSkipUpdate(\n accountState[network.id],\n forceUpdate,\n maxDataAgeMs\n )\n\n if (canSkipUpdate) return false\n\n this.#setNetworkLoading(accountId, blockTag, network.id, true)\n this.emitUpdate()\n\n const state = accountState[network.id]!\n const hasNonZeroTokens = !!Object.values(\n this.#networksWithAssetsByAccounts?.[accountId] || {}\n ).some(Boolean)\n\n try {\n const result = await portfolioLib.get(accountId, {\n priceRecency: 60000,\n priceCache: state.result?.priceCache,\n fetchPinned: !hasNonZeroTokens,\n ...portfolioProps\n })\n\n const hasCriticalError = result.errors.some((e) => e.level === 'critical')\n const additionalHintsErc20Hints = portfolioProps.additionalErc20Hints || []\n let lastSuccessfulUpdate = accountState[network.id]?.result?.lastSuccessfulUpdate || 0\n\n // Reset lastSuccessfulUpdate on forceUpdate in case of critical errors as the user\n // is likely expecting a change in the portfolio.\n if (forceUpdate && hasCriticalError) {\n lastSuccessfulUpdate = 0\n } else if (!hasCriticalError) {\n // Update the last successful update only if there are no critical errors.\n lastSuccessfulUpdate = Date.now()\n }\n\n const processedTokens = processTokens(\n result.tokens,\n network,\n hasNonZeroTokens,\n additionalHintsErc20Hints,\n this.tokenPreferences,\n this.customTokens\n )\n\n accountState[network.id] = {\n isReady: true,\n isLoading: false,\n errors: result.errors,\n result: {\n ...result,\n lastSuccessfulUpdate,\n tokens: processedTokens,\n total: getTotal(processedTokens)\n }\n }\n this.emitUpdate()\n return true\n } catch (e: any) {\n this.emitError({\n level: 'silent',\n message: \"Error while executing the 'get' function in the portfolio library.\",\n error: e\n })\n state.isLoading = false\n state.criticalError = e\n if (forceUpdate && state.result) {\n // Reset lastSuccessfulUpdate on forceUpdate in case of a critical error as the user\n // is likely expecting a change in the portfolio.\n state.result.lastSuccessfulUpdate = 0\n }\n this.emitUpdate()\n\n return false\n }\n }\n\n // NOTE: we always pass in all `accounts` and `networks` to ensure that the user of this\n // controller doesn't have to update this controller every time that those are updated\n\n // The recommended behavior of the application that this API encourages is:\n // 1) when the user selects an account, update it's portfolio on all networks (latest state only) by calling updateSelectedAccount\n // 2) every time the user has a change in their pending (to be signed or to be mined) bundle(s) on a\n // certain network, call updateSelectedAccount again with those bundles; it will update the portfolio balance\n // on each network where there are bundles, and it will update both `latest` and `pending` states on said networks\n // it will also use a high `priceRecency` to make sure we don't lose time in updating prices (since we care about running the simulations)\n\n // the purpose of this function is to call it when an account is selected or the queue of accountOps changes\n async updateSelectedAccount(\n accountId: AccountId,\n network?: Network,\n accountOps?: { [key: string]: AccountOp[] },\n opts?: { forceUpdate?: boolean; maxDataAgeMs?: number }\n ) {\n await this.#initialLoadPromise\n const selectedAccount = this.#accounts.accounts.find((x) => x.addr === accountId)\n if (!selectedAccount) throw new Error('selected account does not exist')\n if (!this.#latest[accountId]) this.#latest[accountId] = {}\n if (!this.#pending[accountId]) this.#pending[accountId] = {}\n\n const accountState = this.#latest[accountId]\n const pendingState = this.#pending[accountId]\n\n if (shouldGetAdditionalPortfolio(selectedAccount)) {\n this.#getAdditionalPortfolio(accountId, opts?.forceUpdate)\n }\n\n const networks = network ? [network] : this.#networks.networks\n await Promise.all(\n networks.map(async (network) => {\n const key = `${network.id}:${accountId}`\n\n const portfolioLib = this.initializePortfolioLibIfNeeded(accountId, network.id, network)\n\n const currentAccountOps = accountOps?.[network.id]?.filter(\n (op) => op.accountAddr === accountId\n )\n const simulatedAccountOps = pendingState[network.id]?.accountOps\n\n if (!this.#queue?.[accountId]?.[network.id])\n this.#queue[accountId] = {\n ...this.#queue[accountId],\n [network.id]: Promise.resolve()\n }\n\n const updatePromise = async (): Promise => {\n // We are performing the following extended check because both (or one of both) variables may have an undefined value.\n // If both variables contain AccountOps, we can simply compare for changes in the AccountOps intent.\n // However, when one of the variables is not set, two cases arise:\n // 1. A change occurs if one variable is undefined and the other one holds an AccountOps object.\n // 2. No change occurs if both variables are undefined.\n const areAccountOpsChanged =\n currentAccountOps && simulatedAccountOps\n ? !isAccountOpsIntentEqual(currentAccountOps, simulatedAccountOps)\n : currentAccountOps !== simulatedAccountOps\n const forceUpdate = opts?.forceUpdate || areAccountOpsChanged\n\n const previousHintsFromExternalAPI = this.#previousHints?.fromExternalAPI?.[key]\n\n const additionalErc20Hints = [\n ...Object.keys(\n (this.#previousHints?.learnedTokens &&\n this.#previousHints?.learnedTokens[network.id]) ??\n {}\n ),\n ...((this.#toBeLearnedTokens && this.#toBeLearnedTokens[network.id]) ?? []),\n ...this.customTokens\n .filter(({ networkId, standard }) => networkId === network.id && standard === 'ERC20')\n .map(({ address }) => address),\n // We have to add the token preferences to ensure that the user can always see all hidden tokens\n // in settings, regardless of the selected account\n ...this.tokenPreferences\n .filter(({ networkId }) => networkId === network.id)\n .map(({ address }) => address)\n ]\n // TODO: Add custom ERC721 tokens to the hints\n const additionalErc721Hints = Object.fromEntries(\n Object.entries(this.#previousHints?.learnedNfts?.[network.id] || {}).map(([k, v]) => [\n getAddress(k),\n { isKnown: false, tokens: v.map((i) => i.toString()) }\n ])\n )\n const allHints = {\n previousHintsFromExternalAPI,\n additionalErc20Hints,\n additionalErc721Hints\n }\n\n const [isSuccessfulLatestUpdate] = await Promise.all([\n // Latest state update\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'latest',\n ...allHints\n },\n forceUpdate,\n opts?.maxDataAgeMs\n ),\n this.updatePortfolioState(\n accountId,\n network,\n portfolioLib,\n {\n blockTag: 'pending',\n ...(currentAccountOps && {\n simulation: {\n account: selectedAccount,\n accountOps: currentAccountOps\n }\n }),\n isEOA: !isSmartAccount(selectedAccount),\n ...allHints\n },\n forceUpdate,\n opts?.maxDataAgeMs\n )\n ])\n\n // Persist latest state in previousHints in the disk storage for further requests\n if (\n isSuccessfulLatestUpdate &&\n !areAccountOpsChanged &&\n accountState[network.id]?.result\n ) {\n const networkResult = accountState[network.id]!.result\n const readyToLearnTokens = getTokensReadyToLearn(\n this.#toBeLearnedTokens[network.id],\n networkResult!.tokens\n )\n\n if (readyToLearnTokens.length) {\n await this.learnTokens(readyToLearnTokens, network.id)\n }\n\n // Either a valid response or there is no external API to fetch hints from\n const isExternalHintsApiResponseValid =\n !!networkResult?.hintsFromExternalAPI || !network.hasRelayer\n\n if (isExternalHintsApiResponseValid) {\n const updatedStoragePreviousHints = getUpdatedHints(\n networkResult!.hintsFromExternalAPI || null,\n networkResult!.tokens,\n networkResult!.tokenErrors,\n network.id,\n this.#previousHints,\n key,\n this.customTokens,\n this.tokenPreferences\n )\n\n // Updating hints is only needed when the external API response is valid.\n // learnTokens and learnNfts update storage separately, so we don't need to update them here\n // if the external API response is invalid.\n this.#previousHints = updatedStoragePreviousHints\n await this.#storage.set('previousHints', updatedStoragePreviousHints)\n }\n }\n\n // We cache the previously simulated AccountOps\n // in order to compare them with the newly passed AccountOps before executing a new updatePortfolioState.\n // This allows us to identify any differences between the two.\n if (currentAccountOps) {\n pendingState[network.id]!.accountOps = currentAccountOps\n }\n }\n\n // Chain the new updatePromise to the current queue\n this.#queue[accountId][network.id] = this.#queue[accountId][network.id]\n .then(updatePromise)\n .catch(() => updatePromise())\n\n // Ensure the method waits for the entire queue to resolve\n await this.#queue[accountId][network.id]\n })\n )\n\n await this.#updateNetworksWithAssets(accountId, accountState)\n this.emitUpdate()\n }\n\n markSimulationAsBroadcasted(accountId: string, networkId: string) {\n const simulation = this.#pending[accountId][networkId]?.accountOps?.[0]\n\n if (!simulation) return\n\n simulation.status = AccountOpStatus.BroadcastedButNotConfirmed\n\n this.emitUpdate()\n }\n\n addTokensToBeLearned(tokenAddresses: string[], networkId: NetworkId) {\n if (!tokenAddresses.length) return false\n if (!this.#toBeLearnedTokens[networkId]) this.#toBeLearnedTokens[networkId] = []\n\n let networkToBeLearnedTokens = this.#toBeLearnedTokens[networkId]\n\n const alreadyLearned = networkToBeLearnedTokens.map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.filter((address) => {\n let normalizedAddress\n try {\n normalizedAddress = getAddress(address)\n } catch (e) {\n console.error('Error while normalizing token address', e)\n }\n\n return normalizedAddress && !alreadyLearned.includes(normalizedAddress)\n })\n\n if (!tokensToLearn.length) return false\n\n networkToBeLearnedTokens = [...tokensToLearn, ...networkToBeLearnedTokens]\n\n this.#toBeLearnedTokens[networkId] = networkToBeLearnedTokens\n return true\n }\n\n // Learn new tokens from humanizer and debug_traceCall\n // return: whether new tokens have been learned\n async learnTokens(tokenAddresses: string[] | undefined, networkId: NetworkId): Promise {\n if (!tokenAddresses) return false\n\n if (!this.#previousHints.learnedTokens) this.#previousHints.learnedTokens = {}\n\n let networkLearnedTokens: PreviousHintsStorage['learnedTokens'][''] =\n this.#previousHints.learnedTokens[networkId] || {}\n\n const alreadyLearned = Object.keys(networkLearnedTokens).map((addr) => getAddress(addr))\n\n const tokensToLearn = tokenAddresses.reduce((acc: { [key: string]: null }, address) => {\n if (address === ZeroAddress) return acc\n if (alreadyLearned.includes(getAddress(address))) return acc\n\n acc[address] = acc[address] || null // Keep the timestamp of all learned tokens\n return acc\n }, {})\n\n if (!Object.keys(tokensToLearn).length) return false\n // Add new tokens in the beginning of the list\n networkLearnedTokens = { ...tokensToLearn, ...networkLearnedTokens }\n\n // Reached limit\n if (LEARNED_TOKENS_NETWORK_LIMIT - Object.keys(networkLearnedTokens).length < 0) {\n // Convert learned tokens into an array of [address, timestamp] pairs and sort by timestamp in descending order.\n // This ensures that tokens with the most recent timestamps are prioritized for retention,\n // and tokens with the oldest timestamps are deleted last when the limit is exceeded.\n const learnedTokensArray = Object.entries(networkLearnedTokens).sort(\n (a, b) => Number(b[1]) - Number(a[1])\n )\n\n networkLearnedTokens = Object.fromEntries(\n learnedTokensArray.slice(0, LEARNED_TOKENS_NETWORK_LIMIT)\n )\n }\n\n this.#previousHints.learnedTokens[networkId] = networkLearnedTokens\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n async learnNfts(\n nftsData: [string, bigint[]][] | undefined,\n networkId: NetworkId\n ): Promise {\n if (!nftsData?.length) return false\n if (!this.#previousHints.learnedNfts) this.#previousHints.learnedNfts = {}\n const networkLearnedNfts: PreviousHintsStorage['learnedNfts'][''] =\n this.#previousHints.learnedNfts[networkId] || {}\n\n const newAddrToId = nftsData.map(([addr, ids]) => ids.map((id) => `${addr}:${id}`)).flat()\n const alreadyLearnedAddrToId = Object.entries(networkLearnedNfts)\n .map(([addr, ids]) => ids.map((id) => `${addr}:${id}`))\n .flat()\n if (newAddrToId.every((i) => alreadyLearnedAddrToId.includes(i))) return false\n nftsData.forEach(([addr, ids]) => {\n if (addr === ZeroAddress) return\n if (!networkLearnedNfts[addr]) networkLearnedNfts[addr] = ids\n else networkLearnedNfts[addr] = Array.from(new Set([...ids, ...networkLearnedNfts[addr]]))\n })\n\n this.#previousHints.learnedNfts[networkId] = networkLearnedNfts\n await this.#storage.set('previousHints', this.#previousHints)\n return true\n }\n\n removeAccountData(address: Account['addr']) {\n delete this.#latest[address]\n delete this.#pending[address]\n delete this.#networksWithAssetsByAccounts[address]\n\n this.#networks.networks.forEach((network) => {\n const key = `${network.id}:${address}`\n\n if (key in this.#previousHints.fromExternalAPI) {\n delete this.#previousHints.fromExternalAPI[key]\n }\n if (key in this.#portfolioLibs) {\n this.#portfolioLibs.delete(key)\n }\n })\n this.#storage.set('previousHints', this.#previousHints)\n this.#storage.set('networksWithAssetsByAccount', this.#networksWithAssetsByAccounts)\n\n this.emitUpdate()\n }\n\n getLatestPortfolioState(accountAddr: string) {\n return this.#latest[accountAddr] || {}\n }\n\n getPendingPortfolioState(accountAddr: string) {\n return this.#pending[accountAddr] || {}\n }\n\n getNetworksWithAssets(accountAddr: string) {\n return this.#networksWithAssetsByAccounts[accountAddr] || []\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON()\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.d.ts b/dist/src/controllers/selectedAccount/selectedAccount.d.ts index 935362267..ae2f9ea1e 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.d.ts +++ b/dist/src/controllers/selectedAccount/selectedAccount.d.ts @@ -17,6 +17,7 @@ export declare const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO: { collections: never[]; tokenAmounts: never[]; totalBalance: number; + isReadyToVisualize: boolean; isAllReady: boolean; networkSimulatedAccountOp: {}; latest: {}; diff --git a/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map b/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map index 8dcf879bf..9aa06d1c7 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map +++ b/dist/src/controllers/selectedAccount/selectedAccount.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,EAIL,2BAA2B,EAC5B,MAAM,mCAAmC,CAAA;AAM1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,kCAAkC;;;;;;;;;CAS9C,CAAA;AAED,qBAAa,yBAA0B,SAAQ,YAAY;;IAezD,OAAO,EAAE,OAAO,GAAG,IAAI,CAAO;IAE9B,SAAS,EAAE,wBAAwB,CAAqC;IAExE,kCAAkC,EAAE,MAAM,GAAG,IAAI,CAAO;IAExD,sBAAsB,EAAE,SAAS,GAAG,IAAI,CAAO;IAI/C,aAAa,EAAE,mBAAmB,EAAE,CAAK;IAMzC,OAAO,EAAE,OAAO,CAAQ;IAExB,yBAAyB,EAAE,OAAO,CAAQ;IAG1C,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAErB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE;IAsBrF,eAAe,CAAC,EACd,SAAS,EACT,aAAa,EACb,OAAO,EACP,QAAQ,EACR,SAAS,EACV,EAAE;QACD,SAAS,EAAE,mBAAmB,CAAA;QAC9B,aAAa,EAAE,uBAAuB,CAAA;QACtC,OAAO,EAAE,iBAAiB,CAAA;QAC1B,QAAQ,EAAE,kBAAkB,CAAA;QAC5B,SAAS,EAAE,mBAAmB,CAAA;KAC/B;IA6DK,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA2BxC,6BAA6B,CAAC,UAAU,CAAC,EAAE,OAAO;IAgElD,IAAI,uBAAuB,YAK1B;IAsHD,IAAI,sBAAsB,kCAEzB;IAED,IAAI,4BAA4B,IAAI,MAAM,EAAE,CA2B3C;IAED,yBAAyB,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI;IAKzD,MAAM;;;;;;CASP"} \ No newline at end of file +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,EAIL,2BAA2B,EAC5B,MAAM,mCAAmC,CAAA;AAM1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,kCAAkC;;;;;;;;;;CAU9C,CAAA;AAED,qBAAa,yBAA0B,SAAQ,YAAY;;IAezD,OAAO,EAAE,OAAO,GAAG,IAAI,CAAO;IAE9B,SAAS,EAAE,wBAAwB,CAAqC;IAExE,kCAAkC,EAAE,MAAM,GAAG,IAAI,CAAO;IAExD,sBAAsB,EAAE,SAAS,GAAG,IAAI,CAAO;IAI/C,aAAa,EAAE,mBAAmB,EAAE,CAAK;IAMzC,OAAO,EAAE,OAAO,CAAQ;IAExB,yBAAyB,EAAE,OAAO,CAAQ;IAG1C,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAErB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE;IAsBrF,eAAe,CAAC,EACd,SAAS,EACT,aAAa,EACb,OAAO,EACP,QAAQ,EACR,SAAS,EACV,EAAE;QACD,SAAS,EAAE,mBAAmB,CAAA;QAC9B,aAAa,EAAE,uBAAuB,CAAA;QACtC,OAAO,EAAE,iBAAiB,CAAA;QAC1B,QAAQ,EAAE,kBAAkB,CAAA;QAC5B,SAAS,EAAE,mBAAmB,CAAA;KAC/B;IA6DK,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA4BxC,6BAA6B,CAAC,UAAU,CAAC,EAAE,OAAO;IAkElD,IAAI,uBAAuB,YAK1B;IAsHD,IAAI,sBAAsB,kCAEzB;IAED,IAAI,4BAA4B,IAAI,MAAM,EAAE,CA2B3C;IAED,yBAAyB,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI;IAKzD,MAAM;;;;;;CASP"} \ No newline at end of file diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js b/dist/src/controllers/selectedAccount/selectedAccount.js index a935ee259..6c881e7fe 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.js +++ b/dist/src/controllers/selectedAccount/selectedAccount.js @@ -15,6 +15,7 @@ exports.DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = { collections: [], tokenAmounts: [], totalBalance: 0, + isReadyToVisualize: false, isAllReady: false, networkSimulatedAccountOp: {}, latest: {}, @@ -73,7 +74,7 @@ class SelectedAccountController extends eventEmitter_1.default { this.#defiPositions.onUpdate(() => { this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => { this.#updateSelectedAccountDefiPositions(); - if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) { + if (!this.areDefiPositionsLoading) { this.#updateSelectedAccountPortfolio(true); this.#updateDefiPositionsErrors(); } @@ -111,6 +112,7 @@ class SelectedAccountController extends eventEmitter_1.default { this.#defiPositionsErrors = []; this.resetSelectedAccountPortfolio(true); this.dashboardNetworkFilter = null; + this.portfolioStartedLoadingAtTimestamp = null; if (!account) { await this.#storage.remove('selectedAccount'); } @@ -144,14 +146,14 @@ class SelectedAccountController extends eventEmitter_1.default { const latestStateSelectedAccountWithDefiPositions = (0, selectedAccount_1.updatePortfolioStateWithDefiPositions)(latestStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); const pendingStateSelectedAccountWithDefiPositions = (0, selectedAccount_1.updatePortfolioStateWithDefiPositions)(pendingStateSelectedAccount, defiPositionsAccountState, this.areDefiPositionsLoading); const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter((action) => action.type === 'accountOp'); - const newSelectedAccountPortfolio = (0, selectedAccount_1.calculateSelectedAccountPortfolio)(latestStateSelectedAccountWithDefiPositions, pendingStateSelectedAccountWithDefiPositions, this.portfolio, hasSignAccountOp); + const newSelectedAccountPortfolio = (0, selectedAccount_1.calculateSelectedAccountPortfolio)(latestStateSelectedAccountWithDefiPositions, pendingStateSelectedAccountWithDefiPositions, this.portfolio, this.portfolioStartedLoadingAtTimestamp, defiPositionsAccountState, hasSignAccountOp); if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) { this.portfolioStartedLoadingAtTimestamp = null; } if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) { this.portfolioStartedLoadingAtTimestamp = Date.now(); } - if (newSelectedAccountPortfolio.isAllReady || + if (newSelectedAccountPortfolio.isReadyToVisualize || (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)) { this.portfolio = newSelectedAccountPortfolio; this.#updatePortfolioErrors(true); @@ -234,7 +236,7 @@ class SelectedAccountController extends eventEmitter_1.default { !this.#networks || !this.#providers || !this.#portfolio || - !this.portfolio.isAllReady) { + !this.portfolio.isReadyToVisualize) { this.#portfolioErrors = []; if (!skipUpdate) { this.emitUpdate(); diff --git a/dist/src/controllers/selectedAccount/selectedAccount.js.map b/dist/src/controllers/selectedAccount/selectedAccount.js.map index 94cbb7402..9a449416c 100644 --- a/dist/src/controllers/selectedAccount/selectedAccount.js.map +++ b/dist/src/controllers/selectedAccount/selectedAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { NetworkId } from '../../interfaces/network'\nimport { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { sortByValue } from '../../libs/defiPositions/helpers'\nimport { PositionsByProvider } from '../../libs/defiPositions/types'\n// eslint-disable-next-line import/no-cycle\nimport {\n getNetworksWithDeFiPositionsErrorErrors,\n getNetworksWithFailedRPCErrors,\n getNetworksWithPortfolioErrorErrors,\n SelectedAccountBalanceError\n} from '../../libs/selectedAccount/errors'\nimport {\n calculateSelectedAccountPortfolio,\n updatePortfolioStateWithDefiPositions\n} from '../../libs/selectedAccount/selectedAccount'\n// eslint-disable-next-line import/no-cycle\nimport { AccountsController } from '../accounts/accounts'\n// eslint-disable-next-line import/no-cycle\nimport { ActionsController } from '../actions/actions'\n// eslint-disable-next-line import/no-cycle\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n// eslint-disable-next-line import/no-cycle\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = {\n tokens: [],\n collections: [],\n tokenAmounts: [],\n totalBalance: 0,\n isAllReady: false,\n networkSimulatedAccountOp: {},\n latest: {},\n pending: {}\n}\n\nexport class SelectedAccountController extends EventEmitter {\n #storage: Storage\n\n #accounts: AccountsController\n\n #portfolio: PortfolioController | null = null\n\n #defiPositions: DefiPositionsController | null = null\n\n #actions: ActionsController | null = null\n\n #networks: NetworksController | null = null\n\n #providers: ProvidersController | null = null\n\n account: Account | null = null\n\n portfolio: SelectedAccountPortfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n\n portfolioStartedLoadingAtTimestamp: number | null = null\n\n dashboardNetworkFilter: NetworkId | null = null\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n defiPositions: PositionsByProvider[] = []\n\n #portfolioErrors: SelectedAccountBalanceError[] = []\n\n #defiPositionsErrors: SelectedAccountBalanceError[] = []\n\n isReady: boolean = false\n\n areControllersInitialized: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor({ storage, accounts }: { storage: Storage; accounts: AccountsController }) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n const selectedAccountAddress = await this.#storage.get('selectedAccount', null)\n\n const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress)\n\n this.account = selectedAccount || null\n this.isReady = true\n\n this.emitUpdate()\n }\n\n initControllers({\n portfolio,\n defiPositions,\n actions,\n networks,\n providers\n }: {\n portfolio: PortfolioController\n defiPositions: DefiPositionsController\n actions: ActionsController\n networks: NetworksController\n providers: ProvidersController\n }) {\n this.#portfolio = portfolio\n this.#defiPositions = defiPositions\n this.#actions = actions\n this.#networks = networks\n this.#providers = providers\n\n this.#updateSelectedAccountPortfolio(true)\n this.#updatePortfolioErrors(true)\n this.#updateSelectedAccountDefiPositions(true)\n this.#updateDefiPositionsErrors(true)\n\n this.#portfolio.onUpdate(async () => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => {\n this.#updateSelectedAccountPortfolio()\n })\n }, 'selectedAccount')\n\n this.#defiPositions.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => {\n this.#updateSelectedAccountDefiPositions()\n\n if (!this.areDefiPositionsLoading && this.portfolio.isAllReady) {\n this.#updateSelectedAccountPortfolio(true)\n this.#updateDefiPositionsErrors()\n }\n })\n })\n\n this.#providers.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => {\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.#networks.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => {\n if (!this.dashboardNetworkFilter) return\n const dashboardFilteredNetwork = this.#networks!.networks.find(\n (n) => n.id === this.dashboardNetworkFilter\n )\n\n // reset the dashboardNetworkFilter if the network is removed\n if (!dashboardFilteredNetwork) this.setDashboardNetworkFilter(null)\n })\n })\n\n this.#accounts.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => {\n this.#updateSelectedAccount()\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.areControllersInitialized = true\n\n this.emitUpdate()\n }\n\n async setAccount(account: Account | null) {\n this.account = account\n this.#portfolioErrors = []\n this.#defiPositionsErrors = []\n this.resetSelectedAccountPortfolio(true)\n this.dashboardNetworkFilter = null\n\n if (!account) {\n await this.#storage.remove('selectedAccount')\n } else {\n await this.#storage.set('selectedAccount', account.addr)\n }\n\n this.emitUpdate()\n }\n\n #updateSelectedAccount() {\n if (!this.account) return\n\n const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account!.addr)\n if (!updatedAccount) return\n\n this.account = updatedAccount\n\n this.emitUpdate()\n }\n\n resetSelectedAccountPortfolio(skipUpdate?: boolean) {\n this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n this.#portfolioErrors = []\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updateSelectedAccountPortfolio(skipUpdate?: boolean) {\n if (!this.#portfolio || !this.#defiPositions || !this.account) return\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const latestStateSelectedAccount = structuredClone(\n this.#portfolio.getLatestPortfolioState(this.account.addr)\n )\n const pendingStateSelectedAccount = structuredClone(\n this.#portfolio.getPendingPortfolioState(this.account.addr)\n )\n\n const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n latestStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n pendingStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter(\n (action) => action.type === 'accountOp'\n )\n\n const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(\n latestStateSelectedAccountWithDefiPositions,\n pendingStateSelectedAccountWithDefiPositions,\n this.portfolio,\n hasSignAccountOp\n )\n\n if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = null\n }\n\n if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = Date.now()\n }\n\n if (\n newSelectedAccountPortfolio.isAllReady ||\n (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)\n ) {\n this.portfolio = newSelectedAccountPortfolio\n this.#updatePortfolioErrors(true)\n }\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get areDefiPositionsLoading() {\n if (!this.account || !this.#defiPositions) return false\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n return Object.values(defiPositionsAccountState).some((n) => n.isLoading)\n }\n\n #updateSelectedAccountDefiPositions(skipUpdate?: boolean) {\n if (!this.#defiPositions || !this.account) return\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const positionsByProvider = Object.values(defiPositionsAccountState).flatMap(\n (n) => n.positionsByProvider\n )\n\n const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => {\n const positions = provider.positions\n .map((position) => {\n const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value))\n\n return { ...position, assets }\n })\n .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD))\n\n return { ...provider, positions }\n })\n\n const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) =>\n sortByValue(a.positionInUSD, b.positionInUSD)\n )\n\n this.defiPositions = sortedPositionsByProvider\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: () => void) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n try {\n func()\n } catch (error: any) {\n this.emitError({\n level: 'minor',\n message: `The execution of ${funcName} in SelectedAccountController failed`,\n error\n })\n }\n }, 0)\n }\n\n #updateDefiPositionsErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#defiPositions ||\n this.areDefiPositionsLoading\n ) {\n this.#defiPositionsErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const errorBanners = getNetworksWithDeFiPositionsErrorErrors({\n networks: this.#networks.networks,\n currentAccountState: defiPositionsAccountState,\n providers: this.#providers.providers,\n networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr)\n })\n\n this.#defiPositionsErrors = errorBanners\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updatePortfolioErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#portfolio ||\n !this.portfolio.isAllReady\n ) {\n this.#portfolioErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({\n providers: this.#providers.providers,\n networks: this.#networks.networks,\n networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr)\n })\n\n const errorBanners = getNetworksWithPortfolioErrorErrors({\n networks: this.#networks.networks,\n selectedAccountLatest: this.portfolio.latest,\n providers: this.#providers.providers\n })\n\n this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get balanceAffectingErrors() {\n return [...this.#portfolioErrors, ...this.#defiPositionsErrors]\n }\n\n get deprecatedSmartAccountBanner(): Banner[] {\n if (!this.account || !isSmartAccount(this.account)) return []\n\n if (\n !this.#accounts.accountStates[this.account.addr] ||\n !this.#accounts.accountStates[this.account.addr].ethereum ||\n !this.#accounts.accountStates[this.account.addr].ethereum.isV2\n )\n return []\n\n if (\n !this.account.creation ||\n getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n return []\n\n return [\n {\n id: 'old-account',\n accountAddr: this.account.addr,\n type: 'warning',\n category: 'old-account',\n title: 'Old Ambire Account',\n text: \"The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support\",\n actions: []\n }\n ]\n }\n\n setDashboardNetworkFilter(networkFilter: NetworkId | null) {\n this.dashboardNetworkFilter = networkFilter\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner,\n areDefiPositionsLoading: this.areDefiPositionsLoading,\n balanceAffectingErrors: this.balanceAffectingErrors\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/controllers/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport { AMBIRE_ACCOUNT_FACTORY } from '../../consts/deploy'\nimport { Account } from '../../interfaces/account'\nimport { Banner } from '../../interfaces/banner'\nimport { NetworkId } from '../../interfaces/network'\nimport { SelectedAccountPortfolio } from '../../interfaces/selectedAccount'\nimport { Storage } from '../../interfaces/storage'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { sortByValue } from '../../libs/defiPositions/helpers'\nimport { PositionsByProvider } from '../../libs/defiPositions/types'\n// eslint-disable-next-line import/no-cycle\nimport {\n getNetworksWithDeFiPositionsErrorErrors,\n getNetworksWithFailedRPCErrors,\n getNetworksWithPortfolioErrorErrors,\n SelectedAccountBalanceError\n} from '../../libs/selectedAccount/errors'\nimport {\n calculateSelectedAccountPortfolio,\n updatePortfolioStateWithDefiPositions\n} from '../../libs/selectedAccount/selectedAccount'\n// eslint-disable-next-line import/no-cycle\nimport { AccountsController } from '../accounts/accounts'\n// eslint-disable-next-line import/no-cycle\nimport { ActionsController } from '../actions/actions'\n// eslint-disable-next-line import/no-cycle\nimport { DefiPositionsController } from '../defiPositions/defiPositions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { NetworksController } from '../networks/networks'\n// eslint-disable-next-line import/no-cycle\nimport { PortfolioController } from '../portfolio/portfolio'\nimport { ProvidersController } from '../providers/providers'\n\nexport const DEFAULT_SELECTED_ACCOUNT_PORTFOLIO = {\n tokens: [],\n collections: [],\n tokenAmounts: [],\n totalBalance: 0,\n isReadyToVisualize: false,\n isAllReady: false,\n networkSimulatedAccountOp: {},\n latest: {},\n pending: {}\n}\n\nexport class SelectedAccountController extends EventEmitter {\n #storage: Storage\n\n #accounts: AccountsController\n\n #portfolio: PortfolioController | null = null\n\n #defiPositions: DefiPositionsController | null = null\n\n #actions: ActionsController | null = null\n\n #networks: NetworksController | null = null\n\n #providers: ProvidersController | null = null\n\n account: Account | null = null\n\n portfolio: SelectedAccountPortfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n\n portfolioStartedLoadingAtTimestamp: number | null = null\n\n dashboardNetworkFilter: NetworkId | null = null\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n defiPositions: PositionsByProvider[] = []\n\n #portfolioErrors: SelectedAccountBalanceError[] = []\n\n #defiPositionsErrors: SelectedAccountBalanceError[] = []\n\n isReady: boolean = false\n\n areControllersInitialized: boolean = false\n\n // Holds the initial load promise, so that one can wait until it completes\n initialLoadPromise: Promise\n\n constructor({ storage, accounts }: { storage: Storage; accounts: AccountsController }) {\n super()\n\n this.#storage = storage\n this.#accounts = accounts\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initialLoadPromise = this.#load()\n }\n\n async #load() {\n await this.#accounts.initialLoadPromise\n const selectedAccountAddress = await this.#storage.get('selectedAccount', null)\n\n const selectedAccount = this.#accounts.accounts.find((a) => a.addr === selectedAccountAddress)\n\n this.account = selectedAccount || null\n this.isReady = true\n\n this.emitUpdate()\n }\n\n initControllers({\n portfolio,\n defiPositions,\n actions,\n networks,\n providers\n }: {\n portfolio: PortfolioController\n defiPositions: DefiPositionsController\n actions: ActionsController\n networks: NetworksController\n providers: ProvidersController\n }) {\n this.#portfolio = portfolio\n this.#defiPositions = defiPositions\n this.#actions = actions\n this.#networks = networks\n this.#providers = providers\n\n this.#updateSelectedAccountPortfolio(true)\n this.#updatePortfolioErrors(true)\n this.#updateSelectedAccountDefiPositions(true)\n this.#updateDefiPositionsErrors(true)\n\n this.#portfolio.onUpdate(async () => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountPortfolio', () => {\n this.#updateSelectedAccountPortfolio()\n })\n }, 'selectedAccount')\n\n this.#defiPositions.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccountDefiPositions', () => {\n this.#updateSelectedAccountDefiPositions()\n\n if (!this.areDefiPositionsLoading) {\n this.#updateSelectedAccountPortfolio(true)\n this.#updateDefiPositionsErrors()\n }\n })\n })\n\n this.#providers.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateDefiPositionsErrors', () => {\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.#networks.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('resetDashboardNetworkFilterIfNeeded', () => {\n if (!this.dashboardNetworkFilter) return\n const dashboardFilteredNetwork = this.#networks!.networks.find(\n (n) => n.id === this.dashboardNetworkFilter\n )\n\n // reset the dashboardNetworkFilter if the network is removed\n if (!dashboardFilteredNetwork) this.setDashboardNetworkFilter(null)\n })\n })\n\n this.#accounts.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateSelectedAccount', () => {\n this.#updateSelectedAccount()\n this.#updatePortfolioErrors(true)\n this.#updateDefiPositionsErrors()\n })\n })\n\n this.areControllersInitialized = true\n\n this.emitUpdate()\n }\n\n async setAccount(account: Account | null) {\n this.account = account\n this.#portfolioErrors = []\n this.#defiPositionsErrors = []\n this.resetSelectedAccountPortfolio(true)\n this.dashboardNetworkFilter = null\n this.portfolioStartedLoadingAtTimestamp = null\n\n if (!account) {\n await this.#storage.remove('selectedAccount')\n } else {\n await this.#storage.set('selectedAccount', account.addr)\n }\n\n this.emitUpdate()\n }\n\n #updateSelectedAccount() {\n if (!this.account) return\n\n const updatedAccount = this.#accounts.accounts.find((a) => a.addr === this.account!.addr)\n if (!updatedAccount) return\n\n this.account = updatedAccount\n\n this.emitUpdate()\n }\n\n resetSelectedAccountPortfolio(skipUpdate?: boolean) {\n this.portfolio = DEFAULT_SELECTED_ACCOUNT_PORTFOLIO\n this.#portfolioErrors = []\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updateSelectedAccountPortfolio(skipUpdate?: boolean) {\n if (!this.#portfolio || !this.#defiPositions || !this.account) return\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const latestStateSelectedAccount = structuredClone(\n this.#portfolio.getLatestPortfolioState(this.account.addr)\n )\n const pendingStateSelectedAccount = structuredClone(\n this.#portfolio.getPendingPortfolioState(this.account.addr)\n )\n\n const latestStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n latestStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const pendingStateSelectedAccountWithDefiPositions = updatePortfolioStateWithDefiPositions(\n pendingStateSelectedAccount,\n defiPositionsAccountState,\n this.areDefiPositionsLoading\n )\n\n const hasSignAccountOp = !!this.#actions?.visibleActionsQueue.filter(\n (action) => action.type === 'accountOp'\n )\n\n const newSelectedAccountPortfolio = calculateSelectedAccountPortfolio(\n latestStateSelectedAccountWithDefiPositions,\n pendingStateSelectedAccountWithDefiPositions,\n this.portfolio,\n this.portfolioStartedLoadingAtTimestamp,\n defiPositionsAccountState,\n hasSignAccountOp\n )\n\n if (this.portfolioStartedLoadingAtTimestamp && newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = null\n }\n\n if (!this.portfolioStartedLoadingAtTimestamp && !newSelectedAccountPortfolio.isAllReady) {\n this.portfolioStartedLoadingAtTimestamp = Date.now()\n }\n\n if (\n newSelectedAccountPortfolio.isReadyToVisualize ||\n (!this.portfolio?.tokens?.length && newSelectedAccountPortfolio.tokens.length)\n ) {\n this.portfolio = newSelectedAccountPortfolio\n this.#updatePortfolioErrors(true)\n }\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get areDefiPositionsLoading() {\n if (!this.account || !this.#defiPositions) return false\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n return Object.values(defiPositionsAccountState).some((n) => n.isLoading)\n }\n\n #updateSelectedAccountDefiPositions(skipUpdate?: boolean) {\n if (!this.#defiPositions || !this.account) return\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const positionsByProvider = Object.values(defiPositionsAccountState).flatMap(\n (n) => n.positionsByProvider\n )\n\n const positionsByProviderWithSortedAssets = positionsByProvider.map((provider) => {\n const positions = provider.positions\n .map((position) => {\n const assets = position.assets.sort((a, b) => sortByValue(a.value, b.value))\n\n return { ...position, assets }\n })\n .sort((a, b) => sortByValue(a.additionalData.positionInUSD, b.additionalData.positionInUSD))\n\n return { ...provider, positions }\n })\n\n const sortedPositionsByProvider = positionsByProviderWithSortedAssets.sort((a, b) =>\n sortByValue(a.positionInUSD, b.positionInUSD)\n )\n\n this.defiPositions = sortedPositionsByProvider\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: () => void) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n try {\n func()\n } catch (error: any) {\n this.emitError({\n level: 'minor',\n message: `The execution of ${funcName} in SelectedAccountController failed`,\n error\n })\n }\n }, 0)\n }\n\n #updateDefiPositionsErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#defiPositions ||\n this.areDefiPositionsLoading\n ) {\n this.#defiPositionsErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const defiPositionsAccountState = this.#defiPositions.getDefiPositionsState(this.account.addr)\n\n const errorBanners = getNetworksWithDeFiPositionsErrorErrors({\n networks: this.#networks.networks,\n currentAccountState: defiPositionsAccountState,\n providers: this.#providers.providers,\n networksWithPositions: this.#defiPositions.getNetworksWithPositions(this.account.addr)\n })\n\n this.#defiPositionsErrors = errorBanners\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n #updatePortfolioErrors(skipUpdate?: boolean) {\n if (\n !this.account ||\n !this.#networks ||\n !this.#providers ||\n !this.#portfolio ||\n !this.portfolio.isReadyToVisualize\n ) {\n this.#portfolioErrors = []\n if (!skipUpdate) {\n this.emitUpdate()\n }\n return\n }\n\n const networksWithFailedRPCBanners = getNetworksWithFailedRPCErrors({\n providers: this.#providers.providers,\n networks: this.#networks.networks,\n networksWithAssets: this.#portfolio.getNetworksWithAssets(this.account.addr)\n })\n\n const errorBanners = getNetworksWithPortfolioErrorErrors({\n networks: this.#networks.networks,\n selectedAccountLatest: this.portfolio.latest,\n providers: this.#providers.providers\n })\n\n this.#portfolioErrors = [...networksWithFailedRPCBanners, ...errorBanners]\n\n if (!skipUpdate) {\n this.emitUpdate()\n }\n }\n\n get balanceAffectingErrors() {\n return [...this.#portfolioErrors, ...this.#defiPositionsErrors]\n }\n\n get deprecatedSmartAccountBanner(): Banner[] {\n if (!this.account || !isSmartAccount(this.account)) return []\n\n if (\n !this.#accounts.accountStates[this.account.addr] ||\n !this.#accounts.accountStates[this.account.addr].ethereum ||\n !this.#accounts.accountStates[this.account.addr].ethereum.isV2\n )\n return []\n\n if (\n !this.account.creation ||\n getAddress(this.account.creation.factoryAddr) === AMBIRE_ACCOUNT_FACTORY\n )\n return []\n\n return [\n {\n id: 'old-account',\n accountAddr: this.account.addr,\n type: 'warning',\n category: 'old-account',\n title: 'Old Ambire Account',\n text: \"The account you are using is an old Ambire Account that was intended for testing the extension only. Fee options aren't available on custom networks. It won't be supported in the future. Please migrate to another by creating a new smart account in the extension or contact the team for support\",\n actions: []\n }\n ]\n }\n\n setDashboardNetworkFilter(networkFilter: NetworkId | null) {\n this.dashboardNetworkFilter = networkFilter\n this.emitUpdate()\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n deprecatedSmartAccountBanner: this.deprecatedSmartAccountBanner,\n areDefiPositionsLoading: this.areDefiPositionsLoading,\n balanceAffectingErrors: this.balanceAffectingErrors\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js b/dist/src/controllers/signAccountOp/signAccountOp.js index 9b72100c5..169935b92 100644 --- a/dist/src/controllers/signAccountOp/signAccountOp.js +++ b/dist/src/controllers/signAccountOp/signAccountOp.js @@ -237,7 +237,7 @@ class SignAccountOpController extends eventEmitter_1.default { balance += networkPortfolio.result.total.usd; }); if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) { - errors.push("Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account"); + errors.push('Your account must have a minimum overall balance of $10 to pay for gas via the Gas Tank. Please add funds to your account or choose another fee payment option.'); } return errors; } diff --git a/dist/src/controllers/signAccountOp/signAccountOp.js.map b/dist/src/controllers/signAccountOp/signAccountOp.js.map index 20f09a86f..123f53692 100644 --- a/dist/src/controllers/signAccountOp/signAccountOp.js.map +++ b/dist/src/controllers/signAccountOp/signAccountOp.js.map @@ -1 +1 @@ -{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":";;;;AAAA,mCAQe;AAEf,gHAA0E;AAC1E,kGAA2D;AAC3D,sDAAsD;AAEtD,gDAA+C;AAC/C,yCAAyC;AACzC,4EAA+F;AAC/F,wDAIuC;AAKvC,wDAAoF;AACpF,8DAA2F;AAG3F,8DAA0E;AAE1E,2DAKqC;AACrC,2DAAgE;AAEhE,oEAAoG;AACpG,8DAA2D;AAC3D,0EAQ+C;AAC/C,6EAAyE;AAKzE,wFAAuD;AAGvD,qCAKiB;AAEjB,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB,qDAAoC,CAAA;IACpC,gDAA+B,CAAA;IAC/B,8CAA6B,CAAA;IAC7B;;;OAGG;IACH,iDAAgC,CAAA;IAChC,2CAA0B,CAAA;IAC1B,uEAAsD,CAAA;IACtD,8BAAa,CAAA;AACf,CAAC,EAZW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAYxB;AAOD,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,6BAAiB,CAAA;IACjB,yBAAa,CAAA;IACb,uBAAW,CAAA;AACb,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAYD,sDAAsD;AACzC,QAAA,qBAAqB,GAAG;IACnC,aAAa,CAAC,UAAU;IACxB,aAAa,CAAC,IAAI;IAClB,aAAa,CAAC,aAAa;IAC3B,aAAa,CAAC,mBAAmB;CAClC,CAAA;AAED,MAAa,uBAAwB,SAAQ,sBAAY;IACvD,SAAS,CAAoB;IAE7B,SAAS,CAAoB;IAE7B,UAAU,CAAqB;IAE/B,0BAA0B,CAA2B;IAErD,OAAO,CAAS;IAEhB,QAAQ,CAAS;IAEjB,cAAc,GAAuB,SAAS,CAAA;IAE9C,YAAY,CAAuB;IAEnC,SAAS,CAAW;IAEpB,SAAS,GAA+B,IAAI,CAAA;IAE5C,gBAAgB,GAAqB,IAAI,CAAA;IAEzC,UAAU,GAA0B,IAAI,CAAA;IAExC,SAAS,GAEL,EAAE,CAAA;IAEN,MAAM,GAAkB,IAAI,CAAA;IAE5B,cAAc,GAAuB,IAAI,CAAA;IAEzC,gBAAgB,GAAa,QAAQ,CAAC,IAAI,CAAA;IAE1C,cAAc,GAAiC,SAAS,CAAA;IAExD,MAAM,GAAkB,IAAI,CAAA;IAE5B,cAAc,CAAS;IAEvB,oBAAoB,CAAS;IAE7B,WAAW,CAAU;IAErB,yBAAyB,CAAU;IAEnC,aAAa,CAA8C;IAE3D,eAAe,CAAkB;IAEjC,iBAAiB,CAAS;IAE1B,QAAQ,GAAc,EAAE,CAAA;IAExB,4DAA4D;IAC5D,WAAW,GAAY,KAAK,CAAA;IAE5B,2CAA2C;IAC3C,OAAO,GAAwB,SAAS,CAAA;IAExC,eAAe,CAAiB;IAEhC,YACE,QAA4B,EAC5B,QAA4B,EAC5B,SAA8B,EAC9B,yBAAoD,EACpD,OAAgB,EAChB,OAAgB,EAChB,YAAmC,EACnC,SAAoB,EACpB,UAAoB,EACpB,wBAAkC;QAElC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,0BAA0B,GAAG,yBAAyB,CAAA;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;QAC7B,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAA;QAEzD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAC3B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,iCAAe,CACxC,OAAO,EACP,GAAG,EAAE;YACH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9C,CAAC,EACD,6BAAqB,CACtB,CAAA;IACH,CAAC;IAED,IAAI,aAAa;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;IAC1B,CAAC;IAED,YAAY;QACV,2CAA2C;QAC3C,gHAAgH;QAChH,8CAA8C;QAC9C,uGAAuG;QACvG,sHAAsH;QACtH,oHAAoH;QACpH,uFAAuF;QACvF,4GAA4G;QAC5G,IACE,IAAI,CAAC,mBAAmB,CAAC,MAAM;YAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAClE;YACA,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAChE,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;SACjE;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrF,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;SACxD;IACH,CAAC;IAED,mDAAmD;IACnD,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,CAAA;IACtF,CAAC;IAED,8BAA8B;QAC5B,4EAA4E;QAC5E,0CAA0C;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,IAAI,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAA;QAE/E,MAAM,kBAAkB,GAAG,IAAA,8BAAmB,EAC5C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAClF,IAAI,CAAC,QAAQ,CACd,CAAA;QACD,MAAM,cAAc,GAAG,MAAM,CAAA;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG,SAAS,GAAG,EAAE,GAAG,YAAY,GAAG,GAAG,CAAA;QACrD,OAAO,SAAS,GAAG,cAAc,CAAA;IACnC,CAAC;IAED,IAAI,MAAM;QACR,MAAM,MAAM,GAAa,EAAE,CAAA;QAE3B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,MAAM,CAAA;QAEtC,MAAM,UAAU,GAAG,IAAA,iCAAuB,EAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC/E,MAAM,gCAAgC,GAAG,UAAU,IAAI,CAAC,IAAA,4BAAiB,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAExF,sCAAsC;QACtC,IAAI,gCAAgC,EAAE;YACpC,MAAM,CAAC,IAAI,CACT,iQAAiQ,CAClQ,CAAA;YAED,8BAA8B;YAC9B,OAAO,MAAM,CAAA;SACd;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SAC3C;QAED,IACE,IAAI,CAAC,UAAU,EAAE,OAAO;YACxB,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC,cAAc,EAC9C;YACA,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;SAChF;QAED,IACE,IAAI,CAAC,QAAQ,CAAC,UAAU;YACxB,IAAI,CAAC,UAAU,EAAE,OAAO;YACxB,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,EACrC;YACA,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;SACjF;QAED,6FAA6F;QAC7F,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM;YACvD,MAAM,CAAC,IAAI,CAAC,sBAAM,CAAC,oBAAoB,CAAC,CAAA;QAE1C,gGAAgG;QAChG,uDAAuD;QACvD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc;YAClE,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAEhE,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC5F,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAE1E,MAAM,6BAA6B,GAAG,uBAAuB,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAChF,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,4CAA4C,CAC1E,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,6BAA6B;YACrD,MAAM,CAAC,IAAI,CACT,yIAAyI,CAC1I,CAAA;QAEH,wEAAwE;QACxE,2EAA2E;QAC3E,IACE,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;YAC7B,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,cAAc,EACnB;YACA,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;SAC9E;QAED,IACE,CAAC,IAAI,CAAC,WAAW;YACjB,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,SAAS,CAAC,aAAa;YAC5B,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EACzE;YACA,MAAM,aAAa,GAAG,EAAE,CAAA;YACxB,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBAC9B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC3C,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM;wBAC5E,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAClC,CAAC,CAAC,CAAA;aACH;YAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CACT,IAAA,wBAAc,EAAC,IAAI,CAAC,OAAO,CAAC;oBAC1B,CAAC,CAAC,6HAA6H;oBAC/H,CAAC,CAAC,sBAAM,CAAC,oBAAoB,CAChC,CAAA;aACF;iBAAM;gBACL,MAAM,CAAC,IAAI,CACT,8FAA8F,CAC/F,CAAA;aACF;SACF;QAED,iFAAiF;QACjF,qCAAqC;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1E,kFAAkF;YAClF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;SAC/B;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvE,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE;oBACxC,MAAM,CAAC,IAAI,CACT,cAAc,IAAI,CAAC,cAAc,EAAE,MAAM,4HAA4H,CACtK,CAAA;iBACF;qBAAM;oBACL,MAAM,CAAC,IAAI,CACT,+FAA+F,CAChG,CAAA;iBACF;aACF;SACF;QAED,+EAA+E;QAC/E,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACpD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACtD,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;gBAAE,OAAM;YAEjD,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAA;QAC9C,CAAC,CAAC,CAAA;QACF,IAAI,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE;YAC1F,MAAM,CAAC,IAAI,CACT,yFAAyF,CAC1F,CAAA;SACF;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,WAAW;QACb,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,MAAM;YACb,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,WAAW;gBAC9C,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,aAAa,CAAC,CACrD,CAAA;IACH,CAAC;IAED,iBAAiB;QACf,MAAM,QAAQ,GAAc,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACvF,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAEzF,MAAM,iCAAiC,GAAG,IAAA,6CAAoC,EAC5E,WAAW,EACX,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,SAAS,CACzB,CAAA;QAED,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxF,MAAM,+BAA+B,GAAG,IAAA,2CAAkC,EACxE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAC5B,gBAAgB,CACjB,CAAA;YAED,oDAAoD;YACpD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,+BAA+B;gBACtD,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;SACjD;QAED,IAAI,iCAAiC;YAAE,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QAEvF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACL,cAAc,EACd,cAAc,EACd,KAAK,EACL,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,aAAa,EAcd;QACC,6DAA6D;QAC7D,iDAAiD;QACjD,sEAAsE;QACtE,kFAAkF;QAClF,yEAAyE;QACzE,4EAA4E;QAC5E,0BAA0B;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,6BAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChF,OAAM;SACP;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;QAEtD,IAAI,aAAa;YAAE,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QAEtD,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAEzC,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAA;YAC9F,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;YAC5B,0DAA0D;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;SAC9D;QAED,2DAA2D;QAC3D,gDAAgD;QAChD,IAAI,UAAU,KAAK,IAAI;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAE/C,IAAI,QAAQ,IAAI,MAAM,EAAE;YACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;YACpB,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAA;SAC/B;QAED,IAAI,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE;YAC/B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAA;SAC9B;QAED,IAAI,cAAc,IAAI,cAAc,IAAI,IAAI,CAAC,aAAa,EAAE;YAC1D,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,cAAc,CAAA;YAC9C,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,cAAc,CAAA;SAC/C;QAED,IAAI,oBAAoB,KAAK,SAAS;YAAE,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAExF,8BAA8B;QAC9B,IAAI,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAErD,2DAA2D;QAC3D,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;YACzD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACjD,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;gBAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,cAAe,CAAC,OAAO;gBACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE;oBACrC,IAAI,CAAC,cAAe,CAAC,MAAM,CAAC,iBAAiB,EAAE;gBACjD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,SAAS,CACxE,CAAA;SACF;QAED,sDAAsD;QACtD,IACE,IAAI,CAAC,UAAU,EAAE,gBAAgB;YACjC,gBAAgB;YAChB,gBAAgB,CAAC,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EACxE;YACA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAA;SACpE;QAED,IACE,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,UAAU,CAAC,gBAAgB;YAChC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAC1C;YACA,2DAA2D;YAC3D,uEAAuE;YACvE,kDAAkD;YAClD,MAAM,qBAAqB,GACzB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YAE/E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YAC3E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAA;YAEtF,IAAI,qBAAqB,EAAE;gBACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM;oBACnD,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAC7B,CAAC,CAAC,SAAS,CAAA;aACd;SACF;QAED,4DAA4D;QAC5D,+CAA+C;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,IAAI,UAAU,EAAE;YAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAA;SACxB;QAED,qFAAqF;QACrF,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC,YAAY,EAAE,CAAA;QACnB,IAAI,CAAC,iBAAiB,EAAE,CAAA;IAC1B,CAAC;IAED,YAAY,CAAC,iBAAiC,EAAE,iBAAiB,GAAG,KAAK;QACvE,0EAA0E;QAC1E,IAAI,iBAAiB,EAAE;YACrB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAA;YACzC,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;SACP;QAED,iCAAiC;QACjC,MAAM,sBAAsB,GAC1B,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,UAAU;YAC9C,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,mBAAmB,CAAA;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,IAAI,CAAA;QACvD,IAAI,sBAAsB,IAAI,MAAM;YAAE,OAAM;QAE5C,8DAA8D;QAC9D,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;YAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,eAAe,EAAE,CAAA;YACrD,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;SACP;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,YAAY,EAAE,CAAA;YAClD,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;SACP;QAED,IACE,IAAI,CAAC,aAAa;YAClB,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,SAAS,EAAE,cAAc;YAC9B,IAAI,CAAC,SAAS,EAAE,cAAc;YAC9B,IAAI,CAAC,SAAS,EAAE,aAAa;YAC7B,6DAA6D;YAC7D,0CAA0C;YAC1C,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,oBAAoB,CAAC,EACnD;YACA,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,CAAA;YAEjD,mCAAmC;YACnC,IAAI,iBAAiB;gBAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;YACjE,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;SACP;QAED,kDAAkD;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAA;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACH,yBAAyB,CAAC,QAAqB;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU;aAC3B,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CACnD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,4CAA4C,CAC1E,CAAA;QACH,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,8GAA8G;QAC9G,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS;YAChF,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAEzB,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAA;QAE5D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;QACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;QAEzD,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAA;QAE/C,MAAM,KAAK,GAAG,WAAW,GAAG,aAAa,CAAA;QAEzC,uEAAuE;QACvE,4GAA4G;QAC5G,0FAA0F;QAC1F,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAA;QAC9B,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACvE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,CAAC,6BAA6B,CAClC,iBAAyB,EACzB,QAAgB,EAChB,WAAmB,EACnB,gBAAwB,EACxB,WAAmB;QAEnB,MAAM,WAAW,GAAG,iBAAiB,GAAG,QAAQ,GAAG,WAAW,CAAA;QAE9D,uEAAuE;QACvE,gFAAgF;QAChF,0CAA0C;QAC1C,yFAAyF;QACzF,+IAA+I;QAC/I,8LAA8L;QAC9L,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QACtC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAA;QACnE,MAAM,GAAG,GAAG,aAAa,GAAG,qBAAqB,CAAA;QACjD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,CAAA;IAC1C,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE;YACzC,OAAO,MAAM,CAAA;SACd;QAED,OAAO,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;IACxE,CAAC;IAED;;;;;;;;;OASG;IACH,YAAY,CACV,KAAa,EACb,aAAqB,EACrB,eAAoD,EACpD,SAA2B;QAE3B,8BAA8B;QAC9B,MAAM,OAAO,GAAG,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvE,iEAAiE;QACjE,iDAAiD;QACjD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACvE,MAAM,qBAAqB,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QACvF,MAAM,GAAG,GAAG,qBAAqB,GAAG,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa,CAAA;QAEzF,wDAAwD;QACxD,oEAAoE;QACpE,+CAA+C;QAC/C,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE;YACxF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,SAAS,CAAA;YAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;YAC5E,OAAO,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAA;SACvC;QAED,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC;YACzE,OAAO,aAAa,CAAA;QAEtB,mEAAmE;QACnE,iDAAiD;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,CAAA;QACzD,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;QAC1E,OAAO,GAAG,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAA;IACxE,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;IAC/C,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAM;QAElC,8DAA8D;QAC9D,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAW,CAAC,OAAO,CAAA;QAExC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1C,uDAAuD;YACvD,4DAA4D;YAC5D,EAAE;YACF,uDAAuD;YACvD,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,MAAM,EACN,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAClC,CAAA;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBAC9B,OAAM;aACP;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAChE,IAAI,CAAC,WAAW,EAAE;gBAChB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;gBAC/B,OAAM;aACP;YAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAA;YAC1D,IAAI,gBAAgB,EAAE;gBACpB,MAAM,MAAM,GAAgB,EAAE,CAAA;gBAC9B,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAA;gBAE/E,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;oBAC3E,MAAM,iBAAiB,GACrB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;wBACrC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;wBAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;oBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;oBAChD,IAAI,MAAM,GAAG,uBAAuB,CAAC,6BAA6B,CAChE,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,MAAM,CAAC,KAAK,CAAC,QAAQ,EACrB,EAAE,CACH,CAAA;oBACD,IAAI,aAAa;wBAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;oBAErD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,KAAiB;wBACvB,iBAAiB;wBACjB,MAAM;wBACN,eAAe,EAAE,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBACnE,SAAS,EAAE,IAAA,0BAAiB,EAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;wBAClD,QAAQ;wBACR,oBAAoB,EAAE,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC;qBAC9D,CAAC,CAAA;iBACH;gBAED,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;gBAC7E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;gBACnC,OAAM;aACP;YAED,CAAC;YAAA,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE;gBACvD,IAAI,MAAM,CAAA;gBACV,IAAI,iBAAiB,CAAA;gBACrB,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM;oBAC7D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnC,CAAC,CAAC,IAAI,CAAA;gBAEV,gFAAgF;gBAChF,iFAAiF;gBACjF,kEAAkE;gBAClE,kFAAkF;gBAClF,+EAA+E;gBAC/E,oFAAoF;gBACpF,sCAAsC;gBACtC,mDAAmD;gBACnD,kGAAkG;gBAClG,MAAM,oBAAoB,GACxB,sBAAsB,IAAI,iBAAiB;oBACzC,CAAC,CAAC,IAAI,CAAC,YAAY,CACf,MAAM,CAAC,MAAM,EACb,iBAAiB,CAAC,oBAAoB,EACtC,sBAAsB,EACtB,SAAS,CACV;oBACH,CAAC,CAAC,SAAS,CAAA;gBAEf,MAAM,QAAQ,GACZ,sBAAsB,IAAI,iBAAiB;oBACzC,CAAC,CAAE,iBAA2C,CAAC,aAAa,GAAG,oBAAqB;oBACpF,CAAC,CAAC,IAAI,CAAC,YAAY,CACf,MAAM,CAAC,MAAM,EACZ,iBAA4C,CAAC,QAAQ,EACtD,UAAU,EACV,SAAS,CACV,CAAA;gBAEP,MAAM;gBACN,IAAI,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACjC,iBAAiB,GAAG,OAAO,CAAA;oBAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAA,mBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAS,EAAE;wBACtF,iBAAiB,GAAG,IAAA,sBAAU,EAAC,iBAAiB,CAAC,CAAA;qBAClD;oBAED,MAAM,GAAG,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAA;iBAC3D;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;oBACvD,sCAAsC;oBACtC,iBAAiB,GAAG,OAAO,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAA;oBACnE,MAAM,GAAG,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAA;iBAC3D;qBAAM;oBACL,UAAU;oBACV,iBAAiB,GAAG,OAAO,GAAG,IAAI,CAAC,8BAA8B,EAAE,GAAG,MAAM,CAAC,OAAQ,CAAA;oBACrF,MAAM,GAAG,uBAAuB,CAAC,6BAA6B,CAC5D,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,MAAM,CAAC,KAAK,CAAC,QAAQ,EACrB,MAAM,CAAC,WAAW,CACnB,CAAA;oBACD,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;iBACnC;gBAED,MAAM,QAAQ,GAAc;oBAC1B,IAAI,EAAE,iBAAiB,CAAC,IAAgB;oBACxC,iBAAiB;oBACjB,MAAM;oBACN,eAAe,EAAE,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACnE,SAAS,EAAE,IAAA,0BAAiB,EAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;oBAClD,QAAQ;oBACR,oBAAoB;iBACrB,CAAA;gBACD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;gBAC7E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,OAAO;gBACd,OAAO,EACL,kLAAkL;gBACpL,KAAK,EAAE,IAAI,KAAK,CACd,wGAAwG,CACzG;aACF,CAAC,CAAA;YAEF,OAAO,IAAI,CAAA;SACZ;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,IAAI,KAAK,CAAC,sDAAsD,CAAC;aACzE,CAAC,CAAA;YAEF,OAAO,IAAI,CAAA;SACZ;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,IAAI,KAAK,CAAC,iDAAiD,CAAC;aACpE,CAAC,CAAA;YAEF,OAAO,IAAI,CAAA;SACZ;QAED,8DAA8D;QAC9D,iDAAiD;QACjD,qDAAqD;QACrD,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YACpC,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,IAAI,KAAK,CAAC,kDAAkD,CAAC;aACrE,CAAC,CAAA;YAEF,OAAO,IAAI,CAAA;SACZ;QAED,gEAAgE;QAChE,mEAAmE;QACnE,qEAAqE;QACrE,kBAAkB;QAClB,4DAA4D;QAC5D,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;YACtC,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CACjD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAChD,CAAA;QACD,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,IAAI,KAAK,CAAC,iDAAiD,CAAC;aACpE,CAAC,CAAA;YAEF,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,YAAY,GAChB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACpF,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,4DAA4D;YAC5D,4CAA4C;YAC5C,SAAS,EACP,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW;gBAC1C,IAAA,kCAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;YAC/D,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS;YAC9C,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO;YACpC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS;YAChD,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;YAChD,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,oBAAoB,EAClB,sBAAsB,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS;SACvF,CAAA;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,IAAI,IAAI,CAAA;IACvD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,IAAI,CAAA;IACtD,CAAC;IAED,IAAI,mBAAmB;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAA;QAE/B,yDAAyD;QACzD,4BAA4B;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CACnD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,CACvD,CAAA;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;SAC9B;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAC1D,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,CACzC,CAAA;QACD,IAAI,WAAW,CAAC,MAAM;YAAE,OAAO,WAAW,CAAA;QAE1C,qEAAqE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CACnD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,CACvD,CAAA;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/B,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,kDAAkD;IAClD,IAAI,YAAY;QACd,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAa,CAAA;IAC5C,CAAC;IAED,IAAI,WAAW;QACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAE5D,MAAM,UAAU,GAAG,IAAA,8BAAqB,EACtC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAC/C,CAAA;QACD,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAC1D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAChD,CAAA;QACD,MAAM,QAAQ,GAAG,oBAAoB,EAAE,QAAQ,CAAA;QAC/C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAE1B,8DAA8D;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU;aAC3B,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CACnD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,4CAA4C,CAC1E,CAAA;QACH,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,KAAK,CAAA;QACvF,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QAE7B,wDAAwD;QACxD,mEAAmE;QACnE,MAAM,qBAAqB,GACzB,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,EAAE;YAC7D,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO;YAC7B,CAAC,CAAC,gCAA0B,CAAA;QAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,CAAA;QAC1E,MAAM,aAAa,GACjB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAClF,EAAE,OAAO,IAAI,iCAA2B,CAAA;QAC3C,MAAM,YAAY,GAChB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,oBAAW,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAClF,EAAE,OAAO,IAAI,gCAA0B,CAAA;QAE1C,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAA;QAC7E,MAAM,gBAAgB,GAAG,IAAA,oBAAW,EAAC,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAA;QAEhG,OAAO,MAAM,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAA;IAC/C,CAAC;IAED,sCAAsC,CAAC,KAAa;QAClD,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3E,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,CAAA;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED,cAAc;QACZ,wFAAwF;QACxF,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAA;QAE/B,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG;gBACvB,EAAE,EAAE,yBAAa;gBACjB,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;aAChF,CAAA;YAED,OAAM;SACP;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,SAAS,EAAE;YAC3C,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG;gBACvB,EAAE,EAAE,yBAAa;gBACjB,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,QAAQ,CAAC,MAAM,CACnB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC/B,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAC/E;aACF,CAAA;YAED,OAAM;SACP;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,OAAO,KAAK,4CAA4C,EAAE;YAC1F,iBAAiB;YACjB,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG;gBACvB,EAAE,EAAE,yBAAa;gBACjB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,MAAM;gBAC3C,IAAI,EAAE,IAAI;aACX,CAAA;SACF;aAAM;YACL,gBAAgB;YAChB,MAAM,cAAc,GAAG,IAAI,kBAAS,CAAC,qBAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG;gBACvB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,OAAO;gBACzC,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,cAAc,CAAC,kBAAkB,CAAC,UAAU,EAAE;oBAClD,yBAAa;oBACb,IAAI,CAAC,SAAS,CAAC,aAAc,CAAC,MAAM;iBACrC,CAAC;aACH,CAAA;SACF;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,OAAO,GAAG,iHAAiH,4CAA4B,EAAE,CAAA;YAC/J,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;SAC5D;QAED,6EAA6E;QAC7E,qEAAqE;QACrE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,EAAE,CAAA;QAEhD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE;YACtE,MAAM,OAAO,GAAG,oHAAoH,4CAA4B,EAAE,CAAA;YAClK,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;SAC5D;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1D,MAAM,OAAO,GAAG,iIAAiI,4CAA4B,EAAE,CAAA;YAC/K,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;SAC5D;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAC3C,IAAI,CAAC,SAAS,CAAC,cAAc,EAC7B,IAAI,CAAC,SAAS,CAAC,cAAc,CAC9B,CAAA;QACD,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,OAAO,GAAG,oHAAoH,4CAA4B,EAAE,CAAA;YAClK,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;SAC5D;QAED,MAAM,YAAY,GAChB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACpF,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAA;QAClF,MAAM,gBAAgB,GAAG,IAAA,qCAAqB,EAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;YACnF,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,mBAAmB,EAAE,CAAA;SAC1D;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,EAAE,CAAA;SACjD;QAED,+EAA+E;QAC/E,0EAA0E;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAA;QAElD,IAAI,MAAM,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;QAE5F,8DAA8D;QAC9D,mEAAmE;QACnE,qDAAqD;QACrD,sCAAsC;QACtC,6BAA6B;QAC7B,gCAAgC;QAChC,oEAAoE;QACpE,uDAAuD;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAA;QAE7B,wEAAwE;QACxE,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAA;QAEnC,yBAAyB;QACzB,6DAA6D;QAC7D,8BAA8B;QAC9B,IACE,IAAA,0CAA0B,EACxB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CACvC,EACD;YACA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAA,gCAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;SAC5E;QAED,IAAI;YACF,yBAAyB;YACzB,IAAI,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBACjC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;oBACvE,MAAM,OAAO,GAAG,iDAAiD,SAAS,WAAW,4CAA4B,EAAE,CAAA;oBACnH,OAAO,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;iBAC5D;gBAED,oDAAoD;gBACpD,2DAA2D;gBAC3D,sDAAsD;gBACtD,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAA;aAChC;iBAAM,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACpE,sCAAsC;gBACtC,uCAAuC;gBAEvC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,IAAA,iCAAmB,EAClD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,EACd,YAAY,EACZ,MAAM,CACP,CAAA;aACF;iBAAM,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE;gBACjD,2DAA2D;gBAC3D,IACE,CAAC,YAAY,CAAC,UAAU;oBACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC;oBAEtE,OAAO,IAAI,CAAC,sCAAsC,CAChD,mFAAmF,4CAA4B,EAAE,CAClH,CAAA;gBAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAW,CAAC,gBAAoC,CAAA;gBAE/E,MAAM,aAAa,GAAG,IAAA,gCAAgB,EACpC,IAAI,CAAC,OAAO,EACZ,YAAY,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAC3C,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CACpF,CAAA;gBACD,aAAa,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,CAAA;gBACvE,aAAa,CAAC,YAAY,GAAG,IAAA,gBAAO,EAClC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC,CAC7E,CAAA;gBACD,aAAa,CAAC,oBAAoB,GAAG,iBAAiB,CAAC,oBAAoB,CAAA;gBAC3E,aAAa,CAAC,6BAA6B;oBACzC,iBAAiB,CAAC,6BAA6B,CAAA;gBACjD,aAAa,CAAC,uBAAuB,GAAG,iBAAiB,CAAC,uBAAuB,CAAA;gBACjF,aAAa,CAAC,YAAY,GAAG,IAAA,gBAAO,EAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;gBAC5D,aAAa,CAAC,oBAAoB,GAAG,IAAA,gBAAO,EAAC,aAAa,CAAC,oBAAqB,CAAC,CAAA;gBAEjF,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAA;gBAC7C,IAAI,SAAS,CAAC,oBAAoB,EAAE;oBAAE,IAAI,CAAC,cAAc,EAAE,CAAA;gBAE3D,MAAM,aAAa,GAAG,IAAI,kBAAS,CAAC,4BAAa,CAAC,GAAG,CAAC,CAAA;gBACtD,IAAI,gBAAgB,EAAE;oBACpB,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAmB,EACzC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,EACd,YAAY,EACZ,MAAM,CACP,CAAA;oBAED,kEAAkE;oBAClE,sBAAsB;oBACtB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,mBAAmB,EAAE,CAAA;oBACzD,IAAI,CAAC,UAAU,EAAE,CAAA;oBAEjB,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;wBAC3E,CAAC,CAAC,IAAA,4BAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;qBAChD,CAAC,CAAA;oBACF,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAA;iBACrC;qBAAM;oBACL,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;wBAC3E,IAAA,4BAAgB,EAAC,IAAI,CAAC,SAAS,CAAC;qBACjC,CAAC,CAAA;iBACH;gBAED,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE;oBACxB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CACnC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,aAAa,EACb,IAAI,CAAC,QAAQ,CACd,CAAA;oBAED,IAAI,QAAQ,CAAC,OAAO,EAAE;wBACpB,MAAM,aAAa,GAAG,QAAmC,CAAA;wBACzD,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,EAAE,CAAA;wBAChD,IAAI,CAAC,UAAU,EAAE,CAAA;wBAEjB,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,CAAA;wBACjD,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAA;wBACzD,IAAI,gBAAgB;4BAAE,aAAa,CAAC,KAAK,GAAG,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAA;wBAC1E,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;qBACnE;yBAAM;wBACL,MAAM,aAAa,GAAG,QAAiC,CAAA;wBACvD,IAAI,CAAC,SAAS,CAAC;4BACb,KAAK,EAAE,OAAO;4BACd,OAAO,EAAE,aAAa,CAAC,OAAO;4BAC9B,KAAK,EAAE,aAAa,CAAC,KAAK;yBAC3B,CAAC,CAAA;wBACF,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,CAAA;wBACjD,IAAI,CAAC,UAAU,EAAE,CAAA;wBACjB,IAAI,CAAC,WAAW,EAAE,CAAA;wBAClB,OAAM;qBACP;iBACF;gBAED,oEAAoE;gBACpE,6DAA6D;gBAC7D,uBAAuB;gBACvB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;oBAAE,OAAM;gBAE7C,IAAI,aAAa,CAAC,WAAW,KAAK,UAAU,EAAE;oBAC5C,MAAM,SAAS,GAAG,IAAA,0BAAY,EAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,EACrB,IAAI,CAAC,SAAS,CAAC,WAAW,EAC1B,IAAA,6BAAa,EAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CACpD,CAAA;oBACD,MAAM,SAAS,GAAG,IAAA,0BAAY,EAAC,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;oBACrE,aAAa,CAAC,SAAS,GAAG,SAAS,CAAA;oBACnC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAA;iBACrC;gBACD,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,aAAa,CAAA;aAC/C;iBAAM;gBACL,UAAU;gBACV,IAAI,CAAC,cAAc,EAAE,CAAA;gBAErB,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,IAAA,iCAAmB,EAClD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,EACd,YAAY,EACZ,MAAM,CACP,CAAA;aACF;YAED,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAA;YAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACtD,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAO,IAAI,CAAC,eAAe,CAAA;SAC5B;QAAC,OAAO,KAAU,EAAE;YACnB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,+CAA8B,EAAC,KAAK,CAAC,CAAA;YAEzD,IAAI,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAA;SACrD;IACH,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,IAAI;YACP,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;IACH,CAAC;CACF;AA3wCD,0DA2wCC","sourcesContent":["import {\n AbiCoder,\n formatEther,\n formatUnits,\n getAddress,\n Interface,\n toBeHex,\n ZeroAddress\n} from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { SINGLETON } from '../../consts/deploy'\n/* eslint-disable no-restricted-syntax */\nimport { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'\nimport {\n GAS_TANK_TRANSFER_GAS_USED,\n SA_ERC20_TRANSFER_GAS_USED,\n SA_NATIVE_TRANSFER_GAS_USED\n} from '../../consts/signAccountOp/gas'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, GasFeePayment, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { PaymasterErrorReponse, PaymasterSuccessReponse, Sponsor } from '../../libs/erc7677/types'\nimport { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'\nimport { Erc4337GasLimits, EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'\nimport {\n Gas1559Recommendation,\n GasPriceRecommendation,\n GasRecommendation,\n getProbableCallData\n} from '../../libs/gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../../libs/networks/networks'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'\nimport { getGasUsed } from '../../libs/singleton/singleton'\nimport {\n getActivatorCall,\n getOneTimeNonce,\n getUserOperation,\n getUserOpHash,\n isErc4337Broadcast,\n shouldIncludeActivatorCall,\n shouldUseOneTimeNonce\n} from '../../libs/userOperation/userOperation'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\n/* eslint-disable no-restricted-syntax */\nimport { AccountsController } from '../accounts/accounts'\nimport { AccountOpAction } from '../actions/actions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport {\n getFeeSpeedIdentifier,\n getFeeTokenPriceUnavailableWarning,\n getSignificantBalanceDecreaseWarning,\n getTokenUsdAmount\n} from './helper'\n\nexport enum SigningStatus {\n EstimationError = 'estimation-error',\n UnableToSign = 'unable-to-sign',\n ReadyToSign = 'ready-to-sign',\n /**\n * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc.\n * Signing is allowed in this state, but the state of the controller should not change.\n */\n UpdatesPaused = 'updates-paused',\n InProgress = 'in-progress',\n WaitingForPaymaster = 'waiting-for-paymaster-response',\n Done = 'done'\n}\n\nexport type Status = {\n // @TODO: get rid of the object and just use the type\n type: SigningStatus\n}\n\nexport enum FeeSpeed {\n Slow = 'slow',\n Medium = 'medium',\n Fast = 'fast',\n Ape = 'ape'\n}\n\ntype SpeedCalc = {\n type: FeeSpeed\n amount: bigint\n simulatedGasLimit: bigint\n amountFormatted: string\n amountUsd: string\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n}\n\n// declare the statuses we don't want state updates on\nexport const noStateUpdateStatuses = [\n SigningStatus.InProgress,\n SigningStatus.Done,\n SigningStatus.UpdatesPaused,\n SigningStatus.WaitingForPaymaster\n]\n\nexport class SignAccountOpController extends EventEmitter {\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #portfolio: PortfolioController\n\n #externalSignerControllers: ExternalSignerControllers\n\n account: Account\n\n #network: Network\n\n #blockGasLimit: bigint | undefined = undefined\n\n fromActionId: AccountOpAction['id']\n\n accountOp: AccountOp\n\n gasPrices: GasRecommendation[] | null = null\n\n bundlerGasPrices: GasSpeeds | null = null\n\n estimation: EstimateResult | null = null\n\n feeSpeeds: {\n [identifier: string]: SpeedCalc[]\n } = {}\n\n paidBy: string | null = null\n\n feeTokenResult: TokenResult | null = null\n\n selectedFeeSpeed: FeeSpeed = FeeSpeed.Fast\n\n selectedOption: FeePaymentOption | undefined = undefined\n\n status: Status | null = null\n\n gasUsedTooHigh: boolean\n\n gasUsedTooHighAgreed: boolean\n\n #reEstimate: Function\n\n #isSignRequestStillActive: Function\n\n rbfAccountOps: { [key: string]: SubmittedAccountOp | null }\n\n signedAccountOp: AccountOp | null\n\n replacementFeeLow: boolean\n\n warnings: Warning[] = []\n\n // indicates whether the transaction gas is sponsored or not\n isSponsored: boolean = false\n\n // the sponsor data to be displayed, if any\n sponsor: Sponsor | undefined = undefined\n\n bundlerSwitcher: BundlerSwitcher\n\n constructor(\n accounts: AccountsController,\n keystore: KeystoreController,\n portfolio: PortfolioController,\n externalSignerControllers: ExternalSignerControllers,\n account: Account,\n network: Network,\n fromActionId: AccountOpAction['id'],\n accountOp: AccountOp,\n reEstimate: Function,\n isSignRequestStillActive: Function\n ) {\n super()\n\n this.#accounts = accounts\n this.#keystore = keystore\n this.#portfolio = portfolio\n this.#externalSignerControllers = externalSignerControllers\n this.account = account\n this.#network = network\n this.fromActionId = fromActionId\n this.accountOp = structuredClone(accountOp)\n this.#reEstimate = reEstimate\n this.#isSignRequestStillActive = isSignRequestStillActive\n\n this.gasUsedTooHigh = false\n this.gasUsedTooHighAgreed = false\n this.rbfAccountOps = {}\n this.signedAccountOp = null\n this.replacementFeeLow = false\n this.bundlerSwitcher = new BundlerSwitcher(\n network,\n () => {\n return this.status ? this.status.type : null\n },\n noStateUpdateStatuses\n )\n }\n\n get isInitialized(): boolean {\n return !!this.estimation\n }\n\n #setDefaults() {\n // Set the first signer as the default one.\n // If there are more available signers, the user will be able to select a different signer from the application.\n // The main benefit of having a default signer\n // is that it drastically simplifies the logic of determining whether the account is ready for signing.\n // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag.\n // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer.\n // In that case, on the application, we want the \"Sign\" button to be clickable/enabled,\n // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible.\n if (\n this.accountKeyStoreKeys.length &&\n (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)\n ) {\n this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr\n this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type\n }\n }\n\n #setGasFeePayment() {\n if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) {\n this.accountOp.gasFeePayment = this.#getGasFeePayment()\n }\n }\n\n // check if speeds are set for the given identifier\n hasSpeeds(identifier: string) {\n return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length\n }\n\n getCallDataAdditionalByNetwork(): bigint {\n // no additional call data is required for arbitrum as the bytes are already\n // added in the calculation for the L1 fee\n if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) return 0n\n\n const estimationCallData = getProbableCallData(\n this.account,\n this.accountOp,\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId],\n this.#network\n )\n const FIXED_OVERHEAD = 21000n\n const bytes = Buffer.from(estimationCallData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n\n return txDataGas + FIXED_OVERHEAD\n }\n\n get errors(): string[] {\n const errors: string[] = []\n\n if (!this.isInitialized) return errors\n\n const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr)\n const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network)\n\n // This must be the first error check!\n if (isAmbireV1AndNetworkNotSupported) {\n errors.push(\n 'Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'\n )\n\n // Don't show any other errors\n return errors\n }\n\n // if there's an estimation error, show it\n if (this.estimation?.error) {\n errors.push(this.estimation.error.message)\n }\n\n if (\n this.estimation?.gasUsed &&\n this.#blockGasLimit &&\n this.estimation?.gasUsed > this.#blockGasLimit\n ) {\n errors.push('Transaction reverted with estimation too high: above block limit')\n }\n\n if (\n this.#network.predefined &&\n this.estimation?.gasUsed &&\n this.estimation?.gasUsed > 500000000n\n ) {\n errors.push('Unreasonably high estimation. This transaction will probably fail')\n }\n\n // this error should never happen as availableFeeOptions should always have the native option\n if (!this.isSponsored && !this.availableFeeOptions.length)\n errors.push(ERRORS.eoaInsufficientFunds)\n\n // This error should not happen, as in the update method we are always setting a default signer.\n // It may occur, only if there are no available signer.\n if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr)\n errors.push('Please select a signer to sign the transaction.')\n\n const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]\n\n const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!this.isSponsored && !currentPortfolioNetworkNative)\n errors.push(\n 'Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'\n )\n\n // if there's no gasFeePayment calculate but there is: 1) feeTokenResult\n // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error\n if (\n !this.isSponsored &&\n !this.accountOp.gasFeePayment &&\n this.feeTokenResult &&\n this.selectedOption\n ) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (this.hasSpeeds(identifier))\n errors.push('Please select a token and an account for paying the gas fee.')\n }\n\n if (\n !this.isSponsored &&\n this.selectedOption &&\n this.accountOp.gasFeePayment &&\n this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount\n ) {\n const speedCoverage = []\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n\n if (this.feeSpeeds[identifier]) {\n this.feeSpeeds[identifier].forEach((speed) => {\n if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount)\n speedCoverage.push(speed.type)\n })\n }\n\n if (speedCoverage.length === 0) {\n errors.push(\n isSmartAccount(this.account)\n ? \"Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee.\"\n : ERRORS.eoaInsufficientFunds\n )\n } else {\n errors.push(\n 'The selected speed is not available due to insufficient funds. Please select a slower speed.'\n )\n }\n }\n\n // The signing might fail, tell the user why but allow the user to retry signing,\n // @ts-ignore fix TODO: type mismatch\n if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) {\n // @ts-ignore typescript complains, but the error being present gets checked above\n errors.push(this.status.error)\n }\n\n if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.hasSpeeds(identifier)) {\n if (!this.feeTokenResult?.priceIn.length) {\n errors.push(\n `Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`\n )\n } else {\n errors.push(\n 'Unable to estimate the transaction fee. Please try changing the fee token or contact support.'\n )\n }\n }\n }\n\n // if the gasFeePayment is gas tank but the user doesn't have funds, disable it\n let balance = 0\n Object.keys(currentPortfolio).forEach((networkName) => {\n const networkPortfolio = currentPortfolio[networkName]\n if (!networkPortfolio?.result?.total?.usd) return\n\n balance += networkPortfolio.result.total.usd\n })\n if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) {\n errors.push(\n \"Gas tank isn't allowed on accounts with < $10 balance. Please add funds to your account\"\n )\n }\n\n return errors\n }\n\n get readyToSign() {\n return (\n !!this.status &&\n (this.status?.type === SigningStatus.ReadyToSign ||\n this.status?.type === SigningStatus.UpdatesPaused)\n )\n }\n\n calculateWarnings() {\n const warnings: Warning[] = []\n\n const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr)\n\n const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(\n latestState,\n pendingState,\n this.accountOp.networkId\n )\n\n if (this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd)\n const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(\n !!this.hasSpeeds(identifier),\n feeTokenHasPrice\n )\n\n // push the warning only if the txn is not sponsored\n if (!this.isSponsored && feeTokenPriceUnavailableWarning)\n warnings.push(feeTokenPriceUnavailableWarning)\n }\n\n if (significantBalanceDecreaseWarning) warnings.push(significantBalanceDecreaseWarning)\n\n this.warnings = warnings\n\n this.emitUpdate()\n }\n\n update({\n gasPrices,\n estimation,\n feeToken,\n paidBy,\n speed,\n signingKeyAddr,\n signingKeyType,\n calls,\n gasUsedTooHighAgreed,\n rbfAccountOps,\n bundlerGasPrices,\n blockGasLimit\n }: {\n gasPrices?: GasRecommendation[]\n estimation?: EstimateResult | null\n feeToken?: TokenResult\n paidBy?: string\n speed?: FeeSpeed\n signingKeyAddr?: Key['addr']\n signingKeyType?: Key['type']\n calls?: AccountOp['calls']\n gasUsedTooHighAgreed?: boolean\n rbfAccountOps?: { [key: string]: SubmittedAccountOp | null }\n bundlerGasPrices?: { speeds: GasSpeeds; bundler: BUNDLER }\n blockGasLimit?: bigint\n }) {\n // once the user commits to the things he sees on his screen,\n // we need to be sure nothing changes afterwards.\n // For example, signing can be slow if it's done by a hardware wallet.\n // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism)\n // If we allow the estimation to affect the controller state during sign,\n // there could be discrepancy between what the user has agreed upon and what\n // we broadcast in the end\n if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) {\n return\n }\n\n if (Array.isArray(calls)) this.accountOp.calls = calls\n\n if (blockGasLimit) this.#blockGasLimit = blockGasLimit\n\n if (gasPrices) this.gasPrices = gasPrices\n\n if (estimation) {\n this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n)\n this.estimation = estimation\n // on each estimation update, set the newest account nonce\n this.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n }\n\n // if estimation is undefined, do not clear the estimation.\n // We do this only if strictly specified as null\n if (estimation === null) this.estimation = null\n\n if (feeToken && paidBy) {\n this.paidBy = paidBy\n this.feeTokenResult = feeToken\n }\n\n if (speed && this.isInitialized) {\n this.selectedFeeSpeed = speed\n }\n\n if (signingKeyAddr && signingKeyType && this.isInitialized) {\n this.accountOp.signingKeyAddr = signingKeyAddr\n this.accountOp.signingKeyType = signingKeyType\n }\n\n if (gasUsedTooHighAgreed !== undefined) this.gasUsedTooHighAgreed = gasUsedTooHighAgreed\n\n // set the rbf is != undefined\n if (rbfAccountOps) this.rbfAccountOps = rbfAccountOps\n\n // Set defaults, if some of the optional params are omitted\n this.#setDefaults()\n\n if (this.estimation && this.paidBy && this.feeTokenResult) {\n this.selectedOption = this.availableFeeOptions.find(\n (option) =>\n option.paidBy === this.paidBy &&\n option.token.address === this.feeTokenResult!.address &&\n option.token.symbol.toLocaleLowerCase() ===\n this.feeTokenResult!.symbol.toLocaleLowerCase() &&\n option.token.flags.onGasTank === this.feeTokenResult!.flags.onGasTank\n )\n }\n\n // update the bundler gas prices if the bundlers match\n if (\n this.estimation?.erc4337GasLimits &&\n bundlerGasPrices &&\n bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()\n ) {\n this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds\n }\n\n if (\n this.estimation &&\n this.estimation.erc4337GasLimits &&\n this.estimation.erc4337GasLimits.paymaster\n ) {\n // if it was sponsored but it no longer is (fallback case),\n // reset the selectedOption option as we use native for the sponsorship\n // but the user might not actually have any native\n const isSponsorshipFallback =\n this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored()\n\n this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored()\n this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor\n\n if (isSponsorshipFallback) {\n this.selectedOption = this.availableFeeOptions.length\n ? this.availableFeeOptions[0]\n : undefined\n }\n }\n\n // calculate the fee speeds if either there are no feeSpeeds\n // or any of properties for update is requested\n if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) {\n this.#updateFeeSpeeds()\n }\n\n // Here, we expect to have most of the fields set, so we can safely set GasFeePayment\n this.#setGasFeePayment()\n this.updateStatus()\n this.calculateWarnings()\n }\n\n updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow = false) {\n // use this to go back to ReadyToSign when a broadcasting error is emitted\n if (forceStatusChange) {\n this.status = { type: forceStatusChange }\n this.emitUpdate()\n return\n }\n\n // no status updates on these two\n const isInTheMiddleOfSigning =\n this.status?.type === SigningStatus.InProgress ||\n this.status?.type === SigningStatus.WaitingForPaymaster\n const isDone = this.status?.type === SigningStatus.Done\n if (isInTheMiddleOfSigning || isDone) return\n\n // if we have an estimation error, set the state so and return\n if (this.estimation?.error) {\n this.status = { type: SigningStatus.EstimationError }\n this.emitUpdate()\n return\n }\n\n if (this.errors.length) {\n this.status = { type: SigningStatus.UnableToSign }\n this.emitUpdate()\n return\n }\n\n if (\n this.isInitialized &&\n this.estimation &&\n this.accountOp?.signingKeyAddr &&\n this.accountOp?.signingKeyType &&\n this.accountOp?.gasFeePayment &&\n // if the gas used is too high, do not allow the user to sign\n // until he explicitly agrees to the risks\n (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)\n ) {\n this.status = { type: SigningStatus.ReadyToSign }\n\n // do not reset this once triggered\n if (replacementFeeLow) this.replacementFeeLow = replacementFeeLow\n this.emitUpdate()\n return\n }\n\n // reset the status if a valid state was not found\n this.status = null\n this.emitUpdate()\n }\n\n reset() {\n this.gasPrices = null\n this.estimation = null\n this.selectedFeeSpeed = FeeSpeed.Fast\n this.paidBy = null\n this.feeTokenResult = null\n this.status = null\n this.emitUpdate()\n }\n\n resetStatus() {\n this.status = null\n this.emitUpdate()\n }\n\n /**\n * Obtain the native token ratio in relation to a fee token.\n *\n * By knowing the USD value of the tokens in the portfolio,\n * we can calculate the ratio between a native token and a fee token.\n *\n * For example, 1 ETH = 8 BNB (ratio: 8).\n *\n * We require the ratio to be in a BigInt format since all the application values,\n * such as amount, gasLimit, etc., are also represented as BigInt numbers.\n */\n #getNativeToFeeTokenRatio(feeToken: TokenResult): bigint | null {\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n\n // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available.\n if (native.address === feeToken.address && native.networkId === feeToken.networkId)\n return BigInt(1 * 1e18)\n\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n\n const nativePrice = native.priceIn.find(isUsd)?.price\n const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price\n\n if (!nativePrice || !feeTokenPrice) return null\n\n const ratio = nativePrice / feeTokenPrice\n\n // Here we multiply it by 1e18, in order to keep the decimal precision.\n // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point.\n // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18.\n const ratio1e18 = ratio * 1e18\n const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0)\n return BigInt(toBigInt)\n }\n\n static getAmountAfterFeeTokenConvert(\n simulatedGasLimit: bigint,\n gasPrice: bigint,\n nativeRatio: bigint,\n feeTokenDecimals: number,\n addedNative: bigint\n ) {\n const amountInWei = simulatedGasLimit * gasPrice + addedNative\n\n // Let's break down the process of converting the amount into FeeToken:\n // 1. Initially, we multiply the amount in wei by the native to fee token ratio.\n // 2. Next, we address the decimal places:\n // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals).\n // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount.\n // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals.\n const extraDecimals = BigInt(10 ** 18)\n const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals))\n const pow = extraDecimals * feeTokenExtraDecimals\n return (amountInWei * nativeRatio) / pow\n }\n\n /**\n * Increase the fee we send to the feeCollector according to the specified\n * options in the network tab\n */\n #increaseFee(amount: bigint): bigint {\n if (!this.#network.feeOptions.feeIncrease) {\n return amount\n }\n\n return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n\n }\n\n /**\n * If the nonce of the current account op and the last account op are the same,\n * do an RBF increase or otherwise the user cannot broadcast the txn\n *\n * calculatedGas: it should be either the whole gasPrice if the network doesn't\n * support EIP-1559 OR it should the maxPriorityFeePerGas if the network\n * supports EIP-1559\n *\n * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas\n */\n #rbfIncrease(\n accId: string,\n calculatedGas: bigint,\n gasPropertyName: 'gasPrice' | 'maxPriorityFeePerGas',\n prevSpeed: SpeedCalc | null\n ): bigint {\n // ape speed gets 50% increase\n const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n\n\n // when doing an RBF, make sure the min gas for the current speed\n // is at least 12% bigger than the previous speed\n const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined\n const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n\n const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas\n\n // if there was an error on the signed account op with a\n // replacement fee too low, we increase by 13% the signed account op\n // IF the new estimation is not actually higher\n if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) {\n const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined\n const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n\n return min > bumpFees ? min : bumpFees\n }\n\n // if no RBF option for this paidBy option, return the amount\n const rbfOp = this.rbfAccountOps[accId]\n if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName])\n return calculatedGas\n\n // increase by a minimum of 13% the last broadcast txn and use that\n // or use the current gas estimation if it's more\n const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n\n const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n\n return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased\n }\n\n get #feeSpeedsLoading() {\n return !this.isInitialized || !this.gasPrices\n }\n\n #updateFeeSpeeds() {\n if (this.#feeSpeedsLoading) return\n\n // reset the fee speeds at the beginning to avoid duplications\n this.feeSpeeds = {}\n\n const gasUsed = this.estimation!.gasUsed\n\n this.availableFeeOptions.forEach((option) => {\n // if a calculation has been made, do not make it again\n // EOA pays for SA is the most common case for this scenario\n //\n // addition: make sure there's no rbfAccountOps as well\n const identifier = getFeeSpeedIdentifier(\n option,\n this.accountOp.accountAddr,\n this.rbfAccountOps[option.paidBy]\n )\n if (this.hasSpeeds(identifier)) {\n return\n }\n\n const nativeRatio = this.#getNativeToFeeTokenRatio(option.token)\n if (!nativeRatio) {\n this.feeSpeeds[identifier] = []\n return\n }\n\n const erc4337GasLimits = this.estimation?.erc4337GasLimits\n if (erc4337GasLimits) {\n const speeds: SpeedCalc[] = []\n const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n\n for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) {\n const simulatedGasLimit =\n BigInt(erc4337GasLimits.callGasLimit) +\n BigInt(erc4337GasLimits.preVerificationGas) +\n BigInt(option.gasUsed ?? 0)\n const gasPrice = BigInt(speedValue.maxFeePerGas)\n let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n 0n\n )\n if (usesPaymaster) amount = this.#increaseFee(amount)\n\n speeds.push({\n type: speed as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas)\n })\n }\n\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier] = speeds\n return\n }\n\n ;(this.gasPrices || []).forEach((gasRecommendation, i) => {\n let amount\n let simulatedGasLimit\n const prevSpeed =\n this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length\n ? this.feeSpeeds[identifier][i - 1]\n : null\n\n // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation\n // depending whether the network supports EIP-1559 and is it enabled on our side.\n // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559.\n // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns\n // the maxPriorityFeePerGas without doing anything (most cases) or if there's a\n // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF.\n // Finally, we calculate the gasPrice:\n // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas\n // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF)\n const maxPriorityFeePerGas =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? this.#rbfIncrease(\n option.paidBy,\n gasRecommendation.maxPriorityFeePerGas,\n 'maxPriorityFeePerGas',\n prevSpeed\n )\n : undefined\n\n const gasPrice =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? (gasRecommendation as Gas1559Recommendation).baseFeePerGas + maxPriorityFeePerGas!\n : this.#rbfIncrease(\n option.paidBy,\n (gasRecommendation as GasPriceRecommendation).gasPrice,\n 'gasPrice',\n prevSpeed\n )\n\n // EOA\n if (!isSmartAccount(this.account)) {\n simulatedGasLimit = gasUsed\n\n if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) {\n simulatedGasLimit = getGasUsed(simulatedGasLimit)\n }\n\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else if (option.paidBy !== this.accountOp.accountAddr) {\n // Smart account, but EOA pays the fee\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork()\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else {\n // Relayer\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed!\n amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n option.addedNative\n )\n amount = this.#increaseFee(amount)\n }\n\n const feeSpeed: SpeedCalc = {\n type: gasRecommendation.name as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas\n }\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier].push(feeSpeed)\n })\n })\n }\n\n #getGasFeePayment(): GasFeePayment | null {\n if (!this.isInitialized) {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.',\n error: new Error(\n 'SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.'\n )\n })\n\n return null\n }\n if (!this.paidBy) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying account not selected')\n })\n\n return null\n }\n if (!this.feeTokenResult) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee token not selected')\n })\n\n return null\n }\n\n // if there are no availableFeeOptions, we don't have a gasFee\n // this is normal though as there are such cases:\n // - EOA paying in native but doesn't have any native\n // so no error should pop out because of this\n if (!this.availableFeeOptions.length) {\n return null\n }\n\n if (!this.selectedOption) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying option not found')\n })\n\n return null\n }\n\n // if there are no fee speeds available for the option, it means\n // the nativeRatio could not be calculated. In that case, we do not\n // emit an error here but proceed and show an explanation to the user\n // in get errors()\n // check test: Signing [Relayer]: ... priceIn | native/Ratio\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.feeSpeeds[identifier].length) {\n return null\n }\n\n const chosenSpeed = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n if (!chosenSpeed) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee speed not selected')\n })\n\n return null\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n return {\n paidBy: this.paidBy,\n // we're allowing EOAs to broadcast on 4337 networks as well\n // in that case, we don't do user operations\n isERC4337:\n this.paidBy === this.accountOp.accountAddr &&\n isErc4337Broadcast(this.account, this.#network, accountState),\n isGasTank: this.feeTokenResult.flags.onGasTank,\n inToken: this.feeTokenResult.address,\n feeTokenNetworkId: this.feeTokenResult.networkId,\n amount: chosenSpeed.amount,\n simulatedGasLimit: chosenSpeed.simulatedGasLimit,\n gasPrice: chosenSpeed.gasPrice,\n maxPriorityFeePerGas:\n 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined\n }\n }\n\n get feeToken(): string | null {\n return this.accountOp?.gasFeePayment?.inToken || null\n }\n\n get feePaidBy(): string | null {\n return this.accountOp?.gasFeePayment?.paidBy || null\n }\n\n get availableFeeOptions(): EstimateResult['feePaymentOptions'] {\n if (!this.estimation) return []\n\n // if the txn is sponsored, return the native option only\n // even if it's balance is 0\n if (this.isSponsored) {\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n // FeeOptions having amount\n const withAmounts = this.estimation.feePaymentOptions.filter(\n (feeOption) => feeOption.availableAmount\n )\n if (withAmounts.length) return withAmounts\n\n // if there are no fee options with amounts, return the native option\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n get accountKeyStoreKeys(): Key[] {\n return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr))\n }\n\n // eslint-disable-next-line class-methods-use-this\n get speedOptions() {\n return Object.values(FeeSpeed) as string[]\n }\n\n get gasSavedUSD(): number | null {\n if (!this.selectedOption?.token.flags.onGasTank) return null\n\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const selectedFeeSpeedData = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n const gasPrice = selectedFeeSpeedData?.gasPrice\n if (!gasPrice) return null\n\n // get the native token from the portfolio to calculate prices\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price\n if (!nativePrice) return null\n\n // 4337 gasUsed is set to 0 in the estimation as we rely\n // on the bundler for the estimation entirely => use hardcode value\n const gasUsedSelectedOption =\n this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n\n ? this.selectedOption.gasUsed\n : GAS_TANK_TRANSFER_GAS_USED\n const isNativeSelected = this.selectedOption.token.address === ZeroAddress\n const gasUsedNative =\n this.availableFeeOptions.find(\n (option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED\n const gasUsedERC20 =\n this.availableFeeOptions.find(\n (option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_ERC20_TRANSFER_GAS_USED\n\n const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20\n const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice)\n\n return Number(gasSavedInNative) * nativePrice\n }\n\n #emitSigningErrorAndResetToReadyToSign(error: string) {\n this.emitError({ level: 'major', message: error, error: new Error(error) })\n this.status = { type: SigningStatus.ReadyToSign }\n\n this.emitUpdate()\n }\n\n #addFeePayment() {\n // In case of gas tank token fee payment, we need to include one more call to account op\n const abiCoder = new AbiCoder()\n\n if (this.isSponsored) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.isGasTank) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', this.accountOp.gasFeePayment!.amount, this.feeTokenResult?.symbol]\n )\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.inToken === '0x0000000000000000000000000000000000000000') {\n // native payment\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: this.accountOp.gasFeePayment!.amount,\n data: '0x'\n }\n } else {\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n this.accountOp.feeCall = {\n to: this.accountOp.gasFeePayment!.inToken,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('transfer', [\n FEE_COLLECTOR,\n this.accountOp.gasFeePayment!.amount\n ])\n }\n }\n }\n\n async sign() {\n if (!this.readyToSign) {\n const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // when signing begings, we stop immediatelly state updates on the controller\n // by changing the status to InProgress. Check update() for more info\n this.status = { type: SigningStatus.InProgress }\n\n if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) {\n const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n if (!this.accountOp?.gasFeePayment || !this.selectedOption) {\n const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const signer = await this.#keystore.getSigner(\n this.accountOp.signingKeyAddr,\n this.accountOp.signingKeyType\n )\n if (!signer) {\n const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n const usesOneTimeNonce = shouldUseOneTimeNonce(accountState)\n if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) {\n this.status = { type: SigningStatus.WaitingForPaymaster }\n } else {\n this.status = { type: SigningStatus.InProgress }\n }\n\n // we update the FE with the changed status (in progress) only after the checks\n // above confirm everything is okay to prevent two different state updates\n this.emitUpdate()\n\n const gasFeePayment = this.accountOp.gasFeePayment\n\n if (signer.init) signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType])\n\n // just in-case: before signing begins, we delete the feeCall;\n // if there's a need for it, it will be added later on in the code.\n // We need this precaution because this could happen:\n // - try to broadcast with the relayer\n // - the feel call gets added\n // - the relayer broadcast fails\n // - the user does another broadcast, this time with EOA pays for SA\n // - the fee call stays, causing a low gas limit revert\n delete this.accountOp.feeCall\n\n // delete the activatorCall as a precaution that it won't be added twice\n delete this.accountOp.activatorCall\n\n // @EntryPoint activation\n // if we broadcast by an EOA, this is the only way to include\n // the entry point as a signer\n if (\n shouldIncludeActivatorCall(\n this.#network,\n this.account,\n accountState,\n this.accountOp.gasFeePayment.isERC4337\n )\n ) {\n this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr)\n }\n\n try {\n // In case of EOA account\n if (!isSmartAccount(this.account)) {\n if (this.accountOp.calls.length !== 1) {\n const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'\n const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // In legacy mode, we sign the transaction directly.\n // that means the signing will happen on broadcast and here\n // checking whether the call is 1 and 1 only is enough\n this.accountOp.signature = '0x'\n } else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) {\n // Smart account, but EOA pays the fee\n // EOA pays for execute() - relayerless\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n } else if (this.accountOp.gasFeePayment.isERC4337) {\n // if there's no entryPointAuthorization, the txn will fail\n if (\n !accountState.isDeployed &&\n (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)\n )\n return this.#emitSigningErrorAndResetToReadyToSign(\n `Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n )\n\n const erc4337Estimation = this.estimation!.erc4337GasLimits as Erc4337GasLimits\n\n const userOperation = getUserOperation(\n this.account,\n accountState,\n this.accountOp,\n this.bundlerSwitcher.getBundler().getName(),\n !accountState.isDeployed ? this.accountOp.meta!.entryPointAuthorization : undefined\n )\n userOperation.preVerificationGas = erc4337Estimation.preVerificationGas\n userOperation.callGasLimit = toBeHex(\n BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)\n )\n userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit\n userOperation.paymasterVerificationGasLimit =\n erc4337Estimation.paymasterVerificationGasLimit\n userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit\n userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice)\n userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas!)\n\n const paymaster = erc4337Estimation.paymaster\n if (paymaster.shouldIncludePayment()) this.#addFeePayment()\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n if (usesOneTimeNonce) {\n const signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n\n // after signing has completed, we wait for the paymaster response\n // so we tell the user\n this.status = { type: SigningStatus.WaitingForPaymaster }\n this.emitUpdate()\n\n userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [\n [[getSignableCalls(this.accountOp), signature]]\n ])\n this.accountOp.signature = signature\n } else {\n userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCalls(this.accountOp)\n ])\n }\n\n if (paymaster.isUsable()) {\n const response = await paymaster.call(\n this.account,\n this.accountOp,\n userOperation,\n this.#network\n )\n\n if (response.success) {\n const paymasterData = response as PaymasterSuccessReponse\n this.status = { type: SigningStatus.InProgress }\n this.emitUpdate()\n\n userOperation.paymaster = paymasterData.paymaster\n userOperation.paymasterData = paymasterData.paymasterData\n if (usesOneTimeNonce) userOperation.nonce = getOneTimeNonce(userOperation)\n this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored()\n } else {\n const errorResponse = response as PaymasterErrorReponse\n this.emitError({\n level: 'major',\n message: errorResponse.message,\n error: errorResponse.error\n })\n this.status = { type: SigningStatus.ReadyToSign }\n this.emitUpdate()\n this.#reEstimate()\n return\n }\n }\n\n // query the application state from memory to understand if the user\n // hasn't actually rejected the request while waiting for the\n // paymaster to respond\n if (!this.#isSignRequestStillActive()) return\n\n if (userOperation.requestType === 'standard') {\n const typedData = getTypedData(\n this.#network.chainId,\n this.accountOp.accountAddr,\n getUserOpHash(userOperation, this.#network.chainId)\n )\n const signature = wrapStandard(await signer.signTypedData(typedData))\n userOperation.signature = signature\n this.accountOp.signature = signature\n }\n this.accountOp.asUserOperation = userOperation\n } else {\n // Relayer\n this.#addFeePayment()\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n }\n\n this.status = { type: SigningStatus.Done }\n this.signedAccountOp = structuredClone(this.accountOp)\n this.emitUpdate()\n return this.signedAccountOp\n } catch (error: any) {\n const { message } = getHumanReadableBroadcastError(error)\n\n this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n }\n\n toJSON() {\n return {\n ...this,\n isInitialized: this.isInitialized,\n readyToSign: this.readyToSign,\n availableFeeOptions: this.availableFeeOptions,\n accountKeyStoreKeys: this.accountKeyStoreKeys,\n feeToken: this.feeToken,\n feePaidBy: this.feePaidBy,\n speedOptions: this.speedOptions,\n selectedOption: this.selectedOption,\n account: this.account,\n errors: this.errors,\n gasSavedUSD: this.gasSavedUSD\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"signAccountOp.js","sourceRoot":"","sources":["../../../../src/controllers/signAccountOp/signAccountOp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AbiCoder,\n formatEther,\n formatUnits,\n getAddress,\n Interface,\n toBeHex,\n ZeroAddress\n} from 'ethers'\n\nimport AmbireAccount from '../../../contracts/compiled/AmbireAccount.json'\nimport ERC20 from '../../../contracts/compiled/IERC20.json'\nimport { FEE_COLLECTOR } from '../../consts/addresses'\nimport { BUNDLER } from '../../consts/bundlers'\nimport { SINGLETON } from '../../consts/deploy'\n/* eslint-disable no-restricted-syntax */\nimport { ERRORS, RETRY_TO_INIT_ACCOUNT_OP_MSG } from '../../consts/signAccountOp/errorHandling'\nimport {\n GAS_TANK_TRANSFER_GAS_USED,\n SA_ERC20_TRANSFER_GAS_USED,\n SA_NATIVE_TRANSFER_GAS_USED\n} from '../../consts/signAccountOp/gas'\nimport { Account } from '../../interfaces/account'\nimport { ExternalSignerControllers, Key } from '../../interfaces/keystore'\nimport { Network } from '../../interfaces/network'\nimport { Warning } from '../../interfaces/signAccountOp'\nimport { isAmbireV1LinkedAccount, isSmartAccount } from '../../libs/account/account'\nimport { AccountOp, GasFeePayment, getSignableCalls } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { PaymasterErrorReponse, PaymasterSuccessReponse, Sponsor } from '../../libs/erc7677/types'\nimport { getHumanReadableBroadcastError } from '../../libs/errorHumanizer'\nimport { Erc4337GasLimits, EstimateResult, FeePaymentOption } from '../../libs/estimate/interfaces'\nimport {\n Gas1559Recommendation,\n GasPriceRecommendation,\n GasRecommendation,\n getProbableCallData\n} from '../../libs/gasPrice/gasPrice'\nimport { hasRelayerSupport } from '../../libs/networks/networks'\nimport { Price, TokenResult } from '../../libs/portfolio'\nimport { getExecuteSignature, getTypedData, wrapStandard } from '../../libs/signMessage/signMessage'\nimport { getGasUsed } from '../../libs/singleton/singleton'\nimport {\n getActivatorCall,\n getOneTimeNonce,\n getUserOperation,\n getUserOpHash,\n isErc4337Broadcast,\n shouldIncludeActivatorCall,\n shouldUseOneTimeNonce\n} from '../../libs/userOperation/userOperation'\nimport { BundlerSwitcher } from '../../services/bundlers/bundlerSwitcher'\nimport { GasSpeeds } from '../../services/bundlers/types'\n/* eslint-disable no-restricted-syntax */\nimport { AccountsController } from '../accounts/accounts'\nimport { AccountOpAction } from '../actions/actions'\nimport EventEmitter from '../eventEmitter/eventEmitter'\nimport { KeystoreController } from '../keystore/keystore'\nimport { PortfolioController } from '../portfolio/portfolio'\nimport {\n getFeeSpeedIdentifier,\n getFeeTokenPriceUnavailableWarning,\n getSignificantBalanceDecreaseWarning,\n getTokenUsdAmount\n} from './helper'\n\nexport enum SigningStatus {\n EstimationError = 'estimation-error',\n UnableToSign = 'unable-to-sign',\n ReadyToSign = 'ready-to-sign',\n /**\n * Used to prevent state updates while the user is resolving warnings, connecting a hardware wallet, etc.\n * Signing is allowed in this state, but the state of the controller should not change.\n */\n UpdatesPaused = 'updates-paused',\n InProgress = 'in-progress',\n WaitingForPaymaster = 'waiting-for-paymaster-response',\n Done = 'done'\n}\n\nexport type Status = {\n // @TODO: get rid of the object and just use the type\n type: SigningStatus\n}\n\nexport enum FeeSpeed {\n Slow = 'slow',\n Medium = 'medium',\n Fast = 'fast',\n Ape = 'ape'\n}\n\ntype SpeedCalc = {\n type: FeeSpeed\n amount: bigint\n simulatedGasLimit: bigint\n amountFormatted: string\n amountUsd: string\n gasPrice: bigint\n maxPriorityFeePerGas?: bigint\n}\n\n// declare the statuses we don't want state updates on\nexport const noStateUpdateStatuses = [\n SigningStatus.InProgress,\n SigningStatus.Done,\n SigningStatus.UpdatesPaused,\n SigningStatus.WaitingForPaymaster\n]\n\nexport class SignAccountOpController extends EventEmitter {\n #accounts: AccountsController\n\n #keystore: KeystoreController\n\n #portfolio: PortfolioController\n\n #externalSignerControllers: ExternalSignerControllers\n\n account: Account\n\n #network: Network\n\n #blockGasLimit: bigint | undefined = undefined\n\n fromActionId: AccountOpAction['id']\n\n accountOp: AccountOp\n\n gasPrices: GasRecommendation[] | null = null\n\n bundlerGasPrices: GasSpeeds | null = null\n\n estimation: EstimateResult | null = null\n\n feeSpeeds: {\n [identifier: string]: SpeedCalc[]\n } = {}\n\n paidBy: string | null = null\n\n feeTokenResult: TokenResult | null = null\n\n selectedFeeSpeed: FeeSpeed = FeeSpeed.Fast\n\n selectedOption: FeePaymentOption | undefined = undefined\n\n status: Status | null = null\n\n gasUsedTooHigh: boolean\n\n gasUsedTooHighAgreed: boolean\n\n #reEstimate: Function\n\n #isSignRequestStillActive: Function\n\n rbfAccountOps: { [key: string]: SubmittedAccountOp | null }\n\n signedAccountOp: AccountOp | null\n\n replacementFeeLow: boolean\n\n warnings: Warning[] = []\n\n // indicates whether the transaction gas is sponsored or not\n isSponsored: boolean = false\n\n // the sponsor data to be displayed, if any\n sponsor: Sponsor | undefined = undefined\n\n bundlerSwitcher: BundlerSwitcher\n\n constructor(\n accounts: AccountsController,\n keystore: KeystoreController,\n portfolio: PortfolioController,\n externalSignerControllers: ExternalSignerControllers,\n account: Account,\n network: Network,\n fromActionId: AccountOpAction['id'],\n accountOp: AccountOp,\n reEstimate: Function,\n isSignRequestStillActive: Function\n ) {\n super()\n\n this.#accounts = accounts\n this.#keystore = keystore\n this.#portfolio = portfolio\n this.#externalSignerControllers = externalSignerControllers\n this.account = account\n this.#network = network\n this.fromActionId = fromActionId\n this.accountOp = structuredClone(accountOp)\n this.#reEstimate = reEstimate\n this.#isSignRequestStillActive = isSignRequestStillActive\n\n this.gasUsedTooHigh = false\n this.gasUsedTooHighAgreed = false\n this.rbfAccountOps = {}\n this.signedAccountOp = null\n this.replacementFeeLow = false\n this.bundlerSwitcher = new BundlerSwitcher(\n network,\n () => {\n return this.status ? this.status.type : null\n },\n noStateUpdateStatuses\n )\n }\n\n get isInitialized(): boolean {\n return !!this.estimation\n }\n\n #setDefaults() {\n // Set the first signer as the default one.\n // If there are more available signers, the user will be able to select a different signer from the application.\n // The main benefit of having a default signer\n // is that it drastically simplifies the logic of determining whether the account is ready for signing.\n // For example, in the `sign` method and on the application screen, we can simply rely on the `this.readyToSign` flag.\n // Otherwise, if we don't have a default value, then `this.readyToSign` will always be false unless we set a signer.\n // In that case, on the application, we want the \"Sign\" button to be clickable/enabled,\n // and we have to check and expose the `SignAccountOp` controller's inner state to make this check possible.\n if (\n this.accountKeyStoreKeys.length &&\n (!this.accountOp.signingKeyAddr || !this.accountOp.signingKeyType)\n ) {\n this.accountOp.signingKeyAddr = this.accountKeyStoreKeys[0].addr\n this.accountOp.signingKeyType = this.accountKeyStoreKeys[0].type\n }\n }\n\n #setGasFeePayment() {\n if (this.isInitialized && this.paidBy && this.selectedFeeSpeed && this.feeTokenResult) {\n this.accountOp.gasFeePayment = this.#getGasFeePayment()\n }\n }\n\n // check if speeds are set for the given identifier\n hasSpeeds(identifier: string) {\n return this.feeSpeeds[identifier] !== undefined && this.feeSpeeds[identifier].length\n }\n\n getCallDataAdditionalByNetwork(): bigint {\n // no additional call data is required for arbitrum as the bytes are already\n // added in the calculation for the L1 fee\n if (this.#network.id === 'arbitrum' || !isSmartAccount(this.account)) return 0n\n\n const estimationCallData = getProbableCallData(\n this.account,\n this.accountOp,\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId],\n this.#network\n )\n const FIXED_OVERHEAD = 21000n\n const bytes = Buffer.from(estimationCallData.substring(2))\n const nonZeroBytes = BigInt(bytes.filter((b) => b).length)\n const zeroBytes = BigInt(BigInt(bytes.length) - nonZeroBytes)\n const txDataGas = zeroBytes * 4n + nonZeroBytes * 16n\n return txDataGas + FIXED_OVERHEAD\n }\n\n get errors(): string[] {\n const errors: string[] = []\n\n if (!this.isInitialized) return errors\n\n const isAmbireV1 = isAmbireV1LinkedAccount(this.account?.creation?.factoryAddr)\n const isAmbireV1AndNetworkNotSupported = isAmbireV1 && !hasRelayerSupport(this.#network)\n\n // This must be the first error check!\n if (isAmbireV1AndNetworkNotSupported) {\n errors.push(\n 'Ambire v1 accounts are not supported on this network. To interact with this network, please use an Ambire v2 Smart Account or a Basic Account. You can still use v1 accounts on any network that is natively integrated with the Ambire web and mobile wallets.'\n )\n\n // Don't show any other errors\n return errors\n }\n\n // if there's an estimation error, show it\n if (this.estimation?.error) {\n errors.push(this.estimation.error.message)\n }\n\n if (\n this.estimation?.gasUsed &&\n this.#blockGasLimit &&\n this.estimation?.gasUsed > this.#blockGasLimit\n ) {\n errors.push('Transaction reverted with estimation too high: above block limit')\n }\n\n if (\n this.#network.predefined &&\n this.estimation?.gasUsed &&\n this.estimation?.gasUsed > 500000000n\n ) {\n errors.push('Unreasonably high estimation. This transaction will probably fail')\n }\n\n // this error should never happen as availableFeeOptions should always have the native option\n if (!this.isSponsored && !this.availableFeeOptions.length)\n errors.push(ERRORS.eoaInsufficientFunds)\n\n // This error should not happen, as in the update method we are always setting a default signer.\n // It may occur, only if there are no available signer.\n if (!this.accountOp.signingKeyType || !this.accountOp.signingKeyAddr)\n errors.push('Please select a signer to sign the transaction.')\n\n const currentPortfolio = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const currentPortfolioNetwork = currentPortfolio[this.accountOp.networkId]\n\n const currentPortfolioNetworkNative = currentPortfolioNetwork?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!this.isSponsored && !currentPortfolioNetworkNative)\n errors.push(\n 'Unable to estimate the transaction fee as fetching the latest price update for the network native token failed. Please try again later.'\n )\n\n // if there's no gasFeePayment calculate but there is: 1) feeTokenResult\n // 2) selectedOption and 3) gasSpeeds for selectedOption => return an error\n if (\n !this.isSponsored &&\n !this.accountOp.gasFeePayment &&\n this.feeTokenResult &&\n this.selectedOption\n ) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (this.hasSpeeds(identifier))\n errors.push('Please select a token and an account for paying the gas fee.')\n }\n\n if (\n !this.isSponsored &&\n this.selectedOption &&\n this.accountOp.gasFeePayment &&\n this.selectedOption.availableAmount < this.accountOp.gasFeePayment.amount\n ) {\n const speedCoverage = []\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n\n if (this.feeSpeeds[identifier]) {\n this.feeSpeeds[identifier].forEach((speed) => {\n if (this.selectedOption && this.selectedOption.availableAmount >= speed.amount)\n speedCoverage.push(speed.type)\n })\n }\n\n if (speedCoverage.length === 0) {\n errors.push(\n isSmartAccount(this.account)\n ? \"Signing is not possible with the selected account's token as it doesn't have sufficient funds to cover the gas payment fee.\"\n : ERRORS.eoaInsufficientFunds\n )\n } else {\n errors.push(\n 'The selected speed is not available due to insufficient funds. Please select a slower speed.'\n )\n }\n }\n\n // The signing might fail, tell the user why but allow the user to retry signing,\n // @ts-ignore fix TODO: type mismatch\n if (this.status?.type === SigningStatus.ReadyToSign && !!this.status.error) {\n // @ts-ignore typescript complains, but the error being present gets checked above\n errors.push(this.status.error)\n }\n\n if (!this.isSponsored && !this.#feeSpeedsLoading && this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.hasSpeeds(identifier)) {\n if (!this.feeTokenResult?.priceIn.length) {\n errors.push(\n `Currently, ${this.feeTokenResult?.symbol} is unavailable as a fee token as we're experiencing troubles fetching its price. Please select another or contact support`\n )\n } else {\n errors.push(\n 'Unable to estimate the transaction fee. Please try changing the fee token or contact support.'\n )\n }\n }\n }\n\n // if the gasFeePayment is gas tank but the user doesn't have funds, disable it\n let balance = 0\n Object.keys(currentPortfolio).forEach((networkName) => {\n const networkPortfolio = currentPortfolio[networkName]\n if (!networkPortfolio?.result?.total?.usd) return\n\n balance += networkPortfolio.result.total.usd\n })\n if (balance < 10 && this.accountOp.gasFeePayment && this.accountOp.gasFeePayment.isGasTank) {\n errors.push(\n 'Your account must have a minimum overall balance of $10 to pay for gas via the Gas Tank. Please add funds to your account or choose another fee payment option.'\n )\n }\n\n return errors\n }\n\n get readyToSign() {\n return (\n !!this.status &&\n (this.status?.type === SigningStatus.ReadyToSign ||\n this.status?.type === SigningStatus.UpdatesPaused)\n )\n }\n\n calculateWarnings() {\n const warnings: Warning[] = []\n\n const latestState = this.#portfolio.getLatestPortfolioState(this.accountOp.accountAddr)\n const pendingState = this.#portfolio.getPendingPortfolioState(this.accountOp.accountAddr)\n\n const significantBalanceDecreaseWarning = getSignificantBalanceDecreaseWarning(\n latestState,\n pendingState,\n this.accountOp.networkId\n )\n\n if (this.selectedOption) {\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const feeTokenHasPrice = this.feeSpeeds[identifier]?.every((speed) => !!speed.amountUsd)\n const feeTokenPriceUnavailableWarning = getFeeTokenPriceUnavailableWarning(\n !!this.hasSpeeds(identifier),\n feeTokenHasPrice\n )\n\n // push the warning only if the txn is not sponsored\n if (!this.isSponsored && feeTokenPriceUnavailableWarning)\n warnings.push(feeTokenPriceUnavailableWarning)\n }\n\n if (significantBalanceDecreaseWarning) warnings.push(significantBalanceDecreaseWarning)\n\n this.warnings = warnings\n\n this.emitUpdate()\n }\n\n update({\n gasPrices,\n estimation,\n feeToken,\n paidBy,\n speed,\n signingKeyAddr,\n signingKeyType,\n calls,\n gasUsedTooHighAgreed,\n rbfAccountOps,\n bundlerGasPrices,\n blockGasLimit\n }: {\n gasPrices?: GasRecommendation[]\n estimation?: EstimateResult | null\n feeToken?: TokenResult\n paidBy?: string\n speed?: FeeSpeed\n signingKeyAddr?: Key['addr']\n signingKeyType?: Key['type']\n calls?: AccountOp['calls']\n gasUsedTooHighAgreed?: boolean\n rbfAccountOps?: { [key: string]: SubmittedAccountOp | null }\n bundlerGasPrices?: { speeds: GasSpeeds; bundler: BUNDLER }\n blockGasLimit?: bigint\n }) {\n // once the user commits to the things he sees on his screen,\n // we need to be sure nothing changes afterwards.\n // For example, signing can be slow if it's done by a hardware wallet.\n // The estimation gets refreshed on the other hand each 12 seconds (6 on optimism)\n // If we allow the estimation to affect the controller state during sign,\n // there could be discrepancy between what the user has agreed upon and what\n // we broadcast in the end\n if (this.status?.type && noStateUpdateStatuses.indexOf(this.status?.type) !== -1) {\n return\n }\n\n if (Array.isArray(calls)) this.accountOp.calls = calls\n\n if (blockGasLimit) this.#blockGasLimit = blockGasLimit\n\n if (gasPrices) this.gasPrices = gasPrices\n\n if (estimation) {\n this.gasUsedTooHigh = !!(this.#blockGasLimit && estimation.gasUsed > this.#blockGasLimit / 4n)\n this.estimation = estimation\n // on each estimation update, set the newest account nonce\n this.accountOp.nonce = BigInt(estimation.currentAccountNonce)\n }\n\n // if estimation is undefined, do not clear the estimation.\n // We do this only if strictly specified as null\n if (estimation === null) this.estimation = null\n\n if (feeToken && paidBy) {\n this.paidBy = paidBy\n this.feeTokenResult = feeToken\n }\n\n if (speed && this.isInitialized) {\n this.selectedFeeSpeed = speed\n }\n\n if (signingKeyAddr && signingKeyType && this.isInitialized) {\n this.accountOp.signingKeyAddr = signingKeyAddr\n this.accountOp.signingKeyType = signingKeyType\n }\n\n if (gasUsedTooHighAgreed !== undefined) this.gasUsedTooHighAgreed = gasUsedTooHighAgreed\n\n // set the rbf is != undefined\n if (rbfAccountOps) this.rbfAccountOps = rbfAccountOps\n\n // Set defaults, if some of the optional params are omitted\n this.#setDefaults()\n\n if (this.estimation && this.paidBy && this.feeTokenResult) {\n this.selectedOption = this.availableFeeOptions.find(\n (option) =>\n option.paidBy === this.paidBy &&\n option.token.address === this.feeTokenResult!.address &&\n option.token.symbol.toLocaleLowerCase() ===\n this.feeTokenResult!.symbol.toLocaleLowerCase() &&\n option.token.flags.onGasTank === this.feeTokenResult!.flags.onGasTank\n )\n }\n\n // update the bundler gas prices if the bundlers match\n if (\n this.estimation?.erc4337GasLimits &&\n bundlerGasPrices &&\n bundlerGasPrices.bundler === this.bundlerSwitcher.getBundler().getName()\n ) {\n this.estimation.erc4337GasLimits.gasPrice = bundlerGasPrices.speeds\n }\n\n if (\n this.estimation &&\n this.estimation.erc4337GasLimits &&\n this.estimation.erc4337GasLimits.paymaster\n ) {\n // if it was sponsored but it no longer is (fallback case),\n // reset the selectedOption option as we use native for the sponsorship\n // but the user might not actually have any native\n const isSponsorshipFallback =\n this.isSponsored && !this.estimation.erc4337GasLimits.paymaster.isSponsored()\n\n this.isSponsored = this.estimation.erc4337GasLimits.paymaster.isSponsored()\n this.sponsor = this.estimation.erc4337GasLimits.paymaster.getEstimationData()?.sponsor\n\n if (isSponsorshipFallback) {\n this.selectedOption = this.availableFeeOptions.length\n ? this.availableFeeOptions[0]\n : undefined\n }\n }\n\n // calculate the fee speeds if either there are no feeSpeeds\n // or any of properties for update is requested\n if (!Object.keys(this.feeSpeeds).length || Array.isArray(calls) || gasPrices || estimation) {\n this.#updateFeeSpeeds()\n }\n\n // Here, we expect to have most of the fields set, so we can safely set GasFeePayment\n this.#setGasFeePayment()\n this.updateStatus()\n this.calculateWarnings()\n }\n\n updateStatus(forceStatusChange?: SigningStatus, replacementFeeLow = false) {\n // use this to go back to ReadyToSign when a broadcasting error is emitted\n if (forceStatusChange) {\n this.status = { type: forceStatusChange }\n this.emitUpdate()\n return\n }\n\n // no status updates on these two\n const isInTheMiddleOfSigning =\n this.status?.type === SigningStatus.InProgress ||\n this.status?.type === SigningStatus.WaitingForPaymaster\n const isDone = this.status?.type === SigningStatus.Done\n if (isInTheMiddleOfSigning || isDone) return\n\n // if we have an estimation error, set the state so and return\n if (this.estimation?.error) {\n this.status = { type: SigningStatus.EstimationError }\n this.emitUpdate()\n return\n }\n\n if (this.errors.length) {\n this.status = { type: SigningStatus.UnableToSign }\n this.emitUpdate()\n return\n }\n\n if (\n this.isInitialized &&\n this.estimation &&\n this.accountOp?.signingKeyAddr &&\n this.accountOp?.signingKeyType &&\n this.accountOp?.gasFeePayment &&\n // if the gas used is too high, do not allow the user to sign\n // until he explicitly agrees to the risks\n (!this.gasUsedTooHigh || this.gasUsedTooHighAgreed)\n ) {\n this.status = { type: SigningStatus.ReadyToSign }\n\n // do not reset this once triggered\n if (replacementFeeLow) this.replacementFeeLow = replacementFeeLow\n this.emitUpdate()\n return\n }\n\n // reset the status if a valid state was not found\n this.status = null\n this.emitUpdate()\n }\n\n reset() {\n this.gasPrices = null\n this.estimation = null\n this.selectedFeeSpeed = FeeSpeed.Fast\n this.paidBy = null\n this.feeTokenResult = null\n this.status = null\n this.emitUpdate()\n }\n\n resetStatus() {\n this.status = null\n this.emitUpdate()\n }\n\n /**\n * Obtain the native token ratio in relation to a fee token.\n *\n * By knowing the USD value of the tokens in the portfolio,\n * we can calculate the ratio between a native token and a fee token.\n *\n * For example, 1 ETH = 8 BNB (ratio: 8).\n *\n * We require the ratio to be in a BigInt format since all the application values,\n * such as amount, gasLimit, etc., are also represented as BigInt numbers.\n */\n #getNativeToFeeTokenRatio(feeToken: TokenResult): bigint | null {\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n\n // In case the fee token is the native token we don't want to depend to priceIn, as it might not be available.\n if (native.address === feeToken.address && native.networkId === feeToken.networkId)\n return BigInt(1 * 1e18)\n\n const isUsd = (price: Price) => price.baseCurrency === 'usd'\n\n const nativePrice = native.priceIn.find(isUsd)?.price\n const feeTokenPrice = feeToken.priceIn.find(isUsd)?.price\n\n if (!nativePrice || !feeTokenPrice) return null\n\n const ratio = nativePrice / feeTokenPrice\n\n // Here we multiply it by 1e18, in order to keep the decimal precision.\n // Otherwise, passing the ratio to the BigInt constructor, we will lose the numbers after the decimal point.\n // Later, once we need to normalize this ratio, we should not forget to divide it by 1e18.\n const ratio1e18 = ratio * 1e18\n const toBigInt = ratio1e18 % 1 === 0 ? ratio1e18 : ratio1e18.toFixed(0)\n return BigInt(toBigInt)\n }\n\n static getAmountAfterFeeTokenConvert(\n simulatedGasLimit: bigint,\n gasPrice: bigint,\n nativeRatio: bigint,\n feeTokenDecimals: number,\n addedNative: bigint\n ) {\n const amountInWei = simulatedGasLimit * gasPrice + addedNative\n\n // Let's break down the process of converting the amount into FeeToken:\n // 1. Initially, we multiply the amount in wei by the native to fee token ratio.\n // 2. Next, we address the decimal places:\n // 2.1. First, we convert wei to native by dividing by 10^18 (representing the decimals).\n // 2.2. Now, with the amount in the native token, we incorporate nativeRatio decimals into the calculation (18 + 18) to standardize the amount.\n // 2.3. At this point, we precisely determine the number of fee tokens. For instance, if the amount is 3 USDC, we must convert it to a BigInt value, while also considering feeToken.decimals.\n const extraDecimals = BigInt(10 ** 18)\n const feeTokenExtraDecimals = BigInt(10 ** (18 - feeTokenDecimals))\n const pow = extraDecimals * feeTokenExtraDecimals\n return (amountInWei * nativeRatio) / pow\n }\n\n /**\n * Increase the fee we send to the feeCollector according to the specified\n * options in the network tab\n */\n #increaseFee(amount: bigint): bigint {\n if (!this.#network.feeOptions.feeIncrease) {\n return amount\n }\n\n return amount + (amount * this.#network.feeOptions.feeIncrease) / 100n\n }\n\n /**\n * If the nonce of the current account op and the last account op are the same,\n * do an RBF increase or otherwise the user cannot broadcast the txn\n *\n * calculatedGas: it should be either the whole gasPrice if the network doesn't\n * support EIP-1559 OR it should the maxPriorityFeePerGas if the network\n * supports EIP-1559\n *\n * gasPropertyName: pass gasPrice if no EIP-1559; otherwise: maxPriorityFeePerGas\n */\n #rbfIncrease(\n accId: string,\n calculatedGas: bigint,\n gasPropertyName: 'gasPrice' | 'maxPriorityFeePerGas',\n prevSpeed: SpeedCalc | null\n ): bigint {\n // ape speed gets 50% increase\n const divider = prevSpeed && prevSpeed.type === FeeSpeed.Fast ? 2n : 8n\n\n // when doing an RBF, make sure the min gas for the current speed\n // is at least 12% bigger than the previous speed\n const prevSpeedGas = prevSpeed ? prevSpeed[gasPropertyName] : undefined\n const prevSpeedGasIncreased = prevSpeedGas ? prevSpeedGas + prevSpeedGas / divider : 0n\n const min = prevSpeedGasIncreased > calculatedGas ? prevSpeedGasIncreased : calculatedGas\n\n // if there was an error on the signed account op with a\n // replacement fee too low, we increase by 13% the signed account op\n // IF the new estimation is not actually higher\n if (this.replacementFeeLow && this.signedAccountOp && this.signedAccountOp.gasFeePayment) {\n const prevGas = this.signedAccountOp.gasFeePayment[gasPropertyName] ?? undefined\n const bumpFees = prevGas ? prevGas + prevGas / divider + prevGas / 100n : 0n\n return min > bumpFees ? min : bumpFees\n }\n\n // if no RBF option for this paidBy option, return the amount\n const rbfOp = this.rbfAccountOps[accId]\n if (!rbfOp || !rbfOp.gasFeePayment || !rbfOp.gasFeePayment[gasPropertyName])\n return calculatedGas\n\n // increase by a minimum of 13% the last broadcast txn and use that\n // or use the current gas estimation if it's more\n const rbfGas = rbfOp.gasFeePayment[gasPropertyName] ?? 0n\n const lastTxnGasPriceIncreased = rbfGas + rbfGas / divider + rbfGas / 100n\n return min > lastTxnGasPriceIncreased ? min : lastTxnGasPriceIncreased\n }\n\n get #feeSpeedsLoading() {\n return !this.isInitialized || !this.gasPrices\n }\n\n #updateFeeSpeeds() {\n if (this.#feeSpeedsLoading) return\n\n // reset the fee speeds at the beginning to avoid duplications\n this.feeSpeeds = {}\n\n const gasUsed = this.estimation!.gasUsed\n\n this.availableFeeOptions.forEach((option) => {\n // if a calculation has been made, do not make it again\n // EOA pays for SA is the most common case for this scenario\n //\n // addition: make sure there's no rbfAccountOps as well\n const identifier = getFeeSpeedIdentifier(\n option,\n this.accountOp.accountAddr,\n this.rbfAccountOps[option.paidBy]\n )\n if (this.hasSpeeds(identifier)) {\n return\n }\n\n const nativeRatio = this.#getNativeToFeeTokenRatio(option.token)\n if (!nativeRatio) {\n this.feeSpeeds[identifier] = []\n return\n }\n\n const erc4337GasLimits = this.estimation?.erc4337GasLimits\n if (erc4337GasLimits) {\n const speeds: SpeedCalc[] = []\n const usesPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n\n for (const [speed, speedValue] of Object.entries(erc4337GasLimits.gasPrice)) {\n const simulatedGasLimit =\n BigInt(erc4337GasLimits.callGasLimit) +\n BigInt(erc4337GasLimits.preVerificationGas) +\n BigInt(option.gasUsed ?? 0)\n const gasPrice = BigInt(speedValue.maxFeePerGas)\n let amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n 0n\n )\n if (usesPaymaster) amount = this.#increaseFee(amount)\n\n speeds.push({\n type: speed as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas: BigInt(speedValue.maxPriorityFeePerGas)\n })\n }\n\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier] = speeds\n return\n }\n\n ;(this.gasPrices || []).forEach((gasRecommendation, i) => {\n let amount\n let simulatedGasLimit\n const prevSpeed =\n this.feeSpeeds[identifier] && this.feeSpeeds[identifier].length\n ? this.feeSpeeds[identifier][i - 1]\n : null\n\n // gasRecommendation can come as GasPriceRecommendation or Gas1559Recommendation\n // depending whether the network supports EIP-1559 and is it enabled on our side.\n // To check, we use maxPriorityFeePerGas. If it's set => EIP-1559.\n // After, we call #rbfIncrease on maxPriorityFeePerGas if set which either returns\n // the maxPriorityFeePerGas without doing anything (most cases) or if there's a\n // pending txn in the mempool, it bumps maxPriorityFeePerGas by 12.5% to enable RBF.\n // Finally, we calculate the gasPrice:\n // - EIP-1559: baseFeePerGas + maxPriorityFeePerGas\n // - Normal: gasRecommendation.gasPrice #rbfIncreased (same logic as for maxPriorityFeePerGas RBF)\n const maxPriorityFeePerGas =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? this.#rbfIncrease(\n option.paidBy,\n gasRecommendation.maxPriorityFeePerGas,\n 'maxPriorityFeePerGas',\n prevSpeed\n )\n : undefined\n\n const gasPrice =\n 'maxPriorityFeePerGas' in gasRecommendation\n ? (gasRecommendation as Gas1559Recommendation).baseFeePerGas + maxPriorityFeePerGas!\n : this.#rbfIncrease(\n option.paidBy,\n (gasRecommendation as GasPriceRecommendation).gasPrice,\n 'gasPrice',\n prevSpeed\n )\n\n // EOA\n if (!isSmartAccount(this.account)) {\n simulatedGasLimit = gasUsed\n\n if (this.accountOp.calls[0].to && getAddress(this.accountOp.calls[0].to) === SINGLETON) {\n simulatedGasLimit = getGasUsed(simulatedGasLimit)\n }\n\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else if (option.paidBy !== this.accountOp.accountAddr) {\n // Smart account, but EOA pays the fee\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork()\n amount = simulatedGasLimit * gasPrice + option.addedNative\n } else {\n // Relayer\n simulatedGasLimit = gasUsed + this.getCallDataAdditionalByNetwork() + option.gasUsed!\n amount = SignAccountOpController.getAmountAfterFeeTokenConvert(\n simulatedGasLimit,\n gasPrice,\n nativeRatio,\n option.token.decimals,\n option.addedNative\n )\n amount = this.#increaseFee(amount)\n }\n\n const feeSpeed: SpeedCalc = {\n type: gasRecommendation.name as FeeSpeed,\n simulatedGasLimit,\n amount,\n amountFormatted: formatUnits(amount, Number(option.token.decimals)),\n amountUsd: getTokenUsdAmount(option.token, amount),\n gasPrice,\n maxPriorityFeePerGas\n }\n if (this.feeSpeeds[identifier] === undefined) this.feeSpeeds[identifier] = []\n this.feeSpeeds[identifier].push(feeSpeed)\n })\n })\n }\n\n #getGasFeePayment(): GasFeePayment | null {\n if (!this.isInitialized) {\n this.emitError({\n level: 'major',\n message:\n 'Something went wrong while setting up the gas fee payment account and token. Please try again, selecting the account and token option. If the problem persists, contact support.',\n error: new Error(\n 'SignAccountOpController: The controller is not initialized while we are trying to build GasFeePayment.'\n )\n })\n\n return null\n }\n if (!this.paidBy) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying account not selected')\n })\n\n return null\n }\n if (!this.feeTokenResult) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee token not selected')\n })\n\n return null\n }\n\n // if there are no availableFeeOptions, we don't have a gasFee\n // this is normal though as there are such cases:\n // - EOA paying in native but doesn't have any native\n // so no error should pop out because of this\n if (!this.availableFeeOptions.length) {\n return null\n }\n\n if (!this.selectedOption) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: paying option not found')\n })\n\n return null\n }\n\n // if there are no fee speeds available for the option, it means\n // the nativeRatio could not be calculated. In that case, we do not\n // emit an error here but proceed and show an explanation to the user\n // in get errors()\n // check test: Signing [Relayer]: ... priceIn | native/Ratio\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n if (!this.feeSpeeds[identifier].length) {\n return null\n }\n\n const chosenSpeed = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n if (!chosenSpeed) {\n this.emitError({\n level: 'silent',\n message: '',\n error: new Error('SignAccountOpController: fee speed not selected')\n })\n\n return null\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n return {\n paidBy: this.paidBy,\n // we're allowing EOAs to broadcast on 4337 networks as well\n // in that case, we don't do user operations\n isERC4337:\n this.paidBy === this.accountOp.accountAddr &&\n isErc4337Broadcast(this.account, this.#network, accountState),\n isGasTank: this.feeTokenResult.flags.onGasTank,\n inToken: this.feeTokenResult.address,\n feeTokenNetworkId: this.feeTokenResult.networkId,\n amount: chosenSpeed.amount,\n simulatedGasLimit: chosenSpeed.simulatedGasLimit,\n gasPrice: chosenSpeed.gasPrice,\n maxPriorityFeePerGas:\n 'maxPriorityFeePerGas' in chosenSpeed ? chosenSpeed.maxPriorityFeePerGas : undefined\n }\n }\n\n get feeToken(): string | null {\n return this.accountOp?.gasFeePayment?.inToken || null\n }\n\n get feePaidBy(): string | null {\n return this.accountOp?.gasFeePayment?.paidBy || null\n }\n\n get availableFeeOptions(): EstimateResult['feePaymentOptions'] {\n if (!this.estimation) return []\n\n // if the txn is sponsored, return the native option only\n // even if it's balance is 0\n if (this.isSponsored) {\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n // FeeOptions having amount\n const withAmounts = this.estimation.feePaymentOptions.filter(\n (feeOption) => feeOption.availableAmount\n )\n if (withAmounts.length) return withAmounts\n\n // if there are no fee options with amounts, return the native option\n const native = this.estimation.feePaymentOptions.find(\n (feeOption) => feeOption.token.address === ZeroAddress\n )\n return native ? [native] : []\n }\n\n get accountKeyStoreKeys(): Key[] {\n return this.#keystore.keys.filter((key) => this.account.associatedKeys.includes(key.addr))\n }\n\n // eslint-disable-next-line class-methods-use-this\n get speedOptions() {\n return Object.values(FeeSpeed) as string[]\n }\n\n get gasSavedUSD(): number | null {\n if (!this.selectedOption?.token.flags.onGasTank) return null\n\n const identifier = getFeeSpeedIdentifier(\n this.selectedOption,\n this.accountOp.accountAddr,\n this.rbfAccountOps[this.selectedOption.paidBy]\n )\n const selectedFeeSpeedData = this.feeSpeeds[identifier].find(\n (speed) => speed.type === this.selectedFeeSpeed\n )\n const gasPrice = selectedFeeSpeedData?.gasPrice\n if (!gasPrice) return null\n\n // get the native token from the portfolio to calculate prices\n const native = this.#portfolio\n .getLatestPortfolioState(this.accountOp.accountAddr)\n [this.accountOp.networkId]?.result?.tokens.find(\n (token) => token.address === '0x0000000000000000000000000000000000000000'\n )\n if (!native) return null\n const nativePrice = native.priceIn.find((price) => price.baseCurrency === 'usd')?.price\n if (!nativePrice) return null\n\n // 4337 gasUsed is set to 0 in the estimation as we rely\n // on the bundler for the estimation entirely => use hardcode value\n const gasUsedSelectedOption =\n this.selectedOption.gasUsed && this.selectedOption.gasUsed > 0n\n ? this.selectedOption.gasUsed\n : GAS_TANK_TRANSFER_GAS_USED\n const isNativeSelected = this.selectedOption.token.address === ZeroAddress\n const gasUsedNative =\n this.availableFeeOptions.find(\n (option) => option.token.address === ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_NATIVE_TRANSFER_GAS_USED\n const gasUsedERC20 =\n this.availableFeeOptions.find(\n (option) => option.token.address !== ZeroAddress && !option.token.flags.onGasTank\n )?.gasUsed || SA_ERC20_TRANSFER_GAS_USED\n\n const gasUsedWithoutGasTank = isNativeSelected ? gasUsedNative : gasUsedERC20\n const gasSavedInNative = formatEther((gasUsedWithoutGasTank - gasUsedSelectedOption) * gasPrice)\n\n return Number(gasSavedInNative) * nativePrice\n }\n\n #emitSigningErrorAndResetToReadyToSign(error: string) {\n this.emitError({ level: 'major', message: error, error: new Error(error) })\n this.status = { type: SigningStatus.ReadyToSign }\n\n this.emitUpdate()\n }\n\n #addFeePayment() {\n // In case of gas tank token fee payment, we need to include one more call to account op\n const abiCoder = new AbiCoder()\n\n if (this.isSponsored) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(['string', 'uint256', 'string'], ['gasTank', 0n, 'USDC'])\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.isGasTank) {\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: 0n,\n data: abiCoder.encode(\n ['string', 'uint256', 'string'],\n ['gasTank', this.accountOp.gasFeePayment!.amount, this.feeTokenResult?.symbol]\n )\n }\n\n return\n }\n\n if (this.accountOp.gasFeePayment!.inToken === '0x0000000000000000000000000000000000000000') {\n // native payment\n this.accountOp.feeCall = {\n to: FEE_COLLECTOR,\n value: this.accountOp.gasFeePayment!.amount,\n data: '0x'\n }\n } else {\n // token payment\n const ERC20Interface = new Interface(ERC20.abi)\n this.accountOp.feeCall = {\n to: this.accountOp.gasFeePayment!.inToken,\n value: 0n,\n data: ERC20Interface.encodeFunctionData('transfer', [\n FEE_COLLECTOR,\n this.accountOp.gasFeePayment!.amount\n ])\n }\n }\n }\n\n async sign() {\n if (!this.readyToSign) {\n const message = `Unable to sign the transaction. During the preparation step, the necessary transaction data was not received. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // when signing begings, we stop immediatelly state updates on the controller\n // by changing the status to InProgress. Check update() for more info\n this.status = { type: SigningStatus.InProgress }\n\n if (!this.accountOp?.signingKeyAddr || !this.accountOp?.signingKeyType) {\n const message = `Unable to sign the transaction. During the preparation step, required signing key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n if (!this.accountOp?.gasFeePayment || !this.selectedOption) {\n const message = `Unable to sign the transaction. During the preparation step, required information about paying the gas fee was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const signer = await this.#keystore.getSigner(\n this.accountOp.signingKeyAddr,\n this.accountOp.signingKeyType\n )\n if (!signer) {\n const message = `Unable to sign the transaction. During the preparation step, required account key information was found missing. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n const accountState =\n this.#accounts.accountStates[this.accountOp.accountAddr][this.accountOp.networkId]\n const isUsingPaymaster = !!this.estimation?.erc4337GasLimits?.paymaster.isUsable()\n const usesOneTimeNonce = shouldUseOneTimeNonce(accountState)\n if (this.accountOp.gasFeePayment.isERC4337 && isUsingPaymaster && !usesOneTimeNonce) {\n this.status = { type: SigningStatus.WaitingForPaymaster }\n } else {\n this.status = { type: SigningStatus.InProgress }\n }\n\n // we update the FE with the changed status (in progress) only after the checks\n // above confirm everything is okay to prevent two different state updates\n this.emitUpdate()\n\n const gasFeePayment = this.accountOp.gasFeePayment\n\n if (signer.init) signer.init(this.#externalSignerControllers[this.accountOp.signingKeyType])\n\n // just in-case: before signing begins, we delete the feeCall;\n // if there's a need for it, it will be added later on in the code.\n // We need this precaution because this could happen:\n // - try to broadcast with the relayer\n // - the feel call gets added\n // - the relayer broadcast fails\n // - the user does another broadcast, this time with EOA pays for SA\n // - the fee call stays, causing a low gas limit revert\n delete this.accountOp.feeCall\n\n // delete the activatorCall as a precaution that it won't be added twice\n delete this.accountOp.activatorCall\n\n // @EntryPoint activation\n // if we broadcast by an EOA, this is the only way to include\n // the entry point as a signer\n if (\n shouldIncludeActivatorCall(\n this.#network,\n this.account,\n accountState,\n this.accountOp.gasFeePayment.isERC4337\n )\n ) {\n this.accountOp.activatorCall = getActivatorCall(this.accountOp.accountAddr)\n }\n\n try {\n // In case of EOA account\n if (!isSmartAccount(this.account)) {\n if (this.accountOp.calls.length !== 1) {\n const callCount = this.accountOp.calls.length > 1 ? 'multiple' : 'zero'\n const message = `Unable to sign the transaction because it has ${callCount} calls. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n return this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n\n // In legacy mode, we sign the transaction directly.\n // that means the signing will happen on broadcast and here\n // checking whether the call is 1 and 1 only is enough\n this.accountOp.signature = '0x'\n } else if (this.accountOp.gasFeePayment.paidBy !== this.account.addr) {\n // Smart account, but EOA pays the fee\n // EOA pays for execute() - relayerless\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n } else if (this.accountOp.gasFeePayment.isERC4337) {\n // if there's no entryPointAuthorization, the txn will fail\n if (\n !accountState.isDeployed &&\n (!this.accountOp.meta || !this.accountOp.meta.entryPointAuthorization)\n )\n return this.#emitSigningErrorAndResetToReadyToSign(\n `Unable to sign the transaction because entry point privileges were not granted. ${RETRY_TO_INIT_ACCOUNT_OP_MSG}`\n )\n\n const erc4337Estimation = this.estimation!.erc4337GasLimits as Erc4337GasLimits\n\n const userOperation = getUserOperation(\n this.account,\n accountState,\n this.accountOp,\n this.bundlerSwitcher.getBundler().getName(),\n !accountState.isDeployed ? this.accountOp.meta!.entryPointAuthorization : undefined\n )\n userOperation.preVerificationGas = erc4337Estimation.preVerificationGas\n userOperation.callGasLimit = toBeHex(\n BigInt(erc4337Estimation.callGasLimit) + (this.selectedOption.gasUsed ?? 0n)\n )\n userOperation.verificationGasLimit = erc4337Estimation.verificationGasLimit\n userOperation.paymasterVerificationGasLimit =\n erc4337Estimation.paymasterVerificationGasLimit\n userOperation.paymasterPostOpGasLimit = erc4337Estimation.paymasterPostOpGasLimit\n userOperation.maxFeePerGas = toBeHex(gasFeePayment.gasPrice)\n userOperation.maxPriorityFeePerGas = toBeHex(gasFeePayment.maxPriorityFeePerGas!)\n\n const paymaster = erc4337Estimation.paymaster\n if (paymaster.shouldIncludePayment()) this.#addFeePayment()\n\n const ambireAccount = new Interface(AmbireAccount.abi)\n if (usesOneTimeNonce) {\n const signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n\n // after signing has completed, we wait for the paymaster response\n // so we tell the user\n this.status = { type: SigningStatus.WaitingForPaymaster }\n this.emitUpdate()\n\n userOperation.callData = ambireAccount.encodeFunctionData('executeMultiple', [\n [[getSignableCalls(this.accountOp), signature]]\n ])\n this.accountOp.signature = signature\n } else {\n userOperation.callData = ambireAccount.encodeFunctionData('executeBySender', [\n getSignableCalls(this.accountOp)\n ])\n }\n\n if (paymaster.isUsable()) {\n const response = await paymaster.call(\n this.account,\n this.accountOp,\n userOperation,\n this.#network\n )\n\n if (response.success) {\n const paymasterData = response as PaymasterSuccessReponse\n this.status = { type: SigningStatus.InProgress }\n this.emitUpdate()\n\n userOperation.paymaster = paymasterData.paymaster\n userOperation.paymasterData = paymasterData.paymasterData\n if (usesOneTimeNonce) userOperation.nonce = getOneTimeNonce(userOperation)\n this.accountOp.gasFeePayment.isSponsored = paymaster.isSponsored()\n } else {\n const errorResponse = response as PaymasterErrorReponse\n this.emitError({\n level: 'major',\n message: errorResponse.message,\n error: errorResponse.error\n })\n this.status = { type: SigningStatus.ReadyToSign }\n this.emitUpdate()\n this.#reEstimate()\n return\n }\n }\n\n // query the application state from memory to understand if the user\n // hasn't actually rejected the request while waiting for the\n // paymaster to respond\n if (!this.#isSignRequestStillActive()) return\n\n if (userOperation.requestType === 'standard') {\n const typedData = getTypedData(\n this.#network.chainId,\n this.accountOp.accountAddr,\n getUserOpHash(userOperation, this.#network.chainId)\n )\n const signature = wrapStandard(await signer.signTypedData(typedData))\n userOperation.signature = signature\n this.accountOp.signature = signature\n }\n this.accountOp.asUserOperation = userOperation\n } else {\n // Relayer\n this.#addFeePayment()\n\n this.accountOp.signature = await getExecuteSignature(\n this.#network,\n this.accountOp,\n accountState,\n signer\n )\n }\n\n this.status = { type: SigningStatus.Done }\n this.signedAccountOp = structuredClone(this.accountOp)\n this.emitUpdate()\n return this.signedAccountOp\n } catch (error: any) {\n const { message } = getHumanReadableBroadcastError(error)\n\n this.#emitSigningErrorAndResetToReadyToSign(message)\n }\n }\n\n toJSON() {\n return {\n ...this,\n isInitialized: this.isInitialized,\n readyToSign: this.readyToSign,\n availableFeeOptions: this.availableFeeOptions,\n accountKeyStoreKeys: this.accountKeyStoreKeys,\n feeToken: this.feeToken,\n feePaidBy: this.feePaidBy,\n speedOptions: this.speedOptions,\n selectedOption: this.selectedOption,\n account: this.account,\n errors: this.errors,\n gasSavedUSD: this.gasSavedUSD\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js b/dist/src/controllers/swapAndBridge/swapAndBridge.js index 6a8433eb6..c08c63599 100644 --- a/dist/src/controllers/swapAndBridge/swapAndBridge.js +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js @@ -131,7 +131,7 @@ class SwapAndBridgeController extends eventEmitter_1.default { this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', []); this.#selectedAccount.onUpdate(() => { this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => { - if (this.#selectedAccount.portfolio.isAllReady) { + if (this.#selectedAccount.portfolio.isReadyToVisualize) { this.isTokenListLoading = false; this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens); // To token list includes selected account portfolio tokens, it should get an update too diff --git a/dist/src/controllers/swapAndBridge/swapAndBridge.js.map b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map index d7c61f724..f4e4b2a17 100644 --- a/dist/src/controllers/swapAndBridge/swapAndBridge.js.map +++ b/dist/src/controllers/swapAndBridge/swapAndBridge.js.map @@ -1 +1 @@ -{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { formatUnits, isAddress, parseUnits } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n ActiveRoute,\n CachedSupportedChains,\n CachedTokenListKey,\n CachedToTokenLists,\n SocketApiBridgeStep,\n SocketAPIBridgeUserTx,\n SocketAPIQuote,\n SocketAPIRoute,\n SocketAPISendTransactionRequest,\n SocketAPIToken,\n SocketRouteStatus,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport { getBridgeBanners } from '../../libs/banners/banners'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport {\n convertPortfolioTokenToSocketAPIToken,\n getActiveRoutesForAccount,\n getIsBridgeTxn,\n getIsTokenEligibleForSwapAndBridge,\n getQuoteRouteSteps,\n sortPortfolioTokenList,\n sortTokenListResponse\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { normalizeIncomingSocketToken, SocketAPI } from '../../services/socket/api'\nimport { ZERO_ADDRESS } from '../../services/socket/constants'\nimport { validateSendTransferAmount } from '../../services/validations/validate'\nimport formatDecimals from '../../utils/formatDecimals/formatDecimals'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport wait from '../../utils/wait'\nimport { AccountOpAction, ActionsController } from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { NetworksController } from '../networks/networks'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst NETWORK_MISMATCH_MESSAGE =\n 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'\n\nexport enum SwapAndBridgeFormStatus {\n Empty = 'empty',\n Invalid = 'invalid',\n FetchingRoutes = 'fetching-routes',\n NoRoutesFound = 'no-routes-found',\n InvalidRouteSelected = 'invalid-route-selected',\n ReadyToSubmit = 'ready-to-submit'\n}\n\nconst STATUS_WRAPPED_METHODS = {\n addToTokenByAddress: 'INITIAL'\n} as const\n\nconst SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24 // 1 day\nconst TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4 // 4 hours\n\nconst PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [\n 'stargate',\n 'stargate-v2',\n 'arbitrum-bridge',\n 'zksync-native'\n]\n\n/**\n * The Swap and Bridge controller is responsible for managing the state and\n * logic related to swapping and bridging tokens across different networks.\n * Key responsibilities:\n * - Initially setting up the swap and bridge form with the necessary data.\n * - Managing form state for token swap and bridge operations (including user preferences).\n * - Fetching and updating token lists (from and to).\n * - Fetching and updating quotes for token swaps and bridges.\n * - Manages token active routes\n */\nexport class SwapAndBridgeController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #networks: NetworksController\n\n #actions: ActionsController\n\n #activity: ActivityController\n\n #invite: InviteController\n\n #storage: Storage\n\n #socketAPI: SocketAPI\n\n #activeRoutes: ActiveRoute[] = []\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n updateQuoteStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n #updateToTokenListThrottle: {\n time: number\n throttled: boolean\n shouldReset: boolean\n addressToSelect?: string\n } = {\n time: 0,\n shouldReset: true,\n throttled: false\n }\n\n #updateQuoteId?: string\n\n #updateQuoteTimeout?: ReturnType\n\n updateToTokenListStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n sessionIds: string[] = []\n\n fromChainId: number | null = 1\n\n fromSelectedToken: TokenResult | null = null\n\n fromAmount: string = ''\n\n fromAmountInFiat: string = ''\n\n fromAmountFieldMode: 'fiat' | 'token' = 'token'\n\n toChainId: number | null = 1\n\n toSelectedToken: SwapAndBridgeToToken | null = null\n\n quote: SocketAPIQuote | null = null\n\n quoteRoutesStatuses: { [key: string]: { status: string } } = {}\n\n portfolioTokenList: TokenResult[] = []\n\n isTokenListLoading: boolean = false\n\n /**\n * Needed to efficiently manage and cache token lists for different chain\n * combinations (fromChainId and toChainId) without having to fetch them\n * repeatedly from the API. Moreover, this way tokens added to a list by\n * address are also cached for sometime.\n */\n #cachedToTokenLists: CachedToTokenLists = {}\n\n #toTokenList: SwapAndBridgeToToken[] = []\n\n /**\n * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API\n * calls to fetch the supported chains from our service provider.\n */\n #cachedSupportedChains: CachedSupportedChains = { lastFetched: 0, data: [] }\n\n routePriority: 'output' | 'time' = 'output'\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n constructor({\n selectedAccount,\n networks,\n activity,\n socketAPI,\n storage,\n actions,\n invite\n }: {\n selectedAccount: SelectedAccountController\n networks: NetworksController\n activity: ActivityController\n socketAPI: SocketAPI\n storage: Storage\n actions: ActionsController\n invite: InviteController\n }) {\n super()\n this.#selectedAccount = selectedAccount\n this.#networks = networks\n this.#activity = activity\n this.#socketAPI = socketAPI\n this.#storage = storage\n this.#actions = actions\n this.#invite = invite\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#initialLoadPromise = this.#load()\n }\n\n #emitUpdateIfNeeded() {\n const shouldSkipUpdate =\n // No need to emit emit updates if there are no active sessions\n !this.sessionIds.length &&\n // but ALSO there are no active routes (otherwise, banners need the updates)\n !this.activeRoutes.length\n if (shouldSkipUpdate) return\n\n super.emitUpdate()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n\n this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', [])\n\n this.#selectedAccount.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => {\n if (this.#selectedAccount.portfolio.isAllReady) {\n this.isTokenListLoading = false\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n // To token list includes selected account portfolio tokens, it should get an update too\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(false)\n }\n })\n })\n this.#emitUpdateIfNeeded()\n }\n\n // The token in portfolio is the source of truth for the amount, it updates\n // on every balance (pending or anything) change.\n #getFromSelectedTokenInPortfolio = () =>\n this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId &&\n getIsTokenEligibleForSwapAndBridge(t)\n )\n\n get maxFromAmount(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number')\n return '0'\n\n return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals)\n }\n\n get maxFromAmountInFiat(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n) return '0'\n\n const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price\n if (!tokenPrice || !Number(this.maxFromAmount)) return '0'\n\n const maxAmount = getTokenAmount(tokenRef)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n BigInt(maxAmount) * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n tokenRef.decimals + tokenPriceDecimals\n )\n }\n\n get isFormEmpty() {\n return (\n !this.fromChainId ||\n !this.toChainId ||\n !this.fromAmount ||\n !this.fromSelectedToken ||\n !this.toSelectedToken\n )\n }\n\n get formStatus() {\n if (this.isFormEmpty) return SwapAndBridgeFormStatus.Empty\n if (this.validateFromAmount.message) return SwapAndBridgeFormStatus.Invalid\n if (this.updateQuoteStatus !== 'INITIAL' && !this.quote)\n return SwapAndBridgeFormStatus.FetchingRoutes\n if (!this.quote?.selectedRoute) return SwapAndBridgeFormStatus.NoRoutesFound\n\n if (this.quote?.selectedRoute?.errorMessage) return SwapAndBridgeFormStatus.InvalidRouteSelected\n\n return SwapAndBridgeFormStatus.ReadyToSubmit\n }\n\n get validateFromAmount() {\n if (!this.fromSelectedToken) return { success: false, message: '' }\n\n if (\n !this.isFormEmpty &&\n !this.quote &&\n Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')\n ) {\n return {\n success: true,\n message: '🔔 A route was found for this pair but the minimum token amount was not met.'\n }\n }\n\n return validateSendTransferAmount(\n this.fromAmount,\n Number(this.maxFromAmount),\n Number(this.maxFromAmountInFiat),\n this.fromSelectedToken\n )\n }\n\n get activeRoutesInProgress() {\n return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash)\n }\n\n get activeRoutes() {\n return this.#activeRoutes\n }\n\n set activeRoutes(value: ActiveRoute[]) {\n this.#activeRoutes = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('swapAndBridgeActiveRoutes', value)\n }\n\n get isSwitchFromAndToTokensEnabled() {\n if (!this.toSelectedToken) return false\n if (!this.portfolioTokenList.length) return false\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n\n return !!this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )\n }\n\n get shouldEnableRoutesSelection() {\n return (\n !!this.quote &&\n !!this.quote.routes &&\n this.quote.routes.length > 1 &&\n this.updateQuoteStatus !== 'LOADING'\n )\n }\n\n async initForm(sessionId: string) {\n await this.#initialLoadPromise\n\n if (this.sessionIds.includes(sessionId)) return\n\n // reset only if there are no other instances opened/active\n if (!this.sessionIds.length) {\n this.resetForm() // clear prev session form state\n // for each new session remove the completed activeRoutes from the previous session\n this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed')\n // remove activeRoutes errors from the previous session\n this.activeRoutes.forEach((r) => {\n if (r.routeStatus !== 'failed') {\n // eslint-disable-next-line no-param-reassign\n delete r.error\n }\n })\n if (this.activeRoutes.length) {\n // Otherwise there may be an emitUpdate with [] tokens\n this.isTokenListLoading = true\n\n // update the activeRoute.route prop for the new session\n this.activeRoutes.forEach((r) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateActiveRoute(r.activeRouteId, undefined, true)\n })\n }\n }\n\n this.sessionIds.push(sessionId)\n // do not await the health status check to prevent UI freeze while fetching\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#socketAPI.updateHealth()\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n this.isTokenListLoading = false\n // Do not await on purpose as it's not critical for the controller state to be ready\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#fetchSupportedChainsIfNeeded()\n this.#emitUpdateIfNeeded()\n }\n\n get isHealthy() {\n return this.#socketAPI.isHealthy\n }\n\n #fetchSupportedChainsIfNeeded = async () => {\n const shouldNotReFetchSupportedChains =\n this.#cachedSupportedChains.data.length &&\n Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD\n if (shouldNotReFetchSupportedChains) return\n\n try {\n const supportedChainsResponse = await this.#socketAPI.getSupportedChains()\n\n this.#cachedSupportedChains = {\n lastFetched: Date.now(),\n data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled)\n }\n this.#emitUpdateIfNeeded()\n } catch (error: any) {\n // Fail silently, as this is not a critical feature, Swap & Bridge is still usable\n this.emitError({ error, level: 'silent', message: error?.message })\n }\n }\n\n get supportedChainIds(): Network['chainId'][] {\n return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId))\n }\n\n get #toTokenListKey(): CachedTokenListKey | null {\n if (this.fromChainId === null || this.toChainId === null) return null\n\n return `from-${this.fromChainId}-to-${this.toChainId}`\n }\n\n unloadScreen(sessionId: string) {\n this.sessionIds = this.sessionIds.filter((id) => id !== sessionId)\n if (!this.sessionIds.length) {\n this.resetForm(true)\n // Reset health to prevent the error state from briefly flashing\n // before the next health check resolves when the Swap & Bridge\n // screen is opened after a some time\n this.#socketAPI.resetHealth()\n }\n }\n\n updateForm(props: {\n fromAmount?: string\n fromAmountInFiat?: string\n fromAmountFieldMode?: 'fiat' | 'token'\n fromSelectedToken?: TokenResult | null\n toChainId?: bigint | number\n toSelectedToken?: SocketAPIToken | null\n routePriority?: 'output' | 'time'\n }) {\n const {\n fromAmount,\n fromAmountInFiat,\n fromAmountFieldMode,\n fromSelectedToken,\n toChainId,\n toSelectedToken,\n routePriority\n } = props\n\n if (fromAmount !== undefined) {\n this.fromAmount = fromAmount\n ;(() => {\n if (fromAmount === '') {\n this.fromAmountInFiat = ''\n return\n }\n const tokenPrice = this.fromSelectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.fromAmountInFiat = ''\n return\n }\n\n if (\n this.fromAmountFieldMode === 'fiat' &&\n typeof this.fromSelectedToken?.decimals === 'number'\n ) {\n this.fromAmountInFiat = fromAmount\n\n // Get the number of decimals\n const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals)\n\n this.fromAmount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.fromAmountFieldMode === 'token') {\n this.fromAmount = fromAmount\n\n if (!this.fromSelectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(\n fromAmount,\n this.fromSelectedToken.decimals\n )\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.fromAmountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.fromSelectedToken.decimals + tokenPriceDecimals\n )\n }\n })()\n }\n\n if (fromAmountInFiat !== undefined) {\n this.fromAmountInFiat = fromAmountInFiat\n }\n\n if (fromAmountFieldMode) {\n this.fromAmountFieldMode = fromAmountFieldMode\n }\n\n if (fromSelectedToken) {\n const isFromNetworkChanged =\n this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId\n if (isFromNetworkChanged) {\n const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId)\n if (network) {\n this.fromChainId = Number(network.chainId)\n // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update)\n this.toChainId = Number(network.chainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n const shouldResetFromTokenAmount =\n isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address\n if (shouldResetFromTokenAmount) {\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n }\n\n // Always update to reflect portfolio amount (or other props) changes\n this.fromSelectedToken = fromSelectedToken\n }\n\n if (toChainId) {\n if (this.toChainId !== Number(toChainId)) {\n this.toChainId = Number(toChainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n if (toSelectedToken) {\n this.toSelectedToken = toSelectedToken\n }\n\n if (routePriority) {\n this.routePriority = routePriority\n if (this.quote) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n }\n }\n this.updateQuote()\n\n this.#emitUpdateIfNeeded()\n }\n\n resetForm(shouldEmit?: boolean) {\n this.fromChainId = 1\n this.fromSelectedToken = null\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toChainId = 1\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.portfolioTokenList = []\n this.#toTokenList = []\n\n if (shouldEmit) this.#emitUpdateIfNeeded()\n }\n\n updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]) {\n const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge)\n this.portfolioTokenList = sortPortfolioTokenList(\n // Filtering out hidden tokens here means: 1) They won't be displayed in\n // the \"From\" token list (`this.portfolioTokenList`) and 2) They won't be\n // added to the \"Receive\" token list as additional tokens from portfolio,\n // BUT 3) They will appear in the \"Receive\" if they are present in service\n // provider's to token list. This is the desired behavior.\n tokens.filter((t) => !t.flags.isHidden)\n )\n\n const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId\n )\n\n const shouldUpdateFromSelectedToken =\n !this.fromSelectedToken || // initial (default) state\n // May happen if selected account gets changed or the token gets send away in the meantime\n !fromSelectedTokenInNextPortfolio ||\n // May happen if user receives or sends the token in the meantime\n fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount\n\n if (shouldUpdateFromSelectedToken) {\n this.updateForm({\n fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null\n })\n } else {\n this.#emitUpdateIfNeeded()\n }\n }\n\n async updateToTokenList(shouldReset: boolean, addressToSelect?: string) {\n const now = Date.now()\n const timeSinceLastCall = now - this.#updateToTokenListThrottle.time\n if (timeSinceLastCall <= 500) {\n this.#updateToTokenListThrottle.shouldReset = shouldReset\n this.#updateToTokenListThrottle.addressToSelect = addressToSelect\n\n if (!this.#updateToTokenListThrottle.throttled) {\n this.#updateToTokenListThrottle.throttled = true\n await wait(500 - timeSinceLastCall)\n this.#updateToTokenListThrottle.throttled = false\n await this.updateToTokenList(\n this.#updateToTokenListThrottle.shouldReset,\n this.#updateToTokenListThrottle.addressToSelect\n )\n }\n return\n }\n this.updateToTokenListStatus = 'LOADING'\n this.#updateToTokenListThrottle.time = now\n if (!this.fromChainId || !this.toChainId) return\n\n if (shouldReset) {\n this.#toTokenList = []\n this.toSelectedToken = null\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const toTokenListInCache =\n this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]\n let upToDateToTokenList: SocketAPIToken[] = toTokenListInCache?.data || []\n const shouldFetchTokenList =\n !upToDateToTokenList.length ||\n now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD\n if (shouldFetchTokenList) {\n upToDateToTokenList = await this.#socketAPI.getToTokenList({\n fromChainId: this.fromChainId,\n toChainId: this.toChainId\n })\n if (this.#toTokenListKey)\n this.#cachedToTokenLists[this.#toTokenListKey] = {\n lastFetched: now,\n data: upToDateToTokenList\n }\n }\n\n const toTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )\n // should never happen\n if (!toTokenNetwork) throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n\n const additionalTokensFromPortfolio = this.portfolioTokenList\n .filter((t) => t.networkId === toTokenNetwork.id)\n .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address))\n .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId)))\n\n this.#toTokenList = sortTokenListResponse(\n [...upToDateToTokenList, ...additionalTokensFromPortfolio],\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n if (!this.toSelectedToken) {\n if (addressToSelect) {\n const token = this.#toTokenList.find((t) => t.address === addressToSelect)\n if (token) {\n this.updateForm({ toSelectedToken: token })\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n return\n }\n }\n }\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n }\n\n get toTokenList(): SwapAndBridgeToToken[] {\n const isSwapping = this.fromChainId === this.toChainId\n if (isSwapping) {\n // Swaps between same \"from\" and \"to\" tokens are not feasible, filter them out\n return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address)\n }\n\n return this.#toTokenList\n }\n\n async #addToTokenByAddress(address: string) {\n if (!this.toChainId) return // should never happen\n if (!isAddress(address)) return // no need to attempt with invalid addresses\n\n const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address)\n if (isAlreadyInTheList) return\n\n let token: SocketAPIToken | null\n try {\n token = await this.#socketAPI.getToken({ address, chainId: this.toChainId })\n\n if (!token)\n throw new SwapAndBridgeError(\n 'Token with this address is not supported by our service provider.'\n )\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n\n if (this.#toTokenListKey)\n // Cache for sometime the tokens added by address\n this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token)\n\n const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId)\n // should never happen\n if (!toTokenNetwork) {\n const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n throw new EmittableError({ error, level: 'minor', message: error?.message })\n }\n\n const nextTokenList: SwapAndBridgeToToken[] = [...this.#toTokenList, token]\n\n this.#toTokenList = sortTokenListResponse(\n nextTokenList,\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n this.#emitUpdateIfNeeded()\n return token\n }\n\n addToTokenByAddress = async (address: string) =>\n this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true)\n\n async switchFromAndToTokens() {\n if (!this.isSwitchFromAndToTokensEnabled) return\n const currentFromSelectedToken = { ...this.fromSelectedToken }\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n this.fromSelectedToken = this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )!\n this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken\n // Reverses the from and to chain ids, since their format is the same\n ;[this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]\n await this.updateToTokenList(true, currentFromSelectedToken.address)\n }\n\n async updateQuote(\n options: {\n skipQuoteUpdateOnSameValues?: boolean\n skipPreviousQuoteRemoval?: boolean\n skipStatusUpdate?: boolean\n } = {\n skipQuoteUpdateOnSameValues: true,\n skipPreviousQuoteRemoval: false,\n skipStatusUpdate: false\n }\n ) {\n const quoteId = uuidv4()\n this.#updateQuoteId = quoteId\n\n const updateQuoteFunction = async () => {\n if (!this.#selectedAccount.account) return\n if (!this.fromAmount) return\n\n const sanitizedFromAmount = getSanitizedAmount(\n this.fromAmount,\n this.fromSelectedToken!.decimals\n )\n\n const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken!.decimals)\n\n if (this.quote) {\n const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString()\n const isFromNetworkSame = this.quote.fromChainId === this.fromChainId\n const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken!.address\n const isToNetworkSame = this.quote.toChainId === this.toChainId\n const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken!.address\n\n if (\n options.skipQuoteUpdateOnSameValues &&\n isFromAmountSame &&\n isFromNetworkSame &&\n isFromAddressSame &&\n isToNetworkSame &&\n isToAddressSame\n ) {\n return\n }\n }\n if (!options.skipPreviousQuoteRemoval) {\n if (this.quote) this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const quoteResult = await this.#socketAPI.quote({\n fromChainId: this.fromChainId!,\n fromTokenAddress: this.fromSelectedToken!.address,\n toChainId: this.toChainId!,\n toTokenAddress: this.toSelectedToken!.address,\n fromAmount: bigintFromAmount,\n userAddress: this.#selectedAccount.account.addr,\n isSmartAccount: isSmartAccount(this.#selectedAccount.account),\n sort: this.routePriority,\n isOG: this.#invite.isOG\n })\n\n if (quoteId !== this.#updateQuoteId) return\n\n if (\n this.#getIsFormValidToFetchQuote() &&\n quoteResult &&\n quoteResult?.routes?.[0] &&\n quoteResult.fromChainId === this.fromChainId &&\n quoteResult.toChainId === this.toChainId &&\n quoteResult.toAsset.address === this.toSelectedToken?.address\n ) {\n let routeToSelect\n let routeToSelectSteps\n let routes = quoteResult.routes || []\n\n try {\n routes = routes.map((route) => {\n if (!route.userTxs) return route\n\n const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)) as\n | SocketAPIBridgeUserTx\n | undefined\n\n if (!bridgeTx) return route\n\n const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge') as\n | SocketApiBridgeStep\n | undefined\n\n if (!bridgeStep) return route\n if (bridgeStep.protocolFees.amount === '0') return route\n\n const normalizedProtocolFeeToken = normalizeIncomingSocketToken(\n bridgeStep.protocolFees.asset\n )\n const doesProtocolRequireExtraContractFeeInNative =\n PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) &&\n // When other tokens than the native ones are being bridged,\n // Socket API takes the fee directly from the \"From\" amount.\n normalizedProtocolFeeToken.address === ZERO_ADDRESS\n if (!doesProtocolRequireExtraContractFeeInNative) return route\n\n const protocolFeeTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId\n )!\n const isTokenToPayFeeWithTheSameAsFromToken =\n this.fromSelectedToken?.address === normalizedProtocolFeeToken.address &&\n this.fromChainId === normalizedProtocolFeeToken.chainId\n\n const tokenToPayFeeWith = this.portfolioTokenList.find((t) => {\n return (\n t.address === normalizedProtocolFeeToken.address &&\n t.networkId === protocolFeeTokenNetwork.id\n )\n })\n\n const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals\n const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? tokenToPayFeeWith.decimals\n : protocolFeeTokenDecimals\n const fromAmountNumber = Number(this.fromAmount)\n const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(\n Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)\n )\n\n const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals\n tokenToPayFeeWith.amount *\n BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals))\n : BigInt(0)\n\n const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals =\n isTokenToPayFeeWithTheSameAsFromToken\n ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals -\n fromAmountScaledToTokenToPayFeeWithDecimals\n : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals\n\n const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(\n Math.round(\n Number(bridgeStep.protocolFees.amount) *\n 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals)\n )\n )\n const hasEnoughAmountToPayFee =\n availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >=\n protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals\n\n if (!hasEnoughAmountToPayFee) {\n const protocolName = bridgeStep.protocol.displayName\n const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol\n const insufficientTokenNetwork = protocolFeeTokenNetwork.name\n const insufficientAssetAmount = formatUnits(\n bridgeStep.protocolFees.amount,\n bridgeStep.protocolFees.asset.decimals\n )\n const insufficientAssetAmountInUsd = formatDecimals(\n bridgeStep.protocolFees.feesInUsd,\n 'value'\n )\n\n // Trick to show the error message on the UI, as the API doesn't handle this\n // eslint-disable-next-line no-param-reassign\n route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`\n }\n\n return route\n })\n\n routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage))\n } catch (error) {\n // if the filtration fails for some reason continue with the original routes\n // array without interrupting the rest of the logic\n console.error(error)\n }\n\n if (!routes.length) {\n this.quote = null\n return\n }\n\n const alreadySelectedRoute = routes.find((nextRoute) => {\n if (!this.quote) return false\n\n // Because we only have routes with unique bridges (bridging case)\n const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]\n if (selectedRouteUsedBridge)\n return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge\n\n // Assuming to only have routes with unique DEXes (swapping case)\n const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName\n if (selectedRouteUsedDex) return nextRoute.usedDexName === selectedRouteUsedDex\n\n return false // should never happen, but just in case of bad data\n })\n\n if (alreadySelectedRoute) {\n routeToSelect = alreadySelectedRoute\n routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs)\n } else {\n const bestRoute =\n this.routePriority === 'output'\n ? routes[0] // API returns highest output first\n : routes[routes.length - 1] // API returns fastest... last\n routeToSelect = bestRoute\n routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs)\n }\n\n this.quote = {\n fromAsset: quoteResult.fromAsset,\n fromChainId: quoteResult.fromChainId,\n toAsset: quoteResult.toAsset,\n toChainId: quoteResult.toChainId,\n selectedRoute: routeToSelect,\n selectedRouteSteps: routeToSelectSteps,\n routes\n }\n }\n this.quoteRoutesStatuses = (quoteResult as any).bridgeRouteErrors || {}\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n }\n\n if (!this.#getIsFormValidToFetchQuote()) {\n if (this.quote || this.quoteRoutesStatuses) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n return\n }\n\n let nextTimeout = 400 // timeout when there is no pending quote update\n if (this.#updateQuoteTimeout) {\n nextTimeout = 1000 // timeout when there is a pending quote update\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }\n\n if (!options.skipStatusUpdate && !this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n this.#updateQuoteTimeout = setTimeout(async () => {\n if (!options.skipStatusUpdate && !!this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n await updateQuoteFunction()\n\n if (quoteId !== this.#updateQuoteId) return\n\n this.updateQuoteStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }, nextTimeout)\n }\n\n async getRouteStartUserTx() {\n if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) return\n\n try {\n const routeResult = await this.#socketAPI.startRoute({\n fromChainId: this.quote!.fromChainId,\n fromAssetAddress: this.quote!.fromAsset.address,\n toChainId: this.quote!.toChainId,\n toAssetAddress: this.quote!.toAsset.address,\n route: this.quote!.selectedRoute\n })\n\n return routeResult\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async getNextRouteUserTx(activeRouteId: number) {\n try {\n const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId)\n return route\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async checkForNextUserTxForActiveRoutes() {\n await this.#initialLoadPromise\n const fetchAndUpdateRoute = async (activeRoute: ActiveRoute) => {\n let status: SocketRouteStatus = null\n const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) =>\n op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)\n )\n\n // call getRouteStatus only after the transaction has processed\n if (broadcastedButNotConfirmed) return\n if (activeRoute.routeStatus === 'completed') return\n\n try {\n status = await this.#socketAPI.getRouteStatus({\n activeRouteId: activeRoute.activeRouteId,\n userTxIndex: activeRoute.userTxIndex,\n txHash: activeRoute.userTxHash!\n })\n } catch (e: any) {\n const { message } = getHumanReadableSwapAndBridgeError(e)\n this.updateActiveRoute(activeRoute.activeRouteId, { error: message })\n return\n }\n\n const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId)\n if (route?.error) {\n this.updateActiveRoute(activeRoute.activeRouteId, {\n error: undefined\n })\n }\n\n if (status === 'completed') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'completed',\n error: undefined\n },\n true\n )\n } else if (status === 'ready') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'ready',\n error: undefined\n },\n true\n )\n }\n }\n\n await Promise.all(\n this.activeRoutesInProgress.map(async (route) => {\n await fetchAndUpdateRoute(route)\n })\n )\n }\n\n selectRoute(route: SocketAPIRoute) {\n if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) return\n if (\n ![\n SwapAndBridgeFormStatus.ReadyToSubmit,\n SwapAndBridgeFormStatus.InvalidRouteSelected\n ].includes(this.formStatus)\n )\n return\n\n this.quote.selectedRoute = route\n this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs)\n\n this.#emitUpdateIfNeeded()\n }\n\n async addActiveRoute(activeRoute: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n }) {\n await this.#initialLoadPromise\n\n try {\n const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId)\n this.activeRoutes.push({\n ...activeRoute,\n routeStatus: 'ready',\n userTxHash: null,\n route\n })\n\n // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion.\n // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId,\n // while resetting all other state related to the form.\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n\n this.emitUpdate()\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'major', message })\n }\n }\n\n updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId'],\n activeRoute?: Partial,\n forceUpdateRoute?: boolean\n ) {\n const currentActiveRoutes = [...this.activeRoutes]\n const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId)\n\n if (activeRouteIndex !== -1) {\n if (forceUpdateRoute) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n let route = currentActiveRoutes[activeRouteIndex].route\n route = await this.#socketAPI.updateActiveRoute(activeRouteId)\n this.updateActiveRoute(activeRouteId, { route })\n })()\n }\n\n if (activeRoute) {\n currentActiveRoutes[activeRouteIndex] = {\n ...currentActiveRoutes[activeRouteIndex],\n ...activeRoute\n }\n } else {\n currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }\n }\n this.activeRoutes = currentActiveRoutes\n\n this.#emitUpdateIfNeeded()\n }\n }\n\n removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId)\n\n // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners\n this.emitUpdate()\n }\n\n // update active route if needed on SubmittedAccountOp update\n handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp) {\n op.calls.forEach((call) => {\n this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status)\n this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status)\n this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status)\n this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId)\n this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status)\n })\n }\n\n #handleActiveRouteBroadcastedTransaction(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' })\n }\n\n #handleActiveRouteBroadcastedApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find(\n (r) => `${r.activeRouteId}-approval` === fromUserRequestId\n )\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'waiting-approval-to-resolve'\n })\n }\n\n #handleActiveRoutesWithReadyApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRouteWaitingApproval = this.activeRoutes.find(\n (r) =>\n r.routeStatus === 'waiting-approval-to-resolve' &&\n `${r.activeRouteId}-approval` === fromUserRequestId\n )\n\n if (!activeRouteWaitingApproval) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready'\n })\n }\n\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The approval was rejected but you can try to sign it again'\n : 'The approval failed but you can try to sign it again'\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n #handleUpdateActiveRoutesUserTxId(\n fromUserRequestId: Call['fromUserRequestId'],\n opTxnId: SubmittedAccountOp['txnId']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n if (opTxnId && !activeRoute.userTxHash) {\n this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId })\n }\n }\n\n #handleActiveRoutesCompleted(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n let shouldUpdateActiveRouteStatus = false\n if (activeRoute.route.fromChainId === activeRoute.route.toChainId)\n shouldUpdateActiveRouteStatus = true\n\n if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) {\n const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]\n if (!tx) return\n\n if (tx.userTxType === 'dex-swap') shouldUpdateActiveRouteStatus = true\n }\n\n if (!shouldUpdateActiveRouteStatus) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' })\n }\n\n // If the transaction fails, update the status to \"ready\" to allow the user to sign it again\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The transaction was rejected but you can try to sign it again'\n : 'The transaction failed but you can try to sign it again'\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n onAccountChange() {\n this.portfolioTokenList = []\n this.isTokenListLoading = true\n\n this.#emitUpdateIfNeeded()\n }\n\n #getIsFormValidToFetchQuote() {\n return (\n this.fromChainId &&\n this.toChainId &&\n this.fromAmount &&\n this.fromSelectedToken &&\n this.toSelectedToken &&\n this.validateFromAmount.success\n )\n }\n\n get banners() {\n if (!this.#selectedAccount.account) return []\n\n const activeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.#selectedAccount.account.addr,\n this.activeRoutes\n )\n const accountOpActions = this.#actions.visibleActionsQueue.filter(\n ({ type }) => type === 'accountOp'\n ) as AccountOpAction[]\n\n // Swap banners aren't generated because swaps are completed instantly,\n // thus the activity banner on broadcast is sufficient\n return getBridgeBanners(\n activeRoutesForSelectedAccount,\n accountOpActions,\n this.#networks.networks\n )\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: Function) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n func()\n }, 0)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n toTokenList: this.toTokenList,\n maxFromAmount: this.maxFromAmount,\n maxFromAmountInFiat: this.maxFromAmountInFiat,\n validateFromAmount: this.validateFromAmount,\n isFormEmpty: this.isFormEmpty,\n formStatus: this.formStatus,\n activeRoutesInProgress: this.activeRoutesInProgress,\n activeRoutes: this.activeRoutes,\n isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled,\n banners: this.banners,\n isHealthy: this.isHealthy,\n shouldEnableRoutesSelection: this.shouldEnableRoutesSelection,\n supportedChainIds: this.supportedChainIds\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"swapAndBridge.js","sourceRoot":"","sources":["../../../../src/controllers/swapAndBridge/swapAndBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { formatUnits, isAddress, parseUnits } from 'ethers'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport EmittableError from '../../classes/EmittableError'\nimport SwapAndBridgeError from '../../classes/SwapAndBridgeError'\nimport { Network } from '../../interfaces/network'\nimport { Storage } from '../../interfaces/storage'\nimport {\n ActiveRoute,\n CachedSupportedChains,\n CachedTokenListKey,\n CachedToTokenLists,\n SocketApiBridgeStep,\n SocketAPIBridgeUserTx,\n SocketAPIQuote,\n SocketAPIRoute,\n SocketAPISendTransactionRequest,\n SocketAPIToken,\n SocketRouteStatus,\n SwapAndBridgeToToken\n} from '../../interfaces/swapAndBridge'\nimport { isSmartAccount } from '../../libs/account/account'\nimport { AccountOpStatus } from '../../libs/accountOp/accountOp'\nimport { SubmittedAccountOp } from '../../libs/accountOp/submittedAccountOp'\nimport { Call } from '../../libs/accountOp/types'\nimport { getBridgeBanners } from '../../libs/banners/banners'\nimport { TokenResult } from '../../libs/portfolio'\nimport { getTokenAmount } from '../../libs/portfolio/helpers'\nimport {\n convertPortfolioTokenToSocketAPIToken,\n getActiveRoutesForAccount,\n getIsBridgeTxn,\n getIsTokenEligibleForSwapAndBridge,\n getQuoteRouteSteps,\n sortPortfolioTokenList,\n sortTokenListResponse\n} from '../../libs/swapAndBridge/swapAndBridge'\nimport { getHumanReadableSwapAndBridgeError } from '../../libs/swapAndBridge/swapAndBridgeErrorHumanizer'\nimport { getSanitizedAmount } from '../../libs/transfer/amount'\nimport { normalizeIncomingSocketToken, SocketAPI } from '../../services/socket/api'\nimport { ZERO_ADDRESS } from '../../services/socket/constants'\nimport { validateSendTransferAmount } from '../../services/validations/validate'\nimport formatDecimals from '../../utils/formatDecimals/formatDecimals'\nimport { convertTokenPriceToBigInt } from '../../utils/numbers/formatters'\nimport wait from '../../utils/wait'\nimport { AccountOpAction, ActionsController } from '../actions/actions'\nimport { ActivityController } from '../activity/activity'\nimport EventEmitter, { Statuses } from '../eventEmitter/eventEmitter'\nimport { InviteController } from '../invite/invite'\nimport { NetworksController } from '../networks/networks'\nimport { SelectedAccountController } from '../selectedAccount/selectedAccount'\n\nconst HARD_CODED_CURRENCY = 'usd'\n\nconst CONVERSION_PRECISION = 16\nconst CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)\n\nconst NETWORK_MISMATCH_MESSAGE =\n 'Swap & Bridge network configuration mismatch. Please try again or contact Ambire support.'\n\nexport enum SwapAndBridgeFormStatus {\n Empty = 'empty',\n Invalid = 'invalid',\n FetchingRoutes = 'fetching-routes',\n NoRoutesFound = 'no-routes-found',\n InvalidRouteSelected = 'invalid-route-selected',\n ReadyToSubmit = 'ready-to-submit'\n}\n\nconst STATUS_WRAPPED_METHODS = {\n addToTokenByAddress: 'INITIAL'\n} as const\n\nconst SUPPORTED_CHAINS_CACHE_THRESHOLD = 1000 * 60 * 60 * 24 // 1 day\nconst TO_TOKEN_LIST_CACHE_THRESHOLD = 1000 * 60 * 60 * 4 // 4 hours\n\nconst PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE = [\n 'stargate',\n 'stargate-v2',\n 'arbitrum-bridge',\n 'zksync-native'\n]\n\n/**\n * The Swap and Bridge controller is responsible for managing the state and\n * logic related to swapping and bridging tokens across different networks.\n * Key responsibilities:\n * - Initially setting up the swap and bridge form with the necessary data.\n * - Managing form state for token swap and bridge operations (including user preferences).\n * - Fetching and updating token lists (from and to).\n * - Fetching and updating quotes for token swaps and bridges.\n * - Manages token active routes\n */\nexport class SwapAndBridgeController extends EventEmitter {\n #selectedAccount: SelectedAccountController\n\n #networks: NetworksController\n\n #actions: ActionsController\n\n #activity: ActivityController\n\n #invite: InviteController\n\n #storage: Storage\n\n #socketAPI: SocketAPI\n\n #activeRoutes: ActiveRoute[] = []\n\n statuses: Statuses = STATUS_WRAPPED_METHODS\n\n updateQuoteStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n #updateToTokenListThrottle: {\n time: number\n throttled: boolean\n shouldReset: boolean\n addressToSelect?: string\n } = {\n time: 0,\n shouldReset: true,\n throttled: false\n }\n\n #updateQuoteId?: string\n\n #updateQuoteTimeout?: ReturnType\n\n updateToTokenListStatus: 'INITIAL' | 'LOADING' = 'INITIAL'\n\n sessionIds: string[] = []\n\n fromChainId: number | null = 1\n\n fromSelectedToken: TokenResult | null = null\n\n fromAmount: string = ''\n\n fromAmountInFiat: string = ''\n\n fromAmountFieldMode: 'fiat' | 'token' = 'token'\n\n toChainId: number | null = 1\n\n toSelectedToken: SwapAndBridgeToToken | null = null\n\n quote: SocketAPIQuote | null = null\n\n quoteRoutesStatuses: { [key: string]: { status: string } } = {}\n\n portfolioTokenList: TokenResult[] = []\n\n isTokenListLoading: boolean = false\n\n /**\n * Needed to efficiently manage and cache token lists for different chain\n * combinations (fromChainId and toChainId) without having to fetch them\n * repeatedly from the API. Moreover, this way tokens added to a list by\n * address are also cached for sometime.\n */\n #cachedToTokenLists: CachedToTokenLists = {}\n\n #toTokenList: SwapAndBridgeToToken[] = []\n\n /**\n * Similar to the `#cachedToTokenLists`, this helps in avoiding repeated API\n * calls to fetch the supported chains from our service provider.\n */\n #cachedSupportedChains: CachedSupportedChains = { lastFetched: 0, data: [] }\n\n routePriority: 'output' | 'time' = 'output'\n\n // Holds the initial load promise, so that one can wait until it completes\n #initialLoadPromise: Promise\n\n #shouldDebounceFlags: { [key: string]: boolean } = {}\n\n constructor({\n selectedAccount,\n networks,\n activity,\n socketAPI,\n storage,\n actions,\n invite\n }: {\n selectedAccount: SelectedAccountController\n networks: NetworksController\n activity: ActivityController\n socketAPI: SocketAPI\n storage: Storage\n actions: ActionsController\n invite: InviteController\n }) {\n super()\n this.#selectedAccount = selectedAccount\n this.#networks = networks\n this.#activity = activity\n this.#socketAPI = socketAPI\n this.#storage = storage\n this.#actions = actions\n this.#invite = invite\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#initialLoadPromise = this.#load()\n }\n\n #emitUpdateIfNeeded() {\n const shouldSkipUpdate =\n // No need to emit emit updates if there are no active sessions\n !this.sessionIds.length &&\n // but ALSO there are no active routes (otherwise, banners need the updates)\n !this.activeRoutes.length\n if (shouldSkipUpdate) return\n\n super.emitUpdate()\n }\n\n async #load() {\n await this.#networks.initialLoadPromise\n await this.#selectedAccount.initialLoadPromise\n\n this.activeRoutes = await this.#storage.get('swapAndBridgeActiveRoutes', [])\n\n this.#selectedAccount.onUpdate(() => {\n this.#debounceFunctionCallsOnSameTick('updateFormOnSelectedAccountUpdate', () => {\n if (this.#selectedAccount.portfolio.isReadyToVisualize) {\n this.isTokenListLoading = false\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n // To token list includes selected account portfolio tokens, it should get an update too\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(false)\n }\n })\n })\n this.#emitUpdateIfNeeded()\n }\n\n // The token in portfolio is the source of truth for the amount, it updates\n // on every balance (pending or anything) change.\n #getFromSelectedTokenInPortfolio = () =>\n this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId &&\n getIsTokenEligibleForSwapAndBridge(t)\n )\n\n get maxFromAmount(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n || typeof tokenRef.decimals !== 'number')\n return '0'\n\n return formatUnits(getTokenAmount(tokenRef), tokenRef.decimals)\n }\n\n get maxFromAmountInFiat(): string {\n const tokenRef = this.#getFromSelectedTokenInPortfolio() || this.fromSelectedToken\n if (!tokenRef || getTokenAmount(tokenRef) === 0n) return '0'\n\n const tokenPrice = tokenRef?.priceIn.find((p) => p.baseCurrency === HARD_CODED_CURRENCY)?.price\n if (!tokenPrice || !Number(this.maxFromAmount)) return '0'\n\n const maxAmount = getTokenAmount(tokenRef)\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Multiply the max amount by the token price. The calculation is done in big int to avoid precision loss\n return formatUnits(\n BigInt(maxAmount) * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n tokenRef.decimals + tokenPriceDecimals\n )\n }\n\n get isFormEmpty() {\n return (\n !this.fromChainId ||\n !this.toChainId ||\n !this.fromAmount ||\n !this.fromSelectedToken ||\n !this.toSelectedToken\n )\n }\n\n get formStatus() {\n if (this.isFormEmpty) return SwapAndBridgeFormStatus.Empty\n if (this.validateFromAmount.message) return SwapAndBridgeFormStatus.Invalid\n if (this.updateQuoteStatus !== 'INITIAL' && !this.quote)\n return SwapAndBridgeFormStatus.FetchingRoutes\n if (!this.quote?.selectedRoute) return SwapAndBridgeFormStatus.NoRoutesFound\n\n if (this.quote?.selectedRoute?.errorMessage) return SwapAndBridgeFormStatus.InvalidRouteSelected\n\n return SwapAndBridgeFormStatus.ReadyToSubmit\n }\n\n get validateFromAmount() {\n if (!this.fromSelectedToken) return { success: false, message: '' }\n\n if (\n !this.isFormEmpty &&\n !this.quote &&\n Object.values(this.quoteRoutesStatuses).some((val) => val.status === 'MIN_AMOUNT_NOT_MET')\n ) {\n return {\n success: true,\n message: '🔔 A route was found for this pair but the minimum token amount was not met.'\n }\n }\n\n return validateSendTransferAmount(\n this.fromAmount,\n Number(this.maxFromAmount),\n Number(this.maxFromAmountInFiat),\n this.fromSelectedToken\n )\n }\n\n get activeRoutesInProgress() {\n return this.activeRoutes.filter((r) => r.routeStatus === 'in-progress' && r.userTxHash)\n }\n\n get activeRoutes() {\n return this.#activeRoutes\n }\n\n set activeRoutes(value: ActiveRoute[]) {\n this.#activeRoutes = value\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#storage.set('swapAndBridgeActiveRoutes', value)\n }\n\n get isSwitchFromAndToTokensEnabled() {\n if (!this.toSelectedToken) return false\n if (!this.portfolioTokenList.length) return false\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n\n return !!this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )\n }\n\n get shouldEnableRoutesSelection() {\n return (\n !!this.quote &&\n !!this.quote.routes &&\n this.quote.routes.length > 1 &&\n this.updateQuoteStatus !== 'LOADING'\n )\n }\n\n async initForm(sessionId: string) {\n await this.#initialLoadPromise\n\n if (this.sessionIds.includes(sessionId)) return\n\n // reset only if there are no other instances opened/active\n if (!this.sessionIds.length) {\n this.resetForm() // clear prev session form state\n // for each new session remove the completed activeRoutes from the previous session\n this.activeRoutes = this.activeRoutes.filter((r) => r.routeStatus !== 'completed')\n // remove activeRoutes errors from the previous session\n this.activeRoutes.forEach((r) => {\n if (r.routeStatus !== 'failed') {\n // eslint-disable-next-line no-param-reassign\n delete r.error\n }\n })\n if (this.activeRoutes.length) {\n // Otherwise there may be an emitUpdate with [] tokens\n this.isTokenListLoading = true\n\n // update the activeRoute.route prop for the new session\n this.activeRoutes.forEach((r) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateActiveRoute(r.activeRouteId, undefined, true)\n })\n }\n }\n\n this.sessionIds.push(sessionId)\n // do not await the health status check to prevent UI freeze while fetching\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#socketAPI.updateHealth()\n this.updatePortfolioTokenList(this.#selectedAccount.portfolio.tokens)\n this.isTokenListLoading = false\n // Do not await on purpose as it's not critical for the controller state to be ready\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#fetchSupportedChainsIfNeeded()\n this.#emitUpdateIfNeeded()\n }\n\n get isHealthy() {\n return this.#socketAPI.isHealthy\n }\n\n #fetchSupportedChainsIfNeeded = async () => {\n const shouldNotReFetchSupportedChains =\n this.#cachedSupportedChains.data.length &&\n Date.now() - this.#cachedSupportedChains.lastFetched < SUPPORTED_CHAINS_CACHE_THRESHOLD\n if (shouldNotReFetchSupportedChains) return\n\n try {\n const supportedChainsResponse = await this.#socketAPI.getSupportedChains()\n\n this.#cachedSupportedChains = {\n lastFetched: Date.now(),\n data: supportedChainsResponse.filter((c) => c.sendingEnabled && c.receivingEnabled)\n }\n this.#emitUpdateIfNeeded()\n } catch (error: any) {\n // Fail silently, as this is not a critical feature, Swap & Bridge is still usable\n this.emitError({ error, level: 'silent', message: error?.message })\n }\n }\n\n get supportedChainIds(): Network['chainId'][] {\n return this.#cachedSupportedChains.data.map((c) => BigInt(c.chainId))\n }\n\n get #toTokenListKey(): CachedTokenListKey | null {\n if (this.fromChainId === null || this.toChainId === null) return null\n\n return `from-${this.fromChainId}-to-${this.toChainId}`\n }\n\n unloadScreen(sessionId: string) {\n this.sessionIds = this.sessionIds.filter((id) => id !== sessionId)\n if (!this.sessionIds.length) {\n this.resetForm(true)\n // Reset health to prevent the error state from briefly flashing\n // before the next health check resolves when the Swap & Bridge\n // screen is opened after a some time\n this.#socketAPI.resetHealth()\n }\n }\n\n updateForm(props: {\n fromAmount?: string\n fromAmountInFiat?: string\n fromAmountFieldMode?: 'fiat' | 'token'\n fromSelectedToken?: TokenResult | null\n toChainId?: bigint | number\n toSelectedToken?: SocketAPIToken | null\n routePriority?: 'output' | 'time'\n }) {\n const {\n fromAmount,\n fromAmountInFiat,\n fromAmountFieldMode,\n fromSelectedToken,\n toChainId,\n toSelectedToken,\n routePriority\n } = props\n\n if (fromAmount !== undefined) {\n this.fromAmount = fromAmount\n ;(() => {\n if (fromAmount === '') {\n this.fromAmountInFiat = ''\n return\n }\n const tokenPrice = this.fromSelectedToken?.priceIn.find(\n (p) => p.baseCurrency === HARD_CODED_CURRENCY\n )?.price\n\n if (!tokenPrice) {\n this.fromAmountInFiat = ''\n return\n }\n\n if (\n this.fromAmountFieldMode === 'fiat' &&\n typeof this.fromSelectedToken?.decimals === 'number'\n ) {\n this.fromAmountInFiat = fromAmount\n\n // Get the number of decimals\n const amountInFiatDecimals = fromAmount.split('.')[1]?.length || 0\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n // Convert the numbers to big int\n const amountInFiatBigInt = parseUnits(fromAmount, amountInFiatDecimals)\n\n this.fromAmount = formatUnits(\n (amountInFiatBigInt * CONVERSION_PRECISION_POW) / tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n amountInFiatDecimals + CONVERSION_PRECISION - tokenPriceDecimals\n )\n\n return\n }\n if (this.fromAmountFieldMode === 'token') {\n this.fromAmount = fromAmount\n\n if (!this.fromSelectedToken) return\n\n const sanitizedFieldValue = getSanitizedAmount(\n fromAmount,\n this.fromSelectedToken.decimals\n )\n // Convert the field value to big int\n const formattedAmount = parseUnits(sanitizedFieldValue, this.fromSelectedToken.decimals)\n\n if (!formattedAmount) return\n\n const { tokenPriceBigInt, tokenPriceDecimals } = convertTokenPriceToBigInt(tokenPrice)\n\n this.fromAmountInFiat = formatUnits(\n formattedAmount * tokenPriceBigInt,\n // Shift the decimal point by the number of decimals in the token price\n this.fromSelectedToken.decimals + tokenPriceDecimals\n )\n }\n })()\n }\n\n if (fromAmountInFiat !== undefined) {\n this.fromAmountInFiat = fromAmountInFiat\n }\n\n if (fromAmountFieldMode) {\n this.fromAmountFieldMode = fromAmountFieldMode\n }\n\n if (fromSelectedToken) {\n const isFromNetworkChanged =\n this.fromSelectedToken?.networkId !== fromSelectedToken?.networkId\n if (isFromNetworkChanged) {\n const network = this.#networks.networks.find((n) => n.id === fromSelectedToken.networkId)\n if (network) {\n this.fromChainId = Number(network.chainId)\n // defaults to swap after network change (should keep fromChainId and toChainId in sync after fromChainId update)\n this.toChainId = Number(network.chainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n const shouldResetFromTokenAmount =\n isFromNetworkChanged || this.fromSelectedToken?.address !== fromSelectedToken.address\n if (shouldResetFromTokenAmount) {\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n }\n\n // Always update to reflect portfolio amount (or other props) changes\n this.fromSelectedToken = fromSelectedToken\n }\n\n if (toChainId) {\n if (this.toChainId !== Number(toChainId)) {\n this.toChainId = Number(toChainId)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateToTokenList(true)\n }\n }\n\n if (toSelectedToken) {\n this.toSelectedToken = toSelectedToken\n }\n\n if (routePriority) {\n this.routePriority = routePriority\n if (this.quote) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n }\n }\n this.updateQuote()\n\n this.#emitUpdateIfNeeded()\n }\n\n resetForm(shouldEmit?: boolean) {\n this.fromChainId = 1\n this.fromSelectedToken = null\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toChainId = 1\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.portfolioTokenList = []\n this.#toTokenList = []\n\n if (shouldEmit) this.#emitUpdateIfNeeded()\n }\n\n updatePortfolioTokenList(nextPortfolioTokenList: TokenResult[]) {\n const tokens = nextPortfolioTokenList.filter(getIsTokenEligibleForSwapAndBridge)\n this.portfolioTokenList = sortPortfolioTokenList(\n // Filtering out hidden tokens here means: 1) They won't be displayed in\n // the \"From\" token list (`this.portfolioTokenList`) and 2) They won't be\n // added to the \"Receive\" token list as additional tokens from portfolio,\n // BUT 3) They will appear in the \"Receive\" if they are present in service\n // provider's to token list. This is the desired behavior.\n tokens.filter((t) => !t.flags.isHidden)\n )\n\n const fromSelectedTokenInNextPortfolio = this.portfolioTokenList.find(\n (t) =>\n t.address === this.fromSelectedToken?.address &&\n t.networkId === this.fromSelectedToken?.networkId\n )\n\n const shouldUpdateFromSelectedToken =\n !this.fromSelectedToken || // initial (default) state\n // May happen if selected account gets changed or the token gets send away in the meantime\n !fromSelectedTokenInNextPortfolio ||\n // May happen if user receives or sends the token in the meantime\n fromSelectedTokenInNextPortfolio.amount !== this.fromSelectedToken?.amount\n\n if (shouldUpdateFromSelectedToken) {\n this.updateForm({\n fromSelectedToken: fromSelectedTokenInNextPortfolio || this.portfolioTokenList[0] || null\n })\n } else {\n this.#emitUpdateIfNeeded()\n }\n }\n\n async updateToTokenList(shouldReset: boolean, addressToSelect?: string) {\n const now = Date.now()\n const timeSinceLastCall = now - this.#updateToTokenListThrottle.time\n if (timeSinceLastCall <= 500) {\n this.#updateToTokenListThrottle.shouldReset = shouldReset\n this.#updateToTokenListThrottle.addressToSelect = addressToSelect\n\n if (!this.#updateToTokenListThrottle.throttled) {\n this.#updateToTokenListThrottle.throttled = true\n await wait(500 - timeSinceLastCall)\n this.#updateToTokenListThrottle.throttled = false\n await this.updateToTokenList(\n this.#updateToTokenListThrottle.shouldReset,\n this.#updateToTokenListThrottle.addressToSelect\n )\n }\n return\n }\n this.updateToTokenListStatus = 'LOADING'\n this.#updateToTokenListThrottle.time = now\n if (!this.fromChainId || !this.toChainId) return\n\n if (shouldReset) {\n this.#toTokenList = []\n this.toSelectedToken = null\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const toTokenListInCache =\n this.#toTokenListKey && this.#cachedToTokenLists[this.#toTokenListKey]\n let upToDateToTokenList: SocketAPIToken[] = toTokenListInCache?.data || []\n const shouldFetchTokenList =\n !upToDateToTokenList.length ||\n now - (toTokenListInCache?.lastFetched || 0) >= TO_TOKEN_LIST_CACHE_THRESHOLD\n if (shouldFetchTokenList) {\n upToDateToTokenList = await this.#socketAPI.getToTokenList({\n fromChainId: this.fromChainId,\n toChainId: this.toChainId\n })\n if (this.#toTokenListKey)\n this.#cachedToTokenLists[this.#toTokenListKey] = {\n lastFetched: now,\n data: upToDateToTokenList\n }\n }\n\n const toTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )\n // should never happen\n if (!toTokenNetwork) throw new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n\n const additionalTokensFromPortfolio = this.portfolioTokenList\n .filter((t) => t.networkId === toTokenNetwork.id)\n .filter((token) => !upToDateToTokenList.some((t) => t.address === token.address))\n .map((t) => convertPortfolioTokenToSocketAPIToken(t, Number(toTokenNetwork.chainId)))\n\n this.#toTokenList = sortTokenListResponse(\n [...upToDateToTokenList, ...additionalTokensFromPortfolio],\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n if (!this.toSelectedToken) {\n if (addressToSelect) {\n const token = this.#toTokenList.find((t) => t.address === addressToSelect)\n if (token) {\n this.updateForm({ toSelectedToken: token })\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n return\n }\n }\n }\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n this.updateToTokenListStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n }\n\n get toTokenList(): SwapAndBridgeToToken[] {\n const isSwapping = this.fromChainId === this.toChainId\n if (isSwapping) {\n // Swaps between same \"from\" and \"to\" tokens are not feasible, filter them out\n return this.#toTokenList.filter((t) => t.address !== this.fromSelectedToken?.address)\n }\n\n return this.#toTokenList\n }\n\n async #addToTokenByAddress(address: string) {\n if (!this.toChainId) return // should never happen\n if (!isAddress(address)) return // no need to attempt with invalid addresses\n\n const isAlreadyInTheList = this.#toTokenList.some((t) => t.address === address)\n if (isAlreadyInTheList) return\n\n let token: SocketAPIToken | null\n try {\n token = await this.#socketAPI.getToken({ address, chainId: this.toChainId })\n\n if (!token)\n throw new SwapAndBridgeError(\n 'Token with this address is not supported by our service provider.'\n )\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n\n if (this.#toTokenListKey)\n // Cache for sometime the tokens added by address\n this.#cachedToTokenLists[this.#toTokenListKey]?.data.push(token)\n\n const toTokenNetwork = this.#networks.networks.find((n) => Number(n.chainId) === this.toChainId)\n // should never happen\n if (!toTokenNetwork) {\n const error = new SwapAndBridgeError(NETWORK_MISMATCH_MESSAGE)\n throw new EmittableError({ error, level: 'minor', message: error?.message })\n }\n\n const nextTokenList: SwapAndBridgeToToken[] = [...this.#toTokenList, token]\n\n this.#toTokenList = sortTokenListResponse(\n nextTokenList,\n this.portfolioTokenList.filter((t) => t.networkId === toTokenNetwork.id)\n )\n\n this.#emitUpdateIfNeeded()\n return token\n }\n\n addToTokenByAddress = async (address: string) =>\n this.withStatus('addToTokenByAddress', () => this.#addToTokenByAddress(address), true)\n\n async switchFromAndToTokens() {\n if (!this.isSwitchFromAndToTokensEnabled) return\n const currentFromSelectedToken = { ...this.fromSelectedToken }\n\n const toSelectedTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === this.toChainId\n )!\n this.fromSelectedToken = this.portfolioTokenList.find(\n (token: TokenResult) =>\n token.address === this.toSelectedToken!.address &&\n token.networkId === toSelectedTokenNetwork.id\n )!\n this.fromAmount = '' // Reset fromAmount as it may no longer be valid for the new fromSelectedToken\n // Reverses the from and to chain ids, since their format is the same\n ;[this.fromChainId, this.toChainId] = [this.toChainId, this.fromChainId]\n await this.updateToTokenList(true, currentFromSelectedToken.address)\n }\n\n async updateQuote(\n options: {\n skipQuoteUpdateOnSameValues?: boolean\n skipPreviousQuoteRemoval?: boolean\n skipStatusUpdate?: boolean\n } = {\n skipQuoteUpdateOnSameValues: true,\n skipPreviousQuoteRemoval: false,\n skipStatusUpdate: false\n }\n ) {\n const quoteId = uuidv4()\n this.#updateQuoteId = quoteId\n\n const updateQuoteFunction = async () => {\n if (!this.#selectedAccount.account) return\n if (!this.fromAmount) return\n\n const sanitizedFromAmount = getSanitizedAmount(\n this.fromAmount,\n this.fromSelectedToken!.decimals\n )\n\n const bigintFromAmount = parseUnits(sanitizedFromAmount, this.fromSelectedToken!.decimals)\n\n if (this.quote) {\n const isFromAmountSame = this.quote.selectedRoute.fromAmount === bigintFromAmount.toString()\n const isFromNetworkSame = this.quote.fromChainId === this.fromChainId\n const isFromAddressSame = this.quote.fromAsset.address === this.fromSelectedToken!.address\n const isToNetworkSame = this.quote.toChainId === this.toChainId\n const isToAddressSame = this.quote.toAsset.address === this.toSelectedToken!.address\n\n if (\n options.skipQuoteUpdateOnSameValues &&\n isFromAmountSame &&\n isFromNetworkSame &&\n isFromAddressSame &&\n isToNetworkSame &&\n isToAddressSame\n ) {\n return\n }\n }\n if (!options.skipPreviousQuoteRemoval) {\n if (this.quote) this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n\n try {\n const quoteResult = await this.#socketAPI.quote({\n fromChainId: this.fromChainId!,\n fromTokenAddress: this.fromSelectedToken!.address,\n toChainId: this.toChainId!,\n toTokenAddress: this.toSelectedToken!.address,\n fromAmount: bigintFromAmount,\n userAddress: this.#selectedAccount.account.addr,\n isSmartAccount: isSmartAccount(this.#selectedAccount.account),\n sort: this.routePriority,\n isOG: this.#invite.isOG\n })\n\n if (quoteId !== this.#updateQuoteId) return\n\n if (\n this.#getIsFormValidToFetchQuote() &&\n quoteResult &&\n quoteResult?.routes?.[0] &&\n quoteResult.fromChainId === this.fromChainId &&\n quoteResult.toChainId === this.toChainId &&\n quoteResult.toAsset.address === this.toSelectedToken?.address\n ) {\n let routeToSelect\n let routeToSelectSteps\n let routes = quoteResult.routes || []\n\n try {\n routes = routes.map((route) => {\n if (!route.userTxs) return route\n\n const bridgeTx = route.userTxs.find((tx) => getIsBridgeTxn(tx.userTxType)) as\n | SocketAPIBridgeUserTx\n | undefined\n\n if (!bridgeTx) return route\n\n const bridgeStep = bridgeTx.steps.find((s) => s.type === 'bridge') as\n | SocketApiBridgeStep\n | undefined\n\n if (!bridgeStep) return route\n if (bridgeStep.protocolFees.amount === '0') return route\n\n const normalizedProtocolFeeToken = normalizeIncomingSocketToken(\n bridgeStep.protocolFees.asset\n )\n const doesProtocolRequireExtraContractFeeInNative =\n PROTOCOLS_WITH_CONTRACT_FEE_IN_NATIVE.includes(bridgeStep.protocol.name) &&\n // When other tokens than the native ones are being bridged,\n // Socket API takes the fee directly from the \"From\" amount.\n normalizedProtocolFeeToken.address === ZERO_ADDRESS\n if (!doesProtocolRequireExtraContractFeeInNative) return route\n\n const protocolFeeTokenNetwork = this.#networks.networks.find(\n (n) => Number(n.chainId) === normalizedProtocolFeeToken.chainId\n )!\n const isTokenToPayFeeWithTheSameAsFromToken =\n this.fromSelectedToken?.address === normalizedProtocolFeeToken.address &&\n this.fromChainId === normalizedProtocolFeeToken.chainId\n\n const tokenToPayFeeWith = this.portfolioTokenList.find((t) => {\n return (\n t.address === normalizedProtocolFeeToken.address &&\n t.networkId === protocolFeeTokenNetwork.id\n )\n })\n\n const protocolFeeTokenDecimals = bridgeStep.protocolFees.asset.decimals\n const portfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? tokenToPayFeeWith.decimals\n : protocolFeeTokenDecimals\n const fromAmountNumber = Number(this.fromAmount)\n const fromAmountScaledToTokenToPayFeeWithDecimals = BigInt(\n Math.round(fromAmountNumber * 10 ** portfolioTokenToPayFeeWithDecimals)\n )\n\n const tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals = tokenToPayFeeWith\n ? // Scale tokenToPayFeeWith to the same decimals as portfolioTokenToPayFeeWithDecimals\n tokenToPayFeeWith.amount *\n BigInt(10 ** (protocolFeeTokenDecimals - portfolioTokenToPayFeeWithDecimals))\n : BigInt(0)\n\n const availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals =\n isTokenToPayFeeWithTheSameAsFromToken\n ? tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals -\n fromAmountScaledToTokenToPayFeeWithDecimals\n : tokenToPayFeeWithScaledToPortfolioTokenToPayFeeWithDecimals\n\n const protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals = BigInt(\n Math.round(\n Number(bridgeStep.protocolFees.amount) *\n 10 ** (portfolioTokenToPayFeeWithDecimals - protocolFeeTokenDecimals)\n )\n )\n const hasEnoughAmountToPayFee =\n availableAfterSubtractionScaledToPortfolioTokenToPayFeeWithDecimals >=\n protocolFeesAmountScaledToPortfolioTokenToPayFeeWithDecimals\n\n if (!hasEnoughAmountToPayFee) {\n const protocolName = bridgeStep.protocol.displayName\n const insufficientTokenSymbol = bridgeStep.protocolFees.asset.symbol\n const insufficientTokenNetwork = protocolFeeTokenNetwork.name\n const insufficientAssetAmount = formatUnits(\n bridgeStep.protocolFees.amount,\n bridgeStep.protocolFees.asset.decimals\n )\n const insufficientAssetAmountInUsd = formatDecimals(\n bridgeStep.protocolFees.feesInUsd,\n 'value'\n )\n\n // Trick to show the error message on the UI, as the API doesn't handle this\n // eslint-disable-next-line no-param-reassign\n route.errorMessage = `Insufficient ${insufficientTokenSymbol} on ${insufficientTokenNetwork}. You need ${insufficientAssetAmount} ${insufficientTokenSymbol} (${insufficientAssetAmountInUsd}) on ${insufficientTokenNetwork} to cover the ${protocolName} protocol fee for this route.`\n }\n\n return route\n })\n\n routes = routes.sort((a, b) => Number(!!a.errorMessage) - Number(!!b.errorMessage))\n } catch (error) {\n // if the filtration fails for some reason continue with the original routes\n // array without interrupting the rest of the logic\n console.error(error)\n }\n\n if (!routes.length) {\n this.quote = null\n return\n }\n\n const alreadySelectedRoute = routes.find((nextRoute) => {\n if (!this.quote) return false\n\n // Because we only have routes with unique bridges (bridging case)\n const selectedRouteUsedBridge = this.quote.selectedRoute.usedBridgeNames?.[0]\n if (selectedRouteUsedBridge)\n return nextRoute.usedBridgeNames?.[0] === selectedRouteUsedBridge\n\n // Assuming to only have routes with unique DEXes (swapping case)\n const selectedRouteUsedDex = this.quote.selectedRoute.usedDexName\n if (selectedRouteUsedDex) return nextRoute.usedDexName === selectedRouteUsedDex\n\n return false // should never happen, but just in case of bad data\n })\n\n if (alreadySelectedRoute) {\n routeToSelect = alreadySelectedRoute\n routeToSelectSteps = getQuoteRouteSteps(alreadySelectedRoute.userTxs)\n } else {\n const bestRoute =\n this.routePriority === 'output'\n ? routes[0] // API returns highest output first\n : routes[routes.length - 1] // API returns fastest... last\n routeToSelect = bestRoute\n routeToSelectSteps = getQuoteRouteSteps(bestRoute.userTxs)\n }\n\n this.quote = {\n fromAsset: quoteResult.fromAsset,\n fromChainId: quoteResult.fromChainId,\n toAsset: quoteResult.toAsset,\n toChainId: quoteResult.toChainId,\n selectedRoute: routeToSelect,\n selectedRouteSteps: routeToSelectSteps,\n routes\n }\n }\n this.quoteRoutesStatuses = (quoteResult as any).bridgeRouteErrors || {}\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n this.emitError({ error, level: 'major', message })\n }\n }\n\n if (!this.#getIsFormValidToFetchQuote()) {\n if (this.quote || this.quoteRoutesStatuses) {\n this.quote = null\n this.quoteRoutesStatuses = {}\n this.#emitUpdateIfNeeded()\n }\n return\n }\n\n let nextTimeout = 400 // timeout when there is no pending quote update\n if (this.#updateQuoteTimeout) {\n nextTimeout = 1000 // timeout when there is a pending quote update\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }\n\n if (!options.skipStatusUpdate && !this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n this.#updateQuoteTimeout = setTimeout(async () => {\n if (!options.skipStatusUpdate && !!this.quote) {\n this.updateQuoteStatus = 'LOADING'\n this.#emitUpdateIfNeeded()\n }\n\n await updateQuoteFunction()\n\n if (quoteId !== this.#updateQuoteId) return\n\n this.updateQuoteStatus = 'INITIAL'\n this.#emitUpdateIfNeeded()\n clearTimeout(this.#updateQuoteTimeout)\n this.#updateQuoteTimeout = undefined\n }, nextTimeout)\n }\n\n async getRouteStartUserTx() {\n if (this.formStatus !== SwapAndBridgeFormStatus.ReadyToSubmit) return\n\n try {\n const routeResult = await this.#socketAPI.startRoute({\n fromChainId: this.quote!.fromChainId,\n fromAssetAddress: this.quote!.fromAsset.address,\n toChainId: this.quote!.toChainId,\n toAssetAddress: this.quote!.toAsset.address,\n route: this.quote!.selectedRoute\n })\n\n return routeResult\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async getNextRouteUserTx(activeRouteId: number) {\n try {\n const route = await this.#socketAPI.getNextRouteUserTx(activeRouteId)\n return route\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'minor', message })\n }\n }\n\n async checkForNextUserTxForActiveRoutes() {\n await this.#initialLoadPromise\n const fetchAndUpdateRoute = async (activeRoute: ActiveRoute) => {\n let status: SocketRouteStatus = null\n const broadcastedButNotConfirmed = this.#activity.broadcastedButNotConfirmed.find((op) =>\n op.calls.some((c) => c.fromUserRequestId === activeRoute.activeRouteId)\n )\n\n // call getRouteStatus only after the transaction has processed\n if (broadcastedButNotConfirmed) return\n if (activeRoute.routeStatus === 'completed') return\n\n try {\n status = await this.#socketAPI.getRouteStatus({\n activeRouteId: activeRoute.activeRouteId,\n userTxIndex: activeRoute.userTxIndex,\n txHash: activeRoute.userTxHash!\n })\n } catch (e: any) {\n const { message } = getHumanReadableSwapAndBridgeError(e)\n this.updateActiveRoute(activeRoute.activeRouteId, { error: message })\n return\n }\n\n const route = this.activeRoutes.find((r) => r.activeRouteId === activeRoute.activeRouteId)\n if (route?.error) {\n this.updateActiveRoute(activeRoute.activeRouteId, {\n error: undefined\n })\n }\n\n if (status === 'completed') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'completed',\n error: undefined\n },\n true\n )\n } else if (status === 'ready') {\n this.updateActiveRoute(\n activeRoute.activeRouteId,\n {\n routeStatus: 'ready',\n error: undefined\n },\n true\n )\n }\n }\n\n await Promise.all(\n this.activeRoutesInProgress.map(async (route) => {\n await fetchAndUpdateRoute(route)\n })\n )\n }\n\n selectRoute(route: SocketAPIRoute) {\n if (!this.quote || !this.quote.routes.length || !this.shouldEnableRoutesSelection) return\n if (\n ![\n SwapAndBridgeFormStatus.ReadyToSubmit,\n SwapAndBridgeFormStatus.InvalidRouteSelected\n ].includes(this.formStatus)\n )\n return\n\n this.quote.selectedRoute = route\n this.quote.selectedRouteSteps = getQuoteRouteSteps(route.userTxs)\n\n this.#emitUpdateIfNeeded()\n }\n\n async addActiveRoute(activeRoute: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n }) {\n await this.#initialLoadPromise\n\n try {\n const route = await this.#socketAPI.updateActiveRoute(activeRoute.activeRouteId)\n this.activeRoutes.push({\n ...activeRoute,\n routeStatus: 'ready',\n userTxHash: null,\n route\n })\n\n // Preserve key form states instead of resetting the whole form to enhance UX and reduce confusion.\n // After form submission, maintain the state for fromSelectedToken, fromChainId, and toChainId,\n // while resetting all other state related to the form.\n this.fromAmount = ''\n this.fromAmountInFiat = ''\n this.fromAmountFieldMode = 'token'\n this.toSelectedToken = null\n this.quote = null\n this.quoteRoutesStatuses = {}\n\n this.emitUpdate()\n } catch (error: any) {\n const { message } = getHumanReadableSwapAndBridgeError(error)\n throw new EmittableError({ error, level: 'major', message })\n }\n }\n\n updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId'],\n activeRoute?: Partial,\n forceUpdateRoute?: boolean\n ) {\n const currentActiveRoutes = [...this.activeRoutes]\n const activeRouteIndex = currentActiveRoutes.findIndex((r) => r.activeRouteId === activeRouteId)\n\n if (activeRouteIndex !== -1) {\n if (forceUpdateRoute) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n let route = currentActiveRoutes[activeRouteIndex].route\n route = await this.#socketAPI.updateActiveRoute(activeRouteId)\n this.updateActiveRoute(activeRouteId, { route })\n })()\n }\n\n if (activeRoute) {\n currentActiveRoutes[activeRouteIndex] = {\n ...currentActiveRoutes[activeRouteIndex],\n ...activeRoute\n }\n } else {\n currentActiveRoutes[activeRouteIndex] = { ...currentActiveRoutes[activeRouteIndex] }\n }\n this.activeRoutes = currentActiveRoutes\n\n this.#emitUpdateIfNeeded()\n }\n }\n\n removeActiveRoute(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n this.activeRoutes = this.activeRoutes.filter((r) => r.activeRouteId !== activeRouteId)\n\n // Purposely not using `this.#emitUpdateIfNeeded()` here, as this should always emit to update banners\n this.emitUpdate()\n }\n\n // update active route if needed on SubmittedAccountOp update\n handleUpdateActiveRouteOnSubmittedAccountOpStatusUpdate(op: SubmittedAccountOp) {\n op.calls.forEach((call) => {\n this.#handleActiveRouteBroadcastedTransaction(call.fromUserRequestId, op.status)\n this.#handleActiveRouteBroadcastedApproval(call.fromUserRequestId, op.status)\n this.#handleActiveRoutesWithReadyApproval(call.fromUserRequestId, op.status)\n this.#handleUpdateActiveRoutesUserTxId(call.fromUserRequestId, op.txnId)\n this.#handleActiveRoutesCompleted(call.fromUserRequestId, op.status)\n })\n }\n\n #handleActiveRouteBroadcastedTransaction(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'in-progress' })\n }\n\n #handleActiveRouteBroadcastedApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n if (opStatus !== AccountOpStatus.BroadcastedButNotConfirmed) return\n\n const activeRoute = this.activeRoutes.find(\n (r) => `${r.activeRouteId}-approval` === fromUserRequestId\n )\n if (!activeRoute) return\n\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'waiting-approval-to-resolve'\n })\n }\n\n #handleActiveRoutesWithReadyApproval(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRouteWaitingApproval = this.activeRoutes.find(\n (r) =>\n r.routeStatus === 'waiting-approval-to-resolve' &&\n `${r.activeRouteId}-approval` === fromUserRequestId\n )\n\n if (!activeRouteWaitingApproval) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready'\n })\n }\n\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The approval was rejected but you can try to sign it again'\n : 'The approval failed but you can try to sign it again'\n this.updateActiveRoute(activeRouteWaitingApproval.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n #handleUpdateActiveRoutesUserTxId(\n fromUserRequestId: Call['fromUserRequestId'],\n opTxnId: SubmittedAccountOp['txnId']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n if (opTxnId && !activeRoute.userTxHash) {\n this.updateActiveRoute(activeRoute.activeRouteId, { userTxHash: opTxnId })\n }\n }\n\n #handleActiveRoutesCompleted(\n fromUserRequestId: Call['fromUserRequestId'],\n opStatus: SubmittedAccountOp['status']\n ) {\n const activeRoute = this.activeRoutes.find((r) => r.activeRouteId === fromUserRequestId)\n if (!activeRoute) return\n\n let shouldUpdateActiveRouteStatus = false\n if (activeRoute.route.fromChainId === activeRoute.route.toChainId)\n shouldUpdateActiveRouteStatus = true\n\n if (activeRoute.route.currentUserTxIndex + 1 === activeRoute.route.totalUserTx) {\n const tx = activeRoute.route.userTxs[activeRoute.route.currentUserTxIndex]\n if (!tx) return\n\n if (tx.userTxType === 'dex-swap') shouldUpdateActiveRouteStatus = true\n }\n\n if (!shouldUpdateActiveRouteStatus) return\n\n if (opStatus === AccountOpStatus.Success) {\n this.updateActiveRoute(activeRoute.activeRouteId, { routeStatus: 'completed' })\n }\n\n // If the transaction fails, update the status to \"ready\" to allow the user to sign it again\n if (opStatus === AccountOpStatus.Failure || opStatus === AccountOpStatus.Rejected) {\n const errorMessage =\n opStatus === AccountOpStatus.Rejected\n ? 'The transaction was rejected but you can try to sign it again'\n : 'The transaction failed but you can try to sign it again'\n this.updateActiveRoute(activeRoute.activeRouteId, {\n routeStatus: 'ready',\n error: errorMessage\n })\n }\n }\n\n onAccountChange() {\n this.portfolioTokenList = []\n this.isTokenListLoading = true\n\n this.#emitUpdateIfNeeded()\n }\n\n #getIsFormValidToFetchQuote() {\n return (\n this.fromChainId &&\n this.toChainId &&\n this.fromAmount &&\n this.fromSelectedToken &&\n this.toSelectedToken &&\n this.validateFromAmount.success\n )\n }\n\n get banners() {\n if (!this.#selectedAccount.account) return []\n\n const activeRoutesForSelectedAccount = getActiveRoutesForAccount(\n this.#selectedAccount.account.addr,\n this.activeRoutes\n )\n const accountOpActions = this.#actions.visibleActionsQueue.filter(\n ({ type }) => type === 'accountOp'\n ) as AccountOpAction[]\n\n // Swap banners aren't generated because swaps are completed instantly,\n // thus the activity banner on broadcast is sufficient\n return getBridgeBanners(\n activeRoutesForSelectedAccount,\n accountOpActions,\n this.#networks.networks\n )\n }\n\n #debounceFunctionCallsOnSameTick(funcName: string, func: Function) {\n if (this.#shouldDebounceFlags[funcName]) return\n this.#shouldDebounceFlags[funcName] = true\n\n // Debounce multiple calls in the same tick and only execute one of them\n setTimeout(() => {\n this.#shouldDebounceFlags[funcName] = false\n func()\n }, 0)\n }\n\n toJSON() {\n return {\n ...this,\n ...super.toJSON(),\n toTokenList: this.toTokenList,\n maxFromAmount: this.maxFromAmount,\n maxFromAmountInFiat: this.maxFromAmountInFiat,\n validateFromAmount: this.validateFromAmount,\n isFormEmpty: this.isFormEmpty,\n formStatus: this.formStatus,\n activeRoutesInProgress: this.activeRoutesInProgress,\n activeRoutes: this.activeRoutes,\n isSwitchFromAndToTokensEnabled: this.isSwitchFromAndToTokensEnabled,\n banners: this.banners,\n isHealthy: this.isHealthy,\n shouldEnableRoutesSelection: this.shouldEnableRoutesSelection,\n supportedChainIds: this.supportedChainIds\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/banner.d.ts b/dist/src/interfaces/banner.d.ts index 725bc6db6..f1fd331cb 100644 --- a/dist/src/interfaces/banner.d.ts +++ b/dist/src/interfaces/banner.d.ts @@ -86,5 +86,8 @@ export type Action = { } | { label: 'Retry'; actionName: 'reload-selected-account'; +} | { + label: 'Dismiss'; + actionName: 'dismiss-email-vault'; }; //# sourceMappingURL=banner.d.ts.map \ No newline at end of file diff --git a/dist/src/interfaces/banner.d.ts.map b/dist/src/interfaces/banner.d.ts.map index 71ae6cea9..9e62aa93f 100644 --- a/dist/src/interfaces/banner.d.ts.map +++ b/dist/src/interfaces/banner.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/banner.js.map b/dist/src/interfaces/banner.js.map index 767d0ed62..d2288d251 100644 --- a/dist/src/interfaces/banner.js.map +++ b/dist/src/interfaces/banner.js.map @@ -1 +1 @@ -{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"","sourcesContent":["import { AccountOpAction } from './actions'\n\nexport type BannerType = 'error' | 'warning' | 'info' | 'info2' | 'success'\nexport type BannerCategory =\n | 'pending-to-be-signed-acc-op'\n | 'pending-to-be-confirmed-acc-op'\n | 'bridge-in-progress'\n | 'bridge-waiting-approval-to-resolve'\n | 'bridge-ready'\n | 'bridge-completed'\n | 'bridge-failed'\n | 'temp-seed-not-confirmed'\n | 'old-account'\n\nexport interface Banner {\n id: number | string\n accountAddr?: string\n type: BannerType\n category?: BannerCategory\n title: string\n text: string\n actions: Action[]\n}\n\nexport type Action =\n | {\n label: 'Open'\n actionName: 'open-pending-dapp-requests'\n }\n | {\n label: 'Open'\n actionName: 'open-accountOp'\n meta: { actionId: AccountOpAction['id'] }\n }\n | {\n label: 'Reject'\n actionName: 'reject-accountOp'\n meta: {\n err: string\n actionId: AccountOpAction['id']\n shouldOpenNextAction: boolean\n }\n }\n | {\n label: 'Sync'\n actionName: 'sync-keys'\n meta: { email: string; keys: string[] }\n }\n | {\n label: string\n actionName: 'open-external-url'\n meta: { url: string }\n }\n | {\n label: string\n actionName: 'backup-keystore-secret'\n }\n | {\n label: 'Switch'\n actionName: 'switch-default-wallet'\n meta: {}\n }\n | {\n label: 'Reject'\n actionName: 'reject-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Proceed to Next Step' | 'Open'\n actionName: 'proceed-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Close'\n actionName: 'close-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Details'\n actionName: 'open-swap-and-bridge-tab'\n }\n | {\n label: 'Hide'\n actionName: 'hide-activity-banner'\n meta: { timestamp: number; addr: string; network: string; isHideStyle: boolean }\n }\n | {\n label: 'Check'\n actionName: 'confirm-temp-seed'\n }\n | {\n label: 'Reload'\n actionName: 'update-extension-version'\n }\n | {\n label: 'Retry'\n actionName: 'reload-selected-account'\n }\n"]} \ No newline at end of file +{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/interfaces/banner.ts"],"names":[],"mappings":"","sourcesContent":["import { AccountOpAction } from './actions'\n\nexport type BannerType = 'error' | 'warning' | 'info' | 'info2' | 'success'\nexport type BannerCategory =\n | 'pending-to-be-signed-acc-op'\n | 'pending-to-be-confirmed-acc-op'\n | 'bridge-in-progress'\n | 'bridge-waiting-approval-to-resolve'\n | 'bridge-ready'\n | 'bridge-completed'\n | 'bridge-failed'\n | 'temp-seed-not-confirmed'\n | 'old-account'\n\nexport interface Banner {\n id: number | string\n accountAddr?: string\n type: BannerType\n category?: BannerCategory\n title: string\n text: string\n actions: Action[]\n}\n\nexport type Action =\n | {\n label: 'Open'\n actionName: 'open-pending-dapp-requests'\n }\n | {\n label: 'Open'\n actionName: 'open-accountOp'\n meta: { actionId: AccountOpAction['id'] }\n }\n | {\n label: 'Reject'\n actionName: 'reject-accountOp'\n meta: {\n err: string\n actionId: AccountOpAction['id']\n shouldOpenNextAction: boolean\n }\n }\n | {\n label: 'Sync'\n actionName: 'sync-keys'\n meta: { email: string; keys: string[] }\n }\n | {\n label: string\n actionName: 'open-external-url'\n meta: { url: string }\n }\n | {\n label: string\n actionName: 'backup-keystore-secret'\n }\n | {\n label: 'Switch'\n actionName: 'switch-default-wallet'\n meta: {}\n }\n | {\n label: 'Reject'\n actionName: 'reject-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Proceed to Next Step' | 'Open'\n actionName: 'proceed-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Close'\n actionName: 'close-bridge'\n meta: { activeRouteId: number }\n }\n | {\n label: 'Details'\n actionName: 'open-swap-and-bridge-tab'\n }\n | {\n label: 'Hide'\n actionName: 'hide-activity-banner'\n meta: { timestamp: number; addr: string; network: string; isHideStyle: boolean }\n }\n | {\n label: 'Check'\n actionName: 'confirm-temp-seed'\n }\n | {\n label: 'Reload'\n actionName: 'update-extension-version'\n }\n | {\n label: 'Retry'\n actionName: 'reload-selected-account'\n }\n | {\n label: 'Dismiss'\n actionName: 'dismiss-email-vault'\n }\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/keystore.d.ts b/dist/src/interfaces/keystore.d.ts index debb8832b..6c066be8e 100644 --- a/dist/src/interfaces/keystore.d.ts +++ b/dist/src/interfaces/keystore.d.ts @@ -112,6 +112,7 @@ export type StoredKey = (InternalKey & { }); export type KeystoreSeed = { seed: string; + seedPassphrase?: string | null; hdPathTemplate: HD_PATH_TEMPLATE_TYPE; }; export type KeystoreSignerType = { diff --git a/dist/src/interfaces/keystore.d.ts.map b/dist/src/interfaces/keystore.d.ts.map index 29110e4ae..111cd4753 100644 --- a/dist/src/interfaces/keystore.d.ts.map +++ b/dist/src/interfaces/keystore.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/interfaces/keystore.js.map b/dist/src/interfaces/keystore.js.map index e6b5f9af5..822549dfb 100644 --- a/dist/src/interfaces/keystore.js.map +++ b/dist/src/interfaces/keystore.js.map @@ -1 +1 @@ -{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":";;;AA8Fa,QAAA,uBAAuB,GAClC,oEAAoE,CAAA;AACzD,QAAA,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["import { Transaction } from 'ethers'\n\nimport { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { GasFeePayment } from '../libs/accountOp/accountOp'\nimport { Call } from '../libs/accountOp/types'\nimport { getHdPathFromTemplate } from '../utils/hdPath'\nimport { Account } from './account'\nimport { Network } from './network'\nimport { TypedMessage } from './userRequest'\n\n/**\n * The ExternalSignerController interface defines the structure for controllers\n * that interact with hardware wallets. Each hardware wallet type (Ledger,\n * Trezor, Lattice) will have its own implementation of this interface.\n * The interface includes methods for unlocking the device, checking if it's\n * unlocked, and cleaning up after use. It also includes properties specific to\n * each type of hardware wallet, such as the device model and ID, the path to\n * the unlocked device, and any necessary credentials.\n */\nexport interface ExternalSignerController {\n type: string\n deviceModel: string\n deviceId: string\n isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean\n unlock: (\n path: ReturnType,\n expectedKeyOnThisPath?: string,\n shouldOpenLatticeConnectorInTab?: boolean // Lattice specific\n ) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>\n unlockedPath: string\n unlockedPathKeyAddr: string\n walletSDK?: any // Either the wallet own SDK or its session, each wallet having specifics\n cleanUp: () => void // Trezor and Ledger specific\n isInitiated?: boolean // Trezor specific\n initialLoadPromise?: Promise // Trezor specific\n retrieveAddresses: (paths: string[]) => Promise // Ledger specific\n // TODO: Refine the rest of the props\n isWebHID?: boolean // Ledger specific\n transport?: any // Ledger specific\n appName?: string // Lattice specific\n creds?: any // Lattice specific\n network?: any // Lattice specific\n}\nexport type ExternalSignerControllers = Partial<{ [key in Key['type']]: ExternalSignerController }>\n\nexport interface TxnRequest {\n to: Call['to']\n value?: Call['value']\n data: Call['data']\n chainId: Network['chainId']\n nonce: number\n gasLimit: GasFeePayment['simulatedGasLimit']\n gasPrice?: bigint\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n type?: number\n}\n\nexport interface KeystoreSigner {\n key: Key\n init?: (externalSignerController?: ExternalSignerController) => void\n signRawTransaction: (txnRequest: TxnRequest) => Promise\n signTypedData: (typedMessage: TypedMessage) => Promise\n signMessage: (hex: string) => Promise\n}\n\nexport type ScryptParams = {\n salt: string\n N: number\n r: number\n p: number\n dkLen: number\n}\n\nexport type AESEncrypted = {\n cipherType: string\n ciphertext: string\n iv: string\n mac: string\n}\n\nexport type MainKeyEncryptedWithSecret = {\n id: string\n scryptParams: ScryptParams\n aesEncrypted: AESEncrypted\n}\n\nexport type MainKey = {\n key: Uint8Array\n iv: Uint8Array\n}\n\nexport type Key = (InternalKey | ExternalKey) & { isExternallyStored: boolean }\n\nexport const standardSigningOnlyPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000001'\nexport const dedicatedToOneSAPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000002'\n\nexport type InternalKey = {\n addr: Account['addr']\n type: 'internal'\n label: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number | null\n }\n}\n\nexport type ExternalKey = {\n addr: Account['addr']\n type: 'trezor' | 'ledger' | 'lattice' | string\n label: string\n dedicatedToOneSA: boolean\n meta: {\n deviceId: string\n deviceModel: string\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n index: number\n createdAt: number | null\n }\n}\n\nexport type StoredKey = (InternalKey & { privKey: string }) | (ExternalKey & { privKey: null })\n\nexport type KeystoreSeed = { seed: string; hdPathTemplate: HD_PATH_TEMPLATE_TYPE }\n\nexport type KeystoreSignerType = {\n new (key: Key, privateKey?: string): KeystoreSigner\n}\n\n/**\n * The keys that are ready to be added to the user's keystore (by the Main Controller).\n * They are needed as an intermediate step during the accounts import flow\n * (for the accounts that were just imported by the AccountAdder Controller).\n */\nexport type ReadyToAddKeys = {\n internal: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n }[]\n external: {\n addr: Key['addr']\n label: string\n type: Key['type']\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: ExternalKey['meta']\n }[]\n}\n\nexport type KeyPreferences = {\n label: string\n}\n"]} \ No newline at end of file +{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/interfaces/keystore.ts"],"names":[],"mappings":";;;AA8Fa,QAAA,uBAAuB,GAClC,oEAAoE,CAAA;AACzD,QAAA,oBAAoB,GAC/B,oEAAoE,CAAA","sourcesContent":["import { Transaction } from 'ethers'\n\nimport { HD_PATH_TEMPLATE_TYPE } from '../consts/derivation'\nimport { GasFeePayment } from '../libs/accountOp/accountOp'\nimport { Call } from '../libs/accountOp/types'\nimport { getHdPathFromTemplate } from '../utils/hdPath'\nimport { Account } from './account'\nimport { Network } from './network'\nimport { TypedMessage } from './userRequest'\n\n/**\n * The ExternalSignerController interface defines the structure for controllers\n * that interact with hardware wallets. Each hardware wallet type (Ledger,\n * Trezor, Lattice) will have its own implementation of this interface.\n * The interface includes methods for unlocking the device, checking if it's\n * unlocked, and cleaning up after use. It also includes properties specific to\n * each type of hardware wallet, such as the device model and ID, the path to\n * the unlocked device, and any necessary credentials.\n */\nexport interface ExternalSignerController {\n type: string\n deviceModel: string\n deviceId: string\n isUnlocked: (path?: string, expectedKeyOnThisPath?: string) => boolean\n unlock: (\n path: ReturnType,\n expectedKeyOnThisPath?: string,\n shouldOpenLatticeConnectorInTab?: boolean // Lattice specific\n ) => Promise<'ALREADY_UNLOCKED' | 'JUST_UNLOCKED'>\n unlockedPath: string\n unlockedPathKeyAddr: string\n walletSDK?: any // Either the wallet own SDK or its session, each wallet having specifics\n cleanUp: () => void // Trezor and Ledger specific\n isInitiated?: boolean // Trezor specific\n initialLoadPromise?: Promise // Trezor specific\n retrieveAddresses: (paths: string[]) => Promise // Ledger specific\n // TODO: Refine the rest of the props\n isWebHID?: boolean // Ledger specific\n transport?: any // Ledger specific\n appName?: string // Lattice specific\n creds?: any // Lattice specific\n network?: any // Lattice specific\n}\nexport type ExternalSignerControllers = Partial<{ [key in Key['type']]: ExternalSignerController }>\n\nexport interface TxnRequest {\n to: Call['to']\n value?: Call['value']\n data: Call['data']\n chainId: Network['chainId']\n nonce: number\n gasLimit: GasFeePayment['simulatedGasLimit']\n gasPrice?: bigint\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n type?: number\n}\n\nexport interface KeystoreSigner {\n key: Key\n init?: (externalSignerController?: ExternalSignerController) => void\n signRawTransaction: (txnRequest: TxnRequest) => Promise\n signTypedData: (typedMessage: TypedMessage) => Promise\n signMessage: (hex: string) => Promise\n}\n\nexport type ScryptParams = {\n salt: string\n N: number\n r: number\n p: number\n dkLen: number\n}\n\nexport type AESEncrypted = {\n cipherType: string\n ciphertext: string\n iv: string\n mac: string\n}\n\nexport type MainKeyEncryptedWithSecret = {\n id: string\n scryptParams: ScryptParams\n aesEncrypted: AESEncrypted\n}\n\nexport type MainKey = {\n key: Uint8Array\n iv: Uint8Array\n}\n\nexport type Key = (InternalKey | ExternalKey) & { isExternallyStored: boolean }\n\nexport const standardSigningOnlyPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000001'\nexport const dedicatedToOneSAPriv =\n '0x0000000000000000000000000000000000000000000000000000000000000002'\n\nexport type InternalKey = {\n addr: Account['addr']\n type: 'internal'\n label: string\n dedicatedToOneSA: boolean\n meta: {\n createdAt: number | null\n }\n}\n\nexport type ExternalKey = {\n addr: Account['addr']\n type: 'trezor' | 'ledger' | 'lattice' | string\n label: string\n dedicatedToOneSA: boolean\n meta: {\n deviceId: string\n deviceModel: string\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n index: number\n createdAt: number | null\n }\n}\n\nexport type StoredKey = (InternalKey & { privKey: string }) | (ExternalKey & { privKey: null })\n\nexport type KeystoreSeed = {\n seed: string\n seedPassphrase?: string | null\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n}\n\nexport type KeystoreSignerType = {\n new (key: Key, privateKey?: string): KeystoreSigner\n}\n\n/**\n * The keys that are ready to be added to the user's keystore (by the Main Controller).\n * They are needed as an intermediate step during the accounts import flow\n * (for the accounts that were just imported by the AccountAdder Controller).\n */\nexport type ReadyToAddKeys = {\n internal: {\n addr: Key['addr']\n label: string\n type: 'internal'\n privateKey: string\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: InternalKey['meta']\n }[]\n external: {\n addr: Key['addr']\n label: string\n type: Key['type']\n dedicatedToOneSA: Key['dedicatedToOneSA']\n meta: ExternalKey['meta']\n }[]\n}\n\nexport type KeyPreferences = {\n label: string\n}\n"]} \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.d.ts b/dist/src/interfaces/selectedAccount.d.ts index 4e82c45eb..92bee084b 100644 --- a/dist/src/interfaces/selectedAccount.d.ts +++ b/dist/src/interfaces/selectedAccount.d.ts @@ -13,6 +13,12 @@ export interface SelectedAccountPortfolio { tokens: SelectedAccountPortfolioTokenResult[]; collections: CollectionResultInterface[]; totalBalance: number; + /** Either all portfolio networks have loaded or a timeout has been reached and there are tokens. + * @example - If the user has 3 networks and 2 of them have loaded, but the third has not and a timeout has been reached + * the value of isReadyToVisualize will be true. + */ + isReadyToVisualize: boolean; + /** True after all networks have loaded */ isAllReady: boolean; networkSimulatedAccountOp: NetworkSimulatedAccountOp; latest: SelectedAccountPortfolioState; diff --git a/dist/src/interfaces/selectedAccount.d.ts.map b/dist/src/interfaces/selectedAccount.d.ts.map index d808d0e51..cd6552ee8 100644 --- a/dist/src/interfaces/selectedAccount.d.ts.map +++ b/dist/src/interfaces/selectedAccount.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,IAAI,yBAAyB,EAC7C,yBAAyB,EACzB,YAAY,EACZ,WAAW,IAAI,oBAAoB,EACpC,MAAM,8BAA8B,CAAA;AAErC,4EAA4E;AAC5E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,SAAS,EAAE,MAAM,GACd,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;QAC9B,MAAM,CAAC,EAAE,IAAI,CACX,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EACnC,QAAQ,GAAG,aAAa,GAAG,aAAa,GAAG,sBAAsB,GAAG,YAAY,CACjF,CAAA;KACF,CAAC,GACF,SAAS,CAAA;CACd,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG,oBAAoB,GAAG;IACvE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,mCAAmC,EAAE,CAAA;IAC7C,WAAW,EAAE,yBAAyB,EAAE,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,MAAM,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,6BAA6B,CAAA;CACvC"} \ No newline at end of file +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,IAAI,yBAAyB,EAC7C,yBAAyB,EACzB,YAAY,EACZ,WAAW,IAAI,oBAAoB,EACpC,MAAM,8BAA8B,CAAA;AAErC,4EAA4E;AAC5E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,SAAS,EAAE,MAAM,GACd,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;QAC9B,MAAM,CAAC,EAAE,IAAI,CACX,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EACnC,QAAQ,GAAG,aAAa,GAAG,aAAa,GAAG,sBAAsB,GAAG,YAAY,CACjF,CAAA;KACF,CAAC,GACF,SAAS,CAAA;CACd,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG,oBAAoB,GAAG;IACvE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,mCAAmC,EAAE,CAAA;IAC7C,WAAW,EAAE,yBAAyB,EAAE,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAA;IAC3B,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAA;IACnB,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,MAAM,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,6BAA6B,CAAA;CACvC"} \ No newline at end of file diff --git a/dist/src/interfaces/selectedAccount.js.map b/dist/src/interfaces/selectedAccount.js.map index ad248e66a..612c8b49c 100644 --- a/dist/src/interfaces/selectedAccount.js.map +++ b/dist/src/interfaces/selectedAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"","sourcesContent":["import {\n CollectionResult as CollectionResultInterface,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult as TokenResultInterface\n} from '../libs/portfolio/interfaces'\n\n/** A stripped version of the portfolio state that will be used in the UI */\nexport type SelectedAccountPortfolioState = {\n [networkId: string]:\n | (Omit & {\n result?: Omit<\n NonNullable,\n 'tokens' | 'collections' | 'tokenErrors' | 'hintsFromExternalAPI' | 'priceCache'\n >\n })\n | undefined\n}\n\nexport type SelectedAccountPortfolioTokenResult = TokenResultInterface & {\n latestAmount?: bigint\n pendingAmount?: bigint\n}\n\nexport interface SelectedAccountPortfolio {\n tokens: SelectedAccountPortfolioTokenResult[]\n collections: CollectionResultInterface[]\n totalBalance: number\n isAllReady: boolean\n networkSimulatedAccountOp: NetworkSimulatedAccountOp\n latest: SelectedAccountPortfolioState\n pending: SelectedAccountPortfolioState\n}\n"]} \ No newline at end of file +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../src/interfaces/selectedAccount.ts"],"names":[],"mappings":"","sourcesContent":["import {\n CollectionResult as CollectionResultInterface,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult as TokenResultInterface\n} from '../libs/portfolio/interfaces'\n\n/** A stripped version of the portfolio state that will be used in the UI */\nexport type SelectedAccountPortfolioState = {\n [networkId: string]:\n | (Omit & {\n result?: Omit<\n NonNullable,\n 'tokens' | 'collections' | 'tokenErrors' | 'hintsFromExternalAPI' | 'priceCache'\n >\n })\n | undefined\n}\n\nexport type SelectedAccountPortfolioTokenResult = TokenResultInterface & {\n latestAmount?: bigint\n pendingAmount?: bigint\n}\n\nexport interface SelectedAccountPortfolio {\n tokens: SelectedAccountPortfolioTokenResult[]\n collections: CollectionResultInterface[]\n totalBalance: number\n /** Either all portfolio networks have loaded or a timeout has been reached and there are tokens.\n * @example - If the user has 3 networks and 2 of them have loaded, but the third has not and a timeout has been reached\n * the value of isReadyToVisualize will be true.\n */\n isReadyToVisualize: boolean\n /** True after all networks have loaded */\n isAllReady: boolean\n networkSimulatedAccountOp: NetworkSimulatedAccountOp\n latest: SelectedAccountPortfolioState\n pending: SelectedAccountPortfolioState\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/banners/banners.d.ts.map b/dist/src/libs/banners/banners.d.ts.map index 01b7e0ed6..7c9486959 100644 --- a/dist/src/libs/banners/banners.d.ts.map +++ b/dist/src/libs/banners/banners.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAE5F,OAAO,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAuD5D,eAAO,MAAM,gBAAgB,iBACb,WAAW,EAAE,oBACT,eAAe,EAAE,YACzB,OAAO,EAAE,KAClB,MAAM,EAmER,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,sBAAsB,EAAE,KAAG,MAAM,EAkBtF,CAAA;AA+BD,eAAO,MAAM,mBAAmB;;;;qBAWb,MAAM;cACb,OAAO,EAAE;cACT,OAAO,EAAE;yCACkB,WAAW,EAAE;MAChD,MAAM,EA0GT,CAAA;AAED,eAAO,MAAM,gBAAgB,SAAU,MAAM,SAAS,MAAM,QAAQ,MAAM,EAAE,WAgB3E,CAAA"} \ No newline at end of file +{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAE5F,OAAO,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AA+C5D,eAAO,MAAM,gBAAgB,iBACb,WAAW,EAAE,oBACT,eAAe,EAAE,YACzB,OAAO,EAAE,KAClB,MAAM,EAmER,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,sBAAsB,EAAE,KAAG,MAAM,EAkBtF,CAAA;AA+BD,eAAO,MAAM,mBAAmB;;;;qBAWb,MAAM;cACb,OAAO,EAAE;cACT,OAAO,EAAE;yCACkB,WAAW,EAAE;MAChD,MAAM,EA0GT,CAAA;AAED,eAAO,MAAM,gBAAgB,SAAU,MAAM,SAAS,MAAM,QAAQ,MAAM,EAAE,WAgB3E,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/banners/banners.js.map b/dist/src/libs/banners/banners.js.map index 023bfb208..4aeae8cbd 100644 --- a/dist/src/libs/banners/banners.js.map +++ b/dist/src/libs/banners/banners.js.map @@ -1 +1 @@ -{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":"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","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'\n// eslint-disable-next-line import/no-cycle\nimport { Action, Banner } from '../../interfaces/banner'\nimport { Network } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport { ActiveRoute } from '../../interfaces/swapAndBridge'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\nimport { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'\n\nconst getBridgeBannerTitle = (routeStatus: ActiveRoute['routeStatus']) => {\n switch (routeStatus) {\n case 'completed':\n return 'Bridge request completed'\n case 'in-progress':\n return 'Bridge request in progress'\n default:\n return 'Bridge request awaiting signature'\n }\n}\n\nconst getBridgeActionText = (routeStatus: ActiveRoute['routeStatus'], isBridgeTxn: boolean) => {\n if (isBridgeTxn) {\n return routeStatus === 'completed' ? 'Bridged' : 'Bridge'\n }\n\n return routeStatus === 'completed' ? 'Swapped' : 'Swap'\n}\n\nconst getBridgeBannerText = (route: ActiveRoute, isBridgeTxn: boolean, networks?: Network[]) => {\n const steps = getQuoteRouteSteps(route.route.userTxs)\n const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn)\n const fromAssetSymbol = steps[0].fromAsset.symbol\n const toAssetSymbol = steps[steps.length - 1].toAsset.symbol\n\n let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`\n\n if (networks) {\n const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId)\n const toAssetNetwork = networks.find(\n (n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId\n )\n if (fromAssetNetwork && toAssetNetwork) {\n assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`\n }\n }\n\n const stepsIndexText = `(step ${\n route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1\n } of ${route.route.totalUserTx})`\n\n return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`\n}\n\nexport const getBridgeBanners = (\n activeRoutes: ActiveRoute[],\n accountOpActions: AccountOpAction[],\n networks: Network[]\n): Banner[] => {\n const isBridgeTxn = (route: ActiveRoute) =>\n route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const isRouteTurnedIntoAccountOp = (route: ActiveRoute) => {\n return accountOpActions.some((action) => {\n return action.accountOp.calls.some(\n (call) =>\n call.fromUserRequestId === route.activeRouteId ||\n call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` ||\n call.fromUserRequestId === `${route.activeRouteId}-approval`\n )\n })\n }\n\n return activeRoutes\n .filter(isBridgeTxn)\n .filter((route) => {\n if (route.routeStatus === 'failed') return false\n if (route.routeStatus !== 'ready') return true\n // If the route is ready to be signed, we should display the banner only if it's not turned into an account op\n // because when it does get turned into an account op, there will be a different banner for that\n return !isRouteTurnedIntoAccountOp(route)\n })\n .map((r) => {\n const actions: Action[] = []\n\n if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') {\n actions.push({\n label: 'Details',\n actionName: 'open-swap-and-bridge-tab'\n })\n }\n\n if (r.routeStatus === 'completed') {\n actions.push({\n label: 'Close',\n actionName: 'close-bridge',\n meta: { activeRouteId: r.activeRouteId }\n })\n }\n\n if (r.routeStatus === 'ready') {\n const isNextTnxForBridging = r.route.currentUserTxIndex >= 1\n\n actions.push(\n {\n label: 'Reject',\n actionName: 'reject-bridge',\n meta: { activeRouteId: r.activeRouteId }\n },\n {\n label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open',\n actionName: 'proceed-bridge',\n meta: { activeRouteId: r.activeRouteId }\n }\n )\n }\n\n return {\n id: `bridge-${r.activeRouteId}`,\n type: r.routeStatus === 'completed' ? 'success' : 'info',\n category: `bridge-${r.routeStatus}`,\n title: getBridgeBannerTitle(r.routeStatus),\n text: getBridgeBannerText(r, true, networks),\n actions\n }\n })\n}\n\nexport const getDappActionRequestsBanners = (actions: ActionFromActionsQueue[]): Banner[] => {\n const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type))\n if (!requests.length) return []\n\n return [\n {\n id: 'dapp-requests-banner',\n type: 'info',\n title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`,\n text: '',\n actions: [\n {\n label: 'Open',\n actionName: 'open-pending-dapp-requests'\n }\n ]\n }\n ]\n}\n\nconst getAccountOpBannerText = (\n activeSwapAndBridgeRoutesForSelectedAccount: ActiveRoute[],\n chainId: bigint,\n nonSwapAndBridgeTxns: number,\n networks: Network[]\n) => {\n const swapsAndBridges: string[] = []\n const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => {\n return BigInt(route.route.fromChainId) === chainId\n })\n\n if (networkSwapAndBridgeRoutes.length) {\n networkSwapAndBridgeRoutes.forEach((route) => {\n const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const desc = getBridgeBannerText(route, isBridgeTxn, networks)\n\n swapsAndBridges.push(desc)\n })\n\n return `${swapsAndBridges.join(', ')} ${\n nonSwapAndBridgeTxns\n ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}`\n : ''\n }`\n }\n\n return ''\n}\n\nexport const getAccountOpBanners = ({\n accountOpActionsByNetwork,\n selectedAccount,\n accounts,\n networks,\n swapAndBridgeRoutesPendingSignature\n}: {\n accountOpActionsByNetwork: {\n [key: string]: AccountOpAction[]\n }\n\n selectedAccount: string\n accounts: Account[]\n networks: Network[]\n swapAndBridgeRoutesPendingSignature: ActiveRoute[]\n}): Banner[] => {\n if (!accountOpActionsByNetwork) return []\n const txnBanners: Banner[] = []\n\n const account = accounts.find((acc) => acc.addr === selectedAccount)\n\n if (account?.creation) {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n actions.forEach((action) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n }, 0)\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n category: 'pending-to-be-signed-acc-op',\n title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: action.id,\n shouldOpenNextAction: false\n }\n },\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: { actionId: action.id }\n }\n ]\n })\n })\n })\n } else {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = actions.reduce((prev, action) => {\n action.accountOp.calls.forEach((call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n })\n\n return prev\n }, 0)\n\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n title: `${actions.length} transaction${\n actions.length > 1 ? 's' : ''\n } waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n actions.length <= 1\n ? {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: actions[0].id\n }\n }\n : undefined,\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: {\n actionId: actions[0].id\n }\n }\n ].filter(Boolean) as Action[]\n })\n })\n }\n\n return txnBanners\n}\n\nexport const getKeySyncBanner = (addr: string, email: string, keys: string[]) => {\n const banner: Banner = {\n id: `keys-sync:${addr}:${email}`,\n accountAddr: addr,\n type: 'info',\n title: 'Sync Key Store keys',\n text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.',\n actions: [\n {\n label: 'Sync',\n actionName: 'sync-keys',\n meta: { email, keys }\n }\n ]\n }\n return banner\n}\n"]} \ No newline at end of file +{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../../../src/libs/banners/banners.ts"],"names":[],"mappings":";;;AAMA,kEAAmF;AAEnF,MAAM,oBAAoB,GAAG,CAAC,WAAuC,EAAE,EAAE;IACvE,QAAQ,WAAW,EAAE;QACnB,KAAK,WAAW;YACd,OAAO,0BAA0B,CAAA;QACnC,KAAK,aAAa;YAChB,OAAO,4BAA4B,CAAA;QACrC;YACE,OAAO,mCAAmC,CAAA;KAC7C;AACH,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,WAAuC,EAAE,WAAoB,EAAE,EAAE;IAC5F,IAAI,WAAW,EAAE;QACf,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;KAC1D;IAED,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAE,WAAoB,EAAE,QAAoB,EAAE,EAAE;IAC7F,MAAM,KAAK,GAAG,IAAA,kCAAkB,EAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IACtE,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;IACjD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;IAE5D,IAAI,UAAU,GAAG,GAAG,eAAe,OAAO,aAAa,EAAE,CAAA;IAEzD,IAAI,QAAQ,EAAE;QACZ,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/F,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrE,CAAA;QACD,IAAI,gBAAgB,IAAI,cAAc,EAAE;YACtC,UAAU,GAAG,GAAG,eAAe,QAAQ,gBAAgB,CAAC,IAAI,QAAQ,aAAa,QAAQ,cAAc,CAAC,IAAI,GAAG,CAAA;SAChH;KACF;IAED,MAAM,cAAc,GAAG,SACrB,KAAK,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,GAAG,CACjG,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAA;IAEjC,OAAO,GAAG,UAAU,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAChG,CAAC,CAAA;AAEM,MAAM,gBAAgB,GAAG,CAC9B,YAA2B,EAC3B,gBAAmC,EACnC,QAAmB,EACT,EAAE;IACZ,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAE,EAAE,CACzC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8BAAc,EAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;IAC/D,MAAM,0BAA0B,GAAG,CAAC,KAAkB,EAAE,EAAE;QACxD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACtC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAChC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,aAAa;gBAC9C,IAAI,CAAC,iBAAiB,KAAK,GAAG,KAAK,CAAC,aAAa,kBAAkB;gBACnE,IAAI,CAAC,iBAAiB,KAAK,GAAG,KAAK,CAAC,aAAa,WAAW,CAC/D,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO,YAAY;SAChB,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAChB,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QAChD,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO;YAAE,OAAO,IAAI,CAAA;QAC9C,8GAA8G;QAC9G,gGAAgG;QAChG,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,IAAI,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,CAAC,CAAC,WAAW,KAAK,6BAA6B,EAAE;YACtF,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,0BAA0B;aACvC,CAAC,CAAA;SACH;QAED,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,EAAE;YACjC,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,cAAc;gBAC1B,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE;aACzC,CAAC,CAAA;SACH;QAED,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,EAAE;YAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAA;YAE5D,OAAO,CAAC,IAAI,CACV;gBACE,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,eAAe;gBAC3B,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE;aACzC,EACD;gBACE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM;gBAC7D,UAAU,EAAE,gBAAgB;gBAC5B,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE;aACzC,CACF,CAAA;SACF;QAED,OAAO;YACL,EAAE,EAAE,UAAU,CAAC,CAAC,aAAa,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACxD,QAAQ,EAAE,UAAU,CAAC,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1C,IAAI,EAAE,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC;YAC5C,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAvEY,QAAA,gBAAgB,oBAuE5B;AAEM,MAAM,4BAA4B,GAAG,CAAC,OAAiC,EAAY,EAAE;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACjF,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAE/B,OAAO;QACL;YACE,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,YAAY,QAAQ,CAAC,MAAM,uBAAuB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzF,IAAI,EAAE,EAAE;YACR,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,MAAM;oBACb,UAAU,EAAE,4BAA4B;iBACzC;aACF;SACF;KACF,CAAA;AACH,CAAC,CAAA;AAlBY,QAAA,4BAA4B,gCAkBxC;AAED,MAAM,sBAAsB,GAAG,CAC7B,2CAA0D,EAC1D,OAAe,EACf,oBAA4B,EAC5B,QAAmB,EACnB,EAAE;IACF,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,0BAA0B,GAAG,2CAA2C,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9F,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,OAAO,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,IAAI,0BAA0B,CAAC,MAAM,EAAE;QACrC,0BAA0B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8BAAc,EAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;YACjF,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YAE9D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAClC,oBAAoB;YAClB,CAAC,CAAC,OAAO,oBAAoB,qBAAqB,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvF,CAAC,CAAC,EACN,EAAE,CAAA;KACH;IAED,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAEM,MAAM,mBAAmB,GAAG,CAAC,EAClC,yBAAyB,EACzB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,mCAAmC,EAUpC,EAAY,EAAE;IACb,IAAI,CAAC,yBAAyB;QAAE,OAAO,EAAE,CAAA;IACzC,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;IAEpE,IAAI,OAAO,EAAE,QAAQ,EAAE;QACrB,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE;YACrE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACzD,MAAM,oBAAoB,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;oBACxE,MAAM,eAAe,GAAG,mCAAmC,CAAC,IAAI,CAC9D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,iBAAiB,CAC1D,CAAA;oBAED,IAAI,eAAe;wBAAE,OAAO,IAAI,CAAA;oBAEhC,OAAO,IAAI,GAAG,CAAC,CAAA;gBACjB,CAAC,EAAE,CAAC,CAAC,CAAA;gBACL,MAAM,IAAI,GAAG,sBAAsB,CACjC,mCAAmC,EACnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,oBAAoB,EACpB,QAAQ,CACT,CAAA;gBAED,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE,EAAE,GAAG,eAAe,IAAI,KAAK,EAAE;oBACjC,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,6BAA6B;oBACvC,KAAK,EAAE,oCAAoC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBACrF,IAAI;oBACJ,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,UAAU,EAAE,kBAAkB;4BAC9B,IAAI,EAAE;gCACJ,GAAG,EAAE,wCAAwC;gCAC7C,QAAQ,EAAE,MAAM,CAAC,EAAE;gCACnB,oBAAoB,EAAE,KAAK;6BAC5B;yBACF;wBACD;4BACE,KAAK,EAAE,MAAM;4BACb,UAAU,EAAE,gBAAgB;4BAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE;yBAC9B;qBACF;iBACF,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;KACH;SAAM;QACL,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE;YACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACzD,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAC3D,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtC,MAAM,eAAe,GAAG,mCAAmC,CAAC,IAAI,CAC9D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,iBAAiB,CAC1D,CAAA;oBAED,IAAI,eAAe;wBAAE,OAAO,IAAI,CAAA;oBAEhC,OAAO,IAAI,GAAG,CAAC,CAAA;gBACjB,CAAC,CAAC,CAAA;gBAEF,OAAO,IAAI,CAAA;YACb,CAAC,EAAE,CAAC,CAAC,CAAA;YAEL,MAAM,IAAI,GAAG,sBAAsB,CACjC,mCAAmC,EACnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,oBAAoB,EACpB,QAAQ,CACT,CAAA;YAED,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,GAAG,eAAe,IAAI,KAAK,EAAE;gBACjC,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,eACtB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAC7B,yBAAyB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnE,IAAI;gBACJ,OAAO,EAAE;oBACP,OAAO,CAAC,MAAM,IAAI,CAAC;wBACjB,CAAC,CAAC;4BACE,KAAK,EAAE,QAAQ;4BACf,UAAU,EAAE,kBAAkB;4BAC9B,IAAI,EAAE;gCACJ,GAAG,EAAE,wCAAwC;gCAC7C,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;6BACxB;yBACF;wBACH,CAAC,CAAC,SAAS;oBACb;wBACE,KAAK,EAAE,MAAM;wBACb,UAAU,EAAE,gBAAgB;wBAC5B,IAAI,EAAE;4BACJ,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;yBACxB;qBACF;iBACF,CAAC,MAAM,CAAC,OAAO,CAAa;aAC9B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;KACH;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAzHY,QAAA,mBAAmB,uBAyH/B;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,IAAc,EAAE,EAAE;IAC9E,MAAM,MAAM,GAAW;QACrB,EAAE,EAAE,aAAa,IAAI,IAAI,KAAK,EAAE;QAChC,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,+HAA+H;QACrI,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,MAAM;gBACb,UAAU,EAAE,WAAW;gBACvB,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACtB;SACF;KACF,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAhBY,QAAA,gBAAgB,oBAgB5B","sourcesContent":["import { Account } from '../../interfaces/account'\nimport { AccountOpAction, Action as ActionFromActionsQueue } from '../../interfaces/actions'\n// eslint-disable-next-line import/no-cycle\nimport { Action, Banner } from '../../interfaces/banner'\nimport { Network } from '../../interfaces/network'\nimport { ActiveRoute } from '../../interfaces/swapAndBridge'\nimport { getIsBridgeTxn, getQuoteRouteSteps } from '../swapAndBridge/swapAndBridge'\n\nconst getBridgeBannerTitle = (routeStatus: ActiveRoute['routeStatus']) => {\n switch (routeStatus) {\n case 'completed':\n return 'Bridge request completed'\n case 'in-progress':\n return 'Bridge request in progress'\n default:\n return 'Bridge request awaiting signature'\n }\n}\n\nconst getBridgeActionText = (routeStatus: ActiveRoute['routeStatus'], isBridgeTxn: boolean) => {\n if (isBridgeTxn) {\n return routeStatus === 'completed' ? 'Bridged' : 'Bridge'\n }\n\n return routeStatus === 'completed' ? 'Swapped' : 'Swap'\n}\n\nconst getBridgeBannerText = (route: ActiveRoute, isBridgeTxn: boolean, networks?: Network[]) => {\n const steps = getQuoteRouteSteps(route.route.userTxs)\n const actionText = getBridgeActionText(route.routeStatus, isBridgeTxn)\n const fromAssetSymbol = steps[0].fromAsset.symbol\n const toAssetSymbol = steps[steps.length - 1].toAsset.symbol\n\n let assetsText = `${fromAssetSymbol} to ${toAssetSymbol}`\n\n if (networks) {\n const fromAssetNetwork = networks.find((n) => Number(n.chainId) === steps[0].fromAsset.chainId)\n const toAssetNetwork = networks.find(\n (n) => Number(n.chainId) === steps[steps.length - 1].toAsset.chainId\n )\n if (fromAssetNetwork && toAssetNetwork) {\n assetsText = `${fromAssetSymbol} (on ${fromAssetNetwork.name}) to ${toAssetSymbol} (on ${toAssetNetwork.name})`\n }\n }\n\n const stepsIndexText = `(step ${\n route.routeStatus === 'completed' ? route.route.totalUserTx : route.route.currentUserTxIndex + 1\n } of ${route.route.totalUserTx})`\n\n return `${actionText} ${assetsText}${route.route.totalUserTx > 1 ? ` ${stepsIndexText}` : ''}`\n}\n\nexport const getBridgeBanners = (\n activeRoutes: ActiveRoute[],\n accountOpActions: AccountOpAction[],\n networks: Network[]\n): Banner[] => {\n const isBridgeTxn = (route: ActiveRoute) =>\n route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const isRouteTurnedIntoAccountOp = (route: ActiveRoute) => {\n return accountOpActions.some((action) => {\n return action.accountOp.calls.some(\n (call) =>\n call.fromUserRequestId === route.activeRouteId ||\n call.fromUserRequestId === `${route.activeRouteId}-revoke-approval` ||\n call.fromUserRequestId === `${route.activeRouteId}-approval`\n )\n })\n }\n\n return activeRoutes\n .filter(isBridgeTxn)\n .filter((route) => {\n if (route.routeStatus === 'failed') return false\n if (route.routeStatus !== 'ready') return true\n // If the route is ready to be signed, we should display the banner only if it's not turned into an account op\n // because when it does get turned into an account op, there will be a different banner for that\n return !isRouteTurnedIntoAccountOp(route)\n })\n .map((r) => {\n const actions: Action[] = []\n\n if (r.routeStatus === 'in-progress' || r.routeStatus === 'waiting-approval-to-resolve') {\n actions.push({\n label: 'Details',\n actionName: 'open-swap-and-bridge-tab'\n })\n }\n\n if (r.routeStatus === 'completed') {\n actions.push({\n label: 'Close',\n actionName: 'close-bridge',\n meta: { activeRouteId: r.activeRouteId }\n })\n }\n\n if (r.routeStatus === 'ready') {\n const isNextTnxForBridging = r.route.currentUserTxIndex >= 1\n\n actions.push(\n {\n label: 'Reject',\n actionName: 'reject-bridge',\n meta: { activeRouteId: r.activeRouteId }\n },\n {\n label: isNextTnxForBridging ? 'Proceed to Next Step' : 'Open',\n actionName: 'proceed-bridge',\n meta: { activeRouteId: r.activeRouteId }\n }\n )\n }\n\n return {\n id: `bridge-${r.activeRouteId}`,\n type: r.routeStatus === 'completed' ? 'success' : 'info',\n category: `bridge-${r.routeStatus}`,\n title: getBridgeBannerTitle(r.routeStatus),\n text: getBridgeBannerText(r, true, networks),\n actions\n }\n })\n}\n\nexport const getDappActionRequestsBanners = (actions: ActionFromActionsQueue[]): Banner[] => {\n const requests = actions.filter((a) => !['accountOp', 'benzin'].includes(a.type))\n if (!requests.length) return []\n\n return [\n {\n id: 'dapp-requests-banner',\n type: 'info',\n title: `You have ${requests.length} pending app request${requests.length > 1 ? 's' : ''}`,\n text: '',\n actions: [\n {\n label: 'Open',\n actionName: 'open-pending-dapp-requests'\n }\n ]\n }\n ]\n}\n\nconst getAccountOpBannerText = (\n activeSwapAndBridgeRoutesForSelectedAccount: ActiveRoute[],\n chainId: bigint,\n nonSwapAndBridgeTxns: number,\n networks: Network[]\n) => {\n const swapsAndBridges: string[] = []\n const networkSwapAndBridgeRoutes = activeSwapAndBridgeRoutesForSelectedAccount.filter((route) => {\n return BigInt(route.route.fromChainId) === chainId\n })\n\n if (networkSwapAndBridgeRoutes.length) {\n networkSwapAndBridgeRoutes.forEach((route) => {\n const isBridgeTxn = route.route.userTxs.some((t) => getIsBridgeTxn(t.userTxType))\n const desc = getBridgeBannerText(route, isBridgeTxn, networks)\n\n swapsAndBridges.push(desc)\n })\n\n return `${swapsAndBridges.join(', ')} ${\n nonSwapAndBridgeTxns\n ? `and ${nonSwapAndBridgeTxns} other transaction${nonSwapAndBridgeTxns > 1 ? 's' : ''}`\n : ''\n }`\n }\n\n return ''\n}\n\nexport const getAccountOpBanners = ({\n accountOpActionsByNetwork,\n selectedAccount,\n accounts,\n networks,\n swapAndBridgeRoutesPendingSignature\n}: {\n accountOpActionsByNetwork: {\n [key: string]: AccountOpAction[]\n }\n\n selectedAccount: string\n accounts: Account[]\n networks: Network[]\n swapAndBridgeRoutesPendingSignature: ActiveRoute[]\n}): Banner[] => {\n if (!accountOpActionsByNetwork) return []\n const txnBanners: Banner[] = []\n\n const account = accounts.find((acc) => acc.addr === selectedAccount)\n\n if (account?.creation) {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n actions.forEach((action) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = action.accountOp.calls.reduce((prev, call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n }, 0)\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n category: 'pending-to-be-signed-acc-op',\n title: `Transaction waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: action.id,\n shouldOpenNextAction: false\n }\n },\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: { actionId: action.id }\n }\n ]\n })\n })\n })\n } else {\n Object.entries(accountOpActionsByNetwork).forEach(([netId, actions]) => {\n const network = networks.filter((n) => n.id === netId)[0]\n const nonSwapAndBridgeTxns = actions.reduce((prev, action) => {\n action.accountOp.calls.forEach((call) => {\n const isSwapAndBridge = swapAndBridgeRoutesPendingSignature.some(\n (route) => route.activeRouteId === call.fromUserRequestId\n )\n\n if (isSwapAndBridge) return prev\n\n return prev + 1\n })\n\n return prev\n }, 0)\n\n const text = getAccountOpBannerText(\n swapAndBridgeRoutesPendingSignature,\n BigInt(network.chainId),\n nonSwapAndBridgeTxns,\n networks\n )\n\n txnBanners.push({\n id: `${selectedAccount}-${netId}`,\n type: 'info',\n title: `${actions.length} transaction${\n actions.length > 1 ? 's' : ''\n } waiting to be signed ${network.name ? `on ${network.name}` : ''}`,\n text,\n actions: [\n actions.length <= 1\n ? {\n label: 'Reject',\n actionName: 'reject-accountOp',\n meta: {\n err: 'User rejected the transaction request.',\n actionId: actions[0].id\n }\n }\n : undefined,\n {\n label: 'Open',\n actionName: 'open-accountOp',\n meta: {\n actionId: actions[0].id\n }\n }\n ].filter(Boolean) as Action[]\n })\n })\n }\n\n return txnBanners\n}\n\nexport const getKeySyncBanner = (addr: string, email: string, keys: string[]) => {\n const banner: Banner = {\n id: `keys-sync:${addr}:${email}`,\n accountAddr: addr,\n type: 'info',\n title: 'Sync Key Store keys',\n text: 'This account has no signing keys added therefore it is in a view-only mode. Make a request for keys sync from another device.',\n actions: [\n {\n label: 'Sync',\n actionName: 'sync-keys',\n meta: { email, keys }\n }\n ]\n }\n return banner\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.d.ts b/dist/src/libs/defiPositions/types.d.ts index e263d89f7..0fecf0a16 100644 --- a/dist/src/libs/defiPositions/types.d.ts +++ b/dist/src/libs/defiPositions/types.d.ts @@ -15,6 +15,8 @@ export interface PositionAsset { symbol: string; decimals: number; amount: bigint; + simulationAmount?: bigint; + amountPostSimulation?: bigint; priceIn: Price[]; value?: number; type: AssetType; diff --git a/dist/src/libs/defiPositions/types.d.ts.map b/dist/src/libs/defiPositions/types.d.ts.map index 67411f210..f77e3776c 100644 --- a/dist/src/libs/defiPositions/types.d.ts.map +++ b/dist/src/libs/defiPositions/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,UAAU,IAAA;IACV,MAAM,IAAA;CACP;AAED,oBAAY,kBAAkB;IAC5B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,CAAC,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,mBAAmB,EAAE,CAAA;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,EAAE,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAA;IAClC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,cAAc,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;CACF"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,UAAU,IAAA;IACV,MAAM,IAAA;CACP;AAED,oBAAY,kBAAkB;IAC5B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,CAAC,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,mBAAmB,EAAE,CAAA;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,EAAE,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAA;IAClC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,cAAc,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;CACF"} \ No newline at end of file diff --git a/dist/src/libs/defiPositions/types.js.map b/dist/src/libs/defiPositions/types.js.map index eab9ec708..9076eb6e0 100644 --- a/dist/src/libs/defiPositions/types.js.map +++ b/dist/src/libs/defiPositions/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":";;;AAGA,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,mDAAS,CAAA;IACT,qDAAU,CAAA;IACV,6CAAM,CAAA;AACR,CAAC,EAJW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAIpB;AAED,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;AACjC,CAAC,EAHW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAG7B","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { Price } from '../portfolio'\n\nexport enum AssetType {\n Liquidity,\n Collateral,\n Borrow\n}\n\nexport enum DeFiPositionsError {\n AssetPriceError = 'AssetPriceError',\n CriticalError = 'CriticalError'\n}\n\nexport type ProviderName = 'AAVE v3' | 'Uniswap V3'\n\nexport interface PositionAsset {\n address: string\n symbol: string\n decimals: number\n amount: bigint\n priceIn: Price[]\n value?: number\n type: AssetType\n additionalData?: {\n [key: string]: any\n }\n protocolAsset?: {\n address: string\n symbol: string\n decimals: number\n }\n}\n\nexport interface DeFiPositionsState {\n [accountId: string]: AccountState\n}\n\nexport interface AccountState {\n [networkId: string]: NetworkState\n}\n\nexport interface ProviderError {\n providerName: ProviderName\n error: string\n}\n\nexport interface NetworkState {\n positionsByProvider: PositionsByProvider[]\n isLoading: boolean\n updatedAt?: number\n error?: string | null\n providerErrors?: ProviderError[]\n}\n\nexport type NetworksWithPositions = {\n [networkId: NetworkId]: ProviderName[]\n}\n\nexport type NetworksWithPositionsByAccounts = {\n [accountId: string]: NetworksWithPositions\n}\n\nexport type PositionsByProvider = {\n providerName: ProviderName\n networkId: Network['id']\n type: 'lending' | 'liquidity-pool'\n positions: Position[]\n positionInUSD?: number\n}\n\nexport interface Position {\n id: string\n assets: PositionAsset[]\n additionalData: {\n [key: string]: any\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/libs/defiPositions/types.ts"],"names":[],"mappings":";;;AAGA,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,mDAAS,CAAA;IACT,qDAAU,CAAA;IACV,6CAAM,CAAA;AACR,CAAC,EAJW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAIpB;AAED,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;AACjC,CAAC,EAHW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAG7B","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { Price } from '../portfolio'\n\nexport enum AssetType {\n Liquidity,\n Collateral,\n Borrow\n}\n\nexport enum DeFiPositionsError {\n AssetPriceError = 'AssetPriceError',\n CriticalError = 'CriticalError'\n}\n\nexport type ProviderName = 'AAVE v3' | 'Uniswap V3'\n\nexport interface PositionAsset {\n address: string\n symbol: string\n decimals: number\n amount: bigint\n simulationAmount?: bigint\n amountPostSimulation?: bigint\n priceIn: Price[]\n value?: number\n type: AssetType\n additionalData?: {\n [key: string]: any\n }\n protocolAsset?: {\n address: string\n symbol: string\n decimals: number\n }\n}\n\nexport interface DeFiPositionsState {\n [accountId: string]: AccountState\n}\n\nexport interface AccountState {\n [networkId: string]: NetworkState\n}\n\nexport interface ProviderError {\n providerName: ProviderName\n error: string\n}\n\nexport interface NetworkState {\n positionsByProvider: PositionsByProvider[]\n isLoading: boolean\n updatedAt?: number\n error?: string | null\n providerErrors?: ProviderError[]\n}\n\nexport type NetworksWithPositions = {\n [networkId: NetworkId]: ProviderName[]\n}\n\nexport type NetworksWithPositionsByAccounts = {\n [accountId: string]: NetworksWithPositions\n}\n\nexport type PositionsByProvider = {\n providerName: ProviderName\n networkId: Network['id']\n type: 'lending' | 'liquidity-pool'\n positions: Position[]\n positionInUSD?: number\n}\n\nexport interface Position {\n id: string\n assets: PositionAsset[]\n additionalData: {\n [key: string]: any\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/deployless/deployless.js b/dist/src/libs/deployless/deployless.js index 928c0fed2..24b2881ac 100644 --- a/dist/src/libs/deployless/deployless.js +++ b/dist/src/libs/deployless/deployless.js @@ -145,7 +145,7 @@ class Deployless { callPromise, new Promise((_resolve, reject) => { // Custom providers may take longer to respond, so we set a longer timeout for them. - setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000); + setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 15000 : 20000); }) ]); const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout)); diff --git a/dist/src/libs/deployless/deployless.js.map b/dist/src/libs/deployless/deployless.js.map index 5aa32bbfc..c39c76108 100644 --- a/dist/src/libs/deployless/deployless.js.map +++ b/dist/src/libs/deployless/deployless.js.map @@ -1 +1 @@ -{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport { AbiCoder, concat, getBytes, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport DeploylessCompiled from '../../../contracts/compiled/Deployless.json'\n\n// this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call\n// compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17\nconst deploylessProxyBin = DeploylessCompiled.bin\n// This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself\n// see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e\nconst codeOfContractCode =\n '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'\nconst codeOfContractAbi = ['function codeOf(bytes deployCode) external view']\n\n// The custom error that both these contracts will raise in case the deploy process of the contract goes wrong\n// error DeployFailed();\nconst deployErrorSig = '0xb4f54111'\n// Signature of Error(string)\nconst errorSig = '0x08c379a0'\n// LBRouter__InvalidTokenPath\nconst invalidPath = '0x4feac00c'\n// Signature of Panic(uint256)\nconst panicSig = '0x4e487b71'\n// uniswap swap expired\nconst expiredSwap = '0x5bf6f916'\n// uniswap signature expired\nconst expiredSig = '0xcd21db4f'\n\n// any made up addr would work\nconst arbitraryAddr = '0x0000000000000000000000000000000000696969'\nconst abiCoder = new AbiCoder()\n\nexport enum DeploylessMode {\n Detect,\n ProxyContract,\n StateOverride\n}\nexport type CallOptions = {\n mode: DeploylessMode\n // Note: some RPCs don't seem to like numbers, we can use hex strings for them\n blockTag: string | number\n from?: string\n to?: string\n gasPrice?: string\n gasLimit?: string\n stateToOverride: object | null\n}\nconst defaultOptions: CallOptions = {\n mode: DeploylessMode.Detect,\n blockTag: 'latest',\n from: undefined,\n to: arbitraryAddr,\n stateToOverride: null\n}\n\nexport class Deployless {\n private iface: Interface\n\n // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs\n private contractBytecode: string\n\n private provider: JsonRpcProvider | Provider\n\n private isProviderInvictus: boolean = false\n\n // We need to detect whether the provider supports state override\n private detectionPromise?: Promise\n\n private stateOverrideSupported?: boolean\n\n // the code of the contract after it's actually deployed (or in our case, simulate-deployed)\n // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df\n private contractRuntimeCode?: string\n\n public get isLimitedAt24kbData() {\n return !this.stateOverrideSupported\n }\n\n constructor(\n provider: JsonRpcProvider | Provider,\n abi: any[],\n code: string,\n codeAtRuntime?: string\n ) {\n assert.ok(code.startsWith('0x'), 'contract code must start with 0x')\n assert.ok(\n !abi.includes((x: any) => x.type === 'constructor'),\n 'contract cannot have a constructor, as it is not supported in state override mode'\n )\n this.contractBytecode = code\n this.provider = provider\n // eslint-disable-next-line no-underscore-dangle\n this.isProviderInvictus = (provider as any)._getConnection().url.includes('invictus')\n this.iface = new Interface(abi)\n if (codeAtRuntime !== undefined) {\n assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x')\n this.stateOverrideSupported = true\n this.contractRuntimeCode = codeAtRuntime\n }\n }\n\n // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using\n private async detectStateOverride(): Promise {\n const isJsonRpcProvider =\n this.provider &&\n typeof (this.provider as JsonRpcProvider).send === 'function' &&\n // eslint-disable-next-line no-underscore-dangle\n typeof (this.provider as JsonRpcProvider)._send === 'function'\n\n if (!isJsonRpcProvider) {\n throw new Error(\n 'state override mode (or auto-detect) not available unless you use JsonRpcProvider'\n )\n }\n const codeOfIface = new Interface(codeOfContractAbi)\n const code = await mapError(\n (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: arbitraryAddr,\n data: codeOfIface.encodeFunctionData('codeOf', [this.contractBytecode])\n },\n 'latest',\n { [arbitraryAddr]: { code: codeOfContractCode } }\n ])\n )\n // any response bigger than 0x is sufficient to know that state override worked\n // the response would be just \"0x\" if state override doesn't work\n this.stateOverrideSupported = code.startsWith('0x') && code.length > 2\n this.contractRuntimeCode = mapResponse(code)\n }\n\n async call(methodName: string, args: any[], opts: Partial = {}): Promise {\n opts = { ...defaultOptions, ...opts }\n const forceProxy = opts.mode === DeploylessMode.ProxyContract\n\n // First, start by detecting which modes are available, unless we're forcing the proxy mode\n // if we use state override, we do need detection to run still so it can populate contractRuntimeCode\n if (\n this.stateOverrideSupported &&\n !this.detectionPromise &&\n !forceProxy &&\n this.contractRuntimeCode === undefined\n ) {\n this.detectionPromise = this.detectStateOverride()\n }\n await this.detectionPromise\n\n if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) {\n throw new Error('state override passed but not requested')\n }\n if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) {\n throw new Error(`${methodName}: state override requested but not supported`)\n }\n\n const callData = this.iface.encodeFunctionData(methodName, args)\n const toAddr = opts.to ?? arbitraryAddr\n const callPromise =\n !!this.stateOverrideSupported && !forceProxy\n ? (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: toAddr,\n data: callData,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gas: opts?.gasLimit\n },\n opts.blockTag,\n {\n [toAddr]: { code: this.contractRuntimeCode },\n ...(opts.stateToOverride || {})\n }\n ])\n : this.provider.call({\n blockTag: opts.blockTag,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gasLimit: opts?.gasLimit,\n data: checkDataSize(\n concat([\n deploylessProxyBin,\n abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData])\n ])\n )\n })\n\n // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise.\n // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve\n // or the timeout promise will reject after 10 seconds, whichever occurs first.\n const callPromisedWithResolveTimeout = Promise.race([\n callPromise,\n new Promise((_resolve, reject) => {\n // Custom providers may take longer to respond, so we set a longer timeout for them.\n setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 5000 : 15000)\n })\n ])\n\n const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout))\n return this.iface.decodeFunctionResult(methodName, returnDataRaw)\n }\n}\n\nexport function fromDescriptor(\n provider: JsonRpcProvider | Provider,\n desc: { abi: any; bin: string; binRuntime: string },\n supportStateOverride: boolean\n): Deployless {\n return new Deployless(\n provider,\n desc.abi,\n desc.bin,\n supportStateOverride ? desc.binRuntime : undefined\n )\n}\n\nasync function mapError(callPromise: Promise): Promise {\n try {\n return await callPromise\n } catch (e: any) {\n // ethers v5 provider: e.error.data is usually our eth_call output in case of execution reverted\n if (e.error && e.error.data) return e.error.data\n // ethers v5 provider: unwrap the wrapping that ethers adds to this type of error in case of provider.call\n if (e.code === 'CALL_EXCEPTION' && e.error) throw e.error\n // ethers v6 provider: wrapping the error in case of execution reverted\n if (e.code === 'CALL_EXCEPTION' && e.data) return e.data\n throw e\n }\n}\n\nfunction mapResponse(data: string): string {\n if (data === deployErrorSig) throw new Error('contract deploy failed')\n const err = parseErr(data)\n if (err) throw err\n return data\n}\n\nexport function parseErr(data: string): string | null {\n const dataNoPrefix = data.slice(10)\n if (data.startsWith(panicSig)) {\n // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require\n const num = parseInt(`0x${dataNoPrefix}`)\n if (num === 0x00) return 'generic compiler error'\n if (num === 0x01) return 'solidity assert error'\n if (num === 0x11) return 'arithmetic error'\n if (num === 0x12) return 'division by zero'\n return `panic error: 0x${num.toString(16)}`\n }\n if (data.startsWith(errorSig)) {\n try {\n return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]\n } catch (e: any) {\n if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix\n return e\n }\n }\n if (data.startsWith(invalidPath)) {\n return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'\n }\n // uniswap expired error\n if (data === expiredSwap) {\n return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'\n }\n // uniswap signature expired error\n if (data.startsWith(expiredSig)) {\n return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'\n }\n return null\n}\n\nfunction checkDataSize(data: string): string {\n if (getBytes(data).length >= 24576)\n throw new Error(\n 'Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'\n )\n return data\n}\n"]} \ No newline at end of file +{"version":3,"file":"deployless.js","sourceRoot":"","sources":["../../../../src/libs/deployless/deployless.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport { AbiCoder, concat, getBytes, Interface, JsonRpcProvider, Provider } from 'ethers'\n\nimport DeploylessCompiled from '../../../contracts/compiled/Deployless.json'\n\n// this is a magic contract that is constructed like `constructor(bytes memory contractBytecode, bytes memory data)` and returns the result from the call\n// compiled from relayer:a7ea373559d8c419577ac05527bd37fbee8856ae/src/velcro-v3/contracts/Deployless.sol with solc 0.8.17\nconst deploylessProxyBin = DeploylessCompiled.bin\n// This is another magic contract that can return the contract code at an address; this is not the deploy bytecode but rather the contract code itself\n// see https://gist.github.com/Ivshti/fbcc37c0a8b88d6e51bb30db57f3d50e\nconst codeOfContractCode =\n '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631e05758f14610030575b600080fd5b61004a60048036038101906100459190610248565b61004c565b005b60008151602083016000f0905060008173ffffffffffffffffffffffffffffffffffffffff163b036100aa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c90506000815190508060208301f35b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101558261010c565b810181811067ffffffffffffffff821117156101745761017361011d565b5b80604052505050565b60006101876100ee565b9050610193828261014c565b919050565b600067ffffffffffffffff8211156101b3576101b261011d565b5b6101bc8261010c565b9050602081019050919050565b82818337600083830152505050565b60006101eb6101e684610198565b61017d565b90508281526020810184848401111561020757610206610107565b5b6102128482856101c9565b509392505050565b600082601f83011261022f5761022e610102565b5b813561023f8482602086016101d8565b91505092915050565b60006020828403121561025e5761025d6100f8565b5b600082013567ffffffffffffffff81111561027c5761027b6100fd565b5b6102888482850161021a565b9150509291505056fea2646970667358221220de4923c71abcedf68454c251a9becff7e8a4f8db4adee6fdb16d583f509c63bb64736f6c63430008120033'\nconst codeOfContractAbi = ['function codeOf(bytes deployCode) external view']\n\n// The custom error that both these contracts will raise in case the deploy process of the contract goes wrong\n// error DeployFailed();\nconst deployErrorSig = '0xb4f54111'\n// Signature of Error(string)\nconst errorSig = '0x08c379a0'\n// LBRouter__InvalidTokenPath\nconst invalidPath = '0x4feac00c'\n// Signature of Panic(uint256)\nconst panicSig = '0x4e487b71'\n// uniswap swap expired\nconst expiredSwap = '0x5bf6f916'\n// uniswap signature expired\nconst expiredSig = '0xcd21db4f'\n\n// any made up addr would work\nconst arbitraryAddr = '0x0000000000000000000000000000000000696969'\nconst abiCoder = new AbiCoder()\n\nexport enum DeploylessMode {\n Detect,\n ProxyContract,\n StateOverride\n}\nexport type CallOptions = {\n mode: DeploylessMode\n // Note: some RPCs don't seem to like numbers, we can use hex strings for them\n blockTag: string | number\n from?: string\n to?: string\n gasPrice?: string\n gasLimit?: string\n stateToOverride: object | null\n}\nconst defaultOptions: CallOptions = {\n mode: DeploylessMode.Detect,\n blockTag: 'latest',\n from: undefined,\n to: arbitraryAddr,\n stateToOverride: null\n}\n\nexport class Deployless {\n private iface: Interface\n\n // the contract deploy (constructor) code: this is the code that tjhe solidity compiler outputs\n private contractBytecode: string\n\n private provider: JsonRpcProvider | Provider\n\n private isProviderInvictus: boolean = false\n\n // We need to detect whether the provider supports state override\n private detectionPromise?: Promise\n\n private stateOverrideSupported?: boolean\n\n // the code of the contract after it's actually deployed (or in our case, simulate-deployed)\n // see this: https://medium.com/coinmonks/the-difference-between-bytecode-and-deployed-bytecode-64594db723df\n private contractRuntimeCode?: string\n\n public get isLimitedAt24kbData() {\n return !this.stateOverrideSupported\n }\n\n constructor(\n provider: JsonRpcProvider | Provider,\n abi: any[],\n code: string,\n codeAtRuntime?: string\n ) {\n assert.ok(code.startsWith('0x'), 'contract code must start with 0x')\n assert.ok(\n !abi.includes((x: any) => x.type === 'constructor'),\n 'contract cannot have a constructor, as it is not supported in state override mode'\n )\n this.contractBytecode = code\n this.provider = provider\n // eslint-disable-next-line no-underscore-dangle\n this.isProviderInvictus = (provider as any)._getConnection().url.includes('invictus')\n this.iface = new Interface(abi)\n if (codeAtRuntime !== undefined) {\n assert.ok(codeAtRuntime.startsWith('0x'), 'contract code (runtime) must start with 0x')\n this.stateOverrideSupported = true\n this.contractRuntimeCode = codeAtRuntime\n }\n }\n\n // this will detect whether the provider supports state override and also retrieve the actual code of the contract we are using\n private async detectStateOverride(): Promise {\n const isJsonRpcProvider =\n this.provider &&\n typeof (this.provider as JsonRpcProvider).send === 'function' &&\n // eslint-disable-next-line no-underscore-dangle\n typeof (this.provider as JsonRpcProvider)._send === 'function'\n\n if (!isJsonRpcProvider) {\n throw new Error(\n 'state override mode (or auto-detect) not available unless you use JsonRpcProvider'\n )\n }\n const codeOfIface = new Interface(codeOfContractAbi)\n const code = await mapError(\n (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: arbitraryAddr,\n data: codeOfIface.encodeFunctionData('codeOf', [this.contractBytecode])\n },\n 'latest',\n { [arbitraryAddr]: { code: codeOfContractCode } }\n ])\n )\n // any response bigger than 0x is sufficient to know that state override worked\n // the response would be just \"0x\" if state override doesn't work\n this.stateOverrideSupported = code.startsWith('0x') && code.length > 2\n this.contractRuntimeCode = mapResponse(code)\n }\n\n async call(methodName: string, args: any[], opts: Partial = {}): Promise {\n opts = { ...defaultOptions, ...opts }\n const forceProxy = opts.mode === DeploylessMode.ProxyContract\n\n // First, start by detecting which modes are available, unless we're forcing the proxy mode\n // if we use state override, we do need detection to run still so it can populate contractRuntimeCode\n if (\n this.stateOverrideSupported &&\n !this.detectionPromise &&\n !forceProxy &&\n this.contractRuntimeCode === undefined\n ) {\n this.detectionPromise = this.detectStateOverride()\n }\n await this.detectionPromise\n\n if (opts.stateToOverride !== null && opts.mode !== DeploylessMode.StateOverride) {\n throw new Error('state override passed but not requested')\n }\n if (opts.mode === DeploylessMode.StateOverride && !this.stateOverrideSupported) {\n throw new Error(`${methodName}: state override requested but not supported`)\n }\n\n const callData = this.iface.encodeFunctionData(methodName, args)\n const toAddr = opts.to ?? arbitraryAddr\n const callPromise =\n !!this.stateOverrideSupported && !forceProxy\n ? (this.provider as JsonRpcProvider).send('eth_call', [\n {\n to: toAddr,\n data: callData,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gas: opts?.gasLimit\n },\n opts.blockTag,\n {\n [toAddr]: { code: this.contractRuntimeCode },\n ...(opts.stateToOverride || {})\n }\n ])\n : this.provider.call({\n blockTag: opts.blockTag,\n from: opts.from,\n gasPrice: opts?.gasPrice,\n gasLimit: opts?.gasLimit,\n data: checkDataSize(\n concat([\n deploylessProxyBin,\n abiCoder.encode(['bytes', 'bytes'], [this.contractBytecode, callData])\n ])\n )\n })\n\n // The ethers' providers retry failed calls every 1 second, making numerous attempts before finally resolving the promise.\n // To prevent prolonged retries, we use Promise.race to set a 10-second timeout. This way, the callPromise will either resolve\n // or the timeout promise will reject after 10 seconds, whichever occurs first.\n const callPromisedWithResolveTimeout = Promise.race([\n callPromise,\n new Promise((_resolve, reject) => {\n // Custom providers may take longer to respond, so we set a longer timeout for them.\n setTimeout(() => reject(new Error('rpc-timeout')), this.isProviderInvictus ? 15000 : 20000)\n })\n ])\n\n const returnDataRaw = mapResponse(await mapError(callPromisedWithResolveTimeout))\n return this.iface.decodeFunctionResult(methodName, returnDataRaw)\n }\n}\n\nexport function fromDescriptor(\n provider: JsonRpcProvider | Provider,\n desc: { abi: any; bin: string; binRuntime: string },\n supportStateOverride: boolean\n): Deployless {\n return new Deployless(\n provider,\n desc.abi,\n desc.bin,\n supportStateOverride ? desc.binRuntime : undefined\n )\n}\n\nasync function mapError(callPromise: Promise): Promise {\n try {\n return await callPromise\n } catch (e: any) {\n // ethers v5 provider: e.error.data is usually our eth_call output in case of execution reverted\n if (e.error && e.error.data) return e.error.data\n // ethers v5 provider: unwrap the wrapping that ethers adds to this type of error in case of provider.call\n if (e.code === 'CALL_EXCEPTION' && e.error) throw e.error\n // ethers v6 provider: wrapping the error in case of execution reverted\n if (e.code === 'CALL_EXCEPTION' && e.data) return e.data\n throw e\n }\n}\n\nfunction mapResponse(data: string): string {\n if (data === deployErrorSig) throw new Error('contract deploy failed')\n const err = parseErr(data)\n if (err) throw err\n return data\n}\n\nexport function parseErr(data: string): string | null {\n const dataNoPrefix = data.slice(10)\n if (data.startsWith(panicSig)) {\n // https://docs.soliditylang.org/en/v0.8.11/control-structures.html#panic-via-assert-and-error-via-require\n const num = parseInt(`0x${dataNoPrefix}`)\n if (num === 0x00) return 'generic compiler error'\n if (num === 0x01) return 'solidity assert error'\n if (num === 0x11) return 'arithmetic error'\n if (num === 0x12) return 'division by zero'\n return `panic error: 0x${num.toString(16)}`\n }\n if (data.startsWith(errorSig)) {\n try {\n return abiCoder.decode(['string'], `0x${dataNoPrefix}`)[0]\n } catch (e: any) {\n if (e.code === 'BUFFER_OVERRUN' || e.code === 'NUMERIC_FAULT') return dataNoPrefix\n return e\n }\n }\n if (data.startsWith(invalidPath)) {\n return 'Transaction cannot be sent due to invalid swap path provided by the app that initiated the request. Please return to the app interface and try again.'\n }\n // uniswap expired error\n if (data === expiredSwap) {\n return 'Transaction cannot be sent because the swap has expired. Please return to the app interface and try again.'\n }\n // uniswap signature expired error\n if (data.startsWith(expiredSig)) {\n return 'Transaction cannot be sent because the signature involved in this swap has expired. Please return to the app interface and try again.'\n }\n return null\n}\n\nfunction checkDataSize(data: string): string {\n if (getBytes(data).length >= 24576)\n throw new Error(\n 'Transaction cannot be sent because the 24kb call data size limit has been reached. Please use StateOverride mode instead.'\n )\n return data\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/errorHumanizer/helpers.js b/dist/src/libs/errorHumanizer/helpers.js index 6f14ba0d3..974a28d1c 100644 --- a/dist/src/libs/errorHumanizer/helpers.js +++ b/dist/src/libs/errorHumanizer/helpers.js @@ -20,7 +20,9 @@ function getGenericMessageFromType(errorType, reason, messagePrefix, lastResortM case types_1.ErrorType.UnknownError: return `${messagePrefix} of an unknown error.${messageSuffix}`; case types_1.ErrorType.InnerCallFailureError: - return (reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`); + return reasonString + ? `${messagePrefix} it will revert onchain.${messageSuffixNoSupport}` + : `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`; // I don't think we should say anything else for this case case types_1.ErrorType.UserRejectionError: return 'Transaction rejected.'; diff --git a/dist/src/libs/errorHumanizer/helpers.js.map b/dist/src/libs/errorHumanizer/helpers.js.map index f0aaae337..de1d15992 100644 --- a/dist/src/libs/errorHumanizer/helpers.js.map +++ b/dist/src/libs/errorHumanizer/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":";;;AAAA,qDAAsE;AACtE,iDAA+D;AAG/D,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAA8B,EAC9B,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,YAAY,GAAG,IAAA,sCAA4B,EAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,sBAAsB,GAAG,GAAG,YAAY,IAAI,CAAA;IAClD,MAAM,aAAa,GAAG,GAAG,sBAAsB,4DAA4D,CAAA;IAC3G,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnD,QAAQ,SAAS,EAAE;QACjB,KAAK,iBAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,iBAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,aAAa,iCAAiC,MAAM,UAAU,aAAa,EAAE,CAAA;QACzF,KAAK,iBAAS,CAAC,cAAc;YAC3B,OAAO,GAAG,aAAa,yBAAyB,aAAa,EAAE,CAAA;QACjE,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,iBAAiB,sBAAsB,EAAE,CAAA;QAClE,KAAK,iBAAS,CAAC,SAAS,CAAC;QACzB,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE,KAAK,iBAAS,CAAC,qBAAqB;YAClC,OAAO,CACL,MAAM,IAAI,GAAG,aAAa,+CAA+C,aAAa,EAAE,CACzF,CAAA;QACH,0DAA0D;QAC1D,KAAK,iBAAS,CAAC,kBAAkB;YAC/B,OAAO,uBAAuB,CAAA;QAChC,mEAAmE;QACnE,KAAK,iBAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,iBAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,iBAAS,CAAC,WAAW;YACxB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE;YACE,OAAO,iBAAiB,CAAA;KAC3B;AACH,CAAC;AA4BQ,8DAAyB;AA1BlC,MAAM,4BAA4B,GAAG,CACnC,WAA0B,EAC1B,MAA6B,EAC7B,aAAqB,EACrB,MAA8B,EAC9B,CAAM,EACN,EAAE;IACF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAA;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;YACD,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;KACH;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAEmC,oEAA4B","sourcesContent":["import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { ErrorHumanizerError } from './types'\n\nfunction getGenericMessageFromType(\n errorType: ErrorType,\n reason: DecodedError['reason'],\n messagePrefix: string,\n lastResortMessage: string\n): string {\n const reasonString = getErrorCodeStringFromReason(reason ?? '')\n const messageSuffixNoSupport = `${reasonString}\\n`\n const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`\n const origin = errorType?.split('Error')?.[0] || ''\n\n switch (errorType) {\n case ErrorType.RelayerError:\n case ErrorType.RpcError:\n return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`\n case ErrorType.PaymasterError:\n return `${messagePrefix} of a Paymaster Error.${messageSuffix}`\n case ErrorType.BundlerError:\n return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`\n case ErrorType.CodeError:\n case ErrorType.UnknownError:\n return `${messagePrefix} of an unknown error.${messageSuffix}`\n case ErrorType.InnerCallFailureError:\n return (\n reason ?? `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`\n )\n // I don't think we should say anything else for this case\n case ErrorType.UserRejectionError:\n return 'Transaction rejected.'\n // Panic error may scare the user so let's call it a contract error\n case ErrorType.CustomError:\n case ErrorType.PanicError:\n case ErrorType.RevertError:\n return `${messagePrefix} of a contract error.${messageSuffix}`\n default:\n return lastResortMessage\n }\n}\n\nconst getHumanReadableErrorMessage = (\n commonError: string | null,\n errors: ErrorHumanizerError[],\n messagePrefix: string,\n reason: DecodedError['reason'],\n e: any\n) => {\n if (commonError) return commonError\n\n const checkAgainst = reason || e?.error?.message || e?.message\n let message = null\n\n if (checkAgainst) {\n errors.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n checkAgainst.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${messagePrefix} ${error.message}`\n })\n }\n\n return message\n}\n\nexport { getGenericMessageFromType, getHumanReadableErrorMessage }\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/errorHumanizer/helpers.ts"],"names":[],"mappings":";;;AAAA,qDAAsE;AACtE,iDAA+D;AAG/D,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAA8B,EAC9B,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,YAAY,GAAG,IAAA,sCAA4B,EAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,sBAAsB,GAAG,GAAG,YAAY,IAAI,CAAA;IAClD,MAAM,aAAa,GAAG,GAAG,sBAAsB,4DAA4D,CAAA;IAC3G,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnD,QAAQ,SAAS,EAAE;QACjB,KAAK,iBAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,iBAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,aAAa,iCAAiC,MAAM,UAAU,aAAa,EAAE,CAAA;QACzF,KAAK,iBAAS,CAAC,cAAc;YAC3B,OAAO,GAAG,aAAa,yBAAyB,aAAa,EAAE,CAAA;QACjE,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,iBAAiB,sBAAsB,EAAE,CAAA;QAClE,KAAK,iBAAS,CAAC,SAAS,CAAC;QACzB,KAAK,iBAAS,CAAC,YAAY;YACzB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE,KAAK,iBAAS,CAAC,qBAAqB;YAClC,OAAO,YAAY;gBACjB,CAAC,CAAC,GAAG,aAAa,2BAA2B,sBAAsB,EAAE;gBACrE,CAAC,CAAC,GAAG,aAAa,+CAA+C,aAAa,EAAE,CAAA;QACpF,0DAA0D;QAC1D,KAAK,iBAAS,CAAC,kBAAkB;YAC/B,OAAO,uBAAuB,CAAA;QAChC,mEAAmE;QACnE,KAAK,iBAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,iBAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,iBAAS,CAAC,WAAW;YACxB,OAAO,GAAG,aAAa,wBAAwB,aAAa,EAAE,CAAA;QAChE;YACE,OAAO,iBAAiB,CAAA;KAC3B;AACH,CAAC;AA4BQ,8DAAyB;AA1BlC,MAAM,4BAA4B,GAAG,CACnC,WAA0B,EAC1B,MAA6B,EAC7B,aAAqB,EACrB,MAA8B,EAC9B,CAAM,EACN,EAAE;IACF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAA;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAA;IAElB,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;YACD,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;KACH;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAEmC,oEAA4B","sourcesContent":["import { getErrorCodeStringFromReason } from '../errorDecoder/helpers'\nimport { DecodedError, ErrorType } from '../errorDecoder/types'\nimport { ErrorHumanizerError } from './types'\n\nfunction getGenericMessageFromType(\n errorType: ErrorType,\n reason: DecodedError['reason'],\n messagePrefix: string,\n lastResortMessage: string\n): string {\n const reasonString = getErrorCodeStringFromReason(reason ?? '')\n const messageSuffixNoSupport = `${reasonString}\\n`\n const messageSuffix = `${messageSuffixNoSupport}Please try again or contact Ambire support for assistance.`\n const origin = errorType?.split('Error')?.[0] || ''\n\n switch (errorType) {\n case ErrorType.RelayerError:\n case ErrorType.RpcError:\n return `${messagePrefix} of an unknown error (Origin: ${origin} call).${messageSuffix}`\n case ErrorType.PaymasterError:\n return `${messagePrefix} of a Paymaster Error.${messageSuffix}`\n case ErrorType.BundlerError:\n return `${messagePrefix} it's invalid.${messageSuffixNoSupport}`\n case ErrorType.CodeError:\n case ErrorType.UnknownError:\n return `${messagePrefix} of an unknown error.${messageSuffix}`\n case ErrorType.InnerCallFailureError:\n return reasonString\n ? `${messagePrefix} it will revert onchain.${messageSuffixNoSupport}`\n : `${messagePrefix} it will revert onchain with reason unknown.${messageSuffix}`\n // I don't think we should say anything else for this case\n case ErrorType.UserRejectionError:\n return 'Transaction rejected.'\n // Panic error may scare the user so let's call it a contract error\n case ErrorType.CustomError:\n case ErrorType.PanicError:\n case ErrorType.RevertError:\n return `${messagePrefix} of a contract error.${messageSuffix}`\n default:\n return lastResortMessage\n }\n}\n\nconst getHumanReadableErrorMessage = (\n commonError: string | null,\n errors: ErrorHumanizerError[],\n messagePrefix: string,\n reason: DecodedError['reason'],\n e: any\n) => {\n if (commonError) return commonError\n\n const checkAgainst = reason || e?.error?.message || e?.message\n let message = null\n\n if (checkAgainst) {\n errors.forEach((error) => {\n const isMatching = error.reasons.some((errorReason) =>\n checkAgainst.toLowerCase().includes(errorReason.toLowerCase())\n )\n if (!isMatching) return\n\n message = `${messagePrefix} ${error.message}`\n })\n }\n\n return message\n}\n\nexport { getGenericMessageFromType, getHumanReadableErrorMessage }\n"]} \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.d.ts b/dist/src/libs/keyIterator/keyIterator.d.ts index 0de90405d..086351b49 100644 --- a/dist/src/libs/keyIterator/keyIterator.d.ts +++ b/dist/src/libs/keyIterator/keyIterator.d.ts @@ -3,7 +3,7 @@ import { SelectedAccountForImport } from '../../interfaces/account'; import { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'; import { Key } from '../../interfaces/keystore'; export declare function isValidPrivateKey(value: string): boolean; -export declare const getPrivateKeyFromSeed: (seed: string, keyIndex: number, hdPathTemplate: HD_PATH_TEMPLATE_TYPE) => string; +export declare const getPrivateKeyFromSeed: (seed: string, seedPassphrase: string | null | undefined, keyIndex: number, hdPathTemplate: HD_PATH_TEMPLATE_TYPE) => string; /** * Serves for retrieving a range of addresses/keys from a given private key or seed phrase */ @@ -11,7 +11,7 @@ export declare class KeyIterator implements KeyIteratorInterface { #private; type: string; subType: 'seed' | 'private-key'; - constructor(_privKeyOrSeed: string); + constructor(_privKeyOrSeed: string, _seedPassphrase?: string | null); retrieve(fromToArr: { from: number; to: number; diff --git a/dist/src/libs/keyIterator/keyIterator.d.ts.map b/dist/src/libs/keyIterator/keyIterator.d.ts.map index d5cbf86b8..aa4d6f622 100644 --- a/dist/src/libs/keyIterator/keyIterator.d.ts.map +++ b/dist/src/libs/keyIterator/keyIterator.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"keyIterator.d.ts","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EAEtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAK/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,eAAO,MAAM,qBAAqB,SAC1B,MAAM,YACF,MAAM,kBACA,qBAAqB,WAYtC,CAAA;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,oBAAoB;;IACtD,IAAI,SAAa;IAEjB,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;gBAMnB,cAAc,EAAE,MAAM;IAkB5B,QAAQ,CACZ,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,EACzC,cAAc,CAAC,EAAE,qBAAqB;IAgCxC,oBAAoB,CAClB,yBAAyB,EAAE,wBAAwB,EAAE,EACrD,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,GAAG,EAAE;;;;;;;;;;IA+ErB,cAAc,CAAC,uBAAuB,EAAE,MAAM;CAQ/C"} \ No newline at end of file +{"version":3,"file":"keyIterator.d.ts","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EAEtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAK/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,eAAO,MAAM,qBAAqB,SAC1B,MAAM,kBACI,MAAM,GAAG,IAAI,GAAG,SAAS,YAC/B,MAAM,kBACA,qBAAqB,WAYtC,CAAA;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,oBAAoB;;IACtD,IAAI,SAAa;IAEjB,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;gBAQnB,cAAc,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAsB7D,QAAQ,CACZ,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,EACzC,cAAc,CAAC,EAAE,qBAAqB;IAgCxC,oBAAoB,CAClB,yBAAyB,EAAE,wBAAwB,EAAE,EACrD,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,GAAG,EAAE;;;;;;;;;;IAoFrB,cAAc,CAAC,uBAAuB,EAAE,MAAM;CAQ/C"} \ No newline at end of file diff --git a/dist/src/libs/keyIterator/keyIterator.js b/dist/src/libs/keyIterator/keyIterator.js index f13c8dde6..f646e572d 100644 --- a/dist/src/libs/keyIterator/keyIterator.js +++ b/dist/src/libs/keyIterator/keyIterator.js @@ -16,8 +16,8 @@ function isValidPrivateKey(value) { } } exports.isValidPrivateKey = isValidPrivateKey; -const getPrivateKeyFromSeed = (seed, keyIndex, hdPathTemplate) => { - const mnemonic = ethers_1.Mnemonic.fromPhrase(seed); +const getPrivateKeyFromSeed = (seed, seedPassphrase, keyIndex, hdPathTemplate) => { + const mnemonic = ethers_1.Mnemonic.fromPhrase(seed, seedPassphrase); const wallet = ethers_1.HDNodeWallet.fromMnemonic(mnemonic, (0, hdPath_1.getHdPathFromTemplate)(hdPathTemplate, keyIndex)); if (wallet) { return wallet.privateKey; @@ -33,7 +33,8 @@ class KeyIterator { subType; #privateKey = null; #seedPhrase = null; - constructor(_privKeyOrSeed) { + #seedPassphrase = null; + constructor(_privKeyOrSeed, _seedPassphrase) { if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided'); if (isValidPrivateKey(_privKeyOrSeed)) { @@ -44,6 +45,9 @@ class KeyIterator { if (ethers_1.Mnemonic.isValidMnemonic(_privKeyOrSeed)) { this.#seedPhrase = _privKeyOrSeed; this.subType = 'seed'; + if (_seedPassphrase) { + this.#seedPassphrase = _seedPassphrase; + } return; } throw new Error('keyIterator: invalid argument provided to constructor'); @@ -62,7 +66,7 @@ class KeyIterator { keys.push(new ethers_1.Wallet(this.#privateKey).address); } if (this.#seedPhrase) { - const mnemonic = ethers_1.Mnemonic.fromPhrase(this.#seedPhrase); + const mnemonic = ethers_1.Mnemonic.fromPhrase(this.#seedPhrase, this.#seedPassphrase); for (let i = from; i <= to; i++) { const wallet = ethers_1.HDNodeWallet.fromMnemonic(mnemonic, (0, hdPath_1.getHdPathFromTemplate)(hdPathTemplate, i)); keys.push(wallet.address); @@ -86,7 +90,7 @@ class KeyIterator { console.error('keyIterator: no seed phrase provided'); return []; } - const privateKey = (0, exports.getPrivateKeyFromSeed)(this.#seedPhrase, index, hdPathTemplate); + const privateKey = (0, exports.getPrivateKeyFromSeed)(this.#seedPhrase, this.#seedPassphrase, index, hdPathTemplate); return [ { addr: new ethers_1.Wallet(privateKey).address, diff --git a/dist/src/libs/keyIterator/keyIterator.js.map b/dist/src/libs/keyIterator/keyIterator.js.map index 77032ae8f..74f2f05c1 100644 --- a/dist/src/libs/keyIterator/keyIterator.js.map +++ b/dist/src/libs/keyIterator/keyIterator.js.map @@ -1 +1 @@ -{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable new-cap */\nimport { HDNodeWallet, Mnemonic, Wallet } from 'ethers'\n\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport { SelectedAccountForImport } from '../../interfaces/account'\nimport { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { getHdPathFromTemplate } from '../../utils/hdPath'\nimport { isDerivedForSmartAccountKeyOnly } from '../account/account'\nimport { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'\n\nexport function isValidPrivateKey(value: string): boolean {\n try {\n return !!new Wallet(value)\n } catch {\n return false\n }\n}\n\nexport const getPrivateKeyFromSeed = (\n seed: string,\n keyIndex: number,\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n) => {\n const mnemonic = Mnemonic.fromPhrase(seed)\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, keyIndex)\n )\n if (wallet) {\n return wallet.privateKey\n }\n\n throw new Error('Getting the private key from the seed phrase failed.')\n}\n\n/**\n * Serves for retrieving a range of addresses/keys from a given private key or seed phrase\n */\nexport class KeyIterator implements KeyIteratorInterface {\n type = 'internal'\n\n subType: 'seed' | 'private-key'\n\n #privateKey: string | null = null\n\n #seedPhrase: string | null = null\n\n constructor(_privKeyOrSeed: string) {\n if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided')\n\n if (isValidPrivateKey(_privKeyOrSeed)) {\n this.#privateKey = _privKeyOrSeed\n this.subType = 'private-key'\n return\n }\n\n if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) {\n this.#seedPhrase = _privKeyOrSeed\n this.subType = 'seed'\n return\n }\n\n throw new Error('keyIterator: invalid argument provided to constructor')\n }\n\n async retrieve(\n fromToArr: { from: number; to: number }[],\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n ) {\n const keys: string[] = []\n\n fromToArr.forEach(({ from, to }) => {\n if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate)\n throw new Error('keyIterator: invalid or missing arguments')\n\n if (this.#privateKey) {\n const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n if (!shouldDerive) keys.push(new Wallet(this.#privateKey).address)\n }\n\n if (this.#seedPhrase) {\n const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase)\n\n for (let i = from; i <= to; i++) {\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, i)\n )\n keys.push(wallet.address)\n }\n }\n })\n\n return keys\n }\n\n retrieveInternalKeys(\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) {\n return selectedAccountsForImport.flatMap((acc) => {\n // Should never happen\n if (!['seed', 'private-key'].includes(this.subType)) {\n console.error('keyIterator: invalid subType', this.subType)\n return []\n }\n\n return acc.accountKeys.flatMap(({ index }: { index: number }, i) => {\n // In case it is a seed, the private keys have to be extracted\n if (this.subType === 'seed') {\n if (!this.#seedPhrase) {\n // Should never happen\n console.error('keyIterator: no seed phrase provided')\n return []\n }\n\n const privateKey = getPrivateKeyFromSeed(this.#seedPhrase, index, hdPathTemplate)\n return [\n {\n addr: new Wallet(privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n i\n ),\n privateKey,\n dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index),\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n }\n\n // So the subType is 'private-key' then\n if (!this.#privateKey) {\n // Should never happen\n console.error('keyIterator: no private key provided')\n return []\n }\n\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n const isPrivateKeyThatShouldBeDerived =\n isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n if (isPrivateKeyThatShouldBeDerived) {\n // Should never happen\n console.error(\n 'keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'\n )\n return []\n }\n\n return [\n {\n addr: new Wallet(this.#privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n 0\n ),\n privateKey: this.#privateKey,\n dedicatedToOneSA: false,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n })\n })\n }\n\n isSeedMatching(seedPhraseToCompareWith: string) {\n if (!this.#seedPhrase) return false\n\n return (\n Mnemonic.fromPhrase(this.#seedPhrase).phrase ===\n Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase\n )\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"keyIterator.js","sourceRoot":"","sources":["../../../../src/libs/keyIterator/keyIterator.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable new-cap */\nimport { HDNodeWallet, Mnemonic, Wallet } from 'ethers'\n\nimport {\n HD_PATH_TEMPLATE_TYPE,\n SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n} from '../../consts/derivation'\nimport { SelectedAccountForImport } from '../../interfaces/account'\nimport { KeyIterator as KeyIteratorInterface } from '../../interfaces/keyIterator'\nimport { Key } from '../../interfaces/keystore'\nimport { getHdPathFromTemplate } from '../../utils/hdPath'\nimport { isDerivedForSmartAccountKeyOnly } from '../account/account'\nimport { getDefaultKeyLabel, getExistingKeyLabel } from '../keys/keys'\n\nexport function isValidPrivateKey(value: string): boolean {\n try {\n return !!new Wallet(value)\n } catch {\n return false\n }\n}\n\nexport const getPrivateKeyFromSeed = (\n seed: string,\n seedPassphrase: string | null | undefined,\n keyIndex: number,\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE\n) => {\n const mnemonic = Mnemonic.fromPhrase(seed, seedPassphrase)\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, keyIndex)\n )\n if (wallet) {\n return wallet.privateKey\n }\n\n throw new Error('Getting the private key from the seed phrase failed.')\n}\n\n/**\n * Serves for retrieving a range of addresses/keys from a given private key or seed phrase\n */\nexport class KeyIterator implements KeyIteratorInterface {\n type = 'internal'\n\n subType: 'seed' | 'private-key'\n\n #privateKey: string | null = null\n\n #seedPhrase: string | null = null\n\n #seedPassphrase: string | null = null\n\n constructor(_privKeyOrSeed: string, _seedPassphrase?: string | null) {\n if (!_privKeyOrSeed) throw new Error('keyIterator: no private key or seed phrase provided')\n\n if (isValidPrivateKey(_privKeyOrSeed)) {\n this.#privateKey = _privKeyOrSeed\n this.subType = 'private-key'\n return\n }\n\n if (Mnemonic.isValidMnemonic(_privKeyOrSeed)) {\n this.#seedPhrase = _privKeyOrSeed\n this.subType = 'seed'\n\n if (_seedPassphrase) {\n this.#seedPassphrase = _seedPassphrase\n }\n return\n }\n\n throw new Error('keyIterator: invalid argument provided to constructor')\n }\n\n async retrieve(\n fromToArr: { from: number; to: number }[],\n hdPathTemplate?: HD_PATH_TEMPLATE_TYPE\n ) {\n const keys: string[] = []\n\n fromToArr.forEach(({ from, to }) => {\n if ((!from && from !== 0) || (!to && to !== 0) || !hdPathTemplate)\n throw new Error('keyIterator: invalid or missing arguments')\n\n if (this.#privateKey) {\n const shouldDerive = from >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n if (!shouldDerive) keys.push(new Wallet(this.#privateKey).address)\n }\n\n if (this.#seedPhrase) {\n const mnemonic = Mnemonic.fromPhrase(this.#seedPhrase, this.#seedPassphrase)\n\n for (let i = from; i <= to; i++) {\n const wallet = HDNodeWallet.fromMnemonic(\n mnemonic,\n getHdPathFromTemplate(hdPathTemplate, i)\n )\n keys.push(wallet.address)\n }\n }\n })\n\n return keys\n }\n\n retrieveInternalKeys(\n selectedAccountsForImport: SelectedAccountForImport[],\n hdPathTemplate: HD_PATH_TEMPLATE_TYPE,\n keystoreKeys: Key[]\n ) {\n return selectedAccountsForImport.flatMap((acc) => {\n // Should never happen\n if (!['seed', 'private-key'].includes(this.subType)) {\n console.error('keyIterator: invalid subType', this.subType)\n return []\n }\n\n return acc.accountKeys.flatMap(({ index }: { index: number }, i) => {\n // In case it is a seed, the private keys have to be extracted\n if (this.subType === 'seed') {\n if (!this.#seedPhrase) {\n // Should never happen\n console.error('keyIterator: no seed phrase provided')\n return []\n }\n\n const privateKey = getPrivateKeyFromSeed(\n this.#seedPhrase,\n this.#seedPassphrase,\n index,\n hdPathTemplate\n )\n return [\n {\n addr: new Wallet(privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n i\n ),\n privateKey,\n dedicatedToOneSA: isDerivedForSmartAccountKeyOnly(index),\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n }\n\n // So the subType is 'private-key' then\n if (!this.#privateKey) {\n // Should never happen\n console.error('keyIterator: no private key provided')\n return []\n }\n\n // Before v4.31.0, private keys for accounts used as smart account keys\n // were derived. That's no longer the case. Importing private keys\n // does not generate smart accounts anymore.\n const isPrivateKeyThatShouldBeDerived =\n isValidPrivateKey(this.#privateKey) && index >= SMART_ACCOUNT_SIGNER_KEY_DERIVATION_OFFSET\n if (isPrivateKeyThatShouldBeDerived) {\n // Should never happen\n console.error(\n 'keyIterator: since v4.31.0, private keys should not be derived and importing them does not retrieve a smart account'\n )\n return []\n }\n\n return [\n {\n addr: new Wallet(this.#privateKey).address,\n type: 'internal' as 'internal',\n label:\n getExistingKeyLabel(keystoreKeys, acc.account.addr, this.type) ||\n getDefaultKeyLabel(\n keystoreKeys.filter((key) => acc.account.associatedKeys.includes(key.addr)),\n 0\n ),\n privateKey: this.#privateKey,\n dedicatedToOneSA: false,\n meta: {\n createdAt: new Date().getTime()\n }\n }\n ]\n })\n })\n }\n\n isSeedMatching(seedPhraseToCompareWith: string) {\n if (!this.#seedPhrase) return false\n\n return (\n Mnemonic.fromPhrase(this.#seedPhrase).phrase ===\n Mnemonic.fromPhrase(seedPhraseToCompareWith).phrase\n )\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.d.ts b/dist/src/libs/portfolio/helpers.d.ts index b9b95d2d1..9d4e01e90 100644 --- a/dist/src/libs/portfolio/helpers.d.ts +++ b/dist/src/libs/portfolio/helpers.d.ts @@ -31,12 +31,12 @@ export declare const stripExternalHintsAPIResponse: (response: StrippedExternalH * - updates the timestamp of learned tokens * - returns the updated hints */ -export declare function getUpdatedHints(latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null, tokens: TokenResult[], tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'], networkId: NetworkId, storagePreviousHints: PreviousHintsStorage, key: string, customTokens: CustomToken[]): PreviousHintsStorage; +export declare function getUpdatedHints(latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null, tokens: TokenResult[], tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'], networkId: NetworkId, storagePreviousHints: PreviousHintsStorage, key: string, customTokens: CustomToken[], tokenPreferences: TokenPreference[]): PreviousHintsStorage; export declare const getTokensReadyToLearn: (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => string[]; export declare const tokenFilter: (token: TokenResult, nativeToken: TokenResult, network: Network, hasNonZeroTokens: boolean, additionalHints: string[] | undefined, isTokenPreference: boolean) => boolean; /** * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details) * and set the token.flags.isHidden flag. */ -export declare const processTokens: (tokenResults: TokenResult[], network: Network, hasNonZeroTokens: boolean, additionalHints: string[] | undefined, tokenPreferences: TokenPreference[]) => TokenResult[]; +export declare const processTokens: (tokenResults: TokenResult[], network: Network, hasNonZeroTokens: boolean, additionalHints: string[] | undefined, tokenPreferences: TokenPreference[], customTokens: CustomToken[]) => TokenResult[]; //# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.d.ts.map b/dist/src/libs/portfolio/helpers.d.ts.map index 0c2166f05..5979c54ab 100644 --- a/dist/src/libs/portfolio/helpers.d.ts.map +++ b/dist/src/libs/portfolio/helpers.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,YAAY,EACZ,gCAAgC,EAChC,oBAAoB,EACpB,gCAAgC,EAChC,WAAW,EACZ,MAAM,cAAc,CAAA;AAUrB,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAOhF;AAED,wBAAgB,QAAQ,CACtB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,MAAM;;;;;EA8BhB;AAED,eAAO,MAAM,kBAAkB,UACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,aACrC,MAAM,YACP,WAAW,kCAiCtB,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,OAAO,YAE5D,CAAA;AAID,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,MAEnD,CAAA;AAED,eAAO,MAAM,oBAAoB,UAAW,WAAW,WAQtD,CAAA;AAED,eAAO,MAAM,QAAQ,MAAO,WAAW,EAAE,wBAAuB,OAAO;;CAa/D,CAAA;AAER,eAAO,MAAM,0BAA0B,6BACX,MAAM,UACxB,WAAW,EAAE,WAOtB,CAAA;AAED,eAAO,MAAM,wBAAwB,qBACjB,YAAY,oBACb,OAAO,CAAC,IAAI,CAAC,EAAE,0CAkBjC,CAAA;AAED,eAAO,MAAM,sBAAsB,2BACT,WAAW,EAAE,oBACnB,OAAO,aACd,SAAS,iBACL,WAAW,EAAE,kBA+C7B,CAAA;AAED,eAAO,MAAM,6BAA6B,aAC9B,gCAAgC,GAAG,IAAI,KAChD,gCAAgC,GAAG,IAUrC,CAAA;AAUD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAE7B,0BAA0B,EAAE,gCAAgC,GAAG,IAAI,EACnE,MAAM,EAAE,WAAW,EAAE,EACrB,WAAW,EAAE,gCAAgC,CAAC,aAAa,CAAC,EAC5D,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,WAAW,EAAE,GAC1B,oBAAoB,CA2FtB;AAED,eAAO,MAAM,qBAAqB,sBAAuB,MAAM,EAAE,gBAAgB,WAAW,EAAE,aAO7F,CAAA;AAED,eAAO,MAAM,WAAW,UACf,WAAW,eACL,WAAW,WACf,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,qBAClB,OAAO,KACzB,OAkCF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,iBACV,WAAW,EAAE,WAClB,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,oBACnB,eAAe,EAAE,KAClC,WAAW,EAqBb,CAAA"} \ No newline at end of file +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,YAAY,EACZ,gCAAgC,EAChC,oBAAoB,EACpB,gCAAgC,EAChC,WAAW,EACZ,MAAM,cAAc,CAAA;AAUrB,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAOhF;AAED,wBAAgB,QAAQ,CACtB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,MAAM;;;;;EA8BhB;AAED,eAAO,MAAM,kBAAkB,UACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,aACrC,MAAM,YACP,WAAW,kCAiCtB,CAAA;AAED,eAAO,MAAM,4BAA4B,YAAa,OAAO,YAE5D,CAAA;AAID,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,MAEnD,CAAA;AAED,eAAO,MAAM,oBAAoB,UAAW,WAAW,WAQtD,CAAA;AAED,eAAO,MAAM,QAAQ,MAAO,WAAW,EAAE,wBAAuB,OAAO;;CAa/D,CAAA;AAER,eAAO,MAAM,0BAA0B,6BACX,MAAM,UACxB,WAAW,EAAE,WAOtB,CAAA;AAED,eAAO,MAAM,wBAAwB,qBACjB,YAAY,oBACb,OAAO,CAAC,IAAI,CAAC,EAAE,0CAkBjC,CAAA;AAED,eAAO,MAAM,sBAAsB,2BACT,WAAW,EAAE,oBACnB,OAAO,aACd,SAAS,iBACL,WAAW,EAAE,kBA+C7B,CAAA;AAED,eAAO,MAAM,6BAA6B,aAC9B,gCAAgC,GAAG,IAAI,KAChD,gCAAgC,GAAG,IAUrC,CAAA;AAUD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAE7B,0BAA0B,EAAE,gCAAgC,GAAG,IAAI,EACnE,MAAM,EAAE,WAAW,EAAE,EACrB,WAAW,EAAE,gCAAgC,CAAC,aAAa,CAAC,EAC5D,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,WAAW,EAAE,EAC3B,gBAAgB,EAAE,eAAe,EAAE,GAClC,oBAAoB,CAsGtB;AAED,eAAO,MAAM,qBAAqB,sBAAuB,MAAM,EAAE,gBAAgB,WAAW,EAAE,aAO7F,CAAA;AAED,eAAO,MAAM,WAAW,UACf,WAAW,eACL,WAAW,WACf,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,qBAClB,OAAO,KACzB,OAkCF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,iBACV,WAAW,EAAE,WAClB,OAAO,oBACE,OAAO,mBACR,MAAM,EAAE,GAAG,SAAS,oBACnB,eAAe,EAAE,gBACrB,WAAW,EAAE,KAC1B,WAAW,EA6Bb,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/helpers.js b/dist/src/libs/portfolio/helpers.js index e87dd3a32..080b92a58 100644 --- a/dist/src/libs/portfolio/helpers.js +++ b/dist/src/libs/portfolio/helpers.js @@ -190,7 +190,7 @@ const getLowercaseAddressArrayForNetwork = (array, networkId) => array */ function getUpdatedHints( // Can only be null in case of no external api hints -latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints, key, customTokens) { +latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints, key, customTokens, tokenPreferences) { const previousHints = { ...storagePreviousHints }; if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}; @@ -221,6 +221,7 @@ latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints // Lowercase all addresses outside of the loop for better performance const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(pinnedTokens_1.PINNED_TOKENS, networkId); const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId); + const lowercaseTokenPreferences = getLowercaseAddressArrayForNetwork(tokenPreferences, networkId); const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n); const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(networkTokensWithBalance, networkId); const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) => hint.toLowerCase()); @@ -237,9 +238,14 @@ latestHintsFromExternalAPI, tokens, tokenErrors, networkId, storagePreviousHints } const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress); const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress); + const isTokenPreference = lowercaseTokenPreferences.includes(lowercaseAddress); const isTokenInExternalAPIHints = lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress); const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress); - if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) { + if (!isTokenInExternalAPIHints && + !isPinned && + !isCustomToken && + !isTokenPreference && + hasBalance) { // Don't set the timestamp back to null if the account doesn't have balance for the token // as learnedTokens aren't account specific and one account can have balance for the token // while other don't @@ -297,18 +303,22 @@ exports.tokenFilter = tokenFilter; * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details) * and set the token.flags.isHidden flag. */ -const processTokens = (tokenResults, network, hasNonZeroTokens, additionalHints, tokenPreferences) => { +const processTokens = (tokenResults, network, hasNonZeroTokens, additionalHints, tokenPreferences, customTokens) => { // We need to know the native token in order to execute our filtration logic in tokenFilter. // For performance reasons, we define it here once, instead of during every single iteration in the reduce method. const nativeToken = tokenResults.find((token) => token.address === ethers_1.ZeroAddress); return tokenResults.reduce((tokens, tokenResult) => { const token = { ...tokenResult }; + const isGasTankOrRewards = token.flags.onGasTank || token.flags.rewardsType; const preference = tokenPreferences?.find((tokenPreference) => { return tokenPreference.address === token.address && tokenPreference.networkId === network.id; }); if (preference) { token.flags.isHidden = preference.isHidden; } + token.flags.isCustom = + !isGasTankOrRewards && + !!customTokens.find((customToken) => customToken.address === token.address && customToken.networkId === network.id); if ((0, exports.tokenFilter)(token, nativeToken, network, hasNonZeroTokens, additionalHints, !!preference)) tokens.push(token); return tokens; diff --git a/dist/src/libs/portfolio/helpers.js.map b/dist/src/libs/portfolio/helpers.js.map index 717a6aedd..eab4a3cda 100644 --- a/dist/src/libs/portfolio/helpers.js.map +++ b/dist/src/libs/portfolio/helpers.js.map @@ -1 +1 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, formatUnits, ZeroAddress } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { isSmartAccount } from '../account/account'\nimport { CustomToken, TokenPreference } from './customToken'\nimport {\n AccountState,\n AdditionalPortfolioNetworkResult,\n PreviousHintsStorage,\n StrippedExternalHintsAPIResponse,\n TokenResult\n} from './interfaces'\n\nconst usdcEMapping: { [key: string]: string } = {\n avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',\n moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3',\n arbitrum: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607'\n}\n\nexport function overrideSymbol(address: string, networkId: string, symbol: string) {\n // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol\n if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) {\n return 'USDC.E'\n }\n\n return symbol\n}\n\nexport function getFlags(\n networkData: any,\n networkId: NetworkId,\n tokenNetwork: NetworkId,\n address: string\n) {\n const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId)\n const onGasTank = networkId === 'gasTank'\n\n let rewardsType = null\n if (networkData?.xWalletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-rewards'\n if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-vesting'\n\n const foundFeeToken = gasTankFeeTokens.find(\n (t) =>\n t.address.toLowerCase() === address.toLowerCase() &&\n (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)\n )\n\n const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType\n const isFeeToken =\n address === ZeroAddress ||\n // disable if not in gas tank\n (foundFeeToken && !foundFeeToken.disableAsFeeToken) ||\n networkId === 'gasTank'\n\n return {\n onGasTank,\n rewardsType,\n canTopUpGasTank,\n isFeeToken\n }\n}\n\nexport const validateERC20Token = async (\n token: { address: string; networkId: NetworkId },\n accountId: string,\n provider: RPCProvider\n) => {\n const erc20 = new Contract(token?.address, IERC20.abi, provider)\n\n const type = 'erc20'\n let isValid = true\n let hasError = false\n\n const [balance, symbol, decimals] = (await Promise.all([\n erc20.balanceOf(accountId).catch(() => {\n hasError = true\n }),\n erc20.symbol().catch(() => {\n hasError = true\n }),\n erc20.decimals().catch(() => {\n hasError = true\n })\n ]).catch(() => {\n hasError = true\n isValid = false\n })) || [undefined, undefined, undefined]\n\n if (\n typeof balance === 'undefined' ||\n typeof symbol === 'undefined' ||\n typeof decimals === 'undefined'\n ) {\n isValid = false\n }\n\n isValid = isValid && !hasError\n return [isValid, type]\n}\n\nexport const shouldGetAdditionalPortfolio = (account: Account) => {\n return isSmartAccount(account)\n}\n\n// fetch the amountPostSimulation for the token if set\n// otherwise, the token.amount\nexport const getTokenAmount = (token: TokenResult): bigint => {\n return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount\n}\n\nexport const getTokenBalanceInUSD = (token: TokenResult) => {\n const amount = getTokenAmount(token)\n const { decimals, priceIn } = token\n const balance = parseFloat(formatUnits(amount, decimals))\n const price =\n priceIn.find(({ baseCurrency }: { baseCurrency: string }) => baseCurrency === 'usd')?.price || 0\n\n return balance * price\n}\n\nexport const getTotal = (t: TokenResult[], excludeHiddenTokens: boolean = true) =>\n t.reduce((cur: { [key: string]: number }, token: TokenResult) => {\n const localCur = cur // Add index signature to the type of localCur\n if (token.flags.isHidden && excludeHiddenTokens) return localCur\n // eslint-disable-next-line no-restricted-syntax\n for (const x of token.priceIn) {\n const currentAmount = localCur[x.baseCurrency] || 0\n\n const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals\n localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price\n }\n\n return localCur\n }, {})\n\nexport const addHiddenTokenValueToTotal = (\n totalWithoutHiddenTokens: number,\n tokens: TokenResult[]\n) => {\n return tokens.reduce((cur: number, token: TokenResult) => {\n if (!token.flags.isHidden) return cur\n\n return cur + getTokenBalanceInUSD(token)\n }, totalWithoutHiddenTokens)\n}\n\nexport const getAccountPortfolioTotal = (\n accountPortfolio: AccountState,\n excludeNetworks: Network['id'][] = [],\n excludeHiddenTokens = true\n) => {\n if (!accountPortfolio) return 0\n\n return Object.keys(accountPortfolio).reduce((acc, key) => {\n if (excludeNetworks.includes(key)) return acc\n\n const networkData = accountPortfolio[key]\n const tokenList = networkData?.result?.tokens || []\n let networkTotalAmountUSD = networkData?.result?.total.usd || 0\n\n if (!excludeHiddenTokens) {\n networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList)\n }\n\n return acc + networkTotalAmountUSD\n }, 0)\n}\n\nexport const getPinnedGasTankTokens = (\n availableGasTankAssets: TokenResult[],\n hasNonZeroTokens: boolean,\n accountId: AccountId,\n gasTankTokens: TokenResult[]\n) => {\n if (!availableGasTankAssets) return []\n // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens\n if (hasNonZeroTokens) return []\n\n return availableGasTankAssets.reduce((acc: TokenResult[], token: any) => {\n const isGasTankToken = !!gasTankTokens.find(\n (gasTankToken: TokenResult) =>\n gasTankToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n const isAlreadyPinned = !!acc.find(\n (accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n\n if (isGasTankToken || isAlreadyPinned) return acc\n\n const correspondingPinnedToken = PINNED_TOKENS.find(\n (pinnedToken) =>\n (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) &&\n pinnedToken.address === token.address &&\n pinnedToken.networkId === token.network\n )\n\n if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) {\n acc.push({\n address: token.address,\n symbol: token.symbol.toUpperCase(),\n amount: 0n,\n networkId: correspondingPinnedToken.networkId,\n decimals: token.decimals,\n priceIn: [\n {\n baseCurrency: 'usd',\n price: token.price\n }\n ],\n flags: {\n rewardsType: null,\n canTopUpGasTank: true,\n isFeeToken: true,\n onGasTank: true\n }\n })\n }\n return acc\n }, [])\n}\n\nexport const stripExternalHintsAPIResponse = (\n response: StrippedExternalHintsAPIResponse | null\n): StrippedExternalHintsAPIResponse | null => {\n if (!response) return null\n\n const { erc20s, erc721s, lastUpdate } = response\n\n return {\n erc20s,\n erc721s,\n lastUpdate\n }\n}\n\nconst getLowercaseAddressArrayForNetwork = (\n array: { address: string; networkId?: NetworkId }[],\n networkId: NetworkId\n) =>\n array\n .filter((item) => !networkId || item.networkId === networkId)\n .map((item) => item.address.toLowerCase())\n\n/**\n * Tasks:\n * - updates the external hints for [network:account] with the latest from the external API\n * - cleans the learned tokens by removing non-ERC20 items\n * - updates the timestamp of learned tokens\n * - returns the updated hints\n */\nexport function getUpdatedHints(\n // Can only be null in case of no external api hints\n latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null,\n tokens: TokenResult[],\n tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'],\n networkId: NetworkId,\n storagePreviousHints: PreviousHintsStorage,\n key: string,\n customTokens: CustomToken[]\n): PreviousHintsStorage {\n const previousHints = { ...storagePreviousHints }\n\n if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}\n if (!previousHints.learnedTokens) previousHints.learnedTokens = {}\n\n const { learnedTokens, learnedNfts } = previousHints\n const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []\n const networkLearnedTokens = learnedTokens[networkId] || {}\n\n // The keys in learnedTokens are addresses of tokens\n const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens)\n\n // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens.\n // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens.\n // For instance, a SmartContract address can be passed as a learned token.\n // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio.\n // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance,\n // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`.\n // Note:\n // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter).\n // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen,\n // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway.\n const unknownBalanceError = '0x756e6b6e'\n const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter(\n (tokenAddress) => {\n const hasError = !!tokenErrors?.find(\n (errorToken) =>\n errorToken.address.toLowerCase() === tokenAddress.toLowerCase() &&\n errorToken.error === unknownBalanceError\n )\n\n return hasError\n }\n )\n\n if (networkLearnedTokenAddresses.length) {\n // Lowercase all addresses outside of the loop for better performance\n const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(\n PINNED_TOKENS,\n networkId\n )\n const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId)\n const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n)\n const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(\n networkTokensWithBalance,\n networkId\n )\n const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) =>\n hint.toLowerCase()\n )\n\n // Update the timestamp of learned tokens\n // and self-clean non-ERC20 items.\n // eslint-disable-next-line no-restricted-syntax\n for (const address of networkLearnedTokenAddresses) {\n const lowercaseAddress = address.toLowerCase()\n\n // Delete non-ERC20 items from the learned tokens\n if (\n networkLearnedTokenAddressesHavingError.find(\n (errorToken) => errorToken.toLowerCase() === lowercaseAddress\n )\n ) {\n delete learnedTokens[networkId][lowercaseAddress]\n // eslint-disable-next-line no-continue\n continue\n }\n\n const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress)\n const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress)\n const isTokenInExternalAPIHints =\n lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress)\n const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress)\n\n if (!isTokenInExternalAPIHints && !isPinned && !isCustomToken && hasBalance) {\n // Don't set the timestamp back to null if the account doesn't have balance for the token\n // as learnedTokens aren't account specific and one account can have balance for the token\n // while other don't\n learnedTokens[networkId][address] = Date.now().toString()\n }\n }\n }\n // Update the external hints for [network:account] with the latest from the external API\n previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI\n\n return {\n fromExternalAPI: previousHints.fromExternalAPI,\n learnedTokens,\n learnedNfts\n }\n}\n\nexport const getTokensReadyToLearn = (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => {\n if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length)\n return []\n\n return toBeLearnedTokens.filter((address) =>\n resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)\n )\n}\n\nexport const tokenFilter = (\n token: TokenResult,\n nativeToken: TokenResult,\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n isTokenPreference: boolean\n): boolean => {\n // Never add ERC20 tokens that represent the network's native token.\n // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`.\n // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard.\n // From a user's perspective, the token is duplicated and counted twice in the balance.\n const isERC20NativeRepresentation =\n (token.symbol === nativeToken?.symbol ||\n network.oldNativeAssetSymbols?.includes(token.symbol)) &&\n token.amount === nativeToken.amount &&\n token.address !== ZeroAddress\n\n if (isERC20NativeRepresentation) return false\n\n // always include tokens added as a preference\n if (isTokenPreference) return true\n\n // always include > 0 amount and native token\n if (token.amount > 0 || token.address === ZeroAddress) return true\n\n const isPinned = !!PINNED_TOKENS.find((pinnedToken) => {\n return pinnedToken.networkId === network.id && pinnedToken.address === token.address\n })\n\n // make the comparison to lowercase as otherwise, it doesn't work\n const hintsLowerCase = additionalHints\n ? additionalHints.map((hint) => hint.toLowerCase())\n : undefined\n const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase())\n\n // if the amount is 0\n // return the token if it's pinned and requested\n const pinnedRequested = isPinned && !hasNonZeroTokens\n\n return isInAdditionalHints || pinnedRequested\n}\n\n/**\n * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details)\n * and set the token.flags.isHidden flag.\n */\nexport const processTokens = (\n tokenResults: TokenResult[],\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n tokenPreferences: TokenPreference[]\n): TokenResult[] => {\n // We need to know the native token in order to execute our filtration logic in tokenFilter.\n // For performance reasons, we define it here once, instead of during every single iteration in the reduce method.\n const nativeToken = tokenResults.find((token) => token.address === ZeroAddress)\n\n return tokenResults.reduce((tokens, tokenResult) => {\n const token = { ...tokenResult }\n\n const preference = tokenPreferences?.find((tokenPreference) => {\n return tokenPreference.address === token.address && tokenPreference.networkId === network.id\n })\n\n if (preference) {\n token.flags.isHidden = preference.isHidden\n }\n\n if (tokenFilter(token, nativeToken!, network, hasNonZeroTokens, additionalHints, !!preference))\n tokens.push(token)\n\n return tokens\n }, [] as TokenResult[])\n}\n"]} \ No newline at end of file +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract, formatUnits, ZeroAddress } from 'ethers'\n\nimport IERC20 from '../../../contracts/compiled/IERC20.json'\nimport gasTankFeeTokens from '../../consts/gasTankFeeTokens'\nimport { PINNED_TOKENS } from '../../consts/pinnedTokens'\nimport { Account, AccountId } from '../../interfaces/account'\nimport { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { isSmartAccount } from '../account/account'\nimport { CustomToken, TokenPreference } from './customToken'\nimport {\n AccountState,\n AdditionalPortfolioNetworkResult,\n PreviousHintsStorage,\n StrippedExternalHintsAPIResponse,\n TokenResult\n} from './interfaces'\n\nconst usdcEMapping: { [key: string]: string } = {\n avalanche: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',\n moonriver: '0x748134b5f553f2bcbd78c6826de99a70274bdeb3',\n arbitrum: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n polygon: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n optimism: '0x7f5c764cbc14f9669b88837ca1490cca17c31607'\n}\n\nexport function overrideSymbol(address: string, networkId: string, symbol: string) {\n // Since deployless lib calls contract and USDC.e is returned as USDC, we need to override the symbol\n if (usdcEMapping[networkId] && usdcEMapping[networkId].toLowerCase() === address.toLowerCase()) {\n return 'USDC.E'\n }\n\n return symbol\n}\n\nexport function getFlags(\n networkData: any,\n networkId: NetworkId,\n tokenNetwork: NetworkId,\n address: string\n) {\n const isRewardsOrGasTank = ['gasTank', 'rewards'].includes(networkId)\n const onGasTank = networkId === 'gasTank'\n\n let rewardsType = null\n if (networkData?.xWalletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-rewards'\n if (networkData?.walletClaimableBalance?.address.toLowerCase() === address.toLowerCase())\n rewardsType = 'wallet-vesting'\n\n const foundFeeToken = gasTankFeeTokens.find(\n (t) =>\n t.address.toLowerCase() === address.toLowerCase() &&\n (isRewardsOrGasTank ? t.networkId === tokenNetwork : t.networkId === networkId)\n )\n\n const canTopUpGasTank = foundFeeToken && !foundFeeToken?.disableGasTankDeposit && !rewardsType\n const isFeeToken =\n address === ZeroAddress ||\n // disable if not in gas tank\n (foundFeeToken && !foundFeeToken.disableAsFeeToken) ||\n networkId === 'gasTank'\n\n return {\n onGasTank,\n rewardsType,\n canTopUpGasTank,\n isFeeToken\n }\n}\n\nexport const validateERC20Token = async (\n token: { address: string; networkId: NetworkId },\n accountId: string,\n provider: RPCProvider\n) => {\n const erc20 = new Contract(token?.address, IERC20.abi, provider)\n\n const type = 'erc20'\n let isValid = true\n let hasError = false\n\n const [balance, symbol, decimals] = (await Promise.all([\n erc20.balanceOf(accountId).catch(() => {\n hasError = true\n }),\n erc20.symbol().catch(() => {\n hasError = true\n }),\n erc20.decimals().catch(() => {\n hasError = true\n })\n ]).catch(() => {\n hasError = true\n isValid = false\n })) || [undefined, undefined, undefined]\n\n if (\n typeof balance === 'undefined' ||\n typeof symbol === 'undefined' ||\n typeof decimals === 'undefined'\n ) {\n isValid = false\n }\n\n isValid = isValid && !hasError\n return [isValid, type]\n}\n\nexport const shouldGetAdditionalPortfolio = (account: Account) => {\n return isSmartAccount(account)\n}\n\n// fetch the amountPostSimulation for the token if set\n// otherwise, the token.amount\nexport const getTokenAmount = (token: TokenResult): bigint => {\n return typeof token.amountPostSimulation === 'bigint' ? token.amountPostSimulation : token.amount\n}\n\nexport const getTokenBalanceInUSD = (token: TokenResult) => {\n const amount = getTokenAmount(token)\n const { decimals, priceIn } = token\n const balance = parseFloat(formatUnits(amount, decimals))\n const price =\n priceIn.find(({ baseCurrency }: { baseCurrency: string }) => baseCurrency === 'usd')?.price || 0\n\n return balance * price\n}\n\nexport const getTotal = (t: TokenResult[], excludeHiddenTokens: boolean = true) =>\n t.reduce((cur: { [key: string]: number }, token: TokenResult) => {\n const localCur = cur // Add index signature to the type of localCur\n if (token.flags.isHidden && excludeHiddenTokens) return localCur\n // eslint-disable-next-line no-restricted-syntax\n for (const x of token.priceIn) {\n const currentAmount = localCur[x.baseCurrency] || 0\n\n const tokenAmount = Number(getTokenAmount(token)) / 10 ** token.decimals\n localCur[x.baseCurrency] = currentAmount + tokenAmount * x.price\n }\n\n return localCur\n }, {})\n\nexport const addHiddenTokenValueToTotal = (\n totalWithoutHiddenTokens: number,\n tokens: TokenResult[]\n) => {\n return tokens.reduce((cur: number, token: TokenResult) => {\n if (!token.flags.isHidden) return cur\n\n return cur + getTokenBalanceInUSD(token)\n }, totalWithoutHiddenTokens)\n}\n\nexport const getAccountPortfolioTotal = (\n accountPortfolio: AccountState,\n excludeNetworks: Network['id'][] = [],\n excludeHiddenTokens = true\n) => {\n if (!accountPortfolio) return 0\n\n return Object.keys(accountPortfolio).reduce((acc, key) => {\n if (excludeNetworks.includes(key)) return acc\n\n const networkData = accountPortfolio[key]\n const tokenList = networkData?.result?.tokens || []\n let networkTotalAmountUSD = networkData?.result?.total.usd || 0\n\n if (!excludeHiddenTokens) {\n networkTotalAmountUSD = addHiddenTokenValueToTotal(networkTotalAmountUSD, tokenList)\n }\n\n return acc + networkTotalAmountUSD\n }, 0)\n}\n\nexport const getPinnedGasTankTokens = (\n availableGasTankAssets: TokenResult[],\n hasNonZeroTokens: boolean,\n accountId: AccountId,\n gasTankTokens: TokenResult[]\n) => {\n if (!availableGasTankAssets) return []\n // Don't set pinnedGasTankTokens if the user has > 1 non-zero tokens\n if (hasNonZeroTokens) return []\n\n return availableGasTankAssets.reduce((acc: TokenResult[], token: any) => {\n const isGasTankToken = !!gasTankTokens.find(\n (gasTankToken: TokenResult) =>\n gasTankToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n const isAlreadyPinned = !!acc.find(\n (accToken) => accToken.symbol.toLowerCase() === token.symbol.toLowerCase()\n )\n\n if (isGasTankToken || isAlreadyPinned) return acc\n\n const correspondingPinnedToken = PINNED_TOKENS.find(\n (pinnedToken) =>\n (!('accountId' in pinnedToken) || pinnedToken.accountId === accountId) &&\n pinnedToken.address === token.address &&\n pinnedToken.networkId === token.network\n )\n\n if (correspondingPinnedToken && correspondingPinnedToken.onGasTank) {\n acc.push({\n address: token.address,\n symbol: token.symbol.toUpperCase(),\n amount: 0n,\n networkId: correspondingPinnedToken.networkId,\n decimals: token.decimals,\n priceIn: [\n {\n baseCurrency: 'usd',\n price: token.price\n }\n ],\n flags: {\n rewardsType: null,\n canTopUpGasTank: true,\n isFeeToken: true,\n onGasTank: true\n }\n })\n }\n return acc\n }, [])\n}\n\nexport const stripExternalHintsAPIResponse = (\n response: StrippedExternalHintsAPIResponse | null\n): StrippedExternalHintsAPIResponse | null => {\n if (!response) return null\n\n const { erc20s, erc721s, lastUpdate } = response\n\n return {\n erc20s,\n erc721s,\n lastUpdate\n }\n}\n\nconst getLowercaseAddressArrayForNetwork = (\n array: { address: string; networkId?: NetworkId }[],\n networkId: NetworkId\n) =>\n array\n .filter((item) => !networkId || item.networkId === networkId)\n .map((item) => item.address.toLowerCase())\n\n/**\n * Tasks:\n * - updates the external hints for [network:account] with the latest from the external API\n * - cleans the learned tokens by removing non-ERC20 items\n * - updates the timestamp of learned tokens\n * - returns the updated hints\n */\nexport function getUpdatedHints(\n // Can only be null in case of no external api hints\n latestHintsFromExternalAPI: StrippedExternalHintsAPIResponse | null,\n tokens: TokenResult[],\n tokenErrors: AdditionalPortfolioNetworkResult['tokenErrors'],\n networkId: NetworkId,\n storagePreviousHints: PreviousHintsStorage,\n key: string,\n customTokens: CustomToken[],\n tokenPreferences: TokenPreference[]\n): PreviousHintsStorage {\n const previousHints = { ...storagePreviousHints }\n\n if (!previousHints.fromExternalAPI) previousHints.fromExternalAPI = {}\n if (!previousHints.learnedTokens) previousHints.learnedTokens = {}\n\n const { learnedTokens, learnedNfts } = previousHints\n const latestERC20HintsFromExternalAPI = latestHintsFromExternalAPI?.erc20s || []\n const networkLearnedTokens = learnedTokens[networkId] || {}\n\n // The keys in learnedTokens are addresses of tokens\n const networkLearnedTokenAddresses = Object.keys(networkLearnedTokens)\n\n // Self-cleaning mechanism for removing non-ERC20 items from the learned tokens.\n // There's a possibility that the discovered tokens (from debug_traceCall or mostly Humanizer) include items that are not ERC20 tokens.\n // For instance, a SmartContract address can be passed as a learned token.\n // Thanks to BalanceGetter, we know which tokens encounter an error when we try to update the portfolio.\n // All the errors are collected in `tokenErrors`, and if we cannot retrieve its balance,\n // the contract returns `bytes('unkn')`, which is equal to `0x756e6b6e`.\n // Note:\n // When we extract tokens from `debug_traceCall`, we are already filtering the tokens the same way as here (relying on BalanceGetter).\n // However, for the Humanizer tokens, we skipped that check because the Humanizer is invoked more frequently on the Sign screen,\n // and this validation may slow down the performance of the page. Because of this, we perform the check here, where we are calling BalanceGetter anyway.\n const unknownBalanceError = '0x756e6b6e'\n const networkLearnedTokenAddressesHavingError = networkLearnedTokenAddresses.filter(\n (tokenAddress) => {\n const hasError = !!tokenErrors?.find(\n (errorToken) =>\n errorToken.address.toLowerCase() === tokenAddress.toLowerCase() &&\n errorToken.error === unknownBalanceError\n )\n\n return hasError\n }\n )\n\n if (networkLearnedTokenAddresses.length) {\n // Lowercase all addresses outside of the loop for better performance\n const lowercaseNetworkPinnedTokenAddresses = getLowercaseAddressArrayForNetwork(\n PINNED_TOKENS,\n networkId\n )\n const lowercaseCustomTokens = getLowercaseAddressArrayForNetwork(customTokens, networkId)\n const lowercaseTokenPreferences = getLowercaseAddressArrayForNetwork(\n tokenPreferences,\n networkId\n )\n const networkTokensWithBalance = tokens.filter((token) => token.amount > 0n)\n const lowercaseNetworkTokenAddressesWithBalance = getLowercaseAddressArrayForNetwork(\n networkTokensWithBalance,\n networkId\n )\n const lowercaseERC20HintsFromExternalAPI = latestERC20HintsFromExternalAPI.map((hint) =>\n hint.toLowerCase()\n )\n\n // Update the timestamp of learned tokens\n // and self-clean non-ERC20 items.\n // eslint-disable-next-line no-restricted-syntax\n for (const address of networkLearnedTokenAddresses) {\n const lowercaseAddress = address.toLowerCase()\n\n // Delete non-ERC20 items from the learned tokens\n if (\n networkLearnedTokenAddressesHavingError.find(\n (errorToken) => errorToken.toLowerCase() === lowercaseAddress\n )\n ) {\n delete learnedTokens[networkId][lowercaseAddress]\n // eslint-disable-next-line no-continue\n continue\n }\n\n const isPinned = lowercaseNetworkPinnedTokenAddresses.includes(lowercaseAddress)\n const isCustomToken = lowercaseCustomTokens.includes(lowercaseAddress)\n const isTokenPreference = lowercaseTokenPreferences.includes(lowercaseAddress)\n const isTokenInExternalAPIHints =\n lowercaseERC20HintsFromExternalAPI.includes(lowercaseAddress)\n const hasBalance = lowercaseNetworkTokenAddressesWithBalance.includes(lowercaseAddress)\n\n if (\n !isTokenInExternalAPIHints &&\n !isPinned &&\n !isCustomToken &&\n !isTokenPreference &&\n hasBalance\n ) {\n // Don't set the timestamp back to null if the account doesn't have balance for the token\n // as learnedTokens aren't account specific and one account can have balance for the token\n // while other don't\n learnedTokens[networkId][address] = Date.now().toString()\n }\n }\n }\n // Update the external hints for [network:account] with the latest from the external API\n previousHints.fromExternalAPI[key] = latestHintsFromExternalAPI\n\n return {\n fromExternalAPI: previousHints.fromExternalAPI,\n learnedTokens,\n learnedNfts\n }\n}\n\nexport const getTokensReadyToLearn = (toBeLearnedTokens: string[], resultTokens: TokenResult[]) => {\n if (!toBeLearnedTokens || !resultTokens || !toBeLearnedTokens.length || !resultTokens.length)\n return []\n\n return toBeLearnedTokens.filter((address) =>\n resultTokens.find((resultToken) => resultToken.address === address && resultToken.amount > 0n)\n )\n}\n\nexport const tokenFilter = (\n token: TokenResult,\n nativeToken: TokenResult,\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n isTokenPreference: boolean\n): boolean => {\n // Never add ERC20 tokens that represent the network's native token.\n // For instance, on Polygon, we have this token: `0x0000000000000000000000000000000000001010`.\n // It mimics the native POL token (same symbol, same amount) and is shown twice in the Dashboard.\n // From a user's perspective, the token is duplicated and counted twice in the balance.\n const isERC20NativeRepresentation =\n (token.symbol === nativeToken?.symbol ||\n network.oldNativeAssetSymbols?.includes(token.symbol)) &&\n token.amount === nativeToken.amount &&\n token.address !== ZeroAddress\n\n if (isERC20NativeRepresentation) return false\n\n // always include tokens added as a preference\n if (isTokenPreference) return true\n\n // always include > 0 amount and native token\n if (token.amount > 0 || token.address === ZeroAddress) return true\n\n const isPinned = !!PINNED_TOKENS.find((pinnedToken) => {\n return pinnedToken.networkId === network.id && pinnedToken.address === token.address\n })\n\n // make the comparison to lowercase as otherwise, it doesn't work\n const hintsLowerCase = additionalHints\n ? additionalHints.map((hint) => hint.toLowerCase())\n : undefined\n const isInAdditionalHints = hintsLowerCase?.includes(token.address.toLowerCase())\n\n // if the amount is 0\n // return the token if it's pinned and requested\n const pinnedRequested = isPinned && !hasNonZeroTokens\n\n return isInAdditionalHints || pinnedRequested\n}\n\n/**\n * Filter the TokenResult[] by certain criteria (please refer to `tokenFilter` for more details)\n * and set the token.flags.isHidden flag.\n */\nexport const processTokens = (\n tokenResults: TokenResult[],\n network: Network,\n hasNonZeroTokens: boolean,\n additionalHints: string[] | undefined,\n tokenPreferences: TokenPreference[],\n customTokens: CustomToken[]\n): TokenResult[] => {\n // We need to know the native token in order to execute our filtration logic in tokenFilter.\n // For performance reasons, we define it here once, instead of during every single iteration in the reduce method.\n const nativeToken = tokenResults.find((token) => token.address === ZeroAddress)\n\n return tokenResults.reduce((tokens, tokenResult) => {\n const token = { ...tokenResult }\n const isGasTankOrRewards = token.flags.onGasTank || token.flags.rewardsType\n\n const preference = tokenPreferences?.find((tokenPreference) => {\n return tokenPreference.address === token.address && tokenPreference.networkId === network.id\n })\n\n if (preference) {\n token.flags.isHidden = preference.isHidden\n }\n\n token.flags.isCustom =\n !isGasTankOrRewards &&\n !!customTokens.find(\n (customToken) =>\n customToken.address === token.address && customToken.networkId === network.id\n )\n\n if (tokenFilter(token, nativeToken!, network, hasNonZeroTokens, additionalHints, !!preference))\n tokens.push(token)\n\n return tokens\n }, [] as TokenResult[])\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.d.ts b/dist/src/libs/portfolio/interfaces.d.ts index 3f3450bc3..4993eb925 100644 --- a/dist/src/libs/portfolio/interfaces.d.ts +++ b/dist/src/libs/portfolio/interfaces.d.ts @@ -29,6 +29,7 @@ export type TokenResult = { isFeeToken: boolean; isDefiToken?: boolean; isHidden?: boolean; + isCustom?: boolean; }; }; export interface CollectionResult extends TokenResult { diff --git a/dist/src/libs/portfolio/interfaces.d.ts.map b/dist/src/libs/portfolio/interfaces.d.ts.map index 8a1958c12..f422ca727 100644 --- a/dist/src/libs/portfolio/interfaces.d.ts.map +++ b/dist/src/libs/portfolio/interfaces.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/libs/portfolio/interfaces.js.map b/dist/src/libs/portfolio/interfaces.js.map index aa1ff7394..7e7ce072a 100644 --- a/dist/src/libs/portfolio/interfaces.js.map +++ b/dist/src/libs/portfolio/interfaces.js.map @@ -1 +1 @@ -{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport interface Price {\n baseCurrency: string\n price: number\n}\n\nexport interface GetOptionsSimulation {\n accountOps: AccountOp[]\n account: Account\n}\nexport type TokenError = string | '0x'\n\nexport type AccountAssetsState = { [networkId: NetworkId]: boolean }\n\nexport type TokenResult = {\n symbol: string\n decimals: number\n address: string\n networkId: NetworkId\n amount: bigint\n simulationAmount?: bigint\n amountPostSimulation?: bigint\n priceIn: Price[]\n flags: {\n onGasTank: boolean\n rewardsType: 'wallet-vesting' | 'wallet-rewards' | null\n canTopUpGasTank: boolean\n isFeeToken: boolean\n isDefiToken?: boolean\n isHidden?: boolean\n }\n}\n\nexport interface CollectionResult extends TokenResult {\n name: string\n collectibles: bigint[]\n postSimulation?: {\n sending?: bigint[]\n receiving?: bigint[]\n }\n}\n\nexport type PriceCache = Map\n\nexport type MetaData = { blockNumber?: number; beforeNonce?: bigint; afterNonce?: bigint }\n\nexport interface ERC721Enumerable {\n isKnown: boolean\n enumerable: boolean\n}\nexport interface ERC721Innumerable {\n isKnown: boolean\n tokens: string[]\n}\n\nexport interface ERC721s {\n [name: string]: ERC721Enumerable | ERC721Innumerable\n}\n\nexport interface Hints {\n erc20s: string[]\n erc721s: ERC721s\n}\n\nexport interface ExternalHintsAPIResponse extends Hints {\n lastUpdate: number\n networkId: string\n accountAddr: string\n prices: {\n [name: string]: Price\n }\n hasHints: boolean\n // Attached by the application error handling logic.\n // All other props, are provided by Velcro Discovery request.\n error?: string\n}\n\nexport type StrippedExternalHintsAPIResponse = Pick<\n ExternalHintsAPIResponse,\n 'erc20s' | 'erc721s' | 'lastUpdate'\n>\n\nexport interface ExtendedError extends Error {\n simulationErrorMsg?: string\n}\n\ntype ExtendedErrorWithLevel = ExtendedError & {\n level: 'critical' | 'warning' | 'silent'\n}\n\nexport interface PortfolioLibGetResult {\n updateStarted: number\n discoveryTime: number\n oracleCallTime: number\n priceUpdateTime: number\n priceCache: PriceCache\n tokens: TokenResult[]\n feeTokens: TokenResult[]\n tokenErrors: { error: string; address: string }[]\n collections: CollectionResult[]\n hintsFromExternalAPI: StrippedExternalHintsAPIResponse | null\n errors: ExtendedErrorWithLevel[]\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n}\n\ninterface Total {\n [currency: string]: number\n}\n\ntype AdditionalPortfolioProperties = 'updateStarted' | 'tokens'\n\nexport type ClaimableRewardsData = {\n addr: string\n fromBalanceClaimable: number\n fromADXClaimable: number\n totalClaimable: string\n leaf: string\n proof: string[]\n root: string\n signedRoot: string\n}\n\nexport type AddrVestingData = {\n addr: string\n rate: string\n start: string\n end: string\n}\n\n// Create the final type with some properties optional\nexport type AdditionalPortfolioNetworkResult = Partial &\n Pick & {\n lastSuccessfulUpdate: number\n total: Total\n claimableRewardsData?: ClaimableRewardsData\n addrVestingData?: AddrVestingData\n }\n\ntype PortfolioNetworkResult = Required\n\nexport type NetworkState = {\n isReady: boolean\n isLoading: boolean\n criticalError?: ExtendedError\n errors: ExtendedErrorWithLevel[]\n result?: PortfolioNetworkResult | AdditionalPortfolioNetworkResult\n // We store the previously simulated AccountOps only for the pending state.\n // Prior to triggering a pending state update, we compare the newly passed AccountOp[] (updateSelectedAccount) with the cached version.\n // If there are no differences, the update is canceled unless the `forceUpdate` flag is set.\n accountOps?: AccountOp[]\n}\n\nexport type AccountState = {\n [networkId: string]: NetworkState | undefined\n}\n\nexport type PortfolioControllerState = {\n // accountId:networkId:NetworkState\n [accountId: string]: AccountState\n}\n\nexport interface LimitsOptions {\n erc20: number\n erc721: number\n erc721TokensInput: number\n erc721Tokens: number\n}\n\nexport interface Limits {\n deploylessProxyMode: LimitsOptions\n deploylessStateOverrideMode: LimitsOptions\n}\n\nexport type PinnedTokens = {\n networkId: NetworkId\n address: string\n onGasTank: boolean\n accountId?: AccountId\n}[]\n\nexport type TemporaryTokens = {\n [networkId: NetworkId]: {\n isLoading: boolean\n errors: { error: string; address: string }[]\n result: { tokens: PortfolioLibGetResult['tokens'] }\n }\n}\n\nexport interface GetOptions {\n baseCurrency: string\n blockTag: string | number\n simulation?: GetOptionsSimulation\n priceCache?: PriceCache\n priceRecency: number\n previousHintsFromExternalAPI?: StrippedExternalHintsAPIResponse | null\n isEOA: boolean\n fetchPinned: boolean\n additionalErc20Hints?: Hints['erc20s']\n additionalErc721Hints?: Hints['erc721s']\n disableAutoDiscovery?: boolean\n}\n\nexport interface PreviousHintsStorage {\n learnedTokens: { [network in NetworkId]: { [tokenAddress: string]: string | null } }\n learnedNfts: { [network in NetworkId]: { [nftAddress: string]: bigint[] } }\n fromExternalAPI: {\n [networkAndAccountKey: string]: GetOptions['previousHintsFromExternalAPI']\n }\n}\n\nexport interface NetworkSimulatedAccountOp {\n [networkId: NetworkId]: AccountOp\n}\n\nexport type PendingAmounts = {\n isPending: boolean\n pendingBalance: bigint\n pendingToBeSigned?: bigint\n pendingToBeConfirmed?: bigint\n}\n\nexport type FormattedPendingAmounts = Omit & {\n pendingBalance: string\n pendingBalanceFormatted: string\n pendingBalanceUSDFormatted?: string\n pendingToBeSignedFormatted?: string\n pendingToBeConfirmedFormatted?: string\n}\n"]} \ No newline at end of file +{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/libs/portfolio/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { Account, AccountId } from '../../interfaces/account'\nimport { NetworkId } from '../../interfaces/network'\nimport { AccountOp } from '../accountOp/accountOp'\n\nexport interface Price {\n baseCurrency: string\n price: number\n}\n\nexport interface GetOptionsSimulation {\n accountOps: AccountOp[]\n account: Account\n}\nexport type TokenError = string | '0x'\n\nexport type AccountAssetsState = { [networkId: NetworkId]: boolean }\n\nexport type TokenResult = {\n symbol: string\n decimals: number\n address: string\n networkId: NetworkId\n amount: bigint\n simulationAmount?: bigint\n amountPostSimulation?: bigint\n priceIn: Price[]\n flags: {\n onGasTank: boolean\n rewardsType: 'wallet-vesting' | 'wallet-rewards' | null\n canTopUpGasTank: boolean\n isFeeToken: boolean\n isDefiToken?: boolean\n isHidden?: boolean\n isCustom?: boolean\n }\n}\n\nexport interface CollectionResult extends TokenResult {\n name: string\n collectibles: bigint[]\n postSimulation?: {\n sending?: bigint[]\n receiving?: bigint[]\n }\n}\n\nexport type PriceCache = Map\n\nexport type MetaData = { blockNumber?: number; beforeNonce?: bigint; afterNonce?: bigint }\n\nexport interface ERC721Enumerable {\n isKnown: boolean\n enumerable: boolean\n}\nexport interface ERC721Innumerable {\n isKnown: boolean\n tokens: string[]\n}\n\nexport interface ERC721s {\n [name: string]: ERC721Enumerable | ERC721Innumerable\n}\n\nexport interface Hints {\n erc20s: string[]\n erc721s: ERC721s\n}\n\nexport interface ExternalHintsAPIResponse extends Hints {\n lastUpdate: number\n networkId: string\n accountAddr: string\n prices: {\n [name: string]: Price\n }\n hasHints: boolean\n // Attached by the application error handling logic.\n // All other props, are provided by Velcro Discovery request.\n error?: string\n}\n\nexport type StrippedExternalHintsAPIResponse = Pick<\n ExternalHintsAPIResponse,\n 'erc20s' | 'erc721s' | 'lastUpdate'\n>\n\nexport interface ExtendedError extends Error {\n simulationErrorMsg?: string\n}\n\ntype ExtendedErrorWithLevel = ExtendedError & {\n level: 'critical' | 'warning' | 'silent'\n}\n\nexport interface PortfolioLibGetResult {\n updateStarted: number\n discoveryTime: number\n oracleCallTime: number\n priceUpdateTime: number\n priceCache: PriceCache\n tokens: TokenResult[]\n feeTokens: TokenResult[]\n tokenErrors: { error: string; address: string }[]\n collections: CollectionResult[]\n hintsFromExternalAPI: StrippedExternalHintsAPIResponse | null\n errors: ExtendedErrorWithLevel[]\n blockNumber: number\n beforeNonce: bigint\n afterNonce: bigint\n}\n\ninterface Total {\n [currency: string]: number\n}\n\ntype AdditionalPortfolioProperties = 'updateStarted' | 'tokens'\n\nexport type ClaimableRewardsData = {\n addr: string\n fromBalanceClaimable: number\n fromADXClaimable: number\n totalClaimable: string\n leaf: string\n proof: string[]\n root: string\n signedRoot: string\n}\n\nexport type AddrVestingData = {\n addr: string\n rate: string\n start: string\n end: string\n}\n\n// Create the final type with some properties optional\nexport type AdditionalPortfolioNetworkResult = Partial &\n Pick & {\n lastSuccessfulUpdate: number\n total: Total\n claimableRewardsData?: ClaimableRewardsData\n addrVestingData?: AddrVestingData\n }\n\ntype PortfolioNetworkResult = Required\n\nexport type NetworkState = {\n isReady: boolean\n isLoading: boolean\n criticalError?: ExtendedError\n errors: ExtendedErrorWithLevel[]\n result?: PortfolioNetworkResult | AdditionalPortfolioNetworkResult\n // We store the previously simulated AccountOps only for the pending state.\n // Prior to triggering a pending state update, we compare the newly passed AccountOp[] (updateSelectedAccount) with the cached version.\n // If there are no differences, the update is canceled unless the `forceUpdate` flag is set.\n accountOps?: AccountOp[]\n}\n\nexport type AccountState = {\n [networkId: string]: NetworkState | undefined\n}\n\nexport type PortfolioControllerState = {\n // accountId:networkId:NetworkState\n [accountId: string]: AccountState\n}\n\nexport interface LimitsOptions {\n erc20: number\n erc721: number\n erc721TokensInput: number\n erc721Tokens: number\n}\n\nexport interface Limits {\n deploylessProxyMode: LimitsOptions\n deploylessStateOverrideMode: LimitsOptions\n}\n\nexport type PinnedTokens = {\n networkId: NetworkId\n address: string\n onGasTank: boolean\n accountId?: AccountId\n}[]\n\nexport type TemporaryTokens = {\n [networkId: NetworkId]: {\n isLoading: boolean\n errors: { error: string; address: string }[]\n result: { tokens: PortfolioLibGetResult['tokens'] }\n }\n}\n\nexport interface GetOptions {\n baseCurrency: string\n blockTag: string | number\n simulation?: GetOptionsSimulation\n priceCache?: PriceCache\n priceRecency: number\n previousHintsFromExternalAPI?: StrippedExternalHintsAPIResponse | null\n isEOA: boolean\n fetchPinned: boolean\n additionalErc20Hints?: Hints['erc20s']\n additionalErc721Hints?: Hints['erc721s']\n disableAutoDiscovery?: boolean\n}\n\nexport interface PreviousHintsStorage {\n learnedTokens: { [network in NetworkId]: { [tokenAddress: string]: string | null } }\n learnedNfts: { [network in NetworkId]: { [nftAddress: string]: bigint[] } }\n fromExternalAPI: {\n [networkAndAccountKey: string]: GetOptions['previousHintsFromExternalAPI']\n }\n}\n\nexport interface NetworkSimulatedAccountOp {\n [networkId: NetworkId]: AccountOp\n}\n\nexport type PendingAmounts = {\n isPending: boolean\n pendingBalance: bigint\n pendingToBeSigned?: bigint\n pendingToBeConfirmed?: bigint\n}\n\nexport type FormattedPendingAmounts = Omit & {\n pendingBalance: string\n pendingBalanceFormatted: string\n pendingBalanceUSDFormatted?: string\n pendingToBeSignedFormatted?: string\n pendingToBeConfirmedFormatted?: string\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.d.ts.map b/dist/src/libs/proxyDeploy/deploy.d.ts.map index 7b2418968..e819ce8f3 100644 --- a/dist/src/libs/proxyDeploy/deploy.d.ts.map +++ b/dist/src/libs/proxyDeploy/deploy.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAaA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,UAI/E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CACpC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,IAAI;;CAAkB,UAoBvB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,GAAG;;EAazD"} \ No newline at end of file +{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"AAaA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,UAE/E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CACpC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,IAAI;;CAAkB,UAoBvB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,GAAG;;EAazD"} \ No newline at end of file diff --git a/dist/src/libs/proxyDeploy/deploy.js b/dist/src/libs/proxyDeploy/deploy.js index 3d0b59e18..8708733fd 100644 --- a/dist/src/libs/proxyDeploy/deploy.js +++ b/dist/src/libs/proxyDeploy/deploy.js @@ -15,15 +15,13 @@ function evmPush(data) { } // @TODO: fix the any function privSlot(slotNumber, keyType, key, valueType) { - const abiCoder = new ethers_1.AbiCoder(); - const buf = abiCoder.encode([keyType, valueType], [key, slotNumber]); - return (0, ethers_1.keccak256)(buf); + return (0, ethers_1.solidityPackedKeccak256)([keyType, valueType], [key, slotNumber]); } exports.privSlot = privSlot; // @TODO: fix the any function sstoreCode(slotNumber, keyType, key, valueType, valueBuf) { // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless - const slot = privSlot(slotNumber, keyType, key, valueType); + const slot = privSlot(slotNumber, keyType, key, valueType).slice(2); return Buffer.concat([ evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf), evmPush(Buffer.from(slot, 'hex')), @@ -34,7 +32,7 @@ function getProxyDeployBytecode(masterContractAddr, privLevels, opts = { privSlo const slotNumber = opts.privSlot ?? 0; if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels'); - const storage = Buffer.concat(privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))); + const storage = Buffer.concat(privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'uint256', addr, 'uint256', hash))); const initial = Buffer.from('3d602d80', 'hex'); // NOTE: this means we can't support offset>256 // @TODO solve this case; this will remove the "max 3 privLevels" restriction diff --git a/dist/src/libs/proxyDeploy/deploy.js.map b/dist/src/libs/proxyDeploy/deploy.js.map index 06b68cfe9..6b84b7b49 100644 --- a/dist/src/libs/proxyDeploy/deploy.js.map +++ b/dist/src/libs/proxyDeploy/deploy.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbiCoder, keccak256 } from 'ethers'\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n const abiCoder = new AbiCoder()\n const buf = abiCoder.encode([keyType, valueType], [key, slotNumber])\n return keccak256(buf)\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'address', addr, 'bytes32', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file +{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/libs/proxyDeploy/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["import { solidityPackedKeccak256 } from 'ethers'\n\n// @TODO: fix the any\nfunction evmPush(data: any) {\n if (data.length < 1) throw new Error('evmPush: no data')\n if (data.length > 32) throw new Error('evmPush: data too long')\n const opCode = data.length + 95\n const opCodeBuf = Buffer.alloc(1)\n opCodeBuf.writeUInt8(opCode, 0)\n return Buffer.concat([opCodeBuf, data])\n}\n\n// @TODO: fix the any\nexport function privSlot(slotNumber: any, keyType: any, key: any, valueType: any) {\n return solidityPackedKeccak256([keyType, valueType], [key, slotNumber])\n}\n\n// @TODO: fix the any\nfunction sstoreCode(slotNumber: any, keyType: any, key: any, valueType: any, valueBuf: any) {\n // @TODO why are we using valueType for the slotNumber? this has to be a hardcoded uint256 and valueType is pointless\n const slot = privSlot(slotNumber, keyType, key, valueType).slice(2)\n return Buffer.concat([\n evmPush(typeof valueBuf === 'string' ? Buffer.from(valueBuf.slice(2), 'hex') : valueBuf),\n evmPush(Buffer.from(slot, 'hex')),\n Buffer.from('55', 'hex')\n ])\n}\n\nexport interface PrivLevels {\n addr: string\n hash: string\n}\n\nexport function getProxyDeployBytecode(\n masterContractAddr: string,\n privLevels: PrivLevels[],\n opts = { privSlot: 0 }\n) {\n const slotNumber = opts.privSlot ?? 0\n if (privLevels.length > 3) throw new Error('getProxyDeployBytecode: max 3 privLevels')\n const storage = Buffer.concat(\n privLevels.map(({ addr, hash }) => sstoreCode(slotNumber, 'uint256', addr, 'uint256', hash))\n )\n const initial = Buffer.from('3d602d80', 'hex')\n // NOTE: this means we can't support offset>256\n // @TODO solve this case; this will remove the \"max 3 privLevels\" restriction\n const offset = storage.length + initial.length + 6 // 6 more bytes including the push added later on\n if (offset > 256) throw new Error('getProxyDeployBytecode: internal: offset>256')\n const initialCode = Buffer.concat([storage, initial, evmPush(Buffer.from([offset]))])\n const masterAddrBuf = Buffer.from(masterContractAddr.slice(2).replace(/^(00)+/, ''), 'hex')\n\n // TO DO: check if masterAddrBuf.length actually makes sense\n if (masterAddrBuf.length > 20) throw new Error('invalid address')\n return `0x${initialCode.toString('hex')}3d3981f3363d3d373d3d3d363d${evmPush(\n masterAddrBuf\n ).toString('hex')}5af43d82803e903d91602b57fd5bf3`\n}\n\nexport function getStorageSlotsFromArtifact(buildInfo: any) {\n if (!buildInfo) return { privSlot: 0 }\n const ambireAccountArtifact = buildInfo.output.sources['contracts/AmbireAccount.sol']\n if (!ambireAccountArtifact) return { privSlot: 0 }\n const identityNode = ambireAccountArtifact.ast.nodes.find(\n (el: any) => el.nodeType === 'ContractDefinition' && el.name === 'AmbireAccount'\n )\n const storageVariableNodes = identityNode.nodes.filter(\n (n: any) => n.nodeType === 'VariableDeclaration' && !n.constant && n.stateVariable\n )\n const slotNumber = storageVariableNodes.findIndex((x: any) => x.name === 'privileges')\n\n return { privSlot: slotNumber }\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.d.ts b/dist/src/libs/selectedAccount/errors.d.ts index c6c4025ad..b5d271e6b 100644 --- a/dist/src/libs/selectedAccount/errors.d.ts +++ b/dist/src/libs/selectedAccount/errors.d.ts @@ -3,6 +3,7 @@ import { RPCProviders } from '../../interfaces/provider'; import { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'; import { AccountState as DefiPositionsAccountState, NetworksWithPositions } from '../defiPositions/types'; import { AccountAssetsState } from '../portfolio/interfaces'; +import { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'; export type Action = { label: 'Select'; actionName: 'select-rpc-url'; @@ -11,8 +12,8 @@ export type Action = { }; }; export type SelectedAccountBalanceError = { - id: string; - networkIds: NetworkId[]; + id: `custom-rpcs-down-${NetworkId}` | 'rpcs-down' | 'portfolio-critical' | 'loading-too-long' | 'defi-critical' | 'defi-prices' | `${string}-defi-positions-error` | keyof typeof PORTFOLIO_LIB_ERROR_NAMES; + networkNames: string[]; type: 'error' | 'warning'; title: string; text?: string; diff --git a/dist/src/libs/selectedAccount/errors.d.ts.map b/dist/src/libs/selectedAccount/errors.d.ts.map index ada6d2831..6b8d5223d 100644 --- a/dist/src/libs/selectedAccount/errors.d.ts.map +++ b/dist/src/libs/selectedAccount/errors.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;AAChF,OAAO,EACL,YAAY,IAAI,yBAAyB,EAEzC,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAK5D,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,QAAQ,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,8BAA8B;eAK9B,YAAY;cACb,OAAO,EAAE;wBACC,kBAAkB;MACpC,2BAA2B,EAqD9B,CAAA;AAwDD,eAAO,MAAM,mCAAmC;cAKpC,OAAO,EAAE;2BACI,6BAA6B;eACzC,YAAY;MACrB,2BAA2B,EA2D9B,CAAA;AAED,eAAO,MAAM,uCAAuC;cAMxC,OAAO,EAAE;yBACE,yBAAyB;eACnC,YAAY;2BACA,qBAAqB;mCAyG7C,CAAA"} \ No newline at end of file +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;AAChF,OAAO,EACL,YAAY,IAAI,yBAAyB,EAEzC,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAIlE,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,QAAQ,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,EAAE,EACE,oBAAoB,SAAS,EAAE,GAC/B,WAAW,GACX,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,GACf,aAAa,GACb,GAAG,MAAM,uBAAuB,GAChC,MAAM,OAAO,yBAAyB,CAAA;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,8BAA8B;eAK9B,YAAY;cACb,OAAO,EAAE;wBACC,kBAAkB;MACpC,2BAA2B,EAqD9B,CAAA;AA6DD,eAAO,MAAM,mCAAmC;cAKpC,OAAO,EAAE;2BACI,6BAA6B;eACzC,YAAY;MACrB,2BAA2B,EA6D9B,CAAA;AAED,eAAO,MAAM,uCAAuC;cAMxC,OAAO,EAAE;yBACE,yBAAyB;eACnC,YAAY;2BACA,qBAAqB;mCAmG7C,CAAA"} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/errors.js b/dist/src/libs/selectedAccount/errors.js index bdd6d1e8b..de5f24a38 100644 --- a/dist/src/libs/selectedAccount/errors.js +++ b/dist/src/libs/selectedAccount/errors.js @@ -23,7 +23,7 @@ const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAsset networksWithMultipleRpcUrls.forEach((n) => { errors.push({ id: `custom-rpcs-down-${n.id}`, - networkIds: [n.id], + networkNames: [n.name], type: 'error', title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`, text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.', @@ -40,7 +40,7 @@ const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAsset return errors; errors.push({ id: 'rpcs-down', - networkIds: networksToGroupInSingleBanner.map((n) => n.id), + networkNames: networksToGroupInSingleBanner.map((n) => n.name), type: 'error', title: `Failed to retrieve network data for ${networksToGroupInSingleBanner .map((n) => n.name) @@ -50,11 +50,11 @@ const getNetworksWithFailedRPCErrors = ({ providers, networks, networksWithAsset return errors; }; exports.getNetworksWithFailedRPCErrors = getNetworksWithFailedRPCErrors; -const addPortfolioError = (errors, networkId, newError) => { +const addPortfolioError = (errors, networkName, newError) => { const newErrors = [...errors]; const existingError = newErrors.find((error) => error.id === newError); if (existingError) { - existingError.networkIds.push(networkId); + existingError.networkNames.push(networkName); } else { let title = ''; @@ -65,6 +65,11 @@ const addPortfolioError = (errors, networkId, newError) => { title = 'Failed to retrieve the portfolio data'; text = 'Account balance and visible assets may be inaccurate.'; break; + case 'loading-too-long': + title = 'Loading is taking longer than expected'; + text = 'Account balance and visible assets may be inaccurate.'; + type = 'warning'; + break; case portfolio_1.PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError: title = 'Failed to retrieve prices'; text = 'Account balance and asset prices may be inaccurate.'; @@ -88,7 +93,7 @@ const addPortfolioError = (errors, networkId, newError) => { return newErrors; newErrors.push({ id: newError, - networkIds: [networkId], + networkNames: [networkName], type, title, text @@ -98,19 +103,25 @@ const addPortfolioError = (errors, networkId, newError) => { }; const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountLatest, providers }) => { let errors = []; - const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => { - const portfolioForNetwork = selectedAccountLatest[network]; - return portfolioForNetwork?.isLoading; - }); - // Otherwise networks are appended to the banner one by one, which looks weird - if (portfolioLoading) - return []; if (!Object.keys(selectedAccountLatest).length) return []; Object.keys(selectedAccountLatest).forEach((network) => { const portfolioForNetwork = selectedAccountLatest[network]; const criticalError = portfolioForNetwork?.criticalError; const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate; + let networkName = networks.find((n) => n.id === network)?.name; + if (network === 'gasTank') + networkName = 'Gas Tank'; + else if (network === 'rewards') + networkName = 'Rewards'; + if (!networkName) { + console.error('Network name not found for network in getNetworksWithPortfolioErrorErrors', network); + return; + } + if (portfolioForNetwork?.isLoading) { + errors = addPortfolioError(errors, networkName, 'loading-too-long'); + return; + } // Don't display an error banner if the last successful update was less than 10 minutes ago if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES) return; @@ -120,30 +131,23 @@ const getNetworksWithPortfolioErrorErrors = ({ networks, selectedAccountLatest, // In case of additional networks don't check the RPC as there isn't one if (criticalError && (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)) { - errors = addPortfolioError(errors, network, 'portfolio-critical'); + errors = addPortfolioError(errors, networkName, 'portfolio-critical'); return; } portfolioForNetwork?.errors.forEach((err) => { - errors = addPortfolioError(errors, network, err.name); + errors = addPortfolioError(errors, networkName, err.name); }); }); - return errors.map(({ title, networkIds, ...rest }) => { - const networkNames = networkIds.reduce((acc, id, index) => { - let networkName = networks.find((n) => n.id === id)?.name; - const isLast = index === networkIds.length - 1; - const isOnly = networkIds.length === 1; - if (id === 'gasTank') - networkName = 'Gas Tank'; - else if (id === 'rewards') - networkName = 'Rewards'; - if (!networkName) - return acc; - return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`; + return errors.map(({ title, networkNames, ...rest }) => { + const networkNamesString = networkNames.reduce((acc, name, index) => { + const isLast = index === networkNames.length - 1; + const isOnly = networkNames.length === 1; + return `${acc}${name}${isLast || isOnly ? '' : ', '}`; }, ''); return { ...rest, - title: `${title} on ${networkNames}`, - networkIds + title: `${title} on ${networkNamesString}`, + networkNames }; }); }; @@ -205,7 +209,7 @@ const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState return { id: `${providerName}-defi-positions-error`, type: 'error', - networkIds: networkNames.map((n) => networks.find((network) => network.name === n)?.id), + networkNames, title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}` }; }); @@ -215,7 +219,7 @@ const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState id: 'defi-critical', type: 'error', title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(', ')}`, - networkIds: networkNamesWithUnknownCriticalError.map((n) => networks.find((network) => network.name === n)?.id) + networkNames: networkNamesWithUnknownCriticalError }); } if (networkNamesWithAssetPriceCriticalError.length) { @@ -223,7 +227,7 @@ const getNetworksWithDeFiPositionsErrorErrors = ({ networks, currentAccountState id: 'defi-prices', type: 'warning', title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(', ')}`, - networkIds: networkNamesWithAssetPriceCriticalError.map((n) => networks.find((network) => network.name === n)?.id) + networkNames: networkNamesWithAssetPriceCriticalError }); } return errors; diff --git a/dist/src/libs/selectedAccount/errors.js.map b/dist/src/libs/selectedAccount/errors.js.map index 16c0570b1..00c9f8c55 100644 --- a/dist/src/libs/selectedAccount/errors.js.map +++ b/dist/src/libs/selectedAccount/errors.js.map @@ -1 +1 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\n\nconst TEN_MINUTES = 10 * 60 * 1000\n\nexport type Action = {\n label: 'Select'\n actionName: 'select-rpc-url'\n meta: { network: Network }\n}\n\nexport type SelectedAccountBalanceError = {\n id: string\n networkIds: NetworkId[]\n type: 'error' | 'warning'\n title: string\n text?: string\n actions?: Action[]\n}\n\nexport const getNetworksWithFailedRPCErrors = ({\n providers,\n networks,\n networksWithAssets\n}: {\n providers: RPCProviders\n networks: Network[]\n networksWithAssets: AccountAssetsState\n}): SelectedAccountBalanceError[] => {\n const errors: SelectedAccountBalanceError[] = []\n const networkIds = getNetworksWithFailedRPC({ providers }).filter(\n (networkId) =>\n (Object.keys(networksWithAssets).includes(networkId) &&\n networksWithAssets[networkId] === true) ||\n !Object.keys(networksWithAssets).includes(networkId)\n )\n\n const networksData = networkIds.map((id) => networks.find((n: Network) => n.id === id)!)\n\n const allFailed = networksData.length === networks.length\n\n const networksWithMultipleRpcUrls = allFailed\n ? []\n : networksData.filter((n) => n?.rpcUrls?.length > 1)\n\n const networksToGroupInSingleBanner = allFailed\n ? networksData\n : networksData.filter((n) => n?.rpcUrls?.length <= 1)\n\n if (!networksData.length) return errors\n\n networksWithMultipleRpcUrls.forEach((n) => {\n errors.push({\n id: `custom-rpcs-down-${n.id}`,\n networkIds: [n.id],\n type: 'error',\n title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.',\n actions: [\n {\n label: 'Select',\n actionName: 'select-rpc-url',\n meta: { network: n }\n }\n ]\n })\n })\n\n if (!networksToGroupInSingleBanner.length) return errors\n\n errors.push({\n id: 'rpcs-down',\n networkIds: networksToGroupInSingleBanner.map((n) => n.id),\n type: 'error',\n title: `Failed to retrieve network data for ${networksToGroupInSingleBanner\n .map((n) => n.name)\n .join(', ')} (RPC malfunction)`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.'\n })\n\n return errors\n}\n\nconst addPortfolioError = (\n errors: SelectedAccountBalanceError[],\n networkId: NetworkId,\n newError: keyof typeof PORTFOLIO_LIB_ERROR_NAMES | 'portfolio-critical'\n) => {\n const newErrors = [...errors]\n const existingError = newErrors.find((error) => error.id === newError)\n\n if (existingError) {\n existingError.networkIds.push(networkId)\n } else {\n let title = ''\n let text = ''\n let type: 'error' | 'warning' = 'error'\n\n switch (newError) {\n case 'portfolio-critical':\n title = 'Failed to retrieve the portfolio data'\n text = 'Account balance and visible assets may be inaccurate.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError:\n title = 'Failed to retrieve prices'\n text = 'Account balance and asset prices may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'\n type = 'warning'\n break\n default:\n break\n }\n\n if (!title) return newErrors\n\n newErrors.push({\n id: newError,\n networkIds: [networkId],\n type,\n title,\n text\n })\n }\n\n return newErrors\n}\n\nexport const getNetworksWithPortfolioErrorErrors = ({\n networks,\n selectedAccountLatest,\n providers\n}: {\n networks: Network[]\n selectedAccountLatest: SelectedAccountPortfolioState\n providers: RPCProviders\n}): SelectedAccountBalanceError[] => {\n let errors: SelectedAccountBalanceError[] = []\n\n const portfolioLoading = Object.keys(selectedAccountLatest).some((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n\n return portfolioForNetwork?.isLoading\n })\n\n // Otherwise networks are appended to the banner one by one, which looks weird\n if (portfolioLoading) return []\n\n if (!Object.keys(selectedAccountLatest).length) return []\n\n Object.keys(selectedAccountLatest).forEach((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n const criticalError = portfolioForNetwork?.criticalError\n const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate\n\n // Don't display an error banner if the last successful update was less than 10 minutes ago\n if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES)\n return\n\n if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) return\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n // In case of additional networks don't check the RPC as there isn't one\n if (\n criticalError &&\n (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)\n ) {\n errors = addPortfolioError(errors, network, 'portfolio-critical')\n return\n }\n\n portfolioForNetwork?.errors.forEach((err: any) => {\n errors = addPortfolioError(errors, network, err.name)\n })\n })\n\n return errors.map(({ title, networkIds, ...rest }) => {\n const networkNames = networkIds.reduce((acc, id, index) => {\n let networkName = networks.find((n) => n.id === id)?.name\n const isLast = index === networkIds.length - 1\n const isOnly = networkIds.length === 1\n\n if (id === 'gasTank') networkName = 'Gas Tank'\n else if (id === 'rewards') networkName = 'Rewards'\n\n if (!networkName) return acc\n\n return `${acc}${networkName}${isLast || isOnly ? '' : ', '}`\n }, '')\n\n return {\n ...rest,\n title: `${title} on ${networkNames}`,\n networkIds\n }\n })\n}\n\nexport const getNetworksWithDeFiPositionsErrorErrors = ({\n networks,\n currentAccountState,\n providers,\n networksWithPositions\n}: {\n networks: Network[]\n currentAccountState: DefiPositionsAccountState\n providers: RPCProviders\n networksWithPositions: NetworksWithPositions\n}) => {\n const isLoading = Object.keys(currentAccountState).some((networkId) => {\n const networkState = currentAccountState[networkId]\n return networkState.isLoading\n })\n\n if (isLoading) return []\n\n const networkNamesWithUnknownCriticalError: string[] = []\n const networkNamesWithAssetPriceCriticalError: string[] = []\n const providersWithErrors: {\n [providerName: string]: string[]\n } = {}\n\n Object.keys(currentAccountState).forEach((networkId) => {\n const providersWithPositions = networksWithPositions[networkId]\n // Ignore networks that don't have positions\n // but ensure that we have a successful response stored (the network key is present)\n if (providersWithPositions && !providersWithPositions.length) return\n\n const networkState = currentAccountState[networkId]\n const network = networks.find((n) => n.id === networkId)\n const rpcProvider = providers[networkId]\n const lastSuccessfulUpdate = networkState.updatedAt\n\n if (\n !network ||\n !networkState ||\n (typeof lastSuccessfulUpdate === 'number' &&\n Date.now() - lastSuccessfulUpdate < TEN_MINUTES) ||\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)\n )\n return\n\n if (networkState.error) {\n if (networkState.error === DeFiPositionsError.AssetPriceError) {\n networkNamesWithAssetPriceCriticalError.push(network.name)\n } else if (networkState.error === DeFiPositionsError.CriticalError) {\n networkNamesWithUnknownCriticalError.push(network.name)\n }\n }\n\n const providerNamesWithErrors =\n networkState.providerErrors\n ?.filter(({ providerName }) => {\n // Display all errors if there hasn't been a successful update\n // for the network.\n if (!networksWithPositions[networkId]) return true\n // Exclude providers without positions\n return networksWithPositions[networkId].includes(providerName)\n })\n .map((e) => e.providerName) || []\n\n if (providerNamesWithErrors.length) {\n providerNamesWithErrors.forEach((providerName) => {\n if (!providersWithErrors[providerName]) providersWithErrors[providerName] = []\n\n providersWithErrors[providerName].push(network.name)\n })\n }\n })\n\n const providerErrors: SelectedAccountBalanceError[] = Object.entries(providersWithErrors).map(\n ([providerName, networkNames]) => {\n return {\n id: `${providerName}-defi-positions-error`,\n type: 'error',\n networkIds: networkNames.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n ),\n title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}`\n }\n }\n )\n\n const errors = providerErrors\n\n if (networkNamesWithUnknownCriticalError.length) {\n errors.push({\n id: 'defi-critical',\n type: 'error',\n title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithUnknownCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n if (networkNamesWithAssetPriceCriticalError.length) {\n errors.push({\n id: 'defi-prices',\n type: 'warning',\n title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(\n ', '\n )}`,\n networkIds: networkNamesWithAssetPriceCriticalError.map(\n (n) => networks.find((network) => network.name === n)?.id as NetworkId\n )\n })\n }\n\n return errors\n}\n"]} \ No newline at end of file +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Network, NetworkId } from '../../interfaces/network'\nimport { RPCProviders } from '../../interfaces/provider'\nimport { SelectedAccountPortfolioState } from '../../interfaces/selectedAccount'\nimport {\n AccountState as DefiPositionsAccountState,\n DeFiPositionsError,\n NetworksWithPositions\n} from '../defiPositions/types'\nimport { getNetworksWithFailedRPC } from '../networks/networks'\nimport { AccountAssetsState } from '../portfolio/interfaces'\nimport { PORTFOLIO_LIB_ERROR_NAMES } from '../portfolio/portfolio'\n\nconst TEN_MINUTES = 10 * 60 * 1000\n\nexport type Action = {\n label: 'Select'\n actionName: 'select-rpc-url'\n meta: { network: Network }\n}\n\nexport type SelectedAccountBalanceError = {\n id:\n | `custom-rpcs-down-${NetworkId}`\n | 'rpcs-down'\n | 'portfolio-critical'\n | 'loading-too-long'\n | 'defi-critical'\n | 'defi-prices'\n | `${string}-defi-positions-error`\n | keyof typeof PORTFOLIO_LIB_ERROR_NAMES\n networkNames: string[]\n type: 'error' | 'warning'\n title: string\n text?: string\n actions?: Action[]\n}\n\nexport const getNetworksWithFailedRPCErrors = ({\n providers,\n networks,\n networksWithAssets\n}: {\n providers: RPCProviders\n networks: Network[]\n networksWithAssets: AccountAssetsState\n}): SelectedAccountBalanceError[] => {\n const errors: SelectedAccountBalanceError[] = []\n const networkIds = getNetworksWithFailedRPC({ providers }).filter(\n (networkId) =>\n (Object.keys(networksWithAssets).includes(networkId) &&\n networksWithAssets[networkId] === true) ||\n !Object.keys(networksWithAssets).includes(networkId)\n )\n\n const networksData = networkIds.map((id) => networks.find((n: Network) => n.id === id)!)\n\n const allFailed = networksData.length === networks.length\n\n const networksWithMultipleRpcUrls = allFailed\n ? []\n : networksData.filter((n) => n?.rpcUrls?.length > 1)\n\n const networksToGroupInSingleBanner = allFailed\n ? networksData\n : networksData.filter((n) => n?.rpcUrls?.length <= 1)\n\n if (!networksData.length) return errors\n\n networksWithMultipleRpcUrls.forEach((n) => {\n errors.push({\n id: `custom-rpcs-down-${n.id}`,\n networkNames: [n.name],\n type: 'error',\n title: `Failed to retrieve network data for ${n.name}. You can try selecting another RPC URL`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.',\n actions: [\n {\n label: 'Select',\n actionName: 'select-rpc-url',\n meta: { network: n }\n }\n ]\n })\n })\n\n if (!networksToGroupInSingleBanner.length) return errors\n\n errors.push({\n id: 'rpcs-down',\n networkNames: networksToGroupInSingleBanner.map((n) => n.name),\n type: 'error',\n title: `Failed to retrieve network data for ${networksToGroupInSingleBanner\n .map((n) => n.name)\n .join(', ')} (RPC malfunction)`,\n text: 'Affected features: visible assets, DeFi positions, sign message/transaction, ENS/UD domain resolving, add account.'\n })\n\n return errors\n}\n\nconst addPortfolioError = (\n errors: SelectedAccountBalanceError[],\n networkName: string,\n newError: keyof typeof PORTFOLIO_LIB_ERROR_NAMES | 'portfolio-critical' | 'loading-too-long'\n) => {\n const newErrors = [...errors]\n const existingError = newErrors.find((error) => error.id === newError)\n\n if (existingError) {\n existingError.networkNames.push(networkName)\n } else {\n let title = ''\n let text = ''\n let type: 'error' | 'warning' = 'error'\n\n switch (newError) {\n case 'portfolio-critical':\n title = 'Failed to retrieve the portfolio data'\n text = 'Account balance and visible assets may be inaccurate.'\n break\n case 'loading-too-long':\n title = 'Loading is taking longer than expected'\n text = 'Account balance and visible assets may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.PriceFetchError:\n title = 'Failed to retrieve prices'\n text = 'Account balance and asset prices may be inaccurate.'\n type = 'warning'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.NoApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'Your funds are safe, but your portfolio will be inaccurate. You can add assets manually or wait for the issue to be resolved.'\n break\n case PORTFOLIO_LIB_ERROR_NAMES.StaleApiHintsError:\n title = 'Automatic asset discovery is temporarily unavailable'\n text =\n 'New assets may not be visible in your portfolio. You can add assets manually or wait for the issue to be resolved.'\n type = 'warning'\n break\n default:\n break\n }\n\n if (!title) return newErrors\n\n newErrors.push({\n id: newError,\n networkNames: [networkName],\n type,\n title,\n text\n })\n }\n\n return newErrors\n}\n\nexport const getNetworksWithPortfolioErrorErrors = ({\n networks,\n selectedAccountLatest,\n providers\n}: {\n networks: Network[]\n selectedAccountLatest: SelectedAccountPortfolioState\n providers: RPCProviders\n}): SelectedAccountBalanceError[] => {\n let errors: SelectedAccountBalanceError[] = []\n\n if (!Object.keys(selectedAccountLatest).length) return []\n\n Object.keys(selectedAccountLatest).forEach((network) => {\n const portfolioForNetwork = selectedAccountLatest[network]\n const criticalError = portfolioForNetwork?.criticalError\n const lastSuccessfulUpdate = portfolioForNetwork?.result?.lastSuccessfulUpdate\n let networkName = networks.find((n) => n.id === network)?.name\n\n if (network === 'gasTank') networkName = 'Gas Tank'\n else if (network === 'rewards') networkName = 'Rewards'\n\n if (!networkName) {\n console.error(\n 'Network name not found for network in getNetworksWithPortfolioErrorErrors',\n network\n )\n return\n }\n\n if (portfolioForNetwork?.isLoading) {\n errors = addPortfolioError(errors, networkName, 'loading-too-long')\n return\n }\n\n // Don't display an error banner if the last successful update was less than 10 minutes ago\n if (typeof lastSuccessfulUpdate === 'number' && Date.now() - lastSuccessfulUpdate < TEN_MINUTES)\n return\n\n if (!portfolioForNetwork || !network || portfolioForNetwork.isLoading) return\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n // In case of additional networks don't check the RPC as there isn't one\n if (\n criticalError &&\n (['gasTank', 'rewards'].includes(network) || providers[network]?.isWorking)\n ) {\n errors = addPortfolioError(errors, networkName, 'portfolio-critical')\n return\n }\n\n portfolioForNetwork?.errors.forEach((err: any) => {\n errors = addPortfolioError(errors, networkName as string, err.name)\n })\n })\n\n return errors.map(({ title, networkNames, ...rest }) => {\n const networkNamesString = networkNames.reduce((acc, name, index) => {\n const isLast = index === networkNames.length - 1\n const isOnly = networkNames.length === 1\n\n return `${acc}${name}${isLast || isOnly ? '' : ', '}`\n }, '')\n\n return {\n ...rest,\n title: `${title} on ${networkNamesString}`,\n networkNames\n }\n })\n}\n\nexport const getNetworksWithDeFiPositionsErrorErrors = ({\n networks,\n currentAccountState,\n providers,\n networksWithPositions\n}: {\n networks: Network[]\n currentAccountState: DefiPositionsAccountState\n providers: RPCProviders\n networksWithPositions: NetworksWithPositions\n}) => {\n const isLoading = Object.keys(currentAccountState).some((networkId) => {\n const networkState = currentAccountState[networkId]\n return networkState.isLoading\n })\n\n if (isLoading) return []\n\n const networkNamesWithUnknownCriticalError: string[] = []\n const networkNamesWithAssetPriceCriticalError: string[] = []\n const providersWithErrors: {\n [providerName: string]: string[]\n } = {}\n\n Object.keys(currentAccountState).forEach((networkId) => {\n const providersWithPositions = networksWithPositions[networkId]\n // Ignore networks that don't have positions\n // but ensure that we have a successful response stored (the network key is present)\n if (providersWithPositions && !providersWithPositions.length) return\n\n const networkState = currentAccountState[networkId]\n const network = networks.find((n) => n.id === networkId)\n const rpcProvider = providers[networkId]\n const lastSuccessfulUpdate = networkState.updatedAt\n\n if (\n !network ||\n !networkState ||\n (typeof lastSuccessfulUpdate === 'number' &&\n Date.now() - lastSuccessfulUpdate < TEN_MINUTES) ||\n // Don't display an error banner if the RPC isn't working because an RPC error banner is already displayed.\n (typeof rpcProvider.isWorking === 'boolean' && !rpcProvider.isWorking)\n )\n return\n\n if (networkState.error) {\n if (networkState.error === DeFiPositionsError.AssetPriceError) {\n networkNamesWithAssetPriceCriticalError.push(network.name)\n } else if (networkState.error === DeFiPositionsError.CriticalError) {\n networkNamesWithUnknownCriticalError.push(network.name)\n }\n }\n\n const providerNamesWithErrors =\n networkState.providerErrors\n ?.filter(({ providerName }) => {\n // Display all errors if there hasn't been a successful update\n // for the network.\n if (!networksWithPositions[networkId]) return true\n // Exclude providers without positions\n return networksWithPositions[networkId].includes(providerName)\n })\n .map((e) => e.providerName) || []\n\n if (providerNamesWithErrors.length) {\n providerNamesWithErrors.forEach((providerName) => {\n if (!providersWithErrors[providerName]) providersWithErrors[providerName] = []\n\n providersWithErrors[providerName].push(network.name)\n })\n }\n })\n\n const providerErrors: SelectedAccountBalanceError[] = Object.entries(providersWithErrors).map(\n ([providerName, networkNames]) => {\n return {\n id: `${providerName}-defi-positions-error`,\n type: 'error',\n networkNames,\n title: `Failed to retrieve DeFi positions for ${providerName} on ${networkNames.join(', ')}`\n }\n }\n )\n\n const errors = providerErrors\n\n if (networkNamesWithUnknownCriticalError.length) {\n errors.push({\n id: 'defi-critical',\n type: 'error',\n title: `Failed to retrieve DeFi positions on ${networkNamesWithUnknownCriticalError.join(\n ', '\n )}`,\n networkNames: networkNamesWithUnknownCriticalError\n })\n }\n if (networkNamesWithAssetPriceCriticalError.length) {\n errors.push({\n id: 'defi-prices',\n type: 'warning',\n title: `Failed to retrieve asset prices for DeFi positions on ${networkNamesWithAssetPriceCriticalError.join(\n ', '\n )}`,\n networkNames: networkNamesWithAssetPriceCriticalError\n })\n }\n\n return errors\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.d.ts b/dist/src/libs/selectedAccount/selectedAccount.d.ts index 3cbaa4415..172a0aec8 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.d.ts +++ b/dist/src/libs/selectedAccount/selectedAccount.d.ts @@ -3,5 +3,5 @@ import { AccountState as DefiPositionsAccountState } from '../defiPositions/type import { AccountState, NetworkState } from '../portfolio/interfaces'; export declare const updatePortfolioStateWithDefiPositions: (portfolioAccountState: AccountState, defiPositionsAccountState: DefiPositionsAccountState, areDefiPositionsLoading: boolean) => AccountState; export declare const isNetworkReady: (networkData: NetworkState | undefined) => boolean | undefined; -export declare function calculateSelectedAccountPortfolio(latestStateSelectedAccount: AccountState, pendingStateSelectedAccount: AccountState, accountPortfolio: SelectedAccountPortfolio | null, hasSignAccountOp?: boolean): SelectedAccountPortfolio; +export declare function calculateSelectedAccountPortfolio(latestStateSelectedAccount: AccountState, pendingStateSelectedAccount: AccountState, accountPortfolio: SelectedAccountPortfolio | null, portfolioStartedLoadingAtTimestamp: number | null, defiPositionsAccountState: DefiPositionsAccountState, hasSignAccountOp?: boolean): SelectedAccountPortfolio; //# sourceMappingURL=selectedAccount.d.ts.map \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.d.ts.map b/dist/src/libs/selectedAccount/selectedAccount.d.ts.map index b4e888530..e12589233 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.d.ts.map +++ b/dist/src/libs/selectedAccount/selectedAccount.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EAGzB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,YAAY,IAAI,yBAAyB,EAG1C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,YAAY,EAGZ,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,qCAAqC,0BACzB,YAAY,6BACR,yBAAyB,2BAC3B,OAAO,iBA+FjC,CAAA;AA2BD,eAAO,MAAM,cAAc,gBAAiB,YAAY,GAAG,SAAS,wBAInE,CAAA;AAoCD,wBAAgB,iCAAiC,CAC/C,0BAA0B,EAAE,YAAY,EACxC,2BAA2B,EAAE,YAAY,EACzC,gBAAgB,EAAE,wBAAwB,GAAG,IAAI,EACjD,gBAAgB,CAAC,EAAE,OAAO,4BAkG3B"} \ No newline at end of file +{"version":3,"file":"selectedAccount.d.ts","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAGzB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,YAAY,IAAI,yBAAyB,EAG1C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,YAAY,EAGZ,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,qCAAqC,0BACzB,YAAY,6BACR,yBAAyB,2BAC3B,OAAO,iBA2GjC,CAAA;AA2BD,eAAO,MAAM,cAAc,gBAAiB,YAAY,GAAG,SAAS,wBAInE,CAAA;AAoCD,wBAAgB,iCAAiC,CAC/C,0BAA0B,EAAE,YAAY,EACxC,2BAA2B,EAAE,YAAY,EACzC,gBAAgB,EAAE,wBAAwB,GAAG,IAAI,EACjD,kCAAkC,EAAE,MAAM,GAAG,IAAI,EACjD,yBAAyB,EAAE,yBAAyB,EACpD,gBAAgB,CAAC,EAAE,OAAO,4BAgH3B"} \ No newline at end of file diff --git a/dist/src/libs/selectedAccount/selectedAccount.js b/dist/src/libs/selectedAccount/selectedAccount.js index 56064ab20..ff8ee980a 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.js +++ b/dist/src/libs/selectedAccount/selectedAccount.js @@ -1,7 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateSelectedAccountPortfolio = exports.isNetworkReady = exports.updatePortfolioStateWithDefiPositions = void 0; -const ethers_1 = require("ethers"); const formatters_1 = require("../../utils/numbers/formatters"); const types_1 = require("../defiPositions/types"); const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositionsAccountState, areDefiPositionsLoading) => { @@ -11,7 +10,7 @@ const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositi const networkState = portfolioAccountState[networkId]; if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return; - let tokens = networkState.result.tokens || []; + const tokens = networkState.result.tokens || []; let networkBalance = networkState.result.total?.usd || 0; const positions = defiPositionsAccountState[networkId] || {}; positions.positionsByProvider?.forEach((posByProv) => { @@ -23,42 +22,53 @@ const updatePortfolioStateWithDefiPositions = (portfolioAccountState, defiPositi pos.assets .filter((a) => a.type !== types_1.AssetType.Liquidity && a.protocolAsset) .forEach((a) => { - const tokenInPortfolioIndex = tokens.findIndex((t) => { - return ((0, ethers_1.getAddress)(t.address) === (0, ethers_1.getAddress)(a.protocolAsset.address) && - t.networkId === networkId); + const tokenInPortfolio = tokens.find((t) => { + return (t.address.toLowerCase() === (a.protocolAsset?.address || '').toLowerCase() && + t.networkId === networkId && + !t.flags.rewardsType && + !t.flags.onGasTank); }); - if (tokenInPortfolioIndex !== -1) { - const tokenInPortfolio = tokens[tokenInPortfolioIndex]; - const priceUSD = tokenInPortfolio.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; - const tokenBalanceUSD = priceUSD - ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(tokenInPortfolio.amount), tokenInPortfolio.decimals, priceUSD)) - : undefined; - networkBalance -= tokenBalanceUSD || 0; // deduct portfolio token balance - tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex); - } + if (tokenInPortfolio?.flags.isHidden) + return; // Add only the balance of the collateral tokens to the network balance if (a.type === types_1.AssetType.Collateral) { const protocolPriceUSD = a.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; const protocolTokenBalanceUSD = protocolPriceUSD - ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(a.amount), Number(a.protocolAsset.decimals), protocolPriceUSD)) + ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(tokenInPortfolio?.amountPostSimulation || a.amount), Number(a.protocolAsset.decimals), protocolPriceUSD)) : undefined; networkBalance += protocolTokenBalanceUSD || 0; } - tokens.push({ - amount: a.amount, - // Only list the borrowed asset with no price - priceIn: a.type === types_1.AssetType.Collateral ? a.priceIn : [], - decimals: Number(a.protocolAsset.decimals), - address: a.protocolAsset.address, - symbol: a.protocolAsset.symbol, - networkId, - flags: { - canTopUpGasTank: false, - isFeeToken: false, - onGasTank: false, - rewardsType: null - } - }); + if (tokenInPortfolio) { + const priceUSD = tokenInPortfolio.priceIn.find(({ baseCurrency }) => baseCurrency.toLowerCase() === 'usd')?.price; + const tokenBalanceUSD = priceUSD + ? Number((0, formatters_1.safeTokenAmountAndNumberMultiplication)(BigInt(tokenInPortfolio.amountPostSimulation || tokenInPortfolio.amount), tokenInPortfolio.decimals, priceUSD)) + : undefined; + networkBalance -= tokenBalanceUSD || 0; // deduct portfolio token balance + // Get the price from defiPositions + tokenInPortfolio.priceIn = a.type === types_1.AssetType.Collateral ? a.priceIn : []; + } + else { + const positionAsset = { + amount: a.amount, + // Only list the borrowed asset with no price + priceIn: a.type === types_1.AssetType.Collateral ? a.priceIn : [], + decimals: Number(a.protocolAsset.decimals), + address: a.protocolAsset.address, + symbol: a.protocolAsset.symbol, + networkId, + flags: { + canTopUpGasTank: false, + isFeeToken: false, + onGasTank: false, + rewardsType: null, + isDefiToken: true + // @BUG: defi positions tokens can't be hidden and can be added as custom + // because processTokens is called in the portfolio + // Issue: https://github.com/AmbireTech/ambire-app/issues/3971 + } + }; + tokens.push(positionAsset); + } }); }); }); @@ -119,18 +129,22 @@ const calculateTokenArray = (networkId, latestTokens, pendingTokens, isPendingVa }; }); }; -function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingStateSelectedAccount, accountPortfolio, hasSignAccountOp) { +function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingStateSelectedAccount, accountPortfolio, portfolioStartedLoadingAtTimestamp, defiPositionsAccountState, hasSignAccountOp) { + const now = Date.now(); + const shouldShowPartialResult = portfolioStartedLoadingAtTimestamp && now - portfolioStartedLoadingAtTimestamp > 5000; const collections = []; const tokens = []; let newTotalBalance = 0; const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length; - let allReady = !!hasLatest; + let isAllReady = !!hasLatest; + let isReadyToVisualize = false; const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length; if (!hasLatest && !hasPending) { return { tokens: accountPortfolio?.tokens || [], collections: accountPortfolio?.collections || [], totalBalance: accountPortfolio?.totalBalance || 0, + isReadyToVisualize: false, isAllReady: false, networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {}, latest: latestStateSelectedAccount, @@ -180,15 +194,22 @@ function calculateSelectedAccountPortfolio(latestStateSelectedAccount, pendingSt tokens.push(...tokensArray); collections.push(...networkCollections); } - if (!(0, exports.isNetworkReady)(networkData)) { - allReady = false; + // The total balance and token list are affected by the defi positions + if (!(0, exports.isNetworkReady)(networkData) || defiPositionsAccountState[network]?.isLoading) { + isAllReady = false; } }); + const tokensWithAmount = tokens.filter((token) => token.amount); + if ((shouldShowPartialResult && tokensWithAmount.length && !isAllReady) || isAllReady) { + // Allow the user to operate with the tokens that have loaded + isReadyToVisualize = true; + } return { totalBalance: newTotalBalance, tokens, collections, - isAllReady: allReady, + isReadyToVisualize, + isAllReady, networkSimulatedAccountOp: simulatedAccountOps, latest: stripPortfolioState(latestStateSelectedAccount), pending: stripPortfolioState(pendingStateSelectedAccount) diff --git a/dist/src/libs/selectedAccount/selectedAccount.js.map b/dist/src/libs/selectedAccount/selectedAccount.js.map index 7a222dfd9..6578b9122 100644 --- a/dist/src/libs/selectedAccount/selectedAccount.js.map +++ b/dist/src/libs/selectedAccount/selectedAccount.js.map @@ -1 +1 @@ -{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport {\n SelectedAccountPortfolio,\n SelectedAccountPortfolioState,\n SelectedAccountPortfolioTokenResult\n} from '../../interfaces/selectedAccount'\nimport { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport {\n AccountState as DefiPositionsAccountState,\n AssetType,\n PositionsByProvider\n} from '../defiPositions/types'\nimport {\n AccountState,\n CollectionResult,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult\n} from '../portfolio/interfaces'\n\nexport const updatePortfolioStateWithDefiPositions = (\n portfolioAccountState: AccountState,\n defiPositionsAccountState: DefiPositionsAccountState,\n areDefiPositionsLoading: boolean\n) => {\n if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading)\n return portfolioAccountState\n\n Object.keys(portfolioAccountState).forEach((networkId) => {\n const networkState = portfolioAccountState[networkId]\n\n if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return\n\n let tokens = networkState.result.tokens || []\n let networkBalance = networkState.result.total?.usd || 0\n\n const positions = defiPositionsAccountState[networkId] || {}\n\n positions.positionsByProvider?.forEach((posByProv: PositionsByProvider) => {\n if (posByProv.type === 'liquidity-pool') {\n networkBalance += posByProv.positionInUSD || 0\n return\n }\n\n posByProv.positions.forEach((pos) => {\n pos.assets\n .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset)\n .forEach((a) => {\n const tokenInPortfolioIndex = tokens.findIndex((t) => {\n return (\n getAddress(t.address) === getAddress(a.protocolAsset!.address) &&\n t.networkId === networkId\n )\n })\n\n if (tokenInPortfolioIndex !== -1) {\n const tokenInPortfolio = tokens[tokenInPortfolioIndex]\n const priceUSD = tokenInPortfolio.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n const tokenBalanceUSD = priceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio.amount),\n tokenInPortfolio.decimals,\n priceUSD\n )\n )\n : undefined\n\n networkBalance -= tokenBalanceUSD || 0 // deduct portfolio token balance\n tokens = tokens.filter((_, index) => index !== tokenInPortfolioIndex)\n }\n\n // Add only the balance of the collateral tokens to the network balance\n if (a.type === AssetType.Collateral) {\n const protocolPriceUSD = a.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const protocolTokenBalanceUSD = protocolPriceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(a.amount),\n Number(a.protocolAsset!.decimals),\n protocolPriceUSD\n )\n )\n : undefined\n\n networkBalance += protocolTokenBalanceUSD || 0\n }\n tokens.push({\n amount: a.amount,\n // Only list the borrowed asset with no price\n priceIn: a.type === AssetType.Collateral ? a.priceIn : [],\n decimals: Number(a.protocolAsset!.decimals),\n address: a.protocolAsset!.address,\n symbol: a.protocolAsset!.symbol,\n networkId,\n flags: {\n canTopUpGasTank: false,\n isFeeToken: false,\n onGasTank: false,\n rewardsType: null\n }\n })\n })\n })\n })\n\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.total.usd = networkBalance\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.tokens = tokens\n })\n\n return portfolioAccountState\n}\n\nconst stripPortfolioState = (portfolioState: AccountState) => {\n const strippedState: SelectedAccountPortfolioState = {}\n\n Object.keys(portfolioState).forEach((networkId) => {\n const networkState = portfolioState[networkId]\n if (!networkState) return\n\n if (!networkState.result) {\n strippedState[networkId] = networkState\n return\n }\n\n // A trick to exclude specific keys\n const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } =\n networkState.result\n\n strippedState[networkId] = {\n ...networkState,\n result\n }\n })\n\n return strippedState\n}\n\nexport const isNetworkReady = (networkData: NetworkState | undefined) => {\n return (\n networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading\n )\n}\n\nconst calculateTokenArray = (\n networkId: string,\n latestTokens: TokenResult[],\n pendingTokens: TokenResult[],\n isPendingValid: boolean\n) => {\n if (networkId === 'gasTank' || networkId === 'rewards') {\n return latestTokens\n }\n // If the pending state is older or there are no pending tokens\n // we shouldn't trust it to build the tokens array\n if (isPendingValid && pendingTokens.length) {\n return pendingTokens.map((pendingToken) => {\n const latestToken = latestTokens.find((latest) => {\n return latest.address === pendingToken.address\n })\n\n return {\n ...pendingToken,\n latestAmount: latestToken?.amount,\n pendingAmount: pendingToken.amount\n }\n })\n }\n\n // Add only latestAmount to the tokens\n return latestTokens.map((token) => {\n return {\n ...token,\n latestAmount: token.amount\n }\n })\n}\n\nexport function calculateSelectedAccountPortfolio(\n latestStateSelectedAccount: AccountState,\n pendingStateSelectedAccount: AccountState,\n accountPortfolio: SelectedAccountPortfolio | null,\n hasSignAccountOp?: boolean\n) {\n const collections: CollectionResult[] = []\n const tokens: SelectedAccountPortfolioTokenResult[] = []\n\n let newTotalBalance: number = 0\n\n const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length\n let allReady = !!hasLatest\n\n const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length\n if (!hasLatest && !hasPending) {\n return {\n tokens: accountPortfolio?.tokens || [],\n collections: accountPortfolio?.collections || [],\n totalBalance: accountPortfolio?.totalBalance || 0,\n isAllReady: false,\n networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {},\n latest: latestStateSelectedAccount,\n pending: pendingStateSelectedAccount\n } as SelectedAccountPortfolio\n }\n\n let selectedAccountData = latestStateSelectedAccount\n\n /**\n * Replaces the latest state if the following conditions are true:\n * - There is no critical error in the pending state.\n * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation).\n */\n const validSelectedAccountPendingState: AccountState = {}\n const simulatedAccountOps: NetworkSimulatedAccountOp = {}\n\n Object.keys(pendingStateSelectedAccount).forEach((network) => {\n const pendingNetworkData = pendingStateSelectedAccount[network]\n const latestNetworkData = latestStateSelectedAccount[network]\n\n // Compare the block numbers to determine if the pending state is newer\n if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) {\n const isPendingNewer =\n pendingNetworkData.result.blockNumber! >= latestNetworkData.result.blockNumber!\n\n if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) {\n validSelectedAccountPendingState[network] = pendingNetworkData\n }\n }\n\n // Store the simulated account op\n const accountOp = pendingNetworkData?.accountOps?.[0]\n\n if (accountOp) {\n simulatedAccountOps[network] = accountOp\n }\n })\n\n if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) {\n selectedAccountData = {\n ...selectedAccountData,\n ...validSelectedAccountPendingState\n }\n }\n\n Object.keys(selectedAccountData).forEach((network: string) => {\n const networkData = selectedAccountData[network]\n const result = networkData?.result\n if (networkData && isNetworkReady(networkData) && result) {\n const networkTotal = Number(result?.total?.usd) || 0\n newTotalBalance += networkTotal\n\n const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []\n const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []\n const networkCollections = result?.collections || []\n\n const tokensArray = calculateTokenArray(\n network,\n latestTokens,\n pendingTokens,\n !!validSelectedAccountPendingState[network]\n )\n\n tokens.push(...tokensArray)\n collections.push(...networkCollections)\n }\n\n if (!isNetworkReady(networkData)) {\n allReady = false\n }\n })\n\n return {\n totalBalance: newTotalBalance,\n tokens,\n collections,\n isAllReady: allReady,\n networkSimulatedAccountOp: simulatedAccountOps,\n latest: stripPortfolioState(latestStateSelectedAccount),\n pending: stripPortfolioState(pendingStateSelectedAccount)\n } as SelectedAccountPortfolio\n}\n"]} \ No newline at end of file +{"version":3,"file":"selectedAccount.js","sourceRoot":"","sources":["../../../../src/libs/selectedAccount/selectedAccount.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SelectedAccountPortfolio,\n SelectedAccountPortfolioState,\n SelectedAccountPortfolioTokenResult\n} from '../../interfaces/selectedAccount'\nimport { safeTokenAmountAndNumberMultiplication } from '../../utils/numbers/formatters'\nimport {\n AccountState as DefiPositionsAccountState,\n AssetType,\n PositionsByProvider\n} from '../defiPositions/types'\nimport {\n AccountState,\n CollectionResult,\n NetworkSimulatedAccountOp,\n NetworkState,\n TokenResult\n} from '../portfolio/interfaces'\n\nexport const updatePortfolioStateWithDefiPositions = (\n portfolioAccountState: AccountState,\n defiPositionsAccountState: DefiPositionsAccountState,\n areDefiPositionsLoading: boolean\n) => {\n if (!portfolioAccountState || !defiPositionsAccountState || areDefiPositionsLoading)\n return portfolioAccountState\n\n Object.keys(portfolioAccountState).forEach((networkId) => {\n const networkState = portfolioAccountState[networkId]\n\n if (!networkState?.result || defiPositionsAccountState[networkId]?.isLoading) return\n\n const tokens = networkState.result.tokens || []\n let networkBalance = networkState.result.total?.usd || 0\n\n const positions = defiPositionsAccountState[networkId] || {}\n\n positions.positionsByProvider?.forEach((posByProv: PositionsByProvider) => {\n if (posByProv.type === 'liquidity-pool') {\n networkBalance += posByProv.positionInUSD || 0\n return\n }\n\n posByProv.positions.forEach((pos) => {\n pos.assets\n .filter((a) => a.type !== AssetType.Liquidity && a.protocolAsset)\n .forEach((a) => {\n const tokenInPortfolio = tokens.find((t) => {\n return (\n t.address.toLowerCase() === (a.protocolAsset?.address || '').toLowerCase() &&\n t.networkId === networkId &&\n !t.flags.rewardsType &&\n !t.flags.onGasTank\n )\n })\n\n if (tokenInPortfolio?.flags.isHidden) return\n\n // Add only the balance of the collateral tokens to the network balance\n if (a.type === AssetType.Collateral) {\n const protocolPriceUSD = a.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const protocolTokenBalanceUSD = protocolPriceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio?.amountPostSimulation || a.amount),\n Number(a.protocolAsset!.decimals),\n protocolPriceUSD\n )\n )\n : undefined\n\n networkBalance += protocolTokenBalanceUSD || 0\n }\n\n if (tokenInPortfolio) {\n const priceUSD = tokenInPortfolio.priceIn.find(\n ({ baseCurrency }: { baseCurrency: string }) => baseCurrency.toLowerCase() === 'usd'\n )?.price\n\n const tokenBalanceUSD = priceUSD\n ? Number(\n safeTokenAmountAndNumberMultiplication(\n BigInt(tokenInPortfolio.amountPostSimulation || tokenInPortfolio.amount),\n tokenInPortfolio.decimals,\n priceUSD\n )\n )\n : undefined\n\n networkBalance -= tokenBalanceUSD || 0 // deduct portfolio token balance\n // Get the price from defiPositions\n tokenInPortfolio.priceIn = a.type === AssetType.Collateral ? a.priceIn : []\n } else {\n const positionAsset: TokenResult = {\n amount: a.amount,\n // Only list the borrowed asset with no price\n priceIn: a.type === AssetType.Collateral ? a.priceIn : [],\n decimals: Number(a.protocolAsset!.decimals),\n address: a.protocolAsset!.address,\n symbol: a.protocolAsset!.symbol,\n networkId,\n flags: {\n canTopUpGasTank: false,\n isFeeToken: false,\n onGasTank: false,\n rewardsType: null,\n isDefiToken: true\n // @BUG: defi positions tokens can't be hidden and can be added as custom\n // because processTokens is called in the portfolio\n // Issue: https://github.com/AmbireTech/ambire-app/issues/3971\n }\n }\n\n tokens.push(positionAsset)\n }\n })\n })\n })\n\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.total.usd = networkBalance\n // eslint-disable-next-line no-param-reassign\n portfolioAccountState[networkId]!.result!.tokens = tokens\n })\n\n return portfolioAccountState\n}\n\nconst stripPortfolioState = (portfolioState: AccountState) => {\n const strippedState: SelectedAccountPortfolioState = {}\n\n Object.keys(portfolioState).forEach((networkId) => {\n const networkState = portfolioState[networkId]\n if (!networkState) return\n\n if (!networkState.result) {\n strippedState[networkId] = networkState\n return\n }\n\n // A trick to exclude specific keys\n const { tokens, collections, tokenErrors, priceCache, hintsFromExternalAPI, ...result } =\n networkState.result\n\n strippedState[networkId] = {\n ...networkState,\n result\n }\n })\n\n return strippedState\n}\n\nexport const isNetworkReady = (networkData: NetworkState | undefined) => {\n return (\n networkData && (networkData.isReady || networkData?.criticalError) && !networkData.isLoading\n )\n}\n\nconst calculateTokenArray = (\n networkId: string,\n latestTokens: TokenResult[],\n pendingTokens: TokenResult[],\n isPendingValid: boolean\n) => {\n if (networkId === 'gasTank' || networkId === 'rewards') {\n return latestTokens\n }\n // If the pending state is older or there are no pending tokens\n // we shouldn't trust it to build the tokens array\n if (isPendingValid && pendingTokens.length) {\n return pendingTokens.map((pendingToken) => {\n const latestToken = latestTokens.find((latest) => {\n return latest.address === pendingToken.address\n })\n\n return {\n ...pendingToken,\n latestAmount: latestToken?.amount,\n pendingAmount: pendingToken.amount\n }\n })\n }\n\n // Add only latestAmount to the tokens\n return latestTokens.map((token) => {\n return {\n ...token,\n latestAmount: token.amount\n }\n })\n}\n\nexport function calculateSelectedAccountPortfolio(\n latestStateSelectedAccount: AccountState,\n pendingStateSelectedAccount: AccountState,\n accountPortfolio: SelectedAccountPortfolio | null,\n portfolioStartedLoadingAtTimestamp: number | null,\n defiPositionsAccountState: DefiPositionsAccountState,\n hasSignAccountOp?: boolean\n) {\n const now = Date.now()\n const shouldShowPartialResult =\n portfolioStartedLoadingAtTimestamp && now - portfolioStartedLoadingAtTimestamp > 5000\n const collections: CollectionResult[] = []\n const tokens: SelectedAccountPortfolioTokenResult[] = []\n\n let newTotalBalance: number = 0\n\n const hasLatest = latestStateSelectedAccount && Object.keys(latestStateSelectedAccount).length\n let isAllReady = !!hasLatest\n let isReadyToVisualize = false\n\n const hasPending = pendingStateSelectedAccount && Object.keys(pendingStateSelectedAccount).length\n if (!hasLatest && !hasPending) {\n return {\n tokens: accountPortfolio?.tokens || [],\n collections: accountPortfolio?.collections || [],\n totalBalance: accountPortfolio?.totalBalance || 0,\n isReadyToVisualize: false,\n isAllReady: false,\n networkSimulatedAccountOp: accountPortfolio?.networkSimulatedAccountOp || {},\n latest: latestStateSelectedAccount,\n pending: pendingStateSelectedAccount\n } as SelectedAccountPortfolio\n }\n\n let selectedAccountData = latestStateSelectedAccount\n\n /**\n * Replaces the latest state if the following conditions are true:\n * - There is no critical error in the pending state.\n * - The pending block number is newer than the latest OR we have a signed acc op (because of simulation).\n */\n const validSelectedAccountPendingState: AccountState = {}\n const simulatedAccountOps: NetworkSimulatedAccountOp = {}\n\n Object.keys(pendingStateSelectedAccount).forEach((network) => {\n const pendingNetworkData = pendingStateSelectedAccount[network]\n const latestNetworkData = latestStateSelectedAccount[network]\n\n // Compare the block numbers to determine if the pending state is newer\n if (latestNetworkData?.result?.blockNumber && pendingNetworkData?.result?.blockNumber) {\n const isPendingNewer =\n pendingNetworkData.result.blockNumber! >= latestNetworkData.result.blockNumber!\n\n if (!pendingNetworkData.criticalError && (isPendingNewer || hasSignAccountOp)) {\n validSelectedAccountPendingState[network] = pendingNetworkData\n }\n }\n\n // Store the simulated account op\n const accountOp = pendingNetworkData?.accountOps?.[0]\n\n if (accountOp) {\n simulatedAccountOps[network] = accountOp\n }\n })\n\n if (hasPending && Object.keys(validSelectedAccountPendingState).length > 0) {\n selectedAccountData = {\n ...selectedAccountData,\n ...validSelectedAccountPendingState\n }\n }\n\n Object.keys(selectedAccountData).forEach((network: string) => {\n const networkData = selectedAccountData[network]\n const result = networkData?.result\n if (networkData && isNetworkReady(networkData) && result) {\n const networkTotal = Number(result?.total?.usd) || 0\n newTotalBalance += networkTotal\n\n const latestTokens = latestStateSelectedAccount[network]?.result?.tokens || []\n const pendingTokens = pendingStateSelectedAccount[network]?.result?.tokens || []\n const networkCollections = result?.collections || []\n\n const tokensArray = calculateTokenArray(\n network,\n latestTokens,\n pendingTokens,\n !!validSelectedAccountPendingState[network]\n )\n\n tokens.push(...tokensArray)\n collections.push(...networkCollections)\n }\n\n // The total balance and token list are affected by the defi positions\n if (!isNetworkReady(networkData) || defiPositionsAccountState[network]?.isLoading) {\n isAllReady = false\n }\n })\n\n const tokensWithAmount = tokens.filter((token) => token.amount)\n\n if ((shouldShowPartialResult && tokensWithAmount.length && !isAllReady) || isAllReady) {\n // Allow the user to operate with the tokens that have loaded\n isReadyToVisualize = true\n }\n\n return {\n totalBalance: newTotalBalance,\n tokens,\n collections,\n isReadyToVisualize,\n isAllReady,\n networkSimulatedAccountOp: simulatedAccountOps,\n latest: stripPortfolioState(latestStateSelectedAccount),\n pending: stripPortfolioState(pendingStateSelectedAccount)\n } as SelectedAccountPortfolio\n}\n"]} \ No newline at end of file diff --git a/dist/src/libs/swapAndBridge/swapAndBridge.d.ts b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts index affff8338..91e10f4c5 100644 --- a/dist/src/libs/swapAndBridge/swapAndBridge.d.ts +++ b/dist/src/libs/swapAndBridge/swapAndBridge.d.ts @@ -14,7 +14,7 @@ export declare const getIsTokenEligibleForSwapAndBridge: (token: TokenResult) => export declare const convertPortfolioTokenToSocketAPIToken: (portfolioToken: TokenResult, chainId: number) => SocketAPIToken; declare const getQuoteRouteSteps: (userTxs: SocketAPIUserTx[]) => SocketAPIStep[]; declare const getActiveRoutesLowestServiceTime: (activeRoutes: ActiveRoute[]) => number; -declare const getActiveRoutesUpdateInterval: (minServiceTime?: number) => 5000 | 8000 | 15000 | 6000 | 7000 | 12000; +declare const getActiveRoutesUpdateInterval: (minServiceTime?: number) => 5000 | 8000 | 15000 | 7000 | 6000 | 12000; declare const buildSwapAndBridgeUserRequests: (userTx: SocketAPISendTransactionRequest, networkId: string, account: Account, provider: RPCProvider) => Promise; export declare const getIsBridgeTxn: (userTxType: SocketAPIUserTx['userTxType']) => boolean; /** diff --git a/dist/src/services/bundlers/bundler.js b/dist/src/services/bundlers/bundler.js index fc59afbc7..639b81b4f 100644 --- a/dist/src/services/bundlers/bundler.js +++ b/dist/src/services/bundlers/bundler.js @@ -40,7 +40,7 @@ class Bundler { [userOperation.sender]: { stateDiff: { // add privileges to the entry point - [`0x${(0, deploy_2.privSlot)(0, 'address', deploy_1.ERC_4337_ENTRYPOINT, 'bytes32')}`]: deploy_1.ENTRY_POINT_MARKER + [(0, deploy_2.privSlot)(0, 'uint256', deploy_1.ERC_4337_ENTRYPOINT, 'uint256')]: deploy_1.ENTRY_POINT_MARKER } } } diff --git a/dist/src/services/bundlers/bundler.js.map b/dist/src/services/bundlers/bundler.js.map index 9fb924f09..31c631ca2 100644 --- a/dist/src/services/bundlers/bundler.js.map +++ b/dist/src/services/bundlers/bundler.js.map @@ -1 +1 @@ -{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable class-methods-use-this */\nimport { toBeHex } from 'ethers'\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { decodeError } from '../../libs/errorDecoder'\nimport { BundlerError } from '../../libs/errorDecoder/customErrors'\nimport { DecodedError } from '../../libs/errorDecoder/types'\nimport { BundlerEstimateResult } from '../../libs/estimate/interfaces'\nimport { privSlot } from '../../libs/proxyDeploy/deploy'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { getCleanUserOp } from '../../libs/userOperation/userOperation'\nimport { getRpcProvider } from '../provider'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nrequire('dotenv').config()\n\nfunction addExtra(gasInWei: bigint, percentageIncrease: bigint): Hex {\n const percent = 100n / percentageIncrease\n return toBeHex(gasInWei + gasInWei / percent) as Hex\n}\n\nexport abstract class Bundler {\n /**\n * The default pollWaitTime. This is used to determine\n * how many milliseconds to wait until before another request to the\n * bundler for the receipt is sent\n */\n public pollWaitTime = 1500\n\n /**\n * Define the bundler URL\n */\n protected abstract getUrl(network: Network): string\n\n /**\n * Each bundler has their own gas prices. Define and fetch them\n */\n protected abstract getGasPrice(network: Network): Promise\n\n /**\n * Each bundler has it's own handler for giving information back\n */\n public abstract getStatus(network: Network, userOpHash: string): Promise\n\n /**\n * Each bundler needs to return its own na,e\n */\n public abstract getName(): BUNDLER\n\n /**\n * Get the bundler RPC\n *\n * @param network\n */\n protected getProvider(network: Network): RPCProvider {\n return getRpcProvider([this.getUrl(network)], network.chainId)\n }\n\n private async sendEstimateReq(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const provider = this.getProvider(network)\n\n if (shouldStateOverride) {\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT,\n {\n [userOperation.sender]: {\n stateDiff: {\n // add privileges to the entry point\n [`0x${privSlot(0, 'address', ERC_4337_ENTRYPOINT, 'bytes32')}`]: ENTRY_POINT_MARKER\n }\n }\n }\n ])\n }\n\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n async estimate(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride)\n return {\n preVerificationGas: toBeHex(estimatiton.preVerificationGas) as Hex,\n verificationGasLimit: toBeHex(estimatiton.verificationGasLimit) as Hex,\n callGasLimit: toBeHex(estimatiton.callGasLimit) as Hex,\n paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit) as Hex,\n paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) as Hex\n }\n }\n\n /**\n * Get the transaction receipt from the userOperationHash if ready\n *\n * @param userOperationHash\n * @returns Receipt | null\n */\n async getReceipt(userOperationHash: string, network: Network) {\n const provider = this.getProvider(network)\n return provider.send('eth_getUserOperationReceipt', [userOperationHash])\n }\n\n /**\n * Broadcast a userOperation to the specified bundler and get a userOperationHash in return\n *\n * @param UserOperation userOperation\n * @returns userOperationHash\n */\n async broadcast(userOperation: UserOperation, network: Network): Promise {\n const provider = this.getProvider(network)\n return provider.send('eth_sendUserOperation', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n // use this request to check if the bundler supports the network\n static async isNetworkSupported(fetch: Fetch, chainId: bigint) {\n const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`\n const result = await fetch(url)\n return result.status === 200\n }\n\n async fetchGasPrices(\n network: Network,\n errorCallback: Function,\n counter: number = 0\n ): Promise {\n const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1\n if (counter >= (hasFallback ? 2 : 5)) throw new Error(\"Couldn't fetch gas prices\")\n\n let response\n\n try {\n response = await Promise.race([\n this.getGasPrice(network),\n new Promise((_resolve, reject) => {\n setTimeout(\n () => reject(new Error('fetching bundler gas prices failed, request too slow')),\n hasFallback ? 4500 : 6000\n )\n })\n ])\n } catch (e: any) {\n // report the error back only if there's no fallback\n if (!hasFallback) {\n errorCallback({\n level: 'major',\n message: 'Estimating gas prices from the bundler timed out. Retrying...',\n error: new Error('Budler gas prices estimation timeout')\n })\n }\n\n const increment = counter + 1\n return this.fetchGasPrices(network, errorCallback, increment)\n }\n\n const results = response as GasSpeeds\n return {\n slow: {\n maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n),\n maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n)\n },\n medium: {\n maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n),\n maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n)\n },\n fast: {\n maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n),\n maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n)\n },\n ape: {\n maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n),\n maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n)\n }\n }\n }\n\n // used when catching errors from bundler requests\n decodeBundlerError(e: Error): DecodedError {\n const error = new BundlerError(e.message, this.getName())\n return decodeError(error)\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../../src/services/bundlers/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint-disable class-methods-use-this */\nimport { toBeHex } from 'ethers'\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport { BUNDLER } from '../../consts/bundlers'\nimport { ENTRY_POINT_MARKER, ERC_4337_ENTRYPOINT } from '../../consts/deploy'\nimport { Fetch } from '../../interfaces/fetch'\nimport { Hex } from '../../interfaces/hex'\nimport { Network } from '../../interfaces/network'\nimport { RPCProvider } from '../../interfaces/provider'\nimport { decodeError } from '../../libs/errorDecoder'\nimport { BundlerError } from '../../libs/errorDecoder/customErrors'\nimport { DecodedError } from '../../libs/errorDecoder/types'\nimport { BundlerEstimateResult } from '../../libs/estimate/interfaces'\nimport { privSlot } from '../../libs/proxyDeploy/deploy'\nimport { UserOperation } from '../../libs/userOperation/types'\nimport { getCleanUserOp } from '../../libs/userOperation/userOperation'\nimport { getRpcProvider } from '../provider'\nimport { GasSpeeds, UserOpStatus } from './types'\n\nrequire('dotenv').config()\n\nfunction addExtra(gasInWei: bigint, percentageIncrease: bigint): Hex {\n const percent = 100n / percentageIncrease\n return toBeHex(gasInWei + gasInWei / percent) as Hex\n}\n\nexport abstract class Bundler {\n /**\n * The default pollWaitTime. This is used to determine\n * how many milliseconds to wait until before another request to the\n * bundler for the receipt is sent\n */\n public pollWaitTime = 1500\n\n /**\n * Define the bundler URL\n */\n protected abstract getUrl(network: Network): string\n\n /**\n * Each bundler has their own gas prices. Define and fetch them\n */\n protected abstract getGasPrice(network: Network): Promise\n\n /**\n * Each bundler has it's own handler for giving information back\n */\n public abstract getStatus(network: Network, userOpHash: string): Promise\n\n /**\n * Each bundler needs to return its own na,e\n */\n public abstract getName(): BUNDLER\n\n /**\n * Get the bundler RPC\n *\n * @param network\n */\n protected getProvider(network: Network): RPCProvider {\n return getRpcProvider([this.getUrl(network)], network.chainId)\n }\n\n private async sendEstimateReq(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const provider = this.getProvider(network)\n\n if (shouldStateOverride) {\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT,\n {\n [userOperation.sender]: {\n stateDiff: {\n // add privileges to the entry point\n [privSlot(0, 'uint256', ERC_4337_ENTRYPOINT, 'uint256')]: ENTRY_POINT_MARKER\n }\n }\n }\n ])\n }\n\n return provider.send('eth_estimateUserOperationGas', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n async estimate(\n userOperation: UserOperation,\n network: Network,\n shouldStateOverride = false\n ): Promise {\n const estimatiton = await this.sendEstimateReq(userOperation, network, shouldStateOverride)\n return {\n preVerificationGas: toBeHex(estimatiton.preVerificationGas) as Hex,\n verificationGasLimit: toBeHex(estimatiton.verificationGasLimit) as Hex,\n callGasLimit: toBeHex(estimatiton.callGasLimit) as Hex,\n paymasterVerificationGasLimit: toBeHex(estimatiton.paymasterVerificationGasLimit) as Hex,\n paymasterPostOpGasLimit: toBeHex(estimatiton.paymasterPostOpGasLimit) as Hex\n }\n }\n\n /**\n * Get the transaction receipt from the userOperationHash if ready\n *\n * @param userOperationHash\n * @returns Receipt | null\n */\n async getReceipt(userOperationHash: string, network: Network) {\n const provider = this.getProvider(network)\n return provider.send('eth_getUserOperationReceipt', [userOperationHash])\n }\n\n /**\n * Broadcast a userOperation to the specified bundler and get a userOperationHash in return\n *\n * @param UserOperation userOperation\n * @returns userOperationHash\n */\n async broadcast(userOperation: UserOperation, network: Network): Promise {\n const provider = this.getProvider(network)\n return provider.send('eth_sendUserOperation', [\n getCleanUserOp(userOperation)[0],\n ERC_4337_ENTRYPOINT\n ])\n }\n\n // use this request to check if the bundler supports the network\n static async isNetworkSupported(fetch: Fetch, chainId: bigint) {\n const url = `https://api.pimlico.io/health?apikey=${process.env.REACT_APP_PIMLICO_API_KEY}&chain-id=${chainId}`\n const result = await fetch(url)\n return result.status === 200\n }\n\n async fetchGasPrices(\n network: Network,\n errorCallback: Function,\n counter: number = 0\n ): Promise {\n const hasFallback = network.erc4337.bundlers && network.erc4337.bundlers.length > 1\n if (counter >= (hasFallback ? 2 : 5)) throw new Error(\"Couldn't fetch gas prices\")\n\n let response\n\n try {\n response = await Promise.race([\n this.getGasPrice(network),\n new Promise((_resolve, reject) => {\n setTimeout(\n () => reject(new Error('fetching bundler gas prices failed, request too slow')),\n hasFallback ? 4500 : 6000\n )\n })\n ])\n } catch (e: any) {\n // report the error back only if there's no fallback\n if (!hasFallback) {\n errorCallback({\n level: 'major',\n message: 'Estimating gas prices from the bundler timed out. Retrying...',\n error: new Error('Budler gas prices estimation timeout')\n })\n }\n\n const increment = counter + 1\n return this.fetchGasPrices(network, errorCallback, increment)\n }\n\n const results = response as GasSpeeds\n return {\n slow: {\n maxFeePerGas: addExtra(BigInt(results.slow.maxFeePerGas), 5n),\n maxPriorityFeePerGas: addExtra(BigInt(results.slow.maxPriorityFeePerGas), 5n)\n },\n medium: {\n maxFeePerGas: addExtra(BigInt(results.medium.maxFeePerGas), 7n),\n maxPriorityFeePerGas: addExtra(BigInt(results.medium.maxPriorityFeePerGas), 7n)\n },\n fast: {\n maxFeePerGas: addExtra(BigInt(results.fast.maxFeePerGas), 10n),\n maxPriorityFeePerGas: addExtra(BigInt(results.fast.maxPriorityFeePerGas), 10n)\n },\n ape: {\n maxFeePerGas: addExtra(BigInt(results.ape.maxFeePerGas), 20n),\n maxPriorityFeePerGas: addExtra(BigInt(results.ape.maxPriorityFeePerGas), 20n)\n }\n }\n }\n\n // used when catching errors from bundler requests\n decodeBundlerError(e: Error): DecodedError {\n const error = new BundlerError(e.message, this.getName())\n return decodeError(error)\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/services/socket/api.d.ts.map b/dist/src/services/socket/api.d.ts.map index 7ea2f6aa2..74e5216a1 100644 --- a/dist/src/services/socket/api.d.ts.map +++ b/dist/src/services/socket/api.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAkB,KAAK,EAAgC,MAAM,wBAAwB,CAAA;AAC5F,OAAO,EACL,qBAAqB,EACrB,cAAc,EAEd,+BAA+B,EAC/B,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AAuBvC,eAAO,MAAM,4BAA4B,UAAW,cAAc;;;;;;;;CAGhE,CAAA;AAaF,qBAAa,SAAS;;IAOpB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAO;gBAEpB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzD,SAAS;IAYT,YAAY;IAIZ,oBAAoB;IAO1B,WAAW;IA0DL,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAYxD,cAAc,CAAC,EACnB,WAAW,EACX,SAAS,EACV,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqCvB,QAAQ,CAAC,EACb,OAAO,EACP,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiB5B,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,IAAI,EACJ,IAAI,EACL,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,gBAAgB,EAAE,MAAM,CAAA;QACxB,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,OAAO,CAAA;QACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;QACvB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;KAC/B,GAAG,OAAO,CAAC,cAAc,CAAC;IAuDrB,UAAU,CAAC,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,KAAK,EACN,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KACvC;IA0CK,cAAc,CAAC,EACnB,aAAa,EACb,WAAW,EACX,MAAM,EACP,EAAE;QACD,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,CAAA;QAC/D,WAAW,EAAE,+BAA+B,CAAC,aAAa,CAAC,CAAA;QAC3D,MAAM,EAAE,MAAM,CAAA;KACf;IAgBK,iBAAiB,CACrB,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,GAC9D,OAAO,CAAC,qBAAqB,CAAC;IA8B3B,kBAAkB,CAAC,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC;CAWzF"} \ No newline at end of file +{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAkB,KAAK,EAAgC,MAAM,wBAAwB,CAAA;AAC5F,OAAO,EACL,qBAAqB,EACrB,cAAc,EAEd,+BAA+B,EAC/B,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AAuBvC,eAAO,MAAM,4BAA4B,UAAW,cAAc;;;;;;;;CAGhE,CAAA;AAaF,qBAAa,SAAS;;IAOpB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAO;gBAEpB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzD,SAAS;IAYT,YAAY;IAIZ,oBAAoB;IAO1B,WAAW;IA+DL,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAYxD,cAAc,CAAC,EACnB,WAAW,EACX,SAAS,EACV,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqCvB,QAAQ,CAAC,EACb,OAAO,EACP,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiB5B,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,IAAI,EACJ,IAAI,EACL,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,gBAAgB,EAAE,MAAM,CAAA;QACxB,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,OAAO,CAAA;QACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;QACvB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;KAC/B,GAAG,OAAO,CAAC,cAAc,CAAC;IAuDrB,UAAU,CAAC,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,KAAK,EACN,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KACvC;IA0CK,cAAc,CAAC,EACnB,aAAa,EACb,WAAW,EACX,MAAM,EACP,EAAE;QACD,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,CAAA;QAC/D,WAAW,EAAE,+BAA+B,CAAC,aAAa,CAAC,CAAA;QAC3D,MAAM,EAAE,MAAM,CAAA;KACf;IAgBK,iBAAiB,CACrB,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC,GAC9D,OAAO,CAAC,qBAAqB,CAAC;IA8B3B,kBAAkB,CAAC,aAAa,EAAE,+BAA+B,CAAC,eAAe,CAAC;CAWzF"} \ No newline at end of file diff --git a/dist/src/services/socket/api.js b/dist/src/services/socket/api.js index d50b212e9..9f7daf9e7 100644 --- a/dist/src/services/socket/api.js +++ b/dist/src/services/socket/api.js @@ -78,13 +78,17 @@ class SocketAPI { const error = `${errorPrefix} Upstream error: <${message}>${status}`; throw new SwapAndBridgeProviderApiError_1.default(error); } + if (response.status === 429) { + const error = `Our service provider received too many requests, temporarily preventing your request from being processed. ${errorPrefix}`; + throw new SwapAndBridgeProviderApiError_1.default(error); + } let responseBody; try { responseBody = await response.json(); } catch (e) { const message = e?.message || 'no message'; - const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`; + const error = `${errorPrefix} Error details: , message: <${message}>`; throw new SwapAndBridgeProviderApiError_1.default(error); } // Socket API returns 500 status code with a message in the body, even diff --git a/dist/src/services/socket/api.js.map b/dist/src/services/socket/api.js.map index 7fdf2bd51..9496609f7 100644 --- a/dist/src/services/socket/api.js.map +++ b/dist/src/services/socket/api.js.map @@ -1 +1 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":";;;;AAAA,mCAAmC;AAEnC,wHAAuF;AAYvF,2CAQoB;AAEpB,MAAM,uCAAuC,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/D,IAAI,KAAK,wBAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7C,MAAM,uCAAuC,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/D,IAAI,KAAK,wBAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7C,MAAM,mCAAmC,GAAG,CAAC,OAAe,EAAE,EAAE;AAC9D,0DAA0D;AAC1D,IAAA,mBAAU;AACR,0EAA0E;AAC1E,uCAAuC,CAAC,OAAO,CAAC,CACjD,CAAA;AACI,MAAM,4BAA4B,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC;IACtE,GAAG,KAAK;IACR,OAAO,EAAE,mCAAmC,CAAC,KAAK,CAAC,OAAO,CAAC;CAC5D,CAAC,CAAA;AAHW,QAAA,4BAA4B,gCAGvC;AAEF,MAAM,mCAAmC,GAAG,CAAC,OAAe,EAAE,EAAE;AAC9D,wFAAwF;AACxF,uCAAuC;AACrC,gFAAgF;AAChF,OAAO,CAAC,iBAAiB,EAAE,CAC5B,CAAA;AACH,MAAM,4BAA4B,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC;IAC/D,GAAG,KAAK;IACR,OAAO,EAAE,mCAAmC,CAAC,KAAK,CAAC,OAAO,CAAC;CAC5D,CAAC,CAAA;AAEF,MAAa,SAAS;IACpB,MAAM,CAAO;IAEb,QAAQ,GAAG,4BAA4B,CAAA;IAEvC,QAAQ,CAAyC;IAEjD,SAAS,GAAmB,IAAI,CAAA;IAEhC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAoC;QAC7D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QAEnB,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAA;YAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;SACjB;QAAC,MAAM;YACN,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,oDAAoD;QACpD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAE1B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;IAC3B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAI,EACvB,YAAY,EACZ,WAAW,EAIZ;QACC,IAAI,QAAwB,CAAA;QAE5B,IAAI;YACF,QAAQ,GAAG,MAAM,YAAY,CAAA;SAC9B;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;YAC1C,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACzD,MAAM,KAAK,GAAG,GAAG,WAAW,qBAAqB,OAAO,IAAI,MAAM,EAAE,CAAA;YACpE,MAAM,IAAI,uCAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,IAAI,YAAkC,CAAA;QACtC,IAAI;YACF,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;SACrC;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAA;YAC1C,MAAM,KAAK,GAAG,GAAG,WAAW,qFAAqF,OAAO,GAAG,CAAA;YAC3H,MAAM,IAAI,uCAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;YAC1C,kEAAkE;YAClE,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,IAAI,YAAY,CAAA;YACxE,0DAA0D;YAC1D,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAA;YACpE,MAAM,oBAAoB,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACjF,MAAM,iBAAiB,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAA;YACrE,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,CAAC,CAAC,YAAY,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1F,MAAM,KAAK,GAAG,GAAG,WAAW,0CAA0C,mBAAmB,IAAI,oBAAoB,GAAG,wBAAwB,EAAE,CAAA;YAC9I,MAAM,IAAI,uCAA6B,CAAC,KAAK,CAAC,CAAA;SAC/C;QAED,yEAAyE;QACzE,qEAAqE;QACrE,6DAA6D;QAC7D,mEAAmE;QACnE,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE3B,OAAO,YAAY,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,mBAAmB,CAAA;QAE/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAA4B;YACrE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EACT,0FAA0F;SAC7F,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EACnB,WAAW,EACX,SAAS,EAIV;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC/B,8EAA8E;YAC9E,8FAA8F;YAC9F,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,8BAA8B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAE7E,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAmB;YAC1D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EACT,sFAAsF;SACzF,CAAC,CAAA;QAEF,2DAA2D;QAC3D,8EAA8E;QAC9E,IAAI,SAAS,KAAK,EAAE;YAClB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,0CAA8B,CAC5E,CAAA;QAEH,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,SAAS,KAAK,CAAC;YACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,wBAAY,CAAC,CAAA;QAEvF,6EAA6E;QAC7E,2EAA2E;QAC3E,IAAI,SAAS,KAAK,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,2CAA+B,CAAC,CAAA;QACtE,IAAI,SAAS,KAAK,IAAI;YAAE,QAAQ,CAAC,OAAO,CAAC,uCAA2B,CAAC,CAAA;QAErE,OAAO,QAAQ,CAAC,GAAG,CAAC,oCAA4B,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EACb,OAAO,EACP,OAAO,EAIR;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;SAC5B,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,4BAA4B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkD;YAC3F,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,kDAAkD;SAChE,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEzD,OAAO,IAAA,oCAA4B,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,IAAI,EACJ,IAAI,EAWL;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,gBAAgB,EAAE,mCAAmC,CAAC,gBAAgB,CAAC;YACvE,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC/B,cAAc,EAAE,mCAAmC,CAAC,cAAc,CAAC;YACnE,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;YACjC,WAAW;YACX,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;YACzC,IAAI;YACJ,YAAY,EAAE,OAAO;YACrB,mBAAmB,EAAE,GAAG;YACxB,qBAAqB,EAAE,MAAM;SAC9B,CAAC,CAAA;QACF,MAAM,eAAe,GAAG,sCAA0B,CAAC,WAAW,CAAC,CAAA;QAC/D,MAAM,2BAA2B,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,CAAA;QAC9D,IAAI,2BAA2B,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,uBAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;SACpD;QACD,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,cAAc;YAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAExE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,UAAU,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAiB;YAC1D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,4BAA4B;SAC1C,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS,EAAE,IAAA,oCAA4B,EAAC,QAAQ,CAAC,SAAS,CAAC;YAC3D,OAAO,EAAE,IAAA,oCAA4B,EAAC,QAAQ,CAAC,OAAO,CAAC;YACvD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtC,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACtC,GAAG,MAAM;oBACT,GAAG,CAAC,WAAW,IAAI,MAAM,IAAI;wBAC3B,SAAS,EAAE,IAAA,oCAA4B,EAAC,MAAM,CAAC,SAAS,CAAC;qBAC1D,CAAC;oBACF,OAAO,EAAE,IAAA,oCAA4B,EAAC,MAAM,CAAC,OAAO,CAAC;oBACrD,GAAG,CAAC,OAAO,IAAI,MAAM,IAAI;wBACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BACjC,GAAG,IAAI;4BACP,SAAS,EAAE,IAAA,oCAA4B,EAAC,IAAI,CAAC,SAAS,CAAC;4BACvD,OAAO,EAAE,IAAA,oCAA4B,EAAC,IAAI,CAAC,OAAO,CAAC;yBACpD,CAAC,CAAC;qBACJ,CAAC;iBACH,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,KAAK,EAON;QACC,MAAM,MAAM,GAAG;YACb,WAAW;YACX,SAAS;YACT,gBAAgB,EAAE,mCAAmC,CAAC,gBAAgB,CAAC;YACvE,cAAc,EAAE,mCAAmC,CAAC,cAAc,CAAC;YACnE,qBAAqB,EAAE,IAAI;YAC3B,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACtC,GAAG,MAAM;oBACT,iEAAiE;oBACjE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;oBACzF,OAAO,EAAE;wBACP,GAAG,MAAM,CAAC,OAAO;wBACjB,OAAO,EAAE,mCAAmC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBACrE;oBACD,iEAAiE;oBACjE,KAAK,EAAE,MAAM,CAAC,KAAK;wBACjB,CAAC,CAAC,iEAAiE;4BACjE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gCAC1B,GAAG,IAAI;gCACP,SAAS,EAAE,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;gCACvD,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;6BACpD,CAAC,CAAC;wBACL,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;aACJ;SACF,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkC;YAC3E,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,cAAc,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;aAC7B,CAAC;YACF,WAAW,EAAE,4BAA4B;SAC1C,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EACnB,aAAa,EACb,WAAW,EACX,MAAM,EAKP;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE;YACvC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,MAAM;SACP,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAoB;YAC7D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,qEAAqE;SACnF,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,aAA+D;QAE/D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,wBAAwB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAwB;YACjE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,oCAAoC;SAClD,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS,EAAE,IAAA,oCAA4B,EAAC,QAAQ,CAAC,SAAS,CAAC;YAC3D,gBAAgB,EAAE,mCAAmC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAChF,OAAO,EAAE,IAAA,oCAA4B,EAAC,QAAQ,CAAC,OAAO,CAAC;YACvD,cAAc,EAAE,mCAAmC,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5E,OAAO,EAAG,QAAQ,CAAC,OAA4C,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC/E,GAAG,MAAM;gBACT,GAAG,CAAC,WAAW,IAAI,MAAM,IAAI,EAAE,SAAS,EAAE,IAAA,oCAA4B,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3F,OAAO,EAAE,IAAA,oCAA4B,EAAC,MAAM,CAAC,OAAO,CAAC;gBACrD,GAAG,CAAC,OAAO,IAAI,MAAM,IAAI;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACjC,GAAG,IAAI;wBACP,SAAS,EAAE,IAAA,oCAA4B,EAAC,IAAI,CAAC,SAAS,CAAC;wBACvD,OAAO,EAAE,IAAA,oCAA4B,EAAC,IAAI,CAAC,OAAO,CAAC;qBACpD,CAAC,CAAC;iBACJ,CAAC;aACH,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,aAA+D;QACtF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,wBAAwB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAkC;YAC3E,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1D,WAAW,EAAE,gCAAgC;SAC9C,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF;AAtXD,8BAsXC","sourcesContent":["import { getAddress } from 'ethers'\n\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\nimport { InviteController } from '../../controllers/invite/invite'\nimport { CustomResponse, Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIActiveRoutes,\n SocketAPIQuote,\n SocketAPIResponse,\n SocketAPISendTransactionRequest,\n SocketAPISupportedChain,\n SocketAPIToken,\n SocketRouteStatus\n} from '../../interfaces/swapAndBridge'\nimport {\n AMBIRE_FEE_TAKER_ADDRESSES,\n AMBIRE_WALLET_TOKEN_ON_BASE,\n AMBIRE_WALLET_TOKEN_ON_ETHEREUM,\n ETH_ON_OPTIMISM_LEGACY_ADDRESS,\n FEE_PERCENT,\n NULL_ADDRESS,\n ZERO_ADDRESS\n} from './constants'\n\nconst convertZeroAddressToNullAddressIfNeeded = (addr: string) =>\n addr === ZERO_ADDRESS ? NULL_ADDRESS : addr\n\nconst convertNullAddressToZeroAddressIfNeeded = (addr: string) =>\n addr === NULL_ADDRESS ? ZERO_ADDRESS : addr\n\nconst normalizeIncomingSocketTokenAddress = (address: string) =>\n // incoming token addresses from Socket are all lowercased\n getAddress(\n // native token addresses come as null address instead of the zero address\n convertNullAddressToZeroAddressIfNeeded(address)\n )\nexport const normalizeIncomingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeIncomingSocketTokenAddress(token.address)\n})\n\nconst normalizeOutgoingSocketTokenAddress = (address: string) =>\n // Socket expects to receive null address instead of the zero address for native tokens.\n convertZeroAddressToNullAddressIfNeeded(\n // Socket works only with all lowercased token addresses, otherwise, bad request\n address.toLocaleLowerCase()\n )\nconst normalizeOutgoingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeOutgoingSocketTokenAddress(token.address)\n})\n\nexport class SocketAPI {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n try {\n const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers })\n if (!response.ok) return false\n\n const body = await response.json()\n return !!body.ok\n } catch {\n return false\n }\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n async updateHealthIfNeeded() {\n // Update health status only if previously unhealthy\n if (this.isHealthy) return\n\n await this.updateHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n /**\n * Processes Socket API responses and throws custom errors for various\n * failures, including handling the API's unique response structure.\n */\n async #handleResponse({\n fetchPromise,\n errorPrefix\n }: {\n fetchPromise: Promise\n errorPrefix: string\n }): Promise {\n let response: CustomResponse\n\n try {\n response = await fetchPromise\n } catch (e: any) {\n const message = e?.message || 'no message'\n const status = e?.status ? `, status: <${e.status}>` : ''\n const error = `${errorPrefix} Upstream error: <${message}>${status}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n let responseBody: SocketAPIResponse\n try {\n responseBody = await response.json()\n } catch (e: any) {\n const message = e?.message || 'no message'\n const error = `${errorPrefix} Error details: Unexpected non-JSON response from our service provider, message: <${message}>`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Socket API returns 500 status code with a message in the body, even\n // in case of a bad request. Not necessarily an internal server error.\n if (!response.ok || !responseBody?.success) {\n // API returns 2 types of errors, a generic one, on the top level:\n const genericErrorMessage = responseBody?.message?.error || 'no message'\n // ... and a detailed one, nested in the `details` object:\n const specificError = responseBody?.message?.details?.error?.message\n const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''\n const specificErrorCode = responseBody?.message?.details?.error?.code\n const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''\n const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Always attempt to update health status (if needed) when a response was\n // successful, in case the API was previously unhealthy (to recover).\n // Do not wait on purpose, to not block or delay the response\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateHealthIfNeeded()\n\n return responseBody.result\n }\n\n async getSupportedChains(): Promise {\n const url = `${this.#baseUrl}/supported/chains`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.'\n })\n\n return response\n }\n\n async getToTokenList({\n fromChainId,\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n toChainId: toChainId.toString(),\n // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens),\n // which makes serialization and deserialization of this controller computationally expensive.\n isShortList: 'true'\n })\n const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`\n\n let response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported receive tokens. Please reload to try again.'\n })\n\n // Exception for Optimism, strip out the legacy ETH address\n // TODO: Remove when Socket removes the legacy ETH address from their response\n if (toChainId === 10)\n response = response.filter(\n (token: SocketAPIToken) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS\n )\n\n // Exception for Ethereum, duplicate ETH tokens are incoming from the API.\n // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH.\n // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest.\n if (toChainId === 1)\n response = response.filter((token: SocketAPIToken) => token.address !== ZERO_ADDRESS)\n\n // Since v4.41.0 we request the shortlist from Socket, which does not include\n // the Ambire $WALLET token. So adding it manually on the supported chains.\n if (toChainId === 1) response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM)\n if (toChainId === 8453) response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE)\n\n return response.map(normalizeIncomingSocketToken)\n }\n\n async getToken({\n address,\n chainId\n }: {\n address: string\n chainId: number\n }): Promise {\n const params = new URLSearchParams({\n address: address.toString(),\n chainId: chainId.toString()\n })\n const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`\n\n const response = await this.#handleResponse<{ isSupported: boolean; token: SocketAPIToken }>({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to retrieve token information by address.'\n })\n\n if (!response.isSupported || !response.token) return null\n\n return normalizeIncomingSocketToken(response.token)\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress,\n isSmartAccount,\n sort,\n isOG\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n isOG: InviteController['isOG']\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress),\n toChainId: toChainId.toString(),\n toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress),\n fromAmount: fromAmount.toString(),\n userAddress,\n isContractCall: isSmartAccount.toString(), // only get quotes with that are compatible with contracts\n sort,\n singleTxOnly: 'false',\n defaultSwapSlippage: '1',\n uniqueRoutesPerBridge: 'true'\n })\n const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]\n const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG\n if (shouldIncludeConvenienceFee) {\n params.append('feeTakerAddress', feeTakerAddress)\n params.append('feePercent', FEE_PERCENT.toString())\n }\n // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as\n // batching is currently not not supported by Mayan (and funds get lost).\n if (isSmartAccount) params.append('excludeBridges', ['mayan'].join(','))\n\n const url = `${this.#baseUrl}/quote?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to fetch the quote.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n routes: response.routes.map((route) => ({\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && {\n fromAsset: normalizeIncomingSocketToken(userTx.fromAsset)\n }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }))\n }\n }\n\n async startRoute({\n fromChainId,\n toChainId,\n fromAssetAddress,\n toAssetAddress,\n route\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n const params = {\n fromChainId,\n toChainId,\n fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress),\n toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress),\n includeFirstTxDetails: true,\n route: {\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined,\n toAsset: {\n ...userTx.toAsset,\n address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address)\n },\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n steps: userTx.steps\n ? // @ts-ignore fromAsset exists on one of the two userTx sub-types\n userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeOutgoingSocketToken(step.fromAsset),\n toAsset: normalizeOutgoingSocketToken(step.toAsset)\n }))\n : undefined\n }))\n }\n }\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(params)\n }),\n errorPrefix: 'Unable to start the route.'\n })\n\n return response\n }\n\n async getRouteStatus({\n activeRouteId,\n userTxIndex,\n txHash\n }: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n const params = new URLSearchParams({\n activeRouteId: activeRouteId.toString(),\n userTxIndex: userTxIndex.toString(),\n txHash\n })\n const url = `${this.#baseUrl}/route/prepare?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to get the route status. Please check back later to proceed.'\n })\n\n return response\n }\n\n async updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n ): Promise {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to update the active route.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress),\n userTxs: (response.userTxs as SocketAPIActiveRoutes['userTxs']).map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to start the next step.'\n })\n\n return response\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/services/socket/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from 'ethers'\n\nimport SwapAndBridgeProviderApiError from '../../classes/SwapAndBridgeProviderApiError'\nimport { InviteController } from '../../controllers/invite/invite'\nimport { CustomResponse, Fetch, RequestInitWithCustomHeaders } from '../../interfaces/fetch'\nimport {\n SocketAPIActiveRoutes,\n SocketAPIQuote,\n SocketAPIResponse,\n SocketAPISendTransactionRequest,\n SocketAPISupportedChain,\n SocketAPIToken,\n SocketRouteStatus\n} from '../../interfaces/swapAndBridge'\nimport {\n AMBIRE_FEE_TAKER_ADDRESSES,\n AMBIRE_WALLET_TOKEN_ON_BASE,\n AMBIRE_WALLET_TOKEN_ON_ETHEREUM,\n ETH_ON_OPTIMISM_LEGACY_ADDRESS,\n FEE_PERCENT,\n NULL_ADDRESS,\n ZERO_ADDRESS\n} from './constants'\n\nconst convertZeroAddressToNullAddressIfNeeded = (addr: string) =>\n addr === ZERO_ADDRESS ? NULL_ADDRESS : addr\n\nconst convertNullAddressToZeroAddressIfNeeded = (addr: string) =>\n addr === NULL_ADDRESS ? ZERO_ADDRESS : addr\n\nconst normalizeIncomingSocketTokenAddress = (address: string) =>\n // incoming token addresses from Socket are all lowercased\n getAddress(\n // native token addresses come as null address instead of the zero address\n convertNullAddressToZeroAddressIfNeeded(address)\n )\nexport const normalizeIncomingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeIncomingSocketTokenAddress(token.address)\n})\n\nconst normalizeOutgoingSocketTokenAddress = (address: string) =>\n // Socket expects to receive null address instead of the zero address for native tokens.\n convertZeroAddressToNullAddressIfNeeded(\n // Socket works only with all lowercased token addresses, otherwise, bad request\n address.toLocaleLowerCase()\n )\nconst normalizeOutgoingSocketToken = (token: SocketAPIToken) => ({\n ...token,\n address: normalizeOutgoingSocketTokenAddress(token.address)\n})\n\nexport class SocketAPI {\n #fetch: Fetch\n\n #baseUrl = 'https://api.socket.tech/v2'\n\n #headers: RequestInitWithCustomHeaders['headers']\n\n isHealthy: boolean | null = null\n\n constructor({ fetch, apiKey }: { fetch: Fetch; apiKey: string }) {\n this.#fetch = fetch\n\n this.#headers = {\n 'API-KEY': apiKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n async getHealth() {\n try {\n const response = await this.#fetch(`${this.#baseUrl}/health`, { headers: this.#headers })\n if (!response.ok) return false\n\n const body = await response.json()\n return !!body.ok\n } catch {\n return false\n }\n }\n\n async updateHealth() {\n this.isHealthy = await this.getHealth()\n }\n\n async updateHealthIfNeeded() {\n // Update health status only if previously unhealthy\n if (this.isHealthy) return\n\n await this.updateHealth()\n }\n\n resetHealth() {\n this.isHealthy = null\n }\n\n /**\n * Processes Socket API responses and throws custom errors for various\n * failures, including handling the API's unique response structure.\n */\n async #handleResponse({\n fetchPromise,\n errorPrefix\n }: {\n fetchPromise: Promise\n errorPrefix: string\n }): Promise {\n let response: CustomResponse\n\n try {\n response = await fetchPromise\n } catch (e: any) {\n const message = e?.message || 'no message'\n const status = e?.status ? `, status: <${e.status}>` : ''\n const error = `${errorPrefix} Upstream error: <${message}>${status}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n if (response.status === 429) {\n const error = `Our service provider received too many requests, temporarily preventing your request from being processed. ${errorPrefix}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n let responseBody: SocketAPIResponse\n try {\n responseBody = await response.json()\n } catch (e: any) {\n const message = e?.message || 'no message'\n const error = `${errorPrefix} Error details: , message: <${message}>`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Socket API returns 500 status code with a message in the body, even\n // in case of a bad request. Not necessarily an internal server error.\n if (!response.ok || !responseBody?.success) {\n // API returns 2 types of errors, a generic one, on the top level:\n const genericErrorMessage = responseBody?.message?.error || 'no message'\n // ... and a detailed one, nested in the `details` object:\n const specificError = responseBody?.message?.details?.error?.message\n const specificErrorMessage = specificError ? `, details: <${specificError}>` : ''\n const specificErrorCode = responseBody?.message?.details?.error?.code\n const specificErrorCodeMessage = specificErrorCode ? `, code: <${specificErrorCode}>` : ''\n const error = `${errorPrefix} Our service provider upstream error: <${genericErrorMessage}>${specificErrorMessage}${specificErrorCodeMessage}`\n throw new SwapAndBridgeProviderApiError(error)\n }\n\n // Always attempt to update health status (if needed) when a response was\n // successful, in case the API was previously unhealthy (to recover).\n // Do not wait on purpose, to not block or delay the response\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateHealthIfNeeded()\n\n return responseBody.result\n }\n\n async getSupportedChains(): Promise {\n const url = `${this.#baseUrl}/supported/chains`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported Swap & Bridge chains from our service provider.'\n })\n\n return response\n }\n\n async getToTokenList({\n fromChainId,\n toChainId\n }: {\n fromChainId: number\n toChainId: number\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n toChainId: toChainId.toString(),\n // The long list for some networks is HUGE (e.g. Ethereum has 10,000+ tokens),\n // which makes serialization and deserialization of this controller computationally expensive.\n isShortList: 'true'\n })\n const url = `${this.#baseUrl}/token-lists/to-token-list?${params.toString()}`\n\n let response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix:\n 'Unable to retrieve the list of supported receive tokens. Please reload to try again.'\n })\n\n // Exception for Optimism, strip out the legacy ETH address\n // TODO: Remove when Socket removes the legacy ETH address from their response\n if (toChainId === 10)\n response = response.filter(\n (token: SocketAPIToken) => token.address !== ETH_ON_OPTIMISM_LEGACY_ADDRESS\n )\n\n // Exception for Ethereum, duplicate ETH tokens are incoming from the API.\n // One is with the `ZERO_ADDRESS` and one with `NULL_ADDRESS`, both for ETH.\n // Strip out the one with the `ZERO_ADDRESS` to be consistent with the rest.\n if (toChainId === 1)\n response = response.filter((token: SocketAPIToken) => token.address !== ZERO_ADDRESS)\n\n // Since v4.41.0 we request the shortlist from Socket, which does not include\n // the Ambire $WALLET token. So adding it manually on the supported chains.\n if (toChainId === 1) response.unshift(AMBIRE_WALLET_TOKEN_ON_ETHEREUM)\n if (toChainId === 8453) response.unshift(AMBIRE_WALLET_TOKEN_ON_BASE)\n\n return response.map(normalizeIncomingSocketToken)\n }\n\n async getToken({\n address,\n chainId\n }: {\n address: string\n chainId: number\n }): Promise {\n const params = new URLSearchParams({\n address: address.toString(),\n chainId: chainId.toString()\n })\n const url = `${this.#baseUrl}/supported/token-support?${params.toString()}`\n\n const response = await this.#handleResponse<{ isSupported: boolean; token: SocketAPIToken }>({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to retrieve token information by address.'\n })\n\n if (!response.isSupported || !response.token) return null\n\n return normalizeIncomingSocketToken(response.token)\n }\n\n async quote({\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmount,\n userAddress,\n isSmartAccount,\n sort,\n isOG\n }: {\n fromChainId: number\n fromTokenAddress: string\n toChainId: number\n toTokenAddress: string\n fromAmount: bigint\n userAddress: string\n isSmartAccount: boolean\n sort: 'time' | 'output'\n isOG: InviteController['isOG']\n }): Promise {\n const params = new URLSearchParams({\n fromChainId: fromChainId.toString(),\n fromTokenAddress: normalizeOutgoingSocketTokenAddress(fromTokenAddress),\n toChainId: toChainId.toString(),\n toTokenAddress: normalizeOutgoingSocketTokenAddress(toTokenAddress),\n fromAmount: fromAmount.toString(),\n userAddress,\n isContractCall: isSmartAccount.toString(), // only get quotes with that are compatible with contracts\n sort,\n singleTxOnly: 'false',\n defaultSwapSlippage: '1',\n uniqueRoutesPerBridge: 'true'\n })\n const feeTakerAddress = AMBIRE_FEE_TAKER_ADDRESSES[fromChainId]\n const shouldIncludeConvenienceFee = !!feeTakerAddress && !isOG\n if (shouldIncludeConvenienceFee) {\n params.append('feeTakerAddress', feeTakerAddress)\n params.append('feePercent', FEE_PERCENT.toString())\n }\n // TODO: Temporarily exclude Mayan bridge when fetching quotes for SA, as\n // batching is currently not not supported by Mayan (and funds get lost).\n if (isSmartAccount) params.append('excludeBridges', ['mayan'].join(','))\n\n const url = `${this.#baseUrl}/quote?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to fetch the quote.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n routes: response.routes.map((route) => ({\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && {\n fromAsset: normalizeIncomingSocketToken(userTx.fromAsset)\n }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }))\n }\n }\n\n async startRoute({\n fromChainId,\n toChainId,\n fromAssetAddress,\n toAssetAddress,\n route\n }: {\n fromChainId: number\n toChainId: number\n fromAssetAddress: string\n toAssetAddress: string\n route: SocketAPIQuote['selectedRoute']\n }) {\n const params = {\n fromChainId,\n toChainId,\n fromAssetAddress: normalizeOutgoingSocketTokenAddress(fromAssetAddress),\n toAssetAddress: normalizeOutgoingSocketTokenAddress(toAssetAddress),\n includeFirstTxDetails: true,\n route: {\n ...route,\n userTxs: route.userTxs.map((userTx) => ({\n ...userTx,\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n fromAsset: userTx?.fromAsset ? normalizeOutgoingSocketToken(userTx.fromAsset) : undefined,\n toAsset: {\n ...userTx.toAsset,\n address: normalizeOutgoingSocketTokenAddress(userTx.toAsset.address)\n },\n // @ts-ignore fromAsset exists on one of the two userTx sub-types\n steps: userTx.steps\n ? // @ts-ignore fromAsset exists on one of the two userTx sub-types\n userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeOutgoingSocketToken(step.fromAsset),\n toAsset: normalizeOutgoingSocketToken(step.toAsset)\n }))\n : undefined\n }))\n }\n }\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(`${this.#baseUrl}/route/start`, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(params)\n }),\n errorPrefix: 'Unable to start the route.'\n })\n\n return response\n }\n\n async getRouteStatus({\n activeRouteId,\n userTxIndex,\n txHash\n }: {\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n userTxIndex: SocketAPISendTransactionRequest['userTxIndex']\n txHash: string\n }) {\n const params = new URLSearchParams({\n activeRouteId: activeRouteId.toString(),\n userTxIndex: userTxIndex.toString(),\n txHash\n })\n const url = `${this.#baseUrl}/route/prepare?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to get the route status. Please check back later to proceed.'\n })\n\n return response\n }\n\n async updateActiveRoute(\n activeRouteId: SocketAPISendTransactionRequest['activeRouteId']\n ): Promise {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/active-routes?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to update the active route.'\n })\n\n return {\n ...response,\n fromAsset: normalizeIncomingSocketToken(response.fromAsset),\n fromAssetAddress: normalizeIncomingSocketTokenAddress(response.fromAssetAddress),\n toAsset: normalizeIncomingSocketToken(response.toAsset),\n toAssetAddress: normalizeIncomingSocketTokenAddress(response.toAssetAddress),\n userTxs: (response.userTxs as SocketAPIActiveRoutes['userTxs']).map((userTx) => ({\n ...userTx,\n ...('fromAsset' in userTx && { fromAsset: normalizeIncomingSocketToken(userTx.fromAsset) }),\n toAsset: normalizeIncomingSocketToken(userTx.toAsset),\n ...('steps' in userTx && {\n steps: userTx.steps.map((step) => ({\n ...step,\n fromAsset: normalizeIncomingSocketToken(step.fromAsset),\n toAsset: normalizeIncomingSocketToken(step.toAsset)\n }))\n })\n }))\n }\n }\n\n async getNextRouteUserTx(activeRouteId: SocketAPISendTransactionRequest['activeRouteId']) {\n const params = new URLSearchParams({ activeRouteId: activeRouteId.toString() })\n const url = `${this.#baseUrl}/route/build-next-tx?${params.toString()}`\n\n const response = await this.#handleResponse({\n fetchPromise: this.#fetch(url, { headers: this.#headers }),\n errorPrefix: 'Unable to start the next step.'\n })\n\n return response\n }\n}\n"]} \ No newline at end of file diff --git a/dist/src/utils/simulationStateOverride.js b/dist/src/utils/simulationStateOverride.js index d59edd564..ac7b0d4bd 100644 --- a/dist/src/utils/simulationStateOverride.js +++ b/dist/src/utils/simulationStateOverride.js @@ -17,7 +17,7 @@ function getEoaSimulationStateOverride(accountAddr) { code: AmbireAccount_json_1.default.binRuntime, stateDiff: { // if we use 0x00...01 we get a geth bug: "invalid argument 2: hex number with leading zero digits\" - on some RPC providers - [`0x${(0, deploy_1.privSlot)(0, 'address', accountAddr, 'bytes32')}`]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + [(0, deploy_1.privSlot)(0, 'uint256', accountAddr, 'uint256')]: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', // any number with leading zeros is not supported on some RPCs [(0, ethers_1.toBeHex)(1, 32)]: deployless_1.EOA_SIMULATION_NONCE } diff --git a/dist/src/utils/simulationStateOverride.js.map b/dist/src/utils/simulationStateOverride.js.map index 9d89ad3ef..9a3d7efe9 100644 --- a/dist/src/utils/simulationStateOverride.js.map +++ b/dist/src/utils/simulationStateOverride.js.map @@ -1 +1 @@ -{"version":3,"file":"simulationStateOverride.js","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAEhC,6GAAuE;AACvE,qDAA2D;AAC3D,uDAAqD;AAErD;;;;GAIG;AACH,SAAgB,6BAA6B,CAAC,WAAmB;IAC/D,OAAO;QACL,CAAC,WAAW,CAAC,EAAE;YACb,IAAI,EAAE,4BAAa,CAAC,UAAU;YAC9B,SAAS,EAAE;gBACT,4HAA4H;gBAC5H,CAAC,KAAK,IAAA,iBAAQ,EAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,EACrD,oEAAoE;gBACtE,8DAA8D;gBAC9D,CAAC,IAAA,gBAAO,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,iCAAoB;aACvC;SACF;KACF,CAAA;AACH,CAAC;AAbD,sEAaC","sourcesContent":["import { toBeHex } from 'ethers'\n\nimport AmbireAccount from '../../contracts/compiled/AmbireAccount.json'\nimport { EOA_SIMULATION_NONCE } from '../consts/deployless'\nimport { privSlot } from '../libs/proxyDeploy/deploy'\n\n/**\n *\n * @param accountAddr account address\n * @returns the state override object required for transaction simulation and estimation\n */\nexport function getEoaSimulationStateOverride(accountAddr: string) {\n return {\n [accountAddr]: {\n code: AmbireAccount.binRuntime,\n stateDiff: {\n // if we use 0x00...01 we get a geth bug: \"invalid argument 2: hex number with leading zero digits\\\" - on some RPC providers\n [`0x${privSlot(0, 'address', accountAddr, 'bytes32')}`]:\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',\n // any number with leading zeros is not supported on some RPCs\n [toBeHex(1, 32)]: EOA_SIMULATION_NONCE\n }\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"simulationStateOverride.js","sourceRoot":"","sources":["../../../src/utils/simulationStateOverride.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAEhC,6GAAuE;AACvE,qDAA2D;AAC3D,uDAAqD;AAErD;;;;GAIG;AACH,SAAgB,6BAA6B,CAAC,WAAmB;IAC/D,OAAO;QACL,CAAC,WAAW,CAAC,EAAE;YACb,IAAI,EAAE,4BAAa,CAAC,UAAU;YAC9B,SAAS,EAAE;gBACT,4HAA4H;gBAC5H,CAAC,IAAA,iBAAQ,EAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,EAC9C,oEAAoE;gBACtE,8DAA8D;gBAC9D,CAAC,IAAA,gBAAO,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,iCAAoB;aACvC;SACF;KACF,CAAA;AACH,CAAC;AAbD,sEAaC","sourcesContent":["import { toBeHex } from 'ethers'\n\nimport AmbireAccount from '../../contracts/compiled/AmbireAccount.json'\nimport { EOA_SIMULATION_NONCE } from '../consts/deployless'\nimport { privSlot } from '../libs/proxyDeploy/deploy'\n\n/**\n *\n * @param accountAddr account address\n * @returns the state override object required for transaction simulation and estimation\n */\nexport function getEoaSimulationStateOverride(accountAddr: string) {\n return {\n [accountAddr]: {\n code: AmbireAccount.binRuntime,\n stateDiff: {\n // if we use 0x00...01 we get a geth bug: \"invalid argument 2: hex number with leading zero digits\\\" - on some RPC providers\n [privSlot(0, 'uint256', accountAddr, 'uint256')]:\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',\n // any number with leading zeros is not supported on some RPCs\n [toBeHex(1, 32)]: EOA_SIMULATION_NONCE\n }\n }\n }\n}\n"]} \ No newline at end of file